60a060405230608052348015610013575f5ffd5b5061001c610021565b6100d3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100715760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6080516128536100f95f395f8181611396015281816113bf01526114fe01526128535ff3fe608060405260043610610236575f3560e01c8063715018a611610129578063bbc0c742116100a8578063e0bf7fd11161006d578063e0bf7fd1146106a0578063e0f3ccf5146106ce578063e4748b9e146106e3578063e8078d94146106f8578063f2fde38b14610700575f5ffd5b8063bbc0c74214610606578063c024666814610624578063c4d66de814610643578063d505accf14610662578063dd62ed3e14610681575f5ffd5b806395d89b41116100ee57806395d89b41146105565780639a7a23d61461056a578063a9059cbb14610589578063ad3cb1cc146105a8578063b62496f5146105d8575f5ffd5b8063715018a6146104d45780637ecebe00146104e857806384b0196e146105075780638a8c523c1461052e5780638da5cb5b14610542575f5ffd5b80633644e515116101b55780634fbee1931161017a5780634fbee1931461042857806352d1902d1461045f57806359927044146104735780636ddd17131461049657806370a08231146104b5575f5ffd5b80633644e515146103aa5780634626402b146103be57806349bd5a5e146103dd5780634a62bb65146103fc5780634f1ef28614610415575f5ffd5b80631c235c22116101fb5780631c235c221461032657806323b872dd1461034757806327c8f835146103665780632de233371461037b578063313ce5671461038f575f5ffd5b806306fdde0314610241578063095ea7b31461026b5780631694505e1461029a5780631732cded146102d157806318160ddd146102e9575f5ffd5b3661023d57005b5f5ffd5b34801561024c575f5ffd5b5061025561071f565b6040516102629190612257565b60405180910390f35b348015610276575f5ffd5b5061028a61028536600461227d565b6107c4565b6040519015158152602001610262565b3480156102a5575f5ffd5b506007546102b9906001600160a01b031681565b6040516001600160a01b039091168152602001610262565b3480156102dc575f5ffd5b505f5461028a9060ff1681565b3480156102f4575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02545b604051908152602001610262565b348015610331575f5ffd5b506103456103403660046122bb565b6107dd565b005b348015610352575f5ffd5b5061028a6103613660046122eb565b6107ff565b348015610371575f5ffd5b506102b961dead81565b348015610386575f5ffd5b50610345610824565b34801561039a575f5ffd5b5060405160128152602001610262565b3480156103b5575f5ffd5b5061031861094a565b3480156103c9575f5ffd5b506001546102b9906001600160a01b031681565b3480156103e8575f5ffd5b506008546102b9906001600160a01b031681565b348015610407575f5ffd5b5060045461028a9060ff1681565b61034561042336600461233d565b610958565b348015610433575f5ffd5b5061028a610442366004612403565b6001600160a01b03165f9081526009602052604090205460ff1690565b34801561046a575f5ffd5b50610318610977565b34801561047e575f5ffd5b505f546102b99061010090046001600160a01b031681565b3480156104a1575f5ffd5b5060045461028a9062010000900460ff1681565b3480156104c0575f5ffd5b506103186104cf366004612403565b610992565b3480156104df575f5ffd5b506103456109c2565b3480156104f3575f5ffd5b50610318610502366004612403565b6109d5565b348015610512575f5ffd5b5061051b6109df565b604051610262979695949392919061241e565b348015610539575f5ffd5b50610345610a8d565b34801561054d575f5ffd5b506102b9610aa6565b348015610561575f5ffd5b50610255610ad4565b348015610575575f5ffd5b506103456105843660046124b4565b610b12565b348015610594575f5ffd5b5061028a6105a336600461227d565b610ba8565b3480156105b3575f5ffd5b50610255604051806040016040528060058152602001640352e302e360dc1b81525081565b3480156105e3575f5ffd5b5061028a6105f2366004612403565b600a6020525f908152604090205460ff1681565b348015610611575f5ffd5b5060045461028a90610100900460ff1681565b34801561062f575f5ffd5b5061034561063e3660046124b4565b610bb5565b34801561064e575f5ffd5b5061034561065d366004612403565b610be7565b34801561066d575f5ffd5b5061034561067c3660046124e7565b610e15565b34801561068c575f5ffd5b5061031861069b366004612558565b610f6a565b3480156106ab575f5ffd5b5061028a6106ba366004612403565b60096020525f908152604090205460ff1681565b3480156106d9575f5ffd5b5061031860065481565b3480156106ee575f5ffd5b5061031860055481565b610345610fb3565b34801561070b575f5ffd5b5061034561071a366004612403565b611241565b60605f5f5160206127be5f395f51905f525b90508060030180546107429061258f565b80601f016020809104026020016040519081016040528092919081815260200182805461076e9061258f565b80156107b95780601f10610790576101008083540402835291602001916107b9565b820191905f5260205f20905b81548152906001019060200180831161079c57829003601f168201915b505050505091505090565b5f336107d181858561127e565b60019150505b92915050565b6107e5611290565b6004805460ff191693151593909317909255600655600555565b5f3361080c8582856112c2565b610817858585611325565b60019150505b9392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061086e5750805467ffffffffffffffff808416911610155b1561088c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff191667ffffffffffffffff831617600160401b1781556108c06108b9610aa6565b6001610bb5565b5f546108db9061010090046001600160a01b03166001610bb5565b6108e6306001610bb5565b6108f361dead6001610bb5565b6101906005819055600655805460ff60401b1916815560405167ffffffffffffffff831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15050565b5f610953611382565b905090565b61096061138b565b6109698261142f565b6109738282611437565b5050565b5f6109806114f3565b505f5160206127fe5f395f51905f5290565b5f805f5160206127be5f395f51905f525b6001600160a01b039093165f9081526020939093525050604090205490565b6109ca611290565b6109d35f61153c565b565b5f6107d7826115ac565b5f60608082808083815f5160206127de5f395f51905f528054909150158015610a0a57506001810154155b610a535760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b60448201526064015b60405180910390fd5b610a5b6115d4565b610a63611612565b604080515f80825260208201909252600f60f81b9c939b5091995046985030975095509350915050565b610a95611290565b6004805461ffff1916610100179055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f5160206127be5f395f51905f52916107429061258f565b610b1a611290565b6008546001600160a01b0390811690831603610b9e5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610a4a565b6109738282611628565b5f336107d1818585611325565b610bbd611290565b6001600160a01b03919091165f908152600960205260409020805460ff1916911515919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f81158015610c2c5750825b90505f8267ffffffffffffffff166001148015610c485750303b155b905081158015610c56575080155b15610c745760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c9e57845460ff60401b1916600160401b1785555b610ce2604051806040016040528060078152602001664341424241474560c81b8152506040518060400160405280600381526020016221a0a160e91b815250611652565b610d066040518060400160405280600381526020016221a0a160e91b815250611664565b610d0f8661168f565b610d176116a0565b6a084595161401484a0000006002818155610d31916125db565b60038190556004805460ff191660019081179091555f8054743461fd17db21aace063814e51bc364236eb8c12500610100600160a81b031990911617905580546001600160a01b031916733461fd17db21aace063814e51bc364236eb8c125179055610d9e9030906116a8565b5f54600354600254610dc79261010090046001600160a01b031691610dc2916125fa565b6116a8565b8315610e0d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b83421115610e395760405163313c898160e11b815260048101859052602401610a4a565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610ea38c6001600160a01b03165f9081527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb006020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610efd826116dc565b90505f610f0c82878787611708565b9050896001600160a01b0316816001600160a01b031614610f53576040516325c0072360e11b81526001600160a01b0380831660048301528b166024820152604401610a4a565b610f5e8a8a8a61127e565b50505050505050505050565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b610fbb611290565b600780546001600160a01b03191673c532a74256d3db42d0bf7a0400fefdbad769400890811790915561101630826110117f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace025490565b61127e565b806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611052573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611076919061260d565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e5919061260d565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801561112f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611153919061260d565b600880546001600160a01b0319166001600160a01b0392909216918217905561117d906001611628565b6007546001600160a01b031663f305d719343061119981610992565b5f5f6111a3610aa6565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015611209573d5f5f3e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061122e9190612628565b50506004805460ff191660011790555050565b611249611290565b6001600160a01b03811661127257604051631e4fbdf760e01b81525f6004820152602401610a4a565b61127b8161153c565b50565b61128b8383836001611734565b505050565b33611299610aa6565b6001600160a01b0316146109d35760405163118cdaa760e01b8152336004820152602401610a4a565b5f6112cd8484610f6a565b90505f19811461131f578181101561131157604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610a4a565b61131f84848484035f611734565b50505050565b6001600160a01b03831661134e57604051634b637e8f60e11b81525f6004820152602401610a4a565b6001600160a01b0382166113775760405163ec442f0560e01b81525f6004820152602401610a4a565b61128b838383611818565b5f610953611b85565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061141157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166114055f5160206127fe5f395f51905f52546001600160a01b031690565b6001600160a01b031614155b156109d35760405163703e46dd60e11b815260040160405180910390fd5b61127b611290565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611491575060408051601f3d908101601f1916820190925261148e91810190612653565b60015b6114b957604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610a4a565b5f5160206127fe5f395f51905f5281146114e957604051632a87526960e21b815260048101829052602401610a4a565b61128b8383611bf8565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109d35760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f807f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb006109a3565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10280546060915f5160206127de5f395f51905f52916107429061258f565b60605f5f5160206127de5f395f51905f52610731565b6001600160a01b03919091165f908152600a60205260409020805460ff1916911515919091179055565b61165a611c4d565b6109738282611c96565b61166c611c4d565b61127b81604051806040016040528060018152602001603160f81b815250611ce6565b611697611c4d565b61127b81611d45565b6109d3611c4d565b6001600160a01b0382166116d15760405163ec442f0560e01b81525f6004820152602401610a4a565b6109735f8383611818565b5f6107d76116e8611382565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f61171888888888611d4d565b9250925092506117288282611e15565b50909695505050505050565b5f5160206127be5f395f51905f526001600160a01b03851661176b5760405163e602df0560e01b81525f6004820152602401610a4a565b6001600160a01b03841661179457604051634a1406b160e11b81525f6004820152602401610a4a565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561181157836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161180891815260200190565b60405180910390a35b5050505050565b6001600160a01b03831661187c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a4a565b6001600160a01b0382166118de5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a4a565b5f811161193f5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610a4a565b60045460ff1615611a6257611952610aa6565b6001600160a01b0316836001600160a01b03161415801561198c5750611976610aa6565b6001600160a01b0316826001600160a01b031614155b80156119a057506001600160a01b03821615155b80156119b757506001600160a01b03821661dead14155b80156119c557505f5460ff16155b15611a6257600454610100900460ff16611a62576001600160a01b0383165f9081526009602052604090205460ff1680611a1657506001600160a01b0382165f9081526009602052604090205460ff165b611a625760405162461bcd60e51b815260206004820152601b60248201527f54726164696e67206973206e6f7420656e61626c6564207965742e00000000006044820152606401610a4a565b5f80546001600160a01b0385168252600960205260409091205460ff91821615911680611aa657506001600160a01b0383165f9081526009602052604090205460ff165b15611aae57505f5b5f8115611b7a576001600160a01b0384165f908152600a602052604090205460ff168015611add57505f600654115b15611b04576103e860065484611af3919061266a565b611afd91906125db565b9050611b4f565b6001600160a01b0385165f908152600a602052604090205460ff168015611b2c57505f600554115b15611b4f576103e860055484611b42919061266a565b611b4c91906125db565b90505b8015611b6d57600154611b6d9086906001600160a01b031683611325565b611b7781846125fa565b92505b611811858585611ecd565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611baf612006565b611bb761206e565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b611c01826120b0565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611c455761128b8282612113565b610973612185565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166109d357604051631afcd79f60e31b815260040160405180910390fd5b611c9e611c4d565b5f5160206127be5f395f51905f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03611cd784826126c5565b506004810161131f83826126c5565b611cee611c4d565b5f5160206127de5f395f51905f527fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102611d2784826126c5565b5060038101611d3683826126c5565b505f8082556001909101555050565b611249611c4d565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115611d8657505f91506003905082611e0b565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611dd7573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611e0257505f925060019150829050611e0b565b92505f91508190505b9450945094915050565b5f826003811115611e2857611e28612780565b03611e31575050565b6001826003811115611e4557611e45612780565b03611e635760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115611e7757611e77612780565b03611e985760405163fce698f760e01b815260048101829052602401610a4a565b6003826003811115611eac57611eac612780565b03610973576040516335e2f38360e21b815260048101829052602401610a4a565b5f5160206127be5f395f51905f526001600160a01b038416611f075781816002015f828254611efc9190612794565b90915550611f779050565b6001600160a01b0384165f9081526020829052604090205482811015611f595760405163391434e360e21b81526001600160a01b03861660048201526024810182905260448101849052606401610a4a565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316611f95576002810180548390039055611fb3565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611ff891815260200190565b60405180910390a350505050565b5f5f5160206127de5f395f51905f528161201e6115d4565b80519091501561203657805160209091012092915050565b81548015612045579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b5f5f5160206127de5f395f51905f5281612086611612565b80519091501561209e57805160209091012092915050565b60018201548015612045579392505050565b806001600160a01b03163b5f036120e557604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610a4a565b5f5160206127fe5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161212f91906127a7565b5f60405180830381855af49150503d805f8114612167576040519150601f19603f3d011682016040523d82523d5f602084013e61216c565b606091505b509150915061217c8583836121a4565b95945050505050565b34156109d35760405163b398979f60e01b815260040160405180910390fd5b6060826121b9576121b482612200565b61081d565b81511580156121d057506001600160a01b0384163b155b156121f957604051639996b31560e01b81526001600160a01b0385166004820152602401610a4a565b508061081d565b8051156122105780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61081d6020830184612229565b6001600160a01b038116811461127b575f5ffd5b5f5f6040838503121561228e575f5ffd5b823561229981612269565b946020939093013593505050565b803580151581146122b6575f5ffd5b919050565b5f5f5f606084860312156122cd575f5ffd5b6122d6846122a7565b95602085013595506040909401359392505050565b5f5f5f606084860312156122fd575f5ffd5b833561230881612269565b9250602084013561231881612269565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b5f5f6040838503121561234e575f5ffd5b823561235981612269565b9150602083013567ffffffffffffffff811115612374575f5ffd5b8301601f81018513612384575f5ffd5b803567ffffffffffffffff81111561239e5761239e612329565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156123cd576123cd612329565b6040528181528282016020018710156123e4575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f60208284031215612413575f5ffd5b813561081d81612269565b60ff60f81b8816815260e060208201525f61243c60e0830189612229565b828103604084015261244e8189612229565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b818110156124a3578351835260209384019390920191600101612485565b50909b9a5050505050505050505050565b5f5f604083850312156124c5575f5ffd5b82356124d081612269565b91506124de602084016122a7565b90509250929050565b5f5f5f5f5f5f5f60e0888a0312156124fd575f5ffd5b873561250881612269565b9650602088013561251881612269565b95506040880135945060608801359350608088013560ff8116811461253b575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215612569575f5ffd5b823561257481612269565b9150602083013561258481612269565b809150509250929050565b600181811c908216806125a357607f821691505b6020821081036125c157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b5f826125f557634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156107d7576107d76125c7565b5f6020828403121561261d575f5ffd5b815161081d81612269565b5f5f5f6060848603121561263a575f5ffd5b5050815160208301516040909301519094929350919050565b5f60208284031215612663575f5ffd5b5051919050565b80820281158282048414176107d7576107d76125c7565b601f82111561128b57805f5260205f20601f840160051c810160208510156126a65750805b601f840160051c820191505b81811015611811575f81556001016126b2565b815167ffffffffffffffff8111156126df576126df612329565b6126f3816126ed845461258f565b84612681565b6020601f821160018114612725575f831561270e5750848201515b5f19600385901b1c1916600184901b178455611811565b5f84815260208120601f198516915b828110156127545787850151825560209485019460019092019101612734565b508482101561277157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52602160045260245ffd5b808201808211156107d7576107d76125c7565b5f82518060208501845e5f92019182525091905056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220940e826546993242af6da4fb4a103f7dfa6a616c6e5876a4e23a1891d69f047464736f6c634300081b0033