diff --git a/__mocks__/cairo/cairo2120/enums_test_enums.casm b/__mocks__/cairo/cairo2120/enums_test_enums.casm new file mode 100644 index 000000000..13253795a --- /dev/null +++ b/__mocks__/cairo/cairo2120/enums_test_enums.casm @@ -0,0 +1,13873 @@ +{ + "prime": "0x800000000000011000000000000000000000000000000000000000000000001", + "compiler_version": "2.12.0", + "bytecode": [ + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0xac", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x96", + "0x480280007ffc8000", + "0x20680017fff7fff", + "0x39", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x2b", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280017ff97fff", + "0x482480017ffe8000", + "0xefffffffffffffde000000000000ffff", + "0x480280027ff97fff", + "0x400280037ff97ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x14", + "0x402780017fff7fff", + "0x1", + "0x400280017ff97ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffff0000", + "0x400280027ff97fff", + "0x482680017ff98000", + "0x3", + "0x482480017ff68000", + "0x1144", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x482480017ff68000", + "0x1", + "0x48127ff67fff8000", + "0x10780017fff7fff", + "0x1d", + "0x482680017ff98000", + "0x4", + "0x482480017ff18000", + "0x1658", + "0x10780017fff7fff", + "0x66", + "0x482680017ff98000", + "0x1", + "0x482480017ff98000", + "0x1b12", + "0x10780017fff7fff", + "0x60", + "0x4824800180007fff", + "0x1", + "0x20680017fff7fff", + "0x52", + "0x482680017ff98000", + "0x1", + "0x482480017ffb8000", + "0x14f0", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0x10b9", + "0x48127ff17fff8000", + "0x48127ff17fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x2950", + "0x482480017fff8000", + "0x294f", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ff5", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff27fff", + "0x10780017fff7fff", + "0x25", + "0x4824800180007ff5", + "0x0", + "0x400080007ff37fff", + "0x40780017fff7fff", + "0x1", + "0x20680017fff7ff4", + "0xd", + "0x480680017fff8000", + "0x0", + "0x400080007ffe7fff", + "0x400080017ffe7ff4", + "0x482480017ffd8000", + "0x1f4", + "0x48127ffd7fff8000", + "0x482480017ffc8000", + "0x2", + "0x10780017fff7fff", + "0xa", + "0x480680017fff8000", + "0x1", + "0x400080007ffe7fff", + "0x482480017ffd8000", + "0x2bc", + "0x48127ffd7fff8000", + "0x482480017ffc8000", + "0x1", + "0x482480017fee8000", + "0x1", + "0x48127ffc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017ff28000", + "0x1", + "0x48127ff27fff8000", + "0x10780017fff7fff", + "0x1a", + "0x482680017ff98000", + "0x1", + "0x482480017ffb8000", + "0x1c3e", + "0x10780017fff7fff", + "0x6", + "0x482680017ff98000", + "0x1", + "0x482480017ffd8000", + "0x1dce", + "0x1104800180018000", + "0x1074", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0x106b", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x7d", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x48127ffe7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x1057", + "0x20680017fff7ff9", + "0x69", + "0x20680017fff7ffc", + "0x5d", + "0x48307ffa80007ffb", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0x103d", + "0x48127fee7fff8000", + "0x48127fee7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x28d4", + "0x482480017fff8000", + "0x28d3", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ff2", + "0x8e8", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007fef7fff", + "0x10780017fff7fff", + "0x3a", + "0x4824800180007ff2", + "0x8e8", + "0x400080007ff07fff", + "0x40780017fff7fff", + "0x1", + "0x20680017fff7ff5", + "0x21", + "0x480680017fff8000", + "0x0", + "0x400080007ffe7fff", + "0x48307ff580007ff6", + "0x400080017ffd7fff", + "0x482480017fed8000", + "0x1", + "0x48127ffb7fff8000", + "0x48127ff27fff8000", + "0x48127ff27fff8000", + "0x48127ff97fff8000", + "0x482480017ff88000", + "0x2", + "0x1104800180018000", + "0x10ad", + "0x20680017fff7ffd", + "0x8", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x10780017fff7fff", + "0x14", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x1", + "0x400080007ffe7fff", + "0x482480017fee8000", + "0x1", + "0x482480017ffc8000", + "0xbfe", + "0x48127ffc7fff8000", + "0x482480017ffb8000", + "0x1", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017fef8000", + "0x1", + "0x482480017fef8000", + "0xbe", + "0x10780017fff7fff", + "0x18", + "0x1104800180018000", + "0xfec", + "0x48127fef7fff8000", + "0x48127fef7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0xfdb", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x95", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x7f", + "0x480280007ffc8000", + "0x20680017fff7fff", + "0x1c", + "0x482680017ff98000", + "0x1", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x107c", + "0x20680017fff7ffc", + "0xe", + "0x48127ff97fff8000", + "0x482480017fdb8000", + "0x10e", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x1a", + "0x48127ff97fff8000", + "0x482480017fdb8000", + "0x988", + "0x10780017fff7fff", + "0x66", + "0x4824800180007fff", + "0x1", + "0x20680017fff7fff", + "0x58", + "0x482680017ff98000", + "0x1", + "0x482480017ffb8000", + "0x1428", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0xf83", + "0x48127fef7fff8000", + "0x48127fef7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x281a", + "0x482480017fff8000", + "0x2819", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ff3", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff07fff", + "0x10780017fff7fff", + "0x27", + "0x4824800180007ff3", + "0x0", + "0x400080007ff17fff", + "0x40780017fff7fff", + "0x1", + "0x20680017fff7ff2", + "0xf", + "0x480680017fff8000", + "0x0", + "0x400080007ffe7fff", + "0x400080017ffe7ff2", + "0x400080027ffe7ff3", + "0x400080037ffe7ff4", + "0x482480017ffd8000", + "0x12c", + "0x48127ffd7fff8000", + "0x482480017ffc8000", + "0x4", + "0x10780017fff7fff", + "0xa", + "0x480680017fff8000", + "0x1", + "0x400080007ffe7fff", + "0x482480017ffd8000", + "0x2bc", + "0x48127ffd7fff8000", + "0x482480017ffc8000", + "0x1", + "0x482480017fec8000", + "0x1", + "0x48127ffc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017ff08000", + "0x1", + "0x48127ff07fff8000", + "0x10780017fff7fff", + "0x1a", + "0x482680017ff98000", + "0x1", + "0x482480017ffb8000", + "0x1c3e", + "0x10780017fff7fff", + "0x6", + "0x482680017ff98000", + "0x1", + "0x482480017ffd8000", + "0x1dce", + "0x1104800180018000", + "0xf3c", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0xf33", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0xfffffffffffffffffffffffffffff60a", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x7d", + "0x4825800180007ffa", + "0x9f6", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x48127ffe7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x107a", + "0x20680017fff7ff8", + "0x69", + "0x20680017fff7ffb", + "0x5d", + "0x48307ff980007ffa", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0xf05", + "0x48127fed7fff8000", + "0x48127fed7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x279c", + "0x482480017fff8000", + "0x279b", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ff1", + "0xa0a", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007fee7fff", + "0x10780017fff7fff", + "0x3b", + "0x4824800180007ff1", + "0xa0a", + "0x400080007fef7fff", + "0x40780017fff7fff", + "0x1", + "0x20680017fff7ff4", + "0x22", + "0x480680017fff8000", + "0x0", + "0x400080007ffe7fff", + "0x400080017ffe7ff4", + "0x48307ff580007ff6", + "0x400080027ffd7fff", + "0x482480017fec8000", + "0x1", + "0x48127ffb7fff8000", + "0x48127ff27fff8000", + "0x48127ff27fff8000", + "0x48127ff97fff8000", + "0x482480017ff88000", + "0x3", + "0x1104800180018000", + "0x10c1", + "0x20680017fff7ffd", + "0x8", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x10780017fff7fff", + "0x14", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x1", + "0x400080007ffe7fff", + "0x482480017fed8000", + "0x1", + "0x482480017ffc8000", + "0xc62", + "0x48127ffc7fff8000", + "0x482480017ffb8000", + "0x1", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017fee8000", + "0x1", + "0x48127fee7fff8000", + "0x10780017fff7fff", + "0x18", + "0x1104800180018000", + "0xeb4", + "0x48127fee7fff8000", + "0x48127fee7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0xea3", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x70", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x109a", + "0x20680017fff7ffc", + "0x5b", + "0x48307ffa80007ffb", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0xe78", + "0x48127ff07fff8000", + "0x48127fd87fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x270f", + "0x482480017fff8000", + "0x270e", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007fdc", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff17fff", + "0x10780017fff7fff", + "0x38", + "0x4824800180007fdc", + "0x0", + "0x400080007ff27fff", + "0x40780017fff7fff", + "0x1", + "0x20680017fff7ff5", + "0x1b", + "0x480680017fff8000", + "0x0", + "0x400080007ffe7fff", + "0x20680017fff7ff5", + "0xf", + "0x40780017fff7fff", + "0x3", + "0x480680017fff8000", + "0x0", + "0x400080017ffa7fff", + "0x400080027ffa7ff2", + "0x482480017ff98000", + "0x974", + "0x48127ff97fff8000", + "0x482480017ff88000", + "0x3", + "0x10780017fff7fff", + "0x16", + "0x482480017ffd8000", + "0x92e", + "0x48127ffd7fff8000", + "0x482480017ffc8000", + "0x1", + "0x10780017fff7fff", + "0x8", + "0x40780017fff7fff", + "0x1", + "0x482480017ffd8000", + "0xa50", + "0x48127ffd7fff8000", + "0x48127ffc7fff8000", + "0x480680017fff8000", + "0x1", + "0x400080007ffe7fff", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x482480017ffc8000", + "0x1", + "0x482480017fe98000", + "0x1", + "0x48127ffc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017ff18000", + "0x1", + "0x482480017fd98000", + "0x92e", + "0x10780017fff7fff", + "0x10", + "0x1104800180018000", + "0xe29", + "0x48127ff17fff8000", + "0x48127fd97fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0xe20", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0xa2", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x8c", + "0x480280007ffc8000", + "0x20680017fff7fff", + "0x1b", + "0x482680017ff98000", + "0x1", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x10ab", + "0x20680017fff7ffd", + "0xd", + "0x48127ffa7fff8000", + "0x482480017fe38000", + "0x6d6", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x10780017fff7fff", + "0x18", + "0x48127ffa7fff8000", + "0x482480017fe38000", + "0xeec", + "0x10780017fff7fff", + "0x74", + "0x4824800180007fff", + "0x1", + "0x20680017fff7fff", + "0x66", + "0x482680017ff98000", + "0x1", + "0x482480017ffb8000", + "0x148c", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0xdcb", + "0x48127ff07fff8000", + "0x48127ff07fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x2662", + "0x482480017fff8000", + "0x2661", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ff4", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff17fff", + "0x10780017fff7fff", + "0x37", + "0x4824800180007ff4", + "0x0", + "0x400080007ff27fff", + "0x40780017fff7fff", + "0x1", + "0x20680017fff7ff3", + "0x1d", + "0x480680017fff8000", + "0x0", + "0x400080007ffe7fff", + "0x20680017fff7ff3", + "0xd", + "0x480680017fff8000", + "0x0", + "0x400080017ffd7fff", + "0x400080027ffd7ff3", + "0x482480017ffc8000", + "0xc8", + "0x48127ffc7fff8000", + "0x482480017ffb8000", + "0x3", + "0x10780017fff7fff", + "0x17", + "0x480680017fff8000", + "0x1", + "0x400080017ffd7fff", + "0x400080027ffd7ff3", + "0x482480017ffc8000", + "0xc8", + "0x48127ffc7fff8000", + "0x482480017ffb8000", + "0x3", + "0x10780017fff7fff", + "0xc", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x1", + "0x400080007ffd7fff", + "0x482480017ffc8000", + "0x24e", + "0x48127ffc7fff8000", + "0x482480017ffb8000", + "0x1", + "0x482480017fec8000", + "0x1", + "0x48127ffc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017ff18000", + "0x1", + "0x48127ff17fff8000", + "0x10780017fff7fff", + "0x1a", + "0x482680017ff98000", + "0x1", + "0x482480017ffb8000", + "0x1c3e", + "0x10780017fff7fff", + "0x6", + "0x482680017ff98000", + "0x1", + "0x482480017ffd8000", + "0x1dce", + "0x1104800180018000", + "0xd74", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0xd6b", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x5e", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x109a", + "0x20680017fff7ffc", + "0x49", + "0x48307ffa80007ffb", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0xd40", + "0x48127ff07fff8000", + "0x48127fd67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x25d7", + "0x482480017fff8000", + "0x25d6", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007fda", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff17fff", + "0x10780017fff7fff", + "0x26", + "0x4824800180007fda", + "0x0", + "0x400080007ff27fff", + "0x40780017fff7fff", + "0x1", + "0x20680017fff7ff5", + "0xe", + "0x480680017fff8000", + "0x0", + "0x400080007ffe7fff", + "0x400080017ffe7ff5", + "0x400080027ffe7ff6", + "0x482480017ffd8000", + "0x96a", + "0x48127ffd7fff8000", + "0x482480017ffc8000", + "0x3", + "0x10780017fff7fff", + "0xa", + "0x480680017fff8000", + "0x1", + "0x400080007ffe7fff", + "0x482480017ffd8000", + "0xa96", + "0x48127ffd7fff8000", + "0x482480017ffc8000", + "0x1", + "0x482480017fed8000", + "0x1", + "0x48127ffc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017ff18000", + "0x1", + "0x482480017fd78000", + "0x7da", + "0x10780017fff7fff", + "0x10", + "0x1104800180018000", + "0xd03", + "0x48127ff17fff8000", + "0x48127fd77fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0xcfa", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0xfffffffffffffffffffffffffffff042", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x7c", + "0x4825800180007ffa", + "0xfbe", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x48127ffe7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x10c9", + "0x20680017fff7ff7", + "0x68", + "0x20680017fff7ffa", + "0x5c", + "0x48307ff880007ff9", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0xccc", + "0x48127fec7fff8000", + "0x48127fec7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x2563", + "0x482480017fff8000", + "0x2562", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ff0", + "0xf82", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007fed7fff", + "0x10780017fff7fff", + "0x3a", + "0x4824800180007ff0", + "0xf82", + "0x400080007fee7fff", + "0x40780017fff7fff", + "0x1", + "0x20680017fff7ff3", + "0x21", + "0x480680017fff8000", + "0x0", + "0x400080007ffe7fff", + "0x482480017fec8000", + "0x1", + "0x48127ffc7fff8000", + "0x48127ff17fff8000", + "0x48127ff17fff8000", + "0x48127ff17fff8000", + "0x48127ff17fff8000", + "0x48127ff87fff8000", + "0x482480017ff78000", + "0x1", + "0x1104800180018000", + "0x111c", + "0x20680017fff7ffd", + "0x8", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x10780017fff7fff", + "0x14", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x1", + "0x400080007ffe7fff", + "0x482480017fec8000", + "0x1", + "0x482480017ffc8000", + "0x11da", + "0x48127ffc7fff8000", + "0x482480017ffb8000", + "0x1", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017fed8000", + "0x1", + "0x48127fed7fff8000", + "0x10780017fff7fff", + "0x18", + "0x1104800180018000", + "0xc7c", + "0x48127fed7fff8000", + "0x48127fed7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0xc6b", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x7f", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x69", + "0x40780017fff7fff", + "0x1", + "0x482680017ff98000", + "0x1", + "0x48127ffc7fff8000", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48127ffb7fff8000", + "0x48127ffa7fff8000", + "0x480280007ffc8000", + "0x1104800180018000", + "0x1176", + "0x20680017fff7ffa", + "0x52", + "0x20680017fff7ffd", + "0x4b", + "0x48307ffb80007ffc", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0xc32", + "0x48127fef7fff8000", + "0x48127fef7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x24c9", + "0x482480017fff8000", + "0x24c8", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ff3", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff07fff", + "0x10780017fff7fff", + "0x28", + "0x4824800180007ff3", + "0x0", + "0x400080007ff17fff", + "0x48307ff780007ff8", + "0x40780017fff7fff", + "0x1", + "0x4844800180007ffe", + "0x2", + "0x400080007ffe7fff", + "0x482480017fee8000", + "0x1", + "0x48127ffb7fff8000", + "0x48127ff27fff8000", + "0x48127ff27fff8000", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x1104800180018000", + "0x11e7", + "0x20680017fff7ffd", + "0xb", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x4c4", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017ff08000", + "0x1", + "0x482480017ff08000", + "0xbae", + "0x10780017fff7fff", + "0x21", + "0x48127ff87fff8000", + "0x482480017ff88000", + "0x10a4", + "0x10780017fff7fff", + "0xe", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482480017ffd8000", + "0x1dce", + "0x1104800180018000", + "0xbe2", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0xbd9", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x7f", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x69", + "0x40780017fff7fff", + "0x1", + "0x482680017ff98000", + "0x1", + "0x48127ffc7fff8000", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48127ffb7fff8000", + "0x48127ffa7fff8000", + "0x480280007ffc8000", + "0x1104800180018000", + "0x11cc", + "0x20680017fff7ffa", + "0x52", + "0x20680017fff7ffd", + "0x4b", + "0x48307ffb80007ffc", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0xba0", + "0x48127fef7fff8000", + "0x48127fef7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x2437", + "0x482480017fff8000", + "0x2436", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ff3", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff07fff", + "0x10780017fff7fff", + "0x28", + "0x4824800180007ff3", + "0x0", + "0x400080007ff17fff", + "0x48307ff780007ff8", + "0x40780017fff7fff", + "0x1", + "0x4844800180007ffe", + "0x4", + "0x400080007ffe7fff", + "0x482480017fee8000", + "0x1", + "0x48127ffb7fff8000", + "0x48127ff27fff8000", + "0x48127ff27fff8000", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x1104800180018000", + "0x11f7", + "0x20680017fff7ffd", + "0xb", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x44c", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017ff08000", + "0x1", + "0x482480017ff08000", + "0xbae", + "0x10780017fff7fff", + "0x21", + "0x48127ff87fff8000", + "0x482480017ff88000", + "0x10a4", + "0x10780017fff7fff", + "0xe", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482480017ffd8000", + "0x1dce", + "0x1104800180018000", + "0xb50", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0xb47", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x91", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x7b", + "0x480280007ffc8000", + "0x20680017fff7fff", + "0x36", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x28", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280017ff97fff", + "0x482480017ffe8000", + "0xefffffffffffffde000000000000ffff", + "0x480280027ff97fff", + "0x400280037ff97ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x11", + "0x402780017fff7fff", + "0x1", + "0x400280017ff97ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffff0000", + "0x400280027ff97fff", + "0x482680017ff98000", + "0x3", + "0x482480017ff68000", + "0x120c", + "0x482480017ff88000", + "0x1", + "0x48127ff87fff8000", + "0x10780017fff7fff", + "0x19", + "0x482680017ff98000", + "0x4", + "0x482480017ff18000", + "0x1658", + "0x10780017fff7fff", + "0x4e", + "0x482680017ff98000", + "0x1", + "0x482480017ff98000", + "0x1b12", + "0x10780017fff7fff", + "0x48", + "0x4824800180007fff", + "0x1", + "0x20680017fff7fff", + "0x3a", + "0x482680017ff98000", + "0x1", + "0x482480017ffb8000", + "0x15b8", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0xadd", + "0x48127ff37fff8000", + "0x48127ff37fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x2374", + "0x482480017fff8000", + "0x2373", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ff7", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff47fff", + "0x10780017fff7fff", + "0x11", + "0x4824800180007ff7", + "0x0", + "0x400080007ff57fff", + "0x40780017fff7fff", + "0x1", + "0x482480017ff48000", + "0x1", + "0x482480017ffd8000", + "0x514", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x1a", + "0x482680017ff98000", + "0x1", + "0x482480017ffb8000", + "0x1c3e", + "0x10780017fff7fff", + "0x6", + "0x482680017ff98000", + "0x1", + "0x482480017ffd8000", + "0x1dce", + "0x1104800180018000", + "0xaac", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0xaa3", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x5e", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0xdd2", + "0x20680017fff7ffc", + "0x49", + "0x48307ffa80007ffb", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0xa78", + "0x48127ff07fff8000", + "0x48127fd67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x230f", + "0x482480017fff8000", + "0x230e", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007fda", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff17fff", + "0x10780017fff7fff", + "0x26", + "0x4824800180007fda", + "0x0", + "0x400080007ff27fff", + "0x40780017fff7fff", + "0x1", + "0x20680017fff7ff5", + "0xe", + "0x480680017fff8000", + "0x0", + "0x400080007ffe7fff", + "0x400080017ffe7ff5", + "0x400080027ffe7ff6", + "0x482480017ffd8000", + "0x96a", + "0x48127ffd7fff8000", + "0x482480017ffc8000", + "0x3", + "0x10780017fff7fff", + "0xa", + "0x480680017fff8000", + "0x1", + "0x400080007ffe7fff", + "0x482480017ffd8000", + "0xa96", + "0x48127ffd7fff8000", + "0x482480017ffc8000", + "0x1", + "0x482480017fed8000", + "0x1", + "0x48127ffc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017ff18000", + "0x1", + "0x482480017fd78000", + "0x7da", + "0x10780017fff7fff", + "0x10", + "0x1104800180018000", + "0xa3b", + "0x48127ff17fff8000", + "0x48127fd77fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0xa32", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x5e", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0xcc6", + "0x20680017fff7ffd", + "0x49", + "0x48307ffb80007ffc", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0xa07", + "0x48127ff17fff8000", + "0x48127fdc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x229e", + "0x482480017fff8000", + "0x229d", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007fe0", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff27fff", + "0x10780017fff7fff", + "0x26", + "0x4824800180007fe0", + "0x0", + "0x400080007ff37fff", + "0x40780017fff7fff", + "0x1", + "0x20680017fff7ff6", + "0xd", + "0x480680017fff8000", + "0x0", + "0x400080007ffe7fff", + "0x400080017ffe7ff6", + "0x482480017ffd8000", + "0xd7a", + "0x48127ffd7fff8000", + "0x482480017ffc8000", + "0x2", + "0x10780017fff7fff", + "0xb", + "0x480680017fff8000", + "0x1", + "0x400080007ffe7fff", + "0x400080017ffe7ff6", + "0x482480017ffd8000", + "0xdde", + "0x48127ffd7fff8000", + "0x482480017ffc8000", + "0x2", + "0x482480017fee8000", + "0x1", + "0x48127ffc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017ff28000", + "0x1", + "0x482480017fdd8000", + "0xb86", + "0x10780017fff7fff", + "0x10", + "0x1104800180018000", + "0x9ca", + "0x48127ff27fff8000", + "0x48127fdd7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0x9c1", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0xfffffffffffffffffffffffffffffff6", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x7e", + "0x4825800180007ffa", + "0xa", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x48127ffe7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x1062", + "0x20680017fff7ff9", + "0x6a", + "0x20680017fff7ffc", + "0x5e", + "0x48307ffa80007ffb", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0x993", + "0x48127fee7fff8000", + "0x48127fee7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x222a", + "0x482480017fff8000", + "0x2229", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ff2", + "0x816", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007fef7fff", + "0x10780017fff7fff", + "0x3c", + "0x4824800180007ff2", + "0x816", + "0x400080007ff07fff", + "0x40780017fff7fff", + "0x1", + "0x20680017fff7ff5", + "0x13", + "0x480680017fff8000", + "0x0", + "0x400080007ffe7fff", + "0x48307ff580007ff6", + "0x400080017ffd7fff", + "0x482480017fed8000", + "0x1", + "0x48127ffb7fff8000", + "0x48127ff27fff8000", + "0x48127ff27fff8000", + "0x48127ff97fff8000", + "0x482480017ff88000", + "0x2", + "0x1104800180018000", + "0xa03", + "0x10780017fff7fff", + "0x12", + "0x480680017fff8000", + "0x1", + "0x400080007ffe7fff", + "0x48307ff580007ff6", + "0x400080017ffd7fff", + "0x482480017fed8000", + "0x1", + "0x482480017ffb8000", + "0x64", + "0x48127ff27fff8000", + "0x48127ff27fff8000", + "0x48127ff97fff8000", + "0x482480017ff88000", + "0x2", + "0x1104800180018000", + "0x10d8", + "0x20680017fff7ffd", + "0xa", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017fef8000", + "0x1", + "0x48127fef7fff8000", + "0x10780017fff7fff", + "0x18", + "0x1104800180018000", + "0x941", + "0x48127fef7fff8000", + "0x48127fef7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0x930", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0xfffffffffffffffffffffffffffffe52", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x60", + "0x4825800180007ffa", + "0x1ae", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x10c1", + "0x20680017fff7ffb", + "0x4b", + "0x48307ff980007ffa", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0x905", + "0x48127fef7fff8000", + "0x48127fc37fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x219c", + "0x482480017fff8000", + "0x219b", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007fc7", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff07fff", + "0x10780017fff7fff", + "0x29", + "0x4824800180007fc7", + "0x0", + "0x400080007ff17fff", + "0x40780017fff7fff", + "0x1", + "0x20680017fff7ff4", + "0xf", + "0x480680017fff8000", + "0x0", + "0x400080007ffe7fff", + "0x400080017ffe7ff4", + "0x400080027ffe7ff5", + "0x400080037ffe7ff6", + "0x482480017ffd8000", + "0x12c", + "0x48127ffd7fff8000", + "0x482480017ffc8000", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x480680017fff8000", + "0x1", + "0x400080007ffe7fff", + "0x400080017ffe7ff5", + "0x400080027ffe7ff6", + "0x482480017ffd8000", + "0x1f4", + "0x48127ffd7fff8000", + "0x482480017ffc8000", + "0x3", + "0x482480017fec8000", + "0x1", + "0x48127ffc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017ff08000", + "0x1", + "0x48127fc47fff8000", + "0x10780017fff7fff", + "0x10", + "0x1104800180018000", + "0x8c6", + "0x48127ff07fff8000", + "0x48127fc47fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0x8bd", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0xfffffffffffffffffffffffffffff3b2", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x80", + "0x4825800180007ffa", + "0xc4e", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x48127ffe7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x1108", + "0x20680017fff7ff8", + "0x6c", + "0x20680017fff7ffb", + "0x60", + "0x48307ff980007ffa", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0x88f", + "0x48127fed7fff8000", + "0x48127fed7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x2126", + "0x482480017fff8000", + "0x2125", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ff1", + "0x87a", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007fee7fff", + "0x10780017fff7fff", + "0x3e", + "0x4824800180007ff1", + "0x87a", + "0x400080007fef7fff", + "0x40780017fff7fff", + "0x1", + "0x20680017fff7ff4", + "0x14", + "0x480680017fff8000", + "0x0", + "0x400080007ffe7fff", + "0x400080017ffe7ff4", + "0x48307ff580007ff6", + "0x400080027ffd7fff", + "0x482480017fec8000", + "0x1", + "0x48127ffb7fff8000", + "0x48127ff27fff8000", + "0x48127ff27fff8000", + "0x48127ff97fff8000", + "0x482480017ff88000", + "0x3", + "0x1104800180018000", + "0xa4b", + "0x10780017fff7fff", + "0x13", + "0x480680017fff8000", + "0x1", + "0x400080007ffe7fff", + "0x400080017ffe7ff4", + "0x48307ff580007ff6", + "0x400080027ffd7fff", + "0x482480017fec8000", + "0x1", + "0x482480017ffb8000", + "0x64", + "0x48127ff27fff8000", + "0x48127ff27fff8000", + "0x48127ff97fff8000", + "0x482480017ff88000", + "0x3", + "0x1104800180018000", + "0xfd2", + "0x20680017fff7ffd", + "0xa", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017fee8000", + "0x1", + "0x48127fee7fff8000", + "0x10780017fff7fff", + "0x18", + "0x1104800180018000", + "0x83b", + "0x48127fee7fff8000", + "0x48127fee7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0x82a", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x70", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x1119", + "0x20680017fff7ffc", + "0x5b", + "0x48307ffa80007ffb", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0x7ff", + "0x48127ff07fff8000", + "0x48127fcc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x2096", + "0x482480017fff8000", + "0x2095", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007fd0", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff17fff", + "0x10780017fff7fff", + "0x38", + "0x4824800180007fd0", + "0x0", + "0x400080007ff27fff", + "0x40780017fff7fff", + "0x1", + "0x20680017fff7ff5", + "0x1d", + "0x480680017fff8000", + "0x0", + "0x400080007ffe7fff", + "0x20680017fff7ff5", + "0xd", + "0x480680017fff8000", + "0x0", + "0x400080017ffd7fff", + "0x400080027ffd7ff5", + "0x482480017ffc8000", + "0x4e2", + "0x48127ffc7fff8000", + "0x482480017ffb8000", + "0x3", + "0x10780017fff7fff", + "0x18", + "0x480680017fff8000", + "0x1", + "0x400080017ffd7fff", + "0x400080027ffd7ff5", + "0x482480017ffc8000", + "0x4e2", + "0x48127ffc7fff8000", + "0x482480017ffb8000", + "0x3", + "0x10780017fff7fff", + "0xd", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x1", + "0x400080007ffd7fff", + "0x400080017ffd7ff5", + "0x482480017ffc8000", + "0x604", + "0x48127ffc7fff8000", + "0x482480017ffb8000", + "0x2", + "0x482480017fec8000", + "0x1", + "0x48127ffc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017ff18000", + "0x1", + "0x482480017fcd8000", + "0x41a", + "0x10780017fff7fff", + "0x10", + "0x1104800180018000", + "0x7b0", + "0x48127ff17fff8000", + "0x48127fcd7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0x7a7", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x6f", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x1119", + "0x20680017fff7ffc", + "0x5a", + "0x48307ffa80007ffb", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0x77c", + "0x48127ff07fff8000", + "0x48127fd77fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x2013", + "0x482480017fff8000", + "0x2012", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007fdb", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff17fff", + "0x10780017fff7fff", + "0x37", + "0x4824800180007fdb", + "0x0", + "0x400080007ff27fff", + "0x40780017fff7fff", + "0x1", + "0x20680017fff7ff5", + "0xf", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x0", + "0x400080007ffd7fff", + "0x400080017ffd7ff5", + "0x482480017ffc8000", + "0x9ec", + "0x48127ffc7fff8000", + "0x482480017ffb8000", + "0x2", + "0x10780017fff7fff", + "0x1a", + "0x480680017fff8000", + "0x1", + "0x400080007ffe7fff", + "0x20680017fff7ff5", + "0xd", + "0x480680017fff8000", + "0x0", + "0x400080017ffd7fff", + "0x400080027ffd7ff5", + "0x482480017ffc8000", + "0x92e", + "0x48127ffc7fff8000", + "0x482480017ffb8000", + "0x3", + "0x10780017fff7fff", + "0xa", + "0x480680017fff8000", + "0x1", + "0x400080017ffd7fff", + "0x482480017ffc8000", + "0x9f6", + "0x48127ffc7fff8000", + "0x482480017ffb8000", + "0x2", + "0x482480017fec8000", + "0x1", + "0x48127ffc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017ff18000", + "0x1", + "0x482480017fd88000", + "0x866", + "0x10780017fff7fff", + "0x10", + "0x1104800180018000", + "0x72e", + "0x48127ff17fff8000", + "0x48127fd87fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0x725", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x5f", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x1165", + "0x20680017fff7ffc", + "0x4a", + "0x48307ffa80007ffb", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0x6fa", + "0x48127ff07fff8000", + "0x48127fd57fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x1f91", + "0x482480017fff8000", + "0x1f90", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007fd9", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff17fff", + "0x10780017fff7fff", + "0x27", + "0x4824800180007fd9", + "0x0", + "0x400080007ff27fff", + "0x40780017fff7fff", + "0x1", + "0x20680017fff7ff5", + "0xd", + "0x480680017fff8000", + "0x0", + "0x400080007ffe7fff", + "0x400080017ffe7ff6", + "0x482480017ffd8000", + "0x906", + "0x48127ffd7fff8000", + "0x482480017ffc8000", + "0x2", + "0x10780017fff7fff", + "0xc", + "0x480680017fff8000", + "0x1", + "0x400080007ffe7fff", + "0x400080017ffe7ff5", + "0x400080027ffe7ff6", + "0x482480017ffd8000", + "0x906", + "0x48127ffd7fff8000", + "0x482480017ffc8000", + "0x3", + "0x482480017fed8000", + "0x1", + "0x48127ffc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017ff18000", + "0x1", + "0x482480017fd68000", + "0x712", + "0x10780017fff7fff", + "0x10", + "0x1104800180018000", + "0x6bc", + "0x48127ff17fff8000", + "0x48127fd67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0x6b3", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0xffffffffffffffffffffffffffffef7a", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x7d", + "0x4825800180007ffa", + "0x1086", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x48127ffe7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x11c4", + "0x20680017fff7ff7", + "0x69", + "0x20680017fff7ffa", + "0x5d", + "0x48307ff880007ff9", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0x685", + "0x48127fec7fff8000", + "0x48127fec7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x1f1c", + "0x482480017fff8000", + "0x1f1b", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ff0", + "0xf1e", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007fed7fff", + "0x10780017fff7fff", + "0x3b", + "0x4824800180007ff0", + "0xf1e", + "0x400080007fee7fff", + "0x40780017fff7fff", + "0x1", + "0x20680017fff7ff3", + "0xf", + "0x480680017fff8000", + "0x0", + "0x400080007ffe7fff", + "0x400080017ffe7ff6", + "0x482480017fec8000", + "0x1", + "0x482480017ffc8000", + "0x10ae", + "0x48127ffc7fff8000", + "0x482480017ffb8000", + "0x2", + "0x10780017fff7fff", + "0x17", + "0x480680017fff8000", + "0x1", + "0x400080007ffe7fff", + "0x482480017fec8000", + "0x1", + "0x48127ffc7fff8000", + "0x48127ff17fff8000", + "0x48127ff17fff8000", + "0x48127ff17fff8000", + "0x48127ff17fff8000", + "0x48127ff87fff8000", + "0x482480017ff78000", + "0x1", + "0x1104800180018000", + "0xac8", + "0x20680017fff7ffd", + "0xe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017fed8000", + "0x1", + "0x48127fed7fff8000", + "0x10780017fff7fff", + "0x18", + "0x1104800180018000", + "0x634", + "0x48127fed7fff8000", + "0x48127fed7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0x623", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x49", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x8b7", + "0x20680017fff7ffd", + "0x34", + "0x48307ffb80007ffc", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0x5f8", + "0x48127ff17fff8000", + "0x48127fdc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x1e8f", + "0x482480017fff8000", + "0x1e8e", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007fe0", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff27fff", + "0x10780017fff7fff", + "0x11", + "0x4824800180007fe0", + "0x0", + "0x400080007ff37fff", + "0x40780017fff7fff", + "0x1", + "0x482480017ff28000", + "0x1", + "0x482480017ffd8000", + "0x109a", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017ff28000", + "0x1", + "0x482480017fdd8000", + "0xb86", + "0x10780017fff7fff", + "0x10", + "0x1104800180018000", + "0x5d0", + "0x48127ff27fff8000", + "0x48127fdd7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0x5c7", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x9b", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x85", + "0x480280007ffc8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000000000000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280017ff97fff", + "0x482480017ffe8000", + "0xefffffffffffffdeffffffffffffffff", + "0x480280027ff97fff", + "0x400280037ff97ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x6e", + "0x402780017fff7fff", + "0x1", + "0x400280017ff97ffe", + "0x482480017ffe8000", + "0xffffffffffffffff0000000000000000", + "0x400280027ff97fff", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x5a", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280037ff97fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000ffffffff", + "0x480280047ff97fff", + "0x400280057ff97ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x43", + "0x402780017fff7fff", + "0x1", + "0x400280037ff97ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffff00000000", + "0x400280047ff97fff", + "0x482480017ffa8000", + "0x1", + "0x48127ffa7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xd", + "0x1104800180018000", + "0x566", + "0x482680017ff98000", + "0x5", + "0x48127fe97fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x1dfc", + "0x482480017fff8000", + "0x1dfb", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007fed", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400280057ff97fff", + "0x10780017fff7fff", + "0x16", + "0x4824800180007fed", + "0x0", + "0x400280057ff97fff", + "0x48127fee7fff8000", + "0x48127ff37fff8000", + "0x40780017fff7fff", + "0x1", + "0x400080007fff7ffd", + "0x400080017fff7ffe", + "0x482680017ff98000", + "0x6", + "0x482480017ffb8000", + "0x1504", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x482480017ffa8000", + "0x2", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x6", + "0x482480017fea8000", + "0x1180", + "0x10780017fff7fff", + "0x26", + "0x482680017ff98000", + "0x6", + "0x482480017fef8000", + "0x14a0", + "0x10780017fff7fff", + "0x12", + "0x482680017ff98000", + "0x3", + "0x482480017ff78000", + "0x195a", + "0x10780017fff7fff", + "0xc", + "0x482680017ff98000", + "0x4", + "0x482480017ff58000", + "0x18b0", + "0x10780017fff7fff", + "0x6", + "0x482680017ff98000", + "0x1", + "0x482480017ffd8000", + "0x1dce", + "0x1104800180018000", + "0x522", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0x519", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x4d", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x10e8", + "0x20680017fff7ffc", + "0x38", + "0x48307ffa80007ffb", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0x4ee", + "0x48127ff07fff8000", + "0x48127fd47fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x1d85", + "0x482480017fff8000", + "0x1d84", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007fd8", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff17fff", + "0x10780017fff7fff", + "0x15", + "0x4824800180007fd8", + "0x0", + "0x400080007ff27fff", + "0x40780017fff7fff", + "0x1", + "0x400080007fff7ff5", + "0x400080017fff7ff6", + "0x400080027fff7ff7", + "0x482480017ff18000", + "0x1", + "0x482480017ffd8000", + "0xa0a", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x482480017ffa8000", + "0x3", + "0x208b7fff7fff7ffe", + "0x482480017ff18000", + "0x1", + "0x482480017fd58000", + "0x622", + "0x10780017fff7fff", + "0x10", + "0x1104800180018000", + "0x4c2", + "0x48127ff17fff8000", + "0x48127fd57fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0x4b9", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x38", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xd", + "0x1104800180018000", + "0x496", + "0x482680017ff98000", + "0x1", + "0x48127ff57fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x1d2c", + "0x482480017fff8000", + "0x1d2b", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ff9", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400280017ff97fff", + "0x10780017fff7fff", + "0x11", + "0x4824800180007ff9", + "0x0", + "0x400280017ff97fff", + "0x40780017fff7fff", + "0x1", + "0x482680017ff98000", + "0x2", + "0x482480017ffd8000", + "0x1eb4", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x2", + "0x482480017ff68000", + "0x19a0", + "0x10780017fff7fff", + "0x6", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0x46e", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0xfffffffffffffffffffffffffffff88a", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x4e", + "0x4825800180007ffa", + "0x776", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x10db", + "0x20680017fff7ffa", + "0x39", + "0x48307ff880007ff9", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0x443", + "0x48127fee7fff8000", + "0x48127fbc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x1cda", + "0x482480017fff8000", + "0x1cd9", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007fc0", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007fef7fff", + "0x10780017fff7fff", + "0x17", + "0x4824800180007fc0", + "0x0", + "0x400080007ff07fff", + "0x40780017fff7fff", + "0x1", + "0x400080007fff7ff3", + "0x400080017fff7ff4", + "0x400080027fff7ff5", + "0x400080037fff7ff6", + "0x400080047fff7ff7", + "0x482480017fef8000", + "0x1", + "0x482480017ffd8000", + "0x320", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x482480017ffa8000", + "0x5", + "0x208b7fff7fff7ffe", + "0x482480017fef8000", + "0x1", + "0x48127fbd7fff8000", + "0x10780017fff7fff", + "0x10", + "0x1104800180018000", + "0x416", + "0x48127fef7fff8000", + "0x48127fbd7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0x40d", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0xfffffffffffffffffffffffffffffea2", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x68", + "0x4825800180007ffa", + "0x15e", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x48127ffe7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x10f9", + "0x20680017fff7ff9", + "0x54", + "0x20680017fff7ffc", + "0x48", + "0x48307ffa80007ffb", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0x3df", + "0x48127fee7fff8000", + "0x48127fee7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x1c76", + "0x482480017fff8000", + "0x1c75", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ff2", + "0x6ea", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007fef7fff", + "0x10780017fff7fff", + "0x26", + "0x4824800180007ff2", + "0x6ea", + "0x400080007ff07fff", + "0x40780017fff7fff", + "0x1", + "0x400080007fff7ff5", + "0x48307ff680007ff7", + "0x400080017ffe7fff", + "0x482480017fee8000", + "0x1", + "0x48127ffc7fff8000", + "0x48127ff37fff8000", + "0x48127ff37fff8000", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x2", + "0x1104800180018000", + "0x5a0", + "0x20680017fff7ffd", + "0xa", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017fef8000", + "0x1", + "0x48127fef7fff8000", + "0x10780017fff7fff", + "0x18", + "0x1104800180018000", + "0x3a3", + "0x48127fef7fff8000", + "0x48127fef7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0x392", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0xfffffffffffffffffffffffffffff88a", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x4e", + "0x4825800180007ffa", + "0x776", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x110a", + "0x20680017fff7ffa", + "0x39", + "0x48307ff880007ff9", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0x367", + "0x48127fee7fff8000", + "0x48127fbc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x1bfe", + "0x482480017fff8000", + "0x1bfd", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007fc0", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007fef7fff", + "0x10780017fff7fff", + "0x17", + "0x4824800180007fc0", + "0x0", + "0x400080007ff07fff", + "0x40780017fff7fff", + "0x1", + "0x400080007fff7ff3", + "0x400080017fff7ff4", + "0x400080027fff7ff5", + "0x400080037fff7ff6", + "0x400080047fff7ff7", + "0x482480017fef8000", + "0x1", + "0x482480017ffd8000", + "0x320", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x482480017ffa8000", + "0x5", + "0x208b7fff7fff7ffe", + "0x482480017fef8000", + "0x1", + "0x48127fbd7fff8000", + "0x10780017fff7fff", + "0x10", + "0x1104800180018000", + "0x33a", + "0x48127fef7fff8000", + "0x48127fbd7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0x331", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x5e", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x1129", + "0x20680017fff7ffc", + "0x49", + "0x48307ffa80007ffb", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0x306", + "0x48127ff07fff8000", + "0x48127fd67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x1b9d", + "0x482480017fff8000", + "0x1b9c", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007fda", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff17fff", + "0x10780017fff7fff", + "0x26", + "0x4824800180007fda", + "0x0", + "0x400080007ff27fff", + "0x40780017fff7fff", + "0x1", + "0x400080007fff7ff5", + "0x20680017fff7ff6", + "0xd", + "0x480680017fff8000", + "0x0", + "0x400080017ffe7fff", + "0x400080027ffe7ff6", + "0x482480017ffd8000", + "0x906", + "0x48127ffd7fff8000", + "0x482480017ffc8000", + "0x3", + "0x10780017fff7fff", + "0xa", + "0x480680017fff8000", + "0x1", + "0x400080017ffe7fff", + "0x482480017ffd8000", + "0x9ce", + "0x48127ffd7fff8000", + "0x482480017ffc8000", + "0x2", + "0x482480017fed8000", + "0x1", + "0x48127ffc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017ff18000", + "0x1", + "0x482480017fd78000", + "0x776", + "0x10780017fff7fff", + "0x10", + "0x1104800180018000", + "0x2c9", + "0x48127ff17fff8000", + "0x48127fd77fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0x2c0", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x8f", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x79", + "0x480280007ffc8000", + "0xa0680017fff8000", + "0x16", + "0x480280017ff98003", + "0x480280027ff98003", + "0x4844800180017ffe", + "0x100000000000000000000000000000000", + "0x483080017ffd7ffb", + "0x482480017fff7ffd", + "0x800000000000010fffffffffffffffff7ffffffffffffef0000000000000001", + "0x20680017fff7ffc", + "0x6", + "0x402480017fff7ffd", + "0xffffffffffffffffffffffffffffffff", + "0x10780017fff7fff", + "0x4", + "0x402480017ffe7ffd", + "0xf7ffffffffffffef0000000000000000", + "0x400280037ff97ffd", + "0x20680017fff7ffe", + "0x5e", + "0x402780017fff7fff", + "0x1", + "0x400280017ff97ffe", + "0x482680017ff98000", + "0x2", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x1136", + "0x20680017fff7ffd", + "0x4d", + "0x48307ffb80007ffc", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0x277", + "0x48127ff17fff8000", + "0x48127fd97fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x1b0e", + "0x482480017fff8000", + "0x1b0d", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007fdd", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff27fff", + "0x10780017fff7fff", + "0x2a", + "0x4824800180007fdd", + "0x0", + "0x400080007ff37fff", + "0x48127fde7fff8000", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x40780017fff7fff", + "0x1", + "0x400080007fff7ffc", + "0x20680017fff7ffd", + "0xd", + "0x480680017fff8000", + "0x0", + "0x400080017ffe7fff", + "0x400080027ffe7ffd", + "0x482480017ffa8000", + "0x9b0", + "0x48127ffd7fff8000", + "0x482480017ffc8000", + "0x3", + "0x10780017fff7fff", + "0xb", + "0x480680017fff8000", + "0x1", + "0x400080017ffe7fff", + "0x400080027ffe7ffd", + "0x482480017ffa8000", + "0xa14", + "0x48127ffd7fff8000", + "0x482480017ffc8000", + "0x3", + "0x482480017feb8000", + "0x1", + "0x48127ffc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017ff28000", + "0x1", + "0x482480017fda8000", + "0x94c", + "0x10780017fff7fff", + "0x1f", + "0x48127ffa7fff8000", + "0x482480017fe28000", + "0xe42", + "0x10780017fff7fff", + "0xc", + "0x482680017ff98000", + "0x4", + "0x482480017ff68000", + "0x184c", + "0x10780017fff7fff", + "0x6", + "0x482680017ff98000", + "0x1", + "0x482480017ffd8000", + "0x1dce", + "0x1104800180018000", + "0x227", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0x21e", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x5", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0xffffffffffffffffffffffffffffe804", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x6d", + "0x4825800180007ffa", + "0x17fc", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x48127ffe7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x114a", + "0x20680017fff7ff7", + "0x59", + "0x20680017fff7ffa", + "0x4d", + "0x40137ffb7fff8000", + "0x40137ffc7fff8001", + "0x40137ffd7fff8002", + "0x40137ffe7fff8003", + "0x40137fff7fff8004", + "0x48307ff880007ff9", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0x1e9", + "0x48127fec7fff8000", + "0x48127fec7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x1a80", + "0x482480017fff8000", + "0x1a7f", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ff0", + "0xcc6", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007fed7fff", + "0x10780017fff7fff", + "0x26", + "0x4824800180007ff0", + "0xcc6", + "0x400080007fee7fff", + "0x40780017fff7fff", + "0x1", + "0x482480017fed8000", + "0x1", + "0x48127ffd7fff8000", + "0x480a80007fff8000", + "0x480a80017fff8000", + "0x480a80027fff8000", + "0x480a80037fff8000", + "0x48127ff97fff8000", + "0x48127ff87fff8000", + "0x1104800180018000", + "0x63f", + "0x20680017fff7ffd", + "0xc", + "0x400180007fff8004", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x482480017ffa8000", + "0x1", + "0x208b7fff7fff7ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017fed8000", + "0x1", + "0x48127fed7fff8000", + "0x10780017fff7fff", + "0x18", + "0x1104800180018000", + "0x1ad", + "0x48127fed7fff8000", + "0x48127fed7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e00", + "0x1104800180018000", + "0x19c", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x96", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x80", + "0x480280007ffc8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000000000000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280017ff97fff", + "0x482480017ffe8000", + "0xefffffffffffffdeffffffffffffffff", + "0x480280027ff97fff", + "0x400280037ff97ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x69", + "0x402780017fff7fff", + "0x1", + "0x400280017ff97ffe", + "0x482480017ffe8000", + "0xffffffffffffffff0000000000000000", + "0x400280027ff97fff", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x55", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280037ff97fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000ffffffff", + "0x480280047ff97fff", + "0x400280057ff97ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x3e", + "0x402780017fff7fff", + "0x1", + "0x400280037ff97ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffff00000000", + "0x400280047ff97fff", + "0x482480017ffa8000", + "0x1", + "0x48127ffa7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xd", + "0x1104800180018000", + "0x13b", + "0x482680017ff98000", + "0x5", + "0x48127fe97fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x19d1", + "0x482480017fff8000", + "0x19d0", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007fed", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400280057ff97fff", + "0x10780017fff7fff", + "0x11", + "0x4824800180007fed", + "0x0", + "0x400280057ff97fff", + "0x40780017fff7fff", + "0x1", + "0x482680017ff98000", + "0x6", + "0x482480017ffd8000", + "0x1694", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x6", + "0x482480017fea8000", + "0x1180", + "0x10780017fff7fff", + "0x26", + "0x482680017ff98000", + "0x6", + "0x482480017fef8000", + "0x14a0", + "0x10780017fff7fff", + "0x12", + "0x482680017ff98000", + "0x3", + "0x482480017ff78000", + "0x195a", + "0x10780017fff7fff", + "0xc", + "0x482680017ff98000", + "0x4", + "0x482480017ff58000", + "0x18b0", + "0x10780017fff7fff", + "0x6", + "0x482680017ff98000", + "0x1", + "0x482480017ffd8000", + "0x1dce", + "0x1104800180018000", + "0xfc", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0xf3", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0xfffffffffffffffffffffffffffff93e", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x66", + "0x4825800180007ffa", + "0x6c2", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x48127ffe7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x109f", + "0x20680017fff7ff8", + "0x52", + "0x20680017fff7ffb", + "0x46", + "0x48307ff980007ffa", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0xc5", + "0x48127fed7fff8000", + "0x48127fed7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x195c", + "0x482480017fff8000", + "0x195b", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ff1", + "0xc62", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007fee7fff", + "0x10780017fff7fff", + "0x24", + "0x4824800180007ff1", + "0xc62", + "0x400080007fef7fff", + "0x40780017fff7fff", + "0x1", + "0x482480017fee8000", + "0x1", + "0x48127ffd7fff8000", + "0x48127ff27fff8000", + "0x48127ff27fff8000", + "0x48127ff27fff8000", + "0x48127ff27fff8000", + "0x48127ff97fff8000", + "0x48127ff87fff8000", + "0x1104800180018000", + "0x51b", + "0x20680017fff7ffd", + "0xa", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017fee8000", + "0x1", + "0x48127fee7fff8000", + "0x10780017fff7fff", + "0x18", + "0x1104800180018000", + "0x8b", + "0x48127fee7fff8000", + "0x48127fee7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0x7a", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0xfffffffffffffffffffffffffffff93e", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x53", + "0x4825800180007ffa", + "0x6c2", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x48127ffe7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x1026", + "0x20680017fff7ff8", + "0x3f", + "0x20680017fff7ffb", + "0x33", + "0x48307ff980007ffa", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc", + "0x1104800180018000", + "0x4c", + "0x48127fed7fff8000", + "0x48127fed7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x18e3", + "0x482480017fff8000", + "0x18e2", + "0x480080007fff8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ff1", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007fee7fff", + "0x10780017fff7fff", + "0x11", + "0x4824800180007ff1", + "0x0", + "0x400080007fef7fff", + "0x40780017fff7fff", + "0x1", + "0x482480017fee8000", + "0x1", + "0x482480017ffd8000", + "0x514", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482480017fee8000", + "0x1", + "0x48127fee7fff8000", + "0x10780017fff7fff", + "0x18", + "0x1104800180018000", + "0x25", + "0x48127fee7fff8000", + "0x48127fee7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x1e96", + "0x1104800180018000", + "0x14", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", + "0x1104800180018000", + "0x12d0", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x4661696c656420746f20646573657269616c697a6520706172616d202331", + "0x1104800180018000", + "0x12cb", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x4f7574206f6620676173", + "0x1104800180018000", + "0x12c6", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x7a", + "0x480280007ffc8000", + "0x20680017fff7fff", + "0x51", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x35", + "0x40780017fff7fff", + "0x1", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x482480017ffa8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x48127ffa7fff8000", + "0x480080007ff68000", + "0x1104800180018000", + "0x12b0", + "0x20680017fff7ffa", + "0x18", + "0x20680017fff7ffd", + "0x10", + "0x48127ff87fff8000", + "0x482480017ff88000", + "0x1f4", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x10780017fff7fff", + "0x16", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x208b7fff7fff7ffe", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0xd2a", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x4824800180007fff", + "0x1", + "0x20680017fff7fff", + "0x13", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0xfe6", + "0x480680017fff8000", + "0x0", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0xfe6", + "0x480680017fff8000", + "0x0", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0x1112", + "0x480680017fff8000", + "0x0", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ff98000", + "0xfffffffffffffffffffffffffffff9de", + "0x400280007ff87fff", + "0x10780017fff7fff", + "0x21", + "0x4825800180007ff9", + "0x622", + "0x400280007ff87fff", + "0x48297ffa80007ffb", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x10", + "0x480280007ffa8000", + "0x400280007ffd7fff", + "0x482680017ff88000", + "0x1", + "0x48127ffc7fff8000", + "0x482680017ffa8000", + "0x1", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x482680017ffd8000", + "0x1", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe7", + "0x208b7fff7fff7ffe", + "0x482680017ff88000", + "0x1", + "0x482480017ffd8000", + "0x8de", + "0x480680017fff8000", + "0x0", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff49", + "0x482680017ff88000", + "0x1", + "0x480a7ff97fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x8d", + "0x480280007ffc8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000ffffffff", + "0x480280017ffb7fff", + "0x400280027ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x73", + "0x402780017fff7fff", + "0x1", + "0x400280007ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffff00000000", + "0x400280017ffb7fff", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x5d", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280027ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000ffffffff", + "0x480280037ffb7fff", + "0x400280047ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x43", + "0x402780017fff7fff", + "0x1", + "0x400280027ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffff00000000", + "0x400280037ffb7fff", + "0x482480017ffa8000", + "0x1", + "0x48127ffa7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x2d", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280047ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000ffffffff", + "0x480280057ffb7fff", + "0x400280067ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x15", + "0x402780017fff7fff", + "0x1", + "0x400280047ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffff00000000", + "0x400280057ffb7fff", + "0x40780017fff7fff", + "0x5", + "0x482680017ffb8000", + "0x6", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x0", + "0x48127fe87fff8000", + "0x48127fed7fff8000", + "0x48127ff27fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffb8000", + "0x7", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x29", + "0x40780017fff7fff", + "0x8", + "0x482680017ffb8000", + "0x4", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x21", + "0x40780017fff7fff", + "0x6", + "0x482680017ffb8000", + "0x5", + "0x482480017fee8000", + "0x1", + "0x48127fee7fff8000", + "0x10780017fff7fff", + "0x18", + "0x40780017fff7fff", + "0xe", + "0x482680017ffb8000", + "0x2", + "0x48127fee7fff8000", + "0x48127fee7fff8000", + "0x10780017fff7fff", + "0x10", + "0x40780017fff7fff", + "0xc", + "0x482680017ffb8000", + "0x3", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x10780017fff7fff", + "0x7", + "0x40780017fff7fff", + "0x14", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x6a", + "0x480280007ffc8000", + "0x20680017fff7fff", + "0x3d", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x11d2", + "0x20680017fff7ff9", + "0x23", + "0x20680017fff7ffc", + "0x10", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x208b7fff7fff7ffe", + "0x4824800180007fff", + "0x1", + "0x20680017fff7fff", + "0x15", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0x1a36", + "0x480680017fff8000", + "0x0", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0x1a36", + "0x480680017fff8000", + "0x0", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0x1b62", + "0x480680017fff8000", + "0x0", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ff98000", + "0xfffffffffffffffffffffffffffff9de", + "0x400280007ff87fff", + "0x10780017fff7fff", + "0x21", + "0x4825800180007ff9", + "0x622", + "0x400280007ff87fff", + "0x48297ffa80007ffb", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x10", + "0x480280007ffa8000", + "0x400280007ffd7fff", + "0x482680017ff88000", + "0x1", + "0x48127ffc7fff8000", + "0x482680017ffa8000", + "0x1", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x482680017ffd8000", + "0x1", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe7", + "0x208b7fff7fff7ffe", + "0x482680017ff88000", + "0x1", + "0x482480017ffd8000", + "0x8de", + "0x480680017fff8000", + "0x0", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdfc", + "0x482680017ff88000", + "0x1", + "0x480a7ff97fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x8c", + "0x480280007ffc8000", + "0x20680017fff7fff", + "0x69", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x5a", + "0x480080007ffd8000", + "0x20680017fff7fff", + "0x3e", + "0x482480017ffc8000", + "0x1", + "0x48127ffc7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x2f", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde000000000000ffff", + "0x480280017ffb7fff", + "0x400280027ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x17", + "0x402780017fff7fff", + "0x1", + "0x400280007ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffff0000", + "0x400280017ffb7fff", + "0x40780017fff7fff", + "0x5", + "0x482680017ffb8000", + "0x2", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff27fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffb8000", + "0x3", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x27", + "0x40780017fff7fff", + "0x8", + "0x480a7ffb7fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x20", + "0x40780017fff7fff", + "0xa", + "0x4824800180007ff5", + "0x1", + "0x20680017fff7fff", + "0xf", + "0x480a7ffb7fff8000", + "0x482480017ff08000", + "0x1", + "0x48127ff07fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480a7ffb7fff8000", + "0x482480017ff08000", + "0x1", + "0x48127ff07fff8000", + "0x10780017fff7fff", + "0x2e", + "0x40780017fff7fff", + "0xc", + "0x480a7ffb7fff8000", + "0x48127ff07fff8000", + "0x48127ff07fff8000", + "0x10780017fff7fff", + "0x27", + "0x40780017fff7fff", + "0xe", + "0x4824800180007ff1", + "0x1", + "0x20680017fff7fff", + "0xf", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x10", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x8c", + "0x480280007ffc8000", + "0x20680017fff7fff", + "0x3e", + "0x40780017fff7fff", + "0x1", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x2d", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000000000ff", + "0x480280017ffb7fff", + "0x400280027ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x15", + "0x402780017fff7fff", + "0x1", + "0x400280007ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffffff00", + "0x400280017ffb7fff", + "0x40780017fff7fff", + "0x5", + "0x482680017ffb8000", + "0x2", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff37fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffb8000", + "0x3", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x59", + "0x40780017fff7fff", + "0x8", + "0x480a7ffb7fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x52", + "0x4824800180007fff", + "0x1", + "0x20680017fff7fff", + "0x3c", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x2d", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde000000000000ffff", + "0x480280017ffb7fff", + "0x400280027ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x15", + "0x402780017fff7fff", + "0x1", + "0x400280007ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffff0000", + "0x400280017ffb7fff", + "0x40780017fff7fff", + "0x5", + "0x482680017ffb8000", + "0x2", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1", + "0x48127ff37fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffb8000", + "0x3", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x1b", + "0x40780017fff7fff", + "0x8", + "0x480a7ffb7fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x14", + "0x40780017fff7fff", + "0xb", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0xd", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x90", + "0x480280007ffc8000", + "0x20680017fff7fff", + "0x6d", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x5e", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000000000000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffdeffffffffffffffff", + "0x480280017ffb7fff", + "0x400280027ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x44", + "0x402780017fff7fff", + "0x1", + "0x400280007ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffff0000000000000000", + "0x400280017ffb7fff", + "0x482480017ffa8000", + "0x1", + "0x48127ffa7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x2e", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280027ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000ffffffff", + "0x480280037ffb7fff", + "0x400280047ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x16", + "0x402780017fff7fff", + "0x1", + "0x400280027ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffff00000000", + "0x400280037ffb7fff", + "0x40780017fff7fff", + "0x5", + "0x482680017ffb8000", + "0x4", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127fed7fff8000", + "0x48127ff27fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffb8000", + "0x5", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x3f", + "0x40780017fff7fff", + "0x8", + "0x482680017ffb8000", + "0x2", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x37", + "0x40780017fff7fff", + "0x6", + "0x482680017ffb8000", + "0x3", + "0x482480017fee8000", + "0x1", + "0x48127fee7fff8000", + "0x10780017fff7fff", + "0x2e", + "0x40780017fff7fff", + "0xe", + "0x480a7ffb7fff8000", + "0x48127fee7fff8000", + "0x48127fee7fff8000", + "0x10780017fff7fff", + "0x27", + "0x40780017fff7fff", + "0x10", + "0x4824800180007fef", + "0x1", + "0x20680017fff7fff", + "0xf", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x12", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x73", + "0x480280007ffc8000", + "0x20680017fff7fff", + "0x42", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0xbd0", + "0x20680017fff7ff8", + "0x26", + "0x20680017fff7ffb", + "0x11", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x208b7fff7fff7ffe", + "0x4824800180007fff", + "0x1", + "0x20680017fff7fff", + "0x17", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0x1f9a", + "0x480680017fff8000", + "0x0", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0x1f9a", + "0x480680017fff8000", + "0x0", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0x20c6", + "0x480680017fff8000", + "0x0", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x10b7ff87fff7fff", + "0x10780017fff7fff", + "0xad", + "0x10780017fff7fff", + "0x90", + "0x10780017fff7fff", + "0x74", + "0x10780017fff7fff", + "0x66", + "0x10780017fff7fff", + "0x53", + "0x10780017fff7fff", + "0x45", + "0x10780017fff7fff", + "0x1b", + "0x10780017fff7fff", + "0xd", + "0x480680017fff8000", + "0x0", + "0x400280007ffd7fff", + "0x400380017ffd7ffb", + "0x482680017ff78000", + "0x816", + "0x480a7ffc7fff8000", + "0x482680017ffd8000", + "0x2", + "0x10780017fff7fff", + "0x9c", + "0x480680017fff8000", + "0x1", + "0x400280007ffd7fff", + "0x400380017ffd7ffa", + "0x400380027ffd7ffb", + "0x482680017ff78000", + "0x74e", + "0x480a7ffc7fff8000", + "0x482680017ffd8000", + "0x3", + "0x10780017fff7fff", + "0x90", + "0x480680017fff8000", + "0x2", + "0x400280007ffd7fff", + "0x10b7ff97fff7fff", + "0x10780017fff7fff", + "0x1a", + "0x10780017fff7fff", + "0xe", + "0x480680017fff8000", + "0x0", + "0x400280017ffd7fff", + "0x400380027ffd7ffa", + "0x400380037ffd7ffb", + "0x482680017ff78000", + "0x5be", + "0x480a7ffc7fff8000", + "0x482680017ffd8000", + "0x4", + "0x10780017fff7fff", + "0x14", + "0x480680017fff8000", + "0x1", + "0x400280017ffd7fff", + "0x482680017ff78000", + "0x622", + "0x480a7ffc7fff8000", + "0x482680017ffd8000", + "0x2", + "0x10780017fff7fff", + "0xa", + "0x480680017fff8000", + "0x2", + "0x400280017ffd7fff", + "0x482680017ff78000", + "0x686", + "0x480a7ffc7fff8000", + "0x482680017ffd8000", + "0x2", + "0x10780017fff7fff", + "0x68", + "0x480680017fff8000", + "0x3", + "0x400280007ffd7fff", + "0x400380017ffd7ffa", + "0x400380027ffd7ffb", + "0x482680017ff78000", + "0x74e", + "0x480a7ffc7fff8000", + "0x482680017ffd8000", + "0x3", + "0x10780017fff7fff", + "0x5c", + "0x48297ffa80007ffb", + "0x480680017fff8000", + "0x4", + "0x400280007ffd7fff", + "0x4844800180007ffe", + "0x2", + "0x400280017ffd7fff", + "0x480a7ff67fff8000", + "0x480a7ff77fff8000", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x482680017ffd8000", + "0x2", + "0x1104800180018000", + "0xeee", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x5", + "0x400280007ffd7fff", + "0x400380017ffd7ffa", + "0x400380027ffd7ffb", + "0x482680017ff78000", + "0x74e", + "0x480a7ffc7fff8000", + "0x482680017ffd8000", + "0x3", + "0x10780017fff7fff", + "0x3f", + "0x480680017fff8000", + "0x6", + "0x400280007ffd7fff", + "0x20780017fff7ffa", + "0xd", + "0x480680017fff8000", + "0x0", + "0x400280017ffd7fff", + "0x400380027ffd7ffb", + "0x482680017ff78000", + "0x622", + "0x480a7ffc7fff8000", + "0x482680017ffd8000", + "0x3", + "0x10780017fff7fff", + "0xa", + "0x480680017fff8000", + "0x1", + "0x400280017ffd7fff", + "0x482680017ff78000", + "0x6ea", + "0x480a7ffc7fff8000", + "0x482680017ffd8000", + "0x2", + "0x10780017fff7fff", + "0x25", + "0x480680017fff8000", + "0x7", + "0x400280007ffd7fff", + "0x20780017fff7ffa", + "0xd", + "0x480680017fff8000", + "0x0", + "0x400280017ffd7fff", + "0x400380027ffd7ffb", + "0x482680017ff78000", + "0x622", + "0x480a7ffc7fff8000", + "0x482680017ffd8000", + "0x3", + "0x10780017fff7fff", + "0xb", + "0x480680017fff8000", + "0x1", + "0x400280017ffd7fff", + "0x400380027ffd7ffb", + "0x482680017ff78000", + "0x686", + "0x480a7ffc7fff8000", + "0x482680017ffd8000", + "0x3", + "0x10780017fff7fff", + "0xa", + "0x480680017fff8000", + "0x8", + "0x400280007ffd7fff", + "0x482680017ff78000", + "0x87a", + "0x480a7ffc7fff8000", + "0x482680017ffd8000", + "0x1", + "0x480a7ff67fff8000", + "0x48127ffc7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ff88000", + "0xfffffffffffffffffffffffffffff182", + "0x400280007ff77fff", + "0x10780017fff7fff", + "0x90", + "0x4825800180007ff8", + "0xe7e", + "0x400280007ff77fff", + "0x20780017fff7ffd", + "0xf", + "0x482680017ff78000", + "0x1", + "0x482480017ffe8000", + "0x1202", + "0x480680017fff8000", + "0x0", + "0x480a7ff97fff8000", + "0x480a7ffa7fff8000", + "0x480680017fff8000", + "0x0", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x208b7fff7fff7ffe", + "0x48297ff980007ffa", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x66", + "0x480280007ff98000", + "0x20680017fff7fff", + "0x3d", + "0x482680017ff98000", + "0x1", + "0x480a7ffa7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x2d", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280017ff77fff", + "0x482480017ffe8000", + "0xefffffffffffffde000000000000ffff", + "0x480280027ff77fff", + "0x400280037ff77ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x13", + "0x402780017fff7fff", + "0x1", + "0x400280017ff77ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffff0000", + "0x400280027ff77fff", + "0x482680017ff78000", + "0x3", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x482480017ff68000", + "0x1", + "0x48127ff67fff8000", + "0x10780017fff7fff", + "0x22", + "0x482680017ff78000", + "0x4", + "0x482480017ff18000", + "0x7d0", + "0x482480017ff38000", + "0x1", + "0x48127ff37fff8000", + "0x10780017fff7fff", + "0x36", + "0x482680017ff78000", + "0x1", + "0x482480017ff98000", + "0xc8a", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x10780017fff7fff", + "0x2e", + "0x4824800180007fff", + "0x1", + "0x20680017fff7fff", + "0x1b", + "0x482680017ff78000", + "0x1", + "0x482480017ffb8000", + "0x3ac", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x482680017ff98000", + "0x1", + "0x480a7ffa7fff8000", + "0x400280007ffc7ffc", + "0x400280017ffc7ffd", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x2", + "0x4825800180007ffd", + "0x1", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff8b", + "0x208b7fff7fff7ffe", + "0x482680017ff78000", + "0x1", + "0x482480017ffb8000", + "0xdb6", + "0x482680017ff98000", + "0x1", + "0x480a7ffa7fff8000", + "0x10780017fff7fff", + "0x8", + "0x482680017ff78000", + "0x1", + "0x482480017ffd8000", + "0xf46", + "0x480a7ff97fff8000", + "0x480a7ffa7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa3d", + "0x482680017ff78000", + "0x1", + "0x480a7ff87fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ff98000", + "0xfffffffffffffffffffffffffffff6be", + "0x400280007ff87fff", + "0x10780017fff7fff", + "0x34", + "0x4825800180007ff9", + "0x942", + "0x400280007ff87fff", + "0x48297ffa80007ffb", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x23", + "0x480280007ffa8000", + "0x480280017ffa8000", + "0x20680017fff7ffe", + "0xc", + "0x480680017fff8000", + "0x0", + "0x400280007ffd7fff", + "0x400280017ffd7ffe", + "0x48127ffb7fff8000", + "0x480a7ffc7fff8000", + "0x482680017ffd8000", + "0x2", + "0x10780017fff7fff", + "0xa", + "0x480680017fff8000", + "0x1", + "0x400280007ffd7fff", + "0x482480017ffb8000", + "0xc8", + "0x480a7ffc7fff8000", + "0x482680017ffd8000", + "0x1", + "0x482680017ff88000", + "0x1", + "0x48127ffc7fff8000", + "0x482680017ffa8000", + "0x2", + "0x480a7ffb7fff8000", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd4", + "0x208b7fff7fff7ffe", + "0x482680017ff88000", + "0x1", + "0x482480017ffd8000", + "0xbfe", + "0x480680017fff8000", + "0x0", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff9f4", + "0x482680017ff88000", + "0x1", + "0x480a7ff97fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ff88000", + "0xffffffffffffffffffffffffffffd8b4", + "0x400280007ff77fff", + "0x10780017fff7fff", + "0x4a", + "0x4825800180007ff8", + "0x274c", + "0x400280007ff77fff", + "0x20780017fff7ffd", + "0xf", + "0x482680017ff78000", + "0x1", + "0x482480017ffe8000", + "0x2ad0", + "0x480680017fff8000", + "0x0", + "0x480a7ff97fff8000", + "0x480a7ffa7fff8000", + "0x480680017fff8000", + "0x0", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff78000", + "0x1", + "0x48127ffe7fff8000", + "0x480a7ff97fff8000", + "0x480a7ffa7fff8000", + "0x1104800180018000", + "0x990", + "0x20680017fff7ff8", + "0x22", + "0x20680017fff7ffb", + "0x12", + "0x400280007ffc7ffc", + "0x400280017ffc7ffd", + "0x400280027ffc7ffe", + "0x400280037ffc7fff", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x4", + "0x4825800180007ffd", + "0x1", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd0", + "0x208b7fff7fff7ffe", + "0x48127ff67fff8000", + "0x482480017ff68000", + "0xa6e", + "0x480680017fff8000", + "0x0", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff99b", + "0x482680017ff78000", + "0x1", + "0x480a7ff87fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x2", + "0xa0680017fff8000", + "0x7", + "0x482680017ff98000", + "0xffffffffffffffffffffffffffffe804", + "0x400280007ff87fff", + "0x10780017fff7fff", + "0x33", + "0x4825800180007ff9", + "0x17fc", + "0x400280007ff87fff", + "0x48297ffa80007ffb", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x22", + "0x482680017ff88000", + "0x1", + "0x48127ffd7fff8000", + "0x480280007ffa8000", + "0x480280017ffa8000", + "0x480280027ffa8000", + "0x480280037ffa8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x402780017ffa8000", + "0x4", + "0x400b7ffb7fff8001", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffde0", + "0x20680017fff7ffd", + "0xb", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480a80007fff8000", + "0x480a80017fff8000", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffda", + "0x208b7fff7fff7ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ff88000", + "0x1", + "0x482480017ffd8000", + "0x1ab8", + "0x480680017fff8000", + "0x0", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff951", + "0x482680017ff88000", + "0x1", + "0x480a7ff97fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xac", + "0x480280007ffc8000", + "0x20680017fff7fff", + "0x45", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x36", + "0x40780017fff7fff", + "0x1", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x482480017ffa8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x48127ffa7fff8000", + "0x480080007ff68000", + "0x1104800180018000", + "0xbfb", + "0x20680017fff7ffa", + "0x19", + "0x20680017fff7ffd", + "0x10", + "0x48127ff87fff8000", + "0x482480017ff88000", + "0x2bc", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff87fff8000", + "0x482480017ff88000", + "0xc8", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x10780017fff7fff", + "0x5c", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x208b7fff7fff7ffe", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0xd8e", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x10780017fff7fff", + "0x46", + "0x4824800180007fff", + "0x1", + "0x20680017fff7fff", + "0x51", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x35", + "0x40780017fff7fff", + "0x1", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x482480017ffa8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x48127ffa7fff8000", + "0x480080007ff68000", + "0x1104800180018000", + "0xce1", + "0x20680017fff7ffa", + "0x18", + "0x20680017fff7ffd", + "0x10", + "0x48127ff87fff8000", + "0x482480017ff88000", + "0x1f4", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x10780017fff7fff", + "0x16", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x208b7fff7fff7ffe", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0xd2a", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0x10ae", + "0x480680017fff8000", + "0x0", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0x11da", + "0x480680017fff8000", + "0x0", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ff98000", + "0xfffffffffffffffffffffffffffff9de", + "0x400280007ff87fff", + "0x10780017fff7fff", + "0x21", + "0x4825800180007ff9", + "0x622", + "0x400280007ff87fff", + "0x48297ffa80007ffb", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x10", + "0x480280007ffa8000", + "0x400280007ffd7fff", + "0x482680017ff88000", + "0x1", + "0x48127ffc7fff8000", + "0x482680017ffa8000", + "0x1", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x482680017ffd8000", + "0x1", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe7", + "0x208b7fff7fff7ffe", + "0x482680017ff88000", + "0x1", + "0x482480017ffd8000", + "0x8de", + "0x480680017fff8000", + "0x0", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff862", + "0x482680017ff88000", + "0x1", + "0x480a7ff97fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xa8", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480280007ffc8000", + "0x20680017fff7fff", + "0x22", + "0x480a7ffb7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff90c", + "0x20680017fff7ffc", + "0xd", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x11", + "0x4824800180007fee", + "0x1", + "0x20680017fff7fff", + "0x6c", + "0x48307feb80007fec", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x60", + "0x480080007fea8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde000000000000ffff", + "0x480280017ffb7fff", + "0x400280027ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x46", + "0x402780017fff7fff", + "0x1", + "0x400280007ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffff0000", + "0x400280017ffb7fff", + "0x482480017fe78000", + "0x1", + "0x48127fe77fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x30", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280027ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde000000000000ffff", + "0x480280037ffb7fff", + "0x400280047ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x18", + "0x402780017fff7fff", + "0x1", + "0x400280027ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffff0000", + "0x400280037ffb7fff", + "0x40780017fff7fff", + "0x5", + "0x482680017ffb8000", + "0x4", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x48127fec7fff8000", + "0x48127ff17fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffb8000", + "0x5", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x2f", + "0x40780017fff7fff", + "0x8", + "0x482680017ffb8000", + "0x2", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x27", + "0x40780017fff7fff", + "0x6", + "0x482680017ffb8000", + "0x3", + "0x482480017fdb8000", + "0x1", + "0x48127fdb7fff8000", + "0x10780017fff7fff", + "0x1e", + "0x40780017fff7fff", + "0xe", + "0x480a7ffb7fff8000", + "0x48127fdb7fff8000", + "0x48127fdb7fff8000", + "0x10780017fff7fff", + "0x17", + "0x40780017fff7fff", + "0xf", + "0x480a7ffb7fff8000", + "0x48127fdb7fff8000", + "0x48127fdb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x24", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x8e", + "0x480280007ffc8000", + "0x20680017fff7fff", + "0x34", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0xace", + "0x20680017fff7ff9", + "0x1a", + "0x20680017fff7ffc", + "0x11", + "0x48127ff77fff8000", + "0x482480017ff78000", + "0x258", + "0x480680017fff8000", + "0x0", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff77fff8000", + "0x482480017ff78000", + "0x64", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x10780017fff7fff", + "0x35", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x208b7fff7fff7ffe", + "0x4824800180007fff", + "0x1", + "0x20680017fff7fff", + "0x42", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0xbc5", + "0x20680017fff7ff9", + "0x28", + "0x20680017fff7ffc", + "0x11", + "0x48127ff77fff8000", + "0x482480017ff78000", + "0x190", + "0x480680017fff8000", + "0x0", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x208b7fff7fff7ffe", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0x1c8e", + "0x480680017fff8000", + "0x0", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0x1dba", + "0x480680017fff8000", + "0x0", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x72", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480280007ffc8000", + "0x20680017fff7fff", + "0x1f", + "0x480a7ffb7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff998", + "0x20680017fff7ffd", + "0xc", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x208b7fff7fff7ffe", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0xf", + "0x4824800180007ff0", + "0x1", + "0x20680017fff7fff", + "0x3b", + "0x48307fed80007fee", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x2f", + "0x480080007fec8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000ffffffff", + "0x480280017ffb7fff", + "0x400280027ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x17", + "0x402780017fff7fff", + "0x1", + "0x400280007ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffff00000000", + "0x400280017ffb7fff", + "0x40780017fff7fff", + "0x5", + "0x482680017ffb8000", + "0x2", + "0x482480017fe38000", + "0x1", + "0x48127fe37fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x48127ff27fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffb8000", + "0x3", + "0x482480017fe38000", + "0x1", + "0x48127fe37fff8000", + "0x10780017fff7fff", + "0x1c", + "0x40780017fff7fff", + "0x8", + "0x480a7ffb7fff8000", + "0x48127fe37fff8000", + "0x48127fe37fff8000", + "0x10780017fff7fff", + "0x15", + "0x40780017fff7fff", + "0x9", + "0x480a7ffb7fff8000", + "0x48127fe37fff8000", + "0x48127fe37fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1c", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xbd", + "0x480280007ffc8000", + "0x20680017fff7fff", + "0x40", + "0x40780017fff7fff", + "0x5", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x2f", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000000000ff", + "0x480280017ffb7fff", + "0x400280027ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x17", + "0x402780017fff7fff", + "0x1", + "0x400280007ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffffff00", + "0x400280017ffb7fff", + "0x40780017fff7fff", + "0x5", + "0x482680017ffb8000", + "0x2", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff27fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffb8000", + "0x3", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x88", + "0x40780017fff7fff", + "0x8", + "0x480a7ffb7fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x81", + "0x4824800180007fff", + "0x1", + "0x20680017fff7fff", + "0x69", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x5a", + "0x480080007ffd8000", + "0x20680017fff7fff", + "0x3e", + "0x482480017ffc8000", + "0x1", + "0x48127ffc7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x2f", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000ffffffff", + "0x480280017ffb7fff", + "0x400280027ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x17", + "0x402780017fff7fff", + "0x1", + "0x400280007ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffff00000000", + "0x400280017ffb7fff", + "0x40780017fff7fff", + "0x5", + "0x482680017ffb8000", + "0x2", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x48127ff27fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffb8000", + "0x3", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x27", + "0x40780017fff7fff", + "0x8", + "0x480a7ffb7fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x20", + "0x40780017fff7fff", + "0xa", + "0x4824800180007ff5", + "0x1", + "0x20680017fff7fff", + "0xf", + "0x480a7ffb7fff8000", + "0x482480017ff08000", + "0x1", + "0x48127ff07fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480a7ffb7fff8000", + "0x482480017ff08000", + "0x1", + "0x48127ff07fff8000", + "0x10780017fff7fff", + "0x1d", + "0x40780017fff7fff", + "0xc", + "0x480a7ffb7fff8000", + "0x48127ff07fff8000", + "0x48127ff07fff8000", + "0x10780017fff7fff", + "0x16", + "0x40780017fff7fff", + "0xf", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x11", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xc1", + "0x480280007ffc8000", + "0x20680017fff7fff", + "0x40", + "0x40780017fff7fff", + "0x7", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x2f", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000000000ff", + "0x480280017ffb7fff", + "0x400280027ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x17", + "0x402780017fff7fff", + "0x1", + "0x400280007ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffffff00", + "0x400280017ffb7fff", + "0x40780017fff7fff", + "0x5", + "0x482680017ffb8000", + "0x2", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff27fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffb8000", + "0x3", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x8c", + "0x40780017fff7fff", + "0x8", + "0x480a7ffb7fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x85", + "0x4824800180007fff", + "0x1", + "0x20680017fff7fff", + "0x6d", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x5e", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000000000000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffdeffffffffffffffff", + "0x480280017ffb7fff", + "0x400280027ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x44", + "0x402780017fff7fff", + "0x1", + "0x400280007ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffff0000000000000000", + "0x400280017ffb7fff", + "0x482480017ffa8000", + "0x1", + "0x48127ffa7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x2e", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280027ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000ffffffff", + "0x480280037ffb7fff", + "0x400280047ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x16", + "0x402780017fff7fff", + "0x1", + "0x400280027ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffff00000000", + "0x400280037ffb7fff", + "0x40780017fff7fff", + "0x5", + "0x482680017ffb8000", + "0x4", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1", + "0x48127fed7fff8000", + "0x48127ff27fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffb8000", + "0x5", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x2e", + "0x40780017fff7fff", + "0x8", + "0x482680017ffb8000", + "0x2", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x26", + "0x40780017fff7fff", + "0x6", + "0x482680017ffb8000", + "0x3", + "0x482480017fee8000", + "0x1", + "0x48127fee7fff8000", + "0x10780017fff7fff", + "0x1d", + "0x40780017fff7fff", + "0xe", + "0x480a7ffb7fff8000", + "0x48127fee7fff8000", + "0x48127fee7fff8000", + "0x10780017fff7fff", + "0x16", + "0x40780017fff7fff", + "0x11", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x13", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xa2", + "0x480280007ffc8000", + "0x20680017fff7fff", + "0x46", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x37", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffa7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000000000ff", + "0x480280017ffa7fff", + "0x400280027ffa7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x1d", + "0x402780017fff7fff", + "0x1", + "0x400280007ffa7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffffff00", + "0x400280017ffa7fff", + "0x482680017ffa8000", + "0x2", + "0x482680017ffb8000", + "0x1d1a", + "0x480680017fff8000", + "0x0", + "0x482480017ff78000", + "0x1", + "0x48127ff77fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff37fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffa8000", + "0x3", + "0x482680017ffb8000", + "0x1888", + "0x482480017ff38000", + "0x1", + "0x48127ff37fff8000", + "0x10780017fff7fff", + "0x67", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0x1d42", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x10780017fff7fff", + "0x60", + "0x4824800180007fff", + "0x1", + "0x20680017fff7fff", + "0x42", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x446", + "0x20680017fff7ff8", + "0x26", + "0x20680017fff7ffb", + "0x11", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x208b7fff7fff7ffe", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0x2062", + "0x480680017fff8000", + "0x0", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0x1ffe", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x8d", + "0x480280007ffc8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000000000000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffdeffffffffffffffff", + "0x480280017ffb7fff", + "0x400280027ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x73", + "0x402780017fff7fff", + "0x1", + "0x400280007ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffff0000000000000000", + "0x400280017ffb7fff", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x5d", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000000000000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280027ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffdeffffffffffffffff", + "0x480280037ffb7fff", + "0x400280047ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x43", + "0x402780017fff7fff", + "0x1", + "0x400280027ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffff0000000000000000", + "0x400280037ffb7fff", + "0x482480017ffa8000", + "0x1", + "0x48127ffa7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x2d", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280047ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000ffffffff", + "0x480280057ffb7fff", + "0x400280067ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x15", + "0x402780017fff7fff", + "0x1", + "0x400280047ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffff00000000", + "0x400280057ffb7fff", + "0x40780017fff7fff", + "0x5", + "0x482680017ffb8000", + "0x6", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x0", + "0x48127fe87fff8000", + "0x48127fed7fff8000", + "0x48127ff27fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffb8000", + "0x7", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x29", + "0x40780017fff7fff", + "0x8", + "0x482680017ffb8000", + "0x4", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x21", + "0x40780017fff7fff", + "0x6", + "0x482680017ffb8000", + "0x5", + "0x482480017fee8000", + "0x1", + "0x48127fee7fff8000", + "0x10780017fff7fff", + "0x18", + "0x40780017fff7fff", + "0xe", + "0x482680017ffb8000", + "0x2", + "0x48127fee7fff8000", + "0x48127fee7fff8000", + "0x10780017fff7fff", + "0x10", + "0x40780017fff7fff", + "0xc", + "0x482680017ffb8000", + "0x3", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x10780017fff7fff", + "0x7", + "0x40780017fff7fff", + "0x14", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x6b", + "0x480280007ffc8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde000000000000ffff", + "0x480280017ffb7fff", + "0x400280027ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x51", + "0x402780017fff7fff", + "0x1", + "0x400280007ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffff0000", + "0x400280017ffb7fff", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x3b", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280027ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000000000ff", + "0x480280037ffb7fff", + "0x400280047ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x21", + "0x402780017fff7fff", + "0x1", + "0x400280027ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffffff00", + "0x400280037ffb7fff", + "0x482680017ffb8000", + "0x4", + "0x482480017ff98000", + "0x1", + "0x48127ff97fff8000", + "0x1104800180018000", + "0x832", + "0x20680017fff7ffc", + "0xd", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x480680017fff8000", + "0x0", + "0x48127fd27fff8000", + "0x48127fd77fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x10780017fff7fff", + "0x21", + "0x40780017fff7fff", + "0x1c", + "0x482680017ffb8000", + "0x5", + "0x482480017fd88000", + "0x1", + "0x48127fd87fff8000", + "0x10780017fff7fff", + "0x8", + "0x40780017fff7fff", + "0x24", + "0x482680017ffb8000", + "0x2", + "0x48127fd87fff8000", + "0x48127fd87fff8000", + "0x10780017fff7fff", + "0x10", + "0x40780017fff7fff", + "0x22", + "0x482680017ffb8000", + "0x3", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x10780017fff7fff", + "0x7", + "0x40780017fff7fff", + "0x2a", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x72", + "0x400380007ffc8000", + "0xa0680017fff8000", + "0x12", + "0x4825800180008000", + "0x10000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffa7fff", + "0x482480017ffe8000", + "0xefffffffffffffde000000000000ffff", + "0x480280017ffa7fff", + "0x400280027ffa7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x58", + "0x402780017fff7fff", + "0x1", + "0x400380007ffa8000", + "0x4826800180008000", + "0xffffffffffffffffffffffffffff0000", + "0x400280017ffa7fff", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x35", + "0x40780017fff7fff", + "0x1", + "0x482680017ffa8000", + "0x2", + "0x480a7ffb7fff8000", + "0x482480017ffa8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x48127ffa7fff8000", + "0x480080007ff68000", + "0x1104800180018000", + "0x85f", + "0x20680017fff7ffa", + "0x17", + "0x20680017fff7ffd", + "0xf", + "0x48127ff87fff8000", + "0x482480017ff88000", + "0x1f4", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x0", + "0x480a80007fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x10780017fff7fff", + "0x17", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffa8000", + "0x2", + "0x482680017ffb8000", + "0xd2a", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x482680017ffa8000", + "0x3", + "0x482680017ffb8000", + "0xc1c", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x10780017fff7fff", + "0x7", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0x1130", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x6b", + "0x480280007ffc8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde000000000000ffff", + "0x480280017ffb7fff", + "0x400280027ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x51", + "0x402780017fff7fff", + "0x1", + "0x400280007ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffff0000", + "0x400280017ffb7fff", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x3b", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280027ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde000000000000ffff", + "0x480280037ffb7fff", + "0x400280047ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x21", + "0x402780017fff7fff", + "0x1", + "0x400280027ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffff0000", + "0x400280037ffb7fff", + "0x482680017ffb8000", + "0x4", + "0x482480017ff98000", + "0x1", + "0x48127ff97fff8000", + "0x1104800180018000", + "0x835", + "0x20680017fff7ffc", + "0xd", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x480680017fff8000", + "0x0", + "0x48127fd27fff8000", + "0x48127fd77fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x10780017fff7fff", + "0x21", + "0x40780017fff7fff", + "0x1c", + "0x482680017ffb8000", + "0x5", + "0x482480017fd88000", + "0x1", + "0x48127fd87fff8000", + "0x10780017fff7fff", + "0x8", + "0x40780017fff7fff", + "0x24", + "0x482680017ffb8000", + "0x2", + "0x48127fd87fff8000", + "0x48127fd87fff8000", + "0x10780017fff7fff", + "0x10", + "0x40780017fff7fff", + "0x22", + "0x482680017ffb8000", + "0x3", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x10780017fff7fff", + "0x7", + "0x40780017fff7fff", + "0x2a", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x8b", + "0x480280007ffc8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000ffffffff", + "0x480280017ffb7fff", + "0x400280027ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x71", + "0x402780017fff7fff", + "0x1", + "0x400280007ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffff00000000", + "0x400280017ffb7fff", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x5b", + "0x480080007ffd8000", + "0x20680017fff7fff", + "0x3e", + "0x482480017ffc8000", + "0x1", + "0x48127ffc7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x2e", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280027ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000000000ff", + "0x480280037ffb7fff", + "0x400280047ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x16", + "0x402780017fff7fff", + "0x1", + "0x400280027ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffffff00", + "0x400280037ffb7fff", + "0x40780017fff7fff", + "0x5", + "0x482680017ffb8000", + "0x4", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x0", + "0x48127fea7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ff27fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffb8000", + "0x5", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x2a", + "0x40780017fff7fff", + "0x8", + "0x482680017ffb8000", + "0x2", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x22", + "0x40780017fff7fff", + "0xa", + "0x4824800180007ff5", + "0x1", + "0x20680017fff7fff", + "0xf", + "0x482680017ffb8000", + "0x2", + "0x482480017ff08000", + "0x1", + "0x48127ff07fff8000", + "0x480680017fff8000", + "0x0", + "0x48127fea7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x482680017ffb8000", + "0x2", + "0x482480017ff08000", + "0x1", + "0x48127ff07fff8000", + "0x10780017fff7fff", + "0x18", + "0x40780017fff7fff", + "0xc", + "0x482680017ffb8000", + "0x2", + "0x48127ff07fff8000", + "0x48127ff07fff8000", + "0x10780017fff7fff", + "0x10", + "0x40780017fff7fff", + "0xa", + "0x482680017ffb8000", + "0x3", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x10780017fff7fff", + "0x7", + "0x40780017fff7fff", + "0x12", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x8c", + "0x480280007ffc8000", + "0x20680017fff7fff", + "0x3e", + "0x40780017fff7fff", + "0x1", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x2d", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000000000ff", + "0x480280017ffb7fff", + "0x400280027ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x15", + "0x402780017fff7fff", + "0x1", + "0x400280007ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffffff00", + "0x400280017ffb7fff", + "0x40780017fff7fff", + "0x5", + "0x482680017ffb8000", + "0x2", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff37fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffb8000", + "0x3", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x59", + "0x40780017fff7fff", + "0x8", + "0x480a7ffb7fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x52", + "0x4824800180007fff", + "0x1", + "0x20680017fff7fff", + "0x3c", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x2d", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000000000000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffdeffffffffffffffff", + "0x480280017ffb7fff", + "0x400280027ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x15", + "0x402780017fff7fff", + "0x1", + "0x400280007ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffff0000000000000000", + "0x400280017ffb7fff", + "0x40780017fff7fff", + "0x5", + "0x482680017ffb8000", + "0x2", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1", + "0x48127ff37fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffb8000", + "0x3", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x1b", + "0x40780017fff7fff", + "0x8", + "0x480a7ffb7fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x14", + "0x40780017fff7fff", + "0xb", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0xd", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x7a", + "0x20680017fff7ff8", + "0x65", + "0x20680017fff7ffb", + "0x4f", + "0x48307ff980007ffa", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x32", + "0x480080007ff88000", + "0xa0680017fff8004", + "0xe", + "0x4824800180047ffe", + "0x100000000000000000000000000000000000000000000000000000000000000", + "0x484480017ffe8000", + "0x7000000000000110000000000000000", + "0x48307ffe7fff8002", + "0x480080007ff07ffc", + "0x480080017fef7ffc", + "0x402480017ffb7ffd", + "0xf8ffffffffffffeeffffffffffffffff", + "0x400080027fee7ffd", + "0x10780017fff7fff", + "0x1b", + "0x484480017fff8001", + "0x1000000000000000000000000000000", + "0x48307fff80007ffd", + "0x480080007ff17ffd", + "0x480080017ff07ffd", + "0x402480017ffc7ffe", + "0xff000000000000000000000000000000", + "0x400080027fef7ffe", + "0x482480017fef8000", + "0x3", + "0x482480017fef8000", + "0x2bc", + "0x480680017fff8000", + "0x0", + "0x482480017fef8000", + "0x1", + "0x48127fef7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127fef7fff8000", + "0x48127fef7fff8000", + "0x48127fef7fff8000", + "0x48127fef7fff8000", + "0x48127ff07fff8000", + "0x208b7fff7fff7ffe", + "0x482480017fee8000", + "0x3", + "0x48127fee7fff8000", + "0x482480017fef8000", + "0x1", + "0x48127fef7fff8000", + "0x10780017fff7fff", + "0x7", + "0x48127ff57fff8000", + "0x482480017ff58000", + "0x4ba", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48127ff67fff8000", + "0x482480017ff68000", + "0x776", + "0x480680017fff8000", + "0x0", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x2ea", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480280007ffc8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x9", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffa7fff", + "0x482480017ffe8000", + "0xefffffffffffffde0000000000000008", + "0x480280017ffa7fff", + "0x400280027ffa7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x2c3", + "0x402780017fff7fff", + "0x1", + "0x400280007ffa7ffe", + "0x482480017ffe8000", + "0xfffffffffffffffffffffffffffffff7", + "0x400280017ffa7fff", + "0x4824800180007ffd", + "0x400000000000008800000000000000000000000000000000000000000000009", + "0x484480017fff8000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffff", + "0x1137fff7fff7fff", + "0x10780017fff7fff", + "0x2a3", + "0x10780017fff7fff", + "0x273", + "0x10780017fff7fff", + "0x1fd", + "0x10780017fff7fff", + "0x18b", + "0x10780017fff7fff", + "0x143", + "0x10780017fff7fff", + "0xd2", + "0x10780017fff7fff", + "0xb3", + "0x10780017fff7fff", + "0x42", + "0x48307ff980007ffa", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x35", + "0x480080007ff88000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280027ffa7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000000000ff", + "0x480280037ffa7fff", + "0x400280047ffa7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x1b", + "0x402780017fff7fff", + "0x1", + "0x400280027ffa7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffffff00", + "0x400280037ffa7fff", + "0x482680017ffa8000", + "0x4", + "0x482680017ffb8000", + "0x10d6", + "0x480680017fff8000", + "0x0", + "0x482480017ff28000", + "0x1", + "0x48127ff27fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x11", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff47fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffa8000", + "0x5", + "0x482680017ffb8000", + "0xc44", + "0x482480017fee8000", + "0x1", + "0x48127fee7fff8000", + "0x10780017fff7fff", + "0x288", + "0x482680017ffa8000", + "0x2", + "0x482680017ffb8000", + "0x10fe", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x10780017fff7fff", + "0x280", + "0x48307ff980007ffa", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x64", + "0x480080007ff88000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000000000000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280027ffa7fff", + "0x482480017ffe8000", + "0xefffffffffffffdeffffffffffffffff", + "0x480280037ffa7fff", + "0x400280047ffa7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x4a", + "0x402780017fff7fff", + "0x1", + "0x400280027ffa7ffe", + "0x482480017ffe8000", + "0xffffffffffffffff0000000000000000", + "0x400280037ffa7fff", + "0x482480017ff58000", + "0x1", + "0x48127ff57fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x34", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280047ffa7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000ffffffff", + "0x480280057ffa7fff", + "0x400280067ffa7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x1a", + "0x402780017fff7fff", + "0x1", + "0x400280047ffa7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffff00000000", + "0x400280057ffa7fff", + "0x482680017ffa8000", + "0x6", + "0x482680017ffb8000", + "0xc62", + "0x480680017fff8000", + "0x0", + "0x482480017ff78000", + "0x1", + "0x48127ff77fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0xf", + "0x480680017fff8000", + "0x0", + "0x48127fef7fff8000", + "0x48127ff47fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffa8000", + "0x7", + "0x482680017ffb8000", + "0x7d0", + "0x482480017ff38000", + "0x1", + "0x48127ff37fff8000", + "0x10780017fff7fff", + "0x22a", + "0x482680017ffa8000", + "0x4", + "0x482680017ffb8000", + "0xc8a", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x10780017fff7fff", + "0x222", + "0x482680017ffa8000", + "0x5", + "0x482680017ffb8000", + "0xbe0", + "0x482480017fee8000", + "0x1", + "0x48127fee7fff8000", + "0x10780017fff7fff", + "0x219", + "0x482680017ffa8000", + "0x2", + "0x482680017ffb8000", + "0x109a", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x10780017fff7fff", + "0x211", + "0x482680017ffa8000", + "0x2", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x1104800180018000", + "0x5f7", + "0x20680017fff7ffc", + "0x11", + "0x48127ff97fff8000", + "0x482680017ffb8000", + "0x1f4", + "0x480680017fff8000", + "0x0", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0xd", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff97fff8000", + "0x480a7ffb7fff8000", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x10780017fff7fff", + "0x1b8", + "0x48307ff980007ffa", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x64", + "0x480080007ff88000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280027ffa7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000ffffffff", + "0x480280037ffa7fff", + "0x400280047ffa7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x4a", + "0x402780017fff7fff", + "0x1", + "0x400280027ffa7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffff00000000", + "0x400280037ffa7fff", + "0x482480017ff58000", + "0x1", + "0x48127ff57fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x34", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280047ffa7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000ffffffff", + "0x480280057ffa7fff", + "0x400280067ffa7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x1a", + "0x402780017fff7fff", + "0x1", + "0x400280047ffa7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffff00000000", + "0x400280057ffa7fff", + "0x482680017ffa8000", + "0x6", + "0x482680017ffb8000", + "0xc62", + "0x480680017fff8000", + "0x0", + "0x482480017ff78000", + "0x1", + "0x48127ff77fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0xb", + "0x480680017fff8000", + "0x0", + "0x48127fef7fff8000", + "0x48127ff47fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffa8000", + "0x7", + "0x482680017ffb8000", + "0x7d0", + "0x482480017ff38000", + "0x1", + "0x48127ff37fff8000", + "0x10780017fff7fff", + "0x19e", + "0x482680017ffa8000", + "0x4", + "0x482680017ffb8000", + "0xc8a", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x10780017fff7fff", + "0x196", + "0x482680017ffa8000", + "0x5", + "0x482680017ffb8000", + "0xbe0", + "0x482480017fee8000", + "0x1", + "0x48127fee7fff8000", + "0x10780017fff7fff", + "0x18d", + "0x482680017ffa8000", + "0x2", + "0x482680017ffb8000", + "0x109a", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x10780017fff7fff", + "0x185", + "0x48307ff980007ffa", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x3b", + "0x40780017fff7fff", + "0x1", + "0x482680017ffa8000", + "0x2", + "0x480a7ffb7fff8000", + "0x482480017ff58000", + "0x1", + "0x48127ff57fff8000", + "0x48127ffb7fff8000", + "0x48127ffa7fff8000", + "0x480080007ff18000", + "0x1104800180018000", + "0x613", + "0x20680017fff7ffa", + "0x1b", + "0x20680017fff7ffd", + "0x12", + "0x48127ff87fff8000", + "0x482480017ff88000", + "0x5c8", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x9", + "0x480680017fff8000", + "0x0", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff87fff8000", + "0x482480017ff88000", + "0x3d4", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x10780017fff7fff", + "0x11c", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffa8000", + "0x2", + "0x482680017ffb8000", + "0x109a", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x10780017fff7fff", + "0x103", + "0x48307ff980007ffa", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x65", + "0x480080007ff88000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000000000000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280027ffa7fff", + "0x482480017ffe8000", + "0xefffffffffffffdeffffffffffffffff", + "0x480280037ffa7fff", + "0x400280047ffa7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x4b", + "0x402780017fff7fff", + "0x1", + "0x400280027ffa7ffe", + "0x482480017ffe8000", + "0xffffffffffffffff0000000000000000", + "0x400280037ffa7fff", + "0x482480017ff58000", + "0x1", + "0x48127ff57fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x35", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x16", + "0x480280047ffa8003", + "0x480280057ffa8003", + "0x4844800180017ffe", + "0x100000000000000000000000000000000", + "0x483080017ffd7ffb", + "0x482480017fff7ffd", + "0x800000000000010fffffffffffffffff7ffffffffffffef0000000000000001", + "0x20680017fff7ffc", + "0x6", + "0x402480017fff7ffd", + "0xffffffffffffffffffffffffffffffff", + "0x10780017fff7fff", + "0x4", + "0x402480017ffe7ffd", + "0xf7ffffffffffffef0000000000000000", + "0x400280067ffa7ffd", + "0x20680017fff7ffe", + "0x17", + "0x402780017fff7fff", + "0x1", + "0x400280047ffa7ffe", + "0x482680017ffa8000", + "0x5", + "0x482680017ffb8000", + "0xd70", + "0x480680017fff8000", + "0x0", + "0x482480017ff88000", + "0x1", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x7", + "0x480680017fff8000", + "0x0", + "0x48127ff07fff8000", + "0x48127ff57fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffa8000", + "0x7", + "0x482680017ffb8000", + "0x76c", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0xe8", + "0x482680017ffa8000", + "0x4", + "0x482680017ffb8000", + "0xc8a", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x10780017fff7fff", + "0xe0", + "0x482680017ffa8000", + "0x5", + "0x482680017ffb8000", + "0xbe0", + "0x482480017fee8000", + "0x1", + "0x48127fee7fff8000", + "0x10780017fff7fff", + "0xd7", + "0x482680017ffa8000", + "0x2", + "0x482680017ffb8000", + "0x109a", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x10780017fff7fff", + "0xcf", + "0x48307ff980007ffa", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x69", + "0x480080007ff88000", + "0x20680017fff7fff", + "0x45", + "0x482480017ff78000", + "0x1", + "0x48127ff77fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x35", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280027ffa7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000000000ff", + "0x480280037ffa7fff", + "0x400280047ffa7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x1b", + "0x402780017fff7fff", + "0x1", + "0x400280027ffa7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffffff00", + "0x400280037ffa7fff", + "0x482680017ffa8000", + "0x4", + "0x482680017ffb8000", + "0xe1a", + "0x480680017fff8000", + "0x0", + "0x482480017ff78000", + "0x1", + "0x48127ff77fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x5", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff47fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffa8000", + "0x5", + "0x482680017ffb8000", + "0x924", + "0x482480017ff38000", + "0x1", + "0x48127ff37fff8000", + "0x10780017fff7fff", + "0x31", + "0x482680017ffa8000", + "0x2", + "0x482680017ffb8000", + "0xdde", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x10780017fff7fff", + "0x29", + "0x4824800180007fff", + "0x1", + "0x20680017fff7fff", + "0x16", + "0x482680017ffa8000", + "0x2", + "0x482680017ffb8000", + "0x1162", + "0x480680017fff8000", + "0x0", + "0x482480017ff38000", + "0x1", + "0x48127ff37fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x5", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x482680017ffa8000", + "0x2", + "0x482680017ffb8000", + "0xf6e", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x63", + "0x482680017ffa8000", + "0x2", + "0x482680017ffb8000", + "0x109a", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x10780017fff7fff", + "0x5b", + "0x482680017ffa8000", + "0x2", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x1104800180018000", + "0x59a", + "0x20680017fff7ffd", + "0x12", + "0x48127ffa7fff8000", + "0x482680017ffb8000", + "0x5a0", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x3", + "0x480680017fff8000", + "0x0", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x208b7fff7fff7ffe", + "0x48127ffa7fff8000", + "0x482680017ffb8000", + "0x410", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x482680017ffa8000", + "0x2", + "0x482680017ffb8000", + "0x13ba", + "0x480680017fff8000", + "0x0", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x482680017ffa8000", + "0x3", + "0x482680017ffb8000", + "0x12ac", + "0x480680017fff8000", + "0x0", + "0x48127ff37fff8000", + "0x48127ff37fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0x169e", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x400180007fff7ffd", + "0x48127fff7fff8000", + "0x482480017ffe8000", + "0x1", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ff88000", + "0xfffffffffffffffffffffffffffff6fa", + "0x400280007ff77fff", + "0x10780017fff7fff", + "0x5b", + "0x4825800180007ff8", + "0x906", + "0x400280007ff77fff", + "0x20780017fff7ffd", + "0xf", + "0x482680017ff78000", + "0x1", + "0x482480017ffe8000", + "0xc8a", + "0x480680017fff8000", + "0x0", + "0x480a7ff97fff8000", + "0x480a7ffa7fff8000", + "0x480680017fff8000", + "0x0", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x208b7fff7fff7ffe", + "0x48297ff980007ffa", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x31", + "0x480280007ff98000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280017ff77fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000000000ff", + "0x480280027ff77fff", + "0x400280037ff77ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x17", + "0x402780017fff7fff", + "0x1", + "0x400280017ff77ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffffff00", + "0x400280027ff77fff", + "0x400280007ffc7ffd", + "0x482680017ff78000", + "0x3", + "0x48127ffa7fff8000", + "0x482680017ff98000", + "0x1", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x1", + "0x4825800180007ffd", + "0x1", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc0", + "0x208b7fff7fff7ffe", + "0x482680017ff78000", + "0x4", + "0x482480017ff58000", + "0x4b0", + "0x482680017ff98000", + "0x1", + "0x480a7ffa7fff8000", + "0x10780017fff7fff", + "0x8", + "0x482680017ff78000", + "0x1", + "0x482480017ffd8000", + "0x9ce", + "0x480a7ff97fff8000", + "0x480a7ffa7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffecd2", + "0x482680017ff78000", + "0x1", + "0x480a7ff87fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x72", + "0x400380007ffc8000", + "0xa0680017fff8000", + "0x12", + "0x4825800180008000", + "0x100000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffa7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000ffffffff", + "0x480280017ffa7fff", + "0x400280027ffa7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x58", + "0x402780017fff7fff", + "0x1", + "0x400380007ffa8000", + "0x4826800180008000", + "0xffffffffffffffffffffffff00000000", + "0x400280017ffa7fff", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x35", + "0x40780017fff7fff", + "0x1", + "0x482680017ffa8000", + "0x2", + "0x480a7ffb7fff8000", + "0x482480017ffa8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x48127ffa7fff8000", + "0x480080007ff68000", + "0x1104800180018000", + "0x225", + "0x20680017fff7ffa", + "0x17", + "0x20680017fff7ffd", + "0xf", + "0x48127ff87fff8000", + "0x482480017ff88000", + "0x1f4", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x0", + "0x480a80007fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x10780017fff7fff", + "0x17", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffa8000", + "0x2", + "0x482680017ffb8000", + "0xd2a", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x482680017ffa8000", + "0x3", + "0x482680017ffb8000", + "0xc1c", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x10780017fff7fff", + "0x7", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0x1130", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ff98000", + "0xfffffffffffffffffffffffffffff916", + "0x400280007ff87fff", + "0x10780017fff7fff", + "0x23", + "0x4825800180007ff9", + "0x6ea", + "0x400280007ff87fff", + "0x48297ffa80007ffb", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x12", + "0x480280007ffa8000", + "0x480280017ffa8000", + "0x400280007ffd7ffe", + "0x400280017ffd7fff", + "0x482680017ff88000", + "0x1", + "0x48127ffb7fff8000", + "0x482680017ffa8000", + "0x2", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x482680017ffd8000", + "0x2", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe5", + "0x208b7fff7fff7ffe", + "0x482680017ff88000", + "0x1", + "0x482480017ffd8000", + "0x9a6", + "0x480680017fff8000", + "0x0", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffec0f", + "0x482680017ff88000", + "0x1", + "0x480a7ff97fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ff88000", + "0xfffffffffffffffffffffffffffff6fa", + "0x400280007ff77fff", + "0x10780017fff7fff", + "0x5b", + "0x4825800180007ff8", + "0x906", + "0x400280007ff77fff", + "0x20780017fff7ffd", + "0xf", + "0x482680017ff78000", + "0x1", + "0x482480017ffe8000", + "0xc8a", + "0x480680017fff8000", + "0x0", + "0x480a7ff97fff8000", + "0x480a7ffa7fff8000", + "0x480680017fff8000", + "0x0", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x208b7fff7fff7ffe", + "0x48297ff980007ffa", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x31", + "0x480280007ff98000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280017ff77fff", + "0x482480017ffe8000", + "0xefffffffffffffde000000000000ffff", + "0x480280027ff77fff", + "0x400280037ff77ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x17", + "0x402780017fff7fff", + "0x1", + "0x400280017ff77ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffff0000", + "0x400280027ff77fff", + "0x400280007ffc7ffd", + "0x482680017ff78000", + "0x3", + "0x48127ffa7fff8000", + "0x482680017ff98000", + "0x1", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x1", + "0x4825800180007ffd", + "0x1", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc0", + "0x208b7fff7fff7ffe", + "0x482680017ff78000", + "0x4", + "0x482480017ff58000", + "0x4b0", + "0x482680017ff98000", + "0x1", + "0x480a7ffa7fff8000", + "0x10780017fff7fff", + "0x8", + "0x482680017ff78000", + "0x1", + "0x482480017ffd8000", + "0x9ce", + "0x480a7ff97fff8000", + "0x480a7ffa7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffeba5", + "0x482680017ff78000", + "0x1", + "0x480a7ff87fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x72", + "0x400380007ffc8000", + "0xa0680017fff8000", + "0x12", + "0x4825800180008000", + "0x10000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffa7fff", + "0x482480017ffe8000", + "0xefffffffffffffde000000000000ffff", + "0x480280017ffa7fff", + "0x400280027ffa7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x58", + "0x402780017fff7fff", + "0x1", + "0x400380007ffa8000", + "0x4826800180008000", + "0xffffffffffffffffffffffffffff0000", + "0x400280017ffa7fff", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x35", + "0x40780017fff7fff", + "0x1", + "0x482680017ffa8000", + "0x2", + "0x480a7ffb7fff8000", + "0x482480017ffa8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x48127ffa7fff8000", + "0x480080007ff68000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff60", + "0x20680017fff7ffa", + "0x17", + "0x20680017fff7ffd", + "0xf", + "0x48127ff87fff8000", + "0x482480017ff88000", + "0x1f4", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x0", + "0x480a80007fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x10780017fff7fff", + "0x17", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffa8000", + "0x2", + "0x482680017ffb8000", + "0xd2a", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x482680017ffa8000", + "0x3", + "0x482680017ffb8000", + "0xc1c", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x10780017fff7fff", + "0x7", + "0x480a7ffa7fff8000", + "0x482680017ffb8000", + "0x1130", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x8d", + "0x480280007ffc8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde000000000000ffff", + "0x480280017ffb7fff", + "0x400280027ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x73", + "0x402780017fff7fff", + "0x1", + "0x400280007ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffff0000", + "0x400280017ffb7fff", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x5d", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280027ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000ffffffff", + "0x480280037ffb7fff", + "0x400280047ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x43", + "0x402780017fff7fff", + "0x1", + "0x400280027ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffff00000000", + "0x400280037ffb7fff", + "0x482480017ffa8000", + "0x1", + "0x48127ffa7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x2d", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000000000000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280047ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffdeffffffffffffffff", + "0x480280057ffb7fff", + "0x400280067ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x15", + "0x402780017fff7fff", + "0x1", + "0x400280047ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffff0000000000000000", + "0x400280057ffb7fff", + "0x40780017fff7fff", + "0x5", + "0x482680017ffb8000", + "0x6", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x0", + "0x48127fe87fff8000", + "0x48127fed7fff8000", + "0x48127ff27fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffb8000", + "0x7", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x29", + "0x40780017fff7fff", + "0x8", + "0x482680017ffb8000", + "0x4", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x21", + "0x40780017fff7fff", + "0x6", + "0x482680017ffb8000", + "0x5", + "0x482480017fee8000", + "0x1", + "0x48127fee7fff8000", + "0x10780017fff7fff", + "0x18", + "0x40780017fff7fff", + "0xe", + "0x482680017ffb8000", + "0x2", + "0x48127fee7fff8000", + "0x48127fee7fff8000", + "0x10780017fff7fff", + "0x10", + "0x40780017fff7fff", + "0xc", + "0x482680017ffb8000", + "0x3", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x10780017fff7fff", + "0x7", + "0x40780017fff7fff", + "0x14", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ff88000", + "0xfffffffffffffffffffffffffffff6fa", + "0x400280007ff77fff", + "0x10780017fff7fff", + "0x5b", + "0x4825800180007ff8", + "0x906", + "0x400280007ff77fff", + "0x20780017fff7ffd", + "0xf", + "0x482680017ff78000", + "0x1", + "0x482480017ffe8000", + "0xc8a", + "0x480680017fff8000", + "0x0", + "0x480a7ff97fff8000", + "0x480a7ffa7fff8000", + "0x480680017fff8000", + "0x0", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x208b7fff7fff7ffe", + "0x48297ff980007ffa", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x31", + "0x480280007ff98000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280017ff77fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000ffffffff", + "0x480280027ff77fff", + "0x400280037ff77ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x17", + "0x402780017fff7fff", + "0x1", + "0x400280017ff77ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffff00000000", + "0x400280027ff77fff", + "0x400280007ffc7ffd", + "0x482680017ff78000", + "0x3", + "0x48127ffa7fff8000", + "0x482680017ff98000", + "0x1", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x1", + "0x4825800180007ffd", + "0x1", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc0", + "0x208b7fff7fff7ffe", + "0x482680017ff78000", + "0x4", + "0x482480017ff58000", + "0x4b0", + "0x482680017ff98000", + "0x1", + "0x480a7ffa7fff8000", + "0x10780017fff7fff", + "0x8", + "0x482680017ff78000", + "0x1", + "0x482480017ffd8000", + "0x9ce", + "0x480a7ff97fff8000", + "0x480a7ffa7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffea0c", + "0x482680017ff78000", + "0x1", + "0x480a7ff87fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x8d", + "0x480280007ffc8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde000000000000ffff", + "0x480280017ffb7fff", + "0x400280027ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x73", + "0x402780017fff7fff", + "0x1", + "0x400280007ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffff0000", + "0x400280017ffb7fff", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x5d", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280027ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde000000000000ffff", + "0x480280037ffb7fff", + "0x400280047ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x43", + "0x402780017fff7fff", + "0x1", + "0x400280027ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffff0000", + "0x400280037ffb7fff", + "0x482480017ffa8000", + "0x1", + "0x48127ffa7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x2d", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280047ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde000000000000ffff", + "0x480280057ffb7fff", + "0x400280067ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x15", + "0x402780017fff7fff", + "0x1", + "0x400280047ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffffffff0000", + "0x400280057ffb7fff", + "0x40780017fff7fff", + "0x5", + "0x482680017ffb8000", + "0x6", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x0", + "0x48127fe87fff8000", + "0x48127fed7fff8000", + "0x48127ff27fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffb8000", + "0x7", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x29", + "0x40780017fff7fff", + "0x8", + "0x482680017ffb8000", + "0x4", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x21", + "0x40780017fff7fff", + "0x6", + "0x482680017ffb8000", + "0x5", + "0x482480017fee8000", + "0x1", + "0x48127fee7fff8000", + "0x10780017fff7fff", + "0x18", + "0x40780017fff7fff", + "0xe", + "0x482680017ffb8000", + "0x2", + "0x48127fee7fff8000", + "0x48127fee7fff8000", + "0x10780017fff7fff", + "0x10", + "0x40780017fff7fff", + "0xc", + "0x482680017ffb8000", + "0x3", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x10780017fff7fff", + "0x7", + "0x40780017fff7fff", + "0x14", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xa3", + "0x480280007ffc8000", + "0x20680017fff7fff", + "0x6d", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x5e", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000000000000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffdeffffffffffffffff", + "0x480280017ffb7fff", + "0x400280027ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x44", + "0x402780017fff7fff", + "0x1", + "0x400280007ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffff0000000000000000", + "0x400280017ffb7fff", + "0x482480017ffa8000", + "0x1", + "0x48127ffa7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x2e", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280027ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000ffffffff", + "0x480280037ffb7fff", + "0x400280047ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x16", + "0x402780017fff7fff", + "0x1", + "0x400280027ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffff00000000", + "0x400280037ffb7fff", + "0x40780017fff7fff", + "0x5", + "0x482680017ffb8000", + "0x4", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x5", + "0x48127fed7fff8000", + "0x48127ff27fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffb8000", + "0x5", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x52", + "0x40780017fff7fff", + "0x8", + "0x482680017ffb8000", + "0x2", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x4a", + "0x40780017fff7fff", + "0x6", + "0x482680017ffb8000", + "0x3", + "0x482480017fee8000", + "0x1", + "0x48127fee7fff8000", + "0x10780017fff7fff", + "0x41", + "0x40780017fff7fff", + "0xe", + "0x480a7ffb7fff8000", + "0x48127fee7fff8000", + "0x48127fee7fff8000", + "0x10780017fff7fff", + "0x3a", + "0x40780017fff7fff", + "0xf", + "0x4824800180007ff0", + "0x1", + "0x20680017fff7fff", + "0x11", + "0x40780017fff7fff", + "0x1", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x3", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x4824800180007fef", + "0x2", + "0x20680017fff7fff", + "0xf", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x12", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ff88000", + "0xfffffffffffffffffffffffffffff3da", + "0x400280007ff77fff", + "0x10780017fff7fff", + "0x90", + "0x4825800180007ff8", + "0xc26", + "0x400280007ff77fff", + "0x20780017fff7ffd", + "0xf", + "0x482680017ff78000", + "0x1", + "0x482480017ffe8000", + "0xfaa", + "0x480680017fff8000", + "0x0", + "0x480a7ff97fff8000", + "0x480a7ffa7fff8000", + "0x480680017fff8000", + "0x0", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x208b7fff7fff7ffe", + "0x48297ff980007ffa", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x66", + "0x480280007ff98000", + "0xa0680017fff8000", + "0x16", + "0x480280017ff78003", + "0x480280027ff78003", + "0x4844800180017ffe", + "0x100000000000000000000000000000000", + "0x483080017ffd7ffb", + "0x482480017fff7ffd", + "0x800000000000010fffffffffffffffff7ffffffffffffef0000000000000001", + "0x20680017fff7ffc", + "0x6", + "0x402480017fff7ffd", + "0xffffffffffffffffffffffffffffffff", + "0x10780017fff7fff", + "0x4", + "0x402480017ffe7ffd", + "0xf7ffffffffffffef0000000000000000", + "0x400280037ff77ffd", + "0x20680017fff7ffe", + "0x48", + "0x402780017fff7fff", + "0x1", + "0x400280017ff77ffe", + "0x482680017ff98000", + "0x1", + "0x480a7ffa7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x35", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x16", + "0x480280027ff78003", + "0x480280037ff78003", + "0x4844800180017ffe", + "0x100000000000000000000000000000000", + "0x483080017ffd7ffb", + "0x482480017fff7ffd", + "0x800000000000010fffffffffffffffff7ffffffffffffef0000000000000001", + "0x20680017fff7ffc", + "0x6", + "0x402480017fff7ffd", + "0xffffffffffffffffffffffffffffffff", + "0x10780017fff7fff", + "0x4", + "0x402480017ffe7ffd", + "0xf7ffffffffffffef0000000000000000", + "0x400280047ff77ffd", + "0x20680017fff7ffe", + "0x17", + "0x402780017fff7fff", + "0x1", + "0x400280027ff77ffe", + "0x48127ff97fff8000", + "0x48127ffd7fff8000", + "0x400280007ffc7ffe", + "0x400280017ffc7fff", + "0x482680017ff78000", + "0x3", + "0x48127ff47fff8000", + "0x482480017ff78000", + "0x1", + "0x48127ff77fff8000", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x2", + "0x4825800180007ffd", + "0x1", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff9c", + "0x208b7fff7fff7ffe", + "0x482680017ff78000", + "0x5", + "0x482480017ff18000", + "0x46a", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x19", + "0x482680017ff78000", + "0x2", + "0x482480017ff88000", + "0x988", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x10780017fff7fff", + "0x11", + "0x482680017ff78000", + "0x4", + "0x482480017ff68000", + "0x76c", + "0x482680017ff98000", + "0x1", + "0x480a7ffa7fff8000", + "0x10780017fff7fff", + "0x8", + "0x482680017ff78000", + "0x1", + "0x482480017ffd8000", + "0xcee", + "0x480a7ff97fff8000", + "0x480a7ffa7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffe815", + "0x482680017ff78000", + "0x1", + "0x480a7ff87fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x208b7fff7fff7ffe", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x8c", + "0x480280007ffc8000", + "0x20680017fff7fff", + "0x3e", + "0x40780017fff7fff", + "0x1", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x2d", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x100000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffde00000000ffffffff", + "0x480280017ffb7fff", + "0x400280027ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x15", + "0x402780017fff7fff", + "0x1", + "0x400280007ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffffffffffff00000000", + "0x400280017ffb7fff", + "0x40780017fff7fff", + "0x5", + "0x482680017ffb8000", + "0x2", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x48127ff37fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffb8000", + "0x3", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x59", + "0x40780017fff7fff", + "0x8", + "0x480a7ffb7fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x52", + "0x4824800180007fff", + "0x1", + "0x20680017fff7fff", + "0x3c", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x48307ffe80007fff", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x2d", + "0x480080007ffd8000", + "0xa0680017fff8000", + "0x12", + "0x4824800180007ffe", + "0x10000000000000000", + "0x4844800180008002", + "0x8000000000000110000000000000000", + "0x4830800080017ffe", + "0x480280007ffb7fff", + "0x482480017ffe8000", + "0xefffffffffffffdeffffffffffffffff", + "0x480280017ffb7fff", + "0x400280027ffb7ffb", + "0x402480017fff7ffb", + "0xffffffffffffffffffffffffffffffff", + "0x20680017fff7fff", + "0x15", + "0x402780017fff7fff", + "0x1", + "0x400280007ffb7ffe", + "0x482480017ffe8000", + "0xffffffffffffffff0000000000000000", + "0x400280017ffb7fff", + "0x40780017fff7fff", + "0x5", + "0x482680017ffb8000", + "0x2", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1", + "0x48127ff37fff8000", + "0x208b7fff7fff7ffe", + "0x482680017ffb8000", + "0x3", + "0x482480017ff48000", + "0x1", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x1b", + "0x40780017fff7fff", + "0x8", + "0x480a7ffb7fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x10780017fff7fff", + "0x14", + "0x40780017fff7fff", + "0xb", + "0x480a7ffb7fff8000", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0xd", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe" + ], + "bytecode_segment_lengths": [ + 191, 144, 168, 144, 131, 181, 113, 143, 146, 146, 164, 113, 113, 145, 115, 147, 131, 130, 114, + 144, 92, 174, 96, 75, 97, 123, 97, 113, 162, 130, 169, 121, 102, 5, 5, 5, 141, 48, 158, 127, 48, + 157, 155, 161, 138, 189, 165, 67, 95, 68, 191, 48, 187, 163, 131, 206, 210, 189, 158, 128, 139, + 128, 156, 155, 126, 771, 7, 112, 139, 50, 112, 139, 158, 112, 158, 180, 165, 155 + ], + "hints": [ + [ + 0, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 27, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 31, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 108, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -10 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [120, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 191, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 232, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x8e8" }, + "rhs": { "Deref": { "register": "AP", "offset": -13 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [244, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 335, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 418, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -12 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [430, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 503, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x9f6" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 544, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0xa0a" }, + "rhs": { "Deref": { "register": "AP", "offset": -14 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [556, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 647, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 685, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -35 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [697, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 778, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 858, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -11 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [870, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 959, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 997, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -37 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [1009, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 1072, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0xfbe" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 1113, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0xf82" }, + "rhs": { "Deref": { "register": "AP", "offset": -15 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [1125, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 1215, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [1230, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 1267, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -12 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [1280, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 1361, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [1376, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 1413, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -12 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [1426, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 1507, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 1534, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 1538, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 1608, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -8 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [1620, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 1671, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 1709, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -37 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [1721, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 1784, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 1822, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -31 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [1834, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 1897, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0xa" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 1938, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x816" }, + "rhs": { "Deref": { "register": "AP", "offset": -13 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [1950, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 2042, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x1ae" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 2080, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -56 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [2092, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 2157, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0xc4e" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 2198, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x87a" }, + "rhs": { "Deref": { "register": "AP", "offset": -14 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [2210, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 2304, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 2342, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -47 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [2354, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 2435, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 2473, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -36 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [2485, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 2565, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 2603, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -38 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [2615, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 2679, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x1086" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 2720, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0xf1e" }, + "rhs": { "Deref": { "register": "AP", "offset": -15 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [2732, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 2823, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 2861, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -31 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [2873, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 2915, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 2931, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000000000000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 2935, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 2962, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 2966, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 3008, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -18 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [3022, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 3089, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 3127, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -39 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [3139, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 3185, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 3216, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [3228, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 3260, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x776" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 3298, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -63 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [3310, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 3357, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x15e" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 3398, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x6ea" }, + "rhs": { "Deref": { "register": "AP", "offset": -13 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [3410, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 3480, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x776" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 3518, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -63 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [3530, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 3577, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 3615, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -37 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [3627, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 3690, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 3706, + [ + { + "TestLessThan": { + "lhs": { "Deref": { "register": "AP", "offset": -1 } }, + "rhs": { "Immediate": "0x100000000000000000000000000000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 3708, + [ + { + "DivMod": { + "lhs": { "Deref": { "register": "AP", "offset": -2 } }, + "rhs": { "Immediate": "0x100000000000000000000000000000000" }, + "quotient": { "register": "AP", "offset": 3 }, + "remainder": { "register": "AP", "offset": 4 } + } + } + ] + ], + [ + 3758, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -34 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [3773, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 3854, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x17fc" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 3900, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0xcc6" }, + "rhs": { "Deref": { "register": "AP", "offset": -15 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [3912, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 3982, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 3998, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000000000000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 4002, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 4029, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 4033, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 4075, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -18 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [4087, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 4151, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x6c2" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 4192, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0xc62" }, + "rhs": { "Deref": { "register": "AP", "offset": -14 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [4204, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 4272, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x6c2" }, + "rhs": { "Deref": { "register": "FP", "offset": -6 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 4313, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x0" }, + "rhs": { "Deref": { "register": "AP", "offset": -14 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [4325, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [4405, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 4530, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x622" }, + "rhs": { "Deref": { "register": "FP", "offset": -7 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 4584, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 4588, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 4615, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 4619, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 4646, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 4650, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 4863, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x622" }, + "rhs": { "Deref": { "register": "FP", "offset": -7 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 4939, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 4943, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 5087, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 5091, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 5149, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 5153, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 5240, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000000000000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 5244, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 5271, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 5275, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 5711, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0xe7e" }, + "rhs": { "Deref": { "register": "FP", "offset": -8 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 5753, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 5757, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 5876, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x942" }, + "rhs": { "Deref": { "register": "FP", "offset": -7 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 5943, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x274c" }, + "rhs": { "Deref": { "register": "FP", "offset": -8 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 6040, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x17fc" }, + "rhs": { "Deref": { "register": "FP", "offset": -7 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [6122, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [6193, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 6297, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x622" }, + "rhs": { "Deref": { "register": "FP", "offset": -7 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 6400, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 6404, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 6431, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 6435, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 6747, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 6751, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 6845, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 6849, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 6920, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 6924, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 7051, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 7055, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 7115, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000000000000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 7119, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 7146, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 7150, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 7259, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 7263, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 7437, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000000000000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 7441, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 7468, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000000000000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 7472, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 7499, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 7503, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 7595, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 7599, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 7626, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 7630, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 7725, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "FP", "offset": 0 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 7729, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [7755, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 7862, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 7866, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 7893, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 7897, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 7990, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 7994, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 8032, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 8036, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 8159, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 8163, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 8221, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000000000000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 8225, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 8311, + [ + { + "TestLessThan": { + "lhs": { "Deref": { "register": "AP", "offset": -1 } }, + "rhs": { + "Immediate": "0x100000000000000000000000000000000000000000000000000000000000000" + }, + "dst": { "register": "AP", "offset": 4 } + } + } + ] + ], + [ + 8315, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": 3 } }, + "scalar": { "Immediate": "0x7000000000000110000000000000000" }, + "max_x": { "Immediate": "0xffffffffffffffffffffffffffffffff" }, + "x": { "register": "AP", "offset": -2 }, + "y": { "register": "AP", "offset": -1 } + } + } + ] + ], + [ + 8325, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -2 } }, + "scalar": { "Immediate": "0x1000000000000000000000000000000" }, + "max_x": { "Immediate": "0xffffffffffffffffffffffffffffffff" }, + "x": { "register": "AP", "offset": -1 }, + "y": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 8430, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x9" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 8434, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 8479, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 8483, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 8543, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000000000000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 8547, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 8574, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 8578, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 8683, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 8687, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 8714, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 8718, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [8793, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 8864, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000000000000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 8868, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 8895, + [ + { + "TestLessThan": { + "lhs": { "Deref": { "register": "AP", "offset": -1 } }, + "rhs": { "Immediate": "0x100000000000000000000000000000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 8897, + [ + { + "DivMod": { + "lhs": { "Deref": { "register": "AP", "offset": -2 } }, + "rhs": { "Immediate": "0x100000000000000000000000000000000" }, + "quotient": { "register": "AP", "offset": 3 }, + "remainder": { "register": "AP", "offset": 4 } + } + } + ] + ], + [ + 8987, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 8991, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [9192, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 9199, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x906" }, + "rhs": { "Deref": { "register": "FP", "offset": -8 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 9230, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 9234, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 9319, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "FP", "offset": 0 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 9323, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [9349, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 9450, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x6ea" }, + "rhs": { "Deref": { "register": "FP", "offset": -7 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 9500, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x906" }, + "rhs": { "Deref": { "register": "FP", "offset": -8 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 9531, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 9535, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 9620, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "FP", "offset": 0 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 9624, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [9650, [{ "AllocSegment": { "dst": { "register": "AP", "offset": 0 } } }]], + [ + 9757, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 9761, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 9788, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 9792, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 9819, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000000000000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 9823, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 9909, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0x906" }, + "rhs": { "Deref": { "register": "FP", "offset": -8 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 9940, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 9944, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 10027, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 10031, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 10058, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 10062, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 10089, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 10093, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 10196, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000000000000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 10200, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 10227, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 10231, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 10359, + [ + { + "TestLessThanOrEqual": { + "lhs": { "Immediate": "0xc26" }, + "rhs": { "Deref": { "register": "FP", "offset": -8 } }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 10390, + [ + { + "TestLessThan": { + "lhs": { "Deref": { "register": "AP", "offset": -1 } }, + "rhs": { "Immediate": "0x100000000000000000000000000000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 10392, + [ + { + "DivMod": { + "lhs": { "Deref": { "register": "AP", "offset": -2 } }, + "rhs": { "Immediate": "0x100000000000000000000000000000000" }, + "quotient": { "register": "AP", "offset": 3 }, + "remainder": { "register": "AP", "offset": 4 } + } + } + ] + ], + [ + 10422, + [ + { + "TestLessThan": { + "lhs": { "Deref": { "register": "AP", "offset": -1 } }, + "rhs": { "Immediate": "0x100000000000000000000000000000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 10424, + [ + { + "DivMod": { + "lhs": { "Deref": { "register": "AP", "offset": -2 } }, + "rhs": { "Immediate": "0x100000000000000000000000000000000" }, + "quotient": { "register": "AP", "offset": 3 }, + "remainder": { "register": "AP", "offset": 4 } + } + } + ] + ], + [ + 10543, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x100000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 10547, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ], + [ + 10605, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { "register": "AP", "offset": -1 }, + "b": { "Immediate": "0x0" } + } + }, + "rhs": { "Immediate": "0x10000000000000000" }, + "dst": { "register": "AP", "offset": 0 } + } + } + ] + ], + [ + 10609, + [ + { + "LinearSplit": { + "value": { "Deref": { "register": "AP", "offset": -1 } }, + "scalar": { "Immediate": "0x8000000000000110000000000000000" }, + "max_x": { "Immediate": "0xfffffffffffffffffffffffffffffffe" }, + "x": { "register": "AP", "offset": 0 }, + "y": { "register": "AP", "offset": 1 } + } + } + ] + ] + ], + "entry_points_by_type": { + "EXTERNAL": [ + { + "selector": "0x462b1b2d0b30d80be98c4aec16f07b72212bbef41ac45680ed94e954a6aa9", + "offset": 503, + "builtins": ["range_check"] + }, + { + "selector": "0x1feb29d0d6e8c4ba7a71db4cdaa24898ddd8bb350e724f844145997afee9c9", + "offset": 3260, + "builtins": ["range_check"] + }, + { + "selector": "0x78664aa9f94155a6e6acf3aa0add2ce6fcf36349488671af774d676363e0c7", + "offset": 191, + "builtins": ["range_check"] + }, + { + "selector": "0xc5c709a3ffed9c578aa6ee00ce77e78a490d2c8aa971d1f6ccdd662da6f17b", + "offset": 2565, + "builtins": ["range_check"] + }, + { + "selector": "0xe1eafdb08801cfc555a49e25dabfd7aa4ed7b2dd5c7e2c5a6930eac6d1b54c", + "offset": 3089, + "builtins": ["range_check"] + }, + { + "selector": "0x106f418ef7e2ea39027bcde47d5f0a54ed68fe34aa69b24c3a162def52a841b", + "offset": 2304, + "builtins": ["range_check"] + }, + { + "selector": "0x11e332cf3fdb4f58a72be710217fdd238834524d13dae1c6131f3206b7c329a", + "offset": 4151, + "builtins": ["range_check"] + }, + { + "selector": "0x11fdea672ded06956bdd64d89fd111661735e88595f88c1199f648fe3c2dd15", + "offset": 3357, + "builtins": ["range_check"] + }, + { + "selector": "0x126587e6b203b756642ff0bd9f92e84ef609cf2a02b516fbf2d94f36a73b83e", + "offset": 1215, + "builtins": ["range_check"] + }, + { + "selector": "0x1303ef00936936490ad20afec7fbe2bf74669665b2a2249945ff561debad733", + "offset": 1507, + "builtins": ["range_check"] + }, + { + "selector": "0x13d3b1aae5fa65a483db7c67c98dca6aac27353970caa114d112c4b6de8ec73", + "offset": 2042, + "builtins": ["range_check"] + }, + { + "selector": "0x145f0cd3e37db4233ce4d6b84935d9b32387d72eb53713e78e2ec56cc6fdf5d", + "offset": 2915, + "builtins": ["range_check"] + }, + { + "selector": "0x147c0b24e5bfb625956c5a44d3fc84d509b789bf2e5335365c03b9be2d757d3", + "offset": 2823, + "builtins": ["range_check"] + }, + { + "selector": "0x1785e0d94a5ba07a47865d69afdf914dad65466b25d38cb78cb741fac447ba8", + "offset": 3577, + "builtins": ["range_check"] + }, + { + "selector": "0x1c7564da2ac3c0ee05570d52004d51604c5315131cafd67610b2e629bf4fd7c", + "offset": 2435, + "builtins": ["range_check"] + }, + { + "selector": "0x1d39fadfe7e2621092d7d0a467672f0eb0ad03c5926829d40ceefa7bcd10b80", + "offset": 3690, + "builtins": ["range_check"] + }, + { + "selector": "0x1ff9f9a5d04b7955383039cae30cd6c0d1cb3c0e04a579f393a7ac9cf39c7b3", + "offset": 778, + "builtins": ["range_check"] + }, + { + "selector": "0x202cff97d5b709d201beabe103b284f8595094a25620c72dbbcb57d814d62fb", + "offset": 1361, + "builtins": ["range_check"] + }, + { + "selector": "0x208b88c80fabc1b03f3c78a09aaa1a693a5bb1366271a1c6b9e7971aa325116", + "offset": 3185, + "builtins": ["range_check"] + }, + { + "selector": "0x21b020335325fcef65a03b765adaefcc9fb4eccceb8e0293516736095e8cceb", + "offset": 335, + "builtins": ["range_check"] + }, + { + "selector": "0x242ba12536f9ac18cffcedd5588e2922a17c0f453a064a64e62df6d3f6f8dce", + "offset": 647, + "builtins": ["range_check"] + }, + { + "selector": "0x24793ea78a1f64b05c541f9e92f63fa2a71ddb3a23e9ff16aac9ed7d178fa66", + "offset": 1072, + "builtins": ["range_check"] + }, + { + "selector": "0x24ee851566f42b478860ca46d2543852ef11c919efc4e114db8829520728305", + "offset": 2679, + "builtins": ["range_check"] + }, + { + "selector": "0x265cf503e1b425e68026a65eb872306eb863eb6ba526cddc50fd44d00d8e180", + "offset": 0, + "builtins": ["range_check"] + }, + { + "selector": "0x284a2ddea630469ba82b6fbced35fa12c6504de7b50af7cda84bedbaae5e521", + "offset": 4272, + "builtins": ["range_check"] + }, + { + "selector": "0x29a68d48876fa0d864a616e212175e42824be1cdcb35bcd2e05b302042e491f", + "offset": 1671, + "builtins": ["range_check"] + }, + { + "selector": "0x2bf962c6ef0f8dddc516426e31a25831c882b7a1a5a47f2716a3d4403c5894c", + "offset": 3852, + "builtins": ["range_check"] + }, + { + "selector": "0x31c18e21d8e75a5f2f6f1330c56da1f8b2fd93568002ef0d15bcce9c5644c2b", + "offset": 1897, + "builtins": ["range_check"] + }, + { + "selector": "0x36d666ce4d4c894d5dcb35a06bb6ca9659358f5e9d7fe07519e7531ef44a6e2", + "offset": 3982, + "builtins": ["range_check"] + }, + { + "selector": "0x36e432757f2854d382b66d849ed9a3edf35fdbf55a7c83296142cf7b89b0573", + "offset": 2157, + "builtins": ["range_check"] + }, + { + "selector": "0x3bb1cf9f6b291f5c63c8ecbfcf8cd522642fdc7ec277c2fddb7dc069cd05ced", + "offset": 3480, + "builtins": ["range_check"] + }, + { + "selector": "0x3c694eba4d500b140694d8f7da3f85031f4d4827b57da58cb5f2bd1ab74e5ab", + "offset": 1784, + "builtins": ["range_check"] + }, + { + "selector": "0x3dbc7f289caba706d06644803f1db94983f3b8d8af334bfbf346aaa1b711d0c", + "offset": 959, + "builtins": ["range_check"] + } + ], + "L1_HANDLER": [], + "CONSTRUCTOR": [] + } +} diff --git a/__mocks__/cairo/cairo2120/enums_test_enums.sierra.json b/__mocks__/cairo/cairo2120/enums_test_enums.sierra.json new file mode 100644 index 000000000..95ab083cc --- /dev/null +++ b/__mocks__/cairo/cairo2120/enums_test_enums.sierra.json @@ -0,0 +1,6810 @@ +{ + "sierra_program": [ + "0x1", + "0x7", + "0x0", + "0x2", + "0xc", + "0x0", + "0x57c", + "0x284", + "0xaf", + "0x52616e6765436865636b", + "0x800000000000000100000000000000000000000000000000", + "0x426f78", + "0x800000000000000700000000000000000000000000000001", + "0x1", + "0x34", + "0x537472756374", + "0x800000000000000f00000000000000000000000000000001", + "0x0", + "0x16a4c8d7c05909052238a862d8cc3e7975bf05a07b3a69c6b28951083a6d672", + "0x753332", + "0x800000000000000700000000000000000000000000000000", + "0x753634", + "0x456e756d", + "0x800000000000000700000000000000000000000000000003", + "0x3fb357b5eb238b06277946b7f070edd26e0cee063892b4c4e567ab4ba82e64f", + "0x3", + "0x4", + "0x2ee1e2b1b89f8c495f200e4956278a4d47395fe262f27b52e5865c9524c08c3", + "0x3e51796447a0ee383cd378461ce43cdc4de99e073e134523aa1a50759251b79", + "0x5", + "0x6", + "0x4172726179", + "0x800000000000000300000000000000000000000000000001", + "0x800000000000000300000000000000000000000000000003", + "0x136d0900c2262223b2f503b689e160b3ee22f06de12b274968e5782c9afa5a2", + "0x8", + "0x1c", + "0x536e617073686f74", + "0xa", + "0x800000000000000700000000000000000000000000000002", + "0x1baeba72e79e9db2587cf44fedb2f3700b2075a5e8e39a562584862c4b71f62", + "0xb", + "0xc", + "0x9", + "0x2", + "0x116ac10601706a5b64d570e66fe38769be8ba393099acfc10c9ac928656a55d", + "0xd", + "0xe", + "0x800000000000000700000000000000000000000000000004", + "0x22b643b99f22c18dbd3f5a33597738df5429dac0f2504b5b6db1f5ed83a890c", + "0x10", + "0x11fafbc81ad3e4840b46ff967e3f76441ab2f339eb4001286e5fd1f7a64deab", + "0x11", + "0x80000000000000070000000000000000000000000000000a", + "0x35a614f038c856c9d7a6dd81133fa7a7d9280f9f22f552e3af2b5e11493272b", + "0x426f756e646564496e74", + "0x753136", + "0x15", + "0x34ba6bae0cf8d1255e30a917ff6107d46826b40196a72d0e7e40774c78e1308", + "0x16", + "0xea899504b4052c27cccf9971daead33001122c7badf30382a469a86d9f8143", + "0x18", + "0x19", + "0x38bd985835a9a53895c52b1878f7fea1ea86c6c36372a6554306b7deed44be6", + "0x1a", + "0x66656c74323532", + "0x556e696e697469616c697a6564", + "0x800000000000000200000000000000000000000000000001", + "0x2daa4fab7cd27a2ed3cc28ccfb3cfca70ad3c000028aa10db2f4783fcefd345", + "0x1e", + "0x20", + "0x120fbeae2508a96307cd9d3cd58ad37fd8f6a1ee44e75a9df62b5b86ba2ee2a", + "0x21", + "0x22", + "0x3590158452123707463380113690aa6c9c45f48ef55005fd27b035b47348988", + "0x23", + "0x370026b31ac236e06160ec5dd0d3f03ae6a16e3a80a7672d579c97014775824", + "0x26", + "0x32d2062143aba742e856373db8854bb12033d85fbe03e144a91067f9e4d52f3", + "0x27", + "0x4b", + "0x2a", + "0x2b", + "0x95", + "0x436f6e7374", + "0x800000000000000000000000000000000000000000000002", + "0x7", + "0x75313238", + "0x25e2ca4b84968c2d8b83ef476ca8549410346b00836ce79beaf538155990bb2", + "0x33", + "0x38b507bf259d96f5c53e8ab8f187781c3d096482729ec2d57f3366318a8502f", + "0x35", + "0x2f99b21e21b1ea68f77345d47bde74e1e6c34d34cf69c71cbefd71b887b142f", + "0x3c", + "0x3d", + "0x762af7d47e06fd1456367bdd600ec298e8ca9b72ada03929e234ae0a6974fa", + "0x3e", + "0x48", + "0x172b2d029d59f97d93dd24b7cc98c01ca8efd7bf422afd18e9041d6a1a5c170", + "0x41", + "0x42", + "0x30f87c80a9ff91f3ba0997da70c24279680d81f2429f998f2964b1a555ebb1a", + "0x43", + "0x4f7574206f6620676173", + "0x4661696c656420746f20646573657269616c697a6520706172616d202331", + "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", + "0x7538", + "0x2311b30ff91641e03086db219fbd3a339d658feb37d0c9ae93c065185b98998", + "0x3b9ddf97bd58cc7301a2107c3eabad82196f38221c880cd3645d07c3aac1422", + "0x10cb7ae6c8cdf83f18216c0ebb0b1f8cc2987483060d6cc4e803febe3144a49", + "0x49", + "0x3a", + "0x39", + "0x38", + "0x4a", + "0x18b15629396a92c8e73f47983561befa3685a537436ee3c1e3204f88eea8917", + "0x4c", + "0x23623e68c4d7be4a19e3239e653fa39cd9db5bbd5c090eae6f8150b8dc311da", + "0x4d", + "0x62797465733331", + "0xe896e7a7e3809dd3a09fe6fb92e01ffb20145934f9e10674e41a4dc9471605", + "0x4f", + "0xd99412735bde3dd7e4431599a4936b70b3e93e9ca18fe1cae8bef3fd6ace86", + "0x50", + "0x51", + "0x12ad4a46f1b3666169c1bd623edf28918b8314c531ae5dced26d2ef25cc6a88", + "0x52", + "0x3be6f13b1eeea8f6d4a3f8f94ff73e9fcdb11e0fc6bbda219a39d7ee87174b2", + "0x39f4bddbd30d58053c5c0e4cf215fd40c2ff6254027e1ca82d99dfb9352890f", + "0x55", + "0xee6bdef6928642145ee888437aa85c8de49c7818f4182a14a2a976e754de1", + "0x29f6621519cd76912cfece1d674f3b588713e5ed5f584eaae76037bcf225363", + "0x2b87e8e624ece2f0cf85d181387988b18f6983045a9920dc64764db7b704649", + "0x58", + "0x800000000000000700000000000000000000000000000005", + "0x1ca0859cc72336b50627b89194f06980da93ce94909d112cdc3a765a051f732", + "0x5a", + "0x25f9ad655d525bf79405d9b98957b3aa16d86a2669a7252030de6dd582fce7a", + "0x5b", + "0x336711c2797eda3aaf8c07c5cf7b92162501924a7090b25482d45dd3a24ddce", + "0x5d", + "0x2299982bf733771210a7b4e01be8e699d9c778cc43743de9c81adc233d0c388", + "0x5e", + "0x511591274d8813cc87dcfdf4098a0f02d4d964e5252715695c7682ef8ed20c", + "0x5f", + "0x60", + "0x1363576206b17df7adacad7f47f20a0558a0e854432cf721f96cbbba837bf12", + "0x61", + "0x33cff8ca50b98f40b2384a9deb3aa0ab15aaf36318ded0ef9476dabf49bcf59", + "0x63", + "0x3f17eacf0c93d1c0968ec9606d65005de0d0f783350ed6e8fb034f4e616c4ac", + "0x64", + "0x3f88fb1329d0c686ba50f926ff79af1c2a252a3594ae051c810b5f9492092f5", + "0xc3ca175aa1161f5f8990fd287efc42d31a161e1c88dd5023cc11411ad9900e", + "0x66", + "0x21d0c426e745a80b1d24c9a0ec7c81dda7f2cedffbabc0aff033502da6318a8", + "0x39a49016b474fb3467c8897c9d95adb572fb22c109b9c347e99e2b2628a6964", + "0x68", + "0x69", + "0x24dc0465903d1c8757b6cfb4633b582f88a9d558c8c57c4f8ddd950c299c134", + "0x6a", + "0x272f6df0a5a47be47433e7300dbb5e90319ca2166288be35db1953ea4207953", + "0x21c91a6948c444aa3a421cc79bfe733affa309ec645268ee0c2ad9c3cf184de", + "0x6c", + "0x19b9ae4ba181a54f9e7af894a81b44a60aea4c9803939708d6cc212759ee94c", + "0x3bc34212d2c42e27596fdda5c1c673422d928dc4f40e1de8c35217d1981d935", + "0x6e", + "0x351e72f2e3f133f52891974fa3d211b3e579625b5b15c8d1d0c9db2a1a7d407", + "0x6f", + "0x35b26fd36f40720f06990724c28a5d888642e82c23b388420091777a9116b14", + "0xb421937e7950e3d75405b25a18ee821a663b39dd8b4d0e442095780f90f986", + "0x71", + "0x178d6d12f3b1afb72a326e7a35eaad41bcdbd002be501b5e1e9b1b79a05dbf3", + "0x72", + "0x3d020cc8ad67767402690d2175f46e5a6c4bdfeffd34713354e19f97b494da0", + "0x75", + "0x88925dd451d220784df2998389085d5ae6b56c2d22d1d8e151ec9c2e0cd25", + "0x77", + "0xb72e72e5a63caf9f10f3902eec9557b15660c00d245f7c5ae7157423fff53c", + "0x78", + "0x325d56ed86ca2c3a275a749ddb80c013c5d9851885ab349d2ad8510170b42d9", + "0x7b", + "0x7a", + "0x185d9b297d752b92e36e7514f2af6ce91e23bd34be2b075b970d46b0f9a3d23", + "0x7c", + "0x18c63d3eac6cdb8f2492ed432412542dce6b4ae731500e7570a41938aa68948", + "0x7e", + "0x18881bb414cda2bb967493bb34bf6902e0f92d7dcdc5ed5c30dc67c9a90fcff", + "0x80", + "0x19f021de67a29d8733a584446c0a0c78f9c6bce2583e229f9a4bccd8d724d72", + "0x82", + "0x22493ed12362cd6b4b118733fccc20ee3faf6d6546367fcd35d931dc90833e3", + "0x83", + "0x153753017267be18101667c301bd9c1bad154a1788f792a6865df0f46131f54", + "0x35c4b06e7eeef8e35750bbd3a86dc0e7f78139f47cad7d41d8b3f0c7b800543", + "0x86", + "0x2a3099fc1fa1ba82867769f236e219f5d4e17abbab18f492c0ebf05c8217197", + "0x87", + "0x89", + "0x3fe244a46c1456c4718ef097f5cdd18149ca294c5bdffdd22b7e6f9540cf113", + "0x8a", + "0x3e914fa4847734da785313048196c36310337c36df9be4ce4ff971d838f07c1", + "0x8c", + "0x3850676e95044bcafdab66d09d52fbdc6c05024f661372f2c15e33951a241de", + "0x8d", + "0x5e8142f349aa7f4d94e6434e7c37d42fc4a378139b2e853552e298defd4f94", + "0x8f", + "0x1056d8bd785d4e4840b7cb8bc486a78c787357ed6cfbe2ceb0d28ff7f821a93", + "0x90", + "0x3a6cffe2561983a3685045e4600085227508651a8efcafe6a1bc1f70802e054", + "0x2ae68393e5819b8dee9845b8c1ec8dbedfba9bbd68e7253e8f59d867460c0dc", + "0x92", + "0x141d61b4bf9a6647000e805a7f949d847cbe9ca009321b7a63424d9742a8912", + "0x1df5abf484ff46fcefc4c239b5c351ce9c47777b7e1f26b505f9e9bc5823115", + "0x154df121ec994a15880fd221c3fbaacd125f6c4807302f13f9a52cf62f5ce4e", + "0x33c2f5a7e0fffa93f1a29733d5927eb7ad69162f4de1c4fa05018aba200144e", + "0x96", + "0x183950d5e3273ec891c75fa886c8de01eadccb5ff4ca417397ccb80471b8bea", + "0x9a", + "0x15c0a3cc422e9cead14b117474a7e040bc249953f092f790d2238c03d2d4a0b", + "0x9b", + "0x107c4c114adf6d3b44474301d2cdc063e750f40c4d85ae2bcb9d2c5609cf970", + "0x74584e9f10ffb1a40aa5a3582e203f6758defc4a497d1a2d5a89f274a320e9", + "0x9e", + "0x34c1a4ee6ef3ec231b7e21635f0ab0f5e73f747e42beb02d65fc54c8e0e0575", + "0xa0", + "0x7613c7135b064a210243c4d523d64a3e8bb1803abc97c950d43a9c0340ac10", + "0xa3", + "0x47d50ab84c14028e58f88d9f15b2547ac4d9e3ddb79a76ff9dbd8f98b6374", + "0xa4", + "0x4275696c74696e436f737473", + "0x53797374656d", + "0x9931c641b913035ae674b400b61a51476d506bbe8bba2ff8a6272790aba9e6", + "0xa6", + "0x4e6f6e5a65726f", + "0x4761734275696c74696e", + "0x272", + "0x7265766f6b655f61705f747261636b696e67", + "0x77697468647261775f676173", + "0x6272616e63685f616c69676e", + "0x7374727563745f6465636f6e737472756374", + "0x61727261795f736e617073686f745f706f705f66726f6e74", + "0x756e626f78", + "0x72656e616d65", + "0x73746f72655f74656d70", + "0x647570", + "0x66656c743235325f69735f7a65726f", + "0x64726f70", + "0x7531365f7472795f66726f6d5f66656c74323532", + "0x72656465706f7369745f676173", + "0x656e756d5f696e6974", + "0xae", + "0x6a756d70", + "0xac", + "0x636f6e73745f61735f696d6d656469617465", + "0xab", + "0x66656c743235325f737562", + "0x7374727563745f636f6e737472756374", + "0xad", + "0x66756e6374696f6e5f63616c6c", + "0xaa", + "0xa9", + "0x6765745f6275696c74696e5f636f737473", + "0xa8", + "0x77697468647261775f6761735f616c6c", + "0x61727261795f6e6577", + "0x736e617073686f745f74616b65", + "0x656e61626c655f61705f747261636b696e67", + "0x656e756d5f6d61746368", + "0x7531365f746f5f66656c74323532", + "0xa7", + "0x61727261795f617070656e64", + "0x64697361626c655f61705f747261636b696e67", + "0x24", + "0xa5", + "0x656e756d5f736e617073686f745f6d61746368", + "0x61727261795f6c656e", + "0x7533325f746f5f66656c74323532", + "0xa1", + "0x25", + "0x9f", + "0x9d", + "0x9c", + "0x7374727563745f736e617073686f745f6465636f6e737472756374", + "0x28", + "0x29", + "0x97", + "0x94", + "0x75385f746f5f66656c74323532", + "0x93", + "0x7536345f746f5f66656c74323532", + "0x2c", + "0x91", + "0x2d", + "0x2e", + "0x8e", + "0x8b", + "0x2f", + "0x30", + "0x88", + "0x85", + "0x31", + "0x32", + "0x84", + "0x7f", + "0x7d", + "0x79", + "0x36", + "0x73", + "0x37", + "0x70", + "0x6d", + "0x6b", + "0x7536345f7472795f66726f6d5f66656c74323532", + "0x7533325f7472795f66726f6d5f66656c74323532", + "0x67", + "0x3b", + "0x65", + "0x62", + "0x5c", + "0x59", + "0x75313238735f66726f6d5f66656c74323532", + "0x3f", + "0x57", + "0x56", + "0x753132385f746f5f66656c74323532", + "0x616c6c6f635f6c6f63616c", + "0x66696e616c697a655f6c6f63616c73", + "0x40", + "0x53", + "0x73746f72655f6c6f63616c", + "0x627974657333315f746f5f66656c74323532", + "0x54", + "0x4e", + "0x47", + "0x46", + "0x45", + "0x44", + "0x75385f7472795f66726f6d5f66656c74323532", + "0x1f", + "0x1b", + "0x1d", + "0x17", + "0x627974657333315f7472795f66726f6d5f66656c74323532", + "0x646f776e63617374", + "0x14", + "0x656e756d5f66726f6d5f626f756e6465645f696e74", + "0x13", + "0x12", + "0xf", + "0x1cc1", + "0xffffffffffffffff", + "0xfe", + "0xf7", + "0xed", + "0xe7", + "0xd4", + "0xcd", + "0xdd", + "0x103", + "0x18f", + "0x183", + "0x12c", + "0x125", + "0x13a", + "0x188", + "0x17c", + "0x146", + "0x176", + "0x163", + "0x16b", + "0x194", + "0x20b", + "0x204", + "0x1fa", + "0x1b4", + "0x1f4", + "0x1e1", + "0x1da", + "0x1ea", + "0x210", + "0x268", + "0x22c", + "0x262", + "0x24d", + "0x247", + "0x257", + "0x252", + "0x277", + "0x30c", + "0x300", + "0x2a0", + "0x299", + "0x2ae", + "0x305", + "0x2f9", + "0x2ba", + "0x2f3", + "0x2e0", + "0x2d5", + "0x2e8", + "0x311", + "0x36e", + "0x364", + "0x32d", + "0x35e", + "0x34b", + "0x74", + "0x76", + "0x353", + "0x373", + "0x3e0", + "0x3d9", + "0x3cf", + "0x393", + "0x3c9", + "0x3b6", + "0x3af", + "0x3bf", + "0x3e5", + "0x458", + "0x44c", + "0x81", + "0x445", + "0x43e", + "0x40e", + "0x438", + "0x431", + "0x45d", + "0x451", + "0x4d0", + "0x4c4", + "0x4bd", + "0x4b6", + "0x486", + "0x4b0", + "0x98", + "0x99", + "0x4a9", + "0x4d5", + "0x4c9", + "0x545", + "0x537", + "0x503", + "0x4fd", + "0x4f7", + "0x50e", + "0x53c", + "0x530", + "0x519", + "0x52b", + "0x54a", + "0x53e", + "0x5a7", + "0x59d", + "0x566", + "0x597", + "0x584", + "0x58c", + "0x5ac", + "0x603", + "0x5f9", + "0x5c8", + "0x5f3", + "0x5de", + "0x5e8", + "0x608", + "0x686", + "0x67f", + "0x675", + "0x628", + "0x66f", + "0xa2", + "0x646", + "0x659", + "0x668", + "0x68b", + "0x6ed", + "0x6e3", + "0x6a7", + "0x6dd", + "0x6c4", + "0x6d2", + "0x6f2", + "0x778", + "0xb0", + "0xb1", + "0x771", + "0xb2", + "0xb3", + "0x767", + "0x712", + "0xb4", + "0x761", + "0xb5", + "0xb6", + "0x734", + "0x74b", + "0xb7", + "0x75a", + "0x77d", + "0x7e4", + "0xb8", + "0xb9", + "0x7da", + "0x799", + "0xba", + "0x7d4", + "0xbb", + "0xbc", + "0x7bf", + "0x7b4", + "0x7c9", + "0x7e9", + "0x84e", + "0xbd", + "0xbe", + "0x844", + "0x805", + "0xbf", + "0x83e", + "0xc0", + "0xc1", + "0x81b", + "0x833", + "0xc2", + "0x82b", + "0x853", + "0x8b2", + "0xc3", + "0xc4", + "0x8a8", + "0x86f", + "0xc5", + "0x8a2", + "0xc6", + "0xc7", + "0x885", + "0x897", + "0x8b7", + "0x926", + "0xc8", + "0xc9", + "0x91f", + "0xca", + "0xcb", + "0x915", + "0x8d7", + "0xcc", + "0x90f", + "0xce", + "0x8ed", + "0x8fe", + "0x908", + "0x92b", + "0x968", + "0x95e", + "0x947", + "0x959", + "0x96d", + "0x9dd", + "0x9d1", + "0xcf", + "0x9cb", + "0x9c4", + "0xd0", + "0x9bd", + "0x995", + "0x9b6", + "0xd1", + "0xd2", + "0xd3", + "0x9e2", + "0x9d6", + "0xa35", + "0xd5", + "0xd6", + "0xa2b", + "0x9fe", + "0xd7", + "0xa25", + "0xd8", + "0xd9", + "0xda", + "0xa3a", + "0xa67", + "0xa50", + "0xa62", + "0xa6c", + "0xac1", + "0xdb", + "0xdc", + "0xab7", + "0xa88", + "0xab1", + "0xde", + "0xdf", + "0xe0", + "0xe1", + "0xe2", + "0xac6", + "0xb31", + "0xe3", + "0xe4", + "0xb2a", + "0xe5", + "0xe6", + "0xb20", + "0xae6", + "0xb1a", + "0xe8", + "0xe9", + "0xea", + "0xeb", + "0xec", + "0xee", + "0xb13", + "0xb36", + "0xb8b", + "0xef", + "0xf0", + "0xb81", + "0xb52", + "0xf1", + "0xb7b", + "0xf2", + "0xf3", + "0xf4", + "0xf5", + "0xf6", + "0xb90", + "0xbed", + "0xf8", + "0xbe3", + "0xbac", + "0xf9", + "0xbdd", + "0xfa", + "0xfb", + "0xfc", + "0xfd", + "0xbca", + "0xbd2", + "0xbf2", + "0xc72", + "0xc64", + "0xff", + "0xc5c", + "0x100", + "0x101", + "0xc54", + "0xc18", + "0x102", + "0xc4d", + "0x104", + "0x105", + "0x106", + "0x107", + "0x108", + "0x109", + "0x10a", + "0x10b", + "0x10c", + "0xc38", + "0xc42", + "0xc77", + "0xc6b", + "0xc69", + "0x10d", + "0x10e", + "0xce0", + "0x10f", + "0x110", + "0xcd8", + "0x111", + "0x112", + "0xccd", + "0x113", + "0xc9a", + "0x114", + "0xcc7", + "0x115", + "0x116", + "0x117", + "0x118", + "0xcbf", + "0x119", + "0x11a", + "0x11b", + "0xce6", + "0x11c", + "0xd43", + "0xd37", + "0xd31", + "0xd2b", + "0xd25", + "0xd0e", + "0xd20", + "0xd48", + "0xd3c", + "0xda3", + "0x11d", + "0x11e", + "0xd9c", + "0x11f", + "0xd92", + "0xd68", + "0xd8c", + "0x120", + "0xd85", + "0xda8", + "0xdf0", + "0xde9", + "0xddf", + "0xdc8", + "0xdda", + "0xdf5", + "0x121", + "0x122", + "0x123", + "0x124", + "0xe67", + "0xe4a", + "0xe3b", + "0x126", + "0x127", + "0x128", + "0xe35", + "0x129", + "0x12a", + "0xe2e", + "0x12b", + "0x12d", + "0x12e", + "0x12f", + "0x130", + "0xe43", + "0x131", + "0x132", + "0xe5c", + "0x133", + "0xe8f", + "0x134", + "0x135", + "0xe85", + "0x136", + "0x137", + "0x138", + "0x139", + "0x13b", + "0x13c", + "0xed1", + "0xecd", + "0xec8", + "0xec3", + "0xebd", + "0xeb7", + "0x13d", + "0xed4", + "0xf22", + "0xf06", + "0x13e", + "0x13f", + "0xf00", + "0x140", + "0x141", + "0xef7", + "0x142", + "0x143", + "0x144", + "0x145", + "0x147", + "0x148", + "0xf17", + "0x149", + "0xf4a", + "0x14a", + "0xf40", + "0x14b", + "0x14c", + "0xfb1", + "0xf9a", + "0xf94", + "0xf7f", + "0xf7b", + "0xf77", + "0x14d", + "0x14e", + "0x14f", + "0xf97", + "0xf8f", + "0xfb4", + "0x150", + "0xfa9", + "0x151", + "0x152", + "0x1001", + "0xfda", + "0xfd6", + "0x153", + "0xfd2", + "0x154", + "0x1004", + "0xff8", + "0xff4", + "0xff0", + "0x155", + "0x1054", + "0x103d", + "0x1039", + "0x1035", + "0x1030", + "0x102b", + "0x156", + "0x157", + "0x158", + "0x1057", + "0x104c", + "0x159", + "0x15a", + "0x10a5", + "0x1089", + "0x1083", + "0x107a", + "0x15b", + "0x15c", + "0x15d", + "0x15e", + "0x15f", + "0x160", + "0x161", + "0x109a", + "0x162", + "0x10bd", + "0x10d0", + "0x10f8", + "0x1107", + "0x111a", + "0x1129", + "0x1144", + "0x1161", + "0x1169", + "0x164", + "0x165", + "0x10e4", + "0x10ed", + "0x166", + "0x10f5", + "0x167", + "0x168", + "0x169", + "0x16a", + "0x16c", + "0x16d", + "0x16e", + "0x16f", + "0x170", + "0x171", + "0x172", + "0x173", + "0x1139", + "0x1141", + "0x174", + "0x175", + "0x1154", + "0x115e", + "0x11df", + "0x117f", + "0x177", + "0x178", + "0x179", + "0x17a", + "0x11cc", + "0x11aa", + "0x11a2", + "0x119a", + "0x11b8", + "0x11d3", + "0x11c3", + "0x17b", + "0x11d6", + "0x17d", + "0x1218", + "0x17e", + "0x17f", + "0x120e", + "0x180", + "0x11ff", + "0x1207", + "0x181", + "0x182", + "0x1259", + "0x1230", + "0x184", + "0x185", + "0x186", + "0x1251", + "0x1246", + "0x187", + "0x189", + "0x18a", + "0x1290", + "0x18b", + "0x18c", + "0x1285", + "0x18d", + "0x18e", + "0x127e", + "0x190", + "0x191", + "0x1320", + "0x12d6", + "0x12cd", + "0x12c7", + "0x12c0", + "0x192", + "0x193", + "0x195", + "0x196", + "0x130d", + "0x197", + "0x1314", + "0x1305", + "0x198", + "0x199", + "0x19a", + "0x19b", + "0x12ff", + "0x19c", + "0x19d", + "0x12f8", + "0x19e", + "0x19f", + "0x1348", + "0x1a0", + "0x1a1", + "0x133e", + "0x1a2", + "0x1a3", + "0x1a4", + "0x13aa", + "0x1a5", + "0x1370", + "0x136a", + "0x1a6", + "0x1a7", + "0x1a8", + "0x1a9", + "0x13a1", + "0x139d", + "0x1399", + "0x1394", + "0x138f", + "0x1aa", + "0x1ab", + "0x13ad", + "0x1414", + "0x13dd", + "0x13d7", + "0x13d0", + "0x1ac", + "0x1ad", + "0x1ae", + "0x1af", + "0x1b0", + "0x13fc", + "0x1b1", + "0x1409", + "0x1b2", + "0x1b3", + "0x1403", + "0x1b5", + "0x13f6", + "0x1b6", + "0x1b7", + "0x1465", + "0x143e", + "0x1438", + "0x1b8", + "0x1b9", + "0x1ba", + "0x1bb", + "0x145c", + "0x1458", + "0x1454", + "0x1bc", + "0x1468", + "0x14db", + "0x148e", + "0x148a", + "0x1486", + "0x1bd", + "0x1be", + "0x1bf", + "0x14de", + "0x14d2", + "0x14cc", + "0x14b7", + "0x14b3", + "0x14af", + "0x1c0", + "0x1c1", + "0x14cf", + "0x14c7", + "0x1c2", + "0x1c3", + "0x153e", + "0x1504", + "0x1500", + "0x14fc", + "0x1c4", + "0x1c5", + "0x1c6", + "0x1541", + "0x1535", + "0x1531", + "0x152d", + "0x1528", + "0x1523", + "0x1c7", + "0x1c8", + "0x15a3", + "0x156f", + "0x1569", + "0x1563", + "0x1c9", + "0x1ca", + "0x1cb", + "0x1cc", + "0x1cd", + "0x15a8", + "0x1598", + "0x1592", + "0x1589", + "0x1ce", + "0x1cf", + "0x1d0", + "0x15eb", + "0x15e7", + "0x15e2", + "0x15dd", + "0x15d7", + "0x15d1", + "0x1d1", + "0x1d2", + "0x1d3", + "0x15ee", + "0x1d4", + "0x1629", + "0x1625", + "0x161e", + "0x1619", + "0x1d5", + "0x1d6", + "0x1611", + "0x1d7", + "0x1d8", + "0x1d9", + "0x1db", + "0x1dc", + "0x162c", + "0x1622", + "0x1dd", + "0x1de", + "0x167f", + "0x1df", + "0x1679", + "0x1669", + "0x1e0", + "0x1e2", + "0x1e3", + "0x1662", + "0x1e4", + "0x1e5", + "0x165a", + "0x1e6", + "0x1e7", + "0x1e8", + "0x1e9", + "0x1eb", + "0x1ec", + "0x1672", + "0x1ed", + "0x1ee", + "0x1685", + "0x1ef", + "0x16c4", + "0x16c0", + "0x16b9", + "0x16b4", + "0x1f0", + "0x1f1", + "0x16ac", + "0x1f2", + "0x1f3", + "0x1f5", + "0x1f6", + "0x16c7", + "0x16bd", + "0x1f7", + "0x1719", + "0x1715", + "0x170e", + "0x16f8", + "0x16f3", + "0x16ee", + "0x1f8", + "0x1f9", + "0x1fb", + "0x1712", + "0x1708", + "0x1fc", + "0x171c", + "0x1fd", + "0x1769", + "0x1742", + "0x173e", + "0x173a", + "0x1fe", + "0x1ff", + "0x200", + "0x176c", + "0x1760", + "0x175c", + "0x1758", + "0x201", + "0x202", + "0x17ac", + "0x17a3", + "0x1794", + "0x203", + "0x178d", + "0x205", + "0x206", + "0x207", + "0x208", + "0x179a", + "0x209", + "0x20a", + "0x195a", + "0x194f", + "0x20c", + "0x20d", + "0x20e", + "0x17e1", + "0x1818", + "0x1830", + "0x1867", + "0x189d", + "0x18d6", + "0x1924", + "0x1942", + "0x17db", + "0x17d5", + "0x20f", + "0x211", + "0x212", + "0x195f", + "0x1812", + "0x180c", + "0x1805", + "0x17fe", + "0x213", + "0x214", + "0x215", + "0x1829", + "0x216", + "0x193b", + "0x1861", + "0x185b", + "0x1854", + "0x184d", + "0x217", + "0x218", + "0x1894", + "0x219", + "0x21a", + "0x21b", + "0x21c", + "0x188e", + "0x21d", + "0x21e", + "0x1887", + "0x21f", + "0x220", + "0x221", + "0x222", + "0x223", + "0x18d0", + "0x18ca", + "0x18c3", + "0x18ba", + "0x224", + "0x225", + "0x191b", + "0x1901", + "0x18fb", + "0x18f5", + "0x226", + "0x1920", + "0x1914", + "0x227", + "0x228", + "0x1935", + "0x229", + "0x22a", + "0x22b", + "0x22d", + "0x19ab", + "0x197d", + "0x22e", + "0x22f", + "0x230", + "0x199b", + "0x1993", + "0x231", + "0x232", + "0x19a2", + "0x233", + "0x1a00", + "0x19fa", + "0x19eb", + "0x19e4", + "0x19db", + "0x234", + "0x235", + "0x236", + "0x237", + "0x19f1", + "0x238", + "0x1a06", + "0x1a34", + "0x239", + "0x1a2a", + "0x23a", + "0x23b", + "0x23c", + "0x23d", + "0x23e", + "0x23f", + "0x1a7a", + "0x1a4c", + "0x240", + "0x241", + "0x242", + "0x243", + "0x1a6a", + "0x1a62", + "0x244", + "0x245", + "0x1a71", + "0x246", + "0x1acf", + "0x1ac9", + "0x1aba", + "0x1ab3", + "0x1aaa", + "0x248", + "0x249", + "0x24a", + "0x24b", + "0x24c", + "0x1ac0", + "0x24e", + "0x1ad5", + "0x1b17", + "0x1b13", + "0x1b0e", + "0x1b09", + "0x1b03", + "0x1afd", + "0x24f", + "0x250", + "0x251", + "0x1b1a", + "0x1b5c", + "0x1b2e", + "0x253", + "0x254", + "0x255", + "0x256", + "0x1b4c", + "0x1b44", + "0x1b53", + "0x258", + "0x259", + "0x1b9f", + "0x1b9b", + "0x1b96", + "0x1b91", + "0x1b8b", + "0x1b85", + "0x25a", + "0x25b", + "0x25c", + "0x1ba2", + "0x25d", + "0x1c02", + "0x1bdb", + "0x1bd7", + "0x1bd3", + "0x1bce", + "0x1bc9", + "0x25e", + "0x25f", + "0x260", + "0x261", + "0x1c05", + "0x1bec", + "0x1bfa", + "0x263", + "0x264", + "0x1c67", + "0x1c19", + "0x265", + "0x266", + "0x267", + "0x1c57", + "0x1c4d", + "0x1c44", + "0x1c39", + "0x269", + "0x26a", + "0x1c5e", + "0x26b", + "0x26c", + "0x1cb9", + "0x1c92", + "0x1c8e", + "0x1c8a", + "0x26d", + "0x26e", + "0x26f", + "0x1cbc", + "0x1cb0", + "0x1cac", + "0x1ca8", + "0x270", + "0x271", + "0x27e", + "0x318", + "0x37a", + "0x3ec", + "0x464", + "0x4dc", + "0x551", + "0x5b3", + "0x60f", + "0x692", + "0x6f9", + "0x784", + "0x7f0", + "0x85a", + "0x8be", + "0x932", + "0x974", + "0x9e9", + "0xa41", + "0xa73", + "0xacd", + "0xb3d", + "0xb97", + "0xbf9", + "0xc7e", + "0xced", + "0xd4f", + "0xdaf", + "0xdfc", + "0xe00", + "0xe04", + "0xe08", + "0xe72", + "0xe98", + "0xed9", + "0xf2d", + "0xf53", + "0xfb9", + "0x1009", + "0x105c", + "0x10b0", + "0x1170", + "0x11e9", + "0x1221", + "0x1263", + "0x129a", + "0x132b", + "0x1351", + "0x13b2", + "0x141f", + "0x146d", + "0x14e3", + "0x1546", + "0x15b1", + "0x15f3", + "0x1631", + "0x168e", + "0x16cc", + "0x1721", + "0x1771", + "0x17b2", + "0x1968", + "0x196e", + "0x19b5", + "0x1a0f", + "0x1a3d", + "0x1a84", + "0x1ade", + "0x1b1f", + "0x1b66", + "0x1ba7", + "0x1c0a", + "0x1c71", + "0xf327", + "0x281100a0400480f01c0300680c0160280480800e0180280400600800800", + "0x281a0120640700600a0600b81600a0540281401203c0701301202003812", + "0x28130120640382100a0800481f00e0780280403a0700281802e0580281b", + "0x480f00e09c0282600a0940481901c0780282400a04c0481900e08c02822", + "0x282c00a0ac0480f01c0580281600a0a8028290120a00701100a04802813", + "0x281600a0580281600a0580281600a0580281600a0580282e0120b407016", + "0x480f01c0c40283100a0c4028130120a00380c06006c1200904807c17816", + "0x28130120640381600a0d4028340120640701100a0600b81600a0cc02832", + "0x28130120a00381c00a0ec1d00c07209c0283800a0dc0481901c0d802822", + "0x28130120640383100a0600b81600a0f40283c01203c0701200a04402831", + "0x481901c1040282200a04c0481900e0580284000a0fc0481901c0f802831", + "0x28130120640381600a0f8028440120640703100a0100182700a10c02842", + "0x280403a1200281802e1200280400609c0284700a1180481901c11402822", + "0x2604e0480700284d09806c1201c00a1342604b00a0100184a00a0ec1d049", + "0x480f00e030278120480700284d0980541201c00a134260160480700284d", + "0x38240480700284d0980441201c00a1342601b00a0100e85100a14402850", + "0x181100a0440281301203c0385300a1480481f00e1440281200a04c0480f", + "0x481900e0580285500a1500481901c0d40281100a04c0481900e04402804", + "0x705900a0600b85900a0100182700a160028570120640705600a08802813", + "0x285e00a1740481901c1700282200a04c0481900e0580285b00a16804819", + "0x380c0c41841201c00a134260600480700284d09817c1201c00a13426027", + "0x285900a1940482d01c0580285900a1900480f01c0440281200a18c0480f", + "0x284800a1ac0480f01c0580281500a1a80286900a1a00286700a0b002866", + "0x480f00e0303782700a1b80286d0120640706c00a0880281301203c03816", + "0x707400a0880281301203c0381600a1cc0287201203c0707100a12002870", + "0x480f00e0480285900a1dc0480f01c1cc0283b07409c0287600a1d404819", + "0x706a00a0440287b01203c0381600a1e40287a01203c0707900a14402878", + "0x480f00e0c40283100a0c40283100a04c0487e00e0580287d00a1f00480f", + "0x288301207c0383500a0100e81600a2080288101203c0708000a0c40287f", + "0x281301203c0381600a2200288701203c0708600a0c40288501203c03884", + "0x281100a0c40285900a04c0487e00e09c0288b00a2280481901c22402822", + "0x289001203c0381600a23c0288e01203c0708d00a0c40288c01203c03812", + "0x480f01c1200285900a24c0480f01c0580289200a2440480f01c19802812", + "0x702700a260028970120640709600a0880281301203c0381600a25402894", + "0x281100a2700480f01c0580289b00a2680480f01c1980285900a2640480f", + "0x28a101203c0701600a2800289f01203c0709e00a1640289d01203c07016", + "0x280403a058028a500a2900480f01c044028a300a2880480f01c0c402859", + "0x381600a29c028a8012064070a700a0100e84000a154028a601206407040", + "0x283100a04c0480f00e09c028ab00a2a80481901c2a40282200a04c04819", + "0x480f01c2b8028ad00a2b00480f01c0440281100a044028130120a003831", + "0x285b00a2cc0481901c2c8028b101207c0383e00a0100e81600a2c0028af", + "0x70b600a088028130120640381600a2d0028b5012064070b400a0100e83e", + "0x381600a124028ba0120640704a00a2e40481f00e09c028b800a2dc04819", + "0x280403a12c0281802e09c028bd00a2f00481901c2ec0282200a04c04819", + "0x282200a04c0481900e058028be00a3040481901c300028bf01207c038be", + "0x281301203c0381600a1b0028c501203c0702700a310028c3012064070c2", + "0x480f01c0580286600a3240480f01c09c028c800a31c0481901c31802822", + "0x701600a0c4028cd01203c0701600a28c028cc01203c0701600a32c028ca", + "0x280403a1540280403a058028d000a33c0480f01c0580284b00a3380480f", + "0x28d3012064070d200a088028130120640381600a158028d101206407056", + "0x481901c0580281e00a04c0481900e058028ad00a3540480f01c09c028d4", + "0x481901c1700280403a364028d801207c0385b00a0100e82700a35c028d6", + "0x382700a374028dc012064070db00a088028130120640381600a170028da", + "0x28e100a3800481901c0086f80c1bc0241201c00a1342602200a04c0481f", + "0x48e6012394720021c607002804006070028041c40141201c00a13426027", + "0xe00500a3b00e00500a3ac0e00500a3a80e00500a3a41100500a3a0048e7", + "0x258050483c8048f10123c01080500a3b00e00500a3bc048ee038014028ed", + "0x28ef042014028ef0123d02580500a3b07980500a3b00480500a3b004824", + "0x7d00500a3bc02824096014120f202c014028f90123e07b80500a3d87a805", + "0x7e00500a3b07e80500a3b0028241f8014120f2080044028fb096014028ef", + "0x2580500a4100490309601402902038014029010124007f80500a3b0048fe", + "0xb00500a3bc0f00500a3b00e00500a41c8300500a3d804905062014028eb", + "0x7e0050483c87080500a3e41100500a3e40f00500a3bc0f00500a40804908", + "0x2181100a3ec1100500a3bc2081100a3ec7980500a3ac0480500a3ac04824", + "0x28ef1b6014029041ba014028e821401402904212044028fb044014028ec", + "0x28f90124342c80500a4306c80500a3b42e00500a42c2e00500a4082e005", + "0x2281100a3ec6b80500a3a08800500a4108781100a3ec8700500a3b087005", + "0x28ef00a090888050483c88880500a3b004824222014120f222201402904", + "0x8900500a4102381100a3ec0880500a3ac5680500a3a08880500a40888805", + "0x29130ac0140290b0ac014029020ac014028ef1a4014029041a8014028e8", + "0x8a01100a3ec4300500a3b04300500a3e40880500a4304200500a3b42a805", + "0x28fb1a0014029041a0014029021a0014028ef22c0140290422a044028fb", + "0x282422e014120f222e014028ec0120908b8050483c88b80500a41024811", + "0x2501100a3ec049180b2014028eb1460140290422e0140290222e014028ef", + "0x28e80cc014028ed1960140290419601402902196014028ef23201402904", + "0x2904236044028fb024014028ef0124680900500a3ac0880500a3bc33005", + "0x3600500a4103600500a4083600500a3bc6300500a4106400500a3a08e005", + "0x290423c044028fb17c014028ec0960140290123a044028fb090014028ec", + "0x6000500a3b45f00500a4085f00500a3bc6100500a4106200500a3a08f805", + "0x28ec09001402901242044028fb240014028ec240014028f90960140290c", + "0x2480500a3bc5d80500a4105e80500a3a09180500a4109101100a3ec24805", + "0x28fb248014028ec248014028f90900140290c094014028ed09201402902", + "0x9380500a4109301100a3ec5180500a4085180500a3bc1880500a3bc92811", + "0x28eb1680140290b16801402902168014028ef16c01402904170014028e8", + "0x2881100a3ec9400500a3b09400500a3e41880500a4305900500a3b488005", + "0x28e81600140290416001402902160014028ef2520140290400c044028fb", + "0x5380500a3bc5480500a4105580500a3a09500500a4102981100a3ec57005", + "0x28ef25801402904256044028fb0800140291314e0140290b14e01402902", + "0x5000500a3bc9700500a4109681100a3ec5280500a4105280500a40852805", + "0x28ef25e014029040d2044028fb13c014029041400140290414001402902", + "0x4c00500a3a09800500a4103401100a3ec4d80500a4104d80500a4084d805", + "0x28f90124c80493112a0140290412a0140290212a014028ef12c01402904", + "0x9980500a4103381100a3ec3300500a3b03300500a3bc3300500a40833005", + "0x2904268044028fb124014028e8124014028ed12401402902124014028ef", + "0x4680500a3bc4780500a3a04780500a3b44780500a4084780500a3bc9a805", + "0x28ef11201402904116014028e826c014029040aa044028fb11a014028e8", + "0x4300500a3b44300500a3bc4400500a3a04400500a3b44400500a40844005", + "0x2902104014028ef26e014029040ac044028fb10c014028e810c014028eb", + "0x2c01100a3ec4000500a3a04000500a3bc4100500a3a04100500a3b441005", + "0x28ef0fa014028e80fa014028ed0fa014029020fa014028ef27001402904", + "0x28ef0a2014028ef27601402904274044028fb0124e43500500a41035005", + "0x9e00500a3b49e00500a3b09e00500a3bc9e00500a4089e00500a3e43c805", + "0x28fb0124fc3980500a4f83c80500a4100493d0a2014028eb278014028e8", + "0x3980500a3bc3980500a5083a00500a4103b00500a3a0a080500a410a0011", + "0x28eb090014028ef0e2014028ef0e6014028e80e6014028ed0e601402902", + "0x29020dc014028e828a014029040b6044028fb288014028ef01250c38805", + "0x2c80500a404a400500a3d8a380500a3d82e01100a3eca300500a3d824005", + "0x120f20b8014029040bc014028e8292014029040bc044028fb0b6014028ec", + "0x28ec012090850050483c86e80500a3e4048241b6014120f20120902e005", + "0x2e0050483c8028241b6014120f200a090850050483c80b00500a3ac85005", + "0x6b80500a3e46c80500a3bc2c80500a3a82c80500a3a48700500a3a002824", + "0x28f900a090880050483c88700500a3bc8800500a3b004824220014120f2", + "0x2b0050483c82b00500a4102c00500a3a09d00500a410a481100a3ec56805", + "0x8900500a3b004824224014120f21a8014028f9012090690050483c804824", + "0x880500a3a4028240ac014120f200a090890050483c8028241a4014120f2", + "0x28ec0120908b0050483c8048241a0014120f2108014028ef022014028ea", + "0x120f20125280282422c014120f200a090680050483c81080500a3ac8b005", + "0x4824232014120f2012090658050483c802824146014120f201209051805", + "0x48240d8014120f200a0908c8050483c802824196014120f2232014028ec", + "0x120f2238014028ec0120908e0050483c86400500a3e40482418c014120f2", + "0x28f60900140290400a090360050483c802824238014120f200a09063005", + "0x9580500a3d83380500a3a00f00500a3ac1500500a3a01600500a41096805", + "0x28ec24c014028f600c0140290c0d0014028e80d0014028eb0d0014028ed", + "0x9080500a3d89100500a3d89280500a3d83480500a3a0a401100a3ec34005", + "0x8f8050483c86200500a3e404824184014120f223c014028f602a01402904", + "0x282423e014120f200a090610050483c82580500a41c8f80500a3b004824", + "0x120f2240014028ef180014028ef096014028ea096014028e9240014028e8", + "0x2400500a41c9180500a3b004824246014120f217a014028f90120905d805", + "0x28e9248014028e80940140293e00a090918050483c802824176014120f2", + "0x9200500a3bc8d80500a3bc2500500a3bc2500500a5082400500a3a824005", + "0x482424e014120f2170014028f90120905b0050483c804824168014120f2", + "0xa381100a3ec1f00500a3b01880500a4040282424e014120f224e014028ec", + "0x5b0050483c802824168014120f208a0140290408e014028e822801402904", + "0x9400500a3bc5900500a3bc1880500a3a81880500a3a49400500a3a002824", + "0x120f2252014028ec012090948050483c804824160014120f2042014028ed", + "0x120f2012090538050483c802824160014120f215c014028f900a09094805", + "0x950050483c89500500a3b004824254014120f2156014028f901209054805", + "0x538050483c82080500a4102180500a3a08480500a410a301100a3ec02824", + "0x28ec012090960050483c80482414a014120f200a090548050483c802824", + "0x120f2012090500050483c80282414a014120f200a090960050483c896005", + "0x120f200a090500050483c80482413c014120f225c014028ec01209097005", + "0x482425e014120f20120904d8050483c80282425c014120f200a0904f005", + "0x482412a014120f200a090978050483c802824136014120f225e014028ec", + "0x120f2260014028ec012090980050483c84c00500a3e40482412c014120f2", + "0x120f2124014028f900a090980050483c80282412c014120f200a0904a805", + "0xa580500a4102c81100a3ec02824266014120f2266014028ec01209099805", + "0x9a80500a3b00482426a014120f211e014028f911a014028f907a014028e8", + "0x880500a4040e00500a5080e00500a4f80282426a014120f20b2014028ef", + "0x290206c01402904070014028e8298014029040cc044028fb06a014028ec", + "0x120f2116014028f9012090448050483c84400500a3e41a80500a3bc1a805", + "0x28ef00a090448050483c80282426c014120f226c014028ec0120909b005", + "0x4100500a3e44000500a3e41980500a3a0a700500a4103501100a3eca6805", + "0x48240d4014120f200a0909b8050483c89b80500a3b00482426e014120f2", + "0x120f200a090350050483c89c00500a3b004824270014120f20fa014028f9", + "0x120f2276014028ec0120909d8050483c8048240f2014120f200a0909c005", + "0x48240e8014120f20e6014028f901253c02824276014120f200a0903c805", + "0x120f200a0903a0050483c8a080500a3b004824282014120f20ec014028f9", + "0xa980500a410a980500a3b0a980500a548a88050380141215000a090a0805", + "0x120f228a014028ec012090a28050483c83700500a3e404824090014120f2", + "0x3380500a3e412024090014120f22a801402904090044028fb00a09024005", + "0xaa80500a4103601100a3ec0d80500a3b00300500a40408824090014120f2", + "0x120f20d0014028f9036014028ef036014029020460140290404c014028e8", + "0x120f202a090240050483c83480500a3e40282428a014120f202409024005", + "0x240050483c827024090014120f209c014029040dc044028fb02c09024005", + "0xa48050483c82f00500a3e41380500a3b01380500a3e41200500a3e40d824", + "0x28f900a090a48050483c82d80500a3bc2c80500a41ca480500a3b004824", + "0x2824274014120f2274014028ec0120909d0050483c82c00500a3e42a805", + "0x28ef00c014028e800c014028ed00c014028ec00c014028ea00c014028e9", + "0x4824228014120f208e014028f9012090228050483c83400500a3bc29805", + "0x8a0050483c80282408a014120f207c014028ef06201402907228014028ec", + "0x4824212014120f2086014028f9012090208050483c82000500a3e402824", + "0x120f207a014028f900a090208050483c802824212014120f2212014028ec", + "0x28f90120901b0050483c802824296014120f2296014028ec012090a5805", + "0x282406c014120f202201402907298014028ec012090a60050483c81c005", + "0x120f229c014028ec012090a70050483c81980500a3e402824298014120f2", + "0x28ec012090aa0050483c804824058014120f2054014028f900a090a7005", + "0x120f200a090aa0050483c812024058014120f200a090160050483c8aa005", + "0x300500a3e4aa80500a3b0048242aa014120f204c014028f901209011805", + "0x482402a014120f200a090aa8050483c802824046014120f200c01402907", + "0x282409c014120f200a0900a8050483c82700500a3b00482409c014120f2", + "0x484e02c0905d815024090ab82400a02412005012024ab80501202404956", + "0xf02304855c1201b00a0480481b00a55c0281100a044048092ae01404824", + "0x282200a0580482200a55c0281e00a054048092ae01404824012084028ab", + "0x1180904e0981215700a0980281b0120980295700a0980284e01209802957", + "0x48092ae0141300503c0240495700a024120092aa0148a0092ae09013805", + "0x4824012550028410580a81215704808c0281201208c0295700a08c02821", + "0x284e0125440295700a54c0281601254c0295700a0b002815012024ab805", + "0x2809048024a70050380cc188242ae090a88120480880495100a55c02951", + "0x188052aa0241b0052ae0141980504e0241a8052ae0140a80504c02404957", + "0x10809038014ab80506c01416009298014ab80506a01415009070014ab805", + "0x150052a60240495700a024120090124ac028092a8024a68052ae01415005", + "0x282a01252c0295700a538029550120f40295700a05402826012024ab805", + "0x295400a54c048092ae01404824012024948050125500483e00a55c0283d", + "0x20005054024a58052ae014090052aa024200052ae0140a80504c02404957", + "0xab8052aa014a880901255c028090480240492900a024aa00907c014ab805", + "0x284300a1380484300a55c0284104c09019809082014ab8050120c404809", + "0x2826012024ab8050120900490900a28c0495704810c0282301210c02957", + "0xaa80908e014ab80508a0141a80908a014ab8050125380490f00a55c02815", + "0xe0052ae01423805058024a60052ae014878050540241c0052ae01409005", + "0x120090920142e115228090ab82429a0140900929a014ab80504601410809", + "0xe0050700240495700a45402836012024ab805228014a980901255c02809", + "0x1c0052aa0248d8052ae01425005038024250052ae0140494c012024ab805", + "0x1e809048014ab805048014a6809298014ab80529801415009070014ab805", + "0x248052a60240495700a02412009236090a60380240148d8052ae0148d805", + "0x1c0110800248e8052ae0148e80507c0248e8052ae0140494b012024ab805", + "0xab805012104048092ae01404824012494910242604848f0242ae0908e94c", + "0x28092120240495700a14402838012018288242ae0140e00508602493005", + "0x2826012024ab8050120900492b00a1f4298052ae0900300521e02404957", + "0x486800a55c0286900a11c0486900a55c0285300a1140492d00a55c02921", + "0x295700a19c9302422a024338052ae0143380509c024338052ae01404914", + "0x2a8050920242b0052ae014968050540242a8052ae0143413404845404934", + "0xab8052560142500901255c028090480240488900a024aa0090b0014ab805", + "0xab80528001427009280014ab8050120c40493a00a55c0292100a09804809", + "0x28490121580295700a4e80282a01216c0295700a5009302422a024a0005", + "0x8f0090bc1701215700a1600291d012024ab80501246c0485800a55c0285b", + "0x494800a55c0294900a4880494900a55c0285e00a484048092ae0142e005", + "0x295700a1580282a0124780295700a4780295501251c0295700a52002925", + "0x1205623c0480294700a55c0294700a0f40482400a55c0282400a53404856", + "0xa30052ae0149280504c0240495700a07002838012024ab80501209004947", + "0x492000a024aa0090cc014ab80528c014150090b2014ab805244014aa809", + "0x1300901255c0282300a54c048092ae014848052a20240495700a02412009", + "0x360052ae01435005054024240052ae014090052aa024350052ae0140a805", + "0x2826012024ab805042014a980901255c028090480240492800a024aa009", + "0x483e00a55c0286e00a0a80494b00a55c0281200a5540486e00a55c02815", + "0xa28052ae014048060121b00295700a0f8028510121200295700a52c02926", + "0xab8050d801415009090014ab805090014aa8090e2014ab80528a0140e009", + "0x36048024014388052ae0143880507a024120052ae0141200529a02436005", + "0x295700a13802826012024ab8050220142980901255c0280904802438824", + "0xab8050124ac0486600a55c0287300a0a80485900a55c0281600a55404873", + "0x330050540242c8052ae0142c8052aa0243b0052ae0143a0050380243a005", + "0x90050ec014ab8050ec0141e809048014ab805048014a68090cc014ab805", + "0x1215802a048121570480140482400a0240495700a024048090ec09033059", + "0xab80502a01415009024014ab805024014aa80901255c0280904802427016", + "0xf023036044ab805022054090110d2024088052ae0140880525a0240a805", + "0x282100a19c048092ae0140482401208802959042014ab82403c01434009", + "0x48092ae014048240120a80295a2aa014ab82404e0149a00904e09812157", + "0x4824012544028f72a6550121570480b0028120120b00295700a09802811", + "0x295500a154048092ae014a980506c0240495700a55002953012024ab805", + "0x281b00a5540483300a55c0283100a0700483100a55c0280929802404957", + "0x283d0120900295700a0900294d01208c0295700a08c0282a01206c02957", + "0x295100a54c048092ae014048240120cc120230360480283300a55c02833", + "0x1181b0221000494e00a55c0294e00a0f80494e00a55c0280929602404957", + "0x295700a0242080901255c02809048024a603804856c1b03504855c1214e", + "0x1203d00a160048092ae014a68050aa0241e94d04855c0295500a1580481c", + "0x4840296090ab8052960149d00901255c028090480241f0052b852c02957", + "0x848052ae0140491401210c0295700a1040285b0121040295700a10002940", + "0x284300a1380490f00a55c029090380908a809212014ab80521201427009", + "0xaa80908e014ab8052960142e00908a014ab80508643c1211501210c02957", + "0x238052ae014238050bc0241b0052ae0141b0050540241a8052ae0141a805", + "0x484922a4500895700a1142383606a048a480908a014ab80508a01424809", + "0xab80522a0141300901255c028090480248d8052ba1280295704812402948", + "0x8a0052aa0240495700a4840284a0124848f0242ae0142500528e0248e805", + "0xaa00924c014ab80523c0142480924a014ab80523a01415009244014ab805", + "0x8a0052aa024288052ae0148d8050380240495700a0241200901257802809", + "0x1e809048014ab805048014a680922a014ab80522a01415009228014ab805", + "0x1f0050940240495700a024120090a20908a914024014288052ae01428805", + "0x2980509c024298052ae014048310120180295700a0d802826012024ab805", + "0x492200a55c0283500a5540492b00a55c028530380908a8090a6014ab805", + "0x1215700a4980291d0124980295700a4ac028490124940295700a0180282a", + "0x286800a4880486800a55c0286900a484048092ae0149680523c0243492d", + "0x282a0124880295700a488029550124d00295700a19c0292501219c02957", + "0x293400a55c0293400a0f40482400a55c0282400a5340492500a55c02925", + "0xa600504c0240495700a55402855012024ab8050120900493404849491012", + "0xaa0090b0014ab8050aa014150090ac014ab805070014aa8090aa014ab805", + "0x282600a14c048092ae014150050940240495700a0241200901257c02809", + "0x281b00a5540494000a55c0293a00a0700493a00a55c0280900c02404957", + "0x283d0120900295700a0900294d01208c0295700a08c0282a01206c02957", + "0x282200a070048092ae01404824012500120230360480294000a55c02940", + "0x294d01208c0295700a08c0282a01206c0295700a06c0295501216c02957", + "0x482401216c120230360480285b00a55c0285b00a0f40482400a55c02824", + "0xb0052aa0242e0052ae0142700504c0240495700a04402853012024ab805", + "0x281c0121780295700a024958090b0014ab8050b8014150090ac014ab805", + "0x485800a55c0285800a0a80485600a55c0285600a5540494900a55c0285e", + "0x49490481602b01200a5240295700a5240283d0120900295700a0900294d", + "0x48240121380b0242c0054090242ae09002809048014048092ae01404809", + "0x296103c08c1215704806c0281201206c0295700a04402811012024ab805", + "0x295700a088028160120880295700a07802815012024ab80501209004821", + "0x138050460241382604855c0282600a06c0482600a55c0282600a13804826", + "0x2921012024ab80504c0140f00901255c02809048024aa8052c4024ab824", + "0x482a00a55c0282a00a4b40481200a55c0281200a5540482a00a55c02823", + "0x483100a58ca88052ae090a98050b2024a9954058044ab80505404812146", + "0x494e00a55c0295100a1980483300a55c0281500a098048092ae01404824", + "0x295700a0cc0282a0120d80295700a0b0029550120d40295700a55002811", + "0xb20050125500481c00a55c0283500a0840494c00a55c0294e00a1a804838", + "0x48092ae014aa0050a60240495700a0c40284a012024ab80501209004809", + "0x295700a5340282a0120f40295700a0b0029550125340295700a05402826", + "0x1880901255c0295500a544048092ae01404824012024b28050125500494b", + "0x200052ae0142000509c024200052ae0141f0260480cc0483e00a55c02809", + "0xab80502a0141300901255c02809048024208052cc024ab82408001411809", + "0x281200a5540490f00a55c0290900a1200490900a55c0280929c02421805", + "0x28210125300295700a43c0286a0120e00295700a10c0282a0120d802957", + "0xab8050120900491400a59c2384504855c1201c00a0480481c00a55c02823", + "0x495700a5300286c012024ab80508e0141b00901255c0284500a54c04809", + "0x295700a0d8029550121240295700a4540281c0124540295700a024a6009", + "0x284900a0f40482400a55c0282400a5340483800a55c0283800a0a804836", + "0x495700a45002953012024ab805012090048490480e01b01200a12402957", + "0x1204a0700d8088400121280295700a1280283e0121280295700a024a5809", + "0x492200a55c028090820240495700a024120092424781216823a46c12157", + "0x48092ae01404909012024ab80524a0143600924c4941215700a5300286e", + "0xab80523a0141300901255c02809048024030052d21440295704849802859", + "0x2d8090d0014ab805256014388090d24b4958112ae0142880528a02429805", + "0x2a8052ae0149a0050b60249a0052ae014968050e2024338052ae01434005", + "0x295700a0248a0090b0014ab8050ac0142d8090ac014ab8050d201438809", + "0xa002422a024a00052ae0149d1220484540493a00a55c0293a00a1380493a", + "0x295700a1602e02422a0242e0052ae0142a85b0484540485b00a55c02867", + "0xb50050125500494800a55c0285e00a1240494900a55c0285300a0a80485e", + "0xa38052ae0148e80504c0240495700a0180284a012024ab80501209004809", + "0xab80528c488121150125180295700a5180284e0125180295700a02418809", + "0x2809236024a40052ae0142c805092024a48052ae014a38050540242c805", + "0x350052420240495700a1980291e0121a8330242ae014a400523a02404957", + "0xaa8090dc014ab8050d8014928090d8014ab80509001491009090014ab805", + "0x120052ae0141200529a024a48052ae014a48050540248d8052ae0148d805", + "0x3600901255c028090480243702429246c090050dc014ab8050dc0141e809", + "0x487100a55c0291e00a5540494500a55c0292100a098048092ae014a6005", + "0x2951012024ab805012090048092d6014049540121cc0295700a5140282a", + "0x29550121d00295700a05402826012024ab805046014a980901255c02841", + "0x4824012024b28050125500494b00a55c0287400a0a80483d00a55c02812", + "0x90052aa0243b0052ae0140a80504c0240495700a08402953012024ab805", + "0x281c0125040295700a02403009296014ab8050ec0141500907a014ab805", + "0x494b00a55c0294b00a0a80483d00a55c0283d00a5540494400a55c02941", + "0x494404852c1e81200a5100295700a5100283d0120900295700a0900294d", + "0xaa8090f2014ab80509c0141300901255c0281100a14c048092ae01404824", + "0x493c00a55c02809256024398052ae0143c805054024388052ae0140b005", + "0x295700a1cc0282a0121c40295700a1c4029550124ec0295700a4f00281c", + "0x120730e20480293b00a55c0293b00a0f40482400a55c0282400a53404873", + "0x484e02c090b6015024090ab82400a02412005012024ab8050120240493b", + "0x481500a55c0281500a0a80481200a55c0281200a554048092ae01404824", + "0x28740120781181b02255c0281102a048088730120440295700a0440292d", + "0x130242ae014108050ec0240495700a02412009044014b682100a55c1201e", + "0x130050220240495700a02412009054014b715500a55c1202700a50404827", + "0x495700a024120092a2014b79532a8090ab82405801409009058014ab805", + "0x48092ae014aa8052880240495700a54c02836012024ab8052a8014a9809", + "0xd8052ae0140d8052aa024198052ae01418805038024188052ae0140494c", + "0xab8050660141e809048014ab805048014a6809046014ab80504601415009", + "0x48092ae014a88052a60240495700a024120090660901181b02401419805", + "0xab82429c08c0d811080024a70052ae014a700507c024a70052ae0140494b", + "0x3c809038014ab805012104048092ae014048240125301c0242e00d81a824", + "0xa58052ae0901e8052780240495700a534029440120f4a68242ae014aa805", + "0x200050e20242084004855c0294b00a4ec048092ae014048240120f802971", + "0x490f082090ab8050820143e809212014ab8050860142d809086014ab805", + "0x8a0052ae0140491401211c0295700a1140285b0121140295700a43c02938", + "0x849150484540491500a55c029140380908a809228014ab80522801427009", + "0x484a00a55c028470920908a80908e014ab80508e01427009092014ab805", + "0x295700a0d80282a0120d40295700a0d40295501246c0295700a10402880", + "0x1b0350244dc0484a00a55c0284a00a1240491b00a55c0291b00a20804836", + "0x482401249402972244014ab824242014a40092424788e8112ae0142511b", + "0x2500900c1441215700a488029470124980295700a47802826012024ab805", + "0x492b00a55c0292600a0a80485300a55c0291d00a554048092ae01403005", + "0x281c012024ab805012090048092e6014049540124b40295700a14402849", + "0x491e00a55c0291e00a0a80491d00a55c0291d00a5540486900a55c02925", + "0x48690484788e81200a1a40295700a1a40283d0120900295700a0900294d", + "0x188090d0014ab80506c0141300901255c0283e00a128048092ae01404824", + "0x9a0052ae0143381c0484540486700a55c0286700a1380486700a55c02809", + "0xab80526801424809256014ab8050d0014150090a6014ab80506a014aa809", + "0x2b0052420240495700a1540291e0121582a8242ae0149680523a02496805", + "0xaa809280014ab80527401492809274014ab8050b0014910090b0014ab805", + "0x120052ae0141200529a024958052ae01495805054024298052ae01429805", + "0xa200901255c02809048024a002425614c09005280014ab8052800141e809", + "0x485c00a55c0283800a5540485b00a55c0294c00a098048092ae014aa805", + "0x284a012024ab805012090048092e8014049540121780295700a16c0282a", + "0xa4805038024a48052ae01404806012024ab80504c0142980901255c0282a", + "0xa6809046014ab80504601415009036014ab805036014aa809290014ab805", + "0x120092900901181b024014a40052ae014a400507a024120052ae01412005", + "0x15009036014ab805036014aa80928e014ab8050440140e00901255c02809", + "0xa38052ae014a380507a024120052ae0141200529a024118052ae01411805", + "0x2826012024ab8050220142980901255c02809048024a382404606c09005", + "0x485e00a55c0294600a0a80485c00a55c0281600a5540494600a55c0284e", + "0x2e0052ae0142e0052aa024330052ae0142c8050380242c8052ae0140492b", + "0xab8050cc0141e809048014ab805048014a68090bc014ab8050bc01415009", + "0x121570480140482400a0240495700a024048090cc0902f05c02401433005", + "0x96809024014ab805024014aa80901255c02809048024270160483900a812", + "0x1201e00a2180481e04606c0895700a04409024108024088052ae01408805", + "0x900904c014ab8050460140880901255c02809048024110052ea08402957", + "0xab80504e014a980901255c02809048024150052ec554138242ae09013005", + "0x160052ae0140494c012024ab8050420144400901255c0295500a0d804809", + "0xab80502a01415009036014ab805036014aa8092a8014ab8050580140e009", + "0xa81b024014aa0052ae014aa00507a024120052ae0141200529a0240a805", + "0xa98052ae0140494b012024ab805054014a980901255c02809048024aa024", + "0x198242ee0c4a88242ae090a9815036044200092a6014ab8052a60141f009", + "0x1b0242ae014108051120241a8052ae01404841012024ab8050120900494e", + "0xa60052ae0901c0051160240495700a0248480901255c0283600a22004838", + "0xab80529a0142700929a014ab805012450048092ae0140482401207002978", + "0x1f0052f252c029570485300290f0120f40295700a5341a82422a024a6805", + "0x208052ae014a580508a024200052ae0141880504c0240495700a02412009", + "0x295700a4240284e0124240295700a0248a009086014ab80508201423809", + "0x282a0121140295700a10c8782422a024878052ae0148483d04845404909", + "0x4824012024bd0050125500491400a55c0284500a1240484700a55c02840", + "0x8a8050540248a8052ae0141880504c0240495700a0f80284a012024ab805", + "0x28090480240497b00a024aa009094014ab80507a01424809092014ab805", + "0x291b00a0a80491b00a55c0283100a098048092ae0140e00509402404957", + "0x8e80509c0248e8052ae014048310121280295700a0d40284901212402957", + "0x484700a55c0284900a0a80491e00a55c0291d0940908a80923a014ab805", + "0x9112104855c0291400a474048092ae0140491b0124500295700a47802849", + "0x295700a494029220124940295700a48802921012024ab8052420148f009", + "0x284700a0a80495100a55c0295100a5540485100a55c0292600a49404926", + "0xa881200a1440295700a1440283d0120900295700a0900294d01211c02957", + "0xab80529c0141300901255c0282100a220048092ae0140482401214412047", + "0x28092a8024958052ae01403005054024298052ae014198052aa02403005", + "0x495700a08c02853012024ab8050440142500901255c028090480240497c", + "0x295700a06c029550121a40295700a4b40281c0124b40295700a02403009", + "0x286900a0f40482400a55c0282400a5340481500a55c0281500a0a80481b", + "0x495700a04402853012024ab805012090048690480540d81200a1a402957", + "0xab8050d0014150090a6014ab80502c014aa8090d0014ab80509c01413009", + "0x285300a5540493400a55c0286700a0700486700a55c0280925602495805", + "0x283d0120900295700a0900294d0124ac0295700a4ac0282a01214c02957", + "0x2809048014048092ae014048090124d01212b0a60480293400a55c02934", + "0x295700a04402811012024ab8050120900484e02c090be815024090ab824", + "0x2815012024ab8050120900482100a5f80f02304855c1201b00a0480481b", + "0x482600a55c0282600a1380482600a55c0282200a0580482200a55c0281e", + "0x2809048024aa8052fe024ab82404e0141180904e0981215700a0980281b", + "0x281200a5540482a00a55c0282300a484048092ae0141300503c02404957", + "0xa9954058044ab805054048121360120a80295700a0a80292d01204802957", + "0x281500a098048092ae014048240120c4029802a2014ab8242a601446809", + "0x29550120d40295700a550028110125380295700a5440288f0120cc02957", + "0x494c00a55c0294e00a4d40483800a55c0283300a0a80483600a55c0282c", + "0x284a012024ab80501209004809302014049540120700295700a0d402821", + "0x29550125340295700a05402826012024ab8052a80142980901255c02831", + "0x4824012024c10050125500494b00a55c0294d00a0a80483d00a55c0282c", + "0x1f0260480cc0483e00a55c028090620240495700a55402951012024ab805", + "0x20805306024ab82408001411809080014ab80508001427009080014ab805", + "0x490900a55c0280929c024218052ae0140a80504c0240495700a02412009", + "0x295700a10c0282a0120d80295700a0480295501243c0295700a42402892", + "0x1201c00a0480481c00a55c0282300a0840494c00a55c0290f00a4d404838", + "0x1b00901255c0284500a54c048092ae014048240124500298408e11412157", + "0x281c0124540295700a024a600901255c0294c00a4cc048092ae01423805", + "0x483800a55c0283800a0a80483600a55c0283600a5540484900a55c02915", + "0x48490480e01b01200a1240295700a1240283d0120900295700a0900294d", + "0x283e0121280295700a024a580901255c0291400a54c048092ae01404824", + "0x120092424781218523a46c121570481281c0360221000484a00a55c0284a", + "0x9980924c4941215700a530028950124880295700a0242080901255c02809", + "0x300530c144029570484980288d012024ab805012424048092ae01492805", + "0x485300a55c0285300a1380485300a55c028092280240495700a02412009", + "0x48240121a40298725a014ab8240a20144b009256014ab8050a648812115", + "0x293001219c0295700a4b4028980121a00295700a47402826012024ab805", + "0x8a8090aa014ab8050aa014270090aa014ab8050124500493400a55c02867", + "0xab8050d0014150090b0014ab805268158121150121580295700a15495824", + "0x495700a02412009012620028092a8024a00052ae0142c0050920249d005", + "0xab8050b8014238090b8014ab8050d2014228090b6014ab80523a01413009", + "0xa492b0484540494900a55c0294900a1380494900a55c028090620242f005", + "0x493a00a55c0285b00a0a80494700a55c0285e2900908a809290014ab805", + "0x284a012024ab80501209004809310014049540125000295700a51c02849", + "0x284e0121640295700a0241880928c014ab80523a0141300901255c02806", + "0x9d0052ae014a3005054024330052ae0142c9220484540485900a55c02859", + "0x350242ae014a000523a0240495700a0248d809280014ab8050cc01424809", + "0xab8050d8014910090d8014ab8050900149080901255c0286a00a47804848", + "0x9d0050540248d8052ae0148d8052aa024a28052ae0143700524a02437005", + "0x900528a014ab80528a0141e809048014ab805048014a6809274014ab805", + "0x292100a098048092ae014a60052660240495700a0241200928a0909d11b", + "0x49540121d00295700a1c40282a0121cc0295700a478029550121c402957", + "0xab805046014a980901255c0284100a544048092ae01404824012024c4805", + "0x287600a0a80483d00a55c0281200a5540487600a55c0281500a09804809", + "0x495700a08402953012024ab805012090048093040140495401252c02957", + "0xab8052820141500907a014ab805024014aa809282014ab80502a01413009", + "0x283d00a5540487900a55c0294400a0700494400a55c0280900c024a5805", + "0x283d0120900295700a0900294d01252c0295700a52c0282a0120f402957", + "0x281100a14c048092ae014048240121e41214b07a0480287900a55c02879", + "0x9e005054024398052ae0140b0052aa0249e0052ae0142700504c02404957", + "0x29550121f40295700a4ec0281c0124ec0295700a024958090e8014ab805", + "0x482400a55c0282400a5340487400a55c0287400a0a80487300a55c02873", + "0x12005012024ab8050120240487d0481d03981200a1f40295700a1f40283d", + "0x281200a554048092ae014048240121380b024314054090242ae09002809", + "0xf023036044ab8050220481209b0120440295700a0440292d01204802957", + "0x282300a044048092ae014048240120880298b042014ab82403c01497809", + "0x48092ae014048240120a80298c2aa09c121570480980281201209802957", + "0xa600901255c0282100a278048092ae014aa80506c0240495700a09c02953", + "0x481b00a55c0281b00a5540495400a55c0282c00a0700482c00a55c02809", + "0x295700a5500283d0120900295700a0900294d0120540295700a0540282a", + "0xa580901255c0282a00a54c048092ae014048240125501201503604802954", + "0x1215704854c0a81b0221000495300a55c0295300a0f80495300a55c02809", + "0x28a00120d40295700a0242080901255c02809048024a703304863418951", + "0x292e012024ab805012424048092ae0141b00513c0241c03604855c02821", + "0xa68052ae0141880504c0240495700a02412009038014c714c00a55c12038", + "0x1f0052580241f14b04855c0283d00a2940483d298090ab80529801451809", + "0x28a50121040295700a100028a70121000295700a52c0298f012024ab805", + "0x490f00a55c0290900a1c4048092ae014218053200248484304855c0294c", + "0x238052ae0142380509c024238052ae014049140121140295700a43c0285b", + "0x8a82422a0248a8052ae014209140484540491400a55c0284706a0908a809", + "0x491b00a55c0284900a1240484a00a55c0294d00a0a80484900a55c02845", + "0x1880504c0240495700a0700284a012024ab8050120900480932201404954", + "0x121150124780295700a4780284e0124780295700a0241880923a014ab805", + "0x8d8052ae01490805092024250052ae0148e805054024908052ae0148f035", + "0x495700a4880291e012494910242ae0148d80523a0240495700a0248d809", + "0xab8050a2014928090a2014ab80524c0149100924c014ab80524a01490809", + "0x1200529a024250052ae01425005054024a88052ae014a88052aa02403005", + "0x2809048024030240945440900500c014ab80500c0141e809048014ab805", + "0x283300a5540485300a55c0294e00a098048092ae0141080513c02404957", + "0xab80501209004809324014049540124b40295700a14c0282a0124ac02957", + "0x348052ae01404806012024ab8050460142980901255c0282200a12804809", + "0xab80502a01415009036014ab805036014aa8090d0014ab8050d20140e009", + "0xa81b024014340052ae0143400507a024120052ae0141200529a0240a805", + "0x295700a13802826012024ab8050220142980901255c0280904802434024", + "0xab8050124ac0492d00a55c0286700a0a80492b00a55c0281600a55404867", + "0x96805054024958052ae014958052aa0242a8052ae0149a0050380249a005", + "0x90050aa014ab8050aa0141e809048014ab805048014a680925a014ab805", + "0x1219302a048121570480140482400a0240495700a024048090aa0909692b", + "0xab80502a01415009024014ab805024014aa80901255c0280904802427016", + "0xf023036044ab80502205409011152024088052ae0140880525a0240a805", + "0x282100a4a8048092ae0140482401208802994042014ab82403c01455809", + "0x48092ae014048240120a8029952aa014ab82404e0145700904e09812157", + "0x4824012544029962a6550121570480b0028120120b00295700a09802811", + "0x295500a2b4048092ae014a980506c0240495700a55002953012024ab805", + "0x281b00a5540483300a55c0283100a0700483100a55c0280929802404957", + "0x283d0120900295700a0900294d01208c0295700a08c0282a01206c02957", + "0x295100a54c048092ae014048240120cc120230360480283300a55c02833", + "0x1181b0221000494e00a55c0294e00a0f80494e00a55c0280929602404957", + "0x295700a0242080901255c02809048024a603804865c1b03504855c1214e", + "0x1203d00a4a4048092ae014a680515a0241e94d04855c0295500a2c00481c", + "0x284e0121000295700a0248a00901255c028090480241f00533052c02957", + "0x1a8052ae0141a8052aa024208052ae0142001c0484540484000a55c02840", + "0xab80508201424809296014ab8052960145900906c014ab80506c01415009", + "0x295704843c0294801243c8484302255c028412960d81a81225002420805", + "0x2280528e0248a0052ae0148480504c0240495700a0241200908e014cc845", + "0x15009094014ab805086014aa80901255c0284900a1280484922a090ab805", + "0x12009012668028092a80248e8052ae0148a8050920248d8052ae0148a005", + "0x15009086014ab805086014aa80923c014ab80508e0140e00901255c02809", + "0x8f0052ae0148f00507a024120052ae0141200529a024848052ae01484805", + "0x2826012024ab80507c0142500901255c028090480248f02421210c09005", + "0x8a809244014ab80524401427009244014ab8050120c40492100a55c02836", + "0x295700a4840282a0121280295700a0d4029550124940295700a4880e024", + "0x9300523c0242892604855c0291d00a4740491d00a55c0292500a1240491b", + "0x292501214c0295700a018029220120180295700a14402921012024ab805", + "0x491b00a55c0291b00a0a80484a00a55c0284a00a5540492b00a55c02853", + "0x492b04846c2501200a4ac0295700a4ac0283d0120900295700a0900294d", + "0xaa80925a014ab8052980141300901255c0295500a2b4048092ae01404824", + "0x1200901266c028092a8024340052ae01496805054024348052ae0141c005", + "0x280900c0240495700a09802853012024ab8050540142500901255c02809", + "0x282a01206c0295700a06c029550124d00295700a19c0281c01219c02957", + "0x293400a55c0293400a0f40482400a55c0282400a5340482300a55c02823", + "0x29550121540295700a0880281c012024ab8050120900493404808c0d812", + "0x482400a55c0282400a5340482300a55c0282300a0a80481b00a55c0281b", + "0x2853012024ab8050120900485504808c0d81200a1540295700a1540283d", + "0x150090d2014ab80502c014aa8090ac014ab80509c0141300901255c02811", + "0x493a00a55c0285800a0700485800a55c02809256024340052ae0142b005", + "0x295700a0900294d0121a00295700a1a00282a0121a40295700a1a402955", + "0x48092ae014048090124e8120680d20480293a00a55c0293a00a0f404824", + "0x2811012024ab8050120900484e02c090ce015024090ab82400a02412005", + "0xab8050120900482100a6740f02304855c1201b00a0480481b00a55c02811", + "0xab8050122d00482600a55c0282200a0580482200a55c0281e00a05404809", + "0xa805054024090052ae014090052aa024aa8052ae0141180524202413805", + "0x2700904e014ab80504e014cf0092aa014ab8052aa0149680902a014ab805", + "0x5c0092a80b0150112ae014130272aa0540901516c024130052ae01413005", + "0x1215700a54c02927012024ab8050120900495100a67ca98052ae090aa005", + "0x2811012024ab8050120900483500a680a70052ae0901980524802419831", + "0xab8050120900481c00a684a603804855c1203600a0480483600a55c02831", + "0x495700a538028bb012024ab8052980141b00901255c0283800a54c04809", + "0x295700a0a8029550120f40295700a5340281c0125340295700a024a6009", + "0x283d00a0f40482400a55c0282400a5340482c00a55c0282c00a0a80482a", + "0x495700a07002953012024ab8050120900483d0480b01501200a0f402957", + "0x1214b0580a80884001252c0295700a52c0283e01252c0295700a024a5809", + "0x848242ae014a700517a0240495700a02412009086104121a20800f812157", + "0x284500a2f80484521e090ab80521e0149180901255c0290900a2ec0490f", + "0x8a00509c0248a8052ae014048410124500295700a11c0285b01211c02957", + "0x484a00a55c0290f00a3000484900a55c0291422a0908a809228014ab805", + "0x295700a128029200121000295700a1000282a0120f80295700a0f802955", + "0x8f11d236044ab8050921282003e0243080484900a55c0284900a1240484a", + "0x291d00a098048092ae01404824012488029a3242014ab82423c014a4009", + "0x291d012024ab8050a2014250090a24981215700a4840294701249402957", + "0x492b00a55c0285300a484048092ae0140300523c0242980604855c02926", + "0x295700a46c029550121a40295700a4b4029250124b40295700a4ac02922", + "0x286900a0f40482400a55c0282400a5340492500a55c0292500a0a80491b", + "0x295700a4880281c012024ab805012090048690484948d81200a1a402957", + "0x282400a5340491d00a55c0291d00a0a80491b00a55c0291b00a55404868", + "0xab805012090048680484748d81200a1a00295700a1a00283d01209002957", + "0xab805082014aa8090ce014ab8050860141300901255c0294e00a2ec04809", + "0x495700a02412009012690028092a80242a8052ae014338050540249a005", + "0x2b0052ae0141600504c0240495700a0c402853012024ab80506a01425009", + "0x49a500a024aa009274014ab8050ac014150090b0014ab805054014aa809", + "0x150052ae014150052aa024a00052ae014a88050380240495700a02412009", + "0xab8052800141e809048014ab805048014a6809058014ab80505801415009", + "0x48092ae014108052a60240495700a024120092800901602a024014a0005", + "0x295700a16c0282a0121600295700a0480295501216c0295700a05402826", + "0xab8050b0014aa8090bc014ab8050b80140e0090b8014ab8050120180493a", + "0x2f00507a024120052ae0141200529a0249d0052ae0149d0050540242c005", + "0xab8050220142980901255c028090480242f024274160090050bc014ab805", + "0x294900a0a80493400a55c0281600a5540494900a55c0284e00a09804809", + "0x9a0052aa024a38052ae014a4005038024a40052ae0140492b01215402957", + "0x1e809048014ab805048014a68090aa014ab8050aa01415009268014ab805", + "0x482400a0240495700a0240480928e0902a934024014a38052ae014a3805", + "0xab8050220140880901255c02809048024270160486980a81204855c12005", + "0xa80901255c028090480241080534e078118242ae0900d8050240240d805", + "0x482700a55c02809188024130052ae0141100502c024110052ae0140f005", + "0x295700a0540282a0120480295700a048029550125540295700a08c02921", + "0x282600a1380482700a55c0282700a47c0495500a55c0295500a4b404815", + "0x1215400a320049540580a80895700a0981395502a0480a8c601209802957", + "0x4833062090ab8052a60148e00901255c02809048024a880535054c02957", + "0xab8050620140880901255c028090480241a805352538029570480cc028cb", + "0xa980901255c028090480240e0053545301c0242ae0901b0050240241b005", + "0x494c012024ab80529c0148c80901255c0294c00a0d8048092ae0141c005", + "0x15009054014ab805054014aa80907a014ab80529a0140e00929a014ab805", + "0x1e8052ae0141e80507a024120052ae0141200529a024160052ae01416005", + "0x494b012024ab805038014a980901255c028090480241e8240580a809005", + "0x1f0242ae090a582c05404420009296014ab8052960141f009296014ab805", + "0x8c80921e4241215700a53802917012024ab80501209004843082090d5840", + "0x238052ae014228051a00242290f04855c0290f00a12c048092ae01484805", + "0x295700a4500284e0124540295700a02420809228014ab80508e0142d809", + "0x1f0052aa024250052ae0148780522c024248052ae0148a11504845404914", + "0x24809094014ab805094014d6009080014ab8050800141500907c014ab805", + "0x29480124788e91b02255c028490941001f01235a024248052ae01424805", + "0x928052ae0148e80504c0240495700a02412009244014d712100a55c1211e", + "0xab80524c0148e80901255c0285100a1280485124c090ab805242014a3809", + "0x95805244024958052ae014298052420240495700a0180291e01214c03024", + "0x15009236014ab805236014aa8090d2014ab80525a0149280925a014ab805", + "0x348052ae0143480507a024120052ae0141200529a024928052ae01492805", + "0xaa8090d0014ab8052440140e00901255c028090480243482424a46c09005", + "0x120052ae0141200529a0248e8052ae0148e8050540248d8052ae0148d805", + "0x8c80901255c028090480243402423a46c090050d0014ab8050d00141e809", + "0x493400a55c0284100a5540486700a55c0284300a098048092ae014a7005", + "0x284a012024ab8050120900480935e014049540121540295700a19c0282a", + "0x29550121580295700a0b002826012024ab8050620142980901255c02835", + "0x4824012024d80050125500493a00a55c0285600a0a80485800a55c0282a", + "0x282a0120a80295700a0a8029550125000295700a5440281c012024ab805", + "0x294000a55c0294000a0f40482400a55c0282400a5340482c00a55c0282c", + "0xa80504c0240495700a08402953012024ab805012090049400480b015012", + "0x3009274014ab8050b6014150090b0014ab805024014aa8090b6014ab805", + "0x485800a55c0285800a5540485e00a55c0285c00a0700485c00a55c02809", + "0x295700a1780283d0120900295700a0900294d0124e80295700a4e80282a", + "0x1300901255c0281100a14c048092ae014048240121781213a0b00480285e", + "0x2a8052ae014a48050540249a0052ae0140b0052aa024a48052ae01427005", + "0x295700a4d00295501251c0295700a5200281c0125200295700a02495809", + "0x294700a0f40482400a55c0282400a5340485500a55c0285500a0a804934", + "0xab82400a02412005012024ab805012024049470481549a01200a51c02957", + "0x481b00a55c0281100a044048092ae014048240121380b02436205409024", + "0x281e00a054048092ae01404824012084029b203c08c1215704806c02812", + "0x281b0120980295700a0980284e0120980295700a0880281601208802957", + "0x495700a024120092aa014d98092ae090138050460241382604855c02826", + "0x1215704808c0281201208c0295700a08c02821012024ab80504c0140f009", + "0x281601254c0295700a0b002815012024ab8050120900495400a6d01602a", + "0x188242ae090a88120480880495100a55c0295100a1380495100a55c02953", + "0x281500a098048092ae014198051a40240495700a0241200929c014da833", + "0x28210120e00295700a0d40282a0120d80295700a0c4029550120d402957", + "0x282a00a54c048092ae01404824012024db0050125500494c00a55c0282a", + "0xe005054024a68052ae014a70052aa0240e0052ae0140a80504c02404957", + "0xab8052a8014a980901255c02809048024049b700a024aa00907a014ab805", + "0x294b00a0a80494d00a55c0281200a5540494b00a55c0281500a09804809", + "0x495700a55402951012024ab8050120900480936e014049540120f402957", + "0xab80508001427009080014ab80507c098120330120f80295700a02418809", + "0xa80504c0240495700a02412009082014dc0092ae0902000504602420005", + "0x10809070014ab8050860141500906c014ab805024014aa809086014ab805", + "0x28090480242280537243c848242ae090a6005024024a60052ae01411805", + "0x295700a024a600901255c0290f00a0d8048092ae014848052a602404957", + "0x283800a0a80483600a55c0283600a5540491400a55c0284700a07004847", + "0x1b01200a4500295700a4500283d0120900295700a0900294d0120e002957", + "0x295700a024a580901255c0284500a54c048092ae0140482401245012038", + "0x121ba094124121570484541c0360221000491500a55c0291500a0f804915", + "0x295700a0242080923c014ab8050940141300901255c028090480248e91b", + "0x292500a484048092ae0149100523c0249292204855c0292100a47404921", + "0x29550120180295700a144029250121440295700a4980292201249802957", + "0x482400a55c0282400a5340491e00a55c0291e00a0a80484900a55c02849", + "0x2826012024ab805012090048060484782481200a0180295700a0180283d", + "0x492d00a55c0285300a0a80492b00a55c0291b00a5540485300a55c0291d", + "0x118052a60240495700a10402951012024ab8050120900480937601404954", + "0x282a0121a00295700a048029550121a40295700a05402826012024ab805", + "0x282100a54c048092ae01404824012024de0050125500486700a55c02869", + "0x9a005054024a68052ae014090052aa0249a0052ae0140a80504c02404957", + "0x30090ce014ab80507a014288090d0014ab80529a0149300907a014ab805", + "0x486800a55c0286800a5540485600a55c0285500a0700485500a55c02809", + "0x295700a1580283d0120900295700a0900294d01219c0295700a19c0282a", + "0x1300901255c0281100a14c048092ae01404824012158120670d004802856", + "0x968052ae0142c005054024958052ae0140b0052aa0242c0052ae01427005", + "0x295700a4ac029550125000295700a4e80281c0124e80295700a02495809", + "0x294000a0f40482400a55c0282400a5340492d00a55c0292d00a0a80492b", + "0xab82400a02412005012024ab805012024049400484b49581200a50002957", + "0x481200a55c0281200a554048092ae014048240121380b02437a05409024", + "0xf00525e0240f023036044ab8050220481209b0120440295700a0440292d", + "0x482600a55c0282300a044048092ae01404824012088029be042014ab824", + "0x282700a54c048092ae014048240120a8029bf2aa09c1215704809802812", + "0x295700a024a600901255c0282100a278048092ae014aa80506c02404957", + "0x281500a0a80481b00a55c0281b00a5540495400a55c0282c00a0700482c", + "0xd81200a5500295700a5500283d0120900295700a0900294d01205402957", + "0x295700a024a580901255c0282a00a54c048092ae0140482401255012015", + "0x121c00625441215704854c0a81b0221000495300a55c0295300a0f804953", + "0x1215700a084028a00120d40295700a0242080901255c02809048024a7033", + "0x29570480e00292e012024ab805012424048092ae0141b00513c0241c036", + "0xa6005146024a68052ae0141880504c0240495700a02412009038014e094c", + "0x48092ae0141f0052580241f14b04855c0283d00a2940483d298090ab805", + "0x1215700a530028a50121040295700a100028a70121000295700a52c0298f", + "0x290f00a16c0490f00a55c0290900a1c4048092ae0142180532002484843", + "0x1a82422a024238052ae0142380509c024238052ae0140491401211402957", + "0x295700a1148a82422a0248a8052ae014209140484540491400a55c02847", + "0xe10050125500491b00a55c0284900a1240484a00a55c0294d00a0a804849", + "0x8e8052ae0141880504c0240495700a0700284a012024ab80501209004809", + "0xab80523c0d4121150124780295700a4780284e0124780295700a02418809", + "0x28092360248d8052ae01490805092024250052ae0148e80505402490805", + "0x928052420240495700a4880291e012494910242ae0148d80523a02404957", + "0xaa80900c014ab8050a2014928090a2014ab80524c0149100924c014ab805", + "0x120052ae0141200529a024250052ae01425005054024a88052ae014a8805", + "0x4f00901255c02809048024030240945440900500c014ab80500c0141e809", + "0x492b00a55c0283300a5540485300a55c0294e00a098048092ae01410805", + "0x284a012024ab80501209004809386014049540124b40295700a14c0282a", + "0x34805038024348052ae01404806012024ab8050460142980901255c02822", + "0xa680902a014ab80502a01415009036014ab805036014aa8090d0014ab805", + "0x120090d00900a81b024014340052ae0143400507a024120052ae01412005", + "0x295501219c0295700a13802826012024ab8050220142980901255c02809", + "0xe009268014ab8050124ac0492d00a55c0286700a0a80492b00a55c02816", + "0x968052ae01496805054024958052ae014958052aa0242a8052ae0149a005", + "0x2a82425a4ac090050aa014ab8050aa0141e809048014ab805048014a6809", + "0x1200909c058121c402a048121570480140482400a0240495700a02404809", + "0x9b009022014ab80502201496809024014ab805024014aa80901255c02809", + "0x12009044014e282100a55c1201e00a2340481e04606c0895700a04409024", + "0xe315504e090ab82404c0140900904c014ab8050460140880901255c02809", + "0x495700a55402836012024ab80504e014a980901255c0280904802415005", + "0xaa0052ae01416005038024160052ae0140494c012024ab8050420146a009", + "0xab805048014a680902a014ab80502a01415009036014ab805036014aa809", + "0x495700a024120092a80900a81b024014aa0052ae014aa00507a02412005", + "0xa98052ae014a980507c024a98052ae0140494b012024ab805054014a9809", + "0x48092ae014048240125381982438e0c4a88242ae090a981503604420009", + "0x495700a0d8028d40120e01b0242ae014108052240241a8052ae01404841", + "0xab8050120900481c00a720a60052ae0901c00512c0240495700a02484809", + "0x283d00a4c00483d00a55c0294c00a2600494d00a55c0283100a09804809", + "0x1a82422a0241f0052ae0141f00509c0241f0052ae0140491401252c02957", + "0x218052ae014a6805054024208052ae014a58400484540484000a55c0283e", + "0x1300901255c02809048024049c900a024aa009212014ab80508201424809", + "0x238052ae0142280508e024228052ae0140e00508a024878052ae01418805", + "0xab8052280d4121150124500295700a4500284e0124500295700a02418809", + "0x284901210c0295700a43c0282a0121240295700a11c8a82422a0248a805", + "0x8f0092361281215700a4240291d012024ab80501246c0490900a55c02849", + "0x491e00a55c0291d00a4880491d00a55c0291b00a484048092ae01425005", + "0x295700a10c0282a0125440295700a544029550124840295700a47802925", + "0x120432a20480292100a55c0292100a0f40482400a55c0282400a53404843", + "0x910052ae014a700504c0240495700a084028d4012024ab80501209004921", + "0x49ca00a024aa00924c014ab8052440141500924a014ab805066014aa809", + "0x300901255c0282300a14c048092ae014110050940240495700a02412009", + "0x481b00a55c0281b00a5540480600a55c0285100a0700485100a55c02809", + "0x295700a0180283d0120900295700a0900294d0120540295700a0540282a", + "0x1300901255c0281100a14c048092ae014048240120181201503604802806", + "0x930052ae01429805054024928052ae0140b0052aa024298052ae01427005", + "0x295700a494029550124b40295700a4ac0281c0124ac0295700a02495809", + "0x292d00a0f40482400a55c0282400a5340492600a55c0292600a0a804925", + "0xab82400a02412005012024ab8050120240492d0484989281200a4b402957", + "0x481200a55c0281200a554048092ae014048240121380b02439605409024", + "0x281102a048089110120440295700a0440292d0120540295700a0540282a", + "0x495700a02412009044014e602100a55c1201e00a35c0481e04606c08957", + "0x12009054014e695500a55c1202700a3640482704c090ab80504201488009", + "0xe71532a8090ab82405801409009058014ab80504c0140880901255c02809", + "0x495700a54c02836012024ab8052a8014a980901255c02809048024a8805", + "0x198052ae01418805038024188052ae0140494c012024ab8052aa01487009", + "0xab805048014a6809046014ab80504601415009036014ab805036014aa809", + "0x495700a024120090660901181b024014198052ae0141980507a02412005", + "0xa70052ae014a700507c024a70052ae0140494b012024ab8052a2014a9809", + "0x48092ae014048240125301c02439e0d81a8242ae090a702303604420009", + "0x495700a5340290e0120f4a68242ae014aa8053a00240e0052ae01404841", + "0x283600a098048092ae014048240120f8029d1296014ab82407a0146d809", + "0x2d809086014ab805082014a000908252c1215700a52c0293a01210002957", + "0x490f00a55c0290f00a1380490f00a55c02809228024848052ae01421805", + "0x290908a0908a809212014ab8052120142700908a014ab80521e07012115", + "0x282a0120d40295700a0d4029550124500295700a52c0285c01211c02957", + "0x484700a55c0284700a1240491400a55c0291400a1780484000a55c02840", + "0x28809236014ab80522a014930090941248a8112ae014239140800d409149", + "0x12009012748028092a80248f0052ae014250051ba0248e8052ae01424805", + "0x492207c090ab80507c01485009242014ab80506c0141300901255c02809", + "0x288052ae014048310124980295700a4940285b0124940295700a488028e1", + "0x292600a1380480600a55c028510380908a8090a2014ab8050a201427009", + "0xaa809256014ab80507c014830090a6014ab80524c0181211501249802957", + "0x958052ae014958051fe024908052ae014908050540241a8052ae0141a805", + "0x48680d24b40895700a14c9592106a0487e8090a6014ab8050a601424809", + "0x295700a1a0028dd0124740295700a1a40285101246c0295700a4b402926", + "0x8e80504c0240495700a02412009268014e986700a55c1211e00a5200491e", + "0x8e80901255c0285800a128048580ac090ab8050ce014a38090aa014ab805", + "0x2d8052ae014a00052420240495700a4e80291e0125009d0242ae0142b005", + "0xab805236014aa8090bc014ab8050b8014928090b8014ab8050b601491009", + "0x2f00507a024120052ae0141200529a0242a8052ae0142a8050540248d805", + "0xab8052680140e00901255c028090480242f0240aa46c090050bc014ab805", + "0x1200529a0248e8052ae0148e8050540248d8052ae0148d8052aa024a4805", + "0x2809048024a482423a46c09005292014ab8052920141e809048014ab805", + "0x283800a5540494800a55c0294c00a098048092ae014aa80521c02404957", + "0xab805012090048093a8014049540125180295700a5200282a01251c02957", + "0x2c8052ae01404806012024ab80504c0142980901255c0282a00a12804809", + "0xab80504601415009036014ab805036014aa8090cc014ab8050b20140e009", + "0x1181b024014330052ae0143300507a024120052ae0141200529a02411805", + "0xab805036014aa8090d4014ab8050440140e00901255c0280904802433024", + "0x3500507a024120052ae0141200529a024118052ae014118050540240d805", + "0xab8050220142980901255c028090480243502404606c090050d4014ab805", + "0x284800a0a80494700a55c0281600a5540484800a55c0284e00a09804809", + "0xa38052aa024370052ae01436005038024360052ae0140492b01251802957", + "0x1e809048014ab805048014a680928c014ab80528c0141500928e014ab805", + "0x482400a0240495700a024048090dc090a3147024014370052ae01437005", + "0xab805024014aa80901255c02809048024270160487540a81204855c12005", + "0x481e04606c0895700a044090241f8024088052ae0140880525a02409005", + "0xab8050460140880901255c02809048024110053ac08402957048078028f7", + "0xa980901255c02809048024150053ae554138242ae0901300502402413005", + "0x494c012024ab8050420147a80901255c0295500a0d8048092ae01413805", + "0x15009036014ab805036014aa8092a8014ab8050580140e009058014ab805", + "0xaa0052ae014aa00507a024120052ae0141200529a0240a8052ae0140a805", + "0x494b012024ab805054014a980901255c02809048024aa02402a06c09005", + "0xa88242ae090a9815036044200092a6014ab8052a60141f0092a6014ab805", + "0x108051f40241a8052ae01404841012024ab8050120900494e066090ec031", + "0x1c0051e60240495700a0248480901255c0283600a3d40483806c090ab805", + "0x494d00a55c0283100a098048092ae01404824012070029d9298014ab824", + "0x284000a16c0484000a55c0283d00a1c40483e2960f40895700a53002945", + "0x28710124240295700a10c0285b01210c0295700a52c0287101210402957", + "0x2700908e014ab8050124500484500a55c0290f00a16c0490f00a55c0283e", + "0xab805082450121150124500295700a11c1a82422a024238052ae01423805", + "0x15009094014ab80508a124121150121240295700a4248a82422a0248a805", + "0x12009012768028092a80248e8052ae014250050920248d8052ae014a6805", + "0x4922242090ab8050380140000923c014ab8050620141300901255c02809", + "0x295700a488028450124980295700a494028470124940295700a48402845", + "0xab8050a6014270090a6014ab8050120c40480600a55c0285100a11c04851", + "0x8a80925a014ab80524c4ac121150124ac0295700a14c1a82422a02429805", + "0x295700a1a40284901246c0295700a4780282a0121a40295700a01896824", + "0xab8050d00148f0090ce1a01215700a4740291d012024ab80501246c0491d", + "0x285500a4940485500a55c0293400a4880493400a55c0286700a48404809", + "0x294d01246c0295700a46c0282a0125440295700a5440295501215802957", + "0x48240121581211b2a20480285600a55c0285600a0f40482400a55c02824", + "0x198052aa0242c0052ae014a700504c0240495700a084028f5012024ab805", + "0x2809048024049db00a024aa009280014ab8050b001415009274014ab805", + "0x295700a0240300901255c0282300a14c048092ae0141100509402404957", + "0x281500a0a80481b00a55c0281b00a5540485c00a55c0285b00a0700485b", + "0xd81200a1700295700a1700283d0120900295700a0900294d01205402957", + "0xab80509c0141300901255c0281100a14c048092ae0140482401217012015", + "0x2809256024a00052ae0142f0050540249d0052ae0140b0052aa0242f005", + "0x282a0124e80295700a4e8029550125200295700a5240281c01252402957", + "0x294800a55c0294800a0f40482400a55c0282400a5340494000a55c02940", + "0xee015024090ab82400a02412005012024ab805012024049480485009d012", + "0x281500a0a80481200a55c0281200a554048092ae014048240121380b024", + "0x1181b02255c0281102a048089dd0120440295700a0440292d01205402957", + "0x108053c00240495700a02412009044014ef82100a55c1201e00a7780481e", + "0x495700a02412009054014f115500a55c1202700a7840482704c090ab805", + "0x120092a2014f19532a8090ab82405801409009058014ab80504c01408809", + "0xaa8053c80240495700a54c02836012024ab8052a8014a980901255c02809", + "0xd8052aa024198052ae01418805038024188052ae0140494c012024ab805", + "0x1e809048014ab805048014a6809046014ab80504601415009036014ab805", + "0xa88052a60240495700a024120090660901181b024014198052ae01419805", + "0xd811080024a70052ae014a700507c024a70052ae0140494b012024ab805", + "0xab805012104048092ae014048240125301c0243ca0d81a8242ae090a7023", + "0x1e8053ce0240495700a534029e40120f4a68242ae014aa8053cc0240e005", + "0x484000a55c0283600a098048092ae014048240120f8029e8296014ab824", + "0xab8052120142d809212014ab805082014388090861041215700a52c0293b", + "0x285b01211c0295700a11402938012114218242ae014218050fa02487805", + "0x8a80922a014ab80522a0142700922a014ab8050124500491400a55c02847", + "0xab80522801427009094014ab80521e124121150121240295700a4540e024", + "0x29550124740295700a10c0288001246c0295700a4502502422a0248a005", + "0x491d00a55c0291d00a2080484000a55c0284000a0a80483500a55c02835", + "0x930092444848f0112ae0148d91d0800d40913701246c0295700a46c02849", + "0x288052ae014910051ba024930052ae014908050a2024928052ae0148f005", + "0xf500900c014ab80506c0141300901255c02809048024049e900a024aa009", + "0x295700a4b4028470124b40295700a14c028450124ac298242ae0141f005", + "0x338050b6024338052ae014340051c20243412b04855c0292b00a42804869", + "0x121150121540295700a1540284e0121540295700a02418809268014ab805", + "0x295700a4d00284e0121600295700a1a42b02422a0242b0052ae0142a81c", + "0x1a8052aa024a00052ae0149580520c0249d0052ae0149a05804845404934", + "0x24809280014ab8052800147f80900c014ab80500c0141500906a014ab805", + "0x29260121782e05b02255c0293a2800181a8121fa0249d0052ae0149d005", + "0x485100a55c0285e00a3740492600a55c0285c00a1440492500a55c0285b", + "0xab80524c0141300901255c02809048024a40053d65240295704814402948", + "0xa300523a0240495700a1640284a012164a30242ae014a480528e024a3805", + "0x91009090014ab8050d40149080901255c0286600a4780486a0cc090ab805", + "0x928052ae014928052aa024370052ae0143600524a024360052ae01424005", + "0xab8050dc0141e809048014ab805048014a680928e014ab80528e01415009", + "0xa28052ae014a40050380240495700a024120090dc090a392502401437005", + "0xab805048014a680924c014ab80524c0141500924a014ab80524a014aa809", + "0x495700a0241200928a09093125024014a28052ae014a280507a02412005", + "0x295700a0e0029550121c40295700a53002826012024ab8052aa014f2009", + "0x48092ae01404824012024f60050125500487400a55c0287100a0a804873", + "0xe0090ec014ab805012018048092ae014130050a60240495700a0a80284a", + "0x118052ae014118050540240d8052ae0140d8052aa024a08052ae0143b005", + "0xa082404606c09005282014ab8052820141e809048014ab805048014a6809", + "0xd8052ae0140d8052aa024a20052ae014110050380240495700a02412009", + "0xab8052880141e809048014ab805048014a6809046014ab80504601415009", + "0x48092ae014088050a60240495700a024120092880901181b024014a2005", + "0x295700a1e40282a0121cc0295700a058029550121e40295700a13802826", + "0xab8050e6014aa809276014ab8052780140e009278014ab8050124ac04874", + "0x9d80507a024120052ae0141200529a0243a0052ae0143a00505402439805", + "0x120050120900280901255c028090120249d8240e81cc09005276014ab805", + "0x90052ae014090052aa0240495700a0241200909c058121ed02a04812157", + "0x29ef0120781181b02255c02811024090f7009022014ab80502201496809", + "0x130052ae014118050220240495700a02412009044014f802100a55c1201e", + "0x138052a60240495700a02412009054014f895504e090ab82404c01409009", + "0xab805012530048092ae014108053e40240495700a55402836012024ab805", + "0xa8050540240d8052ae0140d8052aa024aa0052ae0141600503802416005", + "0x90052a8014ab8052a80141e809048014ab805048014a680902a014ab805", + "0xab80501252c048092ae014150052a60240495700a024120092a80900a81b", + "0xf98312a2090ab8242a60540d811080024a98052ae014a980507c024a9805", + "0xab805042014fa00906a014ab805012104048092ae0140482401253819824", + "0xab824070014fa80901255c028092120240495700a0d8029f20120e01b024", + "0xa680509c024a68052ae01404914012024ab8050120900481c00a7d8a6005", + "0xfb94b00a55c1214c00a2580483d00a55c0294d06a0908a80929a014ab805", + "0xab8052960144c009080014ab8050620141300901255c028090480241f005", + "0x290900a1380490900a55c02809228024218052ae0142080526002420805", + "0x484500a55c0284321e0908a80921e014ab8052120f41211501242402957", + "0x48093f0014049540124500295700a1140284901211c0295700a1000282a", + "0x484900a55c0283e00a1140491500a55c0283100a098048092ae01404824", + "0x8d8052ae0148d80509c0248d8052ae014048310121280295700a12402847", + "0x8a8050540248f0052ae0142511d0484540491d00a55c0291b07a0908a809", + "0x2809048024049f800a024aa009228014ab80523c0142480908e014ab805", + "0x910050b6024910052ae0140e0050e2024908052ae0141880504c02404957", + "0x121150124980295700a4980284e0124980295700a0241880924a014ab805", + "0x295700a4840282a0120180295700a4942882422a024288052ae01493035", + "0x1215700a4500291d012024ab80501246c0491400a55c0280600a12404847", + "0x292d00a4880492d00a55c0292b00a484048092ae0142980523c02495853", + "0x282a0125440295700a544029550121a00295700a1a4029250121a402957", + "0x286800a55c0286800a0f40482400a55c0282400a5340484700a55c02847", + "0xa700504c0240495700a084029f2012024ab8050120900486804811ca8812", + "0xaa0090aa014ab8050ce01415009268014ab805066014aa8090ce014ab805", + "0x282300a14c048092ae014110050940240495700a024120090127e402809", + "0x281b00a5540485800a55c0285600a0700485600a55c0280900c02404957", + "0x283d0120900295700a0900294d0120540295700a0540282a01206c02957", + "0x281100a14c048092ae01404824012160120150360480285800a55c02858", + "0x9d0050540249a0052ae0140b0052aa0249d0052ae0142700504c02404957", + "0x295501216c0295700a5000281c0125000295700a024958090aa014ab805", + "0x482400a55c0282400a5340485500a55c0285500a0a80493400a55c02934", + "0x12005012024ab8050120240485b0481549a01200a16c0295700a16c0283d", + "0x281200a554048092ae014048240121380b0243f4054090242ae09002809", + "0xf023036044ab805022048121fb0120440295700a0440292d01204802957", + "0x282300a044048092ae01404824012088029fd042014ab82403c014fe009", + "0x48092ae014048240120a8029fe2aa09c121570480980281201209802957", + "0xa600901255c0282100a7fc048092ae014aa80506c0240495700a09c02953", + "0x481b00a55c0281b00a5540495400a55c0282c00a0700482c00a55c02809", + "0x295700a5500283d0120900295700a0900294d0120540295700a0540282a", + "0xa580901255c0282a00a54c048092ae014048240125501201503604802954", + "0x1215704854c0a81b0221000495300a55c0295300a0f80495300a55c02809", + "0x2a010120d40295700a0242080901255c02809048024a703304880018951", + "0x2a02012024ab805012424048092ae0141b0053fe0241c03604855c02821", + "0xa68052ae0141880504c0240495700a024120090380150194c00a55c12038", + "0x295700a0248a009296014ab80507a0149800907a014ab8052980144c009", + "0x2002422a024200052ae0141f0350484540483e00a55c0283e00a1380483e", + "0x490900a55c0284100a1240484300a55c0294d00a0a80484100a55c0294b", + "0x8780509c024878052ae01404831012024ab8050120900480940801404954", + "0x10304700a55c1201c00a8140484500a55c0290f06a0908a80921e014ab805", + "0xab80508e0143880922a014ab8050620141300901255c028090480248a005", + "0x291b00a1380491b00a55c02809228024250052ae014248050b602424805", + "0x491e00a55c0284a23a0908a80923a014ab8052361141211501246c02957", + "0x4809408014049540124240295700a4780284901210c0295700a4540282a", + "0x18809242014ab8050620141300901255c0291400a128048092ae01404824", + "0x928052ae014910450484540492200a55c0292200a1380492200a55c02809", + "0x495700a0248d809212014ab80524a01424809086014ab80524201415009", + "0xab8050a20149080901255c0292600a4780485124c090ab8052120148e809", + "0xa88052aa024958052ae0142980524a024298052ae0140300524402403005", + "0x1e809048014ab805048014a6809086014ab805086014150092a2014ab805", + "0x108053fe0240495700a0241200925609021951024014958052ae01495805", + "0x282a0121a40295700a0cc029550124b40295700a53802826012024ab805", + "0x282200a128048092ae01404824012025038050125500486800a55c0292d", + "0xab8050ce0140e0090ce014ab805012018048092ae014118050a602404957", + "0x1200529a0240a8052ae0140a8050540240d8052ae0140d8052aa0249a005", + "0x28090480249a02402a06c09005268014ab8052680141e809048014ab805", + "0x281600a5540485500a55c0284e00a098048092ae014088050a602404957", + "0x2b0050380242b0052ae0140492b0121a00295700a1540282a0121a402957", + "0xa68090d0014ab8050d0014150090d2014ab8050d2014aa8090b0014ab805", + "0x48090b0090340690240142c0052ae0142c00507a024120052ae01412005", + "0x2809048024270160488200a81204855c120050120900280901255c02809", + "0x9024412024088052ae0140880525a024090052ae014090052aa02404957", + "0x2809048024110054160840295704807802a0a0120781181b02255c02811", + "0x15005418554138242ae09013005024024130052ae0141180502202404957", + "0x10680901255c0295500a0d8048092ae014138052a60240495700a02412009", + "0xaa8092a8014ab8050580140e009058014ab805012530048092ae01410805", + "0x120052ae0141200529a0240a8052ae0140a8050540240d8052ae0140d805", + "0xa980901255c02809048024aa02402a06c090052a8014ab8052a80141e809", + "0x200092a6014ab8052a60141f0092a6014ab80501252c048092ae01415005", + "0x4841012024ab8050120900494e066091070312a2090ab8242a60540d811", + "0x8480901255c0283600a8340483806c090ab8050420150780906a014ab805", + "0x48092ae0140482401207002a11298014ab8240700150800901255c02809", + "0x295700a0f4029300120f40295700a530028980125340295700a0c402826", + "0x283e06a0908a80907c014ab80507c0142700907c014ab8050124500494b", + "0x24809086014ab80529a01415009082014ab8052961001211501210002957", + "0x1880504c0240495700a02412009012848028092a8024848052ae01420805", + "0x8a04704855c0284500a29404845038090ab8050380145180921e014ab805", + "0x295700a454028a70124540295700a11c0298f012024ab80522801496009", + "0x291b00a1c4048092ae014250053200248d84a04855c0281c00a29404849", + "0x9080509c024908052ae014048310124780295700a4740285b01247402957", + "0x928052ae014249220484540492200a55c0292106a0908a809242014ab805", + "0x292600a1240484300a55c0290f00a0a80492600a55c0291e24a0908a809", + "0x2880523c0240305104855c0290900a474048092ae0140491b01242402957", + "0x29250124ac0295700a14c0292201214c0295700a01802921012024ab805", + "0x484300a55c0284300a0a80495100a55c0295100a5540492d00a55c0292b", + "0x492d04810ca881200a4b40295700a4b40283d0120900295700a0900294d", + "0xaa8090d2014ab80529c0141300901255c0282100a834048092ae01404824", + "0x1200901284c028092a8024338052ae01434805054024340052ae01419805", + "0x280900c0240495700a08c02853012024ab8050440142500901255c02809", + "0x282a01206c0295700a06c029550121540295700a4d00281c0124d002957", + "0x285500a55c0285500a0f40482400a55c0282400a5340481500a55c02815", + "0x2700504c0240495700a04402853012024ab805012090048550480540d812", + "0x958090ce014ab8050ac014150090d0014ab80502c014aa8090ac014ab805", + "0x486800a55c0286800a5540493a00a55c0285800a0700485800a55c02809", + "0x295700a4e80283d0120900295700a0900294d01219c0295700a19c0282a", + "0x90242ae09002809048014048092ae014048090124e8120670d00480293a", + "0x282a0120480295700a04802955012024ab8050120900484e02c0910a015", + "0x895700a0440a8120228540481100a55c0281100a4b40481500a55c02815", + "0x10c00901255c028090480241100542e0840295704807802a160120781181b", + "0x2809048024150054345540295704809c02a1901209c130242ae01410805", + "0xa880543654caa0242ae09016005024024160052ae0141300502202404957", + "0x10e00901255c0295300a0d8048092ae014aa0052a60240495700a02412009", + "0xaa809066014ab8050620140e009062014ab805012530048092ae014aa805", + "0x120052ae0141200529a024118052ae014118050540240d8052ae0140d805", + "0xa980901255c028090480241982404606c09005066014ab8050660141e809", + "0x2000929c014ab80529c0141f00929c014ab80501252c048092ae014a8805", + "0x4841012024ab8050120900494c0700910e83606a090ab82429c08c0d811", + "0x10f00901255c0294d00a8700483d29a090ab8052aa014ae809038014ab805", + "0x295700a0d802826012024ab8050120900483e00a87ca58052ae0901e805", + "0xab8050124500484300a55c0284100a4c00484100a55c0294b00a26004840", + "0x1211501243c0295700a4240e02422a024848052ae0148480509c02484805", + "0x8a0052ae01420005054024238052ae0141a8052aa024228052ae0142190f", + "0x1880901255c0280904802404a2000a024aa00922a014ab80508a01424809", + "0x250052ae0142481c0484540484900a55c0284900a1380484900a55c02809", + "0xab80507c0145900906c014ab80506c0141500906a014ab80506a014aa809", + "0x8e91b02255c0284a07c0d81a812250024250052ae014250050920241f005", + "0x8e80504c0240495700a024120092440151092100a55c1211e00a5200491e", + "0xaa80901255c0285100a1280485124c090ab805242014a380924a014ab805", + "0x8a8052ae014930050920248a0052ae01492805054024238052ae0148d805", + "0xab8050a60149080901255c0280600a4780485300c090ab80522a0148e809", + "0x238052aa024348052ae0149680524a024968052ae0149580524402495805", + "0x1e809048014ab805048014a6809228014ab8052280141500908e014ab805", + "0x910050380240495700a024120090d20908a047024014348052ae01434805", + "0xa680923a014ab80523a01415009236014ab805236014aa8090d0014ab805", + "0x120090d00908e91b024014340052ae0143400507a024120052ae01412005", + "0x295501219c0295700a53002826012024ab8052aa0150e00901255c02809", + "0x4824012025110050125500485500a55c0286700a0a80493400a55c02838", + "0xab805012018048092ae014130050a60240495700a0a80284a012024ab805", + "0x118050540240d8052ae0140d8052aa0242c0052ae0142b0050380242b005", + "0x90050b0014ab8050b00141e809048014ab805048014a6809046014ab805", + "0xd8052aa0249d0052ae014110050380240495700a024120090b00901181b", + "0x1e809048014ab805048014a6809046014ab80504601415009036014ab805", + "0x88050a60240495700a024120092740901181b0240149d0052ae0149d005", + "0x282a0124d00295700a058029550125000295700a13802826012024ab805", + "0xaa8090b8014ab8050b60140e0090b6014ab8050124ac0485500a55c02940", + "0x120052ae0141200529a0242a8052ae0142a8050540249a0052ae0149a005", + "0x280901255c028090120242e0240aa4d0090050b8014ab8050b80141e809", + "0x90052aa0240495700a0241200909c0581222302a0481215704801404824", + "0x1181b02255c028110240909b009022014ab80502201496809024014ab805", + "0x108051a80240495700a024120090440151202100a55c1201e00a2340481e", + "0x2a252aa09c12157048098028120120980295700a08c02811012024ab805", + "0x48092ae014aa80506c0240495700a09c02953012024ab8050120900482a", + "0xd8052ae0140d8052aa024aa0052ae01416005038024160052ae0140494c", + "0xab8052a80141e809048014ab805048014a680902a014ab80502a01415009", + "0x48092ae014150052a60240495700a024120092a80900a81b024014aa005", + "0xab8242a60540d811080024a98052ae014a980507c024a98052ae0140494b", + "0x483500a55c0283100a098048092ae014048240125381982444c0c4a8824", + "0x495700a0e00291e0125301c0242ae0141b00523a0241b0052ae01404841", + "0xab80529a0149280929a014ab80503801491009038014ab80529801490809", + "0x1200529a0241a8052ae0141a805054024a88052ae014a88052aa0241e805", + "0x28090480241e82406a5440900507a014ab80507a0141e809048014ab805", + "0xa58050540241f0052ae014198052aa024a58052ae014a700504c02404957", + "0xab8050440142500901255c0280904802404a2700a024aa009080014ab805", + "0x295700a1040281c0121040295700a0240300901255c0282300a14c04809", + "0x282400a5340481500a55c0281500a0a80481b00a55c0281b00a55404843", + "0xab805012090048430480540d81200a10c0295700a10c0283d01209002957", + "0xab80502c014aa809212014ab80509c0141300901255c0281100a14c04809", + "0x290f00a0700490f00a55c02809256024200052ae014848050540241f005", + "0x294d0121000295700a1000282a0120f80295700a0f80295501211402957", + "0x48090121141204007c0480284500a55c0284500a0f40482400a55c02824", + "0xab8050120900484e02c09114015024090ab82400a02412005012024ab805", + "0x482100a8a40f02304855c1201b00a0480481b00a55c0281100a04404809", + "0x482600a55c0282200a0580482200a55c0281e00a054048092ae01404824", + "0x120090540151595504e090ab82404c0481222a0120980295700a0980284e", + "0x116154058090ab82404601409009046014ab8050460141080901255c02809", + "0xab8052a20140b0092a2014ab8052a80140a80901255c02809048024a9805", + "0x2a2e29c0cc121570480c41382445a024188052ae0141880509c02418805", + "0x121570480b0028120120b00295700a0b002821012024ab80501209004835", + "0x1c00506c0240495700a0d802953012024ab8050120900494c00a8bc1c036", + "0xab805012530048092ae014aa8053200240495700a5380292c012024ab805", + "0xa805054024198052ae014198052aa024a68052ae0140e0050380240e005", + "0x900529a014ab80529a0141e809048014ab805048014a680902a014ab805", + "0xab80501252c048092ae014a60052a60240495700a0241200929a0900a833", + "0x11803e296090ab82407a054198110800241e8052ae0141e80507c0241e805", + "0xa71550488c40484300a55c0283e00a098048092ae0140482401210420024", + "0xae00901255c0290f00a8cc0484521e090ab80521201519009212014ab805", + "0x1215700a11c028a501211c228242ae01422805146024228052ae01422805", + "0x284900a29c0484900a55c0291400a63c048092ae0148a8052580248a914", + "0x2871012024ab805236014c800923a46c1215700a114028a501212802957", + "0x8a809244014ab8050121040492100a55c0291e00a16c0491e00a55c0291d", + "0xab80524c0148e80924c014ab805242494121150124940295700a12891024", + "0x29805244024298052ae014030052420240495700a1440291e01201828824", + "0x15009296014ab805296014aa80925a014ab80525601492809256014ab805", + "0x968052ae0149680507a024120052ae0141200529a024218052ae01421805", + "0x2990012024ab80529c0149600901255c028090480249682408652c09005", + "0x150090d0014ab805080014aa8090d2014ab8050820141300901255c02955", + "0x160052a60240495700a024120090128d0028092a8024338052ae01434805", + "0x1a8052aa0249a0052ae0140a80504c0240495700a55402990012024ab805", + "0x280904802404a3500a024aa0090ac014ab805268014150090aa014ab805", + "0xab80502a0141300901255c0295500a640048092ae014a98052a602404957", + "0x28092a80242b0052ae0142c0050540242a8052ae014138052aa0242c005", + "0x295700a05402826012024ab805046014a980901255c0280904802404a35", + "0x11a8050125500485600a55c0293a00a0a80485500a55c0282a00a5540493a", + "0xa00052ae0140a80504c0240495700a08402953012024ab80501209004809", + "0x295700a024030090ac014ab805280014150090aa014ab805024014aa809", + "0x285600a0a80485500a55c0285500a5540485c00a55c0285b00a0700485b", + "0x2a81200a1700295700a1700283d0120900295700a0900294d01215802957", + "0xab80509c0141300901255c0281100a14c048092ae0140482401217012056", + "0x2809256024338052ae0142f005054024340052ae0140b0052aa0242f005", + "0x282a0121a00295700a1a0029550125200295700a5240281c01252402957", + "0x294800a55c0294800a0f40482400a55c0282400a5340486700a55c02867", + "0x11b015024090ab82400a02412005012024ab8050120240494804819c34012", + "0x281100a4b40481200a55c0281200a554048092ae014048240121380b024", + "0x108052ae0900f0054700240f023036044ab8050220481223701204402957", + "0x1202600a0480482600a55c0282300a044048092ae0140482401208802a39", + "0x1b00901255c0282700a54c048092ae014048240120a802a3a2aa09c12157", + "0x281c0120b00295700a024a600901255c0282100a8ec048092ae014aa805", + "0x481500a55c0281500a0a80481b00a55c0281b00a5540495400a55c0282c", + "0x49540480540d81200a5500295700a5500283d0120900295700a0900294d", + "0x283e01254c0295700a024a580901255c0282a00a54c048092ae01404824", + "0x1200929c0cc1223c0625441215704854c0a81b0221000495300a55c02953", + "0x483806c090ab8050420151e80906a014ab8050620141300901255c02809", + "0x1215700a53002a3f0125301c0242ae0141c00547c0240495700a0d802a3b", + "0x283d00a29c0483d00a55c0281c00a63c048092ae014a6805466024a681c", + "0x28a3012024ab80507c014c80090800f81215700a0e002a3f01252c02957", + "0x495700a4240292c012424218242ae0142080514a0242084004855c02840", + "0xab8050800145280908a014ab80521e0145380921e014ab805086014c7809", + "0x8a8050b60248a8052ae0148a0050e20240495700a11c0299001245023824", + "0x8a809236014ab805296128121150121280295700a02420809092014ab805", + "0xab80523c0148e80923c014ab805092474121150124740295700a1148d824", + "0x92805244024928052ae014910052420240495700a4840291e01248890824", + "0x150092a2014ab8052a2014aa8090a2014ab80524c0149280924c014ab805", + "0x288052ae0142880507a024120052ae0141200529a0241a8052ae0141a805", + "0x2826012024ab8050420151d80901255c028090480242882406a54409005", + "0x492b00a55c0280600a0a80485300a55c0283300a5540480600a55c0294e", + "0x118050a60240495700a0880284a012024ab8050120900480948001404954", + "0xd8052aa024348052ae01496805038024968052ae01404806012024ab805", + "0x1e809048014ab805048014a680902a014ab80502a01415009036014ab805", + "0x88050a60240495700a024120090d20900a81b024014348052ae01434805", + "0x282a01214c0295700a058029550121a00295700a13802826012024ab805", + "0xaa809268014ab8050ce0140e0090ce014ab8050124ac0492b00a55c02868", + "0x120052ae0141200529a024958052ae01495805054024298052ae01429805", + "0x280901255c028090120249a02425614c09005268014ab8052680141e809", + "0x88050220240495700a0241200909c0581224102a0481215704801404824", + "0x495700a024120090420152101e046090ab82403601409009036014ab805", + "0x482200a55c028092980240495700a07802836012024ab805046014a9809", + "0x295700a0540282a0120480295700a048029550120980295700a0880281c", + "0x120150240480282600a55c0282600a0f40482400a55c0282400a53404815", + "0x482700a55c028092960240495700a08402953012024ab80501209004826", + "0xaa02c04890c1515504855c1202702a0480884001209c0295700a09c0283e", + "0x495100a55c02809082024a98052ae0141500504c0240495700a02412009", + "0x295700a0cc02921012024ab8050620148f0090660c41215700a5440291d", + "0x295500a5540483600a55c0283500a4940483500a55c0294e00a4880494e", + "0x283d0120900295700a0900294d01254c0295700a54c0282a01255402957", + "0x295400a098048092ae014048240120d8121532aa0480283600a55c02836", + "0x49540120700295700a0e00282a0125300295700a0b0029550120e002957", + "0xab80509c0141300901255c0281100a14c048092ae0140482401202522005", + "0x28092560240e0052ae014a6805054024a60052ae0140b0052aa024a6805", + "0x282a0125300295700a5300295501252c0295700a0f40281c0120f402957", + "0x294b00a55c0294b00a0f40482400a55c0282400a5340481c00a55c0281c", + "0x122815024090ab82400a02412005012024ab8050120240494b048070a6012", + "0x281100a4b40481200a55c0281200a554048092ae014048240121380b024", + "0x108052ae0900f00548e0240f023036044ab8050220481224601204402957", + "0x1202600a0480482600a55c0282300a044048092ae0140482401208802a48", + "0x1b00901255c0282700a54c048092ae014048240120a802a492aa09c12157", + "0x281c0120b00295700a024a600901255c0282100a578048092ae014aa805", + "0x481500a55c0281500a0a80481b00a55c0281b00a5540495400a55c0282c", + "0x49540480540d81200a5500295700a5500283d0120900295700a0900294d", + "0x283e01254c0295700a024a580901255c0282a00a54c048092ae01404824", + "0x1200929c0cc1224a0625441215704854c0a81b0221000495300a55c02953", + "0x483806c090ab8050420152580906a014ab8050620141300901255c02809", + "0x1215700a53002a4d0125301c0242ae0141c0054980240495700a0d80295e", + "0x283d00a11c0483d00a55c0281c00a114048092ae014a680549c024a681c", + "0x2a4f012024ab80507c014690090800f81215700a0e002a4d01252c02957", + "0xab80508a0149800908a014ab8050820144c00921e4242184102455c02840", + "0x848050e20248a8052ae0148a00508e0248a0052ae0142180508a02423805", + "0x53809236014ab80521e014c7809094014ab8050920142d809092014ab805", + "0x908052ae014a591e0484540491e00a55c028090820248e8052ae0148d805", + "0x9282422a024928052ae0148a9220484540492200a55c028472420908a809", + "0x30242ae0142880523a024288052ae0148e9260484540492600a55c0284a", + "0xab80525601491009256014ab8050a60149080901255c0280600a47804853", + "0x1a805054024a88052ae014a88052aa024348052ae0149680524a02496805", + "0x90050d2014ab8050d20141e809048014ab805048014a680906a014ab805", + "0x294e00a098048092ae014108052bc0240495700a024120090d20901a951", + "0x49540124d00295700a1a00282a01219c0295700a0cc029550121a002957", + "0xab8050460142980901255c0282200a128048092ae0140482401202528005", + "0xab805036014aa8090ac014ab8050aa0140e0090aa014ab80501201804809", + "0x2b00507a024120052ae0141200529a0240a8052ae0140a8050540240d805", + "0xab8050220142980901255c028090480242b02402a06c090050ac014ab805", + "0x285800a0a80486700a55c0281600a5540485800a55c0284e00a09804809", + "0x338052aa024a00052ae0149d0050380249d0052ae0140492b0124d002957", + "0x1e809048014ab805048014a6809268014ab805268014150090ce014ab805", + "0x482400a0240495700a024048092800909a067024014a00052ae014a0005", + "0xab805024014aa80901255c02809048024270160489440a81204855c12005", + "0x90114a4024088052ae0140880525a0240a8052ae0140a80505402409005", + "0x482401208802a54042014ab82403c0152980903c08c0d8112ae01408815", + "0x2a572aa014ab82404e0152b00904e0981215700a08402a55012024ab805", + "0x121570480b0028120120b00295700a09802811012024ab8050120900482a", + "0xa980506c0240495700a55002953012024ab8050120900495100a960a9954", + "0x283100a0700483100a55c028092980240495700a5540295b012024ab805", + "0x294d01208c0295700a08c0282a01206c0295700a06c029550120cc02957", + "0x48240120cc120230360480283300a55c0283300a0f40482400a55c02824", + "0x294e00a0f80494e00a55c028092960240495700a54402953012024ab805", + "0x2809048024a60380489641b03504855c1214e04606c0884001253802957", + "0xa68054b60240495700a0700295b0125340e0242ae014aa8054b402404957", + "0x48092ae0141f0054ba0241f14b04855c0283d00a9700483d29a090ab805", + "0x1215700a53402a5c0121040295700a100028470121000295700a52c02845", + "0x878052b40248790904855c0290900a978048092ae014218051a402484843", + "0x2d809228014ab80508e0149c00908e014ab80508a0152f80908a014ab805", + "0x250052ae014208490484540484900a55c028090820248a8052ae0148a005", + "0x290900a5680491b00a55c029150940908a80922a014ab80522a01427009", + "0x28820120d80295700a0d80282a0120d40295700a0d40295501247402957", + "0xab8052364741b0350244dc0491b00a55c0291b00a1240491d00a55c0291d", + "0x48092ae0140482401249802a6024a014ab824244014a40092444848f011", + "0xab8050a6014250090a60181215700a494029470121440295700a48402826", + "0x292d00a484048092ae0149580523c0249692b04855c0280600a47404809", + "0x295501219c0295700a1a0029250121a00295700a1a4029220121a402957", + "0x482400a55c0282400a5340485100a55c0285100a0a80491e00a55c0291e", + "0x281c012024ab805012090048670481448f01200a19c0295700a19c0283d", + "0x492100a55c0292100a0a80491e00a55c0291e00a5540493400a55c02926", + "0x49340484848f01200a4d00295700a4d00283d0120900295700a0900294d", + "0xaa8090aa014ab8052980141300901255c0295500a56c048092ae01404824", + "0x12009012984028092a80242c0052ae0142a8050540242b0052ae0141c005", + "0x280900c0240495700a09802853012024ab8050540142500901255c02809", + "0x282a01206c0295700a06c029550125000295700a4e80281c0124e802957", + "0x294000a55c0294000a0f40482400a55c0282400a5340482300a55c02823", + "0x295501216c0295700a0880281c012024ab8050120900494004808c0d812", + "0x482400a55c0282400a5340482300a55c0282300a0a80481b00a55c0281b", + "0x2853012024ab8050120900485b04808c0d81200a16c0295700a16c0283d", + "0x150090ac014ab80502c014aa8090b8014ab80509c0141300901255c02811", + "0x494900a55c0285e00a0700485e00a55c028092560242c0052ae0142e005", + "0x295700a0900294d0121600295700a1600282a0121580295700a15802955", + "0x48092ae01404809012524120580ac0480294900a55c0294900a0f404824", + "0x2955012024ab8050120900484e02c09131015024090ab82400a02412005", + "0xd8112ae0140881204898c0481100a55c0281100a4b40481200a55c02812", + "0x2811012024ab8050120900482200a994108052ae0900f0054c80240f023", + "0xab8050120900482a00a998aa82704855c1202600a0480482600a55c02823", + "0x495700a08402a67012024ab8052aa0141b00901255c0282700a54c04809", + "0x295700a06c029550125500295700a0b00281c0120b00295700a024a6009", + "0x295400a0f40482400a55c0282400a5340481500a55c0281500a0a80481b", + "0x495700a0a802953012024ab805012090049540480540d81200a55002957", + "0x1215302a06c0884001254c0295700a54c0283e01254c0295700a024a5809", + "0x1a8052ae0141880504c0240495700a0241200929c0cc1226806254412157", + "0xab8050700153500901255c0283600a99c0483806c090ab80504201534809", + "0x2845012024ab80529a0153600929a0701215700a53002a6b0125301c024", + "0x2003e04855c0283800a9ac0494b00a55c0283d00a11c0483d00a55c0281c", + "0x2080508a024879090861040915700a10002a6d012024ab80507c01469009", + "0x23809228014ab8050860142280908e014ab80508a0142380908a014ab805", + "0x250052ae0142480508e024248052ae0148480508a0248a8052ae0148a005", + "0x295700a0242080923a014ab80523601423809236014ab80521e01422809", + "0x121150124880295700a11c9082422a024908052ae014a591e0484540491e", + "0xab80523a498121150124980295700a1289282422a024928052ae0148a922", + "0x298052420240495700a0180291e01214c030242ae0142880523a02428805", + "0xaa8090d2014ab80525a0149280925a014ab80525601491009256014ab805", + "0x120052ae0141200529a0241a8052ae0141a805054024a88052ae014a8805", + "0x13380901255c028090480243482406a544090050d2014ab8050d20141e809", + "0x486700a55c0283300a5540486800a55c0294e00a098048092ae01410805", + "0x284a012024ab805012090048094dc014049540124d00295700a1a00282a", + "0x2a8050380242a8052ae01404806012024ab8050460142980901255c02822", + "0xa680902a014ab80502a01415009036014ab805036014aa8090ac014ab805", + "0x120090ac0900a81b0240142b0052ae0142b00507a024120052ae01412005", + "0x29550121600295700a13802826012024ab8050220142980901255c02809", + "0xe009274014ab8050124ac0493400a55c0285800a0a80486700a55c02816", + "0x9a0052ae0149a005054024338052ae014338052aa024a00052ae0149d005", + "0xa002426819c09005280014ab8052800141e809048014ab805048014a6809", + "0x1200909c0581226f02a048121570480140482400a0240495700a02404809", + "0xac809022014ab80502201496809024014ab805024014aa80901255c02809", + "0x120090440153882100a55c1201e00a9c00481e04606c0895700a04409024", + "0x13915504e090ab82404c0140900904c014ab8050460140880901255c02809", + "0x495700a55402836012024ab80504e014a980901255c0280904802415005", + "0xaa0052ae01416005038024160052ae0140494c012024ab80504201539809", + "0xab805048014a680902a014ab80502a01415009036014ab805036014aa809", + "0x495700a024120092a80900a81b024014aa0052ae014aa00507a02412005", + "0xa98052ae014a980507c024a98052ae0140494b012024ab805054014a9809", + "0x48092ae01404824012538198244e80c4a88242ae090a981503604420009", + "0x1215700a0d802a76012024ab80506a0153980906c0d41215700a08402a75", + "0xa60050e20240495700a07002a78012070a60242ae0141c0054ee0241c036", + "0x1211501252c0295700a0242080907a014ab80529a0142d80929a014ab805", + "0x495700a1000292c012104200242ae0141b0054ee0241f0052ae0141e94b", + "0xab8050120900490900a9e4218052ae090208052b00240495700a02484809", + "0x284500a4c00484500a55c0284300a2600490f00a55c0283100a09804809", + "0x1f02422a0248a0052ae0148a00509c0248a0052ae0140491401211c02957", + "0x250052ae01487805054024248052ae014239150484540491500a55c02914", + "0x2500901255c0280904802404a7a00a024aa009236014ab80509201424809", + "0x2700923c014ab8050120c40491d00a55c0283100a098048092ae01484805", + "0x295700a4740282a0124840295700a4781f02422a0248f0052ae0148f005", + "0x1215700a46c0291d012024ab80501246c0491b00a55c0292100a1240484a", + "0x292600a4880492600a55c0292500a484048092ae0149100523c02492922", + "0x282a0125440295700a544029550120180295700a1440292501214402957", + "0x280600a55c0280600a0f40482400a55c0282400a5340484a00a55c0284a", + "0xa700504c0240495700a08402a73012024ab80501209004806048128a8812", + "0xaa00925a014ab8050a601415009256014ab805066014aa8090a6014ab805", + "0x282300a14c048092ae014110050940240495700a024120090129ec02809", + "0x281b00a5540486800a55c0286900a0700486900a55c0280900c02404957", + "0x283d0120900295700a0900294d0120540295700a0540282a01206c02957", + "0x281100a14c048092ae014048240121a0120150360480286800a55c02868", + "0x33805054024958052ae0140b0052aa024338052ae0142700504c02404957", + "0x29550121540295700a4d00281c0124d00295700a0249580925a014ab805", + "0x482400a55c0282400a5340492d00a55c0292d00a0a80492b00a55c0292b", + "0x12005012024ab805012024048550484b49581200a1540295700a1540283d", + "0x281100a044048092ae014048240121380b0244f8054090242ae09002809", + "0x48092ae0140482401208402a7d03c08c1215704806c0281201206c02957", + "0x295700a0980284e0120980295700a088028160120880295700a07802815", + "0x495700a024120092a80b0150114fe554138242ae090130120489f804826", + "0xab8052a60149680904e014ab80504e014aa8092a6014ab80504601490809", + "0x14114e00a55c1203300aa04048330625440895700a54c13824500024a9805", + "0xab82406c0140900906c014ab8050620140880901255c028090480241a805", + "0x2836012024ab805070014a980901255c028090480240e0055065301c024", + "0x28092980240495700a5380295f012024ab8052aa0154200901255c0294c", + "0x282a0125440295700a544029550120f40295700a5340281c01253402957", + "0x283d00a55c0283d00a0f40482400a55c0282400a5340481500a55c02815", + "0x28092960240495700a07002953012024ab8050120900483d048054a8812", + "0x2003e04855c1214b02a5440884001252c0295700a52c0283e01252c02957", + "0x2a870124240295700a538aa82450c0240495700a0241200908610412285", + "0x484500a55c0284500aa24048092ae014878055100242290f04855c02909", + "0x291500a57c04915228090ab80508e0154580908e1141215700a11402a8a", + "0x2809082024250052ae0142480551a024248052ae0148a00551802404957", + "0x492123c090ab80508a0154580923a014ab80509446c1211501246c02957", + "0x2a8f244014ab8242420154700901255c028092120240495700a47802a84", + "0x295700a488028980124980295700a10002826012024ab80501209004925", + "0xab8050a6014270090a6014ab8050124500480600a55c0285100a4c004851", + "0x1500925a014ab80500c4ac121150124ac0295700a14c8e82422a02429805", + "0x12009012a40028092a8024340052ae01496805092024348052ae01493005", + "0x53809268014ab80524a014c78090ce014ab8050800141300901255c02809", + "0x485600a55c0285600a1380485600a55c028090620242a8052ae0149a005", + "0x286700a0a80493a00a55c028550b00908a8090b0014ab8050ac47412115", + "0x286800a474048092ae0140491b0121a00295700a4e8028490121a402957", + "0x29220121700295700a16c02921012024ab8052800148f0090b650012157", + "0x483e00a55c0283e00a5540494900a55c0285e00a4940485e00a55c0285c", + "0x295700a5240283d0120900295700a0900294d0121a40295700a1a40282a", + "0xaf80901255c0295500aa10048092ae014048240125241206907c04802949", + "0x494700a55c0284100a5540494800a55c0284300a098048092ae014a7005", + "0x284a012024ab80501209004809522014049540125180295700a5200282a", + "0xa80504c0240495700a0c402853012024ab8052aa0154200901255c02835", + "0xaa0090d4014ab8050b2014150090cc014ab8052a2014aa8090b2014ab805", + "0x295400aa10048092ae014160055080240495700a02412009012a4802809", + "0x282a00a5540484800a55c0281500a098048092ae014118052a602404957", + "0xab80501209004809526014049540121b80295700a1200282a0121b002957", + "0xab805024014aa80928a014ab80502a0141300901255c0282100a54c04809", + "0x370050a2024330052ae0143600524c024370052ae014a280505402436005", + "0x29550121cc0295700a1c40281c0121c40295700a024030090d4014ab805", + "0x482400a55c0282400a5340486a00a55c0286a00a0a80486600a55c02866", + "0x2853012024ab805012090048730481a83301200a1cc0295700a1cc0283d", + "0x1500928e014ab80502c014aa8090e8014ab80509c0141300901255c02811", + "0x494100a55c0287600a0700487600a55c02809256024a30052ae0143a005", + "0x295700a0900294d0125180295700a5180282a01251c0295700a51c02955", + "0xa8052ae01404a940125041214628e0480294100a55c0294100a0f404824", + "0x2701604855c120050120900280901255c028090120240495700a0254a809", + "0x270050540240b0052ae0140b0052aa0240495700a0241200904606c12296", + "0xf0112ae0140884e02c0454b809022014ab8050220149680909c014ab805", + "0x2a9a012024ab8050120900482700aa64130052ae0901100553002411021", + "0xab8050120900482c00aa70090052ae090150055360241515504855c02826", + "0xaa005024024090052ae01409015048a740495400a55c0295500a04404809", + "0x48092ae014a98052a60240495700a024120090620154f1512a6090ab824", + "0xe009066014ab805012530048092ae0140900553e0240495700a54402836", + "0x108052ae014108050540240f0052ae0140f0052aa024a70052ae01419805", + "0xa70240420780900529c014ab80529c0141e809048014ab805048014a6809", + "0x1f00906a014ab80501252c048092ae014188052a60240495700a02412009", + "0x481c2980915003806c090ab82406a0840f0110800241a8052ae0141a805", + "0x48092ae014a680553e0241e94d04855c0281200aa84048092ae01404824", + "0x1215700a0f802aa30120f81e8242ae0141e805544024a58052ae01404841", + "0x283800a0a80483600a55c0283600a554048092ae0142080554802420840", + "0x912801252c0295700a52c028490121000295700a100028b20120e002957", + "0x484700aa94228052ae0908780529002487909086044ab8052961001c036", + "0x2491504855c0283d00aa8c0491400a55c0290900a098048092ae01404824", + "0x295700a12802aa80121280295700a12402aa7012024ab80522a01553009", + "0x8d91d048454048092ae0148f0050940248f11d04855c0284500a51c0491b", + "0x9080901255c0292200a47804925244090ab8052420148e809242014ab805", + "0x30052ae0142880524a024288052ae01493005244024930052ae01492805", + "0xab805048014a6809228014ab80522801415009086014ab805086014aa809", + "0x495700a0241200900c0908a043024014030052ae0140300507a02412005", + "0x295700a10c0295501214c0295700a11c0281c012024ab80507a0154f809", + "0x285300a0f40482400a55c0282400a5340490900a55c0290900a0a804843", + "0x495700a04802a9f012024ab805012090048530484242181200a14c02957", + "0xab8052560141500925a014ab805298014aa809256014ab80503801413009", + "0x48092ae014160050940240495700a02412009012aa4028092a802434805", + "0xe0090d0014ab805012018048092ae0140a8055540240495700a55402853", + "0x108052ae014108050540240f0052ae0140f0052aa024338052ae01434005", + "0x33824042078090050ce014ab8050ce0141e809048014ab805048014a6809", + "0x493400a55c0282700a070048092ae0140a8055540240495700a02412009", + "0x295700a0900294d0120840295700a0840282a0120780295700a07802955", + "0x48092ae014048240124d01202103c0480293400a55c0293400a0f404824", + "0x485500a55c0282300a098048092ae014088050a60240495700a05402aaa", + "0x2b0052ae0140492b0121a40295700a1540282a0124b40295700a06c02955", + "0xab8050d20141500925a014ab80525a014aa8090b0014ab8050ac0140e009", + "0x3492d0240142c0052ae0142c00507a024120052ae0141200529a02434805", + "0x27016048aac0a81204855c120050120900280901255c028090120242c024", + "0x118242ae0900d8050240240d8052ae014088050220240495700a02412009", + "0x1100502c024110052ae0140f00502a0240495700a024120090420155601e", + "0xaa82704855c120260240911500904c014ab80504c0142700904c014ab805", + "0xab8050460141080901255c0295500a640048092ae014048240120a802aad", + "0xa80901255c02809048024a980555c550160242ae0901180502402411805", + "0x188052ae0141880509c024188052ae014a880502c024a88052ae014aa005", + "0x292c012024ab8050120900483500aabca703304855c1203104e09116809", + "0x15803806c090ab82405801409009058014ab8050580141080901255c0294e", + "0x495700a0e002836012024ab80506c014a980901255c02809048024a6005", + "0x295700a0cc029550125340295700a0700281c0120700295700a024a6009", + "0x294d00a0f40482400a55c0282400a5340481500a55c0281500a0a804833", + "0x495700a53002953012024ab8050120900494d0480541981200a53402957", + "0x1203d02a0cc088400120f40295700a0f40283e0120f40295700a024a5809", + "0x218052ae0141f00504c0240495700a02412009082100122b107c52c12157", + "0xab80521e0148f00908a43c1215700a4240291d0124240295700a02420809", + "0x291400a4940491400a55c0284700a4880484700a55c0284500a48404809", + "0x294d01210c0295700a10c0282a01252c0295700a52c0295501245402957", + "0x4824012454120432960480291500a55c0291500a0f40482400a55c02824", + "0x282a0121280295700a100029550121240295700a10402826012024ab805", + "0x282c00a54c048092ae01404824012025590050125500491b00a55c02849", + "0x8e8050540248f0052ae0141a8052aa0248e8052ae0140a80504c02404957", + "0xab8052a6014a980901255c0280904802404ab300a024aa009242014ab805", + "0x292200a0a80491e00a55c0282700a5540492200a55c0281500a09804809", + "0x495700a08c02953012024ab805012090048095660140495401248402957", + "0xab80524a0141500923c014ab805054014aa80924a014ab80502a01413009", + "0x48092ae014108052a60240495700a02412009012acc028092a802490805", + "0x295700a4980282a0124780295700a048029550124980295700a05402826", + "0xab80523c014aa80900c014ab8050a20140e0090a2014ab80501201804921", + "0x300507a024120052ae0141200529a024908052ae014908050540248f005", + "0xab8050220142980901255c02809048024030242424780900500c014ab805", + "0x285300a0a80484a00a55c0281600a5540485300a55c0284e00a09804809", + "0x250052aa024968052ae01495805038024958052ae0140492b01246c02957", + "0x1e809048014ab805048014a6809236014ab80523601415009094014ab805", + "0x482400a0240495700a0240480925a0908d84a024014968052ae01496805", + "0xab805024014aa80901255c0280904802427016048ad00a81204855c12005", + "0x901156a024088052ae0140880525a0240a8052ae0140a80505402409005", + "0x482401208802ab7042014ab82403c0155b00903c08c0d8112ae01408815", + "0x2ab92aa014ab82404e0149480904e0981215700a08402ab8012024ab805", + "0x121570480b0028120120b00295700a09802811012024ab8050120900482a", + "0xa980506c0240495700a55002953012024ab8050120900495100aae8a9954", + "0x283100a0700483100a55c028092980240495700a55402aa6012024ab805", + "0x294d01208c0295700a08c0282a01206c0295700a06c029550120cc02957", + "0x48240120cc120230360480283300a55c0283300a0f40482400a55c02824", + "0x294e00a0f80494e00a55c028092960240495700a54402953012024ab805", + "0x2809048024a6038048aec1b03504855c1214e04606c0884001253802957", + "0xa680554c0241e94d04855c0295500aaf00481c00a55c0280908202404957", + "0x28b20120d80295700a0d80282a0120d40295700a0d402955012024ab805", + "0xab8050380f41b0350244a00481c00a55c0281c00a1240483d00a55c0283d", + "0x48092ae0140482401210c02abd082014ab824080014a40090800f8a5811", + "0xab80508a0142500908a43c1215700a104029470124240295700a0f802826", + "0x291400a484048092ae0142380523c0248a04704855c0290f00a47404809", + "0x29550121280295700a124029250121240295700a4540292201245402957", + "0x482400a55c0282400a5340490900a55c0290900a0a80494b00a55c0294b", + "0x281c012024ab8050120900484a048424a581200a1280295700a1280283d", + "0x483e00a55c0283e00a0a80494b00a55c0294b00a5540491b00a55c02843", + "0x491b0480f8a581200a46c0295700a46c0283d0120900295700a0900294d", + "0xaa80923a014ab8052980141300901255c0295500aa98048092ae01404824", + "0x12009012af8028092a8024908052ae0148e8050540248f0052ae0141c005", + "0x280900c0240495700a09802853012024ab8050540142500901255c02809", + "0x282a01206c0295700a06c029550124940295700a4880281c01248802957", + "0x292500a55c0292500a0f40482400a55c0282400a5340482300a55c02823", + "0x29550124980295700a0880281c012024ab8050120900492504808c0d812", + "0x482400a55c0282400a5340482300a55c0282300a0a80481b00a55c0281b", + "0x2853012024ab8050120900492604808c0d81200a4980295700a4980283d", + "0x1500923c014ab80502c014aa8090a2014ab80509c0141300901255c02811", + "0x485300a55c0280600a0700480600a55c02809256024908052ae01428805", + "0x295700a0900294d0124840295700a4840282a0124780295700a47802955", + "0x48092ae0140480901214c1212123c0480285300a55c0285300a0f404824", + "0x2955012024ab8050120900484e02c0915f815024090ab82400a02412005", + "0x481100a55c0281100a4b40481500a55c0281500a0a80481200a55c02812", + "0x110055800840295704807802ab60120781181b02255c0281102a04808ab5", + "0x295704809c0292901209c130242ae014108055700240495700a02412009", + "0x282600a044048092ae014aa80554c0240495700a0241200905401560955", + "0x48092ae0140482401254402ac22a6550121570480b0028120120b002957", + "0xe009062014ab805012530048092ae014a980506c0240495700a55002953", + "0x118052ae014118050540240d8052ae0140d8052aa024198052ae01418805", + "0x1982404606c09005066014ab8050660141e809048014ab805048014a6809", + "0x1f00929c014ab80501252c048092ae014a88052a60240495700a02412009", + "0x494c0700916183606a090ab82429c08c0d811080024a70052ae014a7005", + "0x8e80929a014ab8050121040481c00a55c0283600a098048092ae01404824", + "0x1f0052ae014a58052420240495700a0f40291e01252c1e8242ae014a6805", + "0xab80506a014aa809082014ab80508001492809080014ab80507c01491009", + "0x2080507a024120052ae0141200529a0240e0052ae0140e0050540241a805", + "0xab8052980141300901255c02809048024208240380d409005082014ab805", + "0x28092a8024878052ae01421805054024848052ae0141c0052aa02421805", + "0x495700a09802853012024ab8050540142500901255c0280904802404ac4", + "0x295700a06c0295501211c0295700a1140281c0121140295700a02403009", + "0x284700a0f40482400a55c0282400a5340482300a55c0282300a0a80481b", + "0x295700a0880281c012024ab8050120900484704808c0d81200a11c02957", + "0x282400a5340482300a55c0282300a0a80481b00a55c0281b00a55404914", + "0xab8050120900491404808c0d81200a4500295700a4500283d01209002957", + "0xab80502c014aa80922a014ab80509c0141300901255c0281100a14c04809", + "0x284900a0700484900a55c02809256024878052ae0148a80505402484805", + "0x294d01243c0295700a43c0282a0124240295700a4240295501212802957", + "0x4ac50121281210f2120480284a00a55c0284a00a0f40482400a55c02824", + "0x280500a014ab80501201563009012014ab80501201427009012014ab805", + "0xab80501201563009012014ab80501201427009012014ab805012b1c04805", + "0x163009012014ab80501201427009012014ab805012b200480500a01402805", + "0x295700a09002811012024ab80501246c0480500a014028052ae01404805", + "0x2815012024ab8050120900481600ab240a81204855c1201100a04804811", + "0x481b00a55c0281b00a1380481b00a55c0284e00a0580484e00a55c02815", + "0x28090480240f005594024ab8240460141180904606c1215700a06c0281b", + "0x1201200a0480481200a55c0281200a084048092ae0140d80503c02404957", + "0x482700a55c0282200a054048092ae0140482401209802acb04408412157", + "0x160052ae01410805242024150052ae014049630125540295700a09c02816", + "0xab8050580149680900a014ab80500a01415009012014ab805012014aa809", + "0x481559a024aa8052ae014aa80509c024150052ae0141500559802416005", + "0x483300ab3c188052ae090a880559c024a89532a8044ab8052aa0a816005", + "0x1b0052ae0901a8055a20241a94e04855c0283100ab40048092ae01404824", + "0x283600ab4c0494c00a55c0295300a098048092ae014048240120e002ad2", + "0x16a80907a014ab80529a538122d40125340295700a0700296201207002957", + "0xa60052ae014a6005054024aa0052ae014aa0052aa024a58052ae0141e805", + "0x2826012024ab8050120900494b29855008805296014ab8052960156b009", + "0x484100a55c0283e00a0a80484000a55c0295400a5540483e00a55c02953", + "0x48095b0014049540124240295700a5380292d01210c0295700a0e002ad7", + "0x495400a55c0295400a5540490f00a55c0283300ab64048092ae01404824", + "0x1200921e54caa01100a43c0295700a43c02ad601254c0295700a54c0282a", + "0x292101211c0295700a024a700908a014ab80500a0141300901255c02809", + "0x484100a55c0284500a0a80484000a55c0280900a5540491400a55c02826", + "0x295700a10c02ada0124240295700a4500292d01210c0295700a11c02ad7", + "0x200052aa024250052ae014248055aa024248052ae0148a909048b5004915", + "0x8805094014ab8050940156b009082014ab80508201415009080014ab805", + "0xab8050240149080901255c0281e00a544048092ae0140482401212820840", + "0x8f00509c0248f0052ae0148e81b0480cc0491d00a55c028090620248d805", + "0x1300901255c02809048024908055b6024ab82423c0141180923c014ab805", + "0x492600a55c0292500ab700492500a55c0280929c024910052ae01402805", + "0xab80500c0156a80900c014ab8050a246c122d40121440295700a49802962", + "0x298055ac024910052ae01491005054024048052ae014048052aa02429805", + "0x495700a48402951012024ab80501209004853244024088050a6014ab805", + "0x295700a4b402ada0124b40295700a024a7009256014ab80500a01413009", + "0x48052aa024338052ae014340055aa024340052ae0143491b048b5004869", + "0x88050ce014ab8050ce0156b009256014ab80525601415009012014ab805", + "0xab8050125380493400a55c0280500a098048092ae0140482401219c95809", + "0x2c0245a80242c0052ae0140b0052420242b0052ae0142a8055b40242a805", + "0x480900a55c0280900a5540494000a55c0293a00ab540493a00a55c02856", + "0x8d8092804d00481100a5000295700a50002ad60124d00295700a4d00282a", + "0x280904802427016048b740a81204855c120050120900280901255c02809", + "0x108055c0078118242ae0900d8055be0240d8052ae014120055bc02404957", + "0x130052ae0140f0055c2024110052ae0140a80504c0240495700a02412009", + "0xab8052aa014270092aa014ab80504e0149800904e014ab80504c0144c009", + "0x29550120b00295700a08c0285c0120a80295700a5540882422a024aa805", + "0x482c00a55c0282c00a1780482200a55c0282200a0a80481200a55c02812", + "0x88052a254caa0112ae0141502c044048091490120a80295700a0a802849", + "0xab80502a0141300901255c0282100ab88048092ae01404824012544a9954", + "0xa70055c8024a70052ae01419811048b8c0483300a55c0280929c02418805", + "0xb2009062014ab80506201415009024014ab805024014aa80906a014ab805", + "0x281100a478048092ae014048240120d4188120220141a8052ae0141a805", + "0xab80506c0157300906c014ab8050124ac048092ae014120055ca02404957", + "0x1c0052c8024270052ae014270050540240b0052ae0140b0052aa0241c005", + "0x1202400a0480482400a55c0280500a0440483809c05808805070014ab805", + "0x481600a55c0281200a054048092ae0140482401205402ae702404412157", + "0xab82409c0241222d0121380295700a1380284e0121380295700a05802816", + "0x9009022014ab8050220141080901255c028090480240f0055d008c0d824", + "0xab8050440140a80901255c02809048024130055d2088108242ae09008805", + "0xd82445a024aa8052ae014aa80509c024aa8052ae0141380502c02413805", + "0x295700a08402821012024ab8050120900495400aba81602a04855c12155", + "0x2815012024ab8050120900483100abaca895304855c1202100a04804821", + "0x494e00a55c0294e00a1380494e00a55c0283300a0580483300a55c02951", + "0xa98052420240495700a024120090700157603606a090ab82429c0a81222d", + "0xa68052ae0140e0050cc0240e0052ae0141b02c04604576809298014ab805", + "0xab80529a01435009298014ab8052980149680906a014ab80506a014aa809", + "0x9600901255c0282300a4b0048092ae01404824012534a6035022014a6805", + "0x494b00a55c0295300a0840483d00a55c0283800a554048092ae01416005", + "0x160052580240495700a08c0292c012024ab805012090048095dc01404954", + "0x495401252c0295700a0c4028210120f40295700a0a802955012024ab805", + "0xab8052a8014aa80901255c0282300a4b0048092ae0140482401202577005", + "0x495700a02412009012bb8028092a8024a58052ae014108050420241e805", + "0x295700a098028210120f40295700a06c02955012024ab80504601496009", + "0x483d00a55c0281e00a554048092ae01404824012025770050125500494b", + "0x2955012024ab805012090048095dc0140495401252c0295700a04402821", + "0x2400907c014ab8050125380494b00a55c0281500a0840483d00a55c02809", + "0x200052ae014200050d4024208052ae014a5805242024200052ae0141f005", + "0x28120120440295700a09002811012024ab80501246c048400820f408805", + "0x295700a05402815012024ab8050120900481600abbc0a81204855c12011", + "0x281b00a1380482300a55c0281200a4840481b00a55c0284e00a0580484e", + "0x108055e0024ab82403c0141180903c06c1215700a06c0281b01206c02957", + "0x480900a55c0280900a554048092ae0140d80503c0240495700a02412009", + "0x282300a02408af101208c0295700a08c0292d0120140295700a0140282a", + "0x495700a024120090540157995500a55c1202700abc80482704c08808957", + "0x120092a20157b15300a55c1215400abd404954058090ab8052aa0157a009", + "0x17c009066014ab8052a60157b809062014ab80504c0141300901255c02809", + "0x295700a0d402afa0120d40295700a538160245f2024a70052ae01419805", + "0x283600a59c0483100a55c0283100a0a80482200a55c0282200a55404836", + "0x1c0052ae0141300504c0240495700a0241200906c0c41101100a0d802957", + "0x281c00abe80481c00a55c0294c0580917c809298014ab8052a20157d809", + "0x29670120e00295700a0e00282a0120880295700a0880295501253402957", + "0xab8050540157e00901255c02809048024a68380440440294d00a55c0294d", + "0x1e8052ce024130052ae01413005054024110052ae014110052aa0241e805", + "0x495700a08402951012024ab8050120900483d04c0880880507a014ab805", + "0xab80507c0142700907c014ab80529606c1203301252c0295700a02418809", + "0x280504c0240495700a024120090800157e8092ae0901f0050460241f005", + "0x2af80124240295700a10c02afe01210c0295700a024a7009082014ab805", + "0x238052ae014228055f4024228052ae01487823048be40490f00a55c02909", + "0xab80508e014b3809082014ab80508201415009012014ab805012014aa809", + "0x1300901255c0284000a544048092ae0140482401211c2080902201423805", + "0x484900a55c0291500abec0491500a55c0280929c0248a0052ae01402805", + "0xab805012014aa809236014ab8050940157d009094014ab80509208c122f9", + "0x8a0090220148d8052ae0148d8052ce0248a0052ae0148a00505402404805", + "0x8f0052ae0140494e0124740295700a01402826012024ab8050120900491b", + "0x29212440917c809244014ab80502c01490809242014ab80523c0157d809", + "0x282a0120240295700a024029550124980295700a49402afa01249402957", + "0x28092360249311d0120440292600a55c0292600a59c0491d00a55c0291d", + "0x495700a0241200909c058122ff02a048121570480140482400a02404957", + "0x120090420158081e046090ab82403601580009036014ab8050480152f809", + "0x3880904c014ab80503c01581009044014ab80502a0141300901255c02809", + "0xaa8052ae014aa80509c024aa8052ae014138050b6024138052ae01413005", + "0x281200a5540482c00a55c0282300a2000482a00a55c029550220908a809", + "0x28490120b00295700a0b0028820120880295700a0880282a01204802957", + "0xa9954022014a89532a8044ab8050540b0110120244dc0482a00a55c0282a", + "0x188052ae0140a80504c0240495700a08402b03012024ab80501209004951", + "0xab80529c0157200929c014ab805066044122e30120cc0295700a024a7009", + "0x1a8052c8024188052ae01418805054024090052ae014090052aa0241a805", + "0x495700a0440291e012024ab805012090048350620480880506a014ab805", + "0x1c0052ae0141b0055cc0241b0052ae0140492b012024ab8050480152e809", + "0xab805070014b200909c014ab80509c0141500902c014ab80502c014aa809", + "0x12157048090028120120900295700a014028110120e0270160220141c005", + "0x28160120580295700a04802815012024ab8050120900481500ac1009011", + "0xd84e04855c0284e00a06c0484e00a55c0284e00a1380484e00a55c02816", + "0xab80509c0140f00901255c028090480241180560a024ab82403601411809", + "0x482200ac181081e04855c1201100a0480481100a55c0281100a08404809", + "0x482700a55c0282600a0580482600a55c0282100a054048092ae01404824", + "0xab8242aa014118092aa09c1215700a09c0281b01209c0295700a09c0284e", + "0x281e00a084048092ae0141380503c0240495700a0241200905401583809", + "0x48092ae0140482401254c02b082a80b0121570480780281201207802957", + "0x295700a0c40284e0120c40295700a544028160125440295700a55002815", + "0x9080901255c028090480241a805612538198242ae0901880904808804831", + "0xa60052ae0141c0056140241c0052ae014a700504e0241b0052ae01416005", + "0xab80506c01496809066014ab805066014aa809038014ab80529801585809", + "0x48092ae014048240120701b0330220140e0052ae0140e0056180241b005", + "0x480961a014049540120f40295700a0b0028210125340295700a0d402955", + "0x483d00a55c0295300a0840494d00a55c0280900a554048092ae01404824", + "0x28090620240495700a0a802951012024ab8050120900480961a01404954", + "0x1180907c014ab80507c0142700907c014ab80529609c1203301252c02957", + "0x484100a55c0280929c0240495700a02412009080015870092ae0901f005", + "0x295700a10c02b0a0124240295700a0780292101210c0295700a10402835", + "0x290900a4b40480900a55c0280900a5540484500a55c0290f00ac2c0490f", + "0x495700a0241200908a4240481100a1140295700a11402b0c01242402957", + "0x295700a0780282101211c0295700a02402955012024ab805080014a8809", + "0x494d00a55c0280900a554048092ae014048240120258780501255004914", + "0x295700a0f402b1001211c0295700a534029260120f40295700a08802821", + "0x9080901255c0282300a544048092ae014048240120258780501255004914", + "0x250052ae0142484e0480cc0484900a55c028090620248a8052ae01408805", + "0x28090480248d805622024ab82409401411809094014ab80509401427009", + "0x291e00ac2c0491e00a55c0291d00ac480491d00a55c0280929c02404957", + "0x2b0c0124540295700a4540292d0120240295700a0240295501248402957", + "0xab805236014a880901255c02809048024909150120440292100a55c02921", + "0xab805012014aa80924a014ab80524401589809244014ab80501253804809", + "0x8a809022014928052ae014928056180248a8052ae0148a80525a02404805", + "0x295700a0540282101211c0295700a02402955012024ab80501209004925", + "0xab805228014908090a2014ab80524c0158980924c014ab80501253804914", + "0x295700a0140281101214403047022014288052ae0142880561802403005", + "0x2815012024ab8050120900481500ac500901104855c1202400a04804824", + "0x484e00a55c0284e00a1380484e00a55c0281600a0580481600a55c02812", + "0x28090480241180562a024ab824036014118090361381215700a1380281b", + "0x1201100a0480481100a55c0281100a084048092ae0142700503c02404957", + "0x482600a55c0282100a054048092ae0140482401208802b1604207812157", + "0xab82404e0241231701209c0295700a09c0284e01209c0295700a09802816", + "0x18c8092a8014ab80503c0149080901255c02809048024160056300a8aa824", + "0xaa8052ae014aa8052aa024a88052ae014a980511e024a98052ae01415005", + "0x49512a8554088052a2014ab8052a20149a8092a8014ab8052a801496809", + "0x483300a55c0281e00a0840483100a55c0282c00a554048092ae01404824", + "0x28210120c40295700a02402955012024ab8050120900480963401404954", + "0x282300a544048092ae014048240120258d0050125500483300a55c02822", + "0x1a80509c0241a8052ae014a704e0480cc0494e00a55c0280906202404957", + "0x1080901255c028090480241b005636024ab82406a0141180906a014ab805", + "0x28090480240e0056385301c0242ae09008805024024088052ae01408805", + "0x1e80509c0241e8052ae014a680502c024a68052ae014a600502a02404957", + "0xab8050120900484000ac741f14b04855c1203d0120901100907a014ab805", + "0x284300a23c0484300a55c0283e00ac780484100a55c0283800a48404809", + "0x29350121040295700a1040292d01252c0295700a52c0295501242402957", + "0xab805080014aa80901255c02809048024848412960440290900a55c02909", + "0x495700a02412009012c68028092a8024198052ae0141c00504202418805", + "0x4b1a00a024aa009066014ab80503801410809062014ab805012014aa809", + "0x490f00a55c0281100a484048092ae0141b0052a20240495700a02412009", + "0x48052ae014048052aa024238052ae01422805124024228052ae0140494e", + "0x484721e0240880508e014ab80508e0149a80921e014ab80521e01496809", + "0x483300a55c0281500a0840483100a55c0280900a554048092ae01404824", + "0x248052ae014198052420248a8052ae0148a0051240248a0052ae0140494e", + "0x482400a55c0280500a044049150920c40880522a014ab80522a0149a809", + "0x281200a054048092ae0140482401205402b1f0240441215704809002812", + "0x281b0121380295700a1380284e0121380295700a0580281601205802957", + "0x495700a02412009046015900092ae0900d8050460240d84e04855c0284e", + "0x12157048044028120120440295700a04402821012024ab80509c0140f009", + "0x28160120980295700a08402815012024ab8050120900482200ac841081e", + "0xaa8242ae090138090488a80482700a55c0282700a1380482700a55c02826", + "0xf0050240240f0052ae0140f0050420240495700a024120090580159102a", + "0x188052ae014a980502a0240495700a024120092a2015919532a8090ab824", + "0x120332aa09116809066014ab80506601427009066014ab8050620140b009", + "0x483800a55c0295400a484048092ae014048240120d802b2406a53812157", + "0xab80503801593009038014ab80529801592809298014ab80506a0a812231", + "0xa680564e0241c0052ae0141c00525a024a70052ae014a70052aa024a6805", + "0x495700a0a802990012024ab8050120900494d0705380880529a014ab805", + "0x4b2800a024aa009296014ab8052a80141080907a014ab80506c014aa809", + "0x483d00a55c0295500a554048092ae014150053200240495700a02412009", + "0x2955012024ab805012090048096500140495401252c0295700a54402821", + "0x4824012025940050125500494b00a55c0281e00a0840483d00a55c0282c", + "0x495401252c0295700a088028210120f40295700a02402955012024ab805", + "0xab8050220149080901255c0282300a544048092ae0140482401202594005", + "0x2080509c024208052ae0142004e0480cc0484000a55c028090620241f005", + "0xa700901255c0280904802421805652024ab82408201411809082014ab805", + "0x484500a55c0290f00ac980490f00a55c0290900aca80490900a55c02809", + "0x295700a11402b270120f80295700a0f80292d0120240295700a02402955", + "0x494e012024ab805086014a880901255c028090480242283e01204402845", + "0x96809012014ab805012014aa809228014ab80508e0159580908e014ab805", + "0x48240124501f0090220148a0052ae0148a00564e0241f0052ae0141f005", + "0x494e01252c0295700a054028210120f40295700a02402955012024ab805", + "0x193809094014ab80529601490809092014ab80522a0159580922a014ab805", + "0x282400a044048092ae0140491b0121242503d022014248052ae01424805", + "0x48092ae0140482401205802b2c02a048121570480440281201204402957", + "0x295700a0480292101206c0295700a138028160121380295700a05402815", + "0xf0050460240f01b04855c0281b00a06c0481b00a55c0281b00a13804823", + "0x2955012024ab8050360140f00901255c028090480241080565a024ab824", + "0x482300a55c0282300a4b40480500a55c0280500a0a80480900a55c02809", + "0x1500565c5540295704809c02ab601209c1302202255c0282300a02408ab5", + "0x295704855002929012550160242ae014aa8055700240495700a02412009", + "0xa9805660024188052ae0141300504c0240495700a024120092a201597953", + "0x483500a55c0294e0580919900929c014ab80506601598809066014ab805", + "0x295700a0c40282a0120880295700a088029550120d80295700a0d402b33", + "0x1300901255c028090480241b0310440440283600a55c0283600acd004831", + "0x295700a53016024664024a60052ae014a880566a0241c0052ae01413005", + "0x283800a0a80482200a55c0282200a5540494d00a55c0281c00accc0481c", + "0x495700a0241200929a0e01101100a5340295700a53402b340120e002957", + "0xab80504c01415009044014ab805044014aa80907a014ab8050540159b009", + "0x48092ae014048240120f4130220220141e8052ae0141e80566802413005", + "0x1f0052ae014a581b0480cc0494b00a55c028090620240495700a08402951", + "0x28090480242000566e024ab82407c0141180907c014ab80507c01427009", + "0x284300ace00484300a55c0280929c024208052ae0140280504c02404957", + "0x19980908a014ab80521e08c1233201243c0295700a42402b3101242402957", + "0x208052ae01420805054024048052ae014048052aa024238052ae01422805", + "0x2951012024ab805012090048470820240880508e014ab80508e0159a009", + "0x2b350124540295700a024a7009228014ab80500a0141300901255c02840", + "0x8d8052ae01425005666024250052ae01424823048cc80484900a55c02915", + "0xab8052360159a009228014ab80522801415009012014ab805012014aa809", + "0x491d00a55c0280500a098048092ae0140482401246c8a0090220148d805", + "0x910052ae0140b005242024908052ae0148f00566a0248f0052ae0140494e", + "0x280900a5540492600a55c0292500accc0492500a55c0292124409199009", + "0x481100a4980295700a49802b340124740295700a4740282a01202402957", + "0xb00567405402b39024014ab823048014b480901255c028092360249311d", + "0x28090480241100568008402b3f03c0159f02300acf40d80567813802b3b", + "0x13805260024138052ae01409005130024130052ae0140280504c02404957", + "0x121150120a80295700a0a80284e0120a80295700a0248a0092aa014ab805", + "0x295700a0980282a0125500295700a5541602422a024160052ae01415011", + "0x48092ae01404824012025a08050125500495100a55c0295400a12404953", + "0xab805066014528090660541215700a054028a30120c40295700a01402826", + "0x1b00514e0241b0052ae014a700531e0240495700a0d40292c0120d4a7024", + "0x3880901255c0294c00a6400481c298090ab80502a01452809070014ab805", + "0x494b00a55c028090620241e8052ae014a68050b6024a68052ae0140e005", + "0x283807c0908a80907c014ab8052960441211501252c0295700a52c0284e", + "0x248092a6014ab80506201415009082014ab80507a1001211501210002957", + "0x28096840240495700a02412009012d04028092a8024a88052ae01420805", + "0x1a1809212014ab8050860441211501210c0295700a10c0284e01210c02957", + "0x280504c0240495700a0241200908e015a284500ad10878052ae0440b005", + "0x484a00a55c0291500a63c0484922a090ab80521e015a3009228014ab805", + "0x295700a4740285b0124740295700a1240287101246c0295700a128028a7", + "0x29212120908a809242014ab80524201427009242014ab8050124500491e", + "0x492600a55c0291e24a0908a80924a014ab8052364881211501248802957", + "0x480968e014049540120180295700a498028490121440295700a4500282a", + "0x188090a6014ab80500a0141300901255c0284500a128048092ae01404824", + "0x968052ae014959090484540492b00a55c0292b00a1380492b00a55c02809", + "0x4b4700a024aa00900c014ab80525a014248090a2014ab8050a601415009", + "0x486900a55c0280500a098048092ae014238050940240495700a02412009", + "0x295700a1a08482422a024340052ae0143400509c024340052ae01404b42", + "0x285100a1440480600a55c0286700a1240485100a55c0286900a0a804867", + "0xab80501209004809682014049540125440295700a01802b4801254c02957", + "0x2a8050e20242b05504855c0284e00ad240493400a55c0280500a09804809", + "0x2d809280014ab8050ac01438809274014ab8050b00142d8090b0014ab805", + "0x485c00a55c0285c00a1380485c00a55c028096940242d8052ae014a0005", + "0x2d9490484540494900a55c0293a0bc0908a8090bc014ab8050b804412115", + "0xaa0092a2014ab805290014248092a6014ab80526801415009290014ab805", + "0xd805696024a38052ae0140280504c0240495700a02412009012d0402809", + "0x486600a55c0285900ad300485900a55c0294600a5a804946036090ab805", + "0x360052ae01404b4e0121200295700a1a80285b0121a80295700a19802b4d", + "0x284800a1380486e00a55c0286c0220908a8090d8014ab8050d801427009", + "0xaa8090e2014ab805036014b500928a014ab8050901b81211501212002957", + "0x388052ae0143880569e024a38052ae014a3805054024048052ae01404805", + "0x28760e81cc0895700a51438947012049a800928a014ab80528a01424809", + "0x118056a2024a08052ae0140280504c0240495700a024120090ec1d039811", + "0x493b00a55c0293c00a29c0493c00a55c0294400a63c04879288090ab805", + "0x400052ae01404b520124e00295700a1f402a8d0121f40295700a1e402a8c", + "0x9d8820484540488200a55c028800220908a809100014ab80510001427009", + "0x495300a55c0294100a0a80488400a55c0293826e0908a80926e014ab805", + "0x4b53012024ab80501209004809682014049540125440295700a21002849", + "0x488800a55c028860220908a80910c014ab80510c0142700910c014ab805", + "0xab80500a0141300901255c02809048024458056a82240295704807802958", + "0x2809228024478052ae01446805260024468052ae014448051300249b005", + "0x8a809124014ab80526a220121150124d40295700a4d40284e0124d402957", + "0x295700a4cc028490122540295700a4d80282a0124cc0295700a23c49024", + "0x1300901255c0288b00a128048092ae01404824012025aa80501255004896", + "0x493000a55c0293000a1380493000a55c028090620244c0052ae01402805", + "0xab8051360142480912a014ab80513001415009136014ab80526022012115", + "0x28092a8024a88052ae0144b005690024a98052ae0144a8050a20244b005", + "0x295700a4bc0284e0124bc0295700a025ab00901255c0280904802404b41", + "0x492e00ad60500052ae090108056ae0244f0052ae014978110484540492f", + "0x48a500a55c028a000a1c4048a300a55c0280500a098048092ae01404824", + "0xc78052ae014c780509c024c78052ae014049140124b00295700a2940285b", + "0x51805054024c80052ae014960a7048454048a700a55c0298f13c0908a809", + "0x280904802404b5900a024aa009156014ab80532001424809152014ab805", + "0x5700514e024570052ae0149700531e024950052ae0140280504c02404957", + "0x121150122c00295700a2c00284e0122c00295700a0241880915a014ab805", + "0x295700a4a80282a0122c80295700a2b49482422a024948052ae0145809e", + "0x28ab00ad200495300a55c028a900a144048ab00a55c028b200a124048a9", + "0x495700a0880284a012024ab805012090048096820140495401254402957", + "0x295700a2d00284e0122d00295700a024b4009250014ab80500a01413009", + "0xcf005092024a98052ae01494005054024cf0052ae0145a011048454048b4", + "0x172009170014ab80516c544122e30122d80295700a024a70092a2014ab805", + "0xa98052ae014a9805054024048052ae014048052aa024938052ae0145c005", + "0x12005012024ab80501246c049272a60240880524e014ab80524e014b2009", + "0x281200a06c048092ae0140482401206c270246b40580a8242ae09002809", + "0xf00901255c028090480240f0056b6024ab8240460141180904604812157", + "0x482200a55c0281100ad700482100a55c0281600a098048092ae01409005", + "0xab80502a014aa80904e014ab80504c015af00904c014ab8050440901235d", + "0x10815022014138052ae014138056be024108052ae014108050540240a805", + "0xaa8052ae014120050220240495700a07802951012024ab80501209004827", + "0x1600502a0240495700a024120092a8015b002c054090ab8242aa01409009", + "0xd8092a2014ab8052a2014270092a2014ab8052a60140b0092a6014ab805", + "0xab8050120900483300ad84049570480c4028230120c4a88242ae014a8805", + "0xab82405401409009054014ab8050540141080901255c0295100a07804809", + "0xb009070014ab80506a0140a80901255c028090480241b0056c40d4a7024", + "0x121570485300a824044024a60052ae014a600509c024a60052ae0141c005", + "0x282701252c0295700a05802826012024ab8050120900483d00ad8ca681c", + "0x484100a55c0294b00a0a80484000a55c0281c00a5540483e00a55c0294d", + "0x48096c8014049540124240295700a5380282101210c0295700a0f80282c", + "0x2826012024ab8050240140f00901255c0281100a2ec048092ae01404824", + "0x484700a55c0290f00a0a80484500a55c0283d00a5540490f00a55c02816", + "0x28bb012024ab805012090048096ca014049540124500295700a53802821", + "0x29550124540295700a05802826012024ab8050240140f00901255c02811", + "0x491400a55c0283600a0840484700a55c0291500a0a80484500a55c02815", + "0x28090620240495700a0cc02951012024ab805012090048096ca01404954", + "0x11809094014ab80509401427009094014ab8050925441203301212402957", + "0x8e8052ae0140b00504c0240495700a02412009236015b30092ae09025005", + "0x295700a054029550124840295700a478028350124780295700a024a7009", + "0x282a00a0840484300a55c0292100a0b00484100a55c0291d00a0a804840", + "0x120330124940295700a02418809244014ab8050860441236701242402957", + "0x200052ae014200052aa024288052ae01484805242024930052ae01492812", + "0xab805244014cf0090a2014ab8050a201496809082014ab80508201415009", + "0x30112ae014931220a21042001516c024930052ae0149300509c02491005", + "0x5d80901255c0291b00a544048092ae014048240124ac2980602201495853", + "0xaa80925a014ab80502c0141300901255c0281200a078048092ae01408805", + "0x338052ae01415005042024340052ae01496805054024348052ae0140a805", + "0x281e012024ab8050220145d80901255c0280904802404b6800a024aa009", + "0x1500908a014ab80502a014aa809268014ab80502c0141300901255c02812", + "0x348052ae0142280524c0248a0052ae014aa005042024238052ae0149a005", + "0x295700a024a70090ce014ab805228015880090d0014ab80508e01428809", + "0x2b058048d740485800a55c0286700a4840485600a55c0285500a59804855", + "0x150090d2014ab8050d2014aa809280014ab805274015af009274014ab805", + "0x482401250034069022014a00052ae014a00056be024340052ae01434005", + "0x282400a14c048092ae014088051760240495700a0480281e012024ab805", + "0x284e00a5540485c00a55c0285b00ada40485b00a55c0280925602404957", + "0x2701100a1700295700a17002b5f01206c0295700a06c0282a01213802957", + "0x27016048da80a81204855c120050120900280901255c028092360242e01b", + "0x118242ae0900d8056d80240d8052ae014120056d60240495700a02412009", + "0x11805180024110052ae0140f0056dc0240495700a02412009042015b681e", + "0x1100521e024110052ae014110050580240495700a0248480904c014ab805", + "0x482a00a55c0281500a098048092ae0140482401255402b6f04e014ab824", + "0xa98052ae014049140125500295700a0b0028470120b00295700a09c02845", + "0xaa1510484540495100a55c029530220908a8092a6014ab8052a601427009", + "0xaa00929c014ab80506201424809066014ab80505401415009062014ab805", + "0x281500a098048092ae014aa8050940240495700a02412009012dc002809", + "0x882422a0241b0052ae0141b00509c0241b0052ae014048310120d402957", + "0x494e00a55c0283800a1240483300a55c0283500a0a80483800a55c02836", + "0x483300a55c0283300a0a80481200a55c0281200a554048092ae0140491b", + "0xa7026066048090c20125380295700a538028490120980295700a09802920", + "0x282100adc4048092ae014048240125340e14c022014a681c298044ab805", + "0xa5811048b8c0494b00a55c0280929c0241e8052ae0140a80504c02404957", + "0x15009024014ab805024014aa809080014ab80507c0157200907c014ab805", + "0x48240121001e812022014200052ae014200052c80241e8052ae0141e805", + "0xab8050124ac048092ae0140880523c0240495700a09002b72012024ab805", + "0x270050540240b0052ae0140b0052aa024218052ae014208055cc02420805", + "0xab80501246c0484309c05808805086014ab805086014b200909c014ab805", + "0x48092ae0140482401206c270246e60580a8242ae0900280904801404809", + "0x28090480240f0056e8024ab824046014118090460481215700a0480281b", + "0x281100a5840482100a55c0281600a098048092ae0140900503c02404957", + "0xaa80904e014ab80504c015bb00904c014ab8050440901237501208802957", + "0x138052ae014138056ee024108052ae014108050540240a8052ae0140a805", + "0xa8052aa0240495700a07802951012024ab8050120900482704205408805", + "0x15a809048014ab8050480149680902c014ab80502c0141500902a014ab805", + "0x495300ade0aa0052ae0901600556c0241602a2aa044ab8050480580a811", + "0x198052ae090188052520241895104855c0295400aae0048092ae01404824", + "0x19811048de80483500a55c0282a00a098048092ae0140482401253802b79", + "0xaa809298014ab805070048120330120e00295700a0241880906c014ab805", + "0xa88052ae014a880525a0241a8052ae0141a805054024aa8052ae014aa805", + "0xa88352aa05463009298014ab8052980142700906c014ab80506c0148f809", + "0x281e012024ab8050120900483d29a0700880507a5340e0112ae014a6036", + "0x296501252c0295700a0a802826012024ab8050220148c80901255c02812", + "0x208052ae014200056ec024200052ae0141f151048dd40483e00a55c0294e", + "0xab805082015bb809296014ab805296014150092aa014ab8052aa014aa809", + "0x8c80901255c0281200a078048092ae01404824012104a595502201420805", + "0x495500a55c0295500a5540484300a55c0295300adec048092ae01408805", + "0x120090860a8aa81100a10c0295700a10c02b770120a80295700a0a80282a", + "0x120050a60240495700a04402919012024ab8050240140f00901255c02809", + "0x270052aa024878052ae014848056f6024848052ae0140492b012024ab805", + "0x880521e014ab80521e015bb809036014ab8050360141500909c014ab805", + "0x495700a0248d80901255c0280952a0240a8052ae01404b7c01243c0d84e", + "0x1bf00901255c028090480241181b048df42701604855c1200501209002809", + "0x280904802411005700084090242ae0900f0056fe0240f0052ae01412005", + "0x270050540240b0052ae0140b0052aa024130052ae0141080570202404957", + "0x1c1009022014ab8050220142480904c014ab80504c0145900909c014ab805", + "0xa4009054554138112ae0140882609c058091280120480295700a0480a824", + "0x295700a55402826012024ab8050120900495400ae0c160052ae09015005", + "0x198050940241983104855c0282c00a51c0495100a55c0281200a45804953", + "0x29ac01254c0295700a54c0282a01209c0295700a09c02955012024ab805", + "0xab805062544a98270246b40483100a55c0283100a1240495100a55c02951", + "0x495700a04802960012024ab8050120900483606a5380880506c0d4a7011", + "0xab8052aa0141500904e014ab80504e014aa809070014ab8052a801573009", + "0x48092ae014048240120e0aa8270220141c0052ae0141c0052c8024aa805", + "0x494c00a55c0284e00a098048092ae0140a8057080240495700a08802960", + "0x295700a53402ae40125340295700a070088245c60240e0052ae0140494e", + "0x283d00a5900494c00a55c0294c00a0a80481600a55c0281600a5540483d", + "0x48092ae0140a8057080240495700a0241200907a5300b01100a0f402957", + "0x173009296014ab8050124ac048092ae0141200570a0240495700a0440291e", + "0x118052ae014118050540240d8052ae0140d8052aa0241f0052ae014a5805", + "0x2811012024ab80501246c0483e04606c0880507c014ab80507c014b2009", + "0xab8050120900481600ae180a81204855c1201100a0480481100a55c02824", + "0x281b00a1380481b00a55c0284e00a0580484e00a55c0281500a05404809", + "0xf00570e024ab8240460141180904606c1215700a06c0281b01206c02957", + "0x481200a55c0281200a084048092ae0140d80503c0240495700a02412009", + "0x282200a054048092ae0140482401209802b880440841215704804802812", + "0x10805242024150052ae014049630125540295700a09c0281601209c02957", + "0x9680900a014ab80500a01415009012014ab805012014aa809058014ab805", + "0xaa8052ae014aa80509c024150052ae01415005598024160052ae01416005", + "0x188052ae090a880559c024a89532a8044ab8052aa0a81600501205566809", + "0x1a8055a20241a94e04855c0283100ab40048092ae014048240120cc02b89", + "0x494c00a55c0295300a098048092ae014048240120e002b8a06c014ab824", + "0xab80529a5381216b0125340295700a07002b8c0120700295700a0d802b8b", + "0xa6005054024aa0052ae014aa0052aa024a58052ae0141e80571a0241e805", + "0xab8050120900494b29855008805296014ab805296015c7009298014ab805", + "0x283e00a0a80484000a55c0295400a5540483e00a55c0295300a09804809", + "0x49540124240295700a5380292d01210c0295700a0e002ad701210402957", + "0x295400a5540490f00a55c0283300ae40048092ae01404824012025c7805", + "0xaa01100a43c0295700a43c02b8e01254c0295700a54c0282a01255002957", + "0x295700a024a700908a014ab80500a0141300901255c0280904802487953", + "0x284500a0a80484000a55c0280900a5540491400a55c0282600a48404847", + "0x49540124240295700a4500292d01210c0295700a11c02ad701210402957", + "0x295700a0241880901255c0281e00a544048092ae01404824012025c7805", + "0x24805046024248052ae0142480509c024248052ae0148a81b0480cc04915", + "0x9009024014ab8050240141080901255c0280904802425005722024ab824", + "0xab80523a0140a80901255c028090480248f0057244748d8242ae09009005", + "0x291b00a4840492500a55c02809726024910052ae0149080502c02490805", + "0x292d0120140295700a0140282a0120240295700a0240295501249802957", + "0x492200a55c0292200a1380492500a55c0292500ae500492600a55c02926", + "0x1cb92b00a55c1205300ae580485300c1440895700a4889292600a0240ab95", + "0x1206800ae64048680d2090ab805256015cc00901255c0280904802496805", + "0x1cd8090aa014ab80500c0141300901255c028090480249a00573419c02957", + "0x295700a160348242d60242c0052ae0142b0057180242b0052ae01433805", + "0x285500a0a80485100a55c0285100a5540494000a55c0293a00ae340493a", + "0x495700a024120092801542881100a5000295700a50002b8e01215402957", + "0xab8050b601415009080014ab8050a2014aa8090b6014ab80500c01413009", + "0x28092a8024848052ae0143480525a024218052ae0149a0055ae02420805", + "0xab8050a2014aa8090b8014ab80525a015c800901255c0280904802404b8f", + "0x30510220142e0052ae0142e00571c024030052ae0140300505402428805", + "0xa48052ae0140494e0121780295700a01402826012024ab8050120900485c", + "0xab8050bc01415009080014ab805012014aa809290014ab80523c01490809", + "0x21805738024848052ae014a400525a024218052ae014a48055ae02420805", + "0x485900a55c0294600ae340494600a55c02947212090b580928e014ab805", + "0x295700a16402b8e0121040295700a1040282a0121000295700a10002955", + "0x2826012024ab805094014a880901255c028090480242c84108004402859", + "0x1ce009090014ab8050125380486a00a55c0281200a4840486600a55c02805", + "0x295700a1b802b8d0121b80295700a1b0350242d6024360052ae01424005", + "0x294500ae380486600a55c0286600a0a80480900a55c0280900a55404945", + "0x388052ae0140280504c0240495700a0241200928a1980481100a51402957", + "0x295700a058029210121d00295700a1cc02b9c0121cc0295700a024a7009", + "0x48052aa024a20052ae014a080571a024a08052ae0143a0760485ac04876", + "0x8805288014ab805288015c70090e2014ab8050e201415009012014ab805", + "0xb02473a054090242ae09002809048014048092ae0140491b01251038809", + "0x1215704806c02b9f01206c0295700a09002b9e012024ab8050120900484e", + "0x2ba10120880295700a05402826012024ab8050120900482100ae800f023", + "0x495500a55c0282700a11c0482700a55c0282600a1140482600a55c0281e", + "0xab80504601483009054014ab8052aa044121150125540295700a5540284e", + "0x160051fe024110052ae01411005054024090052ae014090052aa02416005", + "0x895700a0a8160220240487e809054014ab80505401424809058014ab805", + "0x48092ae014108057440240495700a024120092a254caa01100a544a9954", + "0x295700a0cc088245c6024198052ae0140494e0120c40295700a05402826", + "0x283100a0a80481200a55c0281200a5540483500a55c0294e00ab900494e", + "0x495700a0241200906a0c40901100a0d40295700a0d4029640120c402957", + "0x483600a55c028092560240495700a09002ba3012024ab8050220148f009", + "0x295700a1380282a0120580295700a058029550120e00295700a0d802ae6", + "0x120052ae014028050220241c04e02c0440283800a55c0283800a5900484e", + "0x900502a0240495700a0241200902a015d2012022090ab82404801409009", + "0x1d2809022014ab8050220141080909c014ab80502c0140b00902c014ab805", + "0x295700a1380284e01208c0295700a06c0292101206c088242ae01408805", + "0x12009042015d30092ae0900f0050460240f04e04855c0284e00a06c0484e", + "0x48052aa0240495700a1380281e012024ab805022014a980901255c02809", + "0x1302202255c02823012090a3009046014ab80504601496809012014ab805", + "0xaa8057500240495700a02412009054015d395500a55c1202700a16404827", + "0x96809044014ab805044014aa8092a8014ab805058015d4809058014ab805", + "0x482401255013022022014aa0052ae014aa005754024130052ae01413005", + "0x292d0120880295700a0880295501254c0295700a0a802bab012024ab805", + "0x2809048024a98260440440295300a55c0295300aea80482600a55c02826", + "0x295109c090198092a2014ab8050120c4048092ae014108052a202404957", + "0x483300aeb0049570480c4028230120c40295700a0c40284e0120c402957", + "0x1d683529c090ab8240220140900901255c0282300a14c048092ae01404824", + "0xab8050700140b009070014ab80506a0140a80901255c028090480241b005", + "0x2bae29a0701215704853004824044024a60052ae014a600509c024a6005", + "0x12157048538028120125380295700a53802821012024ab8050120900483d", + "0x28160121040295700a0f802815012024ab8050120900484000aebc1f14b", + "0x848242ae0902181c0480880484300a55c0284300a1380484300a55c02841", + "0xa6824762024238052ae014a58052420240495700a0241200908a015d810f", + "0x484900a55c0291500aea40491500a55c0291400aec80491400a55c0290f", + "0x295700a12402baa01211c0295700a11c0292d0124240295700a42402955", + "0x2955012024ab80529a0146900901255c028090480242484721204402849", + "0x4824012025d98050125500491b00a55c0294b00a0840484a00a55c02845", + "0x20005042024250052ae0140e0052aa0240495700a534028d2012024ab805", + "0xab80507a014aa80901255c0280904802404bb300a024aa009236014ab805", + "0x495700a02412009012ecc028092a80248d8052ae014a700504202425005", + "0x4bb300a024aa009236014ab80506c01410809094014ab805012014aa809", + "0xa700901255c0281100a54c048092ae014198052a20240495700a02412009", + "0x480900a55c0280900a5540491e00a55c0291d00aeac0491d00a55c02809", + "0x1200923c08c0481100a4780295700a47802baa01208c0295700a08c0292d", + "0xa7009236014ab80502a01410809094014ab805012014aa80901255c02809", + "0x492500a55c0291b00a4840492200a55c0292100aeac0492100a55c02809", + "0x120050220240495700a0248d8092444942501100a4880295700a48802baa", + "0x495700a0241200902c015da015024090ab82402201409009022014ab805", + "0xab80502401490809036014ab80509c0140b00909c014ab80502a0140a809", + "0x28230120780d8242ae0140d8050360240d8052ae0140d80509c02411805", + "0xaa80901255c0281b00a078048092ae0140482401208402bb501255c1201e", + "0x118052ae0141180525a024028052ae01402805054024048052ae01404805", + "0x2bb62aa014ab82404e0157900904e098110112ae0141180501204578809", + "0xab8242a80157a8092a80b01215700a55402af4012024ab8050120900482a", + "0x2bb80120c40295700a09802826012024ab8050120900495100aedca9805", + "0x1a8052ae014a702c048ee80494e00a55c0283300aee40483300a55c02953", + "0xab80506201415009044014ab805044014aa80906c014ab80506a015dd809", + "0x48092ae014048240120d8188220220141b0052ae0141b00577802418805", + "0x295700a0e00282a0125300295700a088029550120e00295700a09802826", + "0x1de8050125500483d00a55c0282c00a4b40494d00a55c0295100ab5c0481c", + "0x295700a0880295501252c0295700a0a802bbe012024ab80501209004809", + "0xa58260440440294b00a55c0294b00aef00482600a55c0282600a0a804822", + "0x1980907c014ab8050120c4048092ae014108052a20240495700a02412009", + "0x4957048100028230121000295700a1000284e0121000295700a0f80d824", + "0x280500a0a80480900a55c0280900a554048092ae0140482401210402bbf", + "0x8484302255c0282300a02408bc001208c0295700a08c0292d01201402957", + "0x228052de0240495700a0241200908e015e104500a55c1210f00af040490f", + "0x495700a02412009094015e204900a55c1211500af0c04915228090ab805", + "0xab80523a015dc80923a014ab805092015e2809236014ab80521201413009", + "0x29550124880295700a48402bbb0124840295700a4788a0247740248f005", + "0x292200a55c0292200aef00491b00a55c0291b00a0a80484300a55c02843", + "0x218052aa024928052ae0148480504c0240495700a0241200924446c21811", + "0x9680929a014ab8050940156b809038014ab80524a01415009298014ab805", + "0x295700a4981e824774024930052ae014a680578c0241e8052ae0148a005", + "0x281c00a0a80494c00a55c0294c00a5540480600a55c0285100aeec04851", + "0x495700a0241200900c070a601100a0180295700a01802bbc01207002957", + "0xab80521201415009086014ab805086014aa8090a6014ab80508e015df009", + "0x48092ae0140482401214c84843022014298052ae0142980577802484805", + "0x492d00a55c0280929c024958052ae0140280504c0240495700a10402951", + "0xab8050d0015dd8090d0014ab8050d208c123ba0121a40295700a4b402bc6", + "0x33805778024958052ae01495805054024048052ae014048052aa02433805", + "0x295700a01402826012024ab80501209004867256024088050ce014ab805", + "0xab80502c014908090ac014ab8050aa015e30090aa014ab80501253804934", + "0x29550125000295700a4e802bbb0124e80295700a1582c0247740242c005", + "0x294000a55c0294000aef00493400a55c0293400a0a80480900a55c02809", + "0x1e3812022090ab82404801409009048014ab80500a014088092804d004811", + "0xab80502c0140b00902c014ab8050240140a80901255c028090480240a805", + "0x292101206c088242ae0140880574a024088052ae0140880504202427005", + "0xf04e04855c0284e00a06c0484e00a55c0284e00a1380482300a55c0281b", + "0xab805022014a980901255c0280904802410805790024ab82403c01411809", + "0xab80504601496809012014ab805012014aa80901255c0284e00a07804809", + "0x1e495500a55c1202700a2340482704c0880895700a08c0482426c02411805", + "0xab805058015e5809058014ab8052aa015e500901255c0280904802415005", + "0xaa005798024130052ae0141300525a024110052ae014110052aa024aa005", + "0x295700a0a802bcd012024ab8050120900495404c088088052a8014ab805", + "0x295300af300482600a55c0282600a4b40482200a55c0282200a55404953", + "0x48092ae014108052a20240495700a024120092a60981101100a54c02957", + "0x295700a0c40284e0120c40295700a54427024066024a88052ae01404831", + "0x282300a14c048092ae014048240120cc02bce01255c1203100a08c04831", + "0xa80901255c028090480241b00579e0d4a70242ae0900880502402404957", + "0xa60052ae014a600509c024a60052ae0141c00502c0241c0052ae0141a805", + "0x2921012024ab8050120900483d00af40a681c04855c1214c01209116809", + "0x484000a55c0283e00af2c0483e00a55c0294d00af440494b00a55c0294e", + "0x295700a10002bcc01252c0295700a52c0292d0120700295700a07002955", + "0x10809082014ab80507a014aa80901255c028090480242014b03804402840", + "0x48052aa0240495700a02412009012f48028092a8024218052ae014a7005", + "0x280904802404bd200a024aa009086014ab80506c01410809082014ab805", + "0x295700a024a700901255c0281100a54c048092ae014198052a202404957", + "0x282300a4b40480900a55c0280900a5540490f00a55c0290900af3404909", + "0x495700a0241200921e08c0481100a43c0295700a43c02bcc01208c02957", + "0x295700a024a7009086014ab80502a01410809082014ab805012014aa809", + "0x284700af300491400a55c0284300a4840484700a55c0284500af3404845", + "0xab82404801409009048014ab80500a0140880908e4502081100a11c02957", + "0xb00902c014ab8050240140a80901255c028090480240a8057a604808824", + "0x270242ae01427005036024270052ae0142700509c024270052ae0140b005", + "0x284e00a078048092ae0140482401208c02bd401255c1201b00a08c0481b", + "0x110057aa0840f0242ae09008805024024088052ae0140880504202404957", + "0x138052ae0141300502c024130052ae0141080502a0240495700a02412009", + "0x482c00af581515504855c120270120918b80904e014ab80504e01427009", + "0x495300a55c0282a00af5c0495400a55c0281e00a484048092ae01404824", + "0x295700a5500292d0125540295700a554029550125440295700a54c02bd8", + "0xaa80901255c02809048024a89542aa0440295100a55c0295100af6404954", + "0x12009012f68028092a8024198052ae0140f005042024188052ae01416005", + "0xaa009066014ab80504401410809062014ab805012014aa80901255c02809", + "0xab8050120c4048092ae014118052a20240495700a02412009012f6802809", + "0x28230120d40295700a0d40284e0120d40295700a53827024066024a7005", + "0x481100a55c0281100a084048092ae014048240120d802bdb01255c12035", + "0x294c00a054048092ae0140482401207002bdc2980e01215704804402812", + "0x281b0120f40295700a0f40284e0120f40295700a5340281601253402957", + "0x495700a0241200907c015ee8092ae090a5805046024a583d04855c0283d", + "0x121570480e0028120120e00295700a0e002821012024ab80507a0140f009", + "0x28160124240295700a10402815012024ab8050120900484300af7820840", + "0x228242ae090878090488b40490f00a55c0290f00a1380490f00a55c02909", + "0x238057c00248a8052ae014200052420240495700a02412009228015ef847", + "0xaa809236014ab805094015ec009094014ab805092015f0809092014ab805", + "0x8d8052ae0148d8057b20248a8052ae0148a80525a024228052ae01422805", + "0x28210124740295700a45002955012024ab8050120900491b22a11408805", + "0x280900a554048092ae01404824012025f10050125500491e00a55c02840", + "0xab805012090048097c4014049540124780295700a10c0282101247402957", + "0xab8052420f4120330124840295700a0241880901255c0283e00a54404809", + "0x1200924a015f18092ae09091005046024910052ae0149100509c02491005", + "0x29210121440295700a49802be40124980295700a024a700901255c02809", + "0x492b00a55c0285300af600485300a55c0285100af840480600a55c02838", + "0x295700a4ac02bd90120180295700a0180292d0120240295700a02402955", + "0x2955012024ab80524a014a880901255c02809048024958060120440292b", + "0x4824012025ed0050125500483300a55c0283800a0840483100a55c02809", + "0x29260124780295700a070028210124740295700a02402955012024ab805", + "0x4824012025ed0050125500483300a55c0291e00ac400483100a55c0291d", + "0x280929c024968052ae014088052420240495700a0d802951012024ab805", + "0x292d0120240295700a024029550121a00295700a1a402be50121a402957", + "0x28090480243412d0120440286800a55c0286800af640492d00a55c0292d", + "0x280929c024198052ae0140a805042024188052ae014048052aa02404957", + "0x2bd90121540295700a0cc029210124d00295700a19c02be501219c02957", + "0x12005024024120052ae014028050220249a0550620440293400a55c02934", + "0xb0052ae0140900502a0240495700a0241200902a015f3012022090ab824", + "0xab80509c0140d80909c014ab80509c0142700909c014ab80502c0140b009", + "0x281e012024ab8050120900482300af9c0495704806c0282301206c27024", + "0x1f402103c090ab82402201409009022014ab8050220141080901255c0284e", + "0xab80504c0140b00904c014ab8050420140a80901255c0280904802411005", + "0x2be90545541215704809c0482462e024138052ae0141380509c02413805", + "0x295700a0a802bea0125500295700a07802921012024ab8050120900482c", + "0x295400a4b40495500a55c0295500a5540495100a55c0295300afac04953", + "0x495700a024120092a2550aa81100a5440295700a54402bec01255002957", + "0x4bed00a024aa009066014ab80503c01410809062014ab805058014aa809", + "0x198052ae01411005042024188052ae014048052aa0240495700a02412009", + "0x4831012024ab805046014a880901255c0280904802404bed00a024aa009", + "0x483500a55c0283500a1380483500a55c0294e09c0901980929c014ab805", + "0x295700a04402821012024ab8050120900483600afb8049570480d402823", + "0x2815012024ab8050120900481c00afbca603804855c1201100a04804811", + "0x483d00a55c0283d00a1380483d00a55c0294d00a0580494d00a55c0294c", + "0x1c0050420240495700a02412009080015f803e296090ab82407a0241222a", + "0x495700a02412009212015f8843082090ab82407001409009070014ab805", + "0xab80508a0142700908a014ab80521e0140b00921e014ab8050860140a809", + "0x48092ae0140482401245402bf222811c12157048114a582445a02422805", + "0xab805094015f9809094014ab8052280f8122310121240295700a10402921", + "0x2480525a024238052ae014238052aa0248e8052ae0148d8057d60248d805", + "0xab8050120900491d09211c0880523a014ab80523a015f6009092014ab805", + "0xab80508201410809062014ab80522a014aa80901255c0283e00a64004809", + "0x48092ae0141f0053200240495700a02412009012fb4028092a802419805", + "0x48097da014049540120cc0295700a424028210120c40295700a52c02955", + "0x483300a55c0283800a0840483100a55c0284000a554048092ae01404824", + "0x28210120c40295700a02402955012024ab805012090048097da01404954", + "0x283600a544048092ae01404824012025f68050125500483300a55c0281c", + "0x292100afd00492100a55c0280929c0248f0052ae0140880524202404957", + "0x2bec0124780295700a4780292d0120240295700a0240295501248802957", + "0xab805012014aa80901255c028090480249111e0120440292200a55c02922", + "0x292500afd00492500a55c0280929c024198052ae0140a80504202418805", + "0x1881100a4980295700a49802bec0121440295700a0cc0292101249802957", + "0xab82402201409009022014ab8050480140880901255c0280923602493051", + "0xb00909c014ab80502a0140a80901255c028090480240b0057ea05409024", + "0xd8242ae0140d8050360240d8052ae0140d80509c0240d8052ae01427005", + "0x281b00a078048092ae0140482401207802bf601255c1202300a08c04823", + "0x130057ee088108242ae09009005024024090052ae0140900504202404957", + "0xaa8052ae0141380502c024138052ae0141100502a0240495700a02412009", + "0x495400afe01602a04855c121550120918b8092aa014ab8052aa01427009", + "0x495100a55c0282100a4840495300a55c0280500a098048092ae01404824", + "0xab805066544123fb0120cc0295700a0c402bfa0120c40295700a0b002bf9", + "0xa9805054024150052ae014150052aa0241a8052ae014a70057f8024a7005", + "0xab805012090048352a60a80880506a014ab80506a015fe8092a6014ab805", + "0x283600a0a80483800a55c0295400a5540483600a55c0280500a09804809", + "0xab805012090048097fc014049540120700295700a0840282101253002957", + "0x294d00a0a80483800a55c0280900a5540494d00a55c0280500a09804809", + "0xab805012090048097fc014049540120700295700a0980282101253002957", + "0x295700a0241880907a014ab8050240149080901255c0281e00a54404809", + "0x1f0050460241f0052ae0141f00509c0241f0052ae014a581b0480cc0494b", + "0x15009012014ab805012014aa80901255c02809048024200057fe024ab824", + "0xab80507a0140481156a0241e8052ae0141e80525a024028052ae01402805", + "0x48092ae0140482401211402c0021e014ab8242120155b00921210c20811", + "0x482401212402c0122a014ab8242280149480922811c1215700a43c02ab8", + "0x2bfa01246c0295700a45402c020121280295700a10c02826012024ab805", + "0x908052ae0148f0057f80248f0052ae0148e847048fec0491d00a55c0291b", + "0xab805242015fe809094014ab80509401415009082014ab805082014aa809", + "0x492200a55c0284300a098048092ae014048240124842504102201490805", + "0xab80524c015fe00924c014ab80524a11c123fb0124940295700a12402c03", + "0x288057fa024910052ae01491005054024208052ae014208052aa02428805", + "0x295700a11402c04012024ab80501209004851244104088050a2014ab805", + "0x280600aff40484300a55c0284300a0a80484100a55c0284100a55404806", + "0x48092ae014200052a20240495700a0241200900c10c2081100a01802957", + "0x968052ae01495805806024958052ae0140494e01214c0295700a01402826", + "0x280900a5540486800a55c0286900aff00486900a55c0292d07a091fd809", + "0x481100a1a00295700a1a002bfd01214c0295700a14c0282a01202402957", + "0xab805012014aa8090ce014ab80500a0141300901255c0280904802434053", + "0x280929c0240e0052ae0140b005042024a60052ae014338050540241c005", + "0x123fb0121580295700a070029210121540295700a4d002c030124d002957", + "0x1c0052ae0141c0052aa0249d0052ae0142c0057f80242c0052ae0142a856", + "0x493a2980e008805274014ab805274015fe809298014ab80529801415009", + "0x482401205402c0502404412157048090028120120900295700a01402811", + "0x284e0121380295700a058028160120580295700a04802815012024ab805", + "0x28090480240f00580c08c0d8242ae090270090488a80484e00a55c0284e", + "0x1300580e088108242ae09008805024024088052ae0140880504202404957", + "0xaa8052ae0141380502c024138052ae0141100502a0240495700a02412009", + "0x495400b0201602a04855c12155036091150092aa014ab8052aa01427009", + "0xa895304855c1202100a0480482100a55c0282100a084048092ae01404824", + "0x283300a0580483300a55c0295100a054048092ae014048240120c402c09", + "0x20503606a090ab82429c0a81222d0125380295700a5380284e01253802957", + "0x283605809118809298014ab8052a60149080901255c028090480241c005", + "0xaa80907a014ab80529a0160600929a014ab80503808c1240b01207002957", + "0x1e8052ae0141e80581a024a60052ae014a600525a0241a8052ae0141a805", + "0x118053200240495700a0b002990012024ab8050120900483d2980d408805", + "0x49540120f80295700a54c0282101252c0295700a0e002955012024ab805", + "0xab805046014c800901255c0282c00a640048092ae0140482401202607005", + "0x2070050125500483e00a55c0283100a0840494b00a55c0282a00a55404809", + "0xa58052ae014aa0052aa0240495700a08c02990012024ab80501209004809", + "0xc800901255c0280904802404c0e00a024aa00907c014ab80504201410809", + "0x483e00a55c0282600a0840494b00a55c0281b00a554048092ae01411805", + "0x282101252c0295700a07802955012024ab8050120900480981c01404954", + "0x280900a554048092ae01404824012026070050125500483e00a55c02811", + "0x2000581e024200052ae0140494e0120f80295700a0540282101252c02957", + "0x8805082014ab80508201606809086014ab80507c01490809082014ab805", + "0x2c1002404412157048090028120120900295700a014028110121042194b", + "0x295700a058028160120580295700a04802815012024ab80501209004815", + "0xf00582208c0d8242ae090270090480880484e00a55c0284e00a1380484e", + "0x108242ae09008805024024088052ae014088050420240495700a02412009", + "0x1380502c024138052ae0141100502a0240495700a0241200904c01609022", + "0x1602a04855c121550360918b8092aa014ab8052aa014270092aa014ab805", + "0x282a00a5540495300a55c0282100a484048092ae0140482401255002c13", + "0x198312a2044ab8052a60a81241401254c0295700a54c0292d0120a802957", + "0x294e00b05c048092ae014048240120d402c1629c014ab8240660160a809", + "0x281c0460920c809038014ab8052980e01b02c0250600494c0700d808957", + "0x292d0125440295700a544029550120f40295700a5340297201253402957", + "0x28090480241e8312a20440283d00a55c0283d00b0680483100a55c02831", + "0xab8050580160d80901255c0282300a348048092ae0141a80509402404957", + "0x294b00a0840483e00a55c0295100a5540494b00a55c0283100a04404809", + "0x495700a08c028d2012024ab805012090048098380140495401210002957", + "0x4c1d00a024aa009086014ab80504201410809082014ab8052a8014aa809", + "0x484100a55c0281b00a554048092ae014118051a40240495700a02412009", + "0x295700a10c02b100120f80295700a1040292601210c0295700a09802821", + "0x483e00a55c0281e00a554048092ae014048240120260e00501255004840", + "0x2955012024ab80501209004809838014049540121000295700a04402821", + "0x20f009212014ab8050125380484000a55c0281500a0840483e00a55c02809", + "0x878052ae01487805834024228052ae01420005242024878052ae01484805", + "0x28092360240495700a0254a809024014ab80501307c0490f08a0f808805", + "0xd8058401380b0242ae0900a8050240240a8052ae0141200502202404957", + "0x295700a04409024842024088052ae0142700502a0240495700a02412009", + "0x110058440840f0242ae090118090480880482300a55c0281100a05804811", + "0x130242ae0900b0050240240b0052ae0140b0050420240495700a02412009", + "0x1500502c024150052ae0141380502a0240495700a024120092aa01611827", + "0x295501254c0295700a098029210125500295700a02612009058014ab805", + "0x495300a55c0295300a4b40480500a55c0280500a0a80481e00a55c0281e", + "0xaa15300a0780ac250120b00295700a0b00284e0125500295700a55002971", + "0x28090480241a80584e538029570480cc02c260120cc1895102255c0282c", + "0xe005854530029570480e002c290120e01b0242ae014a700585002404957", + "0x1e8242ae014a6005856024a68052ae0141880504c0240495700a02412009", + "0x283e0420921680907c014ab8052960144000901255c0283d00b0b00494b", + "0x217809086014ab8050820d8121730121040295700a10002c2e01210002957", + "0xa68052ae014a6805054024a88052ae014a88052aa024848052ae01421805", + "0x28d2012024ab8050120900490929a54408805212014ab80521201618009", + "0x1500908a014ab8052a2014aa80921e014ab8050620141300901255c02821", + "0x8a8052ae0141b00525a0248a0052ae0140e0055ae024238052ae01487805", + "0x2c32012024ab8050420146900901255c0280904802404c3100a024aa009", + "0x483100a55c0283100a0a80495100a55c0295100a5540484900a55c02835", + "0x108051a40240495700a024120090920c4a881100a1240295700a12402c30", + "0xaa8052420248d8052ae0140494e0121280295700a01402826012024ab805", + "0x16b80908e014ab8050940141500908a014ab80503c014aa80923a014ab805", + "0x8f0052ae0148a0058660248a8052ae0148e80525a0248a0052ae0148d805", + "0x284500a5540492200a55c0292100b0bc0492100a55c0291e22a090b9809", + "0x2281100a4880295700a48802c3001211c0295700a11c0282a01211402957", + "0xab805044014aa80924a014ab80500a0141300901255c0280904802491047", + "0x28092a8024030052ae0140b005042024288052ae0149280505402493005", + "0x295700a01402826012024ab8050240161a80901255c0280904802404c34", + "0x281b00a0840485100a55c0285300a0a80492600a55c0280900a55404853", + "0x3005242024968052ae01495805866024958052ae0140494e01201802957", + "0x486700a55c0286800b0bc0486800a55c0292d0d2090b98090d2014ab805", + "0x295700a19c02c300121440295700a1440282a0124980295700a49802955", + "0x88242ae09012005024024120052ae014028050220243385124c04402867", + "0xb00502c0240b0052ae0140900502a0240495700a0241200902a0161b012", + "0x1181b04855c1204e0120901100909c014ab80509c0142700909c014ab805", + "0x1201100a0480481100a55c0281100a084048092ae0140482401207802c37", + "0x482700a55c0282200a054048092ae0140482401209802c3804408412157", + "0xab8242aa06c120220125540295700a5540284e0125540295700a09c02816", + "0xaa8092a6014ab8050420149080901255c02809048024aa0058720b015024", + "0x895700a54c15024874024a98052ae014a980525a024150052ae01415005", + "0x21e80901255c028090480241a805878538029570480cc02c3b0120cc18951", + "0x121700120700295700a5301c03605804a1f0092980e01b0112ae014a7005", + "0xa88052ae014a88052aa0241e8052ae014a680587e024a68052ae0140e023", + "0x483d0625440880507a014ab80507a01620009062014ab80506201496809", + "0x28d2012024ab8050460146900901255c0283500a128048092ae01404824", + "0x1080907c014ab8052a2014aa809296014ab8050620140880901255c0282c", + "0x118051a40240495700a02412009013104028092a8024200052ae014a5805", + "0x495401210c0295700a084028210121040295700a55002955012024ab805", + "0xab805036014aa80901255c0282300a348048092ae0140482401202621005", + "0x218056200241f0052ae0142080524c024218052ae0141300504202420805", + "0xab80503c014aa80901255c0280904802404c4100a024aa009080014ab805", + "0x495700a02412009013104028092a8024200052ae014088050420241f005", + "0x295700a024a7009080014ab80502a0141080907c014ab805012014aa809", + "0x290f00b1000484500a55c0284000a4840490f00a55c0290900b10c04909", + "0xab82404801409009048014ab80500a0140880921e1141f01100a43c02957", + "0xb00902c014ab8050240140a80901255c028090480240a80588804808824", + "0x121570481380482445a024270052ae0142700509c024270052ae0140b005", + "0x28120120440295700a04402821012024ab8050120900481e00b1141181b", + "0x295700a08802815012024ab8050120900482600b1181102104855c12011", + "0x295500a06c0495500a55c0295500a1380495500a55c0282700a05804827", + "0xf00901255c028090480241600588e024ab8240540141180905455412157", + "0xa995404855c1202100a0480482100a55c0282100a084048092ae014aa805", + "0x283100a0580483100a55c0295300a054048092ae0140482401254402c48", + "0x22483529c090ab82406606c123170120cc0295700a0cc0284e0120cc02957", + "0xab80506a01625009070014ab8052a80149080901255c028090480241b005", + "0x29550125340295700a0700296e0120700295700a53011824896024a6005", + "0x294d00a55c0294d00b1300483800a55c0283800a4b40494e00a55c0294e", + "0x283600a554048092ae014118052580240495700a0241200929a0e0a7011", + "0xab8050120900480989a0140495401252c0295700a550028210120f402957", + "0xab8052a20141080907a014ab805036014aa80901255c0282300a4b004809", + "0x48092ae014160052a20240495700a02412009013134028092a8024a5805", + "0x295700a1000284e0121000295700a0f8aa8240660241f0052ae01404831", + "0xab805012538048092ae0140482401210402c4e01255c1204000a08c04840", + "0x11824896024878052ae01410805242024848052ae0142180589e02421805", + "0x481b00a55c0281b00a5540484700a55c0284500a5b80484500a55c02909", + "0x1200908e43c0d81100a11c0295700a11c02c4c01243c0295700a43c0292d", + "0xd8052aa0240495700a08c0292c012024ab805082014a880901255c02809", + "0x280904802404c5000a024aa00922a014ab80504201410809228014ab805", + "0x282600a0840483d00a55c0281b00a554048092ae0141180525802404957", + "0x49540124540295700a52c02b100124500295700a0f40292601252c02957", + "0x281100a0840491400a55c0281e00a554048092ae0140482401202628005", + "0x295700a02402955012024ab805012090048098a00140495401245402957", + "0xab80509201628809092014ab8050125380491500a55c0281500a08404914", + "0x8d914022014250052ae014250058980248d8052ae0148a80524202425005", + "0x481500b1480901104855c1202400a0480482400a55c0280500a0440484a", + "0x484e00a55c0281600a0580481600a55c0281200a054048092ae01404824", + "0xab824036014118090361381215700a1380281b0121380295700a1380284e", + "0x281100a084048092ae0142700503c0240495700a0241200904601629809", + "0x48092ae0140482401208802c54042078121570480440281201204402957", + "0x295700a09c0284e01209c0295700a098028160120980295700a08402815", + "0x9080901255c02809048024160058aa0a8aa8242ae09013809048c5c04827", + "0xa88052ae014a98058ae024a98052ae014150058ac024aa0052ae0140f005", + "0xab8052a20162c0092a8014ab8052a8014968092aa014ab8052aa014aa809", + "0x483100a55c0282c00a554048092ae01404824012544aa155022014a8805", + "0x2955012024ab805012090048098b2014049540120cc0295700a07802821", + "0x48240120262c8050125500483300a55c0282200a0840483100a55c02809", + "0xa704e0480cc0494e00a55c028090620240495700a08c02951012024ab805", + "0x1b0058b4024ab82406a0141180906a014ab80506a0142700906a014ab805", + "0x1c0242ae09008805024024088052ae014088050420240495700a02412009", + "0xa680502c024a68052ae014a600502a0240495700a024120090380162d94c", + "0x1f14b04855c1203d0120911500907a014ab80507a0142700907a014ab805", + "0x283e00b1740484100a55c0283800a484048092ae0140482401210002c5c", + "0x292d01252c0295700a52c029550124240295700a10c02c5701210c02957", + "0x2809048024848412960440290900a55c0290900b1600484100a55c02841", + "0x28092a8024198052ae0141c005042024188052ae014200052aa02404957", + "0xab80503801410809062014ab805012014aa80901255c0280904802404c59", + "0x48092ae0141b0052a20240495700a02412009013164028092a802419805", + "0x238052ae014228058bc024228052ae0140494e01243c0295700a04402921", + "0xab80508e0162c00921e014ab80521e01496809012014ab805012014aa809", + "0x483100a55c0280900a554048092ae0140482401211c8780902201423805", + "0x8a8052ae0148a0058bc0248a0052ae0140494e0120cc0295700a05402821", + "0x49150920c40880522a014ab80522a0162c009092014ab80506601490809", + "0x480500a55c0280500a0a80480900a55c0280900a554048092ae0140491b", + "0x2ab60120540901102255c0282400a02408ab50120900295700a0900292d", + "0xd8242ae0140b0055700240495700a0241200909c0162f81600a55c12015", + "0xd8050220240495700a024120090420163001e00a55c1202300a4a404823", + "0x495700a024120092aa0163082704c090ab82404401409009044014ab805", + "0xab80505801427009058014ab8050540140b009054014ab80504e0140a809", + "0x48092ae0140482401254402c632a6550121570480b0088248c402416005", + "0xab8052a60781216d0120cc0295700a098029210120c40295700a04802826", + "0x2c660120d80295700a0d4198248ca0241a8052ae014a70058c8024a7005", + "0x483100a55c0283100a0a80495400a55c0295400a5540483800a55c02836", + "0xf00554c0240495700a024120090700c4aa01100a0e00295700a0e002c67", + "0x282a0120700295700a544029550125300295700a04802826012024ab805", + "0x4824012026340050125500483d00a55c0282600a0840494d00a55c0294c", + "0x88052aa024a58052ae0140900504c0240495700a07802aa6012024ab805", + "0xa700907a014ab8052aa0141080929a014ab80529601415009038014ab805", + "0x484100a55c0283d00a4840484000a55c0283e00b1a40483e00a55c02809", + "0xab805038014aa809212014ab80508601633009086014ab80508010412465", + "0xa681c022014848052ae014848058ce024a68052ae014a68050540240e005", + "0x295700a08402c6901243c0295700a04802826012024ab80501209004909", + "0x88052aa0248a0052ae014238058cc024238052ae0142281b04919404845", + "0x8805228014ab8052280163380921e014ab80521e01415009022014ab805", + "0x281100a5540491500a55c0284e00b1a8048092ae0140482401245087811", + "0x881100a4540295700a45402c670120480295700a0480282a01204402957", + "0xab82402201409009022014ab8050480140880901255c028092360248a812", + "0xb00909c014ab80502a0140a80901255c028090480240b0058d605409024", + "0x90242ae0140900574a024090052ae014090050420240d8052ae01427005", + "0xd8090485b00481b00a55c0281b00a1380481e00a55c0282300a48404823", + "0x138052ae014110058da0240495700a0241200904c01636022042090ab824", + "0x160058e20a802c702aa014ab82304e0163780904e014ab80504e01637009", + "0x2809048024a70058ee0cc02c760620163a95100b1d0a98058e655002c72", + "0xab8240240140900901255c0281e00a14c048092ae014aa80509402404957", + "0xb009298014ab80506c0140a80901255c028090480241c0058f00d81a824", + "0x121570480701082462e0240e0052ae0140e00509c0240e0052ae014a6005", + "0x29210120f80295700a01402826012024ab8050120900494b00b1e41e94d", + "0x484300a55c0284100acc00484100a55c0283d00b1e80484000a55c02835", + "0xab80529a014aa80921e014ab8052120163d809212014ab80508610012174", + "0x1f14d022014878052ae014878058f80241f0052ae0141f005054024a6805", + "0x295700a52c029550121140295700a01402826012024ab8050120900490f", + "0x23e8050125500491500a55c0283500a0840491400a55c0284500a0a804847", + "0x295700a084029550121240295700a01402826012024ab80501209004809", + "0x23e8050125500491500a55c0283800a0840491400a55c0284900a0a804847", + "0x48092ae0140f0050a60240495700a0a80284a012024ab80501209004809", + "0x291b00a054048092ae0140482401247402c7e2361281215704804802812", + "0x1222a0124840295700a4840284e0124840295700a4780281601247802957", + "0xab8050940141080901255c02809048024930058fe494910242ae09090821", + "0xa80901255c0280904802429805900018288242ae0902500502402425005", + "0x968052ae0149680509c024968052ae0149580502c024958052ae01403005", + "0x2826012024ab8050120900486700b2043406904855c1212d24409116809", + "0x2b0052ae014341250488c40485500a55c0285100a4840493400a55c02805", + "0x293a0aa090ba009274014ab8050b0015980090b0014ab8050ac01641009", + "0x282a0121a40295700a1a40295501216c0295700a50002c7b01250002957", + "0x28090480242d9340d20440285b00a55c0285b00b1f00493400a55c02934", + "0x286700a5540485c00a55c0280500a098048092ae0149280532002404957", + "0x49540124540295700a144028210124500295700a1700282a01211c02957", + "0xab80500a0141300901255c0292500a640048092ae014048240120263e805", + "0x298050420248a0052ae0142f005054024238052ae014910052aa0242f005", + "0xab80500a0141300901255c0280904802404c7d00a024aa00922a014ab805", + "0x250050420248a0052ae014a4805054024238052ae014930052aa024a4805", + "0xab80500a0141300901255c0280904802404c7d00a024aa00922a014ab805", + "0x8e8050420248a0052ae014a4005054024238052ae014108052aa024a4005", + "0xab8050580142500901255c0280904802404c7d00a024aa00922a014ab805", + "0xab80503c01496809042014ab805042014aa80901255c0281200a54c04809", + "0x24286600a55c1205900b2100485928c51c0895700a078108249060240f005", + "0xab8050cc01643009090014ab80500a0141300901255c0280904802435005", + "0x2c7b0125140295700a1b8a30242e8024370052ae0143600566002436005", + "0x484800a55c0284800a0a80494700a55c0294700a5540487100a55c02945", + "0x280504c0240495700a024120090e2120a381100a1c40295700a1c402c7c", + "0x16b8090ec014ab8050e6014150090e8014ab80528e014aa8090e6014ab805", + "0x1200901321c028092a8024a20052ae014a300525a024a08052ae01435005", + "0x90050240240495700a07802853012024ab8052a80142500901255c02809", + "0x3e8052ae0149e00502a0240495700a024120092760164413c0f2090ab824", + "0x1213804209116809270014ab80527001427009270014ab8050fa0140b009", + "0x487900a55c0287900a084048092ae014048240124dc02c8910420012157", + "0x288600a054048092ae0140482401222002c8a10c210121570481e402812", + "0x1222d01222c0295700a22c0284e01222c0295700a2240281601222402957", + "0xab80500a0141300901255c02809048024478059162349b0242ae09045880", + "0x2c8d0124cc0295700a23441024918024490052ae014420052420249a805", + "0x4c0052ae0144b0920485d00489600a55c0289500acc00489500a55c02933", + "0xab80526a0141500926c014ab80526c014aa809260014ab8051300163d809", + "0x48092ae014048240124c09a936022014980052ae014980058f80249a805", + "0x238052ae014478052aa0244d8052ae0140280504c0240495700a2080292c", + "0x4c7d00a024aa00922a014ab80510801410809228014ab80513601415009", + "0x492f00a55c0280500a098048092ae014410052580240495700a02412009", + "0x295700a220028210124500295700a4bc0282a01211c0295700a20002955", + "0x489e00a55c0280500a098048092ae014048240120263e80501255004915", + "0x295700a1e4028210124500295700a2780282a01211c0295700a4dc02955", + "0x48a000a55c0280500a098048092ae014048240120263e80501255004915", + "0x295700a4ec028210124500295700a2800282a01211c0295700a08402955", + "0x2980901255c0295300a128048092ae014048240120263e80501255004915", + "0xab805012090048a500b2385192e04855c1201200a048048092ae0140f005", + "0xab80501323c0498f00a55c0292c00a0580492c00a55c028a300a05404809", + "0x2805054024108052ae014108052aa024c80052ae0149700524202453805", + "0x2700914e014ab80514e01648009320014ab8053200149680900a014ab805", + "0x2490092542ac548112ae014c78a732001410815922024c78052ae014c7805", + "0x1215700a2b802c94012024ab805012090048ad00b24c570052ae09095005", + "0x2826012024ab8050120900492800b258590052ae0909480592a024948b0", + "0x48092ae014cf0059300245b19e04855c028b200b25c048b400a55c028ab", + "0x295700a49c02b3001249c0295700a2e002c9a0122e00295700a2d802c99", + "0x548052aa0245e8052ae0145d8058f60245d8052ae014920b00485d004924", + "0x880517a014ab80517a0163e009168014ab80516801415009152014ab805", + "0x28a900a5540492300a55c028ab00a098048092ae014048240122f45a0a9", + "0x292d0125040295700a4a002ad70121d80295700a48c0282a0121d002957", + "0x28ad00b26c048092ae01404824012026438050125500494400a55c028b0", + "0x2c7c0122ac0295700a2ac0282a0122a40295700a2a4029550122f802957", + "0xab80500a0141300901255c028090480245f0ab152044028be00a55c028be", + "0x282100a554048c200a55c028a500a4840492000a55c0280929c02460005", + "0x292d0125040295700a48002ad70121d80295700a3000282a0121d002957", + "0x295100a128048092ae01404824012026438050125500494400a55c028c2", + "0x48c600b2708f8c404855c1201200a048048092ae0140f0050a602404957", + "0x491c00a55c028c800a058048c800a55c0291f00a054048092ae01404824", + "0x1200922e0164e919196090ab8242380841222a0124700295700a4700284e", + "0x24f0d0096090ab82418801409009188014ab8051880141080901255c02809", + "0xab8053580140b009358014ab8051a00140a80901255c028090480248b005", + "0x8c9f1a8348121570486b4658244fc024d68052ae014d680509c024d6805", + "0x284b00a4840491000a55c0280500a098048092ae0140482401235c88912", + "0x1980093a0014ab80521c0165080921c014ab8051a8464124a001236402957", + "0x295700a37402c7b0123740295700a36c6c8242e80246d8052ae014e8005", + "0x290a00b1f00491000a55c0291000a0a8048d200a55c028d200a5540490a", + "0x48092ae014888055080240495700a024120092144406901100a42802957", + "0x48e100a55c0280500a098048092ae0148c8053200240495700a35c02a84", + "0x295700a12c028210124500295700a3840282a01211c0295700a44802955", + "0x1300901255c0291900a640048092ae014048240120263e80501255004915", + "0x8a0052ae01483005054024238052ae014658052aa024830052ae01402805", + "0x1300901255c0280904802404c7d00a024aa00922a014ab80522c01410809", + "0x8a0052ae0147f805054024238052ae0148b8052aa0247f8052ae01402805", + "0x1300901255c0280904802404c7d00a024aa00922a014ab80518801410809", + "0x8a0052ae0147e805054024238052ae014108052aa0247e8052ae01402805", + "0x2500901255c0280904802404c7d00a024aa00922a014ab80518c01410809", + "0x2510f71f8090ab8240240140900901255c0281e00a14c048092ae01418805", + "0xab8051f40140b0091f4014ab8051ee0140a80901255c028090480247a805", + "0x2823012000798242ae01479805036024798052ae0147980509c02479805", + "0x1080901255c028f300a078048092ae0140482401277402ca301255c12000", + "0x2809048024f0805948780ef0242ae0907e0050240247e0052ae0147e005", + "0xf300509c024f30052ae014f200502c024f20052ae014f000502a02404957", + "0xab805012090049ee00b294f51e704855c121e60420918b8093cc014ab805", + "0x29ea00b128049f200a55c029de00a484049ef00a55c0280500a09804809", + "0x121740127ec0295700a7d402b300127d40295700a7d002ca60127d002957", + "0xf38052ae014f38052aa024ff8052ae014fe0058f6024fe0052ae014fd9f2", + "0x49ff3de79c088053fe014ab8053fe0163e0093de014ab8053de01415009", + "0x4a0200a55c029ee00a55404a0100a55c0280500a098048092ae01404824", + "0x480994e014049540128240295700a778028210128140295700a8040282a", + "0x4a0200a55c0282100a55404a0a00a55c0280500a098048092ae01404824", + "0x480994e014049540128240295700a784028210128140295700a8280282a", + "0x120330128340295700a0241880901255c029dd00a544048092ae01404824", + "0x2540092ae09107805046025078052ae0150780509c025078052ae015068f3", + "0x295700a024a700942a014ab80500a0141300901255c0280904802508005", + "0x2a1800b29804a1900a55c028fc00a48404a1800a55c02a1600b13c04a16", + "0x23d80943c014ab8052ba864121740125740295700a87002b3001287002957", + "0x10a8052ae0150a805054024108052ae014108052aa025150052ae0150f005", + "0x2951012024ab80501209004a2a42a08408805454014ab8054540163e009", + "0x1500908e014ab805042014aa80945a014ab80500a0141300901255c02a10", + "0x120090131f4028092a80248a8052ae0147e0050420248a0052ae01516805", + "0x15009404014ab805042014aa809462014ab80500a0141300901255c02809", + "0x238052ae0150100524c025048052ae0147a805042025028052ae01518805", + "0x4c7d00a024aa00922a014ab80541201588009228014ab80540a01428809", + "0xaa80901255c0281200a54c048092ae014198050940240495700a02412009", + "0x895700a078108249520240f0052ae0140f00525a024108052ae01410805", + "0x1300901255c028090480251c0059568dc0295704857002caa01257119a32", + "0x11f0052ae0151e8056600251e8052ae0151b8059580251d8052ae01402805", + "0x2a3200a55404a4600a55c02a3f00b1ec04a3f00a55c02a3e466090ba009", + "0x11901100a9180295700a91802c7c0128ec0295700a8ec0282a0128c802957", + "0xab805464014aa80948e014ab80500a0141300901255c028090480252323b", + "0x11980525a024a08052ae0151c0055ae0243b0052ae015238050540243a005", + "0x4a4b00a55c0295e288090ba0092bc014ab8052820159c009288014ab805", + "0x295700a1d80282a0121d00295700a1d0029550129300295700a92c02c7b", + "0x2500901255c02809048025260760e804402a4c00a55c02a4c00b1f004876", + "0xa700949a014ab80500a0141300901255c0281200a54c048092ae014a7005", + "0x4a5200a55c02a4f00acc004a4f00a55c02a4e00b2b404a4e00a55c02809", + "0xab805042014aa8094aa014ab8054a60163d8094a6014ab8054a407812174", + "0x1268210220152a8052ae0152a8058f8025268052ae0152680505402410805", + "0x12b0052ae0140280504c0240495700a04802953012024ab80501209004a55", + "0xab8054b4078121740129680295700a56c02b3801256c0295700a024a7009", + "0x12b005054024130052ae014130052aa0252e0052ae0152d8058f60252d805", + "0xab80501209004a5c4ac098088054b8014ab8054b80163e0094ac014ab805", + "0x2a5d00a0a80484700a55c0280900a55404a5d00a55c0280500a09804809", + "0x12f0056700252f0052ae0140494e0124540295700a0580282101245002957", + "0x4a6300a55c0295a4be090ba0094be014ab80522a014908092b4014ab805", + "0x295700a4500282a01211c0295700a11c029550129900295700a98c02c7b", + "0x480500a55c028090820253211408e04402a6400a55c02a6400b1f004914", + "0xab805048044121760120440295700a02657009048014ab80501201412115", + "0x12005012024ab80501246c0481200a014090052ae0140900595e02409005", + "0x281200a06c048092ae0140482401206c270249600580a8242ae09002809", + "0xf00901255c028090480240f005962024ab8240460141180904604812157", + "0x482200a55c0281100ab4c0482100a55c0281600a098048092ae01409005", + "0xab80502a014aa80904e014ab80504c0165980904c014ab805044090124b2", + "0x10815022014138052ae01413805968024108052ae014108050540240a805", + "0xaa8052ae014120050220240495700a07802951012024ab80501209004827", + "0x1600502a0240495700a024120092a80165a82c054090ab8242aa01409009", + "0x18b8092a2014ab8052a2014270092a2014ab8052a60140b0092a6014ab805", + "0x281600a098048092ae0140482401253802cb60660c4121570485440a824", + "0x120330120e00295700a0241880906c014ab805066044124b70120d402957", + "0x188052ae014188052aa0240e0052ae01415005242024a60052ae0141c012", + "0xab80506c01566009038014ab8050380149680906a014ab80506a01415009", + "0xa68112ae014a60360380d41881559a024a60052ae014a600509c0241b005", + "0x25c00901255c0281200a078048092ae0140482401252c1e94d022014a583d", + "0x484000a55c0294e00a5540483e00a55c0281600a098048092ae01408805", + "0x48099720140495401210c0295700a0a8028210121040295700a0f80282a", + "0x2826012024ab8050220165c00901255c0281200a078048092ae01404824", + "0x484100a55c0290900a0a80484000a55c0281500a5540490900a55c02816", + "0x228052ae014878055b8024878052ae0140494e01210c0295700a55002821", + "0x291400b2cc0491400a55c0284508e0925900908e014ab80508601490809", + "0x2cb40121040295700a1040282a0121000295700a1000295501245402957", + "0xab8050240140f00901255c028090480248a8410800440291500a55c02915", + "0x248052ae0140492b012024ab8050480142980901255c0281100b2e004809", + "0xab8050360141500909c014ab80509c014aa809094014ab8050920165d009", + "0x90052ae01404c1f0121280d84e022014250052ae014250059680240d805", + "0x900902a014ab8050480140880901255c028092360240495700a0254a809", + "0xab80509c0140a80901255c028090480240d8059761380b0242ae0900a805", + "0x1222d01208c0295700a044028160120440295700a0440902484202408805", + "0xab80502c0141080901255c02809048024110059780840f0242ae09011809", + "0xa80901255c02809048024aa80597a09c130242ae0900b0050240240b005", + "0x495400a55c02809848024160052ae0141500502c024150052ae01413805", + "0x295700a0140282a0120780295700a0780295501254c0295700a09802921", + "0x282c00a1380495400a55c0295400a5c40495300a55c0295300a4b404805", + "0x1203300b098048330625440895700a0b0aa15300a0780ac250120b002957", + "0x483806c090ab80529c0161400901255c028090480241a80597c53802957", + "0xab8050620141300901255c028090480240e00597e530029570480e002c29", + "0x124c101252c0295700a0f402af70120f40295700a53010824980024a6805", + "0xa88052ae014a88052aa024200052ae0141f0059840241f0052ae014a5836", + "0x484029a54408805080014ab8050800166180929a014ab80529a01415009", + "0x2826012024ab8050420149600901255c0281c00a128048092ae01404824", + "0x490900a55c0295100a5540484300a55c0283600a0440484100a55c02831", + "0x4809988014049540121140295700a10c0282101243c0295700a1040282a", + "0xaa80908e014ab80506a0166280901255c0282100a4b0048092ae01404824", + "0x238052ae01423805986024188052ae01418805054024a88052ae014a8805", + "0x280504c0240495700a0840292c012024ab8050120900484706254408805", + "0x1080921e014ab80522801415009212014ab80503c014aa809228014ab805", + "0x484900a55c0284500a4840491500a55c0280929c024228052ae014aa805", + "0xab80523601661009236014ab805094124124c10121280295700a45402afe", + "0x8e805986024878052ae01487805054024848052ae014848052aa0248e805", + "0x295700a01402826012024ab8050120900491d21e4240880523a014ab805", + "0x281600a0840492200a55c0291e00a0a80492100a55c0282200a5540491e", + "0x495700a04802c35012024ab8050120900480998c0140495401249402957", + "0xab80524c01415009242014ab805012014aa80924c014ab80500a01413009", + "0x285100abf80485100a55c0280929c024928052ae0140d80504202491005", + "0x261009256014ab80500c14c124c101214c0295700a4940292101201802957", + "0x910052ae01491005054024908052ae014908052aa024968052ae01495805", + "0x12005012024ab80501246c0492d2444840880525a014ab80525a01661809", + "0x282400ad30048092ae014048240121380b02498e054090242ae09002809", + "0x48092ae0140482401208402cc903c08c1215704806c02cc801206c02957", + "0x295700a09802ccb0120980295700a07802cca0120880295700a05402826", + "0x2a840120a8aa8242ae0141380599a0241382604855c0282600b33004826", + "0x2668092a8014ab80505801546809058014ab8052aa0154600901255c0282a", + "0x188052ae014a88055180240495700a54c02a84012544a98242ae01413005", + "0x1994e0484540494e00a55c029540220908a809066014ab80506201546809", + "0x15009024014ab805024014aa80906c014ab8050460164c80906a014ab805", + "0x1a8052ae0141a8050920241b0052ae0141b00569e024110052ae01411005", + "0x28090480240e14c0700440281c2980e00895700a0d41b022024049a8009", + "0xab8050125380494d00a55c0281500a098048092ae0141080599c02404957", + "0x29550120f80295700a52c02ae401252c0295700a0f4088245c60241e805", + "0x283e00a55c0283e00a5900494d00a55c0294d00a0a80481200a55c02812", + "0x282400b33c048092ae0140880523c0240495700a0241200907c53409011", + "0x281600a5540484100a55c0284000ab980484000a55c0280925602404957", + "0xb01100a1040295700a104029640121380295700a1380282a01205802957", + "0xd84e0493400b01504855c120050120900280901255c028092360242084e", + "0x495704808c0282301208c090242ae014090050360240495700a02412009", + "0xab80502c0141300901255c0281200a078048092ae0140482401207802cd1", + "0x2cd40120980295700a088120249a6024110052ae014088059a402410805", + "0x482100a55c0282100a0a80481500a55c0281500a5540482700a55c02826", + "0xf0052a20240495700a0241200904e0840a81100a09c0295700a09c02cd5", + "0x2cd60580a812157048554028120125540295700a09002811012024ab805", + "0x295700a54c0281601254c0295700a0b002815012024ab80501209004954", + "0xa70059ae0cc188242ae090a88150480880495100a55c0295100a13804951", + "0x295700a0cc088249b00241a8052ae0140b00504c0240495700a02412009", + "0x282a00a4840494c00a55c0283802409019809070014ab8050120c404836", + "0x292d0120d40295700a0d40282a0120c40295700a0c40295501207002957", + "0x494c00a55c0294c00a1380483600a55c0283600ae500481c00a55c0281c", + "0x2809048024a583d29a0440294b07a5340895700a5301b01c06a0c40ab95", + "0xab80502c0141300901255c0281100b364048092ae0140900503c02404957", + "0x15005042024208052ae0141f005054024200052ae014a70052aa0241f005", + "0xab8050240140f00901255c0280904802404cda00a024aa009086014ab805", + "0xab80502a014aa809212014ab80502c0141300901255c0281100b36404809", + "0x280929c024218052ae014aa005042024208052ae0148480505402420005", + "0x124d301211c0295700a10c029210121140295700a43c02cdb01243c02957", + "0x200052ae014200052aa0248a8052ae0148a0059a80248a0052ae01422847", + "0x49150821000880522a014ab80522a0166a809082014ab80508201415009", + "0x2853012024ab8050220166c80901255c0281200a078048092ae01404824", + "0x29550121280295700a124029790121240295700a0249580901255c02824", + "0x284a00a55c0284a00b3540481b00a55c0281b00a0a80484e00a55c0284e", + "0xab80501246c048092ae01404a950120480295700a0260f80909406c27011", + "0x481b00b3702701604855c1201500a0480481500a55c0282400a04404809", + "0x88052ae014088120490840481100a55c0284e00a054048092ae01404824", + "0x482200b3741081e04855c1202301209011009046014ab8050220140b009", + "0x1382604855c1201600a0480481600a55c0281600a084048092ae01404824", + "0x282a00a0580482a00a55c0282700a054048092ae0140482401255402cde", + "0xf0052aa024a98052ae01413005242024aa0052ae01404b930120b002957", + "0x1ca0092a6014ab8052a60149680900a014ab80500a0141500903c014ab805", + "0x161542a60140f01572a024160052ae0141600509c024aa0052ae014aa005", + "0xab8050120900483500b37ca70052ae0901980572c024198312a2044ab805", + "0x481c00b380a60052ae0901c0057320241c03604855c0294e00ae6004809", + "0x1e8052ae014a60210493840494d00a55c0283100a098048092ae01404824", + "0x283e00b3900483e00a55c0294b06c09271809296014ab80507a01671009", + "0x2ce50125340295700a5340282a0125440295700a5440295501210002957", + "0xab8050380142500901255c028090480242014d2a20440284000a55c02840", + "0xab80506c01408809082014ab8050620141300901255c0282100a34804809", + "0x21805042024878052ae01420805054024848052ae014a88052aa02421805", + "0xab8050420146900901255c0280904802404ce600a024aa00908a014ab805", + "0x283100a0a80495100a55c0295100a5540484700a55c0283500a5e004809", + "0x495700a0241200908e0c4a881100a11c0295700a11c02ce50120c402957", + "0x295700a078029550124500295700a01402826012024ab80504201469009", + "0xab8050125380484500a55c0295500a0840490f00a55c0291400a0a804909", + "0x248249c6024250052ae0148a8059ce024248052ae014228052420248a805", + "0x490900a55c0290900a5540491d00a55c0291b00b3900491b00a55c0284a", + "0x1200923a43c8481100a4740295700a47402ce501243c0295700a43c0282a", + "0x15009242014ab805044014aa80923c014ab80500a0141300901255c02809", + "0x120090133a0028092a8024928052ae0140b005042024910052ae0148f005", + "0x29550124980295700a01402826012024ab8050240161a80901255c02809", + "0x492500a55c0281b00a0840492200a55c0292600a0a80492100a55c02809", + "0x298052ae01492805242024030052ae014288059ce024288052ae0140494e", + "0x292100a5540492d00a55c0292b00b3900492b00a55c028060a609271809", + "0x9081100a4b40295700a4b402ce50124880295700a4880282a01248402957", + "0xa8059d2048088242ae09012005024024120052ae0140280502202496922", + "0x270052ae0140b00502c0240b0052ae0140900502a0240495700a02412009", + "0x481e00b3a81181b04855c1204e0120901100909c014ab80509c01427009", + "0x1102104855c1201100a0480481100a55c0281100a084048092ae01404824", + "0x282700a0580482700a55c0282200a054048092ae0140482401209802ceb", + "0x27602c054090ab8242aa06c1222d0125540295700a5540284e01255402957", + "0xab82404201409009042014ab8050420141080901255c02809048024aa005", + "0xb009066014ab8052a20140a80901255c02809048024188059da544a9824", + "0x1215704853815024454024a70052ae014a700509c024a70052ae01419805", + "0x8cef0125300295700a54c02921012024ab8050120900483800b3b81b035", + "0x295700a0d4029550125340295700a07002cf00120700295700a0d816023", + "0xa694c06a0440294d00a55c0294d00b3c40494c00a55c0294c00a4b404835", + "0xaa80901255c0282c00a4b0048092ae014118051a40240495700a02412009", + "0x120090133c8028092a8024a58052ae014a98050420241e8052ae0141c005", + "0x150052aa0240495700a0b00292c012024ab8050460146900901255c02809", + "0x280904802404cf200a024aa009296014ab8050620141080907a014ab805", + "0x282100a0840483d00a55c0295400a554048092ae014118051a402404957", + "0x495700a08c028d2012024ab805012090048099e40140495401252c02957", + "0x4cf200a024aa009296014ab80504c0141080907a014ab805036014aa809", + "0xa58052ae014088050420241e8052ae0140f0052aa0240495700a02412009", + "0x1080907a014ab805012014aa80901255c0280904802404cf200a024aa009", + "0x484000a55c0283e00a5ec0483e00a55c0280929c024a58052ae0140a805", + "0x8d8090801041e81100a1000295700a10002cf10121040295700a52c02921", + "0x28090480240d84e0493cc0b01504855c120050120900280901255c02809", + "0x481e00b3d00495704808c0282301208c090242ae0140900503602404957", + "0x27a809042014ab80502c0141300901255c0281200a078048092ae01404824", + "0x295700a09802cf70120980295700a088120249ec024110052ae01408805", + "0x282700b3e00482100a55c0282100a0a80481500a55c0281500a55404827", + "0x48092ae0140f0052a20240495700a0241200904e0840a81100a09c02957", + "0x482401255002cf90580a812157048554028120125540295700a09002811", + "0x284e0125440295700a54c0281601254c0295700a0b002815012024ab805", + "0x2809048024a70059f40cc188242ae090a88150488b40495100a55c02951", + "0x48310120d80295700a0cc088242f40241a8052ae0140b00504c02404957", + "0x481c00a55c0282a00a4840494c00a55c0283802409019809070014ab805", + "0x295700a0700292d0120d40295700a0d40282a0120c40295700a0c402955", + "0x1a83102b0940494c00a55c0294c00a1380483600a55c0283600a5c40481c", + "0xf00901255c02809048024a583d29a0440294b07a5340895700a5301b01c", + "0xaa80907c014ab80502c0141300901255c0281100b0b0048092ae01409005", + "0x218052ae01415005042024208052ae0141f005054024200052ae014a7005", + "0x2c2c012024ab8050240140f00901255c0280904802404cfb00a024aa009", + "0x15009080014ab80502a014aa809212014ab80502c0141300901255c02811", + "0x490f00a55c0280929c024218052ae014aa005042024208052ae01484805", + "0xab80508a11c124f601211c0295700a10c029210121140295700a43c02cfc", + "0x20805054024200052ae014200052aa0248a8052ae0148a0059ee0248a005", + "0xab805012090049150821000880522a014ab80522a0167c009082014ab805", + "0x495700a09002853012024ab8050220161600901255c0281200a07804809", + "0x295700a138029550121280295700a12402cfd0121240295700a02495809", + "0x2501b09c0440284a00a55c0284a00b3e00481b00a55c0281b00a0a80484e", + "0x1200902a0167f012022090ab82404801409009048014ab80500a01408809", + "0x2700909c014ab80502c0140b00902c014ab8050240140a80901255c02809", + "0x482401207802cff04606c1215704813804824044024270052ae01427005", + "0x2d0004408412157048044028120120440295700a04402821012024ab805", + "0x295700a09c0281601209c0295700a08802815012024ab80501209004826", + "0xaa005a020b0150242ae090aa81b0480880495500a55c0295500a13804955", + "0xa98242ae09010805024024108052ae014108050420240495700a02412009", + "0x1980502c024198052ae014a880502a0240495700a0241200906201681151", + "0x1b03504855c1214e0540901100929c014ab80529c0142700929c014ab805", + "0x160230234100494c00a55c0295300a484048092ae014048240120e002d03", + "0x483500a55c0283500a5540494d00a55c0281c00b4140481c00a55c02836", + "0x1200929a5301a81100a5340295700a53402d060125300295700a5300292d", + "0x1c0052aa0240495700a0b0028d2012024ab8050460146900901255c02809", + "0x280904802404d0700a024aa009296014ab8052a60141080907a014ab805", + "0xab805054014aa80901255c0282c00a348048092ae014118051a402404957", + "0x495700a0241200901341c028092a8024a58052ae014188050420241e805", + "0x295700a084028210120f40295700a55002955012024ab80504601469009", + "0xaa80901255c0282300a348048092ae01404824012026838050125500494b", + "0x1200901341c028092a8024a58052ae014130050420241e8052ae0140d805", + "0xaa009296014ab8050220141080907a014ab80503c014aa80901255c02809", + "0xa8050420241e8052ae014048052aa0240495700a0241200901341c02809", + "0x29210121000295700a0f802d080120f80295700a024a7009296014ab805", + "0x28050220242004107a0440284000a55c0284000b4180484100a55c0294b", + "0x495700a0241200902a01684812022090ab82404801409009048014ab805", + "0xab80509c0142700909c014ab80502c0140b00902c014ab8050240140a809", + "0x482300b4280495704806c0282301206c270242ae0142700503602427005", + "0x9009022014ab8050220141080901255c0284e00a078048092ae01404824", + "0xab8050420140a80901255c0280904802411005a160840f0242ae09008805", + "0x4824454024138052ae0141380509c024138052ae0141300502c02413005", + "0x295700a07802821012024ab8050120900482c00b4301515504855c12027", + "0x2815012024ab8050120900495100b434a995404855c1201e00a0480481e", + "0x483300a55c0283300a1380483300a55c0283100a0580483100a55c02953", + "0xaa0052420240495700a0241200906c0168703529c090ab8240665541222d", + "0x481c00a55c0294c00b4400494c00a55c0283505409287809070014ab805", + "0x295700a0e00292d0125380295700a538029550125340295700a07002d11", + "0xc800901255c02809048024a683829c0440294d00a55c0294d00b44804838", + "0x494b00a55c0295400a0840483d00a55c0283600a554048092ae01415005", + "0xaa8052aa0240495700a0a802990012024ab80501209004809a2601404954", + "0x280904802404d1300a024aa009296014ab8052a20141080907a014ab805", + "0x28092a8024a58052ae0140f0050420241e8052ae014160052aa02404957", + "0xab8050440141080907a014ab805012014aa80901255c0280904802404d13", + "0x48092ae014118052a20240495700a0241200901344c028092a8024a5805", + "0x270242ae01427005036024200052ae014048310120f80295700a04402921", + "0x21805046024218052ae0142180509c024218052ae014200410480cc04841", + "0x494e012024ab80509c0140f00901255c0280904802484805a28024ab824", + "0xaa80908e014ab80508a0168880908a014ab80521e014bb80921e014ab805", + "0x238052ae01423805a240241f0052ae0141f00525a024048052ae01404805", + "0x28096840240495700a42402951012024ab8050120900484707c02408805", + "0x1180922a014ab80522a0142700922a014ab8052281381203301245002957", + "0x484a00a55c0280929c0240495700a024120090920168a8092ae0908a805", + "0x295700a024029550124740295700a46c02d1101246c0295700a12802d16", + "0x8e83e0120440291d00a55c0291d00b4480483e00a55c0283e00a4b404809", + "0x28b80923c014ab805012538048092ae014248052a20240495700a02412009", + "0x1f0052ae0141f00525a024048052ae014048052aa024908052ae0148f005", + "0x2955012024ab8050120900492107c02408805242014ab80524201689009", + "0x28b809244014ab8050125380494b00a55c0281500a0840483d00a55c02809", + "0x928052ae01492805a24024930052ae014a5805242024928052ae01491005", + "0x28c01602a090ab82400a02412005012024ab80501246c0492524c0f408805", + "0x118050460241181204855c0281200a06c048092ae0140482401206c27024", + "0x2826012024ab8050240140f00901255c028090480240f005a32024ab824", + "0x130052ae0141102404946c0482200a55c0281100b4680482100a55c02816", + "0xab8050420141500902a014ab80502a014aa80904e014ab80504c0168e009", + "0x48092ae0140482401209c10815022014138052ae014138052ea02410805", + "0x150242ae090aa805024024aa8052ae014120050220240495700a07802951", + "0xa980502c024a98052ae0141600502a0240495700a024120092a80168e82c", + "0x1983104855c1215102a0913f0092a2014ab8052a2014270092a2014ab805", + "0x28120120a80295700a0a802821012024ab8050120900483606a53808d1e", + "0x295700a53002815012024ab8050120900481c00b47ca603804855c1202a", + "0x1e8310489f80483d00a55c0283d00a1380483d00a55c0294d00a0580494d", + "0xab80502c0141300901255c02809048024218410800469003e296090ab824", + "0x1252201243c0295700a43c02ccb01243c0295700a0f819824a4202484805", + "0x8a0052ae014238120480cc0484700a55c02809062024228052ae01487811", + "0xab80521201415009296014ab805296014aa80922a014ab80507001490809", + "0x8a00509c024228052ae014228059200248a8052ae0148a80525a02484805", + "0x250490220148d84a092044ab8052281148a90929605648809228014ab805", + "0x48092ae014218055080240495700a10402a84012024ab8050120900491b", + "0x1300901255c0281100b260048092ae014198055080240495700a0480281e", + "0x908052ae0148e8050540248f0052ae014200052aa0248e8052ae0140b005", + "0xf00901255c0280904802404d2300a024aa009244014ab80507001410809", + "0x2826012024ab8050220164c00901255c0283300aa10048092ae01409005", + "0x492100a55c0292500a0a80491e00a55c0283100a5540492500a55c02816", + "0x2a84012024ab80501209004809a46014049540124880295700a07002821", + "0x88059300240495700a0480281e012024ab80506c0154200901255c02835", + "0x282a0124780295700a538029550124980295700a05802826012024ab805", + "0x4824012026918050125500492200a55c0282a00a0840492100a55c02926", + "0x281600a098048092ae014088059300240495700a0480281e012024ab805", + "0x28210124840295700a1440282a0124780295700a0540295501214402957", + "0x908090a6014ab80500c0169200900c014ab8050125380492200a55c02954", + "0x295700a4b402d1c0124b40295700a14c95824a36024958052ae01491005", + "0x286900a5d40492100a55c0292100a0a80491e00a55c0291e00a55404869", + "0x48092ae0140900503c0240495700a024120090d24848f01100a1a402957", + "0x2928090d0014ab8050124ac048092ae014120050a60240495700a04402c98", + "0xd8052ae0140d805054024270052ae014270052aa024338052ae01434005", + "0x482400a55c0280500a04404867036138088050ce014ab8050ce014ba809", + "0x281200a054048092ae0140482401205402d260240441215704809002812", + "0x281b0121380295700a1380284e0121380295700a0580281601205802957", + "0x495700a02412009046016938092ae0900d8050460240d84e04855c0284e", + "0x12157048044028120120440295700a04402821012024ab80509c0140f009", + "0x28160120980295700a08402815012024ab8050120900482200b4a01081e", + "0xaa8242ae090138090488b40482700a55c0282700a1380482700a55c02826", + "0x15005a54024aa0052ae0140f0052420240495700a024120090580169482a", + "0x968092aa014ab8052aa014aa8092a2014ab8052a6016958092a6014ab805", + "0x4824012544aa155022014a88052ae014a8805a58024aa0052ae014aa005", + "0x49540120cc0295700a078028210120c40295700a0b002955012024ab805", + "0x282200a0840483100a55c0280900a554048092ae0140482401202696805", + "0x495700a08c02951012024ab80501209004809a5a014049540120cc02957", + "0xab80506a0142700906a014ab80529c138120330125380295700a02418809", + "0x88050420240495700a0241200906c016970092ae0901a8050460241a805", + "0x495700a024120090380169794c070090ab82402201409009022014ab805", + "0xab80507a0142700907a014ab80529a0140b00929a014ab8052980140a809", + "0x48092ae0140482401210002d3007c52c121570480f4048244540241e805", + "0x295700a10c02d2b01210c0295700a0f802d310121040295700a0e002921", + "0x290900b4b00484100a55c0284100a4b40494b00a55c0294b00a55404909", + "0x188052ae014200052aa0240495700a02412009212104a581100a42402957", + "0xaa80901255c0280904802404d2d00a024aa009066014ab80507001410809", + "0x120090134b4028092a8024198052ae0140e005042024188052ae01404805", + "0x494e01243c0295700a04402921012024ab80506c014a880901255c02809", + "0x96809012014ab805012014aa80908e014ab80508a0169900908a014ab805", + "0x482401211c87809022014238052ae01423805a58024878052ae01487805", + "0x494e0120cc0295700a054028210120c40295700a02402955012024ab805", + "0x296009092014ab8050660149080922a014ab80522801699009228014ab805", + "0x7e0fd1e6024090221fa3cc0481228a454248310220148a8052ae0148a805", + "0x4812196044120050123f07e8f3012048110fd1e60240900902209002809", + "0x7e8f3012048110fd1e60240928c022090028091f83f4798090240887e8f3", + "0x948c022090028091f83f4798090240887e8f3012049cb011048014048fc", + "0x798090240887e8f301204a99811048014048fc1fa3cc048120443f479809", + "0x29a811048014048fc1fa3cc048120443f4798090254d00882400a0247e0fd", + "0x48120443f4798090254d80882400a0247e0fd1e6024090221fa3cc04812", + "0x882400a0247e0fd1e6024090221fa3cc04812a6e044120050123f07e8f3", + "0x90221fa3cc04812a72044120050123f07e8f3012048110fd1e602409538", + "0x120050123f07e8f3012048110fd1e60240953a022090028091f83f479809", + "0x110fd1e60240953c022090028091f83f4798090240887e8f301204a9d811", + "0x28091f83f4798090240887e8f301204a9e811048014048fc1fa3cc04812", + "0x7e8f301204a9f811048014048fc1fa3cc048120443f4798090254f808824", + "0x48fc1fa3cc048120443f4798090255000882400a0247e0fd1e602409022", + "0x798090255080882400a0247e0fd1e6024090221fa3cc04812a8204412005", + "0x7e0fd1e6024090221fa3cc04812a86044120050123f07e8f3012048110fd", + "0x4812a8a044120050123f07e8f3012048110fd1e60240954402209002809", + "0x7e8f3012048110fd1e602409546022090028091f83f4798090240887e8f3", + "0x9548022090028091f83f4798090240887e8f301204aa3811048014048fc", + "0x798090240887e8f301204aa4811048014048fc1fa3cc048120443f479809", + "0x2a5811048014048fc1fa3cc048120443f4798090255280882400a0247e0fd", + "0x48120443f4798090255300882400a0247e0fd1e6024090221fa3cc04812", + "0x882400a0247e0fd1e6024090221fa3cc04812a9a044120050123f07e8f3", + "0x490a1e6024088221e602408d5104e01404d5004e01404d4f04e01404d4e", + "0x481104402412553022090028092203cc0481103c4387980902554812005", + "0xf0861e602409555048014049121e6024088221e602408d5400a02488822", + "0x1100904955c0280922c0880481104402412556022090028092203cc04811", + "0x88221e602408d5900a0248c822012044110090495600280922e08804811", + "0xad5b022090028092203cc0481103c120798090255681200501247079809", + "0x481103c48079809025570090110480140491f1e60240881c17c08879809", + "0x9011048014049231e60240881c0920887980902b5740882400a024880f3", + "0x798090220887980902357c0882400a024880f30120440f1241e60240955e", + "0x110090495840882400a024880f30120440f1281e60240956004801404927", + "0x1100904958c120050124a879809022088798090235880280925208804811", + "0x48110440241256500a02497022012044110090495900280925808804811", + "0x481104402412567048014049301e6024088221e602408d6600a02497822", + "0x79809022088798090235a40280926a088048110440241256800a02499822", + "0x9c022012044110090495ac0280926e088048110440241256a04801404936", + "0x49411e6024088221e602408d6d00a0249d822012044110090495b002809", + "0xad7001209c0281c00b5bc1200501251479809022088798090235b812005", + "0x79809022088798090235c409011048014049491e60240881c0b608879809", + "0x7980902b5cc0882400a024880f30120440f0681e6024095720480140493a", + "0x49091e6024088221e602408d7402404412005012450798090220701f022", + "0x798090220701a8221e60240ad7600a024a5822012044110090495d412005", + "0x48110440241257800a024a7022012044110090495dc090110480140494c", + "0x1257a02404412005012554798090220700d8221e60240ad7900a024aa022", + "0x57b00a0242702201204411009" + ], + "sierra_program_debug_info": { + "type_names": [ + [0, "RangeCheck"], + [1, "Box"], + [2, "core::panics::Panic"], + [3, "u32"], + [4, "u64"], + [5, "core::result::Result::"], + [6, "Unit"], + [7, "core::option::Option::>"], + [8, "Array"], + [9, "core::option::Option::>"], + [10, "Array"], + [11, "Snapshot>"], + [12, "core::array::Span::"], + [ + 13, + "Tuple, core::option::Option::>>" + ], + [14, "Tuple>"], + [ + 15, + "core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>" + ], + [16, "Tuple"], + [17, "enums::StatusEnum"], + [18, "core::option::Option::"], + [19, "index_enum_type<9>"], + [20, "BoundedInt<0, 8>"], + [21, "u16"], + [22, "Tuple"], + [23, "core::option::Option::<[core::integer::u16; 3]>"], + [24, "Array"], + [25, "core::option::Option::>"], + [ + 26, + "Tuple, core::option::Option::>>" + ], + [ + 27, + "core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>" + ], + [28, "felt252"], + [29, "Uninitialized"], + [30, "Tuple"], + [31, "core::option::Option::<(core::integer::u16, core::integer::u32, core::integer::u64)>"], + [32, "Array"], + [33, "Tuple>"], + [ + 34, + "core::option::Option::<(core::integer::u16, core::array::Array::)>" + ], + [ + 35, + "Tuple, core::option::Option::<(core::integer::u16, core::array::Array::)>>" + ], + [ + 36, + "core::panics::PanicResult::<(core::array::Span::, core::option::Option::<(core::integer::u16, core::array::Array::)>)>" + ], + [37, "Box"], + [38, "core::option::Option::>"], + [ + 39, + "Tuple, core::option::Option::>>" + ], + [ + 40, + "core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>" + ], + [41, "Box"], + [42, "Array"], + [43, "Snapshot>"], + [44, "Uninitialized>>"], + [45, "Box>"], + [46, "Const"], + [47, "Const"], + [48, "Const"], + [49, "Const"], + [50, "Const"], + [51, "u128"], + [52, "core::integer::u256"], + [53, "Snapshot>"], + [54, "Const"], + [55, "Const"], + [56, "Tuple"], + [57, "core::array::Span::"], + [58, "Tuple"], + [59, "Box"], + [60, "Tuple>"], + [ + 61, + "core::option::Option::<(core::integer::u32, core::array::Array::)>" + ], + [ + 62, + "Tuple, core::option::Option::<(core::integer::u32, core::array::Array::)>>" + ], + [ + 63, + "core::panics::PanicResult::<(core::array::Span::, core::option::Option::<(core::integer::u32, core::array::Array::)>)>" + ], + [64, "Box"], + [65, "Array"], + [66, "core::option::Option::>"], + [ + 67, + "Tuple, core::option::Option::>>" + ], + [ + 68, + "core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>" + ], + [69, "Const"], + [ + 70, + "Const" + ], + [71, "Const"], + [72, "u8"], + [73, "enums::Point"], + [74, "core::option::Option::"], + [75, "enums::MyEnum"], + [76, "core::option::Option::"], + [77, "Tuple, core::option::Option::>"], + [ + 78, + "core::panics::PanicResult::<(core::array::Span::, core::option::Option::)>" + ], + [79, "bytes31"], + [80, "enums::ExecutionReport"], + [81, "core::option::Option::"], + [ + 82, + "Tuple, core::option::Option::>" + ], + [ + 83, + "core::panics::PanicResult::<(core::array::Span::, core::option::Option::)>" + ], + [84, "Uninitialized"], + [85, "core::result::Result::"], + [86, "enums::Destruction"], + [87, "core::option::Option::>"], + [88, "enums::Truck"], + [89, "core::option::Option::"], + [90, "Tuple"], + [91, "enums::Horse"], + [92, "core::option::Option::"], + [93, "Snapshot>"], + [94, "core::array::Span::"], + [95, "enums::Dog"], + [96, "core::option::Option::"], + [97, "Tuple, core::option::Option::>"], + [ + 98, + "core::panics::PanicResult::<(core::array::Span::, core::option::Option::)>" + ], + [99, "Tuple"], + [100, "enums::Cat"], + [101, "core::option::Option::"], + [102, "enums::Point2"], + [103, "core::option::Option::"], + [104, "core::result::Result::"], + [105, "core::option::Option::>"], + [ + 106, + "Tuple, core::option::Option::>>" + ], + [ + 107, + "core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>" + ], + [108, "core::result::Result::"], + [109, "core::option::Option::>"], + [110, "core::option::Option::"], + [ + 111, + "core::result::Result::>" + ], + [ + 112, + "core::option::Option::>>" + ], + [113, "core::result::Result::"], + [ + 114, + "core::result::Result::, core::integer::u32>" + ], + [ + 115, + "core::option::Option::, core::integer::u32>>" + ], + [116, "Snapshot>>"], + [ + 117, + "core::result::Result::<(core::integer::u32, core::array::Array::), (core::integer::u16, core::array::Array::)>" + ], + [ + 118, + "Snapshot), (core::integer::u16, core::array::Array::)>>" + ], + [ + 119, + "core::option::Option::), (core::integer::u16, core::array::Array::)>>" + ], + [ + 120, + "Tuple, core::option::Option::), (core::integer::u16, core::array::Array::)>>>" + ], + [ + 121, + "core::panics::PanicResult::<(core::array::Span::, core::option::Option::), (core::integer::u16, core::array::Array::)>>)>" + ], + [122, "Tuple"], + [123, "Tuple"], + [124, "core::result::Result::<[core::integer::u32; 3], [core::integer::u16; 2]>"], + [ + 125, + "core::option::Option::>" + ], + [126, "Snapshot>"], + [127, "core::array::Span::"], + [ + 128, + "core::result::Result::, core::array::Array::>" + ], + [ + 129, + "Snapshot, core::array::Array::>>" + ], + [ + 130, + "core::option::Option::, core::array::Array::>>" + ], + [ + 131, + "Tuple, core::option::Option::, core::array::Array::>>>" + ], + [ + 132, + "core::panics::PanicResult::<(core::array::Span::, core::option::Option::, core::array::Array::>>)>" + ], + [133, "core::array::Span::"], + [134, "core::option::Option::>"], + [ + 135, + "Tuple, core::option::Option::>>" + ], + [ + 136, + "core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>" + ], + [137, "Array>"], + [138, "Snapshot>>"], + [139, "core::array::Span::>"], + [ + 140, + "core::option::Option::>>" + ], + [ + 141, + "Tuple, core::option::Option::>>>" + ], + [ + 142, + "core::panics::PanicResult::<(core::array::Span::, core::option::Option::>>)>" + ], + [143, "core::option::Option::>"], + [ + 144, + "Tuple, core::option::Option::>>" + ], + [ + 145, + "core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>" + ], + [146, "core::option::Option::"], + [147, "core::option::Option::>"], + [ + 148, + "core::option::Option::>" + ], + [149, "core::option::Option::"], + [150, "core::option::Option::>"], + [ + 151, + "core::option::Option::>>" + ], + [152, "Snapshot>>"], + [ + 153, + "Snapshot)>>" + ], + [ + 154, + "core::option::Option::)>>" + ], + [ + 155, + "Tuple, core::option::Option::)>>>" + ], + [ + 156, + "core::panics::PanicResult::<(core::array::Span::, core::option::Option::)>>)>" + ], + [157, "core::option::Option::<[core::integer::u32; 3]>"], + [158, "Tuple, Unit>"], + [159, "core::panics::PanicResult::<(core::array::Array::, ())>"], + [160, "Snapshot>"], + [161, "core::array::Span::"], + [162, "Snapshot>>"], + [ + 163, + "core::option::Option::>>" + ], + [ + 164, + "Tuple, core::option::Option::>>>" + ], + [ + 165, + "core::panics::PanicResult::<(core::array::Span::, core::option::Option::>>)>" + ], + [166, "Tuple>"], + [167, "Const"], + [168, "BuiltinCosts"], + [169, "System"], + [170, "core::panics::PanicResult::<(core::array::Span::,)>"], + [171, "Const"], + [172, "NonZero"], + [173, "Box"], + [174, "GasBuiltin"] + ], + "libfunc_names": [ + [0, "revoke_ap_tracking"], + [1, "withdraw_gas"], + [2, "branch_align"], + [3, "struct_deconstruct>"], + [4, "array_snapshot_pop_front"], + [5, "unbox"], + [6, "rename"], + [7, "store_temp"], + [8, "dup"], + [9, "felt252_is_zero"], + [10, "drop"], + [11, "store_temp>>"], + [12, "u16_try_from_felt252"], + [13, "redeposit_gas"], + [14, "enum_init, 0>"], + [15, "store_temp"], + [16, "store_temp"], + [17, "store_temp>"], + [18, "jump"], + [19, "drop>>"], + [20, "drop>"], + [21, "const_as_immediate>"], + [22, "felt252_sub"], + [23, "struct_construct"], + [24, "enum_init, 1>"], + [25, "drop>"], + [26, "drop>"], + [ + 27, + "function_call>" + ], + [28, "enum_init,)>, 1>"], + [29, "store_temp"], + [30, "store_temp,)>>"], + [31, "get_builtin_costs"], + [32, "store_temp"], + [33, "withdraw_gas_all"], + [34, "array_new"], + [35, "snapshot_take>"], + [36, "enable_ap_tracking"], + [37, "enum_match>"], + [38, "rename"], + [39, "u16_to_felt252"], + [40, "const_as_immediate>"], + [41, "array_append"], + [42, "store_temp>"], + [43, "drop"], + [44, "disable_ap_tracking"], + [45, "snapshot_take>"], + [46, "drop>"], + [47, "struct_construct>"], + [48, "struct_construct>>"], + [49, "enum_init,)>, 0>"], + [50, "rename"], + [51, "rename"], + [ + 52, + "function_call>" + ], + [53, "drop>"], + [54, "function_call>"], + [55, "store_temp>"], + [ + 56, + "function_call, core::array::ArraySerde::, core::integer::u8Drop>>::deserialize>" + ], + [ + 57, + "enum_match, core::option::Option::>>)>>" + ], + [ + 58, + "struct_deconstruct, core::option::Option::>>>>" + ], + [ + 59, + "enum_match>>>" + ], + [60, "drop>>"], + [61, "snapshot_take>>"], + [62, "enum_snapshot_match>>"], + [63, "dup>>"], + [64, "array_len"], + [65, "u32_to_felt252"], + [66, "struct_construct>"], + [67, "store_temp>"], + [ + 68, + "function_call, core::integer::u8Drop>>" + ], + [69, "enum_match, ())>>"], + [70, "struct_deconstruct, Unit>>"], + [ + 71, + "function_call, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<[core::integer::u32; 2], core::fixed_size_array::TupleSplitFixedSizedArraySized2::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<[core::integer::u32; 1], core::fixed_size_array::TupleSplitFixedSizedArraySized1::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleBaseFixedSizedArray::, core::integer::u32Drop>, core::integer::u32Drop>, core::integer::u32Drop>::deserialize>" + ], + [72, "enum_match>"], + [73, "enum_init, 0>"], + [74, "store_temp>"], + [75, "enum_init, 1>"], + [76, "drop>"], + [77, "snapshot_take>"], + [78, "struct_deconstruct>"], + [79, "rename"], + [ + 80, + "function_call), core::tuple::SerdeTuple::<(core::integer::u32, core::array::Array::), core::tuple::TupleSnapForwardTupleSize2::>, core::tuple::SerializeTupleNext::<(@core::integer::u32, @core::array::Array::), core::tuple::TupleSplitTupleSize2::<@core::integer::u32, @core::array::Array::>, core::tuple::SerdeBasedSerializeTuple::>, core::tuple::SerializeTupleNext::<(@core::array::Array::,), core::tuple::TupleSplitTupleSize1::<@core::array::Array::>, core::tuple::SerdeBasedSerializeTuple::, core::array::ArraySerde::, core::integer::u32Drop>>, core::tuple::SerializeTupleBaseTuple, core::tuple::TupleSize0Drop>, core::tuple::TupleNextDrop::<(@core::array::Array::,), core::tuple::TupleSplitTupleSize1::<@core::array::Array::>, core::tuple::IsTupleTupleSize1::<@core::array::Array::>, core::traits::SnapshotDrop::>, core::tuple::TupleSize0Drop>>, core::tuple::DeserializeTupleNext::<(core::integer::u32, core::array::Array::), core::tuple::TupleSplitTupleSize2::>, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<(core::array::Array::,), core::tuple::TupleSplitTupleSize1::>, core::array::ArraySerde::, core::integer::u32Drop>, core::tuple::DeserializeTupleBaseTuple, core::array::ArrayDrop::>, core::integer::u32Drop>>>::deserialize>" + ], + [ + 81, + "enum_match, core::option::Option::)>>)>>" + ], + [ + 82, + "struct_deconstruct, core::option::Option::)>>>>" + ], + [ + 83, + "enum_match)>>>" + ], + [ + 84, + "drop)>>" + ], + [ + 85, + "snapshot_take)>>" + ], + [ + 86, + "enum_snapshot_match)>>" + ], + [87, "struct_snapshot_deconstruct>>"], + [88, "dup>>"], + [89, "array_len"], + [90, "struct_construct>"], + [91, "store_temp>"], + [ + 92, + "function_call, core::integer::u32Drop>>" + ], + [ + 93, + "function_call, core::option::OptionSerde::>>::deserialize>" + ], + [ + 94, + "enum_match>>>" + ], + [95, "drop>>"], + [96, "snapshot_take>>"], + [97, "enum_match>>"], + [ + 98, + "function_call, core::serde::into_felt252_based::SerdeImpl::>::deserialize>" + ], + [ + 99, + "enum_match>>" + ], + [ + 100, + "enum_init>, 0>" + ], + [ + 101, + "store_temp>>" + ], + [ + 102, + "enum_init>, 1>" + ], + [ + 103, + "drop>>" + ], + [ + 104, + "snapshot_take>>" + ], + [105, "enum_match>"], + [106, "rename"], + [107, "u8_to_felt252"], + [ + 108, + "function_call::deserialize>" + ], + [109, "enum_match>>"], + [110, "drop>"], + [111, "snapshot_take>"], + [112, "enum_match>"], + [113, "dup"], + [114, "struct_deconstruct"], + [115, "drop"], + [116, "rename"], + [117, "u64_to_felt252"], + [118, "drop"], + [ + 119, + "function_call::deserialize>" + ], + [ + 120, + "enum_match, core::option::Option::>)>>" + ], + [ + 121, + "struct_deconstruct, core::option::Option::>>>" + ], + [122, "enum_match>>"], + [123, "drop>"], + [124, "snapshot_take>"], + [125, "enum_match>"], + [126, "store_temp"], + [127, "function_call"], + [128, "array_new>"], + [129, "store_temp>>"], + [ + 130, + "function_call, core::option::OptionSerde::>, core::option::OptionDrop::>>" + ], + [ + 131, + "enum_match, core::option::Option::>>)>>" + ], + [ + 132, + "struct_deconstruct, core::option::Option::>>>>" + ], + [ + 133, + "enum_match>>>" + ], + [134, "drop>>"], + [135, "snapshot_take>>"], + [136, "dup>>>"], + [137, "array_len>"], + [138, "struct_construct>>"], + [139, "store_temp>>"], + [ + 140, + "function_call, core::option::OptionSerde::>, core::option::OptionDrop::>>" + ], + [141, "array_new"], + [142, "store_temp>"], + [ + 143, + "function_call>" + ], + [ + 144, + "enum_match, core::option::Option::>)>>" + ], + [ + 145, + "struct_deconstruct, core::option::Option::>>>" + ], + [146, "enum_match>>"], + [147, "drop>"], + [148, "snapshot_take>"], + [149, "dup>>"], + [150, "array_len"], + [151, "struct_construct>"], + [152, "store_temp>"], + [ + 153, + "function_call>" + ], + [154, "drop"], + [155, "drop>"], + [156, "snapshot_take>"], + [ + 157, + "function_call, core::array::Array::, core::array::ArraySerde::, core::integer::u8Drop>, core::array::ArraySerde::, core::integer::u16Drop>>::deserialize>" + ], + [ + 158, + "enum_match, core::option::Option::, core::array::Array::>>)>>" + ], + [ + 159, + "struct_deconstruct, core::option::Option::, core::array::Array::>>>>" + ], + [ + 160, + "enum_match, core::array::Array::>>>" + ], + [ + 161, + "drop, core::array::Array::>>" + ], + [ + 162, + "snapshot_take, core::array::Array::>>" + ], + [ + 163, + "enum_snapshot_match, core::array::Array::>>" + ], + [164, "rename, ())>>"], + [165, "dup>>"], + [166, "array_len"], + [167, "struct_construct>"], + [168, "store_temp>"], + [ + 169, + "function_call, core::integer::u16Drop>>" + ], + [ + 170, + "function_call, core::tuple::SerializeTupleNext::<[@core::integer::u32; 3], core::fixed_size_array::TupleSplitFixedSizedArraySized3::<@core::integer::u32>, core::tuple::SerdeBasedSerializeTuple::>, core::tuple::SerializeTupleNext::<[@core::integer::u32; 2], core::fixed_size_array::TupleSplitFixedSizedArraySized2::<@core::integer::u32>, core::tuple::SerdeBasedSerializeTuple::>, core::tuple::SerializeTupleNext::<[@core::integer::u32; 1], core::fixed_size_array::TupleSplitFixedSizedArraySized1::<@core::integer::u32>, core::tuple::SerdeBasedSerializeTuple::>, core::tuple::SerializeTupleBaseFixedSizedArray::, core::fixed_size_array::FixedSizedArrayDrop::<@core::integer::u32, core::traits::SnapshotDrop::, 0>>, core::fixed_size_array::FixedSizedArrayDrop::<@core::integer::u32, core::traits::SnapshotDrop::, 1>>, core::fixed_size_array::FixedSizedArrayDrop::<@core::integer::u32, core::traits::SnapshotDrop::, 2>>, core::tuple::DeserializeTupleNext::<[core::integer::u32; 3], core::fixed_size_array::TupleSplitFixedSizedArraySized3::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<[core::integer::u32; 2], core::fixed_size_array::TupleSplitFixedSizedArraySized2::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<[core::integer::u32; 1], core::fixed_size_array::TupleSplitFixedSizedArraySized1::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleBaseFixedSizedArray::, core::integer::u32Drop>, core::integer::u32Drop>, core::integer::u32Drop>>, core::tuple::SerdeTuple::<[core::integer::u16; 2], core::fixed_size_array::TupleSnapForwardFixedSizedArraySized2::, core::tuple::SerializeTupleNext::<[@core::integer::u16; 2], core::fixed_size_array::TupleSplitFixedSizedArraySized2::<@core::integer::u16>, core::tuple::SerdeBasedSerializeTuple::>, core::tuple::SerializeTupleNext::<[@core::integer::u16; 1], core::fixed_size_array::TupleSplitFixedSizedArraySized1::<@core::integer::u16>, core::tuple::SerdeBasedSerializeTuple::>, core::tuple::SerializeTupleBaseFixedSizedArray::, core::fixed_size_array::FixedSizedArrayDrop::<@core::integer::u16, core::traits::SnapshotDrop::, 0>>, core::fixed_size_array::FixedSizedArrayDrop::<@core::integer::u16, core::traits::SnapshotDrop::, 1>>, core::tuple::DeserializeTupleNext::<[core::integer::u16; 2], core::fixed_size_array::TupleSplitFixedSizedArraySized2::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<[core::integer::u16; 1], core::fixed_size_array::TupleSplitFixedSizedArraySized1::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleBaseFixedSizedArray::, core::integer::u16Drop>, core::integer::u16Drop>>>::deserialize>" + ], + [ + 171, + "enum_match>>" + ], + [172, "drop>"], + [ + 173, + "snapshot_take>" + ], + [174, "enum_match>"], + [175, "struct_deconstruct>"], + [ + 176, + "function_call), (core::integer::u16, core::array::Array::), core::tuple::SerdeTuple::<(core::integer::u32, core::array::Array::), core::tuple::TupleSnapForwardTupleSize2::>, core::tuple::SerializeTupleNext::<(@core::integer::u32, @core::array::Array::), core::tuple::TupleSplitTupleSize2::<@core::integer::u32, @core::array::Array::>, core::tuple::SerdeBasedSerializeTuple::>, core::tuple::SerializeTupleNext::<(@core::array::Array::,), core::tuple::TupleSplitTupleSize1::<@core::array::Array::>, core::tuple::SerdeBasedSerializeTuple::, core::array::ArraySerde::, core::integer::u32Drop>>, core::tuple::SerializeTupleBaseTuple, core::tuple::TupleSize0Drop>, core::tuple::TupleNextDrop::<(@core::array::Array::,), core::tuple::TupleSplitTupleSize1::<@core::array::Array::>, core::tuple::IsTupleTupleSize1::<@core::array::Array::>, core::traits::SnapshotDrop::>, core::tuple::TupleSize0Drop>>, core::tuple::DeserializeTupleNext::<(core::integer::u32, core::array::Array::), core::tuple::TupleSplitTupleSize2::>, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<(core::array::Array::,), core::tuple::TupleSplitTupleSize1::>, core::array::ArraySerde::, core::integer::u32Drop>, core::tuple::DeserializeTupleBaseTuple, core::array::ArrayDrop::>, core::integer::u32Drop>>, core::tuple::SerdeTuple::<(core::integer::u16, core::array::Array::), core::tuple::TupleSnapForwardTupleSize2::>, core::tuple::SerializeTupleNext::<(@core::integer::u16, @core::array::Array::), core::tuple::TupleSplitTupleSize2::<@core::integer::u16, @core::array::Array::>, core::tuple::SerdeBasedSerializeTuple::>, core::tuple::SerializeTupleNext::<(@core::array::Array::,), core::tuple::TupleSplitTupleSize1::<@core::array::Array::>, core::tuple::SerdeBasedSerializeTuple::, core::array::ArraySerde::, core::integer::u16Drop>>, core::tuple::SerializeTupleBaseTuple, core::tuple::TupleSize0Drop>, core::tuple::TupleNextDrop::<(@core::array::Array::,), core::tuple::TupleSplitTupleSize1::<@core::array::Array::>, core::tuple::IsTupleTupleSize1::<@core::array::Array::>, core::traits::SnapshotDrop::>, core::tuple::TupleSize0Drop>>, core::tuple::DeserializeTupleNext::<(core::integer::u16, core::array::Array::), core::tuple::TupleSplitTupleSize2::>, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<(core::array::Array::,), core::tuple::TupleSplitTupleSize1::>, core::array::ArraySerde::, core::integer::u16Drop>, core::tuple::DeserializeTupleBaseTuple, core::array::ArrayDrop::>, core::integer::u16Drop>>>::deserialize>" + ], + [ + 177, + "enum_match, core::option::Option::), (core::integer::u16, core::array::Array::)>>)>>" + ], + [ + 178, + "struct_deconstruct, core::option::Option::), (core::integer::u16, core::array::Array::)>>>>" + ], + [ + 179, + "enum_match), (core::integer::u16, core::array::Array::)>>>" + ], + [ + 180, + "drop), (core::integer::u16, core::array::Array::)>>" + ], + [ + 181, + "snapshot_take), (core::integer::u16, core::array::Array::)>>" + ], + [ + 182, + "enum_snapshot_match), (core::integer::u16, core::array::Array::)>>" + ], + [183, "struct_snapshot_deconstruct>>"], + [ + 184, + "function_call, core::integer::u32, core::result::ResultSerde::, core::serde::into_felt252_based::SerdeImpl::>, core::serde::into_felt252_based::SerdeImpl::>::deserialize>" + ], + [ + 185, + "enum_match, core::integer::u32>>>" + ], + [ + 186, + "drop, core::integer::u32>>" + ], + [ + 187, + "snapshot_take, core::integer::u32>>" + ], + [ + 188, + "enum_match, core::integer::u32>>" + ], + [ + 189, + "function_call, core::serde::into_felt252_based::SerdeImpl::, core::option::OptionSerde::>>::deserialize>" + ], + [ + 190, + "enum_match>>>" + ], + [ + 191, + "drop>>" + ], + [ + 192, + "snapshot_take>>" + ], + [ + 193, + "enum_match>>" + ], + [194, "enum_match>"], + [ + 195, + "function_call, enums::PointSerde>::deserialize>" + ], + [ + 196, + "enum_match>>" + ], + [197, "drop>"], + [198, "snapshot_take>"], + [199, "enum_match>"], + [ + 200, + "function_call, enums::MyEnumSerde>::deserialize>" + ], + [ + 201, + "enum_match, core::option::Option::>)>>" + ], + [ + 202, + "struct_deconstruct, core::option::Option::>>>" + ], + [ + 203, + "enum_match>>" + ], + [204, "drop>"], + [205, "snapshot_take>"], + [206, "enum_match>"], + [207, "u64_try_from_felt252"], + [208, "u32_try_from_felt252"], + [209, "struct_construct"], + [210, "snapshot_take"], + [211, "drop"], + [212, "store_temp"], + [213, "function_call"], + [214, "enum_match>"], + [215, "drop"], + [216, "snapshot_take"], + [217, "dup"], + [218, "struct_deconstruct"], + [219, "function_call"], + [220, "enum_match>"], + [221, "drop"], + [222, "snapshot_take"], + [223, "dup"], + [224, "struct_deconstruct"], + [225, "drop>"], + [226, "struct_deconstruct>"], + [227, "function_call"], + [ + 228, + "enum_match, core::option::Option::)>>" + ], + [ + 229, + "struct_deconstruct, core::option::Option::>>" + ], + [230, "enum_match>"], + [231, "drop"], + [232, "snapshot_take"], + [233, "dup"], + [234, "struct_deconstruct"], + [235, "drop>"], + [236, "dup>"], + [237, "rename>"], + [238, "struct_deconstruct>"], + [239, "function_call"], + [240, "enum_match>"], + [241, "drop"], + [242, "snapshot_take"], + [243, "dup"], + [244, "struct_deconstruct"], + [245, "drop>"], + [246, "struct_deconstruct>"], + [247, "function_call"], + [248, "enum_match>"], + [249, "drop"], + [250, "snapshot_take"], + [251, "dup"], + [252, "struct_deconstruct"], + [253, "drop>"], + [254, "enum_match>"], + [255, "u128s_from_felt252"], + [ + 256, + "function_call, core::serde::into_felt252_based::SerdeImpl::>::deserialize>" + ], + [ + 257, + "enum_match>>" + ], + [258, "drop"], + [259, "drop>"], + [260, "struct_construct"], + [261, "snapshot_take"], + [262, "drop"], + [263, "store_temp"], + [264, "dup"], + [265, "struct_deconstruct"], + [266, "rename"], + [267, "u128_to_felt252"], + [268, "enum_match>"], + [269, "alloc_local"], + [270, "finalize_locals"], + [271, "function_call"], + [ + 272, + "enum_match, core::option::Option::)>>" + ], + [ + 273, + "struct_deconstruct, core::option::Option::>>" + ], + [274, "enum_match>"], + [275, "store_local"], + [276, "drop"], + [277, "snapshot_take"], + [278, "dup"], + [279, "struct_deconstruct"], + [280, "drop"], + [281, "drop"], + [282, "rename"], + [283, "bytes31_to_felt252"], + [284, "drop>"], + [285, "function_call"], + [ + 286, + "enum_match, core::option::Option::)>>" + ], + [ + 287, + "struct_deconstruct, core::option::Option::>>" + ], + [288, "snapshot_take"], + [ + 289, + "const_as_immediate>" + ], + [290, "function_call"], + [ + 291, + "const_as_immediate>" + ], + [292, "const_as_immediate>"], + [293, "array_new"], + [294, "store_temp>"], + [ + 295, + "function_call, core::integer::u8Drop>>" + ], + [ + 296, + "enum_match, core::option::Option::>)>>" + ], + [ + 297, + "struct_deconstruct, core::option::Option::>>>" + ], + [298, "enum_match>>"], + [299, "enum_init>, 0>"], + [ + 300, + "enum_init>>, 0>" + ], + [ + 301, + "struct_construct, core::option::Option::>>>>" + ], + [ + 302, + "enum_init, core::option::Option::>>)>, 0>" + ], + [ + 303, + "store_temp, core::option::Option::>>)>>" + ], + [304, "rename"], + [ + 305, + "enum_init, core::option::Option::>>)>, 1>" + ], + [ + 306, + "enum_init>>, 1>" + ], + [307, "enum_init>, 1>"], + [308, "struct_deconstruct>"], + [309, "array_snapshot_pop_front"], + [310, "unbox"], + [311, "drop>>"], + [312, "struct_construct, Unit>>"], + [313, "enum_init, ())>, 0>"], + [314, "store_temp, ())>>"], + [315, "drop>"], + [316, "enum_init, ())>, 1>"], + [317, "struct_construct>"], + [ + 318, + "function_call), core::tuple::TupleSplitTupleSize2::>, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<(core::array::Array::,), core::tuple::TupleSplitTupleSize1::>, core::array::ArraySerde::, core::integer::u32Drop>, core::tuple::DeserializeTupleBaseTuple, core::array::ArrayDrop::>, core::integer::u32Drop>::deserialize>" + ], + [ + 319, + "enum_match, core::option::Option::<(core::integer::u32, core::array::Array::)>)>>" + ], + [ + 320, + "struct_deconstruct, core::option::Option::<(core::integer::u32, core::array::Array::)>>>" + ], + [ + 321, + "enum_match)>>" + ], + [ + 322, + "enum_init)>, 0>" + ], + [ + 323, + "enum_init)>>, 0>" + ], + [ + 324, + "struct_construct, core::option::Option::)>>>>" + ], + [ + 325, + "enum_init, core::option::Option::)>>)>, 0>" + ], + [ + 326, + "store_temp, core::option::Option::)>>)>>" + ], + [ + 327, + "enum_init)>>, 1>" + ], + [ + 328, + "enum_init, core::option::Option::)>>)>, 1>" + ], + [ + 329, + "enum_init)>, 1>" + ], + [330, "array_snapshot_pop_front"], + [331, "unbox"], + [332, "drop>>"], + [333, "enum_init>, 0>"], + [ + 334, + "enum_init>>, 0>" + ], + [ + 335, + "store_temp>>>" + ], + [336, "rename>>"], + [337, "enum_init>, 1>"], + [ + 338, + "enum_init>>, 1>" + ], + [339, "u8_try_from_felt252"], + [340, "enum_init, 0>"], + [341, "enum_init, 1>"], + [342, "enum_init, 0>"], + [343, "enum_init>, 0>"], + [344, "store_temp>>"], + [345, "enum_init, 1>"], + [346, "enum_init>, 1>"], + [347, "enum_init, 0>"], + [348, "enum_init>, 0>"], + [ + 349, + "struct_construct, core::option::Option::>>>" + ], + [ + 350, + "enum_init, core::option::Option::>)>, 0>" + ], + [ + 351, + "store_temp, core::option::Option::>)>>" + ], + [352, "enum_init>, 1>"], + [ + 353, + "enum_init, core::option::Option::>)>, 1>" + ], + [354, "enum_init, 1>"], + [355, "enum_match"], + [356, "const_as_immediate>"], + [357, "enum_match"], + [358, "struct_deconstruct>"], + [359, "rename>"], + [360, "struct_deconstruct>"], + [361, "const_as_immediate>"], + [362, "dup>"], + [363, "rename>"], + [364, "struct_deconstruct>"], + [365, "array_len"], + [366, "const_as_immediate>"], + [367, "store_temp>"], + [ + 368, + "function_call>" + ], + [369, "struct_deconstruct>"], + [370, "const_as_immediate>"], + [371, "const_as_immediate>"], + [372, "const_as_immediate>"], + [373, "enum_match>"], + [374, "const_as_immediate>"], + [ + 375, + "enum_init>>, 0>" + ], + [ + 376, + "struct_construct, core::option::Option::>>>>" + ], + [ + 377, + "enum_init, core::option::Option::>>)>, 0>" + ], + [ + 378, + "store_temp, core::option::Option::>>)>>" + ], + [379, "array_append>"], + [ + 380, + "enum_init>>, 1>" + ], + [ + 381, + "enum_init, core::option::Option::>>)>, 1>" + ], + [382, "struct_deconstruct>>"], + [383, "array_snapshot_pop_front>"], + [384, "unbox>"], + [385, "drop>>>"], + [386, "drop>>"], + [387, "enum_init>, 0>"], + [ + 388, + "struct_construct, core::option::Option::>>>" + ], + [ + 389, + "enum_init, core::option::Option::>)>, 0>" + ], + [ + 390, + "store_temp, core::option::Option::>)>>" + ], + [391, "array_append"], + [392, "enum_init>, 1>"], + [ + 393, + "enum_init, core::option::Option::>)>, 1>" + ], + [394, "alloc_local>>"], + [395, "struct_deconstruct>"], + [396, "array_snapshot_pop_front"], + [397, "unbox"], + [398, "store_local>>"], + [399, "drop>>"], + [400, "drop>>>"], + [401, "drop>"], + [ + 402, + "enum_init, core::array::Array::>, 0>" + ], + [ + 403, + "enum_init, core::array::Array::>>, 0>" + ], + [ + 404, + "struct_construct, core::option::Option::, core::array::Array::>>>>" + ], + [ + 405, + "enum_init, core::option::Option::, core::array::Array::>>)>, 0>" + ], + [ + 406, + "store_temp, core::option::Option::, core::array::Array::>>)>>" + ], + [ + 407, + "enum_init, core::option::Option::, core::array::Array::>>)>, 1>" + ], + [408, "array_new"], + [409, "store_temp>"], + [ + 410, + "function_call, core::integer::u16Drop>>" + ], + [ + 411, + "enum_match, core::option::Option::>)>>" + ], + [ + 412, + "struct_deconstruct, core::option::Option::>>>" + ], + [413, "enum_match>>"], + [ + 414, + "enum_init, core::array::Array::>, 1>" + ], + [ + 415, + "enum_init, core::array::Array::>>, 1>" + ], + [416, "struct_deconstruct>"], + [417, "array_snapshot_pop_front"], + [418, "unbox"], + [419, "drop>>"], + [420, "drop>"], + [421, "dup>>"], + [ + 422, + "enum_init, 0>" + ], + [ + 423, + "enum_init>, 0>" + ], + [ + 424, + "store_temp>>" + ], + [ + 425, + "enum_init>, 1>" + ], + [426, "struct_construct>"], + [ + 427, + "enum_init, 1>" + ], + [ + 428, + "enum_init), (core::integer::u16, core::array::Array::)>, 0>" + ], + [ + 429, + "enum_init), (core::integer::u16, core::array::Array::)>>, 0>" + ], + [ + 430, + "struct_construct, core::option::Option::), (core::integer::u16, core::array::Array::)>>>>" + ], + [ + 431, + "enum_init, core::option::Option::), (core::integer::u16, core::array::Array::)>>)>, 0>" + ], + [ + 432, + "store_temp, core::option::Option::), (core::integer::u16, core::array::Array::)>>)>>" + ], + [ + 433, + "enum_init, core::option::Option::), (core::integer::u16, core::array::Array::)>>)>, 1>" + ], + [ + 434, + "function_call), core::tuple::TupleSplitTupleSize2::>, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<(core::array::Array::,), core::tuple::TupleSplitTupleSize1::>, core::array::ArraySerde::, core::integer::u16Drop>, core::tuple::DeserializeTupleBaseTuple, core::array::ArrayDrop::>, core::integer::u16Drop>::deserialize>" + ], + [ + 435, + "enum_match, core::option::Option::<(core::integer::u16, core::array::Array::)>)>>" + ], + [ + 436, + "struct_deconstruct, core::option::Option::<(core::integer::u16, core::array::Array::)>>>" + ], + [ + 437, + "enum_match)>>" + ], + [ + 438, + "enum_init), (core::integer::u16, core::array::Array::)>, 1>" + ], + [ + 439, + "enum_init), (core::integer::u16, core::array::Array::)>>, 1>" + ], + [ + 440, + "enum_init, core::integer::u32>, 0>" + ], + [ + 441, + "enum_init, core::integer::u32>>, 0>" + ], + [ + 442, + "store_temp, core::integer::u32>>>" + ], + [ + 443, + "enum_init, core::integer::u32>>, 1>" + ], + [ + 444, + "enum_init, core::integer::u32>, 1>" + ], + [ + 445, + "enum_init>, 0>" + ], + [ + 446, + "enum_init>>, 0>" + ], + [ + 447, + "store_temp>>>" + ], + [448, "enum_init, 0>"], + [ + 449, + "enum_init>, 1>" + ], + [450, "enum_init, 1>"], + [ + 451, + "enum_init>>, 1>" + ], + [452, "enum_init, 0>"], + [ + 453, + "enum_init>, 0>" + ], + [ + 454, + "store_temp>>" + ], + [455, "enum_init, 1>"], + [ + 456, + "enum_init>, 1>" + ], + [457, "enum_init, 0>"], + [ + 458, + "enum_init>, 0>" + ], + [ + 459, + "struct_construct, core::option::Option::>>>" + ], + [ + 460, + "enum_init, core::option::Option::>)>, 0>" + ], + [ + 461, + "store_temp, core::option::Option::>)>>" + ], + [462, "enum_init, 1>"], + [ + 463, + "enum_init>, 1>" + ], + [ + 464, + "enum_init, core::option::Option::>)>, 1>" + ], + [465, "struct_construct"], + [466, "enum_init, 0>"], + [467, "store_temp>"], + [468, "enum_init, 1>"], + [ + 469, + "function_call, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<(core::integer::u32, core::integer::u64), core::tuple::TupleSplitTupleSize2::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<(core::integer::u64,), core::tuple::TupleSplitTupleSize1::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleBaseTuple, core::integer::u64Drop>, core::integer::u32Drop>, core::integer::u16Drop>::deserialize>" + ], + [ + 470, + "enum_match>" + ], + [471, "struct_deconstruct>"], + [472, "struct_construct>"], + [473, "struct_construct"], + [474, "enum_init, 0>"], + [475, "store_temp>"], + [476, "drop"], + [477, "enum_init, 1>"], + [478, "alloc_local"], + [479, "store_local"], + [480, "array_new"], + [481, "store_temp>"], + [ + 482, + "function_call, core::integer::u32Drop>>" + ], + [ + 483, + "enum_match, core::option::Option::>)>>" + ], + [ + 484, + "struct_deconstruct, core::option::Option::>>>" + ], + [485, "enum_match>>"], + [486, "snapshot_take>"], + [487, "drop>"], + [488, "struct_construct"], + [489, "enum_init, 0>"], + [ + 490, + "struct_construct, core::option::Option::>>" + ], + [ + 491, + "enum_init, core::option::Option::)>, 0>" + ], + [ + 492, + "store_temp, core::option::Option::)>>" + ], + [ + 493, + "enum_init, core::option::Option::)>, 1>" + ], + [494, "enum_init, 1>"], + [495, "drop>"], + [ + 496, + "function_call, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<[core::integer::u16; 2], core::fixed_size_array::TupleSplitFixedSizedArraySized2::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<[core::integer::u16; 1], core::fixed_size_array::TupleSplitFixedSizedArraySized1::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleBaseFixedSizedArray::, core::integer::u16Drop>, core::integer::u16Drop>, core::integer::u16Drop>::deserialize>" + ], + [497, "enum_match>"], + [498, "struct_deconstruct>"], + [499, "struct_construct>"], + [500, "struct_construct"], + [501, "enum_init, 0>"], + [502, "store_temp>"], + [503, "enum_init, 1>"], + [504, "enum_init, 0>"], + [505, "struct_construct"], + [506, "enum_init, 0>"], + [507, "store_temp>"], + [508, "enum_init, 1>"], + [509, "enum_init, 1>"], + [510, "enum_init, 0>"], + [ + 511, + "enum_init>, 0>" + ], + [ + 512, + "store_temp>>" + ], + [513, "enum_init, 1>"], + [ + 514, + "enum_init>, 1>" + ], + [515, "bytes31_try_from_felt252"], + [516, "struct_construct"], + [517, "enum_init, 0>"], + [ + 518, + "struct_construct, core::option::Option::>>" + ], + [ + 519, + "enum_init, core::option::Option::)>, 0>" + ], + [ + 520, + "store_temp, core::option::Option::)>>" + ], + [521, "enum_init, 1>"], + [ + 522, + "enum_init, core::option::Option::)>, 1>" + ], + [523, "downcast>"], + [524, "enum_from_bounded_int>"], + [525, "store_temp>"], + [526, "enum_match>"], + [527, "enum_init"], + [ + 528, + "struct_construct, core::option::Option::>>" + ], + [ + 529, + "enum_init, core::option::Option::)>, 0>" + ], + [ + 530, + "store_temp, core::option::Option::)>>" + ], + [531, "enum_init"], + [532, "function_call"], + [533, "enum_match>"], + [534, "enum_init"], + [535, "struct_construct>"], + [536, "enum_init"], + [537, "array_new"], + [538, "store_temp>"], + [ + 539, + "function_call>" + ], + [ + 540, + "enum_match, core::option::Option::>)>>" + ], + [ + 541, + "struct_deconstruct, core::option::Option::>>>" + ], + [542, "enum_match>>"], + [543, "snapshot_take>"], + [544, "drop>"], + [545, "struct_construct>"], + [546, "enum_init"], + [ + 547, + "enum_init, core::option::Option::)>, 1>" + ], + [548, "struct_construct>"], + [549, "enum_init"], + [550, "enum_init"], + [ + 551, + "function_call, core::serde::into_felt252_based::SerdeImpl::>::deserialize>" + ], + [ + 552, + "enum_match>>" + ], + [553, "enum_init"], + [554, "enum_init"], + [555, "struct_construct"], + [556, "struct_construct>>"], + [557, "store_temp>>"], + [ + 558, + "struct_construct, core::option::Option::>>>" + ], + [ + 559, + "enum_init, core::option::Option::>)>, 0>" + ], + [ + 560, + "store_temp, core::option::Option::>)>>" + ], + [561, "array_append"], + [562, "drop>"], + [ + 563, + "enum_init, core::option::Option::>)>, 1>" + ], + [564, "struct_construct>>"], + [ + 565, + "struct_construct, core::option::Option::<(core::integer::u32, core::array::Array::)>>>" + ], + [ + 566, + "enum_init, core::option::Option::<(core::integer::u32, core::array::Array::)>)>, 0>" + ], + [ + 567, + "store_temp, core::option::Option::<(core::integer::u32, core::array::Array::)>)>>" + ], + [ + 568, + "enum_init, core::option::Option::<(core::integer::u32, core::array::Array::)>)>, 1>" + ], + [569, "array_snapshot_pop_front"], + [570, "unbox"], + [571, "store_temp"], + [572, "dup"], + [573, "struct_deconstruct"], + [574, "drop>>"], + [575, "drop>"], + [576, "enum_init>, 0>"], + [ + 577, + "struct_construct, core::option::Option::>>>" + ], + [ + 578, + "enum_init, core::option::Option::>)>, 0>" + ], + [ + 579, + "store_temp, core::option::Option::>)>>" + ], + [580, "array_append"], + [581, "drop>"], + [582, "enum_init>, 1>"], + [ + 583, + "enum_init, core::option::Option::>)>, 1>" + ], + [584, "struct_construct>>"], + [ + 585, + "enum_init)>, 0>" + ], + [ + 586, + "struct_construct, core::option::Option::<(core::integer::u16, core::array::Array::)>>>" + ], + [ + 587, + "enum_init, core::option::Option::<(core::integer::u16, core::array::Array::)>)>, 0>" + ], + [ + 588, + "store_temp, core::option::Option::<(core::integer::u16, core::array::Array::)>)>>" + ], + [ + 589, + "enum_init, core::option::Option::<(core::integer::u16, core::array::Array::)>)>, 1>" + ], + [ + 590, + "enum_init)>, 1>" + ], + [591, "struct_construct>"], + [ + 592, + "enum_init, 0>" + ], + [ + 593, + "store_temp>" + ], + [ + 594, + "enum_init, 1>" + ], + [595, "enum_init>, 0>"], + [ + 596, + "struct_construct, core::option::Option::>>>" + ], + [ + 597, + "enum_init, core::option::Option::>)>, 0>" + ], + [ + 598, + "store_temp, core::option::Option::>)>>" + ], + [599, "array_append"], + [600, "enum_init>, 1>"], + [ + 601, + "enum_init, core::option::Option::>)>, 1>" + ], + [602, "struct_construct>"], + [603, "enum_init, 0>"], + [604, "store_temp>"], + [605, "enum_init, 1>"], + [606, "struct_construct>"], + [607, "enum_init"], + [608, "enum_init, 0>"], + [609, "store_temp>"], + [610, "enum_init"], + [611, "enum_init"], + [612, "enum_init, 1>"], + [613, "enum_init>, 0>"], + [ + 614, + "struct_construct, core::option::Option::>>>" + ], + [ + 615, + "enum_init, core::option::Option::>)>, 0>" + ], + [ + 616, + "store_temp, core::option::Option::>)>>" + ], + [617, "struct_construct"], + [618, "array_append"], + [619, "enum_init>, 1>"], + [ + 620, + "enum_init, core::option::Option::>)>, 1>" + ], + [621, "enum_init, 0>"], + [ + 622, + "enum_init>, 0>" + ], + [ + 623, + "store_temp>>" + ], + [624, "enum_init, 1>"], + [ + 625, + "enum_init>, 1>" + ] + ], + "user_func_names": [ + [0, "enums::test_enums::__wrapper__TestOption__option_bn"], + [1, "enums::test_enums::__wrapper__TestOption__option_array"], + [2, "enums::test_enums::__wrapper__TestOption__option_fixed_array"], + [3, "enums::test_enums::__wrapper__TestOption__option_tuple"], + [4, "enums::test_enums::__wrapper__TestOption__option_option_bn"], + [5, "enums::test_enums::__wrapper__TestOption__option_result"], + [6, "enums::test_enums::__wrapper__TestOption__option_struct"], + [7, "enums::test_enums::__wrapper__TestOption__option_enum"], + [8, "enums::test_enums::__wrapper__TestOption__array_option_bn"], + [9, "enums::test_enums::__wrapper__TestOption__array_enum"], + [10, "enums::test_enums::__wrapper__TestOption__write_option_bn"], + [11, "enums::test_enums::__wrapper__TestOption__option_point"], + [12, "enums::test_enums::__wrapper__TestOption__result_bn"], + [13, "enums::test_enums::__wrapper__TestOption__result_array"], + [14, "enums::test_enums::__wrapper__TestOption__result_fixed_array"], + [15, "enums::test_enums::__wrapper__TestOption__result_tuple"], + [16, "enums::test_enums::__wrapper__TestOption__result_result_bn"], + [17, "enums::test_enums::__wrapper__TestOption__result_option"], + [18, "enums::test_enums::__wrapper__TestOption__result_struct"], + [19, "enums::test_enums::__wrapper__TestOption__result_enum"], + [20, "enums::test_enums::__wrapper__TestOption__write_result_bn"], + [21, "enums::test_enums::__wrapper__TestOption__struct_point"], + [22, "enums::test_enums::__wrapper__TestOption__struct_point2"], + [23, "enums::test_enums::__wrapper__TestOption__struct_Empty"], + [24, "enums::test_enums::__wrapper__TestOption__struct_Cat"], + [25, "enums::test_enums::__wrapper__TestOption__struct_Dog"], + [26, "enums::test_enums::__wrapper__TestOption__struct_Horse"], + [27, "enums::test_enums::__wrapper__TestOption__struct_Truck"], + [28, "enums::test_enums::__wrapper__TestOption__struct_Destruction"], + [29, "enums::test_enums::__wrapper__TestOption__struct_enum"], + [30, "enums::test_enums::__wrapper__TestOption__write_struct_point"], + [31, "enums::test_enums::__wrapper__TestOption__custom_enum"], + [32, "enums::test_enums::__wrapper__TestOption__write_custom_enum"], + [ + 33, + "core::panic_with_const_felt252::<7733229381460288120802334208475838166080759535023995805565484692595>" + ], + [ + 34, + "core::panic_with_const_felt252::<485748461484230571791265682659113160264223489397539653310998840191492913>" + ], + [35, "core::panic_with_const_felt252::<375233589013918064796019>"], + [ + 36, + "core::option::OptionSerde::, core::array::ArraySerde::, core::integer::u8Drop>>::deserialize" + ], + [ + 37, + "core::array::serialize_array_helper::, core::integer::u8Drop>" + ], + [ + 38, + "core::tuple::DeserializeTupleNext::<[core::integer::u32; 3], core::fixed_size_array::TupleSplitFixedSizedArraySized3::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<[core::integer::u32; 2], core::fixed_size_array::TupleSplitFixedSizedArraySized2::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<[core::integer::u32; 1], core::fixed_size_array::TupleSplitFixedSizedArraySized1::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleBaseFixedSizedArray::, core::integer::u32Drop>, core::integer::u32Drop>, core::integer::u32Drop>::deserialize" + ], + [ + 39, + "core::option::OptionSerde::<(core::integer::u32, core::array::Array::), core::tuple::SerdeTuple::<(core::integer::u32, core::array::Array::), core::tuple::TupleSnapForwardTupleSize2::>, core::tuple::SerializeTupleNext::<(@core::integer::u32, @core::array::Array::), core::tuple::TupleSplitTupleSize2::<@core::integer::u32, @core::array::Array::>, core::tuple::SerdeBasedSerializeTuple::>, core::tuple::SerializeTupleNext::<(@core::array::Array::,), core::tuple::TupleSplitTupleSize1::<@core::array::Array::>, core::tuple::SerdeBasedSerializeTuple::, core::array::ArraySerde::, core::integer::u32Drop>>, core::tuple::SerializeTupleBaseTuple, core::tuple::TupleSize0Drop>, core::tuple::TupleNextDrop::<(@core::array::Array::,), core::tuple::TupleSplitTupleSize1::<@core::array::Array::>, core::tuple::IsTupleTupleSize1::<@core::array::Array::>, core::traits::SnapshotDrop::>, core::tuple::TupleSize0Drop>>, core::tuple::DeserializeTupleNext::<(core::integer::u32, core::array::Array::), core::tuple::TupleSplitTupleSize2::>, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<(core::array::Array::,), core::tuple::TupleSplitTupleSize1::>, core::array::ArraySerde::, core::integer::u32Drop>, core::tuple::DeserializeTupleBaseTuple, core::array::ArrayDrop::>, core::integer::u32Drop>>>::deserialize" + ], + [ + 40, + "core::array::serialize_array_helper::, core::integer::u32Drop>" + ], + [ + 41, + "core::option::OptionSerde::, core::option::OptionSerde::>>::deserialize" + ], + [ + 42, + "core::result::ResultSerde::, core::serde::into_felt252_based::SerdeImpl::>::deserialize" + ], + [43, "core::option::OptionSerde::::deserialize"], + [44, "core::option::OptionSerde::::deserialize"], + [45, "enums::MyEnumSerde::serialize"], + [ + 46, + "core::array::deserialize_array_helper::, core::option::OptionSerde::>, core::option::OptionDrop::>" + ], + [ + 47, + "core::array::serialize_array_helper::, core::option::OptionSerde::>, core::option::OptionDrop::>" + ], + [ + 48, + "core::array::deserialize_array_helper::" + ], + [ + 49, + "core::array::serialize_array_helper::" + ], + [ + 50, + "core::result::ResultSerde::, core::array::Array::, core::array::ArraySerde::, core::integer::u8Drop>, core::array::ArraySerde::, core::integer::u16Drop>>::deserialize" + ], + [ + 51, + "core::array::serialize_array_helper::, core::integer::u16Drop>" + ], + [ + 52, + "core::result::ResultSerde::<[core::integer::u32; 3], [core::integer::u16; 2], core::tuple::SerdeTuple::<[core::integer::u32; 3], core::fixed_size_array::TupleSnapForwardFixedSizedArraySized3::, core::tuple::SerializeTupleNext::<[@core::integer::u32; 3], core::fixed_size_array::TupleSplitFixedSizedArraySized3::<@core::integer::u32>, core::tuple::SerdeBasedSerializeTuple::>, core::tuple::SerializeTupleNext::<[@core::integer::u32; 2], core::fixed_size_array::TupleSplitFixedSizedArraySized2::<@core::integer::u32>, core::tuple::SerdeBasedSerializeTuple::>, core::tuple::SerializeTupleNext::<[@core::integer::u32; 1], core::fixed_size_array::TupleSplitFixedSizedArraySized1::<@core::integer::u32>, core::tuple::SerdeBasedSerializeTuple::>, core::tuple::SerializeTupleBaseFixedSizedArray::, core::fixed_size_array::FixedSizedArrayDrop::<@core::integer::u32, core::traits::SnapshotDrop::, 0>>, core::fixed_size_array::FixedSizedArrayDrop::<@core::integer::u32, core::traits::SnapshotDrop::, 1>>, core::fixed_size_array::FixedSizedArrayDrop::<@core::integer::u32, core::traits::SnapshotDrop::, 2>>, core::tuple::DeserializeTupleNext::<[core::integer::u32; 3], core::fixed_size_array::TupleSplitFixedSizedArraySized3::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<[core::integer::u32; 2], core::fixed_size_array::TupleSplitFixedSizedArraySized2::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<[core::integer::u32; 1], core::fixed_size_array::TupleSplitFixedSizedArraySized1::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleBaseFixedSizedArray::, core::integer::u32Drop>, core::integer::u32Drop>, core::integer::u32Drop>>, core::tuple::SerdeTuple::<[core::integer::u16; 2], core::fixed_size_array::TupleSnapForwardFixedSizedArraySized2::, core::tuple::SerializeTupleNext::<[@core::integer::u16; 2], core::fixed_size_array::TupleSplitFixedSizedArraySized2::<@core::integer::u16>, core::tuple::SerdeBasedSerializeTuple::>, core::tuple::SerializeTupleNext::<[@core::integer::u16; 1], core::fixed_size_array::TupleSplitFixedSizedArraySized1::<@core::integer::u16>, core::tuple::SerdeBasedSerializeTuple::>, core::tuple::SerializeTupleBaseFixedSizedArray::, core::fixed_size_array::FixedSizedArrayDrop::<@core::integer::u16, core::traits::SnapshotDrop::, 0>>, core::fixed_size_array::FixedSizedArrayDrop::<@core::integer::u16, core::traits::SnapshotDrop::, 1>>, core::tuple::DeserializeTupleNext::<[core::integer::u16; 2], core::fixed_size_array::TupleSplitFixedSizedArraySized2::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<[core::integer::u16; 1], core::fixed_size_array::TupleSplitFixedSizedArraySized1::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleBaseFixedSizedArray::, core::integer::u16Drop>, core::integer::u16Drop>>>::deserialize" + ], + [ + 53, + "core::result::ResultSerde::<(core::integer::u32, core::array::Array::), (core::integer::u16, core::array::Array::), core::tuple::SerdeTuple::<(core::integer::u32, core::array::Array::), core::tuple::TupleSnapForwardTupleSize2::>, core::tuple::SerializeTupleNext::<(@core::integer::u32, @core::array::Array::), core::tuple::TupleSplitTupleSize2::<@core::integer::u32, @core::array::Array::>, core::tuple::SerdeBasedSerializeTuple::>, core::tuple::SerializeTupleNext::<(@core::array::Array::,), core::tuple::TupleSplitTupleSize1::<@core::array::Array::>, core::tuple::SerdeBasedSerializeTuple::, core::array::ArraySerde::, core::integer::u32Drop>>, core::tuple::SerializeTupleBaseTuple, core::tuple::TupleSize0Drop>, core::tuple::TupleNextDrop::<(@core::array::Array::,), core::tuple::TupleSplitTupleSize1::<@core::array::Array::>, core::tuple::IsTupleTupleSize1::<@core::array::Array::>, core::traits::SnapshotDrop::>, core::tuple::TupleSize0Drop>>, core::tuple::DeserializeTupleNext::<(core::integer::u32, core::array::Array::), core::tuple::TupleSplitTupleSize2::>, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<(core::array::Array::,), core::tuple::TupleSplitTupleSize1::>, core::array::ArraySerde::, core::integer::u32Drop>, core::tuple::DeserializeTupleBaseTuple, core::array::ArrayDrop::>, core::integer::u32Drop>>, core::tuple::SerdeTuple::<(core::integer::u16, core::array::Array::), core::tuple::TupleSnapForwardTupleSize2::>, core::tuple::SerializeTupleNext::<(@core::integer::u16, @core::array::Array::), core::tuple::TupleSplitTupleSize2::<@core::integer::u16, @core::array::Array::>, core::tuple::SerdeBasedSerializeTuple::>, core::tuple::SerializeTupleNext::<(@core::array::Array::,), core::tuple::TupleSplitTupleSize1::<@core::array::Array::>, core::tuple::SerdeBasedSerializeTuple::, core::array::ArraySerde::, core::integer::u16Drop>>, core::tuple::SerializeTupleBaseTuple, core::tuple::TupleSize0Drop>, core::tuple::TupleNextDrop::<(@core::array::Array::,), core::tuple::TupleSplitTupleSize1::<@core::array::Array::>, core::tuple::IsTupleTupleSize1::<@core::array::Array::>, core::traits::SnapshotDrop::>, core::tuple::TupleSize0Drop>>, core::tuple::DeserializeTupleNext::<(core::integer::u16, core::array::Array::), core::tuple::TupleSplitTupleSize2::>, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<(core::array::Array::,), core::tuple::TupleSplitTupleSize1::>, core::array::ArraySerde::, core::integer::u16Drop>, core::tuple::DeserializeTupleBaseTuple, core::array::ArrayDrop::>, core::integer::u16Drop>>>::deserialize" + ], + [ + 54, + "core::result::ResultSerde::, core::integer::u32, core::result::ResultSerde::, core::serde::into_felt252_based::SerdeImpl::>, core::serde::into_felt252_based::SerdeImpl::>::deserialize" + ], + [ + 55, + "core::result::ResultSerde::, core::serde::into_felt252_based::SerdeImpl::, core::option::OptionSerde::>>::deserialize" + ], + [ + 56, + "core::result::ResultSerde::, enums::PointSerde>::deserialize" + ], + [ + 57, + "core::result::ResultSerde::, enums::MyEnumSerde>::deserialize" + ], + [58, "enums::Point2Serde::deserialize"], + [59, "enums::CatSerde::deserialize"], + [60, "enums::DogSerde::deserialize"], + [61, "enums::HorseSerde::deserialize"], + [62, "enums::TruckSerde::deserialize"], + [ + 63, + "core::result::ResultSerde::, core::serde::into_felt252_based::SerdeImpl::>::deserialize" + ], + [64, "enums::ExecutionReportSerde::deserialize"], + [65, "enums::MyEnumSerde::deserialize"], + [66, "core::panic_with_felt252"], + [ + 67, + "core::array::deserialize_array_helper::, core::integer::u8Drop>" + ], + [ + 68, + "core::tuple::DeserializeTupleNext::<(core::integer::u32, core::array::Array::), core::tuple::TupleSplitTupleSize2::>, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<(core::array::Array::,), core::tuple::TupleSplitTupleSize1::>, core::array::ArraySerde::, core::integer::u32Drop>, core::tuple::DeserializeTupleBaseTuple, core::array::ArrayDrop::>, core::integer::u32Drop>::deserialize" + ], + [ + 69, + "core::array::serialize_array_helper::" + ], + [ + 70, + "core::array::deserialize_array_helper::, core::integer::u16Drop>" + ], + [ + 71, + "core::tuple::DeserializeTupleNext::<(core::integer::u16, core::array::Array::), core::tuple::TupleSplitTupleSize2::>, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<(core::array::Array::,), core::tuple::TupleSplitTupleSize1::>, core::array::ArraySerde::, core::integer::u16Drop>, core::tuple::DeserializeTupleBaseTuple, core::array::ArrayDrop::>, core::integer::u16Drop>::deserialize" + ], + [ + 72, + "core::tuple::DeserializeTupleNext::<(core::integer::u16, core::integer::u32, core::integer::u64), core::tuple::TupleSplitTupleSize3::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<(core::integer::u32, core::integer::u64), core::tuple::TupleSplitTupleSize2::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<(core::integer::u64,), core::tuple::TupleSplitTupleSize1::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleBaseTuple, core::integer::u64Drop>, core::integer::u32Drop>, core::integer::u16Drop>::deserialize" + ], + [ + 73, + "core::array::deserialize_array_helper::, core::integer::u32Drop>" + ], + [ + 74, + "core::tuple::DeserializeTupleNext::<[core::integer::u16; 3], core::fixed_size_array::TupleSplitFixedSizedArraySized3::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<[core::integer::u16; 2], core::fixed_size_array::TupleSplitFixedSizedArraySized2::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleNext::<[core::integer::u16; 1], core::fixed_size_array::TupleSplitFixedSizedArraySized1::, core::serde::into_felt252_based::SerdeImpl::, core::tuple::DeserializeTupleBaseFixedSizedArray::, core::integer::u16Drop>, core::integer::u16Drop>, core::integer::u16Drop>::deserialize" + ], + [75, "enums::StatusEnumSerde::deserialize"], + [ + 76, + "core::array::deserialize_array_helper::" + ], + [ + 77, + "core::result::ResultSerde::, core::serde::into_felt252_based::SerdeImpl::>::deserialize" + ] + ] + }, + "contract_class_version": "0.1.0", + "entry_points_by_type": { + "EXTERNAL": [ + { + "selector": "0x462b1b2d0b30d80be98c4aec16f07b72212bbef41ac45680ed94e954a6aa9", + "function_idx": 3 + }, + { + "selector": "0x1feb29d0d6e8c4ba7a71db4cdaa24898ddd8bb350e724f844145997afee9c9", + "function_idx": 24 + }, + { + "selector": "0x78664aa9f94155a6e6acf3aa0add2ce6fcf36349488671af774d676363e0c7", + "function_idx": 1 + }, + { + "selector": "0xc5c709a3ffed9c578aa6ee00ce77e78a490d2c8aa971d1f6ccdd662da6f17b", + "function_idx": 18 + }, + { + "selector": "0xe1eafdb08801cfc555a49e25dabfd7aa4ed7b2dd5c7e2c5a6930eac6d1b54c", + "function_idx": 22 + }, + { + "selector": "0x106f418ef7e2ea39027bcde47d5f0a54ed68fe34aa69b24c3a162def52a841b", + "function_idx": 16 + }, + { + "selector": "0x11e332cf3fdb4f58a72be710217fdd238834524d13dae1c6131f3206b7c329a", + "function_idx": 31 + }, + { + "selector": "0x11fdea672ded06956bdd64d89fd111661735e88595f88c1199f648fe3c2dd15", + "function_idx": 25 + }, + { + "selector": "0x126587e6b203b756642ff0bd9f92e84ef609cf2a02b516fbf2d94f36a73b83e", + "function_idx": 8 + }, + { + "selector": "0x1303ef00936936490ad20afec7fbe2bf74669665b2a2249945ff561debad733", + "function_idx": 10 + }, + { + "selector": "0x13d3b1aae5fa65a483db7c67c98dca6aac27353970caa114d112c4b6de8ec73", + "function_idx": 14 + }, + { + "selector": "0x145f0cd3e37db4233ce4d6b84935d9b32387d72eb53713e78e2ec56cc6fdf5d", + "function_idx": 21 + }, + { + "selector": "0x147c0b24e5bfb625956c5a44d3fc84d509b789bf2e5335365c03b9be2d757d3", + "function_idx": 20 + }, + { + "selector": "0x1785e0d94a5ba07a47865d69afdf914dad65466b25d38cb78cb741fac447ba8", + "function_idx": 27 + }, + { + "selector": "0x1c7564da2ac3c0ee05570d52004d51604c5315131cafd67610b2e629bf4fd7c", + "function_idx": 17 + }, + { + "selector": "0x1d39fadfe7e2621092d7d0a467672f0eb0ad03c5926829d40ceefa7bcd10b80", + "function_idx": 28 + }, + { + "selector": "0x1ff9f9a5d04b7955383039cae30cd6c0d1cb3c0e04a579f393a7ac9cf39c7b3", + "function_idx": 5 + }, + { + "selector": "0x202cff97d5b709d201beabe103b284f8595094a25620c72dbbcb57d814d62fb", + "function_idx": 9 + }, + { + "selector": "0x208b88c80fabc1b03f3c78a09aaa1a693a5bb1366271a1c6b9e7971aa325116", + "function_idx": 23 + }, + { + "selector": "0x21b020335325fcef65a03b765adaefcc9fb4eccceb8e0293516736095e8cceb", + "function_idx": 2 + }, + { + "selector": "0x242ba12536f9ac18cffcedd5588e2922a17c0f453a064a64e62df6d3f6f8dce", + "function_idx": 4 + }, + { + "selector": "0x24793ea78a1f64b05c541f9e92f63fa2a71ddb3a23e9ff16aac9ed7d178fa66", + "function_idx": 7 + }, + { + "selector": "0x24ee851566f42b478860ca46d2543852ef11c919efc4e114db8829520728305", + "function_idx": 19 + }, + { + "selector": "0x265cf503e1b425e68026a65eb872306eb863eb6ba526cddc50fd44d00d8e180", + "function_idx": 0 + }, + { + "selector": "0x284a2ddea630469ba82b6fbced35fa12c6504de7b50af7cda84bedbaae5e521", + "function_idx": 32 + }, + { + "selector": "0x29a68d48876fa0d864a616e212175e42824be1cdcb35bcd2e05b302042e491f", + "function_idx": 11 + }, + { + "selector": "0x2bf962c6ef0f8dddc516426e31a25831c882b7a1a5a47f2716a3d4403c5894c", + "function_idx": 29 + }, + { + "selector": "0x31c18e21d8e75a5f2f6f1330c56da1f8b2fd93568002ef0d15bcce9c5644c2b", + "function_idx": 13 + }, + { + "selector": "0x36d666ce4d4c894d5dcb35a06bb6ca9659358f5e9d7fe07519e7531ef44a6e2", + "function_idx": 30 + }, + { + "selector": "0x36e432757f2854d382b66d849ed9a3edf35fdbf55a7c83296142cf7b89b0573", + "function_idx": 15 + }, + { + "selector": "0x3bb1cf9f6b291f5c63c8ecbfcf8cd522642fdc7ec277c2fddb7dc069cd05ced", + "function_idx": 26 + }, + { + "selector": "0x3c694eba4d500b140694d8f7da3f85031f4d4827b57da58cb5f2bd1ab74e5ab", + "function_idx": 12 + }, + { + "selector": "0x3dbc7f289caba706d06644803f1db94983f3b8d8af334bfbf346aaa1b711d0c", + "function_idx": 6 + } + ], + "L1_HANDLER": [], + "CONSTRUCTOR": [] + }, + "abi": [ + { "type": "impl", "name": "TestOption", "interface_name": "enums::ITestOption" }, + { + "type": "enum", + "name": "core::option::Option::", + "variants": [ + { "name": "Some", "type": "core::integer::u16" }, + { "name": "None", "type": "()" } + ] + }, + { + "type": "enum", + "name": "core::option::Option::>", + "variants": [ + { "name": "Some", "type": "core::array::Array::" }, + { "name": "None", "type": "()" } + ] + }, + { + "type": "enum", + "name": "core::option::Option::<[core::integer::u32; 3]>", + "variants": [ + { "name": "Some", "type": "[core::integer::u32; 3]" }, + { "name": "None", "type": "()" } + ] + }, + { + "type": "enum", + "name": "core::option::Option::<(core::integer::u32, core::array::Array::)>", + "variants": [ + { + "name": "Some", + "type": "(core::integer::u32, core::array::Array::)" + }, + { "name": "None", "type": "()" } + ] + }, + { + "type": "enum", + "name": "core::option::Option::>", + "variants": [ + { "name": "Some", "type": "core::option::Option::" }, + { "name": "None", "type": "()" } + ] + }, + { + "type": "enum", + "name": "core::result::Result::", + "variants": [ + { "name": "Ok", "type": "core::integer::u8" }, + { "name": "Err", "type": "core::integer::u16" } + ] + }, + { + "type": "enum", + "name": "core::option::Option::>", + "variants": [ + { "name": "Some", "type": "core::result::Result::" }, + { "name": "None", "type": "()" } + ] + }, + { + "type": "struct", + "name": "enums::Point", + "members": [ + { "name": "x", "type": "core::integer::u64" }, + { "name": "y", "type": "core::integer::u32" } + ] + }, + { + "type": "enum", + "name": "core::option::Option::", + "variants": [ + { "name": "Some", "type": "enums::Point" }, + { "name": "None", "type": "()" } + ] + }, + { + "type": "enum", + "name": "enums::StatusEnum", + "variants": [ + { "name": "Success", "type": "(core::integer::u64, core::integer::u32)" }, + { "name": "NoAnswer", "type": "()" }, + { "name": "Error", "type": "()" } + ] + }, + { + "type": "struct", + "name": "core::integer::u256", + "members": [ + { "name": "low", "type": "core::integer::u128" }, + { "name": "high", "type": "core::integer::u128" } + ] + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [{ "name": "snapshot", "type": "@core::array::Array::" }] + }, + { + "type": "enum", + "name": "core::option::Option::", + "variants": [ + { "name": "Some", "type": "core::integer::u8" }, + { "name": "None", "type": "()" } + ] + }, + { + "type": "enum", + "name": "core::result::Result::", + "variants": [ + { "name": "Ok", "type": "core::integer::u32" }, + { "name": "Err", "type": "core::integer::u64" } + ] + }, + { + "type": "enum", + "name": "enums::MyEnum", + "variants": [ + { "name": "Success", "type": "core::integer::u8" }, + { "name": "LocationError", "type": "enums::Point" }, + { "name": "Status", "type": "enums::StatusEnum" }, + { "name": "TwoErrors", "type": "[core::integer::u32; 2]" }, + { "name": "ErrorList", "type": "core::array::Span::" }, + { "name": "Parents", "type": "(core::integer::u64, core::integer::u128)" }, + { "name": "Damage", "type": "core::option::Option::" }, + { + "name": "Report", + "type": "core::result::Result::" + }, + { "name": "Empty", "type": "()" } + ] + }, + { + "type": "enum", + "name": "core::option::Option::", + "variants": [ + { "name": "Some", "type": "enums::MyEnum" }, + { "name": "None", "type": "()" } + ] + }, + { + "type": "enum", + "name": "core::result::Result::, core::array::Array::>", + "variants": [ + { "name": "Ok", "type": "core::array::Array::" }, + { "name": "Err", "type": "core::array::Array::" } + ] + }, + { + "type": "enum", + "name": "core::result::Result::<[core::integer::u32; 3], [core::integer::u16; 2]>", + "variants": [ + { "name": "Ok", "type": "[core::integer::u32; 3]" }, + { "name": "Err", "type": "[core::integer::u16; 2]" } + ] + }, + { + "type": "enum", + "name": "core::result::Result::<(core::integer::u32, core::array::Array::), (core::integer::u16, core::array::Array::)>", + "variants": [ + { "name": "Ok", "type": "(core::integer::u32, core::array::Array::)" }, + { "name": "Err", "type": "(core::integer::u16, core::array::Array::)" } + ] + }, + { + "type": "enum", + "name": "core::result::Result::, core::integer::u32>", + "variants": [ + { "name": "Ok", "type": "core::result::Result::" }, + { "name": "Err", "type": "core::integer::u32" } + ] + }, + { + "type": "enum", + "name": "core::option::Option::", + "variants": [ + { "name": "Some", "type": "core::integer::u32" }, + { "name": "None", "type": "()" } + ] + }, + { + "type": "enum", + "name": "core::result::Result::>", + "variants": [ + { "name": "Ok", "type": "core::integer::u8" }, + { "name": "Err", "type": "core::option::Option::" } + ] + }, + { + "type": "enum", + "name": "core::result::Result::", + "variants": [ + { "name": "Ok", "type": "core::integer::u8" }, + { "name": "Err", "type": "enums::Point" } + ] + }, + { + "type": "enum", + "name": "core::result::Result::", + "variants": [ + { "name": "Ok", "type": "core::integer::u8" }, + { "name": "Err", "type": "enums::MyEnum" } + ] + }, + { + "type": "struct", + "name": "enums::Point2", + "members": [ + { "name": "thickness", "type": "core::integer::u64" }, + { "name": "location", "type": "enums::Point" } + ] + }, + { "type": "struct", "name": "enums::Empty", "members": [] }, + { + "type": "struct", + "name": "enums::Cat", + "members": [ + { "name": "age", "type": "core::integer::u16" }, + { + "name": "legs", + "type": "(core::integer::u8, core::integer::u16, core::integer::u32, core::integer::u64)" + } + ] + }, + { + "type": "struct", + "name": "core::array::Span::", + "members": [{ "name": "snapshot", "type": "@core::array::Array::" }] + }, + { + "type": "struct", + "name": "enums::Dog", + "members": [ + { "name": "age", "type": "core::integer::u16" }, + { "name": "colors", "type": "core::array::Span::" } + ] + }, + { + "type": "struct", + "name": "enums::Horse", + "members": [ + { "name": "age", "type": "core::integer::u16" }, + { "name": "legs_color", "type": "[core::integer::u16; 4]" } + ] + }, + { + "type": "struct", + "name": "enums::Truck", + "members": [ + { "name": "power", "type": "core::integer::u32" }, + { "name": "turbo", "type": "core::option::Option::" } + ] + }, + { + "type": "enum", + "name": "core::result::Result::", + "variants": [ + { "name": "Ok", "type": "core::integer::u8" }, + { "name": "Err", "type": "core::integer::u64" } + ] + }, + { + "type": "struct", + "name": "enums::Destruction", + "members": [ + { "name": "area", "type": "core::integer::u128" }, + { "name": "res", "type": "core::result::Result::" } + ] + }, + { + "type": "struct", + "name": "enums::ExecutionReport", + "members": [ + { "name": "message", "type": "enums::MyEnum" }, + { "name": "description", "type": "core::bytes_31::bytes31" } + ] + }, + { + "type": "interface", + "name": "enums::ITestOption", + "items": [ + { + "type": "function", + "name": "option_bn", + "inputs": [{ "name": "x", "type": "core::option::Option::" }], + "outputs": [{ "type": "core::option::Option::" }], + "state_mutability": "view" + }, + { + "type": "function", + "name": "option_array", + "inputs": [ + { + "name": "x", + "type": "core::option::Option::>" + } + ], + "outputs": [ + { "type": "core::option::Option::>" } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "option_fixed_array", + "inputs": [{ "name": "x", "type": "core::option::Option::<[core::integer::u32; 3]>" }], + "outputs": [{ "type": "core::option::Option::<[core::integer::u32; 3]>" }], + "state_mutability": "view" + }, + { + "type": "function", + "name": "option_tuple", + "inputs": [ + { + "name": "x", + "type": "core::option::Option::<(core::integer::u32, core::array::Array::)>" + } + ], + "outputs": [ + { + "type": "core::option::Option::<(core::integer::u32, core::array::Array::)>" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "option_option_bn", + "inputs": [ + { + "name": "x", + "type": "core::option::Option::>" + } + ], + "outputs": [ + { "type": "core::option::Option::>" } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "option_result", + "inputs": [ + { + "name": "x", + "type": "core::option::Option::>" + } + ], + "outputs": [ + { + "type": "core::option::Option::>" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "option_struct", + "inputs": [{ "name": "x", "type": "core::option::Option::" }], + "outputs": [{ "type": "core::option::Option::" }], + "state_mutability": "view" + }, + { + "type": "function", + "name": "option_enum", + "inputs": [{ "name": "x", "type": "core::option::Option::" }], + "outputs": [{ "type": "core::option::Option::" }], + "state_mutability": "view" + }, + { + "type": "function", + "name": "array_option_bn", + "inputs": [ + { + "name": "x", + "type": "core::array::Array::>" + } + ], + "outputs": [ + { "type": "core::array::Array::>" } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "array_enum", + "inputs": [{ "name": "x", "type": "core::array::Array::" }], + "outputs": [{ "type": "core::array::Array::" }], + "state_mutability": "view" + }, + { + "type": "function", + "name": "write_option_bn", + "inputs": [{ "name": "x", "type": "core::option::Option::" }], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "option_point", + "inputs": [{ "name": "x", "type": "core::option::Option::" }], + "outputs": [{ "type": "core::option::Option::" }], + "state_mutability": "view" + }, + { + "type": "function", + "name": "result_bn", + "inputs": [ + { "name": "x", "type": "core::result::Result::" } + ], + "outputs": [{ "type": "core::result::Result::" }], + "state_mutability": "view" + }, + { + "type": "function", + "name": "result_array", + "inputs": [ + { + "name": "x", + "type": "core::result::Result::, core::array::Array::>" + } + ], + "outputs": [ + { + "type": "core::result::Result::, core::array::Array::>" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "result_fixed_array", + "inputs": [ + { + "name": "x", + "type": "core::result::Result::<[core::integer::u32; 3], [core::integer::u16; 2]>" + } + ], + "outputs": [ + { "type": "core::result::Result::<[core::integer::u32; 3], [core::integer::u16; 2]>" } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "result_tuple", + "inputs": [ + { + "name": "x", + "type": "core::result::Result::<(core::integer::u32, core::array::Array::), (core::integer::u16, core::array::Array::)>" + } + ], + "outputs": [ + { + "type": "core::result::Result::<(core::integer::u32, core::array::Array::), (core::integer::u16, core::array::Array::)>" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "result_result_bn", + "inputs": [ + { + "name": "x", + "type": "core::result::Result::, core::integer::u32>" + } + ], + "outputs": [ + { + "type": "core::result::Result::, core::integer::u32>" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "result_option", + "inputs": [ + { + "name": "x", + "type": "core::result::Result::>" + } + ], + "outputs": [ + { + "type": "core::result::Result::>" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "result_struct", + "inputs": [ + { "name": "x", "type": "core::result::Result::" } + ], + "outputs": [{ "type": "core::result::Result::" }], + "state_mutability": "view" + }, + { + "type": "function", + "name": "result_enum", + "inputs": [ + { "name": "x", "type": "core::result::Result::" } + ], + "outputs": [{ "type": "core::result::Result::" }], + "state_mutability": "view" + }, + { + "type": "function", + "name": "write_result_bn", + "inputs": [ + { "name": "x", "type": "core::result::Result::" } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "struct_point", + "inputs": [{ "name": "x", "type": "enums::Point" }], + "outputs": [{ "type": "enums::Point" }], + "state_mutability": "view" + }, + { + "type": "function", + "name": "struct_point2", + "inputs": [{ "name": "x", "type": "enums::Point2" }], + "outputs": [{ "type": "enums::Point2" }], + "state_mutability": "view" + }, + { + "type": "function", + "name": "struct_Empty", + "inputs": [{ "name": "x", "type": "enums::Empty" }], + "outputs": [{ "type": "enums::Empty" }], + "state_mutability": "view" + }, + { + "type": "function", + "name": "struct_Cat", + "inputs": [{ "name": "x", "type": "enums::Cat" }], + "outputs": [{ "type": "enums::Cat" }], + "state_mutability": "view" + }, + { + "type": "function", + "name": "struct_Dog", + "inputs": [{ "name": "x", "type": "enums::Dog" }], + "outputs": [{ "type": "enums::Dog" }], + "state_mutability": "view" + }, + { + "type": "function", + "name": "struct_Horse", + "inputs": [{ "name": "x", "type": "enums::Horse" }], + "outputs": [{ "type": "enums::Horse" }], + "state_mutability": "view" + }, + { + "type": "function", + "name": "struct_Truck", + "inputs": [{ "name": "x", "type": "enums::Truck" }], + "outputs": [{ "type": "enums::Truck" }], + "state_mutability": "view" + }, + { + "type": "function", + "name": "struct_Destruction", + "inputs": [{ "name": "x", "type": "enums::Destruction" }], + "outputs": [{ "type": "enums::Destruction" }], + "state_mutability": "view" + }, + { + "type": "function", + "name": "struct_enum", + "inputs": [{ "name": "x", "type": "enums::ExecutionReport" }], + "outputs": [{ "type": "enums::ExecutionReport" }], + "state_mutability": "view" + }, + { + "type": "function", + "name": "write_struct_point", + "inputs": [{ "name": "x", "type": "enums::Point" }], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "custom_enum", + "inputs": [{ "name": "x", "type": "enums::MyEnum" }], + "outputs": [{ "type": "enums::MyEnum" }], + "state_mutability": "view" + }, + { + "type": "function", + "name": "write_custom_enum", + "inputs": [{ "name": "x", "type": "enums::MyEnum" }], + "outputs": [], + "state_mutability": "external" + } + ] + }, + { "type": "event", "name": "enums::test_enums::Event", "kind": "enum", "variants": [] } + ] +} diff --git a/__tests__/cairo1v2.test.ts b/__tests__/cairo1v2.test.ts index d3130e9c7..87ba27e7e 100644 --- a/__tests__/cairo1v2.test.ts +++ b/__tests__/cairo1v2.test.ts @@ -696,21 +696,21 @@ describe('Cairo 1', () => { { address: 1193046n, is_claimed: true }, { address: 624485n, is_claimed: false }, ]); - const res4 = c1v2CallData.decodeParameters('core::integer::u8', ['0x123456']); - expect(res4).toBe(1193046n); + const res4 = c1v2CallData.decodeParameters('core::integer::u8', ['0x12']); + expect(res4).toBe(18n); const res5 = c1v2CallData.decodeParameters('core::bool', ['0x1']); expect(res5).toBe(true); const res6 = c1v2CallData.decodeParameters('core::felt252', ['0x123456']); expect(res6).toBe(1193046n); const res7 = c1v2CallData.decodeParameters('core::integer::u256', ['0x123456', '0x789']); expect(num.toHex(res7.toString())).toBe('0x78900000000000000000000000000123456'); - const res8 = c1v2CallData.decodeParameters('core::array::Array::', [ + const res8 = c1v2CallData.decodeParameters('core::array::Array::', [ '2', '0x123456', '0x789', ]); expect(res8).toEqual([1193046n, 1929n]); - const res9 = c1v2CallData.decodeParameters('core::array::Span::', [ + const res9 = c1v2CallData.decodeParameters('core::array::Span::', [ '2', '0x123456', '0x789', diff --git a/__tests__/cairo1v2_typed.test.ts b/__tests__/cairo1v2_typed.test.ts index 462b08ccb..4c8a8880c 100644 --- a/__tests__/cairo1v2_typed.test.ts +++ b/__tests__/cairo1v2_typed.test.ts @@ -964,13 +964,13 @@ describe('Cairo 1', () => { expect(callD2).toEqual([hexToDecimalString(encodeShortString(str))]); const myCallData = new CallData(contracts.C240.sierra.abi); const myCalldata1 = myCallData.compile('proceed_bytes31', [str]); - expect(myCalldata1).toEqual([encodeShortString(str)]); + expect(myCalldata1).toEqual([hexToDecimalString(encodeShortString(str))]); const myCalldata2 = myCallData.compile('proceed_bytes31', { str }); - expect(myCalldata2).toEqual([encodeShortString(str)]); + expect(myCalldata2).toEqual([hexToDecimalString(encodeShortString(str))]); const myCall1 = stringContract.populate('proceed_bytes31', [str]); - expect(myCall1.calldata).toEqual([encodeShortString(str)]); + expect(myCall1.calldata).toEqual([hexToDecimalString(encodeShortString(str))]); const myCall2 = stringContract.populate('proceed_bytes31', { str }); - expect(myCall2.calldata).toEqual([encodeShortString(str)]); + expect(myCall2.calldata).toEqual([hexToDecimalString(encodeShortString(str))]); }); test('bytes31 too long', async () => { @@ -980,7 +980,7 @@ describe('Cairo 1', () => { test('ByteArray', async () => { const message = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ12345AAADEFGHIJKLMNOPQRSTUVWXYZ12345A'; - const callD = CallData.compile([message]); + const callD = CallData.compile([new CairoByteArray(message).toObject()]); const expectedResult = [ '2', hexToDecimalString('0x4142434445464748494a4b4c4d4e4f505152535455565758595a3132333435'), @@ -989,9 +989,9 @@ describe('Cairo 1', () => { '1', ]; expect(callD).toEqual(expectedResult); - const callD2 = CallData.compile({ mess: message }); + const callD2 = CallData.compile({ mess: new CairoByteArray(message).toObject() }); expect(callD2).toEqual(expectedResult); - const callD3 = CallData.compile({ mess: new CairoByteArray('Take care.') }); + const callD3 = CallData.compile({ mess: new CairoByteArray('Take care.').toObject() }); expect(callD3).toEqual(['0', '398475857363345939260718', '10']); const str1 = await stringContract.get_string(); expect(str1).toBe( diff --git a/__tests__/cairov24onward.test.ts b/__tests__/cairov24onward.test.ts index 787b42db1..354b88b12 100644 --- a/__tests__/cairov24onward.test.ts +++ b/__tests__/cairov24onward.test.ts @@ -59,14 +59,14 @@ describe('Cairo v2.4 onwards', () => { const myCallData = new CallData(contracts.C240.sierra.abi); const myCalldata1 = myCallData.compile('proceed_bytes31', [str]); - expect(myCalldata1).toEqual([encodeShortString(str)]); + expect(myCalldata1).toEqual([hexToDecimalString(encodeShortString(str))]); const myCalldata2 = myCallData.compile('proceed_bytes31', { str }); - expect(myCalldata2).toEqual([encodeShortString(str)]); + expect(myCalldata2).toEqual([hexToDecimalString(encodeShortString(str))]); const myCall1 = stringContract.populate('proceed_bytes31', [str]); - expect(myCall1.calldata).toEqual([encodeShortString(str)]); + expect(myCall1.calldata).toEqual([hexToDecimalString(encodeShortString(str))]); const myCall2 = stringContract.populate('proceed_bytes31', { str }); - expect(myCall2.calldata).toEqual([encodeShortString(str)]); + expect(myCall2.calldata).toEqual([hexToDecimalString(encodeShortString(str))]); }); test('bytes31 too long', async () => { @@ -76,7 +76,7 @@ describe('Cairo v2.4 onwards', () => { test('ByteArray', async () => { const message = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ12345AAADEFGHIJKLMNOPQRSTUVWXYZ12345A'; - const callD = CallData.compile([message]); + const callD = CallData.compile([cairo.byteArray(message)]); const expectedResult = [ '2', hexToDecimalString('0x4142434445464748494a4b4c4d4e4f505152535455565758595a3132333435'), @@ -85,9 +85,9 @@ describe('Cairo v2.4 onwards', () => { '1', ]; expect(callD).toEqual(expectedResult); - const callD2 = CallData.compile({ mess: message }); + const callD2 = CallData.compile({ mess: cairo.byteArray(message) }); expect(callD2).toEqual(expectedResult); - const callD3 = CallData.compile({ mess: new CairoByteArray('Take care.') }); + const callD3 = CallData.compile({ mess: new CairoByteArray('Take care.').toObject() }); expect(callD3).toEqual(['0', '398475857363345939260718', '10']); const str1 = await stringContract.get_string(); expect(str1).toBe( @@ -439,7 +439,7 @@ describe('Cairo v2.4 onwards', () => { describe('Cairo v2.9.2 fixed-array', () => { const myArray: number[] = [1, 2, 3, 4, 5, 6, 7, 8]; const myWrongArray = [...myArray, 9]; - const expectedCalldata = myArray.map((val) => `0x${val.toString(16)}`); + const expectedCalldata = myArray.map((val) => val.toString(10)); let fixedArrayContract: Contract; beforeAll(async () => { diff --git a/__tests__/config/fixtures.ts b/__tests__/config/fixtures.ts index 410adab84..0702548da 100644 --- a/__tests__/config/fixtures.ts +++ b/__tests__/config/fixtures.ts @@ -74,6 +74,7 @@ const compiledContracts = { deployer: 'cairo2100/deployer', CairoByteArray: 'byteArray/target/dev/test_ByteArrayStorage', IntegerTypes: 'integerTypes/target/dev/test_IntegerTypesStorage', + TestCairoType: 'cairo2120/enums_test_enums', }; export const contracts = mapContractSets(compiledContracts); diff --git a/__tests__/contract.test.ts b/__tests__/contract.test.ts index cb27e7169..d14a8bc0d 100644 --- a/__tests__/contract.test.ts +++ b/__tests__/contract.test.ts @@ -455,8 +455,8 @@ describe('Complex interaction', () => { classHash, account, constructorCalldata: CallData.compile({ - name: new CairoByteArray('Token'), - symbol: new CairoByteArray('ERC20'), + name: new CairoByteArray('Token').toObject(), + symbol: new CairoByteArray('ERC20').toObject(), amount: cairo.uint256('1000000000'), recipient: account.address, owner: '0x823d5a0c0eefdc9a6a1cb0e064079a6284f3b26566b677a32c71bbe7bf9f8c', @@ -930,21 +930,15 @@ describe('Complex interaction', () => { const res0 = myCallData.decodeParameters('core::felt252', ['474107654995566025798705']); expect(res0).toBe(474107654995566025798705n); const res1 = myCallData.decodeParameters('echo::StructY', [ - '474107654995566025798705', + '1844674407370955', '3534634645645', ]); - expect(res1).toEqual({ y1: 474107654995566025798705n, y2: 3534634645645n }); + expect(res1).toEqual({ y1: 1844674407370955n, y2: 3534634645645n }); const res2 = myCallData.decodeParameters('core::integer::u256', ['47410765', '35346645']); expect(res2).toBe(12027840023314154934885372750905072692667575885n); - const res3 = myCallData.decodeParameters('echo::Struct32', [ - '47410765', - '35346645', - '1', - '2', - '3', - ]); - expect(res3).toEqual({ b: 47410765n, c: { '0': 35346645n, '1': 1n, '2': 2n, '3': 3n } }); + const res3 = myCallData.decodeParameters('echo::Struct32', ['47410765', '45', '1', '2', '3']); + expect(res3).toEqual({ b: 47410765n, c: { '0': 45n, '1': 1n, '2': 2n, '3': 3n } }); const res4 = myCallData.decodeParameters( '(core::felt252, core::felt252, core::felt252, core::felt252)', diff --git a/__tests__/utils/cairoDataTypes/CairoArray.integration.test.ts b/__tests__/utils/cairoDataTypes/CairoArray.integration.test.ts index 535705cfb..8dccc33bb 100644 --- a/__tests__/utils/cairoDataTypes/CairoArray.integration.test.ts +++ b/__tests__/utils/cairoDataTypes/CairoArray.integration.test.ts @@ -63,41 +63,32 @@ describe('CairoArray Integration Tests', () => { test('should work with AbiParser2 request parsing', () => { const parser = new AbiParser2(mockAbi, hdParsingStrategy); - const requestParser = parser.getRequestParser('core::array::Array::'); - - const result = requestParser([1, 2, 3], 'core::array::Array::'); - expect(result).toEqual(['3', '0x1', '0x2', '0x3']); + const result = parser.parseRequestField([1, 2, 3], 'core::array::Array::'); + expect(result).toEqual(['3', '1', '2', '3']); }); test('should work with AbiParser2 response parsing', () => { const parser = new AbiParser2(mockAbi, hdParsingStrategy); - const responseParser = parser.getResponseParser('core::array::Array::'); const mockResponse = ['0x2', '0xa', '0xb']; // length=2, elements=[10, 11] const iterator = mockResponse[Symbol.iterator](); - const result = responseParser(iterator, 'core::array::Array::'); + const result = parser.parseResponse(iterator, 'core::array::Array::'); expect(result).toEqual([10n, 11n]); }); test('should handle nested arrays in AbiParser2', () => { const parser = new AbiParser2(mockAbi, hdParsingStrategy); - const requestParser = parser.getRequestParser( - 'core::array::Array::>' - ); - - const result = requestParser( + const result = parser.parseRequestField( [[1, 2], [3]], 'core::array::Array::>' ); - expect(result).toEqual(['2', '2', '0x1', '0x2', '1', '0x3']); + expect(result).toEqual(['2', '2', '1', '2', '1', '3']); }); test('should handle empty arrays in AbiParser2', () => { const parser = new AbiParser2(mockAbi, hdParsingStrategy); - const requestParser = parser.getRequestParser('core::array::Array::'); - - const result = requestParser([], 'core::array::Array::'); + const result = parser.parseRequestField([], 'core::array::Array::'); expect(result).toEqual(['0']); }); }); @@ -170,13 +161,14 @@ describe('CairoArray Integration Tests', () => { const originalData = [100, 200, 300]; // Request parsing (serialize) - const requestParser = parser.getRequestParser('core::array::Array::'); - const serialized = requestParser(originalData, 'core::array::Array::'); + const serialized = parser.parseRequestField( + originalData, + 'core::array::Array::' + ); // Response parsing (deserialize) - const responseParser = parser.getResponseParser('core::array::Array::'); const iterator = serialized[Symbol.iterator](); - const result = responseParser(iterator, 'core::array::Array::'); + const result = parser.parseResponse(iterator, 'core::array::Array::'); expect(result).toEqual([100n, 200n, 300n]); }); @@ -223,7 +215,7 @@ describe('CairoArray Integration Tests', () => { }); test('should handle mixed input types with parsing strategy', () => { - const mixedData = [1, '2', 3n, 0x4]; + const mixedData = [1, '2', 3n, '0x4']; const array = new CairoArray( mixedData, 'core::array::Array::', @@ -254,7 +246,7 @@ describe('CairoArray Integration Tests', () => { // Both should serialize the same way expect(arraySerialized).toEqual(spanSerialized); - expect(arraySerialized).toEqual(['3', '0x1', '0x2', '0x3']); + expect(arraySerialized).toEqual(['3', '1', '2', '3']); }); }); diff --git a/__tests__/utils/cairoDataTypes/CairoArray.test.ts b/__tests__/utils/cairoDataTypes/CairoArray.test.ts index 0dc85e4a9..1a4f4d80b 100644 --- a/__tests__/utils/cairoDataTypes/CairoArray.test.ts +++ b/__tests__/utils/cairoDataTypes/CairoArray.test.ts @@ -220,8 +220,7 @@ describe('CairoArray class Unit test', () => { hdParsingStrategy ); const result = array.toApiRequest(); - // Should have length prefix: ['3', '0x1', '0x2', '0x3'] - expect(result).toEqual(['3', '0x1', '0x2', '0x3']); + expect(result).toEqual(['3', '1', '2', '3']); }); test('should create and serialize from object input', () => { @@ -231,8 +230,7 @@ describe('CairoArray class Unit test', () => { hdParsingStrategy ); const result = array.toApiRequest(); - // Should have length prefix: ['3', '0x1', '0x2', '0x3'] - expect(result).toEqual(['3', '0x1', '0x2', '0x3']); + expect(result).toEqual(['3', '1', '2', '3']); }); test('should work with parsing strategy', () => { @@ -251,8 +249,35 @@ describe('CairoArray class Unit test', () => { const result2 = array2.toApiRequest(); // Unified parsing strategy approach for API serialization with length prefix - expect(result1).toEqual(['2', '0x1', '0x2']); - expect(result2).toEqual(['2', '0x1', '0x2']); + expect(result1).toEqual(['2', '1', '2']); + expect(result2).toEqual(['2', '1', '2']); + }); + + test('Long string to array', () => { + const arr0 = new CairoArray( + 'Bug is back, for ever, here and everywhere', + 'core::array::Array::', + hdParsingStrategy + ).toApiRequest(); + const expectedResponse = [ + '2', + '117422190885827407409664260607192623408641871979684112605616397634538401380', + '39164769268277364419555941', + ]; + expect(arr0).toEqual(expectedResponse); + const arr1 = new CairoArray( + 'Bug is back, for ever, here and everywhere', + 'core::array::Array::', + hdParsingStrategy + ).toApiRequest(); + expect(arr1).toEqual(expectedResponse); + expect(() => + new CairoArray( + 'Bug is back, for ever, here and everywhere', + 'core::array::Array::', + hdParsingStrategy + ).toApiRequest() + ).toThrow(new Error('Invalid input: expected Array or Object, got string')); }); test('should throw for invalid inputs', () => { @@ -277,7 +302,7 @@ describe('CairoArray class Unit test', () => { ); const result = array.toApiRequest(); // Outer length=2, first inner [length=2, 1, 2], second inner [length=2, 3, 4] - expect(result).toEqual(['2', '2', '0x1', '0x2', '2', '0x3', '0x4']); + expect(result).toEqual(['2', '2', '1', '2', '2', '3', '4']); }); test('should handle edge cases', () => { @@ -288,7 +313,7 @@ describe('CairoArray class Unit test', () => { hdParsingStrategy ); const emptyResult = emptyArray.toApiRequest(); - // Just the length prefix: ['0'] + // Just the length prefix: ['0x0'] expect(emptyResult).toEqual(['0']); // Single element @@ -298,7 +323,7 @@ describe('CairoArray class Unit test', () => { hdParsingStrategy ); const singleResult = singleArray.toApiRequest(); - expect(singleResult).toEqual(['1', '0x2a']); + expect(singleResult).toEqual(['1', '42']); }); }); @@ -311,7 +336,7 @@ describe('CairoArray class Unit test', () => { ); const result = array.toApiRequest(); // Length prefix + elements - expect(result).toEqual(['3', '0x1', '0x2', '0x3']); + expect(result).toEqual(['3', '1', '2', '3']); }); test('should work with hdParsingStrategy', () => { @@ -329,8 +354,8 @@ describe('CairoArray class Unit test', () => { const result1 = array1.toApiRequest(); const result2 = array2.toApiRequest(); - expect(result1).toEqual(['2', '0x64', '0xc8']); - expect(result2).toEqual(['2', '0x64', '0xc8']); + expect(result1).toEqual(['2', '100', '200']); + expect(result2).toEqual(['2', '100', '200']); }); test('should handle nested arrays with proper length prefixes', () => { @@ -344,17 +369,16 @@ describe('CairoArray class Unit test', () => { ); const result = nestedArray.toApiRequest(); // Outer array: length=2, then two inner arrays each with their own length prefixes - expect(result).toEqual(['2', '2', '0x1', '0x2', '2', '0x3', '0x4']); + expect(result).toEqual(['2', '2', '1', '2', '2', '3', '4']); }); test('should throw for unsupported element types', () => { - const array = new CairoArray( - [1, 2], - 'core::array::Array::', - hdParsingStrategy - ); expect(() => { - array.toApiRequest(); + new CairoArray( + [1, 2], + 'core::array::Array::', + hdParsingStrategy + ).toApiRequest(); }).toThrow(); }); }); @@ -387,7 +411,7 @@ describe('CairoArray class Unit test', () => { expect(largeArray.content.length).toBe(100); expect(CairoArray.getArrayElementType(largeArray.arrayType)).toBe('core::integer::u8'); const result = largeArray.toApiRequest(); - expect(result[0]).toBe('100'); // Length prefix should be '100' + expect(result[0]).toBe('100'); // Length prefix expect(result.length).toBe(101); // 100 elements + 1 length prefix }); @@ -415,23 +439,23 @@ describe('CairoArray class Unit test', () => { '2', '2', '2', - '0x1', - '0x2', + '1', + '2', '2', - '0x3', - '0x4', + '3', + '4', '2', '2', - '0x5', - '0x6', + '5', + '6', '2', - '0x7', - '0x8', + '7', + '8', ]); }); test('should handle mixed data types in content', () => { - const mixedContent = [1, '2', 3n, 4]; + const mixedContent = [1, '2', 3n, '0x04']; const mixedArray = new CairoArray( mixedContent, 'core::array::Array::', diff --git a/__tests__/utils/cairoDataTypes/CairoBool.test.ts b/__tests__/utils/cairoDataTypes/CairoBool.test.ts new file mode 100644 index 000000000..a7c510973 --- /dev/null +++ b/__tests__/utils/cairoDataTypes/CairoBool.test.ts @@ -0,0 +1,290 @@ +import { CairoBool } from '../../../src/utils/cairoDataTypes'; + +describe('CairoBool class Unit Tests', () => { + describe('constructor with different input types', () => { + test('should handle number input', () => { + const bool = new CairoBool(1); + expect(bool.data).toBe(true); + }); + + test('should handle bigint input', () => { + const bool = new CairoBool(1n); + expect(bool.data).toBe(true); + }); + + test('should handle zero values', () => { + const boolFromNumber = new CairoBool(0); + const boolFromBigint = new CairoBool(0n); + + expect(boolFromNumber.data).toBe(false); + expect(boolFromBigint.data).toBe(false); + }); + }); + + describe('validation', () => { + test('should reject negative values', () => { + expect(() => new CairoBool(-1)).toThrow('Only values 0 or 1 are possible in a core::bool'); + expect(() => new CairoBool(-100n)).toThrow('Only values 0 or 1 are possible in a core::bool'); + expect(() => new CairoBool('-1')).toThrow('Only values 0 or 1 are possible in a core::bool'); + }); + + test('should reject values greater than 1', () => { + expect(() => new CairoBool(256)).toThrow('Only values 0 or 1 are possible in a core::bool'); + expect(() => new CairoBool(1000n)).toThrow('Only values 0 or 1 are possible in a core::bool'); + expect(() => new CairoBool('300')).toThrow('Only values 0 or 1 are possible in a core::bool'); + }); + + test('should handle valid string inputs correctly', () => { + const boolFromDecString = new CairoBool('0'); + const boolFromHexString = new CairoBool('0x1'); + + expect(boolFromDecString.data).toBe(false); + expect(boolFromHexString.data).toBe(true); + }); + + test('should handle edge cases and invalid inputs', () => { + expect(() => CairoBool.validate(null as any)).toThrow('Invalid input: null or undefined'); + expect(() => CairoBool.validate(undefined as any)).toThrow( + 'Invalid input: null or undefined' + ); + expect(() => CairoBool.validate({} as any)).toThrow( + 'Invalid input: objects are not supported' + ); + expect(() => CairoBool.validate([] as any)).toThrow( + 'Invalid input: objects are not supported' + ); + }); + + test('should handle unknown data types properly', () => { + // Valid unknown data types that can be converted + expect(() => new CairoBool('1' as unknown)).not.toThrow(); + expect(() => new CairoBool(1 as unknown)).not.toThrow(); + expect(() => new CairoBool(1n as unknown)).not.toThrow(); + expect(() => new CairoBool(true as unknown)).not.toThrow(); + expect(() => new CairoBool(false as unknown)).not.toThrow(); + + // Invalid unknown data types + expect(() => new CairoBool({} as unknown)).toThrow( + 'Invalid input: objects are not supported' + ); + expect(() => new CairoBool([] as unknown)).toThrow( + 'Invalid input: objects are not supported' + ); + expect(() => new CairoBool(null as unknown)).toThrow('Invalid input: null or undefined'); + expect(() => new CairoBool(undefined as unknown)).toThrow('Invalid input: null or undefined'); + expect(() => new CairoBool(Symbol('test') as unknown)).toThrow(); + + // Out of range values as unknown + expect(() => new CairoBool(2 as unknown)).toThrow( + 'Only values 0 or 1 are possible in a core::bool' + ); + expect(() => new CairoBool(-1 as unknown)).toThrow( + 'Only values 0 or 1 are possible in a core::bool' + ); + }); + + test('should reject decimal numbers', () => { + expect(() => new CairoBool(42.5)).toThrow( + 'Invalid input: decimal numbers are not supported, only integers' + ); + expect(() => new CairoBool(1.1)).toThrow( + 'Invalid input: decimal numbers are not supported, only integers' + ); + }); + + test('should validate string inputs with out-of-range values', () => { + expect(() => new CairoBool('256')).toThrow('Only values 0 or 1 are possible in a core::bool'); + expect(() => new CairoBool('0x100')).toThrow( + 'Only values 0 or 1 are possible in a core::bool' + ); + }); + }); + + describe('toBoolean method', () => { + test('should return the stored boolean value', () => { + const values = [0, 1]; + values.forEach((val) => { + const bool = new CairoBool(val); + expect(bool.toBoolean()).toBe(Boolean(val)); + }); + }); + + test('should handle zero', () => { + const bool = new CairoBool(0); + expect(bool.toBoolean()).toBe(false); + }); + + test('should handle one', () => { + const bool = new CairoBool(1); + expect(bool.toBoolean()).toBe(true); + }); + }); + + describe('toHexString method', () => { + test('should convert zero to hex', () => { + const bool = new CairoBool(0); + expect(bool.toHexString()).toBe('0x0'); + }); + + test('should convert 1 value to hex', () => { + const bool = new CairoBool(1); + expect(bool.toHexString()).toBe('0x1'); + }); + + test('should handle bigint input', () => { + const bool = new CairoBool(1n); + expect(bool.toHexString()).toBe('0x1'); + }); + }); + + describe('toApiRequest method', () => { + test('should return hex string array for zero', () => { + const bool = new CairoBool(0); + const result = bool.toApiRequest(); + expect(result).toEqual(['0']); + expect(result).toHaveProperty('__compiled__', true); + }); + + test('should return hex string array for 1 number', () => { + const bool = new CairoBool(1); + const result = bool.toApiRequest(); + expect(result).toEqual(['1']); + expect(result).toHaveProperty('__compiled__', true); + }); + + test('should handle bigint input', () => { + const bool = new CairoBool(1n); + const result = bool.toApiRequest(); + expect(result).toEqual(['1']); + expect(result).toHaveProperty('__compiled__', true); + }); + }); + + describe('validate static method', () => { + test('should validate correct number inputs', () => { + expect(() => CairoBool.validate(0)).not.toThrow(); + expect(() => CairoBool.validate(1)).not.toThrow(); + }); + + test('should validate correct bigint inputs', () => { + expect(() => CairoBool.validate(0n)).not.toThrow(); + expect(() => CairoBool.validate(1n)).not.toThrow(); + }); + test('should validate correct bigint inputs', () => { + expect(() => CairoBool.validate(false)).not.toThrow(); + expect(() => CairoBool.validate(true)).not.toThrow(); + }); + + test('should reject invalid types', () => { + expect(() => CairoBool.validate(null as any)).toThrow('Invalid input: null or undefined'); + expect(() => CairoBool.validate(undefined as any)).toThrow( + 'Invalid input: null or undefined' + ); + expect(() => CairoBool.validate({} as any)).toThrow( + 'Invalid input: objects are not supported' + ); + expect(() => CairoBool.validate([] as any)).toThrow( + 'Invalid input: objects are not supported' + ); + }); + + test('should reject negative values', () => { + expect(() => CairoBool.validate(-1)).toThrow( + 'Only values 0 or 1 are possible in a core::bool' + ); + expect(() => CairoBool.validate(-100n)).toThrow( + 'Only values 0 or 1 are possible in a core::bool' + ); + }); + + test('should reject values exceeding bool range', () => { + expect(() => CairoBool.validate(2)).toThrow( + 'Only values 0 or 1 are possible in a core::bool' + ); + // eslint-disable-next-line no-underscore-dangle + expect(() => CairoBool.__processData(2)).toThrow('Invalid input for a core::bool'); + }); + + test('should reject decimal numbers', () => { + expect(() => CairoBool.validate(42.5)).toThrow( + 'Invalid input: decimal numbers are not supported, only integers' + ); + }); + }); + + describe('is static method', () => { + test('should return true for valid inputs', () => { + expect(CairoBool.is(0)).toBe(true); + expect(CairoBool.is(1)).toBe(true); + }); + + test('should return false for invalid inputs', () => { + expect(CairoBool.is(-1)).toBe(false); + expect(CairoBool.is(2)).toBe(false); + expect(CairoBool.is(null as any)).toBe(false); + expect(CairoBool.is(undefined as any)).toBe(false); + expect(CairoBool.is({} as any)).toBe(false); + expect(CairoBool.is(42.5)).toBe(false); + }); + + test('should handle unknown data types in is method', () => { + // Valid unknown types + expect(CairoBool.is(1 as unknown)).toBe(true); + expect(CairoBool.is('0' as unknown)).toBe(true); + expect(CairoBool.is(true as unknown)).toBe(true); + expect(CairoBool.is(false as unknown)).toBe(true); + + // Invalid unknown types + expect(CairoBool.is({} as unknown)).toBe(false); + expect(CairoBool.is([] as unknown)).toBe(false); + expect(CairoBool.is(null as unknown)).toBe(false); + expect(CairoBool.is(undefined as unknown)).toBe(false); + expect(CairoBool.is(Symbol('test') as unknown)).toBe(false); + expect(CairoBool.is(2 as unknown)).toBe(false); // out of range + expect(CairoBool.is(-1 as unknown)).toBe(false); // out of range + }); + }); + + describe('isAbiType static method', () => { + test('should identify correct ABI type', () => { + expect(CairoBool.isAbiType('core::bool')).toBe(true); + expect(CairoBool.isAbiType('core::integer::u16')).toBe(false); + expect(CairoBool.isAbiType('core::integer::u32')).toBe(false); + expect(CairoBool.isAbiType('felt252')).toBe(false); + }); + }); + + describe('Static methods', () => { + describe('factoryFromApiResponse method', () => { + test('should create CairoBool from API response iterator', () => { + const mockIterator = { + next: jest.fn().mockReturnValue({ value: '0x1', done: false }), + }; + const bool = CairoBool.factoryFromApiResponse(mockIterator as any); + expect(bool.data).toBe(true); + }); + }); + }); + + describe('Round-trip consistency', () => { + test('should maintain consistency between constructor types', () => { + const testValue = true; + const boolFromNumber = new CairoBool(testValue); + const boolFromBigint = new CairoBool(1n); + const boolFromString = new CairoBool('1'); + expect(boolFromNumber.toBoolean()).toBe(boolFromBigint.toBoolean()); + expect(boolFromNumber.toBoolean()).toBe(boolFromString.toBoolean()); + expect(boolFromBigint.toBoolean()).toBe(boolFromString.toBoolean()); + }); + + test('should handle string-to-bigint-to-string round trips', () => { + const originalValue = 1; + const bool = new CairoBool(originalValue); + const bigintValue = bool.toBoolean(); + const newBool = new CairoBool(bigintValue); + + expect(newBool.toBoolean()).toBe(true); + expect(newBool.data).toBe(bool.data); + }); + }); +}); diff --git a/__tests__/utils/cairoDataTypes/CairoByteArray.test.ts b/__tests__/utils/cairoDataTypes/CairoByteArray.test.ts index 9edf58efb..6c68a9e61 100644 --- a/__tests__/utils/cairoDataTypes/CairoByteArray.test.ts +++ b/__tests__/utils/cairoDataTypes/CairoByteArray.test.ts @@ -12,9 +12,9 @@ describe('CairoByteArray Unit Tests', () => { // Verify API request format const apiRequest = byteArray.toApiRequest(); - expect(apiRequest[0]).toBe('0x0'); // data length - expect(apiRequest[1]).toBe('0x48656c6c6f2c20576f726c6421'); // pending_word as hex - expect(apiRequest[2]).toBe('0xd'); // pending_word_len + expect(apiRequest[0]).toBe('0'); // data length + expect(apiRequest[1]).toBe('5735816763073854918203775149089'); + expect(apiRequest[2]).toBe('13'); // pending_word_len }); test('should handle exactly 31 bytes string', () => { @@ -27,7 +27,7 @@ describe('CairoByteArray Unit Tests', () => { // Verify API request format const apiRequest = byteArray.toApiRequest(); - expect(apiRequest[0]).toBe('0x1'); // data length + expect(apiRequest[0]).toBe('1'); // data length expect(apiRequest.length).toBe(4); // 1 (length) + 1 (chunk data) + 1 (pending_word) + 1 (pending_word_len) }); @@ -41,7 +41,7 @@ describe('CairoByteArray Unit Tests', () => { // Verify API request format const apiRequest = byteArray.toApiRequest(); - expect(apiRequest[0]).toBe('0x2'); // data length + expect(apiRequest[0]).toBe('2'); // data length expect(apiRequest.length).toBe(5); // 1 (length) + 2 (chunk data) + 1 (pending_word) + 1 (pending_word_len) }); @@ -54,9 +54,9 @@ describe('CairoByteArray Unit Tests', () => { // Verify API request format const apiRequest = byteArray.toApiRequest(); - expect(apiRequest[0]).toBe('0x0'); // data length - expect(apiRequest[1]).toBe('0x0'); // pending_word as hex - expect(apiRequest[2]).toBe('0x0'); // pending_word_len + expect(apiRequest[0]).toBe('0'); // data length + expect(apiRequest[1]).toBe('0'); // pending_word as hex + expect(apiRequest[2]).toBe('0'); // pending_word_len }); }); @@ -293,9 +293,9 @@ describe('CairoByteArray Unit Tests', () => { const byteArray = new CairoByteArray('Test'); const apiRequest = byteArray.toApiRequest(); - expect(apiRequest[0]).toBe('0x0'); // data length (0 chunks) - expect(apiRequest[1]).toBe('0x54657374'); // pending_word "Test" as hex - expect(apiRequest[2]).toBe('0x4'); // pending_word_len + expect(apiRequest[0]).toBe('0'); // data length (0 chunks) + expect(apiRequest[1]).toBe('1415934836'); // pending_word "Test" + expect(apiRequest[2]).toBe('4'); // pending_word_len }); test('should handle data with multiple chunks', () => { @@ -303,7 +303,7 @@ describe('CairoByteArray Unit Tests', () => { const byteArray = new CairoByteArray(longString); const apiRequest = byteArray.toApiRequest(); - expect(apiRequest[0]).toBe('0x1'); // data length (1 chunk) + expect(apiRequest[0]).toBe('1'); // data length (1 chunk) expect(apiRequest.length).toBe(4); // 1 (length) + 1 (chunk data) + 1 (pending_word) + 1 (pending_word_len) }); @@ -441,6 +441,13 @@ describe('CairoByteArray Unit Tests', () => { expect(byteArray.toBigInt()).toBe(expected); }); + describe('toDecimalString method', () => { + test('should convert short string to bigint', () => { + const byteArray = new CairoByteArray('Test'); + expect(byteArray.toDecimalString()).toBe('1415934836'); + }); + }); + test('should convert long string with multiple chunks to bigint', () => { const str = 'This is a very long string that exceeds 31 bytes limit for testing'; const byteArray = new CairoByteArray(str); @@ -590,9 +597,9 @@ describe('CairoByteArray Unit Tests', () => { // Verify API request structure expect(apiRequest).toBeInstanceOf(Array); - expect(apiRequest[0]).toBe('0x0'); // data length (no complete chunks) + expect(apiRequest[0]).toBe('0'); // data length (no complete chunks) expect(typeof apiRequest[1]).toBe('string'); // pending_word as hex string - expect(apiRequest[2]).toBe('0x10'); // pending_word_len + expect(apiRequest[2]).toBe('16'); // pending_word_len // Deserialize from API response const iterator = apiRequest[Symbol.iterator](); @@ -635,9 +642,9 @@ describe('CairoByteArray Unit Tests', () => { // Verify API request structure expect(apiRequest).toBeInstanceOf(Array); - expect(apiRequest[0]).toBe('0x0'); // data length - expect(apiRequest[1]).toBe('0x0'); // pending_word - expect(apiRequest[2]).toBe('0x0'); // pending_word_len + expect(apiRequest[0]).toBe('0'); // data length + expect(apiRequest[1]).toBe('0'); // pending_word + expect(apiRequest[2]).toBe('0'); // pending_word_len // Deserialize from API response const iterator = apiRequest[Symbol.iterator](); diff --git a/__tests__/utils/cairoDataTypes/CairoBytes31.test.ts b/__tests__/utils/cairoDataTypes/CairoBytes31.test.ts index edad198d7..7a6dc11d1 100644 --- a/__tests__/utils/cairoDataTypes/CairoBytes31.test.ts +++ b/__tests__/utils/cairoDataTypes/CairoBytes31.test.ts @@ -232,29 +232,29 @@ describe('CairoBytes31 class Unit Tests', () => { describe('toApiRequest method', () => { test('should return hex string array for empty data', () => { const bytes31 = new CairoBytes31(''); - expect(bytes31.toApiRequest()).toEqual(['0x0']); + expect(bytes31.toApiRequest()).toEqual(['0']); }); test('should return hex string array for text data', () => { const bytes31 = new CairoBytes31('A'); // ASCII 65 - expect(bytes31.toApiRequest()).toEqual(['0x41']); + expect(bytes31.toApiRequest()).toEqual(['65']); }); test('should return hex string array for multi-byte data', () => { const bytes31 = new CairoBytes31('AB'); // 0x4142 = 16706 - expect(bytes31.toApiRequest()).toEqual(['0x4142']); + expect(bytes31.toApiRequest()).toEqual(['16706']); }); test('should return hex string array for Buffer input', () => { const buffer = Buffer.from([1, 0]); // 0x0100 = 256 const bytes31 = new CairoBytes31(buffer); - expect(bytes31.toApiRequest()).toEqual(['0x100']); + expect(bytes31.toApiRequest()).toEqual(['256']); }); test('should return hex string array for large values', () => { const array = new Uint8Array([222, 173, 190, 239]); // 0xdeadbeef const bytes31 = new CairoBytes31(array); - expect(bytes31.toApiRequest()).toEqual(['0xdeadbeef']); + expect(bytes31.toApiRequest()).toEqual(['3735928559']); }); }); diff --git a/__tests__/utils/cairoDataTypes/CairoEthAddress.test.ts b/__tests__/utils/cairoDataTypes/CairoEthAddress.test.ts new file mode 100644 index 000000000..6a90f2e86 --- /dev/null +++ b/__tests__/utils/cairoDataTypes/CairoEthAddress.test.ts @@ -0,0 +1,448 @@ +import { ETH_ADDRESS } from '../../../src'; +import { RANGE_ETH_ADDRESS } from '../../../src/global/constants'; +import { CairoEthAddress } from '../../../src/utils/cairoDataTypes'; + +describe('CairoEthAddress class Unit Tests', () => { + describe('constructor with different input types', () => { + test('should handle number input', () => { + const ethAddr = new CairoEthAddress(42); + expect(ethAddr.data).toBe(42n); + }); + + test('should handle bigint input', () => { + const ethAddr = new CairoEthAddress(123n); + expect(ethAddr.data).toBe(123n); + }); + + test('should handle zero values', () => { + const ethAddrFromNumber = new CairoEthAddress(0); + const ethAddrFromBigint = new CairoEthAddress(0n); + + expect(ethAddrFromNumber.data).toBe(0n); + expect(ethAddrFromBigint.data).toBe(0n); + }); + + test('should handle maximum ethAddr value', () => { + const maxethAddr = RANGE_ETH_ADDRESS.max; + const ethAddr = new CairoEthAddress(maxethAddr); + expect(ethAddr.data).toBe(maxethAddr); + }); + + test('should convert number to bigint internally', () => { + const ethAddr = new CairoEthAddress(200); + expect(typeof ethAddr.data).toBe('bigint'); + expect(ethAddr.data).toBe(200n); + }); + }); + + describe('validation', () => { + test('should accept valid ethAddr values', () => { + expect(() => new CairoEthAddress(0)).not.toThrow(); + expect(() => new CairoEthAddress(128)).not.toThrow(); + expect(() => new CairoEthAddress(255)).not.toThrow(); + expect(() => new CairoEthAddress('100')).not.toThrow(); + expect(() => new CairoEthAddress(100n)).not.toThrow(); + }); + + test('should reject negative values', () => { + expect(() => new CairoEthAddress(-1)).toThrow( + 'Validate: EthAddress arg should be in range [0, 2^160-1]' + ); + expect(() => new CairoEthAddress(-100n)).toThrow( + 'Validate: EthAddress arg should be in range [0, 2^160-1]' + ); + expect(() => new CairoEthAddress('-1')).toThrow( + 'Validate: EthAddress arg should be in range [0, 2^160-1]' + ); + }); + + test('should reject values greater than 255', () => { + expect(() => new CairoEthAddress(RANGE_ETH_ADDRESS.max + 1n)).toThrow( + 'Validate: EthAddress arg should be in range [0, 2^160-1]' + ); + expect( + () => new CairoEthAddress('99999999999999999999999999999999999999999999999999999999999999') + ).toThrow('Validate: EthAddress arg should be in range [0, 2^160-1]'); + }); + + test('should handle valid string inputs correctly', () => { + const ethAddrFromDecString = new CairoEthAddress('200'); + const ethAddrFromHexString = new CairoEthAddress('0xff'); + + expect(ethAddrFromDecString.data).toBe(200n); + expect(ethAddrFromHexString.data).toBe(255n); + }); + + test('should handle edge cases and invalid inputs', () => { + expect(() => CairoEthAddress.validate(null as any)).toThrow( + 'Invalid input: null or undefined' + ); + expect(() => CairoEthAddress.validate(undefined as any)).toThrow( + 'Invalid input: null or undefined' + ); + expect(() => CairoEthAddress.validate({} as any)).toThrow( + 'Invalid input: objects are not supported' + ); + expect(() => CairoEthAddress.validate([] as any)).toThrow( + 'Invalid input: objects are not supported' + ); + }); + + test('should handle unknown data types properly', () => { + // Valid unknown data types that can be converted + expect(() => new CairoEthAddress('100' as unknown)).not.toThrow(); + expect(() => new CairoEthAddress(100 as unknown)).not.toThrow(); + expect(() => new CairoEthAddress(100n as unknown)).not.toThrow(); + expect(() => new CairoEthAddress(true as unknown)).not.toThrow(); + expect(() => new CairoEthAddress(false as unknown)).not.toThrow(); + + // Invalid unknown data types + expect(() => new CairoEthAddress({} as unknown)).toThrow( + 'Invalid input: objects are not supported' + ); + expect(() => new CairoEthAddress([] as unknown)).toThrow( + 'Invalid input: objects are not supported' + ); + expect(() => new CairoEthAddress(null as unknown)).toThrow( + 'Invalid input: null or undefined' + ); + expect(() => new CairoEthAddress(undefined as unknown)).toThrow( + 'Invalid input: null or undefined' + ); + expect(() => new CairoEthAddress(Symbol('test') as unknown)).toThrow(); + + // Out of range values as unknown + expect(() => new CairoEthAddress((2n ** 161n) as unknown)).toThrow( + 'Validate: EthAddress arg should be in range [0, 2^160-1]' + ); + expect(() => new CairoEthAddress(-1 as unknown)).toThrow( + 'Validate: EthAddress arg should be in range [0, 2^160-1]' + ); + }); + + test('should reject decimal numbers', () => { + expect(() => new CairoEthAddress(42.5)).toThrow( + 'Invalid input: decimal numbers are not supported, only integers' + ); + expect(() => new CairoEthAddress(1.1)).toThrow( + 'Invalid input: decimal numbers are not supported, only integers' + ); + }); + + test('should validate string inputs with out-of-range values', () => { + expect(() => new CairoEthAddress((2n ** 162n).toString(10))).toThrow( + 'Validate: EthAddress arg should be in range [0, 2^160-1]' + ); + expect(() => new CairoEthAddress('0xfffffffffffffffffffffffffffffffffffffffffff')).toThrow( + 'Validate: EthAddress arg should be in range [0, 2^160-1]' + ); + }); + }); + + describe('toBigInt method', () => { + test('should return the stored bigint value', () => { + const values = [0, 1, 100, 200, 255]; + values.forEach((val) => { + const ethAddr = new CairoEthAddress(val); + expect(ethAddr.toBigInt()).toBe(BigInt(val)); + }); + }); + + test('should handle zero', () => { + const ethAddr = new CairoEthAddress(0); + expect(ethAddr.toBigInt()).toBe(0n); + }); + + test('should handle maximum ethAddr value', () => { + const ethAddr = new CairoEthAddress(255); + expect(ethAddr.toBigInt()).toBe(255n); + }); + + test('should handle large values', () => { + const ethAddr = new CairoEthAddress(200); + expect(ethAddr.toBigInt()).toBe(200n); + }); + }); + + describe('toHexString method', () => { + test('should convert zero to hex', () => { + const ethAddr = new CairoEthAddress(0); + expect(ethAddr.toHexString()).toBe('0x0'); + }); + + test('should convert maximum ethAddr value to hex', () => { + const ethAddr = new CairoEthAddress(RANGE_ETH_ADDRESS.max); + expect(ethAddr.toHexString()).toBe('0xffffffffffffffffffffffffffffffffffffffff'); + }); + + test('should handle bigint input', () => { + const ethAddr = new CairoEthAddress(170n); + expect(ethAddr.toHexString()).toBe('0xaa'); + }); + }); + + describe('toApiRequest method', () => { + test('should return hex string array for zero', () => { + const ethAddr = new CairoEthAddress(0); + const result = ethAddr.toApiRequest(); + expect(result).toEqual(['0']); + expect(result).toHaveProperty('__compiled__', true); + }); + + test('should handle bigint input', () => { + const ethAddr = new CairoEthAddress(128n); + const result = ethAddr.toApiRequest(); + expect(result).toEqual(['128']); + expect(result).toHaveProperty('__compiled__', true); + }); + }); + + describe('validate static method', () => { + test('should validate correct number inputs', () => { + expect(() => CairoEthAddress.validate(0)).not.toThrow(); + expect(() => CairoEthAddress.validate(255)).not.toThrow(); + }); + + test('should validate correct bigint inputs', () => { + expect(() => CairoEthAddress.validate(0n)).not.toThrow(); + expect(() => CairoEthAddress.validate(255n)).not.toThrow(); + }); + + test('should reject invalid types', () => { + expect(() => CairoEthAddress.validate(null as any)).toThrow( + 'Invalid input: null or undefined' + ); + expect(() => CairoEthAddress.validate(undefined as any)).toThrow( + 'Invalid input: null or undefined' + ); + expect(() => CairoEthAddress.validate({} as any)).toThrow( + 'Invalid input: objects are not supported' + ); + expect(() => CairoEthAddress.validate([] as any)).toThrow( + 'Invalid input: objects are not supported' + ); + }); + + test('should reject negative values', () => { + expect(() => CairoEthAddress.validate(-1)).toThrow( + 'Validate: EthAddress arg should be in range [0, 2^160-1]' + ); + expect(() => CairoEthAddress.validate(-100n)).toThrow( + 'Validate: EthAddress arg should be in range [0, 2^160-1]' + ); + }); + + test('should reject values exceeding ethAddr range', () => { + expect(() => CairoEthAddress.validate(RANGE_ETH_ADDRESS.max + 1n)).toThrow( + 'Validate: EthAddress arg should be in range [0, 2^160-1]' + ); + }); + + test('should reject decimal numbers', () => { + expect(() => CairoEthAddress.validate(42.5)).toThrow( + 'Invalid input: decimal numbers are not supported, only integers' + ); + }); + }); + + describe('is static method', () => { + test('should return true for valid inputs', () => { + expect(CairoEthAddress.is(0)).toBe(true); + expect(CairoEthAddress.is(128)).toBe(true); + expect(CairoEthAddress.is(100n)).toBe(true); + expect(CairoEthAddress.is('200')).toBe(true); + }); + + test('should return false for invalid inputs', () => { + expect(CairoEthAddress.is(-1)).toBe(false); + expect(CairoEthAddress.is(RANGE_ETH_ADDRESS.max + 1n)).toBe(false); + expect(CairoEthAddress.is(null as any)).toBe(false); + expect(CairoEthAddress.is(undefined as any)).toBe(false); + expect(CairoEthAddress.is({} as any)).toBe(false); + expect(CairoEthAddress.is(42.5)).toBe(false); + }); + + test('should handle unknown data types in is method', () => { + // Valid unknown types + expect(CairoEthAddress.is(100 as unknown)).toBe(true); + expect(CairoEthAddress.is('200' as unknown)).toBe(true); + expect(CairoEthAddress.is(true as unknown)).toBe(true); + expect(CairoEthAddress.is(false as unknown)).toBe(true); + + // Invalid unknown types + expect(CairoEthAddress.is({} as unknown)).toBe(false); + expect(CairoEthAddress.is([] as unknown)).toBe(false); + expect(CairoEthAddress.is(null as unknown)).toBe(false); + expect(CairoEthAddress.is(undefined as unknown)).toBe(false); + expect(CairoEthAddress.is(Symbol('test') as unknown)).toBe(false); + expect(CairoEthAddress.is((RANGE_ETH_ADDRESS.max + 1n) as unknown)).toBe(false); // out of range + expect(CairoEthAddress.is(-1 as unknown)).toBe(false); // out of range + }); + }); + + describe('isAbiType static method', () => { + test('should identify correct ABI type', () => { + expect(CairoEthAddress.isAbiType(ETH_ADDRESS)).toBe(true); + expect(CairoEthAddress.isAbiType('core::integer::u16')).toBe(false); + expect(CairoEthAddress.isAbiType('core::integer::u32')).toBe(false); + expect(CairoEthAddress.isAbiType('felt252')).toBe(false); + }); + }); + + describe('edge cases and consistency checks', () => { + test('should handle boundary values correctly', () => { + const minethAddr = new CairoEthAddress(0); + const maxethAddr = new CairoEthAddress(RANGE_ETH_ADDRESS.max); + + expect(minethAddr.data).toBe(0n); + expect(maxethAddr.data).toBe(RANGE_ETH_ADDRESS.max); + expect(minethAddr.toBigInt()).toBe(0n); + expect(maxethAddr.toBigInt()).toBe(RANGE_ETH_ADDRESS.max); + }); + + test('should maintain consistency across methods', () => { + const values = [0, 1, 100, 200, 255]; + values.forEach((val) => { + const ethAddr = new CairoEthAddress(val); + const bigintVal = ethAddr.toBigInt(); + const apiRequest = ethAddr.toApiRequest(); + + expect(bigintVal).toBe(BigInt(val)); + expect(apiRequest[0]).toBe(val.toString(10)); + }); + }); + + test('should handle number and bigint inputs consistently', () => { + const testValues = [0, 50, 100, 200, 255]; + testValues.forEach((val) => { + const ethAddrFromNumber = new CairoEthAddress(val); + const ethAddrFromBigint = new CairoEthAddress(BigInt(val)); + + expect(ethAddrFromNumber.data).toBe(ethAddrFromBigint.data); + expect(ethAddrFromNumber.toBigInt()).toBe(ethAddrFromBigint.toBigInt()); + expect(ethAddrFromNumber.toHexString()).toBe(ethAddrFromBigint.toHexString()); + }); + }); + + test('should preserve exact values without precision loss', () => { + const ethAddr = new CairoEthAddress(255); + expect(ethAddr.toBigInt()).toBe(255n); + expect(Number(ethAddr.toBigInt())).toBe(255); + }); + }); + + describe('String handling', () => { + describe('Hex strings', () => { + test('should handle hex strings with 0x prefix', () => { + const ethAddr = new CairoEthAddress('0xff'); + expect(ethAddr.data).toBe(255n); + }); + }); + + describe('Decimal strings', () => { + test('should handle decimal strings', () => { + const ethAddr = new CairoEthAddress('200'); + expect(ethAddr.data).toBe(200n); + }); + + test('should handle zero as decimal string', () => { + const ethAddr = new CairoEthAddress('0'); + expect(ethAddr.data).toBe(0n); + }); + + test('should handle max ethAddr as decimal string', () => { + const ethAddr = new CairoEthAddress('255'); + expect(ethAddr.data).toBe(255n); + }); + }); + }); + + describe('Static methods', () => { + describe('validate method', () => { + test('should validate valid ethAddr range', () => { + expect(() => CairoEthAddress.validate(0)).not.toThrow(); + expect(() => CairoEthAddress.validate(255)).not.toThrow(); + expect(() => CairoEthAddress.validate(128)).not.toThrow(); + }); + + test('should reject out-of-range values', () => { + expect(() => CairoEthAddress.validate(-1)).toThrow(); + expect(() => CairoEthAddress.validate(RANGE_ETH_ADDRESS.max + 1n)).toThrow(); + }); + }); + + describe('is method', () => { + test('should return true for valid values', () => { + expect(CairoEthAddress.is(0)).toBe(true); + expect(CairoEthAddress.is(255)).toBe(true); + expect(CairoEthAddress.is('128')).toBe(true); + }); + + test('should return false for invalid values', () => { + expect(CairoEthAddress.is(-1)).toBe(false); + expect(CairoEthAddress.is(RANGE_ETH_ADDRESS.max + 1n)).toBe(false); + expect(CairoEthAddress.is(null as any)).toBe(false); + }); + }); + + describe('isAbiType method', () => { + test('should return true for correct ABI selector', () => { + expect(CairoEthAddress.isAbiType(ETH_ADDRESS)).toBe(true); + }); + + test('should return false for incorrect ABI selector', () => { + expect(CairoEthAddress.isAbiType('core::integer::u16')).toBe(false); + expect(CairoEthAddress.isAbiType('felt252')).toBe(false); + }); + }); + + describe('factoryFromApiResponse method', () => { + test('should create CairoEthAddress from API response iterator', () => { + const mockIterator = { + next: jest.fn().mockReturnValue({ value: '0x42', done: false }), + }; + const ethAddr = CairoEthAddress.factoryFromApiResponse(mockIterator as any); + expect(ethAddr.data).toBe(0x42n); + }); + + test('should handle hex string from API response', () => { + const mockIterator = { + next: jest.fn().mockReturnValue({ value: '0xff', done: false }), + }; + const ethAddr = CairoEthAddress.factoryFromApiResponse(mockIterator as any); + expect(ethAddr.data).toBe(255n); + }); + + test('should handle max ethAddr value from API response', () => { + const mockIterator = { + next: jest.fn().mockReturnValue({ value: '255', done: false }), + }; + const ethAddr = CairoEthAddress.factoryFromApiResponse(mockIterator as any); + expect(ethAddr.data).toBe(255n); + }); + }); + }); + + describe('Round-trip consistency', () => { + test('should maintain consistency between constructor types', () => { + const testValue = 200; + const ethAddrFromNumber = new CairoEthAddress(testValue); + const ethAddrFromBigint = new CairoEthAddress(BigInt(testValue)); + const ethAddrFromString = new CairoEthAddress(testValue.toString()); + + expect(ethAddrFromNumber.toBigInt()).toBe(ethAddrFromBigint.toBigInt()); + expect(ethAddrFromNumber.toBigInt()).toBe(ethAddrFromString.toBigInt()); + expect(ethAddrFromBigint.toBigInt()).toBe(ethAddrFromString.toBigInt()); + }); + + test('should handle string-to-bigint-to-string round trips', () => { + const originalValue = 200; + const ethAddr = new CairoEthAddress(originalValue); + const bigintValue = ethAddr.toBigInt(); + const newethAddr = new CairoEthAddress(bigintValue); + + expect(newethAddr.toBigInt()).toBe(BigInt(originalValue)); + expect(newethAddr.data).toBe(ethAddr.data); + }); + }); +}); diff --git a/__tests__/utils/cairoDataTypes/CairoFelt252.test.ts b/__tests__/utils/cairoDataTypes/CairoFelt252.test.ts index 285867f24..42ad32ace 100644 --- a/__tests__/utils/cairoDataTypes/CairoFelt252.test.ts +++ b/__tests__/utils/cairoDataTypes/CairoFelt252.test.ts @@ -300,11 +300,11 @@ describe('CairoFelt252 class Unit Tests', () => { describe('toApiRequest method', () => { test('should return hex string array', () => { const felt = new CairoFelt252(123n); - expect(felt.toApiRequest()).toEqual(['0x7b']); + expect(felt.toApiRequest()).toEqual(['123']); const largeFelt = new CairoFelt252(2n ** 200n); expect(largeFelt.toApiRequest()).toEqual([ - '0x100000000000000000000000000000000000000000000000000', + '1606938044258990275541962092341162602522202993782792835301376', ]); }); }); diff --git a/__tests__/utils/cairoDataTypes/CairoFixedArray.test.ts b/__tests__/utils/cairoDataTypes/CairoFixedArray.test.ts index 8d99f057a..473a85b82 100644 --- a/__tests__/utils/cairoDataTypes/CairoFixedArray.test.ts +++ b/__tests__/utils/cairoDataTypes/CairoFixedArray.test.ts @@ -256,7 +256,7 @@ describe('CairoFixedArray class Unit test', () => { hdParsingStrategy ); const result = fixedArray.toApiRequest(); - expect(result).toEqual(['0x1', '0x2', '0x3']); + expect(result).toEqual(['1', '2', '3']); }); test('should create and serialize from object input', () => { @@ -266,7 +266,7 @@ describe('CairoFixedArray class Unit test', () => { hdParsingStrategy ); const result = fixedArray.toApiRequest(); - expect(result).toEqual(['0x1', '0x2', '0x3']); + expect(result).toEqual(['1', '2', '3']); }); test('should work with parsing strategy', () => { @@ -277,8 +277,8 @@ describe('CairoFixedArray class Unit test', () => { const result2 = array2.toApiRequest(); // Unified parsing strategy approach for API serialization - expect(result1).toEqual(['0x1', '0x2']); - expect(result2).toEqual(['0x1', '0x2']); + expect(result1).toEqual(['1', '2']); + expect(result2).toEqual(['1', '2']); }); test('should throw for invalid inputs', () => { @@ -303,7 +303,7 @@ describe('CairoFixedArray class Unit test', () => { hdParsingStrategy ); const result = fixedArray.toApiRequest(); - expect(result).toEqual(['0x1', '0x2', '0x3', '0x4']); + expect(result).toEqual(['1', '2', '3', '4']); }); test('should handle edge cases', () => { @@ -315,7 +315,7 @@ describe('CairoFixedArray class Unit test', () => { // Single element const singleArray = new CairoFixedArray([42], '[core::integer::u8; 1]', hdParsingStrategy); const singleResult = singleArray.toApiRequest(); - expect(singleResult).toEqual(['0x2a']); + expect(singleResult).toEqual(['42']); }); }); @@ -327,7 +327,7 @@ describe('CairoFixedArray class Unit test', () => { hdParsingStrategy ); const result = fixedArray.toApiRequest(); - expect(result).toEqual(['0x1', '0x2', '0x3']); + expect(result).toEqual(['1', '2', '3']); }); test('should work with hdParsingStrategy', () => { @@ -337,8 +337,8 @@ describe('CairoFixedArray class Unit test', () => { const result1 = array1.toApiRequest(); const result2 = array2.toApiRequest(); - expect(result1).toEqual(['0x64', '0xc8']); - expect(result2).toEqual(['0x64', '0xc8']); + expect(result1).toEqual(['100', '200']); + expect(result2).toEqual(['100', '200']); }); test('should handle nested arrays', () => { @@ -351,13 +351,12 @@ describe('CairoFixedArray class Unit test', () => { hdParsingStrategy ); const result = nestedArray.toApiRequest(); - expect(result).toEqual(['0x1', '0x2', '0x3', '0x4']); + expect(result).toEqual(['1', '2', '3', '4']); }); test('should throw for unsupported element types', () => { - const fixedArray = new CairoFixedArray([1, 2], '[unsupported::type; 2]', hdParsingStrategy); expect(() => { - fixedArray.toApiRequest(); + new CairoFixedArray([1, 2], '[unsupported::type; 2]', hdParsingStrategy).toApiRequest(); }).toThrow(); }); }); @@ -405,7 +404,7 @@ describe('CairoFixedArray class Unit test', () => { hdParsingStrategy ); const result = complexArray.toApiRequest(); - expect(result).toEqual(['0x1', '0x2', '0x3', '0x4', '0x5', '0x6', '0x7', '0x8']); + expect(result).toEqual(['1', '2', '3', '4', '5', '6', '7', '8']); }); test('should handle mixed data types in content', () => { diff --git a/__tests__/utils/cairoDataTypes/CairoInt128.test.ts b/__tests__/utils/cairoDataTypes/CairoInt128.test.ts index 81f74aa13..52ee05156 100644 --- a/__tests__/utils/cairoDataTypes/CairoInt128.test.ts +++ b/__tests__/utils/cairoDataTypes/CairoInt128.test.ts @@ -224,14 +224,14 @@ describe('CairoInt128 class Unit Tests', () => { test('should return hex string array for zero', () => { const i128 = new CairoInt128(0); const result = i128.toApiRequest(); - expect(result).toEqual(['0x0']); + expect(result).toEqual(['0']); expect(result).toHaveProperty('__compiled__', true); }); test('should return hex string array for positive numbers', () => { const i128 = new CairoInt128(10000000000000000000n); const result = i128.toApiRequest(); - expect(result).toEqual(['0x8ac7230489e80000']); + expect(result).toEqual(['10000000000000000000']); expect(result).toHaveProperty('__compiled__', true); }); @@ -240,7 +240,7 @@ describe('CairoInt128 class Unit Tests', () => { const result = i128.toApiRequest(); // Negative value -10000000000000000000 becomes PRIME + (-10000000000000000000) = PRIME - 10000000000000000000 const fieldElement = PRIME - 10000000000000000000n; - const expectedValue = `0x${fieldElement.toString(16)}`; + const expectedValue = fieldElement.toString(10); expect(result).toEqual([expectedValue]); expect(result).toHaveProperty('__compiled__', true); }); @@ -249,8 +249,8 @@ describe('CairoInt128 class Unit Tests', () => { const minI128 = new CairoInt128(-(2n ** 127n)); const maxI128 = new CairoInt128(2n ** 127n - 1n); const minFieldElement = PRIME - 2n ** 127n; - const expectedMinValue = `0x${minFieldElement.toString(16)}`; - const expectedMaxValue = `0x${(2n ** 127n - 1n).toString(16)}`; + const expectedMinValue = minFieldElement.toString(10); + const expectedMaxValue = (2n ** 127n - 1n).toString(10); expect(minI128.toApiRequest()).toEqual([expectedMinValue]); expect(maxI128.toApiRequest()).toEqual([expectedMaxValue]); }); diff --git a/__tests__/utils/cairoDataTypes/CairoInt16.test.ts b/__tests__/utils/cairoDataTypes/CairoInt16.test.ts index 457dbb820..3a9733dd8 100644 --- a/__tests__/utils/cairoDataTypes/CairoInt16.test.ts +++ b/__tests__/utils/cairoDataTypes/CairoInt16.test.ts @@ -282,14 +282,14 @@ describe('CairoInt16 class Unit Tests', () => { test('should return hex string array for zero', () => { const i16 = new CairoInt16(0); const result = i16.toApiRequest(); - expect(result).toEqual(['0x0']); + expect(result).toEqual(['0']); expect(result).toHaveProperty('__compiled__', true); }); test('should return hex string array for positive numbers', () => { const i16 = new CairoInt16(1000); const result = i16.toApiRequest(); - expect(result).toEqual(['0x3e8']); + expect(result).toEqual(['1000']); expect(result).toHaveProperty('__compiled__', true); }); @@ -298,7 +298,7 @@ describe('CairoInt16 class Unit Tests', () => { const result = i16.toApiRequest(); // Negative value -1000 becomes PRIME + (-1000) = PRIME - 1000 const fieldElement = PRIME - 1000n; - const expectedValue = `0x${fieldElement.toString(16)}`; + const expectedValue = fieldElement.toString(10); expect(result).toEqual([expectedValue]); expect(result).toHaveProperty('__compiled__', true); }); @@ -307,9 +307,9 @@ describe('CairoInt16 class Unit Tests', () => { const minI16 = new CairoInt16(-32768); const maxI16 = new CairoInt16(32767); const minFieldElement = PRIME - 32768n; - const expectedMinValue = `0x${minFieldElement.toString(16)}`; + const expectedMinValue = minFieldElement.toString(10); expect(minI16.toApiRequest()).toEqual([expectedMinValue]); - expect(maxI16.toApiRequest()).toEqual(['0x7fff']); + expect(maxI16.toApiRequest()).toEqual(['32767']); }); }); @@ -378,19 +378,19 @@ describe('CairoInt16 class Unit Tests', () => { values.forEach((val) => { const i16 = new CairoInt16(val); const bigintVal = i16.toBigInt(); - const hexVal = i16.toHexString(); + const decimalVal = i16.toDecimalString(); const apiRequest = i16.toApiRequest(); expect(bigintVal).toBe(BigInt(val)); // For negative values, hex uses field element representation if (val < 0) { const fieldElement = PRIME + BigInt(val); - expect(hexVal).toBe(`0x${fieldElement.toString(16)}`); + expect(decimalVal).toBe(fieldElement.toString(10)); } else { - expect(hexVal).toBe(`0x${val.toString(16)}`); + expect(decimalVal).toBe(val.toString(10)); } // apiRequest should equal hexVal - expect(apiRequest[0]).toBe(hexVal); + expect(apiRequest[0]).toBe(decimalVal); }); }); diff --git a/__tests__/utils/cairoDataTypes/CairoInt32.test.ts b/__tests__/utils/cairoDataTypes/CairoInt32.test.ts index 75f140f1e..77770671d 100644 --- a/__tests__/utils/cairoDataTypes/CairoInt32.test.ts +++ b/__tests__/utils/cairoDataTypes/CairoInt32.test.ts @@ -293,14 +293,14 @@ describe('CairoInt32 class Unit Tests', () => { test('should return hex string array for zero', () => { const i32 = new CairoInt32(0); const result = i32.toApiRequest(); - expect(result).toEqual(['0x0']); + expect(result).toEqual(['0']); expect(result).toHaveProperty('__compiled__', true); }); test('should return hex string array for positive numbers', () => { const i32 = new CairoInt32(1000000); const result = i32.toApiRequest(); - expect(result).toEqual(['0xf4240']); + expect(result).toEqual(['1000000']); expect(result).toHaveProperty('__compiled__', true); }); @@ -309,7 +309,7 @@ describe('CairoInt32 class Unit Tests', () => { const result = i32.toApiRequest(); // Negative value -1000000 becomes PRIME + (-1000000) = PRIME - 1000000 const fieldElement = PRIME - 1000000n; - const expectedValue = `0x${fieldElement.toString(16)}`; + const expectedValue = fieldElement.toString(10); expect(result).toEqual([expectedValue]); expect(result).toHaveProperty('__compiled__', true); }); @@ -318,8 +318,8 @@ describe('CairoInt32 class Unit Tests', () => { const minI32 = new CairoInt32(-2147483648); const maxI32 = new CairoInt32(2147483647); const minFieldElement = PRIME - 2147483648n; - const expectedMinValue = `0x${minFieldElement.toString(16)}`; - const expectedMaxValue = '0x7fffffff'; + const expectedMinValue = minFieldElement.toString(10); + const expectedMaxValue = '2147483647'; expect(minI32.toApiRequest()).toEqual([expectedMinValue]); expect(maxI32.toApiRequest()).toEqual([expectedMaxValue]); }); @@ -390,19 +390,19 @@ describe('CairoInt32 class Unit Tests', () => { values.forEach((val) => { const i32 = new CairoInt32(val); const bigintVal = i32.toBigInt(); - const hexVal = i32.toHexString(); + const decimalVal = i32.toDecimalString(); const apiRequest = i32.toApiRequest(); expect(bigintVal).toBe(BigInt(val)); // For negative values, hex uses field element representation if (val < 0) { const fieldElement = PRIME + BigInt(val); - expect(hexVal).toBe(`0x${fieldElement.toString(16)}`); + expect(decimalVal).toBe(fieldElement.toString(10)); } else { - expect(hexVal).toBe(`0x${val.toString(16)}`); + expect(decimalVal).toBe(val.toString(10)); } // apiRequest should equal hexVal - expect(apiRequest[0]).toBe(hexVal); + expect(apiRequest[0]).toBe(decimalVal); }); }); diff --git a/__tests__/utils/cairoDataTypes/CairoInt64.test.ts b/__tests__/utils/cairoDataTypes/CairoInt64.test.ts index 336c3554e..38f996214 100644 --- a/__tests__/utils/cairoDataTypes/CairoInt64.test.ts +++ b/__tests__/utils/cairoDataTypes/CairoInt64.test.ts @@ -224,14 +224,14 @@ describe('CairoInt64 class Unit Tests', () => { test('should return hex string array for zero', () => { const i64 = new CairoInt64(0); const result = i64.toApiRequest(); - expect(result).toEqual(['0x0']); + expect(result).toEqual(['0']); expect(result).toHaveProperty('__compiled__', true); }); test('should return hex string array for positive numbers', () => { const i64 = new CairoInt64(1000000000n); const result = i64.toApiRequest(); - expect(result).toEqual(['0x3b9aca00']); + expect(result).toEqual(['1000000000']); expect(result).toHaveProperty('__compiled__', true); }); @@ -240,7 +240,7 @@ describe('CairoInt64 class Unit Tests', () => { const result = i64.toApiRequest(); // Negative value -1000000000 becomes PRIME + (-1000000000) = PRIME - 1000000000 const fieldElement = PRIME - 1000000000n; - const expectedValue = `0x${fieldElement.toString(16)}`; + const expectedValue = fieldElement.toString(10); expect(result).toEqual([expectedValue]); expect(result).toHaveProperty('__compiled__', true); }); @@ -249,8 +249,8 @@ describe('CairoInt64 class Unit Tests', () => { const minI64 = new CairoInt64(-(2n ** 63n)); const maxI64 = new CairoInt64(2n ** 63n - 1n); const minFieldElement = PRIME - 2n ** 63n; - const expectedMinValue = `0x${minFieldElement.toString(16)}`; - const expectedMaxValue = `0x${(2n ** 63n - 1n).toString(16)}`; + const expectedMinValue = minFieldElement.toString(10); + const expectedMaxValue = (2n ** 63n - 1n).toString(10); expect(minI64.toApiRequest()).toEqual([expectedMinValue]); expect(maxI64.toApiRequest()).toEqual([expectedMaxValue]); }); diff --git a/__tests__/utils/cairoDataTypes/CairoInt8.test.ts b/__tests__/utils/cairoDataTypes/CairoInt8.test.ts index ae5543b10..7f0710f5c 100644 --- a/__tests__/utils/cairoDataTypes/CairoInt8.test.ts +++ b/__tests__/utils/cairoDataTypes/CairoInt8.test.ts @@ -306,14 +306,14 @@ describe('CairoInt8 class Unit Tests', () => { test('should return hex string array for zero', () => { const i8 = new CairoInt8(0); const result = i8.toApiRequest(); - expect(result).toEqual(['0x0']); + expect(result).toEqual(['0']); expect(result).toHaveProperty('__compiled__', true); }); test('should return hex string array for positive numbers', () => { const i8 = new CairoInt8(100); const result = i8.toApiRequest(); - expect(result).toEqual(['0x64']); + expect(result).toEqual(['100']); expect(result).toHaveProperty('__compiled__', true); }); @@ -322,7 +322,7 @@ describe('CairoInt8 class Unit Tests', () => { const result = i8.toApiRequest(); // Negative value -100 becomes PRIME + (-100) = PRIME - 100 const fieldElement = PRIME - 100n; - const expectedValue = `0x${fieldElement.toString(16)}`; + const expectedValue = fieldElement.toString(10); expect(result).toEqual([expectedValue]); expect(result).toHaveProperty('__compiled__', true); }); @@ -331,9 +331,9 @@ describe('CairoInt8 class Unit Tests', () => { const minI8 = new CairoInt8(-128); const maxI8 = new CairoInt8(127); const minFieldElement = PRIME - 128n; - const expectedMinValue = `0x${minFieldElement.toString(16)}`; + const expectedMinValue = minFieldElement.toString(10); expect(minI8.toApiRequest()).toEqual([expectedMinValue]); - expect(maxI8.toApiRequest()).toEqual(['0x7f']); + expect(maxI8.toApiRequest()).toEqual(['127']); }); }); @@ -402,19 +402,19 @@ describe('CairoInt8 class Unit Tests', () => { values.forEach((val) => { const i8 = new CairoInt8(val); const bigintVal = i8.toBigInt(); - const hexVal = i8.toHexString(); + const decimalVal = i8.toDecimalString(); const apiRequest = i8.toApiRequest(); expect(bigintVal).toBe(BigInt(val)); // For negative values, hex uses field element representation if (val < 0) { const fieldElement = PRIME + BigInt(val); - expect(hexVal).toBe(`0x${fieldElement.toString(16)}`); + expect(decimalVal).toBe(fieldElement.toString(10)); } else { - expect(hexVal).toBe(`0x${val.toString(16)}`); + expect(decimalVal).toBe(val.toString(10)); } // apiRequest should equal hexVal - expect(apiRequest[0]).toBe(hexVal); + expect(apiRequest[0]).toBe(decimalVal); }); }); diff --git a/__tests__/utils/cairoDataTypes/CairoNonZero.test.ts b/__tests__/utils/cairoDataTypes/CairoNonZero.test.ts new file mode 100644 index 000000000..286e9793e --- /dev/null +++ b/__tests__/utils/cairoDataTypes/CairoNonZero.test.ts @@ -0,0 +1,209 @@ +import { + CairoUint8, + hdParsingStrategy, + cairo, + CairoUint256, + CallData, + CairoNonZero, +} from '../../../src'; + +describe('CairoNonZero', () => { + describe('constructor types', () => { + const typeCairo = 'core::zeroable::NonZero::'; + const iter = ['9'][Symbol.iterator](); + + test('content is a BigNumberish', () => { + const cairoNonZero0 = new CairoNonZero(8, typeCairo, hdParsingStrategy); + expect(cairoNonZero0.content).toEqual(new CairoUint8(8)); + expect(cairoNonZero0.contentType).toBe('core::zeroable::NonZero::'); + expect(cairoNonZero0.toApiRequest()).toEqual(['8']); + expect(cairoNonZero0.decompose(hdParsingStrategy)).toBe(8n); + }); + + test('content is an iterator', () => { + const cairoNonZero0 = new CairoNonZero(iter, typeCairo, hdParsingStrategy); + expect(cairoNonZero0.content).toEqual(new CairoUint8(9)); + expect(cairoNonZero0.contentType).toBe('core::zeroable::NonZero::'); + expect(cairoNonZero0.toApiRequest()).toEqual(['9']); + expect(cairoNonZero0.decompose(hdParsingStrategy)).toBe(9n); + }); + + test('content is a CairoType', () => { + const value = new CairoUint8(7); + const cairoNonZero0 = new CairoNonZero(value, typeCairo, hdParsingStrategy); + expect(cairoNonZero0.content).toEqual(value); + expect(cairoNonZero0.contentType).toBe('core::zeroable::NonZero::'); + expect(cairoNonZero0.toApiRequest()).toEqual(['7']); + expect(cairoNonZero0.decompose(hdParsingStrategy)).toBe(7n); + }); + + test('content is a u256', () => { + const value = cairo.uint256(1000); + const valType = new CairoUint256(1000); + const cairoNonZero0 = new CairoNonZero( + value, + 'core::zeroable::NonZero::', + hdParsingStrategy + ); + expect(cairoNonZero0.content).toEqual(valType); + expect(cairoNonZero0.contentType).toBe('core::zeroable::NonZero::'); + expect(cairoNonZero0.toApiRequest()).toEqual(['1000', '0']); + expect(cairoNonZero0.decompose(hdParsingStrategy)).toBe(1000n); + const cairoNonZero1 = new CairoNonZero( + valType, + 'core::zeroable::NonZero::', + hdParsingStrategy + ); + expect(cairoNonZero1.content).toEqual(valType); + expect(cairoNonZero1.contentType).toBe('core::zeroable::NonZero::'); + const cairoNonZero2 = new CairoNonZero( + 1000, + 'core::zeroable::NonZero::', + hdParsingStrategy + ); + expect(cairoNonZero2.content).toEqual(valType); + expect(cairoNonZero2.contentType).toBe('core::zeroable::NonZero::'); + const cairoNonZero3 = new CairoNonZero( + cairoNonZero2, + 'core::zeroable::NonZero::', + hdParsingStrategy + ); + expect(cairoNonZero3.content).toEqual(valType); + expect(cairoNonZero3.contentType).toBe('core::zeroable::NonZero::'); + }); + }); + + describe('zero values', () => { + test('content is a u8', () => { + expect( + () => new CairoNonZero(0, 'core::zeroable::NonZero::', hdParsingStrategy) + ).toThrow(new Error('ValidateValue: value 0 is not authorized in NonZero type.')); + }); + test('content is a u16', () => { + expect( + () => + new CairoNonZero(0, 'core::zeroable::NonZero::', hdParsingStrategy) + ).toThrow(new Error('ValidateValue: value 0 is not authorized in NonZero type.')); + }); + test('content is a u32', () => { + expect( + () => + new CairoNonZero(0, 'core::zeroable::NonZero::', hdParsingStrategy) + ).toThrow(new Error('ValidateValue: value 0 is not authorized in NonZero type.')); + }); + test('content is a u64', () => { + expect( + () => + new CairoNonZero(0, 'core::zeroable::NonZero::', hdParsingStrategy) + ).toThrow(new Error('ValidateValue: value 0 is not authorized in NonZero type.')); + }); + test('content is a u96', () => { + expect( + () => + new CairoNonZero( + 0, + 'core::zeroable::NonZero::>', + hdParsingStrategy + ) + ).toThrow(new Error('ValidateValue: value 0 is not authorized in NonZero type.')); + }); + test('content is a u128', () => { + expect( + () => + new CairoNonZero(0, 'core::zeroable::NonZero::', hdParsingStrategy) + ).toThrow(new Error('ValidateValue: value 0 is not authorized in NonZero type.')); + }); + test('content is a u256', () => { + expect( + () => + new CairoNonZero(0, 'core::zeroable::NonZero::', hdParsingStrategy) + ).toThrow(new Error('ValidateValue: value 0 is not authorized in NonZero type.')); + }); + }); + + describe('invalid types', () => { + test('content is a u512', () => { + expect( + () => + new CairoNonZero(8, 'core::zeroable::NonZero::', hdParsingStrategy) + ).toThrow( + new Error('Validate: core::integer::u512 type is not authorized for NonZero type.') + ); + }); + + test('content is a i8', () => { + expect( + () => new CairoNonZero(8, 'core::zeroable::NonZero::', hdParsingStrategy) + ).toThrow(new Error('Validate: core::integer::i8 type is not authorized for NonZero type.')); + }); + + test('content is an array', () => { + expect( + () => + new CairoNonZero( + [8, 9], + 'core::zeroable::NonZero::>', + hdParsingStrategy + ) + ).toThrow( + new Error( + 'Validate: core::array::Array:: type is not authorized for NonZero type.' + ) + ); + }); + }); + + describe('static methods', () => { + test('is', () => { + expect(CairoNonZero.is(200, 'core::zeroable::NonZero::')).toBe(true); + expect(CairoNonZero.is(100, 'core::zeroable::NonZero::')).toBe(false); + }); + + test('isAbiType', () => { + expect(CairoNonZero.isAbiType('core::zeroable::NonZero::')).toBe(true); + expect(CairoNonZero.isAbiType('core::wrong::')).toBe(false); + }); + + test('validate', () => { + expect(() => + CairoNonZero.validate(200, 'core::zeroable::NonZero::') + ).not.toThrow(); + expect(() => + CairoNonZero.validate( + 200, + 'core::zeroable::NonZero::>' + ) + ).toThrow( + new Error( + 'Validate: core::array::Array:: type is not authorized for NonZero type.' + ) + ); + }); + + test('getNonZeroType', () => { + expect(CairoNonZero.getNonZeroType('core::zeroable::NonZero::')).toBe( + 'core::integer::u16' + ); + }); + }); + + describe('encoding without Abi', () => { + test('number', () => { + expect( + CallData.compile([ + new CairoNonZero(7, 'core::zeroable::NonZero::', hdParsingStrategy), + ]) + ).toEqual(['7']); + + expect( + CallData.compile({ + input: new CairoNonZero( + 7, + 'core::zeroable::NonZero::', + hdParsingStrategy + ), + }) + ).toEqual(['7']); + }); + }); +}); diff --git a/__tests__/utils/cairoDataTypes/CairoStruct.test.ts b/__tests__/utils/cairoDataTypes/CairoStruct.test.ts new file mode 100644 index 000000000..030bea1ba --- /dev/null +++ b/__tests__/utils/cairoDataTypes/CairoStruct.test.ts @@ -0,0 +1,278 @@ +import { + CairoOptionVariant, + CairoTypeOption, + hdParsingStrategy, + type BigNumberish, + CairoOption, + CairoArray, + CallData, + CairoTypeResult, + CairoResultVariant, + CairoResult, + CairoTuple, + CairoFixedArray, + type ParsingStrategy, + type AbiStruct, + CairoStruct, +} from '../../../src'; +import { contracts } from '../../config/fixtures'; + +describe('CairoStruct', () => { + const myCallData = new CallData(contracts.TestCairoType.sierra.abi); + const strategies = myCallData.parser.parsingStrategies as ParsingStrategy[]; + const abiPoint: AbiStruct = contracts.TestCairoType.sierra.abi.find( + (item) => item.name === 'enums::Point' + ); + const abiCat: AbiStruct = contracts.TestCairoType.sierra.abi.find( + (item) => item.name === 'enums::Cat' + ); + describe('constructor variant', () => { + test('content is an object', () => { + const myCairoStruct = new CairoStruct({ y: 2, x: 1 }, abiPoint, strategies); // wrong order of properties + expect(myCairoStruct.toApiRequest()).toEqual(['1', '2']); + expect(myCairoStruct.decompose(strategies)).toEqual({ x: 1n, y: 2n }); + }); + + test('content is an array', () => { + const myCairoStruct = new CairoStruct([1, 2], abiPoint, strategies); + expect(myCairoStruct.toApiRequest()).toEqual(['1', '2']); + expect(myCairoStruct.decompose(strategies)).toEqual({ x: 1n, y: 2n }); + }); + + test('content is an iterator', () => { + const iter = ['0', '100'][Symbol.iterator](); + const myCairoStruct = new CairoStruct(iter, abiPoint, strategies); + expect(myCairoStruct.toApiRequest()).toEqual(['0', '100']); + expect(myCairoStruct.decompose(strategies)).toEqual({ x: 0n, y: 100n }); + const iter2 = ['2', '11', '12', '13', '14'][Symbol.iterator](); + const myCairoStruct2 = new CairoStruct(iter2, abiCat, strategies); + expect(myCairoStruct2.toApiRequest()).toEqual(['2', '11', '12', '13', '14']); + expect(myCairoStruct2.decompose(strategies)).toEqual({ + age: 2n, + legs: { '0': 11n, '1': 12n, '2': 13n, '3': 14n }, + }); + }); + + test('accept single strategy', () => { + const customStrategy: ParsingStrategy = { + constructors: { + ...strategies[0].constructors, + ...strategies[1].constructors, + }, + dynamicSelectors: { + ...strategies[0].dynamicSelectors, + ...strategies[1].dynamicSelectors, + }, + response: { + ...strategies[0].response, + ...strategies[1].response, + }, + }; + const myCairoStruct = new CairoStruct({ x: 1, y: 2 }, abiPoint, customStrategy); + expect(myCairoStruct.toApiRequest()).toEqual(['1', '2']); + expect(myCairoStruct.decompose(customStrategy)).toEqual({ x: 1n, y: 2n }); + }); + }); + + describe('constructor CairoType', () => { + test('proper abi definition', () => { + expect( + () => + new CairoStruct( + { x: 2, y: 3 }, + { name: 'error', type: 'struct', members: [] }, + strategies + ) + ).toThrow(new Error('Invalid input: expected 0 members, got 2')); + }); + + test('CairoType: result of an array', () => { + const abiDog: AbiStruct = contracts.TestCairoType.sierra.abi.find( + (item) => item.name === 'enums::Dog' + ); + const myStruct0 = new CairoStruct({ age: 2, colors: [1, 2, 3] }, abiDog, strategies); + const myStruct1 = new CairoStruct( + { + age: 2, + colors: new CairoArray( + [1, 2, 3], + 'core::array::Array::', + hdParsingStrategy + ), + }, + abiDog, + strategies + ); + expect(myStruct0.toApiRequest()).toEqual(['2', '3', '1', '2', '3']); + expect(myStruct0.decompose(hdParsingStrategy)).toEqual({ age: 2n, colors: [1n, 2n, 3n] }); + expect(myStruct1.toApiRequest()).toEqual(['2', '3', '1', '2', '3']); + expect(myStruct1.decompose(hdParsingStrategy)).toEqual({ age: 2n, colors: [1n, 2n, 3n] }); + }); + + test('CairoType: result of a fixed array', () => { + const abiHorse: AbiStruct = contracts.TestCairoType.sierra.abi.find( + (item) => item.name === 'enums::Horse' + ); + const myResult0 = new CairoStruct({ age: 2, legs_color: [1, 2, 3, 4] }, abiHorse, strategies); + const myResult1 = new CairoStruct( + { + age: 2, + legs_color: new CairoFixedArray([1, 2, 3, 4], '[core::integer::u16; 4]', strategies), + }, + abiHorse, + strategies + ); + expect(myResult0.toApiRequest()).toEqual(['2', '1', '2', '3', '4']); + expect(myResult0.decompose(hdParsingStrategy)).toEqual({ + age: 2n, + legs_color: [1n, 2n, 3n, 4n], + }); + expect(myResult1.toApiRequest()).toEqual(['2', '1', '2', '3', '4']); + expect(myResult1.decompose(hdParsingStrategy)).toEqual({ + age: 2n, + legs_color: [1n, 2n, 3n, 4n], + }); + }); + + test('CairoType: result of a tuple', () => { + const myStruct0 = new CairoStruct({ age: 2, legs: [5, 6, 7, 8] }, abiCat, strategies); + const myStruct1 = new CairoStruct( + { + age: 2, + legs: new CairoTuple( + [5, 6, 7, 8], + '(core::integer::u8, core::integer::u16, core::integer::u32, core::integer::u64)', + strategies + ), + }, + abiCat, + strategies + ); + expect(myStruct0.toApiRequest()).toEqual(['2', '5', '6', '7', '8']); + expect(myStruct0.decompose(strategies)).toEqual({ + age: 2n, + legs: { '0': 5n, '1': 6n, '2': 7n, '3': 8n }, + }); + expect(myStruct1.toApiRequest()).toEqual(['2', '5', '6', '7', '8']); + expect(myStruct1.decompose(strategies)).toEqual({ + age: 2n, + legs: { '0': 5n, '1': 6n, '2': 7n, '3': 8n }, + }); + }); + + test('CairoType: result of an option', () => { + const abiTruck: AbiStruct = contracts.TestCairoType.sierra.abi.find( + (item) => item.name === 'enums::Truck' + ); + const option0 = new CairoOption(CairoOptionVariant.Some, 2n); + const myTypeOption = new CairoTypeOption( + 2, + 'core::option::Option::', + hdParsingStrategy, + CairoOptionVariant.Some + ); + const myStruct0 = new CairoStruct({ power: 512, turbo: option0 }, abiTruck, strategies); + const myStruct1 = new CairoStruct({ power: 512, turbo: myTypeOption }, abiTruck, strategies); + expect(myStruct0.toApiRequest()).toEqual(['512', '0', '2']); + expect(myStruct0.decompose(hdParsingStrategy)).toEqual({ power: 512n, turbo: option0 }); + expect(myStruct1.toApiRequest()).toEqual(['512', '0', '2']); + expect(myStruct1.decompose(hdParsingStrategy)).toEqual({ power: 512n, turbo: option0 }); + }); + + test('CairoType: result from a result', () => { + const abiDestruction: AbiStruct = contracts.TestCairoType.sierra.abi.find( + (item) => item.name === 'enums::Destruction' + ); + const result = new CairoResult(CairoResultVariant.Err, 5n); + const typeResult = new CairoTypeResult( + result, + 'core::result::Result::', + strategies + ); + const myStruct0 = new CairoStruct({ area: 512, res: result }, abiDestruction, strategies); + const myStruct1 = new CairoStruct({ area: 512, res: typeResult }, abiDestruction, strategies); + expect(myStruct0.toApiRequest()).toEqual(['512', '1', '5']); + expect(myStruct0.decompose(strategies)).toEqual({ area: 512n, res: result }); + expect(myStruct1.toApiRequest()).toEqual(['512', '1', '5']); + expect(myStruct1.decompose(strategies)).toEqual({ area: 512n, res: result }); + }); + + test('CairoType: nested structs', () => { + const abiPoint2: AbiStruct = contracts.TestCairoType.sierra.abi.find( + (item) => item.name === 'enums::Point2' + ); + const point1 = { x: 1, y: 2 }; + const structPoint1 = new CairoStruct(point1, abiPoint, strategies); + const point2 = { thickness: 3, location: point1 }; + const structPoint2 = new CairoStruct( + { thickness: 3, location: structPoint1 }, + abiPoint2, + strategies + ); + const struct0 = new CairoStruct(point2, abiPoint2, strategies); + const struct2 = new CairoStruct(structPoint2, abiPoint2, strategies); + expect(struct0.toApiRequest()).toEqual(['3', '1', '2']); + expect(struct0.decompose(strategies)).toEqual({ + thickness: 3n, + location: { x: 1n, y: 2n }, + }); + expect(struct2.toApiRequest()).toEqual(['3', '1', '2']); + expect(struct2.decompose(strategies)).toEqual({ + thickness: 3n, + location: { x: 1n, y: 2n }, + }); + }); + }); + + describe('static methods', () => { + test('is', () => { + expect(CairoStruct.is([200, 201])).toBe(true); + expect(CairoStruct.is(200)).toBe(false); + }); + + test('validate', () => { + expect(() => CairoStruct.validate([200, 300], abiPoint)).not.toThrow(); + expect(() => CairoStruct.validate({ x: 200, y: 300 }, abiPoint)).not.toThrow(); + expect(() => CairoStruct.validate({ x: 200, y: 300 })).not.toThrow(); + expect(() => CairoStruct.validate([200, 300], 'core::wrong' as unknown as AbiStruct)).toThrow( + new Error('Invalid ABI: expected struct, got undefined') + ); + expect(() => + CairoStruct.validate([200, 300], { + name: 'test', + type: 'struct', + members: [{ name: 'x', type: 'core::integer::u16' }], + }) + ).toThrow(new Error('Invalid input: expected 1 members, got 2')); + }); + + test('extractStructMembersNames', () => { + expect(CairoStruct.extractStructMembersNames(abiPoint)).toEqual(['x', 'y']); + }); + }); + describe('copy constructor behavior', () => { + test('should copy properties when constructed from another CairoStruct', () => { + const original = new CairoStruct({ x: 1, y: 2 }, abiPoint, strategies); + const abiPoint2: AbiStruct = contracts.TestCairoType.sierra.abi.find( + (item) => item.name === 'enums::Point2' + ); + const copy = new CairoStruct(original, abiPoint2, strategies); + expect(copy.content).toEqual(original.content); + expect(copy.abiStruct).toEqual(original.abiStruct); + expect(copy.dynamicSelector).toEqual(original.dynamicSelector); + }); + }); + + describe('encoding without Abi', () => { + test('number', () => { + expect(CallData.compile([new CairoStruct({ x: 4, y: 5 }, abiPoint, strategies)])).toEqual([ + '4', + '5', + ]); + + expect( + CallData.compile({ x: new CairoStruct({ x: 4, y: 5 }, abiPoint, strategies) }) + ).toEqual(['4', '5']); + }); + }); +}); diff --git a/__tests__/utils/cairoDataTypes/CairoTuple.integration.test.ts b/__tests__/utils/cairoDataTypes/CairoTuple.integration.test.ts index cf24e411b..f6419aad4 100644 --- a/__tests__/utils/cairoDataTypes/CairoTuple.integration.test.ts +++ b/__tests__/utils/cairoDataTypes/CairoTuple.integration.test.ts @@ -12,7 +12,7 @@ describe('CairoTuple integration tests', () => { // Convert to API request format const apiRequest = inputTuple.toApiRequest(); - expect(apiRequest).toEqual(['0x2a', '0x64']); + expect(apiRequest).toEqual(['42', '100']); // Simulate API response (same values back) const apiResponse = ['0x2a', '0x64']; @@ -23,20 +23,20 @@ describe('CairoTuple integration tests', () => { // Decompose to final values const finalValues = responseTuple.decompose(hdParsingStrategy); - expect(finalValues).toEqual([42n, 100n]); + expect(finalValues).toEqual({ '0': 42n, '1': 100n }); }); test('named tuple: user input → API request → response parsing', () => { // User provides named input const userInput = { x: 10, y: 20 }; - const namedTupleType = '(x:core::integer::u8, y:core::integer::u32)'; + const namedTupleType = '(x:felt, y:felt)'; // Create CairoTuple from named input const inputTuple = new CairoTuple(userInput, namedTupleType, hdParsingStrategy); // Convert to API request format (no length prefix) const apiRequest = inputTuple.toApiRequest(); - expect(apiRequest).toEqual(['0xa', '0x14']); + expect(apiRequest).toEqual(['10', '20']); // Simulate API response const apiResponse = ['0xa', '0x14']; @@ -47,7 +47,7 @@ describe('CairoTuple integration tests', () => { // Decompose to final values const finalValues = responseTuple.decompose(hdParsingStrategy); - expect(finalValues).toEqual([10n, 20n]); + expect(finalValues).toEqual({ x: 10n, y: 20n }); }); test('nested tuple: user input → API request → response parsing', () => { @@ -60,7 +60,7 @@ describe('CairoTuple integration tests', () => { // Convert to API request (flattened, no length prefixes) const apiRequest = inputTuple.toApiRequest(); - expect(apiRequest).toEqual(['0x1', '0x2', '0x3']); + expect(apiRequest).toEqual(['1', '2', '3']); // Simulate API response const apiResponse = ['0x1', '0x2', '0x3']; @@ -71,7 +71,7 @@ describe('CairoTuple integration tests', () => { // Decompose to final values (nested structure preserved) const finalValues = responseTuple.decompose(hdParsingStrategy); - expect(finalValues).toEqual([[1n, 2n], 3n]); + expect(finalValues).toEqual({ '0': { '0': 1n, '1': 2n }, '1': 3n }); }); test('empty tuple: user input → API request → response parsing', () => { @@ -95,7 +95,7 @@ describe('CairoTuple integration tests', () => { // Decompose to final values (empty array) const finalValues = responseTuple.decompose(hdParsingStrategy); - expect(finalValues).toEqual([]); + expect(finalValues).toEqual({}); }); }); @@ -107,11 +107,7 @@ describe('CairoTuple integration tests', () => { '(core::integer::u8, core::integer::u32)', hdParsingStrategy ); - const namedTuple = new CairoTuple( - { x: 3, y: 4 }, - '(x:core::integer::u8, y:core::integer::u32)', - hdParsingStrategy - ); + const namedTuple = new CairoTuple({ x: 3, y: 4 }, '(x:felt, y:felt)', hdParsingStrategy); const nestedTuple = new CairoTuple( [[5, 6], 7], '((core::integer::u8, core::integer::u8), core::integer::u32)', @@ -166,7 +162,7 @@ describe('CairoTuple integration tests', () => { const parsedTuple = new CairoTuple(responseIterator, tupleType, hdParsingStrategy); const finalValues = parsedTuple.decompose(hdParsingStrategy); - expect(finalValues).toEqual([10n, 20n]); + expect(finalValues).toEqual({ '0': 10n, '1': 20n }); }); }); @@ -187,8 +183,8 @@ describe('CairoTuple integration tests', () => { // Expected: [felt_value, u8_value] expect(apiRequest).toHaveLength(2); - expect(apiRequest[0]).toBe('0x64'); // 100 in hex - expect(apiRequest[1]).toBe('0xc8'); // 200 in hex + expect(apiRequest[0]).toBe('100'); + expect(apiRequest[1]).toBe('200'); // Simulate API response and parse back const responseIterator = apiRequest[Symbol.iterator](); @@ -200,9 +196,7 @@ describe('CairoTuple integration tests', () => { // Verify values can be decomposed const finalValues = responseTuple.decompose(hdParsingStrategy); - expect(finalValues).toHaveLength(2); - expect(finalValues[0]).toBe(100n); // felt252 - expect(finalValues[1]).toBe(200n); // u8 + expect(finalValues).toEqual({ '0': 100n, '1': 200n }); }); test('deeply nested tuples with multiple levels', () => { @@ -215,14 +209,14 @@ describe('CairoTuple integration tests', () => { // Should flatten completely const apiRequest = inputTuple.toApiRequest(); - expect(apiRequest).toEqual(['0x1', '0x2', '0x3', '0x4']); + expect(apiRequest).toEqual(['1', '2', '3', '4']); // Parse back and verify nesting is preserved const responseIterator = apiRequest[Symbol.iterator](); const responseTuple = new CairoTuple(responseIterator, deepType, hdParsingStrategy); const finalValues = responseTuple.decompose(hdParsingStrategy); - expect(finalValues).toEqual([[[1n, 2n], 3n], 4n]); + expect(finalValues).toEqual({ '0': { '0': { '0': 1n, '1': 2n }, '1': 3n }, '1': 4n }); }); test('tuple size validation across different construction paths', () => { @@ -232,20 +226,15 @@ describe('CairoTuple integration tests', () => { expect(() => new CairoTuple([1, 2], tupleType, hdParsingStrategy)).not.toThrow(); expect(() => new CairoTuple({ 0: 1, 1: 2 }, tupleType, hdParsingStrategy)).not.toThrow(); expect( - () => - new CairoTuple( - { x: 1, y: 2 }, - '(x:core::integer::u8, y:core::integer::u32)', - hdParsingStrategy - ) + () => new CairoTuple({ x: 1, y: 2 }, '(x:felt, y:felt)', hdParsingStrategy) ).not.toThrow(); // Should fail - incorrect size expect(() => new CairoTuple([1], tupleType, hdParsingStrategy)).toThrow( - 'Tuple size mismatch' + 'ABI type (core::integer::u8, core::integer::u32): expected 2 items, got 1 items.' ); expect(() => new CairoTuple([1, 2, 3], tupleType, hdParsingStrategy)).toThrow( - 'Tuple size mismatch' + `Cannot read properties of undefined (reading 'startsWith')` ); }); }); @@ -260,8 +249,8 @@ describe('CairoTuple integration tests', () => { const apiRequest = largeTuple.toApiRequest(); expect(apiRequest).toHaveLength(50); - expect(apiRequest[0]).toBe('0x1'); - expect(apiRequest[49]).toBe('0x32'); // 50 in hex + expect(apiRequest[0]).toBe('1'); + expect(apiRequest[49]).toBe('50'); }); test('tuple with single element (not confused with primitive)', () => { @@ -272,14 +261,14 @@ describe('CairoTuple integration tests', () => { const apiRequest = singleTuple.toApiRequest(); // Should still be tuple format (no length prefix) - expect(apiRequest).toEqual(['0x2a']); + expect(apiRequest).toEqual(['42']); // Parse back const responseIterator = apiRequest[Symbol.iterator](); const responseTuple = new CairoTuple(responseIterator, singleType, hdParsingStrategy); const finalValues = responseTuple.decompose(hdParsingStrategy); - expect(finalValues).toEqual([42n]); + expect(finalValues).toEqual({ '0': 42n }); }); }); }); diff --git a/__tests__/utils/cairoDataTypes/CairoTuple.test.ts b/__tests__/utils/cairoDataTypes/CairoTuple.test.ts index 9a839f438..87f75370e 100644 --- a/__tests__/utils/cairoDataTypes/CairoTuple.test.ts +++ b/__tests__/utils/cairoDataTypes/CairoTuple.test.ts @@ -23,8 +23,15 @@ describe('CairoTuple class Unit test', () => { 'core::integer::u8', 'core::integer::u32', ]); + expect(() => { + CairoTuple.getTupleElementTypes('(core::integer::u8,core::integer::u32)'); + }).toThrow( + new Error( + '"(core::integer::u8,core::integer::u32)" is not a valid Cairo type (missing space after comma)' + ) + ); expect(CairoTuple.isAbiType('(core::integer::u8, core::integer::u32)')).toBe(true); - expect(CairoTuple.isAbiType('(x:core::integer::u8, y:core::integer::u32)')).toBe(true); + expect(CairoTuple.isAbiType('(x:felt, y:felt)')).toBe(true); expect(CairoTuple.isAbiType('[core::integer::u8; 2]')).toBe(false); expect(CairoTuple.isAbiType('core::integer::u8')).toBe(false); }); @@ -49,7 +56,7 @@ describe('CairoTuple class Unit test', () => { '(core::integer::u8, core::integer::u8)', hdParsingStrategy ); - expect(result.decompose(hdParsingStrategy)).toEqual([1n, 2n]); + expect(result.decompose(hdParsingStrategy)).toEqual({ '0': 1n, '1': 2n }); // Test with different types const response2 = ['0x10', '0x20']; // elements=[16, 32] @@ -59,7 +66,7 @@ describe('CairoTuple class Unit test', () => { '(core::integer::u8, core::integer::u32)', hdParsingStrategy ); - expect(result2.decompose(hdParsingStrategy)).toEqual([16n, 32n]); + expect(result2.decompose(hdParsingStrategy)).toEqual({ '0': 16n, '1': 32n }); }); test('constructor with nested tuples API response', () => { @@ -72,7 +79,10 @@ describe('CairoTuple class Unit test', () => { '((core::integer::u8, core::integer::u8), core::integer::u32)', hdParsingStrategy ); - expect(nestedResult.decompose(hdParsingStrategy)).toEqual([[1n, 2n], 3n]); + expect(nestedResult.decompose(hdParsingStrategy)).toEqual({ + '0': { '0': 1n, '1': 2n }, + '1': 3n, + }); }); test('constructor error handling with unsupported types', () => { @@ -80,61 +90,42 @@ describe('CairoTuple class Unit test', () => { const iterator = response[Symbol.iterator](); // Test with unsupported element type - error should occur during decompose() - const tuple = new CairoTuple( - iterator, - '(unsupported::type, core::integer::u8)', - hdParsingStrategy - ); expect(() => { - tuple.decompose(hdParsingStrategy); - }).toThrow('No parser found for element type: unsupported::type in parsing strategy'); + new CairoTuple( + iterator, + '(unsupported::type, core::integer::u8)', + hdParsingStrategy + ).decompose(hdParsingStrategy); + }).toThrow('No response parser found for element type: unsupported::type in parsing strategy'); }); describe('named tuple support', () => { test('should handle named tuple input and type', () => { - const namedTuple = new CairoTuple( - { x: 1, y: 2 }, - '(x:core::integer::u8, y:core::integer::u32)', - hdParsingStrategy - ); + const namedTuple = new CairoTuple({ x: 1, y: 2 }, '(x:felt, y:felt)', hdParsingStrategy); expect(namedTuple.content.length).toBe(2); - expect(namedTuple.decompose(hdParsingStrategy)).toEqual([1n, 2n]); + expect(namedTuple.decompose(hdParsingStrategy)).toEqual({ x: 1n, y: 2n }); }); test('should get named tuple element types', () => { - const elementTypes = CairoTuple.getTupleElementTypes( - '(x:core::integer::u8, y:core::integer::u32)' - ); + const elementTypes = CairoTuple.getTupleElementTypes('(x:felt, y:felt)'); expect(elementTypes).toEqual([ - { name: 'x', type: 'core::integer::u8' }, - { name: 'y', type: 'core::integer::u32' }, + { name: 'x', type: 'felt' }, + { name: 'y', type: 'felt' }, ]); }); test('should handle mixed named and positional access', () => { // Test that positional input works even with named tuple type - const tuple1 = new CairoTuple( - [1, 2], - '(x:core::integer::u8, y:core::integer::u32)', - hdParsingStrategy - ); - expect(tuple1.decompose(hdParsingStrategy)).toEqual([1n, 2n]); + const tuple1 = new CairoTuple([1, 2], '(x:felt, y:felt)', hdParsingStrategy); + expect(tuple1.decompose(hdParsingStrategy)).toEqual({ x: 1n, y: 2n }); // Test that named input works with named tuple type - const tuple2 = new CairoTuple( - { x: 1, y: 2 }, - '(x:core::integer::u8, y:core::integer::u32)', - hdParsingStrategy - ); - expect(tuple2.decompose(hdParsingStrategy)).toEqual([1n, 2n]); + const tuple2 = new CairoTuple({ x: 1, y: 2 }, '(x:felt, y:felt)', hdParsingStrategy); + expect(tuple2.decompose(hdParsingStrategy)).toEqual({ x: 1n, y: 2n }); // Test object with indices on named tuple type - const tuple3 = new CairoTuple( - { 0: 1, 1: 2 }, - '(x:core::integer::u8, y:core::integer::u32)', - hdParsingStrategy - ); - expect(tuple3.decompose(hdParsingStrategy)).toEqual([1n, 2n]); + const tuple3 = new CairoTuple({ 0: 1, 1: 2 }, '(x:felt, y:felt)', hdParsingStrategy); + expect(tuple3.decompose(hdParsingStrategy)).toEqual({ x: 1n, y: 2n }); }); }); @@ -149,7 +140,7 @@ describe('CairoTuple class Unit test', () => { }).not.toThrow(); expect(() => { - CairoTuple.validate({ x: 1, y: 2 }, '(x:core::integer::u8, y:core::integer::u32)'); + CairoTuple.validate({ x: 1, y: 2 }, '(x:felt, y:felt)'); }).not.toThrow(); }); @@ -190,9 +181,7 @@ describe('CairoTuple class Unit test', () => { test('should return true for valid inputs', () => { expect(CairoTuple.is([1, 2], '(core::integer::u8, core::integer::u32)')).toBe(true); expect(CairoTuple.is({ 0: 1, 1: 2 }, '(core::integer::u8, core::integer::u32)')).toBe(true); - expect(CairoTuple.is({ x: 1, y: 2 }, '(x:core::integer::u8, y:core::integer::u32)')).toBe( - true - ); + expect(CairoTuple.is({ x: 1, y: 2 }, '(x:felt, y:felt)')).toBe(true); }); test('should return false for invalid inputs', () => { @@ -213,8 +202,8 @@ describe('CairoTuple class Unit test', () => { hdParsingStrategy ); const result = tuple.toApiRequest(); - // Should NOT have length prefix: ['0x1', '0x2', '0x3'] - expect(result).toEqual(['0x1', '0x2', '0x3']); + // Should NOT have length prefix: ['1', '2', '3'] + expect(result).toEqual(['1', '2', '3']); }); test('should create and serialize from object input', () => { @@ -224,19 +213,19 @@ describe('CairoTuple class Unit test', () => { hdParsingStrategy ); const result = tuple.toApiRequest(); - // Should NOT have length prefix: ['0x1', '0x2', '0x3'] - expect(result).toEqual(['0x1', '0x2', '0x3']); + // Should NOT have length prefix: ['1', '2', '3'] + expect(result).toEqual(['1', '2', '3']); }); test('should create and serialize from named object input', () => { const tuple = new CairoTuple( { x: 1, y: 2, z: 3 }, - '(x:core::integer::u8, y:core::integer::u8, z:core::integer::u8)', + '(x:felt, y:felt, z:felt)', hdParsingStrategy ); const result = tuple.toApiRequest(); - // Should NOT have length prefix: ['0x1', '0x2', '0x3'] - expect(result).toEqual(['0x1', '0x2', '0x3']); + // Should NOT have length prefix: ['1', '2', '3'] + expect(result).toEqual(['1', '2', '3']); }); test('should work with parsing strategy', () => { @@ -255,8 +244,8 @@ describe('CairoTuple class Unit test', () => { const result2 = tuple2.toApiRequest(); // Both should serialize the same way (no length prefix) - expect(result1).toEqual(['0x1', '0x2']); - expect(result2).toEqual(['0x1', '0x2']); + expect(result1).toEqual(['1', '2']); + expect(result2).toEqual(['1', '2']); }); test('should throw for invalid inputs', () => { @@ -274,18 +263,14 @@ describe('CairoTuple class Unit test', () => { ); const result = tuple.toApiRequest(); // Nested tuple should be flattened: [inner_elem1, inner_elem2, outer_elem] - expect(result).toEqual(['0x1', '0x2', '0x3']); + expect(result).toEqual(['1', '2', '3']); }); test('should handle tuple size mismatch', () => { expect(() => { // eslint-disable-next-line no-new - new CairoTuple( - [1, 2, 3], // 3 elements - '(core::integer::u8, core::integer::u32)', // but only 2 expected - hdParsingStrategy - ); - }).toThrow('Tuple size mismatch: expected 2 elements, got 3'); + new CairoTuple([1, 2, 3], '(core::integer::u8, core::integer::u32)', hdParsingStrategy); + }).toThrow(`Cannot read properties of undefined (reading 'startsWith')`); }); }); @@ -298,7 +283,7 @@ describe('CairoTuple class Unit test', () => { ); const result = tuple.toApiRequest(); // No length prefix for tuples - expect(result).toEqual(['0x1', '0x2', '0x3']); + expect(result).toEqual(['1', '2', '3']); }); test('should work with hdParsingStrategy', () => { @@ -309,7 +294,7 @@ describe('CairoTuple class Unit test', () => { ); const result = tuple1.toApiRequest(); - expect(result).toEqual(['0x64', '0xc8']); + expect(result).toEqual(['100', '200']); }); test('should handle nested tuples with proper flattening', () => { @@ -323,17 +308,16 @@ describe('CairoTuple class Unit test', () => { ); const result = nestedTuple.toApiRequest(); // Should be completely flattened (no length prefixes anywhere) - expect(result).toEqual(['0x1', '0x2', '0x3', '0x4']); + expect(result).toEqual(['1', '2', '3', '4']); }); test('should throw for unsupported element types', () => { - const tuple = new CairoTuple( - [1, 2], - '(unsupported::type, core::integer::u8)', - hdParsingStrategy - ); expect(() => { - tuple.toApiRequest(); + new CairoTuple( + [1, 2], + '(unsupported::type, core::integer::u8)', + hdParsingStrategy + ).toApiRequest(); }).toThrow(); }); }); @@ -354,7 +338,7 @@ describe('CairoTuple class Unit test', () => { test('should handle single-element tuples', () => { const singleTuple = new CairoTuple([42], '(core::integer::u8)', hdParsingStrategy); expect(singleTuple.content.length).toBe(1); - expect(singleTuple.toApiRequest()).toEqual(['0x2a']); + expect(singleTuple.toApiRequest()).toEqual(['42']); }); test('should handle complex nested structures', () => { @@ -367,7 +351,7 @@ describe('CairoTuple class Unit test', () => { ); const result = complexTuple.toApiRequest(); // Expected: all flattened - expect(result).toEqual(['0x1', '0x2', '0x3', '0x4']); + expect(result).toEqual(['1', '2', '3', '4']); }); test('should handle mixed data types in content', () => { @@ -388,7 +372,7 @@ describe('CairoTuple class Unit test', () => { expect( CairoTuple.isAbiType('((core::integer::u8, core::integer::u8), core::integer::u32)') ).toBe(true); - expect(CairoTuple.isAbiType('(x:core::integer::u8, y:core::integer::u32)')).toBe(true); + expect(CairoTuple.isAbiType('(x:felt, y:felt)')).toBe(true); // Invalid edge cases expect(CairoTuple.isAbiType('[type; 0]')).toBe(false); // array diff --git a/__tests__/utils/cairoDataTypes/CairoUint128.test.ts b/__tests__/utils/cairoDataTypes/CairoUint128.test.ts index 61f276f56..5b98875f8 100644 --- a/__tests__/utils/cairoDataTypes/CairoUint128.test.ts +++ b/__tests__/utils/cairoDataTypes/CairoUint128.test.ts @@ -195,14 +195,14 @@ describe('CairoUint128 class Unit Tests', () => { test('should return hex string array for zero', () => { const u128 = new CairoUint128(0); const result = u128.toApiRequest(); - expect(result).toEqual(['0x0']); + expect(result).toEqual(['0']); expect(result).toHaveProperty('__compiled__', true); }); test('should return hex string array for small numbers', () => { const u128 = new CairoUint128(42); const result = u128.toApiRequest(); - expect(result).toEqual(['0x2a']); + expect(result).toEqual(['42']); expect(result).toHaveProperty('__compiled__', true); }); @@ -210,14 +210,14 @@ describe('CairoUint128 class Unit Tests', () => { const maxU128 = 2n ** 128n - 1n; const u128 = new CairoUint128(maxU128); const result = u128.toApiRequest(); - expect(result).toEqual(['0xffffffffffffffffffffffffffffffff']); + expect(result).toEqual(['340282366920938463463374607431768211455']); expect(result).toHaveProperty('__compiled__', true); }); test('should handle bigint input', () => { const u128 = new CairoUint128(0x123456789abcdef0123456789abcdefn); const result = u128.toApiRequest(); - expect(result).toEqual(['0x123456789abcdef0123456789abcdef']); + expect(result).toEqual(['1512366075204170929049582354406559215']); expect(result).toHaveProperty('__compiled__', true); }); }); @@ -318,12 +318,10 @@ describe('CairoUint128 class Unit Tests', () => { values.forEach((val) => { const u128 = new CairoUint128(val); const bigintVal = u128.toBigInt(); - const hexVal = u128.toHexString(); const apiRequest = u128.toApiRequest(); expect(bigintVal).toBe(BigInt(val)); - expect(hexVal).toBe(`0x${val.toString(16)}`); - expect(apiRequest[0]).toBe(hexVal); + expect(apiRequest[0]).toBe(val.toString(10)); }); }); diff --git a/__tests__/utils/cairoDataTypes/CairoUint16.test.ts b/__tests__/utils/cairoDataTypes/CairoUint16.test.ts index 6a4ad69c3..5e9c10aa7 100644 --- a/__tests__/utils/cairoDataTypes/CairoUint16.test.ts +++ b/__tests__/utils/cairoDataTypes/CairoUint16.test.ts @@ -188,28 +188,28 @@ describe('CairoUint16 class Unit Tests', () => { test('should return hex string array for zero', () => { const u16 = new CairoUint16(0); const result = u16.toApiRequest(); - expect(result).toEqual(['0x0']); + expect(result).toEqual(['0']); expect(result).toHaveProperty('__compiled__', true); }); test('should return hex string array for small numbers', () => { const u16 = new CairoUint16(42); const result = u16.toApiRequest(); - expect(result).toEqual(['0x2a']); + expect(result).toEqual(['42']); expect(result).toHaveProperty('__compiled__', true); }); test('should return hex string array for large numbers', () => { const u16 = new CairoUint16(65535); const result = u16.toApiRequest(); - expect(result).toEqual(['0xffff']); + expect(result).toEqual(['65535']); expect(result).toHaveProperty('__compiled__', true); }); test('should handle bigint input', () => { const u16 = new CairoUint16(32768n); const result = u16.toApiRequest(); - expect(result).toEqual(['0x8000']); + expect(result).toEqual(['32768']); expect(result).toHaveProperty('__compiled__', true); }); }); @@ -301,12 +301,10 @@ describe('CairoUint16 class Unit Tests', () => { values.forEach((val) => { const u16 = new CairoUint16(val); const bigintVal = u16.toBigInt(); - const hexVal = u16.toHexString(); const apiRequest = u16.toApiRequest(); expect(bigintVal).toBe(BigInt(val)); - expect(hexVal).toBe(`0x${val.toString(16)}`); - expect(apiRequest[0]).toBe(hexVal); + expect(apiRequest[0]).toBe(val.toString(10)); }); }); diff --git a/__tests__/utils/cairoDataTypes/CairoUint32.test.ts b/__tests__/utils/cairoDataTypes/CairoUint32.test.ts index 2e7b13b18..022c9bce5 100644 --- a/__tests__/utils/cairoDataTypes/CairoUint32.test.ts +++ b/__tests__/utils/cairoDataTypes/CairoUint32.test.ts @@ -195,28 +195,28 @@ describe('CairoUint32 class Unit Tests', () => { describe('toApiRequest method', () => { test('should return hex string array for zero', () => { const u32 = new CairoUint32(0); - expect(u32.toApiRequest()).toEqual(['0x0']); + expect(u32.toApiRequest()).toEqual(['0']); }); test('should return hex string array for small numbers', () => { const u32 = new CairoUint32(42); - expect(u32.toApiRequest()).toEqual(['0x2a']); + expect(u32.toApiRequest()).toEqual(['42']); }); test('should return hex string array for large numbers', () => { const u32 = new CairoUint32(1000000); - expect(u32.toApiRequest()).toEqual(['0xf4240']); + expect(u32.toApiRequest()).toEqual(['1000000']); }); test('should return hex string array for maximum u32', () => { const maxU32 = 2n ** 32n - 1n; const u32 = new CairoUint32(maxU32); - expect(u32.toApiRequest()).toEqual(['0xffffffff']); + expect(u32.toApiRequest()).toEqual(['4294967295']); }); test('should handle bigint input', () => { const u32 = new CairoUint32(12345n); - expect(u32.toApiRequest()).toEqual(['0x3039']); + expect(u32.toApiRequest()).toEqual(['12345']); }); }); @@ -281,7 +281,7 @@ describe('CairoUint32 class Unit Tests', () => { describe('isAbiType static method', () => { test('should identify correct ABI type', () => { - expect(CairoUint32.isAbiType('core::u32::u32')).toBe(true); + expect(CairoUint32.isAbiType('core::integer::u32')).toBe(true); expect(CairoUint32.isAbiType('u32')).toBe(false); expect(CairoUint32.isAbiType('core::u64::u64')).toBe(false); expect(CairoUint32.isAbiType('core::felt252')).toBe(false); @@ -474,11 +474,11 @@ describe('CairoUint32 class Unit Tests', () => { describe('isAbiType method', () => { test('should return true for correct ABI selector', () => { - expect(CairoUint32.isAbiType('core::u32::u32')).toBe(true); + expect(CairoUint32.isAbiType('core::integer::u32')).toBe(true); }); test('should return false for incorrect ABI selector', () => { - expect(CairoUint32.isAbiType('core::u64::u64')).toBe(false); + expect(CairoUint32.isAbiType('core::integer::u64')).toBe(false); expect(CairoUint32.isAbiType('core::felt252')).toBe(false); expect(CairoUint32.isAbiType('')).toBe(false); }); diff --git a/__tests__/utils/cairoDataTypes/CairoUint64.test.ts b/__tests__/utils/cairoDataTypes/CairoUint64.test.ts index 7d64c9f02..773be6fff 100644 --- a/__tests__/utils/cairoDataTypes/CairoUint64.test.ts +++ b/__tests__/utils/cairoDataTypes/CairoUint64.test.ts @@ -194,14 +194,14 @@ describe('CairoUint64 class Unit Tests', () => { test('should return hex string array for zero', () => { const u64 = new CairoUint64(0); const result = u64.toApiRequest(); - expect(result).toEqual(['0x0']); + expect(result).toEqual(['0']); expect(result).toHaveProperty('__compiled__', true); }); test('should return hex string array for small numbers', () => { const u64 = new CairoUint64(42); const result = u64.toApiRequest(); - expect(result).toEqual(['0x2a']); + expect(result).toEqual(['42']); expect(result).toHaveProperty('__compiled__', true); }); @@ -209,14 +209,14 @@ describe('CairoUint64 class Unit Tests', () => { const maxU64 = 2n ** 64n - 1n; const u64 = new CairoUint64(maxU64); const result = u64.toApiRequest(); - expect(result).toEqual(['0xffffffffffffffff']); + expect(result).toEqual(['18446744073709551615']); expect(result).toHaveProperty('__compiled__', true); }); test('should handle bigint input', () => { const u64 = new CairoUint64(0x123456789abcdefn); const result = u64.toApiRequest(); - expect(result).toEqual(['0x123456789abcdef']); + expect(result).toEqual(['81985529216486895']); expect(result).toHaveProperty('__compiled__', true); }); }); @@ -316,12 +316,10 @@ describe('CairoUint64 class Unit Tests', () => { values.forEach((val) => { const u64 = new CairoUint64(val); const bigintVal = u64.toBigInt(); - const hexVal = u64.toHexString(); const apiRequest = u64.toApiRequest(); expect(bigintVal).toBe(BigInt(val)); - expect(hexVal).toBe(`0x${val.toString(16)}`); - expect(apiRequest[0]).toBe(hexVal); + expect(apiRequest[0]).toBe(val.toString(10)); }); }); diff --git a/__tests__/utils/cairoDataTypes/CairoUint8.test.ts b/__tests__/utils/cairoDataTypes/CairoUint8.test.ts index 1a448dead..411bf11e2 100644 --- a/__tests__/utils/cairoDataTypes/CairoUint8.test.ts +++ b/__tests__/utils/cairoDataTypes/CairoUint8.test.ts @@ -214,28 +214,28 @@ describe('CairoUint8 class Unit Tests', () => { test('should return hex string array for zero', () => { const u8 = new CairoUint8(0); const result = u8.toApiRequest(); - expect(result).toEqual(['0x0']); + expect(result).toEqual(['0']); expect(result).toHaveProperty('__compiled__', true); }); test('should return hex string array for small numbers', () => { const u8 = new CairoUint8(42); const result = u8.toApiRequest(); - expect(result).toEqual(['0x2a']); + expect(result).toEqual(['42']); expect(result).toHaveProperty('__compiled__', true); }); test('should return hex string array for large numbers', () => { const u8 = new CairoUint8(255); const result = u8.toApiRequest(); - expect(result).toEqual(['0xff']); + expect(result).toEqual(['255']); expect(result).toHaveProperty('__compiled__', true); }); test('should handle bigint input', () => { const u8 = new CairoUint8(128n); const result = u8.toApiRequest(); - expect(result).toEqual(['0x80']); + expect(result).toEqual(['128']); expect(result).toHaveProperty('__compiled__', true); }); }); @@ -344,12 +344,10 @@ describe('CairoUint8 class Unit Tests', () => { values.forEach((val) => { const u8 = new CairoUint8(val); const bigintVal = u8.toBigInt(); - const hexVal = u8.toHexString(); const apiRequest = u8.toApiRequest(); expect(bigintVal).toBe(BigInt(val)); - expect(hexVal).toBe(`0x${val.toString(16)}`); - expect(apiRequest[0]).toBe(hexVal); + expect(apiRequest[0]).toBe(val.toString(10)); }); }); diff --git a/__tests__/utils/cairoDataTypes/CairoUint96.test.ts b/__tests__/utils/cairoDataTypes/CairoUint96.test.ts index 0d2b30fc4..c5a022b59 100644 --- a/__tests__/utils/cairoDataTypes/CairoUint96.test.ts +++ b/__tests__/utils/cairoDataTypes/CairoUint96.test.ts @@ -194,14 +194,14 @@ describe('CairoUint96 class Unit Tests', () => { test('should return hex string array for zero', () => { const u96 = new CairoUint96(0); const result = u96.toApiRequest(); - expect(result).toEqual(['0x0']); + expect(result).toEqual(['0']); expect(result).toHaveProperty('__compiled__', true); }); test('should return hex string array for small numbers', () => { const u96 = new CairoUint96(42); const result = u96.toApiRequest(); - expect(result).toEqual(['0x2a']); + expect(result).toEqual(['42']); expect(result).toHaveProperty('__compiled__', true); }); @@ -209,14 +209,14 @@ describe('CairoUint96 class Unit Tests', () => { const maxU96 = 2n ** 96n - 1n; const u96 = new CairoUint96(maxU96); const result = u96.toApiRequest(); - expect(result).toEqual(['0xffffffffffffffffffffffff']); + expect(result).toEqual(['79228162514264337593543950335']); expect(result).toHaveProperty('__compiled__', true); }); test('should handle bigint input', () => { const u96 = new CairoUint96(0x123456789abcdef0123456n); const result = u96.toApiRequest(); - expect(result).toEqual(['0x123456789abcdef0123456']); + expect(result).toEqual(['22007822920628982378542166']); expect(result).toHaveProperty('__compiled__', true); }); }); @@ -293,7 +293,11 @@ describe('CairoUint96 class Unit Tests', () => { describe('isAbiType static method', () => { test('should identify correct ABI type', () => { - expect(CairoUint96.isAbiType('core::integer::u96')).toBe(true); + expect( + CairoUint96.isAbiType( + 'core::internal::bounded_int::BoundedInt::<0, 79228162514264337593543950335>' + ) + ).toBe(true); expect(CairoUint96.isAbiType('core::integer::u64')).toBe(false); expect(CairoUint96.isAbiType('core::integer::u128')).toBe(false); expect(CairoUint96.isAbiType('felt252')).toBe(false); @@ -316,12 +320,10 @@ describe('CairoUint96 class Unit Tests', () => { values.forEach((val) => { const u96 = new CairoUint96(val); const bigintVal = u96.toBigInt(); - const hexVal = u96.toHexString(); const apiRequest = u96.toApiRequest(); expect(bigintVal).toBe(BigInt(val)); - expect(hexVal).toBe(`0x${val.toString(16)}`); - expect(apiRequest[0]).toBe(hexVal); + expect(apiRequest[0]).toBe(val.toString(10)); }); }); diff --git a/__tests__/utils/calldata/byteArray.test.ts b/__tests__/utils/calldata/byteArray.test.ts deleted file mode 100644 index c94c80852..000000000 --- a/__tests__/utils/calldata/byteArray.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { CairoByteArray } from '../../../src/utils/cairoDataTypes/byteArray'; - -describe('CairoByteArray.stringFromByteArray', () => { - test('should return string from Cairo byte array', () => { - const str = new CairoByteArray({ - data: [], - pending_word: '0x414243444546474849', - pending_word_len: 9, - }); - expect(str).toEqual('ABCDEFGHI'); - }); -}); - -describe('CairoByteArray.byteArrayFromString', () => { - test('should return Cairo byte array from string', () => { - const byteArray = new CairoByteArray('ABCDEFGHI'); - expect(byteArray).toEqual({ - data: [], - pending_word: '0x414243444546474849', - pending_word_len: 9, - }); - }); -}); diff --git a/__tests__/utils/calldata/enum/CairoOption.test.ts b/__tests__/utils/calldata/enum/CairoOption.test.ts index b1dfaff76..a34f6ec07 100644 --- a/__tests__/utils/calldata/enum/CairoOption.test.ts +++ b/__tests__/utils/calldata/enum/CairoOption.test.ts @@ -1,4 +1,4 @@ -import { CairoOption } from '../../../../src/utils/calldata/enum'; +import { CallData, type BigNumberish, CairoOptionVariant, CairoOption } from '../../../../src'; describe('CairoOption', () => { describe('constructor', () => { @@ -52,4 +52,20 @@ describe('CairoOption', () => { expect(cairoOption.isNone()).toEqual(true); }); }); + describe('encoding without Abi', () => { + test('number', () => { + expect(CallData.compile([new CairoOption(CairoOptionVariant.Some, 7)])).toEqual( + ['0', '7'] + ); + expect(CallData.compile([new CairoOption(CairoOptionVariant.None)])).toEqual([ + '1', + ]); + expect( + CallData.compile({ value: new CairoOption(CairoOptionVariant.Some, 7) }) + ).toEqual(['0', '7']); + expect( + CallData.compile({ value: new CairoOption(CairoOptionVariant.None) }) + ).toEqual(['1']); + }); + }); }); diff --git a/__tests__/utils/calldata/enum/CairoTypeCustomEnum.test.ts b/__tests__/utils/calldata/enum/CairoTypeCustomEnum.test.ts new file mode 100644 index 000000000..10d59088d --- /dev/null +++ b/__tests__/utils/calldata/enum/CairoTypeCustomEnum.test.ts @@ -0,0 +1,329 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { + CairoTypeCustomEnum, + type ParsingStrategy, + type AbiEnum, + createAbiParser, + type AllowArray, + type BigNumberish, + CairoCustomEnum, + CairoStruct, + type AbiStruct, + CairoFixedArray, + cairo, + CairoArray, + hdParsingStrategy, + CairoTuple, + CairoOption, + CairoOptionVariant, + CairoTypeOption, + CairoResult, + CairoResultVariant, + CairoTypeResult, + CallData, +} from '../../../../src'; +import { contracts } from '../../../config/fixtures'; + +describe('CairoTypeCustomEnum', () => { + const { abi } = contracts.TestCairoType.sierra; + const enumAbi = abi.find((item) => item.name === 'enums::MyEnum') as AbiEnum; + const pointAbi = abi.find((item) => item.name === 'enums::Point') as AbiStruct; + const parser = createAbiParser(abi, hdParsingStrategy); + const strategies: AllowArray = parser.parsingStrategies; + const iter = ['1', '100', '200'][Symbol.iterator](); + type Point = { x: BigNumberish; y: BigNumberish }; + const myPoint: Point = { y: 200, x: 100 }; + const point = new CairoStruct(myPoint, pointAbi, strategies); + + describe('constructor variant', () => { + const r = new CairoTypeCustomEnum(myPoint, enumAbi, strategies, 1); + test('should throw an error if wrong variant is provided', () => { + expect(() => new CairoTypeCustomEnum(myPoint, enumAbi, strategies, 100)).toThrow( + new Error( + 'The custom enum enums::MyEnum variant must be in the range 0..8. You requested variant #100' + ) + ); + }); + + test('should throw an error if content is undefined', () => { + expect(() => new CairoTypeCustomEnum(undefined, enumAbi, strategies)).toThrow( + new Error('"content" parameter has to be defined.') + ); + expect(() => new CairoTypeCustomEnum(null, enumAbi, strategies)).toThrow( + new Error('"content" parameter has to be defined.') + ); + }); + + test('accept optional array of parsing strategies', () => { + const mergedStrategy: ParsingStrategy = { + ...(strategies as ParsingStrategy[])[0], + ...(strategies as ParsingStrategy[])[1], + }; + expect(() => new CairoTypeCustomEnum(myPoint, enumAbi, strategies, 1)).not.toThrow(); + expect(() => new CairoTypeCustomEnum(myPoint, enumAbi, mergedStrategy, 1)).not.toThrow(); + }); + + test('if content is an iterator, no variant is authorized', () => { + expect(() => new CairoTypeCustomEnum(iter, enumAbi, strategies, 1)).toThrow( + new Error('when "content" parameter is an iterator, do not define "variant" parameter.') + ); + }); + }); + + describe('constructor content', () => { + test('content is a CairoCustomEnum', () => { + const myCairoCustomEnum = new CairoCustomEnum({ LocationError: myPoint }); + const cairoTypeCustomEnum0 = new CairoTypeCustomEnum(myCairoCustomEnum, enumAbi, strategies); + expect(cairoTypeCustomEnum0.enumVariant).toBe(1); + expect(cairoTypeCustomEnum0.content).toEqual(point); + expect(cairoTypeCustomEnum0.abiEnum).toEqual(enumAbi); + }); + + test('content is a CairoTypeCustomEnum', () => { + const cairoTypeCustomEnum0 = new CairoTypeCustomEnum(myPoint, enumAbi, strategies, 1); + const cairoTypeCustomEnum1 = new CairoTypeCustomEnum( + cairoTypeCustomEnum0, + enumAbi, + strategies + ); + expect(cairoTypeCustomEnum1.enumVariant).toBe(1); + expect(cairoTypeCustomEnum1.content).toEqual(point); + expect(cairoTypeCustomEnum1.abiEnum).toEqual(enumAbi); + expect(() => new CairoTypeCustomEnum(cairoTypeCustomEnum0, enumAbi, strategies, 1)).toThrow( + new Error( + 'when "content" parameter is a CairoTypeCustomEnum do not define "variant" parameter.' + ) + ); + }); + + test('content is an iterator', () => { + const cairoTypeCustomEnum0 = new CairoTypeCustomEnum(iter, enumAbi, strategies); + expect(cairoTypeCustomEnum0.enumVariant).toBe(1); + expect(cairoTypeCustomEnum0.content).toEqual(point); + expect(cairoTypeCustomEnum0.abiEnum).toEqual(enumAbi); + expect(cairoTypeCustomEnum0.toApiRequest()).toEqual(['1', '100', '200']); + const iter1 = ['3', '10', '11'][Symbol.iterator](); + const cairoTypeCustomEnum1 = new CairoTypeCustomEnum(iter1, enumAbi, strategies); + expect(cairoTypeCustomEnum1.enumVariant).toBe(3); + expect(cairoTypeCustomEnum1.abiEnum).toEqual(enumAbi); + expect(cairoTypeCustomEnum1.toApiRequest()).toEqual(['3', '10', '11']); + }); + }); + + describe('constructor custom enum CairoType', () => { + test('customEnumCairoType: enum of an array', () => { + const myEnum0 = new CairoTypeCustomEnum([1, 2, 3], enumAbi, strategies, 4); + const myEnum1 = new CairoTypeCustomEnum( + new CairoArray([1, 2, 3], 'core::array::Span::', strategies), + enumAbi, + strategies, + 4 + ); + expect(myEnum0.toApiRequest()).toEqual(['4', '3', '1', '0', '2', '0', '3', '0']); + expect(myEnum0.decompose(strategies)).toEqual( + new CairoCustomEnum({ ErrorList: [1n, 2n, 3n] }) + ); + expect(myEnum1.toApiRequest()).toEqual(['4', '3', '1', '0', '2', '0', '3', '0']); + expect(myEnum1.decompose(strategies)).toEqual( + new CairoCustomEnum({ ErrorList: [1n, 2n, 3n] }) + ); + expect(() => new CairoTypeCustomEnum([1, 2, 3], enumAbi, strategies)).toThrow( + new Error( + '"variant" parameter is mandatory when creating a new Cairo custom enum from a Cairo Enum or raw data.' + ) + ); + }); + + test('customEnumCairoType: enum of a fixed array', () => { + const myEnum0 = new CairoTypeCustomEnum([1, 2], enumAbi, strategies, 3); + const myEnum1 = new CairoTypeCustomEnum( + new CairoFixedArray([1, 2], '[core::integer::u32; 2]', strategies), + enumAbi, + strategies, + 3 + ); + expect(myEnum0.toApiRequest()).toEqual(['3', '1', '2']); + const empty = { + Damage: undefined, + Empty: undefined, + ErrorList: undefined, + LocationError: undefined, + Parents: undefined, + Report: undefined, + Status: undefined, + Success: undefined, + }; + const enRes = { TwoErrors: [1n, 2n] }; + expect(myEnum0.decompose(strategies)).toEqual(new CairoCustomEnum({ ...empty, ...enRes })); + expect(myEnum1.toApiRequest()).toEqual(['3', '1', '2']); + expect(myEnum1.decompose(strategies)).toEqual(new CairoCustomEnum({ TwoErrors: [1n, 2n] })); + expect(() => new CairoTypeCustomEnum([1, 2], enumAbi, strategies)).toThrow( + new Error( + '"variant" parameter is mandatory when creating a new Cairo custom enum from a Cairo Enum or raw data.' + ) + ); + }); + + test('customEnumCairoType: enum of a tuple', () => { + const myEnum0 = new CairoTypeCustomEnum([5, 6], enumAbi, strategies, 5); + const myEnum1 = new CairoTypeCustomEnum( + new CairoTuple([5, 6], '(core::integer::u64, core::integer::u128)', strategies), + enumAbi, + strategies, + 5 + ); + expect(myEnum0.toApiRequest()).toEqual(['5', '5', '6']); + expect(myEnum0.decompose(strategies)).toEqual( + new CairoCustomEnum({ Parents: { '0': 5n, '1': 6n } }) + ); + expect(myEnum1.toApiRequest()).toEqual(['5', '5', '6']); + expect(myEnum1.decompose(strategies)).toEqual( + new CairoCustomEnum({ Parents: { '0': 5n, '1': 6n } }) + ); + expect(() => new CairoTypeCustomEnum([5, 6], enumAbi, strategies)).toThrow( + new Error( + '"variant" parameter is mandatory when creating a new Cairo custom enum from a Cairo Enum or raw data.' + ) + ); + }); + + test('customEnumCairoType: enum of an option', () => { + const option0 = new CairoOption(CairoOptionVariant.Some, 5n); + const myTypeOption = new CairoTypeOption( + 5, + 'core::option::Option::', + strategies, + CairoOptionVariant.Some + ); + const myEnum0 = new CairoTypeCustomEnum(option0, enumAbi, strategies, 6); + const myEnum1 = new CairoTypeCustomEnum(myTypeOption, enumAbi, strategies, 6); + expect(myEnum0.toApiRequest()).toEqual(['6', '0', '5']); + expect(myEnum0.decompose(strategies)).toEqual(new CairoCustomEnum({ Damage: option0 })); + expect(myEnum1.toApiRequest()).toEqual(['6', '0', '5']); + expect(myEnum1.decompose(strategies)).toEqual(new CairoCustomEnum({ Damage: option0 })); + expect(() => new CairoTypeCustomEnum(option0, enumAbi, strategies)).toThrow( + new Error( + '"variant" parameter is mandatory when creating a new Cairo custom enum from a CairoOption.' + ) + ); + }); + + test('customEnumCairoType: enum of a result', () => { + const result0 = new CairoResult(CairoResultVariant.Ok, 5n); + const myTypeResult = new CairoTypeResult( + 5, + 'core::result::Result::', + strategies, + CairoResultVariant.Ok + ); + const myEnum0 = new CairoTypeCustomEnum(result0, enumAbi, strategies, 7); + const myEnum1 = new CairoTypeCustomEnum(myTypeResult, enumAbi, strategies, 7); + expect(myEnum0.toApiRequest()).toEqual(['7', '0', '5']); + expect(myEnum0.decompose(strategies)).toEqual(new CairoCustomEnum({ Report: result0 })); + expect(myEnum1.toApiRequest()).toEqual(['7', '0', '5']); + expect(myEnum1.decompose(strategies)).toEqual(new CairoCustomEnum({ Report: result0 })); + expect(() => new CairoTypeCustomEnum(result0, enumAbi, strategies)).toThrow( + new Error( + '"variant" parameter is mandatory when creating a new Cairo custom enum from a CairoResult.' + ) + ); + }); + + test('customEnumCairoType: enum of a struct', () => { + const struct0: Point = { x: 4, y: 5 }; + const myEnum0 = new CairoTypeCustomEnum(struct0, enumAbi, strategies, 1); + const myTypeStruct0 = new CairoStruct(struct0, pointAbi, strategies); + const myEnum1 = new CairoTypeCustomEnum(myEnum0, enumAbi, strategies); + const myEnum2 = new CairoTypeCustomEnum(myTypeStruct0, enumAbi, strategies, 1); + expect(myEnum1.toApiRequest()).toEqual(['1', '4', '5']); + expect(myEnum1.decompose(strategies)).toEqual( + new CairoCustomEnum({ LocationError: { x: 4n, y: 5n } }) + ); + expect(myEnum2.toApiRequest()).toEqual(['1', '4', '5']); + expect(myEnum2.decompose(strategies)).toEqual( + new CairoCustomEnum({ LocationError: { x: 4n, y: 5n } }) + ); + }); + + test('customEnumCairoType: nested enums', () => { + const enum0 = new CairoCustomEnum({ Success: cairo.tuple(10, 20) }); + const enum1 = new CairoCustomEnum({ Status: enum0 }); + const myEnum = new CairoTypeCustomEnum(enum1, enumAbi, strategies); + expect(myEnum.toApiRequest()).toEqual(['2', '0', '10', '20']); + const empty = { + Damage: undefined, + Empty: undefined, + ErrorList: undefined, + LocationError: undefined, + Parents: undefined, + Report: undefined, + Success: undefined, + TwoErrors: undefined, + }; + const empty2 = { Error: undefined, NoAnswer: undefined }; + const enRes2 = { Success: cairo.tuple(10n, 20n) }; + const res2 = new CairoCustomEnum({ ...empty2, ...enRes2 }); + const enRes = { Status: res2 }; + expect(myEnum.decompose(strategies)).toEqual(new CairoCustomEnum({ ...empty, ...enRes })); + }); + }); + + describe('static methods', () => { + test('is', () => { + expect(CairoTypeCustomEnum.is(200, 'enum::MyEnum', 0)).toBe(true); + }); + + test('isAbiType', () => { + expect(CairoTypeCustomEnum.isAbiType('enum::MyEnum')).toBe(true); + expect(CairoTypeCustomEnum.isAbiType('felt')).toBe(false); + }); + + test('validate', () => { + expect(() => CairoTypeCustomEnum.validate(200, 'enum::MyEnum', 0)).not.toThrow(); + expect(() => CairoTypeCustomEnum.validate(200, 'MyEnum', 0)).toThrow( + new Error('The type MyEnum is not a Cairo Enum. Needs impl::name.') + ); + }); + + test('getVariantTypes', () => { + expect(CairoTypeCustomEnum.extractEnumMembersNames(enumAbi)).toEqual([ + 'Success', + 'LocationError', + 'Status', + 'TwoErrors', + 'ErrorList', + 'Parents', + 'Damage', + 'Report', + 'Empty', + ]); + }); + }); + + describe('copy constructor behavior', () => { + test('should copy properties when constructed from another Cairo Result', () => { + const fakeAbi = abi.find((item) => item.name === 'enums::StatusEnum') as AbiEnum; + const original = new CairoTypeCustomEnum(10, enumAbi, strategies, 0); + + const copy = new CairoTypeCustomEnum(original, fakeAbi, (strategies as ParsingStrategy[])[0]); + expect(copy.content).toBe(original.content); + expect(copy.enumVariant).toBe(original.enumVariant); + expect(copy.abiEnum).toEqual(original.abiEnum); + }); + }); + + describe('encoding without Abi', () => { + test('number', () => { + expect(CallData.compile([new CairoTypeCustomEnum(7, enumAbi, strategies, 0)])).toEqual([ + '0', + '7', + ]); + + expect( + CallData.compile({ + input: new CairoTypeCustomEnum(7, enumAbi, strategies, CairoResultVariant.Ok), + }) + ).toEqual(['0', '7']); + }); + }); +}); diff --git a/__tests__/utils/calldata/enum/CairoTypeOption.test.ts b/__tests__/utils/calldata/enum/CairoTypeOption.test.ts new file mode 100644 index 000000000..836ff6525 --- /dev/null +++ b/__tests__/utils/calldata/enum/CairoTypeOption.test.ts @@ -0,0 +1,440 @@ +import { + CairoOptionVariant, + CairoTypeOption, + CairoUint8, + hdParsingStrategy, + type BigNumberish, + CairoOption, + CairoArray, + CallData, + CairoTypeResult, + CairoResultVariant, + CairoResult, + type AbiStruct, + type ParsingStrategy, + CairoStruct, + type AbiEnum, + CairoTypeCustomEnum, + CairoCustomEnum, +} from '../../../../src'; +import { contracts } from '../../../config/fixtures'; + +describe('CairoTypeOption', () => { + describe('constructor variant', () => { + const val = 8; + const typeCairo = 'core::option::Option::'; + const iter = ['0', '100'][Symbol.iterator](); + + test('should set "Some" if variant is 0', () => { + const cairoTypeOption0 = new CairoTypeOption( + val, + typeCairo, + hdParsingStrategy, + CairoOptionVariant.Some + ); + expect(cairoTypeOption0.isVariantSome).toBe(true); + expect(cairoTypeOption0.content).toEqual(new CairoUint8(8)); + expect(cairoTypeOption0.optionCairoType).toBe(typeCairo); + }); + + test('should set "None" if variant is 1', () => { + const cairoTypeOption = new CairoTypeOption( + undefined, + typeCairo, + hdParsingStrategy, + CairoOptionVariant.None + ); + expect(cairoTypeOption.isVariantSome).toBe(false); + expect(cairoTypeOption.content).toBeUndefined(); + expect(cairoTypeOption.optionCairoType).toBe(typeCairo); + }); + + test('should throw an error if wrong variant is provided', () => { + expect(() => new CairoTypeOption(undefined, typeCairo, hdParsingStrategy, 3)).toThrow( + new Error('In Cairo option, only 0 or 1 variants are authorized.') + ); + }); + + test('should throw an error if content is undefined in a Some option', () => { + expect( + () => new CairoTypeOption(undefined, typeCairo, hdParsingStrategy, CairoOptionVariant.Some) + ).toThrow(new Error('"content" parameter has to be defined when Some variant is selected')); + }); + + test('should throw an error if content is defined in a None option', () => { + expect( + () => new CairoTypeOption(val, typeCairo, hdParsingStrategy, CairoOptionVariant.None) + ).toThrow( + new Error('"content" parameter has to be NOT defined when None variant is selected') + ); + }); + + test('if content is an iterator, no variant is authorized', () => { + expect( + () => new CairoTypeOption(iter, typeCairo, hdParsingStrategy, CairoOptionVariant.None) + ).toThrow( + new Error('"content" parameter has to be NOT defined when None variant is selected') + ); + }); + }); + + describe('constructor content', () => { + const val = 8n; + const typeCairo = 'core::option::Option::'; + const iter = ['0', '100'][Symbol.iterator](); + + test('content is a CairoOption', () => { + const myCairoOption = new CairoOption(CairoOptionVariant.Some, val); + const cairoTypeOption0 = new CairoTypeOption( + myCairoOption, + typeCairo, + hdParsingStrategy, + CairoOptionVariant.Some + ); + expect(cairoTypeOption0.isVariantSome).toBe(true); + expect(cairoTypeOption0.content).toEqual(new CairoUint8(8)); + expect(cairoTypeOption0.optionCairoType).toBe(typeCairo); + }); + + test('content is a CairoTypeOption', () => { + const cairoTypeOption0 = new CairoTypeOption( + '0x0a', + typeCairo, + hdParsingStrategy, + CairoOptionVariant.Some + ); + const cairoTypeOption1 = new CairoTypeOption( + cairoTypeOption0, + typeCairo, + hdParsingStrategy, + CairoOptionVariant.Some + ); + expect(cairoTypeOption1.isVariantSome).toBe(true); + expect(cairoTypeOption1.content).toEqual(new CairoUint8(10)); + expect(cairoTypeOption1.optionCairoType).toBe(typeCairo); + }); + + test('content is an iterator', () => { + const cairoTypeOption0 = new CairoTypeOption(iter, typeCairo, hdParsingStrategy); + expect(cairoTypeOption0.isVariantSome).toBe(true); + expect(cairoTypeOption0.content).toEqual(new CairoUint8(100)); + expect(cairoTypeOption0.optionCairoType).toBe(typeCairo); + }); + }); + + describe('constructor optionCairoType', () => { + test('proper start of string', () => { + expect( + () => + new CairoTypeOption(undefined, 'cairo::wrong', hdParsingStrategy, CairoOptionVariant.None) + ).toThrow( + new Error( + 'The type cairo::wrong is not a Cairo option. Needs core::option::Option::.' + ) + ); + }); + + test('optionCairoType: option of an array', () => { + const myOption = new CairoTypeOption( + [1, 2, 3], + 'core::option::Option::>', + hdParsingStrategy, + CairoOptionVariant.Some + ); + expect(myOption.toApiRequest()).toEqual(['0', '3', '1', '2', '3']); + expect(myOption.decompose(hdParsingStrategy)).toEqual( + new CairoOption>(CairoOptionVariant.Some, [1n, 2n, 3n]) + ); + }); + + test('optionCairoType: option of a fixed array', () => { + const myOption = new CairoTypeOption( + [1, 2, 3], + 'core::option::Option::<[core::integer::u8; 3]>', + hdParsingStrategy, + CairoOptionVariant.Some + ); + expect(myOption.toApiRequest()).toEqual(['0', '1', '2', '3']); + expect(myOption.decompose(hdParsingStrategy)).toEqual( + new CairoOption>(CairoOptionVariant.Some, [1n, 2n, 3n]) + ); + }); + + test('optionCairoType: option of a tuple', () => { + const myOption = new CairoTypeOption( + [5, 6], + 'core::option::Option::<(core::integer::u8, core::integer::u16)>', + hdParsingStrategy, + CairoOptionVariant.Some + ); + expect(myOption.toApiRequest()).toEqual(['0', '5', '6']); + expect(myOption.decompose(hdParsingStrategy)).toEqual( + new CairoOption(CairoOptionVariant.Some, { '0': 5n, '1': 6n }) + ); + }); + + test('optionCairoType: option of a result', () => { + const myResult = new CairoResult(CairoResultVariant.Ok, 6n); + const myOption0 = new CairoTypeOption( + myResult, + 'core::option::Option::>', + hdParsingStrategy, + CairoOptionVariant.Some + ); + const myOption1 = new CairoTypeOption( + new CairoTypeResult( + 6, + 'core::result::Result::', + hdParsingStrategy, + CairoResultVariant.Ok + ), + 'core::option::Option::>', + hdParsingStrategy, + CairoOptionVariant.Some + ); + expect(myOption0.toApiRequest()).toEqual(['0', '0', '6']); + expect(myOption0.decompose(hdParsingStrategy)).toEqual( + new CairoOption>(CairoOptionVariant.Some, myResult) + ); + expect(myOption1.toApiRequest()).toEqual(['0', '0', '6']); + expect(myOption1.decompose(hdParsingStrategy)).toEqual( + new CairoOption>(CairoOptionVariant.Some, myResult) + ); + }); + + test('optionCairoType: option of a struct', () => { + type Point = { x: BigNumberish; y: BigNumberish }; + const struct0: Point = { x: 4, y: 5 }; + const abiPoint: AbiStruct = contracts.TestCairoType.sierra.abi.find( + (item) => item.name === 'enums::Point' + ); + const myCallData = new CallData(contracts.TestCairoType.sierra.abi); + const strategies = myCallData.parser.parsingStrategies as ParsingStrategy[]; + const myTypeStruct0 = new CairoStruct(struct0, abiPoint, strategies); + const myOption0 = new CairoTypeOption( + struct0, + 'core::option::Option::', + strategies, + CairoOptionVariant.Some + ); + const myOption1 = new CairoTypeOption( + myTypeStruct0, + 'core::option::Option::', + strategies, + CairoOptionVariant.Some + ); + expect(myOption0.toApiRequest()).toEqual(['0', '4', '5']); + expect(myOption0.decompose(strategies)).toEqual( + new CairoOption(CairoOptionVariant.Some, { x: 4n, y: 5n }) + ); + expect(myOption1.toApiRequest()).toEqual(['0', '4', '5']); + expect(myOption1.decompose(strategies)).toEqual( + new CairoOption(CairoOptionVariant.Some, { x: 4n, y: 5n }) + ); + }); + + test('optionCairoType: option of an enum', () => { + const abiEnum: AbiEnum = contracts.TestCairoType.sierra.abi.find( + (item) => item.name === 'enums::MyEnum' + ); + const myCallData = new CallData(contracts.TestCairoType.sierra.abi); + const strategies = myCallData.parser.parsingStrategies as ParsingStrategy[]; + const myEnum0 = new CairoCustomEnum({ Success: 5 }); + const myTypeEnum0 = new CairoTypeCustomEnum(myEnum0, abiEnum, strategies); + const myOption0 = new CairoTypeOption( + myEnum0, + 'core::option::Option::', + strategies, + CairoOptionVariant.Some + ); + const myOption1 = new CairoTypeOption( + myTypeEnum0, + 'core::option::Option::', + strategies, + CairoOptionVariant.Some + ); + expect(myOption0.toApiRequest()).toEqual(['0', '0', '5']); + const empty = { + Damage: undefined, + Empty: undefined, + ErrorList: undefined, + LocationError: undefined, + Parents: undefined, + Report: undefined, + Status: undefined, + Success: undefined, + TwoErrors: undefined, + }; + const enRes = { Success: 5n }; + expect(myOption0.decompose(strategies)).toEqual( + new CairoOption( + CairoOptionVariant.Some, + new CairoCustomEnum({ ...empty, ...enRes }) + ) + ); + expect(myOption1.toApiRequest()).toEqual(['0', '0', '5']); + expect(myOption1.decompose(strategies)).toEqual( + new CairoOption( + CairoOptionVariant.Some, + new CairoCustomEnum({ ...empty, ...enRes }) + ) + ); + }); + + test('optionCairoType: nested options', () => { + const option0 = new CairoOption(CairoOptionVariant.Some, 5n); + const option1 = new CairoOption>(CairoOptionVariant.Some, option0); + const option2 = new CairoOption>>( + CairoOptionVariant.Some, + option1 + ); + const myOption = new CairoTypeOption( + option2, + 'core::option::Option::>>', + hdParsingStrategy, + CairoOptionVariant.Some + ); + expect(myOption.toApiRequest()).toEqual(['0', '0', '0', '5']); + expect(myOption.decompose(hdParsingStrategy)).toEqual(option2); + }); + + test('optionCairoType: option of a CairoType', () => { + const myArray = new CairoArray( + [7, 8], + 'core::array::Array::', + hdParsingStrategy + ); + const myOption = new CairoTypeOption( + myArray, + 'core::option::Option::>', + hdParsingStrategy, + CairoOptionVariant.Some + ); + expect(myOption.toApiRequest()).toEqual(['0', '2', '7', '8']); + expect(myOption.decompose(hdParsingStrategy)).toEqual( + new CairoOption>(CairoOptionVariant.Some, [7n, 8n]) + ); + }); + }); + + describe('static methods', () => { + test('is', () => { + expect( + CairoTypeOption.is( + 200, + 'core::option::Option::', + CairoOptionVariant.Some + ) + ).toBe(true); + expect( + CairoTypeOption.is(200, 'core::error::', CairoOptionVariant.Some) + ).toBe(false); + }); + + test('isAbiType', () => { + expect(CairoTypeOption.isAbiType('core::option::Option::')).toBe(true); + expect(CairoTypeOption.isAbiType('core::wrong::')).toBe(false); + }); + + test('validate', () => { + expect(() => + CairoTypeOption.validate( + 200, + 'core::option::Option::', + CairoOptionVariant.Some + ) + ).not.toThrow(); + expect(() => + CairoTypeOption.validate(200, 'core::wrong::', CairoOptionVariant.Some) + ).toThrow( + new Error( + 'The type core::wrong:: is not a Cairo option. Needs core::option::Option::.' + ) + ); + expect(() => + CairoTypeOption.validate(200, 'core::option::Option::', 5) + ).toThrow(new Error('In Cairo option, only 0 or 1 variants are authorized.')); + }); + + test('getVariantSomeType', () => { + expect(CairoTypeOption.getVariantSomeType('core::option::Option::')).toBe( + 'core::integer::u16' + ); + expect(() => + CairoTypeOption.getVariantSomeType('core::option::Option::core::integer::u16>') + ).toThrow( + new Error( + 'ABI type core::option::Option::core::integer::u16> do not includes a valid type of data.' + ) + ); + }); + }); + describe('copy constructor behavior', () => { + test('should copy properties when constructed from another Cairo option', () => { + const original = new CairoTypeOption( + 10, + 'core::option::Option::', + hdParsingStrategy, + CairoOptionVariant.Some + ); + + const copy = new CairoTypeOption( + original, + 'core::option::Option::', + hdParsingStrategy + ); + expect(copy.content).toBe(original.content); + expect(copy.isVariantSome).toBe(original.isVariantSome); + expect(copy.optionCairoType).toBe(original.optionCairoType); + expect(copy.optionCairoType).toBe('core::option::Option::'); + }); + }); + + describe('encoding without Abi', () => { + test('number', () => { + expect( + CallData.compile([ + new CairoTypeOption( + 7, + 'core::option::Option::', + hdParsingStrategy, + CairoOptionVariant.Some + ), + ]) + ).toEqual(['0', '7']); + + expect( + CallData.compile([ + new CairoTypeOption( + undefined, + 'core::option::Option::', + hdParsingStrategy, + CairoOptionVariant.None + ), + ]) + ).toEqual(['1']); + + expect( + CallData.compile({ + input: new CairoTypeOption( + 7, + 'core::option::Option::', + hdParsingStrategy, + CairoOptionVariant.Some + ), + }) + ).toEqual(['0', '7']); + + expect( + CallData.compile({ + input: new CairoTypeOption( + undefined, + 'core::option::Option::', + hdParsingStrategy, + CairoOptionVariant.None + ), + }) + ).toEqual(['1']); + }); + }); +}); diff --git a/__tests__/utils/calldata/enum/CairoTypeResult.test.ts b/__tests__/utils/calldata/enum/CairoTypeResult.test.ts new file mode 100644 index 000000000..c7fd80464 --- /dev/null +++ b/__tests__/utils/calldata/enum/CairoTypeResult.test.ts @@ -0,0 +1,536 @@ +import { + CairoOptionVariant, + CairoTypeOption, + CairoUint8, + hdParsingStrategy, + type BigNumberish, + CairoOption, + CairoArray, + CallData, + CairoTypeResult, + CairoResultVariant, + CairoUint16, + CairoResult, + CairoTuple, + CairoFixedArray, + type ParsingStrategy, + CairoStruct, + type AbiStruct, + CairoCustomEnum, + CairoTypeCustomEnum, + type AbiEnum, +} from '../../../../src'; +import { contracts } from '../../../config/fixtures'; + +describe('CairoTypeResult', () => { + describe('constructor variant', () => { + const val = 8; + const typeCairo = 'core::result::Result::'; + const iter = ['0', '100'][Symbol.iterator](); + + test('should set "Ok" if variant is 0', () => { + const cairoTypeResult0 = new CairoTypeResult( + val, + typeCairo, + hdParsingStrategy, + CairoResultVariant.Ok + ); + expect(cairoTypeResult0.isVariantOk).toBe(true); + expect(cairoTypeResult0.content).toEqual(new CairoUint8(8)); + expect(cairoTypeResult0.resultCairoType).toBe(typeCairo); + }); + + test('should set "Err" if variant is 1', () => { + const cairoTypeResult = new CairoTypeResult( + val, + typeCairo, + hdParsingStrategy, + CairoResultVariant.Err + ); + expect(cairoTypeResult.isVariantOk).toBe(false); + expect(cairoTypeResult.content).toEqual(new CairoUint16(8)); + expect(cairoTypeResult.resultCairoType).toBe(typeCairo); + }); + + test('should throw an error if wrong variant is provided', () => { + expect(() => new CairoTypeResult(val, typeCairo, hdParsingStrategy, 3)).toThrow( + new Error('In Cairo Result, only 0 or 1 variants are authorized.') + ); + }); + + test('should throw an error if content is undefined', () => { + expect( + () => new CairoTypeResult(undefined, typeCairo, hdParsingStrategy, CairoResultVariant.Ok) + ).toThrow(new Error('"content" parameter has to be defined.')); + expect( + () => new CairoTypeResult(null, typeCairo, hdParsingStrategy, CairoResultVariant.Ok) + ).toThrow(new Error('"content" parameter has to be defined.')); + }); + + test('accept array of parsing strategies', () => { + const customStrategy: ParsingStrategy = { + constructors: {}, + dynamicSelectors: {}, + response: {}, + }; + expect( + () => + new CairoTypeResult( + val, + typeCairo, + [hdParsingStrategy, customStrategy], + CairoResultVariant.Ok + ) + ).not.toThrow(); + }); + + test('if content is an iterator, no variant is authorized', () => { + expect( + () => new CairoTypeResult(iter, typeCairo, hdParsingStrategy, CairoResultVariant.Ok) + ).toThrow( + new Error('when "content" parameter is an iterator, do not define "variant" parameter.') + ); + }); + }); + + describe('constructor content', () => { + const val = 8n; + const typeCairo = 'core::result::Result::'; + + test('content is a CairoResult', () => { + const myCairoResult = new CairoResult(CairoResultVariant.Ok, val); + const cairoTypeResult0 = new CairoTypeResult(myCairoResult, typeCairo, hdParsingStrategy); + expect(cairoTypeResult0.isVariantOk).toBe(true); + expect(cairoTypeResult0.content).toEqual(new CairoUint8(8)); + expect(cairoTypeResult0.resultCairoType).toBe(typeCairo); + expect( + () => + new CairoTypeResult(myCairoResult, typeCairo, hdParsingStrategy, CairoResultVariant.Ok) + ).toThrow( + new Error( + 'when "content" parameter is a CairoResult and subType is false, do not define "variant" parameter.' + ) + ); + }); + + test('content is a CairoTypeResult', () => { + const cairoTypeResult0 = new CairoTypeResult( + '0x0a', + typeCairo, + hdParsingStrategy, + CairoResultVariant.Err + ); + const cairoTypeResult1 = new CairoTypeResult(cairoTypeResult0, typeCairo, hdParsingStrategy); + expect(cairoTypeResult1.isVariantOk).toBe(false); + expect(cairoTypeResult1.content).toEqual(new CairoUint16(10)); + expect(cairoTypeResult1.resultCairoType).toBe(typeCairo); + expect( + () => + new CairoTypeResult( + cairoTypeResult0, + typeCairo, + hdParsingStrategy, + CairoResultVariant.Err + ) + ).toThrow( + new Error( + 'when "content" parameter is a CairoTypeResult, do not define "variant" parameter.' + ) + ); + }); + + test('content is an iterator', () => { + const iter0 = ['0', '100'][Symbol.iterator](); + const cairoTypeResult0 = new CairoTypeResult(iter0, typeCairo, hdParsingStrategy); + expect(cairoTypeResult0.isVariantOk).toBe(true); + expect(cairoTypeResult0.content).toEqual(new CairoUint8(100)); + expect(cairoTypeResult0.resultCairoType).toBe(typeCairo); + const iter1 = ['1', '100', '2'][Symbol.iterator](); + const typeCairo1 = 'core::result::Result::'; + const cairoTypeResult1 = new CairoTypeResult(iter1, typeCairo1, hdParsingStrategy); + expect(cairoTypeResult1.toApiRequest()).toEqual(['1', '100', '2']); + }); + }); + + describe('constructor resultCairoType', () => { + test('proper start of string', () => { + expect( + () => new CairoTypeResult(8, 'cairo::wrong', hdParsingStrategy, CairoResultVariant.Err) + ).toThrow( + new Error( + 'The type cairo::wrong is not a Cairo Result. Needs core::result::Result::.' + ) + ); + }); + + test('resultCairoType: result of an array', () => { + const myResult0 = new CairoTypeResult( + [1, 2, 3], + 'core::result::Result::, core::integer::u16>', + hdParsingStrategy, + CairoResultVariant.Ok + ); + const myResult1 = new CairoTypeResult( + new CairoArray([1, 2, 3], 'core::array::Array::', hdParsingStrategy), + 'core::result::Result::, core::integer::u16>', + hdParsingStrategy, + CairoResultVariant.Ok + ); + expect(myResult0.toApiRequest()).toEqual(['0', '3', '1', '2', '3']); + expect(myResult0.decompose(hdParsingStrategy)).toEqual( + new CairoResult, bigint>(CairoResultVariant.Ok, [1n, 2n, 3n]) + ); + expect(myResult1.toApiRequest()).toEqual(['0', '3', '1', '2', '3']); + expect(myResult1.decompose(hdParsingStrategy)).toEqual( + new CairoResult, bigint>(CairoResultVariant.Ok, [1n, 2n, 3n]) + ); + expect( + () => + new CairoTypeResult( + [1, 2, 3], + 'core::result::Result::, core::integer::u16>', + hdParsingStrategy + ) + ).toThrow( + new Error( + '"variant" parameter is mandatory when creating a new Cairo Result from a Cairo Enum or raw data.' + ) + ); + }); + + test('resultCairoType: result of a fixed array', () => { + const myResult0 = new CairoTypeResult( + [1, 2, 3], + 'core::result::Result::', + hdParsingStrategy, + CairoResultVariant.Err + ); + const myResult1 = new CairoTypeResult( + new CairoFixedArray([1, 2, 3], '[core::integer::u8; 3]', hdParsingStrategy), + 'core::result::Result::', + hdParsingStrategy, + CairoResultVariant.Err + ); + expect(myResult0.toApiRequest()).toEqual(['1', '1', '2', '3']); + expect(myResult0.decompose(hdParsingStrategy)).toEqual( + new CairoResult>(CairoResultVariant.Err, [1n, 2n, 3n]) + ); + expect(myResult1.toApiRequest()).toEqual(['1', '1', '2', '3']); + expect(myResult1.decompose(hdParsingStrategy)).toEqual( + new CairoResult>(CairoResultVariant.Err, [1n, 2n, 3n]) + ); + expect( + () => + new CairoTypeResult( + [1, 2, 3], + 'core::result::Result::', + hdParsingStrategy + ) + ).toThrow( + new Error( + '"variant" parameter is mandatory when creating a new Cairo Result from a Cairo Enum or raw data.' + ) + ); + }); + + test('resultCairoType: result of a tuple', () => { + const myResult0 = new CairoTypeResult( + [5, 6], + 'core::result::Result::<(core::integer::u8, core::integer::u16), core::integer::u32>', + hdParsingStrategy, + CairoResultVariant.Ok + ); + const myResult1 = new CairoTypeResult( + new CairoTuple([5, 6], '(core::integer::u8, core::integer::u16)', hdParsingStrategy), + 'core::result::Result::<(core::integer::u8, core::integer::u16), core::integer::u32>', + hdParsingStrategy, + CairoResultVariant.Ok + ); + expect(myResult0.toApiRequest()).toEqual(['0', '5', '6']); + expect(myResult0.decompose(hdParsingStrategy)).toEqual( + new CairoResult(CairoResultVariant.Ok, { '0': 5n, '1': 6n }) + ); + expect(myResult1.toApiRequest()).toEqual(['0', '5', '6']); + expect(myResult1.decompose(hdParsingStrategy)).toEqual( + new CairoResult(CairoResultVariant.Ok, { '0': 5n, '1': 6n }) + ); + expect( + () => + new CairoTypeResult( + [5, 6], + 'core::result::Result::<(core::integer::u8, core::integer::u16), core::integer::u32>', + hdParsingStrategy + ) + ).toThrow( + new Error( + '"variant" parameter is mandatory when creating a new Cairo Result from a Cairo Enum or raw data.' + ) + ); + }); + + test('resultCairoType: result of an enum', () => { + const abiEnum: AbiEnum = contracts.TestCairoType.sierra.abi.find( + (item) => item.name === 'enums::MyEnum' + ); + const myCallData = new CallData(contracts.TestCairoType.sierra.abi); + const strategies = myCallData.parser.parsingStrategies as ParsingStrategy[]; + const enum0 = new CairoCustomEnum({ Success: 5n }); + const myTypeEnum = new CairoTypeCustomEnum(enum0, abiEnum, strategies); + const myResult0 = new CairoTypeResult( + enum0, + 'core::result::Result::', + strategies, + CairoResultVariant.Err + ); + const myResult1 = new CairoTypeResult( + myTypeEnum, + 'core::result::Result::', + strategies, + CairoResultVariant.Err + ); + expect(myResult0.toApiRequest()).toEqual(['1', '0', '5']); + expect(myResult0.decompose(strategies)).toEqual( + new CairoResult(CairoResultVariant.Err, enum0) + ); + expect(myResult1.toApiRequest()).toEqual(['1', '0', '5']); + expect(myResult1.decompose(strategies)).toEqual( + new CairoResult(CairoResultVariant.Err, enum0) + ); + expect( + () => + new CairoTypeResult( + enum0, + 'core::result::Result::>', + hdParsingStrategy + ) + ).toThrow( + new Error( + '"variant" parameter is mandatory when creating a new Cairo Result from a Cairo Enum or raw data.' + ) + ); + }); + + test('resultCairoType: result of an option', () => { + const option0 = new CairoOption(CairoOptionVariant.Some, 5n); + const myTypeOption = new CairoTypeOption( + 5, + 'core::option::Option::', + hdParsingStrategy, + CairoOptionVariant.Some + ); + const myResult0 = new CairoTypeResult( + option0, + 'core::result::Result::>', + hdParsingStrategy, + CairoResultVariant.Err + ); + const myResult1 = new CairoTypeResult( + myTypeOption, + 'core::result::Result::>', + hdParsingStrategy, + CairoResultVariant.Err + ); + expect(myResult0.toApiRequest()).toEqual(['1', '0', '5']); + expect(myResult0.decompose(hdParsingStrategy)).toEqual( + new CairoResult>(CairoResultVariant.Err, option0) + ); + expect(myResult1.toApiRequest()).toEqual(['1', '0', '5']); + expect(myResult1.decompose(hdParsingStrategy)).toEqual( + new CairoResult>(CairoResultVariant.Err, option0) + ); + expect( + () => + new CairoTypeResult( + option0, + 'core::result::Result::>', + hdParsingStrategy + ) + ).toThrow( + new Error( + '"variant" parameter is mandatory when creating a new Cairo Result from a Cairo Enum or raw data.' + ) + ); + }); + + test('resultCairoType: result of a struct', () => { + type Point = { x: BigNumberish; y: BigNumberish }; + const struct0: Point = { x: 4, y: 5 }; + const abiPoint: AbiStruct = contracts.TestCairoType.sierra.abi.find( + (item) => item.name === 'enums::Point' + ); + const myCallData = new CallData(contracts.TestCairoType.sierra.abi); + const strategies = myCallData.parser.parsingStrategies as ParsingStrategy[]; + const myTypeStruct0 = new CairoStruct(struct0, abiPoint, strategies); + const myResult0 = new CairoResult(CairoResultVariant.Err, struct0); + const myResult1 = new CairoTypeResult( + myResult0, + 'core::result::Result::', + strategies + ); + const myResult2 = new CairoTypeResult( + myTypeStruct0, + 'core::result::Result::', + strategies, + CairoResultVariant.Err + ); + expect(myResult1.toApiRequest()).toEqual(['1', '4', '5']); + expect(myResult1.decompose(strategies)).toEqual( + new CairoResult(CairoResultVariant.Err, { x: 4n, y: 5n }) + ); + expect(myResult2.toApiRequest()).toEqual(['1', '4', '5']); + expect(myResult2.decompose(strategies)).toEqual( + new CairoResult(CairoResultVariant.Err, { x: 4n, y: 5n }) + ); + }); + + test('resultCairoType: nested results', () => { + const result0 = new CairoResult(CairoResultVariant.Err, 5n); + const result1 = new CairoResult, BigNumberish>( + CairoResultVariant.Ok, + result0 + ); + const result2 = new CairoResult< + BigNumberish, + CairoResult, BigNumberish> + >(CairoResultVariant.Err, result1); + const myResult = new CairoTypeResult( + result2, + 'core::result::Result::, core::integer::u16>>', + hdParsingStrategy + ); + expect(myResult.toApiRequest()).toEqual(['1', '0', '1', '5']); + expect(myResult.decompose(hdParsingStrategy)).toEqual(result2); + }); + }); + + describe('static methods', () => { + test('is', () => { + expect( + CairoTypeResult.is( + 200, + 'core::result::Result::', + CairoResultVariant.Ok + ) + ).toBe(true); + expect( + CairoTypeResult.is(200, 'core::error::', CairoResultVariant.Err) + ).toBe(false); + }); + + test('isAbiType', () => { + expect( + CairoTypeResult.isAbiType('core::result::Result::') + ).toBe(true); + expect(CairoTypeResult.isAbiType('core::wrong::')).toBe(false); + }); + + test('validate', () => { + expect(() => + CairoTypeResult.validate( + 200, + 'core::result::Result::', + CairoResultVariant.Ok + ) + ).not.toThrow(); + expect(() => + CairoTypeResult.validate(200, 'core::wrong::', CairoResultVariant.Err) + ).toThrow( + new Error( + 'The type core::wrong:: is not a Cairo Result. Needs core::result::Result::.' + ) + ); + expect(() => + CairoTypeResult.validate( + 200, + 'core::result::Result::', + 5 + ) + ).toThrow(new Error('In Cairo Result, only 0 or 1 variants are authorized.')); + }); + + test('getVariantTypes', () => { + expect( + CairoTypeResult.getVariantTypes( + 'core::result::Result::' + ) + ).toEqual(['core::integer::u8', 'core::integer::u16']); + expect(() => + CairoTypeResult.getVariantTypes('core::result::Result::core::integer::u16>') + ).toThrow( + new Error( + 'ABI type core::result::Result::core::integer::u16> do not includes 2 types enclosed in <>.' + ) + ); + }); + }); + describe('copy constructor behavior', () => { + test('should copy properties when constructed from another Cairo Result', () => { + const original = new CairoTypeResult( + 10, + 'core::result::Result::', + hdParsingStrategy, + CairoResultVariant.Ok + ); + + const copy = new CairoTypeResult( + original, + 'core::result::Result::', + hdParsingStrategy + ); + expect(copy.content).toBe(original.content); + expect(copy.isVariantOk).toBe(original.isVariantOk); + expect(copy.resultCairoType).toBe(original.resultCairoType); + expect(copy.resultCairoType).toBe( + 'core::result::Result::' + ); + }); + }); + + describe('encoding without Abi', () => { + test('number', () => { + expect( + CallData.compile([ + new CairoTypeResult( + 7, + 'core::result::Result::', + hdParsingStrategy, + CairoResultVariant.Ok + ), + ]) + ).toEqual(['0', '7']); + + expect( + CallData.compile([ + new CairoTypeResult( + 7, + 'core::result::Result::', + hdParsingStrategy, + CairoResultVariant.Err + ), + ]) + ).toEqual(['1', '7']); + + expect( + CallData.compile({ + input: new CairoTypeResult( + 7, + 'core::result::Result::', + hdParsingStrategy, + CairoResultVariant.Ok + ), + }) + ).toEqual(['0', '7']); + + expect( + CallData.compile({ + input: new CairoTypeResult( + 7, + 'core::result::Result::', + hdParsingStrategy, + CairoResultVariant.Err + ), + }) + ).toEqual(['1', '7']); + }); + }); +}); diff --git a/__tests__/utils/calldata/parser/parser-0-1.1.0.test.ts b/__tests__/utils/calldata/parser/parser-0-1.1.0.test.ts index 5a33dfd8f..4a0bcd725 100644 --- a/__tests__/utils/calldata/parser/parser-0-1.1.0.test.ts +++ b/__tests__/utils/calldata/parser/parser-0-1.1.0.test.ts @@ -1,21 +1,22 @@ +import { hdParsingStrategy } from '../../../../src'; import { AbiParser1 } from '../../../../src/utils/calldata/parser/parser-0-1.1.0'; import { getFunctionAbi, getInterfaceAbi } from '../../../factories/abi'; describe('AbiParser1', () => { test('should create an instance', () => { - const abiParser = new AbiParser1([getFunctionAbi('struct')]); + const abiParser = new AbiParser1([getFunctionAbi('struct')], hdParsingStrategy); expect(abiParser instanceof AbiParser1).toEqual(true); expect(abiParser.abi).toStrictEqual([getFunctionAbi('struct')]); }); describe('methodInputsLength', () => { test('should return inputs length', () => { - const abiParser = new AbiParser1([getFunctionAbi('struct')]); + const abiParser = new AbiParser1([getFunctionAbi('struct')], hdParsingStrategy); expect(abiParser.methodInputsLength(getFunctionAbi('felt'))).toEqual(1); }); test('should return 0 if inputs are empty', () => { - const abiParser = new AbiParser1([getFunctionAbi('felt')]); + const abiParser = new AbiParser1([getFunctionAbi('felt')], hdParsingStrategy); const functionAbi = getFunctionAbi('felt'); functionAbi.inputs[0].name = 'test_len'; expect(abiParser.methodInputsLength(functionAbi)).toEqual(0); @@ -24,19 +25,25 @@ describe('AbiParser1', () => { describe('getMethod', () => { test('should return method definition from ABI', () => { - const abiParser = new AbiParser1([getFunctionAbi('struct'), getInterfaceAbi()]); + const abiParser = new AbiParser1( + [getFunctionAbi('struct'), getInterfaceAbi()], + hdParsingStrategy + ); expect(abiParser.getMethod('test')).toEqual(getFunctionAbi('struct')); }); test('should return undefined if method is not found', () => { - const abiParser = new AbiParser1([getFunctionAbi('struct')]); + const abiParser = new AbiParser1([getFunctionAbi('struct')], hdParsingStrategy); expect(abiParser.getMethod('struct')).toBeUndefined(); }); }); describe('getLegacyFormat', () => { test('should return method definition from ABI', () => { - const abiParser = new AbiParser1([getFunctionAbi('struct'), getInterfaceAbi()]); + const abiParser = new AbiParser1( + [getFunctionAbi('struct'), getInterfaceAbi()], + hdParsingStrategy + ); const legacyFormat = abiParser.getLegacyFormat(); expect(legacyFormat).toStrictEqual(abiParser.abi); }); diff --git a/__tests__/utils/calldata/parser/parser-2.0.0.test.ts b/__tests__/utils/calldata/parser/parser-2.0.0.test.ts index d49f0f5c8..64919d2fa 100644 --- a/__tests__/utils/calldata/parser/parser-2.0.0.test.ts +++ b/__tests__/utils/calldata/parser/parser-2.0.0.test.ts @@ -1,21 +1,22 @@ +import { hdParsingStrategy } from '../../../../src/utils/calldata'; import { AbiParser2 } from '../../../../src/utils/calldata/parser/parser-2.0.0'; import { getFunctionAbi, getInterfaceAbi } from '../../../factories/abi'; describe('AbiParser2', () => { test('should create an instance', () => { - const abiParser = new AbiParser2([getFunctionAbi('struct')]); + const abiParser = new AbiParser2([getFunctionAbi('struct')], hdParsingStrategy); expect(abiParser instanceof AbiParser2).toEqual(true); expect(abiParser.abi).toStrictEqual([getFunctionAbi('struct')]); }); describe('methodInputsLength', () => { test('should return inputs length', () => { - const abiParser = new AbiParser2([getFunctionAbi('struct')]); + const abiParser = new AbiParser2([getFunctionAbi('struct')], hdParsingStrategy); expect(abiParser.methodInputsLength(getFunctionAbi('test'))).toEqual(1); }); test('should return 0 if inputs are empty', () => { - const abiParser = new AbiParser2([getFunctionAbi('struct')]); + const abiParser = new AbiParser2([getFunctionAbi('struct')], hdParsingStrategy); const functionAbi = getFunctionAbi('test'); functionAbi.inputs = []; expect(abiParser.methodInputsLength(functionAbi)).toEqual(0); @@ -24,19 +25,25 @@ describe('AbiParser2', () => { describe('getMethod', () => { test('should return method definition from ABI', () => { - const abiParser = new AbiParser2([getFunctionAbi('struct'), getInterfaceAbi()]); + const abiParser = new AbiParser2( + [getFunctionAbi('struct'), getInterfaceAbi()], + hdParsingStrategy + ); expect(abiParser.getMethod('test')).toEqual(getFunctionAbi('struct')); }); test('should return undefined if method is not found', () => { - const abiParser = new AbiParser2([getFunctionAbi('struct')]); + const abiParser = new AbiParser2([getFunctionAbi('struct')], hdParsingStrategy); expect(abiParser.getMethod('test')).toBeUndefined(); }); }); describe('getLegacyFormat', () => { test('should return method definition from ABI', () => { - const abiParser = new AbiParser2([getFunctionAbi('struct'), getInterfaceAbi()]); + const abiParser = new AbiParser2( + [getFunctionAbi('struct'), getInterfaceAbi()], + hdParsingStrategy + ); const legacyFormat = abiParser.getLegacyFormat(); const result = [getFunctionAbi('struct'), getFunctionAbi('struct')]; expect(legacyFormat).toEqual(result); diff --git a/__tests__/utils/calldata/requestParser.test.ts b/__tests__/utils/calldata/requestParser.test.ts deleted file mode 100644 index 76b12bcaf..000000000 --- a/__tests__/utils/calldata/requestParser.test.ts +++ /dev/null @@ -1,297 +0,0 @@ -import { parseCalldataField } from '../../../src/utils/calldata/requestParser'; -import { getAbiEnums, getAbiStructs, getAbiEntry } from '../../factories/abi'; -import { - AbiParser1, - CairoCustomEnum, - CairoOption, - CairoResult, - ETH_ADDRESS, - NON_ZERO_PREFIX, -} from '../../../src'; - -describe('requestParser', () => { - describe('parseCalldataField', () => { - test('should return parsed calldata field for base type', () => { - const args = [256n, 128n]; - const argsIterator = args[Symbol.iterator](); - const parsedField = parseCalldataField({ - argsIterator, - input: getAbiEntry('felt'), - structs: getAbiStructs(), - enums: getAbiEnums(), - parser: new AbiParser1([getAbiEntry('felt')]), - }); - expect(parsedField).toEqual('256'); - }); - - test('should return parsed calldata field for Array type', () => { - const args = [[256n, 128n]]; - const argsIterator = args[Symbol.iterator](); - const parsedField = parseCalldataField({ - argsIterator, - input: getAbiEntry('core::array::Array::'), - structs: getAbiStructs(), - enums: getAbiEnums(), - parser: new AbiParser1([getAbiEntry('core::array::Array::')]), - }); - expect(parsedField).toEqual(['2', '256', '128']); - }); - - test('should return parsed calldata field for Array type(string input)', () => { - const args = ['some_test_value']; - const argsIterator = args[Symbol.iterator](); - const parsedField = parseCalldataField({ - argsIterator, - input: getAbiEntry('core::array::Array::'), - structs: getAbiStructs(), - enums: getAbiEnums(), - parser: new AbiParser1([getAbiEntry('core::array::Array::')]), - }); - expect(parsedField).toEqual(['1', '599374153440608178282648329058547045']); - }); - - test('should return parsed calldata field for NonZero type', () => { - const args = [true]; - const argsIterator = args[Symbol.iterator](); - const parsedField = parseCalldataField({ - argsIterator, - input: getAbiEntry(`${NON_ZERO_PREFIX}core::bool`), - structs: getAbiStructs(), - enums: getAbiEnums(), - parser: new AbiParser1([getAbiEntry(`${NON_ZERO_PREFIX}core::bool`)]), - }); - expect(parsedField).toEqual('1'); - }); - - test('should return parsed calldata field for EthAddress type', () => { - const args = ['test']; - const argsIterator = args[Symbol.iterator](); - const parsedField = parseCalldataField({ - argsIterator, - input: getAbiEntry(`${ETH_ADDRESS}felt`), - structs: getAbiStructs(), - enums: getAbiEnums(), - parser: new AbiParser1([getAbiEntry(`${ETH_ADDRESS}felt`)]), - }); - expect(parsedField).toEqual('1952805748'); - }); - - test('should return parsed calldata field for Struct type', () => { - const args = [{ test_name: 'test' }]; - const argsIterator = args[Symbol.iterator](); - const parsedField = parseCalldataField({ - argsIterator, - input: getAbiEntry('struct'), - structs: getAbiStructs(), - enums: getAbiEnums(), - parser: new AbiParser1([getAbiEntry('struct')]), - }); - expect(parsedField).toEqual(['1952805748']); - }); - - test('should return parsed calldata field for Tuple type', () => { - const args = [{ min: true, max: true }]; - const argsIterator = args[Symbol.iterator](); - const parsedField = parseCalldataField({ - argsIterator, - input: getAbiEntry('(core::bool, core::bool)'), - structs: getAbiStructs(), - enums: getAbiEnums(), - parser: new AbiParser1([getAbiEntry('(core::bool, core::bool)')]), - }); - expect(parsedField).toEqual(['1', '1']); - }); - - test('should return parsed calldata field for CairoUint256 abi type', () => { - const args = [252n]; - const argsIterator = args[Symbol.iterator](); - const parsedField = parseCalldataField({ - argsIterator, - input: getAbiEntry('core::integer::u256'), - structs: getAbiStructs(), - enums: getAbiEnums(), - parser: new AbiParser1([getAbiEntry('core::integer::u256')]), - }); - expect(parsedField).toEqual(['252', '0']); - }); - - test('should return parsed calldata field for Enum Option type None', () => { - const args = [new CairoOption(1, 'content')]; - const argsIterator = args[Symbol.iterator](); - const parsedField = parseCalldataField({ - argsIterator, - input: getAbiEntry('core::option::Option::core::bool'), - structs: getAbiStructs(), - enums: { 'core::option::Option::core::bool': getAbiEnums().enum }, - parser: new AbiParser1([getAbiEntry('core::option::Option::core::bool')]), - }); - expect(parsedField).toEqual('1'); - }); - - test('should return parsed calldata field for Enum Option type Some', () => { - const args = [new CairoOption(0, 'content')]; - const argsIterator = args[Symbol.iterator](); - const abiEnum = getAbiEnums().enum; - abiEnum.variants.push({ - name: 'Some', - type: 'cairo_struct_variant', - offset: 1, - }); - const parsedField = parseCalldataField({ - argsIterator, - input: getAbiEntry('core::option::Option::core::bool'), - structs: getAbiStructs(), - enums: { 'core::option::Option::core::bool': abiEnum }, - parser: new AbiParser1([getAbiEntry('core::option::Option::core::bool')]), - }); - expect(parsedField).toEqual(['0', '27988542884245108']); - }); - - test('should throw an error for Enum Option has no "Some" variant', () => { - const args = [new CairoOption(0, 'content')]; - const argsIterator = args[Symbol.iterator](); - expect(() => - parseCalldataField({ - argsIterator, - input: getAbiEntry('core::option::Option::core::bool'), - structs: getAbiStructs(), - enums: { 'core::option::Option::core::bool': getAbiEnums().enum }, - parser: new AbiParser1([getAbiEntry('core::option::Option::core::bool')]), - }) - ).toThrow(new Error(`Error in abi : Option has no 'Some' variant.`)); - }); - - test('should return parsed calldata field for Enum Result type Ok', () => { - const args = [new CairoResult(0, 'Ok')]; - const argsIterator = args[Symbol.iterator](); - const abiEnum = getAbiEnums().enum; - abiEnum.variants.push({ - name: 'Ok', - type: 'cairo_struct_variant', - offset: 1, - }); - const parsedField = parseCalldataField({ - argsIterator, - input: getAbiEntry('core::result::Result::core::bool'), - structs: getAbiStructs(), - enums: { 'core::result::Result::core::bool': abiEnum }, - parser: new AbiParser1([getAbiEntry('core::result::Result::core::bool')]), - }); - expect(parsedField).toEqual(['0', '20331']); - }); - - test('should throw an error for Enum Result has no "Ok" variant', () => { - const args = [new CairoResult(0, 'Ok')]; - const argsIterator = args[Symbol.iterator](); - expect(() => - parseCalldataField({ - argsIterator, - input: getAbiEntry('core::result::Result::core::bool'), - structs: getAbiStructs(), - enums: { 'core::result::Result::core::bool': getAbiEnums().enum }, - parser: new AbiParser1([getAbiEntry('core::result::Result::core::bool')]), - }) - ).toThrow(new Error(`Error in abi : Result has no 'Ok' variant.`)); - }); - - test('should return parsed calldata field for Custom Enum type', () => { - const activeVariantName = 'custom_enum'; - const args = [new CairoCustomEnum({ [activeVariantName]: 'content' })]; - const argsIterator = args[Symbol.iterator](); - const abiEnum = getAbiEnums().enum; - abiEnum.variants.push({ - name: activeVariantName, - type: 'cairo_struct_variant', - offset: 1, - }); - const parsedField = parseCalldataField({ - argsIterator, - input: getAbiEntry('enum'), - structs: getAbiStructs(), - enums: { enum: abiEnum }, - parser: new AbiParser1([getAbiEntry('enum')]), - }); - expect(parsedField).toEqual(['1', '27988542884245108']); - }); - - test('should throw an error for Custon Enum type when there is not active variant', () => { - const args = [new CairoCustomEnum({ test: 'content' })]; - const argsIterator = args[Symbol.iterator](); - expect(() => - parseCalldataField({ - argsIterator, - input: getAbiEntry('enum'), - structs: getAbiStructs(), - enums: getAbiEnums(), - parser: new AbiParser1([getAbiEntry('enum')]), - }) - ).toThrow(new Error(`Not find in abi : Enum has no 'test' variant.`)); - }); - - test('should throw an error for CairoUint256 abi type when wrong arg is provided', () => { - const args = ['test']; - const argsIterator = args[Symbol.iterator](); - expect(() => - parseCalldataField({ - argsIterator, - input: getAbiEntry('core::integer::u256'), - structs: getAbiStructs(), - enums: getAbiEnums(), - parser: new AbiParser1([getAbiEntry('core::integer::u256')]), - }) - ).toThrow( - new Error( - "Unsupported data type 'string' for u256. Expected string, number, bigint, or Uint256 object" - ) - ); - }); - - test('should throw an error if provided tuple size do not match', () => { - const args = [{ min: true }, { max: true }]; - const argsIterator = args[Symbol.iterator](); - expect(() => - parseCalldataField({ - argsIterator, - input: getAbiEntry('(core::bool, core::bool)'), - structs: getAbiStructs(), - enums: getAbiEnums(), - parser: new AbiParser1([getAbiEntry('(core::bool, core::bool)')]), - }) - ).toThrow( - new Error( - `ParseTuple: provided and expected abi tuple size do not match. - provided: true - expected: core::bool,core::bool` - ) - ); - }); - - test('should throw an error if there is missing parameter for type Struct', () => { - const args = ['test']; - const argsIterator = args[Symbol.iterator](); - expect(() => - parseCalldataField({ - argsIterator, - input: getAbiEntry('struct'), - structs: getAbiStructs(), - enums: getAbiEnums(), - parser: new AbiParser1([getAbiEntry('struct')]), - }) - ).toThrow(new Error('Missing parameter for type test_type')); - }); - - test('should throw an error if args for array type are not valid', () => { - const args = [256n, 128n]; - const argsIterator = args[Symbol.iterator](); - expect(() => - parseCalldataField({ - argsIterator, - input: getAbiEntry('core::array::Array::'), - structs: getAbiStructs(), - enums: getAbiEnums(), - parser: new AbiParser1([getAbiEntry('core::array::Array::')]), - }) - ).toThrow(new Error('ABI expected parameter test to be array or long string, got 256')); - }); - }); -}); diff --git a/__tests__/utils/calldata/validate.test.ts b/__tests__/utils/calldata/validate.test.ts deleted file mode 100644 index ef86d190c..000000000 --- a/__tests__/utils/calldata/validate.test.ts +++ /dev/null @@ -1,676 +0,0 @@ -import validateFields from '../../../src/utils/calldata/validate'; -import { - CairoOption, - CairoResult, - ETH_ADDRESS, - Literal, - NON_ZERO_PREFIX, - Uint, -} from '../../../src'; -import { getFunctionAbi, getAbiEnums, getAbiStructs } from '../../factories/abi'; - -describe('validateFields', () => { - test('should throw an error if validation is unhandled', () => { - expect(() => { - validateFields(getFunctionAbi('test_test'), [true], getAbiStructs(), getAbiEnums()); - }).toThrow(new Error('Validate Unhandled: argument test, type test_test, value true')); - }); - - describe('felt validation', () => { - test('should return void if felt validation passes', () => { - const result = validateFields( - getFunctionAbi('felt'), - ['test'], - getAbiStructs(), - getAbiEnums() - ); - expect(result).toBeUndefined(); - }); - - test('should throw an error if felt is not the type of string, number or big int', () => { - const validateFelt = (params: unknown[]) => - validateFields(getFunctionAbi('felt'), params, getAbiStructs(), getAbiEnums()); - - const error = new Error( - 'Validate: arg test should be a felt typed as (String, Number or BigInt)' - ); - expect(() => validateFelt([{}])).toThrow(error); - expect(() => validateFelt([new Map()])).toThrow(error); - expect(() => validateFelt([true])).toThrow(error); - expect(() => validateFelt([])).toThrow(error); - expect(() => validateFelt([Symbol('test')])).toThrow(error); - }); - - test('should throw an error if felt is not in the range', () => { - const validateFelt = (params: unknown[]) => - validateFields(getFunctionAbi('felt'), params, getAbiStructs(), getAbiEnums()); - - const error = new Error( - 'Validate: arg test cairo typed felt should be in range [0, 2^252-1]' - ); - expect(() => validateFelt([-1])).toThrow(error); - expect(() => validateFelt([2n ** 252n])).toThrow(error); - }); - }); - - describe('bytes31 validation', () => { - test('should return void if bytes31 validation passes', () => { - const result = validateFields( - getFunctionAbi('core::bytes_31::bytes31'), - ['test'], - getAbiStructs(), - getAbiEnums() - ); - expect(result).toBeUndefined(); - }); - }); - - describe('Uint validation', () => { - test('should return void if Uint "u8" validation passes', () => { - const result = validateFields( - getFunctionAbi(Uint.u8), - [255n], - getAbiStructs(), - getAbiEnums() - ); - expect(result).toBeUndefined(); - }); - - test('should return void if Uint "u16" validation passes', () => { - const result = validateFields( - getFunctionAbi(Uint.u16), - [65535n], - getAbiStructs(), - getAbiEnums() - ); - expect(result).toBeUndefined(); - }); - - test('should return void if Uint "u32" validation passes', () => { - const result = validateFields( - getFunctionAbi(Uint.u32), - [4294967295n], - getAbiStructs(), - getAbiEnums() - ); - expect(result).toBeUndefined(); - }); - - test('should return void if Uint "u64" validation passes', () => { - const result = validateFields( - getFunctionAbi(Uint.u64), - [2n ** 64n - 1n], - getAbiStructs(), - getAbiEnums() - ); - expect(result).toBeUndefined(); - }); - - test('should return void if Uint "u128" validation passes', () => { - const result = validateFields( - getFunctionAbi(Uint.u128), - [2n ** 128n - 1n], - getAbiStructs(), - getAbiEnums() - ); - expect(result).toBeUndefined(); - }); - - test('should return void if Uint "u256" validation passes', () => { - const result = validateFields( - getFunctionAbi(Uint.u256), - [2n ** 256n - 1n], - getAbiStructs(), - getAbiEnums() - ); - expect(result).toBeUndefined(); - }); - - test('should return void if Uint "u512" validation passes', () => { - const result = validateFields( - getFunctionAbi(Uint.u512), - [2n ** 512n - 1n], - getAbiStructs(), - getAbiEnums() - ); - expect(result).toBeUndefined(); - }); - - test('should throw an error if parameter is too large', () => { - const validateUint = (params: unknown[]) => - validateFields(getFunctionAbi(Uint.u8), params, getAbiStructs(), getAbiEnums()); - - const error = new Error( - 'Validation: Parameter is too large to be typed as Number use (BigInt or String)' - ); - - expect(() => validateUint([Number.MAX_SAFE_INTEGER + 1])).toThrow(error); - }); - - test('should throw an error if parameter type is not valid', () => { - const validateUint = (params: unknown[]) => - validateFields(getFunctionAbi(Uint.u8), params, getAbiStructs(), getAbiEnums()); - - const getError = (param: any) => - new Error( - `Validate: arg test of cairo type ${Uint.u8} should be type (String, Number or BigInt), but is ${typeof param} ${param}.` - ); - - expect(() => validateUint([new Map()])).toThrow(getError(new Map())); - expect(() => validateUint([true])).toThrow(getError(true)); - expect(() => validateUint([{ test: 'test' }])).toThrow(getError({ test: 'test' })); - }); - - test('should throw an error if Uint "u8" is not in range', () => { - const validateUint = (params: unknown[]) => - validateFields(getFunctionAbi(Uint.u8), params, getAbiStructs(), getAbiEnums()); - - const error = new Error( - `Validate: arg test cairo typed ${Uint.u8} should be in range [0 - 255]` - ); - - expect(() => validateUint([-1])).toThrow(error); - expect(() => validateUint([256n])).toThrow(error); - }); - - test('should throw an error if Uint "u16" is not in range', () => { - const validateUint = (params: unknown[]) => - validateFields(getFunctionAbi(Uint.u16), params, getAbiStructs(), getAbiEnums()); - - const error = new Error( - `Validate: arg test cairo typed ${Uint.u16} should be in range [0, 65535]` - ); - - expect(() => validateUint([65536n])).toThrow(error); - }); - - test('should throw an error if Uint "u32" is not in range', () => { - const validateUint = (params: unknown[]) => - validateFields(getFunctionAbi(Uint.u32), params, getAbiStructs(), getAbiEnums()); - - const error = new Error( - `Validate: arg test cairo typed ${Uint.u32} should be in range [0, 4294967295]` - ); - - expect(() => validateUint([4294967296n])).toThrow(error); - }); - - test('should throw an error if Uint "u64" is not in range', () => { - const validateUint = (params: unknown[]) => - validateFields(getFunctionAbi(Uint.u64), params, getAbiStructs(), getAbiEnums()); - - const error = new Error( - `Validate: arg test cairo typed ${Uint.u64} should be in range [0, 2^64-1]` - ); - - expect(() => validateUint([2n ** 64n])).toThrow(error); - }); - - test('should throw an error if Uint "u128" is not in range', () => { - const validateUint = (params: unknown[]) => - validateFields(getFunctionAbi(Uint.u128), params, getAbiStructs(), getAbiEnums()); - - const error = new Error( - `Validate: arg test cairo typed ${Uint.u128} should be in range [0, 2^128-1]` - ); - - expect(() => validateUint([2n ** 128n])).toThrow(error); - }); - - test('should throw an error if Uint "u256" is not in range', () => { - const validateUint = (params: unknown[]) => - validateFields(getFunctionAbi(Uint.u256), params, getAbiStructs(), getAbiEnums()); - - const error = new Error('bigNumberish is bigger than UINT_256_MAX'); - - expect(() => validateUint([2n ** 256n])).toThrow(error); - }); - - test('should throw an error if Uint "u512" is not in range', () => { - const validateUint = (params: unknown[]) => - validateFields(getFunctionAbi(Uint.u512), params, getAbiStructs(), getAbiEnums()); - - const error = new Error('bigNumberish is bigger than UINT_512_MAX.'); - - expect(() => validateUint([2n ** 512n])).toThrow(error); - }); - - test('should throw an error if "Literal.ClassHash" is not in range', () => { - const validateUint = (params: unknown[]) => - validateFields(getFunctionAbi(Literal.ClassHash), params, getAbiStructs(), getAbiEnums()); - - const error = new Error( - `Validate: arg test cairo typed ${Literal.ClassHash} should be in range [0, 2^252-1]` - ); - - expect(() => validateUint([2n ** 252n])).toThrow(error); - }); - - test('should throw an error if "Literal.ContractAddress" is not in range', () => { - const validateUint = (params: unknown[]) => - validateFields( - getFunctionAbi(Literal.ContractAddress), - params, - getAbiStructs(), - getAbiEnums() - ); - - const error = new Error( - `Validate: arg test cairo typed ${Literal.ContractAddress} should be in range [0, 2^252-1]` - ); - - expect(() => validateUint([2n ** 252n])).toThrow(error); - }); - - test('should throw an error if "Literal.Secp256k1Point" is not in range', () => { - const validateUint = (params: unknown[]) => - validateFields( - getFunctionAbi(Literal.Secp256k1Point), - params, - getAbiStructs(), - getAbiEnums() - ); - - const error = new Error( - `Validate: arg test must be ${Literal.Secp256k1Point} : a 512 bits number.` - ); - - expect(() => validateUint([2n ** 512n])).toThrow(error); - }); - }); - - describe('Boolean validation', () => { - test('should return void if boolean validation passes', () => { - const result = validateFields( - getFunctionAbi('core::bool'), - [true], - getAbiStructs(), - getAbiEnums() - ); - expect(result).toBeUndefined(); - }); - - test('should throw an error if boolean validation fails', () => { - const validateBool = (params: unknown[]) => - validateFields(getFunctionAbi('core::bool'), params, getAbiStructs(), getAbiEnums()); - - const error = new Error( - `Validate: arg test of cairo type core::bool should be type (Boolean)` - ); - - expect(() => validateBool(['bool', 22, Symbol('test'), BigInt(2)])).toThrow(error); - }); - }); - - describe('Boolean validation', () => { - test('should return void if boolean validation passes', () => { - const result = validateFields( - getFunctionAbi('core::bool'), - [true], - getAbiStructs(), - getAbiEnums() - ); - expect(result).toBeUndefined(); - }); - - test('should throw an error if boolean validation fails', () => { - const validateBool = (params: unknown[]) => - validateFields(getFunctionAbi('core::bool'), params, getAbiStructs(), getAbiEnums()); - - const error = new Error( - `Validate: arg test of cairo type core::bool should be type (Boolean)` - ); - - expect(() => validateBool(['bool'])).toThrow(error); - }); - }); - - describe('ByteArray validation', () => { - test('should return void if byte array validation passes', () => { - const result = validateFields( - getFunctionAbi('core::byte_array::ByteArray'), - ['byte_array'], - getAbiStructs(), - getAbiEnums() - ); - expect(result).toBeUndefined(); - }); - }); - - describe('Tuple validation', () => { - test('should return void if tuple validation passes', () => { - const result = validateFields( - getFunctionAbi('(core::bool, core::bool)'), - [{ min: true, max: true }], - getAbiStructs(), - getAbiEnums() - ); - expect(result).toBeUndefined(); - }); - - test('should throw an error if tupple validation fails', () => { - const error = new Error(`Validate: arg test should be a tuple (defined as object)`); - - expect(() => - validateFields( - getFunctionAbi('(core::bool, core::bool)'), - [], - getAbiStructs(), - getAbiEnums() - ) - ).toThrow(error); - }); - }); - - describe('Struct validation', () => { - test('should return void if struct validation passes for common struct', () => { - const result = validateFields( - getFunctionAbi('struct'), - [{ test_name: 'test' }], - getAbiStructs(), - getAbiEnums() - ); - - expect(result).toBeUndefined(); - }); - - test('should return void if struct validation passes for Uint 256 or 512', () => { - const abiStructs256 = { - [Uint.u256]: getAbiStructs().struct, - }; - const result256 = validateFields( - getFunctionAbi(Uint.u256), - [2n ** 256n - 1n], - abiStructs256, - getAbiEnums() - ); - - const abiStructs512 = { - [Uint.u512]: getAbiStructs().struct, - }; - const result512 = validateFields( - getFunctionAbi(Uint.u512), - [2n ** 512n - 1n], - abiStructs512, - getAbiEnums() - ); - - expect(result256).toBeUndefined(); - expect(result512).toBeUndefined(); - }); - - test('should return void if struct validation passes for EthAddress', () => { - const abiStructs = { - [ETH_ADDRESS]: getAbiStructs().struct, - }; - const result = validateFields(getFunctionAbi(ETH_ADDRESS), [1n], abiStructs, getAbiEnums()); - - expect(result).toBeUndefined(); - }); - - test('should throw an error for EthAddress struct if type is not a BigNumberish', () => { - const error = new Error('EthAddress type is waiting a BigNumberish. Got "[object Object]"'); - - expect(() => { - const abiStructs = { - [ETH_ADDRESS]: getAbiStructs().struct, - }; - - validateFields(getFunctionAbi(ETH_ADDRESS), [{ test: 1 }], abiStructs, getAbiEnums()); - }).toThrow(error); - }); - - test('should throw an error for EthAddress struct if it is not in range', () => { - const error = new Error( - `Validate: arg test cairo typed ${ETH_ADDRESS} should be in range [0, 2^160-1]` - ); - - expect(() => { - const abiStructs = { - [ETH_ADDRESS]: getAbiStructs().struct, - }; - - validateFields(getFunctionAbi(ETH_ADDRESS), [2n ** 160n], abiStructs, getAbiEnums()); - }).toThrow(error); - }); - - test('should throw an error if arg is not an JS object', () => { - const error = new Error( - 'Validate: arg test is cairo type struct (struct), and should be defined as a js object (not array)' - ); - - expect(() => - validateFields(getFunctionAbi('struct'), [2], getAbiStructs(), getAbiEnums()) - ).toThrow(error); - }); - - test('should throw an error if arg property name does not exist in the struct members', () => { - const error = new Error('Validate: arg test should have a property test_name'); - - expect(() => - validateFields( - getFunctionAbi('struct'), - [{ example: 'test' }], - getAbiStructs(), - getAbiEnums() - ) - ).toThrow(error); - }); - }); - - describe('Enum validation', () => { - test('should return void if enum validation passes for custom enum', () => { - const result = validateFields( - getFunctionAbi('enum'), - [{ variant: 'test', activeVariant: 'test' }], - getAbiStructs(), - getAbiEnums() - ); - - expect(result).toBeUndefined(); - }); - - test('should return void if enum validation passes for type option', () => { - const enumOption = 'core::option::Option::core::bool'; - - const abiEnums = { - [enumOption]: getAbiEnums().enum, - }; - const result = validateFields( - getFunctionAbi(enumOption), - [new CairoOption(0, 'content')], - getAbiStructs(), - abiEnums - ); - - expect(result).toBeUndefined(); - }); - - test('should return void if enum validation passes for type result', () => { - const enumResult = 'core::result::Result::bool'; - - const abiEnums = { - [enumResult]: getAbiEnums().enum, - }; - const result = validateFields( - getFunctionAbi(enumResult), - [new CairoResult(0, 'content')], - getAbiStructs(), - abiEnums - ); - - expect(result).toBeUndefined(); - }); - - test('should throw an error if arg is not an JS object', () => { - const error = new Error( - 'Validate: arg test is cairo type Enum (enum), and should be defined as a js object (not array)' - ); - - expect(() => - validateFields(getFunctionAbi('enum'), [2], getAbiStructs(), getAbiEnums()) - ).toThrow(error); - }); - - test('should throw an error if arg is not an enum', () => { - const error = new Error( - 'Validate Enum: argument test, type enum, value received "[object Object]", is not an Enum.' - ); - - expect(() => - validateFields( - getFunctionAbi('enum'), - [{ example: 'test' }], - getAbiStructs(), - getAbiEnums() - ) - ).toThrow(error); - }); - }); - - describe('NonZero validation', () => { - test('should return void if non zero validation passes for felt', () => { - const result = validateFields( - getFunctionAbi(`${NON_ZERO_PREFIX}`), - [1n], - getAbiStructs(), - getAbiEnums() - ); - - expect(result).toBeUndefined(); - }); - - test('should return void if non zero validation passes for Uint', () => { - const result = validateFields( - getFunctionAbi(`${NON_ZERO_PREFIX}<${Uint.u8}>`), - [1n], - getAbiStructs(), - getAbiEnums() - ); - - expect(result).toBeUndefined(); - }); - - test('should throw an error if type is not authorized', () => { - const error = new Error('Validate: test type is not authorized for NonZero type.'); - - expect(() => - validateFields( - getFunctionAbi(`${NON_ZERO_PREFIX}`), - [true], - getAbiStructs(), - getAbiEnums() - ) - ).toThrow(error); - }); - - test('should throw an error if value 0 iz provided for felt252 type', () => { - const error = new Error('Validate: value 0 is not authorized in NonZero felt252 type.'); - - expect(() => - validateFields( - getFunctionAbi(`${NON_ZERO_PREFIX}`), - [0], - getAbiStructs(), - getAbiEnums() - ) - ).toThrow(error); - }); - - test('should throw an error if value 0 iz provided for uint256 type', () => { - const error = new Error('Validate: value 0 is not authorized in NonZero uint256 type.'); - - expect(() => - validateFields( - getFunctionAbi(`${NON_ZERO_PREFIX}<${Uint.u256}>`), - [0], - getAbiStructs(), - getAbiEnums() - ) - ).toThrow(error); - }); - - test('should throw an error if value 0 iz provided for any uint type', () => { - const error = new Error('Validate: value 0 is not authorized in NonZero uint type.'); - - expect(() => - validateFields( - getFunctionAbi(`${NON_ZERO_PREFIX}<${Uint.u8}>`), - [0], - getAbiStructs(), - getAbiEnums() - ) - ).toThrow(error); - }); - }); - - describe('Array validation', () => { - test('should return void if array validation passes for each type', () => { - const validateArray = (type: string, param: unknown) => - validateFields(getFunctionAbi(type), [[param]], getAbiStructs(), getAbiEnums()); - - expect(validateArray('core::array::Array::', true)).toBeUndefined(); - expect(validateArray('core::array::Array::', 'test')).toBeUndefined(); - expect(validateArray('core::array::Span::', true)).toBeUndefined(); - expect(validateArray('core::array::Array::', 'felt')).toBeUndefined(); - expect(validateArray(`core::array::Array::<${Uint.u8}>`, 2n)).toBeUndefined(); - expect(validateArray('core::array::Array::', 'felt')).toBeUndefined(); - expect( - validateArray('core::array::Array::<(core::bool, core::bool)>', { min: true, max: true }) - ).toBeUndefined(); - expect( - validateArray('core::array::Array::>', [true]) - ).toBeUndefined(); - - const enumArrayResult = 'core::array::Array::'; - - const abiEnums = { 'core::result::Result::core::bool': getAbiEnums().enum }; - const validatedArrayEnum = validateFields( - getFunctionAbi(enumArrayResult), - [[new CairoResult(0, 'content')]], - getAbiStructs(), - abiEnums - ); - - expect(validatedArrayEnum).toBeUndefined(); - - const structArrayEth = `core::array::Array::<${ETH_ADDRESS}>`; - const abiStructs = { [ETH_ADDRESS]: getAbiStructs().struct }; - - const validatedArrayStruct = validateFields( - getFunctionAbi(structArrayEth), - [[1n]], - abiStructs, - getAbiEnums() - ); - - expect(validatedArrayStruct).toBeUndefined(); - }); - - test('should throw an error if parameter is not an array', () => { - expect(() => { - validateFields( - getFunctionAbi('core::array::Span::'), - [true], - getAbiStructs(), - getAbiEnums() - ); - }).toThrow(new Error('Validate: arg test should be an Array')); - }); - - test('should throw an error if array validation is unhandled', () => { - expect(() => { - validateFields( - getFunctionAbi('core::array::Span::'), - [[true]], - getAbiStructs(), - getAbiEnums() - ); - }).toThrow( - new Error( - 'Validate Unhandled: argument test, type core::array::Span::, value true' - ) - ); - }); - }); -}); diff --git a/__tests__/utils/ethSigner.test.ts b/__tests__/utils/ethSigner.test.ts index ed31230ae..527f411fe 100644 --- a/__tests__/utils/ethSigner.test.ts +++ b/__tests__/utils/ethSigner.test.ts @@ -84,7 +84,7 @@ describe('Ethereum signer', () => { test('secp256k1', async () => { const myCallData = new CallData(ethPubKContract.abi); - const ethPubKey = + const ethPubKey: string = '0x8c7aea7d673a5858bdca128d124fb0765cceb2c16f198f4c14b328aa571331e6f6c87f51d5224d73d118765cb19d7565212f80be5048bff926ba791c17541c92'; const resp3 = await ethPubKContract.test_public_key(ethPubKey); expect(num.toHex(resp3)).toBe(ethPubKey); diff --git a/__tests__/utils/events.test.ts b/__tests__/utils/events.test.ts index 15c1f7f41..4031fd9f6 100644 --- a/__tests__/utils/events.test.ts +++ b/__tests__/utils/events.test.ts @@ -4,6 +4,7 @@ import { type AbiEvent, type AbiStructs, type CairoEventVariant, + CallData, type InvokeTransactionReceiptResponse, type RPC, events, @@ -141,173 +142,100 @@ describe('getAbiEvents', () => { describe('parseEvents', () => { test('should return parsed events', () => { - const abiEventAndVariantName = 'cairo_event_struct'; - const abiCairoEventStruct: AbiEvent = { - kind: 'struct', - members: [ - { - name: 'test_name', - type: 'test_type', - kind: 'data', - }, - ], - name: abiEventAndVariantName, - type: 'event', - }; - - const abiCairoEventEnum: CairoEventVariant = { - kind: 'enum', - variants: [ - { - name: 'test_name', - type: abiEventAndVariantName, - kind: 'data', - }, + const event: RPC.EmittedEvent = { + data: [ + '0x395a96a5b6343fc0f543692fd36e7034b54c2a276cd1a021e8c0b02aee1f43', + '0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8', + '0x5615d4fedf6800', + '0x0', ], - name: 'test_cairo_event', - type: 'event', + from_address: '0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d', + keys: ['0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9'], + block_hash: '0x1234', + block_number: 567, + transaction_hash: '0x789', }; - const abiEvents = getAbiEvents([getInterfaceAbi(), abiCairoEventStruct, abiCairoEventEnum]); - - const abiStructs: AbiStructs = { - abi_structs: { + const abi = [ + { + type: 'impl', + name: 'ERC20Impl', + interface_name: 'openzeppelin::token::erc20::interface::IERC20', + }, + { + type: 'interface', + name: 'openzeppelin::token::erc20::interface::IERC20', + items: [], + }, + { + type: 'event', + name: 'src::strk::erc20_lockable::ERC20Lockable::Transfer', + kind: 'struct', members: [ { - name: 'test_name', - type: 'test_type', - offset: 1, + name: 'from', + type: 'core::starknet::contract_address::ContractAddress', + kind: 'data', }, - ], - size: 2, - name: 'cairo_event_struct', - type: 'struct', - }, - }; - - const abiEnums: AbiEnums = { - abi_enums: { - variants: [ { - name: 'test_name', - type: 'cairo_event_struct_variant', - offset: 1, + name: 'to', + type: 'core::starknet::contract_address::ContractAddress', + kind: 'data', + }, + { + name: 'value', + type: 'core::integer::u256', + kind: 'data', }, ], - size: 2, - name: 'test_cairo_event', - type: 'enum', }, - }; - - const event: RPC.EmittedEvent = { - from_address: 'test_address', - keys: ['0x3c719ce4f57dd2d9059b9ffed65417d694a29982d35b188574144d6ae6c3f87'], - data: ['0x3c719ce4f57dd2d9059b9ffed65417d694a29982d35b188574144d6ae6c3f87'], - block_hash: '0x1234', - block_number: 567, - transaction_hash: '0x789', - }; - - const abi = [getInterfaceAbi(), abiCairoEventStruct, abiCairoEventEnum]; - const parser = createAbiParser(abi); - const parsedEvents = parseEvents([event], abiEvents, abiStructs, abiEnums, parser); - - const result = [ { - cairo_event_struct: { - test_name: 1708719217404197029088109386680815809747762070431461851150711916567020191623n, - }, - block_hash: '0x1234', - block_number: 567, - transaction_hash: '0x789', - }, - ]; - - expect(parsedEvents).toStrictEqual(result); - }); - - test('should return parsed emitted events', () => { - const abiEventAndVariantName = 'cairo_event_struct'; - const abiCairoEventStruct: AbiEvent = { - kind: 'struct', - members: [ - { - name: 'test_name', - type: 'test_type', - kind: 'data', - }, - ], - name: abiEventAndVariantName, - type: 'event', - }; - - const abiCairoEventEnum: CairoEventVariant = { - kind: 'enum', - variants: [ - { - name: 'test_name', - type: abiEventAndVariantName, - kind: 'data', - }, - ], - name: 'test_cairo_event', - type: 'event', - }; - - const abiEvents = getAbiEvents([getInterfaceAbi(), abiCairoEventStruct, abiCairoEventEnum]); - - const abiStructs: AbiStructs = { - abi_structs: { + type: 'struct', + name: 'core::integer::u256', members: [ { - name: 'test_name', - type: 'test_type', - offset: 1, + name: 'low', + type: 'core::integer::u128', + }, + { + name: 'high', + type: 'core::integer::u128', }, ], - size: 2, - name: 'cairo_event_struct', - type: 'struct', }, - }; - - const abiEnums: AbiEnums = { - abi_enums: { + { + type: 'event', + name: 'src::strk::erc20_lockable::ERC20Lockable::Event', + kind: 'enum', variants: [ { - name: 'test_name', - type: 'cairo_event_struct_variant', - offset: 1, + name: 'Transfer', + type: 'src::strk::erc20_lockable::ERC20Lockable::Transfer', + kind: 'nested', }, ], - size: 2, - name: 'test_cairo_event', - type: 'enum', }, - }; - - const event: RPC.EmittedEvent = { - from_address: 'test_address', - keys: ['0x3c719ce4f57dd2d9059b9ffed65417d694a29982d35b188574144d6ae6c3f87'], - data: ['0x3c719ce4f57dd2d9059b9ffed65417d694a29982d35b188574144d6ae6c3f87'], - block_hash: '0x26b160f10156dea0639bec90696772c640b9706a47f5b8c52ea1abe5858b34d', - block_number: 1, - transaction_hash: '0x26b160f10156dea0639bec90696772c640b9706a47f5b8c52ea1abe5858b34c', - }; + ]; - const abi = [getInterfaceAbi(), abiCairoEventStruct, abiCairoEventEnum]; const parser = createAbiParser(abi); - const parsedEvents = parseEvents([event], abiEvents, abiStructs, abiEnums, parser); + const parsedEvents = parseEvents( + [event], + getAbiEvents(abi), + CallData.getAbiStruct(abi), + CallData.getAbiEnum(abi), + parser + ); const result = [ { - cairo_event_struct: { - test_name: 1708719217404197029088109386680815809747762070431461851150711916567020191623n, + 'src::strk::erc20_lockable::ERC20Lockable::Transfer': { + from: 101335501307061673760165623468268869343867322091122131773587832584929156931n, + to: 493682666880028149457439048758834463666448583632766410742816449610329486296n, + value: 24230852550420480n, }, - block_hash: '0x26b160f10156dea0639bec90696772c640b9706a47f5b8c52ea1abe5858b34d', - block_number: 1, - transaction_hash: '0x26b160f10156dea0639bec90696772c640b9706a47f5b8c52ea1abe5858b34c', + block_hash: '0x1234', + block_number: 567, + transaction_hash: '0x789', }, ]; diff --git a/__tests__/utils/secp256k1Point.test.ts b/__tests__/utils/secp256k1Point.test.ts index 2df6bb24e..73c0251c9 100644 --- a/__tests__/utils/secp256k1Point.test.ts +++ b/__tests__/utils/secp256k1Point.test.ts @@ -14,9 +14,7 @@ describe('secp256k1Point cairo type test', () => { myCallDataAccount.compile('constructor', { public_key: point, }); - }).toThrow( - 'Validate: arg public_key must be core::starknet::secp256k1::Secp256k1Point : a valid 512 bits secp256k1 point.' - ); + }).toThrow('input is bigger than SECP256K1_POINT_MAX'); }); test('secp256k1Point compile', () => { diff --git a/__tests__/utils/shortString.test.ts b/__tests__/utils/shortString.test.ts index eb1a7aadc..c68cfc911 100644 --- a/__tests__/utils/shortString.test.ts +++ b/__tests__/utils/shortString.test.ts @@ -53,89 +53,72 @@ describe('shortString', () => { test('convert string to ByteArray', () => { expect( - new CairoByteArray('ABCDEFGHIJKLMNOPQRSTUVWXYZ12345AAADEFGHIJKLMNOPQRSTUVWXYZ12345A') - ).toEqual({ - data: [ - '0x4142434445464748494a4b4c4d4e4f505152535455565758595a3132333435', - '0x4141414445464748494a4b4c4d4e4f505152535455565758595a3132333435', - ], - pending_word: '0x41', - pending_word_len: 1, - }); - expect(new CairoByteArray('ABCDEFGHIJKLMNOPQRSTUVWXYZ12345')).toEqual({ - data: ['0x4142434445464748494a4b4c4d4e4f505152535455565758595a3132333435'], - pending_word: '0x00', - pending_word_len: 0, - }); - expect(new CairoByteArray('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234')).toEqual({ - data: [], - pending_word: '0x4142434445464748494a4b4c4d4e4f505152535455565758595a31323334', - pending_word_len: 30, - }); - expect(new CairoByteArray('')).toEqual({ - data: [], - pending_word: '0x00', - pending_word_len: 0, - }); + new CairoByteArray( + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ12345AAADEFGHIJKLMNOPQRSTUVWXYZ12345A' + ).toApiRequest() + ).toEqual([ + '2', + '115302387975643577911206786302384344998065844015382184106956994275072750645', + '115295432309403453046139762212491893933352045632121168639256869543628452917', + '65', + '1', + ]); + expect(new CairoByteArray('ABCDEFGHIJKLMNOPQRSTUVWXYZ12345').toApiRequest()).toEqual([ + '1', + '115302387975643577911206786302384344998065844015382184106956994275072750645', + '0', + '0', + ]); + expect(new CairoByteArray('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234').toApiRequest()).toEqual([ + '0', + '450399953029857726215651508993688847648694703185086656667800758887002932', + '30', + ]); + expect(new CairoByteArray('').toApiRequest()).toEqual(['0', '0', '0']); }); test('convert ByteArray to string', () => { expect( - new CairoByteArray({ - data: [ - '0x4142434445464748494a4b4c4d4e4f505152535455565758595a3132333435', - '0x4141414445464748494a4b4c4d4e4f505152535455565758595a3132333435', - ], - pending_word: '0x41', - pending_word_len: 1, - }) + new CairoByteArray( + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ12345AAADEFGHIJKLMNOPQRSTUVWXYZ12345A' + ).decodeUtf8() ).toBe('ABCDEFGHIJKLMNOPQRSTUVWXYZ12345AAADEFGHIJKLMNOPQRSTUVWXYZ12345A'); + expect(new CairoByteArray('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234').decodeUtf8()).toBe( + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234' + ); + expect(new CairoByteArray('').decodeUtf8()).toBe(''); }); - expect( - new CairoByteArray({ - data: [], - pending_word: '0x4142434445464748494a4b4c4d4e4f505152535455565758595a31323334', - pending_word_len: 30, - }) - ).toBe('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234'); - expect( - new CairoByteArray({ - data: [], - pending_word: '0x00', - pending_word_len: 0, - }) - ).toBe(''); -}); -describe('isShortString', () => { - test('should return true for short strings', () => { - const shortStr = '1234567890123456789012345678901'; - expect(isShortString(shortStr)).toBe(true); - }); + describe('isShortString', () => { + test('should return true for short strings', () => { + const shortStr = '1234567890123456789012345678901'; + expect(isShortString(shortStr)).toBe(true); + }); - test('should return true for short strings', () => { - // TODO: IMPORTANT: This pass even though it's 31 chars long, but each char is 2 bytes, so it's 62 bytes long - // TODO: felt can store 31 bytes + 4 bits. - // TODO: This is a bug, we need to fix it. - // TODO: We need to check if the string is 31 bytes long or less, not by character number. - const shortStr = '☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥'; - expect(isShortString(shortStr)).toBe(true); - }); + test('should return true for short strings', () => { + // TODO: IMPORTANT: This pass even though it's 31 chars long, but each char is 2 bytes, so it's 62 bytes long + // TODO: felt can store 31 bytes + 4 bits. + // TODO: This is a bug, we need to fix it. + // TODO: We need to check if the string is 31 bytes long or less, not by character number. + const shortStr = '☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥☥'; + expect(isShortString(shortStr)).toBe(true); + }); - test('should return false for long strings', () => { - const longStr = '12345678901234567890123456789012'; - expect(isShortString(longStr)).toBe(false); + test('should return false for long strings', () => { + const longStr = '12345678901234567890123456789012'; + expect(isShortString(longStr)).toBe(false); + }); }); -}); -describe('isDecimalString', () => { - test('should return true for decimal strings', () => { - expect(isDecimalString('1234567890')).toBe(true); - }); + describe('isDecimalString', () => { + test('should return true for decimal strings', () => { + expect(isDecimalString('1234567890')).toBe(true); + }); - test('should return false for non-decimal strings', () => { - expect(isDecimalString('123A')).toBe(false); - expect(isDecimalString('ABCDE')).toBe(false); - expect(isDecimalString('123.456')).toBe(false); + test('should return false for non-decimal strings', () => { + expect(isDecimalString('123A')).toBe(false); + expect(isDecimalString('ABCDE')).toBe(false); + expect(isDecimalString('123.456')).toBe(false); + }); }); }); diff --git a/package-lock.json b/package-lock.json index db42c73c1..cfa225198 100644 --- a/package-lock.json +++ b/package-lock.json @@ -119,6 +119,7 @@ "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -984,6 +985,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -1007,6 +1009,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -2592,6 +2595,7 @@ "integrity": "sha512-oNXsh2ywth5aowwIa7RKtawnkdH6LgU1ztfP9AIUCQCvzysB+WeU8o2kyyosDPwBZutPpjZDKPQGIzzrfTWweQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.1", @@ -3855,6 +3859,7 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.24" @@ -4298,6 +4303,7 @@ "integrity": "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.10.0" } @@ -4353,6 +4359,7 @@ "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "7.18.0", @@ -4387,6 +4394,7 @@ "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", @@ -4851,6 +4859,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4911,6 +4920,7 @@ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -5419,6 +5429,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001737", "electron-to-chromium": "^1.5.211", @@ -6283,6 +6294,7 @@ "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", @@ -7073,6 +7085,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -7137,6 +7150,7 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -7238,6 +7252,7 @@ "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -7301,6 +7316,7 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -11010,6 +11026,7 @@ "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", @@ -11707,6 +11724,7 @@ "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", "dev": true, "license": "MIT", + "peer": true, "bin": { "marked": "bin/marked.js" }, @@ -14532,6 +14550,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -15574,6 +15593,7 @@ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -16288,6 +16308,7 @@ "integrity": "sha512-g7RssbTAbir1k/S7uSwSVZFfFXwpomUB9Oas0+xi9KStSCmeDXcA7rNhiskjLqvUe/Evhx8fVCT16OSa34eM5g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@semantic-release/commit-analyzer": "^13.0.0-beta.1", "@semantic-release/error": "^4.0.0", @@ -17723,6 +17744,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -17851,6 +17873,7 @@ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -18243,6 +18266,7 @@ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/src/contract/default.ts b/src/contract/default.ts index 2ab67953a..84f506063 100644 --- a/src/contract/default.ts +++ b/src/contract/default.ts @@ -31,7 +31,7 @@ import { import type { AccountInterface } from '../account/interface'; import assert from '../utils/assert'; import { cairo, CallData } from '../utils/calldata'; -import { createAbiParser, ParsingStrategy } from '../utils/calldata/parser'; +import { createAbiParser, hdParsingStrategy, ParsingStrategy } from '../utils/calldata/parser'; import { getAbiEvents, parseEvents as parseRawEvents } from '../utils/events/index'; import { cleanHex } from '../utils/num'; import { ContractInterface } from './interface'; @@ -130,7 +130,7 @@ export class Contract implements ContractInterface { readonly [key: string]: AsyncContractFunction | any; - private callData: CallData; + public callData: CallData; public withOptionsProps?: WithOptions; @@ -149,7 +149,7 @@ export class Contract implements ContractInterface { // TODO: REFACTOR: move from legacy format and add support for legacy format // Must have params this.parsingStrategy = options.parsingStrategy; - const parser = createAbiParser(options.abi, options.parsingStrategy); + const parser = createAbiParser(options.abi, options.parsingStrategy || hdParsingStrategy); this.abi = parser.getLegacyFormat(); this.address = options.address && options.address.toLowerCase(); this.providerOrAccount = options.providerOrAccount ?? defaultProvider; @@ -160,7 +160,7 @@ export class Contract implements ContractInterface { this.classHash = options.classHash; // Init - this.callData = new CallData(options.abi, options.parsingStrategy); + this.callData = new CallData(options.abi, options.parsingStrategy || hdParsingStrategy); this.structs = CallData.getAbiStruct(options.abi); this.events = getAbiEvents(options.abi); @@ -219,9 +219,9 @@ export class Contract implements ContractInterface { // TODO: if changing address, probably changing abi also !? Also nonsense method as if you change abi and address, you need to create a new contract instance. this.address = address; if (abi) { - const parser = createAbiParser(abi, this.parsingStrategy); + const parser = createAbiParser(abi, this.parsingStrategy || hdParsingStrategy); this.abi = parser.getLegacyFormat(); - this.callData = new CallData(abi, this.parsingStrategy); + this.callData = new CallData(abi, this.parsingStrategy || hdParsingStrategy); this.structs = CallData.getAbiStruct(abi); this.events = getAbiEvents(abi); } diff --git a/src/global/constants.ts b/src/global/constants.ts index b2308b4cb..3361ce147 100644 --- a/src/global/constants.ts +++ b/src/global/constants.ts @@ -32,6 +32,7 @@ export const RANGE_U32 = range(ZERO, 2n ** 32n - 1n); export const RANGE_U64 = range(ZERO, 2n ** 64n - 1n); export const RANGE_U96 = range(ZERO, 2n ** 96n - 1n); export const RANGE_U128 = range(ZERO, 2n ** 128n - 1n); +export const RANGE_ETH_ADDRESS = range(ZERO, 2n ** 160n - 1n); // Signed integer ranges export const RANGE_I8 = range(-(2n ** 7n), 2n ** 7n - 1n); diff --git a/src/index.ts b/src/index.ts index 604364eb6..3652ce49a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -47,6 +47,7 @@ export * from './utils/calldata/enum'; export * from './utils/contract'; export * from './utils/transactionReceipt/transactionReceipt'; export * from './utils/units'; +export * from './utils/helpers'; export * as wallet from './wallet/connect'; export * from './global/config'; export * from './global/logger'; diff --git a/src/types/cairoEnum.ts b/src/types/cairoEnum.ts index 6ddd71cc9..4af91e34d 100644 --- a/src/types/cairoEnum.ts +++ b/src/types/cairoEnum.ts @@ -1,3 +1,7 @@ -import { CairoCustomEnum, CairoOption, CairoResult } from '../utils/calldata/enum'; +import type { CairoTypeCustomEnum } from '../utils/cairoDataTypes/cairoTypeCustomEnum'; +import type { CairoTypeOption } from '../utils/cairoDataTypes/cairoTypeOption'; +import type { CairoTypeResult } from '../utils/cairoDataTypes/cairoTypeResult'; +import { CairoCustomEnum, CairoResult, CairoOption } from '../utils/calldata/enum'; export type CairoEnum = CairoCustomEnum | CairoOption | CairoResult; +export type CairoTypeEnum = CairoTypeCustomEnum | CairoTypeOption | CairoTypeResult; diff --git a/src/types/calldata.ts b/src/types/calldata.ts index 9e5494208..05b20f5ed 100644 --- a/src/types/calldata.ts +++ b/src/types/calldata.ts @@ -13,7 +13,7 @@ export const Uint = { u16: 'core::integer::u16', u32: 'core::integer::u32', u64: 'core::integer::u64', - u96: 'core::integer::u96', + u96: 'core::internal::bounded_int::BoundedInt::<0, 79228162514264337593543950335>', u128: 'core::integer::u128', u256: 'core::integer::u256', // This one is struct u512: 'core::integer::u512', // This one is struct diff --git a/src/types/lib/contract/abi.ts b/src/types/lib/contract/abi.ts index d03b56058..3466734c9 100644 --- a/src/types/lib/contract/abi.ts +++ b/src/types/lib/contract/abi.ts @@ -25,9 +25,9 @@ export type FunctionAbi = { export type AbiStructs = { [name: string]: AbiStruct }; export type AbiStruct = { - members: (AbiEntry & { offset: number })[]; + members: (AbiEntry & { offset?: number })[]; // "offset" only in Cairo 0 Abi name: string; - size: number; + size?: number; // "size" only in Cairo 0 Abi type: 'struct'; }; diff --git a/src/utils/cairoDataTypes/array.ts b/src/utils/cairoDataTypes/array.ts index 7b52b60f4..b35c05d07 100644 --- a/src/utils/cairoDataTypes/array.ts +++ b/src/utils/cairoDataTypes/array.ts @@ -1,9 +1,13 @@ import assert from '../assert'; import { addCompiledFlag } from '../helpers'; -import { getNext } from '../num'; +import { getNext, isBigNumberish } from '../num'; import { felt, getArrayType, isTypeArray } from '../calldata/cairo'; -import { type ParsingStrategy } from '../calldata/parser/parsingStrategy'; +import { type ParsingStrategy } from '../calldata/parser/parsingStrategy.type'; import { CairoType } from './cairoType.interface'; +import type { AllowArray } from '../../types'; +import { CairoFelt252 } from './felt'; +import { CairoBytes31 } from './bytes31'; +import { splitLongString } from '../shortString'; /** * Represents a Cairo dynamic array with runtime-determined length. @@ -28,7 +32,7 @@ import { CairoType } from './cairoType.interface'; * * // Simple dynamic array * const simple = new CairoArray([1, 2, 3], 'core::array::Array::', hdParsingStrategy); - * console.log(simple.toApiRequest()); // ['0x3', '0x1', '0x2', '0x3'] (length first) + * console.log(simple.toApiRequest()); // ['3', '1', '2', '3'] (length first) * console.log(simple.decompose(hdParsingStrategy)); // [1n, 2n, 3n] * * // Nested dynamic arrays @@ -43,6 +47,8 @@ import { CairoType } from './cairoType.interface'; export class CairoArray extends CairoType { static dynamicSelector = 'CairoArray' as const; + public readonly dynamicSelector = CairoArray.dynamicSelector; + /** * Array of CairoType instances representing a Cairo dynamic array. */ @@ -64,9 +70,9 @@ export class CairoArray extends CairoType { * The constructor automatically detects input type and processes it appropriately, * converting all elements to proper CairoType instances based on the array type. * - * @param content - Input data (array, object, Iterator, or CairoType instances) - * @param arrayType - Dynamic array type string (e.g., "core::array::Array::") - * @param strategy - Parsing strategy for element type handling + * @param {unknown} content - Input data (array, object, Iterator, or CairoType instances) + * @param {string} arrayType - Dynamic array type string (e.g., "core::array::Array::") + * @param {AllowArray} parsingStrategy - Parsing strategy for element type handling * @example * ```typescript * // From user array @@ -83,54 +89,75 @@ export class CairoArray extends CairoType { * const nested = new CairoArray([[1, 2], [3, 4]], 'core::array::Array::>', hdParsingStrategy); * ``` */ - constructor(content: unknown, arrayType: string, strategy: ParsingStrategy) { + constructor(content: unknown, arrayType: string, parsingStrategy: AllowArray) { super(); - - // If content is already a CairoArray instance, just copy its properties + this.arrayType = arrayType; + const strategies = Array.isArray(parsingStrategy) ? parsingStrategy : [parsingStrategy]; + if (content && typeof content === 'object' && 'next' in content) { + // "content" is an iterator + const parsedContent: CairoType[] = CairoArray.parser( + content as Iterator, + arrayType, + strategies + ); + this.content = parsedContent; + return; + } if (content instanceof CairoArray) { this.content = content.content; this.arrayType = content.arrayType; return; } - - // Check if input is an API response iterator - if (content && typeof content === 'object' && 'next' in content) { - // API response path - use parser - const parsedContent = CairoArray.parser(content as Iterator, arrayType, strategy); - this.content = parsedContent; - this.arrayType = arrayType; - } else { - // User input path - process directly - CairoArray.validate(content, arrayType); - const values = CairoArray.extractValuesArray(content); - const elementType = getArrayType(arrayType); - - // Create CairoType instances for each element - this.content = values.map((value) => { - // First check direct constructors - const constructor = strategy.constructors[elementType]; - if (constructor) { - return constructor(value, elementType); + const arrayContentType = CairoArray.getArrayElementType(arrayType); + let processedContent = content; + if ( + typeof content === 'string' && + !isBigNumberish(content) && + (arrayContentType === CairoFelt252.abiSelector || + arrayContentType === CairoBytes31.abiSelector) + ) { + processedContent = splitLongString(content); + } + CairoArray.validate(processedContent, arrayType); + const resultContent: any[] = CairoArray.extractValuesArray(processedContent).map( + (contentItem: any) => { + if ( + contentItem && + typeof contentItem === 'object' && + contentItem !== null && + 'toApiRequest' in contentItem + ) { + // "content" is a CairoType + return contentItem as CairoType; } + // not an iterator, not an CairoType -> so is low level data (BigNumberish, array, object, Cairo Enums) - // Check dynamic selectors - const dynamicSelectors = Object.entries(strategy.dynamicSelectors); - const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); - - if (matchingSelector) { - const [selectorName] = matchingSelector; - const dynamicConstructor = strategy.constructors[selectorName]; + const strategyConstructorNum = strategies.findIndex( + (strategy: ParsingStrategy) => strategy.constructors[arrayContentType] + ); + if (strategyConstructorNum >= 0) { + const constructor = strategies[strategyConstructorNum].constructors[arrayContentType]; + return constructor(contentItem, strategies, arrayContentType); + } + const strategyDynamicNum = strategies.findIndex((strategy: ParsingStrategy) => { + const dynamicSelectors = Object.entries(strategy.dynamicSelectors); + return dynamicSelectors.find(([, selectorFn]) => selectorFn(arrayContentType)); + }); + if (strategyDynamicNum >= 0) { + const dynamicSelectors = Object.entries(strategies[strategyDynamicNum].dynamicSelectors); + const matchingSelector = dynamicSelectors.find(([, selectorFn]) => + selectorFn(arrayContentType) + ); + const [selectorName] = matchingSelector as [string, (type: string) => boolean]; + const dynamicConstructor = strategies[strategyDynamicNum].constructors[selectorName]; if (dynamicConstructor) { - return dynamicConstructor(value, elementType); + return dynamicConstructor(contentItem, strategies, arrayContentType); } } - - // Unknown type - store as string for later error handling - return String(value) as unknown as CairoType; - }); - - this.arrayType = arrayType; - } + throw new Error(`"${arrayContentType}" is not a valid Cairo type`); + } + ); + this.content = resultContent; } /** @@ -143,44 +170,51 @@ export class CairoArray extends CairoType { * - Dynamic selectors (complex types like nested dynamic arrays) * - Unknown types (stored as raw strings for later error handling) * - * @param responseIterator - Iterator over string data to parse - * @param arrayType - The dynamic array type (e.g., "core::array::Array::") - * @param strategy - The parsing strategy containing constructors and selectors + * @param {Iterator} responseIterator - Iterator over string data to parse + * @param {string} arrayType - The dynamic array type (e.g., "core::array::Array::") + * @param {ParsingStrategy[]} strategy - The parsing strategy containing constructors and selectors * @returns Array of parsed CairoType instances * @private */ private static parser( responseIterator: Iterator, arrayType: string, - strategy: ParsingStrategy + parsingStrategies: ParsingStrategy[] ): CairoType[] { const elementType = getArrayType(arrayType); // Extract T from core::array::Array:: // For API responses, first element is the array length const lengthStr = getNext(responseIterator); const arrayLength = parseInt(lengthStr, 16); - // First check direct constructors - const constructor = strategy.constructors[elementType]; - - if (constructor) { - return Array.from({ length: arrayLength }, () => constructor(responseIterator, elementType)); + const strategyConstructorNum = parsingStrategies.findIndex( + (strategy: ParsingStrategy) => strategy.constructors[elementType] + ); + if (strategyConstructorNum >= 0) { + const constructor = parsingStrategies[strategyConstructorNum].constructors[elementType]; + return Array.from({ length: arrayLength }, () => + constructor(responseIterator, parsingStrategies, elementType) + ); } - // Check dynamic selectors (includes CairoArray, CairoFixedArray, future: tuples, structs, etc.) - const dynamicSelectors = Object.entries(strategy.dynamicSelectors); - const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); - - if (matchingSelector) { - const [selectorName] = matchingSelector; - const dynamicConstructor = strategy.constructors[selectorName]; + // Check dynamic selectors (includes CairoFixedArray, future: tuples, structs, etc.) + const strategyDynamicNum = parsingStrategies.findIndex((strategy: ParsingStrategy) => { + const dynamicSelectors = Object.entries(strategy.dynamicSelectors); + return dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); + }); + if (strategyDynamicNum >= 0) { + const dynamicSelectors = Object.entries( + parsingStrategies[strategyDynamicNum].dynamicSelectors + ); + const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); + const [selectorName] = matchingSelector as [string, (type: string) => boolean]; + const dynamicConstructor = parsingStrategies[strategyDynamicNum].constructors[selectorName]; if (dynamicConstructor) { return Array.from({ length: arrayLength }, () => - dynamicConstructor(responseIterator, elementType) + dynamicConstructor(responseIterator, parsingStrategies, elementType) ); } } - // Unknown type - collect raw values, defer error const rawValues = Array.from({ length: arrayLength }, () => getNext(responseIterator)); return rawValues as unknown as CairoType[]; @@ -288,21 +322,21 @@ export class CairoArray extends CairoType { } /** - * Serialize the Cairo dynamic array into hex strings for Starknet API requests. + * Serialize the Cairo dynamic array into decimal strings for Starknet API requests. * * Converts the array into a length-prefixed format: [length, element1, element2, ...] * by calling toApiRequest() on each element and flattening the results. This follows * the Cairo ABI standard for dynamic arrays. * - * @returns Array of hex strings ready for API requests (length-prefixed) + * @returns Array of decimal strings ready for API requests (length-prefixed) * @example * ```typescript * const dynArray = new CairoArray([1, 2, 3], "core::array::Array::", strategy); - * const result = dynArray.toApiRequest(); // ['0x3', '0x1', '0x2', '0x3'] + * const result = dynArray.toApiRequest(); // ['3', '1', '2', '3'] * * // Nested arrays include nested length prefixes * const nested = new CairoArray([[1, 2], [3]], "core::array::Array::>", strategy); - * const flatResult = nested.toApiRequest(); // ['0x2', '0x2', '0x1', '0x2', '0x1', '0x3'] + * const flatResult = nested.toApiRequest(); // ['2', '2', '1', '2', '1', '3'] * // ^^^^ ^^^^ --------- ^^^^ -------- * // outer inner [1,2] inner [3] * // length length length @@ -325,7 +359,7 @@ export class CairoArray extends CairoType { * response parsers (e.g., CairoUint8 → BigInt). This method is used primarily for * parsing API responses into user-friendly formats. * - * @param strategy - Parsing strategy for response parsing + * @param strategyDecompose - Parsing strategy for response parsing * @returns Array of parsed values (BigInt, numbers, nested arrays, etc.) * @example * ```typescript @@ -333,25 +367,28 @@ export class CairoArray extends CairoType { * const parsed = dynArray.decompose(hdParsingStrategy); // [1n, 2n, 3n] * ``` */ - public decompose(strategy: ParsingStrategy): any[] { + public decompose(strategyDecompose: AllowArray): any[] { // Use response parsers to get final parsed values (for API response parsing) + const strategies = Array.isArray(strategyDecompose) ? strategyDecompose : [strategyDecompose]; const elementType = getArrayType(this.arrayType); - return this.content.map((element) => { - if (element instanceof CairoArray) { - // For nested arrays, decompose recursively with strategy - return element.decompose(strategy); - } // For raw string values (unsupported types), throw error if (typeof element === 'string') { throw new Error(`No parser found for element type: ${elementType} in parsing strategy`); } - - // For primitive types, use the response parser to get final values - const responseParser = strategy.response[elementType]; - + let parserName: string = elementType; + if (element instanceof CairoType) { + if ('dynamicSelector' in element) { + // dynamic recursive CairoType + parserName = (element as any).dynamicSelector; + } + } + const strategyDecomposeNum = strategies.findIndex( + (strategy: ParsingStrategy) => strategy.response[parserName] + ); + const responseParser = strategies[strategyDecomposeNum].response[parserName]; if (responseParser) { - return responseParser(element); + return responseParser(element, strategies); } // No response parser found - throw error instead of fallback magic diff --git a/src/utils/cairoDataTypes/bool.ts b/src/utils/cairoDataTypes/bool.ts new file mode 100644 index 000000000..b8eb7e216 --- /dev/null +++ b/src/utils/cairoDataTypes/bool.ts @@ -0,0 +1,83 @@ +/* eslint-disable no-underscore-dangle */ +import { BigNumberish } from '../../types'; +import { addHexPrefix } from '../encode'; +import { getNext, isBigNumberish } from '../num'; +import { isObject, isNumber } from '../typed'; +import assert from '../assert'; +import { addCompiledFlag } from '../helpers'; + +export class CairoBool { + data: boolean; + + static abiSelector = 'core::bool'; + + constructor(data: BigNumberish | boolean | unknown) { + CairoBool.validate(data); + this.data = CairoBool.__processData(data); + } + + static __processData(data: BigNumberish | boolean | unknown): boolean { + if (typeof data === 'boolean') { + return data; + } + if (isBigNumberish(data)) { + const numb = BigInt(data); + if (numb === 0n) return false; + if (numb === 1n) return true; + } + throw new Error('Invalid input for a core::bool'); + } + + toApiRequest(): string[] { + return addCompiledFlag([this.toDecimalString()]); + } + + toBoolean() { + return this.data; + } + + /** + * For negative values field element representation as positive hex string. + * @returns cairo field arithmetic hex string + */ + toHexString() { + return addHexPrefix(this.data ? '1' : '0'); + } + + toDecimalString() { + return this.data ? '1' : '0'; + } + + static validate(data: BigNumberish | boolean | unknown): void { + assert(data !== null && data !== undefined, 'Invalid input: null or undefined'); + assert(!isObject(data) && !Array.isArray(data), 'Invalid input: objects are not supported'); + assert( + !isNumber(data) || Number.isInteger(data), + 'Invalid input: decimal numbers are not supported, only integers or booleans' + ); + const value = BigInt(data as BigNumberish | boolean); + assert(value === 0n || value === 1n, `Only values 0 or 1 are possible in a core::bool`); + } + + static is(data: BigNumberish | boolean | unknown): boolean { + try { + CairoBool.validate(data); + return true; + } catch { + return false; + } + } + + /** + * Check if provided abi type is this data type + */ + static isAbiType(abiType: string): boolean { + return abiType === CairoBool.abiSelector; + } + + static factoryFromApiResponse(responseIterator: Iterator): CairoBool { + const response = getNext(responseIterator); + const value = BigInt(response); + return new CairoBool(value); + } +} diff --git a/src/utils/cairoDataTypes/byteArray.ts b/src/utils/cairoDataTypes/byteArray.ts index 8b45c02c4..65abb6871 100644 --- a/src/utils/cairoDataTypes/byteArray.ts +++ b/src/utils/cairoDataTypes/byteArray.ts @@ -130,7 +130,7 @@ export class CairoByteArray extends CairoType { this.assertInitialized(); return addCompiledFlag([ - addHexPrefix(this.data.length.toString(16)), + this.data.length.toString(10), ...this.data.flatMap((bytes31) => bytes31.toApiRequest()), ...this.pending_word.toApiRequest(), ...this.pending_word_len.toApiRequest(), @@ -168,6 +168,10 @@ export class CairoByteArray extends CairoType { return addHexPrefix(hexValue); } + toDecimalString() { + return this.toBigInt().toString(10); + } + toBuffer() { const allBytes = concatenateArrayBuffer(this.toElements()); return Buffer.from(allBytes); @@ -195,6 +199,20 @@ export class CairoByteArray extends CairoType { return allChunks; } + /** + * Converts the encoded ByteArray into a plain object representation. + * @returns {Record} plain object representation of the CairoByteArray instance. + * @example + * ```ts + * const byteArray = new CairoByteArray("Token").toObject(); + * // byteArray = { '0': '0', '1': '362646562158', '2': '5' } + * ``` + */ + toObject(): Record { + this.assertInitialized(); + return { ...this.toApiRequest() }; + } + /** * Private helper to check if the CairoByteArray is properly initialized */ diff --git a/src/utils/cairoDataTypes/bytes31.ts b/src/utils/cairoDataTypes/bytes31.ts index 8b47d818e..5c672b98d 100644 --- a/src/utils/cairoDataTypes/bytes31.ts +++ b/src/utils/cairoDataTypes/bytes31.ts @@ -35,7 +35,7 @@ export class CairoBytes31 extends CairoType { } toApiRequest(): string[] { - return addCompiledFlag([this.toHexString()]); + return addCompiledFlag([this.toDecimalString()]); } toBigInt() { @@ -57,6 +57,10 @@ export class CairoBytes31 extends CairoType { return addHexPrefix(hex); } + toDecimalString() { + return this.toBigInt().toString(10); + } + static validate(data: Uint8Array | string | Buffer | unknown): void { const byteLength = CairoBytes31.__processData(data).length; assert( diff --git a/src/utils/cairoDataTypes/cairoStruct.ts b/src/utils/cairoDataTypes/cairoStruct.ts new file mode 100644 index 000000000..9cd47d7a0 --- /dev/null +++ b/src/utils/cairoDataTypes/cairoStruct.ts @@ -0,0 +1,328 @@ +import type { AbiEntry, AbiStruct, AllowArray } from '../../types'; +import assert from '../assert'; +import type { ParsingStrategy, VariantType } from '../calldata'; +import { isCairo1Type, isLen } from '../calldata/cairo'; +import { addCompiledFlag } from '../helpers'; +import { getNext } from '../num'; +import { CairoType } from './cairoType.interface'; +import { CairoFelt252 } from './felt'; + +/** + * Represents a Cairo named struct. + */ +export class CairoStruct extends CairoType { + public readonly dynamicSelector: string; + + /** Array of CairoType instances representing the struct elements. */ + public readonly content: CairoType[]; + + /** Cairo named struct type definition */ + public readonly abiStruct: AbiStruct; + + /** + * Represents a Cairo named struct. + * @param {unknown} content - Input data. (Iterator, object, array) + * @param {AbiStruct} abiStruct - Abi definition of the struct + * @param {AllowArray} parsingStrategy - parsing strategy or array of strategies, + * that includes the handling of the named struct defined in `abiStruct` (created automatically by `createAbiParser().parsingStrategies`) + * @example + * ```typescript + * const abiPoint: AbiStruct = { + * type: 'struct', + * name: 'cairo_test::Point', + * members: [{ name: 'x', type: 'core::integer::u64' }, { name: 'y', type: 'core::integer::u32' }] + * } + * // From user object + * const struct0 = new CairoStruct({x: 1, y: 2}, 'cairo_test::Point', parsingStrategies); + * // From an array + * const struct1 = new CairoStruct([1, 2], 'cairo_test::Point', parsingStrategies); + * // From an iterator + * const iterator = ['0x1', '0x2'][Symbol.iterator](); + * const struct2 = new CairoStruct(iterator, 'cairo_test::Point', parsingStrategies); + * ``` + */ + constructor( + content: unknown, + abiStruct: AbiStruct, + parsingStrategy: AllowArray + ) { + super(); + this.dynamicSelector = abiStruct.name; + this.abiStruct = abiStruct; + const strategies = Array.isArray(parsingStrategy) ? parsingStrategy : [parsingStrategy]; + if (content && typeof content === 'object' && 'next' in content) { + // "content" is an iterator + const parsedContent: CairoType[] = CairoStruct.parser( + content as Iterator, + abiStruct, + strategies + ); + this.content = parsedContent; + return; + } + if (content instanceof CairoStruct) { + this.content = content.content; + this.abiStruct = content.abiStruct; + this.dynamicSelector = content.dynamicSelector; + return; + } + CairoStruct.validate(content, abiStruct); + const structContentType: string[] = CairoStruct.getStructMembersTypes(abiStruct); + const resultContent: any[] = CairoStruct.extractValuesArray(content, abiStruct).map( + (contentItem: any, index: number) => { + // "content" is a CairoType + if ( + contentItem && + typeof contentItem === 'object' && + contentItem !== null && + 'toApiRequest' in contentItem + ) { + return contentItem as CairoType; + } + + // not an iterator, not an CairoType -> so is low level data (BigNumberish, array, object) + const strategyConstructorNum = strategies.findIndex( + (strategy: ParsingStrategy) => strategy.constructors[structContentType[index]] + ); + if (strategyConstructorNum >= 0) { + const constructor = + strategies[strategyConstructorNum].constructors[structContentType[index]]; + return constructor(contentItem, strategies, structContentType[index]); + } + + const strategyDynamicNum = strategies.findIndex((strategy: ParsingStrategy) => { + const dynamicSelectors = Object.entries(strategy.dynamicSelectors); + return dynamicSelectors.find(([, selectorFn]) => selectorFn(structContentType[index])); + }); + if (strategyDynamicNum >= 0) { + const dynamicSelectors = Object.entries(strategies[strategyDynamicNum].dynamicSelectors); + const matchingSelector = dynamicSelectors.find(([, selectorFn]) => + selectorFn(structContentType[index]) + ); + const [selectorName] = matchingSelector as [string, (type: string) => boolean]; + const dynamicConstructor = strategies[strategyDynamicNum].constructors[selectorName]; + return dynamicConstructor(contentItem, strategies, structContentType[index]); + } + throw new Error(`"${structContentType[index]}" is not a valid Cairo type`); + } + ); + this.content = resultContent; + } + + /** + * Parse data from iterator into CairoType instances using the provided parsing strategy. + * + * This is the core parsing logic that consumes data sequentially from an iterator and + * converts it into proper CairoType instances. It handles: + * - Direct constructors (primitive types like u8, u256, etc.) + * - Dynamic selectors (complex types like nested tuples, arrays) + * - Unknown types (stored as raw strings for later error handling) + * @param {Iterator} responseIterator - Iterator over string data to parse + * @param {AbiStruct} abiStruct - The Abi description of the struct + * @param {ParsingStrategy[]} parsingStrategies - The parsing strategies containing constructors and selectors + * @returns Array of parsed CairoType instances + */ + private static parser( + responseIterator: Iterator, + abiStruct: AbiStruct, + parsingStrategies: ParsingStrategy[] + ): CairoType[] { + const elementTypes: string[] = CairoStruct.getStructMembersTypes(abiStruct); + + return elementTypes.map((elementType: string) => { + const strategyConstructorNum = parsingStrategies.findIndex( + (strategy: ParsingStrategy) => strategy.constructors[elementType] + ); + if (strategyConstructorNum >= 0) { + const constructor = parsingStrategies[strategyConstructorNum].constructors[elementType]; + return constructor(responseIterator, parsingStrategies, elementType); + } + + // Check dynamic selectors (includes CairoArray, CairoFixedArray, CairoTuple, etc.) + const strategyDynamicNum = parsingStrategies.findIndex((strategy: ParsingStrategy) => { + const dynamicSelectors = Object.entries(strategy.dynamicSelectors); + return dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); + }); + if (strategyDynamicNum >= 0) { + const dynamicSelectors = Object.entries( + parsingStrategies[strategyDynamicNum].dynamicSelectors + ); + const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); + const [selectorName] = matchingSelector as [string, (type: string) => boolean]; + const dynamicConstructor = parsingStrategies[strategyDynamicNum].constructors[selectorName]; + if (dynamicConstructor) { + return dynamicConstructor(responseIterator, parsingStrategies, elementType); + } + } + + // Unknown type - fallback to felt252 constructor + const feltConstructorNum = parsingStrategies.findIndex( + (strategy: ParsingStrategy) => strategy.constructors[CairoFelt252.abiSelector] + ); + if (feltConstructorNum >= 0) { + const feltConstructor = + parsingStrategies[feltConstructorNum].constructors[CairoFelt252.abiSelector]; + return feltConstructor(responseIterator, parsingStrategies, elementType); + } + + // If even felt252 constructor is not available, collect raw value for error handling + const rawValue = getNext(responseIterator); + return rawValue as unknown as CairoType; + }); + } + + /** + * Validate input data for CairoStruct creation. + * @param {unknown} input - Input data to validate + * @param {AbiStruct} abiStruct - optional - Abi definition of the struct + * @throws Error if input is invalid + */ + static validate(input: unknown, abiStruct?: AbiStruct): void { + assert( + Array.isArray(input) || (typeof input === 'object' && input !== null), + `Invalid input: expected Array or Object, got ${typeof input}` + ); + if (!abiStruct) return; // cannot validate without ABI + assert(abiStruct.type === 'struct', `Invalid ABI: expected struct, got ${abiStruct.type}`); + const lengthInput = Array.isArray(input) ? input.length : Object.keys(input).length; + assert( + abiStruct.members.length === lengthInput, + `Invalid input: expected ${abiStruct.members.length} members, got ${lengthInput}` + ); + } + + /** + * Check if input data is valid for CairoStruct creation. + * @param {any} data - Input data to check + * @param {string} _type - not used + * @param {VariantType} _variant - not used + * @returns true if valid, false otherwise + */ + static is(data: any, _type?: string, _variant?: VariantType): boolean { + try { + CairoStruct.validate(data); + return true; + } catch { + return false; + } + } + + /** Not applicable for CairoStruct */ + static isAbiType(_type: string): boolean { + // A Cairo struct type (it's name) do not include any special pattern allowing to identify it directly. + return true; + } + + /** + * Extract an array from data representing a Cairo Struct + * @param {unknown} input - Input data (array or object) + * @returns {any[]} Array of values extracted from the input + */ + private static extractValuesArray(input: unknown, abiStruct: AbiStruct): any[] { + if (Array.isArray(input)) { + return input; + } + const inputObj = input as Record; + const orderedObject2 = abiStruct.members.reduce( + (orderedObject: Record, abiParam: AbiEntry) => { + const setProperty = (value?: any) => + Object.defineProperty(orderedObject, abiParam.name, { + enumerable: true, + value: value ?? inputObj[abiParam.name], + }); + + if (typeof inputObj[abiParam.name] === 'undefined') { + if (isCairo1Type(abiParam.type) || !isLen(abiParam.name)) { + throw Error(`Your object needs a property with key : ${abiParam.name} .`); + } + } + setProperty(inputObj[abiParam.name]); + return orderedObject; + }, + {} + ); + return Object.values(orderedObject2); + } + + /** + * Extract the Cairo type of each property of a named Cairo Struct + * @param {AbiStruct} type - Abi definition of the struct + * @returns {string[]} an array of Cairo types + */ + private static getStructMembersTypes(type: AbiStruct): string[] { + return type.members.map((member) => member.type); + } + + /** + *Extract the Cairo names of each property of a named Cairo Struct + * @param {AbiStruct} type - Abi definition of the struct + * @returns {string[]} an array of Cairo struct properties + */ + public static extractStructMembersNames(type: AbiStruct): string[] { + return type.members.map((member) => member.name); + } + + /** + * Serialize the CairoStruct into decimal strings for Starknet API requests. + * @returns {string[]} Array of hex strings ready for API requests + * ```typescript + * // for a struct {x:1, y:2} + * const result = myStruct.toApiRequest(); + * // result = ['1', '2'] + * ``` + */ + toApiRequest(): string[] { + const result = this.content.flatMap((element) => element.toApiRequest()); + return addCompiledFlag(result); + } + + /** + * Decompose the struct into final parsed values, in an object {x:value0, ...}. + * @param {AllowArray} strategyDecompose + * @returns {Object} an object of format {a:value0, b:value1, ...} + * ```typescript + * // for a struct {x:1, y:2} + * const result = myStruct.decompose(strategies); + * // result = {x:1, y:2} + * ``` + */ + public decompose(strategyDecompose: AllowArray): Object { + const strategies = Array.isArray(strategyDecompose) ? strategyDecompose : [strategyDecompose]; + const structContentType = CairoStruct.getStructMembersTypes(this.abiStruct); + const result = this.content.map((element: CairoType, index: number) => { + // For raw string values (unsupported types), throw error + if (typeof element === 'string') { + const elementType = + typeof structContentType[index] === 'string' + ? (structContentType[index] as string) + : (structContentType[index] as any).type; + throw new Error(`No parser found for element type: ${elementType} in parsing strategy`); + } + let parserName: string = structContentType[index] as string; + if (element instanceof CairoType) { + if ('dynamicSelector' in element) { + // dynamic recursive CairoType + parserName = (element as any).dynamicSelector; + } + } + const strategyDecomposeNum = strategies.findIndex( + (strategy: ParsingStrategy) => strategy.response[parserName] + ); + if (strategyDecomposeNum >= 0) { + const responseParser = strategies[strategyDecomposeNum].response[parserName]; + if (responseParser) { + return responseParser(element, strategies); + } + } + // No response parser found - throw error instead of fallback magic + throw new Error( + `No response parser found for element type: ${structContentType[index]} in parsing strategy` + ); + }); + const struct: Record = {}; + result.forEach((el, index) => { + struct[this.abiStruct.members[index].name] = el; + }); + return struct; + } +} diff --git a/src/utils/cairoDataTypes/cairoType.interface.ts b/src/utils/cairoDataTypes/cairoType.interface.ts index c2df35236..a394d509d 100644 --- a/src/utils/cairoDataTypes/cairoType.interface.ts +++ b/src/utils/cairoDataTypes/cairoType.interface.ts @@ -1,3 +1,5 @@ +import type { VariantType } from '../calldata'; + export abstract class CairoType { // Static methods cannot be abstract, but can provide base implementation // TODO: Check when ts resolves this issue @@ -7,7 +9,7 @@ export abstract class CairoType { * @param _data - The data to check * @returns True if the data is a valid CairoType, false otherwise */ - static is(_data: any, _type?: string): boolean { + static is(_data: any, _type?: string, _variant?: VariantType): boolean { throw new Error('Static method must be implemented by derived class'); } @@ -36,5 +38,5 @@ export abstract class CairoType { /** * Convert the CairoType to the API request format */ - abstract toApiRequest(): any; + abstract toApiRequest(): string[]; } diff --git a/src/utils/cairoDataTypes/cairoTypeCustomEnum.ts b/src/utils/cairoDataTypes/cairoTypeCustomEnum.ts new file mode 100644 index 000000000..ff671959c --- /dev/null +++ b/src/utils/cairoDataTypes/cairoTypeCustomEnum.ts @@ -0,0 +1,437 @@ +import assert from '../assert'; +import { addCompiledFlag } from '../helpers'; +import { getNext } from '../num'; +import { type ParsingStrategy, type VariantType } from '../calldata/parser/parsingStrategy.type'; +import { CairoType } from './cairoType.interface'; +import { isCairo1Type } from '../calldata/cairo'; +import { isUndefined } from '../typed'; +import { + CairoOptionVariant, + CairoOption, + CairoResultVariant, + CairoResult, + CairoCustomEnum, + type CairoEnumRaw, +} from '../calldata/enum'; +import { CairoTypeOption } from './cairoTypeOption'; +import type { AbiEnum, AllowArray } from '../../types'; +import { CairoTypeResult } from './cairoTypeResult'; + +/** + * Represents a Cairo custom enum. + * + * Key Features: + * - Internal usage class (users are using "CairoCustomEnum" class). + * - Unified constructor handling user input, API responses, and CairoType instances + * - Automatic type validation and conversion using parsing strategies + * - Bi-directional serialization (to/from Starknet API format) + * - Support for nested types + * - Direct CallData.compile() integration + * - Comprehensive type checking and validation + */ +export class CairoTypeCustomEnum extends CairoType { + public readonly dynamicSelector: string; + + /* CairoType instance representing the content of the Cairo enum. */ + public readonly content: CairoType; + + /** Cairo named custom enum type definition */ + public readonly abiEnum: AbiEnum; + + /* Id of the selected enum */ + public readonly enumVariant: number; + + /** + * CairoTypeCustomEnum provides a complete implementation for handling Cairo's enums, + * which have the form "my_contract::enum_name". + * + * Internal usage class (users are using "CairoResult" class). + * + * It supports nested types, type validation, encoding, and parsing from various sources. + * @param {unknown} content - Input data (array, object, BigNumberish, + * Iterator, CairoOption, CairoResult, CairoCustomEnum, or CairoType instance). + * @param {AbiEnum} abiEnum - Abi definition of the enum. + * @param {AllowArray} parsingStrategy - Parsing strategy for element type handling. + * @param {number} [variant] - (optional) variant number of the custom enum. If "content" is an iterator or a CairoCustomEnum, this parameter must be omitted. + * @param {boolean} [subType=false] - optional default=false. Use "true" if called in nested CairoResult instances. + * @example + * ```typescript + * import { CairoTypeCustomEnum } from 'starknet'; + * // from a CairoCustomEnum instance: + * const strategies = myTestContract.callData.parser.parsingStrategies; + * const abiMyEnum = myTestContract.abi.find((data: AbiEntry) => data.name == "enums::MyEnum") as AbiEnum; + * const myEnum = new CairoCustomEnum({ valid: 15n }); + * const myTypeEnum1 = new CairoTypeCustomEnum(myEnum, abiMyEnum, strategies); + * console.log(myTypeEnum1.toApiRequest()); // ['1','15'] + * console.log(myTypeEnum1.decompose(strategies)); // CairoCustomEnum instance with content 15n and `valid` variant. + * + * // From API response: + * const apiData = ['0x1', '0x20'][Symbol.iterator](); + * const fromApiResult = new CairoTypeCustomEnum(apiData, abiMyEnum, strategies); // CairoTypeCustomEnum instance with content 32n and `valid` variant. + * ``` + */ + + constructor( + content: unknown, + abiEnum: AbiEnum, + parsingStrategy: AllowArray, + variant?: number, + subType: boolean = false + ) { + super(); + this.dynamicSelector = abiEnum.name; + this.abiEnum = abiEnum; + const strategies = Array.isArray(parsingStrategy) ? parsingStrategy : [parsingStrategy]; + assert(!isUndefined(content), '"content" parameter has to be defined.'); + assert(content !== null, '"content" parameter has to be defined.'); + if (content && typeof content === 'object' && 'next' in content) { + // "content" is an iterator + assert( + isUndefined(variant), + 'when "content" parameter is an iterator, do not define "variant" parameter.' + ); + const variantFromIterator = Number(getNext(content as Iterator)); + this.enumVariant = variantFromIterator; + const elementTypes: string[] = CairoTypeCustomEnum.getVariantTypes(abiEnum); + const parsedContent: CairoType = CairoTypeCustomEnum.parser( + content as Iterator, + elementTypes[variantFromIterator], + strategies + ); + this.content = parsedContent; + return; + } + if (content instanceof CairoTypeCustomEnum) { + assert( + isUndefined(variant), + 'when "content" parameter is a CairoTypeCustomEnum do not define "variant" parameter.' + ); + this.content = content.content; + this.enumVariant = content.enumVariant; + this.dynamicSelector = content.dynamicSelector; + this.abiEnum = content.abiEnum; + return; + } + CairoTypeCustomEnum.validate(content, abiEnum.name, variant); + // "content" is a CairoType + if (content && typeof content === 'object' && content !== null && 'toApiRequest' in content) { + assert( + !isUndefined(variant), + '"variant" parameter is mandatory when creating a new Cairo enum from a CairoType.' + ); + this.content = content as CairoType; + this.enumVariant = variant; + return; + } + + // "content" is a CairoOption + if (content instanceof CairoOption) { + assert( + !isUndefined(variant), + '"variant" parameter is mandatory when creating a new Cairo custom enum from a CairoOption.' + ); + const option = new CairoTypeOption( + content.unwrap(), + CairoTypeCustomEnum.getVariantTypes(abiEnum)[variant], + strategies, + content.isSome() ? CairoOptionVariant.Some : CairoOptionVariant.None + ); + this.content = option; + this.enumVariant = variant; + return; + } + + // "content" is a CairoResult + if (content instanceof CairoResult) { + assert( + !isUndefined(variant), + '"variant" parameter is mandatory when creating a new Cairo custom enum from a CairoResult.' + ); + const option = new CairoTypeResult( + content.unwrap(), + CairoTypeCustomEnum.getVariantTypes(abiEnum)[variant], + strategies, + content.isOk() ? CairoResultVariant.Ok : CairoResultVariant.Err + ); + this.content = option; + this.enumVariant = variant; + return; + } + + // "content" is a CairoCustomEnum + if (content instanceof CairoCustomEnum) { + if (!subType) { + const subVariant: number = CairoTypeCustomEnum.extractEnumMembersNames(abiEnum).indexOf( + content.activeVariant() + ); + assert(subVariant >= 0, `${content.activeVariant()} activeVariant is unknown in AbiEnum.`); + const customEnum = new CairoTypeCustomEnum( + content.unwrap(), + abiEnum, + strategies, + subVariant, + true // recursive sub-type + ); + this.content = customEnum.content; + this.enumVariant = customEnum.enumVariant; + return; + } + assert( + !isUndefined(variant), + '"variant" parameter is mandatory when creating a new Cairo custom enum from a CairoCustomEnum.' + ); + } + // not an iterator, not an CairoType -> so is low level data (BigNumberish, array, object) + assert( + !isUndefined(variant), + '"variant" parameter is mandatory when creating a new Cairo custom enum from a Cairo Enum or raw data.' + ); + const numberVariant = Number(variant); + assert( + numberVariant < abiEnum.variants.length && numberVariant >= 0, + `The custom enum ${abiEnum.name} variant must be in the range 0..${abiEnum.variants.length - 1}. You requested variant #${numberVariant}` + ); + this.enumVariant = variant; + const elementType = CairoTypeCustomEnum.getVariantTypes(abiEnum)[variant]; + const strategyConstructorNum = strategies.findIndex( + (strategy: ParsingStrategy) => strategy.constructors[elementType] + ); + if (strategyConstructorNum >= 0) { + const constructor = strategies[strategyConstructorNum].constructors[elementType]; + this.content = constructor(content, strategies, elementType, variant); + return; + } + const strategyDynamicNum = strategies.findIndex((strategy: ParsingStrategy) => { + const dynamicSelectors = Object.entries(strategy.dynamicSelectors); + return dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); + }); + if (strategyDynamicNum >= 0) { + const dynamicSelectors = Object.entries(strategies[strategyDynamicNum].dynamicSelectors); + const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); + const [selectorName] = matchingSelector as [string, (type: string) => boolean]; + const dynamicConstructor = strategies[strategyDynamicNum].constructors[selectorName]; + this.content = dynamicConstructor(content, strategies, elementType, variant); + return; + } + throw new Error(`"${elementType}" is not a valid Cairo type`); + } + + /** + * Parse data from iterator into CairoType instances using the provided parsing strategy. + * + * This is the core parsing logic that consumes data sequentially from an iterator and + * converts it into proper CairoType instances. It handles: + * - Direct constructors (primitive types like u8, u256, etc.) + * - Dynamic selectors (complex types like nested fixed arrays) + * - Unknown types (stored as raw strings for later error handling) + * + * @param {Iterator} responseIterator - Iterator over string data to parse + * @param {string} variantCairoType - The Cairo type of the variant of the custom enum (e.g., "core::integer::u8") + * @param {ParsingStrategy[]} parsingStrategies - The parsing strategy containing constructors and selectors + * @returns {CairoType} CairoType instance + * @private + */ + private static parser( + responseIterator: Iterator, + variantCairoType: string, + parsingStrategies: ParsingStrategy[] + ): CairoType { + const strategyConstructorNum = parsingStrategies.findIndex( + (strategy: ParsingStrategy) => strategy.constructors[variantCairoType] + ); + if (strategyConstructorNum >= 0) { + const constructor = parsingStrategies[strategyConstructorNum].constructors[variantCairoType]; + return constructor(responseIterator, parsingStrategies, variantCairoType); + } + const strategyDynamicNum = parsingStrategies.findIndex((strategy: ParsingStrategy) => { + const dynamicSelectors = Object.entries(strategy.dynamicSelectors); + return dynamicSelectors.find(([, selectorFn]) => selectorFn(variantCairoType)); + }); + if (strategyDynamicNum >= 0) { + const dynamicSelectors = Object.entries( + parsingStrategies[strategyDynamicNum].dynamicSelectors + ); + const matchingSelector = dynamicSelectors.find(([, selectorFn]) => + selectorFn(variantCairoType) + ); + const [selectorName] = matchingSelector as [string, (type: string) => boolean]; + const dynamicConstructor = parsingStrategies[strategyDynamicNum].constructors[selectorName]; + if (dynamicConstructor) { + return dynamicConstructor(responseIterator, parsingStrategies, variantCairoType); + } + } + // Unknown type - collect raw values, defer error + const rawValues = getNext(responseIterator); + return rawValues as unknown as CairoType; + } + + /** + * Validate input data for CairoTypeCustomEnum creation. + * @param {unknown} _input - Input data to validate + * @param {string} type - The Abi definition of the enum + * @param {VariantType} _variant - The variant of the enum (0, "1", 2, ...) + * @throws Error if input is invalid + */ + static validate(_input: unknown, type: string, _variant: VariantType | undefined): void { + assert( + CairoTypeCustomEnum.isAbiType(type), + `The type ${type} is not a Cairo Enum. Needs impl::name.` + ); + } + + /** + * Check if input data is valid for CairoTypeCustomEnum creation. + * @param {unknown} input - Input data to check + * @param {string} type - The Cairo Custom Enum type (e.g. "core::integer::u16") + * @param {VariantType} variant - The variant of the enum. + * @returns {boolean} true if valid, false otherwise + */ + static is(input: unknown, type: string, variant: VariantType): boolean { + try { + CairoTypeCustomEnum.validate(input, type, variant); + return true; + } catch { + return false; + } + } + + /** + * Checks if the given string represents a valid Cairo custom enum variant type format. + * Type is any valid Cairo type. + * @param {string} type - The type string to validate + * @returns {boolean} `true` if the type is a valid Cairo custom enum format, `false` otherwise + * @example + * ```typescript + * CairoTypeCustomEnum.isAbiType("my_contract::my_enum"); // true + * ``` + */ + static isAbiType(type: string): boolean { + return isCairo1Type(type); + } + + /** + * Extract the Cairo type of each property of a named Cairo Enum + * @param {AbiEnum} type - Abi definition of the enum + * @returns {string[]} an array of Cairo types + * @example + * ```typescript + * const abiEnum: AbiEnum = { + * type: "enum", + * name: "my_enum", + * variants: [ + * { name: "variant1", type: "core::integer::u8" }, + * { name: "variant2", type: "core::integer::u16" } + * ] + * }; + * const types = CairoTypeCustomEnum.getVariantTypes(abiEnum); + * // types = ["core::integer::u8", "core::integer::u16"] + * ``` + */ + private static getVariantTypes(type: AbiEnum): string[] { + return type.variants.map((member) => member.type); + } + + /** + *Extract the Cairo names of each property of a Cairo custom enum + * @param {AbiStruct} type - Abi definition of the enum + * @returns {string[]} an array of Cairo enum property names + * @example + * ```typescript + * const abiEnum: AbiEnum = { + * type: "enum", + * name: "my_enum", + * variants: [ + * { name: "variant1", type: "core::integer::u8" }, + * { name: "variant2", type: "core::integer::u16" } + * ] + * }; + * const variantList = CairoTypeCustomEnum.extractEnumMembersNames(abiEnum); + * // variantList = ["variant1", "variant2"] + * ``` + */ + public static extractEnumMembersNames(type: AbiEnum): string[] { + return type.variants.map((member) => member.name); + } + + /** + * Serialize the Cairo custom enum into decimal strings for Starknet API requests. + * + * Converts all CairoType elements in this Cairo custom enum into their hex string representation + * by calling `toApiRequest()`. This is used when + * sending data to the Starknet network. + * + * @returns {string[]} Array of decimal strings ready for API requests + * @example + * ```typescript + * const strategies = myTestContract.callData.parser.parsingStrategies; + * const abiMyEnum = myTestContract.abi.find((data: AbiEntry) => data.name == "enums::MyEnum") as AbiEnum; + * const myEnum = new CairoCustomEnum({ valid: 15n }); + * const myTypeEnum1 = new CairoTypeCustomEnum(myEnum, abiMyEnum, strategies); + * const encoded = myTypeEnum1.toApiRequest()); + * // encoded = ['1','15'] + * ``` + */ + public toApiRequest(): string[] { + const result: string[] = [this.enumVariant.toString(10)]; + result.push(...this.content!.toApiRequest()); + return addCompiledFlag(result.flat()); + } + + /** + * Decompose the CairoTypeResult instance into a CairoResult instance. + * + * Transforms CairoType instances into their final parsed values using the strategy's + * response parsers (e.g., CairoUint8 → BigInt). This method is used primarily for + * parsing API responses into user-friendly formats. + * + * @param {AllowArray} strategyDecompose - Parsing strategy for response parsing + * @returns {CairoCustomEnum} a CairoCustomEnum instance, with parsed variant (BigInt, numbers, nested arrays, etc.) + * @example + * ```typescript + * const strategies = myTestContract.callData.parser.parsingStrategies; + * const abiMyEnum = myTestContract.abi.find((data: AbiEntry) => data.name == "enums::MyEnum") as AbiEnum; + * const myEnum = new CairoCustomEnum({ valid: 15n }); + * const myTypeEnum1 = new CairoTypeCustomEnum(myEnum, abiMyEnum, strategies); + * const parsed = myTypeEnum1.decompose(strategies); + * // parsed = CairoCustomEnum{ valid: 15n } + * ``` + */ + public decompose(strategyDecompose: AllowArray): CairoCustomEnum { + const { content } = this; + const strategies = Array.isArray(strategyDecompose) ? strategyDecompose : [strategyDecompose]; + // For raw string values (unsupported types), throw error + const enumTypes = CairoTypeCustomEnum.getVariantTypes(this.abiEnum); + const elementType = enumTypes[this.enumVariant]; + const elementNames = CairoTypeCustomEnum.extractEnumMembersNames(this.abiEnum); + if (typeof content === 'string') { + throw new Error(`No parser found for element type: ${elementType} in parsing strategy`); + } + let parserName: string = elementType; + if (content instanceof CairoType) { + if ('dynamicSelector' in content) { + // dynamic recursive CairoType + parserName = (content as any).dynamicSelector; + } + } + const strategyDecomposeNum = strategies.findIndex( + (strategy: ParsingStrategy) => strategy.response[parserName] + ); + const responseParser = strategies[strategyDecomposeNum].response[parserName]; + if (responseParser) { + const resultObject: CairoEnumRaw = elementNames.reduce( + (current: CairoEnumRaw, name: string, index: number) => { + if (index === this.enumVariant) { + return { ...current, [name]: responseParser(content as CairoType, strategies) }; + } + return { ...current, [name]: undefined }; + }, + {} + ); + return new CairoCustomEnum(resultObject); + } + // No response parser found - throw error instead of fallback magic + throw new Error( + `No response parser found for element type: ${elementType} in parsing strategy` + ); + } +} diff --git a/src/utils/cairoDataTypes/cairoTypeOption.ts b/src/utils/cairoDataTypes/cairoTypeOption.ts new file mode 100644 index 000000000..a3d1ae615 --- /dev/null +++ b/src/utils/cairoDataTypes/cairoTypeOption.ts @@ -0,0 +1,389 @@ +import assert from '../assert'; +import { addCompiledFlag } from '../helpers'; +import { getNext } from '../num'; +import { type ParsingStrategy, type VariantType } from '../calldata/parser/parsingStrategy.type'; +import { CairoType } from './cairoType.interface'; +import { isTypeOption } from '../calldata/cairo'; +import { isUndefined } from '../typed'; +import { CairoOptionVariant, CairoOption } from '../calldata/enum'; +import type { AllowArray } from '../../types'; + +/** + * Represents a Cairo Option. + * + * Key Features: + * - Internal usage class (users are using "CairoOption" class). + * - Unified constructor handling user input, API responses, and CairoType instances + * - Automatic type validation and conversion using parsing strategies + * - Bi-directional serialization (to/from Starknet API format) + * - Support for nested types + * - Direct CallData.compile() integration + * - Comprehensive type checking and validation + */ +export class CairoTypeOption extends CairoType { + static dynamicSelector = 'CairoTypeOption' as const; + + public readonly dynamicSelector = CairoTypeOption.dynamicSelector; + + /* CairoType instance representing the content of a Cairo option. */ + public readonly content: CairoType | undefined; + + /* Cairo type of the option. */ + public readonly optionCairoType: string; + + /* True if the current variant is 'Some', false if 'None'. */ + public readonly isVariantSome: boolean; + + /** + * CairoTypeOption provides a complete implementation for handling Cairo's Option, + * which have the form "core::option::Option::" (e.g., "core::option::Option::"). + * Internal usage class (users are using "CairoOption" class). + * It supports nested types, type validation, encoding, and parsing from various sources. + * @param {unknown} content - Input data (array, object, BigNumberish, + * Iterator, CairoOption, CairoResult, CairoCustomEnum, or CairoType instance). + * "content" parameter has to be defined when Some variant is selected + * @param {string} optionCairoType - Cairo option type string (e.g., "core::option::Option::"). + * @param {AllowArray} parsingStrategy - Parsing strategy for element type handling (e.g. hdParsingStrategy). + * @param {CairoOptionVariant | number} [variant] - (optional) variant of the option: CairoOptionVariant.Some (0), or CairoOptionVariant.None (1). If "content" is an iterator, this parameter must be omitted. + * @param {boolean} [subType=false] - optional default=false. Use "true" if called in nested CairoOption instances. + * @example + * ```typescript + * import { CairoTypeOption, hdParsingStrategy, CairoOptionVariant } from 'starknet'; + * // Simple Option with Some variant + * const myOption1 = new CairoTypeOption(7, "core::option::Option::", hdParsingStrategy, CairoOptionVariant.Some); + * console.log(myOption1.toApiRequest()); // ['0', '7'] + * console.log(myOption1.decompose(hdParsingStrategy)); // CairoOption instance with content 7n and Some variant. + * // Simple Option with None variant + * const myOption2 = new CairoTypeOption(undefined, "core::option::Option::", hdParsingStrategy, CairoOptionVariant.None); + * + * // Nested Cairo types + * const myTuple0 = new CairoTuple([234, [1, 2, 3]], "(core::integer::u8, core::array::Array::)", hdParsingStrategy); + * const myOption3 = new CairoTypeOption(myTuple0, "core::option::Option::<(core::integer::u8, core::array::Array::)>", hdParsingStrategy, CairoOptionVariant.Some); + * console.log(CallData.compile([myOption3])); // [ "0", "234", "3", "1", "2", "3" ] + * + * // From API response + * const apiData = ['0x0', '0x20'][Symbol.iterator](); + * const fromApiOption = new CairoTypeOption(apiData, "core::option::Option::", hdParsingStrategy); // CairoOption instance with content 32n and Some variant. + * ``` + */ + constructor( + content: unknown, + optionCairoType: string, + parsingStrategy: AllowArray, + variant?: CairoOptionVariant | number, + subType: boolean = false + ) { + super(); + this.optionCairoType = optionCairoType; + const strategies = Array.isArray(parsingStrategy) ? parsingStrategy : [parsingStrategy]; + if (variant === CairoOptionVariant.Some && isUndefined(content)) { + throw new Error('"content" parameter has to be defined when Some variant is selected'); + } + if (variant === CairoOptionVariant.None && !isUndefined(content)) { + throw new Error('"content" parameter has to be NOT defined when None variant is selected'); + } + if (content && typeof content === 'object' && 'next' in content) { + // "content" is an iterator + assert( + isUndefined(variant), + 'when "content" parameter is an iterator, do not define "variant" parameter.' + ); + const variantFromIterator = Number(getNext(content as Iterator)); + switch (variantFromIterator) { + case CairoOptionVariant.Some: { + const parsedContent: CairoType = CairoTypeOption.parser( + content as Iterator, + optionCairoType, + strategies + ); + this.content = parsedContent; + break; + } + case CairoOptionVariant.None: { + this.content = undefined; + break; + } + default: { + throw new Error('Invalid Option variant in iterator.'); + } + } + this.isVariantSome = variantFromIterator === CairoOptionVariant.Some; + return; + } + if (content instanceof CairoTypeOption) { + this.content = content.content; + this.isVariantSome = content.isVariantSome; + this.optionCairoType = content.optionCairoType; + return; + } + CairoTypeOption.validate(content, optionCairoType, variant); + if (content && typeof content === 'object' && content !== null && 'toApiRequest' in content) { + // "content" is a CairoType + this.content = content as CairoType; + this.isVariantSome = variant === CairoOptionVariant.Some; + return; + } + if (content instanceof CairoOption) { + // "content" is a CairoOption + if (!subType) { + const option = new CairoTypeOption( + content.unwrap(), + optionCairoType, + strategies, + content.isSome() ? CairoOptionVariant.Some : CairoOptionVariant.None, + true // recursive sub-type + ); + this.content = option.content; + this.isVariantSome = option.isVariantSome; + return; + } + assert( + !isUndefined(variant), + '"variant" parameter is mandatory when creating a new Cairo custom enum from a CairoOption.' + ); + } + + // not an iterator, not an CairoType -> so is low level data (BigNumberish, array, object, Cairo Enum) + assert( + !isUndefined(variant), + '"variant" parameter is mandatory when creating a new Cairo option from a "CairoType" or raw data.' + ); + this.isVariantSome = true; + switch (variant) { + case CairoOptionVariant.Some: { + const elementType = CairoTypeOption.getVariantSomeType(optionCairoType); + const strategyConstructorNum = strategies.findIndex( + (strategy: ParsingStrategy) => strategy.constructors[elementType] + ); + if (strategyConstructorNum >= 0) { + const constructor = strategies[strategyConstructorNum].constructors[elementType]; + this.content = constructor(content, strategies, elementType); + return; + } + const strategyDynamicNum = strategies.findIndex((strategy: ParsingStrategy) => { + const dynamicSelectors = Object.entries(strategy.dynamicSelectors); + return dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); + }); + if (strategyDynamicNum >= 0) { + const dynamicSelectors = Object.entries(strategies[strategyDynamicNum].dynamicSelectors); + const matchingSelector = dynamicSelectors.find(([, selectorFn]) => + selectorFn(elementType) + ); + const [selectorName] = matchingSelector as [string, (type: string) => boolean]; + const dynamicConstructor = strategies[strategyDynamicNum].constructors[selectorName]; + this.content = dynamicConstructor(content, strategies, elementType); + } + break; + } + case CairoOptionVariant.None: { + this.isVariantSome = false; + this.content = undefined; + break; + } + default: { + throw new Error('Invalid Option variant.'); + } + } + } + + /** + * Parse data from iterator into CairoType instances using the provided parsing strategy. + * + * This is the core parsing logic that consumes data sequentially from an iterator and + * converts it into proper CairoType instances. It handles: + * - Direct constructors (primitive types like u8, u256, etc.) + * - Dynamic selectors (complex types like nested fixed arrays) + * - Unknown types (stored as raw strings for later error handling) + * + * @param {Iterator} responseIterator - Iterator over string data to parse + * @param {string} someVariantCairoType - The Cairo option type (e.g., "core::option::Option::") + * @param {ParsingStrategy[]} parsingStrategies - The parsing strategy containing constructors and selectors + * @returns {CairoType} CairoType instance + * @private + */ + private static parser( + responseIterator: Iterator, + someVariantCairoType: string, + parsingStrategies: ParsingStrategy[] + ): CairoType { + const elementType = CairoTypeOption.getVariantSomeType(someVariantCairoType); + const strategyConstructorNum = parsingStrategies.findIndex( + (strategy: ParsingStrategy) => strategy.constructors[elementType] + ); + if (strategyConstructorNum >= 0) { + const constructor = parsingStrategies[strategyConstructorNum].constructors[elementType]; + return constructor(responseIterator, parsingStrategies, elementType); + } + const strategyDynamicNum = parsingStrategies.findIndex((strategy: ParsingStrategy) => { + const dynamicSelectors = Object.entries(strategy.dynamicSelectors); + return dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); + }); + if (strategyDynamicNum >= 0) { + const dynamicSelectors = Object.entries( + parsingStrategies[strategyDynamicNum].dynamicSelectors + ); + const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); + const [selectorName] = matchingSelector as [string, (type: string) => boolean]; + const dynamicConstructor = parsingStrategies[strategyDynamicNum].constructors[selectorName]; + if (dynamicConstructor) { + return dynamicConstructor(responseIterator, parsingStrategies, elementType); + } + } + // Unknown type - collect raw values, defer error + const rawValues = getNext(responseIterator); + return rawValues as unknown as CairoType; + } + + /** + * Retrieve the Cairo content type from a Cairo option type. + * @param {string} type - The Cairo option type string. + * @returns {string} The Some Cairo type of the Cairo option. + * @example + * ```typescript + * const result = CairoTypeOption.getVariantSomeType("core::option::Option::"); + * // result = "core::integer::u8" + * ``` + */ + static getVariantSomeType(type: string): string { + const matchArray = type.match(/(?<=<).+(?=>)/); + if (matchArray === null) + throw new Error(`ABI type ${type} do not includes a valid type of data.`); + return matchArray[0]; + } + + /** + * Validate input data for CairoTypeOption creation. + * @param {unknown} _input - Input data to validate + * @param {string} type - The Cairo option type string (e.g., "core::option::Option::") + * @throws Error if input is invalid + * @example + * ```typescript + * CairoTypeOption.validate(200, "core::option::Option::", CairoOptionVariant.Some); // passes + * CairoTypeOption.validate(200, "wrong", 3); // throws + * ``` + */ + static validate(_input: unknown, type: string, variant: VariantType | undefined): void { + assert( + CairoTypeOption.isAbiType(type), + `The type ${type} is not a Cairo option. Needs core::option::Option::.` + ); + if (!isUndefined(variant)) { + const numberVariant = Number(variant); + assert( + [0, 1].includes(numberVariant), + 'In Cairo option, only 0 or 1 variants are authorized.' + ); + } + } + + /** + * Check if input data is valid for CairoTypeOption creation. + * @param {unknown} input - Input data to check + * @param {string} type - The Cairo option type (e.g., "core::option::Option::") + * @param {VariantType} variant - The variant of the option (Some or None) + * @returns {boolean} true if valid, false otherwise + * @example + * ```typescript + * const isValid1 = CairoTypeOption.is(200, "core::option::Option::", CairoOptionVariant.Some"); // true + * const isValid2 = CairoTypeOption.is(200, "wrong", 3); // false + * ``` + */ + static is(input: unknown, type: string, variant: VariantType): boolean { + try { + CairoTypeOption.validate(input, type, variant); + return true; + } catch { + return false; + } + } + + /** + * Checks if the given string represents a valid Cairo option type format. + * + * A valid Cairo option type must follow the pattern: "core::option::Option::" + * where element_type is any valid Cairo type. + * @param {string} type - The type string to validate + * @returns {boolean} `true` if the type is a valid Cairo option format, `false` otherwise + * @example + * ```typescript + * CairoTypeOption.isAbiType("core::option::Option::"); // true + * ``` + */ + static isAbiType(type: string): boolean { + return isTypeOption(type); + } + + /** + * Serialize the Cairo option into decimal strings for Starknet API requests. + * + * Converts all CairoType elements in this Cairo option into their hex string representation + * by calling toApiRequest(). This is used when + * sending data to the Starknet network. + * + * @returns {string[]} Array of decimal strings ready for API requests + * @example + * ```typescript + * const myOption = new CairoTypeOption(8, "core::option::Option::", strategy, CairoOptionVariant.Some); + * const result = myOption.toApiRequest(); // ['0', '8'] + * ``` + */ + public toApiRequest(): string[] { + const result: string[] = [this.isVariantSome ? '0' : '1']; + if (this.isVariantSome) { + result.push(...this.content!.toApiRequest()); + } + return addCompiledFlag(result.flat()); + } + + private decomposeSome(strategyDecompose: AllowArray): any { + const { content } = this; + const strategies = Array.isArray(strategyDecompose) ? strategyDecompose : [strategyDecompose]; + const elementType = CairoTypeOption.getVariantSomeType(this.optionCairoType); + // For raw string values (unsupported types), throw error + if (typeof content === 'string') { + throw new Error(`No parser found for element type: ${elementType} in parsing strategy`); + } + let parserName: string = elementType; + if (content instanceof CairoType) { + if ('dynamicSelector' in content) { + // dynamic recursive CairoType + parserName = (content as any).dynamicSelector; + } + } + const strategyDecomposeNum = strategies.findIndex( + (strategy: ParsingStrategy) => strategy.response[parserName] + ); + const responseParser = strategies[strategyDecomposeNum].response[parserName]; + if (responseParser) { + return responseParser(content as CairoType, strategies); + } + + // No response parser found - throw error instead of fallback magic + throw new Error( + `No response parser found for element type: ${elementType} in parsing strategy` + ); + } + + /** + * Decompose the CairoTypeOption instance into a CairoOption instance. + * + * Transforms CairoType instances into their final parsed values using the strategy's + * response parsers (e.g., CairoUint8 → BigInt). This method is used primarily for + * parsing API responses into user-friendly formats. + * + * @param {AllowArray} strategyDecompose - Parsing strategy for response parsing + * @returns {CairoOption} a CairoOptionInstance, with parsed variant (BigInt, numbers, nested arrays, etc.) + * @example + * ```typescript + * const myOption = new CairoTypedOption(3, "core::option::Option::", hdParsingStrategy, CairoOptionVariant.Some); + * const parsed = myOption.decompose(hdParsingStrategy); // CairoOption{ Some: 3n } + * ``` + */ + public decompose(strategyDecompose: AllowArray): CairoOption { + if (this.isVariantSome) { + const someContent = this.decomposeSome(strategyDecompose); + return new CairoOption(CairoOptionVariant.Some, someContent); + } + return new CairoOption(CairoOptionVariant.None); + } +} diff --git a/src/utils/cairoDataTypes/cairoTypeResult.ts b/src/utils/cairoDataTypes/cairoTypeResult.ts new file mode 100644 index 000000000..8f82f4f12 --- /dev/null +++ b/src/utils/cairoDataTypes/cairoTypeResult.ts @@ -0,0 +1,369 @@ +import assert from '../assert'; +import { addCompiledFlag } from '../helpers'; +import { getNext } from '../num'; +import { type ParsingStrategy, type VariantType } from '../calldata/parser/parsingStrategy.type'; +import { CairoType } from './cairoType.interface'; +import { isTypeResult } from '../calldata/cairo'; +import { isUndefined } from '../typed'; +import { CairoResultVariant, CairoResult } from '../calldata/enum'; +import { CairoTuple } from './tuple'; +import type { AllowArray } from '../../types'; + +/** + * Represents a Cairo Result enum. + * + * Key Features: + * - Internal usage class (users are using "CairoResult" class). + * - Unified constructor handling user input, API responses, and CairoType instances + * - Automatic type validation and conversion using parsing strategies + * - Bi-directional serialization (to/from Starknet API format) + * - Support for nested types + * - Direct CallData.compile() integration + * - Comprehensive type checking and validation + */ +export class CairoTypeResult extends CairoType { + static dynamicSelector = 'CairoTypeResult' as const; + + public readonly dynamicSelector = CairoTypeResult.dynamicSelector; + + /* CairoType instance representing the content of a Cairo result. */ + public readonly content: CairoType; + + /* Cairo type of the result enum. */ + public readonly resultCairoType: string; + + /* True if the current variant is 'Ok', false if 'Err'. */ + public readonly isVariantOk: boolean; + + /** + * CairoTypeResult provides a complete implementation for handling Cairo's result, + * which have the form "core::result::Result::" (e.g., "core::result::Result::"). + * Internal usage class (users are using "CairoResult" class). + * It supports nested types, type validation, encoding, and parsing from various sources. + * @param {unknown} content - Input data (array, object, BigNumberish, + * Iterator, CairoOption, CairoResult, CairoCustomEnum, or CairoType instance). + * @param {string} resultCairoType - Cairo result type string (e.g., "core::result::Result::"). + * @param {AllowArray} parsingStrategy - Parsing strategy for element type handling (e.g. hdParsingStrategy). + * @param {CairoResultVariant | number} [variant] - (optional) variant of the result: CairoResultVariant.Ok (0), or CairoResultVariant.Err (1). If "content" is an iterator, this parameter must be omitted. + * @param {boolean} [subType=false] - optional default=false. Use "true" if called in nested CairoResult instances. + * @example + * ```typescript + * import { CairoTypeResult, hdParsingStrategy, CairoResultVariant } from 'starknet'; + * // Simple Result with Ok variant + * const myResult1 = new CairoTypeResult(7, "core::result::Result::", hdParsingStrategy, CairoResultVariant.Ok); + * console.log(myResult1.toApiRequest()); // ['1','7'] + * console.log(myResult1.decompose(hdParsingStrategy)); // CairoResult instance with content 7n and Ok variant. + * // Simple Result with Err variant + * const myResult2 = new CairoTypeResult(11, "core::result::Result::", hdParsingStrategy, CairoResultVariant.Err); + * + * // Nested Cairo types + * const myTuple0 = new CairoTuple([234, [1, 2, 3]], "(core::integer::u8, core::array::Array::)", hdParsingStrategy); + * const myResult3 = new CairoTypeResult(myTuple0, "core::result::Result::<(core::integer::u8, core::array::Array::), core::integer::u16>", hdParsingStrategy, CairoResultVariant.Ok); + * console.log(CallData.compile([myResult3])); // [ "0", "234", "3", "1", "2", "3" ] + * + * // From API response + * const apiData = ['0x0', '0x20'][Symbol.iterator](); + * const fromApiResult = new CairoTypeResult(apiData, "core::result::Result::", hdParsingStrategy); // CairoResult instance with content 32n and Ok variant. + * ``` + */ + constructor( + content: unknown, + resultCairoType: string, + parsingStrategy: AllowArray, + variant?: CairoResultVariant | number, + subType: boolean = false + ) { + super(); + this.resultCairoType = resultCairoType; + const strategies = Array.isArray(parsingStrategy) ? parsingStrategy : [parsingStrategy]; + assert(!isUndefined(content), '"content" parameter has to be defined.'); + assert(content !== null, '"content" parameter has to be defined.'); + if (typeof content === 'object' && 'next' in content) { + // "content" is an iterator + assert( + isUndefined(variant), + 'when "content" parameter is an iterator, do not define "variant" parameter.' + ); + const variantFromIterator = Number(getNext(content as Iterator)); + const activeVariantType = + CairoTypeResult.getVariantTypes(resultCairoType)[variantFromIterator]; + const parsedContent: CairoType = CairoTypeResult.parser( + content as Iterator, + activeVariantType, + strategies + ); + this.content = parsedContent; + this.isVariantOk = variantFromIterator === CairoResultVariant.Ok; + return; + } + if (content instanceof CairoTypeResult) { + assert( + isUndefined(variant), + 'when "content" parameter is a CairoTypeResult, do not define "variant" parameter.' + ); + this.content = content.content; + this.isVariantOk = content.isVariantOk; + this.resultCairoType = content.resultCairoType; + return; + } + CairoTypeResult.validate(content, resultCairoType, variant); + if (content && typeof content === 'object' && content !== null && 'toApiRequest' in content) { + // "content" is a CairoType + assert( + !isUndefined(variant), + '"variant" parameter is mandatory when creating a new Cairo Result from a CairoType.' + ); + this.content = content as CairoType; + this.isVariantOk = variant === CairoResultVariant.Ok; + return; + } + if (content instanceof CairoResult) { + // "content" is a CairoResult + if (!subType) { + assert( + isUndefined(variant), + 'when "content" parameter is a CairoResult and subType is false, do not define "variant" parameter.' + ); + const variantForResult = content.isOk() ? CairoResultVariant.Ok : CairoResultVariant.Err; + const result = new CairoTypeResult( + content.unwrap(), + resultCairoType, + strategies, + variantForResult, + true // recursive sub-type + ); + this.content = result.content; + this.isVariantOk = content.isOk(); + return; + } + } + + // not an iterator, not an CairoType -> so is low level data (BigNumberish, array, object, Cairo Enum) + assert( + !isUndefined(variant), + '"variant" parameter is mandatory when creating a new Cairo Result from a Cairo Enum or raw data.' + ); + this.isVariantOk = variant === CairoResultVariant.Ok; + const elementType = CairoTypeResult.getVariantTypes(resultCairoType)[variant]; + const strategyConstructorNum = strategies.findIndex( + (strategy: ParsingStrategy) => strategy.constructors[elementType] + ); + if (strategyConstructorNum >= 0) { + const constructor = strategies[strategyConstructorNum].constructors[elementType]; + this.content = constructor(content, strategies, elementType); + return; + } + const strategyDynamicNum = strategies.findIndex((strategy: ParsingStrategy) => { + const dynamicSelectors = Object.entries(strategy.dynamicSelectors); + return dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); + }); + if (strategyDynamicNum >= 0) { + const dynamicSelectors = Object.entries(strategies[strategyDynamicNum].dynamicSelectors); + const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); + const [selectorName] = matchingSelector as [string, (type: string) => boolean]; + const dynamicConstructor = strategies[strategyDynamicNum].constructors[selectorName]; + this.content = dynamicConstructor(content, strategies, elementType); + return; + } + throw new Error(`"${elementType}" is not a valid Cairo type`); + } + + /** + * Parse data from iterator into CairoType instances using the provided parsing strategy. + * + * This is the core parsing logic that consumes data sequentially from an iterator and + * converts it into proper CairoType instances. It handles: + * - Direct constructors (primitive types like u8, u256, etc.) + * - Dynamic selectors (complex types like nested fixed arrays) + * - Unknown types (stored as raw strings for later error handling) + * + * @param {Iterator} responseIterator - Iterator over string data to parse + * @param {string} elementType - The Cairo result type (e.g., "core::result::Result::") + * @param {ParsingStrategy[]} parsingStrategies - The parsing strategy containing constructors and selectors + * @returns {CairoType} CairoType instance + * @private + */ + private static parser( + responseIterator: Iterator, + elementType: string, + parsingStrategies: ParsingStrategy[] + ): CairoType { + const strategyConstructorNum = parsingStrategies.findIndex( + (strategy: ParsingStrategy) => strategy.constructors[elementType] + ); + if (strategyConstructorNum >= 0) { + const constructor = parsingStrategies[strategyConstructorNum].constructors[elementType]; + return constructor(responseIterator, parsingStrategies, elementType); + } + const strategyDynamicNum = parsingStrategies.findIndex((strategy: ParsingStrategy) => { + const dynamicSelectors = Object.entries(strategy.dynamicSelectors); + return dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); + }); + if (strategyDynamicNum >= 0) { + const dynamicSelectors = Object.entries( + parsingStrategies[strategyDynamicNum].dynamicSelectors + ); + const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); + const [selectorName] = matchingSelector as [string, (type: string) => boolean]; + const dynamicConstructor = parsingStrategies[strategyDynamicNum].constructors[selectorName]; + if (dynamicConstructor) { + return dynamicConstructor(responseIterator, parsingStrategies, elementType); + } + } + // Unknown type - collect raw values, defer error + const rawValues = getNext(responseIterator); + return rawValues as unknown as CairoType; + } + + /** + * Retrieve the Cairo content type from a Cairo Result type. + * @param {string} type - The Cairo Result type string. + * @returns {string[]} The Cairo types of the possible contents of the Cairo Result. + * @example + * ```typescript + * const result = CairoTypeResult.getVariantSomeType("core::result::Result::"); + * // result = [" core::integer::u8", "core::integer::u16"] + * ``` + */ + static getVariantTypes(type: string): string[] { + const matchArray = type.match(/(?<=<).+(?=>)/); + if (matchArray === null) + throw new Error(`ABI type ${type} do not includes 2 types enclosed in <>.`); + const subTypes = CairoTuple.extractCairo1Tuple(`(${matchArray[0]})`) as string[]; + assert( + subTypes.length === 2, + `ABI type ${type} is not including 2 sub types. Found ${subTypes.length}.` + ); + return subTypes; + } + + /** + * Validate input data for CairoTypeResult creation. + * @param {unknown} _input - Input data to validate + * @param {string} type - The Cairo Result type string (e.g., "core::result::Result::") + * @throws Error if input is invalid + * @example + * ```typescript + * CairoTypeResult.validate(200, "core::result::Result::", CairoResultVariant.Err); // passes + * CairoTypeResult.validate(200, "wrong", 3); // throws + * ``` + */ + static validate(_input: unknown, type: string, variant: VariantType | undefined): void { + assert( + CairoTypeResult.isAbiType(type), + `The type ${type} is not a Cairo Result. Needs core::result::Result::.` + ); + if (!isUndefined(variant)) { + const numberVariant = Number(variant); + assert( + [0, 1].includes(numberVariant), + 'In Cairo Result, only 0 or 1 variants are authorized.' + ); + } + } + + /** + * Check if input data is valid for CairoTypeResult creation. + * @param {unknown} input - Input data to check + * @param {string} type - The Cairo Result type (e.g., "core::result::Result::") + * @param {VariantType} variant - The variant of the Result: CairoResultVariant.Ok (0), or CairoResultVariant.Err (1) + * @returns {boolean} true if valid, false otherwise + * @example + * ```typescript + * const isValid1 = CairoTypeResult.is(200, "core::result::Result::", CairoResultVariant.Ok"); // true + * const isValid2 = CairoTypeResult.is(200, "wrong", 3); // false + * ``` + */ + static is(input: unknown, type: string, variant: VariantType): boolean { + try { + CairoTypeResult.validate(input, type, variant); + return true; + } catch { + return false; + } + } + + /** + * Checks if the given string represents a valid Cairo Result type format. + * + * A valid Cairo Result type must follow the pattern: "core::result::Result::" + * where type is any valid Cairo type. + * @param {string} type - The type string to validate + * @returns {boolean} `true` if the type is a valid Cairo Result format, `false` otherwise + * @example + * ```typescript + * CairoTypeResult.isAbiType("core::result::Result::"); // true + * ``` + */ + static isAbiType(type: string): boolean { + return isTypeResult(type); + } + + /** + * Serialize the Cairo Result into decimal strings for Starknet API requests. + * + * Converts all CairoType elements in this Cairo Result into their hex string representation + * by calling toApiRequest(). This is used when + * sending data to the Starknet network. + * + * @returns {string[]} Array of decimal strings ready for API requests + * @example + * ```typescript + * const myResult = new CairoTypeResult(8, "core::result::Result::", strategy, CairoResultVariant.Err); + * const result = myResult.toApiRequest(); // ['1', '8'] + * ``` + */ + public toApiRequest(): string[] { + const result: string[] = [this.isVariantOk ? '0' : '1']; + result.push(...this.content!.toApiRequest()); + return addCompiledFlag(result.flat()); + } + + /** + * Decompose the CairoTypeResult instance into a CairoResult instance. + * + * Transforms CairoType instances into their final parsed values using the strategy's + * response parsers (e.g., CairoUint8 → BigInt). This method is used primarily for + * parsing API responses into user-friendly formats. + * + * @param {AllowArray} strategyDecompose - Parsing strategy for response parsing + * @returns {CairoResult} a CairoResultInstance, with parsed variant (BigInt, numbers, nested arrays, etc.) + * @example + * ```typescript + * const myResult = new CairoTypedResult(3, "core::result::Result::", hdParsingStrategy, CairoResultVariant.Some); + * const parsed = myResult.decompose(hdParsingStrategy); // CairoResult{ Some: 3n } + * ``` + */ + public decompose(strategyDecompose: AllowArray): CairoResult { + const { content } = this; + const strategies = Array.isArray(strategyDecompose) ? strategyDecompose : [strategyDecompose]; + // For raw string values (unsupported types), throw error + const elementType = CairoTypeResult.getVariantTypes(this.resultCairoType)[ + this.isVariantOk ? CairoResultVariant.Ok : CairoResultVariant.Err + ]; + if (typeof content === 'string') { + throw new Error(`No parser found for element type: ${elementType} in parsing strategy`); + } + let parserName: string = elementType; + if (content instanceof CairoType) { + if ('dynamicSelector' in content) { + // dynamic recursive CairoType + parserName = (content as any).dynamicSelector; + } + } + const strategyDecomposeNum = strategies.findIndex( + (strategy: ParsingStrategy) => strategy.response[parserName] + ); + const responseParser = strategies[strategyDecomposeNum].response[parserName]; + if (responseParser) { + return new CairoResult( + this.isVariantOk ? CairoResultVariant.Ok : CairoResultVariant.Err, + responseParser(content as CairoType, strategies) + ); + } + // No response parser found - throw error instead of fallback magic + throw new Error( + `No response parser found for element type: ${elementType} in parsing strategy` + ); + } +} diff --git a/src/utils/cairoDataTypes/ethAddress.ts b/src/utils/cairoDataTypes/ethAddress.ts new file mode 100644 index 000000000..8ee7cd15f --- /dev/null +++ b/src/utils/cairoDataTypes/ethAddress.ts @@ -0,0 +1,74 @@ +/* eslint-disable no-underscore-dangle */ +import { BigNumberish, ETH_ADDRESS } from '../../types'; +import { addHexPrefix } from '../encode'; +import { getNext } from '../num'; +import { isObject, isNumber } from '../typed'; +import assert from '../assert'; +import { RANGE_ETH_ADDRESS } from '../../global/constants'; +import { addCompiledFlag } from '../helpers'; + +export class CairoEthAddress { + data: bigint; + + static abiSelector = ETH_ADDRESS; + + constructor(data: BigNumberish | boolean | unknown) { + CairoEthAddress.validate(data); + this.data = BigInt(data as BigNumberish); + } + + toApiRequest(): string[] { + return addCompiledFlag([this.toDecimalString()]); + } + + toBigInt() { + return this.data; + } + + toHexString() { + return addHexPrefix(this.toBigInt().toString(16)); + } + + toDecimalString() { + return this.data.toString(10); + } + + static validate(data: BigNumberish | boolean | unknown): void { + assert(data !== null && data !== undefined, 'Invalid input: null or undefined'); + assert( + !isObject(data) && !Array.isArray(data), + 'Invalid input: objects are not supported for EthAddress' + ); + assert( + !isNumber(data) || Number.isInteger(data), + 'Invalid input: decimal numbers are not supported, only integers' + ); + + const value = BigInt(data as BigNumberish); + assert( + // from : https://github.com/starkware-libs/starknet-specs/blob/29bab650be6b1847c92d4461d4c33008b5e50b1a/api/starknet_api_openrpc.json#L1259 + value >= RANGE_ETH_ADDRESS.min && value <= RANGE_ETH_ADDRESS.max, + 'Validate: EthAddress arg should be in range [0, 2^160-1]' + ); + } + + static is(data: BigNumberish | boolean | unknown): boolean { + try { + CairoEthAddress.validate(data); + return true; + } catch { + return false; + } + } + + /** + * Check if provided abi type is this data type + */ + static isAbiType(abiType: string): boolean { + return abiType === CairoEthAddress.abiSelector; + } + + static factoryFromApiResponse(responseIterator: Iterator): CairoEthAddress { + return new CairoEthAddress(getNext(responseIterator)); + } +} diff --git a/src/utils/cairoDataTypes/felt.ts b/src/utils/cairoDataTypes/felt.ts index 24329023a..915b7d492 100644 --- a/src/utils/cairoDataTypes/felt.ts +++ b/src/utils/cairoDataTypes/felt.ts @@ -106,11 +106,15 @@ export class CairoFelt252 extends CairoType { return addHexPrefix(this.toBigInt().toString(16)); } + toDecimalString() { + return this.toBigInt().toString(10); + } + toApiRequest(): string[] { /** * HexString representation of the felt252 */ - return addCompiledFlag([this.toHexString()]); + return addCompiledFlag([this.toDecimalString()]); } static validate(data: BigNumberish | boolean | unknown): void { diff --git a/src/utils/cairoDataTypes/fixedArray.ts b/src/utils/cairoDataTypes/fixedArray.ts index 39f089ab4..6f9d57872 100644 --- a/src/utils/cairoDataTypes/fixedArray.ts +++ b/src/utils/cairoDataTypes/fixedArray.ts @@ -1,8 +1,9 @@ import assert from '../assert'; import { addCompiledFlag } from '../helpers'; import { getNext } from '../num'; -import { type ParsingStrategy } from '../calldata/parser/parsingStrategy'; +import { type ParsingStrategy } from '../calldata/parser/parsingStrategy.type'; import { CairoType } from './cairoType.interface'; +import type { AllowArray } from '../../types'; /** * Represents a Cairo fixed-size array with compile-time known length. @@ -25,7 +26,7 @@ import { CairoType } from './cairoType.interface'; * * // Simple fixed array * const simple = new CairoFixedArray([1, 2, 3], '[core::integer::u8; 3]', hdParsingStrategy); - * console.log(simple.toApiRequest()); // ['0x1', '0x2', '0x3'] + * console.log(simple.toApiRequest()); // ['1', '2', '3'] * console.log(simple.decompose(hdParsingStrategy)); // [1n, 2n, 3n] * * // Nested fixed arrays @@ -40,6 +41,8 @@ import { CairoType } from './cairoType.interface'; export class CairoFixedArray extends CairoType { static dynamicSelector = 'CairoFixedArray' as const; + public readonly dynamicSelector = CairoFixedArray.dynamicSelector; + /** * Array of CairoType instances representing a Cairo fixed array. */ @@ -63,7 +66,7 @@ export class CairoFixedArray extends CairoType { * * @param content - Input data (array, object, Iterator, or CairoType instances) * @param arrayType - Fixed array type string (e.g., "[core::integer::u8; 3]") - * @param strategy - Parsing strategy for element type handling + * @param parsingStrategy - Parsing strategy for element type handling * @example * ```typescript * // From user array @@ -80,22 +83,69 @@ export class CairoFixedArray extends CairoType { * const nested = new CairoFixedArray([[1, 2], [3, 4]], '[[core::integer::u8; 2]; 2]', hdParsingStrategy); * ``` */ - constructor(content: unknown, arrayType: string, strategy: ParsingStrategy) { + constructor(content: unknown, arrayType: string, parsingStrategy: AllowArray) { super(); - - // If content is already a CairoFixedArray instance, just copy its properties + this.arrayType = arrayType; + const strategies = Array.isArray(parsingStrategy) ? parsingStrategy : [parsingStrategy]; + if (content && typeof content === 'object' && 'next' in content) { + // "content" is an iterator + const parsedContent: CairoType[] = CairoFixedArray.parser( + content as Iterator, + arrayType, + strategies + ); + this.content = parsedContent; + return; + } if (content instanceof CairoFixedArray) { this.content = content.content; this.arrayType = content.arrayType; return; } - - // Always use parser for unified processing - const iterator = CairoFixedArray.prepareIterator(content, arrayType); - const parsedContent = CairoFixedArray.parser(iterator, arrayType, strategy); - - this.content = parsedContent; - this.arrayType = arrayType; + CairoFixedArray.validate(content, arrayType); + const arrayContentType = CairoFixedArray.getFixedArrayType(arrayType); + const resultContent: any[] = CairoFixedArray.extractValuesArray(content).map( + (contentItem: any) => { + if ( + contentItem && + typeof contentItem === 'object' && + contentItem !== null && + 'toApiRequest' in contentItem + ) { + // "content" is a CairoType + return contentItem as CairoType; + } + // not an iterator, not an CairoType -> so is low level data (BigNumberish, array, object, Cairo Enums) + const strategyConstructorNum = strategies.findIndex( + (strategy: ParsingStrategy) => strategy.constructors[arrayContentType] + ); + if (strategyConstructorNum >= 0) { + const constructor = strategies[strategyConstructorNum].constructors[arrayContentType]; + return constructor(contentItem, strategies, arrayContentType); + } + const strategyDynamicNum = strategies.findIndex((strategy: ParsingStrategy) => { + const dynamicSelectors = Object.entries(strategy.dynamicSelectors); + return dynamicSelectors.find(([, selectorFn]) => selectorFn(arrayContentType)); + }); + if (strategyDynamicNum >= 0) { + const dynamicSelectors = Object.entries(strategies[strategyDynamicNum].dynamicSelectors); + const matchingSelector = dynamicSelectors.find(([, selectorFn]) => + selectorFn(arrayContentType) + ); + const [selectorName] = matchingSelector as [string, (type: string) => boolean]; + const dynamicConstructor = strategies[strategyDynamicNum].constructors[selectorName]; + if (dynamicConstructor) { + return dynamicConstructor(contentItem, strategies, arrayContentType); + } + } + throw new Error(`"${arrayContentType}" is not a valid Cairo type`); + } + ); + assert( + resultContent.length === CairoFixedArray.getFixedArraySize(arrayType), + `ABI type ${arrayType}: expected ${CairoFixedArray.getFixedArraySize(arrayType)} items, got ${resultContent.length} items.` + ); + this.content = resultContent; } /** @@ -109,35 +159,44 @@ export class CairoFixedArray extends CairoType { * * @param responseIterator - Iterator over string data to parse * @param arrayType - The fixed array type (e.g., "[core::integer::u32; 4]") - * @param strategy - The parsing strategy containing constructors and selectors + * @param parsingStrategies - The parsing strategy containing constructors and selectors * @returns Array of parsed CairoType instances * @private */ private static parser( responseIterator: Iterator, arrayType: string, - strategy: ParsingStrategy + parsingStrategies: ParsingStrategy[] ): CairoType[] { const elementType = CairoFixedArray.getFixedArrayType(arrayType); const outerSize = CairoFixedArray.getFixedArraySize(arrayType); // First check direct constructors - const constructor = strategy.constructors[elementType]; - - if (constructor) { - return Array.from({ length: outerSize }, () => constructor(responseIterator, elementType)); + const strategyConstructorNum = parsingStrategies.findIndex( + (strategy: ParsingStrategy) => strategy.constructors[elementType] + ); + if (strategyConstructorNum >= 0) { + const constructor = parsingStrategies[strategyConstructorNum].constructors[elementType]; + return Array.from({ length: outerSize }, () => + constructor(responseIterator, parsingStrategies, elementType) + ); } // Check dynamic selectors (includes CairoFixedArray, future: tuples, structs, etc.) - const dynamicSelectors = Object.entries(strategy.dynamicSelectors); - const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); - - if (matchingSelector) { - const [selectorName] = matchingSelector; - const dynamicConstructor = strategy.constructors[selectorName]; + const strategyDynamicNum = parsingStrategies.findIndex((strategy: ParsingStrategy) => { + const dynamicSelectors = Object.entries(strategy.dynamicSelectors); + return dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); + }); + if (strategyDynamicNum >= 0) { + const dynamicSelectors = Object.entries( + parsingStrategies[strategyDynamicNum].dynamicSelectors + ); + const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); + const [selectorName] = matchingSelector as [string, (type: string) => boolean]; + const dynamicConstructor = parsingStrategies[strategyDynamicNum].constructors[selectorName]; if (dynamicConstructor) { return Array.from({ length: outerSize }, () => - dynamicConstructor(responseIterator, elementType) + dynamicConstructor(responseIterator, parsingStrategies, elementType) ); } } @@ -147,47 +206,6 @@ export class CairoFixedArray extends CairoType { return rawValues as unknown as CairoType[]; } - /** - * Prepare a string iterator from any input type for unified processing. - * - * This method normalizes all possible input types into a consistent Iterator - * that can be consumed by the parser. It handles three main scenarios: - * 1. Iterator from API responses → pass through unchanged - * 2. CairoType instances → serialize to API strings and create iterator - * 3. User input (arrays/objects) → flatten to strings and create iterator - * - * @param content - Input data (Iterator, array, object, or CairoType instances) - * @param arrayType - Fixed array type for validation and processing - * @returns Iterator over string values ready for parsing - * @private - */ - private static prepareIterator(content: unknown, arrayType: string): Iterator { - // If already an iterator (API response), return as-is - if (content && typeof content === 'object' && 'next' in content) { - return content as Iterator; - } - - // For user input, validate and convert to string iterator - CairoFixedArray.validate(content, arrayType); - const values = CairoFixedArray.extractValuesArray(content); - - // If values are already CairoType instances, serialize them to strings - if ( - values.length > 0 && - typeof values[0] === 'object' && - values[0] !== null && - 'toApiRequest' in values[0] - ) { - // Convert CairoType instances to their API string representation - const stringValues = values.flatMap((cairoType) => (cairoType as any).toApiRequest()); - return stringValues[Symbol.iterator](); - } - - // Convert user input to flattened string array and return iterator - const flatStringValues = CairoFixedArray.flattenUserInput(values, arrayType); - return flatStringValues[Symbol.iterator](); - } - /** * Extract values array from either array or object input. * @@ -209,44 +227,6 @@ export class CairoFixedArray extends CairoType { return Object.values(input as object); } - /** - * Flatten user input into a sequence of strings for parser consumption. - * - * Recursively processes user input to create a flat sequence of strings that matches - * the format expected by API responses. For nested fixed arrays, it recursively - * flattens all nested structures into a single sequential stream of values. - * - * @param values - Array of user input values to flatten - * @param arrayType - Fixed array type to determine element processing - * @returns Flattened array of strings ready for parser consumption - * @private - * @example - * // Simple array: [1, 2, 3] → ['1', '2', '3'] - * // Nested array: [[1, 2], [3, 4]] → ['1', '2', '3', '4'] - */ - private static flattenUserInput(values: any[], arrayType: string): string[] { - const elementType = CairoFixedArray.getFixedArrayType(arrayType); - - // If element type is itself a fixed array, we need to flatten recursively - if (CairoFixedArray.isAbiType(elementType)) { - return values.flatMap((value) => { - if ( - Array.isArray(value) || - (typeof value === 'object' && value !== null && !('toApiRequest' in value)) - ) { - // Recursively flatten nested arrays - const nestedValues = CairoFixedArray.extractValuesArray(value); - return CairoFixedArray.flattenUserInput(nestedValues, elementType); - } - // Single value, convert to string - return String(value); - }); - } - - // For primitive types, just convert all values to strings - return values.map((value) => String(value)); - } - /** * Retrieves the array size from the given type string representing a Cairo fixed array. * @param {string} type - The Cairo fixed array type. @@ -359,21 +339,21 @@ export class CairoFixedArray extends CairoType { } /** - * Serialize the Cairo fixed array into hex strings for Starknet API requests. + * Serialize the Cairo fixed array into decimal strings for Starknet API requests. * * Converts all CairoType elements in this fixed array into their hex string representation * by calling toApiRequest() on each element and flattening the results. This is used when * sending data to the Starknet network. * - * @returns Array of hex strings ready for API requests + * @returns Array of decimal strings ready for API requests * @example * ```typescript * const fArray = new CairoFixedArray([1, 2, 3], "[core::integer::u8; 3]", strategy); - * const result = fArray.toApiRequest(); // ['0x1', '0x2', '0x3'] + * const result = fArray.toApiRequest(); // ['1', '2', '3'] * * // Nested arrays are flattened * const nested = new CairoFixedArray([[1, 2], [3, 4]], "[[core::integer::u8; 2]; 2]", strategy); - * const flatResult = nested.toApiRequest(); // ['0x1', '0x2', '0x3', '0x4'] + * const flatResult = nested.toApiRequest(); // ['1', '2', '3', '4'] * ``` */ public toApiRequest(): string[] { @@ -389,7 +369,7 @@ export class CairoFixedArray extends CairoType { * response parsers (e.g., CairoUint8 → BigInt). This method is used primarily for * parsing API responses into user-friendly formats. * - * @param strategy - Parsing strategy for response parsing + * @param strategyDecompose - Parsing strategy for response parsing * @returns Array of parsed values (BigInt, numbers, nested arrays, etc.) * @example * ```typescript @@ -397,25 +377,48 @@ export class CairoFixedArray extends CairoType { * const parsed = fixedArray.decompose(hdParsingStrategy); // [1n, 2n, 3n] * ``` */ - public decompose(strategy: ParsingStrategy): any[] { + + /** + * Create an object from a array representing a Fixed Array. + * Be sure to have an array length conform to the ABI. + * To be used with CallData.compile(). + * @param {Array} input JS array representing a Cairo fixed array. + * @returns {Object} a specific struct representing a fixed Array. + * @example + * ```typescript + * const result = CairoFixedArray.compile([10,20,30]); + * // result = { '0': 10, '1': 20, '2': 30 } + * ``` + */ + static compile(input: Array): Object { + return input.reduce((acc: any, item: any, idx: number) => { + acc[idx] = item; + return acc; + }, {}); + } + + public decompose(strategyDecompose: AllowArray): any[] { // Use response parsers to get final parsed values (for API response parsing) + const strategies = Array.isArray(strategyDecompose) ? strategyDecompose : [strategyDecompose]; const elementType = CairoFixedArray.getFixedArrayType(this.arrayType); - return this.content.map((element) => { - if (element instanceof CairoFixedArray) { - // For nested arrays, decompose recursively with strategy - return element.decompose(strategy); - } // For raw string values (unsupported types), throw error if (typeof element === 'string') { throw new Error(`No parser found for element type: ${elementType} in parsing strategy`); } - - // For primitive types, use the response parser to get final values - const responseParser = strategy.response[elementType]; - + let parserName: string = elementType; + if (element instanceof CairoType) { + if ('dynamicSelector' in element) { + // dynamic recursive CairoType + parserName = (element as any).dynamicSelector; + } + } + const strategyDecomposeNum = strategies.findIndex( + (strategy: ParsingStrategy) => strategy.response[parserName] + ); + const responseParser = strategies[strategyDecomposeNum].response[parserName]; if (responseParser) { - return responseParser(element); + return responseParser(element, strategies); } // No response parser found - throw error instead of fallback magic diff --git a/src/utils/cairoDataTypes/index.ts b/src/utils/cairoDataTypes/index.ts index 4801c6ac5..96c9aae6a 100644 --- a/src/utils/cairoDataTypes/index.ts +++ b/src/utils/cairoDataTypes/index.ts @@ -19,3 +19,10 @@ export * from './tuple'; export * from './array'; export * from './secp256k1Point'; export * from './cairoType.interface'; +export * from './cairoTypeOption'; +export * from './cairoTypeResult'; +export * from './cairoStruct'; +export * from './cairoTypeCustomEnum'; +export * from './bool'; +export * from './ethAddress'; +export * from './nonZero'; diff --git a/src/utils/cairoDataTypes/int128.ts b/src/utils/cairoDataTypes/int128.ts index f284ee1ba..f97913765 100644 --- a/src/utils/cairoDataTypes/int128.ts +++ b/src/utils/cairoDataTypes/int128.ts @@ -29,7 +29,7 @@ export class CairoInt128 { } toApiRequest(): string[] { - return addCompiledFlag([this.toHexString()]); + return addCompiledFlag([this.toDecimalString()]); } toBigInt() { @@ -56,6 +56,16 @@ export class CairoInt128 { return addHexPrefix(value.toString(16)); } + toDecimalString() { + const value = this.toBigInt(); + // For negative values, convert to field element representation + if (value < 0n) { + const fieldElement = PRIME + value; + return fieldElement.toString(10); + } + return BigInt(this.toHexString()).toString(10); + } + static validate(data: BigNumberish | boolean | unknown): void { assert(data !== null && data !== undefined, 'Invalid input: null or undefined'); assert(!isObject(data) && !Array.isArray(data), 'Invalid input: objects are not supported'); diff --git a/src/utils/cairoDataTypes/int16.ts b/src/utils/cairoDataTypes/int16.ts index ee193ae6f..5f49c7233 100644 --- a/src/utils/cairoDataTypes/int16.ts +++ b/src/utils/cairoDataTypes/int16.ts @@ -29,7 +29,7 @@ export class CairoInt16 { } toApiRequest(): string[] { - return addCompiledFlag([this.toHexString()]); + return addCompiledFlag([this.toDecimalString()]); } toBigInt() { @@ -56,6 +56,16 @@ export class CairoInt16 { return addHexPrefix(value.toString(16)); } + toDecimalString() { + const value = this.toBigInt(); + // For negative values, convert to field element representation + if (value < 0n) { + const fieldElement = PRIME + value; + return fieldElement.toString(10); + } + return BigInt(this.toHexString()).toString(10); + } + static validate(data: BigNumberish | boolean | unknown): void { assert(data !== null && data !== undefined, 'Invalid input: null or undefined'); assert(!isObject(data) && !Array.isArray(data), 'Invalid input: objects are not supported'); diff --git a/src/utils/cairoDataTypes/int32.ts b/src/utils/cairoDataTypes/int32.ts index 576c14b04..8a5d337c9 100644 --- a/src/utils/cairoDataTypes/int32.ts +++ b/src/utils/cairoDataTypes/int32.ts @@ -29,7 +29,7 @@ export class CairoInt32 { } toApiRequest(): string[] { - return addCompiledFlag([this.toHexString()]); + return addCompiledFlag([this.toDecimalString()]); } toBigInt() { @@ -56,6 +56,16 @@ export class CairoInt32 { return addHexPrefix(value.toString(16)); } + toDecimalString() { + const value = this.toBigInt(); + // For negative values, convert to field element representation + if (value < 0n) { + const fieldElement = PRIME + value; + return fieldElement.toString(10); + } + return BigInt(this.toHexString()).toString(10); + } + static validate(data: BigNumberish | boolean | unknown): void { assert(data !== null && data !== undefined, 'Invalid input: null or undefined'); assert(!isObject(data) && !Array.isArray(data), 'Invalid input: objects are not supported'); diff --git a/src/utils/cairoDataTypes/int64.ts b/src/utils/cairoDataTypes/int64.ts index 2ca48b639..7e2be3093 100644 --- a/src/utils/cairoDataTypes/int64.ts +++ b/src/utils/cairoDataTypes/int64.ts @@ -29,7 +29,7 @@ export class CairoInt64 { } toApiRequest(): string[] { - return addCompiledFlag([this.toHexString()]); + return addCompiledFlag([this.toDecimalString()]); } toBigInt() { @@ -56,6 +56,16 @@ export class CairoInt64 { return addHexPrefix(value.toString(16)); } + toDecimalString() { + const value = this.toBigInt(); + // For negative values, convert to field element representation + if (value < 0n) { + const fieldElement = PRIME + value; + return fieldElement.toString(10); + } + return BigInt(this.toHexString()).toString(10); + } + static validate(data: BigNumberish | boolean | unknown): void { assert(data !== null && data !== undefined, 'Invalid input: null or undefined'); assert(!isObject(data) && !Array.isArray(data), 'Invalid input: objects are not supported'); diff --git a/src/utils/cairoDataTypes/int8.ts b/src/utils/cairoDataTypes/int8.ts index e87b5f154..06dc7783e 100644 --- a/src/utils/cairoDataTypes/int8.ts +++ b/src/utils/cairoDataTypes/int8.ts @@ -29,7 +29,7 @@ export class CairoInt8 { } toApiRequest(): string[] { - return addCompiledFlag([this.toHexString()]); + return addCompiledFlag([this.toDecimalString()]); } toBigInt() { @@ -56,6 +56,10 @@ export class CairoInt8 { return addHexPrefix(value.toString(16)); } + toDecimalString() { + return BigInt(this.toHexString()).toString(10); + } + static validate(data: BigNumberish | boolean | unknown): void { assert(data !== null && data !== undefined, 'Invalid input: null or undefined'); assert(!isObject(data) && !Array.isArray(data), 'Invalid input: objects are not supported'); diff --git a/src/utils/cairoDataTypes/nonZero.ts b/src/utils/cairoDataTypes/nonZero.ts new file mode 100644 index 000000000..6558d7739 --- /dev/null +++ b/src/utils/cairoDataTypes/nonZero.ts @@ -0,0 +1,315 @@ +import assert from '../assert'; +import { addCompiledFlag, isInstanceOf } from '../helpers'; +import { getNext } from '../num'; +import { getArrayType, isTypeFelt, isTypeNonZero, isTypeUint } from '../calldata/cairo'; +import { type ParsingStrategy } from '../calldata/parser/parsingStrategy.type'; +import { CairoType } from './cairoType.interface'; +import { type AllowArray } from '../../types'; +import { CairoUint512 } from './uint512'; +import { CairoUint8 } from './uint8'; +import { CairoUint16 } from './uint16'; +import { CairoUint32 } from './uint32'; +import { CairoUint64 } from './uint64'; +import { CairoUint96 } from './uint96'; +import { CairoUint128 } from './uint128'; +import { CairoUint256 } from './uint256'; +import { CairoFelt252 } from './felt'; + +/** + * Represents a Cairo Non Zero type. + * + * Internal usage class (users are using BigNumberish). + */ +export class CairoNonZero extends CairoType { + static dynamicSelector = 'CairoNonZero' as const; + + public readonly dynamicSelector = CairoNonZero.dynamicSelector; + + /** + * CairoType instance representing a Cairo dynamic non zero. + */ + public readonly content: CairoType; + + /** + * Cairo dynamic type. + */ + public readonly contentType: string; + + /** + * Create a CairoNonZero instance. + * + * @param {unknown} content - Input data (BigNumberish, Iterator\, CairoType) + * @param {string} type - Type string (e.g. core::zeroable::NonZero::\) + * @param {AllowArray} parsingStrategy - Parsing strategy for element type handling + * @example + * ```typescript + * const val1 = new CairoNonZero(3, 'core::zeroable::NonZero::', hdParsingStrategy); + * ``` + */ + constructor(content: unknown, type: string, parsingStrategy: AllowArray) { + super(); + this.contentType = type; + const strategies = Array.isArray(parsingStrategy) ? parsingStrategy : [parsingStrategy]; + if (content && typeof content === 'object' && 'next' in content) { + // "content" is an iterator + const parsedContent: CairoType = CairoNonZero.parser( + content as Iterator, + type, + strategies + ); + this.content = parsedContent; + return; + } + if (content instanceof CairoNonZero) { + this.content = content.content; + this.contentType = content.contentType; + return; + } + CairoNonZero.validate(content, type); + const contentType = CairoNonZero.getNonZeroType(type); + + if (content && typeof content === 'object' && content !== null && 'toApiRequest' in content) { + // "content" is a CairoType + this.content = content as CairoType; + return; + } + // not an iterator, not an CairoType -> so is low level data (BigNumberish, array, object, Cairo Enums) + + const strategyConstructorNum = strategies.findIndex( + (strategy: ParsingStrategy) => strategy.constructors[contentType] + ); + if (strategyConstructorNum >= 0) { + const constructor = strategies[strategyConstructorNum].constructors[contentType]; + const cairoInstance = constructor(content, strategies, contentType); + this.validateValue(cairoInstance); + this.content = cairoInstance; + return; + } + const strategyDynamicNum = strategies.findIndex((strategy: ParsingStrategy) => { + const dynamicSelectors = Object.entries(strategy.dynamicSelectors); + return dynamicSelectors.find(([, selectorFn]) => selectorFn(contentType)); + }); + if (strategyDynamicNum >= 0) { + const dynamicSelectors = Object.entries(strategies[strategyDynamicNum].dynamicSelectors); + const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(contentType)); + const [selectorName] = matchingSelector as [string, (type: string) => boolean]; + const dynamicConstructor = strategies[strategyDynamicNum].constructors[selectorName]; + if (dynamicConstructor) { + const cairoInstance = dynamicConstructor(content, strategies, contentType); + this.validateValue(cairoInstance); + this.content = cairoInstance; + return; + } + } + throw new Error(`"${contentType}" is not a valid Cairo type`); + } + + /** + * Parse data from iterator into CairoType instances using the provided parsing strategy. + * + * @param {Iterator} responseIterator - Iterator over string data to parse + * @param {string} nonZeroType - The dynamic NonZero type (e.g., "core::zeroable::NonZero::\") + * @param {ParsingStrategy[]} parsingStrategies - The parsing strategy containing constructors and selectors + * @returns NonZero CairoType instance + * @private + */ + private static parser( + responseIterator: Iterator, + nonZeroType: string, + parsingStrategies: ParsingStrategy[] + ): CairoType { + const elementType = getArrayType(nonZeroType); // Extract T from core::zeroable::NonZero:: + + // First check direct constructors + const strategyConstructorNum = parsingStrategies.findIndex( + (strategy: ParsingStrategy) => strategy.constructors[elementType] + ); + if (strategyConstructorNum >= 0) { + const constructor = parsingStrategies[strategyConstructorNum].constructors[elementType]; + return constructor(responseIterator, parsingStrategies, elementType); + } + + // Check dynamic selectors (includes CairoFixedArray, future: tuples, structs, etc.) + const strategyDynamicNum = parsingStrategies.findIndex((strategy: ParsingStrategy) => { + const dynamicSelectors = Object.entries(strategy.dynamicSelectors); + return dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); + }); + if (strategyDynamicNum >= 0) { + const dynamicSelectors = Object.entries( + parsingStrategies[strategyDynamicNum].dynamicSelectors + ); + const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); + const [selectorName] = matchingSelector as [string, (type: string) => boolean]; + const dynamicConstructor = parsingStrategies[strategyDynamicNum].constructors[selectorName]; + if (dynamicConstructor) { + return dynamicConstructor(responseIterator, parsingStrategies, elementType); + } + } + // Unknown type - collect raw values, defer error + const rawValues = getNext(responseIterator); + return rawValues as unknown as CairoType; + } + + /** + * Retrieves the Non Zero element type from the given dynamic string. + * @param {string} type - The Cairo dynamic type. + * @returns {string} The element type. + * @example + * ```typescript + * const result = CairoNonZero.getNonZeroType("core::zeroable::NonZero::"); + * // result = "core::integer::u8" + * ``` + */ + static getNonZeroType = (type: string): string => { + return getArrayType(type); + }; + + /** + * Validate input data for Cairo Non Zero creation. + * @param input - Input data to validate + * @param type - The dynamic type (e.g., "core::zeroable::NonZero::\") + * @throws Error if input is invalid + * @example + * ```typescript + * CairoArray.validate(1, "core::zeroable::NonZero::"); // passes + * ``` + */ + static validate(input: unknown, type: string): void { + // Validate the type format first + assert( + CairoNonZero.isAbiType(type), + `The type ${type} is not a Cairo Non Zero. Needs core::zeroable::NonZero::.` + ); + // Telegram : https://t.me/sncorestars/11902/45433 + // Author : Ori Ziv (08/apr/2024) + // "NonZero is only supported for purely numeric types (u*, i* and felt252) and EcPoint." + // + // As EcPoint do not includes trait Serde, it can't be seen in an ABI. + // u512 is not compatible. + // core::zeroable::NonZero:: seems not to work in Cairo 2.6.3. + // so, are authorized here : u8, u16, u32, u64, u128, u256 and felt252. + const baseType = getArrayType(type); + assert( + (isTypeUint(baseType) && baseType !== CairoUint512.abiSelector) || isTypeFelt(baseType), + `Validate: ${baseType} type is not authorized for NonZero type.` + ); + } + + /** + * Validate that the CairoType instance has a non-zero value. + * @param {CairoType} cairoInstance - The CairoType instance to validate + * @throws Error if the value is zero or type is not authorized + * @private + */ + validateValue(cairoInstance: CairoType): void { + const nonZeroUints = [ + CairoUint8, + CairoUint16, + CairoUint32, + CairoUint64, + CairoUint96, + CairoUint128, + CairoUint256, + CairoFelt252, + ]; + if (isInstanceOf(cairoInstance, nonZeroUints)) { + assert( + (cairoInstance as CairoType & { toBigInt: Function }).toBigInt() > 0n, + 'ValidateValue: value 0 is not authorized in NonZero type.' + ); + return; + } + throw new Error(`ValidateValue: ${cairoInstance} is not authorized for NonZero type.`); + } + + /** + * Check if input data is valid for CairoNonZero creation. + * @param input - Input data to check + * @param type - The dynamic type (e.g. "core::zeroable::NonZero::\") + * @returns true if valid, false otherwise + * @example + * ```typescript + * const isValid1 = CairoArray.is(1, "core::zeroable::NonZero::"); // true + * ``` + */ + static is(input: unknown, type: string): boolean { + try { + CairoNonZero.validate(input, type); + return true; + } catch { + return false; + } + } + + /** + * Checks if the given string represents a valid Cairo dynamic Non Zero type format. + * + * A valid dynamic type must follow the pattern: `core::zeroable::NonZero::` + * where T is a restricted list of Cairo types. + * + * @param type - The type string to validate + * @returns `true` if the type is a valid dynamic format, `false` otherwise + * @example + * ```typescript + * CairoArray.isAbiType("core::zeroable::NonZero::"); // true + * ``` + */ + static isAbiType(type: string): boolean { + return isTypeNonZero(type); + } + + /** + * Serialize the Cairo dynamic NonZero into decimal string for Starknet API requests. + * + * @returns {string[]} Array of decimal strings ready for API requests + * @example + * ```typescript + * const dynArray = new CairoNonZero(2, "core::zeroable::NonZero::", strategy); + * const result = dynArray.toApiRequest(); // ['2'] + * ``` + */ + public toApiRequest(): string[] { + // Start with array length + const result = this.content.toApiRequest(); + return addCompiledFlag(result); + } + + /** + * Decompose the dynamic NonZero into final parsed value. + * + * @param {AllowArray} strategyDecompose - Parsing strategy for response parsing + * @returns A value (BigInt) + * @example + * ```typescript + * const dynArray = new CairoNonZero(2, 'core::zeroable::NonZero::', hdParsingStrategy); + * const parsed = dynArray.decompose(hdParsingStrategy); // 2n + * ``` + */ + public decompose(strategyDecompose: AllowArray): any[] { + // Use response parsers to get final parsed values (for API response parsing) + const strategies = Array.isArray(strategyDecompose) ? strategyDecompose : [strategyDecompose]; + const elementType = getArrayType(this.contentType); + // For raw string values (unsupported types), throw error + if (typeof this.content === 'string') { + throw new Error(`No parser found for element type: ${elementType} in parsing strategy`); + } + let parserName: string = elementType; + if (this.content instanceof CairoType) { + if ('dynamicSelector' in this.content) { + // dynamic recursive CairoType + parserName = (this.content as any).dynamicSelector; + } + } + const strategyDecomposeNum = strategies.findIndex( + (strategy: ParsingStrategy) => strategy.response[parserName] + ); + const responseParser = strategies[strategyDecomposeNum].response[parserName]; + if (responseParser) { + return responseParser(this.content, strategies); + } + + throw new Error( + `No response parser found for element type: ${elementType} in parsing strategy` + ); + } +} diff --git a/src/utils/cairoDataTypes/secp256k1Point.ts b/src/utils/cairoDataTypes/secp256k1Point.ts index 405b04ae9..003553fe1 100644 --- a/src/utils/cairoDataTypes/secp256k1Point.ts +++ b/src/utils/cairoDataTypes/secp256k1Point.ts @@ -10,7 +10,6 @@ import { BigNumberish } from '../../types'; import { addHexPrefix, removeHexPrefix } from '../encode'; -import { CairoFelt } from './felt'; import { UINT_128_MAX } from './uint256'; import { isObject } from '../typed'; import { getNext, isBigNumberish } from '../num'; @@ -220,10 +219,10 @@ export class CairoSecp256k1Point extends CairoType { */ toApiRequest(): string[] { const result = [ - CairoFelt(this.xLow), - CairoFelt(this.xHigh), - CairoFelt(this.yLow), - CairoFelt(this.yHigh), + this.xLow.toString(10), + this.xHigh.toString(10), + this.yLow.toString(10), + this.yHigh.toString(10), ]; return addCompiledFlag(result); } diff --git a/src/utils/cairoDataTypes/tuple.ts b/src/utils/cairoDataTypes/tuple.ts index afdddc7b0..081a4a436 100644 --- a/src/utils/cairoDataTypes/tuple.ts +++ b/src/utils/cairoDataTypes/tuple.ts @@ -2,9 +2,10 @@ import assert from '../assert'; import { addCompiledFlag } from '../helpers'; import { getNext } from '../num'; import { isTypeTuple, isCairo1Type, isTypeNamedTuple } from '../calldata/cairo'; -import { type ParsingStrategy } from '../calldata/parser/parsingStrategy'; +import { type ParsingStrategy } from '../calldata/parser/parsingStrategy.type'; import { CairoType } from './cairoType.interface'; import { CairoFelt252 } from './felt'; +import type { AllowArray } from '../../types'; /** * Represents a Cairo tuple with compile-time known structure. @@ -23,11 +24,11 @@ import { CairoFelt252 } from './felt'; * * @example * ```typescript - * import { CairoTuple, hdParsingStrategy } from './path/to/module'; + * import { CairoTuple, hdParsingStrategy } from 'starknet'; * * // Simple tuple * const simple = new CairoTuple([1, 2], '(core::integer::u8, core::integer::u32)', hdParsingStrategy); - * console.log(simple.toApiRequest()); // ['0x1', '0x2'] (no length prefix) + * console.log(simple.toApiRequest()); // ['1', '2'] (no length prefix) * console.log(simple.decompose(hdParsingStrategy)); // [1n, 2n] * * // Named tuple @@ -42,6 +43,8 @@ import { CairoFelt252 } from './felt'; export class CairoTuple extends CairoType { static dynamicSelector = 'CairoTuple' as const; + public readonly dynamicSelector = CairoTuple.dynamicSelector; + /** * Array of CairoType instances representing the tuple elements. */ @@ -68,9 +71,6 @@ export class CairoTuple extends CairoType { * @param strategy - Parsing strategy for element type handling * @example * ```typescript - * // From user array - * const tuple1 = new CairoTuple([1, 2], '(core::integer::u8, core::integer::u32)', hdParsingStrategy); - * * // From user object with indices * const tuple2 = new CairoTuple({0: 1, 1: 2}, '(core::integer::u8, core::integer::u32)', hdParsingStrategy); * @@ -85,72 +85,74 @@ export class CairoTuple extends CairoType { * const nested = new CairoTuple([[1, 2], 3], '((core::integer::u8, core::integer::u8), core::integer::u32)', hdParsingStrategy); * ``` */ - constructor(content: unknown, tupleType: string, strategy: ParsingStrategy) { + constructor(content: unknown, tupleType: string, parsingStrategy: AllowArray) { super(); - - // If content is already a CairoTuple instance, just copy its properties + this.tupleType = tupleType; + const strategies = Array.isArray(parsingStrategy) ? parsingStrategy : [parsingStrategy]; + if (content && typeof content === 'object' && 'next' in content) { + // "content" is an iterator + const parsedContent: CairoType[] = CairoTuple.parser( + content as Iterator, + tupleType, + strategies + ); + this.content = parsedContent; + return; + } if (content instanceof CairoTuple) { this.content = content.content; this.tupleType = content.tupleType; return; } + CairoTuple.validate(content, tupleType); + const tupleContentTypeResponse = CairoTuple.getTupleElementTypes(tupleType); + const tupleContentType: string[] = tupleContentTypeResponse.map( + (el: string | { name: string; type: string }) => (typeof el === 'string' ? el : el.type) + ); + const resultContent: any[] = CairoTuple.extractValuesArray(content, tupleType).map( + (contentItem: any, index: number) => { + if ( + contentItem && + typeof contentItem === 'object' && + contentItem !== null && + 'toApiRequest' in contentItem + ) { + // "content" is a CairoType + return contentItem as CairoType; + } - // Check if input is an API response iterator - if (content && typeof content === 'object' && 'next' in content) { - // API response path - use parser - const parsedContent = CairoTuple.parser(content as Iterator, tupleType, strategy); - this.content = parsedContent; - this.tupleType = tupleType; - } else { - // User input path - process directly - CairoTuple.validate(content, tupleType); - const values = CairoTuple.extractValuesArray(content, tupleType); - const elementTypes = CairoTuple.getTupleElementTypes(tupleType); - - // Validate that the number of values matches the tuple structure - if (values.length !== elementTypes.length) { - throw new Error( - `Tuple size mismatch: expected ${elementTypes.length} elements, got ${values.length}` + // not an iterator, not an CairoType -> so is low level data (BigNumberish, array, object, Cairo Enums) + const strategyConstructorNum = strategies.findIndex( + (strategy: ParsingStrategy) => strategy.constructors[tupleContentType[index]] ); - } - - // Create CairoType instances for each element - this.content = values.map((value, index) => { - const elementType = - typeof elementTypes[index] === 'string' - ? (elementTypes[index] as string) - : (elementTypes[index] as any).type; - - // First check direct constructors - const constructor = strategy.constructors[elementType]; - if (constructor) { - return constructor(value, elementType); + if (strategyConstructorNum >= 0) { + const constructor = + strategies[strategyConstructorNum].constructors[tupleContentType[index]]; + return constructor(contentItem, strategies, tupleContentType[index]); } - - // Check dynamic selectors - const dynamicSelectors = Object.entries(strategy.dynamicSelectors); - const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); - - if (matchingSelector) { - const [selectorName] = matchingSelector; - const dynamicConstructor = strategy.constructors[selectorName]; + const strategyDynamicNum = strategies.findIndex((strategy: ParsingStrategy) => { + const dynamicSelectors = Object.entries(strategy.dynamicSelectors); + return dynamicSelectors.find(([, selectorFn]) => selectorFn(tupleType)); + }); + if (strategyDynamicNum >= 0) { + const dynamicSelectors = Object.entries(strategies[strategyDynamicNum].dynamicSelectors); + const matchingSelector = dynamicSelectors.find(([, selectorFn]) => + selectorFn(tupleContentType[index]) + ); + const [selectorName] = matchingSelector as [string, (type: string) => boolean]; + const dynamicConstructor = strategies[strategyDynamicNum].constructors[selectorName]; if (dynamicConstructor) { - return dynamicConstructor(value, elementType); + return dynamicConstructor(contentItem, strategies, tupleContentType[index]); } } - - // Unknown type - fallback to felt252 constructor - const feltConstructor = strategy.constructors[CairoFelt252.abiSelector]; - if (feltConstructor) { - return feltConstructor(value, elementType); - } - - // If even felt252 constructor is not available, store as string for error handling - return String(value) as unknown as CairoType; - }); - - this.tupleType = tupleType; - } + throw new Error(`"${tupleContentType[index]}" is not a valid Cairo type`); + } + ); + assert( + resultContent.length === tupleContentType.length, + `ABI type ${tupleType}: expected ${tupleContentType.length} items, got ${resultContent.length} items.` + ); + this.content = resultContent; } /** @@ -166,14 +168,14 @@ export class CairoTuple extends CairoType { * * @param responseIterator - Iterator over string data to parse * @param tupleType - The tuple type (e.g., "(core::integer::u8, core::integer::u32)") - * @param strategy - The parsing strategy containing constructors and selectors + * @param parsingStrategies - The parsing strategies containing constructors and selectors * @returns Array of parsed CairoType instances * @private */ private static parser( responseIterator: Iterator, tupleType: string, - strategy: ParsingStrategy + parsingStrategies: ParsingStrategy[] ): CairoType[] { const elementTypes = CairoTuple.getTupleElementTypes(tupleType); @@ -182,25 +184,37 @@ export class CairoTuple extends CairoType { typeof elementTypeInfo === 'string' ? elementTypeInfo : (elementTypeInfo as any).type; // First check direct constructors - const constructor = strategy.constructors[elementType]; - if (constructor) { + const strategyConstructorNum = parsingStrategies.findIndex( + (strategy: ParsingStrategy) => strategy.constructors[elementType] + ); + if (strategyConstructorNum >= 0) { + const constructor = parsingStrategies[strategyConstructorNum].constructors[elementType]; return constructor(responseIterator, elementType); } // Check dynamic selectors (includes CairoArray, CairoFixedArray, CairoTuple, etc.) - const dynamicSelectors = Object.entries(strategy.dynamicSelectors); - const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); - - if (matchingSelector) { - const [selectorName] = matchingSelector; - const dynamicConstructor = strategy.constructors[selectorName]; + const strategyDynamicNum = parsingStrategies.findIndex((strategy: ParsingStrategy) => { + const dynamicSelectors = Object.entries(strategy.dynamicSelectors); + return dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); + }); + if (strategyDynamicNum >= 0) { + const dynamicSelectors = Object.entries( + parsingStrategies[strategyDynamicNum].dynamicSelectors + ); + const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); + const [selectorName] = matchingSelector as [string, (type: string) => boolean]; + const dynamicConstructor = parsingStrategies[strategyDynamicNum].constructors[selectorName]; if (dynamicConstructor) { - return dynamicConstructor(responseIterator, elementType); + return dynamicConstructor(responseIterator, parsingStrategies, elementType); } } // Unknown type - fallback to felt252 constructor - const feltConstructor = strategy.constructors[CairoFelt252.abiSelector]; + const felt252ConstructorNum = parsingStrategies.findIndex( + (strategy: ParsingStrategy) => strategy.constructors[CairoFelt252.abiSelector] + ); + const feltConstructor = + parsingStrategies[felt252ConstructorNum].constructors[CairoFelt252.abiSelector]; if (feltConstructor) { return feltConstructor(responseIterator, elementType); } @@ -276,10 +290,12 @@ export class CairoTuple extends CairoType { /** * Parse sub-tuples by extracting nested parentheses. - * @private */ // eslint-disable-next-line no-plusplus - private static parseSubTuple(s: string) { + static parseSubTuple(s: string): { + subTuple: string[]; + result: string; + } { if (!s.includes('(')) return { subTuple: [], result: s }; const subTuple: string[] = []; let result = ''; @@ -317,6 +333,10 @@ export class CairoTuple extends CairoType { /** * Extract tuple member types for Cairo 0 format. + * A cairo 0 tuple can be made in 2 formats: + * - (val1, val2) + * - named tuple (x:val1, y:val2) + * See https://github.com/starknet-io/starknet-docs/blob/f97d02377290df38a2192414f210f75f95684373/archive/cairozero/how-cairozero-works/types.rst#types * @private */ private static extractCairo0Tuple(type: string) { @@ -365,12 +385,14 @@ export class CairoTuple extends CairoType { /** * Extract tuple member types for Cairo 1 format. - * @private + * A cairo 1 tuple is made with (val1, val2). + * No named tuples in Cairo 1. + * See https://www.starknet.io/cairo-book/ch02-02-data-types.html?highlight=tuple#the-tuple-type */ - private static extractCairo1Tuple(type: string): (string | object)[] { + static extractCairo1Tuple(type: string): (string | { name: string; type: string })[] { // Support both named and un-named tuples const input = type.slice(1, -1); // remove first lvl () - const result: (string | object)[] = []; + const result: (string | { name: string; type: string })[] = []; // Handle empty tuple if (input.trim() === '') { @@ -398,29 +420,14 @@ export class CairoTuple extends CairoType { default: { const commaIndex = input.indexOf(',', currentIndex); limitIndex = commaIndex !== -1 ? commaIndex : Number.POSITIVE_INFINITY; + if (commaIndex !== -1 && input[commaIndex + 1] !== ' ') { + throw new Error(`"${type}" is not a valid Cairo type (missing space after comma)`); + } } } const elementString = input.slice(currentIndex, limitIndex); - - // Check if this element is named (contains a single colon not preceded by another colon) - const colonIndex = elementString.indexOf(':'); - const isNamedElement = - colonIndex !== -1 && - elementString.charAt(colonIndex - 1) !== ':' && - elementString.charAt(colonIndex + 1) !== ':' && - !elementString.includes('<'); - - if (isNamedElement) { - // This is a named tuple element - const name = elementString.substring(0, colonIndex); - const elementType = elementString.substring(colonIndex + 1); - result.push({ name, type: elementType }); - } else { - // This is an unnamed tuple element - result.push(elementString); - } - + result.push(elementString); currentIndex = limitIndex + 2; // +2 to skip ', ' } @@ -453,16 +460,27 @@ export class CairoTuple extends CairoType { * ``` * @private */ - private static extractTupleMemberTypes(type: string): (string | object)[] { + private static extractTupleMemberTypes( + type: string + ): (string | { name: string; type: string })[] { return isCairo1Type(type) ? CairoTuple.extractCairo1Tuple(type) : CairoTuple.extractCairo0Tuple(type); } + public static extractTupleMembersNames(type: string): string[] { + const elementTypes = CairoTuple.getTupleElementTypes(type); + if (typeof elementTypes[0] === 'string') + return elementTypes.map((_, index) => index.toString()); + if ('name' in elementTypes[0] && 'type' in elementTypes[0]) + return elementTypes.map((el) => (el as { name: string; type: string }).name); + return []; + } + /** * Get tuple element types from the tuple type string. * Uses the internal extractTupleMemberTypes method to parse tuple structure. - * @param tupleType - The tuple type string + * @param {string} tupleType - The tuple type string * @returns Array of element types (strings or objects with name/type for named tuples) * @example * ```typescript @@ -473,14 +491,16 @@ export class CairoTuple extends CairoType { * // result2 = [{name: "x", type: "core::integer::u8"}, {name: "y", type: "core::integer::u32"}] * ``` */ - static getTupleElementTypes = (tupleType: string): (string | object)[] => { + static getTupleElementTypes = ( + tupleType: string + ): (string | { name: string; type: string })[] => { return CairoTuple.extractTupleMemberTypes(tupleType); }; /** * Validate input data for CairoTuple creation. - * @param input - Input data to validate - * @param tupleType - The tuple type (e.g., "(core::integer::u8, core::integer::u32)") + * @param {unknown} input - Input data to validate + * @param {string} tupleType - The tuple type (e.g. "(core::integer::u8, core::integer::u32)") * @throws Error if input is invalid * @example * ```typescript @@ -504,9 +524,9 @@ export class CairoTuple extends CairoType { /** * Check if input data is valid for CairoTuple creation. - * @param input - Input data to check - * @param tupleType - The tuple type (e.g., "(core::integer::u8, core::integer::u32)") - * @returns true if valid, false otherwise + * @param {unknown} input - Input data to check + * @param {string} tupleType - The tuple type (e.g., "(core::integer::u8, core::integer::u32)") + * @returns {boolean} true if valid, false otherwise * @example * ```typescript * const isValid1 = CairoTuple.is([1, 2], "(core::integer::u8, core::integer::u32)"); // true @@ -526,10 +546,10 @@ export class CairoTuple extends CairoType { * Checks if the given string represents a valid Cairo tuple type format. * * A valid tuple type must follow the pattern: `(type1, type2, ...)` where each type - * is a valid Cairo type. Named tuples like `(x:type1, y:type2)` are also supported. + * is a valid Cairo type. Named tuples (from Cairo 0) like `(x:type1, y:type2)` are also supported. * - * @param type - The type string to validate - * @returns `true` if the type is a valid tuple format, `false` otherwise + * @param {string} type - The type string to validate + * @returns {boolean} `true` if the type is a valid tuple format, `false` otherwise * @example * ```typescript * CairoTuple.isAbiType("(core::integer::u8, core::integer::u32)"); // true @@ -544,21 +564,17 @@ export class CairoTuple extends CairoType { } /** - * Serialize the Cairo tuple into hex strings for Starknet API requests. + * Serialize the Cairo tuple into decimal strings for Starknet API requests. * * Converts the tuple into a flat array of hex strings WITHOUT a length prefix. * This follows the Cairo ABI standard for tuples which are serialized as * consecutive elements without length information. * - * @returns Array of hex strings ready for API requests (no length prefix) + * @returns {string[]} Array of decimal strings ready for API requests (no length prefix) * @example * ```typescript * const tuple = new CairoTuple([1, 2], "(core::integer::u8, core::integer::u32)", strategy); - * const result = tuple.toApiRequest(); // ['0x1', '0x2'] - * - * // Nested tuples are flattened - * const nested = new CairoTuple([[1, 2], 3], "((core::integer::u8, core::integer::u8), core::integer::u32)", strategy); - * const flatResult = nested.toApiRequest(); // ['0x1', '0x2', '0x3'] + * const result = tuple.toApiRequest(); // '1', '2'] * ``` */ public toApiRequest(): string[] { @@ -568,28 +584,49 @@ export class CairoTuple extends CairoType { } /** - * Decompose the tuple into final parsed values. + * Create an object from an array representing a Cairo tuple. + * Be sure to have an array length conform to the ABI. + * + * To be used with CallData.compile(). + * @param {Array} input JS array representing a Cairo Tuple. + * @returns {Object} a specific struct representing a Cairo Tuple. + * @example + * ```typescript + * const result = CairoTuple.compile([10,20,30]); + * // result = { '0': 10, '1': 20, '2': 30 } + * ``` + */ + static compile(input: Array): Object { + return input.reduce((acc: any, item: any, idx: number) => { + acc[idx] = item; + return acc; + }, {}); + } + + /** + * Decompose the tuple into final parsed values, in an object {0:value0, ...}. * * Transforms CairoType instances into their final parsed values using the strategy's * response parsers (e.g., CairoUint8 → BigInt). This method is used primarily for * parsing API responses into user-friendly formats. * - * @param strategy - Parsing strategy for response parsing - * @returns Array of parsed values (BigInt, numbers, nested tuples, etc.) + * @param {AllowArray} strategyDecompose - Parsing strategies for response parsing + * @returns {Object} an object of format {0:value0, 1:value2} * @example * ```typescript - * const tuple = new CairoTuple([1, 2], '(core::integer::u8, core::integer::u32)', hdParsingStrategy); - * const parsed = tuple.decompose(hdParsingStrategy); // [1n, 2n] + * const myTuple = new CairoTuple(cairo.tuple(1, 2), '(core::integer::u8, core::integer::u32)', hdParsingStrategy); + * const parsed = myTuple.decompose(hdParsingStrategy); // {"0": 1n, "1": 2n} + * const myTuple1 = new CairoTuple([100, 200], "(x:felt, y:felt)", hdParsingStrategy); // Cairo 0 named tuple + * const parsed1 = myTuple.decompose(hdParsingStrategy); // { x: 100n, y: 200n } * ``` */ - public decompose(strategy: ParsingStrategy): any[] { - const elementTypes = CairoTuple.getTupleElementTypes(this.tupleType); - - return this.content.map((element, index) => { - if (element instanceof CairoTuple) { - // For nested tuples, decompose recursively with strategy - return element.decompose(strategy); - } + public decompose(strategyDecompose: AllowArray): Object { + const strategies = Array.isArray(strategyDecompose) ? strategyDecompose : [strategyDecompose]; + const tupleContentTypeResponse = CairoTuple.getTupleElementTypes(this.tupleType); + const elementTypes: string[] = tupleContentTypeResponse.map( + (el: string | { name: string; type: string }) => (typeof el === 'string' ? el : el.type) + ); + const result = this.content.map((element, index) => { // For raw string values (unsupported types), throw error if (typeof element === 'string') { const elementType = @@ -598,34 +635,40 @@ export class CairoTuple extends CairoType { : (elementTypes[index] as any).type; throw new Error(`No parser found for element type: ${elementType} in parsing strategy`); } - - // For primitive types, use the response parser to get final values - const elementType = - typeof elementTypes[index] === 'string' - ? (elementTypes[index] as string) - : (elementTypes[index] as any).type; - const responseParser = strategy.response[elementType]; - - if (responseParser) { - return responseParser(element); + let parserName: string = elementTypes[index] as string; + if (element instanceof CairoType) { + if ('dynamicSelector' in element) { + // dynamic recursive CairoType + parserName = (element as any).dynamicSelector; + } } - - // Check dynamic selectors for response parsing - const dynamicSelectors = Object.entries(strategy.dynamicSelectors); - const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(elementType)); - - if (matchingSelector) { - const [selectorName] = matchingSelector; - const dynamicResponseParser = strategy.response[selectorName]; - if (dynamicResponseParser) { - return dynamicResponseParser(element); + const strategyDecomposeNum = strategies.findIndex( + (strategy: ParsingStrategy) => strategy.response[parserName] + ); + if (strategyDecomposeNum >= 0) { + const responseParser = strategies[strategyDecomposeNum].response[parserName]; + if (responseParser) { + return responseParser(element, strategies); } } - // No response parser found - throw error instead of fallback magic throw new Error( - `No response parser found for element type: ${elementType} in parsing strategy` + `No response parser found for element type: ${elementTypes[index]} in parsing strategy` ); }); + if (typeof tupleContentTypeResponse[0] === 'string') { + return { ...result }; + } + const namedTuple: Record = {}; + tupleContentTypeResponse.forEach((el, index) => { + const a = ( + tupleContentTypeResponse[index] as { + name: string; + type: string; + } + ).name; + namedTuple[a] = result[index]; + }); + return namedTuple; } } diff --git a/src/utils/cairoDataTypes/uint128.ts b/src/utils/cairoDataTypes/uint128.ts index 92d5ad9b8..b3b9e21f3 100644 --- a/src/utils/cairoDataTypes/uint128.ts +++ b/src/utils/cairoDataTypes/uint128.ts @@ -29,7 +29,7 @@ export class CairoUint128 { } toApiRequest(): string[] { - return addCompiledFlag([this.toHexString()]); + return addCompiledFlag([this.toDecimalString()]); } toBigInt() { @@ -44,6 +44,10 @@ export class CairoUint128 { return addHexPrefix(this.toBigInt().toString(16)); } + toDecimalString() { + return this.data.toString(10); + } + static validate(data: BigNumberish | boolean | unknown): void { assert(data !== null && data !== undefined, 'Invalid input: null or undefined'); assert(!isObject(data) && !Array.isArray(data), 'Invalid input: objects are not supported'); diff --git a/src/utils/cairoDataTypes/uint16.ts b/src/utils/cairoDataTypes/uint16.ts index df0e3e084..cda4771c0 100644 --- a/src/utils/cairoDataTypes/uint16.ts +++ b/src/utils/cairoDataTypes/uint16.ts @@ -29,7 +29,7 @@ export class CairoUint16 { } toApiRequest(): string[] { - return addCompiledFlag([this.toHexString()]); + return addCompiledFlag([this.toDecimalString()]); } toBigInt() { @@ -44,6 +44,10 @@ export class CairoUint16 { return addHexPrefix(this.toBigInt().toString(16)); } + toDecimalString() { + return this.data.toString(10); + } + static validate(data: BigNumberish | boolean | unknown): void { assert(data !== null && data !== undefined, 'Invalid input: null or undefined'); assert(!isObject(data) && !Array.isArray(data), 'Invalid input: objects are not supported'); diff --git a/src/utils/cairoDataTypes/uint256.ts b/src/utils/cairoDataTypes/uint256.ts index 6d08bf2f8..691747d4e 100644 --- a/src/utils/cairoDataTypes/uint256.ts +++ b/src/utils/cairoDataTypes/uint256.ts @@ -5,7 +5,6 @@ import { BigNumberish, Uint256 } from '../../types'; import { addHexPrefix } from '../encode'; -import { CairoFelt } from './felt'; import { isObject } from '../typed'; import { getNext, isBigNumberish } from '../num'; import assert from '../assert'; @@ -146,6 +145,6 @@ export class CairoUint256 { * Return api requests representation witch is felt array */ toApiRequest() { - return [CairoFelt(this.low), CairoFelt(this.high)]; + return [this.low.toString(10), this.high.toString(10)]; } } diff --git a/src/utils/cairoDataTypes/uint32.ts b/src/utils/cairoDataTypes/uint32.ts index 8e4f323e9..74e42e4d3 100644 --- a/src/utils/cairoDataTypes/uint32.ts +++ b/src/utils/cairoDataTypes/uint32.ts @@ -28,7 +28,7 @@ export class CairoUint32 { } toApiRequest(): string[] { - return addCompiledFlag([this.toHexString()]); + return addCompiledFlag([this.toDecimalString()]); } toBigInt() { @@ -43,6 +43,10 @@ export class CairoUint32 { return addHexPrefix(this.toBigInt().toString(16)); } + toDecimalString() { + return this.data.toString(10); + } + static validate(data: BigNumberish | boolean | unknown): void { assert(data !== null && data !== undefined, 'Invalid input: null or undefined'); assert(!isObject(data) && !Array.isArray(data), 'Invalid input: objects are not supported'); diff --git a/src/utils/cairoDataTypes/uint512.ts b/src/utils/cairoDataTypes/uint512.ts index 431c88c40..6a83de841 100644 --- a/src/utils/cairoDataTypes/uint512.ts +++ b/src/utils/cairoDataTypes/uint512.ts @@ -5,7 +5,6 @@ import { BigNumberish, type Uint512 } from '../../types'; import { addHexPrefix } from '../encode'; -import { CairoFelt } from './felt'; import { UINT_128_MAX } from './uint256'; import { isObject } from '../typed'; import { getNext, isBigNumberish } from '../num'; @@ -180,10 +179,10 @@ export class CairoUint512 { toApiRequest(): string[] { // lower limb first : https://github.com/starkware-libs/cairo/blob/07484c52791b76abcc18fd86265756904557d0d2/corelib/src/test/integer_test.cairo#L767 return [ - CairoFelt(this.limb0), - CairoFelt(this.limb1), - CairoFelt(this.limb2), - CairoFelt(this.limb3), + this.limb0.toString(10), + this.limb1.toString(10), + this.limb2.toString(10), + this.limb3.toString(10), ]; } } diff --git a/src/utils/cairoDataTypes/uint64.ts b/src/utils/cairoDataTypes/uint64.ts index b38d0e1f4..b68d1d143 100644 --- a/src/utils/cairoDataTypes/uint64.ts +++ b/src/utils/cairoDataTypes/uint64.ts @@ -29,7 +29,7 @@ export class CairoUint64 { } toApiRequest(): string[] { - return addCompiledFlag([this.toHexString()]); + return addCompiledFlag([this.toDecimalString()]); } toBigInt() { @@ -44,6 +44,10 @@ export class CairoUint64 { return addHexPrefix(this.toBigInt().toString(16)); } + toDecimalString() { + return this.data.toString(10); + } + static validate(data: BigNumberish | boolean | unknown): void { assert(data !== null && data !== undefined, 'Invalid input: null or undefined'); assert(!isObject(data) && !Array.isArray(data), 'Invalid input: objects are not supported'); diff --git a/src/utils/cairoDataTypes/uint8.ts b/src/utils/cairoDataTypes/uint8.ts index 9a3abb33d..06c8a5604 100644 --- a/src/utils/cairoDataTypes/uint8.ts +++ b/src/utils/cairoDataTypes/uint8.ts @@ -29,7 +29,7 @@ export class CairoUint8 { } toApiRequest(): string[] { - return addCompiledFlag([this.toHexString()]); + return addCompiledFlag([this.toDecimalString()]); } toBigInt() { @@ -44,6 +44,10 @@ export class CairoUint8 { return addHexPrefix(this.toBigInt().toString(16)); } + toDecimalString() { + return this.data.toString(10); + } + static validate(data: BigNumberish | boolean | unknown): void { assert(data !== null && data !== undefined, 'Invalid input: null or undefined'); assert(!isObject(data) && !Array.isArray(data), 'Invalid input: objects are not supported'); diff --git a/src/utils/cairoDataTypes/uint96.ts b/src/utils/cairoDataTypes/uint96.ts index 4e4f8c9f7..fb355837e 100644 --- a/src/utils/cairoDataTypes/uint96.ts +++ b/src/utils/cairoDataTypes/uint96.ts @@ -11,7 +11,8 @@ import { addCompiledFlag } from '../helpers'; export class CairoUint96 { data: bigint; - static abiSelector = 'core::integer::u96'; + static abiSelector = + 'core::internal::bounded_int::BoundedInt::<0, 79228162514264337593543950335>'; constructor(data: BigNumberish | boolean | unknown) { CairoUint96.validate(data); @@ -29,7 +30,7 @@ export class CairoUint96 { } toApiRequest(): string[] { - return addCompiledFlag([this.toHexString()]); + return addCompiledFlag([this.toDecimalString()]); } toBigInt() { @@ -44,6 +45,10 @@ export class CairoUint96 { return addHexPrefix(this.toBigInt().toString(16)); } + toDecimalString() { + return this.data.toString(10); + } + static validate(data: BigNumberish | boolean | unknown): void { assert(data !== null && data !== undefined, 'Invalid input: null or undefined'); assert(!isObject(data) && !Array.isArray(data), 'Invalid input: objects are not supported'); diff --git a/src/utils/calldata/cairo.ts b/src/utils/calldata/cairo.ts index a8c6c93da..e17eecf3c 100644 --- a/src/utils/calldata/cairo.ts +++ b/src/utils/calldata/cairo.ts @@ -12,6 +12,7 @@ import { Uint256, Uint512, } from '../../types'; +import { CairoByteArray } from '../cairoDataTypes/byteArray'; import { CairoFelt } from '../cairoDataTypes/felt'; import { CairoUint256 } from '../cairoDataTypes/uint256'; import { CairoUint512 } from '../cairoDataTypes/uint512'; @@ -231,6 +232,9 @@ export function getAbiContractVersion(abi: Abi): ContractVersion { /** * Create Uint256 Cairo type (helper for common struct type) + * Useful for CallData.compile() method. + * @param it BigNumberish representation of a 256 bits unsigned number + * @returns Uint256 struct * @example * ```typescript * uint256('892349863487563453485768723498'); @@ -242,6 +246,7 @@ export const uint256 = (it: BigNumberish): Uint256 => { /** * Create Uint512 Cairo type (helper for common struct type) + * Useful for CallData.compile() method. * @param it BigNumberish representation of a 512 bits unsigned number * @returns Uint512 struct * @example @@ -254,10 +259,13 @@ export const uint512 = (it: BigNumberish): Uint512 => { }; /** - * Create unnamed tuple Cairo type (helper same as common struct type) + * Create unnamed tuple Cairo type (helper same as common struct type). + * Useful for CallData.compile() method. + * @param args BigNumberish, JS tuple or object representation of the tuple elements. * @example * ```typescript - * tuple(1, '0x101', 16); + * const calldata = CallData.compile({ a1: cairo.tuple(1, '0x10', 9)}); + * // calldata = ['1', '16', '9'] * ``` */ export const tuple = ( @@ -266,8 +274,23 @@ export const tuple = ( /** * Create felt Cairo type (cairo type helper) + * @param it BigNumberish representation of a felt * @returns format: felt-string */ export function felt(it: BigNumberish): string { return CairoFelt(it); } + +/** + * Converts a string into a plain object representation of a ByteArray. + * Useful for CallData.compile() method. + * @returns {Record} plain object representation of a CairoByteArray instance. + * @example + * ```ts + * const calldata = CallData.compile({ a1: cairo.byteArray("Token")}); + * // calldata = ['0', '362646562158', '5'] + * ``` + */ +export function byteArray(it: string): Record { + return new CairoByteArray(it).toObject(); +} diff --git a/src/utils/calldata/calldataUtils.ts b/src/utils/calldata/calldataUtils.ts new file mode 100644 index 000000000..3684f3362 --- /dev/null +++ b/src/utils/calldata/calldataUtils.ts @@ -0,0 +1,37 @@ +import type { Abi, AbiEnums, AbiStructs } from '../../types'; + +/** + * Helper to extract enums from abi + * @param abi Abi + * @returns AbiEnums - enums from abi + */ +export function getAbiEnum(abi: Abi): AbiEnums { + const fullEnumList = abi + .filter((abiEntry) => abiEntry.type === 'enum') + .reduce( + (acc, abiEntry) => ({ + ...acc, + [abiEntry.name]: abiEntry, + }), + {} + ); + delete fullEnumList['core::bool']; + return fullEnumList; +} + +/** + * Helper to extract structs from abi + * @param abi Abi + * @returns AbiStructs - structs from abi + */ +export function getAbiStruct(abi: Abi): AbiStructs { + return abi + .filter((abiEntry) => abiEntry.type === 'struct') + .reduce( + (acc, abiEntry) => ({ + ...acc, + [abiEntry.name]: abiEntry, + }), + {} + ); +} diff --git a/src/utils/calldata/index.ts b/src/utils/calldata/index.ts index af0ed8349..f52b0d3f6 100644 --- a/src/utils/calldata/index.ts +++ b/src/utils/calldata/index.ts @@ -15,7 +15,7 @@ import { ValidateType, } from '../../types'; import assert from '../assert'; -import { toHex } from '../num'; +import { getNext, toHex } from '../num'; import { isBigInt } from '../typed'; import { getSelectorFromName } from '../hash/selector'; import { isLongText } from '../shortString'; @@ -32,15 +32,22 @@ import { CairoFixedArray } from '../cairoDataTypes/fixedArray'; import { CairoArray } from '../cairoDataTypes/array'; import { CairoTuple } from '../cairoDataTypes/tuple'; import formatter from './formatter'; -import { createAbiParser, isNoConstructorValid, ParsingStrategy } from './parser'; +import { createAbiParser, isNoConstructorValid, type ParsingStrategy } from './parser'; +import { hdParsingStrategy } from './parser/parsingStrategy'; import { AbiParserInterface } from './parser/interface'; import orderPropsByAbi from './propertyOrder'; -import { parseCalldataField } from './requestParser'; -import responseParser from './responseParser'; -import validateFields from './validate'; +// import { parseCalldataField } from './requestParser'; +import { CairoTypeOption } from '../cairoDataTypes/cairoTypeOption'; +import { CairoTypeResult } from '../cairoDataTypes/cairoTypeResult'; +import { CairoStruct } from '../cairoDataTypes/cairoStruct'; +import { getAbiEnum, getAbiStruct } from './calldataUtils'; +import { CairoTypeCustomEnum } from '../cairoDataTypes/cairoTypeCustomEnum'; +import { isInstanceOf as isInstanceOfClasses } from '../helpers'; +import { CairoNonZero } from '../cairoDataTypes/nonZero'; +import { CairoEthAddress } from '../cairoDataTypes'; export * as cairo from './cairo'; -export { parseCalldataField } from './requestParser'; +// export { parseCalldataField } from './requestParser'; export * from './parser'; export class CallData { @@ -48,11 +55,11 @@ export class CallData { parser: AbiParserInterface; - protected readonly structs: AbiStructs; + readonly structs: AbiStructs; - protected readonly enums: AbiEnums; + readonly enums: AbiEnums; - constructor(abi: Abi, parsingStrategy?: ParsingStrategy) { + constructor(abi: Abi, parsingStrategy: ParsingStrategy = hdParsingStrategy) { this.structs = CallData.getAbiStruct(abi); this.enums = CallData.getAbiEnum(abi); this.parser = createAbiParser(abi, parsingStrategy); @@ -99,17 +106,15 @@ export class CallData { `Invalid number of arguments, expected ${inputsLength} arguments, but got ${args.length}` ); } - - // validate parameters - validateFields(abiMethod, args, this.structs, this.enums); } /** * Compile contract callData with abi * Parse the calldata by using input fields from the abi for that method - * @param method string - method name - * @param argsCalldata RawArgs - arguments passed to the method. Can be an array of arguments (in the order of abi definition), or an object constructed in conformity with abi (in this case, the parameter can be in a wrong order). - * @return Calldata - parsed arguments in format that contract is expecting + * @param {string} method string - method name + * @param {RawArgs} argsCalldata RawArgs - arguments passed to the method. Can be an array of arguments (in the order of abi definition), or an object constructed in conformity with abi (in this case, the parameter can be in a wrong order). + * @param {ParsingStrategy} [parserStrategy = hdParsingStrategy] - optional parsing strategy to override the default one + * @return {Calldata} parsed arguments in format that contract is expecting * @example * ```typescript * const calldata = myCallData.compile("constructor", ["0x34a", [1, 3n]]); @@ -118,7 +123,11 @@ export class CallData { * const calldata2 = myCallData.compile("constructor", {list:[1, 3n], balance:"0x34"}); // wrong order is valid * ``` */ - public compile(method: string, argsCalldata: RawArgs): Calldata { + public compile( + method: string, + argsCalldata: RawArgs, + parserStrategy: AllowArray = this.parser.parsingStrategies + ): Calldata { const abiMethod = this.abi.find((abiFunction) => abiFunction.name === method) as FunctionAbi; if (isNoConstructorValid(method, argsCalldata, abiMethod)) { @@ -134,11 +143,10 @@ export class CallData { argsCalldata, abiMethod.inputs, this.structs, - this.enums + this.enums, + parserStrategy ); args = Object.values(orderedObject); - // // validate array elements to abi - validateFields(abiMethod, args, this.structs, this.enums); } const argsIterator = args[Symbol.iterator](); @@ -147,15 +155,7 @@ export class CallData { (acc, input) => isLen(input.name) && !isCairo1Type(input.type) ? acc - : acc.concat( - parseCalldataField({ - argsIterator, - input, - structs: this.structs, - enums: this.enums, - parser: this.parser, - }) - ), + : acc.concat(this.parser.parseRequestField(getNext(argsIterator), input.type)), [] as Calldata ); @@ -218,27 +218,22 @@ export class CallData { } return getEntries({ 0: activeVariantNb, 1: myEnum.unwrap() }, `${prefix}${kk}.`); } - if (value instanceof CairoFixedArray) { - // CairoFixedArray - use toApiRequest() to get flat array, then convert to tree structure - const apiRequest = value.toApiRequest(); - const compiledObj = Object.fromEntries( - apiRequest.map((item, idx) => [idx.toString(), item]) - ); - return getEntries(compiledObj, `${prefix}${kk}.`); - } - if (value instanceof CairoArray) { - // CairoArray - use toApiRequest() to get length-prefixed array, then convert to tree structure + if ( + isInstanceOfClasses(value, [ + CairoTypeOption, + CairoTypeResult, + CairoStruct, + CairoTypeCustomEnum, + CairoTuple, + CairoArray, + CairoFixedArray, + CairoNonZero, + CairoEthAddress, + ]) + ) { const apiRequest = value.toApiRequest(); const compiledObj = Object.fromEntries( - apiRequest.map((item, idx) => [idx.toString(), item]) - ); - return getEntries(compiledObj, `${prefix}${kk}.`); - } - if (value instanceof CairoTuple) { - // CairoTuple - use toApiRequest() to get flat array (no length prefix), then convert to tree structure - const apiRequest = value.toApiRequest(); - const compiledObj = Object.fromEntries( - apiRequest.map((item, idx) => [idx.toString(), item]) + apiRequest.map((item: any, idx: number) => [idx.toString(), item]) ); return getEntries(compiledObj, `${prefix}${kk}.`); } @@ -287,17 +282,7 @@ export class CallData { const parsed = outputs.flat().reduce((acc, output, idx) => { const propName = output.name ?? idx; - acc[propName] = responseParser({ - responseIterator, - output, - structs: this.structs, - enums: this.enums, - parsedResult: acc, - parser: this.parser, - }); - if (acc[propName] && acc[`${propName}_len`]) { - delete acc[`${propName}_len`]; - } + acc[propName] = this.parser.parseResponse(responseIterator, output.name, output.type); return acc; }, {} as Args); @@ -323,15 +308,7 @@ export class CallData { * @returns AbiStructs - structs from abi */ static getAbiStruct(abi: Abi): AbiStructs { - return abi - .filter((abiEntry) => abiEntry.type === 'struct') - .reduce( - (acc, abiEntry) => ({ - ...acc, - [abiEntry.name]: abiEntry, - }), - {} - ); + return getAbiStruct(abi); } /** @@ -340,17 +317,7 @@ export class CallData { * @returns AbiEnums - enums from abi */ static getAbiEnum(abi: Abi): AbiEnums { - const fullEnumList = abi - .filter((abiEntry) => abiEntry.type === 'enum') - .reduce( - (acc, abiEntry) => ({ - ...acc, - [abiEntry.name]: abiEntry, - }), - {} - ); - delete fullEnumList['core::bool']; - return fullEnumList; + return getAbiEnum(abi); } /** @@ -388,15 +355,8 @@ export class CallData { ): AllowArray { const typeCairoArray = Array.isArray(typeCairo) ? typeCairo : [typeCairo]; const responseIterator = response.flat()[Symbol.iterator](); - const decodedArray = typeCairoArray.map( - (typeParam) => - responseParser({ - responseIterator, - output: { name: '', type: typeParam }, - parser: this.parser, - structs: this.structs, - enums: this.enums, - }) as CallResult + const decodedArray = typeCairoArray.map((typeParam) => + this.parser.parseResponse(responseIterator, '', typeParam) ); return decodedArray.length === 1 ? decodedArray[0] : decodedArray; } diff --git a/src/utils/calldata/parser/index.ts b/src/utils/calldata/parser/index.ts index 7c23d7fee..68415656a 100644 --- a/src/utils/calldata/parser/index.ts +++ b/src/utils/calldata/parser/index.ts @@ -3,17 +3,20 @@ import { isCairo1Abi } from '../cairo'; import { AbiParserInterface } from './interface'; import { AbiParser1 } from './parser-0-1.1.0'; import { AbiParser2 } from './parser-2.0.0'; -import { ParsingStrategy } from './parsingStrategy'; +import { hdParsingStrategy } from './parsingStrategy'; +import { ParsingStrategy } from './parsingStrategy.type'; export { AbiParser2 }; export { AbiParser1 }; export { AbiParserInterface }; export * from './parsingStrategy'; +export * from './parsingStrategy.type'; /** * Creates ABI parser * * @param {Abi} abi + * @param {ParsingStrategy} parsingStrategy - optional - parsing strategy * @returns {AbiParserInterface} abi parser interface * * @example @@ -23,7 +26,10 @@ export * from './parsingStrategy'; * const abiParser1 = createAbiParser([getFunctionAbi('struct')]); * // abiParser1 instanceof AbiParser1 === true */ -export function createAbiParser(abi: Abi, parsingStrategy?: ParsingStrategy): AbiParserInterface { +export function createAbiParser( + abi: Abi, + parsingStrategy: ParsingStrategy = hdParsingStrategy +): AbiParserInterface { const version = getAbiVersion(abi); if (version === 0 || version === 1) { return new AbiParser1(abi, parsingStrategy); @@ -64,7 +70,7 @@ export function getAbiVersion(abi: Abi): 1 | 2 | 0 { * * @param {string} method * @param {RawArgs} argsCalldata - * @param {FunctionAbi} abiMethod + * @param {FunctionAbi} abiMethod - optional * @returns boolean * * @example diff --git a/src/utils/calldata/parser/interface.ts b/src/utils/calldata/parser/interface.ts index 76b758c7d..edbbce4ac 100644 --- a/src/utils/calldata/parser/interface.ts +++ b/src/utils/calldata/parser/interface.ts @@ -1,11 +1,11 @@ -import { Abi, AbiEntryType, FunctionAbi } from '../../../types'; -import { ParsingStrategy } from './parsingStrategy'; +import { Abi, AbiEntryType, FunctionAbi, type AllowArray } from '../../../types'; +import { ParsingStrategy } from './parsingStrategy.type'; /** * Abi parser interface */ export abstract class AbiParserInterface { - abstract parsingStrategy: ParsingStrategy; + abstract parsingStrategies: AllowArray; /** * Helper to calculate inputs length from abi @@ -32,14 +32,16 @@ export abstract class AbiParserInterface { * @param abiType AbiEntryType * @returns Parser function */ - public abstract getRequestParser(abiType: AbiEntryType): (val: unknown, type?: string) => any; + public abstract parseRequestField(requestContent: any, abiType: AbiEntryType): string[]; /** * Get response parser for the given abi type * @param abiType AbiEntryType * @returns Parser function */ - public abstract getResponseParser( - abiType: AbiEntryType - ): (responseIterator: Iterator, type?: string) => any; + public abstract parseResponse( + responseIterator: Iterator, + fieldName: string, + abiType: string + ): any; } diff --git a/src/utils/calldata/parser/parser-0-1.1.0.ts b/src/utils/calldata/parser/parser-0-1.1.0.ts index b6a719a26..52a4d946d 100644 --- a/src/utils/calldata/parser/parser-0-1.1.0.ts +++ b/src/utils/calldata/parser/parser-0-1.1.0.ts @@ -1,69 +1,120 @@ -import { Abi, AbiEntryType, FunctionAbi } from '../../../types'; -import { isLen } from '../cairo'; +import { Abi, AbiEntryType, FunctionAbi, type AbiStruct, type AllowArray } from '../../../types'; +import type { CairoType } from '../../cairoDataTypes'; +import { CairoStruct } from '../../cairoDataTypes/cairoStruct'; +import { isLen, isTypeArray } from '../cairo'; +import { getAbiStruct } from '../calldataUtils'; import { AbiParserInterface } from './interface'; -import { hdParsingStrategy, ParsingStrategy } from './parsingStrategy'; +import { ParsingStrategy } from './parsingStrategy.type'; export class AbiParser1 implements AbiParserInterface { abi: Abi; - parsingStrategy: ParsingStrategy; + parsingStrategies: ParsingStrategy[]; - constructor(abi: Abi, parsingStrategy?: ParsingStrategy) { + constructor(abi: Abi, parsingStrategy: ParsingStrategy) { this.abi = abi; - this.parsingStrategy = parsingStrategy || hdParsingStrategy; + // add structs & enums in strategy + const structs: AbiStruct[] = Object.values(getAbiStruct(abi)); + const structStrategy: ParsingStrategy = { + constructors: {}, + response: {}, + dynamicSelectors: {}, + }; + structs.forEach((struct: AbiStruct) => { + // Span are defined as Struct in Abi, but are useless here + if (!isTypeArray(struct.name)) { + structStrategy.constructors[struct.name] = (input: Iterator | unknown) => { + return new CairoStruct(input, struct, [parsingStrategy, structStrategy]); + }; + structStrategy.response[struct.name] = ( + instance: CairoType, + strategy: AllowArray + ) => (instance as CairoStruct).decompose(strategy); + structStrategy.dynamicSelectors[struct.name] = (_type: string) => _type === struct.name; + } + }); + + this.parsingStrategies = [parsingStrategy, structStrategy]; } - public getRequestParser(abiType: AbiEntryType): (val: unknown, type?: string) => any { + public parseRequestField(requestData: any, abiType: AbiEntryType): string[] { // Check direct constructors first - if (this.parsingStrategy.constructors[abiType]) { - return (val: unknown, type?: string) => { - const instance = this.parsingStrategy.constructors[abiType](val, type); - return instance.toApiRequest(); - }; + const strategyConstructorNum = this.parsingStrategies.findIndex( + (strategy: ParsingStrategy) => strategy.constructors[abiType] + ); + if (strategyConstructorNum >= 0) { + const instance = this.parsingStrategies[strategyConstructorNum].constructors[abiType]( + requestData, + this.parsingStrategies, + abiType + ); + return instance.toApiRequest(); } - // Check dynamic selectors - const dynamicSelectors = Object.entries(this.parsingStrategy.dynamicSelectors); - const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(abiType)); + const strategyDynamicNum = this.parsingStrategies.findIndex((strategy: ParsingStrategy) => { + const dynamicSelectors = Object.entries(strategy.dynamicSelectors); + return dynamicSelectors.find(([, selectorFn]) => selectorFn(abiType)); + }); + + if (strategyDynamicNum >= 0) { + const dynamicSelectors = Object.entries( + this.parsingStrategies[strategyDynamicNum].dynamicSelectors + ); + const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(abiType)); - if (matchingSelector) { - const [selectorName] = matchingSelector; - const dynamicConstructor = this.parsingStrategy.constructors[selectorName]; + const [selectorName] = matchingSelector as [string, (type: string) => boolean]; + const dynamicConstructor = + this.parsingStrategies[strategyDynamicNum].constructors[selectorName]; if (dynamicConstructor) { - return (val: unknown, type?: string) => { - const instance = dynamicConstructor(val, type || abiType); - return instance.toApiRequest(); - }; + const instance = dynamicConstructor(requestData, this.parsingStrategies, abiType); + return instance.toApiRequest(); } } - throw new Error(`Parser for ${abiType} not found`); } - public getResponseParser( - abiType: AbiEntryType - ): (responseIterator: Iterator, type?: string) => any { + public parseResponse( + responseIterator: Iterator, + fieldName: string, + abiType: string + ): any { + if (isLen(fieldName)) { + return undefined; + } // Check direct constructors first - if (this.parsingStrategy.constructors[abiType] && this.parsingStrategy.response[abiType]) { - return (responseIterator: Iterator, type?: string) => { - const instance = this.parsingStrategy.constructors[abiType](responseIterator, type); - return this.parsingStrategy.response[abiType](instance); - }; + const strategyConstructorNum = this.parsingStrategies.findIndex( + (strategy: ParsingStrategy) => strategy.constructors[abiType] && strategy.response[abiType] + ); + if (strategyConstructorNum >= 0) { + const instance: CairoType = this.parsingStrategies[strategyConstructorNum].constructors[ + abiType + ](responseIterator, this.parsingStrategies); + return this.parsingStrategies[strategyConstructorNum].response[abiType]( + instance, + this.parsingStrategies + ); } - // Check dynamic selectors - const dynamicSelectors = Object.entries(this.parsingStrategy.dynamicSelectors); - const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(abiType)); - - if (matchingSelector) { - const [selectorName] = matchingSelector; - const dynamicConstructor = this.parsingStrategy.constructors[selectorName]; - const responseParser = this.parsingStrategy.response[selectorName]; + const strategyDynamicNum = this.parsingStrategies.findIndex((strategy: ParsingStrategy) => { + const dynamicSelectors = Object.entries(strategy.dynamicSelectors); + return dynamicSelectors.find(([, selectorFn]) => selectorFn(abiType)); + }); + if (strategyDynamicNum >= 0) { + const dynamicSelectors = Object.entries( + this.parsingStrategies[strategyDynamicNum].dynamicSelectors + ); + const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(abiType)); + const [selectorName] = matchingSelector as [string, (type: string) => boolean]; + const dynamicConstructor = + this.parsingStrategies[strategyDynamicNum].constructors[selectorName]; + const responseParser = this.parsingStrategies[strategyDynamicNum].response[selectorName]; if (dynamicConstructor && responseParser) { - return (responseIterator: Iterator, type?: string) => { - const instance = dynamicConstructor(responseIterator, type || abiType); - return responseParser(instance); - }; + const instance: CairoType = dynamicConstructor( + responseIterator, + this.parsingStrategies, + abiType + ); + return responseParser(instance, this.parsingStrategies); } } diff --git a/src/utils/calldata/parser/parser-2.0.0.ts b/src/utils/calldata/parser/parser-2.0.0.ts index 84194897e..400369b3a 100644 --- a/src/utils/calldata/parser/parser-2.0.0.ts +++ b/src/utils/calldata/parser/parser-2.0.0.ts @@ -6,71 +6,150 @@ import { InterfaceAbi, type LegacyEvent, AbiEntryType, + type AllowArray, + type AbiEnum, } from '../../../types'; +import { CairoStruct } from '../../cairoDataTypes/cairoStruct'; +import type { CairoType } from '../../cairoDataTypes/cairoType.interface'; +import { isTypeArray, isTypeEthAddress, isTypeOption, isTypeResult } from '../cairo'; import { AbiParserInterface } from './interface'; -import { hdParsingStrategy, ParsingStrategy } from './parsingStrategy'; +import { ParsingStrategy, type VariantType } from './parsingStrategy.type'; +import { CairoTypeCustomEnum } from '../../cairoDataTypes/cairoTypeCustomEnum'; +import { getAbiEnum, getAbiStruct } from '../calldataUtils'; +import assert from '../../assert'; export class AbiParser2 implements AbiParserInterface { abi: Abi; - parsingStrategy: ParsingStrategy; + parsingStrategies: ParsingStrategy[]; - constructor(abi: Abi, parsingStrategy?: ParsingStrategy) { + constructor(abi: Abi, parsingStrategy: ParsingStrategy) { this.abi = abi; - this.parsingStrategy = parsingStrategy || hdParsingStrategy; + // add structs & enums in strategy + const structs: AbiStruct[] = Object.values(getAbiStruct(abi)); + const enums: AbiEnum[] = Object.values(getAbiEnum(abi)); + const structAndEnumStrategy: ParsingStrategy = { + constructors: {}, + response: {}, + dynamicSelectors: {}, + }; + structs.forEach((struct: AbiStruct) => { + // Span are defined as Struct in Abi, but are useless here + if (!isTypeArray(struct.name) && !isTypeEthAddress(struct.name)) { + structAndEnumStrategy.constructors[struct.name] = (input: Iterator | unknown) => { + return new CairoStruct(input, struct, [parsingStrategy, structAndEnumStrategy]); + }; + structAndEnumStrategy.response[struct.name] = ( + instance: CairoType, + strategy: AllowArray + ) => (instance as CairoStruct).decompose(strategy); + structAndEnumStrategy.dynamicSelectors[struct.name] = (_type: string) => + _type === struct.name; + } + }); + enums.forEach((enumDef: AbiEnum) => { + // option & result are defined as enums in Abi, but are useless here + if (!isTypeOption(enumDef.name) && !isTypeResult(enumDef.name)) { + structAndEnumStrategy.constructors[enumDef.name] = ( + input: Iterator | unknown, + _strategy: AllowArray, + _type?: string, + variant?: VariantType + ) => { + assert(!(typeof variant === 'string'), 'variant needs to be an integer.'); + return new CairoTypeCustomEnum( + input, + enumDef, + [parsingStrategy, structAndEnumStrategy], + variant + ); + }; + structAndEnumStrategy.response[enumDef.name] = ( + instance: CairoType, + strategy: AllowArray + ) => (instance as CairoTypeCustomEnum).decompose(strategy); + structAndEnumStrategy.dynamicSelectors[enumDef.name] = (_type: string) => + _type === enumDef.name; + } + }); + this.parsingStrategies = [parsingStrategy, structAndEnumStrategy]; } - public getRequestParser(abiType: AbiEntryType): (val: unknown, type?: string) => any { + public parseRequestField(requestData: any, abiType: AbiEntryType): string[] { // Check direct constructors first - if (this.parsingStrategy.constructors[abiType]) { - return (val: unknown, type?: string) => { - const instance = this.parsingStrategy.constructors[abiType](val, type); - return instance.toApiRequest(); - }; + const strategyConstructorNum = this.parsingStrategies.findIndex( + (strategy: ParsingStrategy) => strategy.constructors[abiType] + ); + if (strategyConstructorNum >= 0) { + const instance = this.parsingStrategies[strategyConstructorNum].constructors[abiType]( + requestData, + this.parsingStrategies, + abiType + ); + return instance.toApiRequest(); } - // Check dynamic selectors - const dynamicSelectors = Object.entries(this.parsingStrategy.dynamicSelectors); - const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(abiType)); + const strategyDynamicNum = this.parsingStrategies.findIndex((strategy: ParsingStrategy) => { + const dynamicSelectors = Object.entries(strategy.dynamicSelectors); + return dynamicSelectors.find(([, selectorFn]) => selectorFn(abiType)); + }); - if (matchingSelector) { - const [selectorName] = matchingSelector; - const dynamicConstructor = this.parsingStrategy.constructors[selectorName]; + if (strategyDynamicNum >= 0) { + const dynamicSelectors = Object.entries( + this.parsingStrategies[strategyDynamicNum].dynamicSelectors + ); + const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(abiType)); + + const [selectorName] = matchingSelector as [string, (type: string) => boolean]; + const dynamicConstructor = + this.parsingStrategies[strategyDynamicNum].constructors[selectorName]; if (dynamicConstructor) { - return (val: unknown, type?: string) => { - const instance = dynamicConstructor(val, type || abiType); - return instance.toApiRequest(); - }; + const instance = dynamicConstructor(requestData, this.parsingStrategies, abiType); + return instance.toApiRequest(); } } - throw new Error(`Parser for ${abiType} not found`); } - public getResponseParser( - abiType: AbiEntryType - ): (responseIterator: Iterator, type?: string) => any { + public parseResponse( + responseIterator: Iterator, + _fieldName: string, + abiType: string + ): any { // Check direct constructors first - if (this.parsingStrategy.constructors[abiType] && this.parsingStrategy.response[abiType]) { - return (responseIterator: Iterator, type?: string) => { - const instance = this.parsingStrategy.constructors[abiType](responseIterator, type); - return this.parsingStrategy.response[abiType](instance); - }; + const strategyConstructorNum = this.parsingStrategies.findIndex( + (strategy: ParsingStrategy) => strategy.constructors[abiType] && strategy.response[abiType] + ); + if (strategyConstructorNum >= 0) { + const instance: CairoType = this.parsingStrategies[strategyConstructorNum].constructors[ + abiType + ](responseIterator, this.parsingStrategies); + return this.parsingStrategies[strategyConstructorNum].response[abiType]( + instance, + this.parsingStrategies + ); } - // Check dynamic selectors - const dynamicSelectors = Object.entries(this.parsingStrategy.dynamicSelectors); - const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(abiType)); - - if (matchingSelector) { - const [selectorName] = matchingSelector; - const dynamicConstructor = this.parsingStrategy.constructors[selectorName]; - const responseParser = this.parsingStrategy.response[selectorName]; + const strategyDynamicNum = this.parsingStrategies.findIndex((strategy: ParsingStrategy) => { + const dynamicSelectors = Object.entries(strategy.dynamicSelectors); + return dynamicSelectors.find(([, selectorFn]) => selectorFn(abiType)); + }); + if (strategyDynamicNum >= 0) { + const dynamicSelectors = Object.entries( + this.parsingStrategies[strategyDynamicNum].dynamicSelectors + ); + const matchingSelector = dynamicSelectors.find(([, selectorFn]) => selectorFn(abiType)); + const [selectorName] = matchingSelector as [string, (type: string) => boolean]; + const dynamicConstructor = + this.parsingStrategies[strategyDynamicNum].constructors[selectorName]; + const responseParser = this.parsingStrategies[strategyDynamicNum].response[selectorName]; if (dynamicConstructor && responseParser) { - return (responseIterator: Iterator, type?: string) => { - const instance = dynamicConstructor(responseIterator, type || abiType); - return responseParser(instance); - }; + const instance: CairoType = dynamicConstructor( + responseIterator, + this.parsingStrategies, + abiType + ); + return responseParser(instance, this.parsingStrategies); } } diff --git a/src/utils/calldata/parser/parsingStrategy.ts b/src/utils/calldata/parser/parsingStrategy.ts index ba7494772..e697d7055 100644 --- a/src/utils/calldata/parser/parsingStrategy.ts +++ b/src/utils/calldata/parser/parsingStrategy.ts @@ -1,6 +1,6 @@ import { CairoBytes31 } from '../../cairoDataTypes/bytes31'; import { CairoByteArray } from '../../cairoDataTypes/byteArray'; -import { AbiEntryType } from '../../../types'; +import { type AllowArray } from '../../../types'; import { CairoFelt252 } from '../../cairoDataTypes/felt'; import { CairoUint256 } from '../../cairoDataTypes/uint256'; import { CairoUint512 } from '../../cairoDataTypes/uint512'; @@ -21,20 +21,14 @@ import { CairoTuple } from '../../cairoDataTypes/tuple'; import { CairoSecp256k1Point } from '../../cairoDataTypes/secp256k1Point'; import { CairoType } from '../../cairoDataTypes/cairoType.interface'; import assert from '../../assert'; -import { isTypeArray, isTypeTuple } from '../cairo'; - -/** - * Parsing map for constructors and response parsers - * Configure parsing strategy for each abi type - */ -export type ParsingStrategy = { - constructors: Record< - AbiEntryType, - (input: Iterator | unknown, type?: string) => CairoType - >; - response: Record any>; - dynamicSelectors: Record boolean>; -}; +import { isTypeArray, isTypeNonZero, isTypeOption, isTypeResult, isTypeTuple } from '../cairo'; +import { CairoTypeOption } from '../../cairoDataTypes/cairoTypeOption'; +import { isUndefined } from '../../typed'; +import { CairoTypeResult } from '../../cairoDataTypes/cairoTypeResult'; +import type { ParsingStrategy, VariantType } from './parsingStrategy.type'; +import { CairoBool } from '../../cairoDataTypes'; +import { CairoEthAddress } from '../../cairoDataTypes/ethAddress'; +import { CairoNonZero } from '../../cairoDataTypes/nonZero'; /** * More robust parsing strategy @@ -62,18 +56,56 @@ export const hdParsingStrategy: ParsingStrategy = { } return new CairoFelt252(input); }, + 'core::starknet::class_hash::ClassHash': (input: Iterator | unknown) => { + if (input && typeof input === 'object' && 'next' in input) { + return CairoFelt252.factoryFromApiResponse(input as Iterator); + } + return new CairoFelt252(input); + }, + 'core::starknet::contract_address::ContractAddress': (input: Iterator | unknown) => { + if (input && typeof input === 'object' && 'next' in input) { + return CairoFelt252.factoryFromApiResponse(input as Iterator); + } + return new CairoFelt252(input); + }, + + felt: (input: Iterator | unknown) => { + if (input && typeof input === 'object' && 'next' in input) { + return CairoFelt252.factoryFromApiResponse(input as Iterator); + } + return new CairoFelt252(input); + }, [CairoUint256.abiSelector]: (input: Iterator | unknown) => { if (input && typeof input === 'object' && 'next' in input) { return CairoUint256.factoryFromApiResponse(input as Iterator); } return new CairoUint256(input); }, + Uint256: (input: Iterator | unknown) => { + if (input && typeof input === 'object' && 'next' in input) { + return CairoUint256.factoryFromApiResponse(input as Iterator); + } + return new CairoUint256(input); + }, [CairoUint512.abiSelector]: (input: Iterator | unknown) => { if (input && typeof input === 'object' && 'next' in input) { return CairoUint512.factoryFromApiResponse(input as Iterator); } return new CairoUint512(input); }, + [CairoBool.abiSelector]: (input: Iterator | unknown) => { + if (input && typeof input === 'object' && 'next' in input) { + return CairoBool.factoryFromApiResponse(input as Iterator); + } + return new CairoBool(input); + }, + [CairoEthAddress.abiSelector]: (input: Iterator | unknown) => { + if (input && typeof input === 'object' && 'next' in input) { + return CairoEthAddress.factoryFromApiResponse(input as Iterator); + } + return new CairoEthAddress(input); + }, + [CairoUint8.abiSelector]: (input: Iterator | unknown) => { if (input && typeof input === 'object' && 'next' in input) { return CairoUint8.factoryFromApiResponse(input as Iterator); @@ -146,32 +178,81 @@ export const hdParsingStrategy: ParsingStrategy = { } return new CairoSecp256k1Point(input); }, - CairoFixedArray: (input: Iterator | unknown, type?: string) => { + [CairoFixedArray.dynamicSelector]: ( + input: Iterator | unknown, + strategy: AllowArray, + type?: string + ) => { assert(!!type, 'CairoFixedArray constructor requires type parameter'); // Always use constructor - it handles both iterator and user input internally - return new CairoFixedArray(input, type, hdParsingStrategy); + return new CairoFixedArray(input, type, strategy); }, - CairoArray: (input: Iterator | unknown, type?: string) => { + [CairoArray.dynamicSelector]: ( + input: Iterator | unknown, + strategy: AllowArray, + type?: string + ) => { assert(!!type, 'CairoArray constructor requires type parameter'); // Always use constructor - it handles both iterator and user input internally - return new CairoArray(input, type, hdParsingStrategy); + return new CairoArray(input, type, strategy); }, - CairoTuple: (input: Iterator | unknown, type?: string) => { + [CairoTuple.dynamicSelector]: ( + input: Iterator | unknown, + strategy: AllowArray, + type?: string + ) => { assert(!!type, 'CairoTuple constructor requires type parameter'); // Always use constructor - it handles both iterator and user input internally - return new CairoTuple(input, type, hdParsingStrategy); + return new CairoTuple(input, type, strategy); + }, + [CairoTypeOption.dynamicSelector]: ( + input: Iterator | unknown, + strategy: AllowArray, + type?: string, + variant?: VariantType + ) => { + assert(!!type, 'CairoTypeOption constructor requires "type" parameter.'); + const variantNumber = isUndefined(variant) ? undefined : Number(variant); + return new CairoTypeOption(input, type, strategy, variantNumber); + }, + [CairoTypeResult.dynamicSelector]: ( + input: Iterator | unknown, + strategy: AllowArray, + type?: string, + variant?: VariantType + ) => { + assert(!!type, 'CairoTypeResult constructor requires "type" parameter.'); + const variantNumber = isUndefined(variant) ? undefined : Number(variant); + return new CairoTypeResult(input, type, strategy, variantNumber); + }, + [CairoNonZero.dynamicSelector]: ( + input: Iterator | unknown, + strategy: AllowArray, + type?: string + ) => { + assert(!!type, 'CairoNonZero constructor requires "type" parameter.'); + return new CairoNonZero(input, type, strategy); }, }, dynamicSelectors: { - CairoFixedArray: (type: string) => { + [CairoFixedArray.dynamicSelector]: (type: string) => { return CairoFixedArray.isAbiType(type); }, - CairoArray: (type: string) => { + [CairoArray.dynamicSelector]: (type: string) => { return isTypeArray(type); }, - CairoTuple: (type: string) => { + [CairoTuple.dynamicSelector]: (type: string) => { return isTypeTuple(type); }, + [CairoTypeOption.dynamicSelector]: (type: string) => { + return isTypeOption(type); + }, + [CairoTypeResult.dynamicSelector]: (type: string) => { + return isTypeResult(type); + }, + [CairoNonZero.dynamicSelector]: (type: string) => { + return isTypeNonZero(type); + }, // TODO: add more dynamic selectors here }, response: { @@ -179,8 +260,17 @@ export const hdParsingStrategy: ParsingStrategy = { [CairoByteArray.abiSelector]: (instance: CairoType) => (instance as CairoByteArray).decodeUtf8(), [CairoFelt252.abiSelector]: (instance: CairoType) => (instance as CairoFelt252).toBigInt(), + 'core::starknet::class_hash::ClassHash': (instance: CairoType) => + (instance as CairoFelt252).toBigInt(), + 'core::starknet::contract_address::ContractAddress': (instance: CairoType) => + (instance as CairoFelt252).toBigInt(), + felt: (instance: CairoType) => (instance as CairoFelt252).toBigInt(), [CairoUint256.abiSelector]: (instance: CairoType) => (instance as CairoUint256).toBigInt(), + Uint256: (instance: CairoType) => (instance as CairoUint256).toBigInt(), [CairoUint512.abiSelector]: (instance: CairoType) => (instance as CairoUint512).toBigInt(), + [CairoBool.abiSelector]: (instance: CairoType) => (instance as CairoBool).toBoolean(), + [CairoEthAddress.abiSelector]: (instance: CairoType) => + (instance as CairoEthAddress).toBigInt(), [CairoUint8.abiSelector]: (instance: CairoType) => (instance as CairoUint8).toBigInt(), [CairoUint16.abiSelector]: (instance: CairoType) => (instance as CairoUint16).toBigInt(), [CairoUint32.abiSelector]: (instance: CairoType) => (instance as CairoUint32).toBigInt(), @@ -194,9 +284,23 @@ export const hdParsingStrategy: ParsingStrategy = { [CairoInt128.abiSelector]: (instance: CairoType) => (instance as CairoInt128).toBigInt(), [CairoSecp256k1Point.abiSelector]: (instance: CairoType) => (instance as CairoSecp256k1Point).toBigInt(), - CairoFixedArray: (instance: CairoType) => - (instance as CairoFixedArray).decompose(hdParsingStrategy), - CairoArray: (instance: CairoType) => (instance as CairoArray).decompose(hdParsingStrategy), - CairoTuple: (instance: CairoType) => (instance as CairoTuple).decompose(hdParsingStrategy), + [CairoFixedArray.dynamicSelector]: ( + instance: CairoType, + strategy: AllowArray + ) => (instance as CairoFixedArray).decompose(strategy), + [CairoArray.dynamicSelector]: (instance: CairoType, strategy: AllowArray) => + (instance as CairoArray).decompose(strategy), + [CairoTuple.dynamicSelector]: (instance: CairoType, strategy: AllowArray) => + (instance as CairoTuple).decompose(strategy), + [CairoTypeOption.dynamicSelector]: ( + instance: CairoType, + strategy: AllowArray + ) => (instance as CairoTypeOption).decompose(strategy), + [CairoTypeResult.dynamicSelector]: ( + instance: CairoType, + strategy: AllowArray + ) => (instance as CairoTypeResult).decompose(strategy), + [CairoNonZero.dynamicSelector]: (instance: CairoType, strategy: AllowArray) => + (instance as CairoNonZero).decompose(strategy), }, } as const; diff --git a/src/utils/calldata/parser/parsingStrategy.type.ts b/src/utils/calldata/parser/parsingStrategy.type.ts new file mode 100644 index 000000000..8c6db3669 --- /dev/null +++ b/src/utils/calldata/parser/parsingStrategy.type.ts @@ -0,0 +1,25 @@ +import type { AbiEntryType, AllowArray } from '../../../types'; +import type { CairoType } from '../../cairoDataTypes/cairoType.interface'; +import type { CairoOptionVariant, CairoResultVariant } from '../enum'; + +/** + * Parsing map for constructors and response parsers + * Configure parsing strategy for each abi type + */ +export type VariantType = CairoOptionVariant | CairoResultVariant | string | number; +export type ParsingStrategy = { + constructors: Record< + AbiEntryType, + ( + input: Iterator | unknown, + strategy: AllowArray, + type?: string, + variant?: VariantType + ) => CairoType + >; + response: Record< + AbiEntryType, + (instance: CairoType, strategy: AllowArray) => any + >; + dynamicSelectors: Record boolean>; +}; diff --git a/src/utils/calldata/propertyOrder.ts b/src/utils/calldata/propertyOrder.ts index 668e3e7ac..ea43ad058 100644 --- a/src/utils/calldata/propertyOrder.ts +++ b/src/utils/calldata/propertyOrder.ts @@ -1,4 +1,12 @@ -import { AbiEntry, AbiEnums, AbiStructs, CairoEnum, RawArgsObject } from '../../types'; +import { + AbiEntry, + AbiEnums, + AbiStructs, + CairoEnum, + RawArgsObject, + type AllowArray, + type CairoTypeEnum, +} from '../../types'; import { CairoUint256 } from '../cairoDataTypes/uint256'; import { CairoUint512 } from '../cairoDataTypes/uint512'; import { @@ -28,6 +36,11 @@ import { CairoArray } from '../cairoDataTypes/array'; import { CairoTuple } from '../cairoDataTypes/tuple'; import { CairoByteArray } from '../cairoDataTypes/byteArray'; import { CairoSecp256k1Point } from '../cairoDataTypes/secp256k1Point'; +import { CairoTypeOption } from '../cairoDataTypes/cairoTypeOption'; +import { type ParsingStrategy } from './parser'; +import { CairoTypeResult } from '../cairoDataTypes/cairoTypeResult'; +import { CairoStruct } from '../cairoDataTypes/cairoStruct'; +import { CairoTypeCustomEnum } from '../cairoDataTypes/cairoTypeCustomEnum'; function errorU256(key: string) { return Error( @@ -45,7 +58,8 @@ export default function orderPropsByAbi( unorderedObject: RawArgsObject, abiOfObject: AbiEntry[], structs: AbiStructs, - enums: AbiEnums + enums: AbiEnums, + parseStrategy: AllowArray ): object { const orderInput = (unorderedItem: any, abiType: string): any => { if (CairoFixedArray.isAbiType(abiType)) { @@ -102,6 +116,9 @@ export default function orderPropsByAbi( } return { limb0: u512.limb0, limb1: u512.limb1, limb2: u512.limb2, limb3: u512.limb3 }; } + if (CairoStruct.isAbiType(abiType)) { + return unorderedItem; + } if (isTypeStruct(abiType, structs)) { const abiOfStruct = structs[abiType].members; // eslint-disable-next-line @typescript-eslint/no-use-before-define @@ -192,60 +209,68 @@ export default function orderPropsByAbi( return orderedObject2; } - const orderEnum = (unorderedObject2: CairoEnum, abiObject: AbiEntry): CairoEnum => { + const orderEnum = ( + unorderedObject2: CairoEnum | CairoTypeEnum, + abiObject: AbiEntry + ): CairoTypeEnum => { if (isTypeResult(abiObject.name)) { - const unorderedResult = unorderedObject2 as CairoResult; - const resultOkType: string = abiObject.name.substring( - abiObject.name.indexOf('<') + 1, - abiObject.name.lastIndexOf(',') - ); - const resultErrType: string = abiObject.name.substring( - abiObject.name.indexOf(',') + 1, - abiObject.name.lastIndexOf('>') - ); - if (unorderedResult.isOk()) { - return new CairoResult( - CairoResultVariant.Ok, - orderInput(unorderedObject2.unwrap(), resultOkType) + if (unorderedObject2 instanceof CairoResult) { + const unorderedResult = unorderedObject2 as CairoResult; + const resultType: string = CairoTypeResult.getVariantTypes(abiObject.name)[ + unorderedResult.isOk() ? CairoResultVariant.Ok : CairoResultVariant.Err + ]; + return new CairoTypeResult( + orderInput(unorderedResult.unwrap(), resultType), + abiObject.name, + parseStrategy, + unorderedResult.isOk() ? CairoResultVariant.Ok : CairoResultVariant.Err ); } - return new CairoResult( - CairoResultVariant.Err, - orderInput(unorderedObject2.unwrap(), resultErrType) - ); + return unorderedObject2 as CairoTypeResult; } if (isTypeOption(abiObject.name)) { - const unorderedOption = unorderedObject2 as CairoOption; - const resultSomeType: string = abiObject.name.substring( - abiObject.name.indexOf('<') + 1, - abiObject.name.lastIndexOf('>') - ); - if (unorderedOption.isSome()) { - return new CairoOption( - CairoOptionVariant.Some, - orderInput(unorderedOption.unwrap(), resultSomeType) + if (unorderedObject2 instanceof CairoOption) { + const unorderedOption = unorderedObject2 as CairoOption; + if (unorderedOption.isSome()) { + const resultSomeType: string = CairoTypeOption.getVariantSomeType(abiObject.name); + return new CairoTypeOption( + orderInput(unorderedOption.unwrap(), resultSomeType), + abiObject.name, + parseStrategy, + CairoOptionVariant.Some + ); + } + // none(()) + return new CairoTypeOption( + undefined, + abiObject.name, + parseStrategy, + CairoOptionVariant.None ); } - // none(()) - return new CairoOption(CairoOptionVariant.None, {}); + return unorderedObject2 as CairoTypeOption; } // custom Enum - const unorderedCustomEnum = unorderedObject2 as CairoCustomEnum; - const variants = Object.entries(unorderedCustomEnum.variant); - const newEntries = variants.map((variant) => { - if (isUndefined(variant[1])) { - return variant; - } - const variantType: string = abiObject.type.substring( - abiObject.type.lastIndexOf('<') + 1, - abiObject.type.lastIndexOf('>') + if (unorderedObject2 instanceof CairoCustomEnum) { + const unorderedCustomEnum = unorderedObject2; + const variantList = Object.values(enums[abiObject.name].variants); + const newEntries = variantList.map((abiEntry) => { + if (isUndefined(unorderedCustomEnum.variant[abiEntry.name])) { + return [abiEntry.name, undefined]; + } + return [abiEntry.name, orderInput(unorderedCustomEnum.unwrap(), abiEntry.type)]; + }); + const variantIndex = variantList.findIndex( + (variant) => variant.name === unorderedCustomEnum.activeVariant() ); - if (variantType === '()') { - return variant; - } - return [variant[0], orderInput(unorderedCustomEnum.unwrap(), variantType)]; - }); - return new CairoCustomEnum(Object.fromEntries(newEntries)); + return new CairoTypeCustomEnum( + new CairoCustomEnum(Object.fromEntries(newEntries)), + enums[abiObject.name], + parseStrategy, + variantIndex + ); + } + return unorderedObject2 as CairoTypeCustomEnum; }; // Order Call Parameters diff --git a/src/utils/calldata/requestParser.ts b/src/utils/calldata/requestParser.ts deleted file mode 100644 index bdd113cfa..000000000 --- a/src/utils/calldata/requestParser.ts +++ /dev/null @@ -1,429 +0,0 @@ -import { - AbiEntry, - AbiEnums, - AbiStructs, - AllowArray, - BigNumberish, - CairoEnum, - ParsedStruct, -} from '../../types'; -import { CairoByteArray } from '../cairoDataTypes/byteArray'; -import { CairoBytes31 } from '../cairoDataTypes/bytes31'; -import { CairoFelt252 } from '../cairoDataTypes/felt'; -import { CairoFixedArray } from '../cairoDataTypes/fixedArray'; -import { CairoArray } from '../cairoDataTypes/array'; -import { CairoTuple } from '../cairoDataTypes/tuple'; -import { CairoUint256 } from '../cairoDataTypes/uint256'; -import { CairoUint512 } from '../cairoDataTypes/uint512'; -import { CairoUint8 } from '../cairoDataTypes/uint8'; -import { CairoUint16 } from '../cairoDataTypes/uint16'; -import { CairoUint64 } from '../cairoDataTypes/uint64'; -import { CairoUint96 } from '../cairoDataTypes/uint96'; -import { CairoUint128 } from '../cairoDataTypes/uint128'; -import { CairoInt8 } from '../cairoDataTypes/int8'; -import { CairoInt16 } from '../cairoDataTypes/int16'; -import { CairoInt32 } from '../cairoDataTypes/int32'; -import { CairoInt64 } from '../cairoDataTypes/int64'; -import { CairoInt128 } from '../cairoDataTypes/int128'; -import { isText, splitLongString } from '../shortString'; -import { isUndefined, isString } from '../typed'; -import { - felt, - getArrayType, - isTypeArray, - isTypeEnum, - isTypeEthAddress, - isTypeNonZero, - isTypeOption, - isTypeResult, - isTypeSecp256k1Point, - isTypeStruct, - isTypeTuple, -} from './cairo'; -import { - CairoCustomEnum, - CairoOption, - CairoOptionVariant, - CairoResult, - CairoResultVariant, -} from './enum'; -import { AbiParserInterface } from './parser'; - -// TODO: cleanup implementations to work with unknown, instead of blind casting with 'as' - -/** - * parse base types - * @param type type from abi - * @param val value provided - * @returns string | string[] - */ -function parseBaseTypes({ - type, - val, - parser, -}: { - type: string; - val: unknown; - parser: AbiParserInterface; -}): AllowArray { - switch (true) { - case CairoUint256.isAbiType(type): - return parser.getRequestParser(type)(val); - case CairoUint512.isAbiType(type): - return parser.getRequestParser(type)(val); - case CairoUint8.isAbiType(type): - return parser.getRequestParser(type)(val); - case CairoUint16.isAbiType(type): - return parser.getRequestParser(type)(val); - case CairoUint64.isAbiType(type): - return parser.getRequestParser(type)(val); - case CairoUint96.isAbiType(type): - return parser.getRequestParser(type)(val); - case CairoUint128.isAbiType(type): - return parser.getRequestParser(type)(val); - case CairoInt8.isAbiType(type): - return parser.getRequestParser(type)(val); - case CairoInt16.isAbiType(type): - return parser.getRequestParser(type)(val); - case CairoInt32.isAbiType(type): - return parser.getRequestParser(type)(val); - case CairoInt64.isAbiType(type): - return parser.getRequestParser(type)(val); - case CairoInt128.isAbiType(type): - return parser.getRequestParser(type)(val); - case CairoBytes31.isAbiType(type): - return parser.getRequestParser(type)(val); - case isTypeSecp256k1Point(type): - return parser.getRequestParser(type)(val); - default: - // TODO: check but u32 should land here with rest of the simple types, at the moment handle as felt - return parser.getRequestParser(CairoFelt252.abiSelector)(val); - } -} - -/** - * Deep parse of the object that has been passed to the method - * - * @param element - element that needs to be parsed - * @param type - name of the method - * @param structs - structs from abi - * @param enums - enums from abi - * @return {string | string[]} - parsed arguments in format that contract is expecting - */ -function parseCalldataValue({ - element, - type, - structs, - enums, - parser, -}: { - element: unknown; - type: string; - structs: AbiStructs; - enums: AbiEnums; - parser: AbiParserInterface; -}): string | string[] { - if (element === undefined) { - throw Error(`Missing parameter for type ${type}`); - } - - // value is fixed array - if (CairoFixedArray.isAbiType(type)) { - return parser.getRequestParser(CairoFixedArray.dynamicSelector)(element, type); - } - - // value is CairoArray instance - if (element instanceof CairoArray) { - return element.toApiRequest(); - } - - // value is CairoTuple instance - if (element instanceof CairoTuple) { - return element.toApiRequest(); - } - - // value is Array - if (Array.isArray(element)) { - const result: string[] = []; - result.push(felt(element.length)); // Add length to array - const arrayType = getArrayType(type); - - return element.reduce((acc, it) => { - return acc.concat( - parseCalldataValue({ element: it, type: arrayType, structs, enums, parser }) - ); - }, result); - } - - // check if u256 C1v0 - if (CairoUint256.isAbiType(type)) { - return parser.getRequestParser(type)(element); - } - // check if u512 - if (CairoUint512.isAbiType(type)) { - return parser.getRequestParser(type)(element); - } - - // checking if the passed element is struct - if (structs[type] && structs[type].members.length) { - if (isTypeEthAddress(type)) { - return parseBaseTypes({ type, val: element as BigNumberish, parser }); - } - - if (CairoByteArray.isAbiType(type)) { - return parser.getRequestParser(type)(element); - } - - const { members } = structs[type]; - const subElement = element as any; - - return members.reduce((acc, it: AbiEntry) => { - return acc.concat( - parseCalldataValue({ - element: subElement[it.name], - type: it.type, - structs, - enums, - parser, - }) - ); - }, [] as string[]); - } - // check if abi element is tuple - if (isTypeTuple(type)) { - // Create CairoTuple instance and use its toApiRequest method - const tuple = new CairoTuple(element, type, parser.parsingStrategy); - return tuple.toApiRequest(); - } - - // check if Enum - if (isTypeEnum(type, enums)) { - const { variants } = enums[type]; - // Option Enum - if (isTypeOption(type)) { - const myOption = element as CairoOption; - if (myOption.isSome()) { - const listTypeVariant = variants.find((variant) => variant.name === 'Some'); - if (isUndefined(listTypeVariant)) { - throw Error(`Error in abi : Option has no 'Some' variant.`); - } - const typeVariantSome = listTypeVariant.type; - if (typeVariantSome === '()') { - return CairoOptionVariant.Some.toString(); - } - const parsedParameter = parseCalldataValue({ - element: myOption.unwrap(), - type: typeVariantSome, - structs, - enums, - parser, - }); - if (Array.isArray(parsedParameter)) { - return [CairoOptionVariant.Some.toString(), ...parsedParameter]; - } - return [CairoOptionVariant.Some.toString(), parsedParameter]; - } - return CairoOptionVariant.None.toString(); - } - // Result Enum - if (isTypeResult(type)) { - const myResult = element as CairoResult; - if (myResult.isOk()) { - const listTypeVariant = variants.find((variant) => variant.name === 'Ok'); - if (isUndefined(listTypeVariant)) { - throw Error(`Error in abi : Result has no 'Ok' variant.`); - } - const typeVariantOk = listTypeVariant.type; - if (typeVariantOk === '()') { - return CairoResultVariant.Ok.toString(); - } - const parsedParameter = parseCalldataValue({ - element: myResult.unwrap(), - type: typeVariantOk, - structs, - enums, - parser, - }); - if (Array.isArray(parsedParameter)) { - return [CairoResultVariant.Ok.toString(), ...parsedParameter]; - } - return [CairoResultVariant.Ok.toString(), parsedParameter]; - } - - // is Result::Err - const listTypeVariant = variants.find((variant) => variant.name === 'Err'); - if (isUndefined(listTypeVariant)) { - throw Error(`Error in abi : Result has no 'Err' variant.`); - } - const typeVariantErr = listTypeVariant.type; - if (typeVariantErr === '()') { - return CairoResultVariant.Err.toString(); - } - const parsedParameter = parseCalldataValue({ - element: myResult.unwrap(), - type: typeVariantErr, - structs, - enums, - parser, - }); - if (Array.isArray(parsedParameter)) { - return [CairoResultVariant.Err.toString(), ...parsedParameter]; - } - return [CairoResultVariant.Err.toString(), parsedParameter]; - } - // Custom Enum - const myEnum = element as CairoCustomEnum; - const activeVariant: string = myEnum.activeVariant(); - const listTypeVariant = variants.find((variant) => variant.name === activeVariant); - if (isUndefined(listTypeVariant)) { - throw Error(`Not find in abi : Enum has no '${activeVariant}' variant.`); - } - const typeActiveVariant = listTypeVariant.type; - const numActiveVariant = variants.findIndex((variant) => variant.name === activeVariant); // can not fail due to check of listTypeVariant - if (typeActiveVariant === '()') { - return numActiveVariant.toString(); - } - const parsedParameter = parseCalldataValue({ - element: myEnum.unwrap(), - type: typeActiveVariant, - structs, - enums, - parser, - }); - if (Array.isArray(parsedParameter)) { - return [numActiveVariant.toString(), ...parsedParameter]; - } - return [numActiveVariant.toString(), parsedParameter]; - } - - if (isTypeNonZero(type)) { - return parseBaseTypes({ type: getArrayType(type), val: element, parser }); - } - - if (typeof element === 'object') { - throw Error(`Parameter ${element} do not align with abi parameter ${type}`); - } - return parseBaseTypes({ type, val: element, parser }); -} - -/** - * Parse one field of the calldata by using input field from the abi for that method - * - * @param argsIterator - Iterator for value of the field - * @param input - input(field) information from the abi that will be used to parse the data - * @param structs - structs from abi - * @param enums - enums from abi - * @return {string | string[]} - parsed arguments in format that contract is expecting - * - * @example - * const abiEntry = { name: 'test', type: 'struct' }; - * const abiStructs: AbiStructs = { - * struct: { - * members: [ - * { - * name: 'test_name', - * type: 'test_type', - * offset: 1, - * }, - * ], - * size: 2, - * name: 'cairo__struct', - * type: 'struct', - * }, - * }; - * - * const abiEnums: AbiEnums = { - * enum: { - * variants: [ - * { - * name: 'test_name', - * type: 'cairo_struct_variant', - * offset: 1, - * }, - * ], - * size: 2, - * name: 'test_cairo', - * type: 'enum', - * }, - * }; - * - * const args = [{ test_name: 'test' }]; - * const argsIterator = args[Symbol.iterator](); - * const parsedField = parseCalldataField( - * argsIterator, - * abiEntry, - * abiStructs, - * abiEnums - * ); - * // parsedField === ['1952805748'] - */ -export function parseCalldataField({ - argsIterator, - input, - structs, - enums, - parser, -}: { - argsIterator: Iterator; - input: AbiEntry; - structs: AbiStructs; - enums: AbiEnums; - parser: AbiParserInterface; -}): string | string[] { - const { name, type } = input; - let { value } = argsIterator.next(); - - switch (true) { - // Fixed array - case CairoFixedArray.isAbiType(type): - return parseCalldataValue({ element: value, type: input.type, structs, enums, parser }); - // Normal Array - case isTypeArray(type): - if (value instanceof CairoArray) { - return value.toApiRequest(); - } - if (!Array.isArray(value) && !isText(value)) { - throw Error(`ABI expected parameter ${name} to be array or long string, got ${value}`); - } - if (isString(value)) { - // long string match cairo felt* - value = splitLongString(value); - } - return parseCalldataValue({ element: value, type: input.type, structs, enums, parser }); - case isTypeNonZero(type): - return parseBaseTypes({ type: getArrayType(type), val: value, parser }); - case isTypeEthAddress(type): - return parseBaseTypes({ type, val: value, parser }); - // CairoTuple instance - case value instanceof CairoTuple: - return value.toApiRequest(); - // Tuple type - create CairoTuple from raw input - case isTypeTuple(type): { - const tuple = new CairoTuple(value, type, parser.parsingStrategy); - return tuple.toApiRequest(); - } - // Struct - case isTypeStruct(type, structs) || CairoUint256.isAbiType(type): - return parseCalldataValue({ - element: value as ParsedStruct | BigNumberish[], - type, - structs, - enums, - parser, - }); - - // Enums - case isTypeEnum(type, enums): - return parseCalldataValue({ - element: value as CairoOption | CairoResult | CairoEnum, - type, - structs, - enums, - parser, - }); - - // Felt or unhandled - default: - return parseBaseTypes({ type, val: value, parser }); - } -} diff --git a/src/utils/calldata/responseParser.ts b/src/utils/calldata/responseParser.ts deleted file mode 100644 index 01d3f4598..000000000 --- a/src/utils/calldata/responseParser.ts +++ /dev/null @@ -1,303 +0,0 @@ -/* eslint-disable no-case-declarations */ -import { - AbiEntry, - AbiEnums, - AbiStructs, - Args, - BigNumberish, - CairoEnum, - EventEntry, - ParsedStruct, -} from '../../types'; -import { CairoByteArray } from '../cairoDataTypes/byteArray'; -import { CairoBytes31 } from '../cairoDataTypes/bytes31'; -import { CairoFelt252 } from '../cairoDataTypes/felt'; -import { CairoFixedArray } from '../cairoDataTypes/fixedArray'; -import { CairoTuple } from '../cairoDataTypes/tuple'; -import { CairoUint256 } from '../cairoDataTypes/uint256'; -import { CairoUint512 } from '../cairoDataTypes/uint512'; -import { CairoUint8 } from '../cairoDataTypes/uint8'; -import { CairoUint16 } from '../cairoDataTypes/uint16'; -import { CairoUint64 } from '../cairoDataTypes/uint64'; -import { CairoUint96 } from '../cairoDataTypes/uint96'; -import { CairoUint128 } from '../cairoDataTypes/uint128'; -import { CairoInt8 } from '../cairoDataTypes/int8'; -import { CairoInt16 } from '../cairoDataTypes/int16'; -import { CairoInt32 } from '../cairoDataTypes/int32'; -import { CairoInt64 } from '../cairoDataTypes/int64'; -import { CairoInt128 } from '../cairoDataTypes/int128'; -import { - getArrayType, - isCairo1Type, - isLen, - isTypeArray, - isTypeBool, - isTypeEnum, - isTypeEthAddress, - isTypeNonZero, - isTypeSecp256k1Point, - isTypeTuple, -} from './cairo'; -import { - CairoCustomEnum, - CairoEnumRaw, - CairoOption, - CairoOptionVariant, - CairoResult, - CairoResultVariant, -} from './enum'; -import { AbiParserInterface } from './parser/interface'; - -/** - * Parse base types - * @param type type of element - * @param it iterator - * @returns bigint | boolean - */ -function parseBaseTypes(type: string, it: Iterator, parser: AbiParserInterface) { - let temp; - switch (true) { - case isTypeBool(type): - temp = it.next().value; - return Boolean(BigInt(temp)); - case CairoUint256.isAbiType(type): - return parser.getResponseParser(type)(it); - case CairoUint512.isAbiType(type): - return parser.getResponseParser(type)(it); - case CairoUint8.isAbiType(type): - return parser.getResponseParser(type)(it); - case CairoUint16.isAbiType(type): - return parser.getResponseParser(type)(it); - case CairoUint64.isAbiType(type): - return parser.getResponseParser(type)(it); - case CairoUint96.isAbiType(type): - return parser.getResponseParser(type)(it); - case CairoUint128.isAbiType(type): - return parser.getResponseParser(type)(it); - case CairoInt8.isAbiType(type): - return parser.getResponseParser(type)(it); - case CairoInt16.isAbiType(type): - return parser.getResponseParser(type)(it); - case CairoInt32.isAbiType(type): - return parser.getResponseParser(type)(it); - case CairoInt64.isAbiType(type): - return parser.getResponseParser(type)(it); - case CairoInt128.isAbiType(type): - return parser.getResponseParser(type)(it); - case isTypeEthAddress(type): - temp = it.next().value; - return BigInt(temp); - case CairoBytes31.isAbiType(type): - return parser.getResponseParser(type)(it); - case isTypeSecp256k1Point(type): - return parser.getResponseParser(type)(it); - default: - // TODO: this is for all simple types felt and rest to BN, at the moment handle as felt - return parser.getResponseParser(CairoFelt252.abiSelector)(it); - } -} - -/** - * Parse of the response elements that are converted to Object (Struct) by using the abi - * - * @param responseIterator - iterator of the response - * @param element - element of the field {name: string, type: string} - * @param structs - structs from abi - * @param enums - * @return {any} - parsed arguments in format that contract is expecting - */ -function parseResponseValue( - responseIterator: Iterator, - element: { name: string; type: string }, - parser: AbiParserInterface, - structs?: AbiStructs, - enums?: AbiEnums -): BigNumberish | ParsedStruct | boolean | any[] | CairoEnum { - if (element.type === '()') { - return {}; - } - // type uint256 struct (c1v2) - if (CairoUint256.isAbiType(element.type)) { - return parser.getResponseParser(element.type)(responseIterator); - } - // type uint512 struct - if (CairoUint512.isAbiType(element.type)) { - return parser.getResponseParser(element.type)(responseIterator); - } - // type ByteArray struct - if (CairoByteArray.isAbiType(element.type)) { - return parser.getResponseParser(element.type)(responseIterator); - } - - // type fixed-array - if (CairoFixedArray.isAbiType(element.type)) { - return parser.getResponseParser(CairoFixedArray.dynamicSelector)( - responseIterator, - element.type - ); - } - - // type c1 array - if (isTypeArray(element.type)) { - // eslint-disable-next-line no-case-declarations - const parsedDataArr: (BigNumberish | ParsedStruct | boolean | any[] | CairoEnum)[] = []; - const el: AbiEntry = { name: '', type: getArrayType(element.type) }; - const len = BigInt(responseIterator.next().value); // get length - while (parsedDataArr.length < len) { - parsedDataArr.push(parseResponseValue(responseIterator, el, parser, structs, enums)); - } - return parsedDataArr; - } - - // type NonZero - if (isTypeNonZero(element.type)) { - // eslint-disable-next-line no-case-declarations - // const parsedDataArr: (BigNumberish | ParsedStruct | boolean | any[] | CairoEnum)[] = []; - const el: AbiEntry = { name: '', type: getArrayType(element.type) }; - // parsedDataArr.push(); - return parseResponseValue(responseIterator, el, parser, structs, enums); - } - - // type struct - if (structs && element.type in structs && structs[element.type]) { - if (isTypeEthAddress(element.type)) { - return parseBaseTypes(element.type, responseIterator, parser); - } - return structs[element.type].members.reduce((acc, el) => { - acc[el.name] = parseResponseValue(responseIterator, el, parser, structs, enums); - return acc; - }, {} as any); - } - - // type Enum (only CustomEnum) - if (enums && element.type in enums && enums[element.type]) { - const variantNum: number = Number(responseIterator.next().value); // get variant number - const rawEnum = enums[element.type].variants.reduce((acc, variant, num) => { - if (num === variantNum) { - acc[variant.name] = parseResponseValue( - responseIterator, - { name: '', type: variant.type }, - parser, - structs, - enums - ); - return acc; - } - acc[variant.name] = undefined; - return acc; - }, {} as CairoEnumRaw); - // Option - if (element.type.startsWith('core::option::Option')) { - const content = variantNum === CairoOptionVariant.Some ? rawEnum.Some : undefined; - return new CairoOption(variantNum, content); - } - // Result - if (element.type.startsWith('core::result::Result')) { - let content: Object; - if (variantNum === CairoResultVariant.Ok) { - content = rawEnum.Ok; - } else { - content = rawEnum.Err; - } - return new CairoResult(variantNum, content); - } - // Cairo custom Enum - const customEnum = new CairoCustomEnum(rawEnum); - return customEnum; - } - - // type tuple - if (isTypeTuple(element.type)) { - const tuple = new CairoTuple(responseIterator, element.type, parser.parsingStrategy); - return tuple.decompose(parser.parsingStrategy); - } - - // TODO: duplicated, investigate why and what was an issue then de-duplicate - // type c1 array - if (isTypeArray(element.type)) { - // eslint-disable-next-line no-case-declarations - const parsedDataArr: (BigNumberish | ParsedStruct | boolean | any[] | CairoEnum)[] = []; - const el = { name: '', type: getArrayType(element.type) }; - const len = BigInt(responseIterator.next().value); // get length - while (parsedDataArr.length < len) { - parsedDataArr.push(parseResponseValue(responseIterator, el, parser, structs, enums)); - } - return parsedDataArr; - } - - // base type - return parseBaseTypes(element.type, responseIterator, parser); -} - -/** - * Parse elements of the response and structuring them into one field by using output property from the abi for that method - * - * @param responseIterator - iterator of the response - * @param output - output(field) information from the abi that will be used to parse the data - * @param structs - structs from abi - * @param parsedResult - * @return - parsed response corresponding to the abi structure of the field - */ -export default function responseParser({ - responseIterator, - output, - structs, - enums, - parsedResult, - parser, -}: { - responseIterator: Iterator; - output: AbiEntry | EventEntry; - structs: AbiStructs; - enums: AbiEnums; - parsedResult?: Args | ParsedStruct; - parser: AbiParserInterface; -}): any { - const { name, type } = output; - let temp; - - switch (true) { - case isLen(name): - temp = responseIterator.next().value; - return BigInt(temp); - - case (structs && type in structs) || isTypeTuple(type): - return parseResponseValue(responseIterator, output, parser, structs, enums); - - case enums && isTypeEnum(type, enums): - return parseResponseValue(responseIterator, output, parser, structs, enums); - - case CairoFixedArray.isAbiType(type): - return parseResponseValue(responseIterator, output, parser, structs, enums); - - case isTypeArray(type): - // C1 Array - if (isCairo1Type(type)) { - return parseResponseValue(responseIterator, output, parser, structs, enums); - } - // C0 Array - // eslint-disable-next-line no-case-declarations - const parsedDataArr: (BigNumberish | ParsedStruct | boolean | any[] | CairoEnum)[] = []; - if (parsedResult && parsedResult[`${name}_len`]) { - const arrLen = parsedResult[`${name}_len`] as number; - while (parsedDataArr.length < arrLen) { - parsedDataArr.push( - parseResponseValue( - responseIterator, - { name, type: output.type.replace('*', '') }, - parser, - structs, - enums - ) - ); - } - } - return parsedDataArr; - - case isTypeNonZero(type): - return parseResponseValue(responseIterator, output, parser, structs, enums); - - default: - return parseBaseTypes(type, responseIterator, parser); - } -} diff --git a/src/utils/calldata/validate.ts b/src/utils/calldata/validate.ts deleted file mode 100644 index 3c6207db1..000000000 --- a/src/utils/calldata/validate.ts +++ /dev/null @@ -1,489 +0,0 @@ -import { - AbiEntry, - AbiEnums, - AbiStructs, - BigNumberish, - FunctionAbi, - Literal, - Uint, -} from '../../types'; -import assert from '../assert'; -import { CairoByteArray } from '../cairoDataTypes/byteArray'; -import { CairoBytes31 } from '../cairoDataTypes/bytes31'; -import { CairoFixedArray } from '../cairoDataTypes/fixedArray'; -import { CairoArray } from '../cairoDataTypes/array'; -import { CairoTuple } from '../cairoDataTypes/tuple'; -import { CairoInt8 } from '../cairoDataTypes/int8'; -import { CairoInt16 } from '../cairoDataTypes/int16'; -import { CairoInt32 } from '../cairoDataTypes/int32'; -import { CairoInt64 } from '../cairoDataTypes/int64'; -import { CairoInt128 } from '../cairoDataTypes/int128'; -import { CairoUint256 } from '../cairoDataTypes/uint256'; -import { CairoUint512 } from '../cairoDataTypes/uint512'; -import { CairoSecp256k1Point } from '../cairoDataTypes/secp256k1Point'; -import { isHex, toBigInt } from '../num'; -import { isLongText } from '../shortString'; -import { isBoolean, isNumber, isString, isBigInt, isObject } from '../typed'; -import { - getArrayType, - isLen, - isTypeArray, - isTypeBool, - isTypeEnum, - isTypeEthAddress, - isTypeFelt, - isTypeLiteral, - isTypeNonZero, - isTypeOption, - isTypeResult, - isTypeStruct, - isTypeTuple, - isTypeUint, -} from './cairo'; - -// TODO: separate validate is redundant as CairoTypes are validated during construction. -// TODO: This validate should provide added valie method base validate poiniting to incorect value for method, opt. using color coding -// TODO: Something like: store_message(a -> *INVALID JS TYPE*, b, c -> *MISSING REQUIRED ARG*) - -const validateFelt = (parameter: any, input: AbiEntry) => { - assert( - isString(parameter) || isNumber(parameter) || isBigInt(parameter), - `Validate: arg ${input.name} should be a felt typed as (String, Number or BigInt)` - ); - if (isString(parameter) && !isHex(parameter)) return; // shortstring - const param = BigInt(parameter.toString(10)); - assert( - // from : https://github.com/starkware-libs/starknet-specs/blob/29bab650be6b1847c92d4461d4c33008b5e50b1a/api/starknet_api_openrpc.json#L1266 - param >= 0n && param <= 2n ** 252n - 1n, - `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 2^252-1]` - ); -}; - -const validateUint = (parameter: any, input: AbiEntry) => { - if (isNumber(parameter)) { - assert( - parameter <= Number.MAX_SAFE_INTEGER, - 'Validation: Parameter is too large to be typed as Number use (BigInt or String)' - ); - } - assert( - isString(parameter) || - isNumber(parameter) || - isBigInt(parameter) || - (isObject(parameter) && 'low' in parameter && 'high' in parameter) || - (isObject(parameter) && - ['limb0', 'limb1', 'limb2', 'limb3'].every((key) => key in parameter)), - `Validate: arg ${input.name} of cairo type ${ - input.type - } should be type (String, Number or BigInt), but is ${typeof parameter} ${parameter}.` - ); - let param: bigint; - switch (input.type) { - case Uint.u256: - param = new CairoUint256(parameter as BigNumberish).toBigInt(); - break; - case Uint.u512: - param = new CairoUint512(parameter as BigNumberish).toBigInt(); - break; - default: - param = toBigInt(parameter as BigNumberish); - } - switch (input.type) { - case Uint.u8: - assert( - param >= 0n && param <= 255n, - `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0 - 255]` - ); - break; - - case Uint.u16: - assert( - param >= 0n && param <= 65535n, - `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 65535]` - ); - break; - - case Uint.u32: - assert( - param >= 0n && param <= 4294967295n, - `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 4294967295]` - ); - break; - - case Uint.u64: - assert( - param >= 0n && param <= 2n ** 64n - 1n, - `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 2^64-1]` - ); - break; - - case Uint.u128: - assert( - param >= 0n && param <= 2n ** 128n - 1n, - `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 2^128-1]` - ); - break; - - case Uint.u256: - assert( - param >= 0n && param <= 2n ** 256n - 1n, - `Validate: arg ${input.name} is ${input.type} should be in range 0 - 2^256-1` - ); - break; - - case Uint.u512: - assert( - CairoUint512.is(param), - `Validate: arg ${input.name} is ${input.type} should be in range 0 - 2^512-1` - ); - break; - - case Literal.ClassHash: - assert( - // from : https://github.com/starkware-libs/starknet-specs/blob/29bab650be6b1847c92d4461d4c33008b5e50b1a/api/starknet_api_openrpc.json#L1670 - param >= 0n && param <= 2n ** 252n - 1n, - `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 2^252-1]` - ); - break; - - case Literal.ContractAddress: - assert( - // from : https://github.com/starkware-libs/starknet-specs/blob/29bab650be6b1847c92d4461d4c33008b5e50b1a/api/starknet_api_openrpc.json#L1245 - param >= 0n && param <= 2n ** 252n - 1n, - `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 2^252-1]` - ); - break; - case Literal.Secp256k1Point: { - assert( - CairoSecp256k1Point.is(param), - `Validate: arg ${input.name} must be ${input.type} : a valid 512 bits secp256k1 point.` - ); - break; - } - case Literal.U96: { - assert( - param >= 0n && param <= 2n ** 96n - 1n, - `Validate: arg ${input.name} must be ${input.type} : a 96 bits number.` - ); - break; - } - - default: - break; - } -}; - -const validateBool = (parameter: any, input: AbiEntry) => { - assert( - isBoolean(parameter), - `Validate: arg ${input.name} of cairo type ${input.type} should be type (Boolean)` - ); -}; - -const validateStruct = (parameter: any, input: AbiEntry, structs: AbiStructs) => { - // c1v2 uint256 or u512 in struct - if (input.type === Uint.u256 || input.type === Uint.u512) { - validateUint(parameter, input); - return; - } - - if (isTypeEthAddress(input.type)) { - assert(!isObject(parameter), `EthAddress type is waiting a BigNumberish. Got "${parameter}"`); - const param = BigInt(parameter.toString(10)); - assert( - // from : https://github.com/starkware-libs/starknet-specs/blob/29bab650be6b1847c92d4461d4c33008b5e50b1a/api/starknet_api_openrpc.json#L1259 - param >= 0n && param <= 2n ** 160n - 1n, - `Validate: arg ${input.name} cairo typed ${input.type} should be in range [0, 2^160-1]` - ); - return; - } - - assert( - isObject(parameter), - `Validate: arg ${input.name} is cairo type struct (${input.type}), and should be defined as a js object (not array)` - ); - - // shallow struct validation, only first depth level - structs[input.type].members.forEach(({ name }) => { - assert( - Object.keys(parameter).includes(name), - `Validate: arg ${input.name} should have a property ${name}` - ); - }); -}; - -const validateEnum = (parameter: any, input: AbiEntry) => { - assert( - isObject(parameter), - `Validate: arg ${input.name} is cairo type Enum (${input.type}), and should be defined as a js object (not array)` - ); - - const methodsKeys = Object.getOwnPropertyNames(Object.getPrototypeOf(parameter)); - const keys = [...Object.getOwnPropertyNames(parameter), ...methodsKeys]; - if (isTypeOption(input.type) && keys.includes('isSome') && keys.includes('isNone')) { - return; // Option Enum - } - if (isTypeResult(input.type) && keys.includes('isOk') && keys.includes('isErr')) { - return; // Result Enum - } - if (keys.includes('variant') && keys.includes('activeVariant')) { - return; // Custom Enum - } - throw new Error( - `Validate Enum: argument ${input.name}, type ${input.type}, value received "${parameter}", is not an Enum.` - ); -}; - -const validateTuple = (parameter: any, input: AbiEntry) => { - // If parameter is a CairoTuple instance, skip validation (it's already validated) - if (parameter instanceof CairoTuple) { - return; - } - - assert(isObject(parameter), `Validate: arg ${input.name} should be a tuple (defined as object)`); - // todo: skip tuple structural validation for now -}; - -const validateArray = ( - parameterArray: Array | Record | CairoFixedArray | CairoArray | CairoTuple, - input: AbiEntry, - structs: AbiStructs, - enums: AbiEnums -) => { - // If parameterArray is a CairoFixedArray, CairoArray, or CairoTuple instance, skip validation (it's already validated) - if ( - parameterArray instanceof CairoFixedArray || - parameterArray instanceof CairoArray || - parameterArray instanceof CairoTuple - ) { - return; - } - - const isNormalArray = isTypeArray(input.type); - const baseType = isNormalArray - ? getArrayType(input.type) - : CairoFixedArray.getFixedArrayType(input.type); - - // Long text (special case when parameter is not an array but long text) - if (isNormalArray && isTypeFelt(baseType) && isLongText(parameterArray)) { - return; - } - let parameter: Array = []; - if (isNormalArray) { - assert(Array.isArray(parameterArray), `Validate: arg ${input.name} should be an Array`); - parameter = parameterArray; - } else { - // fixedArray - switch (true) { - case Array.isArray(parameterArray): - // the type cast is just for the documentation generation, TS narrowing works as expected - parameter = parameterArray as any; - break; - case typeof parameterArray === 'object': - parameter = Object.values(parameterArray); - break; - default: - throw new Error(`Validate: arg ${input.name} should be an Array or an object.`); - } - } - - switch (true) { - case isTypeFelt(baseType): - parameter.forEach((param: BigNumberish) => validateFelt(param, input)); - break; - case isTypeTuple(baseType): - parameter.forEach((it: any) => validateTuple(it, { name: input.name, type: baseType })); - break; - - case isTypeArray(baseType): - parameter.forEach((param: any) => - validateArray(param, { name: '', type: baseType }, structs, enums) - ); - break; - case isTypeStruct(baseType, structs): - parameter.forEach((it: any) => - validateStruct(it, { name: input.name, type: baseType }, structs) - ); - break; - case isTypeEnum(baseType, enums): - parameter.forEach((it: any) => validateEnum(it, { name: input.name, type: baseType })); - break; - case isTypeUint(baseType) || isTypeLiteral(baseType): - parameter.forEach((param: BigNumberish) => validateUint(param, { name: '', type: baseType })); - break; - case isTypeBool(baseType): - parameter.forEach((param: BigNumberish) => validateBool(param, input)); - break; - default: - throw new Error( - `Validate Unhandled: argument ${input.name}, type ${input.type}, value ${parameter}` - ); - } -}; - -const validateNonZero = (parameter: any, input: AbiEntry) => { - // Telegram : https://t.me/sncorestars/11902/45433 - // Author : Ori Ziv (08/apr/2024) - // "NonZero is only supported for purely numeric types (u*, i* and felt252) and EcPoint." - // - // As EcPoint do not includes trait Serde, it can't be seen in an ABI. - // u512 is not compatible. - // i* are not currently handled by Starknet.js (and core::zeroable::NonZero:: seems not to work in Cairo 2.6.3). - // so, are authorized here : u8, u16, u32, u64, u128, u256 and felt252. - - const baseType = getArrayType(input.type); - - assert( - (isTypeUint(baseType) && baseType !== CairoUint512.abiSelector) || isTypeFelt(baseType), - `Validate: ${input.name} type is not authorized for NonZero type.` - ); - switch (true) { - case isTypeFelt(baseType): - validateFelt(parameter, input); - assert( - BigInt(parameter.toString(10)) > 0, - 'Validate: value 0 is not authorized in NonZero felt252 type.' - ); - break; - case isTypeUint(baseType): - validateUint(parameter, { name: '', type: baseType }); - - switch (baseType) { - case Uint.u256: - assert( - new CairoUint256(parameter).toBigInt() > 0, - 'Validate: value 0 is not authorized in NonZero uint256 type.' - ); - break; - default: - assert( - toBigInt(parameter) > 0, - 'Validate: value 0 is not authorized in NonZero uint type.' - ); - } - break; - default: - throw new Error( - `Validate Unhandled: argument ${input.name}, type ${input.type}, value "${parameter}"` - ); - } -}; - -/** - * Validate cairo contract method arguments - * Flow: Determine type from abi and than validate against parameter - * - * @param {FunctionAbi} abiMethod - Abi method. - * @param {any[]} args - Arguments. - * @param {AbiStructs} structs - ABI structs. - * @param {AbiEnums} enums - ABI enums. - * @returns {void} - Return void if validation passes - * - * @example - * const functionAbi: FunctionAbi = { - * inputs: [{ name: 'test', type: 'felt' }], - * name: 'test', - * outputs: [{ name: 'test', type: 'felt' }], - * stateMutability: 'view', - * type: 'function', - * }; - * - * const abiStructs: AbiStructs = { - * abi_structs: { - * members: [ - * { - * name: 'test_name', - * type: 'test_type', - * offset: 1, - * }, - * ], - * size: 2, - * name: 'cairo_event_struct', - * type: 'struct', - * }, - * }; - * - * const abiEnums: AbiEnums = { - * abi_enums: { - * variants: [ - * { - * name: 'test_name', - * type: 'cairo_event_struct_variant', - * offset: 1, - * }, - * ], - * size: 2, - * name: 'test_cairo_event', - * type: 'enum', - * }, - * }; - * - * validateFields(functionAbi, [1n], abiStructs, abiEnums); // Returns void since validation passes - * validateFields(functionAbi, [{}], abiStructs, abiEnums); // Throw an error because paramters are not valid - */ -export default function validateFields( - abiMethod: FunctionAbi, - args: any[], - structs: AbiStructs, - enums: AbiEnums -): void { - abiMethod.inputs.reduce((acc, input) => { - const parameter = args[acc]; - - switch (true) { - case isLen(input.name): - return acc; - case isTypeFelt(input.type): - validateFelt(parameter, input); - break; - case CairoBytes31.isAbiType(input.type): - CairoBytes31.validate(parameter); - break; - case isTypeUint(input.type) || isTypeLiteral(input.type): - validateUint(parameter, input); - break; - case isTypeBool(input.type): - validateBool(parameter, input); - break; - case CairoByteArray.isAbiType(input.type): - CairoByteArray.validate(parameter); - break; - case CairoInt8.isAbiType(input.type): - CairoInt8.validate(parameter); - break; - case CairoInt16.isAbiType(input.type): - CairoInt16.validate(parameter); - break; - case CairoInt32.isAbiType(input.type): - CairoInt32.validate(parameter); - break; - case CairoInt64.isAbiType(input.type): - CairoInt64.validate(parameter); - break; - case CairoInt128.isAbiType(input.type): - CairoInt128.validate(parameter); - break; - case isTypeArray(input.type) || CairoFixedArray.isAbiType(input.type): - validateArray(parameter, input, structs, enums); - break; - case isTypeStruct(input.type, structs): - validateStruct(parameter, input, structs); - break; - case isTypeEnum(input.type, enums): - validateEnum(parameter, input); - break; - case isTypeTuple(input.type): - validateTuple(parameter, input); - break; - case isTypeNonZero(input.type): - validateNonZero(parameter, input); - break; - default: - throw new Error( - `Validate Unhandled: argument ${input.name}, type ${input.type}, value ${parameter}` - ); - } - - return acc + 1; - }, 0); -} diff --git a/src/utils/events/index.ts b/src/utils/events/index.ts index 18d72b9bf..5ec4cf72d 100644 --- a/src/utils/events/index.ts +++ b/src/utils/events/index.ts @@ -16,7 +16,6 @@ import { import assert from '../assert'; import { isCairo1Abi } from '../calldata/cairo'; import { AbiParserInterface } from '../calldata/parser/interface'; -import responseParser from '../calldata/responseParser'; import { starkCurve } from '../ec'; import { addHexPrefix, utf8ToArray } from '../encode'; import { isUndefined, isObject } from '../typed'; @@ -229,25 +228,19 @@ export function parseEvents( (abiEvent as LegacyEvent).data; abiEventKeys.forEach((key) => { - parsedEvent[abiEvent.name as string][key.name] = responseParser({ - responseIterator: keysIter, - output: key, - structs: abiStructs, - enums: abiEnums, - parser, - parsedResult: parsedEvent[abiEvent.name as string], - }); + parsedEvent[abiEvent.name as string][key.name] = parser.parseResponse( + keysIter, + key.name, + key.type + ); }); abiEventData.forEach((data) => { - parsedEvent[abiEvent.name as string][data.name] = responseParser({ - responseIterator: dataIter, - output: data, - structs: abiStructs, - enums: abiEnums, - parser, - parsedResult: parsedEvent[abiEvent.name as string], - }); + parsedEvent[abiEvent.name as string][data.name] = parser.parseResponse( + dataIter, + data.name, + data.type + ); }); if ('block_hash' in currentEvent) parsedEvent.block_hash = currentEvent.block_hash; if ('block_number' in currentEvent) parsedEvent.block_number = currentEvent.block_number; diff --git a/src/utils/helpers.ts b/src/utils/helpers.ts index 187493e65..5db8e0cd7 100644 --- a/src/utils/helpers.ts +++ b/src/utils/helpers.ts @@ -11,3 +11,34 @@ export function addCompiledFlag(compiled: T): T { }); return compiled; } + +/** + * Copy by value of a complex object (including Date, Array, functions or classes) + * @param {any} obj - object to copy by value + * @returns {any} copied object. + */ +export function deepCopyWithMethods(obj: any): any { + if (obj === null || typeof obj !== 'object') return obj; + if (obj instanceof Date) return new Date(obj); + if (obj instanceof Array) return obj.map((item) => deepCopyWithMethods(item)); + if (obj instanceof Function) return obj; + const cloned = Object.create(Object.getPrototypeOf(obj)); + // eslint-disable-next-line no-restricted-syntax + for (const key in obj as Object) { + // eslint-disable-next-line no-prototype-builtins + if (obj.hasOwnProperty(key)) { + cloned[key] = deepCopyWithMethods(obj[key]); + } + } + return cloned; +} + +/** + * Check if an instance is from an array of classes + * @param {any} toCheck - instance to check + * @param {any[]} classArray - array of class names to check against + * @returns {boolean} + */ +export function isInstanceOf(toCheck: any, classArray: any[]): boolean { + return classArray.some((cls) => toCheck instanceof cls); +} diff --git a/src/utils/num.ts b/src/utils/num.ts index f03c32d31..0801d9761 100644 --- a/src/utils/num.ts +++ b/src/utils/num.ts @@ -403,7 +403,7 @@ export function isBigNumberish(input: unknown): input is BigNumberish { * @returns The next value from the iterator. * @throws Error if the iterator is done. */ -export function getNext(iterator: Iterator): string { +export function getNext(iterator: Iterator): any { const it = iterator.next(); if (it.done) throw new Error('Unexpected end of response'); return it.value; diff --git a/src/utils/typedData.ts b/src/utils/typedData.ts index 43c51b656..60e7f4194 100644 --- a/src/utils/typedData.ts +++ b/src/utils/typedData.ts @@ -404,12 +404,7 @@ export function encodeValue( case 'string': { if (revision === Revision.ACTIVE) { const byteArray = new CairoByteArray(data as string); - const elements = [ - byteArray.data.length, - ...byteArray.data, - byteArray.pending_word, - byteArray.pending_word_len, - ]; + const elements = byteArray.toApiRequest(); return [type, revisionConfiguration[revision].hashMethod(elements as BigNumberish[])]; } // else fall through to default return [type, getHex(data as string)]; diff --git a/www/docs/guides/contracts/define_call_message.md b/www/docs/guides/contracts/define_call_message.md index 7924b90bd..6f330c01d 100644 --- a/www/docs/guides/contracts/define_call_message.md +++ b/www/docs/guides/contracts/define_call_message.md @@ -163,7 +163,7 @@ await myContract.my_function('http://addressOfMyERC721pictures/image1.jpg'); To force to send a shortString as a ByteArray with `CallData.compile()`: ```typescript -const myCalldata = Calldata.compile([byteArray.byteArrayFromString('Take care.')]); +const myCalldata = Calldata.compile([cairo.byteArray('Take care.')]); ``` If you want to split yourself your longString in 31 chars substrings: @@ -185,7 +185,7 @@ const longString: string[] = shortString ### tuple Starknet is waiting for a list of felts. -You can send it to Starknet.js methods: `cairo.tuple()`, object. +You can send it to Starknet.js methods: `cairo.tuple()`, object, array. ```typescript const myTpl = cairo.tuple('0x0a', 200);