60806040526001600560146101000a81548160ff02191690831515021790555034801561002a575f80fd5b50336040518060400160405280600a81526020017f434154574946434f4154000000000000000000000000000000000000000000008152506040518060400160405280600a81526020017f434154574946434f41540000000000000000000000000000000000000000000081525081600390816100a791906109b9565b5080600490816100b791906109b9565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361012a575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016101219190610ac7565b60405180910390fd5b6101398161015c60201b60201c565b50610157336c01431e0fae6d7217caa000000061021f60201b60201c565b610d4c565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361028f575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016102869190610ac7565b60405180910390fd5b6102a05f83836102a460201b60201c565b5050565b6102b58383836104f060201b60201c565b5f73ffffffffffffffffffffffffffffffffffffffff1660065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036103cc5761031761070960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610388575061035961070960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6103c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103be90610b60565b60405180910390fd5b6104eb565b600560149054906101000a900460ff16801561042157506103f161070960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b801561047a575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156104ea57606461048f61073160201b60201c565b6104999190610bd8565b6104a88361073a60201b60201c565b11156104e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e090610c9e565b60405180910390fd5b5b5b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610540578060025f8282546105349190610cbc565b9250508190555061060e565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156105c9578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016105c093929190610cfe565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610655578060025f828254039250508190555061069f565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106fc9190610d33565b60405180910390a3505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f600254905090565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806107fa57607f821691505b60208210810361080d5761080c6107b6565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261086f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610834565b6108798683610834565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6108bd6108b86108b384610891565b61089a565b610891565b9050919050565b5f819050919050565b6108d6836108a3565b6108ea6108e2826108c4565b848454610840565b825550505050565b5f90565b6108fe6108f2565b6109098184846108cd565b505050565b5b8181101561092c576109215f826108f6565b60018101905061090f565b5050565b601f8211156109715761094281610813565b61094b84610825565b8101602085101561095a578190505b61096e61096685610825565b83018261090e565b50505b505050565b5f82821c905092915050565b5f6109915f1984600802610976565b1980831691505092915050565b5f6109a98383610982565b9150826002028217905092915050565b6109c28261077f565b67ffffffffffffffff8111156109db576109da610789565b5b6109e582546107e3565b6109f0828285610930565b5f60209050601f831160018114610a21575f8415610a0f578287015190505b610a19858261099e565b865550610a80565b601f198416610a2f86610813565b5f5b82811015610a5657848901518255600182019150602085019450602081019050610a31565b86831015610a735784890151610a6f601f891682610982565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610ab182610a88565b9050919050565b610ac181610aa7565b82525050565b5f602082019050610ada5f830184610ab8565b92915050565b5f82825260208201905092915050565b7f506c65617365207761697420666f72206c697175696469747920746f206265205f8201527f6164646564202d2054726164696e67204e6f7420537461727465642059657421602082015250565b5f610b4a604083610ae0565b9150610b5582610af0565b604082019050919050565b5f6020820190508181035f830152610b7781610b3e565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610be282610891565b9150610bed83610891565b925082610bfd57610bfc610b7e565b5b828204905092915050565b7f4c696d6974696e6720757365727320746f20627579203125206f6620434154575f8201527f4946434f415420756e74696c204c75627269636174696f6e20697320636f6d7060208201527f6c65746521000000000000000000000000000000000000000000000000000000604082015250565b5f610c88604583610ae0565b9150610c9382610c08565b606082019050919050565b5f6020820190508181035f830152610cb581610c7c565b9050919050565b5f610cc682610891565b9150610cd183610891565b9250828201905080821115610ce957610ce8610bab565b5b92915050565b610cf881610891565b82525050565b5f606082019050610d115f830186610ab8565b610d1e6020830185610cef565b610d2b6040830184610cef565b949350505050565b5f602082019050610d465f830184610cef565b92915050565b6115fa80610d595f395ff3fe608060405234801561000f575f80fd5b5060043610610109575f3560e01c806370a08231116100a057806395d89b411161006f57806395d89b4114610293578063a9059cbb146102b1578063dd62ed3e146102e1578063e14f08d514610311578063f2fde38b1461031b57610109565b806370a082311461021d578063715018a61461024d5780638da5cb5b1461025757806395afda0c1461027557610109565b806323b872dd116100dc57806323b872dd14610195578063313ce567146101c55780634bc3e7db146101e3578063665a11ca146101ff57610109565b8063018770201461010d57806306fdde0314610129578063095ea7b31461014757806318160ddd14610177575b5f80fd5b6101276004803603810190610122919061106d565b610337565b005b610131610382565b60405161013e9190611108565b60405180910390f35b610161600480360381019061015c919061115b565b610412565b60405161016e91906111b3565b60405180910390f35b61017f610434565b60405161018c91906111db565b60405180910390f35b6101af60048036038101906101aa91906111f4565b61043d565b6040516101bc91906111b3565b60405180910390f35b6101cd61046b565b6040516101da919061125f565b60405180910390f35b6101fd60048036038101906101f891906112a2565b610473565b005b610207610498565b60405161021491906112dc565b60405180910390f35b6102376004803603810190610232919061106d565b6104bd565b60405161024491906111db565b60405180910390f35b610255610502565b005b61025f610515565b60405161026c91906112dc565b60405180910390f35b61027d61053d565b60405161028a91906111b3565b60405180910390f35b61029b610550565b6040516102a89190611108565b60405180910390f35b6102cb60048036038101906102c6919061115b565b6105e0565b6040516102d891906111b3565b60405180910390f35b6102fb60048036038101906102f691906112f5565b610602565b60405161030891906111db565b60405180910390f35b610319610684565b005b6103356004803603810190610330919061106d565b610696565b005b61033f61071a565b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606003805461039190611360565b80601f01602080910402602001604051908101604052809291908181526020018280546103bd90611360565b80156104085780601f106103df57610100808354040283529160200191610408565b820191905f5260205f20905b8154815290600101906020018083116103eb57829003601f168201915b5050505050905090565b5f8061041c6107a1565b90506104298185856107a8565b600191505092915050565b5f600254905090565b5f806104476107a1565b90506104548582856107ba565b61045f85858561084c565b60019150509392505050565b5f6012905090565b61047b61071a565b80600560146101000a81548160ff02191690831515021790555050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61050a61071a565b6105135f61093c565b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600560149054906101000a900460ff1681565b60606004805461055f90611360565b80601f016020809104026020016040519081016040528092919081815260200182805461058b90611360565b80156105d65780601f106105ad576101008083540402835291602001916105d6565b820191905f5260205f20905b8154815290600101906020018083116105b957829003601f168201915b5050505050905090565b5f806105ea6107a1565b90506105f781858561084c565b600191505092915050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b61068c61071a565b610694610502565b565b61069e61071a565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361070e575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161070591906112dc565b60405180910390fd5b6107178161093c565b50565b6107226107a1565b73ffffffffffffffffffffffffffffffffffffffff16610740610515565b73ffffffffffffffffffffffffffffffffffffffff161461079f576107636107a1565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161079691906112dc565b60405180910390fd5b565b5f33905090565b6107b583838360016109ff565b505050565b5f6107c58484610602565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146108465781811015610837578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161082e93929190611390565b60405180910390fd5b61084584848484035f6109ff565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108bc575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016108b391906112dc565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361092c575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161092391906112dc565b60405180910390fd5b610937838383610bce565b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610a6f575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610a6691906112dc565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610adf575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610ad691906112dc565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015610bc8578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610bbf91906111db565b60405180910390a35b50505050565b610bd9838383610df6565b5f73ffffffffffffffffffffffffffffffffffffffff1660065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610ce457610c35610515565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610ca05750610c71610515565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd690611435565b60405180910390fd5b610df1565b600560149054906101000a900460ff168015610d335750610d03610515565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015610d8c575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15610df0576064610d9b610434565b610da591906114ad565b610dae836104bd565b1115610def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de690611573565b60405180910390fd5b5b5b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e46578060025f828254610e3a9190611591565b92505081905550610f14565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610ecf578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610ec693929190611390565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f5b578060025f8282540392505081905550610fa5565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161100291906111db565b60405180910390a3505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61103c82611013565b9050919050565b61104c81611032565b8114611056575f80fd5b50565b5f8135905061106781611043565b92915050565b5f602082840312156110825761108161100f565b5b5f61108f84828501611059565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6110da82611098565b6110e481856110a2565b93506110f48185602086016110b2565b6110fd816110c0565b840191505092915050565b5f6020820190508181035f83015261112081846110d0565b905092915050565b5f819050919050565b61113a81611128565b8114611144575f80fd5b50565b5f8135905061115581611131565b92915050565b5f80604083850312156111715761117061100f565b5b5f61117e85828601611059565b925050602061118f85828601611147565b9150509250929050565b5f8115159050919050565b6111ad81611199565b82525050565b5f6020820190506111c65f8301846111a4565b92915050565b6111d581611128565b82525050565b5f6020820190506111ee5f8301846111cc565b92915050565b5f805f6060848603121561120b5761120a61100f565b5b5f61121886828701611059565b935050602061122986828701611059565b925050604061123a86828701611147565b9150509250925092565b5f60ff82169050919050565b61125981611244565b82525050565b5f6020820190506112725f830184611250565b92915050565b61128181611199565b811461128b575f80fd5b50565b5f8135905061129c81611278565b92915050565b5f602082840312156112b7576112b661100f565b5b5f6112c48482850161128e565b91505092915050565b6112d681611032565b82525050565b5f6020820190506112ef5f8301846112cd565b92915050565b5f806040838503121561130b5761130a61100f565b5b5f61131885828601611059565b925050602061132985828601611059565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061137757607f821691505b60208210810361138a57611389611333565b5b50919050565b5f6060820190506113a35f8301866112cd565b6113b060208301856111cc565b6113bd60408301846111cc565b949350505050565b7f506c65617365207761697420666f72206c697175696469747920746f206265205f8201527f6164646564202d2054726164696e67204e6f7420537461727465642059657421602082015250565b5f61141f6040836110a2565b915061142a826113c5565b604082019050919050565b5f6020820190508181035f83015261144c81611413565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6114b782611128565b91506114c283611128565b9250826114d2576114d1611453565b5b828204905092915050565b7f4c696d6974696e6720757365727320746f20627579203125206f6620434154575f8201527f4946434f415420756e74696c204c75627269636174696f6e20697320636f6d7060208201527f6c65746521000000000000000000000000000000000000000000000000000000604082015250565b5f61155d6045836110a2565b9150611568826114dd565b606082019050919050565b5f6020820190508181035f83015261158a81611551565b9050919050565b5f61159b82611128565b91506115a683611128565b92508282019050808211156115be576115bd611480565b5b9291505056fea2646970667358221220da2ff3f69f19630232fecbd10621eb2ffce9cec9a2224499c33c5e0508cbbc3264736f6c63430008190033