0x60806040523480156200001157600080fd5b506040516200217d3803806200217d833981016040819052620000349162000336565b60016000556003805460ff191690556001600160a01b038316620000b55760405162461bcd60e51b815260206004820152602d60248201527f4178656c6172476174657761793a2041444d494e5f414444524553535f4d555360448201526c545f42455f4e4f4e2d5a45524f60981b60648201526084015b60405180910390fd5b6001600160a01b038216620001275760405162461bcd60e51b815260206004820152603160248201527f4178656c6172476174657761793a2041584c5f544f4b454e5f414444524553536044820152705f4d5553545f42455f4e4f4e2d5a45524f60781b6064820152608401620000ac565b6001600160a01b0381166200019a5760405162461bcd60e51b815260206004820152603260248201527f4178656c6172476174657761793a205245414c5f544f4b454e5f414444524553604482015271535f4d5553545f42455f4e4f4e2d5a45524f60701b6064820152608401620000ac565b620001a7600084620001e4565b60038054610100600160a81b0319166101006001600160a01b0394851602179055600480546001600160a01b031916919092161790555062000380565b620001f08282620001f4565b5050565b6200020082826200021f565b60008281526002602052604090206200021a9082620002a7565b505050565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff16620001f05760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6000620002be836001600160a01b038416620002c7565b90505b92915050565b60008181526001830160205260408120546200031057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620002c1565b506000620002c1565b80516001600160a01b03811681146200033157600080fd5b919050565b6000806000606084860312156200034c57600080fd5b620003578462000319565b9250620003676020850162000319565b9150620003776040850162000319565b90509250925092565b611ded80620003906000396000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c80638456cb59116100d8578063ca15c8731161008c578063e2bbb15811610066578063e2bbb15814610374578063e63ab1e914610387578063fc7e286d146103ae57600080fd5b8063ca15c8731461033b578063cc9ef0b01461034e578063d547741f1461036157600080fd5b806391d14854116100bd57806391d14854146102da5780639f04db6614610320578063a217fddf1461033357600080fd5b80638456cb59146102bf5780639010d07c146102c757600080fd5b806336568abe1161013a5780635c975abb116101145780635c975abb146102815780636874b31f1461028c57806376636e5a1461029f57600080fd5b806336568abe146102535780633f4ba83a14610266578063441a3e701461026e57600080fd5b8063248a9ca31161016b578063248a9ca3146101f9578063255f3e291461022b5780632f2ff15d1461024057600080fd5b806301ffc9a71461018757806315cf310f146101af575b600080fd5b61019a610195366004611a84565b6103ce565b60405190151581526020015b60405180910390f35b6003546101d490610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a6565b61021d610207366004611ac6565b6000908152600160208190526040909120015490565b6040519081526020016101a6565b61023e610239366004611b08565b61042a565b005b61023e61024e366004611b08565b6104e3565b61023e610261366004611b08565b61050e565b61023e6105c1565b61023e61027c366004611b34565b6105f6565b60035460ff1661019a565b61023e61029a366004611b08565b610962565b6004546101d49073ffffffffffffffffffffffffffffffffffffffff1681565b61023e610a0d565b6101d46102d5366004611b34565b610a3f565b61019a6102e8366004611b08565b600091825260016020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b61023e61032e366004611ac6565b610a5e565b61021d600081565b61021d610349366004611ac6565b610b11565b61023e61035c366004611ac6565b610b28565b61023e61036f366004611b08565b610bd3565b61023e610382366004611b34565b610bf9565b61021d7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61021d6103bc366004611b56565b60056020526000908152604090205481565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f5a05180f000000000000000000000000000000000000000000000000000000001480610424575061042482610ecc565b92915050565b60026000540361049b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026000556104a8610f63565b6003546004546104da918491849173ffffffffffffffffffffffffffffffffffffffff61010090910481169116610fd2565b50506001600055565b600082815260016020819052604090912001546104ff8161129d565b61050983836112a7565b505050565b73ffffffffffffffffffffffffffffffffffffffff811633146105b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610492565b6105bd82826112c9565b5050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6105eb8161129d565b6105f36112eb565b50565b600260005403610662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610492565b600260009081556106738284611ba0565b11610700576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4178656c6172476174657761793a20544f54414c5f5749544844524157414c5f60448201527f4d5553545f42455f475245415445525f5448414e5f30000000000000000000006064820152608401610492565b600061070c8284611ba0565b336000908152600560205260409020549091508111156107ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4178656c6172476174657761793a20494e53554646494349454e545f5553455260448201527f5f42414c414e43450000000000000000000000000000000000000000000000006064820152608401610492565b33600090815260056020526040812080548392906107cd908490611bb3565b9091555050821561087657600480546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815233928101929092526024820185905273ffffffffffffffffffffffffffffffffffffffff169063a9059cbb906044016020604051808303816000875af1158015610850573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108749190611bc6565b505b811561091d576003546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810184905261010090910473ffffffffffffffffffffffffffffffffffffffff169063a9059cbb906044016020604051808303816000875af11580156108f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091b9190611bc6565b505b604080518481526020810184905233917f92ccf450a286a957af52509bc1c9939d1a6a481783e142e41e2499f0bb66ebc6910160405180910390a25050600160005550565b6002600054036109ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610492565b60026000556109db610f63565b6004546003546104da918491849173ffffffffffffffffffffffffffffffffffffffff90811691610100900416610fd2565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610a378161129d565b6105f3611368565b6000828152600260205260408120610a5790836113c3565b9392505050565b600260005403610aca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610492565b6002600055610ad7610f63565b600454600354610b09918391339173ffffffffffffffffffffffffffffffffffffffff90811691610100900416610fd2565b506001600055565b6000818152600260205260408120610424906113cf565b600260005403610b94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610492565b6002600055610ba1610f63565b600354600454610b09918391339173ffffffffffffffffffffffffffffffffffffffff61010090910481169116610fd2565b60008281526001602081905260409091200154610bef8161129d565b61050983836112c9565b600260005403610c65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610492565b60026000908155610c768284611ba0565b11610d03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4178656c6172476174657761793a20544f54414c5f4445504f5349545f4d555360448201527f545f42455f475245415445525f5448414e5f30000000000000000000000000006064820152608401610492565b8115610dad57600480546040517f23b872dd00000000000000000000000000000000000000000000000000000000815233928101929092523060248301526044820184905273ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303816000875af1158015610d87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dab9190611bc6565b505b8015610e5a576003546040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810183905261010090910473ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303816000875af1158015610e34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e589190611bc6565b505b610e648183611ba0565b3360009081526005602052604081208054909190610e83908490611ba0565b9091555050604080518381526020810183905233917f73a19dd210f1a7f902193214c0ee91dd35ee5b4d920cba8d519eca65a7b488ca910160405180910390a250506001600055565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061042457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610424565b60035460ff1615610fd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610492565b565b60008411611062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4178656c6172476174657761793a20414d4f554e545f4d5553545f42455f475260448201527f45415445525f5448414e5f3000000000000000000000000000000000000000006064820152608401610492565b73ffffffffffffffffffffffffffffffffffffffff8316611105576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4178656c6172476174657761793a20524543495049454e545f4144445245535360448201527f5f4d5553545f42455f4e4f4e2d5a45524f0000000000000000000000000000006064820152608401610492565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810185905273ffffffffffffffffffffffffffffffffffffffff8316906323b872dd906064016020604051808303816000875af115801561117e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a29190611bc6565b506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301526024820186905282169063a9059cbb906044016020604051808303816000875af1158015611218573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123c9190611bc6565b506040805173ffffffffffffffffffffffffffffffffffffffff858116825260208201879052808416929085169133917fcb803386226022c424543f38623c830b1a56b16f37e100fe5f2aa460054746fd910160405180910390a450505050565b6105f381336113d9565b6112b182826114ab565b6000828152600260205260409020610509908261156a565b6112d3828261158c565b60008281526002602052604090206105099082611647565b6112f3611669565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b611370610f63565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861133e3390565b6000610a5783836116d5565b6000610424825490565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166105bd576114318173ffffffffffffffffffffffffffffffffffffffff1660146116ff565b61143c8360206116ff565b60405160200161144d929190611c0c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a000000000000000000000000000000000000000000000000000000000825261049291600401611c8d565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166105bd57600082815260016020818152604080842073ffffffffffffffffffffffffffffffffffffffff8616808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6000610a578373ffffffffffffffffffffffffffffffffffffffff8416611942565b600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156105bd57600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610a578373ffffffffffffffffffffffffffffffffffffffff8416611991565b60035460ff16610fd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610492565b60008260000182815481106116ec576116ec611cde565b9060005260206000200154905092915050565b6060600061170e836002611d0d565b611719906002611ba0565b67ffffffffffffffff81111561173157611731611d24565b6040519080825280601f01601f19166020018201604052801561175b576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061179257611792611cde565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106117f5576117f5611cde565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000611831846002611d0d565b61183c906001611ba0565b90505b60018111156118d9577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061187d5761187d611cde565b1a60f81b82828151811061189357611893611cde565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936118d281611d53565b905061183f565b508315610a57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610492565b600081815260018301602052604081205461198957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610424565b506000610424565b60008181526001830160205260408120548015611a7a5760006119b5600183611bb3565b85549091506000906119c990600190611bb3565b9050818114611a2e5760008660000182815481106119e9576119e9611cde565b9060005260206000200154905080876000018481548110611a0c57611a0c611cde565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611a3f57611a3f611d88565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610424565b6000915050610424565b600060208284031215611a9657600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610a5757600080fd5b600060208284031215611ad857600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611b0357600080fd5b919050565b60008060408385031215611b1b57600080fd5b82359150611b2b60208401611adf565b90509250929050565b60008060408385031215611b4757600080fd5b50508035926020909101359150565b600060208284031215611b6857600080fd5b610a5782611adf565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561042457610424611b71565b8181038181111561042457610424611b71565b600060208284031215611bd857600080fd5b81518015158114610a5757600080fd5b60005b83811015611c03578181015183820152602001611beb565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611c44816017850160208801611be8565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351611c81816028840160208801611be8565b01602801949350505050565b6020815260008251806020840152611cac816040850160208701611be8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b808202811582820484141761042457610424611b71565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081611d6257611d62611b71565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220b5e7f8d11b8b8da07763a38f855a7c40b1117a2d3d46a2ef5f2dbbeecbcc51cf64736f6c63430008130033000000000000000000000000e5227f141575dce74721f4a9be2d7d636f92304400000000000000000000000069e557b926f4eef6d9400e36dbbfeb9600af2880000000000000000000000000de5ed76e7c05ec5e4572cfc88d1acea165109e44