608060405234801561000f575f80fd5b50336040518060400160405280600681526020017f4b65794e465400000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4b4e465400000000000000000000000000000000000000000000000000000000815250815f908161008b9190610420565b50806001908161009b9190610420565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361010e575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610105919061052e565b60405180910390fd5b61011d8161012360201b60201c565b50610547565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061026157607f821691505b6020821081036102745761027361021d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026102d67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261029b565b6102e0868361029b565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61032461031f61031a846102f8565b610301565b6102f8565b9050919050565b5f819050919050565b61033d8361030a565b6103516103498261032b565b8484546102a7565b825550505050565b5f90565b610365610359565b610370818484610334565b505050565b5b81811015610393576103885f8261035d565b600181019050610376565b5050565b601f8211156103d8576103a98161027a565b6103b28461028c565b810160208510156103c1578190505b6103d56103cd8561028c565b830182610375565b50505b505050565b5f82821c905092915050565b5f6103f85f19846008026103dd565b1980831691505092915050565b5f61041083836103e9565b9150826002028217905092915050565b610429826101e6565b67ffffffffffffffff811115610442576104416101f0565b5b61044c825461024a565b610457828285610397565b5f60209050601f831160018114610488575f8415610476578287015190505b6104808582610405565b8655506104e7565b601f1984166104968661027a565b5f5b828110156104bd57848901518255600182019150602085019450602081019050610498565b868310156104da57848901516104d6601f8916826103e9565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610518826104ef565b9050919050565b6105288161050e565b82525050565b5f6020820190506105415f83018461051f565b92915050565b61259e806105545f395ff3fe608060405234801561000f575f80fd5b506004361061011f575f3560e01c806375794a3c116100ab578063bb5b27e11161006f578063bb5b27e1146102f1578063c87b56dd14610321578063d85d3d2714610351578063e985e9c51461036d578063f2fde38b1461039d5761011f565b806375794a3c1461025f5780638da5cb5b1461027d57806395d89b411461029b578063a22cb465146102b9578063b88d4fde146102d55761011f565b806323b872dd116100f257806323b872dd146101bd57806342842e0e146101d95780636352211e146101f557806370a0823114610225578063715018a6146102555761011f565b806301ffc9a71461012357806306fdde0314610153578063081812fc14610171578063095ea7b3146101a1575b5f80fd5b61013d60048036038101906101389190611a1c565b6103b9565b60405161014a9190611a61565b60405180910390f35b61015b61049a565b6040516101689190611aea565b60405180910390f35b61018b60048036038101906101869190611b3d565b610529565b6040516101989190611ba7565b60405180910390f35b6101bb60048036038101906101b69190611bea565b610544565b005b6101d760048036038101906101d29190611c28565b61055a565b005b6101f360048036038101906101ee9190611c28565b610659565b005b61020f600480360381019061020a9190611b3d565b610678565b60405161021c9190611ba7565b60405180910390f35b61023f600480360381019061023a9190611c78565b610689565b60405161024c9190611cb2565b60405180910390f35b61025d61073f565b005b610267610752565b6040516102749190611cb2565b60405180910390f35b610285610758565b6040516102929190611ba7565b60405180910390f35b6102a3610780565b6040516102b09190611aea565b60405180910390f35b6102d360048036038101906102ce9190611cf5565b610810565b005b6102ef60048036038101906102ea9190611e5f565b610826565b005b61030b60048036038101906103069190611b3d565b61084b565b6040516103189190611aea565b60405180910390f35b61033b60048036038101906103369190611b3d565b610962565b6040516103489190611aea565b60405180910390f35b61036b60048036038101906103669190611f7d565b6109c8565b005b61038760048036038101906103829190611fc4565b610a1a565b6040516103949190611a61565b60405180910390f35b6103b760048036038101906103b29190611c78565b610aa8565b005b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061048357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610493575061049282610b2c565b5b9050919050565b60605f80546104a89061202f565b80601f01602080910402602001604051908101604052809291908181526020018280546104d49061202f565b801561051f5780601f106104f65761010080835404028352916020019161051f565b820191905f5260205f20905b81548152906001019060200180831161050257829003601f168201915b5050505050905090565b5f61053382610b95565b5061053d82610c1b565b9050919050565b6105568282610551610c54565b610c5b565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036105ca575f6040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016105c19190611ba7565b60405180910390fd5b5f6105dd83836105d8610c54565b610c6d565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610653578382826040517f64283d7b00000000000000000000000000000000000000000000000000000000815260040161064a9392919061205f565b60405180910390fd5b50505050565b61067383838360405180602001604052805f815250610826565b505050565b5f61068282610b95565b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036106fa575f6040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016106f19190611ba7565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610747610e78565b6107505f610eff565b565b60075481565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461078f9061202f565b80601f01602080910402602001604051908101604052809291908181526020018280546107bb9061202f565b80156108065780601f106107dd57610100808354040283529160200191610806565b820191905f5260205f20905b8154815290600101906020018083116107e957829003601f168201915b5050505050905090565b61082261081b610c54565b8383610fc2565b5050565b61083184848461055a565b61084561083c610c54565b8585858561112b565b50505050565b60603373ffffffffffffffffffffffffffffffffffffffff1661086d83610678565b73ffffffffffffffffffffffffffffffffffffffff16146108c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ba906120de565b60405180910390fd5b60085f8381526020019081526020015f2080546108df9061202f565b80601f016020809104026020016040519081016040528092919081815260200182805461090b9061202f565b80156109565780601f1061092d57610100808354040283529160200191610956565b820191905f5260205f20905b81548152906001019060200180831161093957829003601f168201915b50505050509050919050565b606061096d82610b95565b505f6109776112d7565b90505f8151116109955760405180602001604052805f8152506109c0565b8061099f846112ed565b6040516020016109b0929190612136565b6040516020818303038152906040525b915050919050565b6109d0610e78565b5f600754905060075f8154809291906109e890612186565b91905055506109f733826113b7565b8160085f8381526020019081526020015f209081610a15919061236a565b505050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b610ab0610e78565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b20575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610b179190611ba7565b60405180910390fd5b610b2981610eff565b50565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f80610ba0836113d4565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c1257826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401610c099190611cb2565b60405180910390fd5b80915050919050565b5f60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f33905090565b610c68838383600161140d565b505050565b5f80610c78846113d4565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610cb957610cb88184866115cc565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d4457610cf85f855f8061140d565b600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610dc357600160035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8460025f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b610e80610c54565b73ffffffffffffffffffffffffffffffffffffffff16610e9e610758565b73ffffffffffffffffffffffffffffffffffffffff1614610efd57610ec1610c54565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610ef49190611ba7565b60405180910390fd5b565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361103257816040517f5b08ba180000000000000000000000000000000000000000000000000000000081526004016110299190611ba7565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161111e9190611a61565b60405180910390a3505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b11156112d0578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02868685856040518563ffffffff1660e01b8152600401611189949392919061248b565b6020604051808303815f875af19250505080156111c457506040513d601f19601f820116820180604052508101906111c191906124e9565b60015b611245573d805f81146111f2576040519150601f19603f3d011682016040523d82523d5f602084013e6111f7565b606091505b505f81510361123d57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016112349190611ba7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146112ce57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016112c59190611ba7565b60405180910390fd5b505b5050505050565b606060405180602001604052805f815250905090565b60605f60016112fb8461168f565b0190505f8167ffffffffffffffff81111561131957611318611d3b565b5b6040519080825280601f01601f19166020018201604052801561134b5781602001600182028036833780820191505090505b5090505f82602001820190505b6001156113ac578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816113a1576113a0612514565b5b0494505f8503611358575b819350505050919050565b6113d0828260405180602001604052805f8152506117e0565b5050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b808061144557505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611577575f61145484610b95565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156114be57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156114d157506114cf8184610a1a565b155b1561151357826040517fa9fbf51f00000000000000000000000000000000000000000000000000000000815260040161150a9190611ba7565b60405180910390fd5b811561157557838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b8360045f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6115d7838383611803565b61168a575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361164b57806040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016116429190611cb2565b60405180910390fd5b81816040517f177e802f000000000000000000000000000000000000000000000000000000008152600401611681929190612541565b60405180910390fd5b505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106116eb577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816116e1576116e0612514565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611728576d04ee2d6d415b85acef8100000000838161171e5761171d612514565b5b0492506020810190505b662386f26fc10000831061175757662386f26fc10000838161174d5761174c612514565b5b0492506010810190505b6305f5e1008310611780576305f5e100838161177657611775612514565b5b0492506008810190505b61271083106117a557612710838161179b5761179a612514565b5b0492506004810190505b606483106117c857606483816117be576117bd612514565b5b0492506002810190505b600a83106117d7576001810190505b80915050919050565b6117ea83836118c3565b6117fe6117f5610c54565b5f85858561112b565b505050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156118ba57508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061187b575061187a8484610a1a565b5b806118b957508273ffffffffffffffffffffffffffffffffffffffff166118a183610c1b565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611933575f6040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161192a9190611ba7565b60405180910390fd5b5f61193f83835f610c6d565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146119b1575f6040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081526004016119a89190611ba7565b60405180910390fd5b505050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6119fb816119c7565b8114611a05575f80fd5b50565b5f81359050611a16816119f2565b92915050565b5f60208284031215611a3157611a306119bf565b5b5f611a3e84828501611a08565b91505092915050565b5f8115159050919050565b611a5b81611a47565b82525050565b5f602082019050611a745f830184611a52565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611abc82611a7a565b611ac68185611a84565b9350611ad6818560208601611a94565b611adf81611aa2565b840191505092915050565b5f6020820190508181035f830152611b028184611ab2565b905092915050565b5f819050919050565b611b1c81611b0a565b8114611b26575f80fd5b50565b5f81359050611b3781611b13565b92915050565b5f60208284031215611b5257611b516119bf565b5b5f611b5f84828501611b29565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611b9182611b68565b9050919050565b611ba181611b87565b82525050565b5f602082019050611bba5f830184611b98565b92915050565b611bc981611b87565b8114611bd3575f80fd5b50565b5f81359050611be481611bc0565b92915050565b5f8060408385031215611c0057611bff6119bf565b5b5f611c0d85828601611bd6565b9250506020611c1e85828601611b29565b9150509250929050565b5f805f60608486031215611c3f57611c3e6119bf565b5b5f611c4c86828701611bd6565b9350506020611c5d86828701611bd6565b9250506040611c6e86828701611b29565b9150509250925092565b5f60208284031215611c8d57611c8c6119bf565b5b5f611c9a84828501611bd6565b91505092915050565b611cac81611b0a565b82525050565b5f602082019050611cc55f830184611ca3565b92915050565b611cd481611a47565b8114611cde575f80fd5b50565b5f81359050611cef81611ccb565b92915050565b5f8060408385031215611d0b57611d0a6119bf565b5b5f611d1885828601611bd6565b9250506020611d2985828601611ce1565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611d7182611aa2565b810181811067ffffffffffffffff82111715611d9057611d8f611d3b565b5b80604052505050565b5f611da26119b6565b9050611dae8282611d68565b919050565b5f67ffffffffffffffff821115611dcd57611dcc611d3b565b5b611dd682611aa2565b9050602081019050919050565b828183375f83830152505050565b5f611e03611dfe84611db3565b611d99565b905082815260208101848484011115611e1f57611e1e611d37565b5b611e2a848285611de3565b509392505050565b5f82601f830112611e4657611e45611d33565b5b8135611e56848260208601611df1565b91505092915050565b5f805f8060808587031215611e7757611e766119bf565b5b5f611e8487828801611bd6565b9450506020611e9587828801611bd6565b9350506040611ea687828801611b29565b925050606085013567ffffffffffffffff811115611ec757611ec66119c3565b5b611ed387828801611e32565b91505092959194509250565b5f67ffffffffffffffff821115611ef957611ef8611d3b565b5b611f0282611aa2565b9050602081019050919050565b5f611f21611f1c84611edf565b611d99565b905082815260208101848484011115611f3d57611f3c611d37565b5b611f48848285611de3565b509392505050565b5f82601f830112611f6457611f63611d33565b5b8135611f74848260208601611f0f565b91505092915050565b5f60208284031215611f9257611f916119bf565b5b5f82013567ffffffffffffffff811115611faf57611fae6119c3565b5b611fbb84828501611f50565b91505092915050565b5f8060408385031215611fda57611fd96119bf565b5b5f611fe785828601611bd6565b9250506020611ff885828601611bd6565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061204657607f821691505b60208210810361205957612058612002565b5b50919050565b5f6060820190506120725f830186611b98565b61207f6020830185611ca3565b61208c6040830184611b98565b949350505050565b7f517565727920666f72206e6f6e6578697374656e7420746f6b656e00000000005f82015250565b5f6120c8601b83611a84565b91506120d382612094565b602082019050919050565b5f6020820190508181035f8301526120f5816120bc565b9050919050565b5f81905092915050565b5f61211082611a7a565b61211a81856120fc565b935061212a818560208601611a94565b80840191505092915050565b5f6121418285612106565b915061214d8284612106565b91508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61219082611b0a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036121c2576121c1612159565b5b600182019050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026122297fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826121ee565b61223386836121ee565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61226e61226961226484611b0a565b61224b565b611b0a565b9050919050565b5f819050919050565b61228783612254565b61229b61229382612275565b8484546121fa565b825550505050565b5f90565b6122af6122a3565b6122ba81848461227e565b505050565b5b818110156122dd576122d25f826122a7565b6001810190506122c0565b5050565b601f821115612322576122f3816121cd565b6122fc846121df565b8101602085101561230b578190505b61231f612317856121df565b8301826122bf565b50505b505050565b5f82821c905092915050565b5f6123425f1984600802612327565b1980831691505092915050565b5f61235a8383612333565b9150826002028217905092915050565b61237382611a7a565b67ffffffffffffffff81111561238c5761238b611d3b565b5b612396825461202f565b6123a18282856122e1565b5f60209050601f8311600181146123d2575f84156123c0578287015190505b6123ca858261234f565b865550612431565b601f1984166123e0866121cd565b5f5b82811015612407578489015182556001820191506020850194506020810190506123e2565b868310156124245784890151612420601f891682612333565b8355505b6001600288020188555050505b505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f61245d82612439565b6124678185612443565b9350612477818560208601611a94565b61248081611aa2565b840191505092915050565b5f60808201905061249e5f830187611b98565b6124ab6020830186611b98565b6124b86040830185611ca3565b81810360608301526124ca8184612453565b905095945050505050565b5f815190506124e3816119f2565b92915050565b5f602082840312156124fe576124fd6119bf565b5b5f61250b848285016124d5565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6040820190506125545f830185611b98565b6125616020830184611ca3565b939250505056fea264697066735822122017d06f58a9dfac1242f107e9da693234f6a645996e721205eea24017d88ec48164736f6c634300081a0033