60806040526001600560146101000a81548160ff021916908315150217905550603260075f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550348015610063575f80fd5b506040518060400160405280600581526020017f416e4567670000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f656767000000000000000000000000000000000000000000000000000000000081525081600390816100df919061063d565b5080600490816100ef919061063d565b50505061010e6101036101d560201b60201c565b6101dc60201b60201c565b600160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160065f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506101d033670de0b6b3a764000061029f60201b60201c565b61080c565b5f33905090565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361030d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161030490610766565b60405180910390fd5b61031e5f83836103f960201b60201c565b8060025f82825461032f91906107b1565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516103dc91906107f3565b60405180910390a36103f55f83836103fe60201b60201c565b5050565b505050565b505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061047e57607f821691505b6020821081036104915761049061043a565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026104f37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826104b8565b6104fd86836104b8565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61054161053c61053784610515565b61051e565b610515565b9050919050565b5f819050919050565b61055a83610527565b61056e61056682610548565b8484546104c4565b825550505050565b5f90565b610582610576565b61058d818484610551565b505050565b5b818110156105b0576105a55f8261057a565b600181019050610593565b5050565b601f8211156105f5576105c681610497565b6105cf846104a9565b810160208510156105de578190505b6105f26105ea856104a9565b830182610592565b50505b505050565b5f82821c905092915050565b5f6106155f19846008026105fa565b1980831691505092915050565b5f61062d8383610606565b9150826002028217905092915050565b61064682610403565b67ffffffffffffffff81111561065f5761065e61040d565b5b6106698254610467565b6106748282856105b4565b5f60209050601f8311600181146106a5575f8415610693578287015190505b61069d8582610622565b865550610704565b601f1984166106b386610497565b5f5b828110156106da578489015182556001820191506020850194506020810190506106b5565b868310156106f757848901516106f3601f891682610606565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f610750601f8361070c565b915061075b8261071c565b602082019050919050565b5f6020820190508181035f83015261077d81610744565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6107bb82610515565b91506107c683610515565b92508282019050808211156107de576107dd610784565b5b92915050565b6107ed81610515565b82525050565b5f6020820190506108065f8301846107e4565b92915050565b611d96806108195f395ff3fe608060405234801561000f575f80fd5b506004361061014b575f3560e01c80638d3e6e40116100c1578063ba536c491161007a578063ba536c49146103b5578063c9567bf9146103bf578063dd62ed3e146103c9578063e43db958146103f9578063f2fde38b14610403578063feda4bed1461041f5761014b565b80638d3e6e40146102cb5780638da5cb5b146102fb57806395d89b4114610319578063a457c2d714610337578063a4d66daf14610367578063a9059cbb146103855761014b565b8063313ce56711610113578063313ce56714610209578063366f9c7d1461022757806339509351146102435780633c8463a11461027357806370a0823114610291578063715018a6146102c15761014b565b806306fdde031461014f578063095ea7b31461016d57806318160ddd1461019d57806323b872dd146101bb5780632ded0b04146101eb575b5f80fd5b61015761043b565b60405161016491906113a5565b60405180910390f35b61018760048036038101906101829190611456565b6104cb565b60405161019491906114ae565b60405180910390f35b6101a56104ed565b6040516101b291906114d6565b60405180910390f35b6101d560048036038101906101d091906114ef565b6104f6565b6040516101e291906114ae565b60405180910390f35b6101f3610524565b60405161020091906114ae565b60405180910390f35b610211610537565b60405161021e919061155a565b60405180910390f35b610241600480360381019061023c91906115b8565b61053f565b005b61025d60048036038101906102589190611456565b610582565b60405161026a91906114ae565b60405180910390f35b61027b6105b8565b60405161028891906115f2565b60405180910390f35b6102ab60048036038101906102a6919061160b565b6105d9565b6040516102b891906114d6565b60405180910390f35b6102c961061e565b005b6102e560048036038101906102e0919061160b565b610631565b6040516102f291906114ae565b60405180910390f35b61030361064e565b6040516103109190611645565b60405180910390f35b610321610676565b60405161032e91906113a5565b60405180910390f35b610351600480360381019061034c9190611456565b610706565b60405161035e91906114ae565b60405180910390f35b61036f61077b565b60405161037c91906114ae565b60405180910390f35b61039f600480360381019061039a9190611456565b61078e565b6040516103ac91906114ae565b60405180910390f35b6103bd6107b0565b005b6103c76107d4565b005b6103e360048036038101906103de919061165e565b6107f9565b6040516103f091906114d6565b60405180910390f35b61040161087b565b005b61041d6004803603810190610418919061160b565b6108a0565b005b6104396004803603810190610434919061160b565b610922565b005b60606003805461044a906116c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610476906116c9565b80156104c15780601f10610498576101008083540402835291602001916104c1565b820191905f5260205f20905b8154815290600101906020018083116104a457829003601f168201915b5050505050905090565b5f806104d5610982565b90506104e2818585610989565b600191505092915050565b5f600254905090565b5f80610500610982565b905061050d858285610b4c565b610518858585610bd7565b60019150509392505050565b600560159054906101000a900460ff1681565b5f6012905090565b610547611014565b8060075f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b5f8061058c610982565b90506105ad81858561059e85896107f9565b6105a89190611726565b610989565b600191505092915050565b60075f9054906101000a90046fffffffffffffffffffffffffffffffff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610626611014565b61062f5f611092565b565b6006602052805f5260405f205f915054906101000a900460ff1681565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610685906116c9565b80601f01602080910402602001604051908101604052809291908181526020018280546106b1906116c9565b80156106fc5780601f106106d3576101008083540402835291602001916106fc565b820191905f5260205f20905b8154815290600101906020018083116106df57829003601f168201915b5050505050905090565b5f80610710610982565b90505f61071d82866107f9565b905083811015610762576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610759906117c9565b60405180910390fd5b61076f8286868403610989565b60019250505092915050565b600560149054906101000a900460ff1681565b5f80610798610982565b90506107a5818585610bd7565b600191505092915050565b6107b8611014565b5f600560146101000a81548160ff021916908315150217905550565b6107dc611014565b6001600560156101000a81548160ff021916908315150217905550565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610883611014565b6001600560146101000a81548160ff021916908315150217905550565b6108a8611014565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090d90611857565b60405180910390fd5b61091f81611092565b50565b61092a611014565b600160065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ee906118e5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c90611973565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610b3f91906114d6565b60405180910390a3505050565b5f610b5784846107f9565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610bd15781811015610bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bba906119db565b60405180910390fd5b610bd08484848403610989565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3c90611a43565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caa90611aab565b60405180910390fd5b600560149054906101000a900460ff168015610d025750610cd261064e565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15610e5557600560159054906101000a900460ff16610d1f575f80fd5b60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610e5457610dca6103e8610dbc60075f9054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16610dae6104ed565b61115590919063ffffffff16565b6111cc90919063ffffffff16565b815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610e129190611726565b1115610e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4a90611b13565b60405180910390fd5b5b5b610edb816040518060400160405280601f81526020017f7472616e7366657220616d6f756e7420657863656564732062616c616e6365008152505f808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546112159092919063ffffffff16565b5f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610f6a815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461127790919063ffffffff16565b5f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161100791906114d6565b60405180910390a3505050565b61101c610982565b73ffffffffffffffffffffffffffffffffffffffff1661103a61064e565b73ffffffffffffffffffffffffffffffffffffffff1614611090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108790611b7b565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f808303611165575f90506111c6565b5f82846111729190611b99565b90508284826111819190611c07565b146111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b890611ca7565b60405180910390fd5b809150505b92915050565b5f61120d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506112d4565b905092915050565b5f83831115829061125c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125391906113a5565b60405180910390fd5b505f838561126a9190611cc5565b9050809150509392505050565b5f8082846112859190611726565b9050838110156112ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c190611d42565b60405180910390fd5b8091505092915050565b5f808311829061131a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131191906113a5565b60405180910390fd5b505f83856113289190611c07565b9050809150509392505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61137782611335565b611381818561133f565b935061139181856020860161134f565b61139a8161135d565b840191505092915050565b5f6020820190508181035f8301526113bd818461136d565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6113f2826113c9565b9050919050565b611402816113e8565b811461140c575f80fd5b50565b5f8135905061141d816113f9565b92915050565b5f819050919050565b61143581611423565b811461143f575f80fd5b50565b5f813590506114508161142c565b92915050565b5f806040838503121561146c5761146b6113c5565b5b5f6114798582860161140f565b925050602061148a85828601611442565b9150509250929050565b5f8115159050919050565b6114a881611494565b82525050565b5f6020820190506114c15f83018461149f565b92915050565b6114d081611423565b82525050565b5f6020820190506114e95f8301846114c7565b92915050565b5f805f60608486031215611506576115056113c5565b5b5f6115138682870161140f565b93505060206115248682870161140f565b925050604061153586828701611442565b9150509250925092565b5f60ff82169050919050565b6115548161153f565b82525050565b5f60208201905061156d5f83018461154b565b92915050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b61159781611573565b81146115a1575f80fd5b50565b5f813590506115b28161158e565b92915050565b5f602082840312156115cd576115cc6113c5565b5b5f6115da848285016115a4565b91505092915050565b6115ec81611573565b82525050565b5f6020820190506116055f8301846115e3565b92915050565b5f602082840312156116205761161f6113c5565b5b5f61162d8482850161140f565b91505092915050565b61163f816113e8565b82525050565b5f6020820190506116585f830184611636565b92915050565b5f8060408385031215611674576116736113c5565b5b5f6116818582860161140f565b92505060206116928582860161140f565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806116e057607f821691505b6020821081036116f3576116f261169c565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61173082611423565b915061173b83611423565b9250828201905080821115611753576117526116f9565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f6117b360258361133f565b91506117be82611759565b604082019050919050565b5f6020820190508181035f8301526117e0816117a7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61184160268361133f565b915061184c826117e7565b604082019050919050565b5f6020820190508181035f83015261186e81611835565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6118cf60248361133f565b91506118da82611875565b604082019050919050565b5f6020820190508181035f8301526118fc816118c3565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f61195d60228361133f565b915061196882611903565b604082019050919050565b5f6020820190508181035f83015261198a81611951565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f6119c5601d8361133f565b91506119d082611991565b602082019050919050565b5f6020820190508181035f8301526119f2816119b9565b9050919050565b7f7472616e736665722066726f6d20746865207a65726f206164647265737300005f82015250565b5f611a2d601e8361133f565b9150611a38826119f9565b602082019050919050565b5f6020820190508181035f830152611a5a81611a21565b9050919050565b7f7472616e7366657220746f20746865207a65726f2061646472657373000000005f82015250565b5f611a95601c8361133f565b9150611aa082611a61565b602082019050919050565b5f6020820190508181035f830152611ac281611a89565b9050919050565b7f4c494d49542057414c4c455400000000000000000000000000000000000000005f82015250565b5f611afd600c8361133f565b9150611b0882611ac9565b602082019050919050565b5f6020820190508181035f830152611b2a81611af1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f611b6560208361133f565b9150611b7082611b31565b602082019050919050565b5f6020820190508181035f830152611b9281611b59565b9050919050565b5f611ba382611423565b9150611bae83611423565b9250828202611bbc81611423565b91508282048414831517611bd357611bd26116f9565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611c1182611423565b9150611c1c83611423565b925082611c2c57611c2b611bda565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f5f8201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b5f611c9160218361133f565b9150611c9c82611c37565b604082019050919050565b5f6020820190508181035f830152611cbe81611c85565b9050919050565b5f611ccf82611423565b9150611cda83611423565b9250828203905081811115611cf257611cf16116f9565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f611d2c601b8361133f565b9150611d3782611cf8565b602082019050919050565b5f6020820190508181035f830152611d5981611d20565b905091905056fea2646970667358221220b8dc73ef91850e2606936992a3120602546f670e76d6d448d19f20474c3d2e0d64736f6c63430008190033