diff --git a/test/tools/ossfuzz/protoToYul.cpp b/test/tools/ossfuzz/protoToYul.cpp index 7d2e1b80a..58d7c5024 100644 --- a/test/tools/ossfuzz/protoToYul.cpp +++ b/test/tools/ossfuzz/protoToYul.cpp @@ -16,15 +16,28 @@ */ #include -#include -#include +#include + #include +#include + +#include + using namespace std; using namespace yul::test::yul_fuzzer; using namespace dev; -string ProtoConverter::createHex(string const& _hexBytes) const +string ProtoConverter::dictionaryToken(HexPrefix _p) +{ + unsigned indexVar = m_inputSize * m_inputSize + counter(); + std::string token = dictionary[indexVar % dictionary.size()]; + yulAssert(token.size() <= 64, "Proto Fuzzer: Dictionary token too large"); + + return _p == HexPrefix::Add ? "0x" + token : token; +} + +string ProtoConverter::createHex(string const& _hexBytes) { string tmp{_hexBytes}; if (!tmp.empty()) @@ -35,12 +48,14 @@ string ProtoConverter::createHex(string const& _hexBytes) const tmp = tmp.substr(0, 64); } // We need this awkward if case because hex literals cannot be empty. + // Use a dictionary token. if (tmp.empty()) - tmp = "1"; + tmp = dictionaryToken(HexPrefix::DontAdd); + yulAssert(tmp.size() <= 64, "Proto Fuzzer: Dictionary token too large"); return tmp; } -string ProtoConverter::createAlphaNum(string const& _strBytes) const +string ProtoConverter::createAlphaNum(string const& _strBytes) { string tmp{_strBytes}; if (!tmp.empty()) @@ -56,7 +71,6 @@ string ProtoConverter::createAlphaNum(string const& _strBytes) const bool ProtoConverter::isCaseLiteralUnique(Literal const& _x) { dev::u256 mpCaseLiteralValue; - bool isUnique = false; switch (_x.literal_oneof_case()) { @@ -74,11 +88,11 @@ bool ProtoConverter::isCaseLiteralUnique(Literal const& _x) case Literal::LITERAL_ONEOF_NOT_SET: // If the proto generator does not generate a valid Literal // we generate a case 1: - mpCaseLiteralValue = 1; + mpCaseLiteralValue = u256(dictionaryToken()); break; } - isUnique = m_switchLiteralSetPerScope.top().insert(mpCaseLiteralValue).second; + bool isUnique = m_switchLiteralSetPerScope.top().insert(mpCaseLiteralValue).second; return isUnique; } @@ -96,7 +110,7 @@ void ProtoConverter::visit(Literal const& _x) m_output << "\"" << createAlphaNum(_x.strval()) << "\""; break; case Literal::LITERAL_ONEOF_NOT_SET: - m_output << "1"; + m_output << dictionaryToken(); break; } } @@ -134,7 +148,7 @@ void ProtoConverter::visit(Expression const& _x) visit(_x.func_expr()); break; case Expression::EXPR_ONEOF_NOT_SET: - m_output << "1"; + m_output << dictionaryToken(); break; } } @@ -965,6 +979,9 @@ void ProtoConverter::visit(FunctionDefinition const& _x) void ProtoConverter::visit(Program const& _x) { + // Initialize input size + m_inputSize = _x.ByteSizeLong(); + /* Program template is as follows * Four Globals a_0, a_1, a_2, and a_3 to hold up to four function return values * diff --git a/test/tools/ossfuzz/protoToYul.h b/test/tools/ossfuzz/protoToYul.h index bea31b1e5..ae006d24a 100644 --- a/test/tools/ossfuzz/protoToYul.h +++ b/test/tools/ossfuzz/protoToYul.h @@ -46,6 +46,8 @@ public: m_inForBodyScope = false; m_inForInitScope = false; m_numNestedForLoops = 0; + m_counter = 0; + m_inputSize = 0; } ProtoConverter(ProtoConverter const&) = delete; ProtoConverter(ProtoConverter&&) = delete; @@ -89,12 +91,10 @@ private: void visit(FunctionDefinitionSingleReturnVal const&); void visit(FunctionDefinitionMultiReturnVal const&); void visit(Program const&); - template - void visit(google::protobuf::RepeatedPtrField const& _repeated_field); void registerFunction(FunctionDefinition const&); - std::string createHex(std::string const& _hexBytes) const; - std::string createAlphaNum(std::string const& _strBytes) const; + std::string createHex(std::string const& _hexBytes); + std::string createAlphaNum(std::string const& _strBytes); bool isCaseLiteralUnique(Literal const&); enum class NumFunctionReturns { @@ -127,6 +127,20 @@ private: break; } } + /// Returns a pseudo-random dictionary token. + /// @param _p Enum that decides if the returned token is hex prefixed ("0x") or not + /// @return Dictionary token at the index computed using a + /// monotonically increasing counter as follows: + /// index = (m_inputSize * m_inputSize + counter) % dictionarySize + /// where m_inputSize is the size of the protobuf input and + /// dictionarySize is the total number of entries in the dictionary. + std::string dictionaryToken(dev::HexPrefix _p = dev::HexPrefix::Add); + + /// Returns a monotonically increasing counter that starts from zero. + unsigned counter() + { + return m_counter++; + } std::ostringstream m_output; // Number of live variables in inner scope of a function @@ -151,6 +165,10 @@ private: unsigned m_numNestedForLoops; // predicate to keep track of for loop init scope bool m_inForInitScope; + /// Monotonically increasing counter + unsigned m_counter; + /// Size of protobuf input + unsigned m_inputSize; }; } } diff --git a/test/tools/ossfuzz/yulOptimizerFuzzDictionary.h b/test/tools/ossfuzz/yulOptimizerFuzzDictionary.h new file mode 100644 index 000000000..eded344ff --- /dev/null +++ b/test/tools/ossfuzz/yulOptimizerFuzzDictionary.h @@ -0,0 +1,777 @@ + +static const std::vector dictionary = { + "0", + "1", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "1f", + "9f", + "a0", + "a1", + "ff", + "100", + "101", + "10", + "100", + "1000", + "10000", + "100000", + "1000000", + "10000000", + "100000000", + "1000000000", + "10000000000", + "100000000000", + "1000000000000", + "10000000000000", + "100000000000000", + "1000000000000000", + "10000000000000000", + "100000000000000000", + "1000000000000000000", + "10000000000000000000", + "100000000000000000000", + "1000000000000000000000", + "10000000000000000000000", + "100000000000000000000000", + "1000000000000000000000000", + "10000000000000000000000000", + "100000000000000000000000000", + "1000000000000000000000000000", + "10000000000000000000000000000", + "100000000000000000000000000000", + "1000000000000000000000000000000", + "10000000000000000000000000000000", + "100000000000000000000000000000000", + "1000000000000000000000000000000000", + "10000000000000000000000000000000000", + "100000000000000000000000000000000000", + "1000000000000000000000000000000000000", + "10000000000000000000000000000000000000", + "100000000000000000000000000000000000000", + "1000000000000000000000000000000000000000", + "10000000000000000000000000000000000000000", + "100000000000000000000000000000000000000000", + "1000000000000000000000000000000000000000000", + "10000000000000000000000000000000000000000000", + "100000000000000000000000000000000000000000000", + "1000000000000000000000000000000000000000000000", + "10000000000000000000000000000000000000000000000", + "100000000000000000000000000000000000000000000000", + "1000000000000000000000000000000000000000000000000", + "10000000000000000000000000000000000000000000000000", + "100000000000000000000000000000000000000000000000000", + "1000000000000000000000000000000000000000000000000000", + "10000000000000000000000000000000000000000000000000000", + "100000000000000000000000000000000000000000000000000000", + "1000000000000000000000000000000000000000000000000000000", + "10000000000000000000000000000000000000000000000000000000", + "100000000000000000000000000000000000000000000000000000000", + "1000000000000000000000000000000000000000000000000000000000", + "10000000000000000000000000000000000000000000000000000000000", + "100000000000000000000000000000000000000000000000000000000000", + "1000000000000000000000000000000000000000000000000000000000000", + "10000000000000000000000000000000000000000000000000000000000000", + "100000000000000000000000000000000000000000000000000000000000000", + "1000000000000000000000000000000000000000000000000000000000000000", + "1000000000000000000000000000000000000000000000000000000000000001", + "100000000000000000000000000000000000000000000000000000000000001", + "10000000000000000000000000000000000000000000000000000000000001", + "1000000000000000000000000000000000000000000000000000000000001", + "100000000000000000000000000000000000000000000000000000000001", + "10000000000000000000000000000000000000000000000000000000001", + "1000000000000000000000000000000000000000000000000000000001", + "100000000000000000000000000000000000000000000000000000001", + "10000000000000000000000000000000000000000000000000000001", + "1000000000000000000000000000000000000000000000000000001", + "100000000000000000000000000000000000000000000000000001", + "10000000000000000000000000000000000000000000000000001", + "1000000000000000000000000000000000000000000000000001", + "100000000000000000000000000000000000000000000000001", + "10000000000000000000000000000000000000000000000001", + "1000000000000000000000000000000000000000000000001", + "100000000000000000000000000000000000000000000001", + "10000000000000000000000000000000000000000000001", + "1000000000000000000000000000000000000000000001", + "100000000000000000000000000000000000000000001", + "10000000000000000000000000000000000000000001", + "1000000000000000000000000000000000000000001", + "100000000000000000000000000000000000000001", + "10000000000000000000000000000000000000001", + "1000000000000000000000000000000000000001", + "100000000000000000000000000000000000001", + "10000000000000000000000000000000000001", + "1000000000000000000000000000000000001", + "100000000000000000000000000000000001", + "10000000000000000000000000000000001", + "1000000000000000000000000000000001", + "100000000000000000000000000000001", + "10000000000000000000000000000001", + "1000000000000000000000000000001", + "100000000000000000000000000001", + "10000000000000000000000000001", + "1000000000000000000000000001", + "100000000000000000000000001", + "10000000000000000000000001", + "1000000000000000000000001", + "100000000000000000000001", + "10000000000000000000001", + "1000000000000000000001", + "100000000000000000001", + "10000000000000000001", + "1000000000000000001", + "100000000000000001", + "10000000000000001", + "1000000000000001", + "100000000000001", + "10000000000001", + "1000000000001", + "100000000001", + "10000000001", + "1000000001", + "100000001", + "10000001", + "1000001", + "100001", + "10001", + "1001", + "101", + "11", + "1f", + "1ff", + "1fff", + "1ffff", + "1fffff", + "1ffffff", + "1fffffff", + "1ffffffff", + "1fffffffff", + "1ffffffffff", + "1fffffffffff", + "1ffffffffffff", + "1fffffffffffff", + "1ffffffffffffff", + "1fffffffffffffff", + "1ffffffffffffffff", + "1fffffffffffffffff", + "1ffffffffffffffffff", + "1fffffffffffffffffff", + "1ffffffffffffffffffff", + "1fffffffffffffffffffff", + "1ffffffffffffffffffffff", + "1fffffffffffffffffffffff", + "1ffffffffffffffffffffffff", + "1fffffffffffffffffffffffff", + "1ffffffffffffffffffffffffff", + "1fffffffffffffffffffffffffff", + "1ffffffffffffffffffffffffffff", + "1fffffffffffffffffffffffffffff", + "1ffffffffffffffffffffffffffffff", + "1fffffffffffffffffffffffffffffff", + "1ffffffffffffffffffffffffffffffff", + "1fffffffffffffffffffffffffffffffff", + "1ffffffffffffffffffffffffffffffffff", + "1fffffffffffffffffffffffffffffffffff", + "1ffffffffffffffffffffffffffffffffffff", + "1fffffffffffffffffffffffffffffffffffff", + "1ffffffffffffffffffffffffffffffffffffff", + "1fffffffffffffffffffffffffffffffffffffff", + "1ffffffffffffffffffffffffffffffffffffffff", + "1fffffffffffffffffffffffffffffffffffffffff", + "1ffffffffffffffffffffffffffffffffffffffffff", + "1fffffffffffffffffffffffffffffffffffffffffff", + "1ffffffffffffffffffffffffffffffffffffffffffff", + "1fffffffffffffffffffffffffffffffffffffffffffff", + "1ffffffffffffffffffffffffffffffffffffffffffffff", + "1fffffffffffffffffffffffffffffffffffffffffffffff", + "1ffffffffffffffffffffffffffffffffffffffffffffffff", + "1fffffffffffffffffffffffffffffffffffffffffffffffff", + "1ffffffffffffffffffffffffffffffffffffffffffffffffff", + "1fffffffffffffffffffffffffffffffffffffffffffffffffff", + "1ffffffffffffffffffffffffffffffffffffffffffffffffffff", + "1fffffffffffffffffffffffffffffffffffffffffffffffffffff", + "1ffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "1fffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "1ffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "2", + "20", + "200", + "2000", + "20000", + "200000", + "2000000", + "20000000", + "200000000", + "2000000000", + "20000000000", + "200000000000", + "2000000000000", + "20000000000000", + "200000000000000", + "2000000000000000", + "20000000000000000", + "200000000000000000", + "2000000000000000000", + "20000000000000000000", + "200000000000000000000", + "2000000000000000000000", + "20000000000000000000000", + "200000000000000000000000", + "2000000000000000000000000", + "20000000000000000000000000", + "200000000000000000000000000", + "2000000000000000000000000000", + "20000000000000000000000000000", + "200000000000000000000000000000", + "2000000000000000000000000000000", + "20000000000000000000000000000000", + "200000000000000000000000000000000", + "2000000000000000000000000000000000", + "20000000000000000000000000000000000", + "200000000000000000000000000000000000", + "2000000000000000000000000000000000000", + "20000000000000000000000000000000000000", + "200000000000000000000000000000000000000", + "2000000000000000000000000000000000000000", + "20000000000000000000000000000000000000000", + "200000000000000000000000000000000000000000", + "2000000000000000000000000000000000000000000", + "20000000000000000000000000000000000000000000", + "200000000000000000000000000000000000000000000", + "2000000000000000000000000000000000000000000000", + "20000000000000000000000000000000000000000000000", + "200000000000000000000000000000000000000000000000", + "2000000000000000000000000000000000000000000000000", + "20000000000000000000000000000000000000000000000000", + "200000000000000000000000000000000000000000000000000", + "2000000000000000000000000000000000000000000000000000", + "20000000000000000000000000000000000000000000000000000", + "200000000000000000000000000000000000000000000000000000", + "2000000000000000000000000000000000000000000000000000000", + "20000000000000000000000000000000000000000000000000000000", + "200000000000000000000000000000000000000000000000000000000", + "2000000000000000000000000000000000000000000000000000000000", + "20000000000000000000000000000000000000000000000000000000000", + "200000000000000000000000000000000000000000000000000000000000", + "2000000000000000000000000000000000000000000000000000000000000", + "20000000000000000000000000000000000000000000000000000000000000", + "200000000000000000000000000000000000000000000000000000000000000", + "2000000000000000000000000000000000000000000000000000000000000000", + "2000000000000000000000000000000000000000000000000000000000000001", + "200000000000000000000000000000000000000000000000000000000000001", + "20000000000000000000000000000000000000000000000000000000000001", + "2000000000000000000000000000000000000000000000000000000000001", + "200000000000000000000000000000000000000000000000000000000001", + "20000000000000000000000000000000000000000000000000000000001", + "2000000000000000000000000000000000000000000000000000000001", + "200000000000000000000000000000000000000000000000000000001", + "20000000000000000000000000000000000000000000000000000001", + "2000000000000000000000000000000000000000000000000000001", + "200000000000000000000000000000000000000000000000000001", + "20000000000000000000000000000000000000000000000000001", + "2000000000000000000000000000000000000000000000000001", + "200000000000000000000000000000000000000000000000001", + "20000000000000000000000000000000000000000000000001", + "2000000000000000000000000000000000000000000000001", + "200000000000000000000000000000000000000000000001", + "20000000000000000000000000000000000000000000001", + "2000000000000000000000000000000000000000000001", + "200000000000000000000000000000000000000000001", + "20000000000000000000000000000000000000000001", + "2000000000000000000000000000000000000000001", + "200000000000000000000000000000000000000001", + "20000000000000000000000000000000000000001", + "2000000000000000000000000000000000000001", + "200000000000000000000000000000000000001", + "20000000000000000000000000000000000001", + "2000000000000000000000000000000000001", + "200000000000000000000000000000000001", + "20000000000000000000000000000000001", + "2000000000000000000000000000000001", + "200000000000000000000000000000001", + "20000000000000000000000000000001", + "2000000000000000000000000000001", + "200000000000000000000000000001", + "20000000000000000000000000001", + "2000000000000000000000000001", + "200000000000000000000000001", + "20000000000000000000000001", + "2000000000000000000000001", + "200000000000000000000001", + "20000000000000000000001", + "2000000000000000000001", + "200000000000000000001", + "20000000000000000001", + "2000000000000000001", + "200000000000000001", + "20000000000000001", + "2000000000000001", + "200000000000001", + "20000000000001", + "2000000000001", + "200000000001", + "20000000001", + "2000000001", + "200000001", + "20000001", + "2000001", + "200001", + "20001", + "2001", + "201", + "21", + "3", + "3f", + "3ff", + "3fff", + "3ffff", + "3fffff", + "3ffffff", + "3fffffff", + "3ffffffff", + "3fffffffff", + "3ffffffffff", + "3fffffffffff", + "3ffffffffffff", + "3fffffffffffff", + "3ffffffffffffff", + "3fffffffffffffff", + "3ffffffffffffffff", + "3fffffffffffffffff", + "3ffffffffffffffffff", + "3fffffffffffffffffff", + "3ffffffffffffffffffff", + "3fffffffffffffffffffff", + "3ffffffffffffffffffffff", + "3fffffffffffffffffffffff", + "3ffffffffffffffffffffffff", + "3fffffffffffffffffffffffff", + "3ffffffffffffffffffffffffff", + "3fffffffffffffffffffffffffff", + "3ffffffffffffffffffffffffffff", + "3fffffffffffffffffffffffffffff", + "3ffffffffffffffffffffffffffffff", + "3fffffffffffffffffffffffffffffff", + "3ffffffffffffffffffffffffffffffff", + "3fffffffffffffffffffffffffffffffff", + "3ffffffffffffffffffffffffffffffffff", + "3fffffffffffffffffffffffffffffffffff", + "3ffffffffffffffffffffffffffffffffffff", + "3fffffffffffffffffffffffffffffffffffff", + "3ffffffffffffffffffffffffffffffffffffff", + "3fffffffffffffffffffffffffffffffffffffff", + "3ffffffffffffffffffffffffffffffffffffffff", + "3fffffffffffffffffffffffffffffffffffffffff", + "3ffffffffffffffffffffffffffffffffffffffffff", + "3fffffffffffffffffffffffffffffffffffffffffff", + "3ffffffffffffffffffffffffffffffffffffffffffff", + "3fffffffffffffffffffffffffffffffffffffffffffff", + "3ffffffffffffffffffffffffffffffffffffffffffffff", + "3fffffffffffffffffffffffffffffffffffffffffffffff", + "3ffffffffffffffffffffffffffffffffffffffffffffffff", + "3fffffffffffffffffffffffffffffffffffffffffffffffff", + "3ffffffffffffffffffffffffffffffffffffffffffffffffff", + "3fffffffffffffffffffffffffffffffffffffffffffffffffff", + "3ffffffffffffffffffffffffffffffffffffffffffffffffffff", + "3fffffffffffffffffffffffffffffffffffffffffffffffffffff", + "3ffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "3fffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "3ffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "3fffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "4", + "40", + "400", + "4000", + "40000", + "400000", + "4000000", + "40000000", + "400000000", + "4000000000", + "40000000000", + "400000000000", + "4000000000000", + "40000000000000", + "400000000000000", + "4000000000000000", + "40000000000000000", + "400000000000000000", + "4000000000000000000", + "40000000000000000000", + "400000000000000000000", + "4000000000000000000000", + "40000000000000000000000", + "400000000000000000000000", + "4000000000000000000000000", + "40000000000000000000000000", + "400000000000000000000000000", + "4000000000000000000000000000", + "40000000000000000000000000000", + "400000000000000000000000000000", + "4000000000000000000000000000000", + "40000000000000000000000000000000", + "400000000000000000000000000000000", + "4000000000000000000000000000000000", + "40000000000000000000000000000000000", + "400000000000000000000000000000000000", + "4000000000000000000000000000000000000", + "40000000000000000000000000000000000000", + "400000000000000000000000000000000000000", + "4000000000000000000000000000000000000000", + "40000000000000000000000000000000000000000", + "400000000000000000000000000000000000000000", + "4000000000000000000000000000000000000000000", + "40000000000000000000000000000000000000000000", + "400000000000000000000000000000000000000000000", + "4000000000000000000000000000000000000000000000", + "40000000000000000000000000000000000000000000000", + "400000000000000000000000000000000000000000000000", + "4000000000000000000000000000000000000000000000000", + "40000000000000000000000000000000000000000000000000", + "400000000000000000000000000000000000000000000000000", + "4000000000000000000000000000000000000000000000000000", + "40000000000000000000000000000000000000000000000000000", + "400000000000000000000000000000000000000000000000000000", + "4000000000000000000000000000000000000000000000000000000", + "40000000000000000000000000000000000000000000000000000000", + "400000000000000000000000000000000000000000000000000000000", + "4000000000000000000000000000000000000000000000000000000000", + "40000000000000000000000000000000000000000000000000000000000", + "400000000000000000000000000000000000000000000000000000000000", + "4000000000000000000000000000000000000000000000000000000000000", + "40000000000000000000000000000000000000000000000000000000000000", + "400000000000000000000000000000000000000000000000000000000000000", + "4000000000000000000000000000000000000000000000000000000000000000", + "4000000000000000000000000000000000000000000000000000000000000001", + "400000000000000000000000000000000000000000000000000000000000001", + "40000000000000000000000000000000000000000000000000000000000001", + "4000000000000000000000000000000000000000000000000000000000001", + "400000000000000000000000000000000000000000000000000000000001", + "40000000000000000000000000000000000000000000000000000000001", + "4000000000000000000000000000000000000000000000000000000001", + "400000000000000000000000000000000000000000000000000000001", + "40000000000000000000000000000000000000000000000000000001", + "4000000000000000000000000000000000000000000000000000001", + "400000000000000000000000000000000000000000000000000001", + "40000000000000000000000000000000000000000000000000001", + "4000000000000000000000000000000000000000000000000001", + "400000000000000000000000000000000000000000000000001", + "40000000000000000000000000000000000000000000000001", + "4000000000000000000000000000000000000000000000001", + "400000000000000000000000000000000000000000000001", + "40000000000000000000000000000000000000000000001", + "4000000000000000000000000000000000000000000001", + "400000000000000000000000000000000000000000001", + "40000000000000000000000000000000000000000001", + "4000000000000000000000000000000000000000001", + "400000000000000000000000000000000000000001", + "40000000000000000000000000000000000000001", + "4000000000000000000000000000000000000001", + "400000000000000000000000000000000000001", + "40000000000000000000000000000000000001", + "4000000000000000000000000000000000001", + "400000000000000000000000000000000001", + "40000000000000000000000000000000001", + "4000000000000000000000000000000001", + "400000000000000000000000000000001", + "40000000000000000000000000000001", + "4000000000000000000000000000001", + "400000000000000000000000000001", + "40000000000000000000000000001", + "4000000000000000000000000001", + "400000000000000000000000001", + "40000000000000000000000001", + "4000000000000000000000001", + "400000000000000000000001", + "40000000000000000000001", + "4000000000000000000001", + "400000000000000000001", + "40000000000000000001", + "4000000000000000001", + "400000000000000001", + "40000000000000001", + "4000000000000001", + "400000000000001", + "40000000000001", + "4000000000001", + "400000000001", + "40000000001", + "4000000001", + "400000001", + "40000001", + "4000001", + "400001", + "40001", + "4001", + "401", + "41", + "5", + "7", + "7f", + "7ff", + "7fff", + "7ffff", + "7fffff", + "7ffffff", + "7fffffff", + "7ffffffff", + "7fffffffff", + "7ffffffffff", + "7fffffffffff", + "7ffffffffffff", + "7fffffffffffff", + "7ffffffffffffff", + "7fffffffffffffff", + "7ffffffffffffffff", + "7fffffffffffffffff", + "7ffffffffffffffffff", + "7fffffffffffffffffff", + "7ffffffffffffffffffff", + "7fffffffffffffffffffff", + "7ffffffffffffffffffffff", + "7fffffffffffffffffffffff", + "7ffffffffffffffffffffffff", + "7fffffffffffffffffffffffff", + "7ffffffffffffffffffffffffff", + "7fffffffffffffffffffffffffff", + "7ffffffffffffffffffffffffffff", + "7fffffffffffffffffffffffffffff", + "7ffffffffffffffffffffffffffffff", + "7fffffffffffffffffffffffffffffff", + "7ffffffffffffffffffffffffffffffff", + "7fffffffffffffffffffffffffffffffff", + "7ffffffffffffffffffffffffffffffffff", + "7fffffffffffffffffffffffffffffffffff", + "7ffffffffffffffffffffffffffffffffffff", + "7fffffffffffffffffffffffffffffffffffff", + "7ffffffffffffffffffffffffffffffffffffff", + "7fffffffffffffffffffffffffffffffffffffff", + "7ffffffffffffffffffffffffffffffffffffffff", + "7fffffffffffffffffffffffffffffffffffffffff", + "7ffffffffffffffffffffffffffffffffffffffffff", + "7fffffffffffffffffffffffffffffffffffffffffff", + "7ffffffffffffffffffffffffffffffffffffffffffff", + "7fffffffffffffffffffffffffffffffffffffffffffff", + "7ffffffffffffffffffffffffffffffffffffffffffffff", + "7fffffffffffffffffffffffffffffffffffffffffffffff", + "7ffffffffffffffffffffffffffffffffffffffffffffffff", + "7fffffffffffffffffffffffffffffffffffffffffffffffff", + "7ffffffffffffffffffffffffffffffffffffffffffffffffff", + "7fffffffffffffffffffffffffffffffffffffffffffffffffff", + "7ffffffffffffffffffffffffffffffffffffffffffffffffffff", + "7fffffffffffffffffffffffffffffffffffffffffffffffffffff", + "7ffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "7fffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "8", + "80", + "800", + "8000", + "80000", + "800000", + "8000000", + "80000000", + "800000000", + "8000000000", + "80000000000", + "800000000000", + "8000000000000", + "80000000000000", + "800000000000000", + "8000000000000000", + "80000000000000000", + "800000000000000000", + "8000000000000000000", + "80000000000000000000", + "800000000000000000000", + "8000000000000000000000", + "80000000000000000000000", + "800000000000000000000000", + "8000000000000000000000000", + "80000000000000000000000000", + "800000000000000000000000000", + "8000000000000000000000000000", + "80000000000000000000000000000", + "800000000000000000000000000000", + "8000000000000000000000000000000", + "80000000000000000000000000000000", + "800000000000000000000000000000000", + "8000000000000000000000000000000000", + "80000000000000000000000000000000000", + "800000000000000000000000000000000000", + "8000000000000000000000000000000000000", + "80000000000000000000000000000000000000", + "800000000000000000000000000000000000000", + "8000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000", + "800000000000000000000000000000000000000000", + "8000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000", + "800000000000000000000000000000000000000000000", + "8000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000", + "800000000000000000000000000000000000000000000000", + "8000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000", + "800000000000000000000000000000000000000000000000000", + "8000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000", + "800000000000000000000000000000000000000000000000000000", + "8000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000", + "800000000000000000000000000000000000000000000000000000000", + "8000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000", + "800000000000000000000000000000000000000000000000000000000000", + "8000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000", + "800000000000000000000000000000000000000000000000000000000000000", + "8000000000000000000000000000000000000000000000000000000000000000", + "8000000000000000000000000000000000000000000000000000000000000001", + "800000000000000000000000000000000000000000000000000000000000001", + "80000000000000000000000000000000000000000000000000000000000001", + "8000000000000000000000000000000000000000000000000000000000001", + "800000000000000000000000000000000000000000000000000000000001", + "80000000000000000000000000000000000000000000000000000000001", + "8000000000000000000000000000000000000000000000000000000001", + "800000000000000000000000000000000000000000000000000000001", + "80000000000000000000000000000000000000000000000000000001", + "8000000000000000000000000000000000000000000000000000001", + "800000000000000000000000000000000000000000000000000001", + "80000000000000000000000000000000000000000000000000001", + "8000000000000000000000000000000000000000000000000001", + "800000000000000000000000000000000000000000000000001", + "80000000000000000000000000000000000000000000000001", + "8000000000000000000000000000000000000000000000001", + "800000000000000000000000000000000000000000000001", + "80000000000000000000000000000000000000000000001", + "8000000000000000000000000000000000000000000001", + "800000000000000000000000000000000000000000001", + "80000000000000000000000000000000000000000001", + "8000000000000000000000000000000000000000001", + "800000000000000000000000000000000000000001", + "80000000000000000000000000000000000000001", + "8000000000000000000000000000000000000001", + "800000000000000000000000000000000000001", + "80000000000000000000000000000000000001", + "8000000000000000000000000000000000001", + "800000000000000000000000000000000001", + "80000000000000000000000000000000001", + "8000000000000000000000000000000001", + "800000000000000000000000000000001", + "80000000000000000000000000000001", + "8000000000000000000000000000001", + "800000000000000000000000000001", + "80000000000000000000000000001", + "8000000000000000000000000001", + "800000000000000000000000001", + "80000000000000000000000001", + "8000000000000000000000001", + "800000000000000000000001", + "80000000000000000000001", + "8000000000000000000001", + "800000000000000000001", + "80000000000000000001", + "8000000000000000001", + "800000000000000001", + "80000000000000001", + "8000000000000001", + "800000000000001", + "80000000000001", + "8000000000001", + "800000000001", + "80000000001", + "8000000001", + "800000001", + "80000001", + "8000001", + "800001", + "80001", + "8001", + "801", + "81", + "9", + "f", + "ff", + "fff", + "ffff", + "fffff", + "ffffff", + "fffffff", + "ffffffff", + "fffffffff", + "ffffffffff", + "fffffffffff", + "ffffffffffff", + "fffffffffffff", + "ffffffffffffff", + "fffffffffffffff", + "ffffffffffffffff", + "fffffffffffffffff", + "ffffffffffffffffff", + "fffffffffffffffffff", + "ffffffffffffffffffff", + "fffffffffffffffffffff", + "ffffffffffffffffffffff", + "fffffffffffffffffffffff", + "ffffffffffffffffffffffff", + "fffffffffffffffffffffffff", + "ffffffffffffffffffffffffff", + "fffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffff", + "fffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffff", + "fffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffff", + "fffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffff", + "fffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffff", + "fffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffff", + "fffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffff", + "fffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffff", + "fffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffff", + "fffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffff", + "fffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffff", + "fffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffff", + "fffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffff", + "fffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "fffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" +};