60806040525f600755348015610013575f80fd5b50336040518060400160405280601381526020017f5375646f20546573742037323120546f6b656e000000000000000000000000008152506040518060400160405280600481526020017f5354375400000000000000000000000000000000000000000000000000000000815250815f908161008f9190610424565b50806001908161009f9190610424565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610112575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016101099190610532565b60405180910390fd5b6101218161012760201b60201c565b5061054b565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061026557607f821691505b60208210810361027857610277610221565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026102da7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261029f565b6102e4868361029f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61032861032361031e846102fc565b610305565b6102fc565b9050919050565b5f819050919050565b6103418361030e565b61035561034d8261032f565b8484546102ab565b825550505050565b5f90565b61036961035d565b610374818484610338565b505050565b5b818110156103975761038c5f82610361565b60018101905061037a565b5050565b601f8211156103dc576103ad8161027e565b6103b684610290565b810160208510156103c5578190505b6103d96103d185610290565b830182610379565b50505b505050565b5f82821c905092915050565b5f6103fc5f19846008026103e1565b1980831691505092915050565b5f61041483836103ed565b9150826002028217905092915050565b61042d826101ea565b67ffffffffffffffff811115610446576104456101f4565b5b610450825461024e565b61045b82828561039b565b5f60209050601f83116001811461048c575f841561047a578287015190505b6104848582610409565b8655506104eb565b601f19841661049a8661027e565b5f5b828110156104c15784890151825560018201915060208501945060208101905061049c565b868310156104de57848901516104da601f8916826103ed565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61051c826104f3565b9050919050565b61052c81610512565b82525050565b5f6020820190506105455f830184610523565b92915050565b612529806105585f395ff3fe608060405234801561000f575f80fd5b506004361061012a575f3560e01c806370a08231116100ab578063a22cb4651161006f578063a22cb46514610318578063b88d4fde14610334578063c87b56dd14610350578063e985e9c514610380578063f2fde38b146103b05761012a565b806370a0823114610286578063715018a6146102b65780638da5cb5b146102c05780638edc4edf146102de57806395d89b41146102fa5761012a565b806332cb6b0c116100f257806332cb6b0c146101e457806342842e0e1461020257806357f7789e1461021e5780636352211e1461023a5780636a6278421461026a5761012a565b806301ffc9a71461012e57806306fdde031461015e578063081812fc1461017c578063095ea7b3146101ac57806323b872dd146101c8575b5f80fd5b61014860048036038101906101439190611888565b6103cc565b60405161015591906118cd565b60405180910390f35b6101666104ad565b6040516101739190611956565b60405180910390f35b610196600480360381019061019191906119a9565b61053c565b6040516101a39190611a13565b60405180910390f35b6101c660048036038101906101c19190611a56565b610557565b005b6101e260048036038101906101dd9190611a94565b61056d565b005b6101ec61066c565b6040516101f99190611af3565b60405180910390f35b61021c60048036038101906102179190611a94565b610672565b005b61023860048036038101906102339190611c38565b610691565b005b610254600480360381019061024f91906119a9565b610704565b6040516102619190611a13565b60405180910390f35b610284600480360381019061027f9190611c92565b610715565b005b6102a0600480360381019061029b9190611c92565b610792565b6040516102ad9190611af3565b60405180910390f35b6102be610848565b005b6102c861085b565b6040516102d59190611a13565b60405180910390f35b6102f860048036038101906102f39190611cbd565b610883565b005b61030261089e565b60405161030f9190611956565b60405180910390f35b610332600480360381019061032d9190611d2e565b61092e565b005b61034e60048036038101906103499190611e0a565b610944565b005b61036a600480360381019061036591906119a9565b610961565b6040516103779190611956565b60405180910390f35b61039a60048036038101906103959190611e8a565b610ae3565b6040516103a791906118cd565b60405180910390f35b6103ca60048036038101906103c59190611c92565b610b71565b005b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061049657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104a657506104a582610bf5565b5b9050919050565b60605f80546104bb90611ef5565b80601f01602080910402602001604051908101604052809291908181526020018280546104e790611ef5565b80156105325780601f1061050957610100808354040283529160200191610532565b820191905f5260205f20905b81548152906001019060200180831161051557829003601f168201915b5050505050905090565b5f61054682610c5e565b5061055082610ce4565b9050919050565b6105698282610564610d1d565b610d24565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036105dd575f6040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016105d49190611a13565b60405180910390fd5b5f6105f083836105eb610d1d565b610d36565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610666578382826040517f64283d7b00000000000000000000000000000000000000000000000000000000815260040161065d93929190611f25565b60405180910390fd5b50505050565b61271081565b61068c83838360405180602001604052805f815250610944565b505050565b610699610f41565b6106a282610fc8565b6106e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d890611fca565b60405180910390fd5b8060095f8481526020019081526020015f2090816106ff9190612185565b505050565b5f61070e82610c5e565b9050919050565b6127106007541061075b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107529061229e565b60405180910390fd5b5f600160075461076b91906122e9565b90506107778282610fd6565b60075f8154809291906107899061231c565b91905055505050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610803575f6040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016107fa9190611a13565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610850610f41565b6108595f6110c9565b565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61088b610f41565b806008908161089a9190612185565b5050565b6060600180546108ad90611ef5565b80601f01602080910402602001604051908101604052809291908181526020018280546108d990611ef5565b80156109245780601f106108fb57610100808354040283529160200191610924565b820191905f5260205f20905b81548152906001019060200180831161090757829003601f168201915b5050505050905090565b610940610939610d1d565b838361118c565b5050565b61094f84848461056d565b61095b848484846112f5565b50505050565b606061096c82610fc8565b6109ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a2906123d3565b60405180910390fd5b5f60095f8481526020019081526020015f2080546109c890611ef5565b80601f01602080910402602001604051908101604052809291908181526020018280546109f490611ef5565b8015610a3f5780601f10610a1657610100808354040283529160200191610a3f565b820191905f5260205f20905b815481529060010190602001808311610a2257829003601f168201915b505050505090505f815103610ada5760088054610a5b90611ef5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8790611ef5565b8015610ad25780601f10610aa957610100808354040283529160200191610ad2565b820191905f5260205f20905b815481529060010190602001808311610ab557829003601f168201915b505050505090505b80915050919050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b610b79610f41565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610be9575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610be09190611a13565b60405180910390fd5b610bf2816110c9565b50565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f80610c69836114a7565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610cdb57826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401610cd29190611af3565b60405180910390fd5b80915050919050565b5f60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f33905090565b610d3183838360016114e0565b505050565b5f80610d41846114a7565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610d8257610d8181848661169f565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e0d57610dc15f855f806114e0565b600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610e8c57600160035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8460025f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b610f49610d1d565b73ffffffffffffffffffffffffffffffffffffffff16610f6761085b565b73ffffffffffffffffffffffffffffffffffffffff1614610fc657610f8a610d1d565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610fbd9190611a13565b60405180910390fd5b565b5f8160075410159050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611046575f6040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161103d9190611a13565b60405180910390fd5b5f61105283835f610d36565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146110c4575f6040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081526004016110bb9190611a13565b60405180910390fd5b505050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111fc57816040517f5b08ba180000000000000000000000000000000000000000000000000000000081526004016111f39190611a13565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112e891906118cd565b60405180910390a3505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b11156114a1578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02611338610d1d565b8685856040518563ffffffff1660e01b815260040161135a9493929190612443565b6020604051808303815f875af192505050801561139557506040513d601f19601f8201168201806040525081019061139291906124a1565b60015b611416573d805f81146113c3576040519150601f19603f3d011682016040523d82523d5f602084013e6113c8565b606091505b505f81510361140e57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016114059190611a13565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461149f57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016114969190611a13565b60405180910390fd5b505b50505050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b808061151857505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561164a575f61152784610c5e565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561159157508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156115a457506115a28184610ae3565b155b156115e657826040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526004016115dd9190611a13565b60405180910390fd5b811561164857838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b8360045f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6116aa838383611762565b61175d575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361171e57806040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016117159190611af3565b60405180910390fd5b81816040517f177e802f0000000000000000000000000000000000000000000000000000000081526004016117549291906124cc565b60405180910390fd5b505050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561181957508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806117da57506117d98484610ae3565b5b8061181857508273ffffffffffffffffffffffffffffffffffffffff1661180083610ce4565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61186781611833565b8114611871575f80fd5b50565b5f813590506118828161185e565b92915050565b5f6020828403121561189d5761189c61182b565b5b5f6118aa84828501611874565b91505092915050565b5f8115159050919050565b6118c7816118b3565b82525050565b5f6020820190506118e05f8301846118be565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611928826118e6565b61193281856118f0565b9350611942818560208601611900565b61194b8161190e565b840191505092915050565b5f6020820190508181035f83015261196e818461191e565b905092915050565b5f819050919050565b61198881611976565b8114611992575f80fd5b50565b5f813590506119a38161197f565b92915050565b5f602082840312156119be576119bd61182b565b5b5f6119cb84828501611995565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6119fd826119d4565b9050919050565b611a0d816119f3565b82525050565b5f602082019050611a265f830184611a04565b92915050565b611a35816119f3565b8114611a3f575f80fd5b50565b5f81359050611a5081611a2c565b92915050565b5f8060408385031215611a6c57611a6b61182b565b5b5f611a7985828601611a42565b9250506020611a8a85828601611995565b9150509250929050565b5f805f60608486031215611aab57611aaa61182b565b5b5f611ab886828701611a42565b9350506020611ac986828701611a42565b9250506040611ada86828701611995565b9150509250925092565b611aed81611976565b82525050565b5f602082019050611b065f830184611ae4565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611b4a8261190e565b810181811067ffffffffffffffff82111715611b6957611b68611b14565b5b80604052505050565b5f611b7b611822565b9050611b878282611b41565b919050565b5f67ffffffffffffffff821115611ba657611ba5611b14565b5b611baf8261190e565b9050602081019050919050565b828183375f83830152505050565b5f611bdc611bd784611b8c565b611b72565b905082815260208101848484011115611bf857611bf7611b10565b5b611c03848285611bbc565b509392505050565b5f82601f830112611c1f57611c1e611b0c565b5b8135611c2f848260208601611bca565b91505092915050565b5f8060408385031215611c4e57611c4d61182b565b5b5f611c5b85828601611995565b925050602083013567ffffffffffffffff811115611c7c57611c7b61182f565b5b611c8885828601611c0b565b9150509250929050565b5f60208284031215611ca757611ca661182b565b5b5f611cb484828501611a42565b91505092915050565b5f60208284031215611cd257611cd161182b565b5b5f82013567ffffffffffffffff811115611cef57611cee61182f565b5b611cfb84828501611c0b565b91505092915050565b611d0d816118b3565b8114611d17575f80fd5b50565b5f81359050611d2881611d04565b92915050565b5f8060408385031215611d4457611d4361182b565b5b5f611d5185828601611a42565b9250506020611d6285828601611d1a565b9150509250929050565b5f67ffffffffffffffff821115611d8657611d85611b14565b5b611d8f8261190e565b9050602081019050919050565b5f611dae611da984611d6c565b611b72565b905082815260208101848484011115611dca57611dc9611b10565b5b611dd5848285611bbc565b509392505050565b5f82601f830112611df157611df0611b0c565b5b8135611e01848260208601611d9c565b91505092915050565b5f805f8060808587031215611e2257611e2161182b565b5b5f611e2f87828801611a42565b9450506020611e4087828801611a42565b9350506040611e5187828801611995565b925050606085013567ffffffffffffffff811115611e7257611e7161182f565b5b611e7e87828801611ddd565b91505092959194509250565b5f8060408385031215611ea057611e9f61182b565b5b5f611ead85828601611a42565b9250506020611ebe85828601611a42565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611f0c57607f821691505b602082108103611f1f57611f1e611ec8565b5b50919050565b5f606082019050611f385f830186611a04565b611f456020830185611ae4565b611f526040830184611a04565b949350505050565b7f4552433732314d657461646174613a2055524920736574206f66206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f611fb4602c836118f0565b9150611fbf82611f5a565b604082019050919050565b5f6020820190508181035f830152611fe181611fa8565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026120447fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612009565b61204e8683612009565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61208961208461207f84611976565b612066565b611976565b9050919050565b5f819050919050565b6120a28361206f565b6120b66120ae82612090565b848454612015565b825550505050565b5f90565b6120ca6120be565b6120d5818484612099565b505050565b5b818110156120f8576120ed5f826120c2565b6001810190506120db565b5050565b601f82111561213d5761210e81611fe8565b61211784611ffa565b81016020851015612126578190505b61213a61213285611ffa565b8301826120da565b50505b505050565b5f82821c905092915050565b5f61215d5f1984600802612142565b1980831691505092915050565b5f612175838361214e565b9150826002028217905092915050565b61218e826118e6565b67ffffffffffffffff8111156121a7576121a6611b14565b5b6121b18254611ef5565b6121bc8282856120fc565b5f60209050601f8311600181146121ed575f84156121db578287015190505b6121e5858261216a565b86555061224c565b601f1984166121fb86611fe8565b5f5b82811015612222578489015182556001820191506020850194506020810190506121fd565b8683101561223f578489015161223b601f89168261214e565b8355505b6001600288020188555050505b505050505050565b7f4d6178696d756d20737570706c792072656163686564000000000000000000005f82015250565b5f6122886016836118f0565b915061229382612254565b602082019050919050565b5f6020820190508181035f8301526122b58161227c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6122f382611976565b91506122fe83611976565b9250828201905080821115612316576123156122bc565b5b92915050565b5f61232682611976565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612358576123576122bc565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f6123bd602f836118f0565b91506123c882612363565b604082019050919050565b5f6020820190508181035f8301526123ea816123b1565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f612415826123f1565b61241f81856123fb565b935061242f818560208601611900565b6124388161190e565b840191505092915050565b5f6080820190506124565f830187611a04565b6124636020830186611a04565b6124706040830185611ae4565b8181036060830152612482818461240b565b905095945050505050565b5f8151905061249b8161185e565b92915050565b5f602082840312156124b6576124b561182b565b5b5f6124c38482850161248d565b91505092915050565b5f6040820190506124df5f830185611a04565b6124ec6020830184611ae4565b939250505056fea2646970667358221220be38b3e3e19850cffd42cacb5aa30113dab50a004bd028e4eb21352349c9a78c64736f6c634300081a0033