Address Details
contract

0x88498148cA9a649245265c50b3b5920ca1A1F6E3

Contract Name
PushNotifications
Creator
0x93a8ba–4feaee at 0x2f37c6–6b10c0
Balance
0 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
175 Transactions
Transfers
0 Transfers
Gas Used
13,181,034
Last Balance Update
12217427
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
PushNotifications




Optimization enabled
false
Compiler version
v0.5.16+commit.9c3226ce




EVM Version
istanbul




Verified at
2022-05-31T15:43:27.112061Z

/Users/vaibhavchopra/code/cpns/smart-contracts/contracts/PushNotifications.sol

// SPDX-License-Identifier: MIT
pragma experimental ABIEncoderV2;
// pragma solidity >=0.4.22 <0.9.0;

contract PushNotifications{
    event NotifyOneInChannel(
        address recipient,
        uint256 channel,
        string title,
        string action,
        string body,
        string imageHash,
        bool privateNotification
    );

    event NotifyAllInChannel(
        uint256 channel,
        string title,
        string action,
        string body,
        string imageHash
    );
    
    struct Channel{
        string name;
        string description;
        string iconHash;
        string badgeHash;
        address admin;
        address[] subscribers;
    }
    //      channel index => pushing address => permission boolean
    mapping(uint256 => mapping(address => bool)) public pushAccess; // mapping of addresses OTHER THAN ADMIN who can send push notifications

    Channel[] public channels; // this refers to a dynamic array containing info on various channels

    //  user address => channel index => subscription boolean
    mapping (address=>mapping(uint256=>bool)) public subscriptions;  // mapping of addresses who subscribed to channels
    mapping (address=>string) public publicKeys; // used for sending notifications privately to one person

    function subscribe(uint256 _channel) public returns (bool){
        require(_channel < channels.length,"channel does not exist");
        require(subscriptions[msg.sender][_channel] != true,"You shouldn't be subscribed already");
        subscriptions[msg.sender][_channel] = true;
        channels[_channel].subscribers.push(msg.sender);
        return true;
    }

    function unsubscribe(uint256 _channel) public returns (bool){
        require(_channel < channels.length,"channel does not exist");
        require(
            subscriptions[msg.sender][_channel] == true,
            "You should be subscribed already"
        ); 
        subscriptions[msg.sender][_channel] = false;
        Channel storage channel = channels[_channel];
        uint256 indexToBeDeleted;
        for(uint i=0;i<channel.subscribers.length;i++){
            if(channel.subscribers[i] == msg.sender){
                indexToBeDeleted = i;
                break;
            }
        }

        // replace last element with current element
        channel.subscribers[indexToBeDeleted] = channel.subscribers[channel.subscribers.length-1];

        // remove the last element
        channel.subscribers.pop();
        return true;
    }
    function createChannel(
        string memory _name,
        string memory _description,
        string memory _iconHash,
        string memory _badgeHash
        ) public returns (uint256){
        Channel memory channel;
        channel.name = _name;
        channel.description = _description;
        channel.iconHash = _iconHash;
        channel.badgeHash = _badgeHash;
        channel.admin = msg.sender;
        channels.push(channel);
        return channels.length; // return the new standing count of channels
    }

    function editChannel(
        uint256 _channel,
        string memory _name,
        string memory _description,
        string memory _iconHash,
        string memory _badgeHash
        ) 
    public returns (bool){
        require(_channel < channels.length,"channel does not exist");
        require(msg.sender == channels[_channel].admin,"You must be the channel admin to edit a channel");
        channels[_channel].name = _name;
        channels[_channel].description = _description;
        channels[_channel].iconHash = _iconHash;
        channels[_channel].badgeHash = _badgeHash;
        return true;
    }

    function setPublicKey(string memory _publicKey) public returns (bool){
        publicKeys[msg.sender] = _publicKey;
        return true;
    }

    // this is useful when you want a notification event to be fireable from a contract, you 
    function setPushAccess(uint256 _channel,address _address,bool _access) public returns (bool){
        require(_channel < channels.length,"channel does not exist");
        require(msg.sender == channels[_channel].admin,"You must be the channel admin to set push access");
        pushAccess[_channel][_address] = _access;
        return true;
    }

    // in the case of private notification, it is assumed that fields like title, action, body 
    // and imageHash have already been encrypted by the sender who is compulsarily admin of channel
    // in that case.
    function notifyOneInChannel(
        address _recipient,
        uint256 _channel,
        string memory _title,
        string memory _action,
        string memory _body,
        string memory _imageHash,
        bool _privateNotification
    ) public returns (bool){
        require(_channel < channels.length,"channel does not exist");
        Channel memory channel = channels[_channel];
        // require that the sender is an admin or one of the permissed contracts
        if(_privateNotification){
            require(channel.admin == msg.sender,"sender is not admin of channel, private notification can only be sent admin of channel. Private notifications are disabled for smart contracts since secrets can't be kept on-chain");
        }
        else{
            require(channel.admin == msg.sender || pushAccess[_channel][msg.sender] == true,"public notifications to one person in channel can only be sent by the admin or one of the allowed addresses/contracts");
        }

        require(
            subscriptions[_recipient][_channel] == true,
            "recipient should be subscribed to the channel"
        );

        emit NotifyOneInChannel(
            _recipient,
            _channel,
            _title,
            _action,
            _body,
            _imageHash,
            _privateNotification
        );

        return true;
    }

    function notifyAllInChannel(
        uint256 _channel,
        string memory _title,
        string memory _action, 
        string memory _body,
        string memory _imageHash
    ) public returns (bool){
        require(_channel < channels.length,"channel does not exist");
        Channel memory channel = channels[_channel];
        require(msg.sender == channel.admin || pushAccess[_channel][msg.sender] == true,"sender is not admin of channel or one of the other addresses who have push access");

        emit NotifyAllInChannel(
            _channel,
            _title,
            _action,
            _body,
            _imageHash
        );

        return true;
    }

    function subscribersCountInChannel(uint256 _channel) public view returns (uint256){
        require(_channel < channels.length,"channel does not exist");
        return channels[_channel].subscribers.length;
    }

    function subscribersInChannel(uint256 _channel) public view returns (address [] memory){
        require(_channel < channels.length,"channel does not exist");
        return channels[_channel].subscribers;
    }

    function allChannels() public view returns (Channel[] memory){
        return channels;
    }
}
        

Contract ABI

[{"type":"event","name":"NotifyAllInChannel","inputs":[{"type":"uint256","name":"channel","internalType":"uint256","indexed":false},{"type":"string","name":"title","internalType":"string","indexed":false},{"type":"string","name":"action","internalType":"string","indexed":false},{"type":"string","name":"body","internalType":"string","indexed":false},{"type":"string","name":"imageHash","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"NotifyOneInChannel","inputs":[{"type":"address","name":"recipient","internalType":"address","indexed":false},{"type":"uint256","name":"channel","internalType":"uint256","indexed":false},{"type":"string","name":"title","internalType":"string","indexed":false},{"type":"string","name":"action","internalType":"string","indexed":false},{"type":"string","name":"body","internalType":"string","indexed":false},{"type":"string","name":"imageHash","internalType":"string","indexed":false},{"type":"bool","name":"privateNotification","internalType":"bool","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"tuple[]","name":"","internalType":"struct PushNotifications.Channel[]","components":[{"type":"string","name":"name","internalType":"string"},{"type":"string","name":"description","internalType":"string"},{"type":"string","name":"iconHash","internalType":"string"},{"type":"string","name":"badgeHash","internalType":"string"},{"type":"address","name":"admin","internalType":"address"},{"type":"address[]","name":"subscribers","internalType":"address[]"}]}],"name":"allChannels","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"string","name":"name","internalType":"string"},{"type":"string","name":"description","internalType":"string"},{"type":"string","name":"iconHash","internalType":"string"},{"type":"string","name":"badgeHash","internalType":"string"},{"type":"address","name":"admin","internalType":"address"}],"name":"channels","inputs":[{"type":"uint256","name":"","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"createChannel","inputs":[{"type":"string","name":"_name","internalType":"string"},{"type":"string","name":"_description","internalType":"string"},{"type":"string","name":"_iconHash","internalType":"string"},{"type":"string","name":"_badgeHash","internalType":"string"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"editChannel","inputs":[{"type":"uint256","name":"_channel","internalType":"uint256"},{"type":"string","name":"_name","internalType":"string"},{"type":"string","name":"_description","internalType":"string"},{"type":"string","name":"_iconHash","internalType":"string"},{"type":"string","name":"_badgeHash","internalType":"string"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"notifyAllInChannel","inputs":[{"type":"uint256","name":"_channel","internalType":"uint256"},{"type":"string","name":"_title","internalType":"string"},{"type":"string","name":"_action","internalType":"string"},{"type":"string","name":"_body","internalType":"string"},{"type":"string","name":"_imageHash","internalType":"string"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"notifyOneInChannel","inputs":[{"type":"address","name":"_recipient","internalType":"address"},{"type":"uint256","name":"_channel","internalType":"uint256"},{"type":"string","name":"_title","internalType":"string"},{"type":"string","name":"_action","internalType":"string"},{"type":"string","name":"_body","internalType":"string"},{"type":"string","name":"_imageHash","internalType":"string"},{"type":"bool","name":"_privateNotification","internalType":"bool"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"string","name":"","internalType":"string"}],"name":"publicKeys","inputs":[{"type":"address","name":"","internalType":"address"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"pushAccess","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"address","name":"","internalType":"address"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"setPublicKey","inputs":[{"type":"string","name":"_publicKey","internalType":"string"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"setPushAccess","inputs":[{"type":"uint256","name":"_channel","internalType":"uint256"},{"type":"address","name":"_address","internalType":"address"},{"type":"bool","name":"_access","internalType":"bool"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"subscribe","inputs":[{"type":"uint256","name":"_channel","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"subscribersCountInChannel","inputs":[{"type":"uint256","name":"_channel","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address[]","name":"","internalType":"address[]"}],"name":"subscribersInChannel","inputs":[{"type":"uint256","name":"_channel","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"subscriptions","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"unsubscribe","inputs":[{"type":"uint256","name":"_channel","internalType":"uint256"}],"constant":false}]
              

Contract Creation Code

0x608060405234801561001057600080fd5b50613574806100206000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80639a2717ea11610097578063d2e0fd6b11610066578063d2e0fd6b1461030a578063db40b4c514610328578063e5949b5d14610358578063eb2142401461038c576100f5565b80639a2717ea1461024a578063a3d6f9a91461027a578063ad0b27fb146102aa578063b8cb7de9146102da576100f5565b8063623da3d1116100d3578063623da3d11461018a57806369c3bf64146101ba5780636f6fc077146101ea578063872765551461021a576100f5565b80630f574ba7146100fa5780631ec250b41461012a578063345c93371461015a575b600080fd5b610114600480360361010f9190810190612728565b6103bc565b60405161012191906130bf565b60405180910390f35b610144600480360361013f91908101906127dc565b61059e565b60405161015191906130bf565b60405180910390f35b610174600480360361016f919081019061278d565b610aad565b60405161018191906130bf565b60405180910390f35b6101a4600480360361019f91908101906124ea565b610c14565b6040516101b191906130bf565b60405180910390f35b6101d460048036036101cf9190810190612751565b610c43565b6040516101e191906130bf565b60405180910390f35b61020460048036036101ff9190810190612624565b610c72565b60405161021191906130bf565b60405180910390f35b610234600480360361022f9190810190612526565b610cd1565b60405161024191906130bf565b60405180910390f35b610264600480360361025f91908101906127dc565b611308565b60405161027191906130bf565b60405180910390f35b610294600480360361028f91908101906124c1565b6114d6565b6040516102a191906130da565b60405180910390f35b6102c460048036036102bf9190810190612728565b611586565b6040516102d191906130bf565b60405180910390f35b6102f460048036036102ef9190810190612728565b61187d565b604051610301919061328b565b60405180910390f35b6103126118ef565b60405161031f919061309d565b60405180910390f35b610342600480360361033d9190810190612728565b611cba565b60405161034f919061307b565b60405180910390f35b610372600480360361036d9190810190612728565b611dad565b6040516103839594939291906130fc565b60405180910390f35b6103a660048036036103a19190810190612665565b612070565b6040516103b3919061328b565b60405180910390f35b60006001805490508210610405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103fc906131eb565b60405180910390fd5b60011515600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff16151514156104aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104a19061324b565b60405180910390fd5b6001600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506001828154811061052057fe5b90600052602060002090600602016005013390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060019050919050565b600060018054905086106105e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105de906131eb565b60405180910390fd5b6105ef6121f0565b600187815481106105fc57fe5b90600052602060002090600602016040518060c0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106ae5780601f10610683576101008083540402835291602001916106ae565b820191906000526020600020905b81548152906001019060200180831161069157829003601f168201915b50505050508152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156107505780601f1061072557610100808354040283529160200191610750565b820191906000526020600020905b81548152906001019060200180831161073357829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156107f25780601f106107c7576101008083540402835291602001916107f2565b820191906000526020600020905b8154815290600101906020018083116107d557829003601f168201915b50505050508152602001600382018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108945780601f1061086957610100808354040283529160200191610894565b820191906000526020600020905b81548152906001019060200180831161087757829003601f168201915b505050505081526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016005820180548060200260200160405190810160405280929190818152602001828054801561097857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161092e575b5050505050815250509050806080015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610a2157506001151560008089815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b610a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a579061318b565b60405180910390fd5b7ff73c1e00503e2cc9d434555ad1d81c1240f3fa1f2fe25638f1e09a80fbe8b1c18787878787604051610a979594939291906132a6565b60405180910390a1600191505095945050505050565b60006001805490508410610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed906131eb565b60405180910390fd5b60018481548110610b0357fe5b906000526020600020906006020160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b999061320b565b60405180910390fd5b8160008086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600190509392505050565b60026020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60006020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209080519060200190610cc792919061223c565b5060019050919050565b60006001805490508710610d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d11906131eb565b60405180910390fd5b610d226121f0565b60018881548110610d2f57fe5b90600052602060002090600602016040518060c0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610de15780601f10610db657610100808354040283529160200191610de1565b820191906000526020600020905b815481529060010190602001808311610dc457829003601f168201915b50505050508152602001600182018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e835780601f10610e5857610100808354040283529160200191610e83565b820191906000526020600020905b815481529060010190602001808311610e6657829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f255780601f10610efa57610100808354040283529160200191610f25565b820191906000526020600020905b815481529060010190602001808311610f0857829003601f168201915b50505050508152602001600382018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fc75780601f10610f9c57610100808354040283529160200191610fc7565b820191906000526020600020905b815481529060010190602001808311610faa57829003601f168201915b505050505081526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600582018054806020026020016040519081016040528092919081815260200182805480156110ab57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611061575b50505050508152505090508215611133573373ffffffffffffffffffffffffffffffffffffffff16816080015173ffffffffffffffffffffffffffffffffffffffff161461112e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111259061322b565b60405180910390fd5b611211565b3373ffffffffffffffffffffffffffffffffffffffff16816080015173ffffffffffffffffffffffffffffffffffffffff1614806111d15750600115156000808a815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b611210576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611207906131ab565b60405180910390fd5b5b60011515600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a815260200190815260200160002060009054906101000a900460ff161515146112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac9061326b565b60405180910390fd5b7f6452d1959b586a46259f51796a37a9a53d9a48aa68983fe166ddf2de2f4ec822898989898989896040516112f09796959493929190612ff0565b60405180910390a16001915050979650505050505050565b60006001805490508610611351576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611348906131eb565b60405180910390fd5b6001868154811061135e57fe5b906000526020600020906006020160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f49061316b565b60405180910390fd5b846001878154811061140b57fe5b9060005260206000209060060201600001908051906020019061142f92919061223c565b50836001878154811061143e57fe5b9060005260206000209060060201600101908051906020019061146292919061223c565b50826001878154811061147157fe5b9060005260206000209060060201600201908051906020019061149592919061223c565b5081600187815481106114a457fe5b906000526020600020906006020160030190805190602001906114c892919061223c565b506001905095945050505050565b60036020528060005260406000206000915090508054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561157e5780601f106115535761010080835404028352916020019161157e565b820191906000526020600020905b81548152906001019060200180831161156157829003601f168201915b505050505081565b600060018054905082106115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c6906131eb565b60405180910390fd5b60011515600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff16151514611673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166a906131cb565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600183815481106116eb57fe5b90600052602060002090600602019050600080600090505b8260050180549050811015611794573373ffffffffffffffffffffffffffffffffffffffff1683600501828154811061173857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561178757809150611794565b8080600101915050611703565b50816005016001836005018054905003815481106117ae57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168260050182815481106117e857fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160050180548061183d57fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055600192505050919050565b600060018054905082106118c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bd906131eb565b60405180910390fd5b600182815481106118d357fe5b9060005260206000209060060201600501805490509050919050565b60606001805480602002602001604051908101604052809291908181526020016000905b82821015611cb157838290600052602060002090600602016040518060c0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119cf5780601f106119a4576101008083540402835291602001916119cf565b820191906000526020600020905b8154815290600101906020018083116119b257829003601f168201915b50505050508152602001600182018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a715780601f10611a4657610100808354040283529160200191611a71565b820191906000526020600020905b815481529060010190602001808311611a5457829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b135780601f10611ae857610100808354040283529160200191611b13565b820191906000526020600020905b815481529060010190602001808311611af657829003601f168201915b50505050508152602001600382018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611bb55780601f10611b8a57610100808354040283529160200191611bb5565b820191906000526020600020905b815481529060010190602001808311611b9857829003601f168201915b505050505081526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160058201805480602002602001604051908101604052809291908181526020018280548015611c9957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611c4f575b50505050508152505081526020019060010190611913565b50505050905090565b60606001805490508210611d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfa906131eb565b60405180910390fd5b60018281548110611d1057fe5b9060005260206000209060060201600501805480602002602001604051908101604052809291908181526020018280548015611da157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611d57575b50505050509050919050565b60018181548110611dba57fe5b9060005260206000209060060201600091509050806000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e665780601f10611e3b57610100808354040283529160200191611e66565b820191906000526020600020905b815481529060010190602001808311611e4957829003601f168201915b505050505090806001018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f045780601f10611ed957610100808354040283529160200191611f04565b820191906000526020600020905b815481529060010190602001808311611ee757829003601f168201915b505050505090806002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611fa25780601f10611f7757610100808354040283529160200191611fa2565b820191906000526020600020905b815481529060010190602001808311611f8557829003601f168201915b505050505090806003018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120405780601f1061201557610100808354040283529160200191612040565b820191906000526020600020905b81548152906001019060200180831161202357829003601f168201915b5050505050908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905085565b600061207a6121f0565b85816000018190525084816020018190525083816040018190525082816060018190525033816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001819080600181540180825580915050906001820390600052602060002090600602016000909192909190915060008201518160000190805190602001906121209291906122bc565b50602082015181600101908051906020019061213d9291906122bc565b50604082015181600201908051906020019061215a9291906122bc565b5060608201518160030190805190602001906121779291906122bc565b5060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160050190805190602001906121db92919061233c565b50505050600180549050915050949350505050565b6040518060c0016040528060608152602001606081526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061227d57805160ff19168380011785556122ab565b828001600101855582156122ab579182015b828111156122aa57825182559160200191906001019061228f565b5b5090506122b891906123c6565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106122fd57805160ff191683800117855561232b565b8280016001018555821561232b579182015b8281111561232a57825182559160200191906001019061230f565b5b50905061233891906123c6565b5090565b8280548282559060005260206000209081019282156123b5579160200282015b828111156123b45782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019061235c565b5b5090506123c291906123eb565b5090565b6123e891905b808211156123e45760008160009055506001016123cc565b5090565b90565b61242b91905b8082111561242757600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055506001016123f1565b5090565b90565b60008135905061243d816134ec565b92915050565b60008135905061245281613503565b92915050565b600082601f83011261246957600080fd5b813561247c61247782613342565b613315565b9150808252602083016020830185838301111561249857600080fd5b6124a3838284613499565b50505092915050565b6000813590506124bb8161351a565b92915050565b6000602082840312156124d357600080fd5b60006124e18482850161242e565b91505092915050565b600080604083850312156124fd57600080fd5b600061250b8582860161242e565b925050602061251c858286016124ac565b9150509250929050565b600080600080600080600060e0888a03121561254157600080fd5b600061254f8a828b0161242e565b97505060206125608a828b016124ac565b965050604088013567ffffffffffffffff81111561257d57600080fd5b6125898a828b01612458565b955050606088013567ffffffffffffffff8111156125a657600080fd5b6125b28a828b01612458565b945050608088013567ffffffffffffffff8111156125cf57600080fd5b6125db8a828b01612458565b93505060a088013567ffffffffffffffff8111156125f857600080fd5b6126048a828b01612458565b92505060c06126158a828b01612443565b91505092959891949750929550565b60006020828403121561263657600080fd5b600082013567ffffffffffffffff81111561265057600080fd5b61265c84828501612458565b91505092915050565b6000806000806080858703121561267b57600080fd5b600085013567ffffffffffffffff81111561269557600080fd5b6126a187828801612458565b945050602085013567ffffffffffffffff8111156126be57600080fd5b6126ca87828801612458565b935050604085013567ffffffffffffffff8111156126e757600080fd5b6126f387828801612458565b925050606085013567ffffffffffffffff81111561271057600080fd5b61271c87828801612458565b91505092959194509250565b60006020828403121561273a57600080fd5b6000612748848285016124ac565b91505092915050565b6000806040838503121561276457600080fd5b6000612772858286016124ac565b92505060206127838582860161242e565b9150509250929050565b6000806000606084860312156127a257600080fd5b60006127b0868287016124ac565b93505060206127c18682870161242e565b92505060406127d286828701612443565b9150509250925092565b600080600080600060a086880312156127f457600080fd5b6000612802888289016124ac565b955050602086013567ffffffffffffffff81111561281f57600080fd5b61282b88828901612458565b945050604086013567ffffffffffffffff81111561284857600080fd5b61285488828901612458565b935050606086013567ffffffffffffffff81111561287157600080fd5b61287d88828901612458565b925050608086013567ffffffffffffffff81111561289a57600080fd5b6128a688828901612458565b9150509295509295909350565b60006128bf83836128df565b60208301905092915050565b60006128d78383612f3c565b905092915050565b6128e881613451565b82525050565b6128f781613451565b82525050565b6000612908826133a9565b612912818561340d565b935061291d8361337e565b8060005b8381101561294e57815161293588826128b3565b9750612940836133e2565b925050600181019050612921565b5085935050505092915050565b60006129668261339e565b61297081856133fc565b935061297b8361336e565b8060005b838110156129ac57815161299388826128b3565b975061299e836133d5565b92505060018101905061297f565b5085935050505092915050565b60006129c4826133b4565b6129ce818561341e565b9350836020820285016129e08561338e565b8060005b85811015612a1c57848403895281516129fd85826128cb565b9450612a08836133ef565b925060208a019950506001810190506129e4565b50829750879550505050505092915050565b612a3781613463565b82525050565b6000612a48826133ca565b612a528185613440565b9350612a628185602086016134a8565b612a6b816134db565b840191505092915050565b6000612a81826133bf565b612a8b818561342f565b9350612a9b8185602086016134a8565b612aa4816134db565b840191505092915050565b6000612aba826133bf565b612ac48185613440565b9350612ad48185602086016134a8565b612add816134db565b840191505092915050565b6000612af5602f83613440565b91507f596f75206d75737420626520746865206368616e6e656c2061646d696e20746f60008301527f20656469742061206368616e6e656c00000000000000000000000000000000006020830152604082019050919050565b6000612b5b605183613440565b91507f73656e646572206973206e6f742061646d696e206f66206368616e6e656c206f60008301527f72206f6e65206f6620746865206f74686572206164647265737365732077686f60208301527f20686176652070757368206163636573730000000000000000000000000000006040830152606082019050919050565b6000612be7607583613440565b91507f7075626c6963206e6f74696669636174696f6e7320746f206f6e65207065727360008301527f6f6e20696e206368616e6e656c2063616e206f6e6c792062652073656e74206260208301527f79207468652061646d696e206f72206f6e65206f662074686520616c6c6f776560408301527f64206164647265737365732f636f6e74726163747300000000000000000000006060830152608082019050919050565b6000612c99602083613440565b91507f596f752073686f756c64206265207375627363726962656420616c72656164796000830152602082019050919050565b6000612cd9601683613440565b91507f6368616e6e656c20646f6573206e6f74206578697374000000000000000000006000830152602082019050919050565b6000612d19603083613440565b91507f596f75206d75737420626520746865206368616e6e656c2061646d696e20746f60008301527f20736574207075736820616363657373000000000000000000000000000000006020830152604082019050919050565b6000612d7f60b383613440565b91507f73656e646572206973206e6f742061646d696e206f66206368616e6e656c2c2060008301527f70726976617465206e6f74696669636174696f6e2063616e206f6e6c7920626560208301527f2073656e742061646d696e206f66206368616e6e656c2e20507269766174652060408301527f6e6f74696669636174696f6e73206172652064697361626c656420666f72207360608301527f6d61727420636f6e7472616374732073696e636520736563726574732063616e60808301527f2774206265206b657074206f6e2d636861696e0000000000000000000000000060a083015260c082019050919050565b6000612e7d602383613440565b91507f596f752073686f756c646e2774206265207375627363726962656420616c726560008301527f61647900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ee3602d83613440565b91507f726563697069656e742073686f756c642062652073756273637269626564207460008301527f6f20746865206368616e6e656c000000000000000000000000000000000000006020830152604082019050919050565b600060c0830160008301518482036000860152612f598282612a76565b91505060208301518482036020860152612f738282612a76565b91505060408301518482036040860152612f8d8282612a76565b91505060608301518482036060860152612fa78282612a76565b9150506080830151612fbc60808601826128df565b5060a083015184820360a0860152612fd4828261295b565b9150508091505092915050565b612fea8161348f565b82525050565b600060e082019050613005600083018a6128ee565b6130126020830189612fe1565b81810360408301526130248188612a3d565b905081810360608301526130388187612a3d565b9050818103608083015261304c8186612a3d565b905081810360a08301526130608185612a3d565b905061306f60c0830184612a2e565b98975050505050505050565b6000602082019050818103600083015261309581846128fd565b905092915050565b600060208201905081810360008301526130b781846129b9565b905092915050565b60006020820190506130d46000830184612a2e565b92915050565b600060208201905081810360008301526130f48184612aaf565b905092915050565b600060a08201905081810360008301526131168188612aaf565b9050818103602083015261312a8187612aaf565b9050818103604083015261313e8186612aaf565b905081810360608301526131528185612aaf565b905061316160808301846128ee565b9695505050505050565b6000602082019050818103600083015261318481612ae8565b9050919050565b600060208201905081810360008301526131a481612b4e565b9050919050565b600060208201905081810360008301526131c481612bda565b9050919050565b600060208201905081810360008301526131e481612c8c565b9050919050565b6000602082019050818103600083015261320481612ccc565b9050919050565b6000602082019050818103600083015261322481612d0c565b9050919050565b6000602082019050818103600083015261324481612d72565b9050919050565b6000602082019050818103600083015261326481612e70565b9050919050565b6000602082019050818103600083015261328481612ed6565b9050919050565b60006020820190506132a06000830184612fe1565b92915050565b600060a0820190506132bb6000830188612fe1565b81810360208301526132cd8187612a3d565b905081810360408301526132e18186612a3d565b905081810360608301526132f58185612a3d565b905081810360808301526133098184612a3d565b90509695505050505050565b6000604051905081810181811067ffffffffffffffff8211171561333857600080fd5b8060405250919050565b600067ffffffffffffffff82111561335957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061345c8261346f565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156134c65780820151818401526020810190506134ab565b838111156134d5576000848401525b50505050565b6000601f19601f8301169050919050565b6134f581613451565b811461350057600080fd5b50565b61350c81613463565b811461351757600080fd5b50565b6135238161348f565b811461352e57600080fd5b5056fea365627a7a72315820623666476a1f33a4e834f939f23dc978503627f124344433ded0987d5333024c6c6578706572696d656e74616cf564736f6c63430005100040

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100f55760003560e01c80639a2717ea11610097578063d2e0fd6b11610066578063d2e0fd6b1461030a578063db40b4c514610328578063e5949b5d14610358578063eb2142401461038c576100f5565b80639a2717ea1461024a578063a3d6f9a91461027a578063ad0b27fb146102aa578063b8cb7de9146102da576100f5565b8063623da3d1116100d3578063623da3d11461018a57806369c3bf64146101ba5780636f6fc077146101ea578063872765551461021a576100f5565b80630f574ba7146100fa5780631ec250b41461012a578063345c93371461015a575b600080fd5b610114600480360361010f9190810190612728565b6103bc565b60405161012191906130bf565b60405180910390f35b610144600480360361013f91908101906127dc565b61059e565b60405161015191906130bf565b60405180910390f35b610174600480360361016f919081019061278d565b610aad565b60405161018191906130bf565b60405180910390f35b6101a4600480360361019f91908101906124ea565b610c14565b6040516101b191906130bf565b60405180910390f35b6101d460048036036101cf9190810190612751565b610c43565b6040516101e191906130bf565b60405180910390f35b61020460048036036101ff9190810190612624565b610c72565b60405161021191906130bf565b60405180910390f35b610234600480360361022f9190810190612526565b610cd1565b60405161024191906130bf565b60405180910390f35b610264600480360361025f91908101906127dc565b611308565b60405161027191906130bf565b60405180910390f35b610294600480360361028f91908101906124c1565b6114d6565b6040516102a191906130da565b60405180910390f35b6102c460048036036102bf9190810190612728565b611586565b6040516102d191906130bf565b60405180910390f35b6102f460048036036102ef9190810190612728565b61187d565b604051610301919061328b565b60405180910390f35b6103126118ef565b60405161031f919061309d565b60405180910390f35b610342600480360361033d9190810190612728565b611cba565b60405161034f919061307b565b60405180910390f35b610372600480360361036d9190810190612728565b611dad565b6040516103839594939291906130fc565b60405180910390f35b6103a660048036036103a19190810190612665565b612070565b6040516103b3919061328b565b60405180910390f35b60006001805490508210610405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103fc906131eb565b60405180910390fd5b60011515600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff16151514156104aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104a19061324b565b60405180910390fd5b6001600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506001828154811061052057fe5b90600052602060002090600602016005013390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060019050919050565b600060018054905086106105e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105de906131eb565b60405180910390fd5b6105ef6121f0565b600187815481106105fc57fe5b90600052602060002090600602016040518060c0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106ae5780601f10610683576101008083540402835291602001916106ae565b820191906000526020600020905b81548152906001019060200180831161069157829003601f168201915b50505050508152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156107505780601f1061072557610100808354040283529160200191610750565b820191906000526020600020905b81548152906001019060200180831161073357829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156107f25780601f106107c7576101008083540402835291602001916107f2565b820191906000526020600020905b8154815290600101906020018083116107d557829003601f168201915b50505050508152602001600382018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108945780601f1061086957610100808354040283529160200191610894565b820191906000526020600020905b81548152906001019060200180831161087757829003601f168201915b505050505081526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016005820180548060200260200160405190810160405280929190818152602001828054801561097857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161092e575b5050505050815250509050806080015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610a2157506001151560008089815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b610a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a579061318b565b60405180910390fd5b7ff73c1e00503e2cc9d434555ad1d81c1240f3fa1f2fe25638f1e09a80fbe8b1c18787878787604051610a979594939291906132a6565b60405180910390a1600191505095945050505050565b60006001805490508410610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed906131eb565b60405180910390fd5b60018481548110610b0357fe5b906000526020600020906006020160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b999061320b565b60405180910390fd5b8160008086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600190509392505050565b60026020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60006020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209080519060200190610cc792919061223c565b5060019050919050565b60006001805490508710610d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d11906131eb565b60405180910390fd5b610d226121f0565b60018881548110610d2f57fe5b90600052602060002090600602016040518060c0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610de15780601f10610db657610100808354040283529160200191610de1565b820191906000526020600020905b815481529060010190602001808311610dc457829003601f168201915b50505050508152602001600182018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e835780601f10610e5857610100808354040283529160200191610e83565b820191906000526020600020905b815481529060010190602001808311610e6657829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f255780601f10610efa57610100808354040283529160200191610f25565b820191906000526020600020905b815481529060010190602001808311610f0857829003601f168201915b50505050508152602001600382018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fc75780601f10610f9c57610100808354040283529160200191610fc7565b820191906000526020600020905b815481529060010190602001808311610faa57829003601f168201915b505050505081526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600582018054806020026020016040519081016040528092919081815260200182805480156110ab57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611061575b50505050508152505090508215611133573373ffffffffffffffffffffffffffffffffffffffff16816080015173ffffffffffffffffffffffffffffffffffffffff161461112e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111259061322b565b60405180910390fd5b611211565b3373ffffffffffffffffffffffffffffffffffffffff16816080015173ffffffffffffffffffffffffffffffffffffffff1614806111d15750600115156000808a815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b611210576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611207906131ab565b60405180910390fd5b5b60011515600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a815260200190815260200160002060009054906101000a900460ff161515146112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac9061326b565b60405180910390fd5b7f6452d1959b586a46259f51796a37a9a53d9a48aa68983fe166ddf2de2f4ec822898989898989896040516112f09796959493929190612ff0565b60405180910390a16001915050979650505050505050565b60006001805490508610611351576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611348906131eb565b60405180910390fd5b6001868154811061135e57fe5b906000526020600020906006020160040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f49061316b565b60405180910390fd5b846001878154811061140b57fe5b9060005260206000209060060201600001908051906020019061142f92919061223c565b50836001878154811061143e57fe5b9060005260206000209060060201600101908051906020019061146292919061223c565b50826001878154811061147157fe5b9060005260206000209060060201600201908051906020019061149592919061223c565b5081600187815481106114a457fe5b906000526020600020906006020160030190805190602001906114c892919061223c565b506001905095945050505050565b60036020528060005260406000206000915090508054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561157e5780601f106115535761010080835404028352916020019161157e565b820191906000526020600020905b81548152906001019060200180831161156157829003601f168201915b505050505081565b600060018054905082106115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c6906131eb565b60405180910390fd5b60011515600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060009054906101000a900460ff16151514611673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166a906131cb565b60405180910390fd5b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600183815481106116eb57fe5b90600052602060002090600602019050600080600090505b8260050180549050811015611794573373ffffffffffffffffffffffffffffffffffffffff1683600501828154811061173857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561178757809150611794565b8080600101915050611703565b50816005016001836005018054905003815481106117ae57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168260050182815481106117e857fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160050180548061183d57fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055600192505050919050565b600060018054905082106118c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bd906131eb565b60405180910390fd5b600182815481106118d357fe5b9060005260206000209060060201600501805490509050919050565b60606001805480602002602001604051908101604052809291908181526020016000905b82821015611cb157838290600052602060002090600602016040518060c0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119cf5780601f106119a4576101008083540402835291602001916119cf565b820191906000526020600020905b8154815290600101906020018083116119b257829003601f168201915b50505050508152602001600182018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a715780601f10611a4657610100808354040283529160200191611a71565b820191906000526020600020905b815481529060010190602001808311611a5457829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b135780601f10611ae857610100808354040283529160200191611b13565b820191906000526020600020905b815481529060010190602001808311611af657829003601f168201915b50505050508152602001600382018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611bb55780601f10611b8a57610100808354040283529160200191611bb5565b820191906000526020600020905b815481529060010190602001808311611b9857829003601f168201915b505050505081526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160058201805480602002602001604051908101604052809291908181526020018280548015611c9957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611c4f575b50505050508152505081526020019060010190611913565b50505050905090565b60606001805490508210611d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfa906131eb565b60405180910390fd5b60018281548110611d1057fe5b9060005260206000209060060201600501805480602002602001604051908101604052809291908181526020018280548015611da157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611d57575b50505050509050919050565b60018181548110611dba57fe5b9060005260206000209060060201600091509050806000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e665780601f10611e3b57610100808354040283529160200191611e66565b820191906000526020600020905b815481529060010190602001808311611e4957829003601f168201915b505050505090806001018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f045780601f10611ed957610100808354040283529160200191611f04565b820191906000526020600020905b815481529060010190602001808311611ee757829003601f168201915b505050505090806002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611fa25780601f10611f7757610100808354040283529160200191611fa2565b820191906000526020600020905b815481529060010190602001808311611f8557829003601f168201915b505050505090806003018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120405780601f1061201557610100808354040283529160200191612040565b820191906000526020600020905b81548152906001019060200180831161202357829003601f168201915b5050505050908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905085565b600061207a6121f0565b85816000018190525084816020018190525083816040018190525082816060018190525033816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001819080600181540180825580915050906001820390600052602060002090600602016000909192909190915060008201518160000190805190602001906121209291906122bc565b50602082015181600101908051906020019061213d9291906122bc565b50604082015181600201908051906020019061215a9291906122bc565b5060608201518160030190805190602001906121779291906122bc565b5060808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160050190805190602001906121db92919061233c565b50505050600180549050915050949350505050565b6040518060c0016040528060608152602001606081526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061227d57805160ff19168380011785556122ab565b828001600101855582156122ab579182015b828111156122aa57825182559160200191906001019061228f565b5b5090506122b891906123c6565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106122fd57805160ff191683800117855561232b565b8280016001018555821561232b579182015b8281111561232a57825182559160200191906001019061230f565b5b50905061233891906123c6565b5090565b8280548282559060005260206000209081019282156123b5579160200282015b828111156123b45782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019061235c565b5b5090506123c291906123eb565b5090565b6123e891905b808211156123e45760008160009055506001016123cc565b5090565b90565b61242b91905b8082111561242757600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055506001016123f1565b5090565b90565b60008135905061243d816134ec565b92915050565b60008135905061245281613503565b92915050565b600082601f83011261246957600080fd5b813561247c61247782613342565b613315565b9150808252602083016020830185838301111561249857600080fd5b6124a3838284613499565b50505092915050565b6000813590506124bb8161351a565b92915050565b6000602082840312156124d357600080fd5b60006124e18482850161242e565b91505092915050565b600080604083850312156124fd57600080fd5b600061250b8582860161242e565b925050602061251c858286016124ac565b9150509250929050565b600080600080600080600060e0888a03121561254157600080fd5b600061254f8a828b0161242e565b97505060206125608a828b016124ac565b965050604088013567ffffffffffffffff81111561257d57600080fd5b6125898a828b01612458565b955050606088013567ffffffffffffffff8111156125a657600080fd5b6125b28a828b01612458565b945050608088013567ffffffffffffffff8111156125cf57600080fd5b6125db8a828b01612458565b93505060a088013567ffffffffffffffff8111156125f857600080fd5b6126048a828b01612458565b92505060c06126158a828b01612443565b91505092959891949750929550565b60006020828403121561263657600080fd5b600082013567ffffffffffffffff81111561265057600080fd5b61265c84828501612458565b91505092915050565b6000806000806080858703121561267b57600080fd5b600085013567ffffffffffffffff81111561269557600080fd5b6126a187828801612458565b945050602085013567ffffffffffffffff8111156126be57600080fd5b6126ca87828801612458565b935050604085013567ffffffffffffffff8111156126e757600080fd5b6126f387828801612458565b925050606085013567ffffffffffffffff81111561271057600080fd5b61271c87828801612458565b91505092959194509250565b60006020828403121561273a57600080fd5b6000612748848285016124ac565b91505092915050565b6000806040838503121561276457600080fd5b6000612772858286016124ac565b92505060206127838582860161242e565b9150509250929050565b6000806000606084860312156127a257600080fd5b60006127b0868287016124ac565b93505060206127c18682870161242e565b92505060406127d286828701612443565b9150509250925092565b600080600080600060a086880312156127f457600080fd5b6000612802888289016124ac565b955050602086013567ffffffffffffffff81111561281f57600080fd5b61282b88828901612458565b945050604086013567ffffffffffffffff81111561284857600080fd5b61285488828901612458565b935050606086013567ffffffffffffffff81111561287157600080fd5b61287d88828901612458565b925050608086013567ffffffffffffffff81111561289a57600080fd5b6128a688828901612458565b9150509295509295909350565b60006128bf83836128df565b60208301905092915050565b60006128d78383612f3c565b905092915050565b6128e881613451565b82525050565b6128f781613451565b82525050565b6000612908826133a9565b612912818561340d565b935061291d8361337e565b8060005b8381101561294e57815161293588826128b3565b9750612940836133e2565b925050600181019050612921565b5085935050505092915050565b60006129668261339e565b61297081856133fc565b935061297b8361336e565b8060005b838110156129ac57815161299388826128b3565b975061299e836133d5565b92505060018101905061297f565b5085935050505092915050565b60006129c4826133b4565b6129ce818561341e565b9350836020820285016129e08561338e565b8060005b85811015612a1c57848403895281516129fd85826128cb565b9450612a08836133ef565b925060208a019950506001810190506129e4565b50829750879550505050505092915050565b612a3781613463565b82525050565b6000612a48826133ca565b612a528185613440565b9350612a628185602086016134a8565b612a6b816134db565b840191505092915050565b6000612a81826133bf565b612a8b818561342f565b9350612a9b8185602086016134a8565b612aa4816134db565b840191505092915050565b6000612aba826133bf565b612ac48185613440565b9350612ad48185602086016134a8565b612add816134db565b840191505092915050565b6000612af5602f83613440565b91507f596f75206d75737420626520746865206368616e6e656c2061646d696e20746f60008301527f20656469742061206368616e6e656c00000000000000000000000000000000006020830152604082019050919050565b6000612b5b605183613440565b91507f73656e646572206973206e6f742061646d696e206f66206368616e6e656c206f60008301527f72206f6e65206f6620746865206f74686572206164647265737365732077686f60208301527f20686176652070757368206163636573730000000000000000000000000000006040830152606082019050919050565b6000612be7607583613440565b91507f7075626c6963206e6f74696669636174696f6e7320746f206f6e65207065727360008301527f6f6e20696e206368616e6e656c2063616e206f6e6c792062652073656e74206260208301527f79207468652061646d696e206f72206f6e65206f662074686520616c6c6f776560408301527f64206164647265737365732f636f6e74726163747300000000000000000000006060830152608082019050919050565b6000612c99602083613440565b91507f596f752073686f756c64206265207375627363726962656420616c72656164796000830152602082019050919050565b6000612cd9601683613440565b91507f6368616e6e656c20646f6573206e6f74206578697374000000000000000000006000830152602082019050919050565b6000612d19603083613440565b91507f596f75206d75737420626520746865206368616e6e656c2061646d696e20746f60008301527f20736574207075736820616363657373000000000000000000000000000000006020830152604082019050919050565b6000612d7f60b383613440565b91507f73656e646572206973206e6f742061646d696e206f66206368616e6e656c2c2060008301527f70726976617465206e6f74696669636174696f6e2063616e206f6e6c7920626560208301527f2073656e742061646d696e206f66206368616e6e656c2e20507269766174652060408301527f6e6f74696669636174696f6e73206172652064697361626c656420666f72207360608301527f6d61727420636f6e7472616374732073696e636520736563726574732063616e60808301527f2774206265206b657074206f6e2d636861696e0000000000000000000000000060a083015260c082019050919050565b6000612e7d602383613440565b91507f596f752073686f756c646e2774206265207375627363726962656420616c726560008301527f61647900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ee3602d83613440565b91507f726563697069656e742073686f756c642062652073756273637269626564207460008301527f6f20746865206368616e6e656c000000000000000000000000000000000000006020830152604082019050919050565b600060c0830160008301518482036000860152612f598282612a76565b91505060208301518482036020860152612f738282612a76565b91505060408301518482036040860152612f8d8282612a76565b91505060608301518482036060860152612fa78282612a76565b9150506080830151612fbc60808601826128df565b5060a083015184820360a0860152612fd4828261295b565b9150508091505092915050565b612fea8161348f565b82525050565b600060e082019050613005600083018a6128ee565b6130126020830189612fe1565b81810360408301526130248188612a3d565b905081810360608301526130388187612a3d565b9050818103608083015261304c8186612a3d565b905081810360a08301526130608185612a3d565b905061306f60c0830184612a2e565b98975050505050505050565b6000602082019050818103600083015261309581846128fd565b905092915050565b600060208201905081810360008301526130b781846129b9565b905092915050565b60006020820190506130d46000830184612a2e565b92915050565b600060208201905081810360008301526130f48184612aaf565b905092915050565b600060a08201905081810360008301526131168188612aaf565b9050818103602083015261312a8187612aaf565b9050818103604083015261313e8186612aaf565b905081810360608301526131528185612aaf565b905061316160808301846128ee565b9695505050505050565b6000602082019050818103600083015261318481612ae8565b9050919050565b600060208201905081810360008301526131a481612b4e565b9050919050565b600060208201905081810360008301526131c481612bda565b9050919050565b600060208201905081810360008301526131e481612c8c565b9050919050565b6000602082019050818103600083015261320481612ccc565b9050919050565b6000602082019050818103600083015261322481612d0c565b9050919050565b6000602082019050818103600083015261324481612d72565b9050919050565b6000602082019050818103600083015261326481612e70565b9050919050565b6000602082019050818103600083015261328481612ed6565b9050919050565b60006020820190506132a06000830184612fe1565b92915050565b600060a0820190506132bb6000830188612fe1565b81810360208301526132cd8187612a3d565b905081810360408301526132e18186612a3d565b905081810360608301526132f58185612a3d565b905081810360808301526133098184612a3d565b90509695505050505050565b6000604051905081810181811067ffffffffffffffff8211171561333857600080fd5b8060405250919050565b600067ffffffffffffffff82111561335957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061345c8261346f565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156134c65780820151818401526020810190506134ab565b838111156134d5576000848401525b50505050565b6000601f19601f8301169050919050565b6134f581613451565b811461350057600080fd5b50565b61350c81613463565b811461351757600080fd5b50565b6135238161348f565b811461352e57600080fd5b5056fea365627a7a72315820623666476a1f33a4e834f939f23dc978503627f124344433ded0987d5333024c6c6578706572696d656e74616cf564736f6c63430005100040