608060405234801561001057600080fd5b506127d9806100206000396000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c806370a0823111610146578063b89a73cb116100c3578063ce96cb7711610087578063ce96cb7714610526578063d0ebdbe714610539578063d905777e1461054c578063dd62ed3e1461055f578063ef8b30f714610513578063f7b44de41461057257600080fd5b8063b89a73cb146104ac578063ba087652146104d8578063c552e439146104eb578063c63d75b6146104fe578063c6e6f5921461051357600080fd5b8063a457c2d71161010a578063a457c2d714610458578063a9059cbb1461046b578063b3d7f6b91461047e578063b460af9414610491578063b4c2b491146104a457600080fd5b806370a08231146103ee578063775e112a146104175780637a1151c01461042a57806394bf804d1461043d57806395d89b411461045057600080fd5b80632e3db5eb116101d4578063402d267d11610198578063402d267d146103a4578063481c6a75146103b75780634acc79ed146103c85780634cdad506146102885780636e553f65146103db57600080fd5b80632e3db5eb14610327578063313ce5671461033a578063362685181461035957806338d52e0f1461036c578063395093511461039157600080fd5b80630a6936b61161021b5780630a6936b6146102d15780631765b313146102e657806318160ddd146102f95780632016a0d21461030157806323b872dd1461031457600080fd5b806301e1d1141461025857806306fdde031461027357806307a2d13a14610288578063095ea7b31461029b5780630a28a477146102be575b600080fd5b610260610585565b6040519081526020015b60405180910390f35b61027b610615565b60405161026a9190612219565b61026061029636600461224c565b6106a7565b6102ae6102a9366004612281565b6106ba565b604051901515815260200161026a565b6102606102cc36600461224c565b6106d2565b6102e46102df3660046122ab565b6106df565b005b6102e46102f436600461224c565b610837565b603554610260565b6102e461030f366004612369565b610971565b6102ae6103223660046123ee565b610aac565b6102e461033536600461224c565b610ad2565b606554600160a01b900460ff1660405160ff909116815260200161026a565b6102e4610367366004612281565b610b53565b6065546001600160a01b03165b6040516001600160a01b03909116815260200161026a565b6102ae61039f366004612281565b610c07565b6102606103b23660046122ab565b610c29565b6097546001600160a01b0316610379565b6102e46103d636600461224c565b610c47565b6102606103e936600461242a565b610d2e565b6102606103fc3660046122ab565b6001600160a01b031660009081526033602052604090205490565b6102e461042536600461224c565b610d70565b6102e461043836600461224c565b610dd1565b61026061044b36600461242a565b610eb8565b61027b610efa565b6102ae610466366004612281565b610f09565b6102ae610479366004612281565b610f8f565b61026061048c36600461224c565b610f9d565b61026061049f366004612456565b610faa565b609954610260565b6102ae6104ba3660046122ab565b6001600160a01b031660009081526098602052604090205460ff1690565b6102606104e6366004612456565b610fbf565b6102e46104f93660046122ab565b610fcc565b61026061050c3660046122ab565b5060001990565b61026061052136600461224c565b611054565b6102606105343660046122ab565b611061565b6102e46105473660046122ab565b61111c565b61026061055a3660046122ab565b61127b565b61026061056d366004612492565b611294565b6102e4610580366004612281565b6112bf565b600060995461059c6065546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa1580156105e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061060691906124bc565b61061091906124eb565b905090565b606060368054610624906124fe565b80601f0160208091040260200160405190810160405280929190818152602001828054610650906124fe565b801561069d5780601f106106725761010080835404028352916020019161069d565b820191906000526020600020905b81548152906001019060200180831161068057829003601f168201915b5050505050905090565b60006106b4826000611378565b92915050565b6000336106c88185856113ab565b5060019392505050565b60006106b48260016114cf565b6097546001600160a01b0316336001600160a01b03161461071b5760405162461bcd60e51b815260040161071290612538565b60405180910390fd5b6001600160a01b03811661077d5760405162461bcd60e51b8152602060048201526024808201527f5032505661756c743a205368617265686f6c6465722063616e6e6f74206265206044820152631b9d5b1b60e21b6064820152608401610712565b6097546001600160a01b03908116908216036107eb5760405162461bcd60e51b815260206004820152602760248201527f5032505661756c743a204d616e616765722063616e6e6f74206265207368617260448201526632b437b63232b960c91b6064820152608401610712565b6001600160a01b038116600081815260986020526040808220805460ff19166001179055517fd95bd1591f9b1f2b8f73ae48d496880b5450514dd839035712593ba85a86640f9190a250565b6097546001600160a01b0316336001600160a01b03161461086a5760405162461bcd60e51b815260040161071290612538565b600061087e6065546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa1580156108c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e891906124bc565b9050808210156109605760405162461bcd60e51b815260206004820152603960248201527f5032505661756c743a2041737365747320696e207573652063616e6e6f74206260448201527f65206c657373207468616e207661756c742062616c616e6365000000000000006064820152608401610712565b61096d610425828461257a565b5050565b600054610100900460ff16158080156109915750600054600160ff909116105b806109ab5750303b1580156109ab575060005460ff166001145b610a0e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610712565b6000805460ff191660011790558015610a31576000805461ff0019166101001790555b609780546001600160a01b0319166001600160a01b038716179055610a568383611501565b610a5f84611532565b8015610aa5576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600033610aba858285611565565b610ac58585856115df565b60019150505b9392505050565b6097546001600160a01b0316336001600160a01b031614610b055760405162461bcd60e51b815260040161071290612538565b8060996000828254610b1791906124eb565b90915550506040518181527ffb14b440415a6d4b98606df9ff9c725d1148bcca1de614f1675b047dceaf71ec906020015b60405180910390a150565b6097546001600160a01b0316336001600160a01b031614610b865760405162461bcd60e51b815260040161071290612538565b610bad8282610b9d6065546001600160a01b031690565b6001600160a01b0316919061178a565b8060996000828254610bbf91906124eb565b90915550506040518181526001600160a01b038316907fe235bc54e5c29d2518634645ed1a1ecad295a2c1368d51d07b0981bddd8cd184906020015b60405180910390a25050565b6000336106c8818585610c1a8383611294565b610c2491906124eb565b6113ab565b6000610c336117f2565b610c3e5760006106b4565b60001992915050565b6097546001600160a01b0316336001600160a01b031614610c7a5760405162461bcd60e51b815260040161071290612538565b609954811115610ce75760405162461bcd60e51b815260206004820152603260248201527f5032505661756c743a20466565732063616e6e6f7420626520686967686572206044820152717468616e2061737365747320696e2075736560701b6064820152608401610712565b8060996000828254610cf9919061257a565b90915550506040518181527f6860fd583f67fab4724ed49beb2ba910ec616cb579289e3726f71d72389d406490602001610b48565b6001600160a01b03811660009081526098602052604081205460ff16610d665760405162461bcd60e51b81526004016107129061258d565b610acb838361180c565b6097546001600160a01b0316336001600160a01b031614610da35760405162461bcd60e51b815260040161071290612538565b6000610dae60995490565b9050808210610dc45761096d610335828461257a565b61096d610438838361257a565b6097546001600160a01b0316336001600160a01b031614610e045760405162461bcd60e51b815260040161071290612538565b609954811115610e715760405162461bcd60e51b815260206004820152603260248201527f5032505661756c743a204c6f73732063616e6e6f7420626520686967686572206044820152717468616e2061737365747320696e2075736560701b6064820152608401610712565b8060996000828254610e83919061257a565b90915550506040518181527fb65b2e085d7d040c313f7d4e1ac90f5937026fee497e0e24a7eff16a55e1c5ea90602001610b48565b6001600160a01b03811660009081526098602052604081205460ff16610ef05760405162461bcd60e51b81526004016107129061258d565b610acb838361187f565b606060378054610624906124fe565b60003381610f178286611294565b905083811015610f775760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610712565b610f8482868684036113ab565b506001949350505050565b6000336106c88185856115df565b60006106b4826001611378565b6000610fb7848484611899565b949350505050565b6000610fb784848461190d565b6097546001600160a01b0316336001600160a01b031614610fff5760405162461bcd60e51b815260040161071290612538565b6040516001600160a01b038216907f34ac17b598df92957c102d2c8750219d0f1cc8a995a9012158547997d239b84990600090a26001600160a01b03166000908152609860205260409020805460ff19169055565b60006106b48260006114cf565b6001600160a01b0381166000908152603360205260408120546000611087826000611378565b9050600061109d6065546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa1580156110e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110791906124bc565b90506111138282611981565b95945050505050565b6097546001600160a01b0316336001600160a01b03161461114f5760405162461bcd60e51b815260040161071290612538565b6001600160a01b0381166111a55760405162461bcd60e51b815260206004820181905260248201527f5032505661756c743a204d616e616765722063616e6e6f74206265206e756c6c6044820152606401610712565b6001600160a01b03811660009081526098602052604090205460ff161561121e5760405162461bcd60e51b815260206004820152602760248201527f5032505661756c743a205368617265686f6c6465722063616e6e6f742062652060448201526636b0b730b3b2b960c91b6064820152608401610712565b6097546040516001600160a01b03918216918316907f034ab062c9c6c8ddd60650a40372b1d413588174682d4ca1a4e53aa37589ab2d90600090a3609780546001600160a01b0319166001600160a01b0392909216919091179055565b60008061128783611061565b9050610acb8160006114cf565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b6097546001600160a01b0316336001600160a01b0316146112f25760405162461bcd60e51b815260040161071290612538565b61131b82308361130a6065546001600160a01b031690565b6001600160a01b0316929190611997565b60995481116113375780609954611332919061257a565b61133a565b60005b6099556040518181526001600160a01b038316907f5f2dc7f4fb9cd0a22a346724c6cb8228d031ff276b8b5dcd91f02ada57d3be4390602001610bfb565b60008061138460355490565b905080156113a5576113a0611397610585565b859083866119cf565b610fb7565b83610fb7565b6001600160a01b03831661140d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610712565b6001600160a01b03821661146e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610712565b6001600160a01b0383811660008181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000806114db60355490565b90508315806114e8575080155b6113a5576113a0816114f8610585565b869190866119cf565b600054610100900460ff166115285760405162461bcd60e51b8152600401610712906125e0565b61096d8282611a2a565b600054610100900460ff166115595760405162461bcd60e51b8152600401610712906125e0565b61156281611a6a565b50565b60006115718484611294565b905060001981146115d957818110156115cc5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610712565b6115d984848484036113ab565b50505050565b6001600160a01b0383166116435760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610712565b6001600160a01b0382166116a55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610712565b6001600160a01b0383166000908152603360205260409020548181101561171d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610712565b6001600160a01b0380851660008181526033602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061177d9086815260200190565b60405180910390a36115d9565b6040516001600160a01b0383166024820152604481018290526117ed90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611aef565b505050565b6000806117fd610585565b11806106105750506035541590565b600061181782610c29565b8311156118665760405162461bcd60e51b815260206004820152601e60248201527f455243343632363a206465706f736974206d6f7265207468616e206d617800006044820152606401610712565b600061187184611054565b9050610acb33848684611bc1565b60008061188b84610f9d565b9050610acb33848387611bc1565b60006118a482611061565b8411156118f35760405162461bcd60e51b815260206004820152601f60248201527f455243343632363a207769746864726177206d6f7265207468616e206d6178006044820152606401610712565b60006118fe856106d2565b9050610fb73385858885611c3f565b60006119188261127b565b8411156119675760405162461bcd60e51b815260206004820152601d60248201527f455243343632363a2072656465656d206d6f7265207468616e206d61780000006044820152606401610712565b6000611972856106a7565b9050610fb73385858489611c3f565b60008183106119905781610acb565b5090919050565b6040516001600160a01b03808516602483015283166044820152606481018290526115d99085906323b872dd60e01b906084016117b6565b6000806119dd868686611ceb565b905060018360028111156119f3576119f361262b565b148015611a10575060008480611a0b57611a0b612641565b868809115b1561111357611a206001826124eb565b9695505050505050565b600054610100900460ff16611a515760405162461bcd60e51b8152600401610712906125e0565b6036611a5d83826126a5565b5060376117ed82826126a5565b600054610100900460ff16611a915760405162461bcd60e51b8152600401610712906125e0565b600080611a9d83611d9a565b9150915081611aad576012611aaf565b805b606580546001600160a01b039095166001600160a01b031960ff93909316600160a01b02929092166001600160a81b031990951694909417179092555050565b6000611b44826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611e789092919063ffffffff16565b8051909150156117ed5780806020019051810190611b629190612765565b6117ed5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610712565b606554611bd9906001600160a01b0316853085611997565b611be38382611e87565b826001600160a01b0316846001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78484604051611c31929190918252602082015260400190565b60405180910390a350505050565b826001600160a01b0316856001600160a01b031614611c6357611c63838683611565565b611c6d8382611f48565b606554611c84906001600160a01b0316858461178a565b826001600160a01b0316846001600160a01b0316866001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8585604051611cdc929190918252602082015260400190565b60405180910390a45050505050565b6000808060001985870985870292508281108382030391505080600003611d2557838281611d1b57611d1b612641565b0492505050610acb565b808411611d3157600080fd5b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290516000918291829182916001600160a01b03871691611de191612787565b6000604051808303816000865af19150503d8060008114611e1e576040519150601f19603f3d011682016040523d82523d6000602084013e611e23565b606091505b5091509150818015611e3757506020815110155b15611e6b57600081806020019051810190611e5291906124bc565b905060ff8111611e69576001969095509350505050565b505b5060009485945092505050565b6060610fb7848460008561207c565b6001600160a01b038216611edd5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610712565b8060356000828254611eef91906124eb565b90915550506001600160a01b0382166000818152603360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b038216611fa85760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610712565b6001600160a01b0382166000908152603360205260409020548181101561201c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610712565b6001600160a01b03831660008181526033602090815260408083208686039055603580548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6060824710156120dd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610712565b600080866001600160a01b031685876040516120f99190612787565b60006040518083038185875af1925050503d8060008114612136576040519150601f19603f3d011682016040523d82523d6000602084013e61213b565b606091505b509150915061214c87838387612157565b979650505050505050565b606083156121c65782516000036121bf576001600160a01b0385163b6121bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610712565b5081610fb7565b610fb783838151156121db5781518083602001fd5b8060405162461bcd60e51b81526004016107129190612219565b60005b838110156122105781810151838201526020016121f8565b50506000910152565b60208152600082518060208401526122388160408501602087016121f5565b601f01601f19169190910160400192915050565b60006020828403121561225e57600080fd5b5035919050565b80356001600160a01b038116811461227c57600080fd5b919050565b6000806040838503121561229457600080fd5b61229d83612265565b946020939093013593505050565b6000602082840312156122bd57600080fd5b610acb82612265565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126122ed57600080fd5b813567ffffffffffffffff80821115612308576123086122c6565b604051601f8301601f19908116603f01168101908282118183101715612330576123306122c6565b8160405283815286602085880101111561234957600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561237f57600080fd5b61238885612265565b935061239660208601612265565b9250604085013567ffffffffffffffff808211156123b357600080fd5b6123bf888389016122dc565b935060608701359150808211156123d557600080fd5b506123e2878288016122dc565b91505092959194509250565b60008060006060848603121561240357600080fd5b61240c84612265565b925061241a60208501612265565b9150604084013590509250925092565b6000806040838503121561243d57600080fd5b8235915061244d60208401612265565b90509250929050565b60008060006060848603121561246b57600080fd5b8335925061247b60208501612265565b915061248960408501612265565b90509250925092565b600080604083850312156124a557600080fd5b6124ae83612265565b915061244d60208401612265565b6000602082840312156124ce57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156106b4576106b46124d5565b600181811c9082168061251257607f821691505b60208210810361253257634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526022908201527f5032505661756c743a204f6e6c7920616c6c6f77656420666f72206d616e616760408201526132b960f11b606082015260800190565b818103818111156106b4576106b46124d5565b60208082526033908201527f5032505661756c743a205265636569766572206973206e6f742061207768697460408201527232b634b9ba32b21039b430b932b437b63232b960691b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b601f8211156117ed57600081815260208120601f850160051c8101602086101561267e5750805b601f850160051c820191505b8181101561269d5782815560010161268a565b505050505050565b815167ffffffffffffffff8111156126bf576126bf6122c6565b6126d3816126cd84546124fe565b84612657565b602080601f83116001811461270857600084156126f05750858301515b600019600386901b1c1916600185901b17855561269d565b600085815260208120601f198616915b8281101561273757888601518255948401946001909101908401612718565b50858210156127555787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561277757600080fd5b81518015158114610acb57600080fd5b600082516127998184602087016121f5565b919091019291505056fea26469706673582212204e8cd8b6263c303c6d2b37d4ba470715baf1cef9a160f54155fd85dc9a6b2f2464736f6c63430008110033