Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been partially verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- SaiProxyCreateAndExecute
- Optimization enabled
- true
- Compiler version
- v0.4.25+commit.59dbf8f1
- Optimization runs
- 200
- EVM Version
- byzantium
- Verified at
- 2026-04-09T22:17:54.069847Z
SaiProxyCreateAndExecute.sol
pragma solidity ^0.4.23;
/// math.sol -- mixin for inline numerical wizardry
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
pragma solidity ^0.4.13;
contract DSMath {
function add(uint x, uint y) internal pure returns (uint z) {
require((z = x + y) >= x);
}
function sub(uint x, uint y) internal pure returns (uint z) {
require((z = x - y) <= x);
}
function mul(uint x, uint y) internal pure returns (uint z) {
require(y == 0 || (z = x * y) / y == x);
}
function min(uint x, uint y) internal pure returns (uint z) {
return x <= y ? x : y;
}
function max(uint x, uint y) internal pure returns (uint z) {
return x >= y ? x : y;
}
function imin(int x, int y) internal pure returns (int z) {
return x <= y ? x : y;
}
function imax(int x, int y) internal pure returns (int z) {
return x >= y ? x : y;
}
uint constant WAD = 10 ** 18;
uint constant RAY = 10 ** 27;
function wmul(uint x, uint y) internal pure returns (uint z) {
z = add(mul(x, y), WAD / 2) / WAD;
}
function rmul(uint x, uint y) internal pure returns (uint z) {
z = add(mul(x, y), RAY / 2) / RAY;
}
function wdiv(uint x, uint y) internal pure returns (uint z) {
z = add(mul(x, WAD), y / 2) / y;
}
function rdiv(uint x, uint y) internal pure returns (uint z) {
z = add(mul(x, RAY), y / 2) / y;
}
// This famous algorithm is called "exponentiation by squaring"
// and calculates x^n with x as fixed-point and n as regular unsigned.
//
// It's O(log n), instead of O(n) for naive repeated multiplication.
//
// These facts are why it works:
//
// If n is even, then x^n = (x^2)^(n/2).
// If n is odd, then x^n = x * x^(n-1),
// and applying the equation for even x gives
// x^n = x * (x^2)^((n-1) / 2).
//
// Also, EVM division is flooring and
// floor[(n-1) / 2] = floor[n / 2].
//
function rpow(uint x, uint n) internal pure returns (uint z) {
z = n % 2 != 0 ? x : RAY;
for (n /= 2; n != 0; n /= 2) {
x = rmul(x, x);
if (n % 2 != 0) {
z = rmul(z, x);
}
}
}
}
contract TubInterface {
function open() public returns (bytes32);
function join(uint) public;
function exit(uint) public;
function lock(bytes32, uint) public;
function free(bytes32, uint) public;
function draw(bytes32, uint) public;
function wipe(bytes32, uint) public;
function give(bytes32, address) public;
function shut(bytes32) public;
function cups(bytes32) public view returns (address, uint, uint, uint);
function gem() public view returns (TokenInterface);
function gov() public view returns (TokenInterface);
function skr() public view returns (TokenInterface);
function sai() public view returns (TokenInterface);
function mat() public view returns (uint);
function ink(bytes32) public view returns (uint);
function tab(bytes32) public view returns (uint);
function rap(bytes32) public view returns (uint);
function per() public view returns (uint);
function pep() public view returns (PepInterface);
}
contract TokenInterface {
function allowance(address, address) public view returns (uint);
function balanceOf(address) public view returns (uint);
function approve(address, uint) public;
function transfer(address, uint) public returns (bool);
function transferFrom(address, address, uint) public returns (bool);
function deposit() public payable;
function withdraw(uint) public;
}
contract PepInterface {
function peek() public returns (bytes32, bool);
}
contract OtcInterface {
function getPayAmount(address, address, uint) public view returns (uint);
function buyAllAmount(address, uint, address pay_gem, uint) public returns (uint);
}
contract SaiProxy is DSMath {
function open(address tub_) public returns (bytes32) {
return TubInterface(tub_).open();
}
function give(address tub_, bytes32 cup, address lad) public {
TubInterface(tub_).give(cup, lad);
}
function lock(address tub_, bytes32 cup) public payable {
if (msg.value > 0) {
TubInterface tub = TubInterface(tub_);
(address lad,,,) = tub.cups(cup);
require(lad == address(this), "cup-not-owned");
tub.gem().deposit.value(msg.value)();
uint ink = rdiv(msg.value, tub.per());
ink = rmul(ink, tub.per()) <= msg.value ? ink : ink - 1;
if (tub.gem().allowance(this, tub) != uint(-1)) {
tub.gem().approve(tub, uint(-1));
}
tub.join(ink);
if (tub.skr().allowance(this, tub) != uint(-1)) {
tub.skr().approve(tub, uint(-1));
}
tub.lock(cup, ink);
}
}
function draw(address tub_, bytes32 cup, uint wad) public {
if (wad > 0) {
TubInterface tub = TubInterface(tub_);
tub.draw(cup, wad);
tub.sai().transfer(msg.sender, wad);
}
}
function handleGovFee(TubInterface tub, uint saiDebtFee, address otc_) internal {
bytes32 val;
bool ok;
(val, ok) = tub.pep().peek();
if (ok && val != 0) {
uint govAmt = wdiv(saiDebtFee, uint(val));
if (otc_ != address(0)) {
uint saiGovAmt = OtcInterface(otc_).getPayAmount(tub.sai(), tub.gov(), govAmt);
if (tub.sai().allowance(this, otc_) != uint(-1)) {
tub.sai().approve(otc_, uint(-1));
}
tub.sai().transferFrom(msg.sender, this, saiGovAmt);
OtcInterface(otc_).buyAllAmount(tub.gov(), govAmt, tub.sai(), saiGovAmt);
} else {
tub.gov().transferFrom(msg.sender, this, govAmt);
}
}
}
function wipe(address tub_, bytes32 cup, uint wad, address otc_) public {
if (wad > 0) {
TubInterface tub = TubInterface(tub_);
tub.sai().transferFrom(msg.sender, this, wad);
handleGovFee(tub, rmul(wad, rdiv(tub.rap(cup), tub.tab(cup))), otc_);
if (tub.sai().allowance(this, tub) != uint(-1)) {
tub.sai().approve(tub, uint(-1));
}
if (tub.gov().allowance(this, tub) != uint(-1)) {
tub.gov().approve(tub, uint(-1));
}
tub.wipe(cup, wad);
}
}
function wipe(address tub_, bytes32 cup, uint wad) public {
wipe(tub_, cup, wad, address(0));
}
function free(address tub_, bytes32 cup, uint jam) public {
if (jam > 0) {
TubInterface tub = TubInterface(tub_);
uint ink = rdiv(jam, tub.per());
ink = rmul(ink, tub.per()) <= jam ? ink : ink - 1;
tub.free(cup, ink);
if (tub.skr().allowance(this, tub) != uint(-1)) {
tub.skr().approve(tub, uint(-1));
}
tub.exit(ink);
uint freeJam = tub.gem().balanceOf(this); // Withdraw possible previous stuck WETH as well
tub.gem().withdraw(freeJam);
address(msg.sender).transfer(freeJam);
}
}
function lockAndDraw(address tub_, bytes32 cup, uint wad) public payable {
lock(tub_, cup);
draw(tub_, cup, wad);
}
function lockAndDraw(address tub_, uint wad) public payable returns (bytes32 cup) {
cup = open(tub_);
lockAndDraw(tub_, cup, wad);
}
function wipeAndFree(address tub_, bytes32 cup, uint jam, uint wad) public payable {
wipe(tub_, cup, wad);
free(tub_, cup, jam);
}
function wipeAndFree(address tub_, bytes32 cup, uint jam, uint wad, address otc_) public payable {
wipe(tub_, cup, wad, otc_);
free(tub_, cup, jam);
}
function shut(address tub_, bytes32 cup) public {
TubInterface tub = TubInterface(tub_);
wipeAndFree(tub_, cup, rmul(tub.ink(cup), tub.per()), tub.tab(cup));
tub.shut(cup);
}
function shut(address tub_, bytes32 cup, address otc_) public {
TubInterface tub = TubInterface(tub_);
wipeAndFree(tub_, cup, rmul(tub.ink(cup), tub.per()), tub.tab(cup), otc_);
tub.shut(cup);
}
}
contract ProxyRegistryInterface {
function build(address) public returns (address);
}
contract SaiProxyCreateAndExecute is SaiProxy {
// Create a DSProxy instance and open a cup
function createAndOpen(address registry_, address tub_) public returns (address proxy, bytes32 cup) {
proxy = ProxyRegistryInterface(registry_).build(msg.sender);
cup = open(tub_);
TubInterface(tub_).give(cup, proxy);
}
// Create a DSProxy instance, open a cup, and lock collateral
function createOpenAndLock(address registry_, address tub_) public payable returns (address proxy, bytes32 cup) {
proxy = ProxyRegistryInterface(registry_).build(msg.sender);
cup = open(tub_);
lock(tub_, cup);
TubInterface(tub_).give(cup, proxy);
}
// Create a DSProxy instance, open a cup, lock collateral, and draw DAI
function createOpenLockAndDraw(address registry_, address tub_, uint wad) public payable returns (address proxy, bytes32 cup) {
proxy = ProxyRegistryInterface(registry_).build(msg.sender);
cup = open(tub_);
lockAndDraw(tub_, cup, wad);
TubInterface(tub_).give(cup, proxy);
}
}
Compiler Settings
{"remappings":[],"optimizer":{"runs":200,"enabled":true},"libraries":{},"evmVersion":"byzantium","compilationTarget":{"SaiProxyCreateAndExecute.sol":"SaiProxyCreateAndExecute"}}
Contract ABI
[{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"draw","inputs":[{"type":"address","name":"tub_"},{"type":"bytes32","name":"cup"},{"type":"uint256","name":"wad"}],"constant":false},{"type":"function","stateMutability":"payable","payable":true,"outputs":[],"name":"wipeAndFree","inputs":[{"type":"address","name":"tub_"},{"type":"bytes32","name":"cup"},{"type":"uint256","name":"jam"},{"type":"uint256","name":"wad"},{"type":"address","name":"otc_"}],"constant":false},{"type":"function","stateMutability":"payable","payable":true,"outputs":[],"name":"lockAndDraw","inputs":[{"type":"address","name":"tub_"},{"type":"bytes32","name":"cup"},{"type":"uint256","name":"wad"}],"constant":false},{"type":"function","stateMutability":"payable","payable":true,"outputs":[{"type":"bytes32","name":"cup"}],"name":"lockAndDraw","inputs":[{"type":"address","name":"tub_"},{"type":"uint256","name":"wad"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"address","name":"proxy"},{"type":"bytes32","name":"cup"}],"name":"createAndOpen","inputs":[{"type":"address","name":"registry_"},{"type":"address","name":"tub_"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"shut","inputs":[{"type":"address","name":"tub_"},{"type":"bytes32","name":"cup"},{"type":"address","name":"otc_"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"wipe","inputs":[{"type":"address","name":"tub_"},{"type":"bytes32","name":"cup"},{"type":"uint256","name":"wad"},{"type":"address","name":"otc_"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"wipe","inputs":[{"type":"address","name":"tub_"},{"type":"bytes32","name":"cup"},{"type":"uint256","name":"wad"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bytes32","name":""}],"name":"open","inputs":[{"type":"address","name":"tub_"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"shut","inputs":[{"type":"address","name":"tub_"},{"type":"bytes32","name":"cup"}],"constant":false},{"type":"function","stateMutability":"payable","payable":true,"outputs":[],"name":"lock","inputs":[{"type":"address","name":"tub_"},{"type":"bytes32","name":"cup"}],"constant":false},{"type":"function","stateMutability":"payable","payable":true,"outputs":[{"type":"address","name":"proxy"},{"type":"bytes32","name":"cup"}],"name":"createOpenLockAndDraw","inputs":[{"type":"address","name":"registry_"},{"type":"address","name":"tub_"},{"type":"uint256","name":"wad"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"give","inputs":[{"type":"address","name":"tub_"},{"type":"bytes32","name":"cup"},{"type":"address","name":"lad"}],"constant":false},{"type":"function","stateMutability":"payable","payable":true,"outputs":[{"type":"address","name":"proxy"},{"type":"bytes32","name":"cup"}],"name":"createOpenAndLock","inputs":[{"type":"address","name":"registry_"},{"type":"address","name":"tub_"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"free","inputs":[{"type":"address","name":"tub_"},{"type":"bytes32","name":"cup"},{"type":"uint256","name":"jam"}],"constant":false},{"type":"function","stateMutability":"payable","payable":true,"outputs":[],"name":"wipeAndFree","inputs":[{"type":"address","name":"tub_"},{"type":"bytes32","name":"cup"},{"type":"uint256","name":"jam"},{"type":"uint256","name":"wad"}],"constant":false}]
Contract Creation Code
0x608060405234801561001057600080fd5b5061290b806100206000396000f3006080604052600436106100cc5763ffffffff60e060020a6000350416630344a36f81146100d15780631b968160146100fa5780631edf0c1e14610120578063516e9aec1461013a578063581f3c5014610163578063792037e3146101ad5780638a9fc475146101d8578063a3dc65a714610207578063b95460f81461022e578063bc244c111461024f578063bc25a81014610273578063d3140a651461028a578063da93dfcf146102a7578063eefe3818146102d2578063f9ef04be146102ec578063faed77ab14610313575b600080fd5b3480156100dd57600080fd5b506100f8600160a060020a0360043516602435604435610330565b005b6100f8600160a060020a03600435811690602435906044359060643590608435166104c5565b6100f8600160a060020a03600435166024356044356104e3565b610151600160a060020a03600435166024356104fd565b60408051918252519081900360200190f35b34801561016f57600080fd5b5061018a600160a060020a036004358116906024351661051b565b60408051600160a060020a03909316835260208301919091528051918290030190f35b3480156101b957600080fd5b506100f8600160a060020a03600435811690602435906044351661062e565b3480156101e457600080fd5b506100f8600160a060020a0360043581169060243590604435906064351661086a565b34801561021357600080fd5b506100f8600160a060020a0360043516602435604435610ed9565b34801561023a57600080fd5b50610151600160a060020a0360043516610ee6565b34801561025b57600080fd5b506100f8600160a060020a0360043516602435610f58565b6100f8600160a060020a03600435166024356110da565b61018a600160a060020a03600435811690602435166044356117cc565b3480156102b357600080fd5b506100f8600160a060020a0360043581169060243590604435166118ea565b61018a600160a060020a036004358116906024351661193f565b3480156102f857600080fd5b506100f8600160a060020a0360043516602435604435611a3c565b6100f8600160a060020a0360043516602435604435606435611fc1565b6000808211156104bf5750604080517f440f19ba000000000000000000000000000000000000000000000000000000008152600481018490526024810183905290518491600160a060020a0383169163440f19ba9160448082019260009290919082900301818387803b1580156103a657600080fd5b505af11580156103ba573d6000803e3d6000fd5b5050505080600160a060020a0316639166cba46040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156103fc57600080fd5b505af1158015610410573d6000803e3d6000fd5b505050506040513d602081101561042657600080fd5b5051604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018590529051600160a060020a039092169163a9059cbb916044808201926020929091908290030181600087803b15801561049257600080fd5b505af11580156104a6573d6000803e3d6000fd5b505050506040513d60208110156104bc57600080fd5b50505b50505050565b6104d18585848461086a565b6104dc858585611a3c565b5050505050565b6104ed83836110da565b6104f8838383610330565b505050565b600061050883610ee6565b90506105158382846104e3565b92915050565b604080517ff3701da200000000000000000000000000000000000000000000000000000000815233600482015290516000918291600160a060020a0386169163f3701da291602480830192602092919082900301818787803b15801561058057600080fd5b505af1158015610594573d6000803e3d6000fd5b505050506040513d60208110156105aa57600080fd5b505191506105b783610ee6565b6040805160e260020a632eaa14a702815260048101839052600160a060020a03858116602483015291519293509085169163baa8529c9160448082019260009290919082900301818387803b15801561060f57600080fd5b505af1158015610623573d6000803e3d6000fd5b505050509250929050565b604080517f1f3634ed00000000000000000000000000000000000000000000000000000000815260048101849052905184916107eb918391869161075791600160a060020a03851691631f3634ed916024808201926020929091908290030181600087803b15801561069f57600080fd5b505af11580156106b3573d6000803e3d6000fd5b505050506040513d60208110156106c957600080fd5b5051604080517f7ec9c3b80000000000000000000000000000000000000000000000000000000081529051600160a060020a03881691637ec9c3b89160048083019260209291908290030181600087803b15801561072657600080fd5b505af115801561073a573d6000803e3d6000fd5b505050506040513d602081101561075057600080fd5b5051611fd7565b604080517ff7c8d634000000000000000000000000000000000000000000000000000000008152600481018990529051600160a060020a0387169163f7c8d6349160248083019260209291908290030181600087803b1580156107b957600080fd5b505af11580156107cd573d6000803e3d6000fd5b505050506040513d60208110156107e357600080fd5b5051866104c5565b604080517fb84d2106000000000000000000000000000000000000000000000000000000008152600481018590529051600160a060020a0383169163b84d210691602480830192600092919082900301818387803b15801561084c57600080fd5b505af1158015610860573d6000803e3d6000fd5b5050505050505050565b6000808311156104dc5784905080600160a060020a0316639166cba46040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156108b557600080fd5b505af11580156108c9573d6000803e3d6000fd5b505050506040513d60208110156108df57600080fd5b5051604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690529051600160a060020a03909216916323b872dd916064808201926020929091908290030181600087803b15801561095157600080fd5b505af1158015610965573d6000803e3d6000fd5b505050506040513d602081101561097b57600080fd5b5050604080517f6f78ee0d000000000000000000000000000000000000000000000000000000008152600481018690529051610aba918391610ab4918791610aaf91600160a060020a03861691636f78ee0d916024808201926020929091908290030181600087803b1580156109f057600080fd5b505af1158015610a04573d6000803e3d6000fd5b505050506040513d6020811015610a1a57600080fd5b5051604080517ff7c8d634000000000000000000000000000000000000000000000000000000008152600481018c90529051600160a060020a0389169163f7c8d6349160248083019260209291908290030181600087803b158015610a7e57600080fd5b505af1158015610a92573d6000803e3d6000fd5b505050506040513d6020811015610aa857600080fd5b505161201a565b611fd7565b8461203e565b60001981600160a060020a0316639166cba46040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610afb57600080fd5b505af1158015610b0f573d6000803e3d6000fd5b505050506040513d6020811015610b2557600080fd5b50516040805160e160020a636eb1769f028152306004820152600160a060020a0385811660248301529151919092169163dd62ed3e9160448083019260209291908290030181600087803b158015610b7c57600080fd5b505af1158015610b90573d6000803e3d6000fd5b505050506040513d6020811015610ba657600080fd5b505114610c865780600160a060020a0316639166cba46040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610beb57600080fd5b505af1158015610bff573d6000803e3d6000fd5b505050506040513d6020811015610c1557600080fd5b50516040805160e060020a63095ea7b3028152600160a060020a03848116600483015260001960248301529151919092169163095ea7b391604480830192600092919082900301818387803b158015610c6d57600080fd5b505af1158015610c81573d6000803e3d6000fd5b505050505b60001981600160a060020a03166312d43a516040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610cc757600080fd5b505af1158015610cdb573d6000803e3d6000fd5b505050506040513d6020811015610cf157600080fd5b50516040805160e160020a636eb1769f028152306004820152600160a060020a0385811660248301529151919092169163dd62ed3e9160448083019260209291908290030181600087803b158015610d4857600080fd5b505af1158015610d5c573d6000803e3d6000fd5b505050506040513d6020811015610d7257600080fd5b505114610e525780600160a060020a03166312d43a516040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610db757600080fd5b505af1158015610dcb573d6000803e3d6000fd5b505050506040513d6020811015610de157600080fd5b50516040805160e060020a63095ea7b3028152600160a060020a03848116600483015260001960248301529151919092169163095ea7b391604480830192600092919082900301818387803b158015610e3957600080fd5b505af1158015610e4d573d6000803e3d6000fd5b505050505b604080517f73b3810100000000000000000000000000000000000000000000000000000000815260048101869052602481018590529051600160a060020a038316916373b3810191604480830192600092919082900301818387803b158015610eba57600080fd5b505af1158015610ece573d6000803e3d6000fd5b505050505050505050565b6104f8838383600061086a565b600081600160a060020a031663fcfff16f6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610f2657600080fd5b505af1158015610f3a573d6000803e3d6000fd5b505050506040513d6020811015610f5057600080fd5b505192915050565b604080517f1f3634ed000000000000000000000000000000000000000000000000000000008152600481018390529051839161105c9183918591610fc991600160a060020a03851691631f3634ed916024808201926020929091908290030181600087803b15801561069f57600080fd5b604080517ff7c8d634000000000000000000000000000000000000000000000000000000008152600481018890529051600160a060020a0387169163f7c8d6349160248083019260209291908290030181600087803b15801561102b57600080fd5b505af115801561103f573d6000803e3d6000fd5b505050506040513d602081101561105557600080fd5b5051611fc1565b604080517fb84d2106000000000000000000000000000000000000000000000000000000008152600481018490529051600160a060020a0383169163b84d210691602480830192600092919082900301818387803b1580156110bd57600080fd5b505af11580156110d1573d6000803e3d6000fd5b50505050505050565b6000806000803411156104dc57604080517ffdac0025000000000000000000000000000000000000000000000000000000008152600481018690529051869450600160a060020a0385169163fdac00259160248083019260809291908290030181600087803b15801561114c57600080fd5b505af1158015611160573d6000803e3d6000fd5b505050506040513d608081101561117657600080fd5b50519150600160a060020a03821630146111f157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6375702d6e6f742d6f776e656400000000000000000000000000000000000000604482015290519081900360640190fd5b82600160a060020a0316637bd2bea76040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561122f57600080fd5b505af1158015611243573d6000803e3d6000fd5b505050506040513d602081101561125957600080fd5b5051604080517fd0e30db00000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169163d0e30db0913491600480830192600092919082900301818588803b1580156112b857600080fd5b505af11580156112cc573d6000803e3d6000fd5b50505050506113133484600160a060020a0316637ec9c3b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610a7e57600080fd5b9050346113588285600160a060020a0316637ec9c3b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561072657600080fd5b11156113675760018103611369565b805b905060001983600160a060020a0316637bd2bea76040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156113ac57600080fd5b505af11580156113c0573d6000803e3d6000fd5b505050506040513d60208110156113d657600080fd5b50516040805160e160020a636eb1769f028152306004820152600160a060020a0387811660248301529151919092169163dd62ed3e9160448083019260209291908290030181600087803b15801561142d57600080fd5b505af1158015611441573d6000803e3d6000fd5b505050506040513d602081101561145757600080fd5b5051146115375782600160a060020a0316637bd2bea76040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561149c57600080fd5b505af11580156114b0573d6000803e3d6000fd5b505050506040513d60208110156114c657600080fd5b50516040805160e060020a63095ea7b3028152600160a060020a03868116600483015260001960248301529151919092169163095ea7b391604480830192600092919082900301818387803b15801561151e57600080fd5b505af1158015611532573d6000803e3d6000fd5b505050505b82600160a060020a031663049878f3826040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561158057600080fd5b505af1158015611594573d6000803e3d6000fd5b5050505060001983600160a060020a0316630f8a771e6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156115d957600080fd5b505af11580156115ed573d6000803e3d6000fd5b505050506040513d602081101561160357600080fd5b50516040805160e160020a636eb1769f028152306004820152600160a060020a0387811660248301529151919092169163dd62ed3e9160448083019260209291908290030181600087803b15801561165a57600080fd5b505af115801561166e573d6000803e3d6000fd5b505050506040513d602081101561168457600080fd5b5051146117645782600160a060020a0316630f8a771e6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156116c957600080fd5b505af11580156116dd573d6000803e3d6000fd5b505050506040513d60208110156116f357600080fd5b50516040805160e060020a63095ea7b3028152600160a060020a03868116600483015260001960248301529151919092169163095ea7b391604480830192600092919082900301818387803b15801561174b57600080fd5b505af115801561175f573d6000803e3d6000fd5b505050505b604080517fb3b77a5100000000000000000000000000000000000000000000000000000000815260048101869052602481018390529051600160a060020a0385169163b3b77a5191604480830192600092919082900301818387803b158015610eba57600080fd5b604080517ff3701da200000000000000000000000000000000000000000000000000000000815233600482015290516000918291600160a060020a0387169163f3701da291602480830192602092919082900301818787803b15801561183157600080fd5b505af1158015611845573d6000803e3d6000fd5b505050506040513d602081101561185b57600080fd5b5051915061186884610ee6565b90506118758482856104e3565b6040805160e260020a632eaa14a702815260048101839052600160a060020a03848116602483015291519186169163baa8529c9160448082019260009290919082900301818387803b1580156118ca57600080fd5b505af11580156118de573d6000803e3d6000fd5b50505050935093915050565b6040805160e260020a632eaa14a702815260048101849052600160a060020a03838116602483015291519185169163baa8529c9160448082019260009290919082900301818387803b1580156110bd57600080fd5b604080517ff3701da200000000000000000000000000000000000000000000000000000000815233600482015290516000918291600160a060020a0386169163f3701da291602480830192602092919082900301818787803b1580156119a457600080fd5b505af11580156119b8573d6000803e3d6000fd5b505050506040513d60208110156119ce57600080fd5b505191506119db83610ee6565b90506119e783826110da565b6040805160e260020a632eaa14a702815260048101839052600160a060020a03848116602483015291519185169163baa8529c9160448082019260009290919082900301818387803b15801561060f57600080fd5b6000806000808411156104bc57859250611a8e8484600160a060020a0316637ec9c3b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610a7e57600080fd5b915083611ad38385600160a060020a0316637ec9c3b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561072657600080fd5b1115611ae25760018203611ae4565b815b604080517fa5cd184e00000000000000000000000000000000000000000000000000000000815260048101889052602481018390529051919350600160a060020a0385169163a5cd184e9160448082019260009290919082900301818387803b158015611b5057600080fd5b505af1158015611b64573d6000803e3d6000fd5b5050505060001983600160a060020a0316630f8a771e6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611ba957600080fd5b505af1158015611bbd573d6000803e3d6000fd5b505050506040513d6020811015611bd357600080fd5b50516040805160e160020a636eb1769f028152306004820152600160a060020a0387811660248301529151919092169163dd62ed3e9160448083019260209291908290030181600087803b158015611c2a57600080fd5b505af1158015611c3e573d6000803e3d6000fd5b505050506040513d6020811015611c5457600080fd5b505114611d345782600160a060020a0316630f8a771e6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611c9957600080fd5b505af1158015611cad573d6000803e3d6000fd5b505050506040513d6020811015611cc357600080fd5b50516040805160e060020a63095ea7b3028152600160a060020a03868116600483015260001960248301529151919092169163095ea7b391604480830192600092919082900301818387803b158015611d1b57600080fd5b505af1158015611d2f573d6000803e3d6000fd5b505050505b82600160a060020a0316637f8661a1836040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b158015611d7d57600080fd5b505af1158015611d91573d6000803e3d6000fd5b5050505082600160a060020a0316637bd2bea76040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611dd357600080fd5b505af1158015611de7573d6000803e3d6000fd5b505050506040513d6020811015611dfd57600080fd5b5051604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b158015611e6257600080fd5b505af1158015611e76573d6000803e3d6000fd5b505050506040513d6020811015611e8c57600080fd5b5051604080517f7bd2bea70000000000000000000000000000000000000000000000000000000081529051919250600160a060020a03851691637bd2bea7916004808201926020929091908290030181600087803b158015611eed57600080fd5b505af1158015611f01573d6000803e3d6000fd5b505050506040513d6020811015611f1757600080fd5b5051604080517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018490529051600160a060020a0390921691632e1a7d4d9160248082019260009290919082900301818387803b158015611f7c57600080fd5b505af1158015611f90573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f193505050501580156110d1573d6000803e3d6000fd5b611fcc848483610ed9565b6104bf848484611a3c565b60006b033b2e3c9fd0803ce8000000612009611ff3858561288f565b60026b033b2e3c9fd0803ce80000005b046128b7565b81151561201257fe5b049392505050565b600081612009612036856b033b2e3c9fd0803ce800000061288f565b600285612003565b60008060008086600160a060020a031663ace237f56040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561208257600080fd5b505af1158015612096573d6000803e3d6000fd5b505050506040513d60208110156120ac57600080fd5b5051604080517f59e02dd70000000000000000000000000000000000000000000000000000000081528151600160a060020a03909316926359e02dd7926004808401939192918290030181600087803b15801561210857600080fd5b505af115801561211c573d6000803e3d6000fd5b505050506040513d604081101561213257600080fd5b508051602090910151909450925082801561214c57508315155b156110d15761215b86856128c7565b9150600160a060020a0385161561278b5784600160a060020a031663ff1fd97488600160a060020a0316639166cba46040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156121b957600080fd5b505af11580156121cd573d6000803e3d6000fd5b505050506040513d60208110156121e357600080fd5b5051604080517f12d43a510000000000000000000000000000000000000000000000000000000081529051600160a060020a038c16916312d43a519160048083019260209291908290030181600087803b15801561224057600080fd5b505af1158015612254573d6000803e3d6000fd5b505050506040513d602081101561226a57600080fd5b50516040805160e060020a63ffffffff8616028152600160a060020a039384166004820152929091166024830152604482018690525160648083019260209291908290030181600087803b1580156122c157600080fd5b505af11580156122d5573d6000803e3d6000fd5b505050506040513d60208110156122eb57600080fd5b5051604080517f9166cba4000000000000000000000000000000000000000000000000000000008152905191925060001991600160a060020a038a1691639166cba49160048083019260209291908290030181600087803b15801561234f57600080fd5b505af1158015612363573d6000803e3d6000fd5b505050506040513d602081101561237957600080fd5b50516040805160e160020a636eb1769f028152306004820152600160a060020a0389811660248301529151919092169163dd62ed3e9160448083019260209291908290030181600087803b1580156123d057600080fd5b505af11580156123e4573d6000803e3d6000fd5b505050506040513d60208110156123fa57600080fd5b5051146124da5786600160a060020a0316639166cba46040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561243f57600080fd5b505af1158015612453573d6000803e3d6000fd5b505050506040513d602081101561246957600080fd5b50516040805160e060020a63095ea7b3028152600160a060020a03888116600483015260001960248301529151919092169163095ea7b391604480830192600092919082900301818387803b1580156124c157600080fd5b505af11580156124d5573d6000803e3d6000fd5b505050505b86600160a060020a0316639166cba46040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561251857600080fd5b505af115801561252c573d6000803e3d6000fd5b505050506040513d602081101561254257600080fd5b5051604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018490529051600160a060020a03909216916323b872dd916064808201926020929091908290030181600087803b1580156125b457600080fd5b505af11580156125c8573d6000803e3d6000fd5b505050506040513d60208110156125de57600080fd5b5050604080517f12d43a510000000000000000000000000000000000000000000000000000000081529051600160a060020a0380881692638185402b92918b16916312d43a51916004808201926020929091908290030181600087803b15801561264757600080fd5b505af115801561265b573d6000803e3d6000fd5b505050506040513d602081101561267157600080fd5b5051604080517f9166cba400000000000000000000000000000000000000000000000000000000815290518691600160a060020a038d1691639166cba4916004808201926020929091908290030181600087803b1580156126d157600080fd5b505af11580156126e5573d6000803e3d6000fd5b505050506040513d60208110156126fb57600080fd5b50516040805160e060020a63ffffffff8716028152600160a060020a03948516600482015260248101939093529216604482015260648101859052905160848083019260209291908290030181600087803b15801561275957600080fd5b505af115801561276d573d6000803e3d6000fd5b505050506040513d602081101561278357600080fd5b506110d19050565b86600160a060020a03166312d43a516040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156127c957600080fd5b505af11580156127dd573d6000803e3d6000fd5b505050506040513d60208110156127f357600080fd5b5051604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018590529051600160a060020a03909216916323b872dd916064808201926020929091908290030181600087803b15801561286557600080fd5b505af1158015612879573d6000803e3d6000fd5b505050506040513d6020811015610ece57600080fd5b60008115806128ac5750508082028282828115156128a957fe5b04145b151561051557600080fd5b8082018281101561051557600080fd5b60008161200961203685670de0b6b3a764000061288f5600a165627a7a723058203882020989eed133489980542fe992a8b6761211e7f9e141daccbdaf91dfb6320029
Deployed ByteCode
0x6080604052600436106100cc5763ffffffff60e060020a6000350416630344a36f81146100d15780631b968160146100fa5780631edf0c1e14610120578063516e9aec1461013a578063581f3c5014610163578063792037e3146101ad5780638a9fc475146101d8578063a3dc65a714610207578063b95460f81461022e578063bc244c111461024f578063bc25a81014610273578063d3140a651461028a578063da93dfcf146102a7578063eefe3818146102d2578063f9ef04be146102ec578063faed77ab14610313575b600080fd5b3480156100dd57600080fd5b506100f8600160a060020a0360043516602435604435610330565b005b6100f8600160a060020a03600435811690602435906044359060643590608435166104c5565b6100f8600160a060020a03600435166024356044356104e3565b610151600160a060020a03600435166024356104fd565b60408051918252519081900360200190f35b34801561016f57600080fd5b5061018a600160a060020a036004358116906024351661051b565b60408051600160a060020a03909316835260208301919091528051918290030190f35b3480156101b957600080fd5b506100f8600160a060020a03600435811690602435906044351661062e565b3480156101e457600080fd5b506100f8600160a060020a0360043581169060243590604435906064351661086a565b34801561021357600080fd5b506100f8600160a060020a0360043516602435604435610ed9565b34801561023a57600080fd5b50610151600160a060020a0360043516610ee6565b34801561025b57600080fd5b506100f8600160a060020a0360043516602435610f58565b6100f8600160a060020a03600435166024356110da565b61018a600160a060020a03600435811690602435166044356117cc565b3480156102b357600080fd5b506100f8600160a060020a0360043581169060243590604435166118ea565b61018a600160a060020a036004358116906024351661193f565b3480156102f857600080fd5b506100f8600160a060020a0360043516602435604435611a3c565b6100f8600160a060020a0360043516602435604435606435611fc1565b6000808211156104bf5750604080517f440f19ba000000000000000000000000000000000000000000000000000000008152600481018490526024810183905290518491600160a060020a0383169163440f19ba9160448082019260009290919082900301818387803b1580156103a657600080fd5b505af11580156103ba573d6000803e3d6000fd5b5050505080600160a060020a0316639166cba46040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156103fc57600080fd5b505af1158015610410573d6000803e3d6000fd5b505050506040513d602081101561042657600080fd5b5051604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018590529051600160a060020a039092169163a9059cbb916044808201926020929091908290030181600087803b15801561049257600080fd5b505af11580156104a6573d6000803e3d6000fd5b505050506040513d60208110156104bc57600080fd5b50505b50505050565b6104d18585848461086a565b6104dc858585611a3c565b5050505050565b6104ed83836110da565b6104f8838383610330565b505050565b600061050883610ee6565b90506105158382846104e3565b92915050565b604080517ff3701da200000000000000000000000000000000000000000000000000000000815233600482015290516000918291600160a060020a0386169163f3701da291602480830192602092919082900301818787803b15801561058057600080fd5b505af1158015610594573d6000803e3d6000fd5b505050506040513d60208110156105aa57600080fd5b505191506105b783610ee6565b6040805160e260020a632eaa14a702815260048101839052600160a060020a03858116602483015291519293509085169163baa8529c9160448082019260009290919082900301818387803b15801561060f57600080fd5b505af1158015610623573d6000803e3d6000fd5b505050509250929050565b604080517f1f3634ed00000000000000000000000000000000000000000000000000000000815260048101849052905184916107eb918391869161075791600160a060020a03851691631f3634ed916024808201926020929091908290030181600087803b15801561069f57600080fd5b505af11580156106b3573d6000803e3d6000fd5b505050506040513d60208110156106c957600080fd5b5051604080517f7ec9c3b80000000000000000000000000000000000000000000000000000000081529051600160a060020a03881691637ec9c3b89160048083019260209291908290030181600087803b15801561072657600080fd5b505af115801561073a573d6000803e3d6000fd5b505050506040513d602081101561075057600080fd5b5051611fd7565b604080517ff7c8d634000000000000000000000000000000000000000000000000000000008152600481018990529051600160a060020a0387169163f7c8d6349160248083019260209291908290030181600087803b1580156107b957600080fd5b505af11580156107cd573d6000803e3d6000fd5b505050506040513d60208110156107e357600080fd5b5051866104c5565b604080517fb84d2106000000000000000000000000000000000000000000000000000000008152600481018590529051600160a060020a0383169163b84d210691602480830192600092919082900301818387803b15801561084c57600080fd5b505af1158015610860573d6000803e3d6000fd5b5050505050505050565b6000808311156104dc5784905080600160a060020a0316639166cba46040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156108b557600080fd5b505af11580156108c9573d6000803e3d6000fd5b505050506040513d60208110156108df57600080fd5b5051604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690529051600160a060020a03909216916323b872dd916064808201926020929091908290030181600087803b15801561095157600080fd5b505af1158015610965573d6000803e3d6000fd5b505050506040513d602081101561097b57600080fd5b5050604080517f6f78ee0d000000000000000000000000000000000000000000000000000000008152600481018690529051610aba918391610ab4918791610aaf91600160a060020a03861691636f78ee0d916024808201926020929091908290030181600087803b1580156109f057600080fd5b505af1158015610a04573d6000803e3d6000fd5b505050506040513d6020811015610a1a57600080fd5b5051604080517ff7c8d634000000000000000000000000000000000000000000000000000000008152600481018c90529051600160a060020a0389169163f7c8d6349160248083019260209291908290030181600087803b158015610a7e57600080fd5b505af1158015610a92573d6000803e3d6000fd5b505050506040513d6020811015610aa857600080fd5b505161201a565b611fd7565b8461203e565b60001981600160a060020a0316639166cba46040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610afb57600080fd5b505af1158015610b0f573d6000803e3d6000fd5b505050506040513d6020811015610b2557600080fd5b50516040805160e160020a636eb1769f028152306004820152600160a060020a0385811660248301529151919092169163dd62ed3e9160448083019260209291908290030181600087803b158015610b7c57600080fd5b505af1158015610b90573d6000803e3d6000fd5b505050506040513d6020811015610ba657600080fd5b505114610c865780600160a060020a0316639166cba46040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610beb57600080fd5b505af1158015610bff573d6000803e3d6000fd5b505050506040513d6020811015610c1557600080fd5b50516040805160e060020a63095ea7b3028152600160a060020a03848116600483015260001960248301529151919092169163095ea7b391604480830192600092919082900301818387803b158015610c6d57600080fd5b505af1158015610c81573d6000803e3d6000fd5b505050505b60001981600160a060020a03166312d43a516040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610cc757600080fd5b505af1158015610cdb573d6000803e3d6000fd5b505050506040513d6020811015610cf157600080fd5b50516040805160e160020a636eb1769f028152306004820152600160a060020a0385811660248301529151919092169163dd62ed3e9160448083019260209291908290030181600087803b158015610d4857600080fd5b505af1158015610d5c573d6000803e3d6000fd5b505050506040513d6020811015610d7257600080fd5b505114610e525780600160a060020a03166312d43a516040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610db757600080fd5b505af1158015610dcb573d6000803e3d6000fd5b505050506040513d6020811015610de157600080fd5b50516040805160e060020a63095ea7b3028152600160a060020a03848116600483015260001960248301529151919092169163095ea7b391604480830192600092919082900301818387803b158015610e3957600080fd5b505af1158015610e4d573d6000803e3d6000fd5b505050505b604080517f73b3810100000000000000000000000000000000000000000000000000000000815260048101869052602481018590529051600160a060020a038316916373b3810191604480830192600092919082900301818387803b158015610eba57600080fd5b505af1158015610ece573d6000803e3d6000fd5b505050505050505050565b6104f8838383600061086a565b600081600160a060020a031663fcfff16f6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610f2657600080fd5b505af1158015610f3a573d6000803e3d6000fd5b505050506040513d6020811015610f5057600080fd5b505192915050565b604080517f1f3634ed000000000000000000000000000000000000000000000000000000008152600481018390529051839161105c9183918591610fc991600160a060020a03851691631f3634ed916024808201926020929091908290030181600087803b15801561069f57600080fd5b604080517ff7c8d634000000000000000000000000000000000000000000000000000000008152600481018890529051600160a060020a0387169163f7c8d6349160248083019260209291908290030181600087803b15801561102b57600080fd5b505af115801561103f573d6000803e3d6000fd5b505050506040513d602081101561105557600080fd5b5051611fc1565b604080517fb84d2106000000000000000000000000000000000000000000000000000000008152600481018490529051600160a060020a0383169163b84d210691602480830192600092919082900301818387803b1580156110bd57600080fd5b505af11580156110d1573d6000803e3d6000fd5b50505050505050565b6000806000803411156104dc57604080517ffdac0025000000000000000000000000000000000000000000000000000000008152600481018690529051869450600160a060020a0385169163fdac00259160248083019260809291908290030181600087803b15801561114c57600080fd5b505af1158015611160573d6000803e3d6000fd5b505050506040513d608081101561117657600080fd5b50519150600160a060020a03821630146111f157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6375702d6e6f742d6f776e656400000000000000000000000000000000000000604482015290519081900360640190fd5b82600160a060020a0316637bd2bea76040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561122f57600080fd5b505af1158015611243573d6000803e3d6000fd5b505050506040513d602081101561125957600080fd5b5051604080517fd0e30db00000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169163d0e30db0913491600480830192600092919082900301818588803b1580156112b857600080fd5b505af11580156112cc573d6000803e3d6000fd5b50505050506113133484600160a060020a0316637ec9c3b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610a7e57600080fd5b9050346113588285600160a060020a0316637ec9c3b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561072657600080fd5b11156113675760018103611369565b805b905060001983600160a060020a0316637bd2bea76040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156113ac57600080fd5b505af11580156113c0573d6000803e3d6000fd5b505050506040513d60208110156113d657600080fd5b50516040805160e160020a636eb1769f028152306004820152600160a060020a0387811660248301529151919092169163dd62ed3e9160448083019260209291908290030181600087803b15801561142d57600080fd5b505af1158015611441573d6000803e3d6000fd5b505050506040513d602081101561145757600080fd5b5051146115375782600160a060020a0316637bd2bea76040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561149c57600080fd5b505af11580156114b0573d6000803e3d6000fd5b505050506040513d60208110156114c657600080fd5b50516040805160e060020a63095ea7b3028152600160a060020a03868116600483015260001960248301529151919092169163095ea7b391604480830192600092919082900301818387803b15801561151e57600080fd5b505af1158015611532573d6000803e3d6000fd5b505050505b82600160a060020a031663049878f3826040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561158057600080fd5b505af1158015611594573d6000803e3d6000fd5b5050505060001983600160a060020a0316630f8a771e6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156115d957600080fd5b505af11580156115ed573d6000803e3d6000fd5b505050506040513d602081101561160357600080fd5b50516040805160e160020a636eb1769f028152306004820152600160a060020a0387811660248301529151919092169163dd62ed3e9160448083019260209291908290030181600087803b15801561165a57600080fd5b505af115801561166e573d6000803e3d6000fd5b505050506040513d602081101561168457600080fd5b5051146117645782600160a060020a0316630f8a771e6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156116c957600080fd5b505af11580156116dd573d6000803e3d6000fd5b505050506040513d60208110156116f357600080fd5b50516040805160e060020a63095ea7b3028152600160a060020a03868116600483015260001960248301529151919092169163095ea7b391604480830192600092919082900301818387803b15801561174b57600080fd5b505af115801561175f573d6000803e3d6000fd5b505050505b604080517fb3b77a5100000000000000000000000000000000000000000000000000000000815260048101869052602481018390529051600160a060020a0385169163b3b77a5191604480830192600092919082900301818387803b158015610eba57600080fd5b604080517ff3701da200000000000000000000000000000000000000000000000000000000815233600482015290516000918291600160a060020a0387169163f3701da291602480830192602092919082900301818787803b15801561183157600080fd5b505af1158015611845573d6000803e3d6000fd5b505050506040513d602081101561185b57600080fd5b5051915061186884610ee6565b90506118758482856104e3565b6040805160e260020a632eaa14a702815260048101839052600160a060020a03848116602483015291519186169163baa8529c9160448082019260009290919082900301818387803b1580156118ca57600080fd5b505af11580156118de573d6000803e3d6000fd5b50505050935093915050565b6040805160e260020a632eaa14a702815260048101849052600160a060020a03838116602483015291519185169163baa8529c9160448082019260009290919082900301818387803b1580156110bd57600080fd5b604080517ff3701da200000000000000000000000000000000000000000000000000000000815233600482015290516000918291600160a060020a0386169163f3701da291602480830192602092919082900301818787803b1580156119a457600080fd5b505af11580156119b8573d6000803e3d6000fd5b505050506040513d60208110156119ce57600080fd5b505191506119db83610ee6565b90506119e783826110da565b6040805160e260020a632eaa14a702815260048101839052600160a060020a03848116602483015291519185169163baa8529c9160448082019260009290919082900301818387803b15801561060f57600080fd5b6000806000808411156104bc57859250611a8e8484600160a060020a0316637ec9c3b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610a7e57600080fd5b915083611ad38385600160a060020a0316637ec9c3b86040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561072657600080fd5b1115611ae25760018203611ae4565b815b604080517fa5cd184e00000000000000000000000000000000000000000000000000000000815260048101889052602481018390529051919350600160a060020a0385169163a5cd184e9160448082019260009290919082900301818387803b158015611b5057600080fd5b505af1158015611b64573d6000803e3d6000fd5b5050505060001983600160a060020a0316630f8a771e6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611ba957600080fd5b505af1158015611bbd573d6000803e3d6000fd5b505050506040513d6020811015611bd357600080fd5b50516040805160e160020a636eb1769f028152306004820152600160a060020a0387811660248301529151919092169163dd62ed3e9160448083019260209291908290030181600087803b158015611c2a57600080fd5b505af1158015611c3e573d6000803e3d6000fd5b505050506040513d6020811015611c5457600080fd5b505114611d345782600160a060020a0316630f8a771e6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611c9957600080fd5b505af1158015611cad573d6000803e3d6000fd5b505050506040513d6020811015611cc357600080fd5b50516040805160e060020a63095ea7b3028152600160a060020a03868116600483015260001960248301529151919092169163095ea7b391604480830192600092919082900301818387803b158015611d1b57600080fd5b505af1158015611d2f573d6000803e3d6000fd5b505050505b82600160a060020a0316637f8661a1836040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b158015611d7d57600080fd5b505af1158015611d91573d6000803e3d6000fd5b5050505082600160a060020a0316637bd2bea76040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611dd357600080fd5b505af1158015611de7573d6000803e3d6000fd5b505050506040513d6020811015611dfd57600080fd5b5051604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b158015611e6257600080fd5b505af1158015611e76573d6000803e3d6000fd5b505050506040513d6020811015611e8c57600080fd5b5051604080517f7bd2bea70000000000000000000000000000000000000000000000000000000081529051919250600160a060020a03851691637bd2bea7916004808201926020929091908290030181600087803b158015611eed57600080fd5b505af1158015611f01573d6000803e3d6000fd5b505050506040513d6020811015611f1757600080fd5b5051604080517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018490529051600160a060020a0390921691632e1a7d4d9160248082019260009290919082900301818387803b158015611f7c57600080fd5b505af1158015611f90573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f193505050501580156110d1573d6000803e3d6000fd5b611fcc848483610ed9565b6104bf848484611a3c565b60006b033b2e3c9fd0803ce8000000612009611ff3858561288f565b60026b033b2e3c9fd0803ce80000005b046128b7565b81151561201257fe5b049392505050565b600081612009612036856b033b2e3c9fd0803ce800000061288f565b600285612003565b60008060008086600160a060020a031663ace237f56040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561208257600080fd5b505af1158015612096573d6000803e3d6000fd5b505050506040513d60208110156120ac57600080fd5b5051604080517f59e02dd70000000000000000000000000000000000000000000000000000000081528151600160a060020a03909316926359e02dd7926004808401939192918290030181600087803b15801561210857600080fd5b505af115801561211c573d6000803e3d6000fd5b505050506040513d604081101561213257600080fd5b508051602090910151909450925082801561214c57508315155b156110d15761215b86856128c7565b9150600160a060020a0385161561278b5784600160a060020a031663ff1fd97488600160a060020a0316639166cba46040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156121b957600080fd5b505af11580156121cd573d6000803e3d6000fd5b505050506040513d60208110156121e357600080fd5b5051604080517f12d43a510000000000000000000000000000000000000000000000000000000081529051600160a060020a038c16916312d43a519160048083019260209291908290030181600087803b15801561224057600080fd5b505af1158015612254573d6000803e3d6000fd5b505050506040513d602081101561226a57600080fd5b50516040805160e060020a63ffffffff8616028152600160a060020a039384166004820152929091166024830152604482018690525160648083019260209291908290030181600087803b1580156122c157600080fd5b505af11580156122d5573d6000803e3d6000fd5b505050506040513d60208110156122eb57600080fd5b5051604080517f9166cba4000000000000000000000000000000000000000000000000000000008152905191925060001991600160a060020a038a1691639166cba49160048083019260209291908290030181600087803b15801561234f57600080fd5b505af1158015612363573d6000803e3d6000fd5b505050506040513d602081101561237957600080fd5b50516040805160e160020a636eb1769f028152306004820152600160a060020a0389811660248301529151919092169163dd62ed3e9160448083019260209291908290030181600087803b1580156123d057600080fd5b505af11580156123e4573d6000803e3d6000fd5b505050506040513d60208110156123fa57600080fd5b5051146124da5786600160a060020a0316639166cba46040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561243f57600080fd5b505af1158015612453573d6000803e3d6000fd5b505050506040513d602081101561246957600080fd5b50516040805160e060020a63095ea7b3028152600160a060020a03888116600483015260001960248301529151919092169163095ea7b391604480830192600092919082900301818387803b1580156124c157600080fd5b505af11580156124d5573d6000803e3d6000fd5b505050505b86600160a060020a0316639166cba46040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561251857600080fd5b505af115801561252c573d6000803e3d6000fd5b505050506040513d602081101561254257600080fd5b5051604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018490529051600160a060020a03909216916323b872dd916064808201926020929091908290030181600087803b1580156125b457600080fd5b505af11580156125c8573d6000803e3d6000fd5b505050506040513d60208110156125de57600080fd5b5050604080517f12d43a510000000000000000000000000000000000000000000000000000000081529051600160a060020a0380881692638185402b92918b16916312d43a51916004808201926020929091908290030181600087803b15801561264757600080fd5b505af115801561265b573d6000803e3d6000fd5b505050506040513d602081101561267157600080fd5b5051604080517f9166cba400000000000000000000000000000000000000000000000000000000815290518691600160a060020a038d1691639166cba4916004808201926020929091908290030181600087803b1580156126d157600080fd5b505af11580156126e5573d6000803e3d6000fd5b505050506040513d60208110156126fb57600080fd5b50516040805160e060020a63ffffffff8716028152600160a060020a03948516600482015260248101939093529216604482015260648101859052905160848083019260209291908290030181600087803b15801561275957600080fd5b505af115801561276d573d6000803e3d6000fd5b505050506040513d602081101561278357600080fd5b506110d19050565b86600160a060020a03166312d43a516040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156127c957600080fd5b505af11580156127dd573d6000803e3d6000fd5b505050506040513d60208110156127f357600080fd5b5051604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018590529051600160a060020a03909216916323b872dd916064808201926020929091908290030181600087803b15801561286557600080fd5b505af1158015612879573d6000803e3d6000fd5b505050506040513d6020811015610ece57600080fd5b60008115806128ac5750508082028282828115156128a957fe5b04145b151561051557600080fd5b8082018281101561051557600080fd5b60008161200961203685670de0b6b3a764000061288f5600a165627a7a723058203882020989eed133489980542fe992a8b6761211e7f9e141daccbdaf91dfb6320029