{
  "contractName": "LimitHolder",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_holderLimit",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_holderLimit",
          "type": "uint256"
        }
      ],
      "name": "HolderLimitSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_agentAddress",
          "type": "address"
        }
      ],
      "name": "TokenAgentAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_agentAddress",
          "type": "address"
        }
      ],
      "name": "TokenAgentRemoved",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "TokenBound",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "TokenUnbound",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "token",
      "outputs": [
        {
          "internalType": "contract IToken",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_agentAddress",
          "type": "address"
        }
      ],
      "name": "isTokenAgent",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "isTokenBound",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_agentAddress",
          "type": "address"
        }
      ],
      "name": "addTokenAgent",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_agentAddress",
          "type": "address"
        }
      ],
      "name": "removeTokenAgent",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "bindToken",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        }
      ],
      "name": "unbindToken",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_holderLimit",
          "type": "uint256"
        }
      ],
      "name": "setHolderLimit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getHolderLimit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "holderCount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "index",
          "type": "uint256"
        }
      ],
      "name": "holderAt",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "index",
          "type": "uint16"
        }
      ],
      "name": "getShareholderCountByCountry",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "canTransfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "transferred",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_value",
          "type": "uint256"
        }
      ],
      "name": "created",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_from",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "destroyed",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnershipOnComplianceContract",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_holderLimit\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_holderLimit\",\"type\":\"uint256\"}],\"name\":\"HolderLimitSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_agentAddress\",\"type\":\"address\"}],\"name\":\"TokenAgentAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_agentAddress\",\"type\":\"address\"}],\"name\":\"TokenAgentRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"TokenBound\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"TokenUnbound\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_agentAddress\",\"type\":\"address\"}],\"name\":\"addTokenAgent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"bindToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"canTransfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"created\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"destroyed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getHolderLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"index\",\"type\":\"uint16\"}],\"name\":\"getShareholderCountByCountry\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"holderAt\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"holderCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_agentAddress\",\"type\":\"address\"}],\"name\":\"isTokenAgent\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"isTokenBound\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_agentAddress\",\"type\":\"address\"}],\"name\":\"removeTokenAgent\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_holderLimit\",\"type\":\"uint256\"}],\"name\":\"setHolderLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"contract IToken\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnershipOnComplianceContract\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"transferred\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"unbindToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addTokenAgent(address)\":{\"details\":\"See {ICompliance-addTokenAgent}.\"},\"bindToken(address)\":{\"details\":\"See {ICompliance-isTokenAgent}.\"},\"canTransfer(address,address,uint256)\":{\"details\":\"See {ICompliance-canTransfer}.\",\"returns\":{\"_0\":\"true if the amount of holders post-transfer is less or  equal to the maximum amount of token holders\"}},\"constructor\":{\"details\":\"the constructor initiates the smart contract with the initial state variables\",\"params\":{\"_holderLimit\":\"the holder limit for the token concerned  emits a `HolderLimitSet` event\",\"_token\":\"the address of the token concerned by the rules of this compliance contract\"}},\"created(address,uint256)\":{\"details\":\"See {ICompliance-created}.  updates the counter of shareholders if necessary\"},\"destroyed(address,uint256)\":{\"details\":\"See {ICompliance-destroyed}.  updates the counter of shareholders if necessary\"},\"getHolderLimit()\":{\"details\":\"returns the holder limit as set on the contract\"},\"getShareholderCountByCountry(uint16)\":{\"details\":\"get the amount of shareholders in a country\",\"params\":{\"index\":\"the index of the country, following ISO 3166-1\"}},\"holderAt(uint256)\":{\"details\":\"By counting the number of token holders using `holderCount`  you can retrieve the complete list of token holders, one at a time.  It MUST throw if `index >= holderCount()`.\",\"params\":{\"index\":\"The zero-based index of the holder.\"},\"returns\":{\"_0\":\"`address` the address of the token holder with the given index.\"}},\"holderCount()\":{\"details\":\"returns the amount of token holders\"},\"isTokenAgent(address)\":{\"details\":\"See {ICompliance-isTokenAgent}.\"},\"isTokenBound(address)\":{\"details\":\"See {ICompliance-isTokenBound}.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"removeTokenAgent(address)\":{\"details\":\"See {ICompliance-isTokenAgent}.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setHolderLimit(uint256)\":{\"details\":\"sets the holder limit as required for compliance purpose\",\"params\":{\"_holderLimit\":\"the holder limit for the token concerned  This function can only be called by the agent of the Compliance contract  emits a `HolderLimitSet` event\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"transferOwnershipOnComplianceContract(address)\":{\"details\":\"See {ICompliance-transferOwnershipOnComplianceContract}.\"},\"transferred(address,address,uint256)\":{\"details\":\"See {ICompliance-transferred}.  updates the counter of shareholders if necessary\"},\"unbindToken(address)\":{\"details\":\"See {ICompliance-isTokenAgent}.\"}},\"stateVariables\":{\"_tokenAgentsList\":{\"details\":\"Mapping between agents and their statuses\"},\"_tokensBound\":{\"details\":\"Mapping of tokens linked to the compliance contract\"},\"countryShareHolders\":{\"details\":\"the amount of shareholders per country\"},\"holderIndices\":{\"details\":\"the index of each shareholder in the array `shareholders`\"},\"holderLimit\":{\"details\":\"the limit of holders for this token\"},\"identityRegistry\":{\"details\":\"the Identity registry contract linked to `token`\"},\"shareholders\":{\"details\":\"the addresses of all shareholders\"},\"token\":{\"details\":\"the token on which this compliance contract is applied\"}},\"version\":1},\"userdoc\":{\"events\":{\"HolderLimitSet(uint256)\":{\"notice\":\"this event is emitted when the holder limit is set.  the event is emitted by the setHolderLimit function and by the constructor  `_holderLimit` is the holder limit for this token\"},\"TokenAgentAdded(address)\":{\"notice\":\"this event is emitted when the Agent has been added on the allowedList of this Compliance.  the event is emitted by the Compliance constructor and by the addTokenAgent function  `_agentAddress` is the address of the Agent to add\"},\"TokenAgentRemoved(address)\":{\"notice\":\"this event is emitted when the Agent has been removed from the agent list of this Compliance.  the event is emitted by the Compliance constructor and by the removeTokenAgent function  `_agentAddress` is the address of the Agent to remove\"},\"TokenBound(address)\":{\"notice\":\"this event is emitted when a token has been bound to the compliance contract  the event is emitted by the bindToken function  `_token` is the address of the token to bind\"},\"TokenUnbound(address)\":{\"notice\":\"this event is emitted when a token has been unbound from the compliance contract  the event is emitted by the unbindToken function  `_token` is the address of the token to unbind\"}},\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"project:/contracts/compliance/LimitHolder.sol\":\"LimitHolder\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@onchain-id/solidity/contracts/interface/IClaimIssuer.sol\":{\"keccak256\":\"0xd0493be7cb7342962b46f8e2afdca4614ea0fe34a7f493b2da9db7d361a9042c\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://105232aae24e3d0fcb4c80c00793b61b6019f6127c0ec6f9e3082ae01b2e778b\",\"dweb:/ipfs/QmV5C1wbq7H5H6DiakafSX5agAAP6rQSZ5qq7Qgq6VLkXo\"]},\"@onchain-id/solidity/contracts/interface/IERC734.sol\":{\"keccak256\":\"0x3302de9e9fe7a548cb7395b6fda38f952f6a6d1c599dfeee181a1ef80741fc1d\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://fc9f00e5b2f1523fecf52b1a833e9263a53edbebb7d1458f9004cfd41dd0402e\",\"dweb:/ipfs/QmWcNcVQrg66KeQz39jPgJun7jF3CbdJKHQa19q97n5Hzb\"]},\"@onchain-id/solidity/contracts/interface/IERC735.sol\":{\"keccak256\":\"0x3b77ce6012a96cf0075197cdeb1b98b66ca1722ef23241e40ba6185f03bf4584\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://766e139f0c3cc0c6489561e75df0d8eab8c277f90009e4fa19add4f22bb40d82\",\"dweb:/ipfs/QmcbAReZn9nLcnYn9AHiDmcYJ42JqAU5QSy4dKhUcJUnjy\"]},\"@onchain-id/solidity/contracts/interface/IIdentity.sol\":{\"keccak256\":\"0xdcefbe2a850f9f43e959b9f7ed93fd5b35f29ff3dfbfaac7530af737c9eba7c6\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://2e887c7cc67fdb2710c48bed22dbb27880f6dfb84ee93178ad4fcd659099cb96\",\"dweb:/ipfs/QmUuDEsZJC7uQQEErmuNJzePsNgHiTDdS2TuMzG1GRqrC3\"]},\"@openzeppelin/contracts/access/Ownable.sol\":{\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2\",\"dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"project:/contracts/compliance/ICompliance.sol\":{\"keccak256\":\"0x4049905b34eab118c0c3f644450299a5ed8022bbbdb26036e7c2854dae8ae1ba\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://f8144953d88f543b2f537514f1136b8adf705837ba6d420b95569f6895153edb\",\"dweb:/ipfs/QmRqM7A6XrofFR67k8RtNNEkriAbKsQHDgUYaKZTMr9Nm5\"]},\"project:/contracts/compliance/LimitHolder.sol\":{\"keccak256\":\"0xa534fce2b59a1c0a462ea2f4f4e757993275d856da4bc7147cfedd6be89ca804\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://b2226156cd0a5410275370048a18cf1fed2676391ec217e331a0b2171105f449\",\"dweb:/ipfs/QmbGMDtitrHhkMkAa4fyQHbvxyedKaFCaidMYHggiH5QAV\"]},\"project:/contracts/registry/IClaimTopicsRegistry.sol\":{\"keccak256\":\"0x95f8fa17a716771125b203f00890eceb20ac3807f7a39a25b644427b1ff81d61\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://460dceb9e88957d5ce002b80748767c80a7e146c9b38b055a3c1ca04586b2009\",\"dweb:/ipfs/QmVdqEpGMRzSpLKBCtPzaPGatBgUyNm3NS5rQnkkYMnc1C\"]},\"project:/contracts/registry/IIdentityRegistry.sol\":{\"keccak256\":\"0x16a31f2d35143f99cc6b83d0cf6e9da9543c2b8561712079098f3a39d12ae32a\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://7669a9272b1df8e27e0fc3f5f64977b2b16615e585b673383db1eb157a62bf7c\",\"dweb:/ipfs/QmQzXmoFcFyBPehPyiUzGjaKfXJHLEPZMtFTBTgjuCavah\"]},\"project:/contracts/registry/IIdentityRegistryStorage.sol\":{\"keccak256\":\"0x8cd4de1e77c5da8ca2ff732069bc184aef86bcb94f95a5229e5bd6336abbd06d\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://f88894a3d046940be03a12cc2da3b3fb6efb51e0461fbea060a9a3190cadcf16\",\"dweb:/ipfs/QmNndZUPdpc83A9LungeAsrcencq3CzTum1tkU6KVdSRNC\"]},\"project:/contracts/registry/ITrustedIssuersRegistry.sol\":{\"keccak256\":\"0x01af20f2f537db3122c60b7c6e60e5036e07c673ef9762428b42129f65fcbc60\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://28f514b876c975777fe84bdb9f96ec5c687e4e4ff5d2b14961ba61affc57d46c\",\"dweb:/ipfs/QmdbVRsg1Q71PVHYxy1r7e5MeiMN5hHHDD8vRnXBSr8JiV\"]},\"project:/contracts/token/IToken.sol\":{\"keccak256\":\"0x34ce3cabab2f6b66aeb4e89fe8e9952b8aa57663e7b33429963169a835fc1f25\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://cffd212e911fd0a6a402d5438e5f5da0c1637226bfcab173a7c58efba12f2655\",\"dweb:/ipfs/QmVbqFNczrUAETfAX6F9MxXKivALRvt1HBTMhrjAKWHniq\"]}},\"version\":1}",
  "bytecode": "0x608060405234801561001057600080fd5b50604051620010f3380380620010f38339810160408190526100319161017e565b61003a33610116565b600180546001600160a01b0319166001600160a01b0384169081179091556002829055604080516304d3863d60e21b8152905163134e18f4916004808201926020929091908290030181865afa158015610098573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100bc91906101ac565b600380546001600160a01b0319166001600160a01b03929092169190911790556040518181527f3069f57f08b632d7fceb2be6b7e39522eff2dbd0b4605b5f0ab46c94f1211d8e9060200160405180910390a150506101d0565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038116811461017b57600080fd5b50565b6000806040838503121561019157600080fd5b825161019c81610166565b6020939093015192949293505050565b6000602082840312156101be57600080fd5b81516101c981610166565b9392505050565b610f1380620001e06000396000f3fe608060405234801561001057600080fd5b50600436106100fc5760003560e01c806306f91d5914610101578063197bc336146101165780631aab9a9f1461013f578063346531fa146101515780633ff5aa021461018d57806340db3b50146101a05780635f8dead3146101b3578063715018a6146101c65780637bcf0487146101ce5780638baf29b4146101e15780638d2ea772146101f45780638da5cb5b14610207578063951f17ae1461020f578063993e8b9514610233578063cdde293214610246578063e46638e614610259578063f2fde38b1461026c578063f3ac23891461027f578063fc0c546a14610287578063ff3e69541461029a575b600080fd5b61011461010f366004610cbb565b6102ad565b005b610129610124366004610cbb565b6102f1565b6040516101369190610cd4565b60405180910390f35b6006545b604051908152602001610136565b61017d61015f366004610d04565b6001600160a01b031660009081526007602052604090205460ff1690565b6040519015158152602001610136565b61011461019b366004610d04565b610374565b6101146101ae366004610d04565b610436565b6101146101c1366004610d1f565b6104f4565b610114610568565b6101146101dc366004610d04565b61057c565b6101146101ef366004610d49565b610590565b610114610202366004610d1f565b6105cb565b6101296105f8565b61014361021d366004610d95565b61ffff1660009081526005602052604090205490565b61017d610241366004610d04565b610607565b610114610254366004610d04565b610625565b61017d610267366004610d49565b6106e5565b61011461027a366004610d04565b61072a565b600254610143565b600154610129906001600160a01b031681565b6101146102a8366004610d04565b6107a0565b6102b5610864565b60028190556040518181527f3069f57f08b632d7fceb2be6b7e39522eff2dbd0b4605b5f0ab46c94f1211d8e906020015b60405180910390a150565b60065460009082106103465760405162461bcd60e51b81526020600482015260196024820152781cda185c995a1bdb19195c88191bd95cdb89dd08195e1a5cdd603a1b60448201526064015b60405180910390fd5b6006828154811061035957610359610db2565b6000918252602090912001546001600160a01b031692915050565b61037c610864565b6001600160a01b03811660009081526008602052604090205460ff16156103e35760405162461bcd60e51b815260206004820152601b60248201527a151a1a5cc81d1bdad95b881a5cc8185b1c9958591e48189bdd5b99602a1b604482015260640161033d565b6001600160a01b03811660009081526008602052604090819020805460ff19166001179055517f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b906102e6908390610cd4565b61043e610864565b6001600160a01b03811660009081526008602052604090205460ff166104a45760405162461bcd60e51b815260206004820152601b60248201527a151a1a5cc81d1bdad95b881a5cc81b9bdd08189bdd5b99081e595d602a1b604482015260640161033d565b6001600160a01b03811660009081526008602052604090819020805460ff19169055517f28a4ca7134a3b3f9aff286e79ad3daadb4a06d1b43d037a3a98bdc074edd9b7a906102e6908390610cd4565b6104fc6108c3565b6105185760405162461bcd60e51b815260040161033d90610dc8565b6000811161055b5760405162461bcd60e51b815260206004820152601060248201526f139bc81d1bdad95b8818dc99585d195960821b604482015260640161033d565b610564826108d3565b5050565b610570610864565b61057a60006109e4565b565b610584610864565b61058d8161072a565b50565b6105986108c3565b6105b45760405162461bcd60e51b815260040161033d90610dc8565b6105bd826108d3565b6105c683610a34565b505050565b6105d36108c3565b6105ef5760405162461bcd60e51b815260040161033d90610dc8565b61056482610a34565b6000546001600160a01b031690565b6001600160a01b031660009081526008602052604090205460ff1690565b61062d610864565b6001600160a01b03811660009081526007602052604090205460ff166106955760405162461bcd60e51b815260206004820181905260248201527f54686973204167656e74206973206e6f74207265676973746572656420796574604482015260640161033d565b6001600160a01b03811660009081526007602052604090819020805460ff19169055517f6a659bb87bb23efbdc295f8eed8ae8c4379bfb77660ced2ef0f3d7d26b05c6a6906102e6908390610cd4565b6001600160a01b0382166000908152600460205260408120541561070b57506001610723565b600254600654101561071f57506001610723565b5060005b9392505050565b610732610864565b6001600160a01b0381166107975760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161033d565b61058d816109e4565b6107a8610864565b6001600160a01b03811660009081526007602052604090205460ff16156108115760405162461bcd60e51b815260206004820181905260248201527f54686973204167656e7420697320616c72656164792072656769737465726564604482015260640161033d565b6001600160a01b03811660009081526007602052604090819020805460ff19166001179055517fd62c45e13ac30396aceb3ad37c89bd1ba9048032fe61679000e92eb93dbfd67d906102e6908390610cd4565b3361086d6105f8565b6001600160a01b03161461057a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161033d565b60006108ce33610607565b905090565b6001600160a01b038116600090815260046020526040812054900361058d57600680546001810182557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0384811691821790925591546000928352600460208190526040808520929092556003549151637e42683b60e01b81529190921691637e42683b9161097891869101610cd4565b602060405180830381865afa158015610995573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b99190610e32565b61ffff811660009081526005602052604081208054929350906109db83610e65565b91905055505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381166000908152600460205260408120549003610a985760405162461bcd60e51b815260206004820152601a60248201527914da185c995a1bdb19195c88191bd95cc81b9bdd08195e1a5cdd60321b604482015260640161033d565b6001546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610ac9908590600401610cd4565b602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190610e7e565b90508015610b16575050565b6001600160a01b038216600090815260046020526040812054610b3b90600190610e97565b600654909150600090610b5090600190610e97565b9050600060068281548110610b6757610b67610db2565b600091825260209091200154600680546001600160a01b039092169250829185908110610b9657610b96610db2565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905587831682526004905260408082205492841682529020556006805480610be657610be6610eb0565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03878116835260049182905260408084208490556003549051637e42683b60e01b8152911691637e42683b91610c4b918a9101610cd4565b602060405180830381865afa158015610c68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8c9190610e32565b61ffff81166000908152600560205260408120805492935090610cae83610ec6565b9190505550505050505050565b600060208284031215610ccd57600080fd5b5035919050565b6001600160a01b0391909116815260200190565b80356001600160a01b0381168114610cff57600080fd5b919050565b600060208284031215610d1657600080fd5b61072382610ce8565b60008060408385031215610d3257600080fd5b610d3b83610ce8565b946020939093013593505050565b600080600060608486031215610d5e57600080fd5b610d6784610ce8565b9250610d7560208501610ce8565b9150604084013590509250925092565b61ffff8116811461058d57600080fd5b600060208284031215610da757600080fd5b813561072381610d85565b634e487b7160e01b600052603260045260246000fd5b60208082526044908201527f6572726f72203a20746869732061646472657373206973206e6f74206120746f60408201527f6b656e20626f756e6420746f2074686520636f6d706c69616e636520636f6e746060820152631c9858dd60e21b608082015260a00190565b600060208284031215610e4457600080fd5b815161072381610d85565b634e487b7160e01b600052601160045260246000fd5b600060018201610e7757610e77610e4f565b5060010190565b600060208284031215610e9057600080fd5b5051919050565b81810381811115610eaa57610eaa610e4f565b92915050565b634e487b7160e01b600052603160045260246000fd5b600081610ed557610ed5610e4f565b50600019019056fea2646970667358221220775f566c67450d8adda802079b0c2b30491293d83593f2d132fec89d5271242764736f6c63430008110033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100fc5760003560e01c806306f91d5914610101578063197bc336146101165780631aab9a9f1461013f578063346531fa146101515780633ff5aa021461018d57806340db3b50146101a05780635f8dead3146101b3578063715018a6146101c65780637bcf0487146101ce5780638baf29b4146101e15780638d2ea772146101f45780638da5cb5b14610207578063951f17ae1461020f578063993e8b9514610233578063cdde293214610246578063e46638e614610259578063f2fde38b1461026c578063f3ac23891461027f578063fc0c546a14610287578063ff3e69541461029a575b600080fd5b61011461010f366004610cbb565b6102ad565b005b610129610124366004610cbb565b6102f1565b6040516101369190610cd4565b60405180910390f35b6006545b604051908152602001610136565b61017d61015f366004610d04565b6001600160a01b031660009081526007602052604090205460ff1690565b6040519015158152602001610136565b61011461019b366004610d04565b610374565b6101146101ae366004610d04565b610436565b6101146101c1366004610d1f565b6104f4565b610114610568565b6101146101dc366004610d04565b61057c565b6101146101ef366004610d49565b610590565b610114610202366004610d1f565b6105cb565b6101296105f8565b61014361021d366004610d95565b61ffff1660009081526005602052604090205490565b61017d610241366004610d04565b610607565b610114610254366004610d04565b610625565b61017d610267366004610d49565b6106e5565b61011461027a366004610d04565b61072a565b600254610143565b600154610129906001600160a01b031681565b6101146102a8366004610d04565b6107a0565b6102b5610864565b60028190556040518181527f3069f57f08b632d7fceb2be6b7e39522eff2dbd0b4605b5f0ab46c94f1211d8e906020015b60405180910390a150565b60065460009082106103465760405162461bcd60e51b81526020600482015260196024820152781cda185c995a1bdb19195c88191bd95cdb89dd08195e1a5cdd603a1b60448201526064015b60405180910390fd5b6006828154811061035957610359610db2565b6000918252602090912001546001600160a01b031692915050565b61037c610864565b6001600160a01b03811660009081526008602052604090205460ff16156103e35760405162461bcd60e51b815260206004820152601b60248201527a151a1a5cc81d1bdad95b881a5cc8185b1c9958591e48189bdd5b99602a1b604482015260640161033d565b6001600160a01b03811660009081526008602052604090819020805460ff19166001179055517f2de35142b19ed5a07796cf30791959c592018f70b1d2d7c460eef8ffe713692b906102e6908390610cd4565b61043e610864565b6001600160a01b03811660009081526008602052604090205460ff166104a45760405162461bcd60e51b815260206004820152601b60248201527a151a1a5cc81d1bdad95b881a5cc81b9bdd08189bdd5b99081e595d602a1b604482015260640161033d565b6001600160a01b03811660009081526008602052604090819020805460ff19169055517f28a4ca7134a3b3f9aff286e79ad3daadb4a06d1b43d037a3a98bdc074edd9b7a906102e6908390610cd4565b6104fc6108c3565b6105185760405162461bcd60e51b815260040161033d90610dc8565b6000811161055b5760405162461bcd60e51b815260206004820152601060248201526f139bc81d1bdad95b8818dc99585d195960821b604482015260640161033d565b610564826108d3565b5050565b610570610864565b61057a60006109e4565b565b610584610864565b61058d8161072a565b50565b6105986108c3565b6105b45760405162461bcd60e51b815260040161033d90610dc8565b6105bd826108d3565b6105c683610a34565b505050565b6105d36108c3565b6105ef5760405162461bcd60e51b815260040161033d90610dc8565b61056482610a34565b6000546001600160a01b031690565b6001600160a01b031660009081526008602052604090205460ff1690565b61062d610864565b6001600160a01b03811660009081526007602052604090205460ff166106955760405162461bcd60e51b815260206004820181905260248201527f54686973204167656e74206973206e6f74207265676973746572656420796574604482015260640161033d565b6001600160a01b03811660009081526007602052604090819020805460ff19169055517f6a659bb87bb23efbdc295f8eed8ae8c4379bfb77660ced2ef0f3d7d26b05c6a6906102e6908390610cd4565b6001600160a01b0382166000908152600460205260408120541561070b57506001610723565b600254600654101561071f57506001610723565b5060005b9392505050565b610732610864565b6001600160a01b0381166107975760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161033d565b61058d816109e4565b6107a8610864565b6001600160a01b03811660009081526007602052604090205460ff16156108115760405162461bcd60e51b815260206004820181905260248201527f54686973204167656e7420697320616c72656164792072656769737465726564604482015260640161033d565b6001600160a01b03811660009081526007602052604090819020805460ff19166001179055517fd62c45e13ac30396aceb3ad37c89bd1ba9048032fe61679000e92eb93dbfd67d906102e6908390610cd4565b3361086d6105f8565b6001600160a01b03161461057a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161033d565b60006108ce33610607565b905090565b6001600160a01b038116600090815260046020526040812054900361058d57600680546001810182557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0384811691821790925591546000928352600460208190526040808520929092556003549151637e42683b60e01b81529190921691637e42683b9161097891869101610cd4565b602060405180830381865afa158015610995573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b99190610e32565b61ffff811660009081526005602052604081208054929350906109db83610e65565b91905055505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381166000908152600460205260408120549003610a985760405162461bcd60e51b815260206004820152601a60248201527914da185c995a1bdb19195c88191bd95cc81b9bdd08195e1a5cdd60321b604482015260640161033d565b6001546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610ac9908590600401610cd4565b602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190610e7e565b90508015610b16575050565b6001600160a01b038216600090815260046020526040812054610b3b90600190610e97565b600654909150600090610b5090600190610e97565b9050600060068281548110610b6757610b67610db2565b600091825260209091200154600680546001600160a01b039092169250829185908110610b9657610b96610db2565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905587831682526004905260408082205492841682529020556006805480610be657610be6610eb0565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03878116835260049182905260408084208490556003549051637e42683b60e01b8152911691637e42683b91610c4b918a9101610cd4565b602060405180830381865afa158015610c68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8c9190610e32565b61ffff81166000908152600560205260408120805492935090610cae83610ec6565b9190505550505050505050565b600060208284031215610ccd57600080fd5b5035919050565b6001600160a01b0391909116815260200190565b80356001600160a01b0381168114610cff57600080fd5b919050565b600060208284031215610d1657600080fd5b61072382610ce8565b60008060408385031215610d3257600080fd5b610d3b83610ce8565b946020939093013593505050565b600080600060608486031215610d5e57600080fd5b610d6784610ce8565b9250610d7560208501610ce8565b9150604084013590509250925092565b61ffff8116811461058d57600080fd5b600060208284031215610da757600080fd5b813561072381610d85565b634e487b7160e01b600052603260045260246000fd5b60208082526044908201527f6572726f72203a20746869732061646472657373206973206e6f74206120746f60408201527f6b656e20626f756e6420746f2074686520636f6d706c69616e636520636f6e746060820152631c9858dd60e21b608082015260a00190565b600060208284031215610e4457600080fd5b815161072381610d85565b634e487b7160e01b600052601160045260246000fd5b600060018201610e7757610e77610e4f565b5060010190565b600060208284031215610e9057600080fd5b5051919050565b81810381811115610eaa57610eaa610e4f565b92915050565b634e487b7160e01b600052603160045260246000fd5b600081610ed557610ed5610e4f565b50600019019056fea2646970667358221220775f566c67450d8adda802079b0c2b30491293d83593f2d132fec89d5271242764736f6c63430008110033",
  "immutableReferences": {},
  "generatedSources": [
    {
      "ast": {
        "nodeType": "YulBlock",
        "src": "0:928:54",
        "statements": [
          {
            "nodeType": "YulBlock",
            "src": "6:3:54",
            "statements": []
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "59:86:54",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "123:16:54",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "132:1:54",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "135:1:54",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "125:6:54"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "125:12:54"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "125:12:54"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "value",
                            "nodeType": "YulIdentifier",
                            "src": "82:5:54"
                          },
                          {
                            "arguments": [
                              {
                                "name": "value",
                                "nodeType": "YulIdentifier",
                                "src": "93:5:54"
                              },
                              {
                                "arguments": [
                                  {
                                    "arguments": [
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "108:3:54",
                                        "type": "",
                                        "value": "160"
                                      },
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "113:1:54",
                                        "type": "",
                                        "value": "1"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "shl",
                                      "nodeType": "YulIdentifier",
                                      "src": "104:3:54"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "104:11:54"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "117:1:54",
                                    "type": "",
                                    "value": "1"
                                  }
                                ],
                                "functionName": {
                                  "name": "sub",
                                  "nodeType": "YulIdentifier",
                                  "src": "100:3:54"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "100:19:54"
                              }
                            ],
                            "functionName": {
                              "name": "and",
                              "nodeType": "YulIdentifier",
                              "src": "89:3:54"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "89:31:54"
                          }
                        ],
                        "functionName": {
                          "name": "eq",
                          "nodeType": "YulIdentifier",
                          "src": "79:2:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "79:42:54"
                      }
                    ],
                    "functionName": {
                      "name": "iszero",
                      "nodeType": "YulIdentifier",
                      "src": "72:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "72:50:54"
                  },
                  "nodeType": "YulIf",
                  "src": "69:70:54"
                }
              ]
            },
            "name": "validator_revert_address",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "value",
                "nodeType": "YulTypedName",
                "src": "48:5:54",
                "type": ""
              }
            ],
            "src": "14:131:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "248:214:54",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "294:16:54",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "303:1:54",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "306:1:54",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "296:6:54"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "296:12:54"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "296:12:54"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "dataEnd",
                            "nodeType": "YulIdentifier",
                            "src": "269:7:54"
                          },
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "278:9:54"
                          }
                        ],
                        "functionName": {
                          "name": "sub",
                          "nodeType": "YulIdentifier",
                          "src": "265:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "265:23:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "290:2:54",
                        "type": "",
                        "value": "64"
                      }
                    ],
                    "functionName": {
                      "name": "slt",
                      "nodeType": "YulIdentifier",
                      "src": "261:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "261:32:54"
                  },
                  "nodeType": "YulIf",
                  "src": "258:52:54"
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "319:29:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "338:9:54"
                      }
                    ],
                    "functionName": {
                      "name": "mload",
                      "nodeType": "YulIdentifier",
                      "src": "332:5:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "332:16:54"
                  },
                  "variables": [
                    {
                      "name": "value",
                      "nodeType": "YulTypedName",
                      "src": "323:5:54",
                      "type": ""
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "value",
                        "nodeType": "YulIdentifier",
                        "src": "382:5:54"
                      }
                    ],
                    "functionName": {
                      "name": "validator_revert_address",
                      "nodeType": "YulIdentifier",
                      "src": "357:24:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "357:31:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "357:31:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "397:15:54",
                  "value": {
                    "name": "value",
                    "nodeType": "YulIdentifier",
                    "src": "407:5:54"
                  },
                  "variableNames": [
                    {
                      "name": "value0",
                      "nodeType": "YulIdentifier",
                      "src": "397:6:54"
                    }
                  ]
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "421:35:54",
                  "value": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "441:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "452:2:54",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "437:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "437:18:54"
                      }
                    ],
                    "functionName": {
                      "name": "mload",
                      "nodeType": "YulIdentifier",
                      "src": "431:5:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "431:25:54"
                  },
                  "variableNames": [
                    {
                      "name": "value1",
                      "nodeType": "YulIdentifier",
                      "src": "421:6:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_decode_tuple_t_addresst_uint256_fromMemory",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "206:9:54",
                "type": ""
              },
              {
                "name": "dataEnd",
                "nodeType": "YulTypedName",
                "src": "217:7:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "229:6:54",
                "type": ""
              },
              {
                "name": "value1",
                "nodeType": "YulTypedName",
                "src": "237:6:54",
                "type": ""
              }
            ],
            "src": "150:312:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "574:170:54",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "620:16:54",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "629:1:54",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "632:1:54",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "622:6:54"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "622:12:54"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "622:12:54"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "dataEnd",
                            "nodeType": "YulIdentifier",
                            "src": "595:7:54"
                          },
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "604:9:54"
                          }
                        ],
                        "functionName": {
                          "name": "sub",
                          "nodeType": "YulIdentifier",
                          "src": "591:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "591:23:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "616:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "slt",
                      "nodeType": "YulIdentifier",
                      "src": "587:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "587:32:54"
                  },
                  "nodeType": "YulIf",
                  "src": "584:52:54"
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "645:29:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "664:9:54"
                      }
                    ],
                    "functionName": {
                      "name": "mload",
                      "nodeType": "YulIdentifier",
                      "src": "658:5:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "658:16:54"
                  },
                  "variables": [
                    {
                      "name": "value",
                      "nodeType": "YulTypedName",
                      "src": "649:5:54",
                      "type": ""
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "value",
                        "nodeType": "YulIdentifier",
                        "src": "708:5:54"
                      }
                    ],
                    "functionName": {
                      "name": "validator_revert_address",
                      "nodeType": "YulIdentifier",
                      "src": "683:24:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "683:31:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "683:31:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "723:15:54",
                  "value": {
                    "name": "value",
                    "nodeType": "YulIdentifier",
                    "src": "733:5:54"
                  },
                  "variableNames": [
                    {
                      "name": "value0",
                      "nodeType": "YulIdentifier",
                      "src": "723:6:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_decode_tuple_t_contract$_IIdentityRegistry_$6637_fromMemory",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "540:9:54",
                "type": ""
              },
              {
                "name": "dataEnd",
                "nodeType": "YulTypedName",
                "src": "551:7:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "563:6:54",
                "type": ""
              }
            ],
            "src": "467:277:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "850:76:54",
              "statements": [
                {
                  "nodeType": "YulAssignment",
                  "src": "860:26:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "872:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "883:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "868:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "868:18:54"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "860:4:54"
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "902:9:54"
                      },
                      {
                        "name": "value0",
                        "nodeType": "YulIdentifier",
                        "src": "913:6:54"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "895:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "895:25:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "895:25:54"
                }
              ]
            },
            "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "819:9:54",
                "type": ""
              },
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "830:6:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "841:4:54",
                "type": ""
              }
            ],
            "src": "749:177:54"
          }
        ]
      },
      "contents": "{\n    { }\n    function validator_revert_address(value)\n    {\n        if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n    }\n    function abi_decode_tuple_t_addresst_uint256_fromMemory(headStart, dataEnd) -> value0, value1\n    {\n        if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n        let value := mload(headStart)\n        validator_revert_address(value)\n        value0 := value\n        value1 := mload(add(headStart, 32))\n    }\n    function abi_decode_tuple_t_contract$_IIdentityRegistry_$6637_fromMemory(headStart, dataEnd) -> value0\n    {\n        if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n        let value := mload(headStart)\n        validator_revert_address(value)\n        value0 := value\n    }\n    function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n    {\n        tail := add(headStart, 32)\n        mstore(headStart, value0)\n    }\n}",
      "id": 54,
      "language": "Yul",
      "name": "#utility.yul"
    }
  ],
  "deployedGeneratedSources": [
    {
      "ast": {
        "nodeType": "YulBlock",
        "src": "0:7321:54",
        "statements": [
          {
            "nodeType": "YulBlock",
            "src": "6:3:54",
            "statements": []
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "84:110:54",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "130:16:54",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "139:1:54",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "142:1:54",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "132:6:54"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "132:12:54"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "132:12:54"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "dataEnd",
                            "nodeType": "YulIdentifier",
                            "src": "105:7:54"
                          },
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "114:9:54"
                          }
                        ],
                        "functionName": {
                          "name": "sub",
                          "nodeType": "YulIdentifier",
                          "src": "101:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "101:23:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "126:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "slt",
                      "nodeType": "YulIdentifier",
                      "src": "97:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "97:32:54"
                  },
                  "nodeType": "YulIf",
                  "src": "94:52:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "155:33:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "178:9:54"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "165:12:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "165:23:54"
                  },
                  "variableNames": [
                    {
                      "name": "value0",
                      "nodeType": "YulIdentifier",
                      "src": "155:6:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_decode_tuple_t_uint256",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "50:9:54",
                "type": ""
              },
              {
                "name": "dataEnd",
                "nodeType": "YulTypedName",
                "src": "61:7:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "73:6:54",
                "type": ""
              }
            ],
            "src": "14:180:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "300:102:54",
              "statements": [
                {
                  "nodeType": "YulAssignment",
                  "src": "310:26:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "322:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "333:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "318:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "318:18:54"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "310:4:54"
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "352:9:54"
                      },
                      {
                        "arguments": [
                          {
                            "name": "value0",
                            "nodeType": "YulIdentifier",
                            "src": "367:6:54"
                          },
                          {
                            "arguments": [
                              {
                                "arguments": [
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "383:3:54",
                                    "type": "",
                                    "value": "160"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "388:1:54",
                                    "type": "",
                                    "value": "1"
                                  }
                                ],
                                "functionName": {
                                  "name": "shl",
                                  "nodeType": "YulIdentifier",
                                  "src": "379:3:54"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "379:11:54"
                              },
                              {
                                "kind": "number",
                                "nodeType": "YulLiteral",
                                "src": "392:1:54",
                                "type": "",
                                "value": "1"
                              }
                            ],
                            "functionName": {
                              "name": "sub",
                              "nodeType": "YulIdentifier",
                              "src": "375:3:54"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "375:19:54"
                          }
                        ],
                        "functionName": {
                          "name": "and",
                          "nodeType": "YulIdentifier",
                          "src": "363:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "363:32:54"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "345:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "345:51:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "345:51:54"
                }
              ]
            },
            "name": "abi_encode_tuple_t_address__to_t_address__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "269:9:54",
                "type": ""
              },
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "280:6:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "291:4:54",
                "type": ""
              }
            ],
            "src": "199:203:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "508:76:54",
              "statements": [
                {
                  "nodeType": "YulAssignment",
                  "src": "518:26:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "530:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "541:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "526:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "526:18:54"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "518:4:54"
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "560:9:54"
                      },
                      {
                        "name": "value0",
                        "nodeType": "YulIdentifier",
                        "src": "571:6:54"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "553:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "553:25:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "553:25:54"
                }
              ]
            },
            "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "477:9:54",
                "type": ""
              },
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "488:6:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "499:4:54",
                "type": ""
              }
            ],
            "src": "407:177:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "638:124:54",
              "statements": [
                {
                  "nodeType": "YulAssignment",
                  "src": "648:29:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "offset",
                        "nodeType": "YulIdentifier",
                        "src": "670:6:54"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "657:12:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "657:20:54"
                  },
                  "variableNames": [
                    {
                      "name": "value",
                      "nodeType": "YulIdentifier",
                      "src": "648:5:54"
                    }
                  ]
                },
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "740:16:54",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "749:1:54",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "752:1:54",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "742:6:54"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "742:12:54"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "742:12:54"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "value",
                            "nodeType": "YulIdentifier",
                            "src": "699:5:54"
                          },
                          {
                            "arguments": [
                              {
                                "name": "value",
                                "nodeType": "YulIdentifier",
                                "src": "710:5:54"
                              },
                              {
                                "arguments": [
                                  {
                                    "arguments": [
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "725:3:54",
                                        "type": "",
                                        "value": "160"
                                      },
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "730:1:54",
                                        "type": "",
                                        "value": "1"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "shl",
                                      "nodeType": "YulIdentifier",
                                      "src": "721:3:54"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "721:11:54"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "734:1:54",
                                    "type": "",
                                    "value": "1"
                                  }
                                ],
                                "functionName": {
                                  "name": "sub",
                                  "nodeType": "YulIdentifier",
                                  "src": "717:3:54"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "717:19:54"
                              }
                            ],
                            "functionName": {
                              "name": "and",
                              "nodeType": "YulIdentifier",
                              "src": "706:3:54"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "706:31:54"
                          }
                        ],
                        "functionName": {
                          "name": "eq",
                          "nodeType": "YulIdentifier",
                          "src": "696:2:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "696:42:54"
                      }
                    ],
                    "functionName": {
                      "name": "iszero",
                      "nodeType": "YulIdentifier",
                      "src": "689:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "689:50:54"
                  },
                  "nodeType": "YulIf",
                  "src": "686:70:54"
                }
              ]
            },
            "name": "abi_decode_address",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "offset",
                "nodeType": "YulTypedName",
                "src": "617:6:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value",
                "nodeType": "YulTypedName",
                "src": "628:5:54",
                "type": ""
              }
            ],
            "src": "589:173:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "837:116:54",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "883:16:54",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "892:1:54",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "895:1:54",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "885:6:54"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "885:12:54"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "885:12:54"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "dataEnd",
                            "nodeType": "YulIdentifier",
                            "src": "858:7:54"
                          },
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "867:9:54"
                          }
                        ],
                        "functionName": {
                          "name": "sub",
                          "nodeType": "YulIdentifier",
                          "src": "854:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "854:23:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "879:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "slt",
                      "nodeType": "YulIdentifier",
                      "src": "850:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "850:32:54"
                  },
                  "nodeType": "YulIf",
                  "src": "847:52:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "908:39:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "937:9:54"
                      }
                    ],
                    "functionName": {
                      "name": "abi_decode_address",
                      "nodeType": "YulIdentifier",
                      "src": "918:18:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "918:29:54"
                  },
                  "variableNames": [
                    {
                      "name": "value0",
                      "nodeType": "YulIdentifier",
                      "src": "908:6:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_decode_tuple_t_address",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "803:9:54",
                "type": ""
              },
              {
                "name": "dataEnd",
                "nodeType": "YulTypedName",
                "src": "814:7:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "826:6:54",
                "type": ""
              }
            ],
            "src": "767:186:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "1053:92:54",
              "statements": [
                {
                  "nodeType": "YulAssignment",
                  "src": "1063:26:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "1075:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "1086:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "1071:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1071:18:54"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "1063:4:54"
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "1105:9:54"
                      },
                      {
                        "arguments": [
                          {
                            "arguments": [
                              {
                                "name": "value0",
                                "nodeType": "YulIdentifier",
                                "src": "1130:6:54"
                              }
                            ],
                            "functionName": {
                              "name": "iszero",
                              "nodeType": "YulIdentifier",
                              "src": "1123:6:54"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "1123:14:54"
                          }
                        ],
                        "functionName": {
                          "name": "iszero",
                          "nodeType": "YulIdentifier",
                          "src": "1116:6:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "1116:22:54"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "1098:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1098:41:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "1098:41:54"
                }
              ]
            },
            "name": "abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "1022:9:54",
                "type": ""
              },
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "1033:6:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "1044:4:54",
                "type": ""
              }
            ],
            "src": "958:187:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "1237:167:54",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "1283:16:54",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1292:1:54",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1295:1:54",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "1285:6:54"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "1285:12:54"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "1285:12:54"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "dataEnd",
                            "nodeType": "YulIdentifier",
                            "src": "1258:7:54"
                          },
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "1267:9:54"
                          }
                        ],
                        "functionName": {
                          "name": "sub",
                          "nodeType": "YulIdentifier",
                          "src": "1254:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "1254:23:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "1279:2:54",
                        "type": "",
                        "value": "64"
                      }
                    ],
                    "functionName": {
                      "name": "slt",
                      "nodeType": "YulIdentifier",
                      "src": "1250:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1250:32:54"
                  },
                  "nodeType": "YulIf",
                  "src": "1247:52:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "1308:39:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "1337:9:54"
                      }
                    ],
                    "functionName": {
                      "name": "abi_decode_address",
                      "nodeType": "YulIdentifier",
                      "src": "1318:18:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1318:29:54"
                  },
                  "variableNames": [
                    {
                      "name": "value0",
                      "nodeType": "YulIdentifier",
                      "src": "1308:6:54"
                    }
                  ]
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "1356:42:54",
                  "value": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "1383:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "1394:2:54",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "1379:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "1379:18:54"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "1366:12:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1366:32:54"
                  },
                  "variableNames": [
                    {
                      "name": "value1",
                      "nodeType": "YulIdentifier",
                      "src": "1356:6:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_decode_tuple_t_addresst_uint256",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "1195:9:54",
                "type": ""
              },
              {
                "name": "dataEnd",
                "nodeType": "YulTypedName",
                "src": "1206:7:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "1218:6:54",
                "type": ""
              },
              {
                "name": "value1",
                "nodeType": "YulTypedName",
                "src": "1226:6:54",
                "type": ""
              }
            ],
            "src": "1150:254:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "1513:224:54",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "1559:16:54",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1568:1:54",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1571:1:54",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "1561:6:54"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "1561:12:54"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "1561:12:54"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "dataEnd",
                            "nodeType": "YulIdentifier",
                            "src": "1534:7:54"
                          },
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "1543:9:54"
                          }
                        ],
                        "functionName": {
                          "name": "sub",
                          "nodeType": "YulIdentifier",
                          "src": "1530:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "1530:23:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "1555:2:54",
                        "type": "",
                        "value": "96"
                      }
                    ],
                    "functionName": {
                      "name": "slt",
                      "nodeType": "YulIdentifier",
                      "src": "1526:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1526:32:54"
                  },
                  "nodeType": "YulIf",
                  "src": "1523:52:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "1584:39:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "1613:9:54"
                      }
                    ],
                    "functionName": {
                      "name": "abi_decode_address",
                      "nodeType": "YulIdentifier",
                      "src": "1594:18:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1594:29:54"
                  },
                  "variableNames": [
                    {
                      "name": "value0",
                      "nodeType": "YulIdentifier",
                      "src": "1584:6:54"
                    }
                  ]
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "1632:48:54",
                  "value": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "1665:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "1676:2:54",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "1661:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "1661:18:54"
                      }
                    ],
                    "functionName": {
                      "name": "abi_decode_address",
                      "nodeType": "YulIdentifier",
                      "src": "1642:18:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1642:38:54"
                  },
                  "variableNames": [
                    {
                      "name": "value1",
                      "nodeType": "YulIdentifier",
                      "src": "1632:6:54"
                    }
                  ]
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "1689:42:54",
                  "value": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "1716:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "1727:2:54",
                            "type": "",
                            "value": "64"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "1712:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "1712:18:54"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "1699:12:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1699:32:54"
                  },
                  "variableNames": [
                    {
                      "name": "value2",
                      "nodeType": "YulIdentifier",
                      "src": "1689:6:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_decode_tuple_t_addresst_addresst_uint256",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "1463:9:54",
                "type": ""
              },
              {
                "name": "dataEnd",
                "nodeType": "YulTypedName",
                "src": "1474:7:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "1486:6:54",
                "type": ""
              },
              {
                "name": "value1",
                "nodeType": "YulTypedName",
                "src": "1494:6:54",
                "type": ""
              },
              {
                "name": "value2",
                "nodeType": "YulTypedName",
                "src": "1502:6:54",
                "type": ""
              }
            ],
            "src": "1409:328:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "1786:73:54",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "1837:16:54",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1846:1:54",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1849:1:54",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "1839:6:54"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "1839:12:54"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "1839:12:54"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "value",
                            "nodeType": "YulIdentifier",
                            "src": "1809:5:54"
                          },
                          {
                            "arguments": [
                              {
                                "name": "value",
                                "nodeType": "YulIdentifier",
                                "src": "1820:5:54"
                              },
                              {
                                "kind": "number",
                                "nodeType": "YulLiteral",
                                "src": "1827:6:54",
                                "type": "",
                                "value": "0xffff"
                              }
                            ],
                            "functionName": {
                              "name": "and",
                              "nodeType": "YulIdentifier",
                              "src": "1816:3:54"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "1816:18:54"
                          }
                        ],
                        "functionName": {
                          "name": "eq",
                          "nodeType": "YulIdentifier",
                          "src": "1806:2:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "1806:29:54"
                      }
                    ],
                    "functionName": {
                      "name": "iszero",
                      "nodeType": "YulIdentifier",
                      "src": "1799:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1799:37:54"
                  },
                  "nodeType": "YulIf",
                  "src": "1796:57:54"
                }
              ]
            },
            "name": "validator_revert_uint16",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "value",
                "nodeType": "YulTypedName",
                "src": "1775:5:54",
                "type": ""
              }
            ],
            "src": "1742:117:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "1933:176:54",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "1979:16:54",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1988:1:54",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "1991:1:54",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "1981:6:54"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "1981:12:54"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "1981:12:54"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "dataEnd",
                            "nodeType": "YulIdentifier",
                            "src": "1954:7:54"
                          },
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "1963:9:54"
                          }
                        ],
                        "functionName": {
                          "name": "sub",
                          "nodeType": "YulIdentifier",
                          "src": "1950:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "1950:23:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "1975:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "slt",
                      "nodeType": "YulIdentifier",
                      "src": "1946:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1946:32:54"
                  },
                  "nodeType": "YulIf",
                  "src": "1943:52:54"
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "2004:36:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "2030:9:54"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "2017:12:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "2017:23:54"
                  },
                  "variables": [
                    {
                      "name": "value",
                      "nodeType": "YulTypedName",
                      "src": "2008:5:54",
                      "type": ""
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "value",
                        "nodeType": "YulIdentifier",
                        "src": "2073:5:54"
                      }
                    ],
                    "functionName": {
                      "name": "validator_revert_uint16",
                      "nodeType": "YulIdentifier",
                      "src": "2049:23:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "2049:30:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "2049:30:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "2088:15:54",
                  "value": {
                    "name": "value",
                    "nodeType": "YulIdentifier",
                    "src": "2098:5:54"
                  },
                  "variableNames": [
                    {
                      "name": "value0",
                      "nodeType": "YulIdentifier",
                      "src": "2088:6:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_decode_tuple_t_uint16",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "1899:9:54",
                "type": ""
              },
              {
                "name": "dataEnd",
                "nodeType": "YulTypedName",
                "src": "1910:7:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "1922:6:54",
                "type": ""
              }
            ],
            "src": "1864:245:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "2231:102:54",
              "statements": [
                {
                  "nodeType": "YulAssignment",
                  "src": "2241:26:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "2253:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "2264:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "2249:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "2249:18:54"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "2241:4:54"
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "2283:9:54"
                      },
                      {
                        "arguments": [
                          {
                            "name": "value0",
                            "nodeType": "YulIdentifier",
                            "src": "2298:6:54"
                          },
                          {
                            "arguments": [
                              {
                                "arguments": [
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "2314:3:54",
                                    "type": "",
                                    "value": "160"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "2319:1:54",
                                    "type": "",
                                    "value": "1"
                                  }
                                ],
                                "functionName": {
                                  "name": "shl",
                                  "nodeType": "YulIdentifier",
                                  "src": "2310:3:54"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "2310:11:54"
                              },
                              {
                                "kind": "number",
                                "nodeType": "YulLiteral",
                                "src": "2323:1:54",
                                "type": "",
                                "value": "1"
                              }
                            ],
                            "functionName": {
                              "name": "sub",
                              "nodeType": "YulIdentifier",
                              "src": "2306:3:54"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "2306:19:54"
                          }
                        ],
                        "functionName": {
                          "name": "and",
                          "nodeType": "YulIdentifier",
                          "src": "2294:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "2294:32:54"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "2276:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "2276:51:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "2276:51:54"
                }
              ]
            },
            "name": "abi_encode_tuple_t_contract$_IToken_$12234__to_t_address__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "2200:9:54",
                "type": ""
              },
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "2211:6:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "2222:4:54",
                "type": ""
              }
            ],
            "src": "2114:219:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "2512:175:54",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "2529:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "2540:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "2522:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "2522:21:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "2522:21:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "2563:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "2574:2:54",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "2559:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "2559:18:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "2579:2:54",
                        "type": "",
                        "value": "25"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "2552:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "2552:30:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "2552:30:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "2602:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "2613:2:54",
                            "type": "",
                            "value": "64"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "2598:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "2598:18:54"
                      },
                      {
                        "hexValue": "7368617265686f6c64657220646f65736e2774206578697374",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "2618:27:54",
                        "type": "",
                        "value": "shareholder doesn't exist"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "2591:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "2591:55:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "2591:55:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "2655:26:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "2667:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "2678:2:54",
                        "type": "",
                        "value": "96"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "2663:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "2663:18:54"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "2655:4:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_encode_tuple_t_stringliteral_805273123fce6ffb542e2f434a5720f01c486c754f17da061e48944dbe289a31__to_t_string_memory_ptr__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "2489:9:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "2503:4:54",
                "type": ""
              }
            ],
            "src": "2338:349:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "2724:95:54",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "2741:1:54",
                        "type": "",
                        "value": "0"
                      },
                      {
                        "arguments": [
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "2748:3:54",
                            "type": "",
                            "value": "224"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "2753:10:54",
                            "type": "",
                            "value": "0x4e487b71"
                          }
                        ],
                        "functionName": {
                          "name": "shl",
                          "nodeType": "YulIdentifier",
                          "src": "2744:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "2744:20:54"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "2734:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "2734:31:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "2734:31:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "2781:1:54",
                        "type": "",
                        "value": "4"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "2784:4:54",
                        "type": "",
                        "value": "0x32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "2774:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "2774:15:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "2774:15:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "2805:1:54",
                        "type": "",
                        "value": "0"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "2808:4:54",
                        "type": "",
                        "value": "0x24"
                      }
                    ],
                    "functionName": {
                      "name": "revert",
                      "nodeType": "YulIdentifier",
                      "src": "2798:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "2798:15:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "2798:15:54"
                }
              ]
            },
            "name": "panic_error_0x32",
            "nodeType": "YulFunctionDefinition",
            "src": "2692:127:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "2998:177:54",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "3015:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "3026:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "3008:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3008:21:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "3008:21:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "3049:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "3060:2:54",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "3045:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "3045:18:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "3065:2:54",
                        "type": "",
                        "value": "27"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "3038:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3038:30:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "3038:30:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "3088:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "3099:2:54",
                            "type": "",
                            "value": "64"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "3084:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "3084:18:54"
                      },
                      {
                        "hexValue": "5468697320746f6b656e20697320616c726561647920626f756e64",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "3104:29:54",
                        "type": "",
                        "value": "This token is already bound"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "3077:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3077:57:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "3077:57:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "3143:26:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "3155:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "3166:2:54",
                        "type": "",
                        "value": "96"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "3151:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3151:18:54"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "3143:4:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_encode_tuple_t_stringliteral_8d624724abe04cec2c9dea2aa97d440b8d5ae1d5bee60672fd7f8561ed33045c__to_t_string_memory_ptr__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "2975:9:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "2989:4:54",
                "type": ""
              }
            ],
            "src": "2824:351:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "3354:177:54",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "3371:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "3382:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "3364:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3364:21:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "3364:21:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "3405:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "3416:2:54",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "3401:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "3401:18:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "3421:2:54",
                        "type": "",
                        "value": "27"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "3394:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3394:30:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "3394:30:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "3444:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "3455:2:54",
                            "type": "",
                            "value": "64"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "3440:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "3440:18:54"
                      },
                      {
                        "hexValue": "5468697320746f6b656e206973206e6f7420626f756e6420796574",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "3460:29:54",
                        "type": "",
                        "value": "This token is not bound yet"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "3433:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3433:57:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "3433:57:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "3499:26:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "3511:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "3522:2:54",
                        "type": "",
                        "value": "96"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "3507:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3507:18:54"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "3499:4:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_encode_tuple_t_stringliteral_3a32dea6d728f3e51c5acf0744a2444ea4633c5416095bb4680eff562369b243__to_t_string_memory_ptr__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "3331:9:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "3345:4:54",
                "type": ""
              }
            ],
            "src": "3180:351:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "3710:298:54",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "3727:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "3738:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "3720:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3720:21:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "3720:21:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "3761:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "3772:2:54",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "3757:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "3757:18:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "3777:2:54",
                        "type": "",
                        "value": "68"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "3750:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3750:30:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "3750:30:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "3800:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "3811:2:54",
                            "type": "",
                            "value": "64"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "3796:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "3796:18:54"
                      },
                      {
                        "hexValue": "6572726f72203a20746869732061646472657373206973206e6f74206120746f",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "3816:34:54",
                        "type": "",
                        "value": "error : this address is not a to"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "3789:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3789:62:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "3789:62:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "3871:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "3882:2:54",
                            "type": "",
                            "value": "96"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "3867:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "3867:18:54"
                      },
                      {
                        "hexValue": "6b656e20626f756e6420746f2074686520636f6d706c69616e636520636f6e74",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "3887:34:54",
                        "type": "",
                        "value": "ken bound to the compliance cont"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "3860:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3860:62:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "3860:62:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "3942:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "3953:3:54",
                            "type": "",
                            "value": "128"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "3938:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "3938:19:54"
                      },
                      {
                        "hexValue": "72616374",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "3959:6:54",
                        "type": "",
                        "value": "ract"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "3931:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3931:35:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "3931:35:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "3975:27:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "3987:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "3998:3:54",
                        "type": "",
                        "value": "160"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "3983:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "3983:19:54"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "3975:4:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_encode_tuple_t_stringliteral_5a68ed2bc0002f6d7777b41be5e0fbfbfe715cdad34adee170beb7e99ea964f1__to_t_string_memory_ptr__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "3687:9:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "3701:4:54",
                "type": ""
              }
            ],
            "src": "3536:472:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "4187:166:54",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "4204:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "4215:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "4197:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "4197:21:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "4197:21:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "4238:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "4249:2:54",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "4234:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "4234:18:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "4254:2:54",
                        "type": "",
                        "value": "16"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "4227:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "4227:30:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "4227:30:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "4277:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "4288:2:54",
                            "type": "",
                            "value": "64"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "4273:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "4273:18:54"
                      },
                      {
                        "hexValue": "4e6f20746f6b656e2063726561746564",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "4293:18:54",
                        "type": "",
                        "value": "No token created"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "4266:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "4266:46:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "4266:46:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "4321:26:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "4333:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "4344:2:54",
                        "type": "",
                        "value": "96"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "4329:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "4329:18:54"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "4321:4:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_encode_tuple_t_stringliteral_66eeaba3418ac6b87b03d31af59bc39ad8fee7233b46f609a69227f2bc78bbf0__to_t_string_memory_ptr__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "4164:9:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "4178:4:54",
                "type": ""
              }
            ],
            "src": "4013:340:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "4532:182:54",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "4549:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "4560:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "4542:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "4542:21:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "4542:21:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "4583:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "4594:2:54",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "4579:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "4579:18:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "4599:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "4572:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "4572:30:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "4572:30:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "4622:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "4633:2:54",
                            "type": "",
                            "value": "64"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "4618:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "4618:18:54"
                      },
                      {
                        "hexValue": "54686973204167656e74206973206e6f74207265676973746572656420796574",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "4638:34:54",
                        "type": "",
                        "value": "This Agent is not registered yet"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "4611:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "4611:62:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "4611:62:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "4682:26:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "4694:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "4705:2:54",
                        "type": "",
                        "value": "96"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "4690:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "4690:18:54"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "4682:4:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_encode_tuple_t_stringliteral_38bfff34683fb8fd7d13833d348fcfd97f4e4308582363f470fc6498e3ad489c__to_t_string_memory_ptr__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "4509:9:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "4523:4:54",
                "type": ""
              }
            ],
            "src": "4358:356:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "4893:228:54",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "4910:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "4921:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "4903:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "4903:21:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "4903:21:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "4944:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "4955:2:54",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "4940:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "4940:18:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "4960:2:54",
                        "type": "",
                        "value": "38"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "4933:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "4933:30:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "4933:30:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "4983:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "4994:2:54",
                            "type": "",
                            "value": "64"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "4979:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "4979:18:54"
                      },
                      {
                        "hexValue": "4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "4999:34:54",
                        "type": "",
                        "value": "Ownable: new owner is the zero a"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "4972:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "4972:62:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "4972:62:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "5054:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "5065:2:54",
                            "type": "",
                            "value": "96"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "5050:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "5050:18:54"
                      },
                      {
                        "hexValue": "646472657373",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "5070:8:54",
                        "type": "",
                        "value": "ddress"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "5043:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5043:36:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "5043:36:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "5088:27:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "5100:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "5111:3:54",
                        "type": "",
                        "value": "128"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "5096:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5096:19:54"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "5088:4:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "4870:9:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "4884:4:54",
                "type": ""
              }
            ],
            "src": "4719:402:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "5300:182:54",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "5317:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "5328:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "5310:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5310:21:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "5310:21:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "5351:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "5362:2:54",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "5347:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "5347:18:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "5367:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "5340:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5340:30:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "5340:30:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "5390:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "5401:2:54",
                            "type": "",
                            "value": "64"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "5386:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "5386:18:54"
                      },
                      {
                        "hexValue": "54686973204167656e7420697320616c72656164792072656769737465726564",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "5406:34:54",
                        "type": "",
                        "value": "This Agent is already registered"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "5379:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5379:62:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "5379:62:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "5450:26:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "5462:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "5473:2:54",
                        "type": "",
                        "value": "96"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "5458:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5458:18:54"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "5450:4:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_encode_tuple_t_stringliteral_94e04ceb3646f4f8dc1e8519090d5e6cbdbc2153be960a40dcab924db6e7024c__to_t_string_memory_ptr__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "5277:9:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "5291:4:54",
                "type": ""
              }
            ],
            "src": "5126:356:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "5661:182:54",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "5678:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "5689:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "5671:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5671:21:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "5671:21:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "5712:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "5723:2:54",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "5708:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "5708:18:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "5728:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "5701:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5701:30:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "5701:30:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "5751:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "5762:2:54",
                            "type": "",
                            "value": "64"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "5747:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "5747:18:54"
                      },
                      {
                        "hexValue": "4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "5767:34:54",
                        "type": "",
                        "value": "Ownable: caller is not the owner"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "5740:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5740:62:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "5740:62:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "5811:26:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "5823:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "5834:2:54",
                        "type": "",
                        "value": "96"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "5819:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5819:18:54"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "5811:4:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "5638:9:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "5652:4:54",
                "type": ""
              }
            ],
            "src": "5487:356:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "5928:169:54",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "5974:16:54",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "5983:1:54",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "5986:1:54",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "5976:6:54"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "5976:12:54"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "5976:12:54"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "dataEnd",
                            "nodeType": "YulIdentifier",
                            "src": "5949:7:54"
                          },
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "5958:9:54"
                          }
                        ],
                        "functionName": {
                          "name": "sub",
                          "nodeType": "YulIdentifier",
                          "src": "5945:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "5945:23:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "5970:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "slt",
                      "nodeType": "YulIdentifier",
                      "src": "5941:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "5941:32:54"
                  },
                  "nodeType": "YulIf",
                  "src": "5938:52:54"
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "5999:29:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "6018:9:54"
                      }
                    ],
                    "functionName": {
                      "name": "mload",
                      "nodeType": "YulIdentifier",
                      "src": "6012:5:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6012:16:54"
                  },
                  "variables": [
                    {
                      "name": "value",
                      "nodeType": "YulTypedName",
                      "src": "6003:5:54",
                      "type": ""
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "value",
                        "nodeType": "YulIdentifier",
                        "src": "6061:5:54"
                      }
                    ],
                    "functionName": {
                      "name": "validator_revert_uint16",
                      "nodeType": "YulIdentifier",
                      "src": "6037:23:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6037:30:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "6037:30:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "6076:15:54",
                  "value": {
                    "name": "value",
                    "nodeType": "YulIdentifier",
                    "src": "6086:5:54"
                  },
                  "variableNames": [
                    {
                      "name": "value0",
                      "nodeType": "YulIdentifier",
                      "src": "6076:6:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_decode_tuple_t_uint16_fromMemory",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "5894:9:54",
                "type": ""
              },
              {
                "name": "dataEnd",
                "nodeType": "YulTypedName",
                "src": "5905:7:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "5917:6:54",
                "type": ""
              }
            ],
            "src": "5848:249:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "6134:95:54",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "6151:1:54",
                        "type": "",
                        "value": "0"
                      },
                      {
                        "arguments": [
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "6158:3:54",
                            "type": "",
                            "value": "224"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "6163:10:54",
                            "type": "",
                            "value": "0x4e487b71"
                          }
                        ],
                        "functionName": {
                          "name": "shl",
                          "nodeType": "YulIdentifier",
                          "src": "6154:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "6154:20:54"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "6144:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6144:31:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "6144:31:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "6191:1:54",
                        "type": "",
                        "value": "4"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "6194:4:54",
                        "type": "",
                        "value": "0x11"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "6184:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6184:15:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "6184:15:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "6215:1:54",
                        "type": "",
                        "value": "0"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "6218:4:54",
                        "type": "",
                        "value": "0x24"
                      }
                    ],
                    "functionName": {
                      "name": "revert",
                      "nodeType": "YulIdentifier",
                      "src": "6208:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6208:15:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "6208:15:54"
                }
              ]
            },
            "name": "panic_error_0x11",
            "nodeType": "YulFunctionDefinition",
            "src": "6102:127:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "6281:88:54",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "6312:22:54",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [],
                          "functionName": {
                            "name": "panic_error_0x11",
                            "nodeType": "YulIdentifier",
                            "src": "6314:16:54"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "6314:18:54"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "6314:18:54"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "name": "value",
                        "nodeType": "YulIdentifier",
                        "src": "6297:5:54"
                      },
                      {
                        "arguments": [
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "6308:1:54",
                            "type": "",
                            "value": "0"
                          }
                        ],
                        "functionName": {
                          "name": "not",
                          "nodeType": "YulIdentifier",
                          "src": "6304:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "6304:6:54"
                      }
                    ],
                    "functionName": {
                      "name": "eq",
                      "nodeType": "YulIdentifier",
                      "src": "6294:2:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6294:17:54"
                  },
                  "nodeType": "YulIf",
                  "src": "6291:43:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "6343:20:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "value",
                        "nodeType": "YulIdentifier",
                        "src": "6354:5:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "6361:1:54",
                        "type": "",
                        "value": "1"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "6350:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6350:13:54"
                  },
                  "variableNames": [
                    {
                      "name": "ret",
                      "nodeType": "YulIdentifier",
                      "src": "6343:3:54"
                    }
                  ]
                }
              ]
            },
            "name": "increment_t_uint256",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "value",
                "nodeType": "YulTypedName",
                "src": "6263:5:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "ret",
                "nodeType": "YulTypedName",
                "src": "6273:3:54",
                "type": ""
              }
            ],
            "src": "6234:135:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "6548:176:54",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "6565:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "6576:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "6558:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6558:21:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "6558:21:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "6599:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "6610:2:54",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "6595:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "6595:18:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "6615:2:54",
                        "type": "",
                        "value": "26"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "6588:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6588:30:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "6588:30:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "6638:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "6649:2:54",
                            "type": "",
                            "value": "64"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "6634:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "6634:18:54"
                      },
                      {
                        "hexValue": "5368617265686f6c64657220646f6573206e6f74206578697374",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "6654:28:54",
                        "type": "",
                        "value": "Shareholder does not exist"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "6627:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6627:56:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "6627:56:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "6692:26:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "6704:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "6715:2:54",
                        "type": "",
                        "value": "96"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "6700:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6700:18:54"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "6692:4:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_encode_tuple_t_stringliteral_afef0e4e29dc4da50f79fba698ab471b1022ded6f23517fe8d324cc091b72861__to_t_string_memory_ptr__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "6525:9:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "6539:4:54",
                "type": ""
              }
            ],
            "src": "6374:350:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "6810:103:54",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "6856:16:54",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "6865:1:54",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "6868:1:54",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "6858:6:54"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "6858:12:54"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "6858:12:54"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "dataEnd",
                            "nodeType": "YulIdentifier",
                            "src": "6831:7:54"
                          },
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "6840:9:54"
                          }
                        ],
                        "functionName": {
                          "name": "sub",
                          "nodeType": "YulIdentifier",
                          "src": "6827:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "6827:23:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "6852:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "slt",
                      "nodeType": "YulIdentifier",
                      "src": "6823:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6823:32:54"
                  },
                  "nodeType": "YulIf",
                  "src": "6820:52:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "6881:26:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "6897:9:54"
                      }
                    ],
                    "functionName": {
                      "name": "mload",
                      "nodeType": "YulIdentifier",
                      "src": "6891:5:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6891:16:54"
                  },
                  "variableNames": [
                    {
                      "name": "value0",
                      "nodeType": "YulIdentifier",
                      "src": "6881:6:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_decode_tuple_t_uint256_fromMemory",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "6776:9:54",
                "type": ""
              },
              {
                "name": "dataEnd",
                "nodeType": "YulTypedName",
                "src": "6787:7:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "6799:6:54",
                "type": ""
              }
            ],
            "src": "6729:184:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "6967:79:54",
              "statements": [
                {
                  "nodeType": "YulAssignment",
                  "src": "6977:17:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "x",
                        "nodeType": "YulIdentifier",
                        "src": "6989:1:54"
                      },
                      {
                        "name": "y",
                        "nodeType": "YulIdentifier",
                        "src": "6992:1:54"
                      }
                    ],
                    "functionName": {
                      "name": "sub",
                      "nodeType": "YulIdentifier",
                      "src": "6985:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "6985:9:54"
                  },
                  "variableNames": [
                    {
                      "name": "diff",
                      "nodeType": "YulIdentifier",
                      "src": "6977:4:54"
                    }
                  ]
                },
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "7018:22:54",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [],
                          "functionName": {
                            "name": "panic_error_0x11",
                            "nodeType": "YulIdentifier",
                            "src": "7020:16:54"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "7020:18:54"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "7020:18:54"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "name": "diff",
                        "nodeType": "YulIdentifier",
                        "src": "7009:4:54"
                      },
                      {
                        "name": "x",
                        "nodeType": "YulIdentifier",
                        "src": "7015:1:54"
                      }
                    ],
                    "functionName": {
                      "name": "gt",
                      "nodeType": "YulIdentifier",
                      "src": "7006:2:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "7006:11:54"
                  },
                  "nodeType": "YulIf",
                  "src": "7003:37:54"
                }
              ]
            },
            "name": "checked_sub_t_uint256",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "x",
                "nodeType": "YulTypedName",
                "src": "6949:1:54",
                "type": ""
              },
              {
                "name": "y",
                "nodeType": "YulTypedName",
                "src": "6952:1:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "diff",
                "nodeType": "YulTypedName",
                "src": "6958:4:54",
                "type": ""
              }
            ],
            "src": "6918:128:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "7083:95:54",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "7100:1:54",
                        "type": "",
                        "value": "0"
                      },
                      {
                        "arguments": [
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "7107:3:54",
                            "type": "",
                            "value": "224"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "7112:10:54",
                            "type": "",
                            "value": "0x4e487b71"
                          }
                        ],
                        "functionName": {
                          "name": "shl",
                          "nodeType": "YulIdentifier",
                          "src": "7103:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "7103:20:54"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "7093:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "7093:31:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "7093:31:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "7140:1:54",
                        "type": "",
                        "value": "4"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "7143:4:54",
                        "type": "",
                        "value": "0x31"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "7133:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "7133:15:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "7133:15:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "7164:1:54",
                        "type": "",
                        "value": "0"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "7167:4:54",
                        "type": "",
                        "value": "0x24"
                      }
                    ],
                    "functionName": {
                      "name": "revert",
                      "nodeType": "YulIdentifier",
                      "src": "7157:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "7157:15:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "7157:15:54"
                }
              ]
            },
            "name": "panic_error_0x31",
            "nodeType": "YulFunctionDefinition",
            "src": "7051:127:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "7230:89:54",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "7257:22:54",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [],
                          "functionName": {
                            "name": "panic_error_0x11",
                            "nodeType": "YulIdentifier",
                            "src": "7259:16:54"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "7259:18:54"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "7259:18:54"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "name": "value",
                        "nodeType": "YulIdentifier",
                        "src": "7250:5:54"
                      }
                    ],
                    "functionName": {
                      "name": "iszero",
                      "nodeType": "YulIdentifier",
                      "src": "7243:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "7243:13:54"
                  },
                  "nodeType": "YulIf",
                  "src": "7240:39:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "7288:25:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "value",
                        "nodeType": "YulIdentifier",
                        "src": "7299:5:54"
                      },
                      {
                        "arguments": [
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "7310:1:54",
                            "type": "",
                            "value": "0"
                          }
                        ],
                        "functionName": {
                          "name": "not",
                          "nodeType": "YulIdentifier",
                          "src": "7306:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "7306:6:54"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "7295:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "7295:18:54"
                  },
                  "variableNames": [
                    {
                      "name": "ret",
                      "nodeType": "YulIdentifier",
                      "src": "7288:3:54"
                    }
                  ]
                }
              ]
            },
            "name": "decrement_t_uint256",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "value",
                "nodeType": "YulTypedName",
                "src": "7212:5:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "ret",
                "nodeType": "YulTypedName",
                "src": "7222:3:54",
                "type": ""
              }
            ],
            "src": "7183:136:54"
          }
        ]
      },
      "contents": "{\n    { }\n    function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0\n    {\n        if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n        value0 := calldataload(headStart)\n    }\n    function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n    {\n        tail := add(headStart, 32)\n        mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n    }\n    function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n    {\n        tail := add(headStart, 32)\n        mstore(headStart, value0)\n    }\n    function abi_decode_address(offset) -> value\n    {\n        value := calldataload(offset)\n        if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n    }\n    function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n    {\n        if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n        value0 := abi_decode_address(headStart)\n    }\n    function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n    {\n        tail := add(headStart, 32)\n        mstore(headStart, iszero(iszero(value0)))\n    }\n    function abi_decode_tuple_t_addresst_uint256(headStart, dataEnd) -> value0, value1\n    {\n        if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n        value0 := abi_decode_address(headStart)\n        value1 := calldataload(add(headStart, 32))\n    }\n    function abi_decode_tuple_t_addresst_addresst_uint256(headStart, dataEnd) -> value0, value1, value2\n    {\n        if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n        value0 := abi_decode_address(headStart)\n        value1 := abi_decode_address(add(headStart, 32))\n        value2 := calldataload(add(headStart, 64))\n    }\n    function validator_revert_uint16(value)\n    {\n        if iszero(eq(value, and(value, 0xffff))) { revert(0, 0) }\n    }\n    function abi_decode_tuple_t_uint16(headStart, dataEnd) -> value0\n    {\n        if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n        let value := calldataload(headStart)\n        validator_revert_uint16(value)\n        value0 := value\n    }\n    function abi_encode_tuple_t_contract$_IToken_$12234__to_t_address__fromStack_reversed(headStart, value0) -> tail\n    {\n        tail := add(headStart, 32)\n        mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n    }\n    function abi_encode_tuple_t_stringliteral_805273123fce6ffb542e2f434a5720f01c486c754f17da061e48944dbe289a31__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n    {\n        mstore(headStart, 32)\n        mstore(add(headStart, 32), 25)\n        mstore(add(headStart, 64), \"shareholder doesn't exist\")\n        tail := add(headStart, 96)\n    }\n    function panic_error_0x32()\n    {\n        mstore(0, shl(224, 0x4e487b71))\n        mstore(4, 0x32)\n        revert(0, 0x24)\n    }\n    function abi_encode_tuple_t_stringliteral_8d624724abe04cec2c9dea2aa97d440b8d5ae1d5bee60672fd7f8561ed33045c__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n    {\n        mstore(headStart, 32)\n        mstore(add(headStart, 32), 27)\n        mstore(add(headStart, 64), \"This token is already bound\")\n        tail := add(headStart, 96)\n    }\n    function abi_encode_tuple_t_stringliteral_3a32dea6d728f3e51c5acf0744a2444ea4633c5416095bb4680eff562369b243__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n    {\n        mstore(headStart, 32)\n        mstore(add(headStart, 32), 27)\n        mstore(add(headStart, 64), \"This token is not bound yet\")\n        tail := add(headStart, 96)\n    }\n    function abi_encode_tuple_t_stringliteral_5a68ed2bc0002f6d7777b41be5e0fbfbfe715cdad34adee170beb7e99ea964f1__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n    {\n        mstore(headStart, 32)\n        mstore(add(headStart, 32), 68)\n        mstore(add(headStart, 64), \"error : this address is not a to\")\n        mstore(add(headStart, 96), \"ken bound to the compliance cont\")\n        mstore(add(headStart, 128), \"ract\")\n        tail := add(headStart, 160)\n    }\n    function abi_encode_tuple_t_stringliteral_66eeaba3418ac6b87b03d31af59bc39ad8fee7233b46f609a69227f2bc78bbf0__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n    {\n        mstore(headStart, 32)\n        mstore(add(headStart, 32), 16)\n        mstore(add(headStart, 64), \"No token created\")\n        tail := add(headStart, 96)\n    }\n    function abi_encode_tuple_t_stringliteral_38bfff34683fb8fd7d13833d348fcfd97f4e4308582363f470fc6498e3ad489c__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n    {\n        mstore(headStart, 32)\n        mstore(add(headStart, 32), 32)\n        mstore(add(headStart, 64), \"This Agent is not registered yet\")\n        tail := add(headStart, 96)\n    }\n    function abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n    {\n        mstore(headStart, 32)\n        mstore(add(headStart, 32), 38)\n        mstore(add(headStart, 64), \"Ownable: new owner is the zero a\")\n        mstore(add(headStart, 96), \"ddress\")\n        tail := add(headStart, 128)\n    }\n    function abi_encode_tuple_t_stringliteral_94e04ceb3646f4f8dc1e8519090d5e6cbdbc2153be960a40dcab924db6e7024c__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n    {\n        mstore(headStart, 32)\n        mstore(add(headStart, 32), 32)\n        mstore(add(headStart, 64), \"This Agent is already registered\")\n        tail := add(headStart, 96)\n    }\n    function abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n    {\n        mstore(headStart, 32)\n        mstore(add(headStart, 32), 32)\n        mstore(add(headStart, 64), \"Ownable: caller is not the owner\")\n        tail := add(headStart, 96)\n    }\n    function abi_decode_tuple_t_uint16_fromMemory(headStart, dataEnd) -> value0\n    {\n        if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n        let value := mload(headStart)\n        validator_revert_uint16(value)\n        value0 := value\n    }\n    function panic_error_0x11()\n    {\n        mstore(0, shl(224, 0x4e487b71))\n        mstore(4, 0x11)\n        revert(0, 0x24)\n    }\n    function increment_t_uint256(value) -> ret\n    {\n        if eq(value, not(0)) { panic_error_0x11() }\n        ret := add(value, 1)\n    }\n    function abi_encode_tuple_t_stringliteral_afef0e4e29dc4da50f79fba698ab471b1022ded6f23517fe8d324cc091b72861__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n    {\n        mstore(headStart, 32)\n        mstore(add(headStart, 32), 26)\n        mstore(add(headStart, 64), \"Shareholder does not exist\")\n        tail := add(headStart, 96)\n    }\n    function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0\n    {\n        if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n        value0 := mload(headStart)\n    }\n    function checked_sub_t_uint256(x, y) -> diff\n    {\n        diff := sub(x, y)\n        if gt(diff, x) { panic_error_0x11() }\n    }\n    function panic_error_0x31()\n    {\n        mstore(0, shl(224, 0x4e487b71))\n        mstore(4, 0x31)\n        revert(0, 0x24)\n    }\n    function decrement_t_uint256(value) -> ret\n    {\n        if iszero(value) { panic_error_0x11() }\n        ret := add(value, not(0))\n    }\n}",
      "id": 54,
      "language": "Yul",
      "name": "#utility.yul"
    }
  ],
  "sourceMap": "1276:8551:31:-:0;;;2998:221;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;936:32:13;719:10:20;936:18:13;:32::i;:::-;3058:5:31;:22;;-1:-1:-1;;;;;;3058:22:31;-1:-1:-1;;;;;3058:22:31;;;;;;;;3090:11;:26;;;3145:24;;;-1:-1:-1;;;3145:24:31;;;;:22;;:24;;;;;;;;;;;;;;;3058:22;3145:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3126:16;:43;;-1:-1:-1;;;;;;3126:43:31;-1:-1:-1;;;;;3126:43:31;;;;;;;;;;3184:28;;895:25:54;;;3184:28:31;;883:2:54;868:18;3184:28:31;;;;;;;2998:221;;1276:8551;;2433:187:13;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:13;;;-1:-1:-1;;;;;;2541:17:13;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;14:131:54:-;-1:-1:-1;;;;;89:31:54;;79:42;;69:70;;135:1;132;125:12;69:70;14:131;:::o;150:312::-;229:6;237;290:2;278:9;269:7;265:23;261:32;258:52;;;306:1;303;296:12;258:52;338:9;332:16;357:31;382:5;357:31;:::i;:::-;452:2;437:18;;;;431:25;407:5;;431:25;;-1:-1:-1;;;150:312:54:o;467:277::-;563:6;616:2;604:9;595:7;591:23;587:32;584:52;;;632:1;629;622:12;584:52;664:9;658:16;683:31;708:5;683:31;:::i;:::-;733:5;467:277;-1:-1:-1;;;467:277:54:o;749:177::-;1276:8551:31;;;;;;",
  "deployedSourceMap": "1276:8551:31:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5338:151;;;;;;:::i;:::-;;:::i;:::-;;6191:184;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5736:96;5806:12;:19;5736:96;;;553:25:54;;;541:2;526:18;5736:96:31;407:177:54;3286:138:31;;;;;;:::i;:::-;-1:-1:-1;;;;;3385:31:31;3361:4;3385:31;;;:16;:31;;;;;;;;;3286:138;;;;1123:14:54;;1116:22;1098:41;;1086:2;1071:18;3286:138:31;958:187:54;4340:211:31;;;;;;:::i;:::-;;:::i;4618:215::-;;;;;;:::i;:::-;;:::i;9187:163::-;;;;;;:::i;:::-;;:::i;1831:101:13:-;;;:::i;9688:137:31:-;;;;;;:::i;:::-;;:::i;8866:202::-;;;;;;:::i;:::-;;:::i;9471:125::-;;;;;;:::i;:::-;;:::i;1201:85:13:-;;;:::i;8093:134:31:-;;;;;;:::i;:::-;8194:26;;8168:7;8194:26;;;:19;:26;;;;;;;8093:134;3491:120;;;;;;:::i;:::-;;:::i;4007:266::-;;;;;;:::i;:::-;;:::i;8417:326::-;;;;;;:::i;:::-;;:::i;2081:198:13:-;;;;;;:::i;:::-;;:::i;5572:93:31:-;5647:11;;5572:93;;1397:19;;;;;-1:-1:-1;;;;;1397:19:31;;;3679:261;;;;;;:::i;:::-;;:::i;5338:151::-;1094:13:13;:11;:13::i;:::-;5413:11:31::1;:26:::0;;;5454:28:::1;::::0;553:25:54;;;5454:28:31::1;::::0;541:2:54;526:18;5454:28:31::1;;;;;;;;5338:151:::0;:::o;6191:184::-;6282:12;:19;6247:7;;6274:27;;6266:66;;;;-1:-1:-1;;;6266:66:31;;2540:2:54;6266:66:31;;;2522:21:54;2579:2;2559:18;;;2552:30;-1:-1:-1;;;2598:18:54;;;2591:55;2663:18;;6266:66:31;;;;;;;;;6349:12;6362:5;6349:19;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;6349:19:31;;6191:184;-1:-1:-1;;6191:184:31:o;4340:211::-;1094:13:13;:11;:13::i;:::-;-1:-1:-1;;;;;4422:20:31;::::1;;::::0;;;:12:::1;:20;::::0;;;;;::::1;;4421:21;4413:61;;;::::0;-1:-1:-1;;;4413:61:31;;3026:2:54;4413:61:31::1;::::0;::::1;3008:21:54::0;3065:2;3045:18;;;3038:30;-1:-1:-1;;;3084:18:54;;;3077:57;3151:18;;4413:61:31::1;2824:351:54::0;4413:61:31::1;-1:-1:-1::0;;;;;4484:20:31;::::1;;::::0;;;:12:::1;:20;::::0;;;;;;:27;;-1:-1:-1;;4484:27:31::1;4507:4;4484:27;::::0;;4526:18;::::1;::::0;::::1;::::0;4497:6;;4526:18:::1;:::i;4618:215::-:0;1094:13:13;:11;:13::i;:::-;-1:-1:-1;;;;;4701:20:31;::::1;;::::0;;;:12:::1;:20;::::0;;;;;::::1;;4693:60;;;::::0;-1:-1:-1;;;4693:60:31;;3382:2:54;4693:60:31::1;::::0;::::1;3364:21:54::0;3421:2;3401:18;;;3394:30;-1:-1:-1;;;3440:18:54;;;3433:57;3507:18;;4693:60:31::1;3180:351:54::0;4693:60:31::1;-1:-1:-1::0;;;;;4763:20:31;::::1;4786:5;4763:20:::0;;;:12:::1;:20;::::0;;;;;;:28;;-1:-1:-1;;4763:28:31::1;::::0;;4806:20;::::1;::::0;::::1;::::0;4776:6;;4806:20:::1;:::i;9187:163::-:0;2313:9;:7;:9::i;:::-;2305:90;;;;-1:-1:-1;;;2305:90:31;;;;;;;:::i;:::-;9288:1:::1;9279:6;:10;9271:39;;;::::0;-1:-1:-1;;;9271:39:31;;4215:2:54;9271:39:31::1;::::0;::::1;4197:21:54::0;4254:2;4234:18;;;4227:30;-1:-1:-1;;;4273:18:54;;;4266:46;4329:18;;9271:39:31::1;4013:340:54::0;9271:39:31::1;9320:23;9339:3;9320:18;:23::i;:::-;9187:163:::0;;:::o;1831:101:13:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;9688:137:31:-;1094:13:13;:11;:13::i;:::-;9791:27:31::1;9809:8;9791:17;:27::i;:::-;9688:137:::0;:::o;8866:202::-;2313:9;:7;:9::i;:::-;2305:90;;;;-1:-1:-1;;;2305:90:31;;;;;;;:::i;:::-;9004:23:::1;9023:3;9004:18;:23::i;:::-;9037:24;9055:5;9037:17;:24::i;:::-;8866:202:::0;;;:::o;9471:125::-;2313:9;:7;:9::i;:::-;2305:90;;;;-1:-1:-1;;;2305:90:31;;;;;;;:::i;:::-;9565:24:::1;9583:5;9565:17;:24::i;1201:85:13:-:0;1247:7;1273:6;-1:-1:-1;;;;;1273:6:13;;1201:85::o;3491:120:31:-;-1:-1:-1;;;;;3583:20:31;3559:4;3583:20;;;:12;:20;;;;;;;;;3491:120::o;4007:266::-;1094:13:13;:11;:13::i;:::-;-1:-1:-1;;;;;4102:31:31;::::1;;::::0;;;:16:::1;:31;::::0;;;;;::::1;;4094:76;;;::::0;-1:-1:-1;;;4094:76:31;;4560:2:54;4094:76:31::1;::::0;::::1;4542:21:54::0;;;4579:18;;;4572:30;4638:34;4618:18;;;4611:62;4690:18;;4094:76:31::1;4358:356:54::0;4094:76:31::1;-1:-1:-1::0;;;;;4180:31:31;::::1;4214:5;4180:31:::0;;;:16:::1;:31;::::0;;;;;;:39;;-1:-1:-1;;4180:39:31::1;::::0;;4234:32;::::1;::::0;::::1;::::0;4197:13;;4234:32:::1;:::i;8417:326::-:0;-1:-1:-1;;;;;8576:18:31;;8556:4;8576:18;;;:13;:18;;;;;;:23;8572:65;;-1:-1:-1;8622:4:31;8615:11;;8572:65;8666:11;;5806:12;:19;8650:27;8646:69;;;-1:-1:-1;8700:4:31;8693:11;;8646:69;-1:-1:-1;8731:5:31;8417:326;;;;;;:::o;2081:198:13:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:13;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:13;;4921:2:54;2161:73:13::1;::::0;::::1;4903:21:54::0;4960:2;4940:18;;;4933:30;4999:34;4979:18;;;4972:62;-1:-1:-1;;;5050:18:54;;;5043:36;5096:19;;2161:73:13::1;4719:402:54::0;2161:73:13::1;2244:28;2263:8;2244:18;:28::i;3679:261:31:-:0;1094:13:13;:11;:13::i;:::-;-1:-1:-1;;;;;3772:31:31;::::1;;::::0;;;:16:::1;:31;::::0;;;;;::::1;;3771:32;3763:77;;;::::0;-1:-1:-1;;;3763:77:31;;5328:2:54;3763:77:31::1;::::0;::::1;5310:21:54::0;;;5347:18;;;5340:30;5406:34;5386:18;;;5379:62;5458:18;;3763:77:31::1;5126:356:54::0;3763:77:31::1;-1:-1:-1::0;;;;;3850:31:31;::::1;;::::0;;;:16:::1;:31;::::0;;;;;;:38;;-1:-1:-1;;3850:38:31::1;3884:4;3850:38;::::0;;3903:30;::::1;::::0;::::1;::::0;3867:13;;3903:30:::1;:::i;1359:130:13:-:0;719:10:20;1422:7:13;:5;:7::i;:::-;-1:-1:-1;;;;;1422:23:13;;1414:68;;;;-1:-1:-1;;;1414:68:13;;5689:2:54;1414:68:13;;;5671:21:54;;;5708:18;;;5701:30;5767:34;5747:18;;;5740:62;5819:18;;1414:68:13;5487:356:54;4961:96:31;5003:4;5026:24;5039:10;5026:12;:24::i;:::-;5019:31;;4961:96;:::o;6598:313::-;-1:-1:-1;;;;;6663:19:31;;;;;;:13;:19;;;;;;:24;;6659:246;;6703:12;:23;;;;;;;;;;;-1:-1:-1;;;;;;6703:23:31;-1:-1:-1;;;;;6703:23:31;;;;;;;;;6762:19;;-1:-1:-1;6740:19:31;;;:13;6703:23;6740:19;;;;;;;:41;;;;6812:16;;:38;;-1:-1:-1;;;6812:38:31;;:16;;;;;:32;;:38;;6703:23;;6812:38;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6864:28;;;;;;;:19;:28;;;;;:30;;6795:55;;-1:-1:-1;6864:28:31;:30;;;:::i;:::-;;;;;;6689:216;6598:313;:::o;2433:187:13:-;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:13;;;-1:-1:-1;;;;;;2541:17:13;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;7277:669:31:-;-1:-1:-1;;;;;7345:19:31;;;;;;:13;:19;;;;;;:24;;7337:63;;;;-1:-1:-1;;;7337:63:31;;6576:2:54;7337:63:31;;;6558:21:54;6615:2;6595:18;;;6588:30;-1:-1:-1;;;6634:18:54;;;6627:56;6700:18;;7337:63:31;6374:350:54;7337:63:31;7428:5;;:21;;-1:-1:-1;;;7428:21:31;;7410:15;;-1:-1:-1;;;;;7428:5:31;;:15;;:21;;7444:4;;7428:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7410:39;-1:-1:-1;7463:11:31;;7459:48;;7490:7;7277:669;:::o;7459:48::-;-1:-1:-1;;;;;7538:19:31;;7516;7538;;;:13;:19;;;;;;:23;;7560:1;;7538:23;:::i;:::-;7591:12;:19;7516:45;;-1:-1:-1;7571:17:31;;7591:23;;7613:1;;7591:23;:::i;:::-;7571:43;;7624:18;7645:12;7658:9;7645:23;;;;;;;;:::i;:::-;;;;;;;;;;;7678:12;:25;;-1:-1:-1;;;;;7645:23:31;;;;-1:-1:-1;7645:23:31;;7691:11;;7678:25;;;;;;:::i;:::-;;;;;;;;;;;;;:38;;-1:-1:-1;;;;;;7678:38:31;-1:-1:-1;;;;;7678:38:31;;;;;;7754:19;;;;;:13;:19;;;;;;;7726:25;;;;;;;:47;7783:12;:18;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;7783:18:31;;;;;-1:-1:-1;;;;;;7783:18:31;;;;;;;;;-1:-1:-1;;;;;7811:19:31;;;;;:13;:19;;;;;;;;:23;;;7861:16;;:38;;-1:-1:-1;;;7861:38:31;;:16;;;:32;;:38;;7825:4;;7861:38;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7909:28;;;;;;;:19;:28;;;;;:30;;7844:55;;-1:-1:-1;7909:28:31;:30;;;:::i;:::-;;;;;;7327:619;;;;;7277:669;:::o;14:180:54:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:54;;14:180;-1:-1:-1;14:180:54:o;199:203::-;-1:-1:-1;;;;;363:32:54;;;;345:51;;333:2;318:18;;199:203::o;589:173::-;657:20;;-1:-1:-1;;;;;706:31:54;;696:42;;686:70;;752:1;749;742:12;686:70;589:173;;;:::o;767:186::-;826:6;879:2;867:9;858:7;854:23;850:32;847:52;;;895:1;892;885:12;847:52;918:29;937:9;918:29;:::i;1150:254::-;1218:6;1226;1279:2;1267:9;1258:7;1254:23;1250:32;1247:52;;;1295:1;1292;1285:12;1247:52;1318:29;1337:9;1318:29;:::i;:::-;1308:39;1394:2;1379:18;;;;1366:32;;-1:-1:-1;;;1150:254:54:o;1409:328::-;1486:6;1494;1502;1555:2;1543:9;1534:7;1530:23;1526:32;1523:52;;;1571:1;1568;1561:12;1523:52;1594:29;1613:9;1594:29;:::i;:::-;1584:39;;1642:38;1676:2;1665:9;1661:18;1642:38;:::i;:::-;1632:48;;1727:2;1716:9;1712:18;1699:32;1689:42;;1409:328;;;;;:::o;1742:117::-;1827:6;1820:5;1816:18;1809:5;1806:29;1796:57;;1849:1;1846;1839:12;1864:245;1922:6;1975:2;1963:9;1954:7;1950:23;1946:32;1943:52;;;1991:1;1988;1981:12;1943:52;2030:9;2017:23;2049:30;2073:5;2049:30;:::i;2692:127::-;2753:10;2748:3;2744:20;2741:1;2734:31;2784:4;2781:1;2774:15;2808:4;2805:1;2798:15;3536:472;3738:2;3720:21;;;3777:2;3757:18;;;3750:30;3816:34;3811:2;3796:18;;3789:62;3887:34;3882:2;3867:18;;3860:62;-1:-1:-1;;;3953:3:54;3938:19;;3931:35;3998:3;3983:19;;3536:472::o;5848:249::-;5917:6;5970:2;5958:9;5949:7;5945:23;5941:32;5938:52;;;5986:1;5983;5976:12;5938:52;6018:9;6012:16;6037:30;6061:5;6037:30;:::i;6102:127::-;6163:10;6158:3;6154:20;6151:1;6144:31;6194:4;6191:1;6184:15;6218:4;6215:1;6208:15;6234:135;6273:3;6294:17;;;6291:43;;6314:18;;:::i;:::-;-1:-1:-1;6361:1:54;6350:13;;6234:135::o;6729:184::-;6799:6;6852:2;6840:9;6831:7;6827:23;6823:32;6820:52;;;6868:1;6865;6858:12;6820:52;-1:-1:-1;6891:16:54;;6729:184;-1:-1:-1;6729:184:54:o;6918:128::-;6985:9;;;7006:11;;;7003:37;;;7020:18;;:::i;:::-;6918:128;;;;:::o;7051:127::-;7112:10;7107:3;7103:20;7100:1;7093:31;7143:4;7140:1;7133:15;7167:4;7164:1;7157:15;7183:136;7222:3;7250:5;7240:39;;7259:18;;:::i;:::-;-1:-1:-1;;;7295:18:54;;7183:136::o",
  "source": "// SPDX-License-Identifier: GPL-3.0\n\n/**\n *     NOTICE\n *\n *     The T-REX software is licensed under a proprietary license or the GPL v.3.\n *     If you choose to receive it under the GPL v.3 license, the following applies:\n *     T-REX is a suite of smart contracts developed by Tokeny to manage and transfer financial assets on the ethereum blockchain\n *\n *     Copyright (C) 2021, Tokeny sàrl.\n *\n *     This program is free software: you can redistribute it and/or modify\n *     it under the terms of the GNU General Public License as published by\n *     the Free Software Foundation, either version 3 of the License, or\n *     (at your option) any later version.\n *\n *     This program is distributed in the hope that it will be useful,\n *     but WITHOUT ANY WARRANTY; without even the implied warranty of\n *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *     GNU General Public License for more details.\n *\n *     You should have received a copy of the GNU General Public License\n *     along with this program.  If not, see <https://www.gnu.org/licenses/>.\n */\n\npragma solidity ^0.8.0;\n\nimport '@openzeppelin/contracts/access/Ownable.sol';\n\nimport './ICompliance.sol';\nimport '../token/IToken.sol';\nimport '../registry/IIdentityRegistry.sol';\n\ncontract LimitHolder is ICompliance, Ownable\n\n {\n    /// @dev the token on which this compliance contract is applied\n    IToken public token;\n\n    /// @dev the limit of holders for this token\n    uint256 private holderLimit;\n\n    /// @dev the Identity registry contract linked to `token`\n    IIdentityRegistry private identityRegistry;\n\n    /// @dev the index of each shareholder in the array `shareholders`\n    mapping(address => uint256) private holderIndices;\n\n    /// @dev the amount of shareholders per country\n    mapping(uint16 => uint256) private countryShareHolders;\n\n    /// @dev the addresses of all shareholders\n    address[] private shareholders;\n\n    /// @dev Mapping between agents and their statuses\n    mapping(address => bool) private _tokenAgentsList;\n\n    /// @dev Mapping of tokens linked to the compliance contract\n    mapping(address => bool) private _tokensBound;\n\n    /**\n     * @dev Throws if called by any address that is not a token bound to the compliance.\n     */\n    modifier onlyToken() {\n        require(isToken(), 'error : this address is not a token bound to the compliance contract');\n        _;\n    }\n\n    /**\n     *  this event is emitted when the holder limit is set.\n     *  the event is emitted by the setHolderLimit function and by the constructor\n     *  `_holderLimit` is the holder limit for this token\n     */\n    event HolderLimitSet(uint256 _holderLimit);\n\n    /**\n     *  @dev the constructor initiates the smart contract with the initial state variables\n     *  @param _token the address of the token concerned by the rules of this compliance contract\n     *  @param _holderLimit the holder limit for the token concerned\n     *  emits a `HolderLimitSet` event\n     */\n    constructor(address _token, uint256 _holderLimit) {\n        token = IToken(_token);\n        holderLimit = _holderLimit;\n        identityRegistry = token.identityRegistry();\n        emit HolderLimitSet(_holderLimit);\n    }\n\n    /**\n     *  @dev See {ICompliance-isTokenAgent}.\n     */\n    function isTokenAgent(address _agentAddress) public view override returns (bool) {\n        return (_tokenAgentsList[_agentAddress]);\n    }\n\n    /**\n     *  @dev See {ICompliance-isTokenBound}.\n     */\n    function isTokenBound(address _token) public view override returns (bool) {\n        return (_tokensBound[_token]);\n    }\n\n    /**\n     *  @dev See {ICompliance-addTokenAgent}.\n     */\n    function addTokenAgent(address _agentAddress) external override onlyOwner {\n        require(!_tokenAgentsList[_agentAddress], 'This Agent is already registered');\n        _tokenAgentsList[_agentAddress] = true;\n        emit TokenAgentAdded(_agentAddress);\n    }\n\n    /**\n     *  @dev See {ICompliance-isTokenAgent}.\n     */\n    function removeTokenAgent(address _agentAddress) external override onlyOwner {\n        require(_tokenAgentsList[_agentAddress], 'This Agent is not registered yet');\n        _tokenAgentsList[_agentAddress] = false;\n        emit TokenAgentRemoved(_agentAddress);\n    }\n\n    /**\n     *  @dev See {ICompliance-isTokenAgent}.\n     */\n    function bindToken(address _token) external override onlyOwner {\n        require(!_tokensBound[_token], 'This token is already bound');\n        _tokensBound[_token] = true;\n        emit TokenBound(_token);\n    }\n\n    /**\n     *  @dev See {ICompliance-isTokenAgent}.\n     */\n    function unbindToken(address _token) external override onlyOwner {\n        require(_tokensBound[_token], 'This token is not bound yet');\n        _tokensBound[_token] = false;\n        emit TokenUnbound(_token);\n    }\n\n    /**\n     *  @dev Returns true if the sender corresponds to a token that is bound with the Compliance contract\n     */\n    function isToken() internal view returns (bool) {\n        return isTokenBound(msg.sender);\n    }\n\n    /**\n     *  @dev sets the holder limit as required for compliance purpose\n     *  @param _holderLimit the holder limit for the token concerned\n     *  This function can only be called by the agent of the Compliance contract\n     *  emits a `HolderLimitSet` event\n     */\n    function setHolderLimit(uint256 _holderLimit) external onlyOwner {\n        holderLimit = _holderLimit;\n        emit HolderLimitSet(_holderLimit);\n    }\n\n    /**\n     *  @dev returns the holder limit as set on the contract\n     */\n    function getHolderLimit() external view returns (uint256) {\n        return holderLimit;\n    }\n\n    /**\n     *  @dev returns the amount of token holders\n     */\n    function holderCount() public view returns (uint256) {\n        return shareholders.length;\n    }\n\n    /**\n     *  @dev By counting the number of token holders using `holderCount`\n     *  you can retrieve the complete list of token holders, one at a time.\n     *  It MUST throw if `index >= holderCount()`.\n     *  @param index The zero-based index of the holder.\n     *  @return `address` the address of the token holder with the given index.\n     */\n    function holderAt(uint256 index) external view returns (address) {\n        require(index < shareholders.length, 'shareholder doesn\\'t exist');\n        return shareholders[index];\n    }\n\n    /**\n     *  @dev If the address is not in the `shareholders` array then push it\n     *  and update the `holderIndices` mapping.\n     *  @param addr The address to add as a shareholder if it's not already.\n     */\n    function updateShareholders(address addr) internal {\n        if (holderIndices[addr] == 0) {\n            shareholders.push(addr);\n            holderIndices[addr] = shareholders.length;\n            uint16 country = identityRegistry.investorCountry(addr);\n            countryShareHolders[country]++;\n        }\n    }\n\n    /**\n     *  If the address is in the `shareholders` array and the forthcoming\n     *  transfer or transferFrom will reduce their balance to 0, then\n     *  we need to remove them from the shareholders array.\n     *  @param addr The address to prune if their balance will be reduced to 0.\n     *  @dev see https://ethereum.stackexchange.com/a/39311\n     */\n    function pruneShareholders(address addr) internal {\n        require(holderIndices[addr] != 0, 'Shareholder does not exist');\n        uint256 balance = token.balanceOf(addr);\n        if (balance > 0) {\n            return;\n        }\n        uint256 holderIndex = holderIndices[addr] - 1;\n        uint256 lastIndex = shareholders.length - 1;\n        address lastHolder = shareholders[lastIndex];\n        shareholders[holderIndex] = lastHolder;\n        holderIndices[lastHolder] = holderIndices[addr];\n        shareholders.pop();\n        holderIndices[addr] = 0;\n        uint16 country = identityRegistry.investorCountry(addr);\n        countryShareHolders[country]--;\n    }\n\n    /**\n     *  @dev get the amount of shareholders in a country\n     *  @param index the index of the country, following ISO 3166-1\n     */\n    function getShareholderCountByCountry(uint16 index) external view returns (uint256) {\n        return countryShareHolders[index];\n    }\n\n    /**\n     *  @dev See {ICompliance-canTransfer}.\n     *  @return true if the amount of holders post-transfer is less or\n     *  equal to the maximum amount of token holders\n     */\n    function canTransfer(\n        address /* _from */,\n        address _to,\n        uint256 /* _value */\n    ) external view override returns (bool) {\n        if (holderIndices[_to] != 0) {\n            return true;\n        }\n        if (holderCount() < holderLimit) {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     *  @dev See {ICompliance-transferred}.\n     *  updates the counter of shareholders if necessary\n     */\n    function transferred(\n        address _from,\n        address _to,\n        uint256 /*_value */\n    ) external override onlyToken {\n        updateShareholders(_to);\n        pruneShareholders(_from);\n    }\n\n    /**\n     *  @dev See {ICompliance-created}.\n     *  updates the counter of shareholders if necessary\n     */\n    function created(address _to, uint256 _value) external override onlyToken {\n        require(_value > 0, 'No token created');\n        updateShareholders(_to);\n    }\n\n    /**\n     *  @dev See {ICompliance-destroyed}.\n     *  updates the counter of shareholders if necessary\n     */\n    function destroyed(address _from, uint256 /* _value */) external override onlyToken {\n        pruneShareholders(_from);\n    }\n\n    /**\n     *  @dev See {ICompliance-transferOwnershipOnComplianceContract}.\n     */\n    function transferOwnershipOnComplianceContract(address newOwner) external override onlyOwner {\n        transferOwnership(newOwner);\n    }\n}\n",
  "sourcePath": "/home/webxpert/workspace/shipfinex/latest-repos/tokenx_smartcontract/contracts/compliance/LimitHolder.sol",
  "ast": {
    "absolutePath": "project:/contracts/compliance/LimitHolder.sol",
    "exportedSymbols": {
      "Context": [
        3401
      ],
      "IClaimIssuer": [
        1456
      ],
      "IClaimTopicsRegistry": [
        6444
      ],
      "ICompliance": [
        5596
      ],
      "IERC20": [
        3317
      ],
      "IERC734": [
        1609
      ],
      "IERC735": [
        1734
      ],
      "IIdentity": [
        1743
      ],
      "IIdentityRegistry": [
        6637
      ],
      "IIdentityRegistryStorage": [
        6759
      ],
      "IToken": [
        12234
      ],
      "ITrustedIssuersRegistry": [
        6856
      ],
      "LimitHolder": [
        6143
      ],
      "Ownable": [
        2505
      ]
    },
    "id": 6144,
    "license": "GPL-3.0",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 5598,
        "literals": [
          "solidity",
          "^",
          "0.8",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "1094:23:31"
      },
      {
        "absolutePath": "@openzeppelin/contracts/access/Ownable.sol",
        "file": "@openzeppelin/contracts/access/Ownable.sol",
        "id": 5599,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 6144,
        "sourceUnit": 2506,
        "src": "1119:52:31",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "project:/contracts/compliance/ICompliance.sol",
        "file": "./ICompliance.sol",
        "id": 5600,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 6144,
        "sourceUnit": 5597,
        "src": "1173:27:31",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "project:/contracts/token/IToken.sol",
        "file": "../token/IToken.sol",
        "id": 5601,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 6144,
        "sourceUnit": 12235,
        "src": "1201:29:31",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "project:/contracts/registry/IIdentityRegistry.sol",
        "file": "../registry/IIdentityRegistry.sol",
        "id": 5602,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 6144,
        "sourceUnit": 6638,
        "src": "1231:43:31",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "baseName": {
              "id": 5603,
              "name": "ICompliance",
              "nameLocations": [
                "1300:11:31"
              ],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 5596,
              "src": "1300:11:31"
            },
            "id": 5604,
            "nodeType": "InheritanceSpecifier",
            "src": "1300:11:31"
          },
          {
            "baseName": {
              "id": 5605,
              "name": "Ownable",
              "nameLocations": [
                "1313:7:31"
              ],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 2505,
              "src": "1313:7:31"
            },
            "id": 5606,
            "nodeType": "InheritanceSpecifier",
            "src": "1313:7:31"
          }
        ],
        "canonicalName": "LimitHolder",
        "contractDependencies": [],
        "contractKind": "contract",
        "fullyImplemented": true,
        "id": 6143,
        "linearizedBaseContracts": [
          6143,
          2505,
          3401,
          5596
        ],
        "name": "LimitHolder",
        "nameLocation": "1285:11:31",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "documentation": {
              "id": 5607,
              "nodeType": "StructuredDocumentation",
              "src": "1329:63:31",
              "text": "@dev the token on which this compliance contract is applied"
            },
            "functionSelector": "fc0c546a",
            "id": 5610,
            "mutability": "mutable",
            "name": "token",
            "nameLocation": "1411:5:31",
            "nodeType": "VariableDeclaration",
            "scope": 6143,
            "src": "1397:19:31",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IToken_$12234",
              "typeString": "contract IToken"
            },
            "typeName": {
              "id": 5609,
              "nodeType": "UserDefinedTypeName",
              "pathNode": {
                "id": 5608,
                "name": "IToken",
                "nameLocations": [
                  "1397:6:31"
                ],
                "nodeType": "IdentifierPath",
                "referencedDeclaration": 12234,
                "src": "1397:6:31"
              },
              "referencedDeclaration": 12234,
              "src": "1397:6:31",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IToken_$12234",
                "typeString": "contract IToken"
              }
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "documentation": {
              "id": 5611,
              "nodeType": "StructuredDocumentation",
              "src": "1423:44:31",
              "text": "@dev the limit of holders for this token"
            },
            "id": 5613,
            "mutability": "mutable",
            "name": "holderLimit",
            "nameLocation": "1488:11:31",
            "nodeType": "VariableDeclaration",
            "scope": 6143,
            "src": "1472:27:31",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 5612,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "1472:7:31",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "visibility": "private"
          },
          {
            "constant": false,
            "documentation": {
              "id": 5614,
              "nodeType": "StructuredDocumentation",
              "src": "1506:57:31",
              "text": "@dev the Identity registry contract linked to `token`"
            },
            "id": 5617,
            "mutability": "mutable",
            "name": "identityRegistry",
            "nameLocation": "1594:16:31",
            "nodeType": "VariableDeclaration",
            "scope": 6143,
            "src": "1568:42:31",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IIdentityRegistry_$6637",
              "typeString": "contract IIdentityRegistry"
            },
            "typeName": {
              "id": 5616,
              "nodeType": "UserDefinedTypeName",
              "pathNode": {
                "id": 5615,
                "name": "IIdentityRegistry",
                "nameLocations": [
                  "1568:17:31"
                ],
                "nodeType": "IdentifierPath",
                "referencedDeclaration": 6637,
                "src": "1568:17:31"
              },
              "referencedDeclaration": 6637,
              "src": "1568:17:31",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IIdentityRegistry_$6637",
                "typeString": "contract IIdentityRegistry"
              }
            },
            "visibility": "private"
          },
          {
            "constant": false,
            "documentation": {
              "id": 5618,
              "nodeType": "StructuredDocumentation",
              "src": "1617:66:31",
              "text": "@dev the index of each shareholder in the array `shareholders`"
            },
            "id": 5622,
            "mutability": "mutable",
            "name": "holderIndices",
            "nameLocation": "1724:13:31",
            "nodeType": "VariableDeclaration",
            "scope": 6143,
            "src": "1688:49:31",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
              "typeString": "mapping(address => uint256)"
            },
            "typeName": {
              "id": 5621,
              "keyType": {
                "id": 5619,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "1696:7:31",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "1688:27:31",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                "typeString": "mapping(address => uint256)"
              },
              "valueType": {
                "id": 5620,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "1707:7:31",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              }
            },
            "visibility": "private"
          },
          {
            "constant": false,
            "documentation": {
              "id": 5623,
              "nodeType": "StructuredDocumentation",
              "src": "1744:47:31",
              "text": "@dev the amount of shareholders per country"
            },
            "id": 5627,
            "mutability": "mutable",
            "name": "countryShareHolders",
            "nameLocation": "1831:19:31",
            "nodeType": "VariableDeclaration",
            "scope": 6143,
            "src": "1796:54:31",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_uint16_$_t_uint256_$",
              "typeString": "mapping(uint16 => uint256)"
            },
            "typeName": {
              "id": 5626,
              "keyType": {
                "id": 5624,
                "name": "uint16",
                "nodeType": "ElementaryTypeName",
                "src": "1804:6:31",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint16",
                  "typeString": "uint16"
                }
              },
              "nodeType": "Mapping",
              "src": "1796:26:31",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_uint16_$_t_uint256_$",
                "typeString": "mapping(uint16 => uint256)"
              },
              "valueType": {
                "id": 5625,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "1814:7:31",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              }
            },
            "visibility": "private"
          },
          {
            "constant": false,
            "documentation": {
              "id": 5628,
              "nodeType": "StructuredDocumentation",
              "src": "1857:42:31",
              "text": "@dev the addresses of all shareholders"
            },
            "id": 5631,
            "mutability": "mutable",
            "name": "shareholders",
            "nameLocation": "1922:12:31",
            "nodeType": "VariableDeclaration",
            "scope": 6143,
            "src": "1904:30:31",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_array$_t_address_$dyn_storage",
              "typeString": "address[]"
            },
            "typeName": {
              "baseType": {
                "id": 5629,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "1904:7:31",
                "stateMutability": "nonpayable",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "id": 5630,
              "nodeType": "ArrayTypeName",
              "src": "1904:9:31",
              "typeDescriptions": {
                "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                "typeString": "address[]"
              }
            },
            "visibility": "private"
          },
          {
            "constant": false,
            "documentation": {
              "id": 5632,
              "nodeType": "StructuredDocumentation",
              "src": "1941:50:31",
              "text": "@dev Mapping between agents and their statuses"
            },
            "id": 5636,
            "mutability": "mutable",
            "name": "_tokenAgentsList",
            "nameLocation": "2029:16:31",
            "nodeType": "VariableDeclaration",
            "scope": 6143,
            "src": "1996:49:31",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
              "typeString": "mapping(address => bool)"
            },
            "typeName": {
              "id": 5635,
              "keyType": {
                "id": 5633,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "2004:7:31",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "1996:24:31",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                "typeString": "mapping(address => bool)"
              },
              "valueType": {
                "id": 5634,
                "name": "bool",
                "nodeType": "ElementaryTypeName",
                "src": "2015:4:31",
                "typeDescriptions": {
                  "typeIdentifier": "t_bool",
                  "typeString": "bool"
                }
              }
            },
            "visibility": "private"
          },
          {
            "constant": false,
            "documentation": {
              "id": 5637,
              "nodeType": "StructuredDocumentation",
              "src": "2052:60:31",
              "text": "@dev Mapping of tokens linked to the compliance contract"
            },
            "id": 5641,
            "mutability": "mutable",
            "name": "_tokensBound",
            "nameLocation": "2150:12:31",
            "nodeType": "VariableDeclaration",
            "scope": 6143,
            "src": "2117:45:31",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
              "typeString": "mapping(address => bool)"
            },
            "typeName": {
              "id": 5640,
              "keyType": {
                "id": 5638,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "2125:7:31",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "2117:24:31",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                "typeString": "mapping(address => bool)"
              },
              "valueType": {
                "id": 5639,
                "name": "bool",
                "nodeType": "ElementaryTypeName",
                "src": "2136:4:31",
                "typeDescriptions": {
                  "typeIdentifier": "t_bool",
                  "typeString": "bool"
                }
              }
            },
            "visibility": "private"
          },
          {
            "body": {
              "id": 5651,
              "nodeType": "Block",
              "src": "2295:118:31",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "id": 5645,
                          "name": "isToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5838,
                          "src": "2313:7:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
                            "typeString": "function () view returns (bool)"
                          }
                        },
                        "id": 5646,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2313:9:31",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "6572726f72203a20746869732061646472657373206973206e6f74206120746f6b656e20626f756e6420746f2074686520636f6d706c69616e636520636f6e7472616374",
                        "id": 5647,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2324:70:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_5a68ed2bc0002f6d7777b41be5e0fbfbfe715cdad34adee170beb7e99ea964f1",
                          "typeString": "literal_string \"error : this address is not a token bound to the compliance contract\""
                        },
                        "value": "error : this address is not a token bound to the compliance contract"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_5a68ed2bc0002f6d7777b41be5e0fbfbfe715cdad34adee170beb7e99ea964f1",
                          "typeString": "literal_string \"error : this address is not a token bound to the compliance contract\""
                        }
                      ],
                      "id": 5644,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "2305:7:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 5648,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2305:90:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5649,
                  "nodeType": "ExpressionStatement",
                  "src": "2305:90:31"
                },
                {
                  "id": 5650,
                  "nodeType": "PlaceholderStatement",
                  "src": "2405:1:31"
                }
              ]
            },
            "documentation": {
              "id": 5642,
              "nodeType": "StructuredDocumentation",
              "src": "2169:100:31",
              "text": " @dev Throws if called by any address that is not a token bound to the compliance."
            },
            "id": 5652,
            "name": "onlyToken",
            "nameLocation": "2283:9:31",
            "nodeType": "ModifierDefinition",
            "parameters": {
              "id": 5643,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2292:2:31"
            },
            "src": "2274:139:31",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 5653,
              "nodeType": "StructuredDocumentation",
              "src": "2419:212:31",
              "text": "  this event is emitted when the holder limit is set.\n  the event is emitted by the setHolderLimit function and by the constructor\n  `_holderLimit` is the holder limit for this token"
            },
            "eventSelector": "3069f57f08b632d7fceb2be6b7e39522eff2dbd0b4605b5f0ab46c94f1211d8e",
            "id": 5657,
            "name": "HolderLimitSet",
            "nameLocation": "2642:14:31",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 5656,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5655,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "_holderLimit",
                  "nameLocation": "2665:12:31",
                  "nodeType": "VariableDeclaration",
                  "scope": 5657,
                  "src": "2657:20:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5654,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2657:7:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2656:22:31"
            },
            "src": "2636:43:31"
          },
          {
            "body": {
              "id": 5685,
              "nodeType": "Block",
              "src": "3048:171:31",
              "statements": [
                {
                  "expression": {
                    "id": 5669,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 5665,
                      "name": "token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5610,
                      "src": "3058:5:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IToken_$12234",
                        "typeString": "contract IToken"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "arguments": [
                        {
                          "id": 5667,
                          "name": "_token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5660,
                          "src": "3073:6:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "id": 5666,
                        "name": "IToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 12234,
                        "src": "3066:6:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_IToken_$12234_$",
                          "typeString": "type(contract IToken)"
                        }
                      },
                      "id": 5668,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3066:14:31",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IToken_$12234",
                        "typeString": "contract IToken"
                      }
                    },
                    "src": "3058:22:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IToken_$12234",
                      "typeString": "contract IToken"
                    }
                  },
                  "id": 5670,
                  "nodeType": "ExpressionStatement",
                  "src": "3058:22:31"
                },
                {
                  "expression": {
                    "id": 5673,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 5671,
                      "name": "holderLimit",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5613,
                      "src": "3090:11:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 5672,
                      "name": "_holderLimit",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5662,
                      "src": "3104:12:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3090:26:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 5674,
                  "nodeType": "ExpressionStatement",
                  "src": "3090:26:31"
                },
                {
                  "expression": {
                    "id": 5679,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 5675,
                      "name": "identityRegistry",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5617,
                      "src": "3126:16:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IIdentityRegistry_$6637",
                        "typeString": "contract IIdentityRegistry"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "expression": {
                          "id": 5676,
                          "name": "token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5610,
                          "src": "3145:5:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IToken_$12234",
                            "typeString": "contract IToken"
                          }
                        },
                        "id": 5677,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "3151:16:31",
                        "memberName": "identityRegistry",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 12011,
                        "src": "3145:22:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_view$__$returns$_t_contract$_IIdentityRegistry_$6637_$",
                          "typeString": "function () view external returns (contract IIdentityRegistry)"
                        }
                      },
                      "id": 5678,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3145:24:31",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IIdentityRegistry_$6637",
                        "typeString": "contract IIdentityRegistry"
                      }
                    },
                    "src": "3126:43:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IIdentityRegistry_$6637",
                      "typeString": "contract IIdentityRegistry"
                    }
                  },
                  "id": 5680,
                  "nodeType": "ExpressionStatement",
                  "src": "3126:43:31"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 5682,
                        "name": "_holderLimit",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5662,
                        "src": "3199:12:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 5681,
                      "name": "HolderLimitSet",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5657,
                      "src": "3184:14:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                        "typeString": "function (uint256)"
                      }
                    },
                    "id": 5683,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3184:28:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5684,
                  "nodeType": "EmitStatement",
                  "src": "3179:33:31"
                }
              ]
            },
            "documentation": {
              "id": 5658,
              "nodeType": "StructuredDocumentation",
              "src": "2685:308:31",
              "text": "  @dev the constructor initiates the smart contract with the initial state variables\n  @param _token the address of the token concerned by the rules of this compliance contract\n  @param _holderLimit the holder limit for the token concerned\n  emits a `HolderLimitSet` event"
            },
            "id": 5686,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nameLocation": "-1:-1:-1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5663,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5660,
                  "mutability": "mutable",
                  "name": "_token",
                  "nameLocation": "3018:6:31",
                  "nodeType": "VariableDeclaration",
                  "scope": 5686,
                  "src": "3010:14:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5659,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3010:7:31",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5662,
                  "mutability": "mutable",
                  "name": "_holderLimit",
                  "nameLocation": "3034:12:31",
                  "nodeType": "VariableDeclaration",
                  "scope": 5686,
                  "src": "3026:20:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5661,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3026:7:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3009:38:31"
            },
            "returnParameters": {
              "id": 5664,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3048:0:31"
            },
            "scope": 6143,
            "src": "2998:221:31",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              5519
            ],
            "body": {
              "id": 5700,
              "nodeType": "Block",
              "src": "3367:57:31",
              "statements": [
                {
                  "expression": {
                    "components": [
                      {
                        "baseExpression": {
                          "id": 5695,
                          "name": "_tokenAgentsList",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5636,
                          "src": "3385:16:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                            "typeString": "mapping(address => bool)"
                          }
                        },
                        "id": 5697,
                        "indexExpression": {
                          "id": 5696,
                          "name": "_agentAddress",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5689,
                          "src": "3402:13:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "3385:31:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "id": 5698,
                    "isConstant": false,
                    "isInlineArray": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "TupleExpression",
                    "src": "3384:33:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 5694,
                  "id": 5699,
                  "nodeType": "Return",
                  "src": "3377:40:31"
                }
              ]
            },
            "documentation": {
              "id": 5687,
              "nodeType": "StructuredDocumentation",
              "src": "3225:56:31",
              "text": "  @dev See {ICompliance-isTokenAgent}."
            },
            "functionSelector": "346531fa",
            "id": 5701,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "isTokenAgent",
            "nameLocation": "3295:12:31",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 5691,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "3343:8:31"
            },
            "parameters": {
              "id": 5690,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5689,
                  "mutability": "mutable",
                  "name": "_agentAddress",
                  "nameLocation": "3316:13:31",
                  "nodeType": "VariableDeclaration",
                  "scope": 5701,
                  "src": "3308:21:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5688,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3308:7:31",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3307:23:31"
            },
            "returnParameters": {
              "id": 5694,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5693,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5701,
                  "src": "3361:4:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 5692,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3361:4:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3360:6:31"
            },
            "scope": 6143,
            "src": "3286:138:31",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              5527
            ],
            "body": {
              "id": 5715,
              "nodeType": "Block",
              "src": "3565:46:31",
              "statements": [
                {
                  "expression": {
                    "components": [
                      {
                        "baseExpression": {
                          "id": 5710,
                          "name": "_tokensBound",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5641,
                          "src": "3583:12:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                            "typeString": "mapping(address => bool)"
                          }
                        },
                        "id": 5712,
                        "indexExpression": {
                          "id": 5711,
                          "name": "_token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5704,
                          "src": "3596:6:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "3583:20:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "id": 5713,
                    "isConstant": false,
                    "isInlineArray": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "TupleExpression",
                    "src": "3582:22:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 5709,
                  "id": 5714,
                  "nodeType": "Return",
                  "src": "3575:29:31"
                }
              ]
            },
            "documentation": {
              "id": 5702,
              "nodeType": "StructuredDocumentation",
              "src": "3430:56:31",
              "text": "  @dev See {ICompliance-isTokenBound}."
            },
            "functionSelector": "993e8b95",
            "id": 5716,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "isTokenBound",
            "nameLocation": "3500:12:31",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 5706,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "3541:8:31"
            },
            "parameters": {
              "id": 5705,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5704,
                  "mutability": "mutable",
                  "name": "_token",
                  "nameLocation": "3521:6:31",
                  "nodeType": "VariableDeclaration",
                  "scope": 5716,
                  "src": "3513:14:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5703,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3513:7:31",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3512:16:31"
            },
            "returnParameters": {
              "id": 5709,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5708,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5716,
                  "src": "3559:4:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 5707,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3559:4:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3558:6:31"
            },
            "scope": 6143,
            "src": "3491:120:31",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              5533
            ],
            "body": {
              "id": 5743,
              "nodeType": "Block",
              "src": "3753:187:31",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 5729,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "UnaryOperation",
                        "operator": "!",
                        "prefix": true,
                        "src": "3771:32:31",
                        "subExpression": {
                          "baseExpression": {
                            "id": 5726,
                            "name": "_tokenAgentsList",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5636,
                            "src": "3772:16:31",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                              "typeString": "mapping(address => bool)"
                            }
                          },
                          "id": 5728,
                          "indexExpression": {
                            "id": 5727,
                            "name": "_agentAddress",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5719,
                            "src": "3789:13:31",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "3772:31:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "54686973204167656e7420697320616c72656164792072656769737465726564",
                        "id": 5730,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "3805:34:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_94e04ceb3646f4f8dc1e8519090d5e6cbdbc2153be960a40dcab924db6e7024c",
                          "typeString": "literal_string \"This Agent is already registered\""
                        },
                        "value": "This Agent is already registered"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_94e04ceb3646f4f8dc1e8519090d5e6cbdbc2153be960a40dcab924db6e7024c",
                          "typeString": "literal_string \"This Agent is already registered\""
                        }
                      ],
                      "id": 5725,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "3763:7:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 5731,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3763:77:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5732,
                  "nodeType": "ExpressionStatement",
                  "src": "3763:77:31"
                },
                {
                  "expression": {
                    "id": 5737,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 5733,
                        "name": "_tokenAgentsList",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5636,
                        "src": "3850:16:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 5735,
                      "indexExpression": {
                        "id": 5734,
                        "name": "_agentAddress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5719,
                        "src": "3867:13:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "3850:31:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "hexValue": "74727565",
                      "id": 5736,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "3884:4:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "true"
                    },
                    "src": "3850:38:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 5738,
                  "nodeType": "ExpressionStatement",
                  "src": "3850:38:31"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 5740,
                        "name": "_agentAddress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5719,
                        "src": "3919:13:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 5739,
                      "name": "TokenAgentAdded",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5496,
                      "src": "3903:15:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 5741,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3903:30:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5742,
                  "nodeType": "EmitStatement",
                  "src": "3898:35:31"
                }
              ]
            },
            "documentation": {
              "id": 5717,
              "nodeType": "StructuredDocumentation",
              "src": "3617:57:31",
              "text": "  @dev See {ICompliance-addTokenAgent}."
            },
            "functionSelector": "ff3e6954",
            "id": 5744,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 5723,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 5722,
                  "name": "onlyOwner",
                  "nameLocations": [
                    "3743:9:31"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 2424,
                  "src": "3743:9:31"
                },
                "nodeType": "ModifierInvocation",
                "src": "3743:9:31"
              }
            ],
            "name": "addTokenAgent",
            "nameLocation": "3688:13:31",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 5721,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "3734:8:31"
            },
            "parameters": {
              "id": 5720,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5719,
                  "mutability": "mutable",
                  "name": "_agentAddress",
                  "nameLocation": "3710:13:31",
                  "nodeType": "VariableDeclaration",
                  "scope": 5744,
                  "src": "3702:21:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5718,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3702:7:31",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3701:23:31"
            },
            "returnParameters": {
              "id": 5724,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3753:0:31"
            },
            "scope": 6143,
            "src": "3679:261:31",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              5539
            ],
            "body": {
              "id": 5770,
              "nodeType": "Block",
              "src": "4084:189:31",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "baseExpression": {
                          "id": 5754,
                          "name": "_tokenAgentsList",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5636,
                          "src": "4102:16:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                            "typeString": "mapping(address => bool)"
                          }
                        },
                        "id": 5756,
                        "indexExpression": {
                          "id": 5755,
                          "name": "_agentAddress",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5747,
                          "src": "4119:13:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "4102:31:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "54686973204167656e74206973206e6f74207265676973746572656420796574",
                        "id": 5757,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4135:34:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_38bfff34683fb8fd7d13833d348fcfd97f4e4308582363f470fc6498e3ad489c",
                          "typeString": "literal_string \"This Agent is not registered yet\""
                        },
                        "value": "This Agent is not registered yet"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_38bfff34683fb8fd7d13833d348fcfd97f4e4308582363f470fc6498e3ad489c",
                          "typeString": "literal_string \"This Agent is not registered yet\""
                        }
                      ],
                      "id": 5753,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "4094:7:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 5758,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4094:76:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5759,
                  "nodeType": "ExpressionStatement",
                  "src": "4094:76:31"
                },
                {
                  "expression": {
                    "id": 5764,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 5760,
                        "name": "_tokenAgentsList",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5636,
                        "src": "4180:16:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 5762,
                      "indexExpression": {
                        "id": 5761,
                        "name": "_agentAddress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5747,
                        "src": "4197:13:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "4180:31:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "hexValue": "66616c7365",
                      "id": 5763,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "4214:5:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "false"
                    },
                    "src": "4180:39:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 5765,
                  "nodeType": "ExpressionStatement",
                  "src": "4180:39:31"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 5767,
                        "name": "_agentAddress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5747,
                        "src": "4252:13:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 5766,
                      "name": "TokenAgentRemoved",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5501,
                      "src": "4234:17:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 5768,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4234:32:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5769,
                  "nodeType": "EmitStatement",
                  "src": "4229:37:31"
                }
              ]
            },
            "documentation": {
              "id": 5745,
              "nodeType": "StructuredDocumentation",
              "src": "3946:56:31",
              "text": "  @dev See {ICompliance-isTokenAgent}."
            },
            "functionSelector": "cdde2932",
            "id": 5771,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 5751,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 5750,
                  "name": "onlyOwner",
                  "nameLocations": [
                    "4074:9:31"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 2424,
                  "src": "4074:9:31"
                },
                "nodeType": "ModifierInvocation",
                "src": "4074:9:31"
              }
            ],
            "name": "removeTokenAgent",
            "nameLocation": "4016:16:31",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 5749,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "4065:8:31"
            },
            "parameters": {
              "id": 5748,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5747,
                  "mutability": "mutable",
                  "name": "_agentAddress",
                  "nameLocation": "4041:13:31",
                  "nodeType": "VariableDeclaration",
                  "scope": 5771,
                  "src": "4033:21:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5746,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4033:7:31",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4032:23:31"
            },
            "returnParameters": {
              "id": 5752,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4084:0:31"
            },
            "scope": 6143,
            "src": "4007:266:31",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              5545
            ],
            "body": {
              "id": 5798,
              "nodeType": "Block",
              "src": "4403:148:31",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 5784,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "UnaryOperation",
                        "operator": "!",
                        "prefix": true,
                        "src": "4421:21:31",
                        "subExpression": {
                          "baseExpression": {
                            "id": 5781,
                            "name": "_tokensBound",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5641,
                            "src": "4422:12:31",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                              "typeString": "mapping(address => bool)"
                            }
                          },
                          "id": 5783,
                          "indexExpression": {
                            "id": 5782,
                            "name": "_token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5774,
                            "src": "4435:6:31",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "4422:20:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "5468697320746f6b656e20697320616c726561647920626f756e64",
                        "id": 5785,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4444:29:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_8d624724abe04cec2c9dea2aa97d440b8d5ae1d5bee60672fd7f8561ed33045c",
                          "typeString": "literal_string \"This token is already bound\""
                        },
                        "value": "This token is already bound"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_8d624724abe04cec2c9dea2aa97d440b8d5ae1d5bee60672fd7f8561ed33045c",
                          "typeString": "literal_string \"This token is already bound\""
                        }
                      ],
                      "id": 5780,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "4413:7:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 5786,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4413:61:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5787,
                  "nodeType": "ExpressionStatement",
                  "src": "4413:61:31"
                },
                {
                  "expression": {
                    "id": 5792,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 5788,
                        "name": "_tokensBound",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5641,
                        "src": "4484:12:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 5790,
                      "indexExpression": {
                        "id": 5789,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5774,
                        "src": "4497:6:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "4484:20:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "hexValue": "74727565",
                      "id": 5791,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "4507:4:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "true"
                    },
                    "src": "4484:27:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 5793,
                  "nodeType": "ExpressionStatement",
                  "src": "4484:27:31"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 5795,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5774,
                        "src": "4537:6:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 5794,
                      "name": "TokenBound",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5506,
                      "src": "4526:10:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 5796,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4526:18:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5797,
                  "nodeType": "EmitStatement",
                  "src": "4521:23:31"
                }
              ]
            },
            "documentation": {
              "id": 5772,
              "nodeType": "StructuredDocumentation",
              "src": "4279:56:31",
              "text": "  @dev See {ICompliance-isTokenAgent}."
            },
            "functionSelector": "3ff5aa02",
            "id": 5799,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 5778,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 5777,
                  "name": "onlyOwner",
                  "nameLocations": [
                    "4393:9:31"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 2424,
                  "src": "4393:9:31"
                },
                "nodeType": "ModifierInvocation",
                "src": "4393:9:31"
              }
            ],
            "name": "bindToken",
            "nameLocation": "4349:9:31",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 5776,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "4384:8:31"
            },
            "parameters": {
              "id": 5775,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5774,
                  "mutability": "mutable",
                  "name": "_token",
                  "nameLocation": "4367:6:31",
                  "nodeType": "VariableDeclaration",
                  "scope": 5799,
                  "src": "4359:14:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5773,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4359:7:31",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4358:16:31"
            },
            "returnParameters": {
              "id": 5779,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4403:0:31"
            },
            "scope": 6143,
            "src": "4340:211:31",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              5551
            ],
            "body": {
              "id": 5825,
              "nodeType": "Block",
              "src": "4683:150:31",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "baseExpression": {
                          "id": 5809,
                          "name": "_tokensBound",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5641,
                          "src": "4701:12:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                            "typeString": "mapping(address => bool)"
                          }
                        },
                        "id": 5811,
                        "indexExpression": {
                          "id": 5810,
                          "name": "_token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5802,
                          "src": "4714:6:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "4701:20:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "5468697320746f6b656e206973206e6f7420626f756e6420796574",
                        "id": 5812,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4723:29:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_3a32dea6d728f3e51c5acf0744a2444ea4633c5416095bb4680eff562369b243",
                          "typeString": "literal_string \"This token is not bound yet\""
                        },
                        "value": "This token is not bound yet"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_3a32dea6d728f3e51c5acf0744a2444ea4633c5416095bb4680eff562369b243",
                          "typeString": "literal_string \"This token is not bound yet\""
                        }
                      ],
                      "id": 5808,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "4693:7:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 5813,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4693:60:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5814,
                  "nodeType": "ExpressionStatement",
                  "src": "4693:60:31"
                },
                {
                  "expression": {
                    "id": 5819,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 5815,
                        "name": "_tokensBound",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5641,
                        "src": "4763:12:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 5817,
                      "indexExpression": {
                        "id": 5816,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5802,
                        "src": "4776:6:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "4763:20:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "hexValue": "66616c7365",
                      "id": 5818,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "4786:5:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "false"
                    },
                    "src": "4763:28:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 5820,
                  "nodeType": "ExpressionStatement",
                  "src": "4763:28:31"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 5822,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5802,
                        "src": "4819:6:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 5821,
                      "name": "TokenUnbound",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5511,
                      "src": "4806:12:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 5823,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4806:20:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5824,
                  "nodeType": "EmitStatement",
                  "src": "4801:25:31"
                }
              ]
            },
            "documentation": {
              "id": 5800,
              "nodeType": "StructuredDocumentation",
              "src": "4557:56:31",
              "text": "  @dev See {ICompliance-isTokenAgent}."
            },
            "functionSelector": "40db3b50",
            "id": 5826,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 5806,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 5805,
                  "name": "onlyOwner",
                  "nameLocations": [
                    "4673:9:31"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 2424,
                  "src": "4673:9:31"
                },
                "nodeType": "ModifierInvocation",
                "src": "4673:9:31"
              }
            ],
            "name": "unbindToken",
            "nameLocation": "4627:11:31",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 5804,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "4664:8:31"
            },
            "parameters": {
              "id": 5803,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5802,
                  "mutability": "mutable",
                  "name": "_token",
                  "nameLocation": "4647:6:31",
                  "nodeType": "VariableDeclaration",
                  "scope": 5826,
                  "src": "4639:14:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5801,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4639:7:31",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4638:16:31"
            },
            "returnParameters": {
              "id": 5807,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4683:0:31"
            },
            "scope": 6143,
            "src": "4618:215:31",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 5837,
              "nodeType": "Block",
              "src": "5009:48:31",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 5833,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 4294967281,
                          "src": "5039:3:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 5834,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "5043:6:31",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "5039:10:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 5832,
                      "name": "isTokenBound",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5716,
                      "src": "5026:12:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                        "typeString": "function (address) view returns (bool)"
                      }
                    },
                    "id": 5835,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5026:24:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 5831,
                  "id": 5836,
                  "nodeType": "Return",
                  "src": "5019:31:31"
                }
              ]
            },
            "documentation": {
              "id": 5827,
              "nodeType": "StructuredDocumentation",
              "src": "4839:117:31",
              "text": "  @dev Returns true if the sender corresponds to a token that is bound with the Compliance contract"
            },
            "id": 5838,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "isToken",
            "nameLocation": "4970:7:31",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5828,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4977:2:31"
            },
            "returnParameters": {
              "id": 5831,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5830,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5838,
                  "src": "5003:4:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 5829,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "5003:4:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5002:6:31"
            },
            "scope": 6143,
            "src": "4961:96:31",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5854,
              "nodeType": "Block",
              "src": "5403:86:31",
              "statements": [
                {
                  "expression": {
                    "id": 5848,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 5846,
                      "name": "holderLimit",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5613,
                      "src": "5413:11:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 5847,
                      "name": "_holderLimit",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5841,
                      "src": "5427:12:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "5413:26:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 5849,
                  "nodeType": "ExpressionStatement",
                  "src": "5413:26:31"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 5851,
                        "name": "_holderLimit",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5841,
                        "src": "5469:12:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 5850,
                      "name": "HolderLimitSet",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5657,
                      "src": "5454:14:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                        "typeString": "function (uint256)"
                      }
                    },
                    "id": 5852,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5454:28:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5853,
                  "nodeType": "EmitStatement",
                  "src": "5449:33:31"
                }
              ]
            },
            "documentation": {
              "id": 5839,
              "nodeType": "StructuredDocumentation",
              "src": "5063:270:31",
              "text": "  @dev sets the holder limit as required for compliance purpose\n  @param _holderLimit the holder limit for the token concerned\n  This function can only be called by the agent of the Compliance contract\n  emits a `HolderLimitSet` event"
            },
            "functionSelector": "06f91d59",
            "id": 5855,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 5844,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 5843,
                  "name": "onlyOwner",
                  "nameLocations": [
                    "5393:9:31"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 2424,
                  "src": "5393:9:31"
                },
                "nodeType": "ModifierInvocation",
                "src": "5393:9:31"
              }
            ],
            "name": "setHolderLimit",
            "nameLocation": "5347:14:31",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5842,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5841,
                  "mutability": "mutable",
                  "name": "_holderLimit",
                  "nameLocation": "5370:12:31",
                  "nodeType": "VariableDeclaration",
                  "scope": 5855,
                  "src": "5362:20:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5840,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5362:7:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5361:22:31"
            },
            "returnParameters": {
              "id": 5845,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5403:0:31"
            },
            "scope": 6143,
            "src": "5338:151:31",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 5863,
              "nodeType": "Block",
              "src": "5630:35:31",
              "statements": [
                {
                  "expression": {
                    "id": 5861,
                    "name": "holderLimit",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 5613,
                    "src": "5647:11:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 5860,
                  "id": 5862,
                  "nodeType": "Return",
                  "src": "5640:18:31"
                }
              ]
            },
            "documentation": {
              "id": 5856,
              "nodeType": "StructuredDocumentation",
              "src": "5495:72:31",
              "text": "  @dev returns the holder limit as set on the contract"
            },
            "functionSelector": "f3ac2389",
            "id": 5864,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getHolderLimit",
            "nameLocation": "5581:14:31",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5857,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5595:2:31"
            },
            "returnParameters": {
              "id": 5860,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5859,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5864,
                  "src": "5621:7:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5858,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5621:7:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5620:9:31"
            },
            "scope": 6143,
            "src": "5572:93:31",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 5873,
              "nodeType": "Block",
              "src": "5789:43:31",
              "statements": [
                {
                  "expression": {
                    "expression": {
                      "id": 5870,
                      "name": "shareholders",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5631,
                      "src": "5806:12:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_address_$dyn_storage",
                        "typeString": "address[] storage ref"
                      }
                    },
                    "id": 5871,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberLocation": "5819:6:31",
                    "memberName": "length",
                    "nodeType": "MemberAccess",
                    "src": "5806:19:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 5869,
                  "id": 5872,
                  "nodeType": "Return",
                  "src": "5799:26:31"
                }
              ]
            },
            "documentation": {
              "id": 5865,
              "nodeType": "StructuredDocumentation",
              "src": "5671:60:31",
              "text": "  @dev returns the amount of token holders"
            },
            "functionSelector": "1aab9a9f",
            "id": 5874,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "holderCount",
            "nameLocation": "5745:11:31",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5866,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5756:2:31"
            },
            "returnParameters": {
              "id": 5869,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5868,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5874,
                  "src": "5780:7:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5867,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5780:7:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5779:9:31"
            },
            "scope": 6143,
            "src": "5736:96:31",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 5894,
              "nodeType": "Block",
              "src": "6256:119:31",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 5886,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 5883,
                          "name": "index",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5877,
                          "src": "6274:5:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "<",
                        "rightExpression": {
                          "expression": {
                            "id": 5884,
                            "name": "shareholders",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5631,
                            "src": "6282:12:31",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_address_$dyn_storage",
                              "typeString": "address[] storage ref"
                            }
                          },
                          "id": 5885,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "6295:6:31",
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "src": "6282:19:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "6274:27:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "7368617265686f6c64657220646f65736e2774206578697374",
                        "id": 5887,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "6303:28:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_805273123fce6ffb542e2f434a5720f01c486c754f17da061e48944dbe289a31",
                          "typeString": "literal_string \"shareholder doesn't exist\""
                        },
                        "value": "shareholder doesn't exist"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_805273123fce6ffb542e2f434a5720f01c486c754f17da061e48944dbe289a31",
                          "typeString": "literal_string \"shareholder doesn't exist\""
                        }
                      ],
                      "id": 5882,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "6266:7:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 5888,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6266:66:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5889,
                  "nodeType": "ExpressionStatement",
                  "src": "6266:66:31"
                },
                {
                  "expression": {
                    "baseExpression": {
                      "id": 5890,
                      "name": "shareholders",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5631,
                      "src": "6349:12:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_address_$dyn_storage",
                        "typeString": "address[] storage ref"
                      }
                    },
                    "id": 5892,
                    "indexExpression": {
                      "id": 5891,
                      "name": "index",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5877,
                      "src": "6362:5:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "6349:19:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 5881,
                  "id": 5893,
                  "nodeType": "Return",
                  "src": "6342:26:31"
                }
              ]
            },
            "documentation": {
              "id": 5875,
              "nodeType": "StructuredDocumentation",
              "src": "5838:348:31",
              "text": "  @dev By counting the number of token holders using `holderCount`\n  you can retrieve the complete list of token holders, one at a time.\n  It MUST throw if `index >= holderCount()`.\n  @param index The zero-based index of the holder.\n  @return `address` the address of the token holder with the given index."
            },
            "functionSelector": "197bc336",
            "id": 5895,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "holderAt",
            "nameLocation": "6200:8:31",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5878,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5877,
                  "mutability": "mutable",
                  "name": "index",
                  "nameLocation": "6217:5:31",
                  "nodeType": "VariableDeclaration",
                  "scope": 5895,
                  "src": "6209:13:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5876,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6209:7:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "6208:15:31"
            },
            "returnParameters": {
              "id": 5881,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5880,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5895,
                  "src": "6247:7:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5879,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6247:7:31",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "6246:9:31"
            },
            "scope": 6143,
            "src": "6191:184:31",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 5933,
              "nodeType": "Block",
              "src": "6649:262:31",
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 5905,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "baseExpression": {
                        "id": 5901,
                        "name": "holderIndices",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5622,
                        "src": "6663:13:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                          "typeString": "mapping(address => uint256)"
                        }
                      },
                      "id": 5903,
                      "indexExpression": {
                        "id": 5902,
                        "name": "addr",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5898,
                        "src": "6677:4:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "6663:19:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 5904,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "6686:1:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "6663:24:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 5932,
                  "nodeType": "IfStatement",
                  "src": "6659:246:31",
                  "trueBody": {
                    "id": 5931,
                    "nodeType": "Block",
                    "src": "6689:216:31",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 5909,
                              "name": "addr",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5898,
                              "src": "6721:4:31",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "id": 5906,
                              "name": "shareholders",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5631,
                              "src": "6703:12:31",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_address_$dyn_storage",
                                "typeString": "address[] storage ref"
                              }
                            },
                            "id": 5908,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "6716:4:31",
                            "memberName": "push",
                            "nodeType": "MemberAccess",
                            "src": "6703:17:31",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_arraypush_nonpayable$_t_array$_t_address_$dyn_storage_ptr_$_t_address_$returns$__$bound_to$_t_array$_t_address_$dyn_storage_ptr_$",
                              "typeString": "function (address[] storage pointer,address)"
                            }
                          },
                          "id": 5910,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6703:23:31",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5911,
                        "nodeType": "ExpressionStatement",
                        "src": "6703:23:31"
                      },
                      {
                        "expression": {
                          "id": 5917,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "baseExpression": {
                              "id": 5912,
                              "name": "holderIndices",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5622,
                              "src": "6740:13:31",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 5914,
                            "indexExpression": {
                              "id": 5913,
                              "name": "addr",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5898,
                              "src": "6754:4:31",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "6740:19:31",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "expression": {
                              "id": 5915,
                              "name": "shareholders",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5631,
                              "src": "6762:12:31",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_address_$dyn_storage",
                                "typeString": "address[] storage ref"
                              }
                            },
                            "id": 5916,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "6775:6:31",
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "src": "6762:19:31",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "6740:41:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 5918,
                        "nodeType": "ExpressionStatement",
                        "src": "6740:41:31"
                      },
                      {
                        "assignments": [
                          5920
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5920,
                            "mutability": "mutable",
                            "name": "country",
                            "nameLocation": "6802:7:31",
                            "nodeType": "VariableDeclaration",
                            "scope": 5931,
                            "src": "6795:14:31",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint16",
                              "typeString": "uint16"
                            },
                            "typeName": {
                              "id": 5919,
                              "name": "uint16",
                              "nodeType": "ElementaryTypeName",
                              "src": "6795:6:31",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint16",
                                "typeString": "uint16"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 5925,
                        "initialValue": {
                          "arguments": [
                            {
                              "id": 5923,
                              "name": "addr",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5898,
                              "src": "6845:4:31",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "id": 5921,
                              "name": "identityRegistry",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5617,
                              "src": "6812:16:31",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IIdentityRegistry_$6637",
                                "typeString": "contract IIdentityRegistry"
                              }
                            },
                            "id": 5922,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "6829:15:31",
                            "memberName": "investorCountry",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 6597,
                            "src": "6812:32:31",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint16_$",
                              "typeString": "function (address) view external returns (uint16)"
                            }
                          },
                          "id": 5924,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6812:38:31",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint16",
                            "typeString": "uint16"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "6795:55:31"
                      },
                      {
                        "expression": {
                          "id": 5929,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "UnaryOperation",
                          "operator": "++",
                          "prefix": false,
                          "src": "6864:30:31",
                          "subExpression": {
                            "baseExpression": {
                              "id": 5926,
                              "name": "countryShareHolders",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5627,
                              "src": "6864:19:31",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_uint16_$_t_uint256_$",
                                "typeString": "mapping(uint16 => uint256)"
                              }
                            },
                            "id": 5928,
                            "indexExpression": {
                              "id": 5927,
                              "name": "country",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5920,
                              "src": "6884:7:31",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint16",
                                "typeString": "uint16"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "6864:28:31",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 5930,
                        "nodeType": "ExpressionStatement",
                        "src": "6864:30:31"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 5896,
              "nodeType": "StructuredDocumentation",
              "src": "6381:212:31",
              "text": "  @dev If the address is not in the `shareholders` array then push it\n  and update the `holderIndices` mapping.\n  @param addr The address to add as a shareholder if it's not already."
            },
            "id": 5934,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "updateShareholders",
            "nameLocation": "6607:18:31",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5899,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5898,
                  "mutability": "mutable",
                  "name": "addr",
                  "nameLocation": "6634:4:31",
                  "nodeType": "VariableDeclaration",
                  "scope": 5934,
                  "src": "6626:12:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5897,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6626:7:31",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "6625:14:31"
            },
            "returnParameters": {
              "id": 5900,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6649:0:31"
            },
            "scope": 6143,
            "src": "6598:313:31",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 6020,
              "nodeType": "Block",
              "src": "7327:619:31",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 5945,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "baseExpression": {
                            "id": 5941,
                            "name": "holderIndices",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5622,
                            "src": "7345:13:31",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                              "typeString": "mapping(address => uint256)"
                            }
                          },
                          "id": 5943,
                          "indexExpression": {
                            "id": 5942,
                            "name": "addr",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5937,
                            "src": "7359:4:31",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "7345:19:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "hexValue": "30",
                          "id": 5944,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "7368:1:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "7345:24:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "5368617265686f6c64657220646f6573206e6f74206578697374",
                        "id": 5946,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "7371:28:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_afef0e4e29dc4da50f79fba698ab471b1022ded6f23517fe8d324cc091b72861",
                          "typeString": "literal_string \"Shareholder does not exist\""
                        },
                        "value": "Shareholder does not exist"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_afef0e4e29dc4da50f79fba698ab471b1022ded6f23517fe8d324cc091b72861",
                          "typeString": "literal_string \"Shareholder does not exist\""
                        }
                      ],
                      "id": 5940,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "7337:7:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 5947,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7337:63:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5948,
                  "nodeType": "ExpressionStatement",
                  "src": "7337:63:31"
                },
                {
                  "assignments": [
                    5950
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5950,
                      "mutability": "mutable",
                      "name": "balance",
                      "nameLocation": "7418:7:31",
                      "nodeType": "VariableDeclaration",
                      "scope": 6020,
                      "src": "7410:15:31",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 5949,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "7410:7:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 5955,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 5953,
                        "name": "addr",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5937,
                        "src": "7444:4:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "id": 5951,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5610,
                        "src": "7428:5:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IToken_$12234",
                          "typeString": "contract IToken"
                        }
                      },
                      "id": 5952,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "7434:9:31",
                      "memberName": "balanceOf",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3274,
                      "src": "7428:15:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                        "typeString": "function (address) view external returns (uint256)"
                      }
                    },
                    "id": 5954,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7428:21:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7410:39:31"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 5958,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 5956,
                      "name": "balance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5950,
                      "src": "7463:7:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 5957,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "7473:1:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "7463:11:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 5961,
                  "nodeType": "IfStatement",
                  "src": "7459:48:31",
                  "trueBody": {
                    "id": 5960,
                    "nodeType": "Block",
                    "src": "7476:31:31",
                    "statements": [
                      {
                        "functionReturnParameters": 5939,
                        "id": 5959,
                        "nodeType": "Return",
                        "src": "7490:7:31"
                      }
                    ]
                  }
                },
                {
                  "assignments": [
                    5963
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5963,
                      "mutability": "mutable",
                      "name": "holderIndex",
                      "nameLocation": "7524:11:31",
                      "nodeType": "VariableDeclaration",
                      "scope": 6020,
                      "src": "7516:19:31",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 5962,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "7516:7:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 5969,
                  "initialValue": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 5968,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "baseExpression": {
                        "id": 5964,
                        "name": "holderIndices",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5622,
                        "src": "7538:13:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                          "typeString": "mapping(address => uint256)"
                        }
                      },
                      "id": 5966,
                      "indexExpression": {
                        "id": 5965,
                        "name": "addr",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5937,
                        "src": "7552:4:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "7538:19:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "-",
                    "rightExpression": {
                      "hexValue": "31",
                      "id": 5967,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "7560:1:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_1_by_1",
                        "typeString": "int_const 1"
                      },
                      "value": "1"
                    },
                    "src": "7538:23:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7516:45:31"
                },
                {
                  "assignments": [
                    5971
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5971,
                      "mutability": "mutable",
                      "name": "lastIndex",
                      "nameLocation": "7579:9:31",
                      "nodeType": "VariableDeclaration",
                      "scope": 6020,
                      "src": "7571:17:31",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 5970,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "7571:7:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 5976,
                  "initialValue": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 5975,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 5972,
                        "name": "shareholders",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5631,
                        "src": "7591:12:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_storage",
                          "typeString": "address[] storage ref"
                        }
                      },
                      "id": 5973,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "7604:6:31",
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "src": "7591:19:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "-",
                    "rightExpression": {
                      "hexValue": "31",
                      "id": 5974,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "7613:1:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_1_by_1",
                        "typeString": "int_const 1"
                      },
                      "value": "1"
                    },
                    "src": "7591:23:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7571:43:31"
                },
                {
                  "assignments": [
                    5978
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5978,
                      "mutability": "mutable",
                      "name": "lastHolder",
                      "nameLocation": "7632:10:31",
                      "nodeType": "VariableDeclaration",
                      "scope": 6020,
                      "src": "7624:18:31",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 5977,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "7624:7:31",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 5982,
                  "initialValue": {
                    "baseExpression": {
                      "id": 5979,
                      "name": "shareholders",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5631,
                      "src": "7645:12:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_address_$dyn_storage",
                        "typeString": "address[] storage ref"
                      }
                    },
                    "id": 5981,
                    "indexExpression": {
                      "id": 5980,
                      "name": "lastIndex",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5971,
                      "src": "7658:9:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "7645:23:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7624:44:31"
                },
                {
                  "expression": {
                    "id": 5987,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 5983,
                        "name": "shareholders",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5631,
                        "src": "7678:12:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_storage",
                          "typeString": "address[] storage ref"
                        }
                      },
                      "id": 5985,
                      "indexExpression": {
                        "id": 5984,
                        "name": "holderIndex",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5963,
                        "src": "7691:11:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "7678:25:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 5986,
                      "name": "lastHolder",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5978,
                      "src": "7706:10:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "7678:38:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 5988,
                  "nodeType": "ExpressionStatement",
                  "src": "7678:38:31"
                },
                {
                  "expression": {
                    "id": 5995,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 5989,
                        "name": "holderIndices",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5622,
                        "src": "7726:13:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                          "typeString": "mapping(address => uint256)"
                        }
                      },
                      "id": 5991,
                      "indexExpression": {
                        "id": 5990,
                        "name": "lastHolder",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5978,
                        "src": "7740:10:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "7726:25:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "baseExpression": {
                        "id": 5992,
                        "name": "holderIndices",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5622,
                        "src": "7754:13:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                          "typeString": "mapping(address => uint256)"
                        }
                      },
                      "id": 5994,
                      "indexExpression": {
                        "id": 5993,
                        "name": "addr",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5937,
                        "src": "7768:4:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "7754:19:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "7726:47:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 5996,
                  "nodeType": "ExpressionStatement",
                  "src": "7726:47:31"
                },
                {
                  "expression": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "id": 5997,
                        "name": "shareholders",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5631,
                        "src": "7783:12:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_storage",
                          "typeString": "address[] storage ref"
                        }
                      },
                      "id": 5999,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "7796:3:31",
                      "memberName": "pop",
                      "nodeType": "MemberAccess",
                      "src": "7783:16:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_arraypop_nonpayable$_t_array$_t_address_$dyn_storage_ptr_$returns$__$bound_to$_t_array$_t_address_$dyn_storage_ptr_$",
                        "typeString": "function (address[] storage pointer)"
                      }
                    },
                    "id": 6000,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7783:18:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6001,
                  "nodeType": "ExpressionStatement",
                  "src": "7783:18:31"
                },
                {
                  "expression": {
                    "id": 6006,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 6002,
                        "name": "holderIndices",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5622,
                        "src": "7811:13:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                          "typeString": "mapping(address => uint256)"
                        }
                      },
                      "id": 6004,
                      "indexExpression": {
                        "id": 6003,
                        "name": "addr",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5937,
                        "src": "7825:4:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "7811:19:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "hexValue": "30",
                      "id": 6005,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "7833:1:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "7811:23:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 6007,
                  "nodeType": "ExpressionStatement",
                  "src": "7811:23:31"
                },
                {
                  "assignments": [
                    6009
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6009,
                      "mutability": "mutable",
                      "name": "country",
                      "nameLocation": "7851:7:31",
                      "nodeType": "VariableDeclaration",
                      "scope": 6020,
                      "src": "7844:14:31",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint16",
                        "typeString": "uint16"
                      },
                      "typeName": {
                        "id": 6008,
                        "name": "uint16",
                        "nodeType": "ElementaryTypeName",
                        "src": "7844:6:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint16",
                          "typeString": "uint16"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 6014,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 6012,
                        "name": "addr",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5937,
                        "src": "7894:4:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "id": 6010,
                        "name": "identityRegistry",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5617,
                        "src": "7861:16:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IIdentityRegistry_$6637",
                          "typeString": "contract IIdentityRegistry"
                        }
                      },
                      "id": 6011,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "7878:15:31",
                      "memberName": "investorCountry",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 6597,
                      "src": "7861:32:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint16_$",
                        "typeString": "function (address) view external returns (uint16)"
                      }
                    },
                    "id": 6013,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7861:38:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint16",
                      "typeString": "uint16"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7844:55:31"
                },
                {
                  "expression": {
                    "id": 6018,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "--",
                    "prefix": false,
                    "src": "7909:30:31",
                    "subExpression": {
                      "baseExpression": {
                        "id": 6015,
                        "name": "countryShareHolders",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5627,
                        "src": "7909:19:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint16_$_t_uint256_$",
                          "typeString": "mapping(uint16 => uint256)"
                        }
                      },
                      "id": 6017,
                      "indexExpression": {
                        "id": 6016,
                        "name": "country",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6009,
                        "src": "7929:7:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint16",
                          "typeString": "uint16"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "7909:28:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 6019,
                  "nodeType": "ExpressionStatement",
                  "src": "7909:30:31"
                }
              ]
            },
            "documentation": {
              "id": 5935,
              "nodeType": "StructuredDocumentation",
              "src": "6917:355:31",
              "text": "  If the address is in the `shareholders` array and the forthcoming\n  transfer or transferFrom will reduce their balance to 0, then\n  we need to remove them from the shareholders array.\n  @param addr The address to prune if their balance will be reduced to 0.\n  @dev see https://ethereum.stackexchange.com/a/39311"
            },
            "id": 6021,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "pruneShareholders",
            "nameLocation": "7286:17:31",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5938,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5937,
                  "mutability": "mutable",
                  "name": "addr",
                  "nameLocation": "7312:4:31",
                  "nodeType": "VariableDeclaration",
                  "scope": 6021,
                  "src": "7304:12:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5936,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7304:7:31",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7303:14:31"
            },
            "returnParameters": {
              "id": 5939,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "7327:0:31"
            },
            "scope": 6143,
            "src": "7277:669:31",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 6033,
              "nodeType": "Block",
              "src": "8177:50:31",
              "statements": [
                {
                  "expression": {
                    "baseExpression": {
                      "id": 6029,
                      "name": "countryShareHolders",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5627,
                      "src": "8194:19:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_uint16_$_t_uint256_$",
                        "typeString": "mapping(uint16 => uint256)"
                      }
                    },
                    "id": 6031,
                    "indexExpression": {
                      "id": 6030,
                      "name": "index",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6024,
                      "src": "8214:5:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint16",
                        "typeString": "uint16"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "8194:26:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 6028,
                  "id": 6032,
                  "nodeType": "Return",
                  "src": "8187:33:31"
                }
              ]
            },
            "documentation": {
              "id": 6022,
              "nodeType": "StructuredDocumentation",
              "src": "7952:136:31",
              "text": "  @dev get the amount of shareholders in a country\n  @param index the index of the country, following ISO 3166-1"
            },
            "functionSelector": "951f17ae",
            "id": 6034,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getShareholderCountByCountry",
            "nameLocation": "8102:28:31",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6025,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6024,
                  "mutability": "mutable",
                  "name": "index",
                  "nameLocation": "8138:5:31",
                  "nodeType": "VariableDeclaration",
                  "scope": 6034,
                  "src": "8131:12:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint16",
                    "typeString": "uint16"
                  },
                  "typeName": {
                    "id": 6023,
                    "name": "uint16",
                    "nodeType": "ElementaryTypeName",
                    "src": "8131:6:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint16",
                      "typeString": "uint16"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8130:14:31"
            },
            "returnParameters": {
              "id": 6028,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6027,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 6034,
                  "src": "8168:7:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6026,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8168:7:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8167:9:31"
            },
            "scope": 6143,
            "src": "8093:134:31",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              5563
            ],
            "body": {
              "id": 6066,
              "nodeType": "Block",
              "src": "8562:181:31",
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 6051,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "baseExpression": {
                        "id": 6047,
                        "name": "holderIndices",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5622,
                        "src": "8576:13:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                          "typeString": "mapping(address => uint256)"
                        }
                      },
                      "id": 6049,
                      "indexExpression": {
                        "id": 6048,
                        "name": "_to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6039,
                        "src": "8590:3:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "8576:18:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 6050,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "8598:1:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "8576:23:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 6055,
                  "nodeType": "IfStatement",
                  "src": "8572:65:31",
                  "trueBody": {
                    "id": 6054,
                    "nodeType": "Block",
                    "src": "8601:36:31",
                    "statements": [
                      {
                        "expression": {
                          "hexValue": "74727565",
                          "id": 6052,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "8622:4:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 6046,
                        "id": 6053,
                        "nodeType": "Return",
                        "src": "8615:11:31"
                      }
                    ]
                  }
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 6059,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 6056,
                        "name": "holderCount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5874,
                        "src": "8650:11:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                          "typeString": "function () view returns (uint256)"
                        }
                      },
                      "id": 6057,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "8650:13:31",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "id": 6058,
                      "name": "holderLimit",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5613,
                      "src": "8666:11:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "8650:27:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 6063,
                  "nodeType": "IfStatement",
                  "src": "8646:69:31",
                  "trueBody": {
                    "id": 6062,
                    "nodeType": "Block",
                    "src": "8679:36:31",
                    "statements": [
                      {
                        "expression": {
                          "hexValue": "74727565",
                          "id": 6060,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "8700:4:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 6046,
                        "id": 6061,
                        "nodeType": "Return",
                        "src": "8693:11:31"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "hexValue": "66616c7365",
                    "id": 6064,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "8731:5:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "false"
                  },
                  "functionReturnParameters": 6046,
                  "id": 6065,
                  "nodeType": "Return",
                  "src": "8724:12:31"
                }
              ]
            },
            "documentation": {
              "id": 6035,
              "nodeType": "StructuredDocumentation",
              "src": "8233:179:31",
              "text": "  @dev See {ICompliance-canTransfer}.\n  @return true if the amount of holders post-transfer is less or\n  equal to the maximum amount of token holders"
            },
            "functionSelector": "e46638e6",
            "id": 6067,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "canTransfer",
            "nameLocation": "8426:11:31",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 6043,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "8538:8:31"
            },
            "parameters": {
              "id": 6042,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6037,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 6067,
                  "src": "8447:7:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6036,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "8447:7:31",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6039,
                  "mutability": "mutable",
                  "name": "_to",
                  "nameLocation": "8484:3:31",
                  "nodeType": "VariableDeclaration",
                  "scope": 6067,
                  "src": "8476:11:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6038,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "8476:7:31",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6041,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 6067,
                  "src": "8497:7:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6040,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8497:7:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8437:86:31"
            },
            "returnParameters": {
              "id": 6046,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6045,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 6067,
                  "src": "8556:4:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 6044,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "8556:4:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8555:6:31"
            },
            "scope": 6143,
            "src": "8417:326:31",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              5573
            ],
            "body": {
              "id": 6088,
              "nodeType": "Block",
              "src": "8994:74:31",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 6081,
                        "name": "_to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6072,
                        "src": "9023:3:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 6080,
                      "name": "updateShareholders",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5934,
                      "src": "9004:18:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 6082,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9004:23:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6083,
                  "nodeType": "ExpressionStatement",
                  "src": "9004:23:31"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 6085,
                        "name": "_from",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6070,
                        "src": "9055:5:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 6084,
                      "name": "pruneShareholders",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6021,
                      "src": "9037:17:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 6086,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9037:24:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6087,
                  "nodeType": "ExpressionStatement",
                  "src": "9037:24:31"
                }
              ]
            },
            "documentation": {
              "id": 6068,
              "nodeType": "StructuredDocumentation",
              "src": "8749:112:31",
              "text": "  @dev See {ICompliance-transferred}.\n  updates the counter of shareholders if necessary"
            },
            "functionSelector": "8baf29b4",
            "id": 6089,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 6078,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 6077,
                  "name": "onlyToken",
                  "nameLocations": [
                    "8984:9:31"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 5652,
                  "src": "8984:9:31"
                },
                "nodeType": "ModifierInvocation",
                "src": "8984:9:31"
              }
            ],
            "name": "transferred",
            "nameLocation": "8875:11:31",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 6076,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "8975:8:31"
            },
            "parameters": {
              "id": 6075,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6070,
                  "mutability": "mutable",
                  "name": "_from",
                  "nameLocation": "8904:5:31",
                  "nodeType": "VariableDeclaration",
                  "scope": 6089,
                  "src": "8896:13:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6069,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "8896:7:31",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6072,
                  "mutability": "mutable",
                  "name": "_to",
                  "nameLocation": "8927:3:31",
                  "nodeType": "VariableDeclaration",
                  "scope": 6089,
                  "src": "8919:11:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6071,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "8919:7:31",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6074,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 6089,
                  "src": "8940:7:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6073,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8940:7:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8886:79:31"
            },
            "returnParameters": {
              "id": 6079,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8994:0:31"
            },
            "scope": 6143,
            "src": "8866:202:31",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              5581
            ],
            "body": {
              "id": 6111,
              "nodeType": "Block",
              "src": "9261:89:31",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 6103,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 6101,
                          "name": "_value",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 6094,
                          "src": "9279:6:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">",
                        "rightExpression": {
                          "hexValue": "30",
                          "id": 6102,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "9288:1:31",
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "9279:10:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "4e6f20746f6b656e2063726561746564",
                        "id": 6104,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "9291:18:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_66eeaba3418ac6b87b03d31af59bc39ad8fee7233b46f609a69227f2bc78bbf0",
                          "typeString": "literal_string \"No token created\""
                        },
                        "value": "No token created"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_66eeaba3418ac6b87b03d31af59bc39ad8fee7233b46f609a69227f2bc78bbf0",
                          "typeString": "literal_string \"No token created\""
                        }
                      ],
                      "id": 6100,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "9271:7:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 6105,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9271:39:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6106,
                  "nodeType": "ExpressionStatement",
                  "src": "9271:39:31"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 6108,
                        "name": "_to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6092,
                        "src": "9339:3:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 6107,
                      "name": "updateShareholders",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5934,
                      "src": "9320:18:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 6109,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9320:23:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6110,
                  "nodeType": "ExpressionStatement",
                  "src": "9320:23:31"
                }
              ]
            },
            "documentation": {
              "id": 6090,
              "nodeType": "StructuredDocumentation",
              "src": "9074:108:31",
              "text": "  @dev See {ICompliance-created}.\n  updates the counter of shareholders if necessary"
            },
            "functionSelector": "5f8dead3",
            "id": 6112,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 6098,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 6097,
                  "name": "onlyToken",
                  "nameLocations": [
                    "9251:9:31"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 5652,
                  "src": "9251:9:31"
                },
                "nodeType": "ModifierInvocation",
                "src": "9251:9:31"
              }
            ],
            "name": "created",
            "nameLocation": "9196:7:31",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 6096,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "9242:8:31"
            },
            "parameters": {
              "id": 6095,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6092,
                  "mutability": "mutable",
                  "name": "_to",
                  "nameLocation": "9212:3:31",
                  "nodeType": "VariableDeclaration",
                  "scope": 6112,
                  "src": "9204:11:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6091,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9204:7:31",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6094,
                  "mutability": "mutable",
                  "name": "_value",
                  "nameLocation": "9225:6:31",
                  "nodeType": "VariableDeclaration",
                  "scope": 6112,
                  "src": "9217:14:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6093,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "9217:7:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "9203:29:31"
            },
            "returnParameters": {
              "id": 6099,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "9261:0:31"
            },
            "scope": 6143,
            "src": "9187:163:31",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              5589
            ],
            "body": {
              "id": 6127,
              "nodeType": "Block",
              "src": "9555:41:31",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 6124,
                        "name": "_from",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6115,
                        "src": "9583:5:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 6123,
                      "name": "pruneShareholders",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6021,
                      "src": "9565:17:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 6125,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9565:24:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6126,
                  "nodeType": "ExpressionStatement",
                  "src": "9565:24:31"
                }
              ]
            },
            "documentation": {
              "id": 6113,
              "nodeType": "StructuredDocumentation",
              "src": "9356:110:31",
              "text": "  @dev See {ICompliance-destroyed}.\n  updates the counter of shareholders if necessary"
            },
            "functionSelector": "8d2ea772",
            "id": 6128,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 6121,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 6120,
                  "name": "onlyToken",
                  "nameLocations": [
                    "9545:9:31"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 5652,
                  "src": "9545:9:31"
                },
                "nodeType": "ModifierInvocation",
                "src": "9545:9:31"
              }
            ],
            "name": "destroyed",
            "nameLocation": "9480:9:31",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 6119,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "9536:8:31"
            },
            "parameters": {
              "id": 6118,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6115,
                  "mutability": "mutable",
                  "name": "_from",
                  "nameLocation": "9498:5:31",
                  "nodeType": "VariableDeclaration",
                  "scope": 6128,
                  "src": "9490:13:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6114,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9490:7:31",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6117,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 6128,
                  "src": "9505:7:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6116,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "9505:7:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "9489:37:31"
            },
            "returnParameters": {
              "id": 6122,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "9555:0:31"
            },
            "scope": 6143,
            "src": "9471:125:31",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              5595
            ],
            "body": {
              "id": 6141,
              "nodeType": "Block",
              "src": "9781:44:31",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 6138,
                        "name": "newOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6131,
                        "src": "9809:8:31",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 6137,
                      "name": "transferOwnership",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2484,
                      "src": "9791:17:31",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 6139,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9791:27:31",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6140,
                  "nodeType": "ExpressionStatement",
                  "src": "9791:27:31"
                }
              ]
            },
            "documentation": {
              "id": 6129,
              "nodeType": "StructuredDocumentation",
              "src": "9602:81:31",
              "text": "  @dev See {ICompliance-transferOwnershipOnComplianceContract}."
            },
            "functionSelector": "7bcf0487",
            "id": 6142,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 6135,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 6134,
                  "name": "onlyOwner",
                  "nameLocations": [
                    "9771:9:31"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 2424,
                  "src": "9771:9:31"
                },
                "nodeType": "ModifierInvocation",
                "src": "9771:9:31"
              }
            ],
            "name": "transferOwnershipOnComplianceContract",
            "nameLocation": "9697:37:31",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 6133,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "9762:8:31"
            },
            "parameters": {
              "id": 6132,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6131,
                  "mutability": "mutable",
                  "name": "newOwner",
                  "nameLocation": "9743:8:31",
                  "nodeType": "VariableDeclaration",
                  "scope": 6142,
                  "src": "9735:16:31",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6130,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9735:7:31",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "9734:18:31"
            },
            "returnParameters": {
              "id": 6136,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "9781:0:31"
            },
            "scope": 6143,
            "src": "9688:137:31",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          }
        ],
        "scope": 6144,
        "src": "1276:8551:31",
        "usedErrors": []
      }
    ],
    "src": "1094:8734:31"
  },
  "compiler": {
    "name": "solc",
    "version": "0.8.17+commit.8df45f5f.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.4.8",
  "updatedAt": "2022-12-08T12:51:01.358Z",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "addTokenAgent(address)": {
        "details": "See {ICompliance-addTokenAgent}."
      },
      "bindToken(address)": {
        "details": "See {ICompliance-isTokenAgent}."
      },
      "canTransfer(address,address,uint256)": {
        "details": "See {ICompliance-canTransfer}.",
        "returns": {
          "_0": "true if the amount of holders post-transfer is less or  equal to the maximum amount of token holders"
        }
      },
      "constructor": {
        "details": "the constructor initiates the smart contract with the initial state variables",
        "params": {
          "_holderLimit": "the holder limit for the token concerned  emits a `HolderLimitSet` event",
          "_token": "the address of the token concerned by the rules of this compliance contract"
        }
      },
      "created(address,uint256)": {
        "details": "See {ICompliance-created}.  updates the counter of shareholders if necessary"
      },
      "destroyed(address,uint256)": {
        "details": "See {ICompliance-destroyed}.  updates the counter of shareholders if necessary"
      },
      "getHolderLimit()": {
        "details": "returns the holder limit as set on the contract"
      },
      "getShareholderCountByCountry(uint16)": {
        "details": "get the amount of shareholders in a country",
        "params": {
          "index": "the index of the country, following ISO 3166-1"
        }
      },
      "holderAt(uint256)": {
        "details": "By counting the number of token holders using `holderCount`  you can retrieve the complete list of token holders, one at a time.  It MUST throw if `index >= holderCount()`.",
        "params": {
          "index": "The zero-based index of the holder."
        },
        "returns": {
          "_0": "`address` the address of the token holder with the given index."
        }
      },
      "holderCount()": {
        "details": "returns the amount of token holders"
      },
      "isTokenAgent(address)": {
        "details": "See {ICompliance-isTokenAgent}."
      },
      "isTokenBound(address)": {
        "details": "See {ICompliance-isTokenBound}."
      },
      "owner()": {
        "details": "Returns the address of the current owner."
      },
      "removeTokenAgent(address)": {
        "details": "See {ICompliance-isTokenAgent}."
      },
      "renounceOwnership()": {
        "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
      },
      "setHolderLimit(uint256)": {
        "details": "sets the holder limit as required for compliance purpose",
        "params": {
          "_holderLimit": "the holder limit for the token concerned  This function can only be called by the agent of the Compliance contract  emits a `HolderLimitSet` event"
        }
      },
      "transferOwnership(address)": {
        "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
      },
      "transferOwnershipOnComplianceContract(address)": {
        "details": "See {ICompliance-transferOwnershipOnComplianceContract}."
      },
      "transferred(address,address,uint256)": {
        "details": "See {ICompliance-transferred}.  updates the counter of shareholders if necessary"
      },
      "unbindToken(address)": {
        "details": "See {ICompliance-isTokenAgent}."
      }
    },
    "stateVariables": {
      "_tokenAgentsList": {
        "details": "Mapping between agents and their statuses"
      },
      "_tokensBound": {
        "details": "Mapping of tokens linked to the compliance contract"
      },
      "countryShareHolders": {
        "details": "the amount of shareholders per country"
      },
      "holderIndices": {
        "details": "the index of each shareholder in the array `shareholders`"
      },
      "holderLimit": {
        "details": "the limit of holders for this token"
      },
      "identityRegistry": {
        "details": "the Identity registry contract linked to `token`"
      },
      "shareholders": {
        "details": "the addresses of all shareholders"
      },
      "token": {
        "details": "the token on which this compliance contract is applied"
      }
    },
    "version": 1
  },
  "userdoc": {
    "events": {
      "HolderLimitSet(uint256)": {
        "notice": "this event is emitted when the holder limit is set.  the event is emitted by the setHolderLimit function and by the constructor  `_holderLimit` is the holder limit for this token"
      },
      "TokenAgentAdded(address)": {
        "notice": "this event is emitted when the Agent has been added on the allowedList of this Compliance.  the event is emitted by the Compliance constructor and by the addTokenAgent function  `_agentAddress` is the address of the Agent to add"
      },
      "TokenAgentRemoved(address)": {
        "notice": "this event is emitted when the Agent has been removed from the agent list of this Compliance.  the event is emitted by the Compliance constructor and by the removeTokenAgent function  `_agentAddress` is the address of the Agent to remove"
      },
      "TokenBound(address)": {
        "notice": "this event is emitted when a token has been bound to the compliance contract  the event is emitted by the bindToken function  `_token` is the address of the token to bind"
      },
      "TokenUnbound(address)": {
        "notice": "this event is emitted when a token has been unbound from the compliance contract  the event is emitted by the unbindToken function  `_token` is the address of the token to unbind"
      }
    },
    "kind": "user",
    "methods": {},
    "version": 1
  }
}