{
  "contractName": "SalaryWithDAO",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "contract NFTSalaryRecipient",
          "name": "_salaryRecipients",
          "type": "address"
        },
        {
          "internalType": "contract NFTRestoreContract",
          "name": "_salaryRestoreNFT",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "_uri",
          "type": "string"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "oldAccount",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newAccount",
          "type": "address"
        }
      ],
      "name": "AccountRestored",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "oldAccount",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newAccount",
          "type": "address"
        }
      ],
      "name": "AccountUnrestored",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        }
      ],
      "name": "ApprovalForAll",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "contract IERC1155",
          "name": "contractAddress",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "collateralTokenId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "oracleId",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "CollateralWithdrawn",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "customer",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "condition",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "ConditionCreated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "customer",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "originalCondition",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "newCondition",
          "type": "uint256"
        }
      ],
      "name": "ConditionReCreate",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "contract IERC1155",
          "name": "collateralContractAddress",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "collateralTokenId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "DonateCollateral",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "oracleId",
          "type": "uint64"
        }
      ],
      "name": "OracleCreated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "oracleId",
          "type": "uint64"
        }
      ],
      "name": "OracleFinished",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "oracleOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "oracleId",
          "type": "uint64"
        }
      ],
      "name": "OracleOwnerChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "oracleId",
          "type": "uint64"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "condition",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "numerator",
          "type": "uint256"
        }
      ],
      "name": "ReportedNumerator",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "oracleId",
          "type": "uint64"
        },
        {
          "indexed": true,
          "internalType": "uint64[]",
          "name": "conditions",
          "type": "uint64[]"
        },
        {
          "indexed": false,
          "internalType": "uint256[]",
          "name": "numerators",
          "type": "uint256[]"
        }
      ],
      "name": "ReportedNumeratorsBatch",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "customer",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "condition",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "SalaryMinted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256[]",
          "name": "ids",
          "type": "uint256[]"
        },
        {
          "indexed": false,
          "internalType": "uint256[]",
          "name": "values",
          "type": "uint256[]"
        }
      ],
      "name": "TransferBatch",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "TransferSingle",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "string",
          "name": "value",
          "type": "string"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "URI",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "accountHasSalary",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "accounts",
          "type": "address[]"
        },
        {
          "internalType": "uint256[]",
          "name": "ids",
          "type": "uint256[]"
        }
      ],
      "name": "balanceOfBatch",
      "outputs": [
        {
          "internalType": "uint256[]",
          "name": "",
          "type": "uint256[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_newOracleOwner",
          "type": "address"
        },
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        }
      ],
      "name": "changeOracleOwner",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC1155",
          "name": "_collateralContractAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_collateralTokenId",
          "type": "uint256"
        },
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        },
        {
          "internalType": "uint256",
          "name": "_condition",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_user",
          "type": "address"
        }
      ],
      "name": "collateralOwing",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "conditionCreationDates",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "conditionOwners",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC1155",
          "name": "_collateralContractAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_collateralTokenId",
          "type": "uint256"
        },
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "donate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        }
      ],
      "name": "finishOracle",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "firstConditionInChain",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "firstToLastConditionInChain",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC1155",
          "name": "_collateralContractAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_collateralTokenId",
          "type": "uint256"
        },
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "gatherDeFiProfit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        }
      ],
      "name": "gracePeriodEnd",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "isApprovedForAll",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_user",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_condition",
          "type": "uint256"
        }
      ],
      "name": "isConditionalLocked",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        }
      ],
      "name": "isOracleFinished",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "lastCollateralBalanceFirstRoundMap",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "lastCollateralBalanceSecondRoundMap",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "lastSalaryDates",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "maxConditionId",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "maxOracleId",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_condition",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "mintSalary",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256[]",
          "name": "",
          "type": "uint256[]"
        },
        {
          "internalType": "uint256[]",
          "name": "",
          "type": "uint256[]"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "name": "onERC1155BatchReceived",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "name": "onERC1155Received",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "name": "onERC721Received",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        }
      ],
      "name": "oracleOwner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "originalAddresses",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "originalToCurrentAddresses",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        }
      ],
      "name": "payoutDenominator",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        },
        {
          "internalType": "uint256",
          "name": "_condition",
          "type": "uint256"
        }
      ],
      "name": "payoutNumerator",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_condition",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "recreateCondition",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        },
        {
          "internalType": "uint256",
          "name": "_condition",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_numerator",
          "type": "uint256"
        }
      ],
      "name": "reportNumerator",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        },
        {
          "internalType": "uint64[]",
          "name": "_conditions",
          "type": "uint64[]"
        },
        {
          "internalType": "uint256[]",
          "name": "_numerators",
          "type": "uint256[]"
        }
      ],
      "name": "reportNumeratorsBatch",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_oldAccount",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_newAccount",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_token",
          "type": "uint256"
        }
      ],
      "name": "restoreFunds",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_oldAccount",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_newAccount",
          "type": "address"
        },
        {
          "internalType": "uint256[]",
          "name": "_tokens",
          "type": "uint256[]"
        }
      ],
      "name": "restoreFundsBatch",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        },
        {
          "internalType": "uint256[]",
          "name": "_ids",
          "type": "uint256[]"
        },
        {
          "internalType": "uint256[]",
          "name": "_values",
          "type": "uint256[]"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "safeBatchTransferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_id",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_value",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "safeTransferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "salaryRecipients",
      "outputs": [
        {
          "internalType": "contract NFTSalaryRecipient",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "salaryRestoreNFT",
      "outputs": [
        {
          "internalType": "contract NFTRestoreContract",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        }
      ],
      "name": "setApprovalForAll",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        },
        {
          "internalType": "uint256",
          "name": "_time",
          "type": "uint256"
        }
      ],
      "name": "updateGracePeriodEnds",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "uri",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "name": "usersWithdrewInFirstRound",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC1155",
          "name": "_collateralContractAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_collateralTokenId",
          "type": "uint256"
        },
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        },
        {
          "internalType": "uint256",
          "name": "_condition",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "withdrawCollateral",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_oracleOwner",
          "type": "address"
        }
      ],
      "name": "createOracle",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_customer",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "registerCustomer",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract NFTSalaryRecipient\",\"name\":\"_salaryRecipients\",\"type\":\"address\"},{\"internalType\":\"contract NFTRestoreContract\",\"name\":\"_salaryRestoreNFT\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_uri\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldAccount\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAccount\",\"type\":\"address\"}],\"name\":\"AccountRestored\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldAccount\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAccount\",\"type\":\"address\"}],\"name\":\"AccountUnrestored\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC1155\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"collateralTokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"oracleId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CollateralWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"customer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"condition\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ConditionCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"customer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"originalCondition\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"newCondition\",\"type\":\"uint256\"}],\"name\":\"ConditionReCreate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC1155\",\"name\":\"collateralContractAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"collateralTokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"DonateCollateral\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"oracleId\",\"type\":\"uint64\"}],\"name\":\"OracleCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"oracleId\",\"type\":\"uint64\"}],\"name\":\"OracleFinished\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oracleOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"oracleId\",\"type\":\"uint64\"}],\"name\":\"OracleOwnerChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"oracleId\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"condition\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"numerator\",\"type\":\"uint256\"}],\"name\":\"ReportedNumerator\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"oracleId\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint64[]\",\"name\":\"conditions\",\"type\":\"uint64[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"numerators\",\"type\":\"uint256[]\"}],\"name\":\"ReportedNumeratorsBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"customer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"condition\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"SalaryMinted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"TransferBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"TransferSingle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"URI\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"accountHasSalary\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"name\":\"balanceOfBatch\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newOracleOwner\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"}],\"name\":\"changeOracleOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC1155\",\"name\":\"_collateralContractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_collateralTokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"_condition\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"collateralOwing\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"conditionCreationDates\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"conditionOwners\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_oracleOwner\",\"type\":\"address\"}],\"name\":\"createOracle\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC1155\",\"name\":\"_collateralContractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_collateralTokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"donate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"}],\"name\":\"finishOracle\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"firstConditionInChain\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"firstToLastConditionInChain\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC1155\",\"name\":\"_collateralContractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_collateralTokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"gatherDeFiProfit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"}],\"name\":\"gracePeriodEnd\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_condition\",\"type\":\"uint256\"}],\"name\":\"isConditionalLocked\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"}],\"name\":\"isOracleFinished\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"lastCollateralBalanceFirstRoundMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"lastCollateralBalanceSecondRoundMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"lastSalaryDates\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxConditionId\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxOracleId\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_condition\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"mintSalary\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"}],\"name\":\"oracleOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"originalAddresses\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"originalToCurrentAddresses\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"}],\"name\":\"payoutDenominator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"_condition\",\"type\":\"uint256\"}],\"name\":\"payoutNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_condition\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"recreateCondition\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_customer\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"registerCustomer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"_condition\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_numerator\",\"type\":\"uint256\"}],\"name\":\"reportNumerator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"},{\"internalType\":\"uint64[]\",\"name\":\"_conditions\",\"type\":\"uint64[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_numerators\",\"type\":\"uint256[]\"}],\"name\":\"reportNumeratorsBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_oldAccount\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_newAccount\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_token\",\"type\":\"uint256\"}],\"name\":\"restoreFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_oldAccount\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_newAccount\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"_tokens\",\"type\":\"uint256[]\"}],\"name\":\"restoreFundsBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"_ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"salaryRecipients\",\"outputs\":[{\"internalType\":\"contract NFTSalaryRecipient\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"salaryRestoreNFT\",\"outputs\":[{\"internalType\":\"contract NFTRestoreContract\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"_time\",\"type\":\"uint256\"}],\"name\":\"updateGracePeriodEnds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"usersWithdrewInFirstRound\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC1155\",\"name\":\"_collateralContractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_collateralTokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"_condition\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"withdrawCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Victor Porton TODO: Rename\",\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"details\":\"See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address.\"},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length.\"},\"changeOracleOwner(address,uint64)\":{\"params\":{\"_newOracleOwner\":\"New owner.\",\"_oracleId\":\"The oracle whose owner to change.\"}},\"collateralOwing(address,uint256,uint64,uint256,address)\":{\"params\":{\"_collateralContractAddress\":\"The ERC-1155 collateral token contract.\",\"_collateralTokenId\":\"The ERC-1155 collateral token ID.\",\"_condition\":\"The condition (the original receiver of a conditional token).\",\"_oracleId\":\"From which oracle's \\\"account\\\" to withdraw.\",\"_user\":\"The user to which we may owe.\"}},\"constructor\":{\"params\":{\"_salaryRecipients\":\"The salary recipients contract.\",\"_salaryRestoreNFT\":\"The salary control contract.\",\"_uri\":\"The ERC-1155 token URI.\"}},\"donate(address,uint256,uint64,uint256,address,address,bytes)\":{\"params\":{\"_amount\":\"The amount to donate.\",\"_collateralContractAddress\":\"The collateral ERC-1155 contract address.\",\"_collateralTokenId\":\"The collateral ERC-1155 token ID.\",\"_data\":\"Additional transaction data.\",\"_from\":\"From whom to take the donation.\",\"_oracleId\":\"The oracle ID to whose ecosystem to donate to.\",\"_to\":\"On whose account the donation amount is assigned.\"}},\"finishOracle(uint64)\":{\"params\":{\"_oracleId\":\"The oracle ID. You should set grace period end time before calling this method.\"}},\"gatherDeFiProfit(address,uint256,uint64,bytes)\":{\"params\":{\"_collateralContractAddress\":\"The collateral ERC-1155 contract address.\",\"_collateralTokenId\":\"The collateral ERC-1155 token ID.\",\"_data\":\"Additional transaction data.\",\"_oracleId\":\"The oracle ID to whose ecosystem to donate to.\"}},\"gracePeriodEnd(uint64)\":{\"params\":{\"_oracleId\":\"For which oracle.\"}},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC1155-isApprovedForAll}.\"},\"isConditionalLocked(address,uint256)\":{\"params\":{\"_condition\":\"The condition (the original receiver of a conditional token).\",\"_user\":\"Querying if locked for this user.\"}},\"isOracleFinished(uint64)\":{\"params\":{\"_oracleId\":\"The oracle ID.\"},\"returns\":{\"_0\":\"`true` if it has finished.\"}},\"mintSalary(uint256,bytes)\":{\"params\":{\"_condition\":\"The condition ID.\",\"_data\":\"Additional data. This method can be called only by the salary receiver.\"}},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"See {IERC721Receiver-onERC721Received}. Always returns `IERC721Receiver.onERC721Received.selector`.\"},\"oracleOwner(uint64)\":{\"params\":{\"_oracleId\":\"The oracle ID.\"}},\"payoutDenominator(uint64)\":{\"params\":{\"_oracleId\":\"The oracle ID. The result can't change if the oracle has finished.\"}},\"payoutNumerator(uint64,uint256)\":{\"params\":{\"_condition\":\"The condition (the original receiver of a conditional token). The result can't change if the oracle has finished.\",\"_oracleId\":\"The oracle ID.\"}},\"registerCustomer(address,bytes)\":{\"params\":{\"_customer\":\"The original address.\",\"_data\":\"The current data.\"}},\"reportNumerator(uint64,uint256,uint256)\":{\"params\":{\"_condition\":\"The condition.\",\"_numerator\":\"The relative score of the condition. Note: We could make oracles easily verificable by a hash of all the data, but       - It may need allowing to set a numerator only once.       - It may be not necessary because future technology will allow to aggregate blockchains.\",\"_oracleId\":\"The oracle ID.\"}},\"reportNumeratorsBatch(uint64,uint64[],uint256[])\":{\"params\":{\"_conditions\":\"The conditions.\",\"_numerators\":\"The relative scores of the condition.\",\"_oracleId\":\"The oracle ID.\"}},\"restoreFunds(address,address,uint256)\":{\"params\":{\"_newAccount\":\"New account.\",\"_oldAccount\":\"Old account.\",\"_token\":\"The ERC-1155 token ID. This function can be called by the affected user. Remark: We don't need to create new tokens like as on a regular transfer, because it isn't a transfer to a trader.\"}},\"restoreFundsBatch(address,address,uint256[])\":{\"params\":{\"_newAccount\":\"New account.\",\"_oldAccount\":\"Old account.\",\"_tokens\":\"The ERC-1155 token IDs. This function can be called by the affected user. Remark: We don't need to create new tokens like as on a regular transfer, because it isn't a transfer to a trader.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC1155-setApprovalForAll}.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}. Time complexity O(1), guaranteed to always use less than 30 000 gas.\"},\"totalSupply(uint256)\":{\"params\":{\"id\":\"Token ID.\"},\"returns\":{\"_0\":\"Total supply.\"}},\"uri(uint256)\":{\"details\":\"See {IERC1155MetadataURI-uri}. This implementation returns the same URI for *all* token types. It relies on the token type ID substitution mechanism https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. Clients calling this function must replace the `\\\\{id\\\\}` substring with the actual token type ID.\"},\"withdrawCollateral(address,uint256,uint64,uint256,bytes)\":{\"params\":{\"_collateralContractAddress\":\"The ERC-1155 collateral token contract.\",\"_collateralTokenId\":\"The ERC-1155 collateral token ID.\",\"_condition\":\"The condition.\",\"_data\":\"Additional data. Notes: - It is made impossible to withdraw somebody's other collateral, as otherwise we can't mark non-active   accounts in grace period. - We can't transfer to somebody other than `msg.sender` because anybody can transfer   (needed for multi-level transfers). - After this function is called, it becomes impossible to transfer the corresponding conditional token   of `msg.sender` (to prevent its repeated withdrawal).\",\"_oracleId\":\"From which oracle's \\\"account\\\" to withdraw.\"}}},\"version\":1},\"userdoc\":{\"events\":{\"CollateralWithdrawn(address,uint256,uint64,address,uint256)\":{\"notice\":\"Emitted when collateral is withdrawn.\"},\"ConditionCreated(address,address,uint256,bytes)\":{\"notice\":\"Emitted when an oracle owner is set.\"},\"ConditionReCreate(address,uint256,uint256)\":{\"notice\":\"Salary token recreated (salary recalculation request).\"},\"DonateCollateral(address,uint256,address,uint256,address,bytes)\":{\"notice\":\"Emitted when a collateral is donated.\"},\"OracleCreated(address,uint64)\":{\"notice\":\"Emitted when an oracle is created.\"},\"OracleFinished(uint64)\":{\"notice\":\"Emitted when an oracle is marked as having finished its work.\"},\"OracleOwnerChanged(address,uint64)\":{\"notice\":\"Emitted when an oracle owner is set.\"},\"ReportedNumerator(uint64,uint256,uint256)\":{\"notice\":\"A condition score was stored in the chain by an oracle.\"},\"ReportedNumeratorsBatch(uint64,uint64[],uint256[])\":{\"notice\":\"Some condition scores were stored in the chain by an oracle.\"},\"SalaryMinted(address,uint256,uint256,bytes)\":{\"notice\":\"Salary tokens minted.\"}},\"kind\":\"user\",\"methods\":{\"accountHasSalary(address)\":{\"notice\":\"Mapping (current address => account has at least one salary).\"},\"changeOracleOwner(address,uint64)\":{\"notice\":\"Modify the owner of an oracle.\"},\"collateralOwing(address,uint256,uint64,uint256,address)\":{\"notice\":\"Calculate how much collateral is owed to a user.\"},\"constructor\":{\"notice\":\"Constructor.\"},\"createOracle(address)\":{\"notice\":\"Create an oracle for caclcualting salary amounts.\"},\"donate(address,uint256,uint64,uint256,address,address,bytes)\":{\"notice\":\"Donate funds in an ERC-1155 token. First, the collateral token need to be approved to be spent by this contract from the address `_from`. It also mints a token (with a different ID), that counts donations in that token.\"},\"finishOracle(uint64)\":{\"notice\":\"Need to be called after all numerators were reported.\"},\"firstConditionInChain(uint256)\":{\"notice\":\"Mapping (condition ID => first condition ID in the chain) I call _chain_ of conditions the list of conditions resulting from creating and recreating conditions.\"},\"firstToLastConditionInChain(uint256)\":{\"notice\":\"Mapping (first condition ID in the chain => last condition ID in the chain) I call _chain_ of conditions the list of conditions resulting from creating and recreating conditions.\"},\"gatherDeFiProfit(address,uint256,uint64,bytes)\":{\"notice\":\"Gather a DeFi profit of a token previous donated to this contact.\"},\"gracePeriodEnd(uint64)\":{\"notice\":\"Retrieve the end of the grace period.\"},\"isConditionalLocked(address,uint256)\":{\"notice\":\"Are transfers of a conditinal token locked? This is used to prevent its repeated withdrawal.\"},\"isOracleFinished(uint64)\":{\"notice\":\"Check if an oracle has finished.\"},\"mintSalary(uint256,bytes)\":{\"notice\":\"Mint a salary token.\"},\"oracleOwner(uint64)\":{\"notice\":\"Get the oracle owner.\"},\"originalAddresses(address)\":{\"notice\":\"Mapping (current address => very first address an account had).\"},\"originalToCurrentAddresses(address)\":{\"notice\":\"Mapping (very first address an account had => current address).\"},\"payoutDenominator(uint64)\":{\"notice\":\"Retrieve the last stored payout denominator (the sum of all numerators of the oracle).\"},\"payoutNumerator(uint64,uint256)\":{\"notice\":\"Retrieve the last stored payout numerator (relative score of a condition).\"},\"recreateCondition(uint256,bytes)\":{\"notice\":\"Make a new condition that replaces the old one. In other words, it is a request to recalculate somebody's salary. Anyone can request to recalculate anyone's salary. It's also useful to punish someone for decreasing his work performance or an evil act. This is to be called among other when a person dies. Recalculation is also forced when a salary receiver transfers away his current salary token. It is useful to remove a trader's incentive to kill the issuer to reduce the circulating supply. Issue to solve later: Should we recommend: - calling this function on each new project milestone? - calling this function regularly (e.g. every week)? This function also withdraws the old token.\"},\"registerCustomer(address,bytes)\":{\"notice\":\"Register a salary recipient. Can be called both before or after the oracle finish. However registering after the finish is useless. Anyone can register anyone (useful for robots registering a person). Registering another person is giving him money against his will (forcing to hire bodyguards, etc.), but if one does not want, he can just not associate this address with his identity in his publications.\"},\"reportNumerator(uint64,uint256,uint256)\":{\"notice\":\"Called by the oracle owner for reporting results of conditions.\"},\"reportNumeratorsBatch(uint64,uint64[],uint256[])\":{\"notice\":\"Called by the oracle owner for reporting results of several conditions.\"},\"restoreFunds(address,address,uint256)\":{\"notice\":\"Move the entire balance of a token from an old account to a new account of the same user.\"},\"restoreFundsBatch(address,address,uint256[])\":{\"notice\":\"Move the entire balance of tokens from an old account to a new account of the same user.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"An ERC-1155 function. We disallow transfers of conditional tokens after redeem `_to` prevent \\\"gathering\\\" them before redeeming each oracle.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"notice\":\"An ERC-1155 function. We disallow transfers of conditional tokens after redeem `_to` prevent \\\"gathering\\\" them before redeeming each oracle.\"},\"totalSupply(uint256)\":{\"notice\":\"Total supply of a token (conforms to `IERC1155Views`).\"},\"updateGracePeriodEnds(uint64,uint256)\":{\"notice\":\"Set the end time of the grace period. The first withdrawal can be done *only* during the grace period. The second withdrawal can be done after the end of the grace period and only if the first withdrawal was done. The intention of the grace period is to check which of users are active (\\\"alive\\\").\"},\"usersWithdrewInFirstRound(uint64)\":{\"notice\":\"Mapping (oracleId => amount user withdrew in first round) (see `docs/Calculations.md`).\"},\"withdrawCollateral(address,uint256,uint64,uint256,bytes)\":{\"notice\":\"Transfer to `msg.sender` the collateral ERC-1155 token. The amount transferred is proportional to the score of `_condition` by the oracle.\"}},\"notice\":\"Salary system with a \\\"DAO\\\" that can assign attorneys to restore lost Ethereum accounts.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"/home/user/Projects/future-contracts/contracts/SalaryWithDAO.sol\":\"SalaryWithDAO\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/user/Projects/future-contracts/contracts/BaseBidOnAddresses.sol\":{\"keccak256\":\"0x0f468f447255c1349ffac58a16d2a3d64e8b3a14ad8289acdf367538d1dce04e\",\"license\":\"LGPL-3.0-or-later\",\"urls\":[\"bzz-raw://7e610bbd572bfb395b91253f5244e0dd8f5a20c523a9df5d846f9d370b3fbb76\",\"dweb:/ipfs/QmbrcKL49Efghwx95EEM7SD2PArLkUMxdNujUk2tygb91Y\"]},\"/home/user/Projects/future-contracts/contracts/BaseLock.sol\":{\"keccak256\":\"0x477edfd8178110507dd44a101ec4d45bd82e073a8441c30062a9ca3cc3742184\",\"license\":\"LGPL-3.0-or-later\",\"urls\":[\"bzz-raw://0188608bd813e9e1de9472d2c71264fa24655ec646cc59be93d56a648fab1c6c\",\"dweb:/ipfs/QmdERM9oNEvHgmes3AWG8zAyx4ueAFKtXGsegAfXUKryDW\"]},\"/home/user/Projects/future-contracts/contracts/BaseRestorableSalary.sol\":{\"keccak256\":\"0x69f2418b873bb16a2522053f5ec20f316720ec922e771b4151a6c97a3d868ca5\",\"license\":\"LGPL-3.0-or-later\",\"urls\":[\"bzz-raw://ac16bd3c1726ea980d637737a5ed60980a1260d39a9ceb49b285cf233010d809\",\"dweb:/ipfs/Qma119S26dWvasFm9ouEBnoTRyNr7aFBihNe48iJe8LgmV\"]},\"/home/user/Projects/future-contracts/contracts/BaseSalary.sol\":{\"keccak256\":\"0xf1b94d7cc7658e89c87ac0041a599af9b37e243441f25c578fb1422814156768\",\"license\":\"LGPL-3.0-or-later\",\"urls\":[\"bzz-raw://3e330bca4e83a61c15c7407c52fe6d9ddb95b5208033f14a9f7defda2fbb5514\",\"dweb:/ipfs/Qmex5ypCeXjyiCrRWqhWZdNzeU6pg5dXPARXRnZmtUiLoz\"]},\"/home/user/Projects/future-contracts/contracts/ERC1155/ERC1155.sol\":{\"keccak256\":\"0x7dcdf324fd4d2dec68846958865ae833956cb4ad80cd83cf6f107e7c33500bf6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5cddf52afd931cbf983100a0415f04e6646aa90d100fd91437d2a75e3b241206\",\"dweb:/ipfs/QmXXJ2qoC1rSsKdg5s87m3BPQ3RFGw2rNrNv7KygzGJ9zQ\"]},\"/home/user/Projects/future-contracts/contracts/ERC1155/ERC1155WithTotals.sol\":{\"keccak256\":\"0x1d5fcf7a70d6f5dcd4ddf25caece633a9b4d17154fb98b5fc9a5ae4600b2db15\",\"license\":\"LGPL-3.0-or-later\",\"urls\":[\"bzz-raw://9638d138ecec5f7f6651cf690295fdaaa99023d58555360fa801ace5cac88a9d\",\"dweb:/ipfs/QmUWf56QEe5uSfpHB7inMUGzufNZSxyu8aszLzoYMZHMYf\"]},\"/home/user/Projects/future-contracts/contracts/NFTRestoreContract.sol\":{\"keccak256\":\"0x9b80297c9eecfc6c6d57801094e2208e170b8ebfbee9499f06569cddb441ed72\",\"license\":\"LGPL-3.0-or-later\",\"urls\":[\"bzz-raw://9b44b05460fe29f19c08a8327e3c8d4486cb25cf2ec9576ce4b43c2f4d616ef0\",\"dweb:/ipfs/QmPrWUhySNLErKsAYUbZ2hxhY8wUkXgspYBKQLgHAJA8dD\"]},\"/home/user/Projects/future-contracts/contracts/NFTSalaryRecipient.sol\":{\"keccak256\":\"0x2a45ffa3125d64a70237df9231e64f47ff80b9e859f2c1fb04ca220087bff2e9\",\"license\":\"LGPL-3.0-or-later\",\"urls\":[\"bzz-raw://03f8f21862486f91bb4dd7b02c84f23b0128331b21b96a997e905b5dbc7793e7\",\"dweb:/ipfs/QmTGuoKuvFT7mk6eZBKDkwLFwtkV36CaC6e7sTZRgLU64J\"]},\"/home/user/Projects/future-contracts/contracts/Salary.sol\":{\"keccak256\":\"0xab92f4cdbee5779c88b7dbc0df9c38be66b51b5d9fb7f5fcf5ce162ecb27e071\",\"license\":\"LGPL-3.0-or-later\",\"urls\":[\"bzz-raw://50309afd992eacf5070d921f931a77063c29e26c017f7de6bf41b1490ae2bb4a\",\"dweb:/ipfs/QmaXwhKyMgcRGZEtFikTCfX8aTVeWwkkXGyA8anFz7TaEC\"]},\"/home/user/Projects/future-contracts/contracts/SalaryWithDAO.sol\":{\"keccak256\":\"0x723436b0c12f5b0e27f96313a8538993913dbd043d32df0824b21991b6c894b5\",\"license\":\"LGPL-3.0-or-later\",\"urls\":[\"bzz-raw://fd28612e3b6863a610bb5b841a7b6e1929da7a3056b9e536db643d370fee4aef\",\"dweb:/ipfs/QmUhFuxwP64WhKbHXPCGbBkhx2Y5YHXdFsE6x5ncXeguJg\"]},\"@openzeppelin/contracts/GSN/Context.sol\":{\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ded47ec7c96750f9bd04bbbc84f659992d4ba901cb7b532a52cd468272cf378f\",\"dweb:/ipfs/QmfBrGtQP7rZEqEg6Wz6jh2N2Kukpj1z5v3CGWmAqrzm96\"]},\"@openzeppelin/contracts/access/Ownable.sol\":{\"keccak256\":\"0xf7c39c7e6d06ed3bda90cfefbcbf2ddc32c599c3d6721746546ad64946efccaa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cb57a28e189cd8b05748db44bdd51d608e6f1364dd1b35ad921e1bc82c10631e\",\"dweb:/ipfs/QmaWWTBbVu2pRR9XUbE4iC159NoP59cRF9ZJwhf4ghFN9i\"]},\"@openzeppelin/contracts/introspection/ERC165.sol\":{\"keccak256\":\"0xd6b90e604fb2eb2d641c7110c72440bf2dc999ec6ab8ff60f200e71ca75d1d90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7b92d8ab83b21ff984b1f0d6d66897d5afb1f2052004cbcb133cea023e0ae468\",\"dweb:/ipfs/QmTarypkQrFp4UMjTh7Zzhz2nZLz5uPS4nJQtHDEuwBVe6\"]},\"@openzeppelin/contracts/introspection/IERC165.sol\":{\"keccak256\":\"0xf70bc25d981e4ec9673a995ad2995d5d493ea188d3d8f388bba9c227ce09fb82\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bd970f51e3a77790c2f02b5b1759827c3b897c3d98c407b3631e8af32e3dc93c\",\"dweb:/ipfs/QmPF85Amgbqjk3SNZKsPCsqCw8JfwYEPMnnhvMJUyX58je\"]},\"@openzeppelin/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x3b21f2c8d626de3b9925ae33e972d8bf5c8b1bffb3f4ee94daeed7d0679036e6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7f8d45329fecbf0836ad7543330c3ecd0f8d0ffa42d4016278c3eb2215fdcdfe\",\"dweb:/ipfs/QmXWLT7GcnHtA5NiD6MFi2CV3EWJY4wv5mLNnypqYDrxL3\"]},\"@openzeppelin/contracts/token/ERC1155/ERC1155Holder.sol\":{\"keccak256\":\"0x21428ca879b2437107322dfc1e214d25ecd6b966344961025ee412c3acfd5fc0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9747c875899d05823aede28b60ca8d3719b8c28018f397521c4ffb05041e1ac5\",\"dweb:/ipfs/QmQEQ4jJYEGFNfcngfZ3gPkcrcWYWKbo1Bq2F57scJxbmE\"]},\"@openzeppelin/contracts/token/ERC1155/ERC1155Receiver.sol\":{\"keccak256\":\"0xfce008c2ddf19a62e29e056fdddfa10204b19417ae0f711913703e4ee9dec92c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://37a7bb9249c0e8aaecd0c6f33fae7f03d15aebb015f5f7f1face393cfd58d75b\",\"dweb:/ipfs/QmevqbHb43sTLnpWzrGW9WvWvktMzuP5EzYHhqZox2A5v3\"]},\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\":{\"keccak256\":\"0x61321d2c86346045bf394885ee3afeecc65f9daad2694bc19110967588fd7b5d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1703b877203e0447ede72dcf73f1c4f2089b415bd1c44877904128a64fafed5b\",\"dweb:/ipfs/QmaZoYDo2FWtKcwCc9zuabU6zri8KV9xJrhU614d93sLid\"]},\"@openzeppelin/contracts/token/ERC1155/IERC1155MetadataURI.sol\":{\"keccak256\":\"0xd918cca1b659f588a6d12d05fd7196179a8b1eac9133d7f77da7ef3133e13256\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7c75d578f42e2e2e427b934e6c41cc759be2d0a52155868308e915328c8feb2b\",\"dweb:/ipfs/QmbFNHtWAoNhe82Hy6yKTePWJRczqzp1APSBfLS9XfAN6e\"]},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"keccak256\":\"0x2690a9b7f4f7489b8d25a4fc6bffc02ec3971fb41ed6c8b59adef2833bdab07c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8148c99452b6793ac9599abdc8bdaf4eeb47f34590beea8aa01089be14e2990c\",\"dweb:/ipfs/QmNdenmZ4EDfH9TuBas3pHeGuZvDNo2rsfgUj6ka8vuH37\"]},\"@openzeppelin/contracts/token/ERC721/ERC721.sol\":{\"keccak256\":\"0x5a3de7f7f76e47a071195cf42e2a702265694a6b32037de709463bd8ad784fb5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://678cbad1f972a4d8c9d47bc39fa6d39560b4fc143c8d9c812a63fe99bb13062e\",\"dweb:/ipfs/QmUhLDvUndcbQLakDNg9G4UXz8UPzRqC6S3rWGKupB6DYs\"]},\"@openzeppelin/contracts/token/ERC721/ERC721Holder.sol\":{\"keccak256\":\"0xdb2133d55b8f3a94313af8f4371ae0501a58e412d471b03d8581214c5ea2ce33\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cea1e4bf769f27c8c9c1442f1518b49ef6c8b71a4bd4ce88353da9e9a8ba1704\",\"dweb:/ipfs/QmR1b8sj7fxgeHqDksV4GYTjZS1qajWC3yg9VCMUJus2bF\"]},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5a9f5c29bd7cf0b345e14d97d5f685f68c07e1e5bfdd47e5bcec045e81b0b6ac\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://321cbaa1412fc8d013d8ad3fb5f98c0db7401ddacfb09b70828ea2cebe37397e\",\"dweb:/ipfs/Qmd3Hoc71w6rmxAR6A5VKW9at677VP1L5KDcJnyvu4ksu3\"]},\"@openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol\":{\"keccak256\":\"0xe6bd1b1218338b6f9fe17776f48623b4ac3d8a40405f74a44bc23c00abe2ca13\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0c354c3f6e9c487759aa7869be4fba68e0b2efc777b514d289c4cbd3ff8f7e1a\",\"dweb:/ipfs/QmdF9LcSYVmiUCL7JxLEYmSLrjga6zJsujfi6sgEJD4M1z\"]},\"@openzeppelin/contracts/token/ERC721/IERC721Metadata.sol\":{\"keccak256\":\"0xccb917776f826ac6b68bd5a15a5f711e3967848a52ba11e6104d9a4f593314a7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://430255ad2229ced6d880e61a67bdc6e48dbbaed8354a7c1fe918cd8b8714a886\",\"dweb:/ipfs/QmTHY56odzqEpEC6v6tafaWMYY7vmULw25q5XHJLCCAeox\"]},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"keccak256\":\"0x52146049d6709c870e8ddcd988b5155cb6c5d640cfcd8978aee52bc1ba2ec4eb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ada84513617b7c1b2f890b44503735abaec73a1acd030112a17aac7e6c66a4a1\",\"dweb:/ipfs/QmaiFwdio67iJrfjAdkMac24eJ5sS1qD7CZW6PhUU6KjiK\"]},\"@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xa6a15ddddcbf29d2922a1e0d4151b5d2d33da24b93cc9ebc12390e0d855532f8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7c119bcaecfa853d564ac88d312777f75fa1126a3bca88a3371adb0ad9f35cb0\",\"dweb:/ipfs/QmY9UPuXeSKq86Zh38fE43VGQPhKMN34mkuFSFqPcr6nvZ\"]},\"@openzeppelin/contracts/utils/EnumerableMap.sol\":{\"keccak256\":\"0xf6bdf22fe038e5310b6f0372ecd01f221e2c0b248b45efc404542d94fcac9133\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e798f3492180627d6616fa94925b61a9f105347eed9e895f3e18a0eb3dfcd3d\",\"dweb:/ipfs/QmQcTro5nv3Lopf4c4rEe1BuykCfPsjRsJmysdNXtHNUdt\"]},\"@openzeppelin/contracts/utils/EnumerableSet.sol\":{\"keccak256\":\"0xae0992eb1ec30fd1ecdf2e04a6036decfc9797bf11dc1ec84b546b74318d5ec2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3b61f99a64e999682ad7bfbb3a1c762a20a0a5b30f9f2011693fa857969af61f\",\"dweb:/ipfs/QmZystFY76wkWCf7V3yKh3buZuKVKbswiE7y6yU62kk3zi\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x16b5422892fbdd9648f12e59de85b42efd57d76b6d6b2358cb46e0f6d4a71aaf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ef38821a4ee756757dc1ce9074ef6096d1b5c760627e92c0852d788dc636ea7\",\"dweb:/ipfs/QmdGwP6BtRMcp4VVJUWwTmXEjYmL52A8WZpBdFJYmzc9pJ\"]},\"abdk-libraries-solidity/ABDKMath64x64.sol\":{\"keccak256\":\"0x67609bc0923563d05d3a8a7c681056f9702a92120777cb0bcbb40d0afbb4a015\",\"license\":\"BSD-4-Clause\",\"urls\":[\"bzz-raw://55e817969394d4e0201a8cd3763ad6776bc9fddc986febe9b4acf120e8b7ad0d\",\"dweb:/ipfs/QmNMve5ZjUfA8DJYic4sYTrDEAN6VyxcC7jWUTX25Wmnnp\"]}},\"version\":1}",
  "bytecode": "0x60806040523480156200001157600080fd5b50604051620054ca380380620054ca833981810160405260608110156200003757600080fd5b815160208301516040808501805191519395929483019291846401000000008211156200006357600080fd5b9083019060208201858111156200007957600080fd5b82516401000000008111828201881017156200009457600080fd5b82525081516020918201929091019080838360005b83811015620000c3578181015183820152602001620000a9565b50505050905090810190601f168015620000f15780820380516001836020036101000a031916815260200191505b506040525084915083905082828180808080620001156301ffc9a760e01b620001a9565b62000120816200022e565b62000132636cdb3d1360e11b620001a9565b620001446303a24d0760e21b620001a9565b50620001599050630271189760e51b620001a9565b6200016b632d94347160e11b620001a9565b5050601080546001600160a01b039384166001600160a01b0319918216179091556015805495909316941693909317905550620002f3945050505050565b6001600160e01b0319808216141562000209576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b80516200024390600390602084019062000247565b5050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200027f5760008555620002ca565b82601f106200029a57805160ff1916838001178555620002ca565b82800160010185558215620002ca579182015b82811115620002ca578251825591602001919060010190620002ad565b50620002d8929150620002dc565b5090565b5b80821115620002d85760008155600101620002dd565b6151c780620003036000396000f3fe608060405234801561001057600080fd5b506004361061031f5760003560e01c8063837b0f84116101a7578063bfb246cd116100ee578063ebf38ffb11610097578063f242432a11610071578063f242432a14611501578063f52f368d146115a3578063f59407b4146115dc5761031f565b8063ebf38ffb146113b3578063ee066ef61461140c578063f23a6e61146114295761031f565b8063dbc0a675116100c8578063dbc0a6751461131e578063dc57e0cc14611345578063e985e9c5146113785761031f565b8063bfb246cd14611290578063c3dcfd4114611298578063c731c504146112db5761031f565b8063a1bd2e6211610150578063b1ece8df1161012a578063b1ece8df14611097578063bc197c811461109f578063bd85b039146112735761031f565b8063a1bd2e6214610f7c578063a22cb46514610faf578063adde70c414610fea5761031f565b806392d2a6bc1161018157806392d2a6bc14610f055780639608b25014610f2c5780639ea5296714610f5f5761031f565b8063837b0f8414610d82578063914b5b5914610d8a578063922aac9c14610e5d5761031f565b80632eb2c2d61161026b57806361fbc14a1161021457806368e22f56116101ee57806368e22f5614610d075780637707444814610d2e578063789908e914610d555761031f565b806361fbc14a14610c7e57806365f4fb1414610c9b5780636695821f14610cce5761031f565b806347a2fd8d1161024557806347a2fd8d14610a925780634e1273f414610ab757806356c742dc14610c2e5761031f565b80632eb2c2d6146108775780632ef0ce78146109b157806334fc81c414610a6b5761031f565b80630cbba89c116102cd5780631830d83d116102a75780631830d83d1461080a5780631f1b9c051461082757806328eb70871461085a5761031f565b80630cbba89c146105c35780630e89341c14610670578063150b7a02146107025761031f565b806301ffc9a7116102fe57806301ffc9a71461043557806302e27cd51461048857806305096f25146105205761031f565b8062fdd58e1461032457806301683b4d1461036f57806301a983df146103fc575b600080fd5b61035d6004803603604081101561033a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611609565b60408051918252519081900360200190f35b61035d6004803603604081101561038557600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691908101906040810160208201356401000000008111156103bd57600080fd5b8201836020820111156103cf57600080fd5b803590602001918460018302840111640100000000831117156103f157600080fd5b5090925090506116af565b61035d6004803603604081101561041257600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff1661171f565b6104746004803603602081101561044b57600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661173c565b604080519115158252519081900360200190f35b61051e6004803603606081101561049e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116918101906060810160408201356401000000008111156104df57600080fd5b8201836020820111156104f157600080fd5b8035906020019184602083028401116401000000008311171561051357600080fd5b509092509050611773565b005b61051e6004803603608081101561053657600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359167ffffffffffffffff604083013516919081019060808101606082013564010000000081111561058457600080fd5b82018360208201111561059657600080fd5b803590602001918460018302840111640100000000831117156105b857600080fd5b509092509050611a30565b61051e600480360360408110156105d957600080fd5b813591908101906040810160208201356401000000008111156105fb57600080fd5b82018360208201111561060d57600080fd5b8035906020019184600183028401116401000000008311171561062f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611b3e945050505050565b61068d6004803603602081101561068657600080fd5b5035611d4c565b6040805160208082528351818301528351919283929083019185019080838360005b838110156106c75781810151838201526020016106af565b50505050905090810190601f1680156106f45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6107d56004803603608081101561071857600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116916040820135919081019060808101606082013564010000000081111561076057600080fd5b82018360208201111561077257600080fd5b8035906020019184600183028401116401000000008311171561079457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611e02945050505050565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b61035d6004803603602081101561082057600080fd5b5035611e2b565b61051e6004803603606081101561083d57600080fd5b5067ffffffffffffffff8135169060208101359060400135611e3d565b61035d6004803603602081101561087057600080fd5b5035611fa5565b61051e600480360360a081101561088d57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116918101906060810160408201356401000000008111156108ce57600080fd5b8201836020820111156108e057600080fd5b8035906020019184602083028401116401000000008311171561090257600080fd5b91939092909160208101903564010000000081111561092057600080fd5b82018360208201111561093257600080fd5b8035906020019184602083028401116401000000008311171561095457600080fd5b91939092909160208101903564010000000081111561097257600080fd5b82018360208201111561098457600080fd5b803590602001918460018302840111640100000000831117156109a657600080fd5b509092509050611fb7565b61051e600480360360e08110156109c757600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359267ffffffffffffffff60408301351692606083013592608081013582169260a08201359092169181019060e0810160c0820135640100000000811115610a2c57600080fd5b820183602082011115610a3e57600080fd5b80359060200191846001830284011164010000000083111715610a6057600080fd5b509092509050612094565b61035d60048036036020811015610a8157600080fd5b503567ffffffffffffffff166122f7565b610a9a612313565b6040805167ffffffffffffffff9092168252519081900360200190f35b610bde60048036036040811015610acd57600080fd5b810190602081018135640100000000811115610ae857600080fd5b820183602082011115610afa57600080fd5b80359060200191846020830284011164010000000083111715610b1c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050640100000000811115610b6c57600080fd5b820183602082011115610b7e57600080fd5b80359060200191846020830284011164010000000083111715610ba057600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061232f945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610c1a578181015183820152602001610c02565b505050509050019250505060405180910390f35b610c5560048036036020811015610c4457600080fd5b503567ffffffffffffffff16612515565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610c5560048036036020811015610c9457600080fd5b5035612547565b61047460048036036020811015610cb157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661256f565b61035d60048036036040811015610ce457600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16612584565b61051e60048036036020811015610d1d57600080fd5b503567ffffffffffffffff166125a1565b61035d60048036036020811015610d4457600080fd5b503567ffffffffffffffff166126ac565b61035d60048036036040811015610d6b57600080fd5b5067ffffffffffffffff81351690602001356126be565b610a9a6126e7565b61051e60048036036060811015610da057600080fd5b67ffffffffffffffff8235169190810190604081016020820135640100000000811115610dcc57600080fd5b820183602082011115610dde57600080fd5b80359060200191846020830284011164010000000083111715610e0057600080fd5b919390929091602081019035640100000000811115610e1e57600080fd5b820183602082011115610e3057600080fd5b80359060200191846020830284011164010000000083111715610e5257600080fd5b5090925090506126f7565b61051e600480360360a0811015610e7357600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359167ffffffffffffffff6040830135169160608101359181019060a081016080820135640100000000811115610ec657600080fd5b820183602082011115610ed857600080fd5b80359060200191846001830284011164010000000083111715610efa57600080fd5b509092509050612988565b61047460048036036020811015610f1b57600080fd5b503567ffffffffffffffff16612c50565b610c5560048036036020811015610f4257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612c6f565b61035d60048036036020811015610f7557600080fd5b5035612c97565b610c5560048036036020811015610f9257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612ca9565b61051e60048036036040811015610fc557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515612cd1565b61035d6004803603604081101561100057600080fd5b8135919081019060408101602082013564010000000081111561102257600080fd5b82018360208201111561103457600080fd5b8035906020019184600183028401116401000000008311171561105657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612e2c945050505050565b610c55612e3f565b6107d5600480360360a08110156110b557600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116918101906060810160408201356401000000008111156110f657600080fd5b82018360208201111561110857600080fd5b8035906020019184602083028401116401000000008311171561112a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561117a57600080fd5b82018360208201111561118c57600080fd5b803590602001918460208302840111640100000000831117156111ae57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156111fe57600080fd5b82018360208201111561121057600080fd5b8035906020019184600183028401116401000000008311171561123257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612e5b945050505050565b61035d6004803603602081101561128957600080fd5b5035612e85565b610c55612e97565b61051e600480360360408110156112ae57600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013567ffffffffffffffff16612eb3565b61051e600480360360608110156112f157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135612fd9565b61035d6004803603602081101561133457600080fd5b503567ffffffffffffffff1661311f565b610a9a6004803603602081101561135b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661313b565b6104746004803603604081101561138e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516613146565b61035d600480360360a08110156113c957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359167ffffffffffffffff6040830135169160608101359160809091013516613181565b61035d6004803603602081101561142257600080fd5b50356131ac565b6107d5600480360360a081101561143f57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a08101608082013564010000000081111561148c57600080fd5b82018360208201111561149e57600080fd5b803590602001918460018302840111640100000000831117156114c057600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506131be945050505050565b61051e600480360360a081101561151757600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a08101608082013564010000000081111561156457600080fd5b82018360208201111561157657600080fd5b8035906020019184600183028401116401000000008311171561159857600080fd5b5090925090506131e8565b610474600480360360408110156115b957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561323d565b61051e600480360360408110156115f257600080fd5b5067ffffffffffffffff8135169060200135613275565b600073ffffffffffffffffffffffffffffffffffffffff8316611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615004602b913960400191505060405180910390fd5b50600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020545b92915050565b6000806116bb85613332565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260186020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790559050611716818585613367565b95945050505050565b600a60209081526000928352604080842090915290825290205481565b7fffffffff000000000000000000000000000000000000000000000000000000001660009081526020819052604090205460ff1690565b60155473ffffffffffffffffffffffffffffffffffffffff8581166000908152601660205260408082205481517f0d8feb5c000000000000000000000000000000000000000000000000000000008152908416600482015290519290931692630d8feb5c9260248083019392829003018186803b1580156117f357600080fd5b505afa158015611807573d6000803e3d6000fd5b50600092508391505067ffffffffffffffff8111801561182657600080fd5b50604051908082528060200260200182016040528015611850578160200160208202803683370190505b50905060005b8281101561191557600084848381811061186c57fe5b60209081029290920135600081815260018452604080822073ffffffffffffffffffffffffffffffffffffffff8d16835290945292909220548551929350918291508590859081106118ba57fe5b60209081029190910181019190915260009283526001808252604080852073ffffffffffffffffffffffffffffffffffffffff8c8116808852919094528186208054948c168752918620939093559184529290555001611856565b508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1661194c6133c4565b73ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86868660405180806020018060200183810383528686828181526020019250602002808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201858103845286518152865160209182019382890193509102908190849084905b83811015611a135781810151838201526020016119fb565b505050509050019550505050505060405180910390a45050505050565b6000611a3d8686866133c9565b90506000611a4b878761344c565b90506000611aff611a5c3084611609565b604080517efdd58e000000000000000000000000000000000000000000000000000000008152306004820152602481018b9052905173ffffffffffffffffffffffffffffffffffffffff8c169162fdd58e916044808301926020929190829003018186803b158015611acd57600080fd5b505afa158015611ae1573d6000803e3d6000fd5b505050506040513d6020811015611af757600080fd5b5051906134a3565b90506000611b0d3084611609565b611b173086611609565b830281611b2057fe5b049050611b338989898430308c8c612094565b505050505050505050565b81611b48816134e5565b8015611b5357508015155b8015611b635750611b63816134f3565b611bce57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4f6e6c7920666f7220746865206c6173742073616c61727920746f6b656e2e00604482015290519081900360640190fd5b60008381526012602052604090205480611c4957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f596f7520617265206e6f7420726567697374657265642e000000000000000000604482015290519081900360640190fd5b600084815260146020526040902054670de0b6b3a7640000428390030290611c749033908387613513565b426012600087815260200190815260200160002081905550843373ffffffffffffffffffffffffffffffffffffffff167fc90c562994ec9ecaf5aa16faa5c6c70b7d24049b12d49796f49b5b1d3d42a24a83876040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611d0a578181015183820152602001611cf2565b50505050905090810190601f168015611d375780820380516001836020036101000a031916815260200191505b50935050505060405180910390a35050505050565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015611df65780601f10611dcb57610100808354040283529160200191611df6565b820191906000526020600020905b815481529060010190602001808311611dd957829003601f168201915b50505050509050919050565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b60126020526000908152604090205481565b67ffffffffffffffff8316600090815260066020526040902054839073ffffffffffffffffffffffffffffffffffffffff163314611edc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420746865206f7261636c65206f776e65722e0000000000000000000000604482015290519081900360640190fd5b83611ee681612c50565b15611f5257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f7261636c652069732066696e69736865642e00000000000000000000000000604482015290519081900360640190fd5b611f5d8584866135c2565b604080518481529051859167ffffffffffffffff8816917f44a2b4e2bb6268fa3953b60953d3ffaca7ea60812d3a68e03fd99b6893d32f7f9181900360200190a35050505050565b60136020526000908152604090205481565b60005b85811015611fe657611fde878783818110611fd157fe5b905060200201358a61363d565b600101611fba565b5061208a888888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a91829185019084908082843760009201919091525050604080516020601f8b0181900481028201810190925289815292508991508890819084018382808284376000920191909152506136cb92505050565b5050505050505050565b60006120a18989896133c9565b90506120e584828886868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506139a792505050565b60006120f18a8a61344c565b905061213585828987878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506139a792505050565b8573ffffffffffffffffffffffffffffffffffffffff16898b73ffffffffffffffffffffffffffffffffffffffff167fe29f51ae5c82c0500c7c66f9ab40c2f68e940a624c8ba42e287ee98eeced4e378a898989604051808581526020018473ffffffffffffffffffffffffffffffffffffffff168152602001806020018281038252848482818152602001925080828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920182900397509095505050505050a48973ffffffffffffffffffffffffffffffffffffffff1663f242432a87308c8b89896040518763ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050975050505050505050600060405180830381600087803b1580156122d357600080fd5b505af11580156122e7573d6000803e3d6000fd5b5050505050505050505050505050565b67ffffffffffffffff1660009081526007602052604090205490565b60055468010000000000000000900467ffffffffffffffff1681565b6060815183511461238b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806151486029913960400191505060405180910390fd5b6000835167ffffffffffffffff811180156123a557600080fd5b506040519080825280602002602001820160405280156123cf578160200160208202803683370190505b50905060005b845181101561250d57600073ffffffffffffffffffffffffffffffffffffffff1685828151811061240257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415612477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018061502f6031913960400191505060405180910390fd5b6001600085838151811061248757fe5b6020026020010151815260200190815260200160002060008683815181106124ab57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548282815181106124fa57fe5b60209081029190910101526001016123d5565b509392505050565b67ffffffffffffffff1660009081526006602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600c6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60186020526000908152604090205460ff1681565b600960209081526000928352604080842090915290825290205481565b67ffffffffffffffff8116600090815260066020526040902054819073ffffffffffffffffffffffffffffffffffffffff16331461264057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420746865206f7261636c65206f776e65722e0000000000000000000000604482015290519081900360640190fd5b67ffffffffffffffff82166000818152600d602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f88ed9118615ffe36496d032760017d3855c5093cbbf7fdb20dd99a4fcc66fe6d9190a25050565b600b6020526000908152604090205481565b67ffffffffffffffff919091166000908152600e60209081526040808320938352929052205490565b60055467ffffffffffffffff1681565b67ffffffffffffffff8516600090815260066020526040902054859073ffffffffffffffffffffffffffffffffffffffff16331461279657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420746865206f7261636c65206f776e65722e0000000000000000000000604482015290519081900360640190fd5b856127a081612c50565b1561280c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f7261636c652069732066696e69736865642e00000000000000000000000000604482015290519081900360640190fd5b84831461287a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c656e677468206d69736d617463682e00000000000000000000000000000000604482015290519081900360640190fd5b60005b858110156128d0576128c88886868481811061289557fe5b905060200201358989858181106128a857fe5b9050602002013567ffffffffffffffff1667ffffffffffffffff166135c2565b60010161287d565b50858560405180838360200280828437808301925050509250505060405180910390208767ffffffffffffffff167f3a3975f17a5a0bcdd6052bff8c418bfc6511822e89e2dc3e3b8c0ce07b22220e868660405180806020018281038252848482818152602001925060200280828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039550909350505050a350505050505050565b61299184612c50565b6129fc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f746f6f206561726c790000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6000612a0785613a85565b336000818152600860209081526040808320898452909152812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790559192508190612a61908a908a908a908a9088613aa4565b9150915080600014612ac0576000612a7883612e85565b90508315612aa15760008381526009602090815260408083203384529091529020819055612abe565b6000838152600a6020908152604080832033845290915290208190555b505b82612b045767ffffffffffffffff87166000908152600b6020526040902054612ae99082613ba9565b67ffffffffffffffff88166000908152600b60205260409020555b8873ffffffffffffffffffffffffffffffffffffffff1663f242432a30338b858a8a6040518763ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050975050505050505050600060405180830381600087803b158015612bcf57600080fd5b505af1158015612be3573d6000803e3d6000fd5b50506040805133815260208101859052815167ffffffffffffffff8c1694508c935073ffffffffffffffffffffffffffffffffffffffff8e16927f72d4fd47a9fbaff0f6860417149191d0520595c12e2f7d4828bac210e6ad3dbc928290030190a4505050505050505050565b67ffffffffffffffff166000908152600d602052604090205460ff1690565b60166020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60146020526000908152604090205481565b60176020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b8173ffffffffffffffffffffffffffffffffffffffff16612cf06133c4565b73ffffffffffffffffffffffffffffffffffffffff161415612d5d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806150f06029913960400191505060405180910390fd5b8060026000612d6a6133c4565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091871680825291909352912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001692151592909217909155612dd96133c4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b6000612e388383613c1d565b9392505050565b60105473ffffffffffffffffffffffffffffffffffffffff1681565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b60009081526004602052604090205490565b60155473ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8116600090815260066020526040902054819073ffffffffffffffffffffffffffffffffffffffff163314612f5257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420746865206f7261636c65206f776e65722e0000000000000000000000604482015290519081900360640190fd5b67ffffffffffffffff821660008181526006602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816908117909155905190917f74793e794a02a6a170c6c9946770eee45a5b771297549c7a134b186d7004f2d491a3505050565b60155473ffffffffffffffffffffffffffffffffffffffff8481166000908152601660205260408082205481517f0d8feb5c000000000000000000000000000000000000000000000000000000008152908416600482015290519290931692630d8feb5c9260248083019392829003018186803b15801561305957600080fd5b505afa15801561306d573d6000803e3d6000fd5b505050600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff88811680865291909352818420805493881680865292852084905581855293909355909250906130c46133c4565b73ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b67ffffffffffffffff166000908152600f602052604090205490565b60006116a982613ebe565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205460ff1690565b60008061318d85613a85565b9050600061319f888888888887613aa4565b9998505050505050505050565b60116020526000908152604090205481565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b6131f2848761363d565b6132358686868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613fd892505050565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600860209081526040808320938352929052205460ff1690565b67ffffffffffffffff8216600090815260066020526040902054829073ffffffffffffffffffffffffffffffffffffffff16331461331457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420746865206f7261636c65206f776e65722e0000000000000000000000604482015290519081900360640190fd5b5067ffffffffffffffff909116600090815260076020526040902055565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260166020526040812054909116806116a95782612e38565b6000806133aa8585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061419092505050565b600081815260126020526040902042905595945050505050565b335b90565b6040805160609490941b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602080860191909152603485019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660548401528051808403603c018152605c9093019052815191012090565b6040805160609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166020808501919091526034808501939093528151808503909301835260549093019052805191012090565b6000612e3883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061425e565b680100000000000000001190565b600081815260136020908152604080832054835260149091529020541490565b6000838152600c602052604090205473ffffffffffffffffffffffffffffffffffffffff8581169116146135a857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4f7468657227732073616c6172792067657420617474656d70742e0000000000604482015290519081900360640190fd5b6135bc6135b48561430f565b8484846139a7565b50505050565b67ffffffffffffffff83166000818152600e60209081526040808320858452825280832054938352600f90915290205461360791906136019085613ba9565b906134a3565b67ffffffffffffffff9093166000908152600f6020908152604080832095909555600e8152848220928252919091529190912055565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260086020908152604080832085845290915290205460ff16156136c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806150606030913960400191505060405180910390fd5b5050565b8151835114613725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615119602f913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416613791576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806150906028913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85163314806137ea575073ffffffffffffffffffffffffffffffffffffffff8516600090815260026020908152604080832033845290915290205460ff1615156001145b61383f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806150b86038913960400191505060405180910390fd5b60005b835181101561389157600084828151811061385957fe5b60200260200101519050600084838151811061387157fe5b6020026020010151905061388782898984614344565b5050600101613842565b508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561393e578181015183820152602001613926565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561397d578181015183820152602001613965565b5050505090500194505050505060405180910390a46139a033868686868661442e565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff8416613a13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806151716021913960400191505060405180910390fd5b613a1e848484614760565b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a46135bc336000868686866147c0565b67ffffffffffffffff1660009081526007602052604090205442111590565b6000806000613ab38587611609565b9050600084613adb5767ffffffffffffffff88166000908152600b6020526040902054613ae4565b613ae487612e85565b9050613af18a8a8a6133c9565b93506000613aff83836149b0565b9050600086613b3d576000868152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8c168452909152902054613b6e565b600086815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff8c1684529091529020545b613b7787612e85565b0390506000613b878b8b856149f9565b9050613b97600f82900b83614a16565b95505050505050965096945050505050565b600082820183811015612e3857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082613c29816134e5565b8015613c3457508015155b8015613c445750613c4481614a98565b613caf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4f6e6c7920666f7220746865206c6173742073616c61727920746f6b656e2e00604482015290519081900360640190fd5b601054604080517f6352211e00000000000000000000000000000000000000000000000000000000815260048101879052905160009273ffffffffffffffffffffffffffffffffffffffff1691636352211e916024808301926020929190829003018186803b158015613d2157600080fd5b505afa158015613d35573d6000803e3d6000fd5b505050506040513d6020811015613d4b57600080fd5b5051600086815260146020526040812054919250613d698387614190565b60008181526013602090815260408083208b9055858352600180835281842073ffffffffffffffffffffffffffffffffffffffff8916808652818552838620805488885293865284872082885286528487208490559185529085905582518d815293840182905282519596509094909233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6292918290030190a46040805183815260208101839052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a460008881526012602052604080822054848352818320555183918a9173ffffffffffffffffffffffffffffffffffffffff8816917f336d2bb69144fc71fe04e0e4a9b896f65406408bfb116e35ac52c15d0e477ce091a4509695505050505050565b600580547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008116600167ffffffffffffffff92831601918216908117909255600082815260066020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055805133815291820194909452835191937f3a39e4ca958a680cb67189b53ab4494bee80524d836f52094ab41cea81219ffe92918290030190a160405167ffffffffffffffff82169073ffffffffffffffffffffffffffffffffffffffff8516907f74793e794a02a6a170c6c9946770eee45a5b771297549c7a134b186d7004f2d490600090a392915050565b73ffffffffffffffffffffffffffffffffffffffff8416614044576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806150906028913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff851633148061409d575073ffffffffffffffffffffffffffffffffffffffff8516600090815260026020908152604080832033845290915290205460ff1615156001145b6140f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806150b86038913960400191505060405180910390fd5b6140fe83868685614344565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a46139a03386868686866147c0565b60008061419d8484614aab565b600081815260116020908152604080832042905560138252808320849055601490915280822083905560105481517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301526024820186905292519495509116926340c10f199260448084019391929182900301818387803b15801561423e57600080fd5b505af1158015614252573d6000803e3d6000fd5b50929695505050505050565b60008184841115614307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156142cc5781810151838201526020016142b4565b50505050905090810190601f1680156142f95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260176020526040812054909116806116a95782612e38565b61435084848484614bf9565b831580159061440f5750601054604080517f6352211e000000000000000000000000000000000000000000000000000000008152600481018790529051339273ffffffffffffffffffffffffffffffffffffffff1691636352211e916024808301926020929190829003018186803b1580156143cb57600080fd5b505afa1580156143df573d6000803e3d6000fd5b505050506040513d60208110156143f557600080fd5b505173ffffffffffffffffffffffffffffffffffffffff16145b156135bc57606061441f856134f3565b156139a0576132358582613c1d565b61444d8473ffffffffffffffffffffffffffffffffffffffff16614caf565b15613235578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b838110156145025781810151838201526020016144ea565b50505050905001848103835286818151815260200191508051906020019060200280838360005b83811015614541578181015183820152602001614529565b50505050905001848103825285818151815260200191508051906020019080838360005b8381101561457d578181015183820152602001614565565b50505050905090810190601f1680156145aa5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b1580156145cf57600080fd5b505af19250505080156145f457506040513d60208110156145ef57600080fd5b505160015b6146bd57614600614ec6565b8061460b575061466c565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283518493919283926044019190850190808383600083156142cc5781810151838201526020016142b4565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180614fa86034913960400191505060405180910390fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014614757576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614fdc6028913960400191505060405180910390fd5b50505050505050565b6000828152600460205260409020546147799082613ba9565b6000928352600460209081526040808520929092556001815281842073ffffffffffffffffffffffffffffffffffffffff9590951684529390935291902080549091019055565b6147df8473ffffffffffffffffffffffffffffffffffffffff16614caf565b15613235578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561489557818101518382015260200161487d565b50505050905090810190601f1680156148c25780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b1580156148e557600080fd5b505af192505050801561490a57506040513d602081101561490557600080fd5b505160015b61491657614600614ec6565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014614757576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614fdc6028913960400191505060405180910390fd5b6000816149bc57600080fd5b60006149c88484614cb5565b90506f7fffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff82161115612e3857600080fd5b600080614a068585614e2b565b9050611716600f84900b82614e68565b600081614a25575060006116a9565b600083600f0b1215614a3657600080fd5b600f83900b6fffffffffffffffffffffffffffffffff8316810260401c90608084901c0277ffffffffffffffffffffffffffffffffffffffffffffffff811115614a7f57600080fd5b60401b8119811115614a9057600080fd5b019392505050565b6000818152601360205260409020541490565b600580547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff8116680100000000000000009182900467ffffffffffffffff908116600101908116928302919091179092556000818152600c6020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89169081179091558151838152875181850152875194969594919333937f6c8e9d3264b48d81c4edda219bc448cde54bdb7997ef1703a4bc9a803167cfce938a93928392830191908501908083838e5b83811015614bae578181015183820152602001614b96565b50505050905090810190601f168015614bdb5780820380516001836020036101000a031916815260200191505b509250505060405180910390a467ffffffffffffffff169392505050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152902054614c3390826134a3565b600085815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8881168552925280832093909355841681522054614c78908290613ba9565b600094855260016020908152604080872073ffffffffffffffffffffffffffffffffffffffff909516875293905291909320555050565b3b151590565b600081614cc157600080fd5b600077ffffffffffffffffffffffffffffffffffffffffffffffff8411614cf75782604085901b81614cef57fe5b049050614e0e565b60c084811c6401000000008110614d10576020918201911c5b620100008110614d22576010918201911c5b6101008110614d33576008918201911c5b60108110614d43576004918201911c5b60048110614d53576002918201911c5b60028110614d62576001820191505b60bf820360018603901c6001018260ff0387901b81614d7d57fe5b0492506fffffffffffffffffffffffffffffffff831115614d9d57600080fd5b608085901c83026fffffffffffffffffffffffffffffffff8616840260c088901c604089901b82811015614dd2576001820391505b608084901b92900382811015614de9576001820391505b829003608084901c8214614df957fe5b888181614e0257fe5b04870196505050505050505b6fffffffffffffffffffffffffffffffff811115612e3857600080fd5b67ffffffffffffffff82166000818152600e60209081526040808320858452825280832054938352600f90915281205490919061171682826149b0565b6000600f83810b9083900b0260401d7fffffffffffffffffffffffffffffffff800000000000000000000000000000008112801590614eb757506f7fffffffffffffffffffffffffffffff8113155b612e3857600080fd5b60e01c90565b600060443d1015614ed6576133c6565b600481823e6308c379a0614eea8251614ec0565b14614ef4576133c6565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3d016004823e80513d67ffffffffffffffff8160248401118184111715614f4257505050506133c6565b82840192508251915080821115614f5c57505050506133c6565b503d83016020828401011115614f74575050506133c6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01681016020016040529150509056fe455243313135353a207472616e7366657220746f206e6f6e2045524331313535526563656976657220696d706c656d656e746572455243313135353a204552433131353552656365697665722072656a656374656420746f6b656e73455243313135353a2062616c616e636520717565727920666f7220746865207a65726f2061646472657373455243313135353a2062617463682062616c616e636520717565727920666f7220746865207a65726f2061646472657373596f752063616e277420747261646520636f6e646974696f6e616c20746f6b656e732061667465722072656465656d2e455243313135353a207461726765742061646472657373206d757374206265206e6f6e2d7a65726f455243313135353a206e656564206f70657261746f7220617070726f76616c20666f7220337264207061727479207472616e73666572732e455243313135353a2073657474696e6720617070726f76616c2073746174757320666f722073656c66455243313135353a2049447320616e64205f76616c756573206d75737420686176652073616d65206c656e67746873455243313135353a206163636f756e747320616e6420696473206c656e677468206d69736d61746368455243313135353a206d696e7420746f20746865207a65726f2061646472657373a264697066735822122046070360fa6da3c442bb68c50f661ac66f68f442ae6d19cb339dc29cd120b7ba64736f6c63430007060033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061031f5760003560e01c8063837b0f84116101a7578063bfb246cd116100ee578063ebf38ffb11610097578063f242432a11610071578063f242432a14611501578063f52f368d146115a3578063f59407b4146115dc5761031f565b8063ebf38ffb146113b3578063ee066ef61461140c578063f23a6e61146114295761031f565b8063dbc0a675116100c8578063dbc0a6751461131e578063dc57e0cc14611345578063e985e9c5146113785761031f565b8063bfb246cd14611290578063c3dcfd4114611298578063c731c504146112db5761031f565b8063a1bd2e6211610150578063b1ece8df1161012a578063b1ece8df14611097578063bc197c811461109f578063bd85b039146112735761031f565b8063a1bd2e6214610f7c578063a22cb46514610faf578063adde70c414610fea5761031f565b806392d2a6bc1161018157806392d2a6bc14610f055780639608b25014610f2c5780639ea5296714610f5f5761031f565b8063837b0f8414610d82578063914b5b5914610d8a578063922aac9c14610e5d5761031f565b80632eb2c2d61161026b57806361fbc14a1161021457806368e22f56116101ee57806368e22f5614610d075780637707444814610d2e578063789908e914610d555761031f565b806361fbc14a14610c7e57806365f4fb1414610c9b5780636695821f14610cce5761031f565b806347a2fd8d1161024557806347a2fd8d14610a925780634e1273f414610ab757806356c742dc14610c2e5761031f565b80632eb2c2d6146108775780632ef0ce78146109b157806334fc81c414610a6b5761031f565b80630cbba89c116102cd5780631830d83d116102a75780631830d83d1461080a5780631f1b9c051461082757806328eb70871461085a5761031f565b80630cbba89c146105c35780630e89341c14610670578063150b7a02146107025761031f565b806301ffc9a7116102fe57806301ffc9a71461043557806302e27cd51461048857806305096f25146105205761031f565b8062fdd58e1461032457806301683b4d1461036f57806301a983df146103fc575b600080fd5b61035d6004803603604081101561033a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611609565b60408051918252519081900360200190f35b61035d6004803603604081101561038557600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691908101906040810160208201356401000000008111156103bd57600080fd5b8201836020820111156103cf57600080fd5b803590602001918460018302840111640100000000831117156103f157600080fd5b5090925090506116af565b61035d6004803603604081101561041257600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff1661171f565b6104746004803603602081101561044b57600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661173c565b604080519115158252519081900360200190f35b61051e6004803603606081101561049e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116918101906060810160408201356401000000008111156104df57600080fd5b8201836020820111156104f157600080fd5b8035906020019184602083028401116401000000008311171561051357600080fd5b509092509050611773565b005b61051e6004803603608081101561053657600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359167ffffffffffffffff604083013516919081019060808101606082013564010000000081111561058457600080fd5b82018360208201111561059657600080fd5b803590602001918460018302840111640100000000831117156105b857600080fd5b509092509050611a30565b61051e600480360360408110156105d957600080fd5b813591908101906040810160208201356401000000008111156105fb57600080fd5b82018360208201111561060d57600080fd5b8035906020019184600183028401116401000000008311171561062f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611b3e945050505050565b61068d6004803603602081101561068657600080fd5b5035611d4c565b6040805160208082528351818301528351919283929083019185019080838360005b838110156106c75781810151838201526020016106af565b50505050905090810190601f1680156106f45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6107d56004803603608081101561071857600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116916040820135919081019060808101606082013564010000000081111561076057600080fd5b82018360208201111561077257600080fd5b8035906020019184600183028401116401000000008311171561079457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611e02945050505050565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b61035d6004803603602081101561082057600080fd5b5035611e2b565b61051e6004803603606081101561083d57600080fd5b5067ffffffffffffffff8135169060208101359060400135611e3d565b61035d6004803603602081101561087057600080fd5b5035611fa5565b61051e600480360360a081101561088d57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116918101906060810160408201356401000000008111156108ce57600080fd5b8201836020820111156108e057600080fd5b8035906020019184602083028401116401000000008311171561090257600080fd5b91939092909160208101903564010000000081111561092057600080fd5b82018360208201111561093257600080fd5b8035906020019184602083028401116401000000008311171561095457600080fd5b91939092909160208101903564010000000081111561097257600080fd5b82018360208201111561098457600080fd5b803590602001918460018302840111640100000000831117156109a657600080fd5b509092509050611fb7565b61051e600480360360e08110156109c757600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359267ffffffffffffffff60408301351692606083013592608081013582169260a08201359092169181019060e0810160c0820135640100000000811115610a2c57600080fd5b820183602082011115610a3e57600080fd5b80359060200191846001830284011164010000000083111715610a6057600080fd5b509092509050612094565b61035d60048036036020811015610a8157600080fd5b503567ffffffffffffffff166122f7565b610a9a612313565b6040805167ffffffffffffffff9092168252519081900360200190f35b610bde60048036036040811015610acd57600080fd5b810190602081018135640100000000811115610ae857600080fd5b820183602082011115610afa57600080fd5b80359060200191846020830284011164010000000083111715610b1c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050640100000000811115610b6c57600080fd5b820183602082011115610b7e57600080fd5b80359060200191846020830284011164010000000083111715610ba057600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061232f945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610c1a578181015183820152602001610c02565b505050509050019250505060405180910390f35b610c5560048036036020811015610c4457600080fd5b503567ffffffffffffffff16612515565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610c5560048036036020811015610c9457600080fd5b5035612547565b61047460048036036020811015610cb157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661256f565b61035d60048036036040811015610ce457600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16612584565b61051e60048036036020811015610d1d57600080fd5b503567ffffffffffffffff166125a1565b61035d60048036036020811015610d4457600080fd5b503567ffffffffffffffff166126ac565b61035d60048036036040811015610d6b57600080fd5b5067ffffffffffffffff81351690602001356126be565b610a9a6126e7565b61051e60048036036060811015610da057600080fd5b67ffffffffffffffff8235169190810190604081016020820135640100000000811115610dcc57600080fd5b820183602082011115610dde57600080fd5b80359060200191846020830284011164010000000083111715610e0057600080fd5b919390929091602081019035640100000000811115610e1e57600080fd5b820183602082011115610e3057600080fd5b80359060200191846020830284011164010000000083111715610e5257600080fd5b5090925090506126f7565b61051e600480360360a0811015610e7357600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359167ffffffffffffffff6040830135169160608101359181019060a081016080820135640100000000811115610ec657600080fd5b820183602082011115610ed857600080fd5b80359060200191846001830284011164010000000083111715610efa57600080fd5b509092509050612988565b61047460048036036020811015610f1b57600080fd5b503567ffffffffffffffff16612c50565b610c5560048036036020811015610f4257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612c6f565b61035d60048036036020811015610f7557600080fd5b5035612c97565b610c5560048036036020811015610f9257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612ca9565b61051e60048036036040811015610fc557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515612cd1565b61035d6004803603604081101561100057600080fd5b8135919081019060408101602082013564010000000081111561102257600080fd5b82018360208201111561103457600080fd5b8035906020019184600183028401116401000000008311171561105657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612e2c945050505050565b610c55612e3f565b6107d5600480360360a08110156110b557600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116918101906060810160408201356401000000008111156110f657600080fd5b82018360208201111561110857600080fd5b8035906020019184602083028401116401000000008311171561112a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561117a57600080fd5b82018360208201111561118c57600080fd5b803590602001918460208302840111640100000000831117156111ae57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156111fe57600080fd5b82018360208201111561121057600080fd5b8035906020019184600183028401116401000000008311171561123257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612e5b945050505050565b61035d6004803603602081101561128957600080fd5b5035612e85565b610c55612e97565b61051e600480360360408110156112ae57600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013567ffffffffffffffff16612eb3565b61051e600480360360608110156112f157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135612fd9565b61035d6004803603602081101561133457600080fd5b503567ffffffffffffffff1661311f565b610a9a6004803603602081101561135b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661313b565b6104746004803603604081101561138e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516613146565b61035d600480360360a08110156113c957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359167ffffffffffffffff6040830135169160608101359160809091013516613181565b61035d6004803603602081101561142257600080fd5b50356131ac565b6107d5600480360360a081101561143f57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a08101608082013564010000000081111561148c57600080fd5b82018360208201111561149e57600080fd5b803590602001918460018302840111640100000000831117156114c057600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506131be945050505050565b61051e600480360360a081101561151757600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a08101608082013564010000000081111561156457600080fd5b82018360208201111561157657600080fd5b8035906020019184600183028401116401000000008311171561159857600080fd5b5090925090506131e8565b610474600480360360408110156115b957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561323d565b61051e600480360360408110156115f257600080fd5b5067ffffffffffffffff8135169060200135613275565b600073ffffffffffffffffffffffffffffffffffffffff8316611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615004602b913960400191505060405180910390fd5b50600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020545b92915050565b6000806116bb85613332565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260186020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790559050611716818585613367565b95945050505050565b600a60209081526000928352604080842090915290825290205481565b7fffffffff000000000000000000000000000000000000000000000000000000001660009081526020819052604090205460ff1690565b60155473ffffffffffffffffffffffffffffffffffffffff8581166000908152601660205260408082205481517f0d8feb5c000000000000000000000000000000000000000000000000000000008152908416600482015290519290931692630d8feb5c9260248083019392829003018186803b1580156117f357600080fd5b505afa158015611807573d6000803e3d6000fd5b50600092508391505067ffffffffffffffff8111801561182657600080fd5b50604051908082528060200260200182016040528015611850578160200160208202803683370190505b50905060005b8281101561191557600084848381811061186c57fe5b60209081029290920135600081815260018452604080822073ffffffffffffffffffffffffffffffffffffffff8d16835290945292909220548551929350918291508590859081106118ba57fe5b60209081029190910181019190915260009283526001808252604080852073ffffffffffffffffffffffffffffffffffffffff8c8116808852919094528186208054948c168752918620939093559184529290555001611856565b508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1661194c6133c4565b73ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86868660405180806020018060200183810383528686828181526020019250602002808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201858103845286518152865160209182019382890193509102908190849084905b83811015611a135781810151838201526020016119fb565b505050509050019550505050505060405180910390a45050505050565b6000611a3d8686866133c9565b90506000611a4b878761344c565b90506000611aff611a5c3084611609565b604080517efdd58e000000000000000000000000000000000000000000000000000000008152306004820152602481018b9052905173ffffffffffffffffffffffffffffffffffffffff8c169162fdd58e916044808301926020929190829003018186803b158015611acd57600080fd5b505afa158015611ae1573d6000803e3d6000fd5b505050506040513d6020811015611af757600080fd5b5051906134a3565b90506000611b0d3084611609565b611b173086611609565b830281611b2057fe5b049050611b338989898430308c8c612094565b505050505050505050565b81611b48816134e5565b8015611b5357508015155b8015611b635750611b63816134f3565b611bce57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4f6e6c7920666f7220746865206c6173742073616c61727920746f6b656e2e00604482015290519081900360640190fd5b60008381526012602052604090205480611c4957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f596f7520617265206e6f7420726567697374657265642e000000000000000000604482015290519081900360640190fd5b600084815260146020526040902054670de0b6b3a7640000428390030290611c749033908387613513565b426012600087815260200190815260200160002081905550843373ffffffffffffffffffffffffffffffffffffffff167fc90c562994ec9ecaf5aa16faa5c6c70b7d24049b12d49796f49b5b1d3d42a24a83876040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611d0a578181015183820152602001611cf2565b50505050905090810190601f168015611d375780820380516001836020036101000a031916815260200191505b50935050505060405180910390a35050505050565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015611df65780601f10611dcb57610100808354040283529160200191611df6565b820191906000526020600020905b815481529060010190602001808311611dd957829003601f168201915b50505050509050919050565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b60126020526000908152604090205481565b67ffffffffffffffff8316600090815260066020526040902054839073ffffffffffffffffffffffffffffffffffffffff163314611edc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420746865206f7261636c65206f776e65722e0000000000000000000000604482015290519081900360640190fd5b83611ee681612c50565b15611f5257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f7261636c652069732066696e69736865642e00000000000000000000000000604482015290519081900360640190fd5b611f5d8584866135c2565b604080518481529051859167ffffffffffffffff8816917f44a2b4e2bb6268fa3953b60953d3ffaca7ea60812d3a68e03fd99b6893d32f7f9181900360200190a35050505050565b60136020526000908152604090205481565b60005b85811015611fe657611fde878783818110611fd157fe5b905060200201358a61363d565b600101611fba565b5061208a888888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a91829185019084908082843760009201919091525050604080516020601f8b0181900481028201810190925289815292508991508890819084018382808284376000920191909152506136cb92505050565b5050505050505050565b60006120a18989896133c9565b90506120e584828886868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506139a792505050565b60006120f18a8a61344c565b905061213585828987878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506139a792505050565b8573ffffffffffffffffffffffffffffffffffffffff16898b73ffffffffffffffffffffffffffffffffffffffff167fe29f51ae5c82c0500c7c66f9ab40c2f68e940a624c8ba42e287ee98eeced4e378a898989604051808581526020018473ffffffffffffffffffffffffffffffffffffffff168152602001806020018281038252848482818152602001925080828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920182900397509095505050505050a48973ffffffffffffffffffffffffffffffffffffffff1663f242432a87308c8b89896040518763ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050975050505050505050600060405180830381600087803b1580156122d357600080fd5b505af11580156122e7573d6000803e3d6000fd5b5050505050505050505050505050565b67ffffffffffffffff1660009081526007602052604090205490565b60055468010000000000000000900467ffffffffffffffff1681565b6060815183511461238b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806151486029913960400191505060405180910390fd5b6000835167ffffffffffffffff811180156123a557600080fd5b506040519080825280602002602001820160405280156123cf578160200160208202803683370190505b50905060005b845181101561250d57600073ffffffffffffffffffffffffffffffffffffffff1685828151811061240257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415612477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018061502f6031913960400191505060405180910390fd5b6001600085838151811061248757fe5b6020026020010151815260200190815260200160002060008683815181106124ab57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548282815181106124fa57fe5b60209081029190910101526001016123d5565b509392505050565b67ffffffffffffffff1660009081526006602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600c6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60186020526000908152604090205460ff1681565b600960209081526000928352604080842090915290825290205481565b67ffffffffffffffff8116600090815260066020526040902054819073ffffffffffffffffffffffffffffffffffffffff16331461264057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420746865206f7261636c65206f776e65722e0000000000000000000000604482015290519081900360640190fd5b67ffffffffffffffff82166000818152600d602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f88ed9118615ffe36496d032760017d3855c5093cbbf7fdb20dd99a4fcc66fe6d9190a25050565b600b6020526000908152604090205481565b67ffffffffffffffff919091166000908152600e60209081526040808320938352929052205490565b60055467ffffffffffffffff1681565b67ffffffffffffffff8516600090815260066020526040902054859073ffffffffffffffffffffffffffffffffffffffff16331461279657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420746865206f7261636c65206f776e65722e0000000000000000000000604482015290519081900360640190fd5b856127a081612c50565b1561280c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f7261636c652069732066696e69736865642e00000000000000000000000000604482015290519081900360640190fd5b84831461287a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c656e677468206d69736d617463682e00000000000000000000000000000000604482015290519081900360640190fd5b60005b858110156128d0576128c88886868481811061289557fe5b905060200201358989858181106128a857fe5b9050602002013567ffffffffffffffff1667ffffffffffffffff166135c2565b60010161287d565b50858560405180838360200280828437808301925050509250505060405180910390208767ffffffffffffffff167f3a3975f17a5a0bcdd6052bff8c418bfc6511822e89e2dc3e3b8c0ce07b22220e868660405180806020018281038252848482818152602001925060200280828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039550909350505050a350505050505050565b61299184612c50565b6129fc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f746f6f206561726c790000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6000612a0785613a85565b336000818152600860209081526040808320898452909152812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790559192508190612a61908a908a908a908a9088613aa4565b9150915080600014612ac0576000612a7883612e85565b90508315612aa15760008381526009602090815260408083203384529091529020819055612abe565b6000838152600a6020908152604080832033845290915290208190555b505b82612b045767ffffffffffffffff87166000908152600b6020526040902054612ae99082613ba9565b67ffffffffffffffff88166000908152600b60205260409020555b8873ffffffffffffffffffffffffffffffffffffffff1663f242432a30338b858a8a6040518763ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050975050505050505050600060405180830381600087803b158015612bcf57600080fd5b505af1158015612be3573d6000803e3d6000fd5b50506040805133815260208101859052815167ffffffffffffffff8c1694508c935073ffffffffffffffffffffffffffffffffffffffff8e16927f72d4fd47a9fbaff0f6860417149191d0520595c12e2f7d4828bac210e6ad3dbc928290030190a4505050505050505050565b67ffffffffffffffff166000908152600d602052604090205460ff1690565b60166020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60146020526000908152604090205481565b60176020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b8173ffffffffffffffffffffffffffffffffffffffff16612cf06133c4565b73ffffffffffffffffffffffffffffffffffffffff161415612d5d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806150f06029913960400191505060405180910390fd5b8060026000612d6a6133c4565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091871680825291909352912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001692151592909217909155612dd96133c4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b6000612e388383613c1d565b9392505050565b60105473ffffffffffffffffffffffffffffffffffffffff1681565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b60009081526004602052604090205490565b60155473ffffffffffffffffffffffffffffffffffffffff1681565b67ffffffffffffffff8116600090815260066020526040902054819073ffffffffffffffffffffffffffffffffffffffff163314612f5257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420746865206f7261636c65206f776e65722e0000000000000000000000604482015290519081900360640190fd5b67ffffffffffffffff821660008181526006602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816908117909155905190917f74793e794a02a6a170c6c9946770eee45a5b771297549c7a134b186d7004f2d491a3505050565b60155473ffffffffffffffffffffffffffffffffffffffff8481166000908152601660205260408082205481517f0d8feb5c000000000000000000000000000000000000000000000000000000008152908416600482015290519290931692630d8feb5c9260248083019392829003018186803b15801561305957600080fd5b505afa15801561306d573d6000803e3d6000fd5b505050600082815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff88811680865291909352818420805493881680865292852084905581855293909355909250906130c46133c4565b73ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b67ffffffffffffffff166000908152600f602052604090205490565b60006116a982613ebe565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205460ff1690565b60008061318d85613a85565b9050600061319f888888888887613aa4565b9998505050505050505050565b60116020526000908152604090205481565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b6131f2848761363d565b6132358686868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613fd892505050565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600860209081526040808320938352929052205460ff1690565b67ffffffffffffffff8216600090815260066020526040902054829073ffffffffffffffffffffffffffffffffffffffff16331461331457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420746865206f7261636c65206f776e65722e0000000000000000000000604482015290519081900360640190fd5b5067ffffffffffffffff909116600090815260076020526040902055565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260166020526040812054909116806116a95782612e38565b6000806133aa8585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061419092505050565b600081815260126020526040902042905595945050505050565b335b90565b6040805160609490941b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602080860191909152603485019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660548401528051808403603c018152605c9093019052815191012090565b6040805160609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166020808501919091526034808501939093528151808503909301835260549093019052805191012090565b6000612e3883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061425e565b680100000000000000001190565b600081815260136020908152604080832054835260149091529020541490565b6000838152600c602052604090205473ffffffffffffffffffffffffffffffffffffffff8581169116146135a857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4f7468657227732073616c6172792067657420617474656d70742e0000000000604482015290519081900360640190fd5b6135bc6135b48561430f565b8484846139a7565b50505050565b67ffffffffffffffff83166000818152600e60209081526040808320858452825280832054938352600f90915290205461360791906136019085613ba9565b906134a3565b67ffffffffffffffff9093166000908152600f6020908152604080832095909555600e8152848220928252919091529190912055565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260086020908152604080832085845290915290205460ff16156136c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806150606030913960400191505060405180910390fd5b5050565b8151835114613725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180615119602f913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416613791576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806150906028913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85163314806137ea575073ffffffffffffffffffffffffffffffffffffffff8516600090815260026020908152604080832033845290915290205460ff1615156001145b61383f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806150b86038913960400191505060405180910390fd5b60005b835181101561389157600084828151811061385957fe5b60200260200101519050600084838151811061387157fe5b6020026020010151905061388782898984614344565b5050600101613842565b508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561393e578181015183820152602001613926565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561397d578181015183820152602001613965565b5050505090500194505050505060405180910390a46139a033868686868661442e565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff8416613a13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806151716021913960400191505060405180910390fd5b613a1e848484614760565b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a46135bc336000868686866147c0565b67ffffffffffffffff1660009081526007602052604090205442111590565b6000806000613ab38587611609565b9050600084613adb5767ffffffffffffffff88166000908152600b6020526040902054613ae4565b613ae487612e85565b9050613af18a8a8a6133c9565b93506000613aff83836149b0565b9050600086613b3d576000868152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8c168452909152902054613b6e565b600086815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff8c1684529091529020545b613b7787612e85565b0390506000613b878b8b856149f9565b9050613b97600f82900b83614a16565b95505050505050965096945050505050565b600082820183811015612e3857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082613c29816134e5565b8015613c3457508015155b8015613c445750613c4481614a98565b613caf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4f6e6c7920666f7220746865206c6173742073616c61727920746f6b656e2e00604482015290519081900360640190fd5b601054604080517f6352211e00000000000000000000000000000000000000000000000000000000815260048101879052905160009273ffffffffffffffffffffffffffffffffffffffff1691636352211e916024808301926020929190829003018186803b158015613d2157600080fd5b505afa158015613d35573d6000803e3d6000fd5b505050506040513d6020811015613d4b57600080fd5b5051600086815260146020526040812054919250613d698387614190565b60008181526013602090815260408083208b9055858352600180835281842073ffffffffffffffffffffffffffffffffffffffff8916808652818552838620805488885293865284872082885286528487208490559185529085905582518d815293840182905282519596509094909233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6292918290030190a46040805183815260208101839052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a460008881526012602052604080822054848352818320555183918a9173ffffffffffffffffffffffffffffffffffffffff8816917f336d2bb69144fc71fe04e0e4a9b896f65406408bfb116e35ac52c15d0e477ce091a4509695505050505050565b600580547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008116600167ffffffffffffffff92831601918216908117909255600082815260066020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055805133815291820194909452835191937f3a39e4ca958a680cb67189b53ab4494bee80524d836f52094ab41cea81219ffe92918290030190a160405167ffffffffffffffff82169073ffffffffffffffffffffffffffffffffffffffff8516907f74793e794a02a6a170c6c9946770eee45a5b771297549c7a134b186d7004f2d490600090a392915050565b73ffffffffffffffffffffffffffffffffffffffff8416614044576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806150906028913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff851633148061409d575073ffffffffffffffffffffffffffffffffffffffff8516600090815260026020908152604080832033845290915290205460ff1615156001145b6140f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806150b86038913960400191505060405180910390fd5b6140fe83868685614344565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a46139a03386868686866147c0565b60008061419d8484614aab565b600081815260116020908152604080832042905560138252808320849055601490915280822083905560105481517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301526024820186905292519495509116926340c10f199260448084019391929182900301818387803b15801561423e57600080fd5b505af1158015614252573d6000803e3d6000fd5b50929695505050505050565b60008184841115614307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156142cc5781810151838201526020016142b4565b50505050905090810190601f1680156142f95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260176020526040812054909116806116a95782612e38565b61435084848484614bf9565b831580159061440f5750601054604080517f6352211e000000000000000000000000000000000000000000000000000000008152600481018790529051339273ffffffffffffffffffffffffffffffffffffffff1691636352211e916024808301926020929190829003018186803b1580156143cb57600080fd5b505afa1580156143df573d6000803e3d6000fd5b505050506040513d60208110156143f557600080fd5b505173ffffffffffffffffffffffffffffffffffffffff16145b156135bc57606061441f856134f3565b156139a0576132358582613c1d565b61444d8473ffffffffffffffffffffffffffffffffffffffff16614caf565b15613235578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b838110156145025781810151838201526020016144ea565b50505050905001848103835286818151815260200191508051906020019060200280838360005b83811015614541578181015183820152602001614529565b50505050905001848103825285818151815260200191508051906020019080838360005b8381101561457d578181015183820152602001614565565b50505050905090810190601f1680156145aa5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b1580156145cf57600080fd5b505af19250505080156145f457506040513d60208110156145ef57600080fd5b505160015b6146bd57614600614ec6565b8061460b575061466c565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283518493919283926044019190850190808383600083156142cc5781810151838201526020016142b4565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180614fa86034913960400191505060405180910390fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014614757576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614fdc6028913960400191505060405180910390fd5b50505050505050565b6000828152600460205260409020546147799082613ba9565b6000928352600460209081526040808520929092556001815281842073ffffffffffffffffffffffffffffffffffffffff9590951684529390935291902080549091019055565b6147df8473ffffffffffffffffffffffffffffffffffffffff16614caf565b15613235578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561489557818101518382015260200161487d565b50505050905090810190601f1680156148c25780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b1580156148e557600080fd5b505af192505050801561490a57506040513d602081101561490557600080fd5b505160015b61491657614600614ec6565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014614757576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614fdc6028913960400191505060405180910390fd5b6000816149bc57600080fd5b60006149c88484614cb5565b90506f7fffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff82161115612e3857600080fd5b600080614a068585614e2b565b9050611716600f84900b82614e68565b600081614a25575060006116a9565b600083600f0b1215614a3657600080fd5b600f83900b6fffffffffffffffffffffffffffffffff8316810260401c90608084901c0277ffffffffffffffffffffffffffffffffffffffffffffffff811115614a7f57600080fd5b60401b8119811115614a9057600080fd5b019392505050565b6000818152601360205260409020541490565b600580547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff8116680100000000000000009182900467ffffffffffffffff908116600101908116928302919091179092556000818152600c6020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89169081179091558151838152875181850152875194969594919333937f6c8e9d3264b48d81c4edda219bc448cde54bdb7997ef1703a4bc9a803167cfce938a93928392830191908501908083838e5b83811015614bae578181015183820152602001614b96565b50505050905090810190601f168015614bdb5780820380516001836020036101000a031916815260200191505b509250505060405180910390a467ffffffffffffffff169392505050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152902054614c3390826134a3565b600085815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8881168552925280832093909355841681522054614c78908290613ba9565b600094855260016020908152604080872073ffffffffffffffffffffffffffffffffffffffff909516875293905291909320555050565b3b151590565b600081614cc157600080fd5b600077ffffffffffffffffffffffffffffffffffffffffffffffff8411614cf75782604085901b81614cef57fe5b049050614e0e565b60c084811c6401000000008110614d10576020918201911c5b620100008110614d22576010918201911c5b6101008110614d33576008918201911c5b60108110614d43576004918201911c5b60048110614d53576002918201911c5b60028110614d62576001820191505b60bf820360018603901c6001018260ff0387901b81614d7d57fe5b0492506fffffffffffffffffffffffffffffffff831115614d9d57600080fd5b608085901c83026fffffffffffffffffffffffffffffffff8616840260c088901c604089901b82811015614dd2576001820391505b608084901b92900382811015614de9576001820391505b829003608084901c8214614df957fe5b888181614e0257fe5b04870196505050505050505b6fffffffffffffffffffffffffffffffff811115612e3857600080fd5b67ffffffffffffffff82166000818152600e60209081526040808320858452825280832054938352600f90915281205490919061171682826149b0565b6000600f83810b9083900b0260401d7fffffffffffffffffffffffffffffffff800000000000000000000000000000008112801590614eb757506f7fffffffffffffffffffffffffffffff8113155b612e3857600080fd5b60e01c90565b600060443d1015614ed6576133c6565b600481823e6308c379a0614eea8251614ec0565b14614ef4576133c6565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3d016004823e80513d67ffffffffffffffff8160248401118184111715614f4257505050506133c6565b82840192508251915080821115614f5c57505050506133c6565b503d83016020828401011115614f74575050506133c6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01681016020016040529150509056fe455243313135353a207472616e7366657220746f206e6f6e2045524331313535526563656976657220696d706c656d656e746572455243313135353a204552433131353552656365697665722072656a656374656420746f6b656e73455243313135353a2062616c616e636520717565727920666f7220746865207a65726f2061646472657373455243313135353a2062617463682062616c616e636520717565727920666f7220746865207a65726f2061646472657373596f752063616e277420747261646520636f6e646974696f6e616c20746f6b656e732061667465722072656465656d2e455243313135353a207461726765742061646472657373206d757374206265206e6f6e2d7a65726f455243313135353a206e656564206f70657261746f7220617070726f76616c20666f7220337264207061727479207472616e73666572732e455243313135353a2073657474696e6720617070726f76616c2073746174757320666f722073656c66455243313135353a2049447320616e64205f76616c756573206d75737420686176652073616d65206c656e67746873455243313135353a206163636f756e747320616e6420696473206c656e677468206d69736d61746368455243313135353a206d696e7420746f20746865207a65726f2061646472657373a264697066735822122046070360fa6da3c442bb68c50f661ac66f68f442ae6d19cb339dc29cd120b7ba64736f6c63430007060033",
  "immutableReferences": {},
  "generatedSources": [],
  "deployedGeneratedSources": [
    {
      "ast": {
        "nodeType": "YulBlock",
        "src": "0:992:31",
        "statements": [
          {
            "nodeType": "YulBlock",
            "src": "6:3:31",
            "statements": []
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "71:31:31",
              "statements": [
                {
                  "nodeType": "YulAssignment",
                  "src": "73:27:31",
                  "value": {
                    "arguments": [
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "89:3:31",
                        "type": "",
                        "value": "224"
                      },
                      {
                        "name": "value",
                        "nodeType": "YulIdentifier",
                        "src": "94:5:31"
                      }
                    ],
                    "functionName": {
                      "name": "shr",
                      "nodeType": "YulIdentifier",
                      "src": "85:3:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "85:15:31"
                  },
                  "variableNames": [
                    {
                      "name": "newValue",
                      "nodeType": "YulIdentifier",
                      "src": "73:8:31"
                    }
                  ]
                }
              ]
            },
            "name": "shift_right_224_unsigned",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "value",
                "nodeType": "YulTypedName",
                "src": "48:5:31",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "newValue",
                "nodeType": "YulTypedName",
                "src": "58:8:31",
                "type": ""
              }
            ],
            "src": "14:88:31"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "154:836:31",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "194:9:31",
                    "statements": [
                      {
                        "nodeType": "YulLeave",
                        "src": "196:5:31"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [],
                        "functionName": {
                          "name": "returndatasize",
                          "nodeType": "YulIdentifier",
                          "src": "170:14:31"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "170:16:31"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "188:4:31",
                        "type": "",
                        "value": "0x44"
                      }
                    ],
                    "functionName": {
                      "name": "lt",
                      "nodeType": "YulIdentifier",
                      "src": "167:2:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "167:26:31"
                  },
                  "nodeType": "YulIf",
                  "src": "164:2:31"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "ret",
                        "nodeType": "YulIdentifier",
                        "src": "227:3:31"
                      },
                      {
                        "name": "ret",
                        "nodeType": "YulIdentifier",
                        "src": "232:3:31"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "237:1:31",
                        "type": "",
                        "value": "4"
                      }
                    ],
                    "functionName": {
                      "name": "returndatacopy",
                      "nodeType": "YulIdentifier",
                      "src": "212:14:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "212:27:31"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "212:27:31"
                },
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "312:9:31",
                    "statements": [
                      {
                        "nodeType": "YulLeave",
                        "src": "314:5:31"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "arguments": [
                              {
                                "arguments": [
                                  {
                                    "name": "ret",
                                    "nodeType": "YulIdentifier",
                                    "src": "292:3:31"
                                  }
                                ],
                                "functionName": {
                                  "name": "mload",
                                  "nodeType": "YulIdentifier",
                                  "src": "286:5:31"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "286:10:31"
                              }
                            ],
                            "functionName": {
                              "name": "shift_right_224_unsigned",
                              "nodeType": "YulIdentifier",
                              "src": "261:24:31"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "261:36:31"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "299:10:31",
                            "type": "",
                            "value": "0x08c379a0"
                          }
                        ],
                        "functionName": {
                          "name": "eq",
                          "nodeType": "YulIdentifier",
                          "src": "258:2:31"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "258:52:31"
                      }
                    ],
                    "functionName": {
                      "name": "iszero",
                      "nodeType": "YulIdentifier",
                      "src": "251:6:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "251:60:31"
                  },
                  "nodeType": "YulIf",
                  "src": "248:2:31"
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "330:21:31",
                  "value": {
                    "arguments": [
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "348:2:31",
                        "type": "",
                        "value": "64"
                      }
                    ],
                    "functionName": {
                      "name": "mload",
                      "nodeType": "YulIdentifier",
                      "src": "342:5:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "342:9:31"
                  },
                  "variables": [
                    {
                      "name": "data",
                      "nodeType": "YulTypedName",
                      "src": "334:4:31",
                      "type": ""
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "data",
                        "nodeType": "YulIdentifier",
                        "src": "375:4:31"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "381:1:31",
                        "type": "",
                        "value": "4"
                      },
                      {
                        "arguments": [
                          {
                            "arguments": [],
                            "functionName": {
                              "name": "returndatasize",
                              "nodeType": "YulIdentifier",
                              "src": "388:14:31"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "388:16:31"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "406:66:31",
                            "type": "",
                            "value": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "384:3:31"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "384:89:31"
                      }
                    ],
                    "functionName": {
                      "name": "returndatacopy",
                      "nodeType": "YulIdentifier",
                      "src": "360:14:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "360:114:31"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "360:114:31"
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "483:25:31",
                  "value": {
                    "arguments": [
                      {
                        "name": "data",
                        "nodeType": "YulIdentifier",
                        "src": "503:4:31"
                      }
                    ],
                    "functionName": {
                      "name": "mload",
                      "nodeType": "YulIdentifier",
                      "src": "497:5:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "497:11:31"
                  },
                  "variables": [
                    {
                      "name": "offset",
                      "nodeType": "YulTypedName",
                      "src": "487:6:31",
                      "type": ""
                    }
                  ]
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "517:26:31",
                  "value": {
                    "arguments": [],
                    "functionName": {
                      "name": "returndatasize",
                      "nodeType": "YulIdentifier",
                      "src": "527:14:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "527:16:31"
                  },
                  "variables": [
                    {
                      "name": "_1",
                      "nodeType": "YulTypedName",
                      "src": "521:2:31",
                      "type": ""
                    }
                  ]
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "552:28:31",
                  "value": {
                    "kind": "number",
                    "nodeType": "YulLiteral",
                    "src": "562:18:31",
                    "type": "",
                    "value": "0xffffffffffffffff"
                  },
                  "variables": [
                    {
                      "name": "_2",
                      "nodeType": "YulTypedName",
                      "src": "556:2:31",
                      "type": ""
                    }
                  ]
                },
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "638:9:31",
                    "statements": [
                      {
                        "nodeType": "YulLeave",
                        "src": "640:5:31"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "offset",
                            "nodeType": "YulIdentifier",
                            "src": "598:6:31"
                          },
                          {
                            "name": "_2",
                            "nodeType": "YulIdentifier",
                            "src": "606:2:31"
                          }
                        ],
                        "functionName": {
                          "name": "gt",
                          "nodeType": "YulIdentifier",
                          "src": "595:2:31"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "595:14:31"
                      },
                      {
                        "arguments": [
                          {
                            "arguments": [
                              {
                                "name": "offset",
                                "nodeType": "YulIdentifier",
                                "src": "618:6:31"
                              },
                              {
                                "kind": "number",
                                "nodeType": "YulLiteral",
                                "src": "626:4:31",
                                "type": "",
                                "value": "0x24"
                              }
                            ],
                            "functionName": {
                              "name": "add",
                              "nodeType": "YulIdentifier",
                              "src": "614:3:31"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "614:17:31"
                          },
                          {
                            "name": "_1",
                            "nodeType": "YulIdentifier",
                            "src": "633:2:31"
                          }
                        ],
                        "functionName": {
                          "name": "gt",
                          "nodeType": "YulIdentifier",
                          "src": "611:2:31"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "611:25:31"
                      }
                    ],
                    "functionName": {
                      "name": "or",
                      "nodeType": "YulIdentifier",
                      "src": "592:2:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "592:45:31"
                  },
                  "nodeType": "YulIf",
                  "src": "589:2:31"
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "656:28:31",
                  "value": {
                    "arguments": [
                      {
                        "name": "data",
                        "nodeType": "YulIdentifier",
                        "src": "671:4:31"
                      },
                      {
                        "name": "offset",
                        "nodeType": "YulIdentifier",
                        "src": "677:6:31"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "667:3:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "667:17:31"
                  },
                  "variables": [
                    {
                      "name": "msg",
                      "nodeType": "YulTypedName",
                      "src": "660:3:31",
                      "type": ""
                    }
                  ]
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "693:24:31",
                  "value": {
                    "arguments": [
                      {
                        "name": "msg",
                        "nodeType": "YulIdentifier",
                        "src": "713:3:31"
                      }
                    ],
                    "functionName": {
                      "name": "mload",
                      "nodeType": "YulIdentifier",
                      "src": "707:5:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "707:10:31"
                  },
                  "variables": [
                    {
                      "name": "length",
                      "nodeType": "YulTypedName",
                      "src": "697:6:31",
                      "type": ""
                    }
                  ]
                },
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "744:9:31",
                    "statements": [
                      {
                        "nodeType": "YulLeave",
                        "src": "746:5:31"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "name": "length",
                        "nodeType": "YulIdentifier",
                        "src": "732:6:31"
                      },
                      {
                        "name": "_2",
                        "nodeType": "YulIdentifier",
                        "src": "740:2:31"
                      }
                    ],
                    "functionName": {
                      "name": "gt",
                      "nodeType": "YulIdentifier",
                      "src": "729:2:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "729:14:31"
                  },
                  "nodeType": "YulIf",
                  "src": "726:2:31"
                },
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "826:9:31",
                    "statements": [
                      {
                        "nodeType": "YulLeave",
                        "src": "828:5:31"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "arguments": [
                              {
                                "name": "msg",
                                "nodeType": "YulIdentifier",
                                "src": "776:3:31"
                              },
                              {
                                "name": "length",
                                "nodeType": "YulIdentifier",
                                "src": "781:6:31"
                              }
                            ],
                            "functionName": {
                              "name": "add",
                              "nodeType": "YulIdentifier",
                              "src": "772:3:31"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "772:16:31"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "790:4:31",
                            "type": "",
                            "value": "0x20"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "768:3:31"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "768:27:31"
                      },
                      {
                        "arguments": [
                          {
                            "name": "data",
                            "nodeType": "YulIdentifier",
                            "src": "801:4:31"
                          },
                          {
                            "arguments": [],
                            "functionName": {
                              "name": "returndatasize",
                              "nodeType": "YulIdentifier",
                              "src": "807:14:31"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "807:16:31"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "797:3:31"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "797:27:31"
                      }
                    ],
                    "functionName": {
                      "name": "gt",
                      "nodeType": "YulIdentifier",
                      "src": "765:2:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "765:60:31"
                  },
                  "nodeType": "YulIf",
                  "src": "762:2:31"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "851:2:31",
                        "type": "",
                        "value": "64"
                      },
                      {
                        "arguments": [
                          {
                            "arguments": [
                              {
                                "name": "msg",
                                "nodeType": "YulIdentifier",
                                "src": "863:3:31"
                              },
                              {
                                "arguments": [
                                  {
                                    "arguments": [
                                      {
                                        "name": "length",
                                        "nodeType": "YulIdentifier",
                                        "src": "876:6:31"
                                      },
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "884:2:31",
                                        "type": "",
                                        "value": "31"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "add",
                                      "nodeType": "YulIdentifier",
                                      "src": "872:3:31"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "872:15:31"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "889:66:31",
                                    "type": "",
                                    "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"
                                  }
                                ],
                                "functionName": {
                                  "name": "and",
                                  "nodeType": "YulIdentifier",
                                  "src": "868:3:31"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "868:88:31"
                              }
                            ],
                            "functionName": {
                              "name": "add",
                              "nodeType": "YulIdentifier",
                              "src": "859:3:31"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "859:98:31"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "959:4:31",
                            "type": "",
                            "value": "0x20"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "855:3:31"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "855:109:31"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "844:6:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "844:121:31"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "844:121:31"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "974:10:31",
                  "value": {
                    "name": "msg",
                    "nodeType": "YulIdentifier",
                    "src": "981:3:31"
                  },
                  "variableNames": [
                    {
                      "name": "ret",
                      "nodeType": "YulIdentifier",
                      "src": "974:3:31"
                    }
                  ]
                }
              ]
            },
            "name": "try_decode_error_message",
            "nodeType": "YulFunctionDefinition",
            "returnVariables": [
              {
                "name": "ret",
                "nodeType": "YulTypedName",
                "src": "146:3:31",
                "type": ""
              }
            ],
            "src": "107:883:31"
          }
        ]
      },
      "contents": "{\n    { }\n    function shift_right_224_unsigned(value) -> newValue\n    { newValue := shr(224, value) }\n    function try_decode_error_message() -> ret\n    {\n        if lt(returndatasize(), 0x44) { leave }\n        returndatacopy(ret, ret, 4)\n        if iszero(eq(shift_right_224_unsigned(mload(ret)), 0x08c379a0)) { leave }\n        let data := mload(64)\n        returndatacopy(data, 4, add(returndatasize(), 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc))\n        let offset := mload(data)\n        let _1 := returndatasize()\n        let _2 := 0xffffffffffffffff\n        if or(gt(offset, _2), gt(add(offset, 0x24), _1)) { leave }\n        let msg := add(data, offset)\n        let length := mload(msg)\n        if gt(length, _2) { leave }\n        if gt(add(add(msg, length), 0x20), add(data, returndatasize())) { leave }\n        mstore(64, add(add(msg, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20))\n        ret := msg\n    }\n}",
      "id": 31,
      "language": "Yul",
      "name": "#utility.yul"
    }
  ],
  "sourceMap": "322:1878:9:-:0;;;910:188;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;910:188:9;;;;;;;;;;-1:-1:-1;910:188:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;910:188:9;;-1:-1:-1;1047:17:9;;-1:-1:-1;1066:17:9;;-1:-1:-1;1085:4:9;1047:17;1085:4;;;;;768:40:12;-1:-1:-1;;;768:18:12;:40::i;:::-;2199:13:4;2207:4;2199:7;:13::i;:::-;2301:41;-1:-1:-1;;;2301:18:4;:41::i;:::-;2442:54;-1:-1:-1;;;2442:18:4;:54::i;:::-;-1:-1:-1;282:152:16;;-1:-1:-1;;;;282:18:16;:152::i;:::-;4753:190:1::1;-1:-1:-1::0;;;4753:18:1::1;:190::i;:::-;-1:-1:-1::0;;3120:16:3::1;:36:::0;;-1:-1:-1;;;;;3120:36:3;;::::1;-1:-1:-1::0;;;;;;3120:36:3;;::::1;;::::0;;;1415:16:2::1;:36:::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;-1:-1:-1;322:1878:9;;-1:-1:-1;;;;;322:1878:9;1499:198:12;-1:-1:-1;;;;;;1582:25:12;;;;;1574:66;;;;;-1:-1:-1;;;1574:66:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1650:33:12;:20;:33;;;;;;;;;;:40;;-1:-1:-1;;1650:40:12;1686:4;1650:40;;;1499:198::o;7807:86:4:-;7873:13;;;;:4;;:13;;;;;:::i;:::-;;7807:86;:::o;322:1878:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;322:1878:9;;;-1:-1:-1;322:1878:9;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;",
  "deployedSourceMap": "322:1878:9:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3141:228:4;;;;;;;;;;;;;;;;-1:-1:-1;3141:228:4;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1844:354:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1844:354:9;;-1:-1:-1;1844:354:9;-1:-1:-1;1844:354:9;:::i;4244:90:1:-;;;;;;;;;;;;;;;;-1:-1:-1;4244:90:1;;;;;;;;;:::i;965:140:12:-;;;;;;;;;;;;;;;;-1:-1:-1;965:140:12;;;;:::i;:::-;;;;;;;;;;;;;;;;;;2951:731:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2951:731:2;;-1:-1:-1;2951:731:2;-1:-1:-1;2951:731:2;:::i;:::-;;7966:1184:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7966:1184:1;;-1:-1:-1;7966:1184:1;-1:-1:-1;7966:1184:1;:::i;3343:735:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3343:735:3;;-1:-1:-1;3343:735:3;;-1:-1:-1;;;;;3343:735:3:i;2902:97:4:-;;;;;;;;;;;;;;;;-1:-1:-1;2902:97:4;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;538:162:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;538:162:21;;-1:-1:-1;538:162:21;;-1:-1:-1;;;;;538:162:21:i;:::-;;;;;;;;;;;;;;;;;;;2365:47:3;;;;;;;;;;;;;;;;-1:-1:-1;2365:47:3;;:::i;3090:348:0:-;;;;;;;;;;;;;;;;-1:-1:-1;3090:348:0;;;;;;;;;;;;;;:::i;2604:56:3:-;;;;;;;;;;;;;;;;-1:-1:-1;2604:56:3;;:::i;13551:398:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13551:398:1;;-1:-1:-1;13551:398:1;-1:-1:-1;13551:398:1;:::i;6723:889::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6723:889:1;;-1:-1:-1;6723:889:1;-1:-1:-1;6723:889:1;:::i;14894:119::-;;;;;;;;;;;;;;;;-1:-1:-1;14894:119:1;;;;:::i;3468:28::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3526:631:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3526:631:4;;;;;;;;-1:-1:-1;3526:631:4;;-1:-1:-1;;3526:631:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3526:631:4;;-1:-1:-1;3526:631:4;;-1:-1:-1;;;;;3526:631:4:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14044:119:1;;;;;;;;;;;;;;;;-1:-1:-1;14044:119:1;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4552:50;;;;;;;;;;;;;;;;-1:-1:-1;4552:50:1;;:::i;482:49:9:-;;;;;;;;;;;;;;;;-1:-1:-1;482:49:9;;;;:::i;4045:89:1:-;;;;;;;;;;;;;;;;-1:-1:-1;4045:89:1;;;;;;;;;:::i;4408:174:0:-;;;;;;;;;;;;;;;;-1:-1:-1;4408:174:0;;;;:::i;4436:59:1:-;;;;;;;;;;;;;;;;-1:-1:-1;4436:59:1;;;;:::i;2121:159:0:-;;;;;;;;;;;;;;;;-1:-1:-1;2121:159:0;;;;;;;;;:::i;3397:25:1:-;;;:::i;3672:547:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3672:547:0;;-1:-1:-1;3672:547:0;-1:-1:-1;3672:547:0;:::i;10987:1916:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10987:1916:1;;-1:-1:-1;10987:1916:1;-1:-1:-1;10987:1916:1;:::i;4712:132:0:-;;;;;;;;;;;;;;;;-1:-1:-1;4712:132:0;;;;:::i;971:52:2:-;;;;;;;;;;;;;;;;-1:-1:-1;971:52:2;;;;:::i;2869:62:3:-;;;;;;;;;;;;;;;;-1:-1:-1;2869:62:3;;:::i;1102:61:2:-;;;;;;;;;;;;;;;;-1:-1:-1;1102:61:2;;;;:::i;4225:306:4:-;;;;;;;;;;;;;;;;-1:-1:-1;4225:306:4;;;;;;;;;;;:::i;4910:153:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4910:153:3;;-1:-1:-1;4910:153:3;;-1:-1:-1;;;;;4910:153:3:i;2122:42::-;;;:::i;366:201:15:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;366:201:15;;;;;;;;-1:-1:-1;366:201:15;;-1:-1:-1;;366:201:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;366:201:15;;;;;;;;-1:-1:-1;366:201:15;;-1:-1:-1;;366:201:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;366:201:15;;-1:-1:-1;366:201:15;;-1:-1:-1;;;;;366:201:15:i;1240:104:5:-;;;;;;;;;;;;;;;;-1:-1:-1;1240:104:5;;:::i;850:42:2:-;;;:::i;5297:220:1:-;;;;;;;;;;;;;;;;-1:-1:-1;5297:220:1;;;;;;;;;;;:::i;2033:491:2:-;;;;;;;;;;;;;;;;-1:-1:-1;2033:491:2;;;;;;;;;;;;;;;;;;:::i;2481:131:0:-;;;;;;;;;;;;;;;;-1:-1:-1;2481:131:0;;;;:::i;1162:121:9:-;;;;;;;;;;;;;;;;-1:-1:-1;1162:121:9;;;;:::i;4598:166:4:-;;;;;;;;;;;;;;;;-1:-1:-1;4598:166:4;;;;;;;;;;;:::i;9570:467:1:-;;;;;;;;;;;;;;;;-1:-1:-1;9570:467:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2253:54:3:-;;;;;;;;;;;;;;;;-1:-1:-1;2253:54:3;;:::i;187:173:15:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;187:173:15;;-1:-1:-1;187:173:15;;-1:-1:-1;;;;;187:173:15:i;13081:292:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13081:292:1;;-1:-1:-1;13081:292:1;-1:-1:-1;13081:292:1;:::i;14648:151::-;;;;;;;;;;;;;;;;-1:-1:-1;14648:151:1;;;;;;;;;:::i;5868:140::-;;;;;;;;;;;;;;;;-1:-1:-1;5868:140:1;;;;;;;;;:::i;3141:228:4:-;3227:7;3254:21;;;3246:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3340:13:4;;;;:9;:13;;;;;;;;:22;;;;;;;;;;;3141:228;;;;;:::o;1844:354:9:-;1943:7;1966:13;1982:27;1999:9;1982:16;:27::i;:::-;2103;;;;;;;:16;:27;;;;;:34;;;;2133:4;2103:34;;;1966:43;-1:-1:-1;2154:37:9;1966:43;2185:5;;2154:23;:37::i;:::-;2147:44;1844:354;-1:-1:-1;;;;;1844:354:9:o;4244:90:1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;965:140:12:-;1065:33;;1042:4;1065:33;;;;;;;;;;;;;;965:140::o;2951:731:2:-;3065:16;;;3100:30;;;3065:16;3100:30;;;:17;:30;;;;;;;3065:66;;;;;3100:30;;;3065:66;;;;;;:16;;;;;:34;;:66;;;;;:16;:66;;;;;:16;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3199:25:2;;-1:-1:-1;3241:7:2;;-1:-1:-1;;3227:29:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3227:29:2;;3199:57;;3271:7;3266:322;3284:19;;;3266:322;;;3325:14;3342:7;;3350:2;3342:11;;;;;;;;;;;;;;;;3367:15;3385:17;;;:9;:17;;;;;;:30;;;;;;;;;;;;;3429:12;;3342:11;;-1:-1:-1;3385:30:2;;;-1:-1:-1;3429:8:2;;3438:2;;3429:12;;;;;;;;;;;;;;;;:22;;;;3499:17;;;;:9;:17;;;;;;;:30;;;;;;;;;;;;;;;;3466;;;;;;;;:63;;;;3543:30;;;:34;;;-1:-1:-1;3305:4:2;3266:322;;;;3644:11;3603:72;;3631:11;3603:72;;3617:12;:10;:12::i;:::-;3603:72;;;3657:7;;3666:8;3603:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3603:72:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2951:731;;;;;:::o;7966:1184:1:-;8153:39;8195:93;8230:26;8258:18;8278:9;8195:34;:93::i;:::-;8153:135;;8298:30;8331:73;8357:26;8385:18;8331:25;:73::i;:::-;8298:106;;8476:19;8510:145;8603:51;8621:4;8628:25;8603:9;:51::i;:::-;8510:71;;;;;;8555:4;8510:71;;;;;;;;;;;;:36;;;;;;:71;;;;;;;;;;;;;;:36;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8510:71:1;;:75;:145::i;:::-;8476:179;;8665:15;8834:51;8852:4;8859:25;8834:9;:51::i;:::-;8759:60;8777:4;8784:34;8759:9;:60::i;:::-;8733:11;:86;:152;;;;;;8665:220;;8947:196;8967:26;9007:18;9039:9;9062:7;9091:4;9118;9137:5;;8947:6;:196::i;:::-;7966:1184;;;;;;;;;:::o;3343:735:3:-;3438:10;11452:19;11467:3;11452:14;:19::i;:::-;:31;;;;-1:-1:-1;11475:8:3;;;11452:31;:62;;;;;11487:27;11510:3;11487:22;:27::i;:::-;11444:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3473:20:::1;3496:27:::0;;;:15:::1;:27;::::0;;;;;3541:20;3533:56:::1;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;3769:15;3893:39:::0;;;:27:::1;:39;::::0;;;;;3825:6:::1;3788:15;:33:::0;;::::1;3787:44;::::0;3865:84:::1;::::0;3881:10:::1;::::0;3787:44;3943:5;3865:15:::1;:84::i;:::-;3989:15;3959;:27;3975:10;3959:27;;;;;;;;;;;:45;;;;4044:10;4032;4019:52;;;4056:7;4065:5;4019:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11560:1;;3343:735:::0;;;:::o;2902:97:4:-;2988:4;2981:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2956:13;;2981:11;;2988:4;;2981:11;;2988:4;2981:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2902:97;;;:::o;538:162:21:-;663:30;538:162;;;;;;:::o;2365:47:3:-;;;;;;;;;;;;;:::o;3090:348:0:-;22011:26:1;;;;;;;:15;:26;;;;;;3200:9:0;;22011:40:1;:26;22041:10;22011:40;22003:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3238:9:0::1;5591:27;5608:9;5591:16;:27::i;:::-;5590:28;5582:60;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;3313:51:::2;3330:9;3341:10;3353;3313:16;:51::i;:::-;3379:52;::::0;;;;;;;3408:10;;3379:52:::2;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;22087:1:1::1;3090:348:0::0;;;;:::o;2604:56:3:-;;;;;;;;;;;;;:::o;13551:398:1:-;13773:7;13769:104;13786:16;;;13769:104;;;13824:38;13846:4;;13851:2;13846:8;;;;;;;;;;;;;13856:5;13824:21;:38::i;:::-;13804:4;;13769:104;;;;13882:60;13909:5;13916:3;13921:4;;13882:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13882:60:1;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13927:7:1;;-1:-1:-1;13927:7:1;;;;13882:60;;;13927:7;;13882:60;13927:7;13882:60;;;;;;;;;-1:-1:-1;;13882:60:1;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13936:5:1;;-1:-1:-1;13936:5:1;;;;13882:60;;13936:5;;;;13882:60;;;;;;;;;-1:-1:-1;13882:26:1;;-1:-1:-1;;;13882:60:1:i;:::-;13551:398;;;;;;;;:::o;6723:889::-;6967:39;7009:93;7044:26;7072:18;7092:9;7009:34;:93::i;:::-;6967:135;;7112:62;7118:3;7123:34;7159:7;7168:5;;7112:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7112:5:1;;-1:-1:-1;;;7112:62:1:i;:::-;7184:30;7217:73;7243:26;7271:18;7217:25;:73::i;:::-;7184:106;;7300:53;7306:3;7311:25;7338:7;7347:5;;7300:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7300:5:1;;-1:-1:-1;;;7300:53:1:i;:::-;7433:5;7368:92;;7413:18;7385:26;7368:92;;;7440:7;7449:3;7454:5;;7368:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7368:92:1;;-1:-1:-1;;;;;;7368:92:1;7470:26;:43;;;7514:5;7529:4;7536:18;7556:7;7565:5;;7470:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6723:889;;;;;;;;;;:::o;14894:119::-;14980:26;;14957:4;14980:26;;;:15;:26;;;;;;;14894:119::o;3468:28::-;;;;;;;;;:::o;3526:631:4:-;3699:16;3758:3;:10;3739:8;:15;:29;3731:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3825:30;3872:8;:15;3858:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3858:30:4;;3825:63;;3904:9;3899:221;3923:8;:15;3919:1;:19;3899:221;;;3990:1;3967:25;;:8;3976:1;3967:11;;;;;;;;;;;;;;:25;;;;3959:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4079:9;:17;4089:3;4093:1;4089:6;;;;;;;;;;;;;;4079:17;;;;;;;;;;;:30;4097:8;4106:1;4097:11;;;;;;;;;;;;;;4079:30;;;;;;;;;;;;;;;;4060:13;4074:1;4060:16;;;;;;;;;;;;;;;;;:49;3940:3;;3899:221;;;-1:-1:-1;4137:13:4;3526:631;-1:-1:-1;;;3526:631:4:o;14044:119:1:-;14130:26;;14104:7;14130:26;;;:15;:26;;;;;;;;;14044:119::o;4552:50::-;;;;;;;;;;;;;;;:::o;482:49:9:-;;;;;;;;;;;;;;;:::o;4045:89:1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;4408:174:0:-;22011:26:1;;;;;;;:15;:26;;;;;;4475:9:0;;22011:40:1;:26;22041:10;22011:40;22003:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4500:28:0::1;::::0;::::1;;::::0;;;:17:::1;:28;::::0;;;;;:35;;;::::1;4531:4;4500:35;::::0;;4550:25;::::1;::::0;4500:28;4550:25:::1;4408:174:::0;;:::o;4436:59:1:-;;;;;;;;;;;;;:::o;2121:159:0:-;2231:30;;;;;2205:7;2231:30;;;:19;:30;;;;;;;;:42;;;;;;;;;2121:159::o;3397:25:1:-;;;;;;:::o;3672:547:0:-;22011:26:1;;;;;;;:15;:26;;;;;;3811:9:0;;22011:40:1;:26;22041:10;22011:40;22003:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3849:9:0::1;5591:27;5608:9;5591:16;:27::i;:::-;5590:28;5582:60;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;3932:40:::0;;::::2;3924:69;;;::::0;;::::2;::::0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;4008:7;4003:135;4021:23:::0;;::::2;4003:135;;;4066:61;4083:9;4094:11;;4106:2;4094:15;;;;;;;;;;;;;4111:11;;4123:2;4111:15;;;;;;;;;;;;;;;4066:61;;:16;:61::i;:::-;4046:4;;4003:135;;;;4187:11;;4152:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4176:9;4152:60;;;4200:11;;4152:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;::::2;::::0;-1:-1:-1;4152:60:0;;-1:-1:-1;;;;4152:60:0::2;22087:1:1::1;3672:547:0::0;;;;;;:::o;10987:1916:1:-;11212:27;11229:9;11212:16;:27::i;:::-;11204:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11327:18;11348:26;11364:9;11348:15;:26::i;:::-;11402:10;11384:29;;;;:17;:29;;;;;;;;:41;;;;;;;;:48;;;;11428:4;11384:48;;;11327:47;;-1:-1:-1;11384:29:1;;11652:118;;11673:26;;11701:18;;11721:9;;11414:10;;11327:47;11652:20;:118::i;:::-;11573:197;;;;11986:13;12003:1;11986:18;11982:409;;12020:17;12040:47;12052:34;12040:11;:47::i;:::-;12020:67;;12105:13;12101:280;;;12138:70;;;;:34;:70;;;;;;;;12209:10;12138:82;;;;;;;:94;;;12101:280;;;12271:71;;;;:35;:71;;;;;;;;12343:10;12271:83;;;;;;;:95;;;12101:280;11982:409;;12405:13;12400:139;;12473:36;;;;;;;:25;:36;;;;;;:55;;12514:13;12473:40;:55::i;:::-;12434:36;;;;;;;:25;:36;;;;;:94;12400:139;12594:26;:43;;;12646:4;12653:10;12665:18;12685:13;12700:5;;12594:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12721:175:1;;;12849:10;12721:175;;;;;;;;;;;;;;-1:-1:-1;12794:18:1;;-1:-1:-1;12721:175:1;;;;;;;;;;;;10987:1916;;;;;;;;;:::o;4712:132:0:-;4809:28;;4786:4;4809:28;;;:17;:28;;;;;;;;;4712:132::o;971:52:2:-;;;;;;;;;;;;;;;:::o;2869:62:3:-;;;;;;;;;;;;;:::o;1102:61:2:-;;;;;;;;;;;;;;;:::o;4225:306:4:-;4343:8;4327:24;;:12;:10;:12::i;:::-;:24;;;;4319:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4453:8;4408:18;:32;4427:12;:10;:12::i;:::-;4408:32;;;;;;;;;;;;;;;;;;-1:-1:-1;4408:32:4;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;;4491:12;:10;:12::i;:::-;4476:48;;;4515:8;4476:48;;;;;;;;;;;;;;;;;;;;4225:306;;:::o;4910:153:3:-;4993:7;5019:37;5038:10;5050:5;5019:18;:37::i;:::-;5012:44;4910:153;-1:-1:-1;;;4910:153:3:o;2122:42::-;;;;;;:::o;366:201:15:-;524:36;366:201;;;;;;;:::o;1240:104:5:-;1294:7;1320:17;;;:13;:17;;;;;;;1240:104::o;850:42:2:-;;;;;;:::o;5297:220:1:-;22011:26;;;;;;;:15;:26;;;;;;5384:9;;22011:40;:26;22041:10;22011:40;22003:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5405:26:::1;::::0;::::1;;::::0;;;:15:::1;:26;::::0;;;;;:44;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;5464:46;;5405:44;;5464:46:::1;::::0;::::1;5297:220:::0;;;:::o;2033:491:2:-;2130:16;;;2165:30;;;2130:16;2165:30;;;:17;:30;;;;;;;2130:66;;;;;2165:30;;;2130:66;;;;;;:16;;;;;:34;;:66;;;;;:16;:66;;;;;:16;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2264:15:2;2282:17;;;:9;:17;;;;;;;;:30;;;;;;;;;;;;;;;;2323;;;;;;;;;:63;;;2396:30;;;:34;;;;2282:30;;-1:-1:-1;2323:30:2;2461:12;:10;:12::i;:::-;2446:71;;;2501:6;2509:7;2446:71;;;;;;;;;;;;;;;;;;;;;;;;2033:491;;;;:::o;2481:131:0:-;2573:32;;2547:7;2573:32;;;:21;:32;;;;;;;2481:131::o;1162:121:9:-;1224:6;1249:27;1263:12;1249:13;:27::i;4598:166:4:-;4720:27;;;;4697:4;4720:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;4598:166::o;9570:467:1:-;9781:7;9800:18;9821:26;9837:9;9821:15;:26::i;:::-;9800:47;;9860:16;9892:113;9913:26;9941:18;9961:9;9972:10;9984:5;9991:13;9892:20;:113::i;:::-;9857:148;9570:467;-1:-1:-1;;;;;;;;;9570:467:1:o;2253:54:3:-;;;;;;;;;;;;;:::o;187:173:15:-;322:31;187:173;;;;;;;:::o;13081:292:1:-;13270:33;13292:3;13297:5;13270:21;:33::i;:::-;13313:53;13335:5;13342:3;13347;13352:6;13360:5;;13313:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13313:21:1;;-1:-1:-1;;;13313:53:1:i;:::-;13081:292;;;;;;:::o;14648:151::-;14756:24;;;;;14733:4;14756:24;;;:17;:24;;;;;;;;:36;;;;;;;;;;;14648:151::o;5868:140::-;22011:26;;;;;;;:15;:26;;;;;;5946:9;;22011:40;:26;22041:10;22011:40;22003:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5967:26:1::1;::::0;;::::1;;::::0;;;:15:::1;:26;::::0;;;;:34;5868:140::o;3891:217:2:-;4007:27;;;;3966:7;4007:27;;;:17;:27;;;;;;3966:7;;4007:27;4051:25;:50;;4093:8;4051:50;;10827:271:3;10929:7;10952:18;10973:36;10992:9;11003:5;;10973:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10973:18:3;;-1:-1:-1;;;10973:36:3:i;:::-;11019:27;;;;:15;:27;;;;;11049:15;11019:45;;:27;10827:271;-1:-1:-1;;;;;10827:271:3:o;598:104:10:-;685:10;598:104;;:::o;16853:290:1:-;17059:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17049:86;;;;;;16853:290::o;17531:252::-;17710:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17700:75;;;;;;17531:252::o;1329:134:14:-;1387:7;1413:43;1417:1;1420;1413:43;;;;;;;;;;;;;;;;;:3;:43::i;21679:271:1:-;21937:5;-1:-1:-1;21925:18:1;21679:271::o;10239:160:3:-;10307:4;10358:26;;;:21;:26;;;;;;;;;10330:55;;:27;:55;;;;;;:62;;10239:160::o;15332:307:1:-;15480:27;;;;:15;:27;;;;;;:40;;;;:27;;:40;15472:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15562:70;15568:35;15593:9;15568:24;:35::i;:::-;15605:10;15617:7;15626:5;15562;:70::i;:::-;15332:307;;;;:::o;4850:305:0:-;5040:30;;;;;;;:19;:30;;;;;;;;:42;;;;;;;;;4987:32;;;:21;:32;;;;;;:96;;5040:42;4987:48;;5024:10;4987:36;:48::i;:::-;:52;;:96::i;:::-;4952:32;;;;;;;;:21;:32;;;;;;;;:131;;;;5093:19;:30;;;;;:42;;;;;;;;;;;:55;4850:305::o;17789:181:1:-;17881:24;;;;;;;:17;:24;;;;;;;;:29;;;;;;;;;;;17880:30;17872:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17789:181;;:::o;18565:921::-;18797:7;:14;18782:4;:11;:29;18774:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18881:17;;;18873:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18974:19;;;18983:10;18974:19;;:68;;-1:-1:-1;18997:25:1;;;;;;;:18;:25;;;;;;;;19023:10;18997:37;;;;;;;;;;:45;;:37;:45;18974:68;18953:171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19140:10;19135:185;19161:4;:11;19156:2;:16;19135:185;;;19194:11;19208:4;19213:2;19208:8;;;;;;;;;;;;;;19194:22;;19230:14;19247:7;19255:2;19247:11;;;;;;;;;;;;;;19230:28;;19273:36;19285:3;19290:5;19297:3;19302:6;19273:11;:36::i;:::-;-1:-1:-1;;19174:4:1;;19135:185;;;;19368:3;19335:52;;19361:5;19335:52;;19349:10;19335:52;;;19373:4;19379:7;19335:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19398:81;19434:10;19446:5;19453:3;19458:4;19464:7;19473:5;19398:35;:81::i;:::-;18565:921;;;;;:::o;1509:357:5:-;1618:16;;;1610:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1683:22;1691:2;1695;1699:5;1683:7;:22::i;:::-;1720:53;;;;;;;;;;;;;;;;;;1755:1;;1735:10;;1720:53;;;;;;;;;;;1784:75;1815:10;1835:1;1839:2;1843;1847:5;1854:4;1784:30;:75::i;21532:141:1:-;21640:26;;21598:4;21640:26;;;:15;:26;;;;;;21621:15;:45;;;21532:141::o;20249:1277::-;20501:39;20542:16;20574:27;20604:28;20614:5;20621:10;20604:9;:28::i;:::-;20574:58;;20642:32;20689:13;:78;;20731:36;;;;;;;:25;:36;;;;;;20689:78;;;20705:23;20717:10;20705:11;:23::i;:::-;20642:125;;20814:93;20849:26;20877:18;20897:9;20814:34;:93::i;:::-;20777:130;;20966:19;20988:65;21007:19;21028:24;20988:18;:65::i;:::-;20966:87;;21063:28;21169:13;:207;;21298:71;;;;:35;:71;;;;;;;;:78;;;;;;;;;;;21169:207;;;21201:70;;;;:34;:70;;;;;;;;:77;;;;;;;;;;;21169:207;21106:47;21118:34;21106:11;:47::i;:::-;:271;21063:314;;21387:18;21408:52;21424:9;21435:10;21447:12;21408:15;:52::i;:::-;21387:73;-1:-1:-1;21481:38:1;:16;;;;21498:20;21481:16;:38::i;:::-;21470:49;;20249:1277;;;;;;;;;;;;;;:::o;882:176:14:-;940:7;971:5;;;994:6;;;;986:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8634:1098:3;8768:7;8747:10;11217:19;11232:3;11217:14;:19::i;:::-;:31;;;;-1:-1:-1;11240:8:3;;;11217:31;:63;;;;;11252:28;11276:3;11252:23;:28::i;:::-;11209:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8811:16:::1;::::0;:36:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;8791:17:::1;::::0;8811:16:::1;;::::0;:24:::1;::::0;:36;;;;;::::1;::::0;;;;;;;;:16;:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;8811:36:3;8857:21:::1;8881:39:::0;;;:27:::1;8811:36;8881:39:::0;;;;;8811:36;;-1:-1:-1;8954:36:3::1;8811::::0;8984:5;8954:18:::1;:36::i;:::-;9000;::::0;;;:21:::1;:36;::::0;;;;;;;:49;;;9078:24;;;:9:::1;:24:::0;;;;;;:35:::1;::::0;::::1;::::0;;;;;;;;;;;9123:24;;;;;;;;;:35;;;;;;;;:45;;;9178:35;;;:39;;;;9233:70;;;;;;;::::1;::::0;;;;;9000:36;;-1:-1:-1;9078:35:3;;;;9248:10:::1;::::0;9233:70:::1;::::0;;;;;;;::::1;9318:73;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;9353:1:::1;::::0;9333:10:::1;::::0;9318:73:::1;::::0;;;;;;;;;::::1;9435:27;::::0;;;:15:::1;:27;::::0;;;;;;9402:30;;;;;;:60;9640:55;9418:13;;9451:10;;9640:55:::1;::::0;::::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;9712:13:3;8634:1098;-1:-1:-1;;;;;;8634:1098:3:o;19492:306:1:-;19594:11;19592:13;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19615:26:1;;;:15;:26;;;;;;;;:41;;;;;;;;;;19671:36;;19685:10;19671:36;;;;;;;;;;;-1:-1:-1;;19671:36:1;;;;;;;;;19722:43;;;;;;;;;;;;;;;19782:9;19492:306;-1:-1:-1;;19492:306:1:o;17976:583::-;18110:17;;;18102:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18203:19;;;18212:10;18203:19;;:68;;-1:-1:-1;18226:25:1;;;;;;;:18;:25;;;;;;;;18252:10;18226:37;;;;;;;;;;:45;;:37;:45;18203:68;18182:171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18364:36;18376:3;18381:5;18388:3;18393:6;18364:11;:36::i;:::-;18450:3;18416:51;;18443:5;18416:51;;18431:10;18416:51;;;18455:3;18460:6;18416:51;;;;;;;;;;;;;;;;;;;;;;;;18478:74;18509:10;18521:5;18528:3;18533;18538:6;18546:5;18478:30;:74::i;5069:452:3:-;5171:7;5190:18;5211:42;5236:9;5247:5;5211:24;:42::i;:::-;5263:34;;;;:22;:34;;;;;;;;5300:15;5263:52;;5325:21;:33;;;;;:46;;;5381:27;:39;;;;;;:52;;;5443:16;;:44;;;;;:16;:44;;;;;;;;;;;;;;;5190:63;;-1:-1:-1;5443:16:3;;;:21;;:44;;;;;5263:34;;5443:44;;;;;;5263:34;5443:16;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5504:10:3;;5069:452;-1:-1:-1;;;;;;5069:452:3:o;1754:187:14:-;1840:7;1875:12;1867:6;;;;1859:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1910:5:14;;;1754:187::o;4220:229:2:-;4345:37;;;;4308:7;4345:37;;;:26;:37;;;;;;4308:7;;4345:37;4399:21;:43;;4433:9;4399:43;;10405:416:3;10519:42;10537:3;10542:5;10549:3;10554:6;10519:17;:42::i;:::-;10576:8;;;;;:55;;-1:-1:-1;10588:16:3;;:29;;;;;;;;;;;;;;10621:10;;10588:43;:16;;:24;;:29;;;;;;;;;;;;;;:16;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10588:29:3;:43;;;10576:55;10572:243;;;10647:18;10683:27;10706:3;10683:22;:27::i;:::-;10679:126;;;10760:30;10779:3;10784:5;10760:18;:30::i;13494:779:4:-;13739:15;:2;:13;;;:15::i;:::-;13735:532;;;13791:2;13774:43;;;13818:8;13828:4;13834:3;13839:7;13848:4;13774:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13774:79:4;;;13770:487;;;;:::i;:::-;;;;;;;;14126:14;;;;;;;;;;;;;;;;;;;;14133:6;;14126:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13770:487;14180:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13770:487;13902:64;;;13914:52;13902:64;13898:161;;13990:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13898:161;13854:219;13494:779;;;;;;:::o;3454:250:5:-;3548:17;;;;:13;:17;;;;;;:28;;3570:5;3548:21;:28::i;:::-;3528:17;;;;:13;:17;;;;;;;;:48;;;;3606:9;:13;;;;;:17;;;;;;;;;;;;;;;;:25;;;3586:45;;3454:250::o;12746:742:4:-;12966:15;:2;:13;;;:15::i;:::-;12962:520;;;13018:2;13001:38;;;13040:8;13050:4;13056:2;13060:6;13068:4;13001:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13001:72:4;;;12997:475;;;;:::i;:::-;13122:59;;;13134:47;13122:59;13118:156;;13205:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8234:203:30;8294:6;8317;8308:16;;;;;;8330:14;8347:12;8354:1;8357;8347:5;:12::i;:::-;8330:29;-1:-1:-1;978:34:30;8374:29;;;;;8365:39;;;;;15908:248:1;16023:6;16041:19;16063:39;16080:9;16091:10;16063:16;:39::i;:::-;16041:61;-1:-1:-1;16119:30:1;:16;;;;16041:61;16119:16;:30::i;5958:455:30:-;6017:7;6036:6;6032:20;;-1:-1:-1;6051:1:30;6044:8;;6032:20;6073:1;6068;:6;;;;6059:16;;;;;;6096:11;;;;6115:34;6111:38;;6096:54;;6155:2;6095:62;;6196:3;6191:8;;;6176:24;6222:50;6216:56;;;6207:66;;;;;;6286:2;6279:9;6316:71;;6304:83;;;6295:93;;;;;;6401:7;;5958:455;-1:-1:-1;;;5958:455:30:o;9892:132:3:-;9961:4;9984:26;;;:21;:26;;;;;;:33;;9892:132::o;19936:307:1:-;20070:14;20068:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20095:27:1;;;:15;:27;;;;;;;;:39;;;;;;;;;;;;;20150:58;;;;;;;;;;;;;-1:-1:-1;;20068:16:1;;20095:39;;20167:10;;20150:58;;;;;;;;;;;;;;;;;-1:-1:-1;20150:58:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20219:17;;;19936:307;-1:-1:-1;;;19936:307:1:o;16162:232::-;16291:14;;;;:9;:14;;;;;;;;:21;;;;;;;;;;;:33;;16317:6;16291:25;:33::i;:::-;16267:14;;;;:9;:14;;;;;;;;:21;;;;;;;;;;;:57;;;;16367:19;;;;;;16356:31;;:6;;:10;:31::i;:::-;16334:14;;;;:9;:14;;;;;;;;:19;;;;;;;;;;;;;:53;-1:-1:-1;;16162:232:1:o;726:413:26:-;1086:20;1124:8;;;726:413::o;20447:1218:30:-;20507:7;20531:6;20522:16;;;;;;20545:14;20575:50;20570:1;:55;20566:1005;;20654:1;20648:2;20643:1;:7;;20642:13;;;;;;20633:22;;20566:1005;;;20688:3;20712:8;;;20738:11;20732:17;;20728:48;;20760:2;20764:9;;;;20753;20728:48;20793:7;20787:2;:13;20783:44;;20811:2;20815:9;;;;20804;20783:44;20844:5;20838:2;:11;20834:40;;20860:1;20863:8;;;;20853;20834:40;20891:4;20885:2;:10;20881:39;;20906:1;20909:8;;;;20899;20881:39;20937:3;20931:2;:9;20927:38;;20951:1;20954:8;;;;20944;20927:38;20982:3;20976:2;:9;20972:23;;20994:1;20987:8;;;;20972:23;21081:3;21075;:9;21070:1;21066;:5;:18;;21088:1;21065:24;21057:3;21051;:9;21046:1;:14;;21045:45;;;;;;21036:54;;21117:34;21107:6;:44;;21098:54;;;;;;21189:3;21184:8;;;21174:19;;21228:34;21224:38;;21214:49;;21290:3;21285:8;;;21319:2;21314:7;;;21334;;;21330:20;;;21349:1;21343:7;;;;21330:20;21422:3;21416:9;;;;21358:8;;21437:7;;;21433:20;;;21452:1;21446:7;;;;21433:20;21461:8;;;21535:3;21529:9;;;21523:15;;21515:24;;;;21563:1;21558:2;:6;;;;;;21548:16;;;;20566:1005;;;;;;;21596:34;21586:6;:44;;21577:54;;;;;5181:318:0;5324:30;;;5285:6;5324:30;;;:19;:30;;;;;;;;:42;;;;;;;;;5399:32;;;:21;:32;;;;;;5285:6;;5324:42;5448:44;5324:42;5399:32;5448:18;:44::i;4186:197:30:-;4243:6;4273:13;:9;;;:13;;;;;4290:2;4273:19;825:35;4307:19;;;;;:42;;-1:-1:-1;978:34:30;4330:19;;;4307:42;4298:52;;;;;14:88:31;89:3;85:15;;71:31::o;107:883::-;;188:4;170:16;167:26;164:2;;;196:5;;164:2;237:1;232:3;227;212:27;299:10;261:36;292:3;286:10;261:36;:::i;:::-;258:52;248:2;;314:5;;248:2;348;342:9;406:66;388:16;384:89;381:1;375:4;360:114;503:4;497:11;527:16;562:18;633:2;626:4;618:6;614:17;611:25;606:2;598:6;595:14;592:45;589:2;;;640:5;;;;;;589:2;677:6;671:4;667:17;656:28;;713:3;707:10;693:24;;740:2;732:6;729:14;726:2;;;746:5;;;;;;726:2;;807:16;801:4;797:27;790:4;781:6;776:3;772:16;768:27;765:60;762:2;;;828:5;;;;;762:2;884;872:15;889:66;868:88;859:98;;959:4;855:109;851:2;844:121;863:3;-1:-1:-1;;154:836:31;:::o",
  "source": "// SPDX-License-Identifier: LGPL-3.0-or-later\npragma solidity ^0.7.1;\nimport { ABDKMath64x64 } from \"abdk-libraries-solidity/ABDKMath64x64.sol\";\nimport \"./BaseRestorableSalary.sol\";\n\n/// Salary system with a \"DAO\" that can assign attorneys to restore lost Ethereum accounts.\n/// @author Victor Porton\n///\n/// TODO: Rename\ncontract SalaryWithDAO is BaseRestorableSalary {\n    using ABDKMath64x64 for int128;\n\n    /// Mapping (current address => account has at least one salary).\n    mapping (address => bool) public accountHasSalary;\n\n    // DAO share will be zero to prevent theft by voters and because it can be done instead by future voting.\n    // int128 public daoShare = int128(0).div(1); // zero by default\n\n    /// Constructor.\n    /// @param _salaryRecipients The salary recipients contract.\n    /// @param _salaryRestoreNFT The salary control contract.\n    /// @param _uri The ERC-1155 token URI.\n    constructor(NFTSalaryRecipient _salaryRecipients, NFTRestoreContract _salaryRestoreNFT, string memory _uri)\n        BaseRestorableSalary(_salaryRecipients, _salaryRestoreNFT, _uri)\n    { }\n\n    /// Create an oracle for caclcualting salary amounts.\n    function createOracle(address _oracleOwner) external returns (uint64) {\n        return _createOracle(_oracleOwner);\n    }\n\n    /// Register a salary recipient.\n    ///\n    /// Can be called both before or after the oracle finish. However registering after the finish is useless.\n    ///\n    /// Anyone can register anyone (useful for robots registering a person).\n    ///\n    /// Registering another person is giving him money against his will (forcing to hire bodyguards, etc.),\n    /// but if one does not want, he can just not associate this address with his identity in his publications.\n    /// @param _customer The original address.\n    /// @param _data The current data.\n    function registerCustomer(address _customer, bytes calldata _data)\n        virtual public returns (uint256)\n    {\n        address _orig = _originalAddress(_customer);\n        // Auditor: Check that this value is set to false, when (and if) necessary.\n        accountHasSalary[_customer] = true;\n        return super._registerCustomer(_orig, _data);\n    }\n}\n",
  "sourcePath": "/home/user/Projects/future-contracts/contracts/SalaryWithDAO.sol",
  "ast": {
    "absolutePath": "/home/user/Projects/future-contracts/contracts/SalaryWithDAO.sol",
    "exportedSymbols": {
      "ABDKMath64x64": [
        9755
      ],
      "Address": [
        5955
      ],
      "BaseBidOnAddresses": [
        292
      ],
      "BaseLock": [
        1494
      ],
      "BaseRestorableSalary": [
        1745
      ],
      "BaseSalary": [
        2186
      ],
      "Context": [
        3930
      ],
      "ERC165": [
        4096
      ],
      "ERC721": [
        5492
      ],
      "EnumerableMap": [
        6410
      ],
      "EnumerableSet": [
        6890
      ],
      "IERC165": [
        4108
      ],
      "IERC721": [
        5635
      ],
      "IERC721Enumerable": [
        5666
      ],
      "IERC721Metadata": [
        5693
      ],
      "IERC721Receiver": [
        5711
      ],
      "NFTRestoreContract": [
        3657
      ],
      "NFTSalaryRecipient": [
        3795
      ],
      "Ownable": [
        4039
      ],
      "SafeMath": [
        4304
      ],
      "Salary": [
        3832
      ],
      "SalaryWithDAO": [
        3907
      ],
      "Strings": [
        6977
      ]
    },
    "id": 3908,
    "license": "LGPL-3.0-or-later",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 3834,
        "literals": [
          "solidity",
          "^",
          "0.7",
          ".1"
        ],
        "nodeType": "PragmaDirective",
        "src": "46:23:9"
      },
      {
        "absolutePath": "abdk-libraries-solidity/ABDKMath64x64.sol",
        "file": "abdk-libraries-solidity/ABDKMath64x64.sol",
        "id": 3836,
        "nodeType": "ImportDirective",
        "scope": 3908,
        "sourceUnit": 9756,
        "src": "70:74:9",
        "symbolAliases": [
          {
            "foreign": {
              "id": 3835,
              "name": "ABDKMath64x64",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "src": "79:13:9",
              "typeDescriptions": {}
            }
          }
        ],
        "unitAlias": ""
      },
      {
        "absolutePath": "/home/user/Projects/future-contracts/contracts/BaseRestorableSalary.sol",
        "file": "./BaseRestorableSalary.sol",
        "id": 3837,
        "nodeType": "ImportDirective",
        "scope": 3908,
        "sourceUnit": 1746,
        "src": "145:36:9",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "baseName": {
              "id": 3839,
              "name": "BaseRestorableSalary",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1745,
              "src": "348:20:9",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_BaseRestorableSalary_$1745",
                "typeString": "contract BaseRestorableSalary"
              }
            },
            "id": 3840,
            "nodeType": "InheritanceSpecifier",
            "src": "348:20:9"
          }
        ],
        "contractDependencies": [
          292,
          1494,
          1745,
          2186,
          3207,
          3540,
          3930,
          4096,
          4108,
          4355,
          4383,
          4505,
          4520,
          4561,
          5519,
          5711
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 3838,
          "nodeType": "StructuredDocumentation",
          "src": "183:139:9",
          "text": "Salary system with a \"DAO\" that can assign attorneys to restore lost Ethereum accounts.\n @author Victor Porton\n TODO: Rename"
        },
        "fullyImplemented": true,
        "id": 3907,
        "linearizedBaseContracts": [
          3907,
          1745,
          2186,
          292,
          1494,
          5519,
          5711,
          4355,
          4383,
          4561,
          3540,
          3207,
          4520,
          4505,
          4096,
          4108,
          3930
        ],
        "name": "SalaryWithDAO",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 3843,
            "libraryName": {
              "id": 3841,
              "name": "ABDKMath64x64",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 9755,
              "src": "381:13:9",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_ABDKMath64x64_$9755",
                "typeString": "library ABDKMath64x64"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "375:31:9",
            "typeName": {
              "id": 3842,
              "name": "int128",
              "nodeType": "ElementaryTypeName",
              "src": "399:6:9",
              "typeDescriptions": {
                "typeIdentifier": "t_int128",
                "typeString": "int128"
              }
            }
          },
          {
            "constant": false,
            "documentation": {
              "id": 3844,
              "nodeType": "StructuredDocumentation",
              "src": "412:65:9",
              "text": "Mapping (current address => account has at least one salary)."
            },
            "functionSelector": "65f4fb14",
            "id": 3848,
            "mutability": "mutable",
            "name": "accountHasSalary",
            "nodeType": "VariableDeclaration",
            "scope": 3907,
            "src": "482:49:9",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
              "typeString": "mapping(address => bool)"
            },
            "typeName": {
              "id": 3847,
              "keyType": {
                "id": 3845,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "491:7:9",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "482:25:9",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                "typeString": "mapping(address => bool)"
              },
              "valueType": {
                "id": 3846,
                "name": "bool",
                "nodeType": "ElementaryTypeName",
                "src": "502:4:9",
                "typeDescriptions": {
                  "typeIdentifier": "t_bool",
                  "typeString": "bool"
                }
              }
            },
            "visibility": "public"
          },
          {
            "body": {
              "id": 3863,
              "nodeType": "Block",
              "src": "1095:3:9",
              "statements": []
            },
            "documentation": {
              "id": 3849,
              "nodeType": "StructuredDocumentation",
              "src": "718:187:9",
              "text": "Constructor.\n @param _salaryRecipients The salary recipients contract.\n @param _salaryRestoreNFT The salary control contract.\n @param _uri The ERC-1155 token URI."
            },
            "id": 3864,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [
              {
                "arguments": [
                  {
                    "id": 3858,
                    "name": "_salaryRecipients",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 3851,
                    "src": "1047:17:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_NFTSalaryRecipient_$3795",
                      "typeString": "contract NFTSalaryRecipient"
                    }
                  },
                  {
                    "id": 3859,
                    "name": "_salaryRestoreNFT",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 3853,
                    "src": "1066:17:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_NFTRestoreContract_$3657",
                      "typeString": "contract NFTRestoreContract"
                    }
                  },
                  {
                    "id": 3860,
                    "name": "_uri",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 3855,
                    "src": "1085:4:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_memory_ptr",
                      "typeString": "string memory"
                    }
                  }
                ],
                "id": 3861,
                "modifierName": {
                  "id": 3857,
                  "name": "BaseRestorableSalary",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1745,
                  "src": "1026:20:9",
                  "typeDescriptions": {
                    "typeIdentifier": "t_type$_t_contract$_BaseRestorableSalary_$1745_$",
                    "typeString": "type(contract BaseRestorableSalary)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1026:64:9"
              }
            ],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3856,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3851,
                  "mutability": "mutable",
                  "name": "_salaryRecipients",
                  "nodeType": "VariableDeclaration",
                  "scope": 3864,
                  "src": "922:36:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_NFTSalaryRecipient_$3795",
                    "typeString": "contract NFTSalaryRecipient"
                  },
                  "typeName": {
                    "id": 3850,
                    "name": "NFTSalaryRecipient",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3795,
                    "src": "922:18:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_NFTSalaryRecipient_$3795",
                      "typeString": "contract NFTSalaryRecipient"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3853,
                  "mutability": "mutable",
                  "name": "_salaryRestoreNFT",
                  "nodeType": "VariableDeclaration",
                  "scope": 3864,
                  "src": "960:36:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_NFTRestoreContract_$3657",
                    "typeString": "contract NFTRestoreContract"
                  },
                  "typeName": {
                    "id": 3852,
                    "name": "NFTRestoreContract",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3657,
                    "src": "960:18:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_NFTRestoreContract_$3657",
                      "typeString": "contract NFTRestoreContract"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3855,
                  "mutability": "mutable",
                  "name": "_uri",
                  "nodeType": "VariableDeclaration",
                  "scope": 3864,
                  "src": "998:18:9",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 3854,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "998:6:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "921:96:9"
            },
            "returnParameters": {
              "id": 3862,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1095:0:9"
            },
            "scope": 3907,
            "src": "910:188:9",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 3876,
              "nodeType": "Block",
              "src": "1232:51:9",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 3873,
                        "name": "_oracleOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3867,
                        "src": "1263:12:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 3872,
                      "name": "_createOracle",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1313,
                      "src": "1249:13:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$_t_uint64_$",
                        "typeString": "function (address) returns (uint64)"
                      }
                    },
                    "id": 3874,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1249:27:9",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "functionReturnParameters": 3871,
                  "id": 3875,
                  "nodeType": "Return",
                  "src": "1242:34:9"
                }
              ]
            },
            "documentation": {
              "id": 3865,
              "nodeType": "StructuredDocumentation",
              "src": "1104:53:9",
              "text": "Create an oracle for caclcualting salary amounts."
            },
            "functionSelector": "dc57e0cc",
            "id": 3877,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "createOracle",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3868,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3867,
                  "mutability": "mutable",
                  "name": "_oracleOwner",
                  "nodeType": "VariableDeclaration",
                  "scope": 3877,
                  "src": "1184:20:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3866,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1184:7:9",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1183:22:9"
            },
            "returnParameters": {
              "id": 3871,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3870,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3877,
                  "src": "1224:6:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint64",
                    "typeString": "uint64"
                  },
                  "typeName": {
                    "id": 3869,
                    "name": "uint64",
                    "nodeType": "ElementaryTypeName",
                    "src": "1224:6:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1223:8:9"
            },
            "scope": 3907,
            "src": "1162:121:9",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 3905,
              "nodeType": "Block",
              "src": "1956:242:9",
              "statements": [
                {
                  "assignments": [
                    3888
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 3888,
                      "mutability": "mutable",
                      "name": "_orig",
                      "nodeType": "VariableDeclaration",
                      "scope": 3905,
                      "src": "1966:13:9",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 3887,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "1966:7:9",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 3892,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 3890,
                        "name": "_customer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3880,
                        "src": "1999:9:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 3889,
                      "name": "_originalAddress",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1707,
                      "src": "1982:16:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_address_$",
                        "typeString": "function (address) view returns (address)"
                      }
                    },
                    "id": 3891,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1982:27:9",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1966:43:9"
                },
                {
                  "expression": {
                    "id": 3897,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 3893,
                        "name": "accountHasSalary",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3848,
                        "src": "2103:16:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 3895,
                      "indexExpression": {
                        "id": 3894,
                        "name": "_customer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3880,
                        "src": "2120:9:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "2103:27:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "hexValue": "74727565",
                      "id": 3896,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2133:4:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "true"
                    },
                    "src": "2103:34:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 3898,
                  "nodeType": "ExpressionStatement",
                  "src": "2103:34:9"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 3901,
                        "name": "_orig",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3888,
                        "src": "2178:5:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 3902,
                        "name": "_data",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3882,
                        "src": "2185:5:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      ],
                      "expression": {
                        "id": 3899,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4294967271,
                        "src": "2154:5:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_super$_SalaryWithDAO_$3907",
                          "typeString": "contract super SalaryWithDAO"
                        }
                      },
                      "id": 3900,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "_registerCustomer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 2143,
                      "src": "2154:23:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_calldata_ptr_$returns$_t_uint256_$",
                        "typeString": "function (address,bytes calldata) returns (uint256)"
                      }
                    },
                    "id": 3903,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2154:37:9",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 3886,
                  "id": 3904,
                  "nodeType": "Return",
                  "src": "2147:44:9"
                }
              ]
            },
            "documentation": {
              "id": 3878,
              "nodeType": "StructuredDocumentation",
              "src": "1289:550:9",
              "text": "Register a salary recipient.\n Can be called both before or after the oracle finish. However registering after the finish is useless.\n Anyone can register anyone (useful for robots registering a person).\n Registering another person is giving him money against his will (forcing to hire bodyguards, etc.),\n but if one does not want, he can just not associate this address with his identity in his publications.\n @param _customer The original address.\n @param _data The current data."
            },
            "functionSelector": "01683b4d",
            "id": 3906,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "registerCustomer",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3883,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3880,
                  "mutability": "mutable",
                  "name": "_customer",
                  "nodeType": "VariableDeclaration",
                  "scope": 3906,
                  "src": "1870:17:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3879,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1870:7:9",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3882,
                  "mutability": "mutable",
                  "name": "_data",
                  "nodeType": "VariableDeclaration",
                  "scope": 3906,
                  "src": "1889:20:9",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 3881,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "1889:5:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1869:41:9"
            },
            "returnParameters": {
              "id": 3886,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3885,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3906,
                  "src": "1943:7:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3884,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1943:7:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1942:9:9"
            },
            "scope": 3907,
            "src": "1844:354:9",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "public"
          }
        ],
        "scope": 3908,
        "src": "322:1878:9"
      }
    ],
    "src": "46:2155:9"
  },
  "legacyAST": {
    "attributes": {
      "absolutePath": "/home/user/Projects/future-contracts/contracts/SalaryWithDAO.sol",
      "exportedSymbols": {
        "ABDKMath64x64": [
          9755
        ],
        "Address": [
          5955
        ],
        "BaseBidOnAddresses": [
          292
        ],
        "BaseLock": [
          1494
        ],
        "BaseRestorableSalary": [
          1745
        ],
        "BaseSalary": [
          2186
        ],
        "Context": [
          3930
        ],
        "ERC165": [
          4096
        ],
        "ERC721": [
          5492
        ],
        "EnumerableMap": [
          6410
        ],
        "EnumerableSet": [
          6890
        ],
        "IERC165": [
          4108
        ],
        "IERC721": [
          5635
        ],
        "IERC721Enumerable": [
          5666
        ],
        "IERC721Metadata": [
          5693
        ],
        "IERC721Receiver": [
          5711
        ],
        "NFTRestoreContract": [
          3657
        ],
        "NFTSalaryRecipient": [
          3795
        ],
        "Ownable": [
          4039
        ],
        "SafeMath": [
          4304
        ],
        "Salary": [
          3832
        ],
        "SalaryWithDAO": [
          3907
        ],
        "Strings": [
          6977
        ]
      },
      "license": "LGPL-3.0-or-later"
    },
    "children": [
      {
        "attributes": {
          "literals": [
            "solidity",
            "^",
            "0.7",
            ".1"
          ]
        },
        "id": 3834,
        "name": "PragmaDirective",
        "src": "46:23:9"
      },
      {
        "attributes": {
          "SourceUnit": 9756,
          "absolutePath": "abdk-libraries-solidity/ABDKMath64x64.sol",
          "file": "abdk-libraries-solidity/ABDKMath64x64.sol",
          "scope": 3908,
          "symbolAliases": [
            {
              "foreign": {
                "attributes": {
                  "overloadedDeclarations": [
                    null
                  ],
                  "value": "ABDKMath64x64"
                },
                "id": 3835,
                "name": "Identifier",
                "src": "79:13:9"
              }
            }
          ],
          "unitAlias": ""
        },
        "id": 3836,
        "name": "ImportDirective",
        "src": "70:74:9"
      },
      {
        "attributes": {
          "SourceUnit": 1746,
          "absolutePath": "/home/user/Projects/future-contracts/contracts/BaseRestorableSalary.sol",
          "file": "./BaseRestorableSalary.sol",
          "scope": 3908,
          "symbolAliases": [
            null
          ],
          "unitAlias": ""
        },
        "id": 3837,
        "name": "ImportDirective",
        "src": "145:36:9"
      },
      {
        "attributes": {
          "abstract": false,
          "contractDependencies": [
            292,
            1494,
            1745,
            2186,
            3207,
            3540,
            3930,
            4096,
            4108,
            4355,
            4383,
            4505,
            4520,
            4561,
            5519,
            5711
          ],
          "contractKind": "contract",
          "fullyImplemented": true,
          "linearizedBaseContracts": [
            3907,
            1745,
            2186,
            292,
            1494,
            5519,
            5711,
            4355,
            4383,
            4561,
            3540,
            3207,
            4520,
            4505,
            4096,
            4108,
            3930
          ],
          "name": "SalaryWithDAO",
          "scope": 3908
        },
        "children": [
          {
            "attributes": {
              "text": "Salary system with a \"DAO\" that can assign attorneys to restore lost Ethereum accounts.\n @author Victor Porton\n TODO: Rename"
            },
            "id": 3838,
            "name": "StructuredDocumentation",
            "src": "183:139:9"
          },
          {
            "attributes": {},
            "children": [
              {
                "attributes": {
                  "name": "BaseRestorableSalary",
                  "referencedDeclaration": 1745,
                  "type": "contract BaseRestorableSalary"
                },
                "id": 3839,
                "name": "UserDefinedTypeName",
                "src": "348:20:9"
              }
            ],
            "id": 3840,
            "name": "InheritanceSpecifier",
            "src": "348:20:9"
          },
          {
            "children": [
              {
                "attributes": {
                  "name": "ABDKMath64x64",
                  "referencedDeclaration": 9755,
                  "type": "library ABDKMath64x64"
                },
                "id": 3841,
                "name": "UserDefinedTypeName",
                "src": "381:13:9"
              },
              {
                "attributes": {
                  "name": "int128",
                  "type": "int128"
                },
                "id": 3842,
                "name": "ElementaryTypeName",
                "src": "399:6:9"
              }
            ],
            "id": 3843,
            "name": "UsingForDirective",
            "src": "375:31:9"
          },
          {
            "attributes": {
              "constant": false,
              "functionSelector": "65f4fb14",
              "mutability": "mutable",
              "name": "accountHasSalary",
              "scope": 3907,
              "stateVariable": true,
              "storageLocation": "default",
              "type": "mapping(address => bool)",
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "type": "mapping(address => bool)"
                },
                "children": [
                  {
                    "attributes": {
                      "name": "address",
                      "type": "address"
                    },
                    "id": 3845,
                    "name": "ElementaryTypeName",
                    "src": "491:7:9"
                  },
                  {
                    "attributes": {
                      "name": "bool",
                      "type": "bool"
                    },
                    "id": 3846,
                    "name": "ElementaryTypeName",
                    "src": "502:4:9"
                  }
                ],
                "id": 3847,
                "name": "Mapping",
                "src": "482:25:9"
              },
              {
                "attributes": {
                  "text": "Mapping (current address => account has at least one salary)."
                },
                "id": 3844,
                "name": "StructuredDocumentation",
                "src": "412:65:9"
              }
            ],
            "id": 3848,
            "name": "VariableDeclaration",
            "src": "482:49:9"
          },
          {
            "attributes": {
              "implemented": true,
              "isConstructor": true,
              "kind": "constructor",
              "name": "",
              "scope": 3907,
              "stateMutability": "nonpayable",
              "virtual": false,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "text": "Constructor.\n @param _salaryRecipients The salary recipients contract.\n @param _salaryRestoreNFT The salary control contract.\n @param _uri The ERC-1155 token URI."
                },
                "id": 3849,
                "name": "StructuredDocumentation",
                "src": "718:187:9"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "_salaryRecipients",
                      "scope": 3864,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "contract NFTSalaryRecipient",
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "NFTSalaryRecipient",
                          "referencedDeclaration": 3795,
                          "type": "contract NFTSalaryRecipient"
                        },
                        "id": 3850,
                        "name": "UserDefinedTypeName",
                        "src": "922:18:9"
                      }
                    ],
                    "id": 3851,
                    "name": "VariableDeclaration",
                    "src": "922:36:9"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "_salaryRestoreNFT",
                      "scope": 3864,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "contract NFTRestoreContract",
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "NFTRestoreContract",
                          "referencedDeclaration": 3657,
                          "type": "contract NFTRestoreContract"
                        },
                        "id": 3852,
                        "name": "UserDefinedTypeName",
                        "src": "960:18:9"
                      }
                    ],
                    "id": 3853,
                    "name": "VariableDeclaration",
                    "src": "960:36:9"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "_uri",
                      "scope": 3864,
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "type": "string",
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "string",
                          "type": "string"
                        },
                        "id": 3854,
                        "name": "ElementaryTypeName",
                        "src": "998:6:9"
                      }
                    ],
                    "id": 3855,
                    "name": "VariableDeclaration",
                    "src": "998:18:9"
                  }
                ],
                "id": 3856,
                "name": "ParameterList",
                "src": "921:96:9"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 3862,
                "name": "ParameterList",
                "src": "1095:0:9"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 1745,
                      "type": "type(contract BaseRestorableSalary)",
                      "value": "BaseRestorableSalary"
                    },
                    "id": 3857,
                    "name": "Identifier",
                    "src": "1026:20:9"
                  },
                  {
                    "attributes": {
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 3851,
                      "type": "contract NFTSalaryRecipient",
                      "value": "_salaryRecipients"
                    },
                    "id": 3858,
                    "name": "Identifier",
                    "src": "1047:17:9"
                  },
                  {
                    "attributes": {
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 3853,
                      "type": "contract NFTRestoreContract",
                      "value": "_salaryRestoreNFT"
                    },
                    "id": 3859,
                    "name": "Identifier",
                    "src": "1066:17:9"
                  },
                  {
                    "attributes": {
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 3855,
                      "type": "string memory",
                      "value": "_uri"
                    },
                    "id": 3860,
                    "name": "Identifier",
                    "src": "1085:4:9"
                  }
                ],
                "id": 3861,
                "name": "ModifierInvocation",
                "src": "1026:64:9"
              },
              {
                "attributes": {
                  "statements": [
                    null
                  ]
                },
                "children": [],
                "id": 3863,
                "name": "Block",
                "src": "1095:3:9"
              }
            ],
            "id": 3864,
            "name": "FunctionDefinition",
            "src": "910:188:9"
          },
          {
            "attributes": {
              "functionSelector": "dc57e0cc",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "createOracle",
              "scope": 3907,
              "stateMutability": "nonpayable",
              "virtual": false,
              "visibility": "external"
            },
            "children": [
              {
                "attributes": {
                  "text": "Create an oracle for caclcualting salary amounts."
                },
                "id": 3865,
                "name": "StructuredDocumentation",
                "src": "1104:53:9"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "_oracleOwner",
                      "scope": 3877,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 3866,
                        "name": "ElementaryTypeName",
                        "src": "1184:7:9"
                      }
                    ],
                    "id": 3867,
                    "name": "VariableDeclaration",
                    "src": "1184:20:9"
                  }
                ],
                "id": 3868,
                "name": "ParameterList",
                "src": "1183:22:9"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "",
                      "scope": 3877,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint64",
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint64",
                          "type": "uint64"
                        },
                        "id": 3869,
                        "name": "ElementaryTypeName",
                        "src": "1224:6:9"
                      }
                    ],
                    "id": 3870,
                    "name": "VariableDeclaration",
                    "src": "1224:6:9"
                  }
                ],
                "id": 3871,
                "name": "ParameterList",
                "src": "1223:8:9"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "functionReturnParameters": 3871
                    },
                    "children": [
                      {
                        "attributes": {
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "tryCall": false,
                          "type": "uint64",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1313,
                              "type": "function (address) returns (uint64)",
                              "value": "_createOracle"
                            },
                            "id": 3872,
                            "name": "Identifier",
                            "src": "1249:13:9"
                          },
                          {
                            "attributes": {
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 3867,
                              "type": "address",
                              "value": "_oracleOwner"
                            },
                            "id": 3873,
                            "name": "Identifier",
                            "src": "1263:12:9"
                          }
                        ],
                        "id": 3874,
                        "name": "FunctionCall",
                        "src": "1249:27:9"
                      }
                    ],
                    "id": 3875,
                    "name": "Return",
                    "src": "1242:34:9"
                  }
                ],
                "id": 3876,
                "name": "Block",
                "src": "1232:51:9"
              }
            ],
            "id": 3877,
            "name": "FunctionDefinition",
            "src": "1162:121:9"
          },
          {
            "attributes": {
              "functionSelector": "01683b4d",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "registerCustomer",
              "scope": 3907,
              "stateMutability": "nonpayable",
              "virtual": true,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "text": "Register a salary recipient.\n Can be called both before or after the oracle finish. However registering after the finish is useless.\n Anyone can register anyone (useful for robots registering a person).\n Registering another person is giving him money against his will (forcing to hire bodyguards, etc.),\n but if one does not want, he can just not associate this address with his identity in his publications.\n @param _customer The original address.\n @param _data The current data."
                },
                "id": 3878,
                "name": "StructuredDocumentation",
                "src": "1289:550:9"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "_customer",
                      "scope": 3906,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 3879,
                        "name": "ElementaryTypeName",
                        "src": "1870:7:9"
                      }
                    ],
                    "id": 3880,
                    "name": "VariableDeclaration",
                    "src": "1870:17:9"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "_data",
                      "scope": 3906,
                      "stateVariable": false,
                      "storageLocation": "calldata",
                      "type": "bytes",
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes",
                          "type": "bytes"
                        },
                        "id": 3881,
                        "name": "ElementaryTypeName",
                        "src": "1889:5:9"
                      }
                    ],
                    "id": 3882,
                    "name": "VariableDeclaration",
                    "src": "1889:20:9"
                  }
                ],
                "id": 3883,
                "name": "ParameterList",
                "src": "1869:41:9"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "",
                      "scope": 3906,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 3884,
                        "name": "ElementaryTypeName",
                        "src": "1943:7:9"
                      }
                    ],
                    "id": 3885,
                    "name": "VariableDeclaration",
                    "src": "1943:7:9"
                  }
                ],
                "id": 3886,
                "name": "ParameterList",
                "src": "1942:9:9"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "assignments": [
                        3888
                      ]
                    },
                    "children": [
                      {
                        "attributes": {
                          "constant": false,
                          "mutability": "mutable",
                          "name": "_orig",
                          "scope": 3905,
                          "stateVariable": false,
                          "storageLocation": "default",
                          "type": "address",
                          "visibility": "internal"
                        },
                        "children": [
                          {
                            "attributes": {
                              "name": "address",
                              "stateMutability": "nonpayable",
                              "type": "address"
                            },
                            "id": 3887,
                            "name": "ElementaryTypeName",
                            "src": "1966:7:9"
                          }
                        ],
                        "id": 3888,
                        "name": "VariableDeclaration",
                        "src": "1966:13:9"
                      },
                      {
                        "attributes": {
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "tryCall": false,
                          "type": "address",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 1707,
                              "type": "function (address) view returns (address)",
                              "value": "_originalAddress"
                            },
                            "id": 3889,
                            "name": "Identifier",
                            "src": "1982:16:9"
                          },
                          {
                            "attributes": {
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 3880,
                              "type": "address",
                              "value": "_customer"
                            },
                            "id": 3890,
                            "name": "Identifier",
                            "src": "1999:9:9"
                          }
                        ],
                        "id": 3891,
                        "name": "FunctionCall",
                        "src": "1982:27:9"
                      }
                    ],
                    "id": 3892,
                    "name": "VariableDeclarationStatement",
                    "src": "1966:43:9"
                  },
                  {
                    "children": [
                      {
                        "attributes": {
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "operator": "=",
                          "type": "bool"
                        },
                        "children": [
                          {
                            "attributes": {
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": true,
                              "type": "bool"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 3848,
                                  "type": "mapping(address => bool)",
                                  "value": "accountHasSalary"
                                },
                                "id": 3893,
                                "name": "Identifier",
                                "src": "2103:16:9"
                              },
                              {
                                "attributes": {
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 3880,
                                  "type": "address",
                                  "value": "_customer"
                                },
                                "id": 3894,
                                "name": "Identifier",
                                "src": "2120:9:9"
                              }
                            ],
                            "id": 3895,
                            "name": "IndexAccess",
                            "src": "2103:27:9"
                          },
                          {
                            "attributes": {
                              "hexvalue": "74727565",
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "token": "bool",
                              "type": "bool",
                              "value": "true"
                            },
                            "id": 3896,
                            "name": "Literal",
                            "src": "2133:4:9"
                          }
                        ],
                        "id": 3897,
                        "name": "Assignment",
                        "src": "2103:34:9"
                      }
                    ],
                    "id": 3898,
                    "name": "ExpressionStatement",
                    "src": "2103:34:9"
                  },
                  {
                    "attributes": {
                      "functionReturnParameters": 3886
                    },
                    "children": [
                      {
                        "attributes": {
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "tryCall": false,
                          "type": "uint256",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                {
                                  "typeIdentifier": "t_bytes_calldata_ptr",
                                  "typeString": "bytes calldata"
                                }
                              ],
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "member_name": "_registerCustomer",
                              "referencedDeclaration": 2143,
                              "type": "function (address,bytes calldata) returns (uint256)"
                            },
                            "children": [
                              {
                                "attributes": {
                                  "overloadedDeclarations": [
                                    null
                                  ],
                                  "referencedDeclaration": 4294967271,
                                  "type": "contract super SalaryWithDAO",
                                  "value": "super"
                                },
                                "id": 3899,
                                "name": "Identifier",
                                "src": "2154:5:9"
                              }
                            ],
                            "id": 3900,
                            "name": "MemberAccess",
                            "src": "2154:23:9"
                          },
                          {
                            "attributes": {
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 3888,
                              "type": "address",
                              "value": "_orig"
                            },
                            "id": 3901,
                            "name": "Identifier",
                            "src": "2178:5:9"
                          },
                          {
                            "attributes": {
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 3882,
                              "type": "bytes calldata",
                              "value": "_data"
                            },
                            "id": 3902,
                            "name": "Identifier",
                            "src": "2185:5:9"
                          }
                        ],
                        "id": 3903,
                        "name": "FunctionCall",
                        "src": "2154:37:9"
                      }
                    ],
                    "id": 3904,
                    "name": "Return",
                    "src": "2147:44:9"
                  }
                ],
                "id": 3905,
                "name": "Block",
                "src": "1956:242:9"
              }
            ],
            "id": 3906,
            "name": "FunctionDefinition",
            "src": "1844:354:9"
          }
        ],
        "id": 3907,
        "name": "ContractDefinition",
        "src": "322:1878:9"
      }
    ],
    "id": 3908,
    "name": "SourceUnit",
    "src": "46:2155:9"
  },
  "compiler": {
    "name": "solc",
    "version": "0.7.6+commit.7338295f.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.4.1",
  "updatedAt": "2021-06-14T03:28:02.019Z",
  "devdoc": {
    "author": "Victor Porton TODO: Rename",
    "kind": "dev",
    "methods": {
      "balanceOf(address,uint256)": {
        "details": "See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address."
      },
      "balanceOfBatch(address[],uint256[])": {
        "details": "See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length."
      },
      "changeOracleOwner(address,uint64)": {
        "params": {
          "_newOracleOwner": "New owner.",
          "_oracleId": "The oracle whose owner to change."
        }
      },
      "collateralOwing(address,uint256,uint64,uint256,address)": {
        "params": {
          "_collateralContractAddress": "The ERC-1155 collateral token contract.",
          "_collateralTokenId": "The ERC-1155 collateral token ID.",
          "_condition": "The condition (the original receiver of a conditional token).",
          "_oracleId": "From which oracle's \"account\" to withdraw.",
          "_user": "The user to which we may owe."
        }
      },
      "constructor": {
        "params": {
          "_salaryRecipients": "The salary recipients contract.",
          "_salaryRestoreNFT": "The salary control contract.",
          "_uri": "The ERC-1155 token URI."
        }
      },
      "donate(address,uint256,uint64,uint256,address,address,bytes)": {
        "params": {
          "_amount": "The amount to donate.",
          "_collateralContractAddress": "The collateral ERC-1155 contract address.",
          "_collateralTokenId": "The collateral ERC-1155 token ID.",
          "_data": "Additional transaction data.",
          "_from": "From whom to take the donation.",
          "_oracleId": "The oracle ID to whose ecosystem to donate to.",
          "_to": "On whose account the donation amount is assigned."
        }
      },
      "finishOracle(uint64)": {
        "params": {
          "_oracleId": "The oracle ID. You should set grace period end time before calling this method."
        }
      },
      "gatherDeFiProfit(address,uint256,uint64,bytes)": {
        "params": {
          "_collateralContractAddress": "The collateral ERC-1155 contract address.",
          "_collateralTokenId": "The collateral ERC-1155 token ID.",
          "_data": "Additional transaction data.",
          "_oracleId": "The oracle ID to whose ecosystem to donate to."
        }
      },
      "gracePeriodEnd(uint64)": {
        "params": {
          "_oracleId": "For which oracle."
        }
      },
      "isApprovedForAll(address,address)": {
        "details": "See {IERC1155-isApprovedForAll}."
      },
      "isConditionalLocked(address,uint256)": {
        "params": {
          "_condition": "The condition (the original receiver of a conditional token).",
          "_user": "Querying if locked for this user."
        }
      },
      "isOracleFinished(uint64)": {
        "params": {
          "_oracleId": "The oracle ID."
        },
        "returns": {
          "_0": "`true` if it has finished."
        }
      },
      "mintSalary(uint256,bytes)": {
        "params": {
          "_condition": "The condition ID.",
          "_data": "Additional data. This method can be called only by the salary receiver."
        }
      },
      "onERC721Received(address,address,uint256,bytes)": {
        "details": "See {IERC721Receiver-onERC721Received}. Always returns `IERC721Receiver.onERC721Received.selector`."
      },
      "oracleOwner(uint64)": {
        "params": {
          "_oracleId": "The oracle ID."
        }
      },
      "payoutDenominator(uint64)": {
        "params": {
          "_oracleId": "The oracle ID. The result can't change if the oracle has finished."
        }
      },
      "payoutNumerator(uint64,uint256)": {
        "params": {
          "_condition": "The condition (the original receiver of a conditional token). The result can't change if the oracle has finished.",
          "_oracleId": "The oracle ID."
        }
      },
      "registerCustomer(address,bytes)": {
        "params": {
          "_customer": "The original address.",
          "_data": "The current data."
        }
      },
      "reportNumerator(uint64,uint256,uint256)": {
        "params": {
          "_condition": "The condition.",
          "_numerator": "The relative score of the condition. Note: We could make oracles easily verificable by a hash of all the data, but       - It may need allowing to set a numerator only once.       - It may be not necessary because future technology will allow to aggregate blockchains.",
          "_oracleId": "The oracle ID."
        }
      },
      "reportNumeratorsBatch(uint64,uint64[],uint256[])": {
        "params": {
          "_conditions": "The conditions.",
          "_numerators": "The relative scores of the condition.",
          "_oracleId": "The oracle ID."
        }
      },
      "restoreFunds(address,address,uint256)": {
        "params": {
          "_newAccount": "New account.",
          "_oldAccount": "Old account.",
          "_token": "The ERC-1155 token ID. This function can be called by the affected user. Remark: We don't need to create new tokens like as on a regular transfer, because it isn't a transfer to a trader."
        }
      },
      "restoreFundsBatch(address,address,uint256[])": {
        "params": {
          "_newAccount": "New account.",
          "_oldAccount": "Old account.",
          "_tokens": "The ERC-1155 token IDs. This function can be called by the affected user. Remark: We don't need to create new tokens like as on a regular transfer, because it isn't a transfer to a trader."
        }
      },
      "setApprovalForAll(address,bool)": {
        "details": "See {IERC1155-setApprovalForAll}."
      },
      "supportsInterface(bytes4)": {
        "details": "See {IERC165-supportsInterface}. Time complexity O(1), guaranteed to always use less than 30 000 gas."
      },
      "totalSupply(uint256)": {
        "params": {
          "id": "Token ID."
        },
        "returns": {
          "_0": "Total supply."
        }
      },
      "uri(uint256)": {
        "details": "See {IERC1155MetadataURI-uri}. This implementation returns the same URI for *all* token types. It relies on the token type ID substitution mechanism https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. Clients calling this function must replace the `\\{id\\}` substring with the actual token type ID."
      },
      "withdrawCollateral(address,uint256,uint64,uint256,bytes)": {
        "params": {
          "_collateralContractAddress": "The ERC-1155 collateral token contract.",
          "_collateralTokenId": "The ERC-1155 collateral token ID.",
          "_condition": "The condition.",
          "_data": "Additional data. Notes: - It is made impossible to withdraw somebody's other collateral, as otherwise we can't mark non-active   accounts in grace period. - We can't transfer to somebody other than `msg.sender` because anybody can transfer   (needed for multi-level transfers). - After this function is called, it becomes impossible to transfer the corresponding conditional token   of `msg.sender` (to prevent its repeated withdrawal).",
          "_oracleId": "From which oracle's \"account\" to withdraw."
        }
      }
    },
    "version": 1
  },
  "userdoc": {
    "events": {
      "CollateralWithdrawn(address,uint256,uint64,address,uint256)": {
        "notice": "Emitted when collateral is withdrawn."
      },
      "ConditionCreated(address,address,uint256,bytes)": {
        "notice": "Emitted when an oracle owner is set."
      },
      "ConditionReCreate(address,uint256,uint256)": {
        "notice": "Salary token recreated (salary recalculation request)."
      },
      "DonateCollateral(address,uint256,address,uint256,address,bytes)": {
        "notice": "Emitted when a collateral is donated."
      },
      "OracleCreated(address,uint64)": {
        "notice": "Emitted when an oracle is created."
      },
      "OracleFinished(uint64)": {
        "notice": "Emitted when an oracle is marked as having finished its work."
      },
      "OracleOwnerChanged(address,uint64)": {
        "notice": "Emitted when an oracle owner is set."
      },
      "ReportedNumerator(uint64,uint256,uint256)": {
        "notice": "A condition score was stored in the chain by an oracle."
      },
      "ReportedNumeratorsBatch(uint64,uint64[],uint256[])": {
        "notice": "Some condition scores were stored in the chain by an oracle."
      },
      "SalaryMinted(address,uint256,uint256,bytes)": {
        "notice": "Salary tokens minted."
      }
    },
    "kind": "user",
    "methods": {
      "accountHasSalary(address)": {
        "notice": "Mapping (current address => account has at least one salary)."
      },
      "changeOracleOwner(address,uint64)": {
        "notice": "Modify the owner of an oracle."
      },
      "collateralOwing(address,uint256,uint64,uint256,address)": {
        "notice": "Calculate how much collateral is owed to a user."
      },
      "constructor": {
        "notice": "Constructor."
      },
      "createOracle(address)": {
        "notice": "Create an oracle for caclcualting salary amounts."
      },
      "donate(address,uint256,uint64,uint256,address,address,bytes)": {
        "notice": "Donate funds in an ERC-1155 token. First, the collateral token need to be approved to be spent by this contract from the address `_from`. It also mints a token (with a different ID), that counts donations in that token."
      },
      "finishOracle(uint64)": {
        "notice": "Need to be called after all numerators were reported."
      },
      "firstConditionInChain(uint256)": {
        "notice": "Mapping (condition ID => first condition ID in the chain) I call _chain_ of conditions the list of conditions resulting from creating and recreating conditions."
      },
      "firstToLastConditionInChain(uint256)": {
        "notice": "Mapping (first condition ID in the chain => last condition ID in the chain) I call _chain_ of conditions the list of conditions resulting from creating and recreating conditions."
      },
      "gatherDeFiProfit(address,uint256,uint64,bytes)": {
        "notice": "Gather a DeFi profit of a token previous donated to this contact."
      },
      "gracePeriodEnd(uint64)": {
        "notice": "Retrieve the end of the grace period."
      },
      "isConditionalLocked(address,uint256)": {
        "notice": "Are transfers of a conditinal token locked? This is used to prevent its repeated withdrawal."
      },
      "isOracleFinished(uint64)": {
        "notice": "Check if an oracle has finished."
      },
      "mintSalary(uint256,bytes)": {
        "notice": "Mint a salary token."
      },
      "oracleOwner(uint64)": {
        "notice": "Get the oracle owner."
      },
      "originalAddresses(address)": {
        "notice": "Mapping (current address => very first address an account had)."
      },
      "originalToCurrentAddresses(address)": {
        "notice": "Mapping (very first address an account had => current address)."
      },
      "payoutDenominator(uint64)": {
        "notice": "Retrieve the last stored payout denominator (the sum of all numerators of the oracle)."
      },
      "payoutNumerator(uint64,uint256)": {
        "notice": "Retrieve the last stored payout numerator (relative score of a condition)."
      },
      "recreateCondition(uint256,bytes)": {
        "notice": "Make a new condition that replaces the old one. In other words, it is a request to recalculate somebody's salary. Anyone can request to recalculate anyone's salary. It's also useful to punish someone for decreasing his work performance or an evil act. This is to be called among other when a person dies. Recalculation is also forced when a salary receiver transfers away his current salary token. It is useful to remove a trader's incentive to kill the issuer to reduce the circulating supply. Issue to solve later: Should we recommend: - calling this function on each new project milestone? - calling this function regularly (e.g. every week)? This function also withdraws the old token."
      },
      "registerCustomer(address,bytes)": {
        "notice": "Register a salary recipient. Can be called both before or after the oracle finish. However registering after the finish is useless. Anyone can register anyone (useful for robots registering a person). Registering another person is giving him money against his will (forcing to hire bodyguards, etc.), but if one does not want, he can just not associate this address with his identity in his publications."
      },
      "reportNumerator(uint64,uint256,uint256)": {
        "notice": "Called by the oracle owner for reporting results of conditions."
      },
      "reportNumeratorsBatch(uint64,uint64[],uint256[])": {
        "notice": "Called by the oracle owner for reporting results of several conditions."
      },
      "restoreFunds(address,address,uint256)": {
        "notice": "Move the entire balance of a token from an old account to a new account of the same user."
      },
      "restoreFundsBatch(address,address,uint256[])": {
        "notice": "Move the entire balance of tokens from an old account to a new account of the same user."
      },
      "safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)": {
        "notice": "An ERC-1155 function. We disallow transfers of conditional tokens after redeem `_to` prevent \"gathering\" them before redeeming each oracle."
      },
      "safeTransferFrom(address,address,uint256,uint256,bytes)": {
        "notice": "An ERC-1155 function. We disallow transfers of conditional tokens after redeem `_to` prevent \"gathering\" them before redeeming each oracle."
      },
      "totalSupply(uint256)": {
        "notice": "Total supply of a token (conforms to `IERC1155Views`)."
      },
      "updateGracePeriodEnds(uint64,uint256)": {
        "notice": "Set the end time of the grace period. The first withdrawal can be done *only* during the grace period. The second withdrawal can be done after the end of the grace period and only if the first withdrawal was done. The intention of the grace period is to check which of users are active (\"alive\")."
      },
      "usersWithdrewInFirstRound(uint64)": {
        "notice": "Mapping (oracleId => amount user withdrew in first round) (see `docs/Calculations.md`)."
      },
      "withdrawCollateral(address,uint256,uint64,uint256,bytes)": {
        "notice": "Transfer to `msg.sender` the collateral ERC-1155 token. The amount transferred is proportional to the score of `_condition` by the oracle."
      }
    },
    "notice": "Salary system with a \"DAO\" that can assign attorneys to restore lost Ethereum accounts.",
    "version": 1
  }
}