From c37915420c31ce7f5625e08241d1cbed686135da Mon Sep 17 00:00:00 2001 From: David Meister Date: Mon, 26 Oct 2026 19:00:16 +0000 Subject: [PATCH] Signed-context row is not masked to a byte A row past 255 now reverts ContextGridOverflow like a signer index past 255, instead of wrapping onto another row. Co-Authored-By: Claude Opus 5.5 --- .../abis/RaindexV6SubParser.json | 2 +- src/generated/RaindexV6SubParserPointers.sol | 6 +- .../candidate/RaindexV6SubParser.sol | 8 +-- src/lib/LibRaindexSubParser.sol | 2 +- ...bParser.routingTokenDecimalsAndMasks.t.sol | 58 ++++--------------- .../parser/RaindexV6SubParser.signers.t.sol | 12 ++++ 6 files changed, 33 insertions(+), 55 deletions(-) diff --git a/crates/test_fixtures/abis/RaindexV6SubParser.json b/crates/test_fixtures/abis/RaindexV6SubParser.json index 0f484b5646..208d153fc6 100644 --- a/crates/test_fixtures/abis/RaindexV6SubParser.json +++ b/crates/test_fixtures/abis/RaindexV6SubParser.json @@ -242,7 +242,7 @@ } ], "bytecode": { - "object": "0x6080604052348015600e575f80fd5b506127168061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c3660046123d1565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061242d565b6100ce6100c9366004612453565b610bd4565b60405161009d939291906124fd565b6040517fe43208b51e17b3d887e8f3535d75526c0744eee6a200dac603462c6b3ca46511815260200161009d565b61011e610119366004612453565b610d18565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d50565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e66006600161256e565b6101f190600161256e565b6101fc90600161256e565b6001600160401b038111156102135761021361243f565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b506040805160018082528183019092529192505f9190816020015b6123c78152602001906001900390816102615790505090506116ec815f8151811061028e5761028e612581565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123c78152602001906001900390816102be57905050905061170a815f815181106102eb576102eb612581565b60200260200101906001600160401b031690816001600160401b0316815250506117198160018151811061032157610321612581565b60200260200101906001600160401b031690816001600160401b0316815250506117288160028151811061035757610357612581565b60200260200101906001600160401b031690816001600160401b0316815250506117388160038151811061038d5761038d612581565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c78152602001906001900390816103bd579050509050611748815f815181106103ea576103ea612581565b60200260200101906001600160401b031690816001600160401b0316815250506117578160018151811061042057610420612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c7815260200190600190039081610450579050509050611767815f8151811061047d5761047d612581565b60200260200101906001600160401b031690816001600160401b031681525050611776816001815181106104b3576104b3612581565b60200260200101906001600160401b031690816001600160401b031681525050611786816002815181106104e9576104e9612581565b60200260200101906001600160401b031690816001600160401b0316815250506117968160038151811061051f5761051f612581565b60200260200101906001600160401b031690816001600160401b0316815250506117a58160048151811061055557610555612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c78152602001906001900390816105855790505090506117b5815f815181106105b2576105b2612581565b60200260200101906001600160401b031690816001600160401b0316815250506117c4816001815181106105e8576105e8612581565b60200260200101906001600160401b031690816001600160401b0316815250506117d48160028151811061061e5761061e612581565b60200260200101906001600160401b031690816001600160401b0316815250506117e48160038151811061065457610654612581565b60200260200101906001600160401b031690816001600160401b0316815250506117f48160048151811061068a5761068a612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c78152602001906001900390816106b9579050509050611803815f815181106106e6576106e6612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c781526020019060019003908161071557905050905061181c815f8151811061074257610742612581565b60200260200101906001600160401b031690816001600160401b03168152505086885f8151811061077557610775612581565b6020026020010181905250858860018151811061079457610794612581565b602002602001018190525084886002815181106107b3576107b3612581565b602002602001018190525083886003815181106107d2576107d2612581565b602002602001018190525082886004815181106107f1576107f1612581565b6020908102919091010152818861080a6006600161256e565b8151811061081a5761081a612581565b602090810291909101015280886108336006600161256e565b61083e90600161256e565b8151811061084e5761084e612581565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c7815260200190600190039081610870579050509050611868815f8151811061089d5761089d612581565b60200260200101906001600160401b031690816001600160401b031681525050611877816001815181106108d3576108d3612581565b60200260200101906001600160401b031690816001600160401b0316815250506118868160028151811061090957610909612581565b60200260200101906001600160401b031690816001600160401b0316815250506118968160038151811061093f5761093f612581565b60200260200101906001600160401b031690816001600160401b0316815250506118a68160048151811061097557610975612581565b60200260200101906001600160401b031690816001600160401b0316815250506118b6816005815181106109ab576109ab612581565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106109df576109df612581565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c7815260200190600190039081610a025790505090506118c6815f81518110610a2f57610a2f612581565b60200260200101906001600160401b031690816001600160401b0316815250506118d581600181518110610a6557610a65612581565b60200260200101906001600160401b031690816001600160401b0316815250506118e481600281518110610a9b57610a9b612581565b60200260200101906001600160401b031690816001600160401b0316815250506118f481600381518110610ad157610ad1612581565b60200260200101906001600160401b031690816001600160401b03168152505061190481600481518110610b0757610b07612581565b60200260200101906001600160401b031690816001600160401b03168152505061191481600581518110610b3d57610b3d612581565b60200260200101906001600160401b031690816001600160401b03168152505061192481600681518110610b7357610b73612581565b60200260200101906001600160401b031690816001600160401b031681525050808a600681518110610ba757610ba7612581565b602090810291909101015289610bc4610bbf82611934565b611949565b9b50505050505050505050505090565b5f6060805f805f610bf487610be76119d8565b610bef6119f8565b611a18565b9250925092505f610c0a82610220015160200190565b90505f8261022001515182610c1f919061256e565b90505f610c3d83836f07fffffe0000000003ff200000000000611b09565b80925081945050505f80610c5686610240015184611ba5565b915091508115610ceb575f610c6b8783611c7c565b90506123c75f610c79611cab565b90505f60028251610c8a91906125a9565b9050808510610cbb576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610cd48c8c8686565b9e509e509e50505050505050505050505050610d11565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d40866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d5f6006600161256e565b610d6a90600161256e565b610d7590600161256e565b6001600160401b03811115610d8c57610d8c61243f565b604051908082528060200260200182016040528015610dbf57816020015b6060815260200190600190039081610daa5790505b506040805160018082528183019092529192505f9190816020015b6123c7815260200190600190039081610dda579050509050611ccb815f81518110610e0757610e07612581565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123c7815260200190600190039081610e37579050509050611ccb815f81518110610e6457610e64612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600181518110610e9a57610e9a612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600281518110610ed057610ed0612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600381518110610f0657610f06612581565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c7815260200190600190039081610f36579050509050611ccb815f81518110610f6357610f63612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600181518110610f9957610f99612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c7815260200190600190039081610fc9579050509050611ccb815f81518110610ff657610ff6612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160018151811061102c5761102c612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061106257611062612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160038151811061109857611098612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816004815181106110ce576110ce612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c78152602001906001900390816110fe579050509050611ccb815f8151811061112b5761112b612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160018151811061116157611161612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061119757611197612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816003815181106111cd576111cd612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160048151811061120357611203612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c7815260200190600190039081611232579050509050611cf4815f8151811061125f5761125f612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c781526020019060019003908161128e579050509050611d90815f815181106112bb576112bb612581565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112ee576112ee612581565b6020026020010181905250858860018151811061130d5761130d612581565b6020026020010181905250848860028151811061132c5761132c612581565b6020026020010181905250838860038151811061134b5761134b612581565b6020026020010181905250828860048151811061136a5761136a612581565b602090810291909101015281886113836006600161256e565b8151811061139357611393612581565b602090810291909101015280886113ac6006600161256e565b6113b790600161256e565b815181106113c7576113c7612581565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c78152602001906001900390816113e9579050509050611ccb815f8151811061141657611416612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160018151811061144c5761144c612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061148257611482612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816003815181106114b8576114b8612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816004815181106114ee576114ee612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160058151811061152457611524612581565b60200260200101906001600160401b031690816001600160401b031681525050808960058151811061155857611558612581565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c781526020019060019003908161157b579050509050611ccb815f815181106115a8576115a8612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816001815181106115de576115de612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061161457611614612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160038151811061164a5761164a612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160048151811061168057611680612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816005815181106116b6576116b6612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600681518110610b7357610b73612581565b5f6060806116fb5f6001611e48565b92509250925093509350939050565b5f6060806116fb60015f611e48565b5f6060806116fb600180611e48565b5f6060806116fb60016002611e48565b5f6060806116fb60016003611e48565b5f6060806116fb60025f611e48565b5f6060806116fb60026001611e48565b5f6060806116fb60035f611e48565b5f6060806116fb60036001611e48565b5f6060806116fb60036002611e48565b5f6060806116fb600380611e48565b5f6060806116fb60036004611e48565b5f6060806116fb60045f611e48565b5f6060806116fb60046001611e48565b5f6060806116fb60046002611e48565b5f6060806116fb60046003611e48565b5f6060806116fb600480611e48565b5f6060806116fb6118166006600161256e565b85611e48565b5f60608060ff80851690600886901c166118578261183c6006600161256e565b61184790600161256e565b611851919061256e565b82611e48565b945094509450505093509350939050565b5f6060806116fb600580611e48565b5f6060806116fb60055f611e48565b5f6060806116fb60056001611e48565b5f6060806116fb60056002611e48565b5f6060806116fb60056003611e48565b5f6060806116fb60056004611e48565b5f6060806116fb600680611e48565b5f6060806116fb60065f611e48565b5f6060806116fb60066001611e48565b5f6060806116fb60066002611e48565b5f6060806116fb60066003611e48565b5f6060806116fb60066004611e48565b5f6060806116fb60066005611e48565b6060815f61194182611eca565b949350505050565b60605f82516002026001600160401b038111156119685761196861243f565b6040519080825280601f01601f191660200182016040528015611992576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156119cc578051835186169085161781526020909201916002016119aa565b50939695505050505050565b60606040518060e0016040528060a2815260200161267460a29139905090565b606060405180606001604052806040815260200161263460409139905090565b5f80611aa76040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611af387878760405180602001604052805f815250611f38565b915080826101e001819052505093509350939050565b5f808060018187870360208111611b205780611b23565b60205b915050875192505b8519600184841a1b16158183101615611b4957600182019150611b2b565b9681019660208290036008810293841c90931b92611b945760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610cb29160040161242d565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611c6a5760018301516021909301805190935f90819060ff168180611bef838e6120e9565b915091508186165f03611c11575f809b509b5050505050505050505050611c75565b5f87611c21600185038916612114565b016004028b015195505062ffffff9081169350841683039150611c559050575060019750601c1a9550611c75945050505050565b611c5e83612114565b84019350505050611bc6565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611ca29083565b95945050505050565b60606040518060600160405280604081526020016125f460409139905090565b5f81515f14611ced576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611d51575060208101516001600160e01b038116601b0b60e082901d5f611d228383836121cd565b905061ffff811115611d4757604051631e4e01d760e21b815260040160405180910390fd5b9250611d8b915050565b81515f03611d7257604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611e2557602082015160408301516001600160e01b038216601b0b60e083901d5f611dc28383836121cd565b6001600160e01b038516601b0b935060e085901d925090505f611de68484836121cd565b905060ff821180611df7575060ff81115b15611e1557604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611d8b9350505050565b600282511015611d7257604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611e5b575060ff84115b15611e8357604051639b0f326160e01b81526004810186905260248101859052604401610cb2565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611ed68361220f565b90505f611ee48260206125c8565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611f2c57602083515102806020855101835e6020939093019201611f09565b50919695505050505050565b611fc56040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b0381111561204a5761204a61243f565b604051908082528060200260200182016040528015612073578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611ca2565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611c75575060019250929050565b5f5f1982036121265750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6121db868686612258565b91509150806122065760405162bc8ecf60e31b81526004810187905260248101869052604401610cb2565b50949350505050565b5f60208201602083510281015b8082101561225157815151928301928084101561224557634e487b715f5260116020526024601cfd5b5060208201915061221c565b5050919050565b5f805f85121561228557604051634a7d166b60e01b81526004810186905260248101859052604401610cb2565b845f0361229757505f90506001611b9d565b8460ff84168501858112156122d25760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610cb2565b5f805f83121561231e57604c198312156122f5575f809550955050505050611b9d565b825f03600a0a915081848161230c5761230c612595565b0495505084029091149150611b9d9050565b5f8313156123b757604d83131561235b5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb2565b82600a0a9150815f198161237157612371612595565b048411156123a55760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb2565b5091909102925060019150611b9d9050565b8360019550955050505050611b9d565b6123cf6125df565b565b5f602082840312156123e1575f80fd5b81356001600160e01b0319811681146123f8575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6123f860208301846123ff565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612463575f80fd5b81356001600160401b0380821115612479575f80fd5b818401915084601f83011261248c575f80fd5b81358181111561249e5761249e61243f565b604051601f8201601f19908116603f011681019083821181831017156124c6576124c661243f565b816040528281528760208487010111156124de575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261251960608401866123ff565b8381036040850152845180825260208087019201905f5b8181101561254c57835183529284019291840191600101612530565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d161255a565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f826125c357634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d161255a565b634e487b7160e01b5f52605160045260245ffdfe16ec170a17191728173817481757176717761786179617a517b517c417d417e417f4186818771886189618a618b618c618d518e418f41904191419241803181c1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1cf41d900101180010800082000100010480300038412a001810000010020004200004002038028ff54904cc66c61df3dcab0616592209895f0b14fec9301902e0920c5bfe561b21609200e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2103d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a51f792bdb01e0f14716565589", + "object": "0x6080604052348015600e575f80fd5b506127138061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c3660046123ce565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061242a565b6100ce6100c9366004612450565b610bd4565b60405161009d939291906124fa565b6040517fe43208b51e17b3d887e8f3535d75526c0744eee6a200dac603462c6b3ca46511815260200161009d565b61011e610119366004612450565b610d18565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d50565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e66006600161256b565b6101f190600161256b565b6101fc90600161256b565b6001600160401b038111156102135761021361243c565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b506040805160018082528183019092529192505f9190816020015b6123c48152602001906001900390816102615790505090506116ec815f8151811061028e5761028e61257e565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123c48152602001906001900390816102be57905050905061170a815f815181106102eb576102eb61257e565b60200260200101906001600160401b031690816001600160401b031681525050611719816001815181106103215761032161257e565b60200260200101906001600160401b031690816001600160401b031681525050611728816002815181106103575761035761257e565b60200260200101906001600160401b031690816001600160401b0316815250506117388160038151811061038d5761038d61257e565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c48152602001906001900390816103bd579050509050611748815f815181106103ea576103ea61257e565b60200260200101906001600160401b031690816001600160401b031681525050611757816001815181106104205761042061257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c4815260200190600190039081610450579050509050611767815f8151811061047d5761047d61257e565b60200260200101906001600160401b031690816001600160401b031681525050611776816001815181106104b3576104b361257e565b60200260200101906001600160401b031690816001600160401b031681525050611786816002815181106104e9576104e961257e565b60200260200101906001600160401b031690816001600160401b0316815250506117968160038151811061051f5761051f61257e565b60200260200101906001600160401b031690816001600160401b0316815250506117a5816004815181106105555761055561257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c48152602001906001900390816105855790505090506117b5815f815181106105b2576105b261257e565b60200260200101906001600160401b031690816001600160401b0316815250506117c4816001815181106105e8576105e861257e565b60200260200101906001600160401b031690816001600160401b0316815250506117d48160028151811061061e5761061e61257e565b60200260200101906001600160401b031690816001600160401b0316815250506117e4816003815181106106545761065461257e565b60200260200101906001600160401b031690816001600160401b0316815250506117f48160048151811061068a5761068a61257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c48152602001906001900390816106b9579050509050611803815f815181106106e6576106e661257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c481526020019060019003908161071557905050905061181c815f815181106107425761074261257e565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106107755761077561257e565b602002602001018190525085886001815181106107945761079461257e565b602002602001018190525084886002815181106107b3576107b361257e565b602002602001018190525083886003815181106107d2576107d261257e565b602002602001018190525082886004815181106107f1576107f161257e565b6020908102919091010152818861080a6006600161256b565b8151811061081a5761081a61257e565b602090810291909101015280886108336006600161256b565b61083e90600161256b565b8151811061084e5761084e61257e565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c4815260200190600190039081610870579050509050611865815f8151811061089d5761089d61257e565b60200260200101906001600160401b031690816001600160401b031681525050611874816001815181106108d3576108d361257e565b60200260200101906001600160401b031690816001600160401b031681525050611883816002815181106109095761090961257e565b60200260200101906001600160401b031690816001600160401b0316815250506118938160038151811061093f5761093f61257e565b60200260200101906001600160401b031690816001600160401b0316815250506118a3816004815181106109755761097561257e565b60200260200101906001600160401b031690816001600160401b0316815250506118b3816005815181106109ab576109ab61257e565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106109df576109df61257e565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c4815260200190600190039081610a025790505090506118c3815f81518110610a2f57610a2f61257e565b60200260200101906001600160401b031690816001600160401b0316815250506118d281600181518110610a6557610a6561257e565b60200260200101906001600160401b031690816001600160401b0316815250506118e181600281518110610a9b57610a9b61257e565b60200260200101906001600160401b031690816001600160401b0316815250506118f181600381518110610ad157610ad161257e565b60200260200101906001600160401b031690816001600160401b03168152505061190181600481518110610b0757610b0761257e565b60200260200101906001600160401b031690816001600160401b03168152505061191181600581518110610b3d57610b3d61257e565b60200260200101906001600160401b031690816001600160401b03168152505061192181600681518110610b7357610b7361257e565b60200260200101906001600160401b031690816001600160401b031681525050808a600681518110610ba757610ba761257e565b602090810291909101015289610bc4610bbf82611931565b611946565b9b50505050505050505050505090565b5f6060805f805f610bf487610be76119d5565b610bef6119f5565b611a15565b9250925092505f610c0a82610220015160200190565b90505f8261022001515182610c1f919061256b565b90505f610c3d83836f07fffffe0000000003ff200000000000611b06565b80925081945050505f80610c5686610240015184611ba2565b915091508115610ceb575f610c6b8783611c79565b90506123c45f610c79611ca8565b90505f60028251610c8a91906125a6565b9050808510610cbb576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610cd48c8c8686565b9e509e509e50505050505050505050505050610d11565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d40866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d5f6006600161256b565b610d6a90600161256b565b610d7590600161256b565b6001600160401b03811115610d8c57610d8c61243c565b604051908082528060200260200182016040528015610dbf57816020015b6060815260200190600190039081610daa5790505b506040805160018082528183019092529192505f9190816020015b6123c4815260200190600190039081610dda579050509050611cc8815f81518110610e0757610e0761257e565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123c4815260200190600190039081610e37579050509050611cc8815f81518110610e6457610e6461257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600181518110610e9a57610e9a61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600281518110610ed057610ed061257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600381518110610f0657610f0661257e565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c4815260200190600190039081610f36579050509050611cc8815f81518110610f6357610f6361257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600181518110610f9957610f9961257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c4815260200190600190039081610fc9579050509050611cc8815f81518110610ff657610ff661257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc88160018151811061102c5761102c61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106110625761106261257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816003815181106110985761109861257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106110ce576110ce61257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c48152602001906001900390816110fe579050509050611cc8815f8151811061112b5761112b61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816001815181106111615761116161257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106111975761119761257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816003815181106111cd576111cd61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106112035761120361257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c4815260200190600190039081611232579050509050611cf1815f8151811061125f5761125f61257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c481526020019060019003908161128e579050509050611d8d815f815181106112bb576112bb61257e565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112ee576112ee61257e565b6020026020010181905250858860018151811061130d5761130d61257e565b6020026020010181905250848860028151811061132c5761132c61257e565b6020026020010181905250838860038151811061134b5761134b61257e565b6020026020010181905250828860048151811061136a5761136a61257e565b602090810291909101015281886113836006600161256b565b815181106113935761139361257e565b602090810291909101015280886113ac6006600161256b565b6113b790600161256b565b815181106113c7576113c761257e565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c48152602001906001900390816113e9579050509050611cc8815f815181106114165761141661257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc88160018151811061144c5761144c61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106114825761148261257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816003815181106114b8576114b861257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106114ee576114ee61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816005815181106115245761152461257e565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106115585761155861257e565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c481526020019060019003908161157b579050509050611cc8815f815181106115a8576115a861257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816001815181106115de576115de61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106116145761161461257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc88160038151811061164a5761164a61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106116805761168061257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816005815181106116b6576116b661257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600681518110610b7357610b7361257e565b5f6060806116fb5f6001611e45565b92509250925093509350939050565b5f6060806116fb60015f611e45565b5f6060806116fb600180611e45565b5f6060806116fb60016002611e45565b5f6060806116fb60016003611e45565b5f6060806116fb60025f611e45565b5f6060806116fb60026001611e45565b5f6060806116fb60035f611e45565b5f6060806116fb60036001611e45565b5f6060806116fb60036002611e45565b5f6060806116fb600380611e45565b5f6060806116fb60036004611e45565b5f6060806116fb60045f611e45565b5f6060806116fb60046001611e45565b5f6060806116fb60046002611e45565b5f6060806116fb60046003611e45565b5f6060806116fb600480611e45565b5f6060806116fb6118166006600161256b565b85611e45565b5f60608060ff8416600885901c611854826118396006600161256b565b61184490600161256b565b61184e919061256b565b82611e45565b945094509450505093509350939050565b5f6060806116fb600580611e45565b5f6060806116fb60055f611e45565b5f6060806116fb60056001611e45565b5f6060806116fb60056002611e45565b5f6060806116fb60056003611e45565b5f6060806116fb60056004611e45565b5f6060806116fb600680611e45565b5f6060806116fb60065f611e45565b5f6060806116fb60066001611e45565b5f6060806116fb60066002611e45565b5f6060806116fb60066003611e45565b5f6060806116fb60066004611e45565b5f6060806116fb60066005611e45565b6060815f61193e82611ec7565b949350505050565b60605f82516002026001600160401b038111156119655761196561243c565b6040519080825280601f01601f19166020018201604052801561198f576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156119c9578051835186169085161781526020909201916002016119a7565b50939695505050505050565b60606040518060e0016040528060a2815260200161267160a29139905090565b606060405180606001604052806040815260200161263160409139905090565b5f80611aa46040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611af087878760405180602001604052805f815250611f35565b915080826101e001819052505093509350939050565b5f808060018187870360208111611b1d5780611b20565b60205b915050875192505b8519600184841a1b16158183101615611b4657600182019150611b28565b9681019660208290036008810293841c90931b92611b915760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610cb29160040161242a565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611c675760018301516021909301805190935f90819060ff168180611bec838e6120e6565b915091508186165f03611c0e575f809b509b5050505050505050505050611c72565b5f87611c1e600185038916612111565b016004028b015195505062ffffff9081169350841683039150611c529050575060019750601c1a9550611c72945050505050565b611c5b83612111565b84019350505050611bc3565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611c9f9083565b95945050505050565b60606040518060600160405280604081526020016125f160409139905090565b5f81515f14611cea576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611d4e575060208101516001600160e01b038116601b0b60e082901d5f611d1f8383836121ca565b905061ffff811115611d4457604051631e4e01d760e21b815260040160405180910390fd5b9250611d88915050565b81515f03611d6f57604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611e2257602082015160408301516001600160e01b038216601b0b60e083901d5f611dbf8383836121ca565b6001600160e01b038516601b0b935060e085901d925090505f611de38484836121ca565b905060ff821180611df4575060ff81115b15611e1257604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611d889350505050565b600282511015611d6f57604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611e58575060ff84115b15611e8057604051639b0f326160e01b81526004810186905260248101859052604401610cb2565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611ed38361220c565b90505f611ee18260206125c5565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611f2957602083515102806020855101835e6020939093019201611f06565b50919695505050505050565b611fc26040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b038111156120475761204761243c565b604051908082528060200260200182016040528015612070578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611c9f565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611c72575060019250929050565b5f5f1982036121235750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6121d8868686612255565b91509150806122035760405162bc8ecf60e31b81526004810187905260248101869052604401610cb2565b50949350505050565b5f60208201602083510281015b8082101561224e57815151928301928084101561224257634e487b715f5260116020526024601cfd5b50602082019150612219565b5050919050565b5f805f85121561228257604051634a7d166b60e01b81526004810186905260248101859052604401610cb2565b845f0361229457505f90506001611b9a565b8460ff84168501858112156122cf5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610cb2565b5f805f83121561231b57604c198312156122f2575f809550955050505050611b9a565b825f03600a0a915081848161230957612309612592565b0495505084029091149150611b9a9050565b5f8313156123b457604d8313156123585760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb2565b82600a0a9150815f198161236e5761236e612592565b048411156123a25760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb2565b5091909102925060019150611b9a9050565b8360019550955050505050611b9a565b6123cc6125dc565b565b5f602082840312156123de575f80fd5b81356001600160e01b0319811681146123f5575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6123f560208301846123fc565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612460575f80fd5b81356001600160401b0380821115612476575f80fd5b818401915084601f830112612489575f80fd5b81358181111561249b5761249b61243c565b604051601f8201601f19908116603f011681019083821181831017156124c3576124c361243c565b816040528281528760208487010111156124db575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261251660608401866123fc565b8381036040850152845180825260208087019201905f5b818110156125495783518352928401929184019160010161252d565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d1612557565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f826125c057634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d1612557565b634e487b7160e01b5f52605160045260245ffdfe16ec170a17191728173817481757176717761786179617a517b517c417d417e417f4186518741883189318a318b318c318d218e118f11901191119211803181c1cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cf11d8d0101180010800082000100010480300038412a001810000010020004200004002038028ff54904cc66c61df3dcab0616592209895f0b14fec9301902e0920c5bfe561b21609200e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2103d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a51f792bdb01e0f14716565589", "linkReferences": {} } } diff --git a/src/generated/RaindexV6SubParserPointers.sol b/src/generated/RaindexV6SubParserPointers.sol index a7ae36c38e..b11d772ce6 100644 --- a/src/generated/RaindexV6SubParserPointers.sol +++ b/src/generated/RaindexV6SubParserPointers.sol @@ -5,7 +5,7 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x3b94903e6cc53e7104e64c28d45c322aa5cf6b9fd9048812e74b8d26ab72cdd4); +bytes32 constant BYTECODE_HASH = bytes32(0xfaadc632ff51c921c614024250a4da3c52780d22d85a928ec8e2f32b21a84ebd); /// @dev The hash of the meta that describes the contract. bytes32 constant DESCRIBED_BY_META_HASH = bytes32(0xe43208b51e17b3d887e8f3535d75526c0744eee6a200dac603462c6b3ca46511); @@ -39,13 +39,13 @@ uint8 constant PARSE_META_BUILD_DEPTH = 1; /// to things that happen entirely on the interpreter such as well known /// constants and references to the context grid. bytes constant SUB_PARSER_WORD_PARSERS = - hex"16ec170a17191728173817481757176717761786179617a517b517c417d417e417f4186818771886189618a618b618c618d518e418f41904191419241803181c"; + hex"16ec170a17191728173817481757176717761786179617a517b517c417d417e417f4186518741883189318a318b318c318d218e118f11901191119211803181c"; /// @dev Every two bytes is a function pointer for an operand handler. /// These positional indexes all map to the same indexes looked up in the parse /// meta. bytes constant OPERAND_HANDLER_FUNCTION_POINTERS = - hex"1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1cf41d90"; + hex"1cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cf11d8d"; /// @dev Every two bytes is a function pointer for a literal parser. /// Literal dispatches are determined by the first byte(s) of the literal diff --git a/src/generated/candidate/RaindexV6SubParser.sol b/src/generated/candidate/RaindexV6SubParser.sol index 7aeecb0ef6..9833ecada1 100644 --- a/src/generated/candidate/RaindexV6SubParser.sol +++ b/src/generated/candidate/RaindexV6SubParser.sol @@ -5,19 +5,19 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x3b94903e6cc53e7104e64c28d45c322aa5cf6b9fd9048812e74b8d26ab72cdd4); +bytes32 constant BYTECODE_HASH = bytes32(0xfaadc632ff51c921c614024250a4da3c52780d22d85a928ec8e2f32b21a84ebd); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x5c33F358ed9eb9A1cdDE610Eb20EA5a7AF567361); +address constant DEPLOYED_ADDRESS = address(0xf6bbCa1D4fc3EBCE6992B2af8769B3ca1B1A53fd); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b506127168061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c3660046123d1565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061242d565b6100ce6100c9366004612453565b610bd4565b60405161009d939291906124fd565b6040517fe43208b51e17b3d887e8f3535d75526c0744eee6a200dac603462c6b3ca46511815260200161009d565b61011e610119366004612453565b610d18565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d50565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e66006600161256e565b6101f190600161256e565b6101fc90600161256e565b6001600160401b038111156102135761021361243f565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b506040805160018082528183019092529192505f9190816020015b6123c78152602001906001900390816102615790505090506116ec815f8151811061028e5761028e612581565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123c78152602001906001900390816102be57905050905061170a815f815181106102eb576102eb612581565b60200260200101906001600160401b031690816001600160401b0316815250506117198160018151811061032157610321612581565b60200260200101906001600160401b031690816001600160401b0316815250506117288160028151811061035757610357612581565b60200260200101906001600160401b031690816001600160401b0316815250506117388160038151811061038d5761038d612581565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c78152602001906001900390816103bd579050509050611748815f815181106103ea576103ea612581565b60200260200101906001600160401b031690816001600160401b0316815250506117578160018151811061042057610420612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c7815260200190600190039081610450579050509050611767815f8151811061047d5761047d612581565b60200260200101906001600160401b031690816001600160401b031681525050611776816001815181106104b3576104b3612581565b60200260200101906001600160401b031690816001600160401b031681525050611786816002815181106104e9576104e9612581565b60200260200101906001600160401b031690816001600160401b0316815250506117968160038151811061051f5761051f612581565b60200260200101906001600160401b031690816001600160401b0316815250506117a58160048151811061055557610555612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c78152602001906001900390816105855790505090506117b5815f815181106105b2576105b2612581565b60200260200101906001600160401b031690816001600160401b0316815250506117c4816001815181106105e8576105e8612581565b60200260200101906001600160401b031690816001600160401b0316815250506117d48160028151811061061e5761061e612581565b60200260200101906001600160401b031690816001600160401b0316815250506117e48160038151811061065457610654612581565b60200260200101906001600160401b031690816001600160401b0316815250506117f48160048151811061068a5761068a612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c78152602001906001900390816106b9579050509050611803815f815181106106e6576106e6612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c781526020019060019003908161071557905050905061181c815f8151811061074257610742612581565b60200260200101906001600160401b031690816001600160401b03168152505086885f8151811061077557610775612581565b6020026020010181905250858860018151811061079457610794612581565b602002602001018190525084886002815181106107b3576107b3612581565b602002602001018190525083886003815181106107d2576107d2612581565b602002602001018190525082886004815181106107f1576107f1612581565b6020908102919091010152818861080a6006600161256e565b8151811061081a5761081a612581565b602090810291909101015280886108336006600161256e565b61083e90600161256e565b8151811061084e5761084e612581565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c7815260200190600190039081610870579050509050611868815f8151811061089d5761089d612581565b60200260200101906001600160401b031690816001600160401b031681525050611877816001815181106108d3576108d3612581565b60200260200101906001600160401b031690816001600160401b0316815250506118868160028151811061090957610909612581565b60200260200101906001600160401b031690816001600160401b0316815250506118968160038151811061093f5761093f612581565b60200260200101906001600160401b031690816001600160401b0316815250506118a68160048151811061097557610975612581565b60200260200101906001600160401b031690816001600160401b0316815250506118b6816005815181106109ab576109ab612581565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106109df576109df612581565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c7815260200190600190039081610a025790505090506118c6815f81518110610a2f57610a2f612581565b60200260200101906001600160401b031690816001600160401b0316815250506118d581600181518110610a6557610a65612581565b60200260200101906001600160401b031690816001600160401b0316815250506118e481600281518110610a9b57610a9b612581565b60200260200101906001600160401b031690816001600160401b0316815250506118f481600381518110610ad157610ad1612581565b60200260200101906001600160401b031690816001600160401b03168152505061190481600481518110610b0757610b07612581565b60200260200101906001600160401b031690816001600160401b03168152505061191481600581518110610b3d57610b3d612581565b60200260200101906001600160401b031690816001600160401b03168152505061192481600681518110610b7357610b73612581565b60200260200101906001600160401b031690816001600160401b031681525050808a600681518110610ba757610ba7612581565b602090810291909101015289610bc4610bbf82611934565b611949565b9b50505050505050505050505090565b5f6060805f805f610bf487610be76119d8565b610bef6119f8565b611a18565b9250925092505f610c0a82610220015160200190565b90505f8261022001515182610c1f919061256e565b90505f610c3d83836f07fffffe0000000003ff200000000000611b09565b80925081945050505f80610c5686610240015184611ba5565b915091508115610ceb575f610c6b8783611c7c565b90506123c75f610c79611cab565b90505f60028251610c8a91906125a9565b9050808510610cbb576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610cd48c8c8686565b9e509e509e50505050505050505050505050610d11565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d40866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d5f6006600161256e565b610d6a90600161256e565b610d7590600161256e565b6001600160401b03811115610d8c57610d8c61243f565b604051908082528060200260200182016040528015610dbf57816020015b6060815260200190600190039081610daa5790505b506040805160018082528183019092529192505f9190816020015b6123c7815260200190600190039081610dda579050509050611ccb815f81518110610e0757610e07612581565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123c7815260200190600190039081610e37579050509050611ccb815f81518110610e6457610e64612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600181518110610e9a57610e9a612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600281518110610ed057610ed0612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600381518110610f0657610f06612581565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c7815260200190600190039081610f36579050509050611ccb815f81518110610f6357610f63612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600181518110610f9957610f99612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c7815260200190600190039081610fc9579050509050611ccb815f81518110610ff657610ff6612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160018151811061102c5761102c612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061106257611062612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160038151811061109857611098612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816004815181106110ce576110ce612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c78152602001906001900390816110fe579050509050611ccb815f8151811061112b5761112b612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160018151811061116157611161612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061119757611197612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816003815181106111cd576111cd612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160048151811061120357611203612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c7815260200190600190039081611232579050509050611cf4815f8151811061125f5761125f612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c781526020019060019003908161128e579050509050611d90815f815181106112bb576112bb612581565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112ee576112ee612581565b6020026020010181905250858860018151811061130d5761130d612581565b6020026020010181905250848860028151811061132c5761132c612581565b6020026020010181905250838860038151811061134b5761134b612581565b6020026020010181905250828860048151811061136a5761136a612581565b602090810291909101015281886113836006600161256e565b8151811061139357611393612581565b602090810291909101015280886113ac6006600161256e565b6113b790600161256e565b815181106113c7576113c7612581565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c78152602001906001900390816113e9579050509050611ccb815f8151811061141657611416612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160018151811061144c5761144c612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061148257611482612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816003815181106114b8576114b8612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816004815181106114ee576114ee612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160058151811061152457611524612581565b60200260200101906001600160401b031690816001600160401b031681525050808960058151811061155857611558612581565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c781526020019060019003908161157b579050509050611ccb815f815181106115a8576115a8612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816001815181106115de576115de612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061161457611614612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160038151811061164a5761164a612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160048151811061168057611680612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816005815181106116b6576116b6612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600681518110610b7357610b73612581565b5f6060806116fb5f6001611e48565b92509250925093509350939050565b5f6060806116fb60015f611e48565b5f6060806116fb600180611e48565b5f6060806116fb60016002611e48565b5f6060806116fb60016003611e48565b5f6060806116fb60025f611e48565b5f6060806116fb60026001611e48565b5f6060806116fb60035f611e48565b5f6060806116fb60036001611e48565b5f6060806116fb60036002611e48565b5f6060806116fb600380611e48565b5f6060806116fb60036004611e48565b5f6060806116fb60045f611e48565b5f6060806116fb60046001611e48565b5f6060806116fb60046002611e48565b5f6060806116fb60046003611e48565b5f6060806116fb600480611e48565b5f6060806116fb6118166006600161256e565b85611e48565b5f60608060ff80851690600886901c166118578261183c6006600161256e565b61184790600161256e565b611851919061256e565b82611e48565b945094509450505093509350939050565b5f6060806116fb600580611e48565b5f6060806116fb60055f611e48565b5f6060806116fb60056001611e48565b5f6060806116fb60056002611e48565b5f6060806116fb60056003611e48565b5f6060806116fb60056004611e48565b5f6060806116fb600680611e48565b5f6060806116fb60065f611e48565b5f6060806116fb60066001611e48565b5f6060806116fb60066002611e48565b5f6060806116fb60066003611e48565b5f6060806116fb60066004611e48565b5f6060806116fb60066005611e48565b6060815f61194182611eca565b949350505050565b60605f82516002026001600160401b038111156119685761196861243f565b6040519080825280601f01601f191660200182016040528015611992576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156119cc578051835186169085161781526020909201916002016119aa565b50939695505050505050565b60606040518060e0016040528060a2815260200161267460a29139905090565b606060405180606001604052806040815260200161263460409139905090565b5f80611aa76040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611af387878760405180602001604052805f815250611f38565b915080826101e001819052505093509350939050565b5f808060018187870360208111611b205780611b23565b60205b915050875192505b8519600184841a1b16158183101615611b4957600182019150611b2b565b9681019660208290036008810293841c90931b92611b945760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610cb29160040161242d565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611c6a5760018301516021909301805190935f90819060ff168180611bef838e6120e9565b915091508186165f03611c11575f809b509b5050505050505050505050611c75565b5f87611c21600185038916612114565b016004028b015195505062ffffff9081169350841683039150611c559050575060019750601c1a9550611c75945050505050565b611c5e83612114565b84019350505050611bc6565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611ca29083565b95945050505050565b60606040518060600160405280604081526020016125f460409139905090565b5f81515f14611ced576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611d51575060208101516001600160e01b038116601b0b60e082901d5f611d228383836121cd565b905061ffff811115611d4757604051631e4e01d760e21b815260040160405180910390fd5b9250611d8b915050565b81515f03611d7257604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611e2557602082015160408301516001600160e01b038216601b0b60e083901d5f611dc28383836121cd565b6001600160e01b038516601b0b935060e085901d925090505f611de68484836121cd565b905060ff821180611df7575060ff81115b15611e1557604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611d8b9350505050565b600282511015611d7257604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611e5b575060ff84115b15611e8357604051639b0f326160e01b81526004810186905260248101859052604401610cb2565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611ed68361220f565b90505f611ee48260206125c8565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611f2c57602083515102806020855101835e6020939093019201611f09565b50919695505050505050565b611fc56040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b0381111561204a5761204a61243f565b604051908082528060200260200182016040528015612073578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611ca2565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611c75575060019250929050565b5f5f1982036121265750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6121db868686612258565b91509150806122065760405162bc8ecf60e31b81526004810187905260248101869052604401610cb2565b50949350505050565b5f60208201602083510281015b8082101561225157815151928301928084101561224557634e487b715f5260116020526024601cfd5b5060208201915061221c565b5050919050565b5f805f85121561228557604051634a7d166b60e01b81526004810186905260248101859052604401610cb2565b845f0361229757505f90506001611b9d565b8460ff84168501858112156122d25760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610cb2565b5f805f83121561231e57604c198312156122f5575f809550955050505050611b9d565b825f03600a0a915081848161230c5761230c612595565b0495505084029091149150611b9d9050565b5f8313156123b757604d83131561235b5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb2565b82600a0a9150815f198161237157612371612595565b048411156123a55760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb2565b5091909102925060019150611b9d9050565b8360019550955050505050611b9d565b6123cf6125df565b565b5f602082840312156123e1575f80fd5b81356001600160e01b0319811681146123f8575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6123f860208301846123ff565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612463575f80fd5b81356001600160401b0380821115612479575f80fd5b818401915084601f83011261248c575f80fd5b81358181111561249e5761249e61243f565b604051601f8201601f19908116603f011681019083821181831017156124c6576124c661243f565b816040528281528760208487010111156124de575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261251960608401866123ff565b8381036040850152845180825260208087019201905f5b8181101561254c57835183529284019291840191600101612530565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d161255a565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f826125c357634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d161255a565b634e487b7160e01b5f52605160045260245ffdfe16ec170a17191728173817481757176717761786179617a517b517c417d417e417f4186818771886189618a618b618c618d518e418f41904191419241803181c1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1cf41d900101180010800082000100010480300038412a001810000010020004200004002038028ff54904cc66c61df3dcab0616592209895f0b14fec9301902e0920c5bfe561b21609200e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2103d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a51f792bdb01e0f14716565589"; + hex"6080604052348015600e575f80fd5b506127138061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c3660046123ce565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061242a565b6100ce6100c9366004612450565b610bd4565b60405161009d939291906124fa565b6040517fe43208b51e17b3d887e8f3535d75526c0744eee6a200dac603462c6b3ca46511815260200161009d565b61011e610119366004612450565b610d18565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d50565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e66006600161256b565b6101f190600161256b565b6101fc90600161256b565b6001600160401b038111156102135761021361243c565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b506040805160018082528183019092529192505f9190816020015b6123c48152602001906001900390816102615790505090506116ec815f8151811061028e5761028e61257e565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123c48152602001906001900390816102be57905050905061170a815f815181106102eb576102eb61257e565b60200260200101906001600160401b031690816001600160401b031681525050611719816001815181106103215761032161257e565b60200260200101906001600160401b031690816001600160401b031681525050611728816002815181106103575761035761257e565b60200260200101906001600160401b031690816001600160401b0316815250506117388160038151811061038d5761038d61257e565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c48152602001906001900390816103bd579050509050611748815f815181106103ea576103ea61257e565b60200260200101906001600160401b031690816001600160401b031681525050611757816001815181106104205761042061257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c4815260200190600190039081610450579050509050611767815f8151811061047d5761047d61257e565b60200260200101906001600160401b031690816001600160401b031681525050611776816001815181106104b3576104b361257e565b60200260200101906001600160401b031690816001600160401b031681525050611786816002815181106104e9576104e961257e565b60200260200101906001600160401b031690816001600160401b0316815250506117968160038151811061051f5761051f61257e565b60200260200101906001600160401b031690816001600160401b0316815250506117a5816004815181106105555761055561257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c48152602001906001900390816105855790505090506117b5815f815181106105b2576105b261257e565b60200260200101906001600160401b031690816001600160401b0316815250506117c4816001815181106105e8576105e861257e565b60200260200101906001600160401b031690816001600160401b0316815250506117d48160028151811061061e5761061e61257e565b60200260200101906001600160401b031690816001600160401b0316815250506117e4816003815181106106545761065461257e565b60200260200101906001600160401b031690816001600160401b0316815250506117f48160048151811061068a5761068a61257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c48152602001906001900390816106b9579050509050611803815f815181106106e6576106e661257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c481526020019060019003908161071557905050905061181c815f815181106107425761074261257e565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106107755761077561257e565b602002602001018190525085886001815181106107945761079461257e565b602002602001018190525084886002815181106107b3576107b361257e565b602002602001018190525083886003815181106107d2576107d261257e565b602002602001018190525082886004815181106107f1576107f161257e565b6020908102919091010152818861080a6006600161256b565b8151811061081a5761081a61257e565b602090810291909101015280886108336006600161256b565b61083e90600161256b565b8151811061084e5761084e61257e565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c4815260200190600190039081610870579050509050611865815f8151811061089d5761089d61257e565b60200260200101906001600160401b031690816001600160401b031681525050611874816001815181106108d3576108d361257e565b60200260200101906001600160401b031690816001600160401b031681525050611883816002815181106109095761090961257e565b60200260200101906001600160401b031690816001600160401b0316815250506118938160038151811061093f5761093f61257e565b60200260200101906001600160401b031690816001600160401b0316815250506118a3816004815181106109755761097561257e565b60200260200101906001600160401b031690816001600160401b0316815250506118b3816005815181106109ab576109ab61257e565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106109df576109df61257e565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c4815260200190600190039081610a025790505090506118c3815f81518110610a2f57610a2f61257e565b60200260200101906001600160401b031690816001600160401b0316815250506118d281600181518110610a6557610a6561257e565b60200260200101906001600160401b031690816001600160401b0316815250506118e181600281518110610a9b57610a9b61257e565b60200260200101906001600160401b031690816001600160401b0316815250506118f181600381518110610ad157610ad161257e565b60200260200101906001600160401b031690816001600160401b03168152505061190181600481518110610b0757610b0761257e565b60200260200101906001600160401b031690816001600160401b03168152505061191181600581518110610b3d57610b3d61257e565b60200260200101906001600160401b031690816001600160401b03168152505061192181600681518110610b7357610b7361257e565b60200260200101906001600160401b031690816001600160401b031681525050808a600681518110610ba757610ba761257e565b602090810291909101015289610bc4610bbf82611931565b611946565b9b50505050505050505050505090565b5f6060805f805f610bf487610be76119d5565b610bef6119f5565b611a15565b9250925092505f610c0a82610220015160200190565b90505f8261022001515182610c1f919061256b565b90505f610c3d83836f07fffffe0000000003ff200000000000611b06565b80925081945050505f80610c5686610240015184611ba2565b915091508115610ceb575f610c6b8783611c79565b90506123c45f610c79611ca8565b90505f60028251610c8a91906125a6565b9050808510610cbb576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610cd48c8c8686565b9e509e509e50505050505050505050505050610d11565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d40866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d5f6006600161256b565b610d6a90600161256b565b610d7590600161256b565b6001600160401b03811115610d8c57610d8c61243c565b604051908082528060200260200182016040528015610dbf57816020015b6060815260200190600190039081610daa5790505b506040805160018082528183019092529192505f9190816020015b6123c4815260200190600190039081610dda579050509050611cc8815f81518110610e0757610e0761257e565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123c4815260200190600190039081610e37579050509050611cc8815f81518110610e6457610e6461257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600181518110610e9a57610e9a61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600281518110610ed057610ed061257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600381518110610f0657610f0661257e565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c4815260200190600190039081610f36579050509050611cc8815f81518110610f6357610f6361257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600181518110610f9957610f9961257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c4815260200190600190039081610fc9579050509050611cc8815f81518110610ff657610ff661257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc88160018151811061102c5761102c61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106110625761106261257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816003815181106110985761109861257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106110ce576110ce61257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c48152602001906001900390816110fe579050509050611cc8815f8151811061112b5761112b61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816001815181106111615761116161257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106111975761119761257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816003815181106111cd576111cd61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106112035761120361257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c4815260200190600190039081611232579050509050611cf1815f8151811061125f5761125f61257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c481526020019060019003908161128e579050509050611d8d815f815181106112bb576112bb61257e565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112ee576112ee61257e565b6020026020010181905250858860018151811061130d5761130d61257e565b6020026020010181905250848860028151811061132c5761132c61257e565b6020026020010181905250838860038151811061134b5761134b61257e565b6020026020010181905250828860048151811061136a5761136a61257e565b602090810291909101015281886113836006600161256b565b815181106113935761139361257e565b602090810291909101015280886113ac6006600161256b565b6113b790600161256b565b815181106113c7576113c761257e565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c48152602001906001900390816113e9579050509050611cc8815f815181106114165761141661257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc88160018151811061144c5761144c61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106114825761148261257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816003815181106114b8576114b861257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106114ee576114ee61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816005815181106115245761152461257e565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106115585761155861257e565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c481526020019060019003908161157b579050509050611cc8815f815181106115a8576115a861257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816001815181106115de576115de61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106116145761161461257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc88160038151811061164a5761164a61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106116805761168061257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816005815181106116b6576116b661257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600681518110610b7357610b7361257e565b5f6060806116fb5f6001611e45565b92509250925093509350939050565b5f6060806116fb60015f611e45565b5f6060806116fb600180611e45565b5f6060806116fb60016002611e45565b5f6060806116fb60016003611e45565b5f6060806116fb60025f611e45565b5f6060806116fb60026001611e45565b5f6060806116fb60035f611e45565b5f6060806116fb60036001611e45565b5f6060806116fb60036002611e45565b5f6060806116fb600380611e45565b5f6060806116fb60036004611e45565b5f6060806116fb60045f611e45565b5f6060806116fb60046001611e45565b5f6060806116fb60046002611e45565b5f6060806116fb60046003611e45565b5f6060806116fb600480611e45565b5f6060806116fb6118166006600161256b565b85611e45565b5f60608060ff8416600885901c611854826118396006600161256b565b61184490600161256b565b61184e919061256b565b82611e45565b945094509450505093509350939050565b5f6060806116fb600580611e45565b5f6060806116fb60055f611e45565b5f6060806116fb60056001611e45565b5f6060806116fb60056002611e45565b5f6060806116fb60056003611e45565b5f6060806116fb60056004611e45565b5f6060806116fb600680611e45565b5f6060806116fb60065f611e45565b5f6060806116fb60066001611e45565b5f6060806116fb60066002611e45565b5f6060806116fb60066003611e45565b5f6060806116fb60066004611e45565b5f6060806116fb60066005611e45565b6060815f61193e82611ec7565b949350505050565b60605f82516002026001600160401b038111156119655761196561243c565b6040519080825280601f01601f19166020018201604052801561198f576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156119c9578051835186169085161781526020909201916002016119a7565b50939695505050505050565b60606040518060e0016040528060a2815260200161267160a29139905090565b606060405180606001604052806040815260200161263160409139905090565b5f80611aa46040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611af087878760405180602001604052805f815250611f35565b915080826101e001819052505093509350939050565b5f808060018187870360208111611b1d5780611b20565b60205b915050875192505b8519600184841a1b16158183101615611b4657600182019150611b28565b9681019660208290036008810293841c90931b92611b915760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610cb29160040161242a565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611c675760018301516021909301805190935f90819060ff168180611bec838e6120e6565b915091508186165f03611c0e575f809b509b5050505050505050505050611c72565b5f87611c1e600185038916612111565b016004028b015195505062ffffff9081169350841683039150611c529050575060019750601c1a9550611c72945050505050565b611c5b83612111565b84019350505050611bc3565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611c9f9083565b95945050505050565b60606040518060600160405280604081526020016125f160409139905090565b5f81515f14611cea576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611d4e575060208101516001600160e01b038116601b0b60e082901d5f611d1f8383836121ca565b905061ffff811115611d4457604051631e4e01d760e21b815260040160405180910390fd5b9250611d88915050565b81515f03611d6f57604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611e2257602082015160408301516001600160e01b038216601b0b60e083901d5f611dbf8383836121ca565b6001600160e01b038516601b0b935060e085901d925090505f611de38484836121ca565b905060ff821180611df4575060ff81115b15611e1257604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611d889350505050565b600282511015611d6f57604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611e58575060ff84115b15611e8057604051639b0f326160e01b81526004810186905260248101859052604401610cb2565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611ed38361220c565b90505f611ee18260206125c5565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611f2957602083515102806020855101835e6020939093019201611f06565b50919695505050505050565b611fc26040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b038111156120475761204761243c565b604051908082528060200260200182016040528015612070578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611c9f565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611c72575060019250929050565b5f5f1982036121235750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6121d8868686612255565b91509150806122035760405162bc8ecf60e31b81526004810187905260248101869052604401610cb2565b50949350505050565b5f60208201602083510281015b8082101561224e57815151928301928084101561224257634e487b715f5260116020526024601cfd5b50602082019150612219565b5050919050565b5f805f85121561228257604051634a7d166b60e01b81526004810186905260248101859052604401610cb2565b845f0361229457505f90506001611b9a565b8460ff84168501858112156122cf5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610cb2565b5f805f83121561231b57604c198312156122f2575f809550955050505050611b9a565b825f03600a0a915081848161230957612309612592565b0495505084029091149150611b9a9050565b5f8313156123b457604d8313156123585760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb2565b82600a0a9150815f198161236e5761236e612592565b048411156123a25760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb2565b5091909102925060019150611b9a9050565b8360019550955050505050611b9a565b6123cc6125dc565b565b5f602082840312156123de575f80fd5b81356001600160e01b0319811681146123f5575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6123f560208301846123fc565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612460575f80fd5b81356001600160401b0380821115612476575f80fd5b818401915084601f830112612489575f80fd5b81358181111561249b5761249b61243c565b604051601f8201601f19908116603f011681019083821181831017156124c3576124c361243c565b816040528281528760208487010111156124db575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261251660608401866123fc565b8381036040850152845180825260208087019201905f5b818110156125495783518352928401929184019160010161252d565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d1612557565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f826125c057634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d1612557565b634e487b7160e01b5f52605160045260245ffdfe16ec170a17191728173817481757176717761786179617a517b517c417d417e417f4186518741883189318a318b318c318d218e118f11901191119211803181c1cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cf11d8d0101180010800082000100010480300038412a001810000010020004200004002038028ff54904cc66c61df3dcab0616592209895f0b14fec9301902e0920c5bfe561b21609200e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2103d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a51f792bdb01e0f14716565589"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c3660046123d1565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061242d565b6100ce6100c9366004612453565b610bd4565b60405161009d939291906124fd565b6040517fe43208b51e17b3d887e8f3535d75526c0744eee6a200dac603462c6b3ca46511815260200161009d565b61011e610119366004612453565b610d18565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d50565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e66006600161256e565b6101f190600161256e565b6101fc90600161256e565b6001600160401b038111156102135761021361243f565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b506040805160018082528183019092529192505f9190816020015b6123c78152602001906001900390816102615790505090506116ec815f8151811061028e5761028e612581565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123c78152602001906001900390816102be57905050905061170a815f815181106102eb576102eb612581565b60200260200101906001600160401b031690816001600160401b0316815250506117198160018151811061032157610321612581565b60200260200101906001600160401b031690816001600160401b0316815250506117288160028151811061035757610357612581565b60200260200101906001600160401b031690816001600160401b0316815250506117388160038151811061038d5761038d612581565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c78152602001906001900390816103bd579050509050611748815f815181106103ea576103ea612581565b60200260200101906001600160401b031690816001600160401b0316815250506117578160018151811061042057610420612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c7815260200190600190039081610450579050509050611767815f8151811061047d5761047d612581565b60200260200101906001600160401b031690816001600160401b031681525050611776816001815181106104b3576104b3612581565b60200260200101906001600160401b031690816001600160401b031681525050611786816002815181106104e9576104e9612581565b60200260200101906001600160401b031690816001600160401b0316815250506117968160038151811061051f5761051f612581565b60200260200101906001600160401b031690816001600160401b0316815250506117a58160048151811061055557610555612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c78152602001906001900390816105855790505090506117b5815f815181106105b2576105b2612581565b60200260200101906001600160401b031690816001600160401b0316815250506117c4816001815181106105e8576105e8612581565b60200260200101906001600160401b031690816001600160401b0316815250506117d48160028151811061061e5761061e612581565b60200260200101906001600160401b031690816001600160401b0316815250506117e48160038151811061065457610654612581565b60200260200101906001600160401b031690816001600160401b0316815250506117f48160048151811061068a5761068a612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c78152602001906001900390816106b9579050509050611803815f815181106106e6576106e6612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c781526020019060019003908161071557905050905061181c815f8151811061074257610742612581565b60200260200101906001600160401b031690816001600160401b03168152505086885f8151811061077557610775612581565b6020026020010181905250858860018151811061079457610794612581565b602002602001018190525084886002815181106107b3576107b3612581565b602002602001018190525083886003815181106107d2576107d2612581565b602002602001018190525082886004815181106107f1576107f1612581565b6020908102919091010152818861080a6006600161256e565b8151811061081a5761081a612581565b602090810291909101015280886108336006600161256e565b61083e90600161256e565b8151811061084e5761084e612581565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c7815260200190600190039081610870579050509050611868815f8151811061089d5761089d612581565b60200260200101906001600160401b031690816001600160401b031681525050611877816001815181106108d3576108d3612581565b60200260200101906001600160401b031690816001600160401b0316815250506118868160028151811061090957610909612581565b60200260200101906001600160401b031690816001600160401b0316815250506118968160038151811061093f5761093f612581565b60200260200101906001600160401b031690816001600160401b0316815250506118a68160048151811061097557610975612581565b60200260200101906001600160401b031690816001600160401b0316815250506118b6816005815181106109ab576109ab612581565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106109df576109df612581565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c7815260200190600190039081610a025790505090506118c6815f81518110610a2f57610a2f612581565b60200260200101906001600160401b031690816001600160401b0316815250506118d581600181518110610a6557610a65612581565b60200260200101906001600160401b031690816001600160401b0316815250506118e481600281518110610a9b57610a9b612581565b60200260200101906001600160401b031690816001600160401b0316815250506118f481600381518110610ad157610ad1612581565b60200260200101906001600160401b031690816001600160401b03168152505061190481600481518110610b0757610b07612581565b60200260200101906001600160401b031690816001600160401b03168152505061191481600581518110610b3d57610b3d612581565b60200260200101906001600160401b031690816001600160401b03168152505061192481600681518110610b7357610b73612581565b60200260200101906001600160401b031690816001600160401b031681525050808a600681518110610ba757610ba7612581565b602090810291909101015289610bc4610bbf82611934565b611949565b9b50505050505050505050505090565b5f6060805f805f610bf487610be76119d8565b610bef6119f8565b611a18565b9250925092505f610c0a82610220015160200190565b90505f8261022001515182610c1f919061256e565b90505f610c3d83836f07fffffe0000000003ff200000000000611b09565b80925081945050505f80610c5686610240015184611ba5565b915091508115610ceb575f610c6b8783611c7c565b90506123c75f610c79611cab565b90505f60028251610c8a91906125a9565b9050808510610cbb576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610cd48c8c8686565b9e509e509e50505050505050505050505050610d11565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d40866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d5f6006600161256e565b610d6a90600161256e565b610d7590600161256e565b6001600160401b03811115610d8c57610d8c61243f565b604051908082528060200260200182016040528015610dbf57816020015b6060815260200190600190039081610daa5790505b506040805160018082528183019092529192505f9190816020015b6123c7815260200190600190039081610dda579050509050611ccb815f81518110610e0757610e07612581565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123c7815260200190600190039081610e37579050509050611ccb815f81518110610e6457610e64612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600181518110610e9a57610e9a612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600281518110610ed057610ed0612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600381518110610f0657610f06612581565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c7815260200190600190039081610f36579050509050611ccb815f81518110610f6357610f63612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600181518110610f9957610f99612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c7815260200190600190039081610fc9579050509050611ccb815f81518110610ff657610ff6612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160018151811061102c5761102c612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061106257611062612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160038151811061109857611098612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816004815181106110ce576110ce612581565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c78152602001906001900390816110fe579050509050611ccb815f8151811061112b5761112b612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160018151811061116157611161612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061119757611197612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816003815181106111cd576111cd612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160048151811061120357611203612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c7815260200190600190039081611232579050509050611cf4815f8151811061125f5761125f612581565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c781526020019060019003908161128e579050509050611d90815f815181106112bb576112bb612581565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112ee576112ee612581565b6020026020010181905250858860018151811061130d5761130d612581565b6020026020010181905250848860028151811061132c5761132c612581565b6020026020010181905250838860038151811061134b5761134b612581565b6020026020010181905250828860048151811061136a5761136a612581565b602090810291909101015281886113836006600161256e565b8151811061139357611393612581565b602090810291909101015280886113ac6006600161256e565b6113b790600161256e565b815181106113c7576113c7612581565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c78152602001906001900390816113e9579050509050611ccb815f8151811061141657611416612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160018151811061144c5761144c612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061148257611482612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816003815181106114b8576114b8612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816004815181106114ee576114ee612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160058151811061152457611524612581565b60200260200101906001600160401b031690816001600160401b031681525050808960058151811061155857611558612581565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c781526020019060019003908161157b579050509050611ccb815f815181106115a8576115a8612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816001815181106115de576115de612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160028151811061161457611614612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160038151811061164a5761164a612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb8160048151811061168057611680612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb816005815181106116b6576116b6612581565b60200260200101906001600160401b031690816001600160401b031681525050611ccb81600681518110610b7357610b73612581565b5f6060806116fb5f6001611e48565b92509250925093509350939050565b5f6060806116fb60015f611e48565b5f6060806116fb600180611e48565b5f6060806116fb60016002611e48565b5f6060806116fb60016003611e48565b5f6060806116fb60025f611e48565b5f6060806116fb60026001611e48565b5f6060806116fb60035f611e48565b5f6060806116fb60036001611e48565b5f6060806116fb60036002611e48565b5f6060806116fb600380611e48565b5f6060806116fb60036004611e48565b5f6060806116fb60045f611e48565b5f6060806116fb60046001611e48565b5f6060806116fb60046002611e48565b5f6060806116fb60046003611e48565b5f6060806116fb600480611e48565b5f6060806116fb6118166006600161256e565b85611e48565b5f60608060ff80851690600886901c166118578261183c6006600161256e565b61184790600161256e565b611851919061256e565b82611e48565b945094509450505093509350939050565b5f6060806116fb600580611e48565b5f6060806116fb60055f611e48565b5f6060806116fb60056001611e48565b5f6060806116fb60056002611e48565b5f6060806116fb60056003611e48565b5f6060806116fb60056004611e48565b5f6060806116fb600680611e48565b5f6060806116fb60065f611e48565b5f6060806116fb60066001611e48565b5f6060806116fb60066002611e48565b5f6060806116fb60066003611e48565b5f6060806116fb60066004611e48565b5f6060806116fb60066005611e48565b6060815f61194182611eca565b949350505050565b60605f82516002026001600160401b038111156119685761196861243f565b6040519080825280601f01601f191660200182016040528015611992576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156119cc578051835186169085161781526020909201916002016119aa565b50939695505050505050565b60606040518060e0016040528060a2815260200161267460a29139905090565b606060405180606001604052806040815260200161263460409139905090565b5f80611aa76040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611af387878760405180602001604052805f815250611f38565b915080826101e001819052505093509350939050565b5f808060018187870360208111611b205780611b23565b60205b915050875192505b8519600184841a1b16158183101615611b4957600182019150611b2b565b9681019660208290036008810293841c90931b92611b945760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610cb29160040161242d565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611c6a5760018301516021909301805190935f90819060ff168180611bef838e6120e9565b915091508186165f03611c11575f809b509b5050505050505050505050611c75565b5f87611c21600185038916612114565b016004028b015195505062ffffff9081169350841683039150611c559050575060019750601c1a9550611c75945050505050565b611c5e83612114565b84019350505050611bc6565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611ca29083565b95945050505050565b60606040518060600160405280604081526020016125f460409139905090565b5f81515f14611ced576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611d51575060208101516001600160e01b038116601b0b60e082901d5f611d228383836121cd565b905061ffff811115611d4757604051631e4e01d760e21b815260040160405180910390fd5b9250611d8b915050565b81515f03611d7257604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611e2557602082015160408301516001600160e01b038216601b0b60e083901d5f611dc28383836121cd565b6001600160e01b038516601b0b935060e085901d925090505f611de68484836121cd565b905060ff821180611df7575060ff81115b15611e1557604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611d8b9350505050565b600282511015611d7257604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611e5b575060ff84115b15611e8357604051639b0f326160e01b81526004810186905260248101859052604401610cb2565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611ed68361220f565b90505f611ee48260206125c8565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611f2c57602083515102806020855101835e6020939093019201611f09565b50919695505050505050565b611fc56040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b0381111561204a5761204a61243f565b604051908082528060200260200182016040528015612073578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611ca2565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611c75575060019250929050565b5f5f1982036121265750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6121db868686612258565b91509150806122065760405162bc8ecf60e31b81526004810187905260248101869052604401610cb2565b50949350505050565b5f60208201602083510281015b8082101561225157815151928301928084101561224557634e487b715f5260116020526024601cfd5b5060208201915061221c565b5050919050565b5f805f85121561228557604051634a7d166b60e01b81526004810186905260248101859052604401610cb2565b845f0361229757505f90506001611b9d565b8460ff84168501858112156122d25760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610cb2565b5f805f83121561231e57604c198312156122f5575f809550955050505050611b9d565b825f03600a0a915081848161230c5761230c612595565b0495505084029091149150611b9d9050565b5f8313156123b757604d83131561235b5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb2565b82600a0a9150815f198161237157612371612595565b048411156123a55760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb2565b5091909102925060019150611b9d9050565b8360019550955050505050611b9d565b6123cf6125df565b565b5f602082840312156123e1575f80fd5b81356001600160e01b0319811681146123f8575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6123f860208301846123ff565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612463575f80fd5b81356001600160401b0380821115612479575f80fd5b818401915084601f83011261248c575f80fd5b81358181111561249e5761249e61243f565b604051601f8201601f19908116603f011681019083821181831017156124c6576124c661243f565b816040528281528760208487010111156124de575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261251960608401866123ff565b8381036040850152845180825260208087019201905f5b8181101561254c57835183529284019291840191600101612530565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d161255a565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f826125c357634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d161255a565b634e487b7160e01b5f52605160045260245ffdfe16ec170a17191728173817481757176717761786179617a517b517c417d417e417f4186818771886189618a618b618c618d518e418f41904191419241803181c1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1ccb1cf41d900101180010800082000100010480300038412a001810000010020004200004002038028ff54904cc66c61df3dcab0616592209895f0b14fec9301902e0920c5bfe561b21609200e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2103d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a51f792bdb01e0f14716565589"; + hex"608060405234801561000f575f80fd5b506004361061007a575f3560e01c80636f5aa28d116100585780636f5aa28d146100dd578063c6c0cbb61461010b578063ccf4477514610135578063d6d8c9a814610148575f80fd5b806301ffc9a71461007e578063336284d4146100a6578063570c7a63146100bb575b5f80fd5b61009161008c3660046123ce565b610150565b60405190151581526020015b60405180910390f35b6100ae6101d7565b60405161009d919061242a565b6100ce6100c9366004612450565b610bd4565b60405161009d939291906124fa565b6040517fe43208b51e17b3d887e8f3535d75526c0744eee6a200dac603462c6b3ca46511815260200161009d565b61011e610119366004612450565b610d18565b60408051921515835260208301919091520161009d565b60408051602081019091525f81526100ae565b6100ae610d50565b5f6001600160e01b031982166391ccb1d560e01b148061018057506001600160e01b03198216636f5aa28d60e01b145b8061019b57506001600160e01b03198216631a2c8edd60e01b145b806101b657506001600160e01b03198216630cd8a13560e21b145b806101d157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f6101e66006600161256b565b6101f190600161256b565b6101fc90600161256b565b6001600160401b038111156102135761021361243c565b60405190808252806020026020018201604052801561024657816020015b60608152602001906001900390816102315790505b506040805160018082528183019092529192505f9190816020015b6123c48152602001906001900390816102615790505090506116ec815f8151811061028e5761028e61257e565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123c48152602001906001900390816102be57905050905061170a815f815181106102eb576102eb61257e565b60200260200101906001600160401b031690816001600160401b031681525050611719816001815181106103215761032161257e565b60200260200101906001600160401b031690816001600160401b031681525050611728816002815181106103575761035761257e565b60200260200101906001600160401b031690816001600160401b0316815250506117388160038151811061038d5761038d61257e565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c48152602001906001900390816103bd579050509050611748815f815181106103ea576103ea61257e565b60200260200101906001600160401b031690816001600160401b031681525050611757816001815181106104205761042061257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c4815260200190600190039081610450579050509050611767815f8151811061047d5761047d61257e565b60200260200101906001600160401b031690816001600160401b031681525050611776816001815181106104b3576104b361257e565b60200260200101906001600160401b031690816001600160401b031681525050611786816002815181106104e9576104e961257e565b60200260200101906001600160401b031690816001600160401b0316815250506117968160038151811061051f5761051f61257e565b60200260200101906001600160401b031690816001600160401b0316815250506117a5816004815181106105555761055561257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c48152602001906001900390816105855790505090506117b5815f815181106105b2576105b261257e565b60200260200101906001600160401b031690816001600160401b0316815250506117c4816001815181106105e8576105e861257e565b60200260200101906001600160401b031690816001600160401b0316815250506117d48160028151811061061e5761061e61257e565b60200260200101906001600160401b031690816001600160401b0316815250506117e4816003815181106106545761065461257e565b60200260200101906001600160401b031690816001600160401b0316815250506117f48160048151811061068a5761068a61257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c48152602001906001900390816106b9579050509050611803815f815181106106e6576106e661257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c481526020019060019003908161071557905050905061181c815f815181106107425761074261257e565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106107755761077561257e565b602002602001018190525085886001815181106107945761079461257e565b602002602001018190525084886002815181106107b3576107b361257e565b602002602001018190525083886003815181106107d2576107d261257e565b602002602001018190525082886004815181106107f1576107f161257e565b6020908102919091010152818861080a6006600161256b565b8151811061081a5761081a61257e565b602090810291909101015280886108336006600161256b565b61083e90600161256b565b8151811061084e5761084e61257e565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c4815260200190600190039081610870579050509050611865815f8151811061089d5761089d61257e565b60200260200101906001600160401b031690816001600160401b031681525050611874816001815181106108d3576108d361257e565b60200260200101906001600160401b031690816001600160401b031681525050611883816002815181106109095761090961257e565b60200260200101906001600160401b031690816001600160401b0316815250506118938160038151811061093f5761093f61257e565b60200260200101906001600160401b031690816001600160401b0316815250506118a3816004815181106109755761097561257e565b60200260200101906001600160401b031690816001600160401b0316815250506118b3816005815181106109ab576109ab61257e565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106109df576109df61257e565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c4815260200190600190039081610a025790505090506118c3815f81518110610a2f57610a2f61257e565b60200260200101906001600160401b031690816001600160401b0316815250506118d281600181518110610a6557610a6561257e565b60200260200101906001600160401b031690816001600160401b0316815250506118e181600281518110610a9b57610a9b61257e565b60200260200101906001600160401b031690816001600160401b0316815250506118f181600381518110610ad157610ad161257e565b60200260200101906001600160401b031690816001600160401b03168152505061190181600481518110610b0757610b0761257e565b60200260200101906001600160401b031690816001600160401b03168152505061191181600581518110610b3d57610b3d61257e565b60200260200101906001600160401b031690816001600160401b03168152505061192181600681518110610b7357610b7361257e565b60200260200101906001600160401b031690816001600160401b031681525050808a600681518110610ba757610ba761257e565b602090810291909101015289610bc4610bbf82611931565b611946565b9b50505050505050505050505090565b5f6060805f805f610bf487610be76119d5565b610bef6119f5565b611a15565b9250925092505f610c0a82610220015160200190565b90505f8261022001515182610c1f919061256b565b90505f610c3d83836f07fffffe0000000003ff200000000000611b06565b80925081945050505f80610c5686610240015184611ba2565b915091508115610ceb575f610c6b8783611c79565b90506123c45f610c79611ca8565b90505f60028251610c8a91906125a6565b9050808510610cbb576040516303bdd1b160e51b815260048101869052602481018290526044015b60405180910390fd5b6001850160020282015161ffff169250610cd48c8c8686565b9e509e509e50505050505050505050505050610d11565b5050604080515f80825281830190925260208101828152919a5090985096505050505050505b9193909250565b5f805f805f610d40866002810151815160228084019461ffff93909316840101920160200190565b505f988998509650505050505050565b60605f610d5f6006600161256b565b610d6a90600161256b565b610d7590600161256b565b6001600160401b03811115610d8c57610d8c61243c565b604051908082528060200260200182016040528015610dbf57816020015b6060815260200190600190039081610daa5790505b506040805160018082528183019092529192505f9190816020015b6123c4815260200190600190039081610dda579050509050611cc8815f81518110610e0757610e0761257e565b6001600160401b03929092166020928302919091019091015260408051600480825260a082019092525f91816020015b6123c4815260200190600190039081610e37579050509050611cc8815f81518110610e6457610e6461257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600181518110610e9a57610e9a61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600281518110610ed057610ed061257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600381518110610f0657610f0661257e565b6001600160401b039290921660209283029190910190910152604080516002808252606082019092525f91816020015b6123c4815260200190600190039081610f36579050509050611cc8815f81518110610f6357610f6361257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600181518110610f9957610f9961257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c4815260200190600190039081610fc9579050509050611cc8815f81518110610ff657610ff661257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc88160018151811061102c5761102c61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106110625761106261257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816003815181106110985761109861257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106110ce576110ce61257e565b6001600160401b03929092166020928302919091019091015260408051600580825260c082019092525f91816020015b6123c48152602001906001900390816110fe579050509050611cc8815f8151811061112b5761112b61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816001815181106111615761116161257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106111975761119761257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816003815181106111cd576111cd61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106112035761120361257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c4815260200190600190039081611232579050509050611cf1815f8151811061125f5761125f61257e565b6001600160401b0392909216602092830291909101909101526040805160018082528183019092525f91816020015b6123c481526020019060019003908161128e579050509050611d8d815f815181106112bb576112bb61257e565b60200260200101906001600160401b031690816001600160401b03168152505086885f815181106112ee576112ee61257e565b6020026020010181905250858860018151811061130d5761130d61257e565b6020026020010181905250848860028151811061132c5761132c61257e565b6020026020010181905250838860038151811061134b5761134b61257e565b6020026020010181905250828860048151811061136a5761136a61257e565b602090810291909101015281886113836006600161256b565b815181106113935761139361257e565b602090810291909101015280886113ac6006600161256b565b6113b790600161256b565b815181106113c7576113c761257e565b602090810291909101015260408051600680825260e082019092525f91816020015b6123c48152602001906001900390816113e9579050509050611cc8815f815181106114165761141661257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc88160018151811061144c5761144c61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106114825761148261257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816003815181106114b8576114b861257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106114ee576114ee61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816005815181106115245761152461257e565b60200260200101906001600160401b031690816001600160401b03168152505080896005815181106115585761155861257e565b602090810291909101015260408051600780825261010082019092525f91816020015b6123c481526020019060019003908161157b579050509050611cc8815f815181106115a8576115a861257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816001815181106115de576115de61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816002815181106116145761161461257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc88160038151811061164a5761164a61257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816004815181106116805761168061257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc8816005815181106116b6576116b661257e565b60200260200101906001600160401b031690816001600160401b031681525050611cc881600681518110610b7357610b7361257e565b5f6060806116fb5f6001611e45565b92509250925093509350939050565b5f6060806116fb60015f611e45565b5f6060806116fb600180611e45565b5f6060806116fb60016002611e45565b5f6060806116fb60016003611e45565b5f6060806116fb60025f611e45565b5f6060806116fb60026001611e45565b5f6060806116fb60035f611e45565b5f6060806116fb60036001611e45565b5f6060806116fb60036002611e45565b5f6060806116fb600380611e45565b5f6060806116fb60036004611e45565b5f6060806116fb60045f611e45565b5f6060806116fb60046001611e45565b5f6060806116fb60046002611e45565b5f6060806116fb60046003611e45565b5f6060806116fb600480611e45565b5f6060806116fb6118166006600161256b565b85611e45565b5f60608060ff8416600885901c611854826118396006600161256b565b61184490600161256b565b61184e919061256b565b82611e45565b945094509450505093509350939050565b5f6060806116fb600580611e45565b5f6060806116fb60055f611e45565b5f6060806116fb60056001611e45565b5f6060806116fb60056002611e45565b5f6060806116fb60056003611e45565b5f6060806116fb60056004611e45565b5f6060806116fb600680611e45565b5f6060806116fb60065f611e45565b5f6060806116fb60066001611e45565b5f6060806116fb60066002611e45565b5f6060806116fb60066003611e45565b5f6060806116fb60066004611e45565b5f6060806116fb60066005611e45565b6060815f61193e82611ec7565b949350505050565b60605f82516002026001600160401b038111156119655761196561243c565b6040519080825280601f01601f19166020018201604052801561198f576020820181803683370190505b50905061ffff80196020850160208651028101600285015b818310156119c9578051835186169085161781526020909201916002016119a7565b50939695505050505050565b60606040518060e0016040528060a2815260200161267160a29139905090565b606060405180606001604052806040815260200161263160409139905090565b5f80611aa46040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b606061ffff600288015116935060ff600388015116925061ffff600588015116600588019750808852602081018801915050611af087878760405180602001604052805f815250611f35565b915080826101e001819052505093509350939050565b5f808060018187870360208111611b1d5780611b20565b60205b915050875192505b8519600184841a1b16158183101615611b4657600182019150611b28565b9681019660208290036008810293841c90931b92611b915760408051602081018590520160408051601f198184030181529082905263e47fe8b760e01b8252610cb29160040161242a565b50869350909150505b935093915050565b600182810180515f928392600560ff93909316602102870192830192909101835b81831015611c675760018301516021909301805190935f90819060ff168180611bec838e6120e6565b915091508186165f03611c0e575f809b509b5050505050505050505050611c72565b5f87611c1e600185038916612111565b016004028b015195505062ffffff9081169350841683039150611c529050575060019750601c1a9550611c72945050505050565b611c5b83612111565b84019350505050611bc3565b5f8095509550505050505b9250929050565b6101c08201516002828102820101516101e08401515f9261ffff9092169190611c9f9083565b95945050505050565b60606040518060600160405280604081526020016125f160409139905090565b5f81515f14611cea576040516304f8b58160e51b815260040160405180910390fd5b505f919050565b5f8151600103611d4e575060208101516001600160e01b038116601b0b60e082901d5f611d1f8383836121ca565b905061ffff811115611d4457604051631e4e01d760e21b815260040160405180910390fd5b9250611d88915050565b81515f03611d6f57604051630f16066b60e41b815260040160405180910390fd5b604051630358cd2160e31b815260040160405180910390fd5b919050565b5f8151600203611e2257602082015160408301516001600160e01b038216601b0b60e083901d5f611dbf8383836121ca565b6001600160e01b038516601b0b935060e085901d925090505f611de38484836121ca565b905060ff821180611df4575060ff81115b15611e1257604051631e4e01d760e21b815260040160405180910390fd5b60081b179450611d889350505050565b600282511015611d6f57604051630f16066b60e41b815260040160405180910390fd5b5f60608060ff851180611e58575060ff84115b15611e8057604051639b0f326160e01b81526004810186905260248101859052604401610cb2565b6040805160248101909152600386602383015385602283015360106021830153806020830153506004815260408051602081019091525f8152600197919650945092505050565b60605f611ed38361220c565b90505f611ee18260206125c5565b9050606060405190508160200181016040528281526020850160208651028101602083015b81831015611f2957602083515102806020855101835e6020939093019201611f06565b50919695505050505050565b611fc26040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f80191681526020016060815260200160608152602001606081526020015f815260200160608152602001606081525090565b5f6040518061026001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f801b81526020015f8152602001600481526020015f81526020015f81526020015f81526020015f801b815260200184815260200185815260200160046001600160401b038111156120475761204761243c565b604051908082528060200260200182016040528015612070578160200160208202803683370190505b5081525f602080830182905260408084018b905260609384018a90528051601f01601f19168281528083018252835161ffff191681178452855290840182905283018190529082018190526080820181905260a08201819052610120820181905261014082018190526102008201529050611c9f565b5f80825f528360205360215f2090506001815f1a1b915062ffffff8116611c72575060019250929050565b5f5f1982036121235750610100919050565b507f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c90565b5f805f6121d8868686612255565b91509150806122035760405162bc8ecf60e31b81526004810187905260248101869052604401610cb2565b50949350505050565b5f60208201602083510281015b8082101561224e57815151928301928084101561224257634e487b715f5260116020526024601cfd5b50602082019150612219565b5050919050565b5f805f85121561228257604051634a7d166b60e01b81526004810186905260248101859052604401610cb2565b845f0361229457505f90506001611b9a565b8460ff84168501858112156122cf5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610cb2565b5f805f83121561231b57604c198312156122f2575f809550955050505050611b9a565b825f03600a0a915081848161230957612309612592565b0495505084029091149150611b9a9050565b5f8313156123b457604d8313156123585760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb2565b82600a0a9150815f198161236e5761236e612592565b048411156123a25760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610cb2565b5091909102925060019150611b9a9050565b8360019550955050505050611b9a565b6123cc6125dc565b565b5f602082840312156123de575f80fd5b81356001600160e01b0319811681146123f5575f80fd5b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6123f560208301846123fc565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612460575f80fd5b81356001600160401b0380821115612476575f80fd5b818401915084601f830112612489575f80fd5b81358181111561249b5761249b61243c565b604051601f8201601f19908116603f011681019083821181831017156124c3576124c361243c565b816040528281528760208487010111156124db575f80fd5b826020860160208301375f928101602001929092525095945050505050565b83151581525f60206060602084015261251660608401866123fc565b8381036040850152845180825260208087019201905f5b818110156125495783518352928401929184019160010161252d565b509098975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156101d1576101d1612557565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f826125c057634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101d1576101d1612557565b634e487b7160e01b5f52605160045260245ffdfe16ec170a17191728173817481757176717761786179617a517b517c417d417e417f4186518741883189318a318b318c318d218e118f11901191119211803181c1cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cc81cf11d8d0101180010800082000100010480300038412a001810000010020004200004002038028ff54904cc66c61df3dcab0616592209895f0b14fec9301902e0920c5bfe561b21609200e959460b1974270f844db208bcd3bf1c9893761e1049db11b93430180ae9a00af82a7805c138f40d28083f0742ef2103d561fd1215a13315716a6117d260cc107b9bfc0eec7ade13cba2891a6b14a51f792bdb01e0f14716565589"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. diff --git a/src/lib/LibRaindexSubParser.sol b/src/lib/LibRaindexSubParser.sol index f9657ccb33..131c8524ae 100644 --- a/src/lib/LibRaindexSubParser.sol +++ b/src/lib/LibRaindexSubParser.sol @@ -435,7 +435,7 @@ library LibRaindexSubParser { returns (bool, bytes memory, bytes32[] memory) { uint256 column = uint256(OperandV2.unwrap(operand)) & 0xFF; - uint256 row = (uint256(OperandV2.unwrap(operand)) >> 8) & 0xFF; + uint256 row = uint256(OperandV2.unwrap(operand)) >> 8; //slither-disable-next-line unused-return return LibSubParse.subParserContext(CONTEXT_SIGNED_CONTEXT_START_COLUMN + column, row); } diff --git a/test/concrete/parser/RaindexV6SubParser.routingTokenDecimalsAndMasks.t.sol b/test/concrete/parser/RaindexV6SubParser.routingTokenDecimalsAndMasks.t.sol index 16ca0cdacd..c20b6c77b2 100644 --- a/test/concrete/parser/RaindexV6SubParser.routingTokenDecimalsAndMasks.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.routingTokenDecimalsAndMasks.t.sol @@ -6,26 +6,12 @@ import {Test} from "forge-std-1.17.0/src/Test.sol"; import {OperandV2} from "rainlang-interface-0.2.13/src/interface/ISubParserV4.sol"; import {OPCODE_CONTEXT} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; import {ContextGridOverflow} from "rainlang-0.2.19/src/error/ErrSubParse.sol"; -import {LibSubParse} from "rainlang-0.2.19/src/lib/parse/LibSubParse.sol"; import {LibRaindexSubParser} from "../../../src/lib/LibRaindexSubParser.sol"; /// @title RaindexV6SubParserRoutingTokenDecimalsAndMasksTest -/// @notice Pins routing that the main `RaindexV6SubParser.routing.t.sol` suite -/// leaves underconstrained, all against FRESH-compiled source (the -/// `LibRaindexSubParser.subParser*` functions are called directly, so no etched -/// pointers / regen are involved and any source-constant change is observed): -/// -/// 1. The absolute (column, row) of `subParserWithdrawTokenDecimals` and -/// `subParserDepositTokenDecimals`. The word-parser-wiring suite only pins -/// their slots RELATIVELY (pointer inequalities), so an absolute -/// (column, row) shift that lands on a still-distinct pointer survives there. -/// -/// 2. The `& 0xFF` ROW mask in `subParserSignedContext`. The operand row is -/// `(operand >> 8) & 0xFF`. Because `LibSubParse.subParserContext` REVERTS -/// `ContextGridOverflow` when row > 255, dropping the mask turns a wide -/// operand from a successful in-range row into a revert. A wide operand whose -/// masked row is a small in-range value discriminates the masked code -/// (returns 4-byte context bytecode) from the unmasked code (reverts). +/// @notice Pins the absolute (column, row) of the deposit and withdraw token +/// decimals words, and that a signed-context row operand wider than a byte +/// reverts instead of wrapping. contract RaindexV6SubParserRoutingTokenDecimalsAndMasksTest is Test { /// @dev Decode the 4-byte context bytecode blob returned by a parser: /// byte 0 = opcode index, byte 1 = io byte, byte 2 = row, byte 3 = column. @@ -51,6 +37,8 @@ contract RaindexV6SubParserRoutingTokenDecimalsAndMasksTest is Test { } /// deposit-token-decimals routes to the deposit column (5), row 4. + /// The wiring suite pins this via pointer equality to withdraw-target-amount; + /// this is the direct (column, row) assertion as a self-contained anchor. function testRouteDepositTokenDecimalsAbsolute() external pure { (bool success, bytes memory bytecode,) = LibRaindexSubParser.subParserDepositTokenDecimals(0, 0, OperandV2.wrap(0)); @@ -60,37 +48,15 @@ contract RaindexV6SubParserRoutingTokenDecimalsAndMasksTest is Test { assertEq(row, 4, "deposit-token-decimals row is 4"); } - /// The signed-context ROW is `(operand >> 8) & 0xFF`. An operand of - /// `0x010000` has low byte 0 (column offset 0 -> column 8) and `>> 8` = - /// `0x0100` = 256. WITH the mask the row is `0x0100 & 0xFF` = 0, so the - /// parser succeeds and returns (column 8, row 0). WITHOUT the mask the row is - /// 256, which exceeds uint8 and reverts `ContextGridOverflow(8, 256)`. This - /// asserts the masked, non-reverting outcome, so dropping the row mask flips - /// success into a revert and fails the test. - function testSignedContextRowMaskKeepsRowInRange() external pure { - (bool success, bytes memory bytecode,) = - LibRaindexSubParser.subParserSignedContext(0, 0, OperandV2.wrap(bytes32(uint256(0x010000)))); - assertTrue(success, "parser must succeed (row mask keeps row in range)"); - (uint8 row, uint8 column) = decode(bytecode); - assertEq(column, 8, "column is signed-context start (8) + low byte 0"); - assertEq(row, 0, "row is (0x010000 >> 8) & 0xFF = 0"); - } - - /// Confirms the discriminator above is genuine: the SAME wide operand, with - /// the row mask DROPPED (`>> 8` without `& 0xFF`), drives the row to 256 and - /// `LibSubParse.subParserContext` reverts `ContextGridOverflow(8, 256)`. This - /// documents the exact revert the production mask prevents, so the pairing of - /// these two tests pins the mask: removing it makes the happy test above - /// revert with this very selector/args. - function testSignedContextUnmaskedRowWouldOverflow() external { - uint256 column = uint256(0x010000) & 0xFF; // low byte 0 - uint256 unmaskedRow = uint256(0x010000) >> 8; // 256 - vm.expectRevert(abi.encodeWithSelector(ContextGridOverflow.selector, column + 8, unmaskedRow)); - this.callContext(column + 8, unmaskedRow); + /// A signed-context row wider than a byte reverts rather than wrapping onto + /// another row. + function testSignedContextWideRowReverts() external { + vm.expectRevert(abi.encodeWithSelector(ContextGridOverflow.selector, 8, 256)); + this.callSignedContext(OperandV2.wrap(bytes32(uint256(0x010000)))); } /// @dev External wrapper so `vm.expectRevert` can catch the library revert. - function callContext(uint256 column, uint256 row) external pure returns (bool, bytes memory, bytes32[] memory) { - return LibSubParse.subParserContext(column, row); + function callSignedContext(OperandV2 operand) external pure returns (bool, bytes memory, bytes32[] memory) { + return LibRaindexSubParser.subParserSignedContext(0, 0, operand); } } diff --git a/test/concrete/parser/RaindexV6SubParser.signers.t.sol b/test/concrete/parser/RaindexV6SubParser.signers.t.sol index 74a70663ce..8cd32f2a81 100644 --- a/test/concrete/parser/RaindexV6SubParser.signers.t.sol +++ b/test/concrete/parser/RaindexV6SubParser.signers.t.sol @@ -4,6 +4,7 @@ pragma solidity =0.8.25; import {StackAllocationMismatch} from "rainlang-0.2.19/src/error/ErrIntegrity.sol"; import {ExpectedOperand, UnexpectedOperandValue} from "rainlang-0.2.19/src/error/ErrParse.sol"; +import {ContextGridOverflow} from "rainlang-0.2.19/src/error/ErrSubParse.sol"; import {OpTest, StackItem} from "rainlang-0.2.19/src/../test/abstract/OpTest.sol"; import {Strings} from "@openzeppelin-contracts-5.7.0/utils/Strings.sol"; import {LibRaindexSubParserContextFixture} from "test/util/fixture/LibRaindexSubParserContextFixture.sol"; @@ -72,4 +73,15 @@ contract RaindexV6SubParserSignersTest is OpTest { checkUnhappyParse2(rainlang, abi.encodeWithSelector(StackAllocationMismatch.selector, 2, 1)); } + + /// A signer index past the last context row reverts rather than wrapping + /// onto another signer. + function testSubParserContextSignerUnhappyIndexOverflow() external { + address subParserAddress = LibRaindexDeploy.SUB_PARSER_DEPLOYED_ADDRESS; + + bytes memory rainlang = + bytes(string.concat("using-words-from ", subParserAddress.toHexString(), " _: signer<256>();")); + + checkUnhappyParse(rainlang, abi.encodeWithSelector(ContextGridOverflow.selector, 7, 256)); + } }