diff --git a/bindings/bin/rollup_deployed.hex b/bindings/bin/rollup_deployed.hex index d39b98c32..5971a52b3 100644 --- a/bindings/bin/rollup_deployed.hex +++ b/bindings/bin/rollup_deployed.hex @@ -1 +1 @@ -0x6080604052600436106102b9575f3560e01c8063715018a611610170578063abc8d68d116100d1578063d279c19111610087578063de8b303511610062578063de8b303514610893578063e3fff1dd146108b2578063f2fde38b146108d1575f80fd5b8063d279c19114610842578063d63b354914610861578063ddd8a3dc14610874575f80fd5b8063b3e0a509116100b7578063b3e0a509146107ef578063bedb86fb1461080e578063ce5db8d61461082d575f80fd5b8063abc8d68d146107af578063b31a77d3146107da575f80fd5b8063910129d411610126578063a415d8dc1161010c578063a415d8dc1461074d578063a479265d1461077b578063a6b63eb814610790575f80fd5b8063910129d4146106fd57806397fc007c1461072e575f80fd5b80638d644bb7116101565780638d644bb71461061d5780638da5cb5b146106305780638f1d37761461064d575f80fd5b8063715018a6146105f057806388b1ea0914610604575f80fd5b80632362f03e1161021a57806357e0af6c116101d05780635ef7a94a116101b65780635ef7a94a146105255780635f77cf1d146105855780636c578c1d146105d1575f80fd5b806357e0af6c146104ef5780635c975abb1461050e575f80fd5b80632b7ac3f3116102005780632b7ac3f31461047a5780633b70c18a146104b157806345792427146104d0575f80fd5b80632362f03e146104245780632571098d1461044f575f80fd5b8063121dcd501161026f57806318463fb01161025557806318463fb0146103c057806318af3b2b146103d557806321e2f9e014610405575f80fd5b8063121dcd501461038c57806313361101146103a1575f80fd5b80630ceb67801161029f5780630ceb67801461032a57806310d445831461034b578063116a1f421461036a575f80fd5b806304d77215146102c4578063059def6114610307575f80fd5b366102c057005b5f80fd5b3480156102cf575f80fd5b506102f26102de366004613dcc565b60a26020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610312575f80fd5b5061031c609c5481565b6040519081526020016102fe565b348015610335575f80fd5b50610349610344366004613dfe565b6108f0565b005b348015610356575f80fd5b50610349610365366004613e5c565b6109c2565b348015610375575f80fd5b506102f2610384366004613dcc565b609c54101590565b348015610397575f80fd5b5061031c609d5481565b3480156103ac575f80fd5b506103496103bb366004613ea4565b610d29565b3480156103cb575f80fd5b5061031c60a65481565b3480156103e0575f80fd5b506102f26103ef366004613dcc565b5f90815260a16020526040902060010154421090565b348015610410575f80fd5b506102f261041f366004613dcc565b6111fe565b34801561042f575f80fd5b5061031c61043e366004613dcc565b60a06020525f908152604090205481565b34801561045a575f80fd5b5061031c610469366004613dcc565b609f6020525f908152604090205481565b348015610485575f80fd5b50609b54610499906001600160a01b031681565b6040516001600160a01b0390911681526020016102fe565b3480156104bc575f80fd5b50609a54610499906001600160a01b031681565b3480156104db575f80fd5b506103496104ea366004613ee3565b61122c565b3480156104fa575f80fd5b50610349610509366004613dcc565b61147e565b348015610519575f80fd5b5060655460ff166102f2565b348015610530575f80fd5b5061056561053f366004613dcc565b60a16020525f908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016102fe565b348015610590575f80fd5b506105b87f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff90911681526020016102fe565b3480156105dc575f80fd5b506103496105eb366004613dfe565b611529565b3480156105fb575f80fd5b506103496115e6565b34801561060f575f80fd5b5060a5546102f29060ff1681565b61034961062b366004613f76565b6115f9565b34801561063b575f80fd5b506033546001600160a01b0316610499565b348015610658575f80fd5b506106b9610667366004613dcc565b60a36020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff831693680100000000000000009093046001600160a01b0316929060ff8082169161010090041686565b6040805167ffffffffffffffff90971687526001600160a01b03909516602087015293850192909252606084015215156080830152151560a082015260c0016102fe565b348015610708575f80fd5b506102f2610717366004613dcc565b5f90815260a3602052604090206003015460ff1690565b348015610739575f80fd5b50610349610748366004613dfe565b611b65565b348015610758575f80fd5b506102f2610767366004613dfe565b609e6020525f908152604090205460ff1681565b348015610786575f80fd5b5061031c60995481565b34801561079b575f80fd5b506103496107aa366004613f9d565b611c48565b3480156107ba575f80fd5b5061031c6107c9366004613dfe565b60a46020525f908152604090205481565b3480156107e5575f80fd5b5061031c60a75481565b3480156107fa575f80fd5b50610349610809366004613ea4565b611f4b565b348015610819575f80fd5b50610349610828366004613ffb565b612243565b348015610838575f80fd5b5061031c60985481565b34801561084d575f80fd5b5061034961085c366004613dfe565b612336565b61034961086f366004614016565b6123b2565b34801561087f575f80fd5b50609754610499906001600160a01b031681565b34801561089e575f80fd5b506102f26108ad366004613dcc565b612c2a565b3480156108bd575f80fd5b506103496108cc366004613dcc565b612c74565b3480156108dc575f80fd5b506103496108eb366004613dfe565b612d17565b6108f8612da4565b6001600160a01b0381165f908152609e602052604090205460ff16156109655760405162461bcd60e51b815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b6001600160a01b0381165f818152609e6020908152604091829020805460ff1916600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b6109ca612da4565b5f8111610a195760405162461bcd60e51b815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f0000000000000000000000604482015260640161095c565b5f80610a258585612dfe565b915091505f610a38836001015160c01c90565b5f81815260a060205260409020549091508214610a975760405162461bcd60e51b815260206004820152601460248201527f696e636f72726563742062617463682068617368000000000000000000000000604482015260640161095c565b5f60a081610aa587856140b0565b81526020019081526020015f205414610b255760405162461bcd60e51b8152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e6700000000000000000000000000000000000000000000000000000000606482015260840161095c565b609c548111610b9c5760405162461bcd60e51b815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f6800000000000000000000000000000000000000000000000000000000000000606482015260840161095c565b610ba76001826140c3565b609d555b8315610d2157604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a06020908152604080832083905560a3909152902060030154610100900460ff16610c5c575f81815260a360209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a49092528220805491929091610c4c9084906140b0565b909155505060a5805460ff191690555b5f81815260a36020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a75415801590610cd9575060a75481145b15610ce3575f60a7555b6001015f81815260a060205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610bab575b505050505050565b60a75415610d795760405162461bcd60e51b815260206004820152600b60248201527f6e65656420726576657274000000000000000000000000000000000000000000604482015260640161095c565b610d81612e19565b5f80610d8d8484612dfe565b915091505f610da0836001015160c01c90565b5f81815260a060205260409020549091508214610dff5760405162461bcd60e51b815260206004820152601460248201527f696e636f72726563742062617463682068617368000000000000000000000000604482015260640161095c565b610e08816111fe565b610e545760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f742065786973740000000000000000000000000000000000604482015260640161095c565b610e5d81612c2a565b15610eaa5760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e67650000000000000000000000000000604482015260640161095c565b5f81815260a3602052604090206003015460ff1615610f0b5760405162461bcd60e51b815260206004820152601660248201527f62617463682073686f756c642062652072657665727400000000000000000000604482015260640161095c565b5f81815260a16020526040902060010154421015610f6b5760405162461bcd60e51b815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f7700000000000000604482015260640161095c565b6059830151609f5f610f7e6001856140c3565b81526020019081526020015f205414610fd95760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f74000000604482015260640161095c565b5f818152609f6020526040902054156110345760405162461bcd60e51b815260206004820152601660248201527f626174636820616c726561647920766572696669656400000000000000000000604482015260640161095c565b80609c54600101146110885760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e6465780000000000000000000000604482015260640161095c565b609c819055600160a25f61109d866099015190565b815260208101919091526040015f20805460ff191691151591909117905560798301515f828152609f60205260409020556110ea60f98401601185015160c01c600986015160c01c612e6c565b60a15f6110f86001846140c3565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560a3919061113190846140c3565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a0909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d6111da866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a160205260408120541580159061122657505f82815260a0602052604090205415155b92915050565b60a7541561127c5760405162461bcd60e51b815260206004820152600b60248201527f6e65656420726576657274000000000000000000000000000000000000000000604482015260640161095c565b611284612e19565b5f806112908888612dfe565b915091505f6112a3836001015160c01c90565b5f81815260a0602052604090205490915082146113025760405162461bcd60e51b815260206004820152601460248201527f696e636f72726563742062617463682068617368000000000000000000000000604482015260640161095c565b61130b81612c2a565b6113575760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e67650000000000000000000000000000604482015260640161095c565b5f81815260a3602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a5805460ff1916905560995460029091015442916113b0916140b0565b11611426575f81815260a3602090815260408083206003908101805460ff1916600117905560a1835292819020909201548251808401909352600783527f54696d656f7574000000000000000000000000000000000000000000000000009183019190915261142191839190612f35565b611473565b6114338388888888613091565b61147381336040518060400160405280600d81526020017f50726f6f662073756363657373000000000000000000000000000000000000008152506133fc565b505050505050505050565b611486612da4565b5f8111801561149757506099548114155b6114e35760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f770000000000000000604482015260640161095c565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b611531612da4565b6001600160a01b0381165f908152609e602052604090205460ff166115985760405162461bcd60e51b815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e6765720000000000604482015260640161095c565b6001600160a01b0381165f818152609e60209081526040808320805460ff19169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991016109b7565b6115ee612da4565b6115f75f613489565b565b335f908152609e602052604090205460ff166116575760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f77656400000000000000604482015260640161095c565b60a754156116a75760405162461bcd60e51b815260206004820152600b60248201527f6e65656420726576657274000000000000000000000000000000000000000000604482015260640161095c565b6116af612e19565b60a55460ff16156117025760405162461bcd60e51b815260206004820152601460248201527f616c726561647920696e206368616c6c656e6765000000000000000000000000604482015260640161095c565b8067ffffffffffffffff16609c541061175d5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c72656164792066696e616c697a6564000000000000000000604482015260640161095c565b67ffffffffffffffff81165f90815260a0602052604081205490036117c45760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f742065786973740000000000000000000000000000000000604482015260640161095c565b67ffffffffffffffff81165f90815260a360205260409020546801000000000000000090046001600160a01b03161561183f5760405162461bcd60e51b815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e6765640000000000000000604482015260640161095c565b67ffffffffffffffff81165f90815260a1602052604090206001015442106118cf5760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f7700000000000000000000000000606482015260840161095c565b60975f9054906101000a90046001600160a01b03166001600160a01b0316630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561191f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061194391906140d6565b3410156119925760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742076616c75650000000000000000000000000000604482015260640161095c565b67ffffffffffffffff81811660a68190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a3909552969096209451855492516001600160a01b031668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092179290921790556001600160a01b03168167ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b997634604051611ae491815260200190565b60405180910390a35f609c546001611afc91906140b0565b90505b609d548111611b54578167ffffffffffffffff168114611b42576099545f82815260a1602052604081206001018054909190611b3c9084906140b0565b90915550505b80611b4c816140ed565b915050611aff565b505060a5805460ff19166001179055565b611b6d612da4565b6001600160a01b03811615801590611b935750609b546001600160a01b03828116911614155b611bdf5760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206e6577207665726966696572000000000000000000000000604482015260640161095c565b609b80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b5f54610100900460ff1615808015611c6657505f54600160ff909116105b80611c7f5750303b158015611c7f57505f5460ff166001145b611cf15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161095c565b5f805460ff191660011790558015611d2f575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0385161580611d4c57506001600160a01b038416155b15611d83576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038616611dd95760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e74726163740000000000604482015260640161095c565b611de16134f2565b611de9613576565b609780546001600160a01b038089167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609a8054888416908316179055609b80549287169290911682179055609884905560998390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018590527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a18015610d21575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b611f53612da4565b5f8052609f6020527fa705961f203609058950cfd817eb7a7627c9e270651c936aad3abdfa253727ec5415611fca5760405162461bcd60e51b815260206004820152601660248201527f67656e6573697320626174636820696d706f7274656400000000000000000000604482015260640161095c565b5f80611fd68484612dfe565b915091505f611fe9836001015160c01c90565b90505f611ff7846079015190565b9050806120465760405162461bcd60e51b815260206004820152600f60248201527f7a65726f20737461746520726f6f740000000000000000000000000000000000604482015260640161095c565b600984015160c01c1561209b5760405162461bcd60e51b815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c642062652030000000604482015260640161095c565b5f6120a7856019015190565b036120f45760405162461bcd60e51b815260206004820152600e60248201527f7a65726f20646174612068617368000000000000000000000000000000000000604482015260640161095c565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014612120856039015190565b1461216d5760405162461bcd60e51b815260206004820152601660248201527f696e76616c69642076657273696f6e6564206861736800000000000000000000604482015260640161095c565b5f82815260a0602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a18652848720935184559151600184015551600283015551600390910155609f909152808220839055609d849055609c84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b61224b612da4565b801561232e576122596135fa565b60a55460ff161561232b5760a6545f90815260a360209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a490925282208054919290916122ad9084906140b0565b909155505060a6545f90815260a36020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a5805460ff191690555b50565b61232b613654565b335f90815260a46020526040812054908190036123955760405162461bcd60e51b815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e676552657761726400000000604482015260640161095c565b335f90815260a460205260408120556123ae828261368d565b5050565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561241e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124429190614124565b61248e5760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f776564000000000000604482015260640161095c565b60a754156124de5760405162461bcd60e51b815260206004820152600b60248201527f6e65656420726576657274000000000000000000000000000000000000000000604482015260640161095c565b6124e6612e19565b6124f3602083018361413f565b60ff16156125435760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642076657273696f6e0000000000000000000000000000000000604482015260640161095c565b5f612551604084018461415f565b915050806125a15760405162461bcd60e51b815260206004820152600e60248201527f626174636820697320656d707479000000000000000000000000000000000000604482015260640161095c565b60808301356125f25760405162461bcd60e51b815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f0000000000604482015260640161095c565b60a08301356126435760405162461bcd60e51b815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f00000000000000000000604482015260640161095c565b5f8061265a612655602087018761415f565b612dfe565b915091505f61266d836001015160c01c90565b5f81815260a0602052604090205490915082146126cc5760405162461bcd60e51b815260206004820152601b60248201527f696e636f727265637420706172656e7420626174636820686173680000000000604482015260640161095c565b5f60a0816126db8460016140b0565b81526020019081526020015f2054146127365760405162461bcd60e51b815260206004820152601760248201527f626174636820616c726561647920636f6d6d6974746564000000000000000000604482015260640161095c565b609d5481146127875760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e6465780000000000000000000000604482015260640161095c565b5f612796846011015160c01c90565b90505f80806127f56127ab60408c018c61415f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508792508891506127f0905060608f018f61415f565b613737565b94850194938401939250905061280e60608b018b61415f565b905061010060ff850104602002146128685760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206269746d6170206c656e67746800000000000000000000000000604482015260640161095c565b600194909401935f80491561287e575f496128a0565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b90505f6128b060608d018d61415f565b6128bc915060f96140b0565b905060405198506020810289016040526128ea898d5f0160208101906128e2919061413f565b60ff166138c5565b60c087811b60018b015285811b60098b015286811b60118b015260198a0184905260808d013560598b015260a08d013560798b01528c013560998a01526129578961293860208e018e61415f565b6040516129469291906141c0565b604051809103902060b99190910152565b60d989018890526129748961296f60608f018f61415f565b6138cc565b6039890182905280892060a05f8981526020019081526020015f20819055506040518060800160405280428152602001609854426129b291906140b0565b8152602001612a038e80604001906129ca919061415f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506138d892505050565b81526097546020909101906001600160a01b031663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612a77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a9b91906140d6565b90525f88815260a1602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609d8890556097546001600160a01b031691506374fe27b7908c3590612b0290612afc908f018f61415f565b5f61392f565b5f8e8060400190612b13919061415f565b6040518663ffffffff1660e01b8152600401612b33959493929190614216565b602060405180830381865afa158015612b4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b729190614124565b612be45760405162461bcd60e51b815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161095c565b5f86815260a06020526040808220549051909188917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050505050565b5f81815260a360205260408120546801000000000000000090046001600160a01b0316158015906112265750505f90815260a36020526040902060030154610100900460ff161590565b612c7c612da4565b5f81118015612c8d57506098548114155b612cd95760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f640000000000604482015260640161095c565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910161151d565b612d1f612da4565b6001600160a01b038116612d9b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161095c565b61232b81613489565b6033546001600160a01b031633146115f75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161095c565b5f805f612e0b8585613983565b812090969095509350505050565b60655460ff16156115f75760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161095c565b805f03612e7857505050565b8082035f805b83811015610d2157610100818503811115612e9857508084035b8651609a546040517f55f613ce0000000000000000000000000000000000000000000000000000000081526004810187905260248101849052604481018390526020909901989194506001600160a01b0316906355f613ce906064015f604051808303815f87803b158015612f0b575f80fd5b505af1158015612f1d573d5f803e3d5ffd5b50505050610100840193505061010081019050612e7e565b60a78390555f83815260a360205260408082205460975491517f45bc4d1000000000000000000000000000000000000000000000000000000000815260048101869052680100000000000000009091046001600160a01b03908116939216906345bc4d10906024016020604051808303815f875af1158015612fb9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fdd91906140d6565b5f86815260a36020526040902060010154909150612ffc9082906140b0565b5f86815260a360209081526040808320546801000000000000000090046001600160a01b0316835260a49091528120805490919061303b9084906140b0565b909155505060405161304e9084906142ab565b604051908190038120906001600160a01b0384169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b826130de5760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964206167677265676174696f6e2070726f6f6600000000000000604482015260640161095c565b60a0811461312e5760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964204b5a4720646174612070726f6f6600000000000000000000604482015260640161095c565b5f61313d866001015160c01c90565b90505f61314b876039015190565b90505f80600a6001600160a01b031683878760405160200161316f939291906142c6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526131a7916142ab565b5f60405180830381855afa9150503d805f81146131df576040519150601f19603f3d011682016040523d82523d5f602084013e6131e4565b606091505b50915091508161325c5760405162461bcd60e51b815260206004820152602a60248201527f6661696c656420746f2063616c6c20706f696e74206576616c756174696f6e2060448201527f707265636f6d70696c6500000000000000000000000000000000000000000000606482015260840161095c565b5f8180602001905181019061327191906142df565b9150507f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff0000000181146132e35760405162461bcd60e51b815260206004820152601c60248201527f707265636f6d70696c6520756e6578706563746564206f757470757400000000604482015260640161095c565b5050505f7f0000000000000000000000000000000000000000000000000000000000000000613313896059015190565b60798a015160998b015160b98c015160198d015161333460405f8c8e614301565b8960405160200161334d99989796959493929190614328565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609b549091506001600160a01b0316632c09a8486133a28a5160f81c90565b858a8a866040518663ffffffff1660e01b81526004016133c695949392919061438b565b5f6040518083038186803b1580156133dc575f80fd5b505afa1580156133ee573d5f803e3d5ffd5b505050505050505050505050565b5f83815260a360209081526040808320600101546001600160a01b038616845260a490925282208054919283926134349084906140b0565b90915550506040516134479083906142ab565b604051908190038120906001600160a01b0385169086907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a450505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff1661356e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161095c565b6115f7613a5a565b5f54610100900460ff166135f25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161095c565b6115f7613ae2565b613602612e19565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586136373390565b6040516001600160a01b03909116815260200160405180910390a1565b61365c613b67565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613637565b80156123ae575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146136dc576040519150601f19603f3d011682016040523d82523d5f602084013e6136e1565b606091505b50509050806137325760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c65640000000000604482015260640161095c565b505050565b60405185515f91829160208901919081908490613755908590613bb9565b90505f5b818110156137e057603c8102850160018101518452602101517fffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000166020840152603a830192505f6137ab603c836143bc565b6137b68760026140b0565b6137c091906140b0565b90505f6137d182603a015160f01c90565b97909701965050600101613759565b506020850282016040526001840193505b80156138b1575f61380685603a015160f01c90565b905061381683828d8d8d8d613c4e565b92505f613827866038015160f01c90565b9050818110156138795760405162461bcd60e51b815260206004820152601d60248201527f6e756d20747873206c657373207468616e206e756d204c31206d736773000000604482015260640161095c565b50998a01999890980197603c93909301927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016137f1565b508190039020989197509095505050505050565b8082535050565b808260f9850137505050565b5f805f6020840190506001810191505f6138f3828651613bb9565b90505f5b6139026001836140c3565b81101561391857603c93909301926001016138f7565b505f613925845160c01c90565b9695505050505050565b60605f80808080613942888a018a6144c0565b955095509550955095505081871061396057945061397c9350505050565b83871061397457829550505050505061397c565b509293505050505b9392505050565b5f8160f98110156139d65760405162461bcd60e51b815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c000000604482015260640161095c565b6040519150808483378082016040525f6139f4836009015160c01c90565b905061010060ff82010460200260f9018214613a525760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206269746d6170206c656e67746800000000000000000000000000604482015260640161095c565b509250929050565b5f54610100900460ff16613ad65760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161095c565b6065805460ff19169055565b5f54610100900460ff16613b5e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161095c565b6115f733613489565b60655460ff166115f75760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161095c565b5f613bc5835160f81c90565b9050805f03613c00576040517f5168407700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c0b603c826143bc565b613c169060026140b0565b8214611226576040517f4a969e2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f855f03613c5d575085613925565b609a546001600160a01b03165f80805b89811015613d435760ff89169150600889901c811580613c8b575082155b15613c9a578060200288013593505b600184841c165f03613d32576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018a90525f906001600160a01b0387169063ae453cd590602401602060405180830381865afa158015613d04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d2891906140d6565b8d52506020909b019a5b506001988901989788019701613c6d565b505060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88011681811c60011615613dbe5760405162461bcd60e51b815260206004820152601b60248201527f63616e6e6f7420736b6970206c617374204c31206d6573736167650000000000604482015260640161095c565b509798975050505050505050565b5f60208284031215613ddc575f80fd5b5035919050565b80356001600160a01b0381168114613df9575f80fd5b919050565b5f60208284031215613e0e575f80fd5b61397c82613de3565b5f8083601f840112613e27575f80fd5b50813567ffffffffffffffff811115613e3e575f80fd5b602083019150836020828501011115613e55575f80fd5b9250929050565b5f805f60408486031215613e6e575f80fd5b833567ffffffffffffffff811115613e84575f80fd5b613e9086828701613e17565b909790965060209590950135949350505050565b5f8060208385031215613eb5575f80fd5b823567ffffffffffffffff811115613ecb575f80fd5b613ed785828601613e17565b90969095509350505050565b5f805f805f8060608789031215613ef8575f80fd5b863567ffffffffffffffff80821115613f0f575f80fd5b613f1b8a838b01613e17565b90985096506020890135915080821115613f33575f80fd5b613f3f8a838b01613e17565b90965094506040890135915080821115613f57575f80fd5b50613f6489828a01613e17565b979a9699509497509295939492505050565b5f60208284031215613f86575f80fd5b813567ffffffffffffffff8116811461397c575f80fd5b5f805f805f60a08688031215613fb1575f80fd5b613fba86613de3565b9450613fc860208701613de3565b9350613fd660408701613de3565b94979396509394606081013594506080013592915050565b801515811461232b575f80fd5b5f6020828403121561400b575f80fd5b813561397c81613fee565b5f8060408385031215614027575f80fd5b823567ffffffffffffffff8082111561403e575f80fd5b9084019060e08287031215614051575f80fd5b90925060208401359080821115614066575f80fd5b50830160608186031215614078575f80fd5b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561122657611226614083565b8181038181111561122657611226614083565b5f602082840312156140e6575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361411d5761411d614083565b5060010190565b5f60208284031215614134575f80fd5b815161397c81613fee565b5f6020828403121561414f575f80fd5b813560ff8116811461397c575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614192575f80fd5b83018035915067ffffffffffffffff8211156141ac575f80fd5b602001915036819003821315613e55575f80fd5b818382375f9101908152919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b818110156142605784516001600160a01b03168352938301939183019160010161423b565b5050876040860152848103606086015261427b8187896141cf565b9a9950505050505050505050565b5f5b838110156142a357818101518382015260200161428b565b50505f910152565b5f82516142bc818460208701614289565b9190910192915050565b838152818360208301375f910160200190815292915050565b5f80604083850312156142f0575f80fd5b505080516020909101519092909150565b5f808585111561430f575f80fd5b8386111561431b575f80fd5b5050820193919092039150565b7fffffffffffffffff0000000000000000000000000000000000000000000000008a60c01b168152886008820152876028820152866048820152856068820152846088820152828460a883013760a892019182015260c801979650505050505050565b858152846020820152608060408201525f6143aa6080830185876141cf565b90508260608301529695505050505050565b808202811582820484141761122657611226614083565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f83011261440f575f80fd5b8135602067ffffffffffffffff8083111561442c5761442c6143d3565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110848211171561446f5761446f6143d3565b604052938452602081870181019490810192508785111561448e575f80fd5b6020870191505b848210156144b5576144a682613de3565b83529183019190830190614495565b979650505050505050565b5f805f805f8060c087890312156144d5575f80fd5b86359550602087013567ffffffffffffffff808211156144f3575f80fd5b6144ff8a838b01614400565b965060408901359550606089013591508082111561451b575f80fd5b6145278a838b01614400565b94506080890135935060a0890135915080821115614543575f80fd5b5061455089828a01614400565b915050929550929550929556fea164736f6c6343000818000a +0x6080604052600436106102b9575f3560e01c8063715018a611610170578063abc8d68d116100d1578063d279c19111610087578063de8b303511610062578063de8b303514610893578063e3fff1dd146108b2578063f2fde38b146108d1575f80fd5b8063d279c19114610842578063d63b354914610861578063ddd8a3dc14610874575f80fd5b8063b3e0a509116100b7578063b3e0a509146107ef578063bedb86fb1461080e578063ce5db8d61461082d575f80fd5b8063abc8d68d146107af578063b31a77d3146107da575f80fd5b8063910129d411610126578063a415d8dc1161010c578063a415d8dc1461074d578063a479265d1461077b578063a6b63eb814610790575f80fd5b8063910129d4146106fd57806397fc007c1461072e575f80fd5b80638d644bb7116101565780638d644bb71461061d5780638da5cb5b146106305780638f1d37761461064d575f80fd5b8063715018a6146105f057806388b1ea0914610604575f80fd5b80632362f03e1161021a57806357e0af6c116101d05780635ef7a94a116101b65780635ef7a94a146105255780635f77cf1d146105855780636c578c1d146105d1575f80fd5b806357e0af6c146104ef5780635c975abb1461050e575f80fd5b80632b7ac3f3116102005780632b7ac3f31461047a5780633b70c18a146104b157806345792427146104d0575f80fd5b80632362f03e146104245780632571098d1461044f575f80fd5b8063121dcd501161026f57806318463fb01161025557806318463fb0146103c057806318af3b2b146103d557806321e2f9e014610405575f80fd5b8063121dcd501461038c57806313361101146103a1575f80fd5b80630ceb67801161029f5780630ceb67801461032a57806310d445831461034b578063116a1f421461036a575f80fd5b806304d77215146102c4578063059def6114610307575f80fd5b366102c057005b5f80fd5b3480156102cf575f80fd5b506102f26102de366004613dbf565b60a26020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610312575f80fd5b5061031c609c5481565b6040519081526020016102fe565b348015610335575f80fd5b50610349610344366004613df1565b6108f0565b005b348015610356575f80fd5b50610349610365366004613e4f565b6109c2565b348015610375575f80fd5b506102f2610384366004613dbf565b609c54101590565b348015610397575f80fd5b5061031c609d5481565b3480156103ac575f80fd5b506103496103bb366004613e97565b610d29565b3480156103cb575f80fd5b5061031c60a65481565b3480156103e0575f80fd5b506102f26103ef366004613dbf565b5f90815260a16020526040902060010154421090565b348015610410575f80fd5b506102f261041f366004613dbf565b6111fe565b34801561042f575f80fd5b5061031c61043e366004613dbf565b60a06020525f908152604090205481565b34801561045a575f80fd5b5061031c610469366004613dbf565b609f6020525f908152604090205481565b348015610485575f80fd5b50609b54610499906001600160a01b031681565b6040516001600160a01b0390911681526020016102fe565b3480156104bc575f80fd5b50609a54610499906001600160a01b031681565b3480156104db575f80fd5b506103496104ea366004613ed6565b61122c565b3480156104fa575f80fd5b50610349610509366004613dbf565b61147e565b348015610519575f80fd5b5060655460ff166102f2565b348015610530575f80fd5b5061056561053f366004613dbf565b60a16020525f908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016102fe565b348015610590575f80fd5b506105b87f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff90911681526020016102fe565b3480156105dc575f80fd5b506103496105eb366004613df1565b611529565b3480156105fb575f80fd5b506103496115e6565b34801561060f575f80fd5b5060a5546102f29060ff1681565b61034961062b366004613f69565b6115f9565b34801561063b575f80fd5b506033546001600160a01b0316610499565b348015610658575f80fd5b506106b9610667366004613dbf565b60a36020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff831693680100000000000000009093046001600160a01b0316929060ff8082169161010090041686565b6040805167ffffffffffffffff90971687526001600160a01b03909516602087015293850192909252606084015215156080830152151560a082015260c0016102fe565b348015610708575f80fd5b506102f2610717366004613dbf565b5f90815260a3602052604090206003015460ff1690565b348015610739575f80fd5b50610349610748366004613df1565b611b65565b348015610758575f80fd5b506102f2610767366004613df1565b609e6020525f908152604090205460ff1681565b348015610786575f80fd5b5061031c60995481565b34801561079b575f80fd5b506103496107aa366004613f90565b611c48565b3480156107ba575f80fd5b5061031c6107c9366004613df1565b60a46020525f908152604090205481565b3480156107e5575f80fd5b5061031c60a75481565b3480156107fa575f80fd5b50610349610809366004613e97565b611f4b565b348015610819575f80fd5b50610349610828366004613fee565b612243565b348015610838575f80fd5b5061031c60985481565b34801561084d575f80fd5b5061034961085c366004613df1565b612336565b61034961086f366004614009565b6123b2565b34801561087f575f80fd5b50609754610499906001600160a01b031681565b34801561089e575f80fd5b506102f26108ad366004613dbf565b612c2a565b3480156108bd575f80fd5b506103496108cc366004613dbf565b612c74565b3480156108dc575f80fd5b506103496108eb366004613df1565b612d17565b6108f8612da4565b6001600160a01b0381165f908152609e602052604090205460ff16156109655760405162461bcd60e51b815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b6001600160a01b0381165f818152609e6020908152604091829020805460ff1916600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b6109ca612da4565b5f8111610a195760405162461bcd60e51b815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f0000000000000000000000604482015260640161095c565b5f80610a258585612dfe565b915091505f610a38836001015160c01c90565b5f81815260a060205260409020549091508214610a975760405162461bcd60e51b815260206004820152601460248201527f696e636f72726563742062617463682068617368000000000000000000000000604482015260640161095c565b5f60a081610aa587856140a3565b81526020019081526020015f205414610b255760405162461bcd60e51b8152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e6700000000000000000000000000000000000000000000000000000000606482015260840161095c565b609c548111610b9c5760405162461bcd60e51b815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f6800000000000000000000000000000000000000000000000000000000000000606482015260840161095c565b610ba76001826140b6565b609d555b8315610d2157604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a06020908152604080832083905560a3909152902060030154610100900460ff16610c5c575f81815260a360209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a49092528220805491929091610c4c9084906140a3565b909155505060a5805460ff191690555b5f81815260a36020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a75415801590610cd9575060a75481145b15610ce3575f60a7555b6001015f81815260a060205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610bab575b505050505050565b60a75415610d795760405162461bcd60e51b815260206004820152600b60248201527f6e65656420726576657274000000000000000000000000000000000000000000604482015260640161095c565b610d81612e19565b5f80610d8d8484612dfe565b915091505f610da0836001015160c01c90565b5f81815260a060205260409020549091508214610dff5760405162461bcd60e51b815260206004820152601460248201527f696e636f72726563742062617463682068617368000000000000000000000000604482015260640161095c565b610e08816111fe565b610e545760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f742065786973740000000000000000000000000000000000604482015260640161095c565b610e5d81612c2a565b15610eaa5760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e67650000000000000000000000000000604482015260640161095c565b5f81815260a3602052604090206003015460ff1615610f0b5760405162461bcd60e51b815260206004820152601660248201527f62617463682073686f756c642062652072657665727400000000000000000000604482015260640161095c565b5f81815260a16020526040902060010154421015610f6b5760405162461bcd60e51b815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f7700000000000000604482015260640161095c565b6059830151609f5f610f7e6001856140b6565b81526020019081526020015f205414610fd95760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f74000000604482015260640161095c565b5f818152609f6020526040902054156110345760405162461bcd60e51b815260206004820152601660248201527f626174636820616c726561647920766572696669656400000000000000000000604482015260640161095c565b80609c54600101146110885760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e6465780000000000000000000000604482015260640161095c565b609c819055600160a25f61109d866099015190565b815260208101919091526040015f20805460ff191691151591909117905560798301515f828152609f60205260409020556110ea60f98401601185015160c01c600986015160c01c612e6c565b60a15f6110f86001846140b6565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560a3919061113190846140b6565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a0909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d6111da866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a160205260408120541580159061122657505f82815260a0602052604090205415155b92915050565b60a7541561127c5760405162461bcd60e51b815260206004820152600b60248201527f6e65656420726576657274000000000000000000000000000000000000000000604482015260640161095c565b611284612e19565b5f806112908888612dfe565b915091505f6112a3836001015160c01c90565b5f81815260a0602052604090205490915082146113025760405162461bcd60e51b815260206004820152601460248201527f696e636f72726563742062617463682068617368000000000000000000000000604482015260640161095c565b61130b81612c2a565b6113575760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e67650000000000000000000000000000604482015260640161095c565b5f81815260a3602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a5805460ff1916905560995460029091015442916113b0916140a3565b11611426575f81815260a3602090815260408083206003908101805460ff1916600117905560a1835292819020909201548251808401909352600783527f54696d656f7574000000000000000000000000000000000000000000000000009183019190915261142191839190612f35565b611473565b6114338388888888613091565b61147381336040518060400160405280600d81526020017f50726f6f662073756363657373000000000000000000000000000000000000008152506133fc565b505050505050505050565b611486612da4565b5f8111801561149757506099548114155b6114e35760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f770000000000000000604482015260640161095c565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b611531612da4565b6001600160a01b0381165f908152609e602052604090205460ff166115985760405162461bcd60e51b815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e6765720000000000604482015260640161095c565b6001600160a01b0381165f818152609e60209081526040808320805460ff19169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991016109b7565b6115ee612da4565b6115f75f613489565b565b335f908152609e602052604090205460ff166116575760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f77656400000000000000604482015260640161095c565b60a754156116a75760405162461bcd60e51b815260206004820152600b60248201527f6e65656420726576657274000000000000000000000000000000000000000000604482015260640161095c565b6116af612e19565b60a55460ff16156117025760405162461bcd60e51b815260206004820152601460248201527f616c726561647920696e206368616c6c656e6765000000000000000000000000604482015260640161095c565b8067ffffffffffffffff16609c541061175d5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c72656164792066696e616c697a6564000000000000000000604482015260640161095c565b67ffffffffffffffff81165f90815260a0602052604081205490036117c45760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f742065786973740000000000000000000000000000000000604482015260640161095c565b67ffffffffffffffff81165f90815260a360205260409020546801000000000000000090046001600160a01b03161561183f5760405162461bcd60e51b815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e6765640000000000000000604482015260640161095c565b67ffffffffffffffff81165f90815260a1602052604090206001015442106118cf5760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f7700000000000000000000000000606482015260840161095c565b60975f9054906101000a90046001600160a01b03166001600160a01b0316630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561191f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061194391906140c9565b3410156119925760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742076616c75650000000000000000000000000000604482015260640161095c565b67ffffffffffffffff81811660a68190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a3909552969096209451855492516001600160a01b031668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092179290921790556001600160a01b03168167ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b997634604051611ae491815260200190565b60405180910390a35f609c546001611afc91906140a3565b90505b609d548111611b54578167ffffffffffffffff168114611b42576099545f82815260a1602052604081206001018054909190611b3c9084906140a3565b90915550505b80611b4c816140e0565b915050611aff565b505060a5805460ff19166001179055565b611b6d612da4565b6001600160a01b03811615801590611b935750609b546001600160a01b03828116911614155b611bdf5760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206e6577207665726966696572000000000000000000000000604482015260640161095c565b609b80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b5f54610100900460ff1615808015611c6657505f54600160ff909116105b80611c7f5750303b158015611c7f57505f5460ff166001145b611cf15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161095c565b5f805460ff191660011790558015611d2f575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0385161580611d4c57506001600160a01b038416155b15611d83576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038616611dd95760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e74726163740000000000604482015260640161095c565b611de16134f2565b611de9613576565b609780546001600160a01b038089167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609a8054888416908316179055609b80549287169290911682179055609884905560998390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018590527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a18015610d21575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b611f53612da4565b5f8052609f6020527fa705961f203609058950cfd817eb7a7627c9e270651c936aad3abdfa253727ec5415611fca5760405162461bcd60e51b815260206004820152601660248201527f67656e6573697320626174636820696d706f7274656400000000000000000000604482015260640161095c565b5f80611fd68484612dfe565b915091505f611fe9836001015160c01c90565b90505f611ff7846079015190565b9050806120465760405162461bcd60e51b815260206004820152600f60248201527f7a65726f20737461746520726f6f740000000000000000000000000000000000604482015260640161095c565b600984015160c01c1561209b5760405162461bcd60e51b815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c642062652030000000604482015260640161095c565b5f6120a7856019015190565b036120f45760405162461bcd60e51b815260206004820152600e60248201527f7a65726f20646174612068617368000000000000000000000000000000000000604482015260640161095c565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014612120856039015190565b1461216d5760405162461bcd60e51b815260206004820152601660248201527f696e76616c69642076657273696f6e6564206861736800000000000000000000604482015260640161095c565b5f82815260a0602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a18652848720935184559151600184015551600283015551600390910155609f909152808220839055609d849055609c84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b61224b612da4565b801561232e576122596135fa565b60a55460ff161561232b5760a6545f90815260a360209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a490925282208054919290916122ad9084906140a3565b909155505060a6545f90815260a36020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a5805460ff191690555b50565b61232b613654565b335f90815260a46020526040812054908190036123955760405162461bcd60e51b815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e676552657761726400000000604482015260640161095c565b335f90815260a460205260408120556123ae828261368d565b5050565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561241e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124429190614117565b61248e5760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f776564000000000000604482015260640161095c565b60a754156124de5760405162461bcd60e51b815260206004820152600b60248201527f6e65656420726576657274000000000000000000000000000000000000000000604482015260640161095c565b6124e6612e19565b6124f36020830183614132565b60ff16156125435760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642076657273696f6e0000000000000000000000000000000000604482015260640161095c565b5f6125516040840184614152565b915050806125a15760405162461bcd60e51b815260206004820152600e60248201527f626174636820697320656d707479000000000000000000000000000000000000604482015260640161095c565b60808301356125f25760405162461bcd60e51b815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f0000000000604482015260640161095c565b60a08301356126435760405162461bcd60e51b815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f00000000000000000000604482015260640161095c565b5f8061265a6126556020870187614152565b612dfe565b915091505f61266d836001015160c01c90565b5f81815260a0602052604090205490915082146126cc5760405162461bcd60e51b815260206004820152601b60248201527f696e636f727265637420706172656e7420626174636820686173680000000000604482015260640161095c565b5f60a0816126db8460016140a3565b81526020019081526020015f2054146127365760405162461bcd60e51b815260206004820152601760248201527f626174636820616c726561647920636f6d6d6974746564000000000000000000604482015260640161095c565b609d5481146127875760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e6465780000000000000000000000604482015260640161095c565b5f612796846011015160c01c90565b90505f80806127f56127ab60408c018c614152565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508792508891506127f0905060608f018f614152565b613737565b94850194938401939250905061280e60608b018b614152565b905061010060ff850104602002146128685760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206269746d6170206c656e67746800000000000000000000000000604482015260640161095c565b600194909401935f80491561287e575f496128a0565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b90505f6128b060608d018d614152565b6128bc915060f96140a3565b905060405198506020810289016040526128ea898d5f0160208101906128e29190614132565b60ff166138b8565b60c087811b60018b015285811b60098b015286811b60118b015260198a0184905260808d013560598b015260a08d013560798b01528c013560998a01526129578961293860208e018e614152565b6040516129469291906141b3565b604051809103902060b99190910152565b60d989018890526129748961296f60608f018f614152565b6138bf565b6039890182905280892060a05f8981526020019081526020015f20819055506040518060800160405280428152602001609854426129b291906140a3565b8152602001612a038e80604001906129ca9190614152565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506138cb92505050565b81526097546020909101906001600160a01b031663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612a77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a9b91906140c9565b90525f88815260a1602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609d8890556097546001600160a01b031691506374fe27b7908c3590612b0290612afc908f018f614152565b5f613922565b5f8e8060400190612b139190614152565b6040518663ffffffff1660e01b8152600401612b33959493929190614209565b602060405180830381865afa158015612b4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b729190614117565b612be45760405162461bcd60e51b815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161095c565b5f86815260a06020526040808220549051909188917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050505050565b5f81815260a360205260408120546801000000000000000090046001600160a01b0316158015906112265750505f90815260a36020526040902060030154610100900460ff161590565b612c7c612da4565b5f81118015612c8d57506098548114155b612cd95760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f640000000000604482015260640161095c565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910161151d565b612d1f612da4565b6001600160a01b038116612d9b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161095c565b61232b81613489565b6033546001600160a01b031633146115f75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161095c565b5f805f612e0b8585613976565b812090969095509350505050565b60655460ff16156115f75760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161095c565b805f03612e7857505050565b8082035f805b83811015610d2157610100818503811115612e9857508084035b8651609a546040517f55f613ce0000000000000000000000000000000000000000000000000000000081526004810187905260248101849052604481018390526020909901989194506001600160a01b0316906355f613ce906064015f604051808303815f87803b158015612f0b575f80fd5b505af1158015612f1d573d5f803e3d5ffd5b50505050610100840193505061010081019050612e7e565b60a78390555f83815260a360205260408082205460975491517f45bc4d1000000000000000000000000000000000000000000000000000000000815260048101869052680100000000000000009091046001600160a01b03908116939216906345bc4d10906024016020604051808303815f875af1158015612fb9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fdd91906140c9565b5f86815260a36020526040902060010154909150612ffc9082906140a3565b5f86815260a360209081526040808320546801000000000000000090046001600160a01b0316835260a49091528120805490919061303b9084906140a3565b909155505060405161304e90849061429e565b604051908190038120906001600160a01b0384169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b826130de5760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964206167677265676174696f6e2070726f6f6600000000000000604482015260640161095c565b60a0811461312e5760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964204b5a4720646174612070726f6f6600000000000000000000604482015260640161095c565b5f61313d866001015160c01c90565b90505f61314b876039015190565b90505f80600a6001600160a01b031683878760405160200161316f939291906142b9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526131a79161429e565b5f60405180830381855afa9150503d805f81146131df576040519150601f19603f3d011682016040523d82523d5f602084013e6131e4565b606091505b50915091508161325c5760405162461bcd60e51b815260206004820152602a60248201527f6661696c656420746f2063616c6c20706f696e74206576616c756174696f6e2060448201527f707265636f6d70696c6500000000000000000000000000000000000000000000606482015260840161095c565b5f8180602001905181019061327191906142d2565b9150507f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff0000000181146132e35760405162461bcd60e51b815260206004820152601c60248201527f707265636f6d70696c6520756e6578706563746564206f757470757400000000604482015260640161095c565b5050505f7f0000000000000000000000000000000000000000000000000000000000000000613313896059015190565b60798a015160998b015160b98c015160198d015161333460405f8c8e6142f4565b8960405160200161334d9998979695949392919061431b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609b549091506001600160a01b0316632c09a8486133a28a5160f81c90565b858a8a866040518663ffffffff1660e01b81526004016133c695949392919061437e565b5f6040518083038186803b1580156133dc575f80fd5b505afa1580156133ee573d5f803e3d5ffd5b505050505050505050505050565b5f83815260a360209081526040808320600101546001600160a01b038616845260a490925282208054919283926134349084906140a3565b909155505060405161344790839061429e565b604051908190038120906001600160a01b0385169086907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a450505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff1661356e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161095c565b6115f7613a4d565b5f54610100900460ff166135f25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161095c565b6115f7613ad5565b613602612e19565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586136373390565b6040516001600160a01b03909116815260200160405180910390a1565b61365c613b5a565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613637565b80156123ae575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146136dc576040519150601f19603f3d011682016040523d82523d5f602084013e6136e1565b606091505b50509050806137325760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c65640000000000604482015260640161095c565b505050565b60405185515f91829160208901919081908490613755908590613bac565b90506002840193505f5b818110156137d957603c81028501805184526020908101517fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001690840152603a830192505f6137af603c836143af565b6137b990876140a3565b90505f6137ca82603a015160f01c90565b9790970196505060010161375f565b506020850282016040525b80156138a4575f6137f985603a015160f01c90565b905061380983828d8d8d8d613c41565b92505f61381a866038015160f01c90565b90508181101561386c5760405162461bcd60e51b815260206004820152601d60248201527f6e756d20747873206c657373207468616e206e756d204c31206d736773000000604482015260640161095c565b50998a01999890980197603c93909301927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016137e4565b508190039020989197509095505050505050565b8082535050565b808260f9850137505050565b5f805f6020840190506001810191505f6138e6828651613bac565b90505f5b6138f56001836140b6565b81101561390b57603c93909301926001016138ea565b505f613918845160c01c90565b9695505050505050565b60605f80808080613935888a018a6144b3565b955095509550955095505081871061395357945061396f9350505050565b83871061396757829550505050505061396f565b509293505050505b9392505050565b5f8160f98110156139c95760405162461bcd60e51b815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c000000604482015260640161095c565b6040519150808483378082016040525f6139e7836009015160c01c90565b905061010060ff82010460200260f9018214613a455760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206269746d6170206c656e67746800000000000000000000000000604482015260640161095c565b509250929050565b5f54610100900460ff16613ac95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161095c565b6065805460ff19169055565b5f54610100900460ff16613b515760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161095c565b6115f733613489565b60655460ff166115f75760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161095c565b5f613bb8835160f01c90565b9050805f03613bf3576040517f5168407700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613bfe603c826143af565b613c099060026140a3565b8214611226576040517f4a969e2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f855f03613c50575085613918565b609a546001600160a01b03165f80805b89811015613d365760ff89169150600889901c811580613c7e575082155b15613c8d578060200288013593505b600184841c165f03613d25576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018a90525f906001600160a01b0387169063ae453cd590602401602060405180830381865afa158015613cf7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d1b91906140c9565b8d52506020909b019a5b506001988901989788019701613c60565b505060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88011681811c60011615613db15760405162461bcd60e51b815260206004820152601b60248201527f63616e6e6f7420736b6970206c617374204c31206d6573736167650000000000604482015260640161095c565b509798975050505050505050565b5f60208284031215613dcf575f80fd5b5035919050565b80356001600160a01b0381168114613dec575f80fd5b919050565b5f60208284031215613e01575f80fd5b61396f82613dd6565b5f8083601f840112613e1a575f80fd5b50813567ffffffffffffffff811115613e31575f80fd5b602083019150836020828501011115613e48575f80fd5b9250929050565b5f805f60408486031215613e61575f80fd5b833567ffffffffffffffff811115613e77575f80fd5b613e8386828701613e0a565b909790965060209590950135949350505050565b5f8060208385031215613ea8575f80fd5b823567ffffffffffffffff811115613ebe575f80fd5b613eca85828601613e0a565b90969095509350505050565b5f805f805f8060608789031215613eeb575f80fd5b863567ffffffffffffffff80821115613f02575f80fd5b613f0e8a838b01613e0a565b90985096506020890135915080821115613f26575f80fd5b613f328a838b01613e0a565b90965094506040890135915080821115613f4a575f80fd5b50613f5789828a01613e0a565b979a9699509497509295939492505050565b5f60208284031215613f79575f80fd5b813567ffffffffffffffff8116811461396f575f80fd5b5f805f805f60a08688031215613fa4575f80fd5b613fad86613dd6565b9450613fbb60208701613dd6565b9350613fc960408701613dd6565b94979396509394606081013594506080013592915050565b801515811461232b575f80fd5b5f60208284031215613ffe575f80fd5b813561396f81613fe1565b5f806040838503121561401a575f80fd5b823567ffffffffffffffff80821115614031575f80fd5b9084019060e08287031215614044575f80fd5b90925060208401359080821115614059575f80fd5b5083016060818603121561406b575f80fd5b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561122657611226614076565b8181038181111561122657611226614076565b5f602082840312156140d9575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361411057614110614076565b5060010190565b5f60208284031215614127575f80fd5b815161396f81613fe1565b5f60208284031215614142575f80fd5b813560ff8116811461396f575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614185575f80fd5b83018035915067ffffffffffffffff82111561419f575f80fd5b602001915036819003821315613e48575f80fd5b818382375f9101908152919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b818110156142535784516001600160a01b03168352938301939183019160010161422e565b5050876040860152848103606086015261426e8187896141c2565b9a9950505050505050505050565b5f5b8381101561429657818101518382015260200161427e565b50505f910152565b5f82516142af81846020870161427c565b9190910192915050565b838152818360208301375f910160200190815292915050565b5f80604083850312156142e3575f80fd5b505080516020909101519092909150565b5f8085851115614302575f80fd5b8386111561430e575f80fd5b5050820193919092039150565b7fffffffffffffffff0000000000000000000000000000000000000000000000008a60c01b168152886008820152876028820152866048820152856068820152846088820152828460a883013760a892019182015260c801979650505050505050565b858152846020820152608060408201525f61439d6080830185876141c2565b90508260608301529695505050505050565b808202811582820484141761122657611226614076565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112614402575f80fd5b8135602067ffffffffffffffff8083111561441f5761441f6143c6565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715614462576144626143c6565b6040529384526020818701810194908101925087851115614481575f80fd5b6020870191505b848210156144a85761449982613dd6565b83529183019190830190614488565b979650505050505050565b5f805f805f8060c087890312156144c8575f80fd5b86359550602087013567ffffffffffffffff808211156144e6575f80fd5b6144f28a838b016143f3565b965060408901359550606089013591508082111561450e575f80fd5b61451a8a838b016143f3565b94506080890135935060a0890135915080821115614536575f80fd5b5061454389828a016143f3565b915050929550929550929556fea164736f6c6343000818000a diff --git a/bindings/bindings/rollup.go b/bindings/bindings/rollup.go index 6bf8912f0..b4a32eda3 100644 --- a/bindings/bindings/rollup.go +++ b/bindings/bindings/rollup.go @@ -49,7 +49,7 @@ type IRollupBatchSignatureInput struct { // RollupMetaData contains all meta data concerning the Rollup contract. var RollupMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_chainID\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorIncorrectBatchLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorNoBlockInBatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"res\",\"type\":\"string\"}],\"name\":\"ChallengeRes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"challengeDeposit\",\"type\":\"uint256\"}],\"name\":\"ChallengeState\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"CommitBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"withdrawRoot\",\"type\":\"bytes32\"}],\"name\":\"FinalizeBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"RevertBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"UpdateChallenger\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPeriod\",\"type\":\"uint256\"}],\"name\":\"UpdateFinalizationPeriodSeconds\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldWindow\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newWindow\",\"type\":\"uint256\"}],\"name\":\"UpdateProofWindow\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldVerifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newVerifier\",\"type\":\"address\"}],\"name\":\"UpdateVerifier\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"LAYER_2_CHAIN_ID\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"addChallenger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"batchChallengeReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchChallenged\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchChallengedSuccess\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchDataStore\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"originTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"finalizeTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"signedSequencersBitmap\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchExist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchInChallenge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchInsideChallengeWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"}],\"name\":\"challengeState\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"challenges\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"challengeDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"challengeSuccess\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"finished\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"parentBatchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blockContexts\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"skippedL1MessageBitmap\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"prevStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"postStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structIRollup.BatchDataInput\",\"name\":\"batchDataInput\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"signedSequencersBitmap\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"sequencerSets\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"structIRollup.BatchSignatureInput\",\"name\":\"batchSignatureInput\",\"type\":\"tuple\"}],\"name\":\"commitBatch\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"committedBatches\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizationPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"}],\"name\":\"finalizeBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"finalizedStateRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"}],\"name\":\"importGenesisBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inChallenge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1StakingContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_messageQueue\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_proofWindow\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"}],\"name\":\"isBatchFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"challengerAddress\",\"type\":\"address\"}],\"name\":\"isChallenger\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isChallenger\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1StakingContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastCommittedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastFinalizedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofWindow\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_aggrProof\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_kzgDataProof\",\"type\":\"bytes\"}],\"name\":\"proveState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"removeChallenger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"revertBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"revertReqIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_status\",\"type\":\"bool\"}],\"name\":\"setPause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newPeriod\",\"type\":\"uint256\"}],\"name\":\"updateFinalizePeriodSeconds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newWindow\",\"type\":\"uint256\"}],\"name\":\"updateProofWindow\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newVerifier\",\"type\":\"address\"}],\"name\":\"updateVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifier\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"name\":\"withdrawalRoots\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exist\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a060405234801562000010575f80fd5b50604051620046c8380380620046c883398101604081905262000033916200010f565b6001600160401b0381166080526200004a62000051565b506200013e565b5f54610100900460ff1615620000bd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146200010d575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f6020828403121562000120575f80fd5b81516001600160401b038116811462000137575f80fd5b9392505050565b60805161456a6200015e5f395f818161059601526132e9015261456a5ff3fe6080604052600436106102b9575f3560e01c8063715018a611610170578063abc8d68d116100d1578063d279c19111610087578063de8b303511610062578063de8b303514610893578063e3fff1dd146108b2578063f2fde38b146108d1575f80fd5b8063d279c19114610842578063d63b354914610861578063ddd8a3dc14610874575f80fd5b8063b3e0a509116100b7578063b3e0a509146107ef578063bedb86fb1461080e578063ce5db8d61461082d575f80fd5b8063abc8d68d146107af578063b31a77d3146107da575f80fd5b8063910129d411610126578063a415d8dc1161010c578063a415d8dc1461074d578063a479265d1461077b578063a6b63eb814610790575f80fd5b8063910129d4146106fd57806397fc007c1461072e575f80fd5b80638d644bb7116101565780638d644bb71461061d5780638da5cb5b146106305780638f1d37761461064d575f80fd5b8063715018a6146105f057806388b1ea0914610604575f80fd5b80632362f03e1161021a57806357e0af6c116101d05780635ef7a94a116101b65780635ef7a94a146105255780635f77cf1d146105855780636c578c1d146105d1575f80fd5b806357e0af6c146104ef5780635c975abb1461050e575f80fd5b80632b7ac3f3116102005780632b7ac3f31461047a5780633b70c18a146104b157806345792427146104d0575f80fd5b80632362f03e146104245780632571098d1461044f575f80fd5b8063121dcd501161026f57806318463fb01161025557806318463fb0146103c057806318af3b2b146103d557806321e2f9e014610405575f80fd5b8063121dcd501461038c57806313361101146103a1575f80fd5b80630ceb67801161029f5780630ceb67801461032a57806310d445831461034b578063116a1f421461036a575f80fd5b806304d77215146102c4578063059def6114610307575f80fd5b366102c057005b5f80fd5b3480156102cf575f80fd5b506102f26102de366004613dcc565b60a26020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610312575f80fd5b5061031c609c5481565b6040519081526020016102fe565b348015610335575f80fd5b50610349610344366004613dfe565b6108f0565b005b348015610356575f80fd5b50610349610365366004613e5c565b6109c2565b348015610375575f80fd5b506102f2610384366004613dcc565b609c54101590565b348015610397575f80fd5b5061031c609d5481565b3480156103ac575f80fd5b506103496103bb366004613ea4565b610d29565b3480156103cb575f80fd5b5061031c60a65481565b3480156103e0575f80fd5b506102f26103ef366004613dcc565b5f90815260a16020526040902060010154421090565b348015610410575f80fd5b506102f261041f366004613dcc565b6111fe565b34801561042f575f80fd5b5061031c61043e366004613dcc565b60a06020525f908152604090205481565b34801561045a575f80fd5b5061031c610469366004613dcc565b609f6020525f908152604090205481565b348015610485575f80fd5b50609b54610499906001600160a01b031681565b6040516001600160a01b0390911681526020016102fe565b3480156104bc575f80fd5b50609a54610499906001600160a01b031681565b3480156104db575f80fd5b506103496104ea366004613ee3565b61122c565b3480156104fa575f80fd5b50610349610509366004613dcc565b61147e565b348015610519575f80fd5b5060655460ff166102f2565b348015610530575f80fd5b5061056561053f366004613dcc565b60a16020525f908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016102fe565b348015610590575f80fd5b506105b87f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff90911681526020016102fe565b3480156105dc575f80fd5b506103496105eb366004613dfe565b611529565b3480156105fb575f80fd5b506103496115e6565b34801561060f575f80fd5b5060a5546102f29060ff1681565b61034961062b366004613f76565b6115f9565b34801561063b575f80fd5b506033546001600160a01b0316610499565b348015610658575f80fd5b506106b9610667366004613dcc565b60a36020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff831693680100000000000000009093046001600160a01b0316929060ff8082169161010090041686565b6040805167ffffffffffffffff90971687526001600160a01b03909516602087015293850192909252606084015215156080830152151560a082015260c0016102fe565b348015610708575f80fd5b506102f2610717366004613dcc565b5f90815260a3602052604090206003015460ff1690565b348015610739575f80fd5b50610349610748366004613dfe565b611b65565b348015610758575f80fd5b506102f2610767366004613dfe565b609e6020525f908152604090205460ff1681565b348015610786575f80fd5b5061031c60995481565b34801561079b575f80fd5b506103496107aa366004613f9d565b611c48565b3480156107ba575f80fd5b5061031c6107c9366004613dfe565b60a46020525f908152604090205481565b3480156107e5575f80fd5b5061031c60a75481565b3480156107fa575f80fd5b50610349610809366004613ea4565b611f4b565b348015610819575f80fd5b50610349610828366004613ffb565b612243565b348015610838575f80fd5b5061031c60985481565b34801561084d575f80fd5b5061034961085c366004613dfe565b612336565b61034961086f366004614016565b6123b2565b34801561087f575f80fd5b50609754610499906001600160a01b031681565b34801561089e575f80fd5b506102f26108ad366004613dcc565b612c2a565b3480156108bd575f80fd5b506103496108cc366004613dcc565b612c74565b3480156108dc575f80fd5b506103496108eb366004613dfe565b612d17565b6108f8612da4565b6001600160a01b0381165f908152609e602052604090205460ff16156109655760405162461bcd60e51b815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b6001600160a01b0381165f818152609e6020908152604091829020805460ff1916600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b6109ca612da4565b5f8111610a195760405162461bcd60e51b815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f0000000000000000000000604482015260640161095c565b5f80610a258585612dfe565b915091505f610a38836001015160c01c90565b5f81815260a060205260409020549091508214610a975760405162461bcd60e51b815260206004820152601460248201527f696e636f72726563742062617463682068617368000000000000000000000000604482015260640161095c565b5f60a081610aa587856140b0565b81526020019081526020015f205414610b255760405162461bcd60e51b8152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e6700000000000000000000000000000000000000000000000000000000606482015260840161095c565b609c548111610b9c5760405162461bcd60e51b815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f6800000000000000000000000000000000000000000000000000000000000000606482015260840161095c565b610ba76001826140c3565b609d555b8315610d2157604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a06020908152604080832083905560a3909152902060030154610100900460ff16610c5c575f81815260a360209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a49092528220805491929091610c4c9084906140b0565b909155505060a5805460ff191690555b5f81815260a36020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a75415801590610cd9575060a75481145b15610ce3575f60a7555b6001015f81815260a060205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610bab575b505050505050565b60a75415610d795760405162461bcd60e51b815260206004820152600b60248201527f6e65656420726576657274000000000000000000000000000000000000000000604482015260640161095c565b610d81612e19565b5f80610d8d8484612dfe565b915091505f610da0836001015160c01c90565b5f81815260a060205260409020549091508214610dff5760405162461bcd60e51b815260206004820152601460248201527f696e636f72726563742062617463682068617368000000000000000000000000604482015260640161095c565b610e08816111fe565b610e545760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f742065786973740000000000000000000000000000000000604482015260640161095c565b610e5d81612c2a565b15610eaa5760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e67650000000000000000000000000000604482015260640161095c565b5f81815260a3602052604090206003015460ff1615610f0b5760405162461bcd60e51b815260206004820152601660248201527f62617463682073686f756c642062652072657665727400000000000000000000604482015260640161095c565b5f81815260a16020526040902060010154421015610f6b5760405162461bcd60e51b815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f7700000000000000604482015260640161095c565b6059830151609f5f610f7e6001856140c3565b81526020019081526020015f205414610fd95760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f74000000604482015260640161095c565b5f818152609f6020526040902054156110345760405162461bcd60e51b815260206004820152601660248201527f626174636820616c726561647920766572696669656400000000000000000000604482015260640161095c565b80609c54600101146110885760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e6465780000000000000000000000604482015260640161095c565b609c819055600160a25f61109d866099015190565b815260208101919091526040015f20805460ff191691151591909117905560798301515f828152609f60205260409020556110ea60f98401601185015160c01c600986015160c01c612e6c565b60a15f6110f86001846140c3565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560a3919061113190846140c3565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a0909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d6111da866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a160205260408120541580159061122657505f82815260a0602052604090205415155b92915050565b60a7541561127c5760405162461bcd60e51b815260206004820152600b60248201527f6e65656420726576657274000000000000000000000000000000000000000000604482015260640161095c565b611284612e19565b5f806112908888612dfe565b915091505f6112a3836001015160c01c90565b5f81815260a0602052604090205490915082146113025760405162461bcd60e51b815260206004820152601460248201527f696e636f72726563742062617463682068617368000000000000000000000000604482015260640161095c565b61130b81612c2a565b6113575760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e67650000000000000000000000000000604482015260640161095c565b5f81815260a3602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a5805460ff1916905560995460029091015442916113b0916140b0565b11611426575f81815260a3602090815260408083206003908101805460ff1916600117905560a1835292819020909201548251808401909352600783527f54696d656f7574000000000000000000000000000000000000000000000000009183019190915261142191839190612f35565b611473565b6114338388888888613091565b61147381336040518060400160405280600d81526020017f50726f6f662073756363657373000000000000000000000000000000000000008152506133fc565b505050505050505050565b611486612da4565b5f8111801561149757506099548114155b6114e35760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f770000000000000000604482015260640161095c565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b611531612da4565b6001600160a01b0381165f908152609e602052604090205460ff166115985760405162461bcd60e51b815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e6765720000000000604482015260640161095c565b6001600160a01b0381165f818152609e60209081526040808320805460ff19169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991016109b7565b6115ee612da4565b6115f75f613489565b565b335f908152609e602052604090205460ff166116575760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f77656400000000000000604482015260640161095c565b60a754156116a75760405162461bcd60e51b815260206004820152600b60248201527f6e65656420726576657274000000000000000000000000000000000000000000604482015260640161095c565b6116af612e19565b60a55460ff16156117025760405162461bcd60e51b815260206004820152601460248201527f616c726561647920696e206368616c6c656e6765000000000000000000000000604482015260640161095c565b8067ffffffffffffffff16609c541061175d5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c72656164792066696e616c697a6564000000000000000000604482015260640161095c565b67ffffffffffffffff81165f90815260a0602052604081205490036117c45760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f742065786973740000000000000000000000000000000000604482015260640161095c565b67ffffffffffffffff81165f90815260a360205260409020546801000000000000000090046001600160a01b03161561183f5760405162461bcd60e51b815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e6765640000000000000000604482015260640161095c565b67ffffffffffffffff81165f90815260a1602052604090206001015442106118cf5760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f7700000000000000000000000000606482015260840161095c565b60975f9054906101000a90046001600160a01b03166001600160a01b0316630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561191f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061194391906140d6565b3410156119925760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742076616c75650000000000000000000000000000604482015260640161095c565b67ffffffffffffffff81811660a68190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a3909552969096209451855492516001600160a01b031668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092179290921790556001600160a01b03168167ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b997634604051611ae491815260200190565b60405180910390a35f609c546001611afc91906140b0565b90505b609d548111611b54578167ffffffffffffffff168114611b42576099545f82815260a1602052604081206001018054909190611b3c9084906140b0565b90915550505b80611b4c816140ed565b915050611aff565b505060a5805460ff19166001179055565b611b6d612da4565b6001600160a01b03811615801590611b935750609b546001600160a01b03828116911614155b611bdf5760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206e6577207665726966696572000000000000000000000000604482015260640161095c565b609b80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b5f54610100900460ff1615808015611c6657505f54600160ff909116105b80611c7f5750303b158015611c7f57505f5460ff166001145b611cf15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161095c565b5f805460ff191660011790558015611d2f575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0385161580611d4c57506001600160a01b038416155b15611d83576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038616611dd95760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e74726163740000000000604482015260640161095c565b611de16134f2565b611de9613576565b609780546001600160a01b038089167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609a8054888416908316179055609b80549287169290911682179055609884905560998390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018590527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a18015610d21575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b611f53612da4565b5f8052609f6020527fa705961f203609058950cfd817eb7a7627c9e270651c936aad3abdfa253727ec5415611fca5760405162461bcd60e51b815260206004820152601660248201527f67656e6573697320626174636820696d706f7274656400000000000000000000604482015260640161095c565b5f80611fd68484612dfe565b915091505f611fe9836001015160c01c90565b90505f611ff7846079015190565b9050806120465760405162461bcd60e51b815260206004820152600f60248201527f7a65726f20737461746520726f6f740000000000000000000000000000000000604482015260640161095c565b600984015160c01c1561209b5760405162461bcd60e51b815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c642062652030000000604482015260640161095c565b5f6120a7856019015190565b036120f45760405162461bcd60e51b815260206004820152600e60248201527f7a65726f20646174612068617368000000000000000000000000000000000000604482015260640161095c565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014612120856039015190565b1461216d5760405162461bcd60e51b815260206004820152601660248201527f696e76616c69642076657273696f6e6564206861736800000000000000000000604482015260640161095c565b5f82815260a0602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a18652848720935184559151600184015551600283015551600390910155609f909152808220839055609d849055609c84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b61224b612da4565b801561232e576122596135fa565b60a55460ff161561232b5760a6545f90815260a360209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a490925282208054919290916122ad9084906140b0565b909155505060a6545f90815260a36020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a5805460ff191690555b50565b61232b613654565b335f90815260a46020526040812054908190036123955760405162461bcd60e51b815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e676552657761726400000000604482015260640161095c565b335f90815260a460205260408120556123ae828261368d565b5050565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561241e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124429190614124565b61248e5760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f776564000000000000604482015260640161095c565b60a754156124de5760405162461bcd60e51b815260206004820152600b60248201527f6e65656420726576657274000000000000000000000000000000000000000000604482015260640161095c565b6124e6612e19565b6124f3602083018361413f565b60ff16156125435760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642076657273696f6e0000000000000000000000000000000000604482015260640161095c565b5f612551604084018461415f565b915050806125a15760405162461bcd60e51b815260206004820152600e60248201527f626174636820697320656d707479000000000000000000000000000000000000604482015260640161095c565b60808301356125f25760405162461bcd60e51b815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f0000000000604482015260640161095c565b60a08301356126435760405162461bcd60e51b815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f00000000000000000000604482015260640161095c565b5f8061265a612655602087018761415f565b612dfe565b915091505f61266d836001015160c01c90565b5f81815260a0602052604090205490915082146126cc5760405162461bcd60e51b815260206004820152601b60248201527f696e636f727265637420706172656e7420626174636820686173680000000000604482015260640161095c565b5f60a0816126db8460016140b0565b81526020019081526020015f2054146127365760405162461bcd60e51b815260206004820152601760248201527f626174636820616c726561647920636f6d6d6974746564000000000000000000604482015260640161095c565b609d5481146127875760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e6465780000000000000000000000604482015260640161095c565b5f612796846011015160c01c90565b90505f80806127f56127ab60408c018c61415f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508792508891506127f0905060608f018f61415f565b613737565b94850194938401939250905061280e60608b018b61415f565b905061010060ff850104602002146128685760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206269746d6170206c656e67746800000000000000000000000000604482015260640161095c565b600194909401935f80491561287e575f496128a0565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b90505f6128b060608d018d61415f565b6128bc915060f96140b0565b905060405198506020810289016040526128ea898d5f0160208101906128e2919061413f565b60ff166138c5565b60c087811b60018b015285811b60098b015286811b60118b015260198a0184905260808d013560598b015260a08d013560798b01528c013560998a01526129578961293860208e018e61415f565b6040516129469291906141c0565b604051809103902060b99190910152565b60d989018890526129748961296f60608f018f61415f565b6138cc565b6039890182905280892060a05f8981526020019081526020015f20819055506040518060800160405280428152602001609854426129b291906140b0565b8152602001612a038e80604001906129ca919061415f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506138d892505050565b81526097546020909101906001600160a01b031663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612a77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a9b91906140d6565b90525f88815260a1602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609d8890556097546001600160a01b031691506374fe27b7908c3590612b0290612afc908f018f61415f565b5f61392f565b5f8e8060400190612b13919061415f565b6040518663ffffffff1660e01b8152600401612b33959493929190614216565b602060405180830381865afa158015612b4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b729190614124565b612be45760405162461bcd60e51b815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161095c565b5f86815260a06020526040808220549051909188917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050505050565b5f81815260a360205260408120546801000000000000000090046001600160a01b0316158015906112265750505f90815260a36020526040902060030154610100900460ff161590565b612c7c612da4565b5f81118015612c8d57506098548114155b612cd95760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f640000000000604482015260640161095c565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910161151d565b612d1f612da4565b6001600160a01b038116612d9b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161095c565b61232b81613489565b6033546001600160a01b031633146115f75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161095c565b5f805f612e0b8585613983565b812090969095509350505050565b60655460ff16156115f75760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161095c565b805f03612e7857505050565b8082035f805b83811015610d2157610100818503811115612e9857508084035b8651609a546040517f55f613ce0000000000000000000000000000000000000000000000000000000081526004810187905260248101849052604481018390526020909901989194506001600160a01b0316906355f613ce906064015f604051808303815f87803b158015612f0b575f80fd5b505af1158015612f1d573d5f803e3d5ffd5b50505050610100840193505061010081019050612e7e565b60a78390555f83815260a360205260408082205460975491517f45bc4d1000000000000000000000000000000000000000000000000000000000815260048101869052680100000000000000009091046001600160a01b03908116939216906345bc4d10906024016020604051808303815f875af1158015612fb9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fdd91906140d6565b5f86815260a36020526040902060010154909150612ffc9082906140b0565b5f86815260a360209081526040808320546801000000000000000090046001600160a01b0316835260a49091528120805490919061303b9084906140b0565b909155505060405161304e9084906142ab565b604051908190038120906001600160a01b0384169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b826130de5760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964206167677265676174696f6e2070726f6f6600000000000000604482015260640161095c565b60a0811461312e5760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964204b5a4720646174612070726f6f6600000000000000000000604482015260640161095c565b5f61313d866001015160c01c90565b90505f61314b876039015190565b90505f80600a6001600160a01b031683878760405160200161316f939291906142c6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526131a7916142ab565b5f60405180830381855afa9150503d805f81146131df576040519150601f19603f3d011682016040523d82523d5f602084013e6131e4565b606091505b50915091508161325c5760405162461bcd60e51b815260206004820152602a60248201527f6661696c656420746f2063616c6c20706f696e74206576616c756174696f6e2060448201527f707265636f6d70696c6500000000000000000000000000000000000000000000606482015260840161095c565b5f8180602001905181019061327191906142df565b9150507f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff0000000181146132e35760405162461bcd60e51b815260206004820152601c60248201527f707265636f6d70696c6520756e6578706563746564206f757470757400000000604482015260640161095c565b5050505f7f0000000000000000000000000000000000000000000000000000000000000000613313896059015190565b60798a015160998b015160b98c015160198d015161333460405f8c8e614301565b8960405160200161334d99989796959493929190614328565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609b549091506001600160a01b0316632c09a8486133a28a5160f81c90565b858a8a866040518663ffffffff1660e01b81526004016133c695949392919061438b565b5f6040518083038186803b1580156133dc575f80fd5b505afa1580156133ee573d5f803e3d5ffd5b505050505050505050505050565b5f83815260a360209081526040808320600101546001600160a01b038616845260a490925282208054919283926134349084906140b0565b90915550506040516134479083906142ab565b604051908190038120906001600160a01b0385169086907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a450505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff1661356e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161095c565b6115f7613a5a565b5f54610100900460ff166135f25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161095c565b6115f7613ae2565b613602612e19565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586136373390565b6040516001600160a01b03909116815260200160405180910390a1565b61365c613b67565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613637565b80156123ae575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146136dc576040519150601f19603f3d011682016040523d82523d5f602084013e6136e1565b606091505b50509050806137325760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c65640000000000604482015260640161095c565b505050565b60405185515f91829160208901919081908490613755908590613bb9565b90505f5b818110156137e057603c8102850160018101518452602101517fffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000166020840152603a830192505f6137ab603c836143bc565b6137b68760026140b0565b6137c091906140b0565b90505f6137d182603a015160f01c90565b97909701965050600101613759565b506020850282016040526001840193505b80156138b1575f61380685603a015160f01c90565b905061381683828d8d8d8d613c4e565b92505f613827866038015160f01c90565b9050818110156138795760405162461bcd60e51b815260206004820152601d60248201527f6e756d20747873206c657373207468616e206e756d204c31206d736773000000604482015260640161095c565b50998a01999890980197603c93909301927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016137f1565b508190039020989197509095505050505050565b8082535050565b808260f9850137505050565b5f805f6020840190506001810191505f6138f3828651613bb9565b90505f5b6139026001836140c3565b81101561391857603c93909301926001016138f7565b505f613925845160c01c90565b9695505050505050565b60605f80808080613942888a018a6144c0565b955095509550955095505081871061396057945061397c9350505050565b83871061397457829550505050505061397c565b509293505050505b9392505050565b5f8160f98110156139d65760405162461bcd60e51b815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c000000604482015260640161095c565b6040519150808483378082016040525f6139f4836009015160c01c90565b905061010060ff82010460200260f9018214613a525760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206269746d6170206c656e67746800000000000000000000000000604482015260640161095c565b509250929050565b5f54610100900460ff16613ad65760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161095c565b6065805460ff19169055565b5f54610100900460ff16613b5e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161095c565b6115f733613489565b60655460ff166115f75760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161095c565b5f613bc5835160f81c90565b9050805f03613c00576040517f5168407700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c0b603c826143bc565b613c169060026140b0565b8214611226576040517f4a969e2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f855f03613c5d575085613925565b609a546001600160a01b03165f80805b89811015613d435760ff89169150600889901c811580613c8b575082155b15613c9a578060200288013593505b600184841c165f03613d32576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018a90525f906001600160a01b0387169063ae453cd590602401602060405180830381865afa158015613d04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d2891906140d6565b8d52506020909b019a5b506001988901989788019701613c6d565b505060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88011681811c60011615613dbe5760405162461bcd60e51b815260206004820152601b60248201527f63616e6e6f7420736b6970206c617374204c31206d6573736167650000000000604482015260640161095c565b509798975050505050505050565b5f60208284031215613ddc575f80fd5b5035919050565b80356001600160a01b0381168114613df9575f80fd5b919050565b5f60208284031215613e0e575f80fd5b61397c82613de3565b5f8083601f840112613e27575f80fd5b50813567ffffffffffffffff811115613e3e575f80fd5b602083019150836020828501011115613e55575f80fd5b9250929050565b5f805f60408486031215613e6e575f80fd5b833567ffffffffffffffff811115613e84575f80fd5b613e9086828701613e17565b909790965060209590950135949350505050565b5f8060208385031215613eb5575f80fd5b823567ffffffffffffffff811115613ecb575f80fd5b613ed785828601613e17565b90969095509350505050565b5f805f805f8060608789031215613ef8575f80fd5b863567ffffffffffffffff80821115613f0f575f80fd5b613f1b8a838b01613e17565b90985096506020890135915080821115613f33575f80fd5b613f3f8a838b01613e17565b90965094506040890135915080821115613f57575f80fd5b50613f6489828a01613e17565b979a9699509497509295939492505050565b5f60208284031215613f86575f80fd5b813567ffffffffffffffff8116811461397c575f80fd5b5f805f805f60a08688031215613fb1575f80fd5b613fba86613de3565b9450613fc860208701613de3565b9350613fd660408701613de3565b94979396509394606081013594506080013592915050565b801515811461232b575f80fd5b5f6020828403121561400b575f80fd5b813561397c81613fee565b5f8060408385031215614027575f80fd5b823567ffffffffffffffff8082111561403e575f80fd5b9084019060e08287031215614051575f80fd5b90925060208401359080821115614066575f80fd5b50830160608186031215614078575f80fd5b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561122657611226614083565b8181038181111561122657611226614083565b5f602082840312156140e6575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361411d5761411d614083565b5060010190565b5f60208284031215614134575f80fd5b815161397c81613fee565b5f6020828403121561414f575f80fd5b813560ff8116811461397c575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614192575f80fd5b83018035915067ffffffffffffffff8211156141ac575f80fd5b602001915036819003821315613e55575f80fd5b818382375f9101908152919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b818110156142605784516001600160a01b03168352938301939183019160010161423b565b5050876040860152848103606086015261427b8187896141cf565b9a9950505050505050505050565b5f5b838110156142a357818101518382015260200161428b565b50505f910152565b5f82516142bc818460208701614289565b9190910192915050565b838152818360208301375f910160200190815292915050565b5f80604083850312156142f0575f80fd5b505080516020909101519092909150565b5f808585111561430f575f80fd5b8386111561431b575f80fd5b5050820193919092039150565b7fffffffffffffffff0000000000000000000000000000000000000000000000008a60c01b168152886008820152876028820152866048820152856068820152846088820152828460a883013760a892019182015260c801979650505050505050565b858152846020820152608060408201525f6143aa6080830185876141cf565b90508260608301529695505050505050565b808202811582820484141761122657611226614083565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f83011261440f575f80fd5b8135602067ffffffffffffffff8083111561442c5761442c6143d3565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110848211171561446f5761446f6143d3565b604052938452602081870181019490810192508785111561448e575f80fd5b6020870191505b848210156144b5576144a682613de3565b83529183019190830190614495565b979650505050505050565b5f805f805f8060c087890312156144d5575f80fd5b86359550602087013567ffffffffffffffff808211156144f3575f80fd5b6144ff8a838b01614400565b965060408901359550606089013591508082111561451b575f80fd5b6145278a838b01614400565b94506080890135935060a0890135915080821115614543575f80fd5b5061455089828a01614400565b915050929550929550929556fea164736f6c6343000818000a", + Bin: "0x60a060405234801562000010575f80fd5b50604051620046bb380380620046bb83398101604081905262000033916200010f565b6001600160401b0381166080526200004a62000051565b506200013e565b5f54610100900460ff1615620000bd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146200010d575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f6020828403121562000120575f80fd5b81516001600160401b038116811462000137575f80fd5b9392505050565b60805161455d6200015e5f395f818161059601526132e9015261455d5ff3fe6080604052600436106102b9575f3560e01c8063715018a611610170578063abc8d68d116100d1578063d279c19111610087578063de8b303511610062578063de8b303514610893578063e3fff1dd146108b2578063f2fde38b146108d1575f80fd5b8063d279c19114610842578063d63b354914610861578063ddd8a3dc14610874575f80fd5b8063b3e0a509116100b7578063b3e0a509146107ef578063bedb86fb1461080e578063ce5db8d61461082d575f80fd5b8063abc8d68d146107af578063b31a77d3146107da575f80fd5b8063910129d411610126578063a415d8dc1161010c578063a415d8dc1461074d578063a479265d1461077b578063a6b63eb814610790575f80fd5b8063910129d4146106fd57806397fc007c1461072e575f80fd5b80638d644bb7116101565780638d644bb71461061d5780638da5cb5b146106305780638f1d37761461064d575f80fd5b8063715018a6146105f057806388b1ea0914610604575f80fd5b80632362f03e1161021a57806357e0af6c116101d05780635ef7a94a116101b65780635ef7a94a146105255780635f77cf1d146105855780636c578c1d146105d1575f80fd5b806357e0af6c146104ef5780635c975abb1461050e575f80fd5b80632b7ac3f3116102005780632b7ac3f31461047a5780633b70c18a146104b157806345792427146104d0575f80fd5b80632362f03e146104245780632571098d1461044f575f80fd5b8063121dcd501161026f57806318463fb01161025557806318463fb0146103c057806318af3b2b146103d557806321e2f9e014610405575f80fd5b8063121dcd501461038c57806313361101146103a1575f80fd5b80630ceb67801161029f5780630ceb67801461032a57806310d445831461034b578063116a1f421461036a575f80fd5b806304d77215146102c4578063059def6114610307575f80fd5b366102c057005b5f80fd5b3480156102cf575f80fd5b506102f26102de366004613dbf565b60a26020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610312575f80fd5b5061031c609c5481565b6040519081526020016102fe565b348015610335575f80fd5b50610349610344366004613df1565b6108f0565b005b348015610356575f80fd5b50610349610365366004613e4f565b6109c2565b348015610375575f80fd5b506102f2610384366004613dbf565b609c54101590565b348015610397575f80fd5b5061031c609d5481565b3480156103ac575f80fd5b506103496103bb366004613e97565b610d29565b3480156103cb575f80fd5b5061031c60a65481565b3480156103e0575f80fd5b506102f26103ef366004613dbf565b5f90815260a16020526040902060010154421090565b348015610410575f80fd5b506102f261041f366004613dbf565b6111fe565b34801561042f575f80fd5b5061031c61043e366004613dbf565b60a06020525f908152604090205481565b34801561045a575f80fd5b5061031c610469366004613dbf565b609f6020525f908152604090205481565b348015610485575f80fd5b50609b54610499906001600160a01b031681565b6040516001600160a01b0390911681526020016102fe565b3480156104bc575f80fd5b50609a54610499906001600160a01b031681565b3480156104db575f80fd5b506103496104ea366004613ed6565b61122c565b3480156104fa575f80fd5b50610349610509366004613dbf565b61147e565b348015610519575f80fd5b5060655460ff166102f2565b348015610530575f80fd5b5061056561053f366004613dbf565b60a16020525f908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016102fe565b348015610590575f80fd5b506105b87f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff90911681526020016102fe565b3480156105dc575f80fd5b506103496105eb366004613df1565b611529565b3480156105fb575f80fd5b506103496115e6565b34801561060f575f80fd5b5060a5546102f29060ff1681565b61034961062b366004613f69565b6115f9565b34801561063b575f80fd5b506033546001600160a01b0316610499565b348015610658575f80fd5b506106b9610667366004613dbf565b60a36020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff831693680100000000000000009093046001600160a01b0316929060ff8082169161010090041686565b6040805167ffffffffffffffff90971687526001600160a01b03909516602087015293850192909252606084015215156080830152151560a082015260c0016102fe565b348015610708575f80fd5b506102f2610717366004613dbf565b5f90815260a3602052604090206003015460ff1690565b348015610739575f80fd5b50610349610748366004613df1565b611b65565b348015610758575f80fd5b506102f2610767366004613df1565b609e6020525f908152604090205460ff1681565b348015610786575f80fd5b5061031c60995481565b34801561079b575f80fd5b506103496107aa366004613f90565b611c48565b3480156107ba575f80fd5b5061031c6107c9366004613df1565b60a46020525f908152604090205481565b3480156107e5575f80fd5b5061031c60a75481565b3480156107fa575f80fd5b50610349610809366004613e97565b611f4b565b348015610819575f80fd5b50610349610828366004613fee565b612243565b348015610838575f80fd5b5061031c60985481565b34801561084d575f80fd5b5061034961085c366004613df1565b612336565b61034961086f366004614009565b6123b2565b34801561087f575f80fd5b50609754610499906001600160a01b031681565b34801561089e575f80fd5b506102f26108ad366004613dbf565b612c2a565b3480156108bd575f80fd5b506103496108cc366004613dbf565b612c74565b3480156108dc575f80fd5b506103496108eb366004613df1565b612d17565b6108f8612da4565b6001600160a01b0381165f908152609e602052604090205460ff16156109655760405162461bcd60e51b815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b6001600160a01b0381165f818152609e6020908152604091829020805460ff1916600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b6109ca612da4565b5f8111610a195760405162461bcd60e51b815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f0000000000000000000000604482015260640161095c565b5f80610a258585612dfe565b915091505f610a38836001015160c01c90565b5f81815260a060205260409020549091508214610a975760405162461bcd60e51b815260206004820152601460248201527f696e636f72726563742062617463682068617368000000000000000000000000604482015260640161095c565b5f60a081610aa587856140a3565b81526020019081526020015f205414610b255760405162461bcd60e51b8152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e6700000000000000000000000000000000000000000000000000000000606482015260840161095c565b609c548111610b9c5760405162461bcd60e51b815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f6800000000000000000000000000000000000000000000000000000000000000606482015260840161095c565b610ba76001826140b6565b609d555b8315610d2157604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a06020908152604080832083905560a3909152902060030154610100900460ff16610c5c575f81815260a360209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a49092528220805491929091610c4c9084906140a3565b909155505060a5805460ff191690555b5f81815260a36020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a75415801590610cd9575060a75481145b15610ce3575f60a7555b6001015f81815260a060205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610bab575b505050505050565b60a75415610d795760405162461bcd60e51b815260206004820152600b60248201527f6e65656420726576657274000000000000000000000000000000000000000000604482015260640161095c565b610d81612e19565b5f80610d8d8484612dfe565b915091505f610da0836001015160c01c90565b5f81815260a060205260409020549091508214610dff5760405162461bcd60e51b815260206004820152601460248201527f696e636f72726563742062617463682068617368000000000000000000000000604482015260640161095c565b610e08816111fe565b610e545760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f742065786973740000000000000000000000000000000000604482015260640161095c565b610e5d81612c2a565b15610eaa5760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e67650000000000000000000000000000604482015260640161095c565b5f81815260a3602052604090206003015460ff1615610f0b5760405162461bcd60e51b815260206004820152601660248201527f62617463682073686f756c642062652072657665727400000000000000000000604482015260640161095c565b5f81815260a16020526040902060010154421015610f6b5760405162461bcd60e51b815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f7700000000000000604482015260640161095c565b6059830151609f5f610f7e6001856140b6565b81526020019081526020015f205414610fd95760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f74000000604482015260640161095c565b5f818152609f6020526040902054156110345760405162461bcd60e51b815260206004820152601660248201527f626174636820616c726561647920766572696669656400000000000000000000604482015260640161095c565b80609c54600101146110885760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e6465780000000000000000000000604482015260640161095c565b609c819055600160a25f61109d866099015190565b815260208101919091526040015f20805460ff191691151591909117905560798301515f828152609f60205260409020556110ea60f98401601185015160c01c600986015160c01c612e6c565b60a15f6110f86001846140b6565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560a3919061113190846140b6565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a0909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d6111da866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a160205260408120541580159061122657505f82815260a0602052604090205415155b92915050565b60a7541561127c5760405162461bcd60e51b815260206004820152600b60248201527f6e65656420726576657274000000000000000000000000000000000000000000604482015260640161095c565b611284612e19565b5f806112908888612dfe565b915091505f6112a3836001015160c01c90565b5f81815260a0602052604090205490915082146113025760405162461bcd60e51b815260206004820152601460248201527f696e636f72726563742062617463682068617368000000000000000000000000604482015260640161095c565b61130b81612c2a565b6113575760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e67650000000000000000000000000000604482015260640161095c565b5f81815260a3602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a5805460ff1916905560995460029091015442916113b0916140a3565b11611426575f81815260a3602090815260408083206003908101805460ff1916600117905560a1835292819020909201548251808401909352600783527f54696d656f7574000000000000000000000000000000000000000000000000009183019190915261142191839190612f35565b611473565b6114338388888888613091565b61147381336040518060400160405280600d81526020017f50726f6f662073756363657373000000000000000000000000000000000000008152506133fc565b505050505050505050565b611486612da4565b5f8111801561149757506099548114155b6114e35760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f770000000000000000604482015260640161095c565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b611531612da4565b6001600160a01b0381165f908152609e602052604090205460ff166115985760405162461bcd60e51b815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e6765720000000000604482015260640161095c565b6001600160a01b0381165f818152609e60209081526040808320805460ff19169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991016109b7565b6115ee612da4565b6115f75f613489565b565b335f908152609e602052604090205460ff166116575760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f77656400000000000000604482015260640161095c565b60a754156116a75760405162461bcd60e51b815260206004820152600b60248201527f6e65656420726576657274000000000000000000000000000000000000000000604482015260640161095c565b6116af612e19565b60a55460ff16156117025760405162461bcd60e51b815260206004820152601460248201527f616c726561647920696e206368616c6c656e6765000000000000000000000000604482015260640161095c565b8067ffffffffffffffff16609c541061175d5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c72656164792066696e616c697a6564000000000000000000604482015260640161095c565b67ffffffffffffffff81165f90815260a0602052604081205490036117c45760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f742065786973740000000000000000000000000000000000604482015260640161095c565b67ffffffffffffffff81165f90815260a360205260409020546801000000000000000090046001600160a01b03161561183f5760405162461bcd60e51b815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e6765640000000000000000604482015260640161095c565b67ffffffffffffffff81165f90815260a1602052604090206001015442106118cf5760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f7700000000000000000000000000606482015260840161095c565b60975f9054906101000a90046001600160a01b03166001600160a01b0316630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561191f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061194391906140c9565b3410156119925760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742076616c75650000000000000000000000000000604482015260640161095c565b67ffffffffffffffff81811660a68190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a3909552969096209451855492516001600160a01b031668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092179290921790556001600160a01b03168167ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b997634604051611ae491815260200190565b60405180910390a35f609c546001611afc91906140a3565b90505b609d548111611b54578167ffffffffffffffff168114611b42576099545f82815260a1602052604081206001018054909190611b3c9084906140a3565b90915550505b80611b4c816140e0565b915050611aff565b505060a5805460ff19166001179055565b611b6d612da4565b6001600160a01b03811615801590611b935750609b546001600160a01b03828116911614155b611bdf5760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206e6577207665726966696572000000000000000000000000604482015260640161095c565b609b80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b5f54610100900460ff1615808015611c6657505f54600160ff909116105b80611c7f5750303b158015611c7f57505f5460ff166001145b611cf15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161095c565b5f805460ff191660011790558015611d2f575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0385161580611d4c57506001600160a01b038416155b15611d83576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038616611dd95760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e74726163740000000000604482015260640161095c565b611de16134f2565b611de9613576565b609780546001600160a01b038089167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609a8054888416908316179055609b80549287169290911682179055609884905560998390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018590527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a18015610d21575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b611f53612da4565b5f8052609f6020527fa705961f203609058950cfd817eb7a7627c9e270651c936aad3abdfa253727ec5415611fca5760405162461bcd60e51b815260206004820152601660248201527f67656e6573697320626174636820696d706f7274656400000000000000000000604482015260640161095c565b5f80611fd68484612dfe565b915091505f611fe9836001015160c01c90565b90505f611ff7846079015190565b9050806120465760405162461bcd60e51b815260206004820152600f60248201527f7a65726f20737461746520726f6f740000000000000000000000000000000000604482015260640161095c565b600984015160c01c1561209b5760405162461bcd60e51b815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c642062652030000000604482015260640161095c565b5f6120a7856019015190565b036120f45760405162461bcd60e51b815260206004820152600e60248201527f7a65726f20646174612068617368000000000000000000000000000000000000604482015260640161095c565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014612120856039015190565b1461216d5760405162461bcd60e51b815260206004820152601660248201527f696e76616c69642076657273696f6e6564206861736800000000000000000000604482015260640161095c565b5f82815260a0602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a18652848720935184559151600184015551600283015551600390910155609f909152808220839055609d849055609c84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b61224b612da4565b801561232e576122596135fa565b60a55460ff161561232b5760a6545f90815260a360209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a490925282208054919290916122ad9084906140a3565b909155505060a6545f90815260a36020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a5805460ff191690555b50565b61232b613654565b335f90815260a46020526040812054908190036123955760405162461bcd60e51b815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e676552657761726400000000604482015260640161095c565b335f90815260a460205260408120556123ae828261368d565b5050565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561241e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124429190614117565b61248e5760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f776564000000000000604482015260640161095c565b60a754156124de5760405162461bcd60e51b815260206004820152600b60248201527f6e65656420726576657274000000000000000000000000000000000000000000604482015260640161095c565b6124e6612e19565b6124f36020830183614132565b60ff16156125435760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642076657273696f6e0000000000000000000000000000000000604482015260640161095c565b5f6125516040840184614152565b915050806125a15760405162461bcd60e51b815260206004820152600e60248201527f626174636820697320656d707479000000000000000000000000000000000000604482015260640161095c565b60808301356125f25760405162461bcd60e51b815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f0000000000604482015260640161095c565b60a08301356126435760405162461bcd60e51b815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f00000000000000000000604482015260640161095c565b5f8061265a6126556020870187614152565b612dfe565b915091505f61266d836001015160c01c90565b5f81815260a0602052604090205490915082146126cc5760405162461bcd60e51b815260206004820152601b60248201527f696e636f727265637420706172656e7420626174636820686173680000000000604482015260640161095c565b5f60a0816126db8460016140a3565b81526020019081526020015f2054146127365760405162461bcd60e51b815260206004820152601760248201527f626174636820616c726561647920636f6d6d6974746564000000000000000000604482015260640161095c565b609d5481146127875760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e6465780000000000000000000000604482015260640161095c565b5f612796846011015160c01c90565b90505f80806127f56127ab60408c018c614152565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508792508891506127f0905060608f018f614152565b613737565b94850194938401939250905061280e60608b018b614152565b905061010060ff850104602002146128685760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206269746d6170206c656e67746800000000000000000000000000604482015260640161095c565b600194909401935f80491561287e575f496128a0565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b90505f6128b060608d018d614152565b6128bc915060f96140a3565b905060405198506020810289016040526128ea898d5f0160208101906128e29190614132565b60ff166138b8565b60c087811b60018b015285811b60098b015286811b60118b015260198a0184905260808d013560598b015260a08d013560798b01528c013560998a01526129578961293860208e018e614152565b6040516129469291906141b3565b604051809103902060b99190910152565b60d989018890526129748961296f60608f018f614152565b6138bf565b6039890182905280892060a05f8981526020019081526020015f20819055506040518060800160405280428152602001609854426129b291906140a3565b8152602001612a038e80604001906129ca9190614152565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506138cb92505050565b81526097546020909101906001600160a01b031663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612a77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a9b91906140c9565b90525f88815260a1602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609d8890556097546001600160a01b031691506374fe27b7908c3590612b0290612afc908f018f614152565b5f613922565b5f8e8060400190612b139190614152565b6040518663ffffffff1660e01b8152600401612b33959493929190614209565b602060405180830381865afa158015612b4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b729190614117565b612be45760405162461bcd60e51b815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161095c565b5f86815260a06020526040808220549051909188917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050505050565b5f81815260a360205260408120546801000000000000000090046001600160a01b0316158015906112265750505f90815260a36020526040902060030154610100900460ff161590565b612c7c612da4565b5f81118015612c8d57506098548114155b612cd95760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f640000000000604482015260640161095c565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910161151d565b612d1f612da4565b6001600160a01b038116612d9b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161095c565b61232b81613489565b6033546001600160a01b031633146115f75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161095c565b5f805f612e0b8585613976565b812090969095509350505050565b60655460ff16156115f75760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161095c565b805f03612e7857505050565b8082035f805b83811015610d2157610100818503811115612e9857508084035b8651609a546040517f55f613ce0000000000000000000000000000000000000000000000000000000081526004810187905260248101849052604481018390526020909901989194506001600160a01b0316906355f613ce906064015f604051808303815f87803b158015612f0b575f80fd5b505af1158015612f1d573d5f803e3d5ffd5b50505050610100840193505061010081019050612e7e565b60a78390555f83815260a360205260408082205460975491517f45bc4d1000000000000000000000000000000000000000000000000000000000815260048101869052680100000000000000009091046001600160a01b03908116939216906345bc4d10906024016020604051808303815f875af1158015612fb9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fdd91906140c9565b5f86815260a36020526040902060010154909150612ffc9082906140a3565b5f86815260a360209081526040808320546801000000000000000090046001600160a01b0316835260a49091528120805490919061303b9084906140a3565b909155505060405161304e90849061429e565b604051908190038120906001600160a01b0384169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b826130de5760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964206167677265676174696f6e2070726f6f6600000000000000604482015260640161095c565b60a0811461312e5760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964204b5a4720646174612070726f6f6600000000000000000000604482015260640161095c565b5f61313d866001015160c01c90565b90505f61314b876039015190565b90505f80600a6001600160a01b031683878760405160200161316f939291906142b9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526131a79161429e565b5f60405180830381855afa9150503d805f81146131df576040519150601f19603f3d011682016040523d82523d5f602084013e6131e4565b606091505b50915091508161325c5760405162461bcd60e51b815260206004820152602a60248201527f6661696c656420746f2063616c6c20706f696e74206576616c756174696f6e2060448201527f707265636f6d70696c6500000000000000000000000000000000000000000000606482015260840161095c565b5f8180602001905181019061327191906142d2565b9150507f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff0000000181146132e35760405162461bcd60e51b815260206004820152601c60248201527f707265636f6d70696c6520756e6578706563746564206f757470757400000000604482015260640161095c565b5050505f7f0000000000000000000000000000000000000000000000000000000000000000613313896059015190565b60798a015160998b015160b98c015160198d015161333460405f8c8e6142f4565b8960405160200161334d9998979695949392919061431b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609b549091506001600160a01b0316632c09a8486133a28a5160f81c90565b858a8a866040518663ffffffff1660e01b81526004016133c695949392919061437e565b5f6040518083038186803b1580156133dc575f80fd5b505afa1580156133ee573d5f803e3d5ffd5b505050505050505050505050565b5f83815260a360209081526040808320600101546001600160a01b038616845260a490925282208054919283926134349084906140a3565b909155505060405161344790839061429e565b604051908190038120906001600160a01b0385169086907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a450505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff1661356e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161095c565b6115f7613a4d565b5f54610100900460ff166135f25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161095c565b6115f7613ad5565b613602612e19565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586136373390565b6040516001600160a01b03909116815260200160405180910390a1565b61365c613b5a565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613637565b80156123ae575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146136dc576040519150601f19603f3d011682016040523d82523d5f602084013e6136e1565b606091505b50509050806137325760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c65640000000000604482015260640161095c565b505050565b60405185515f91829160208901919081908490613755908590613bac565b90506002840193505f5b818110156137d957603c81028501805184526020908101517fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001690840152603a830192505f6137af603c836143af565b6137b990876140a3565b90505f6137ca82603a015160f01c90565b9790970196505060010161375f565b506020850282016040525b80156138a4575f6137f985603a015160f01c90565b905061380983828d8d8d8d613c41565b92505f61381a866038015160f01c90565b90508181101561386c5760405162461bcd60e51b815260206004820152601d60248201527f6e756d20747873206c657373207468616e206e756d204c31206d736773000000604482015260640161095c565b50998a01999890980197603c93909301927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016137e4565b508190039020989197509095505050505050565b8082535050565b808260f9850137505050565b5f805f6020840190506001810191505f6138e6828651613bac565b90505f5b6138f56001836140b6565b81101561390b57603c93909301926001016138ea565b505f613918845160c01c90565b9695505050505050565b60605f80808080613935888a018a6144b3565b955095509550955095505081871061395357945061396f9350505050565b83871061396757829550505050505061396f565b509293505050505b9392505050565b5f8160f98110156139c95760405162461bcd60e51b815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c000000604482015260640161095c565b6040519150808483378082016040525f6139e7836009015160c01c90565b905061010060ff82010460200260f9018214613a455760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206269746d6170206c656e67746800000000000000000000000000604482015260640161095c565b509250929050565b5f54610100900460ff16613ac95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161095c565b6065805460ff19169055565b5f54610100900460ff16613b515760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161095c565b6115f733613489565b60655460ff166115f75760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161095c565b5f613bb8835160f01c90565b9050805f03613bf3576040517f5168407700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613bfe603c826143af565b613c099060026140a3565b8214611226576040517f4a969e2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f855f03613c50575085613918565b609a546001600160a01b03165f80805b89811015613d365760ff89169150600889901c811580613c7e575082155b15613c8d578060200288013593505b600184841c165f03613d25576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018a90525f906001600160a01b0387169063ae453cd590602401602060405180830381865afa158015613cf7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d1b91906140c9565b8d52506020909b019a5b506001988901989788019701613c60565b505060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88011681811c60011615613db15760405162461bcd60e51b815260206004820152601b60248201527f63616e6e6f7420736b6970206c617374204c31206d6573736167650000000000604482015260640161095c565b509798975050505050505050565b5f60208284031215613dcf575f80fd5b5035919050565b80356001600160a01b0381168114613dec575f80fd5b919050565b5f60208284031215613e01575f80fd5b61396f82613dd6565b5f8083601f840112613e1a575f80fd5b50813567ffffffffffffffff811115613e31575f80fd5b602083019150836020828501011115613e48575f80fd5b9250929050565b5f805f60408486031215613e61575f80fd5b833567ffffffffffffffff811115613e77575f80fd5b613e8386828701613e0a565b909790965060209590950135949350505050565b5f8060208385031215613ea8575f80fd5b823567ffffffffffffffff811115613ebe575f80fd5b613eca85828601613e0a565b90969095509350505050565b5f805f805f8060608789031215613eeb575f80fd5b863567ffffffffffffffff80821115613f02575f80fd5b613f0e8a838b01613e0a565b90985096506020890135915080821115613f26575f80fd5b613f328a838b01613e0a565b90965094506040890135915080821115613f4a575f80fd5b50613f5789828a01613e0a565b979a9699509497509295939492505050565b5f60208284031215613f79575f80fd5b813567ffffffffffffffff8116811461396f575f80fd5b5f805f805f60a08688031215613fa4575f80fd5b613fad86613dd6565b9450613fbb60208701613dd6565b9350613fc960408701613dd6565b94979396509394606081013594506080013592915050565b801515811461232b575f80fd5b5f60208284031215613ffe575f80fd5b813561396f81613fe1565b5f806040838503121561401a575f80fd5b823567ffffffffffffffff80821115614031575f80fd5b9084019060e08287031215614044575f80fd5b90925060208401359080821115614059575f80fd5b5083016060818603121561406b575f80fd5b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561122657611226614076565b8181038181111561122657611226614076565b5f602082840312156140d9575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361411057614110614076565b5060010190565b5f60208284031215614127575f80fd5b815161396f81613fe1565b5f60208284031215614142575f80fd5b813560ff8116811461396f575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614185575f80fd5b83018035915067ffffffffffffffff82111561419f575f80fd5b602001915036819003821315613e48575f80fd5b818382375f9101908152919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b818110156142535784516001600160a01b03168352938301939183019160010161422e565b5050876040860152848103606086015261426e8187896141c2565b9a9950505050505050505050565b5f5b8381101561429657818101518382015260200161427e565b50505f910152565b5f82516142af81846020870161427c565b9190910192915050565b838152818360208301375f910160200190815292915050565b5f80604083850312156142e3575f80fd5b505080516020909101519092909150565b5f8085851115614302575f80fd5b8386111561430e575f80fd5b5050820193919092039150565b7fffffffffffffffff0000000000000000000000000000000000000000000000008a60c01b168152886008820152876028820152866048820152856068820152846088820152828460a883013760a892019182015260c801979650505050505050565b858152846020820152608060408201525f61439d6080830185876141c2565b90508260608301529695505050505050565b808202811582820484141761122657611226614076565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112614402575f80fd5b8135602067ffffffffffffffff8083111561441f5761441f6143c6565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715614462576144626143c6565b6040529384526020818701810194908101925087851115614481575f80fd5b6020870191505b848210156144a85761449982613dd6565b83529183019190830190614488565b979650505050505050565b5f805f805f8060c087890312156144c8575f80fd5b86359550602087013567ffffffffffffffff808211156144e6575f80fd5b6144f28a838b016143f3565b965060408901359550606089013591508082111561450e575f80fd5b61451a8a838b016143f3565b94506080890135935060a0890135915080821115614536575f80fd5b5061454389828a016143f3565b915050929550929550929556fea164736f6c6343000818000a", } // RollupABI is the input ABI used to generate the binding from. diff --git a/bindings/bindings/rollup_more.go b/bindings/bindings/rollup_more.go index eddfb7676..8ec22cdfd 100644 --- a/bindings/bindings/rollup_more.go +++ b/bindings/bindings/rollup_more.go @@ -13,7 +13,7 @@ const RollupStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"co var RollupStorageLayout = new(solc.StorageLayout) -var RollupDeployedBin = "0x6080604052600436106102b9575f3560e01c8063715018a611610170578063abc8d68d116100d1578063d279c19111610087578063de8b303511610062578063de8b3035146108ee578063e3fff1dd1461090d578063f2fde38b1461092c575f80fd5b8063d279c19114610890578063d63b3549146108af578063ddd8a3dc146108c2575f80fd5b8063b3e0a509116100b7578063b3e0a5091461083d578063bedb86fb1461085c578063ce5db8d61461087b575f80fd5b8063abc8d68d146107fd578063b31a77d314610828575f80fd5b8063910129d411610126578063a415d8dc1161010c578063a415d8dc1461079b578063a479265d146107c9578063a6b63eb8146107de575f80fd5b8063910129d41461074b57806397fc007c1461077c575f80fd5b80638d644bb7116101565780638d644bb7146106445780638da5cb5b146106575780638f1d377614610681575f80fd5b8063715018a61461061757806388b1ea091461062b575f80fd5b80632362f03e1161021a57806357e0af6c116101d05780635ef7a94a116101b65780635ef7a94a1461054c5780635f77cf1d146105ac5780636c578c1d146105f8575f80fd5b806357e0af6c146105165780635c975abb14610535575f80fd5b80632b7ac3f3116102005780632b7ac3f31461047a5780633b70c18a146104cb57806345792427146104f7575f80fd5b80632362f03e146104245780632571098d1461044f575f80fd5b8063121dcd501161026f57806318463fb01161025557806318463fb0146103c057806318af3b2b146103d557806321e2f9e014610405575f80fd5b8063121dcd501461038c57806313361101146103a1575f80fd5b80630ceb67801161029f5780630ceb67801461032a57806310d445831461034b578063116a1f421461036a575f80fd5b806304d77215146102c4578063059def6114610307575f80fd5b366102c057005b5f80fd5b3480156102cf575f80fd5b506102f26102de366004614824565b60a26020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610312575f80fd5b5061031c609c5481565b6040519081526020016102fe565b348015610335575f80fd5b50610349610344366004614863565b61094b565b005b348015610356575f80fd5b506103496103653660046148c1565b610a6f565b348015610375575f80fd5b506102f2610384366004614824565b609c54101590565b348015610397575f80fd5b5061031c609d5481565b3480156103ac575f80fd5b506103496103bb366004614909565b610e69565b3480156103cb575f80fd5b5061031c60a65481565b3480156103e0575f80fd5b506102f26103ef366004614824565b5f90815260a16020526040902060010154421090565b348015610410575f80fd5b506102f261041f366004614824565b611446565b34801561042f575f80fd5b5061031c61043e366004614824565b60a06020525f908152604090205481565b34801561045a575f80fd5b5061031c610469366004614824565b609f6020525f908152604090205481565b348015610485575f80fd5b50609b546104a69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102fe565b3480156104d6575f80fd5b50609a546104a69073ffffffffffffffffffffffffffffffffffffffff1681565b348015610502575f80fd5b50610349610511366004614948565b611474565b348015610521575f80fd5b50610349610530366004614824565b611750565b348015610540575f80fd5b5060655460ff166102f2565b348015610557575f80fd5b5061058c610566366004614824565b60a16020525f908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016102fe565b3480156105b7575f80fd5b506105df7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff90911681526020016102fe565b348015610603575f80fd5b50610349610612366004614863565b611815565b348015610622575f80fd5b50610349611924565b348015610636575f80fd5b5060a5546102f29060ff1681565b6103496106523660046149db565b611937565b348015610662575f80fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166104a6565b34801561068c575f80fd5b506106fa61069b366004614824565b60a36020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff8316936801000000000000000090930473ffffffffffffffffffffffffffffffffffffffff16929060ff8082169161010090041686565b6040805167ffffffffffffffff909716875273ffffffffffffffffffffffffffffffffffffffff909516602087015293850192909252606084015215156080830152151560a082015260c0016102fe565b348015610756575f80fd5b506102f2610765366004614824565b5f90815260a3602052604090206003015460ff1690565b348015610787575f80fd5b50610349610796366004614863565b611fd2565b3480156107a6575f80fd5b506102f26107b5366004614863565b609e6020525f908152604090205460ff1681565b3480156107d4575f80fd5b5061031c60995481565b3480156107e9575f80fd5b506103496107f8366004614a02565b6120f6565b348015610808575f80fd5b5061031c610817366004614863565b60a46020525f908152604090205481565b348015610833575f80fd5b5061031c60a75481565b348015610848575f80fd5b50610349610857366004614909565b61247f565b348015610867575f80fd5b50610349610876366004614a60565b6127f9565b348015610886575f80fd5b5061031c60985481565b34801561089b575f80fd5b506103496108aa366004614863565b612917565b6103496108bd366004614a7b565b6129ad565b3480156108cd575f80fd5b506097546104a69073ffffffffffffffffffffffffffffffffffffffff1681565b3480156108f9575f80fd5b506102f2610908366004614824565b613384565b348015610918575f80fd5b50610349610927366004614824565b6133db565b348015610937575f80fd5b50610349610946366004614863565b613498565b61095361354c565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609e602052604090205460ff16156109e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f818152609e602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610a7761354c565b5f8111610ae0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f000000000000000000000060448201526064016109de565b5f80610aec85856135cd565b915091505f610aff836001015160c01c90565b5f81815260a060205260409020549091508214610b78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f7272656374206261746368206861736800000000000000000000000060448201526064016109de565b5f60a081610b868785614b15565b81526020019081526020015f205414610c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e670000000000000000000000000000000000000000000000000000000060648201526084016109de565b609c548111610cb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f680000000000000000000000000000000000000000000000000000000000000060648201526084016109de565b610cbc600182614b28565b609d555b8315610e6157604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a06020908152604080832083905560a3909152902060030154610100900460ff16610d9c575f81815260a3602090815260408083206001810154905468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16845260a49092528220805491929091610d6e908490614b15565b909155505060a580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b5f81815260a36020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a75415801590610e19575060a75481145b15610e23575f60a7555b6001015f81815260a060205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610cc0575b505050505050565b60a75415610ed3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6565642072657665727400000000000000000000000000000000000000000060448201526064016109de565b610edb6135e8565b5f80610ee784846135cd565b915091505f610efa836001015160c01c90565b5f81815260a060205260409020549091508214610f73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f7272656374206261746368206861736800000000000000000000000060448201526064016109de565b610f7c81611446565b610fe2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6261746368206e6f74206578697374000000000000000000000000000000000060448201526064016109de565b610feb81613384565b15611052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f626174636820696e206368616c6c656e6765000000000000000000000000000060448201526064016109de565b5f81815260a3602052604090206003015460ff16156110cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f62617463682073686f756c64206265207265766572740000000000000000000060448201526064016109de565b5f81815260a16020526040902060010154421015611147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f770000000000000060448201526064016109de565b6059830151609f5f61115a600185614b28565b81526020019081526020015f2054146111cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f7400000060448201526064016109de565b5f818152609f602052604090205415611244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f626174636820616c72656164792076657269666965640000000000000000000060448201526064016109de565b80609c54600101146112b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e636f727265637420626174636820696e646578000000000000000000000060448201526064016109de565b609c819055600160a25f6112c7866099015190565b815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560798301515f828152609f602052604090205561133260f98401601185015160c01c600986015160c01c613655565b60a15f611340600184614b28565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560a391906113799084614b28565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a0909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d611422866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a160205260408120541580159061146e57505f82815260a0602052604090205415155b92915050565b60a754156114de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6565642072657665727400000000000000000000000000000000000000000060448201526064016109de565b6114e66135e8565b5f806114f288886135cd565b915091505f611505836001015160c01c90565b5f81815260a06020526040902054909150821461157e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f7272656374206261746368206861736800000000000000000000000060448201526064016109de565b61158781613384565b6115ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f626174636820696e206368616c6c656e6765000000000000000000000000000060448201526064016109de565b5f81815260a3602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055609954600290910154429161166491614b15565b116116f8575f81815260a360209081526040808320600390810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560a1835292819020909201548251808401909352600783527f54696d656f757400000000000000000000000000000000000000000000000000918301919091526116f39183919061372b565b611745565b61170583888888886138ae565b61174581336040518060400160405280600d81526020017f50726f6f66207375636365737300000000000000000000000000000000000000815250613c9b565b505050505050505050565b61175861354c565b5f8111801561176957506099548114155b6117cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f77000000000000000060448201526064016109de565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b61181d61354c565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609e602052604090205460ff166118ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e676572000000000060448201526064016109de565b73ffffffffffffffffffffffffffffffffffffffff81165f818152609e6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610a64565b61192c61354c565b6119355f613d42565b565b335f908152609e602052604090205460ff166119af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f7765640000000000000060448201526064016109de565b60a75415611a19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6565642072657665727400000000000000000000000000000000000000000060448201526064016109de565b611a216135e8565b60a55460ff1615611a8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f616c726561647920696e206368616c6c656e676500000000000000000000000060448201526064016109de565b8067ffffffffffffffff16609c5410611b03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f626174636820616c72656164792066696e616c697a656400000000000000000060448201526064016109de565b67ffffffffffffffff81165f90815260a060205260408120549003611b84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6261746368206e6f74206578697374000000000000000000000000000000000060448201526064016109de565b67ffffffffffffffff81165f90815260a3602052604090205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1615611c26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e676564000000000000000060448201526064016109de565b67ffffffffffffffff81165f90815260a160205260409020600101544210611cd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f770000000000000000000000000060648201526084016109de565b60975f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d5e9190614b3b565b341015611dc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e73756666696369656e742076616c7565000000000000000000000000000060448201526064016109de565b67ffffffffffffffff81811660a68190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a39095529690962094518554925173ffffffffffffffffffffffffffffffffffffffff1668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009093169290921792909217905573ffffffffffffffffffffffffffffffffffffffff168167ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b997634604051611f3391815260200190565b60405180910390a35f609c546001611f4b9190614b15565b90505b609d548111611fa3578167ffffffffffffffff168114611f91576099545f82815260a1602052604081206001018054909190611f8b908490614b15565b90915550505b80611f9b81614b52565b915050611f4e565b505060a580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b611fda61354c565b73ffffffffffffffffffffffffffffffffffffffff81161580159061201a5750609b5473ffffffffffffffffffffffffffffffffffffffff828116911614155b612080576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c6964206e657720766572696669657200000000000000000000000060448201526064016109de565b609b805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b5f54610100900460ff161580801561211457505f54600160ff909116105b8061212d5750303b15801561212d57505f5460ff166001145b6121b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016109de565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612215575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8516158061224c575073ffffffffffffffffffffffffffffffffffffffff8416155b15612283576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616612300576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e7472616374000000000060448201526064016109de565b612308613db8565b612310613e56565b6097805473ffffffffffffffffffffffffffffffffffffffff8089167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609a8054888416908316179055609b80549287169290911682179055609884905560998390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018590527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a18015610e61575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b61248761354c565b5f8052609f6020527fa705961f203609058950cfd817eb7a7627c9e270651c936aad3abdfa253727ec5415612518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f67656e6573697320626174636820696d706f727465640000000000000000000060448201526064016109de565b5f8061252484846135cd565b915091505f612537836001015160c01c90565b90505f612545846079015190565b9050806125ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f7a65726f20737461746520726f6f74000000000000000000000000000000000060448201526064016109de565b600984015160c01c1561261d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c64206265203000000060448201526064016109de565b5f612629856019015190565b03612690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7a65726f2064617461206861736800000000000000000000000000000000000060448201526064016109de565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440146126bc856039015190565b14612723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f696e76616c69642076657273696f6e656420686173680000000000000000000060448201526064016109de565b5f82815260a0602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a18652848720935184559151600184015551600283015551600390910155609f909152808220839055609d849055609c84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b61280161354c565b801561290f5761280f613ef4565b60a55460ff161561290c5760a6545f90815260a3602090815260408083206001810154905468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16845260a49092528220805491929091612870908490614b15565b909155505060a6545f90815260a36020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b50565b61290c613f79565b335f90815260a4602052604081205490819003612990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e67655265776172640000000060448201526064016109de565b335f90815260a460205260408120556129a98282613fd0565b5050565b60975473ffffffffffffffffffffffffffffffffffffffff166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015612a33573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a579190614b89565b612abd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f77656400000000000060448201526064016109de565b60a75415612b27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6565642072657665727400000000000000000000000000000000000000000060448201526064016109de565b612b2f6135e8565b612b3c6020830183614ba4565b60ff1615612ba6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c69642076657273696f6e000000000000000000000000000000000060448201526064016109de565b5f612bb46040840184614bc4565b91505080612c1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f626174636820697320656d70747900000000000000000000000000000000000060448201526064016109de565b6080830135612c89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f000000000060448201526064016109de565b60a0830135612cf4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f0000000000000000000060448201526064016109de565b5f80612d0b612d066020870187614bc4565b6135cd565b915091505f612d1e836001015160c01c90565b5f81815260a060205260409020549091508214612d97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e636f727265637420706172656e742062617463682068617368000000000060448201526064016109de565b5f60a081612da6846001614b15565b81526020019081526020015f205414612e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f626174636820616c726561647920636f6d6d697474656400000000000000000060448201526064016109de565b609d548114612e86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e636f727265637420626174636820696e646578000000000000000000000060448201526064016109de565b5f612e95846011015160c01c90565b90505f8080612ef4612eaa60408c018c614bc4565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250879250889150612eef905060608f018f614bc4565b6140a1565b948501949384019392509050612f0d60608b018b614bc4565b905061010060ff85010460200214612f81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f77726f6e67206269746d6170206c656e6774680000000000000000000000000060448201526064016109de565b600194909401935f804915612f97575f49612fb9565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b90505f612fc960608d018d614bc4565b612fd5915060f9614b15565b90506040519850602081028901604052613003898d5f016020810190612ffb9190614ba4565b60ff16614249565b60c087811b60018b015285811b60098b015286811b60118b015260198a0184905260808d013560598b015260a08d013560798b01528c013560998a01526130708961305160208e018e614bc4565b60405161305f929190614c25565b604051809103902060b99190910152565b60d9890188905261308d8961308860608f018f614bc4565b614250565b6039890182905280892060a05f8981526020019081526020015f20819055506040518060800160405280428152602001609854426130cb9190614b15565b815260200161311c8e80604001906130e39190614bc4565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061425c92505050565b815260975460209091019073ffffffffffffffffffffffffffffffffffffffff1663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa1580156131aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131ce9190614b3b565b90525f88815260a1602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609d88905560975473ffffffffffffffffffffffffffffffffffffffff1691506374fe27b7908c35906132429061323c908f018f614bc4565b5f6142b3565b5f8e80604001906132539190614bc4565b6040518663ffffffff1660e01b8152600401613273959493929190614c7b565b602060405180830381865afa15801561328e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132b29190614b89565b61333e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016109de565b5f86815260a06020526040808220549051909188917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050505050565b5f81815260a3602052604081205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff161580159061146e5750505f90815260a36020526040902060030154610100900460ff161590565b6133e361354c565b5f811180156133f457506098548114155b61345a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f64000000000060448201526064016109de565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101611809565b6134a061354c565b73ffffffffffffffffffffffffffffffffffffffff8116613543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109de565b61290c81613d42565b60335473ffffffffffffffffffffffffffffffffffffffff163314611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b5f805f6135da8585614307565b812090969095509350505050565b60655460ff1615611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016109de565b805f0361366157505050565b8082035f805b83811015610e615761010081850381111561368157508084035b8651609a546040517f55f613ce00000000000000000000000000000000000000000000000000000000815260048101879052602481018490526044810183905260209099019891945073ffffffffffffffffffffffffffffffffffffffff16906355f613ce906064015f604051808303815f87803b158015613701575f80fd5b505af1158015613713573d5f803e3d5ffd5b50505050610100840193505061010081019050613667565b60a78390555f83815260a360205260408082205460975491517f45bc4d10000000000000000000000000000000000000000000000000000000008152600481018690526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff908116939216906345bc4d10906024016020604051808303815f875af11580156137bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137e09190614b3b565b5f86815260a360205260409020600101549091506137ff908290614b15565b5f86815260a3602090815260408083205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16835260a49091528120805490919061384b908490614b15565b909155505060405161385e908490614d1d565b6040519081900381209073ffffffffffffffffffffffffffffffffffffffff84169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b82613915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f496e76616c6964206167677265676174696f6e2070726f6f660000000000000060448201526064016109de565b60a0811461397f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c6964204b5a4720646174612070726f6f660000000000000000000060448201526064016109de565b5f61398e866001015160c01c90565b90505f61399c876039015190565b90505f80600a73ffffffffffffffffffffffffffffffffffffffff168387876040516020016139cd93929190614d38565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052613a0591614d1d565b5f60405180830381855afa9150503d805f8114613a3d576040519150601f19603f3d011682016040523d82523d5f602084013e613a42565b606091505b509150915081613ad4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f6661696c656420746f2063616c6c20706f696e74206576616c756174696f6e2060448201527f707265636f6d70696c650000000000000000000000000000000000000000000060648201526084016109de565b5f81806020019051810190613ae99190614d51565b9150507f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff000000018114613b75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f707265636f6d70696c6520756e6578706563746564206f75747075740000000060448201526064016109de565b5050505f7f0000000000000000000000000000000000000000000000000000000000000000613ba5896059015190565b60798a015160998b015160b98c015160198d0151613bc660405f8c8e614d73565b89604051602001613bdf99989796959493929190614d9a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609b5490915073ffffffffffffffffffffffffffffffffffffffff16632c09a848613c418a5160f81c90565b858a8a866040518663ffffffff1660e01b8152600401613c65959493929190614dfd565b5f6040518083038186803b158015613c7b575f80fd5b505afa158015613c8d573d5f803e3d5ffd5b505050505050505050505050565b5f83815260a3602090815260408083206001015473ffffffffffffffffffffffffffffffffffffffff8616845260a49092528220805491928392613ce0908490614b15565b9091555050604051613cf3908390614d1d565b6040519081900381209073ffffffffffffffffffffffffffffffffffffffff85169086907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a450505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16613e4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109de565b611935614412565b5f54610100900460ff16613eec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109de565b6119356144d2565b613efc6135e8565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613f4f3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b613f81614571565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613f4f565b80156129a9575f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f811461402c576040519150601f19603f3d011682016040523d82523d5f602084013e614031565b606091505b505090508061409c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c6564000000000060448201526064016109de565b505050565b60405185515f918291602089019190819084906140bf9085906145dd565b90505f5b8181101561414a57603c8102850160018101518452602101517fffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000166020840152603a830192505f614115603c83614e2e565b614120876002614b15565b61412a9190614b15565b90505f61413b82603a015160f01c90565b979097019650506001016140c3565b506020850282016040526001840193505b8015614235575f61417085603a015160f01c90565b905061418083828d8d8d8d614672565b92505f614191866038015160f01c90565b9050818110156141fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6e756d20747873206c657373207468616e206e756d204c31206d73677300000060448201526064016109de565b50998a01999890980197603c93909301927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161415b565b508190039020989197509095505050505050565b8082535050565b808260f9850137505050565b5f805f6020840190506001810191505f6142778286516145dd565b90505f5b614286600183614b28565b81101561429c57603c939093019260010161427b565b505f6142a9845160c01c90565b9695505050505050565b60605f808080806142c6888a018a614f32565b95509550955095509550508187106142e45794506143009350505050565b8387106142f8578295505050505050614300565b509293505050505b9392505050565b5f8160f9811015614374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c00000060448201526064016109de565b6040519150808483378082016040525f614392836009015160c01c90565b905061010060ff82010460200260f901821461440a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f77726f6e67206269746d6170206c656e6774680000000000000000000000000060448201526064016109de565b509250929050565b5f54610100900460ff166144a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109de565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b5f54610100900460ff16614568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109de565b61193533613d42565b60655460ff16611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016109de565b5f6145e9835160f81c90565b9050805f03614624576040517f5168407700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61462f603c82614e2e565b61463a906002614b15565b821461146e576040517f4a969e2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f855f036146815750856142a9565b609a5473ffffffffffffffffffffffffffffffffffffffff165f80805b898110156147815760ff89169150600889901c8115806146bc575082155b156146cb578060200288013593505b600184841c165f03614770576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018a90525f9073ffffffffffffffffffffffffffffffffffffffff87169063ae453cd590602401602060405180830381865afa158015614742573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147669190614b3b565b8d52506020909b019a5b50600198890198978801970161469e565b505060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88011681811c60011615614816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f63616e6e6f7420736b6970206c617374204c31206d657373616765000000000060448201526064016109de565b509798975050505050505050565b5f60208284031215614834575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461485e575f80fd5b919050565b5f60208284031215614873575f80fd5b6143008261483b565b5f8083601f84011261488c575f80fd5b50813567ffffffffffffffff8111156148a3575f80fd5b6020830191508360208285010111156148ba575f80fd5b9250929050565b5f805f604084860312156148d3575f80fd5b833567ffffffffffffffff8111156148e9575f80fd5b6148f58682870161487c565b909790965060209590950135949350505050565b5f806020838503121561491a575f80fd5b823567ffffffffffffffff811115614930575f80fd5b61493c8582860161487c565b90969095509350505050565b5f805f805f806060878903121561495d575f80fd5b863567ffffffffffffffff80821115614974575f80fd5b6149808a838b0161487c565b90985096506020890135915080821115614998575f80fd5b6149a48a838b0161487c565b909650945060408901359150808211156149bc575f80fd5b506149c989828a0161487c565b979a9699509497509295939492505050565b5f602082840312156149eb575f80fd5b813567ffffffffffffffff81168114614300575f80fd5b5f805f805f60a08688031215614a16575f80fd5b614a1f8661483b565b9450614a2d6020870161483b565b9350614a3b6040870161483b565b94979396509394606081013594506080013592915050565b801515811461290c575f80fd5b5f60208284031215614a70575f80fd5b813561430081614a53565b5f8060408385031215614a8c575f80fd5b823567ffffffffffffffff80821115614aa3575f80fd5b9084019060e08287031215614ab6575f80fd5b90925060208401359080821115614acb575f80fd5b50830160608186031215614add575f80fd5b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561146e5761146e614ae8565b8181038181111561146e5761146e614ae8565b5f60208284031215614b4b575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614b8257614b82614ae8565b5060010190565b5f60208284031215614b99575f80fd5b815161430081614a53565b5f60208284031215614bb4575f80fd5b813560ff81168114614300575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614bf7575f80fd5b83018035915067ffffffffffffffff821115614c11575f80fd5b6020019150368190038213156148ba575f80fd5b818382375f9101908152919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b81811015614cd257845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101614ca0565b50508760408601528481036060860152614ced818789614c34565b9a9950505050505050505050565b5f5b83811015614d15578181015183820152602001614cfd565b50505f910152565b5f8251614d2e818460208701614cfb565b9190910192915050565b838152818360208301375f910160200190815292915050565b5f8060408385031215614d62575f80fd5b505080516020909101519092909150565b5f8085851115614d81575f80fd5b83861115614d8d575f80fd5b5050820193919092039150565b7fffffffffffffffff0000000000000000000000000000000000000000000000008a60c01b168152886008820152876028820152866048820152856068820152846088820152828460a883013760a892019182015260c801979650505050505050565b858152846020820152608060408201525f614e1c608083018587614c34565b90508260608301529695505050505050565b808202811582820484141761146e5761146e614ae8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112614e81575f80fd5b8135602067ffffffffffffffff80831115614e9e57614e9e614e45565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715614ee157614ee1614e45565b6040529384526020818701810194908101925087851115614f00575f80fd5b6020870191505b84821015614f2757614f188261483b565b83529183019190830190614f07565b979650505050505050565b5f805f805f8060c08789031215614f47575f80fd5b86359550602087013567ffffffffffffffff80821115614f65575f80fd5b614f718a838b01614e72565b9650604089013595506060890135915080821115614f8d575f80fd5b614f998a838b01614e72565b94506080890135935060a0890135915080821115614fb5575f80fd5b50614fc289828a01614e72565b915050929550929550929556fea164736f6c6343000818000a" +var RollupDeployedBin = "0x6080604052600436106102b9575f3560e01c8063715018a611610170578063abc8d68d116100d1578063d279c19111610087578063de8b303511610062578063de8b3035146108ee578063e3fff1dd1461090d578063f2fde38b1461092c575f80fd5b8063d279c19114610890578063d63b3549146108af578063ddd8a3dc146108c2575f80fd5b8063b3e0a509116100b7578063b3e0a5091461083d578063bedb86fb1461085c578063ce5db8d61461087b575f80fd5b8063abc8d68d146107fd578063b31a77d314610828575f80fd5b8063910129d411610126578063a415d8dc1161010c578063a415d8dc1461079b578063a479265d146107c9578063a6b63eb8146107de575f80fd5b8063910129d41461074b57806397fc007c1461077c575f80fd5b80638d644bb7116101565780638d644bb7146106445780638da5cb5b146106575780638f1d377614610681575f80fd5b8063715018a61461061757806388b1ea091461062b575f80fd5b80632362f03e1161021a57806357e0af6c116101d05780635ef7a94a116101b65780635ef7a94a1461054c5780635f77cf1d146105ac5780636c578c1d146105f8575f80fd5b806357e0af6c146105165780635c975abb14610535575f80fd5b80632b7ac3f3116102005780632b7ac3f31461047a5780633b70c18a146104cb57806345792427146104f7575f80fd5b80632362f03e146104245780632571098d1461044f575f80fd5b8063121dcd501161026f57806318463fb01161025557806318463fb0146103c057806318af3b2b146103d557806321e2f9e014610405575f80fd5b8063121dcd501461038c57806313361101146103a1575f80fd5b80630ceb67801161029f5780630ceb67801461032a57806310d445831461034b578063116a1f421461036a575f80fd5b806304d77215146102c4578063059def6114610307575f80fd5b366102c057005b5f80fd5b3480156102cf575f80fd5b506102f26102de366004614817565b60a26020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610312575f80fd5b5061031c609c5481565b6040519081526020016102fe565b348015610335575f80fd5b50610349610344366004614856565b61094b565b005b348015610356575f80fd5b506103496103653660046148b4565b610a6f565b348015610375575f80fd5b506102f2610384366004614817565b609c54101590565b348015610397575f80fd5b5061031c609d5481565b3480156103ac575f80fd5b506103496103bb3660046148fc565b610e69565b3480156103cb575f80fd5b5061031c60a65481565b3480156103e0575f80fd5b506102f26103ef366004614817565b5f90815260a16020526040902060010154421090565b348015610410575f80fd5b506102f261041f366004614817565b611446565b34801561042f575f80fd5b5061031c61043e366004614817565b60a06020525f908152604090205481565b34801561045a575f80fd5b5061031c610469366004614817565b609f6020525f908152604090205481565b348015610485575f80fd5b50609b546104a69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102fe565b3480156104d6575f80fd5b50609a546104a69073ffffffffffffffffffffffffffffffffffffffff1681565b348015610502575f80fd5b5061034961051136600461493b565b611474565b348015610521575f80fd5b50610349610530366004614817565b611750565b348015610540575f80fd5b5060655460ff166102f2565b348015610557575f80fd5b5061058c610566366004614817565b60a16020525f908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016102fe565b3480156105b7575f80fd5b506105df7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff90911681526020016102fe565b348015610603575f80fd5b50610349610612366004614856565b611815565b348015610622575f80fd5b50610349611924565b348015610636575f80fd5b5060a5546102f29060ff1681565b6103496106523660046149ce565b611937565b348015610662575f80fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166104a6565b34801561068c575f80fd5b506106fa61069b366004614817565b60a36020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff8316936801000000000000000090930473ffffffffffffffffffffffffffffffffffffffff16929060ff8082169161010090041686565b6040805167ffffffffffffffff909716875273ffffffffffffffffffffffffffffffffffffffff909516602087015293850192909252606084015215156080830152151560a082015260c0016102fe565b348015610756575f80fd5b506102f2610765366004614817565b5f90815260a3602052604090206003015460ff1690565b348015610787575f80fd5b50610349610796366004614856565b611fd2565b3480156107a6575f80fd5b506102f26107b5366004614856565b609e6020525f908152604090205460ff1681565b3480156107d4575f80fd5b5061031c60995481565b3480156107e9575f80fd5b506103496107f83660046149f5565b6120f6565b348015610808575f80fd5b5061031c610817366004614856565b60a46020525f908152604090205481565b348015610833575f80fd5b5061031c60a75481565b348015610848575f80fd5b506103496108573660046148fc565b61247f565b348015610867575f80fd5b50610349610876366004614a53565b6127f9565b348015610886575f80fd5b5061031c60985481565b34801561089b575f80fd5b506103496108aa366004614856565b612917565b6103496108bd366004614a6e565b6129ad565b3480156108cd575f80fd5b506097546104a69073ffffffffffffffffffffffffffffffffffffffff1681565b3480156108f9575f80fd5b506102f2610908366004614817565b613384565b348015610918575f80fd5b50610349610927366004614817565b6133db565b348015610937575f80fd5b50610349610946366004614856565b613498565b61095361354c565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609e602052604090205460ff16156109e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f818152609e602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610a7761354c565b5f8111610ae0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f000000000000000000000060448201526064016109de565b5f80610aec85856135cd565b915091505f610aff836001015160c01c90565b5f81815260a060205260409020549091508214610b78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f7272656374206261746368206861736800000000000000000000000060448201526064016109de565b5f60a081610b868785614b08565b81526020019081526020015f205414610c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e670000000000000000000000000000000000000000000000000000000060648201526084016109de565b609c548111610cb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f680000000000000000000000000000000000000000000000000000000000000060648201526084016109de565b610cbc600182614b1b565b609d555b8315610e6157604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a06020908152604080832083905560a3909152902060030154610100900460ff16610d9c575f81815260a3602090815260408083206001810154905468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16845260a49092528220805491929091610d6e908490614b08565b909155505060a580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b5f81815260a36020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a75415801590610e19575060a75481145b15610e23575f60a7555b6001015f81815260a060205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610cc0575b505050505050565b60a75415610ed3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6565642072657665727400000000000000000000000000000000000000000060448201526064016109de565b610edb6135e8565b5f80610ee784846135cd565b915091505f610efa836001015160c01c90565b5f81815260a060205260409020549091508214610f73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f7272656374206261746368206861736800000000000000000000000060448201526064016109de565b610f7c81611446565b610fe2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6261746368206e6f74206578697374000000000000000000000000000000000060448201526064016109de565b610feb81613384565b15611052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f626174636820696e206368616c6c656e6765000000000000000000000000000060448201526064016109de565b5f81815260a3602052604090206003015460ff16156110cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f62617463682073686f756c64206265207265766572740000000000000000000060448201526064016109de565b5f81815260a16020526040902060010154421015611147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f770000000000000060448201526064016109de565b6059830151609f5f61115a600185614b1b565b81526020019081526020015f2054146111cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f7400000060448201526064016109de565b5f818152609f602052604090205415611244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f626174636820616c72656164792076657269666965640000000000000000000060448201526064016109de565b80609c54600101146112b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e636f727265637420626174636820696e646578000000000000000000000060448201526064016109de565b609c819055600160a25f6112c7866099015190565b815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560798301515f828152609f602052604090205561133260f98401601185015160c01c600986015160c01c613655565b60a15f611340600184614b1b565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560a391906113799084614b1b565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a0909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d611422866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a160205260408120541580159061146e57505f82815260a0602052604090205415155b92915050565b60a754156114de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6565642072657665727400000000000000000000000000000000000000000060448201526064016109de565b6114e66135e8565b5f806114f288886135cd565b915091505f611505836001015160c01c90565b5f81815260a06020526040902054909150821461157e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f7272656374206261746368206861736800000000000000000000000060448201526064016109de565b61158781613384565b6115ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f626174636820696e206368616c6c656e6765000000000000000000000000000060448201526064016109de565b5f81815260a3602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055609954600290910154429161166491614b08565b116116f8575f81815260a360209081526040808320600390810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560a1835292819020909201548251808401909352600783527f54696d656f757400000000000000000000000000000000000000000000000000918301919091526116f39183919061372b565b611745565b61170583888888886138ae565b61174581336040518060400160405280600d81526020017f50726f6f66207375636365737300000000000000000000000000000000000000815250613c9b565b505050505050505050565b61175861354c565b5f8111801561176957506099548114155b6117cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f77000000000000000060448201526064016109de565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b61181d61354c565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609e602052604090205460ff166118ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e676572000000000060448201526064016109de565b73ffffffffffffffffffffffffffffffffffffffff81165f818152609e6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610a64565b61192c61354c565b6119355f613d42565b565b335f908152609e602052604090205460ff166119af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f7765640000000000000060448201526064016109de565b60a75415611a19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6565642072657665727400000000000000000000000000000000000000000060448201526064016109de565b611a216135e8565b60a55460ff1615611a8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f616c726561647920696e206368616c6c656e676500000000000000000000000060448201526064016109de565b8067ffffffffffffffff16609c5410611b03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f626174636820616c72656164792066696e616c697a656400000000000000000060448201526064016109de565b67ffffffffffffffff81165f90815260a060205260408120549003611b84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6261746368206e6f74206578697374000000000000000000000000000000000060448201526064016109de565b67ffffffffffffffff81165f90815260a3602052604090205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1615611c26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e676564000000000000000060448201526064016109de565b67ffffffffffffffff81165f90815260a160205260409020600101544210611cd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f770000000000000000000000000060648201526084016109de565b60975f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d5e9190614b2e565b341015611dc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e73756666696369656e742076616c7565000000000000000000000000000060448201526064016109de565b67ffffffffffffffff81811660a68190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a39095529690962094518554925173ffffffffffffffffffffffffffffffffffffffff1668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009093169290921792909217905573ffffffffffffffffffffffffffffffffffffffff168167ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b997634604051611f3391815260200190565b60405180910390a35f609c546001611f4b9190614b08565b90505b609d548111611fa3578167ffffffffffffffff168114611f91576099545f82815260a1602052604081206001018054909190611f8b908490614b08565b90915550505b80611f9b81614b45565b915050611f4e565b505060a580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b611fda61354c565b73ffffffffffffffffffffffffffffffffffffffff81161580159061201a5750609b5473ffffffffffffffffffffffffffffffffffffffff828116911614155b612080576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c6964206e657720766572696669657200000000000000000000000060448201526064016109de565b609b805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b5f54610100900460ff161580801561211457505f54600160ff909116105b8061212d5750303b15801561212d57505f5460ff166001145b6121b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016109de565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612215575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8516158061224c575073ffffffffffffffffffffffffffffffffffffffff8416155b15612283576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616612300576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e7472616374000000000060448201526064016109de565b612308613db8565b612310613e56565b6097805473ffffffffffffffffffffffffffffffffffffffff8089167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609a8054888416908316179055609b80549287169290911682179055609884905560998390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018590527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a18015610e61575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b61248761354c565b5f8052609f6020527fa705961f203609058950cfd817eb7a7627c9e270651c936aad3abdfa253727ec5415612518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f67656e6573697320626174636820696d706f727465640000000000000000000060448201526064016109de565b5f8061252484846135cd565b915091505f612537836001015160c01c90565b90505f612545846079015190565b9050806125ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f7a65726f20737461746520726f6f74000000000000000000000000000000000060448201526064016109de565b600984015160c01c1561261d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c64206265203000000060448201526064016109de565b5f612629856019015190565b03612690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7a65726f2064617461206861736800000000000000000000000000000000000060448201526064016109de565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440146126bc856039015190565b14612723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f696e76616c69642076657273696f6e656420686173680000000000000000000060448201526064016109de565b5f82815260a0602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a18652848720935184559151600184015551600283015551600390910155609f909152808220839055609d849055609c84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b61280161354c565b801561290f5761280f613ef4565b60a55460ff161561290c5760a6545f90815260a3602090815260408083206001810154905468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16845260a49092528220805491929091612870908490614b08565b909155505060a6545f90815260a36020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b50565b61290c613f79565b335f90815260a4602052604081205490819003612990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e67655265776172640000000060448201526064016109de565b335f90815260a460205260408120556129a98282613fd0565b5050565b60975473ffffffffffffffffffffffffffffffffffffffff166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015612a33573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a579190614b7c565b612abd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f77656400000000000060448201526064016109de565b60a75415612b27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6565642072657665727400000000000000000000000000000000000000000060448201526064016109de565b612b2f6135e8565b612b3c6020830183614b97565b60ff1615612ba6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c69642076657273696f6e000000000000000000000000000000000060448201526064016109de565b5f612bb46040840184614bb7565b91505080612c1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f626174636820697320656d70747900000000000000000000000000000000000060448201526064016109de565b6080830135612c89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f000000000060448201526064016109de565b60a0830135612cf4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f0000000000000000000060448201526064016109de565b5f80612d0b612d066020870187614bb7565b6135cd565b915091505f612d1e836001015160c01c90565b5f81815260a060205260409020549091508214612d97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e636f727265637420706172656e742062617463682068617368000000000060448201526064016109de565b5f60a081612da6846001614b08565b81526020019081526020015f205414612e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f626174636820616c726561647920636f6d6d697474656400000000000000000060448201526064016109de565b609d548114612e86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e636f727265637420626174636820696e646578000000000000000000000060448201526064016109de565b5f612e95846011015160c01c90565b90505f8080612ef4612eaa60408c018c614bb7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250879250889150612eef905060608f018f614bb7565b6140a1565b948501949384019392509050612f0d60608b018b614bb7565b905061010060ff85010460200214612f81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f77726f6e67206269746d6170206c656e6774680000000000000000000000000060448201526064016109de565b600194909401935f804915612f97575f49612fb9565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b90505f612fc960608d018d614bb7565b612fd5915060f9614b08565b90506040519850602081028901604052613003898d5f016020810190612ffb9190614b97565b60ff1661423c565b60c087811b60018b015285811b60098b015286811b60118b015260198a0184905260808d013560598b015260a08d013560798b01528c013560998a01526130708961305160208e018e614bb7565b60405161305f929190614c18565b604051809103902060b99190910152565b60d9890188905261308d8961308860608f018f614bb7565b614243565b6039890182905280892060a05f8981526020019081526020015f20819055506040518060800160405280428152602001609854426130cb9190614b08565b815260200161311c8e80604001906130e39190614bb7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061424f92505050565b815260975460209091019073ffffffffffffffffffffffffffffffffffffffff1663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa1580156131aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131ce9190614b2e565b90525f88815260a1602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609d88905560975473ffffffffffffffffffffffffffffffffffffffff1691506374fe27b7908c35906132429061323c908f018f614bb7565b5f6142a6565b5f8e80604001906132539190614bb7565b6040518663ffffffff1660e01b8152600401613273959493929190614c6e565b602060405180830381865afa15801561328e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132b29190614b7c565b61333e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016109de565b5f86815260a06020526040808220549051909188917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050505050565b5f81815260a3602052604081205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff161580159061146e5750505f90815260a36020526040902060030154610100900460ff161590565b6133e361354c565b5f811180156133f457506098548114155b61345a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f64000000000060448201526064016109de565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101611809565b6134a061354c565b73ffffffffffffffffffffffffffffffffffffffff8116613543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109de565b61290c81613d42565b60335473ffffffffffffffffffffffffffffffffffffffff163314611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b5f805f6135da85856142fa565b812090969095509350505050565b60655460ff1615611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016109de565b805f0361366157505050565b8082035f805b83811015610e615761010081850381111561368157508084035b8651609a546040517f55f613ce00000000000000000000000000000000000000000000000000000000815260048101879052602481018490526044810183905260209099019891945073ffffffffffffffffffffffffffffffffffffffff16906355f613ce906064015f604051808303815f87803b158015613701575f80fd5b505af1158015613713573d5f803e3d5ffd5b50505050610100840193505061010081019050613667565b60a78390555f83815260a360205260408082205460975491517f45bc4d10000000000000000000000000000000000000000000000000000000008152600481018690526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff908116939216906345bc4d10906024016020604051808303815f875af11580156137bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137e09190614b2e565b5f86815260a360205260409020600101549091506137ff908290614b08565b5f86815260a3602090815260408083205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16835260a49091528120805490919061384b908490614b08565b909155505060405161385e908490614d10565b6040519081900381209073ffffffffffffffffffffffffffffffffffffffff84169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b82613915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f496e76616c6964206167677265676174696f6e2070726f6f660000000000000060448201526064016109de565b60a0811461397f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c6964204b5a4720646174612070726f6f660000000000000000000060448201526064016109de565b5f61398e866001015160c01c90565b90505f61399c876039015190565b90505f80600a73ffffffffffffffffffffffffffffffffffffffff168387876040516020016139cd93929190614d2b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052613a0591614d10565b5f60405180830381855afa9150503d805f8114613a3d576040519150601f19603f3d011682016040523d82523d5f602084013e613a42565b606091505b509150915081613ad4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f6661696c656420746f2063616c6c20706f696e74206576616c756174696f6e2060448201527f707265636f6d70696c650000000000000000000000000000000000000000000060648201526084016109de565b5f81806020019051810190613ae99190614d44565b9150507f73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff000000018114613b75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f707265636f6d70696c6520756e6578706563746564206f75747075740000000060448201526064016109de565b5050505f7f0000000000000000000000000000000000000000000000000000000000000000613ba5896059015190565b60798a015160998b015160b98c015160198d0151613bc660405f8c8e614d66565b89604051602001613bdf99989796959493929190614d8d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609b5490915073ffffffffffffffffffffffffffffffffffffffff16632c09a848613c418a5160f81c90565b858a8a866040518663ffffffff1660e01b8152600401613c65959493929190614df0565b5f6040518083038186803b158015613c7b575f80fd5b505afa158015613c8d573d5f803e3d5ffd5b505050505050505050505050565b5f83815260a3602090815260408083206001015473ffffffffffffffffffffffffffffffffffffffff8616845260a49092528220805491928392613ce0908490614b08565b9091555050604051613cf3908390614d10565b6040519081900381209073ffffffffffffffffffffffffffffffffffffffff85169086907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a450505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16613e4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109de565b611935614405565b5f54610100900460ff16613eec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109de565b6119356144c5565b613efc6135e8565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613f4f3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b613f81614564565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613f4f565b80156129a9575f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f811461402c576040519150601f19603f3d011682016040523d82523d5f602084013e614031565b606091505b505090508061409c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c6564000000000060448201526064016109de565b505050565b60405185515f918291602089019190819084906140bf9085906145d0565b90506002840193505f5b8181101561414357603c81028501805184526020908101517fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001690840152603a830192505f614119603c83614e21565b6141239087614b08565b90505f61413482603a015160f01c90565b979097019650506001016140c9565b506020850282016040525b8015614228575f61416385603a015160f01c90565b905061417383828d8d8d8d614665565b92505f614184866038015160f01c90565b9050818110156141f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6e756d20747873206c657373207468616e206e756d204c31206d73677300000060448201526064016109de565b50998a01999890980197603c93909301927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161414e565b508190039020989197509095505050505050565b8082535050565b808260f9850137505050565b5f805f6020840190506001810191505f61426a8286516145d0565b90505f5b614279600183614b1b565b81101561428f57603c939093019260010161426e565b505f61429c845160c01c90565b9695505050505050565b60605f808080806142b9888a018a614f25565b95509550955095509550508187106142d75794506142f39350505050565b8387106142eb5782955050505050506142f3565b509293505050505b9392505050565b5f8160f9811015614367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c00000060448201526064016109de565b6040519150808483378082016040525f614385836009015160c01c90565b905061010060ff82010460200260f90182146143fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f77726f6e67206269746d6170206c656e6774680000000000000000000000000060448201526064016109de565b509250929050565b5f54610100900460ff1661449b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109de565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b5f54610100900460ff1661455b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109de565b61193533613d42565b60655460ff16611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016109de565b5f6145dc835160f01c90565b9050805f03614617576040517f5168407700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614622603c82614e21565b61462d906002614b08565b821461146e576040517f4a969e2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f855f0361467457508561429c565b609a5473ffffffffffffffffffffffffffffffffffffffff165f80805b898110156147745760ff89169150600889901c8115806146af575082155b156146be578060200288013593505b600184841c165f03614763576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018a90525f9073ffffffffffffffffffffffffffffffffffffffff87169063ae453cd590602401602060405180830381865afa158015614735573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147599190614b2e565b8d52506020909b019a5b506001988901989788019701614691565b505060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88011681811c60011615614809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f63616e6e6f7420736b6970206c617374204c31206d657373616765000000000060448201526064016109de565b509798975050505050505050565b5f60208284031215614827575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114614851575f80fd5b919050565b5f60208284031215614866575f80fd5b6142f38261482e565b5f8083601f84011261487f575f80fd5b50813567ffffffffffffffff811115614896575f80fd5b6020830191508360208285010111156148ad575f80fd5b9250929050565b5f805f604084860312156148c6575f80fd5b833567ffffffffffffffff8111156148dc575f80fd5b6148e88682870161486f565b909790965060209590950135949350505050565b5f806020838503121561490d575f80fd5b823567ffffffffffffffff811115614923575f80fd5b61492f8582860161486f565b90969095509350505050565b5f805f805f8060608789031215614950575f80fd5b863567ffffffffffffffff80821115614967575f80fd5b6149738a838b0161486f565b9098509650602089013591508082111561498b575f80fd5b6149978a838b0161486f565b909650945060408901359150808211156149af575f80fd5b506149bc89828a0161486f565b979a9699509497509295939492505050565b5f602082840312156149de575f80fd5b813567ffffffffffffffff811681146142f3575f80fd5b5f805f805f60a08688031215614a09575f80fd5b614a128661482e565b9450614a206020870161482e565b9350614a2e6040870161482e565b94979396509394606081013594506080013592915050565b801515811461290c575f80fd5b5f60208284031215614a63575f80fd5b81356142f381614a46565b5f8060408385031215614a7f575f80fd5b823567ffffffffffffffff80821115614a96575f80fd5b9084019060e08287031215614aa9575f80fd5b90925060208401359080821115614abe575f80fd5b50830160608186031215614ad0575f80fd5b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561146e5761146e614adb565b8181038181111561146e5761146e614adb565b5f60208284031215614b3e575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614b7557614b75614adb565b5060010190565b5f60208284031215614b8c575f80fd5b81516142f381614a46565b5f60208284031215614ba7575f80fd5b813560ff811681146142f3575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614bea575f80fd5b83018035915067ffffffffffffffff821115614c04575f80fd5b6020019150368190038213156148ad575f80fd5b818382375f9101908152919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b81811015614cc557845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101614c93565b50508760408601528481036060860152614ce0818789614c27565b9a9950505050505050505050565b5f5b83811015614d08578181015183820152602001614cf0565b50505f910152565b5f8251614d21818460208701614cee565b9190910192915050565b838152818360208301375f910160200190815292915050565b5f8060408385031215614d55575f80fd5b505080516020909101519092909150565b5f8085851115614d74575f80fd5b83861115614d80575f80fd5b5050820193919092039150565b7fffffffffffffffff0000000000000000000000000000000000000000000000008a60c01b168152886008820152876028820152866048820152856068820152846088820152828460a883013760a892019182015260c801979650505050505050565b858152846020820152608060408201525f614e0f608083018587614c27565b90508260608301529695505050505050565b808202811582820484141761146e5761146e614adb565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112614e74575f80fd5b8135602067ffffffffffffffff80831115614e9157614e91614e38565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715614ed457614ed4614e38565b6040529384526020818701810194908101925087851115614ef3575f80fd5b6020870191505b84821015614f1a57614f0b8261482e565b83529183019190830190614efa565b979650505050505050565b5f805f805f8060c08789031215614f3a575f80fd5b86359550602087013567ffffffffffffffff80821115614f58575f80fd5b614f648a838b01614e65565b9650604089013595506060890135915080821115614f80575f80fd5b614f8c8a838b01614e65565b94506080890135935060a0890135915080821115614fa8575f80fd5b50614fb589828a01614e65565b915050929550929550929556fea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(RollupStorageLayoutJSON), RollupStorageLayout); err != nil { diff --git a/contracts/contracts/l1/rollup/Rollup.sol b/contracts/contracts/l1/rollup/Rollup.sol index c80ef057b..3787c8cea 100644 --- a/contracts/contracts/l1/rollup/Rollup.sol +++ b/contracts/contracts/l1/rollup/Rollup.sol @@ -173,9 +173,9 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { uint256 _batchIndex = BatchHeaderCodecV0.getBatchIndex(memPtr); bytes32 _postStateRoot = BatchHeaderCodecV0.getPostStateHash(memPtr); require(_postStateRoot != bytes32(0), "zero state root"); - // check all fields except `l1DataHash` and `lastBlockHash` are zero + // check all fields except `dataHash` and `lastBlockHash` are zero require(BatchHeaderCodecV0.getL1MessagePopped(memPtr) == 0, "l1 message popped should be 0"); - require(BatchHeaderCodecV0.getL1DataHash(memPtr) != bytes32(0), "zero data hash"); + require(BatchHeaderCodecV0.getDataHash(memPtr) != bytes32(0), "zero data hash"); require(BatchHeaderCodecV0.getBlobVersionedHash(memPtr) == ZERO_VERSIONED_HASH, "invalid versioned hash"); committedBatches[_batchIndex] = _batchHash; @@ -223,8 +223,8 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { // compute the data hash for batch uint256 _totalL1MessagesPoppedInBatch; uint256 _totalNumL1Messages; - bytes32 _l1DataHash; - (_l1DataHash, _totalNumL1Messages) = _commitBatch( + bytes32 dataHash; + (dataHash, _totalNumL1Messages) = _commitBatch( batchDataInput.blockContexts, _totalL1MessagesPoppedInBatch, _totalL1MessagesPoppedOverall, @@ -258,7 +258,7 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { BatchHeaderCodecV0.storeBatchIndex(_batchPtr, _batchIndex); BatchHeaderCodecV0.storeL1MessagePopped(_batchPtr, _totalL1MessagesPoppedInBatch); BatchHeaderCodecV0.storeTotalL1MessagePopped(_batchPtr, _totalL1MessagesPoppedOverall); - BatchHeaderCodecV0.storeDataHash(_batchPtr, _l1DataHash); + BatchHeaderCodecV0.storeDataHash(_batchPtr, dataHash); BatchHeaderCodecV0.storePrevStateHash(_batchPtr, batchDataInput.prevStateRoot); BatchHeaderCodecV0.storePostStateHash(_batchPtr, batchDataInput.postStateRoot); BatchHeaderCodecV0.storeWithdrawRootHash(_batchPtr, batchDataInput.withdrawalRoot); @@ -603,7 +603,7 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { BatchHeaderCodecV0.getPostStateHash(memPtr), BatchHeaderCodecV0.getWithdrawRootHash(memPtr), BatchHeaderCodecV0.getSequencerSetVerifyHash(memPtr), - BatchHeaderCodecV0.getL1DataHash(memPtr), + BatchHeaderCodecV0.getDataHash(memPtr), _kzgDataProof[0:64], _blobVersionedHash ) @@ -736,10 +736,13 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { } uint256 _numBlocks = BatchCodecV0.validateBatchLength(batchPtr, _blockContexts.length); + assembly { + batchPtr := add(batchPtr, 2) // skip numBlocks + } // concatenate block contexts, use scope to avoid stack too deep for (uint256 i = 0; i < _numBlocks; i++) { dataPtr = BatchCodecV0.copyBlockContext(batchPtr, dataPtr, i); - uint256 blockPtr = batchPtr + 2 + i * BatchCodecV0.BLOCK_CONTEXT_LENGTH; + uint256 blockPtr = batchPtr + i * BatchCodecV0.BLOCK_CONTEXT_LENGTH; uint256 _numL1MessagesInBlock = BatchCodecV0.getNumL1Messages(blockPtr); unchecked { _totalNumL1MessagesInBatch += _numL1MessagesInBlock; @@ -747,7 +750,6 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { } assembly { mstore(0x40, add(dataPtr, mul(_totalNumL1MessagesInBatch, 0x20))) // reserve memory for l1 message hashes - batchPtr := add(batchPtr, 2) // skip numBlocks } // concatenate tx hashes diff --git a/contracts/contracts/libraries/codec/BatchCodecV0.sol b/contracts/contracts/libraries/codec/BatchCodecV0.sol index 351db51b0..bc2254068 100644 --- a/contracts/contracts/libraries/codec/BatchCodecV0.sol +++ b/contracts/contracts/libraries/codec/BatchCodecV0.sol @@ -59,18 +59,18 @@ library BatchCodecV0 { } /// @notice Copy the block context to another memory. - /// @param batchPtr The start memory offset of the batch in memory. + /// @param blockPtr The start memory offset of the first block context in memory. /// @param dstPtr The destination memory offset to store the block context. /// @param index The index of block context to copy. /// @return uint256 The new destination memory offset after copy. - function copyBlockContext(uint256 batchPtr, uint256 dstPtr, uint256 index) internal pure returns (uint256) { + function copyBlockContext(uint256 blockPtr, uint256 dstPtr, uint256 index) internal pure returns (uint256) { // only first 58 bytes is needed. assembly { - batchPtr := add(batchPtr, add(1, mul(BLOCK_CONTEXT_LENGTH, index))) - mstore(dstPtr, mload(batchPtr)) // first 32 bytes + blockPtr := add(blockPtr, mul(BLOCK_CONTEXT_LENGTH, index)) + mstore(dstPtr, mload(blockPtr)) // first 32 bytes mstore( add(dstPtr, 0x20), - and(mload(add(batchPtr, 0x20)), 0xffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000) + and(mload(add(blockPtr, 0x20)), 0xffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000) ) // next 26 bytes dstPtr := add(dstPtr, 58) diff --git a/contracts/contracts/libraries/codec/BatchHeaderCodecV0.sol b/contracts/contracts/libraries/codec/BatchHeaderCodecV0.sol index 07596d826..de79c7737 100644 --- a/contracts/contracts/libraries/codec/BatchHeaderCodecV0.sol +++ b/contracts/contracts/libraries/codec/BatchHeaderCodecV0.sol @@ -85,7 +85,7 @@ library BatchHeaderCodecV0 { /// @notice Get the data hash of the batch header. /// @param batchPtr The start memory offset of the batch header in memory. /// @return _dataHash The data hash of the batch header. - function getL1DataHash(uint256 batchPtr) internal pure returns (bytes32 _dataHash) { + function getDataHash(uint256 batchPtr) internal pure returns (bytes32 _dataHash) { assembly { _dataHash := mload(add(batchPtr, 25)) } diff --git a/contracts/contracts/mock/BatchHeaderCodecTest.sol b/contracts/contracts/mock/BatchHeaderCodecTest.sol index 69c67305d..6bd6ea019 100644 --- a/contracts/contracts/mock/BatchHeaderCodecTest.sol +++ b/contracts/contracts/mock/BatchHeaderCodecTest.sol @@ -52,9 +52,9 @@ contract BatchHeaderCodecTest { return BatchHeaderCodecV0.getTotalL1MessagePopped(batchPtr); } - function getL1DataHash(bytes calldata _batchHeader) public pure returns (bytes32 _dataHash) { + function getDataHash(bytes calldata _batchHeader) public pure returns (bytes32 _dataHash) { (uint256 batchPtr, ) = BatchHeaderCodecV0.loadAndValidate(_batchHeader); - return BatchHeaderCodecV0.getL1DataHash(batchPtr); + return BatchHeaderCodecV0.getDataHash(batchPtr); } function getBlobVersionedHash(bytes calldata _batchHeader) public pure returns (bytes32 _blobVersionedHash) { diff --git a/contracts/contracts/test/Rollup.t.sol b/contracts/contracts/test/Rollup.t.sol index 56acaf295..546195b15 100644 --- a/contracts/contracts/test/Rollup.t.sol +++ b/contracts/contracts/test/Rollup.t.sol @@ -61,13 +61,13 @@ contract RollupCommitBatchTest is L1MessageBaseTest { // commit batch1, one batch with one block, 1 tx, 1 L1 message, no skip // => l1 data hash for batch - // 0xf1f131b7336b7621026325f6b5519cebcdf42a1fcb520bec47af5a9bd54848af + // 0x9ef1e5694bdb014a1eea42be756a8f63bfd8781d6332e9ef3b5126d90c62f110 // => payload for batch header // 00 // 0000000000000001 // 0000000000000001 // 0000000000000001 - // f1f131b7336b7621026325f6b5519cebcdf42a1fcb520bec47af5a9bd54848af + // 9ef1e5694bdb014a1eea42be756a8f63bfd8781d6332e9ef3b5126d90c62f110 // 010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014 // 0000000000000000000000000000000000000000000000000000000000000001 // 0000000000000000000000000000000000000000000000000000000000000002 @@ -82,7 +82,7 @@ contract RollupCommitBatchTest is L1MessageBaseTest { mstore(add(batchHeader1, add(0x20, 1)), shl(192, 1)) // batchIndex = 1 mstore(add(batchHeader1, add(0x20, 9)), shl(192, 1)) // l1MessagePopped = 1 mstore(add(batchHeader1, add(0x20, 17)), shl(192, 1)) // totalL1MessagePopped = 1 - mstore(add(batchHeader1, add(0x20, 25)), 0xf1f131b7336b7621026325f6b5519cebcdf42a1fcb520bec47af5a9bd54848af) // l1dataHash + mstore(add(batchHeader1, add(0x20, 25)), 0x9ef1e5694bdb014a1eea42be756a8f63bfd8781d6332e9ef3b5126d90c62f110) // dataHash mstore(add(batchHeader1, add(0x20, 57)), 0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014) // l2 tx blob versioned hash mstore(add(batchHeader1, add(0x20, 89)), bytesData1) // prevStateHash mstore(add(batchHeader1, add(0x20, 121)), bytesData1) // postStateHash @@ -113,14 +113,14 @@ contract RollupCommitBatchTest is L1MessageBaseTest { ); hevm.startPrank(address(0)); hevm.expectEmit(true, true, false, true); - emit IRollup.CommitBatch(1, bytes32(0x936ca0be1c54c890ff243f3b4aea6aa8aefd1292fecae5da57f9f60f66a78bdb)); + emit IRollup.CommitBatch(1, bytes32(0x135ab7153517794b38566492dee2a60426285da9764f8ad07da93cf7dd560a59)); batchDataInput = IRollup.BatchDataInput(0, batchHeader0, batch, bitmap, bytesData1, bytesData1, bytesData3); rollup.commitBatch(batchDataInput, batchSignatureInput); hevm.stopPrank(); assertFalse(rollup.isBatchFinalized(1)); bytes32 batchHash1 = rollup.committedBatches(1); - assertEq(batchHash1, bytes32(0x936ca0be1c54c890ff243f3b4aea6aa8aefd1292fecae5da57f9f60f66a78bdb)); + assertEq(batchHash1, bytes32(0x135ab7153517794b38566492dee2a60426285da9764f8ad07da93cf7dd560a59)); emit log_bytes32(batchHash0); // finalize batch1 @@ -144,7 +144,7 @@ contract RollupCommitBatchTest is L1MessageBaseTest { mstore(add(batchHeader2, add(0x20, 1)), shl(192, 2)) // batchIndex = 2 mstore(add(batchHeader2, add(0x20, 9)), shl(192, 264)) // l1MessagePopped = 264 mstore(add(batchHeader2, add(0x20, 17)), shl(192, 265)) // totalL1MessagePopped = 265 - mstore(add(batchHeader2, add(0x20, 25)), 0x1fd1f1462d3818d690c872d065fa1196321a153a22f017d593e0cf774b5ad405) // dataHash + mstore(add(batchHeader2, add(0x20, 25)), 0xc67045fcf768071021f5acec08a921553fdae4c33a675d38e4c4a25589c91120) // dataHash mstore(add(batchHeader2, add(0x20, 57)), 0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014) // l2 tx blob versioned hash mstore(add(batchHeader2, add(0x20, 89)), bytesData1) // prevStateHash mstore(add(batchHeader2, add(0x20, 121)), bytesData1) // postStateHash @@ -195,7 +195,7 @@ contract RollupCommitBatchTest is L1MessageBaseTest { ); hevm.startPrank(address(0)); hevm.expectEmit(true, true, false, true); - emit IRollup.CommitBatch(2, bytes32(0xbf4a9c9cafaa1979143075687a43a464e05c8a2723ed41d12c7c6a58a4b04cd1)); + emit IRollup.CommitBatch(2, bytes32(0x71259c7573b1db248381cef917270058e2ca20620c6eae975a1aa76b9858392a)); batchDataInput = IRollup.BatchDataInput(0, batchHeader1, batch, bitmap, bytesData1, bytesData1, bytesData4); rollup.commitBatch(batchDataInput, batchSignatureInput); @@ -203,7 +203,7 @@ contract RollupCommitBatchTest is L1MessageBaseTest { hevm.stopPrank(); assertFalse(rollup.isBatchFinalized(2)); bytes32 batchHash2 = rollup.committedBatches(2); - assertEq(batchHash2, bytes32(0xbf4a9c9cafaa1979143075687a43a464e05c8a2723ed41d12c7c6a58a4b04cd1)); + assertEq(batchHash2, bytes32(0x71259c7573b1db248381cef917270058e2ca20620c6eae975a1aa76b9858392a)); // verify committed batch correctly hevm.startPrank(address(0)); @@ -537,14 +537,14 @@ contract RollupTest is L1MessageBaseTest { ); rollup.commitBatch(batchDataInput, batchSignatureInput); // first chunk with too many txs hevm.stopPrank(); - assertEq(rollup.committedBatches(1), 0x5c84f469c62cd712c33f1b15b538fa771c7a223aefc911089978d8de5cf4bc5c); + assertEq(rollup.committedBatches(1), 0xb7cb76cf9e9f5878136c1d14e095f5d5b435fe8252cad6eb100e51110033b6ed); bytes memory batchHeader1 = new bytes(249); assembly { mstore(add(batchHeader1, 0x20), 0) // version mstore(add(batchHeader1, add(0x20, 1)), shl(192, 1)) // batchIndex mstore(add(batchHeader1, add(0x20, 9)), 0) // l1MessagePopped mstore(add(batchHeader1, add(0x20, 17)), 0) // totalL1MessagePopped - mstore(add(batchHeader1, add(0x20, 25)), 0x5cc7985ff03945d904d4e5a8376ef8371d42c22395eab1b3e227583388adc3a1) // l1dataHash + mstore(add(batchHeader1, add(0x20, 25)), 0x7cdb9d7f02ea58dfeb797ed6b4f7ea68846e4f2b0e30ed1535fc98b60c4ec809) // dataHash mstore(add(batchHeader1, add(0x20, 57)), 0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014) // l2 tx blob versioned hash mstore(add(batchHeader1, add(0x20, 89)), bytesData1) // prevStateHash mstore(add(batchHeader1, add(0x20, 121)), bytesData1) // postStateHash diff --git a/contracts/contracts/test/base/BatchHeaderCodeV0.t.sol b/contracts/contracts/test/base/BatchHeaderCodeV0.t.sol index c4661d663..d7533aa8d 100644 --- a/contracts/contracts/test/base/BatchHeaderCodeV0.t.sol +++ b/contracts/contracts/test/base/BatchHeaderCodeV0.t.sol @@ -23,7 +23,7 @@ contract BatchHeaderCodeV0Test is DSTestPlus { mstore(add(batchHeader0, add(0x20, 1)), shl(192, 1)) // batchIndex = 1 mstore(add(batchHeader0, add(0x20, 9)), shl(192, 1)) // l1MessagePopped = 1 mstore(add(batchHeader0, add(0x20, 17)), shl(192, 1)) // totalL1MessagePopped = 1 - mstore(add(batchHeader0, add(0x20, 25)), ZERO_VERSIONED_HASH) // l1dataHash + mstore(add(batchHeader0, add(0x20, 25)), ZERO_VERSIONED_HASH) // dataHash mstore(add(batchHeader0, add(0x20, 57)), ZERO_VERSIONED_HASH) // l2 tx blob versioned hash mstore(add(batchHeader0, add(0x20, 89)), ZERO_VERSIONED_HASH) // prevStateHash mstore(add(batchHeader0, add(0x20, 121)), ZERO_VERSIONED_HASH) // postStateHash @@ -36,7 +36,7 @@ contract BatchHeaderCodeV0Test is DSTestPlus { uint256 version = codecTest.getVersion(batchHeader0); uint256 index = codecTest.getBatchIndex(batchHeader0); uint256 l1MessagePopped = codecTest.getL1MessagePopped(batchHeader0); - bytes32 l1dataHash = codecTest.getL1DataHash(batchHeader0); + bytes32 dataHash = codecTest.getDataHash(batchHeader0); bytes32 blobVersionedHash = codecTest.getBlobVersionedHash(batchHeader0); bytes32 prevStateHash = codecTest.getPrevStateHash(batchHeader0); bytes32 postStateHash = codecTest.getPostStateHash(batchHeader0); @@ -47,7 +47,7 @@ contract BatchHeaderCodeV0Test is DSTestPlus { assertEq(version, 1); assertEq(index, 1); assertEq(l1MessagePopped, 1); - assertEq(l1dataHash, ZERO_VERSIONED_HASH); + assertEq(dataHash, ZERO_VERSIONED_HASH); assertEq(blobVersionedHash, ZERO_VERSIONED_HASH); assertEq(prevStateHash, ZERO_VERSIONED_HASH); assertEq(postStateHash, ZERO_VERSIONED_HASH); @@ -65,7 +65,7 @@ contract BatchHeaderCodeV0Test is DSTestPlus { mstore(add(batchHeader0, add(0x20, 1)), shl(192, 1)) // batchIndex mstore(add(batchHeader0, add(0x20, 9)), 0) // l1MessagePopped mstore(add(batchHeader0, add(0x20, 17)), 0) // totalL1MessagePopped - mstore(add(batchHeader0, add(0x20, 25)), 0x246394445f4fe64ed5598554d55d1682d6fb3fe04bf58eb54ef81d1189fafb51) // l1dataHash + mstore(add(batchHeader0, add(0x20, 25)), 0x246394445f4fe64ed5598554d55d1682d6fb3fe04bf58eb54ef81d1189fafb51) // dataHash mstore(add(batchHeader0, add(0x20, 57)), 0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014) // l2 tx blob versioned hash mstore(add(batchHeader0, add(0x20, 89)), bytesData1) // prevStateHash mstore(add(batchHeader0, add(0x20, 121)), bytesData1) // postStateHash @@ -84,7 +84,7 @@ contract BatchHeaderCodeV0Test is DSTestPlus { uint256 version = codecTest.getVersion(batchHeader0); uint256 index = codecTest.getBatchIndex(batchHeader0); uint256 l1MessagePopped = codecTest.getL1MessagePopped(batchHeader0); - bytes32 l1dataHash = codecTest.getL1DataHash(batchHeader0); + bytes32 dataHash = codecTest.getDataHash(batchHeader0); bytes32 blobVersionedHash = codecTest.getBlobVersionedHash(batchHeader0); bytes32 prevStateHash = codecTest.getPrevStateHash(batchHeader0); bytes32 postStateHash = codecTest.getPostStateHash(batchHeader0); @@ -97,7 +97,7 @@ contract BatchHeaderCodeV0Test is DSTestPlus { assertEq(version, 0); assertEq(index, 1); assertEq(l1MessagePopped, 0); - assertEq(l1dataHash, 0x246394445f4fe64ed5598554d55d1682d6fb3fe04bf58eb54ef81d1189fafb51); + assertEq(dataHash, 0x246394445f4fe64ed5598554d55d1682d6fb3fe04bf58eb54ef81d1189fafb51); assertEq(blobVersionedHash, 0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014); assertEq(prevStateHash, bytesData1); assertEq(postStateHash, bytesData1);