60806040525f600755620f424060085534801561001a575f80fd5b50604051612934380380612934833981016040819052610039916101a5565b6040518060400160405280600f81526020016e426173655852617265536b696c6c7360881b81525060405180604001604052806003815260200162212c2960e91b815250815f908161008b919061026a565b506001610098828261026a565b506100a791505f9050336100f8565b506100d27f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336100f8565b50600980546001600160a01b0319166001600160a01b0392909216919091179055610329565b5f8281526006602090815260408083206001600160a01b038516845290915281205460ff1661019c575f8381526006602090815260408083206001600160a01b03861684529091529020805460ff191660011790556101543390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161019f565b505f5b92915050565b5f602082840312156101b5575f80fd5b81516001600160a01b03811681146101cb575f80fd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806101fa57607f821691505b60208210810361021857634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561026557805f5260205f20601f840160051c810160208510156102435750805b601f840160051c820191505b81811015610262575f815560010161024f565b50505b505050565b81516001600160401b03811115610283576102836101d2565b6102978161029184546101e6565b8461021e565b602080601f8311600181146102ca575f84156102b35750858301515b5f19600386901b1c1916600185901b178555610321565b5f85815260208120601f198616915b828110156102f8578886015182559484019460019091019084016102d9565b508582101561031557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6125fe806103365f395ff3fe608060405234801561000f575f80fd5b50600436106101dc575f3560e01c80635e318e0711610109578063a217fddf1161009e578063d53913931161006e578063d539139314610429578063d547741f14610450578063d9f10a2b14610463578063e985e9c514610482575f80fd5b8063a217fddf146103e9578063a22cb465146103f0578063b88d4fde14610403578063c87b56dd14610416575f80fd5b806391d14854116100d957806391d148541461038357806394383f14146103bb57806395d89b41146103ce578063961f0944146103d6575f80fd5b80635e318e07146103375780636352211e1461034a5780636a6278421461035d57806370a0823114610370575f80fd5b806323b872dd1161017f57806336568abe1161014f57806336568abe146102eb5780633e413bee146102fe57806342842e0e14610311578063564972c714610324575f80fd5b806323b872dd14610290578063248a9ca3146102a35780632db11544146102c55780632f2ff15d146102d8575f80fd5b8063092d7c05116101ba578063092d7c0514610248578063095ea7b31461025f5780630af2c6ca146102745780631d85bf031461027d575f80fd5b806301ffc9a7146101e057806306fdde0314610208578063081812fc1461021d575b5f80fd5b6101f36101ee366004612145565b6104bd565b60405190151581526020015b60405180910390f35b6102106104cd565b6040516101ff91906121cb565b61023061022b3660046121dd565b61055c565b6040516001600160a01b0390911681526020016101ff565b61025160085481565b6040519081526020016101ff565b61027261026d366004612208565b610583565b005b61025160075481565b61027261028b366004612232565b610592565b61027261029e366004612252565b610834565b6102516102b13660046121dd565b5f9081526006602052604090206001015490565b6102726102d33660046121dd565b6108ef565b6102726102e6366004612290565b610acb565b6102726102f9366004612290565b610aef565b600954610230906001600160a01b031681565b61027261031f366004612252565b610b40565b6102726103323660046121dd565b610b5a565b6102726103453660046121dd565b610ba0565b6102306103583660046121dd565b610cc5565b61027261036b3660046122be565b610ccf565b61025161037e3660046122be565b610d5c565b6101f3610391366004612290565b5f9182526006602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6102726103c9366004612232565b610dba565b610210610fba565b6102726103e43660046121dd565b610fc9565b6102515f81565b6102726103fe3660046122e6565b6111c0565b61027261041136600461233f565b6111cb565b6102106104243660046121dd565b6111e2565b6102517f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61027261045e366004612290565b611253565b6102516104713660046121dd565b600a6020525f908152604090205481565b6101f3610490366004612436565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b5f6104c782611277565b92915050565b60605f80546104db90612462565b80601f016020809104026020016040519081016040528092919081815260200182805461050790612462565b80156105525780601f1061052957610100808354040283529160200191610552565b820191905f5260205f20905b81548152906001019060200180831161053557829003601f168201915b5050505050905090565b5f610566826112cc565b505f828152600460205260409020546001600160a01b03166104c7565b61058e82823361131d565b5050565b5f828152600a60205260408120549081900361060f576040517ff731c78700000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4e4654206973206e6f74206c697374656420666f722073616c6500000000000060448201526064015b60405180910390fd5b81811115610679576040517ff731c78700000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f50726963652065786365656473206d61782070726963650000000000000000006044820152606401610606565b6009546040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201525f916001600160a01b03169063dd62ed3e90604401602060405180830381865afa1580156106de573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070291906124b3565b905081811015610748576040517f2a1b2dd80000000000000000000000000000000000000000000000000000000081526004810182905260248101839052604401610606565b5f848152600a6020526040812081905561076185610cc5565b60095490915061077c906001600160a01b031633838661132a565b6040517f42842e0e0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201523360248201526044810186905230906342842e0e906064015f604051808303815f87803b1580156107e0575f80fd5b505af11580156107f2573d5f803e3d5ffd5b50506040518581528792503391507fd99878669b9e12c01419b6a5f8f4669400ae8da15fcdfb466066e2c785c4d5c29060200160405180910390a35050505050565b6001600160a01b038216610876576040517f64a0ae920000000000000000000000000000000000000000000000000000000081525f6004820152602401610606565b5f6108828383336113a6565b9050836001600160a01b0316816001600160a01b0316146108e9576040517f64283d7b0000000000000000000000000000000000000000000000000000000081526001600160a01b0380861660048301526024820184905282166044820152606401610606565b50505050565b600854811015610981576040517ff731c78700000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f46656520616d6f756e74206973206c657373207468616e206d696e696d756d2060448201527f6d696e74206665657300000000000000000000000000000000000000000000006064820152608401610606565b6009546040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201525f916001600160a01b03169063dd62ed3e90604401602060405180830381865afa1580156109e6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0a91906124b3565b905081811015610a50576040517f2a1b2dd80000000000000000000000000000000000000000000000000000000081526004810182905260248101839052604401610606565b600954610a68906001600160a01b031633308561132a565b60078054905f610a77836124ca565b9190505550610a88336007546114cf565b600754604080519182526020820184905233917f25b428dfde728ccfaddad7e29e4ac23c24ed7fd1a6e3e3f91894a9a073f5dfff91015b60405180910390a25050565b5f82815260066020526040902060010154610ae5816114e8565b6108e983836114f5565b6001600160a01b0381163314610b31576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b3b82826115be565b505050565b610b3b83838360405180602001604052805f8152506111cb565b5f610b64816114e8565b60088290556040518281527f804d363492c1ce5d39d8a3db281e640d83db5ef6d2128174e6a556c0fc12ef3f9060200160405180910390a15050565b5f610baa816114e8565b6009546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610c09573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c2d91906124b3565b905082811015610c73576040517fcf4791810000000000000000000000000000000000000000000000000000000081526004810182905260248101849052604401610606565b600954610c8a906001600160a01b03163385611661565b60405183815233907f9bba815921f12cb7b1408e14b5ade745234397d39623ae5e7c82d693cb45815f906020015b60405180910390a2505050565b5f6104c7826112cc565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610cf9816114e8565b60078054905f610d08836124ca565b9190505550610d19826007546114cf565b600754604080519182525f60208301526001600160a01b038416917f25b428dfde728ccfaddad7e29e4ac23c24ed7fd1a6e3e3f91894a9a073f5dfff9101610abf565b5f6001600160a01b038216610d9f576040517f89c62b640000000000000000000000000000000000000000000000000000000081525f6004820152602401610606565b506001600160a01b03165f9081526003602052604090205490565b610dc382610cc5565b6001600160a01b0316336001600160a01b031614610e63576040517ff731c78700000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f596f7520617265206e6f7420746865206f776e6572206f662074686973204e4660448201527f54000000000000000000000000000000000000000000000000000000000000006064820152608401610606565b6040517f081812fc000000000000000000000000000000000000000000000000000000008152600481018390525f90309063081812fc90602401602060405180830381865afa158015610eb8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610edc9190612526565b90506001600160a01b0381163014610f76576040517ff731c78700000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f70657261746f72206973206e6f7420617070726f76656420746f206d616e6160448201527f67652074686973204e46540000000000000000000000000000000000000000006064820152608401610606565b5f838152600a6020526040908190208390555183907fca466e56e7a1aa7cf15f1c534f9b24983cc069bc947fc3a8e8b1b423c3ad6b5b90610cb89085815260200190565b6060600180546104db90612462565b610fd281610cc5565b6001600160a01b0316336001600160a01b031614611072576040517ff731c78700000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f596f7520617265206e6f7420746865206f776e6572206f662074686973204e4660448201527f54000000000000000000000000000000000000000000000000000000000000006064820152608401610606565b6040517f081812fc000000000000000000000000000000000000000000000000000000008152600481018290525f90309063081812fc90602401602060405180830381865afa1580156110c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110eb9190612526565b90506001600160a01b0381163014611185576040517ff731c78700000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f70657261746f72206973206e6f7420617070726f76656420746f206d616e6160448201527f67652074686973204e46540000000000000000000000000000000000000000006064820152608401610606565b5f828152600a60205260408082208290555183917fea74652770373f387d6584b754b6891e43f3a870c309196353a4083872960e3191a25050565b61058e338383611692565b6111d6848484610834565b6108e984848484611767565b60606111ed826112cc565b505f61120360408051602081019091525f815290565b90505f8151116112215760405180602001604052805f81525061124c565b8061122b84611927565b60405160200161123c929190612541565b6040516020818303038152906040525b9392505050565b5f8281526006602052604090206001015461126d816114e8565b6108e983836115be565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806104c757506104c7826119e3565b5f818152600260205260408120546001600160a01b0316806104c7576040517f7e27328900000000000000000000000000000000000000000000000000000000815260048101849052602401610606565b610b3b8383836001611ac5565b6040516001600160a01b0384811660248301528381166044830152606482018390526108e99186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611c18565b5f828152600260205260408120546001600160a01b03908116908316156113d2576113d2818486611c92565b6001600160a01b0381161561142b576113ed5f855f80611ac5565b6001600160a01b0381165f90815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190555b6001600160a01b03851615611459576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b61058e828260405180602001604052805f815250611d28565b6114f28133611d3e565b50565b5f8281526006602090815260408083206001600160a01b038516845290915281205460ff166115b7575f8381526006602090815260408083206001600160a01b0386168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561156f3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016104c7565b505f6104c7565b5f8281526006602090815260408083206001600160a01b038516845290915281205460ff16156115b7575f8381526006602090815260408083206001600160a01b038616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016104c7565b6040516001600160a01b03838116602483015260448201839052610b3b91859182169063a9059cbb9060640161135f565b6001600160a01b0382166116dd576040517f5b08ba180000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610606565b6001600160a01b038381165f8181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b156108e9576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063150b7a02906117c290339088908790879060040161256f565b6020604051808303815f875af192505050801561181a575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611817918101906125a0565b60015b61189a573d808015611847576040519150601f19603f3d011682016040523d82523d5f602084013e61184c565b606091505b5080515f03611892576040517f64a0ae920000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610606565b805181602001fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167f150b7a020000000000000000000000000000000000000000000000000000000014611920576040517f64a0ae920000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610606565b5050505050565b60605f61193383611dab565b60010190505f8167ffffffffffffffff81111561195257611952612312565b6040519080825280601f01601f19166020018201604052801561197c576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461198657509392505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480611a7557507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806104c757507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146104c7565b8080611ad957506001600160a01b03821615155b15611bd1575f611ae8846112cc565b90506001600160a01b03831615801590611b145750826001600160a01b0316816001600160a01b031614155b8015611b4557506001600160a01b038082165f9081526005602090815260408083209387168352929052205460ff16155b15611b87576040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610606565b8115611bcf5783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f611c2c6001600160a01b03841683611e8c565b905080515f14158015611c50575080806020019051810190611c4e91906125bb565b155b15610b3b576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610606565b611c9d838383611e99565b610b3b576001600160a01b038316611ce4576040517f7e27328900000000000000000000000000000000000000000000000000000000815260048101829052602401610606565b6040517f177e802f0000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260248101829052604401610606565b611d328383611f1c565b610b3b5f848484611767565b5f8281526006602090815260408083206001600160a01b038516845290915290205460ff1661058e576040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260248101839052604401610606565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611df3577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310611e1f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611e3d57662386f26fc10000830492506010015b6305f5e1008310611e55576305f5e100830492506008015b6127108310611e6957612710830492506004015b60648310611e7b576064830492506002015b600a83106104c75760010192915050565b606061124c83835f611faf565b5f6001600160a01b03831615801590611f145750826001600160a01b0316846001600160a01b03161480611ef157506001600160a01b038085165f9081526005602090815260408083209387168352929052205460ff165b80611f1457505f828152600460205260409020546001600160a01b038481169116145b949350505050565b6001600160a01b038216611f5e576040517f64a0ae920000000000000000000000000000000000000000000000000000000081525f6004820152602401610606565b5f611f6a83835f6113a6565b90506001600160a01b03811615610b3b576040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610606565b606081471015611fed576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610606565b5f80856001600160a01b0316848660405161200891906125d6565b5f6040518083038185875af1925050503d805f8114612042576040519150601f19603f3d011682016040523d82523d5f602084013e612047565b606091505b5091509150612057868383612061565b9695505050505050565b60608261207657612071826120d6565b61124c565b815115801561208d57506001600160a01b0384163b155b156120cf576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610606565b508061124c565b8051156120e65780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffff00000000000000000000000000000000000000000000000000000000811681146114f2575f80fd5b5f60208284031215612155575f80fd5b813561124c81612118565b5f5b8381101561217a578181015183820152602001612162565b50505f910152565b5f8151808452612199816020860160208601612160565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61124c6020830184612182565b5f602082840312156121ed575f80fd5b5035919050565b6001600160a01b03811681146114f2575f80fd5b5f8060408385031215612219575f80fd5b8235612224816121f4565b946020939093013593505050565b5f8060408385031215612243575f80fd5b50508035926020909101359150565b5f805f60608486031215612264575f80fd5b833561226f816121f4565b9250602084013561227f816121f4565b929592945050506040919091013590565b5f80604083850312156122a1575f80fd5b8235915060208301356122b3816121f4565b809150509250929050565b5f602082840312156122ce575f80fd5b813561124c816121f4565b80151581146114f2575f80fd5b5f80604083850312156122f7575f80fd5b8235612302816121f4565b915060208301356122b3816122d9565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f8060808587031215612352575f80fd5b843561235d816121f4565b9350602085013561236d816121f4565b925060408501359150606085013567ffffffffffffffff80821115612390575f80fd5b818701915087601f8301126123a3575f80fd5b8135818111156123b5576123b5612312565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156123fb576123fb612312565b816040528281528a6020848701011115612413575f80fd5b826020860160208301375f60208483010152809550505050505092959194509250565b5f8060408385031215612447575f80fd5b8235612452816121f4565b915060208301356122b3816121f4565b600181811c9082168061247657607f821691505b6020821081036124ad577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f602082840312156124c3575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361251f577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5060010190565b5f60208284031215612536575f80fd5b815161124c816121f4565b5f8351612552818460208801612160565b835190830190612566818360208801612160565b01949350505050565b5f6001600160a01b038087168352808616602084015250836040830152608060608301526120576080830184612182565b5f602082840312156125b0575f80fd5b815161124c81612118565b5f602082840312156125cb575f80fd5b815161124c816122d9565b5f82516125e7818460208701612160565b919091019291505056fea164736f6c6343000819000a000000000000000000000000036cbd53842c5426634e7929541ec2318f3dcf7e