{
  "_format": "hh-sol-artifact-1",
  "contractName": "DrawCalculatorV2Harness",
  "sourceName": "contracts/test/DrawCalculatorV2Harness.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "contract ITicket",
          "name": "_ticket",
          "type": "address"
        },
        {
          "internalType": "contract IDrawBuffer",
          "name": "_drawBuffer",
          "type": "address"
        },
        {
          "internalType": "contract IPrizeDistributionSource",
          "name": "_prizeDistributionSource",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "contract ITicket",
          "name": "ticket",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "contract IDrawBuffer",
          "name": "drawBuffer",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "contract IPrizeDistributionSource",
          "name": "prizeDistributionSource",
          "type": "address"
        }
      ],
      "name": "Deployed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "contract PrizeDistributor",
          "name": "prizeDistributor",
          "type": "address"
        }
      ],
      "name": "PrizeDistributorSet",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "TIERS_LENGTH",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_user",
          "type": "address"
        },
        {
          "internalType": "uint32[]",
          "name": "_drawIds",
          "type": "uint32[]"
        },
        {
          "internalType": "bytes",
          "name": "_pickIndicesForDraws",
          "type": "bytes"
        }
      ],
      "name": "calculate",
      "outputs": [
        {
          "internalType": "uint256[]",
          "name": "",
          "type": "uint256[]"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint8",
              "name": "bitRangeSize",
              "type": "uint8"
            },
            {
              "internalType": "uint8",
              "name": "matchCardinality",
              "type": "uint8"
            },
            {
              "internalType": "uint32",
              "name": "startTimestampOffset",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "endTimestampOffset",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "maxPicksPerUser",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "expiryDuration",
              "type": "uint32"
            },
            {
              "internalType": "uint104",
              "name": "numberOfPicks",
              "type": "uint104"
            },
            {
              "internalType": "uint32[16]",
              "name": "tiers",
              "type": "uint32[16]"
            },
            {
              "internalType": "uint256",
              "name": "prize",
              "type": "uint256"
            }
          ],
          "internalType": "struct IPrizeDistributionSource.PrizeDistribution",
          "name": "_prizeDistribution",
          "type": "tuple"
        },
        {
          "internalType": "uint256",
          "name": "_normalizedUserBalance",
          "type": "uint256"
        }
      ],
      "name": "calculateNumberOfUserPicks",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint8",
              "name": "bitRangeSize",
              "type": "uint8"
            },
            {
              "internalType": "uint8",
              "name": "matchCardinality",
              "type": "uint8"
            },
            {
              "internalType": "uint32",
              "name": "startTimestampOffset",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "endTimestampOffset",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "maxPicksPerUser",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "expiryDuration",
              "type": "uint32"
            },
            {
              "internalType": "uint104",
              "name": "numberOfPicks",
              "type": "uint104"
            },
            {
              "internalType": "uint32[16]",
              "name": "tiers",
              "type": "uint32[16]"
            },
            {
              "internalType": "uint256",
              "name": "prize",
              "type": "uint256"
            }
          ],
          "internalType": "struct IPrizeDistributionSource.PrizeDistribution",
          "name": "_prizeDistribution",
          "type": "tuple"
        },
        {
          "internalType": "uint256",
          "name": "_prizeTierIndex",
          "type": "uint256"
        }
      ],
      "name": "calculatePrizeTierFraction",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_randomNumberThisPick",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_winningRandomNumber",
          "type": "uint256"
        },
        {
          "internalType": "uint256[]",
          "name": "_masks",
          "type": "uint256[]"
        }
      ],
      "name": "calculateTierIndex",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint8",
              "name": "bitRangeSize",
              "type": "uint8"
            },
            {
              "internalType": "uint8",
              "name": "matchCardinality",
              "type": "uint8"
            },
            {
              "internalType": "uint32",
              "name": "startTimestampOffset",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "endTimestampOffset",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "maxPicksPerUser",
              "type": "uint32"
            },
            {
              "internalType": "uint32",
              "name": "expiryDuration",
              "type": "uint32"
            },
            {
              "internalType": "uint104",
              "name": "numberOfPicks",
              "type": "uint104"
            },
            {
              "internalType": "uint32[16]",
              "name": "tiers",
              "type": "uint32[16]"
            },
            {
              "internalType": "uint256",
              "name": "prize",
              "type": "uint256"
            }
          ],
          "internalType": "struct IPrizeDistributionSource.PrizeDistribution",
          "name": "_prizeDistribution",
          "type": "tuple"
        }
      ],
      "name": "createBitMasks",
      "outputs": [
        {
          "internalType": "uint256[]",
          "name": "",
          "type": "uint256[]"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "drawBuffer",
      "outputs": [
        {
          "internalType": "contract IDrawBuffer",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getDrawBuffer",
      "outputs": [
        {
          "internalType": "contract IDrawBuffer",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_user",
          "type": "address"
        },
        {
          "internalType": "uint32[]",
          "name": "_drawIds",
          "type": "uint32[]"
        }
      ],
      "name": "getNormalizedBalancesForDrawIds",
      "outputs": [
        {
          "internalType": "uint256[]",
          "name": "",
          "type": "uint256[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getPrizeDistributionSource",
      "outputs": [
        {
          "internalType": "contract IPrizeDistributionSource",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "_bitRangeSize",
          "type": "uint8"
        },
        {
          "internalType": "uint256",
          "name": "_prizeTierIndex",
          "type": "uint256"
        }
      ],
      "name": "numberOfPrizesForIndex",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "prizeDistributionSource",
      "outputs": [
        {
          "internalType": "contract IPrizeDistributionSource",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ticket",
      "outputs": [
        {
          "internalType": "contract ITicket",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x60e06040523480156200001157600080fd5b50604051620025f4380380620025f48339810160408190526200003491620001ad565b8282826001600160a01b038316620000935760405162461bcd60e51b815260206004820152601860248201527f4472617743616c632f7469636b65742d6e6f742d7a65726f000000000000000060448201526064015b60405180910390fd5b6001600160a01b038116620000eb5760405162461bcd60e51b815260206004820152601560248201527f4472617743616c632f7064622d6e6f742d7a65726f000000000000000000000060448201526064016200008a565b6001600160a01b038216620001435760405162461bcd60e51b815260206004820152601460248201527f4472617743616c632f64682d6e6f742d7a65726f00000000000000000000000060448201526064016200008a565b6001600160601b0319606084811b821660a05283811b821660805282901b1660c0526040516001600160a01b0382811691848216918616907fc95935a66d15e0da5e412aca0ad27ae891d20b2fb91cf3994b6a3bf2b817808290600090a45050505050506200021a565b600080600060608486031215620001c357600080fd5b8351620001d08162000201565b6020850151909350620001e38162000201565b6040850151909250620001f68162000201565b809150509250925092565b6001600160a01b03811681146200021757600080fd5b50565b60805160601c60a05160601c60c05160601c6123696200028b600039600081816101c001528181610249015281816103c701526105f601526000818161018901528181610b5f0152610bf201526000818161011f0152818161027001528181610314015261056501526123696000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c8063740e61a31161008c578063aaca392e11610066578063aaca392e14610223578063bcc18abc14610244578063ce343bb61461026b578063f8d0ca4c1461029257600080fd5b8063740e61a3146101be5780638045fbcf146101e45780639d34ee24146101f757600080fd5b806367306cf2116100bd57806367306cf2146101645780636cc25db7146101845780636d4bfa6e146101ab57600080fd5b8063094a2491146100e45780633b5564f91461010a5780634019f2d61461011d575b600080fd5b6100f76100f2366004611d36565b6102ac565b6040519081526020015b60405180910390f35b6100f7610118366004611c21565b6102c1565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610101565b610177610172366004611c04565b6102db565b6040516101019190611e98565b61013f7f000000000000000000000000000000000000000000000000000000000000000081565b6100f76101b9366004611c89565b6102f4565b7f000000000000000000000000000000000000000000000000000000000000000061013f565b6101776101f2366004611727565b61030e565b61020a610205366004611c6b565b61048b565b60405167ffffffffffffffff9091168152602001610101565b61023661023136600461177a565b610497565b604051610101929190611eab565b61013f7f000000000000000000000000000000000000000000000000000000000000000081565b61013f7f000000000000000000000000000000000000000000000000000000000000000081565b61029a601081565b60405160ff9091168152602001610101565b60006102b88383610722565b90505b92915050565b60006102b86102d536859003850185611c4e565b83610770565b60606102bb6102ef36849003840184611c4e565b6107bb565b60006103018484846108c0565b60ff1690505b9392505050565b606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0bb78f385856040518363ffffffff1660e01b815260040161036d929190611f10565b60006040518083038186803b15801561038557600080fd5b505afa158015610399573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103c19190810190611945565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d30a5daf86866040518363ffffffff1660e01b8152600401610420929190611f10565b60006040518083038186803b15801561043857600080fd5b505afa15801561044c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104749190810190611a40565b905061048186838361095f565b9695505050505050565b60006102b88383610dca565b60608060006104a884860186611825565b805190915086146105255760405162461bcd60e51b8152602060048201526024808201527f4472617743616c632f696e76616c69642d7069636b2d696e64696365732d6c6560448201527f6e6774680000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6040517fd0bb78f300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0bb78f39061059c908b908b90600401611f10565b60006040518083038186803b1580156105b457600080fd5b505afa1580156105c8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105f09190810190611945565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d30a5daf8a8a6040518363ffffffff1660e01b815260040161064f929190611f10565b60006040518083038186803b15801561066757600080fd5b505afa15801561067b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106a39190810190611a40565b905060006106b28b848461095f565b6040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608e901b16602082015290915060009060340160405160208183030381529060405280519060200120905061070f8282868887610dfe565b9650965050505050509550959350505050565b60008115610768576107356001836121de565b6107429060ff85166121bf565b6001901b6107538360ff86166121bf565b6001901b61076191906121de565b90506102bb565b5060016102bb565b6000808360e001518360108110610789576107896122b2565b602002015163ffffffff16905060006107a6856000015185610722565b90506107b281836120af565b95945050505050565b60606000826020015160ff1667ffffffffffffffff8111156107df576107df6122c8565b604051908082528060200260200182016040528015610808578160200160208202803683370190505b50835190915060019061081c906002612114565b61082691906121de565b81600081518110610839576108396122b2565b602090810291909101015260015b836020015160ff168160ff1610156108b957835160ff168261086a60018461221a565b60ff168151811061087d5761087d6122b2565b6020026020010151901b828260ff168151811061089c5761089c6122b2565b6020908102919091010152806108b18161227c565b915050610847565b5092915050565b80516000908190815b8160ff168160ff161015610954576000858260ff16815181106108ee576108ee6122b2565b6020026020010151905080871681891614610933578360ff168360ff16141561091e576000945050505050610307565b610928848461221a565b945050505050610307565b8361093d8161227c565b94505050808061094c9061227c565b9150506108c9565b50610481828261221a565b815160609060008167ffffffffffffffff81111561097f5761097f6122c8565b6040519080825280602002602001820160405280156109a8578160200160208202803683370190505b50905060008267ffffffffffffffff8111156109c6576109c66122c8565b6040519080825280602002602001820160405280156109ef578160200160208202803683370190505b50905060005b838163ffffffff161015610b1e57858163ffffffff1681518110610a1b57610a1b6122b2565b60200260200101516040015163ffffffff16878263ffffffff1681518110610a4557610a456122b2565b60200260200101516040015103838263ffffffff1681518110610a6a57610a6a6122b2565b602002602001019067ffffffffffffffff16908167ffffffffffffffff1681525050858163ffffffff1681518110610aa457610aa46122b2565b60200260200101516060015163ffffffff16878263ffffffff1681518110610ace57610ace6122b2565b60200260200101516040015103828263ffffffff1681518110610af357610af36122b2565b67ffffffffffffffff9092166020928302919091019091015280610b1681612258565b9150506109f5565b506040517f68c7fd5700000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906368c7fd5790610b98908b9087908790600401611dd7565b60006040518083038186803b158015610bb057600080fd5b505afa158015610bc4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bec9190810190611b6c565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e6d536a85856040518363ffffffff1660e01b8152600401610c4b929190611f5b565b60006040518083038186803b158015610c6357600080fd5b505afa158015610c77573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c9f9190810190611b6c565b905060008567ffffffffffffffff811115610cbc57610cbc6122c8565b604051908082528060200260200182016040528015610ce5578160200160208202803683370190505b50905060005b86811015610dbc57828181518110610d0557610d056122b2565b602002602001015160001415610d3a576000828281518110610d2957610d296122b2565b602002602001018181525050610daa565b828181518110610d4c57610d4c6122b2565b6020026020010151848281518110610d6657610d666122b2565b6020026020010151670de0b6b3a7640000610d8191906121bf565b610d8b91906120af565b828281518110610d9d57610d9d6122b2565b6020026020010181815250505b80610db48161223d565b915050610ceb565b509998505050505050505050565b6000670de0b6b3a76400008360c001516cffffffffffffffffffffffffff1683610df491906121bf565b6102b891906120af565b6060806000875167ffffffffffffffff811115610e1d57610e1d6122c8565b604051908082528060200260200182016040528015610e46578160200160208202803683370190505b5090506000885167ffffffffffffffff811115610e6557610e656122c8565b604051908082528060200260200182016040528015610e9857816020015b6060815260200190600190039081610e835790505b5090504260005b88518163ffffffff16101561108557868163ffffffff1681518110610ec657610ec66122b2565b602002602001015160a0015163ffffffff16898263ffffffff1681518110610ef057610ef06122b2565b602002602001015160400151610f06919061205e565b67ffffffffffffffff168267ffffffffffffffff1610610f685760405162461bcd60e51b815260206004820152601560248201527f4472617743616c632f647261772d657870697265640000000000000000000000604482015260640161051c565b6000610fb2888363ffffffff1681518110610f8557610f856122b2565b60200260200101518d8463ffffffff1681518110610fa557610fa56122b2565b6020026020010151610dca565b905061102c8a8363ffffffff1681518110610fcf57610fcf6122b2565b6020026020010151600001518267ffffffffffffffff168d8c8663ffffffff1681518110610fff57610fff6122b2565b60200260200101518c8763ffffffff168151811061101f5761101f6122b2565b60200260200101516110b8565b868463ffffffff1681518110611044576110446122b2565b60200260200101868563ffffffff1681518110611063576110636122b2565b602090810291909101019190915252508061107d81612258565b915050610e9f565b50816040516020016110979190611e18565b60405160208183030381529060405293508294505050509550959350505050565b6000606060006110c7846107bb565b85516040805160108082526102208201909252929350909160009160208201610200803683370190505090506000866080015163ffffffff168363ffffffff1611156111555760405162461bcd60e51b815260206004820152601f60248201527f4472617743616c632f657863656564732d6d61782d757365722d7069636b7300604482015260640161051c565b60005b8363ffffffff168163ffffffff16101561136d578a898263ffffffff1681518110611185576111856122b2565b602002602001015167ffffffffffffffff16106111e45760405162461bcd60e51b815260206004820181905260248201527f4472617743616c632f696e73756666696369656e742d757365722d7069636b73604482015260640161051c565b63ffffffff81161561129b57886111fc6001836121f5565b63ffffffff1681518110611212576112126122b2565b602002602001015167ffffffffffffffff16898263ffffffff168151811061123c5761123c6122b2565b602002602001015167ffffffffffffffff161161129b5760405162461bcd60e51b815260206004820152601860248201527f4472617743616c632f7069636b732d617363656e64696e670000000000000000604482015260640161051c565b60008a8a8363ffffffff16815181106112b6576112b66122b2565b60200260200101516040516020016112e292919091825267ffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012060001c9050600061130a828f896108c0565b9050601060ff82161015611358578360ff168160ff16111561132a578093505b848160ff168151811061133f5761133f6122b2565b6020026020010180518091906113549061223d565b9052505b5050808061136590612258565b915050611158565b5060008061137b898461143d565b905060005b8360ff16811161140957600085828151811061139e5761139e6122b2565b602002602001015111156113f7578481815181106113be576113be6122b2565b60200260200101518282815181106113d8576113d86122b2565b60200260200101516113ea91906121bf565b6113f49084612046565b92505b806114018161223d565b915050611380565b50633b9aca008961010001518361142091906121bf565b61142a91906120af565b9d939c50929a5050505050505050505050565b6060600061144c83600161208a565b60ff1667ffffffffffffffff811115611467576114676122c8565b604051908082528060200260200182016040528015611490578160200160208202803683370190505b50905060005b8360ff168160ff16116114e2576114b0858260ff16610770565b828260ff16815181106114c5576114c56122b2565b6020908102919091010152806114da8161227c565b915050611496565b509392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461150e57600080fd5b919050565b600082601f83011261152457600080fd5b61152c611fcd565b8083856102008601111561153f57600080fd5b60005b601081101561156b578135611556816122fc565b84526020938401939190910190600101611542565b509095945050505050565b600082601f83011261158757600080fd5b61158f611fcd565b808385610200860111156115a257600080fd5b60005b601081101561156b5781516115b9816122fc565b845260209384019391909101906001016115a5565b60008083601f8401126115e057600080fd5b50813567ffffffffffffffff8111156115f857600080fd5b6020830191508360208260051b850101111561161357600080fd5b9250929050565b6000610300828403121561162d57600080fd5b50919050565b6000610300828403121561164657600080fd5b61164e611f80565b905061165982611711565b815261166760208301611711565b6020820152611678604083016116fb565b6040820152611689606083016116fb565b606082015261169a608083016116fb565b60808201526116ab60a083016116fb565b60a08201526116bc60c083016116e5565b60c08201526116ce8360e08401611513565b60e08201526102e082013561010082015292915050565b803561150e816122de565b805161150e816122de565b803561150e816122fc565b805161150e816122fc565b803561150e81612324565b805161150e81612324565b60008060006040848603121561173c57600080fd5b611745846114ea565b9250602084013567ffffffffffffffff81111561176157600080fd5b61176d868287016115ce565b9497909650939450505050565b60008060008060006060868803121561179257600080fd5b61179b866114ea565b9450602086013567ffffffffffffffff808211156117b857600080fd5b6117c489838a016115ce565b909650945060408801359150808211156117dd57600080fd5b818801915088601f8301126117f157600080fd5b81358181111561180057600080fd5b89602082850101111561181257600080fd5b9699959850939650602001949392505050565b6000602080838503121561183857600080fd5b823567ffffffffffffffff8082111561185057600080fd5b818501915085601f83011261186457600080fd5b813561187761187282612022565b611ff1565b80828252858201915085850189878560051b880101111561189757600080fd5b60005b84811015611936578135868111156118b157600080fd5b8701603f81018c136118c257600080fd5b888101356118d261187282612022565b808282528b82019150604084018f60408560051b87010111156118f457600080fd5b600094505b8385101561192057803561190c8161230e565b835260019490940193918c01918c016118f9565b508752505050928701929087019060010161189a565b50909998505050505050505050565b6000602080838503121561195857600080fd5b825167ffffffffffffffff81111561196f57600080fd5b8301601f8101851361198057600080fd5b805161198e61187282612022565b8181528381019083850160a0808502860187018a10156119ad57600080fd5b60009550855b85811015611a315781838c0312156119c9578687fd5b6119d1611faa565b83518152888401516119e2816122fc565b818a01526040848101516119f58161230e565b90820152606084810151611a088161230e565b90820152608084810151611a1b816122fc565b90820152855293870193918101916001016119b3565b50919998505050505050505050565b60006020808385031215611a5357600080fd5b825167ffffffffffffffff811115611a6a57600080fd5b8301601f81018513611a7b57600080fd5b8051611a8961187282612022565b81815283810190838501610300808502860187018a1015611aa957600080fd5b60009550855b85811015611a315781838c031215611ac5578687fd5b611acd611f80565b611ad68461171c565b8152611ae389850161171c565b898201526040611af4818601611706565b908201526060611b05858201611706565b908201526080611b16858201611706565b9082015260a0611b27858201611706565b9082015260c0611b388582016116f0565b9082015260e0611b4a8d868301611576565b908201526102e084015161010082015285529387019391810191600101611aaf565b60006020808385031215611b7f57600080fd5b825167ffffffffffffffff811115611b9657600080fd5b8301601f81018513611ba757600080fd5b8051611bb561187282612022565b80828252848201915084840188868560051b8701011115611bd557600080fd5b600094505b83851015611bf8578051835260019490940193918501918501611bda565b50979650505050505050565b60006103008284031215611c1757600080fd5b6102b8838361161a565b6000806103208385031215611c3557600080fd5b611c3f848461161a565b94610300939093013593505050565b60006103008284031215611c6157600080fd5b6102b88383611633565b6000806103208385031215611c7f57600080fd5b611c3f8484611633565b600080600060608486031215611c9e57600080fd5b833592506020808501359250604085013567ffffffffffffffff811115611cc457600080fd5b8501601f81018713611cd557600080fd5b8035611ce361187282612022565b8082825284820191508484018a868560051b8701011115611d0357600080fd5b600094505b83851015611d26578035835260019490940193918501918501611d08565b5080955050505050509250925092565b60008060408385031215611d4957600080fd5b8235611d5481612324565b946020939093013593505050565b600081518084526020808501945080840160005b83811015611d9257815187529582019590820190600101611d76565b509495945050505050565b600081518084526020808501945080840160005b83811015611d9257815167ffffffffffffffff1687529582019590820190600101611db1565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000611e066060830185611d9d565b82810360408401526104818185611d9d565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611e8b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452611e79858351611d62565b94509285019290850190600101611e3f565b5092979650505050505050565b6020815260006102b86020830184611d62565b604081526000611ebe6040830185611d62565b602083820381850152845180835260005b81811015611eea578681018301518482018401528201611ecf565b81811115611efb5760008383860101525b50601f01601f19169190910101949350505050565b60208082528181018390526000908460408401835b86811015611f50578235611f38816122fc565b63ffffffff1682529183019190830190600101611f25565b509695505050505050565b604081526000611f6e6040830185611d9d565b82810360208401526107b28185611d9d565b604051610120810167ffffffffffffffff81118282101715611fa457611fa46122c8565b60405290565b60405160a0810167ffffffffffffffff81118282101715611fa457611fa46122c8565b604051610200810167ffffffffffffffff81118282101715611fa457611fa46122c8565b604051601f8201601f1916810167ffffffffffffffff8111828210171561201a5761201a6122c8565b604052919050565b600067ffffffffffffffff82111561203c5761203c6122c8565b5060051b60200190565b600082198211156120595761205961229c565b500190565b600067ffffffffffffffff8083168185168083038211156120815761208161229c565b01949350505050565b600060ff821660ff84168060ff038211156120a7576120a761229c565b019392505050565b6000826120cc57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561210c5781600019048211156120f2576120f261229c565b808516156120ff57918102915b93841c93908002906120d6565b509250929050565b60006102b860ff84168360008261212d575060016102bb565b8161213a575060006102bb565b8160018114612150576002811461215a57612176565b60019150506102bb565b60ff84111561216b5761216b61229c565b50506001821b6102bb565b5060208310610133831016604e8410600b8410161715612199575081810a6102bb565b6121a383836120d1565b80600019048211156121b7576121b761229c565b029392505050565b60008160001904831182151516156121d9576121d961229c565b500290565b6000828210156121f0576121f061229c565b500390565b600063ffffffff838116908316818110156122125761221261229c565b039392505050565b600060ff821660ff8416808210156122345761223461229c565b90039392505050565b60006000198214156122515761225161229c565b5060010190565b600063ffffffff808316818114156122725761227261229c565b6001019392505050565b600060ff821660ff8114156122935761229361229c565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6cffffffffffffffffffffffffff811681146122f957600080fd5b50565b63ffffffff811681146122f957600080fd5b67ffffffffffffffff811681146122f957600080fd5b60ff811681146122f957600080fdfea26469706673582212208938540598b2c0d8179196a51c6c70145121771baedf66e06ae7c3cc6047e5a464736f6c63430008060033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100df5760003560e01c8063740e61a31161008c578063aaca392e11610066578063aaca392e14610223578063bcc18abc14610244578063ce343bb61461026b578063f8d0ca4c1461029257600080fd5b8063740e61a3146101be5780638045fbcf146101e45780639d34ee24146101f757600080fd5b806367306cf2116100bd57806367306cf2146101645780636cc25db7146101845780636d4bfa6e146101ab57600080fd5b8063094a2491146100e45780633b5564f91461010a5780634019f2d61461011d575b600080fd5b6100f76100f2366004611d36565b6102ac565b6040519081526020015b60405180910390f35b6100f7610118366004611c21565b6102c1565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610101565b610177610172366004611c04565b6102db565b6040516101019190611e98565b61013f7f000000000000000000000000000000000000000000000000000000000000000081565b6100f76101b9366004611c89565b6102f4565b7f000000000000000000000000000000000000000000000000000000000000000061013f565b6101776101f2366004611727565b61030e565b61020a610205366004611c6b565b61048b565b60405167ffffffffffffffff9091168152602001610101565b61023661023136600461177a565b610497565b604051610101929190611eab565b61013f7f000000000000000000000000000000000000000000000000000000000000000081565b61013f7f000000000000000000000000000000000000000000000000000000000000000081565b61029a601081565b60405160ff9091168152602001610101565b60006102b88383610722565b90505b92915050565b60006102b86102d536859003850185611c4e565b83610770565b60606102bb6102ef36849003840184611c4e565b6107bb565b60006103018484846108c0565b60ff1690505b9392505050565b606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0bb78f385856040518363ffffffff1660e01b815260040161036d929190611f10565b60006040518083038186803b15801561038557600080fd5b505afa158015610399573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103c19190810190611945565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d30a5daf86866040518363ffffffff1660e01b8152600401610420929190611f10565b60006040518083038186803b15801561043857600080fd5b505afa15801561044c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104749190810190611a40565b905061048186838361095f565b9695505050505050565b60006102b88383610dca565b60608060006104a884860186611825565b805190915086146105255760405162461bcd60e51b8152602060048201526024808201527f4472617743616c632f696e76616c69642d7069636b2d696e64696365732d6c6560448201527f6e6774680000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6040517fd0bb78f300000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063d0bb78f39061059c908b908b90600401611f10565b60006040518083038186803b1580156105b457600080fd5b505afa1580156105c8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105f09190810190611945565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d30a5daf8a8a6040518363ffffffff1660e01b815260040161064f929190611f10565b60006040518083038186803b15801561066757600080fd5b505afa15801561067b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106a39190810190611a40565b905060006106b28b848461095f565b6040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608e901b16602082015290915060009060340160405160208183030381529060405280519060200120905061070f8282868887610dfe565b9650965050505050509550959350505050565b60008115610768576107356001836121de565b6107429060ff85166121bf565b6001901b6107538360ff86166121bf565b6001901b61076191906121de565b90506102bb565b5060016102bb565b6000808360e001518360108110610789576107896122b2565b602002015163ffffffff16905060006107a6856000015185610722565b90506107b281836120af565b95945050505050565b60606000826020015160ff1667ffffffffffffffff8111156107df576107df6122c8565b604051908082528060200260200182016040528015610808578160200160208202803683370190505b50835190915060019061081c906002612114565b61082691906121de565b81600081518110610839576108396122b2565b602090810291909101015260015b836020015160ff168160ff1610156108b957835160ff168261086a60018461221a565b60ff168151811061087d5761087d6122b2565b6020026020010151901b828260ff168151811061089c5761089c6122b2565b6020908102919091010152806108b18161227c565b915050610847565b5092915050565b80516000908190815b8160ff168160ff161015610954576000858260ff16815181106108ee576108ee6122b2565b6020026020010151905080871681891614610933578360ff168360ff16141561091e576000945050505050610307565b610928848461221a565b945050505050610307565b8361093d8161227c565b94505050808061094c9061227c565b9150506108c9565b50610481828261221a565b815160609060008167ffffffffffffffff81111561097f5761097f6122c8565b6040519080825280602002602001820160405280156109a8578160200160208202803683370190505b50905060008267ffffffffffffffff8111156109c6576109c66122c8565b6040519080825280602002602001820160405280156109ef578160200160208202803683370190505b50905060005b838163ffffffff161015610b1e57858163ffffffff1681518110610a1b57610a1b6122b2565b60200260200101516040015163ffffffff16878263ffffffff1681518110610a4557610a456122b2565b60200260200101516040015103838263ffffffff1681518110610a6a57610a6a6122b2565b602002602001019067ffffffffffffffff16908167ffffffffffffffff1681525050858163ffffffff1681518110610aa457610aa46122b2565b60200260200101516060015163ffffffff16878263ffffffff1681518110610ace57610ace6122b2565b60200260200101516040015103828263ffffffff1681518110610af357610af36122b2565b67ffffffffffffffff9092166020928302919091019091015280610b1681612258565b9150506109f5565b506040517f68c7fd5700000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906368c7fd5790610b98908b9087908790600401611dd7565b60006040518083038186803b158015610bb057600080fd5b505afa158015610bc4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bec9190810190611b6c565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638e6d536a85856040518363ffffffff1660e01b8152600401610c4b929190611f5b565b60006040518083038186803b158015610c6357600080fd5b505afa158015610c77573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c9f9190810190611b6c565b905060008567ffffffffffffffff811115610cbc57610cbc6122c8565b604051908082528060200260200182016040528015610ce5578160200160208202803683370190505b50905060005b86811015610dbc57828181518110610d0557610d056122b2565b602002602001015160001415610d3a576000828281518110610d2957610d296122b2565b602002602001018181525050610daa565b828181518110610d4c57610d4c6122b2565b6020026020010151848281518110610d6657610d666122b2565b6020026020010151670de0b6b3a7640000610d8191906121bf565b610d8b91906120af565b828281518110610d9d57610d9d6122b2565b6020026020010181815250505b80610db48161223d565b915050610ceb565b509998505050505050505050565b6000670de0b6b3a76400008360c001516cffffffffffffffffffffffffff1683610df491906121bf565b6102b891906120af565b6060806000875167ffffffffffffffff811115610e1d57610e1d6122c8565b604051908082528060200260200182016040528015610e46578160200160208202803683370190505b5090506000885167ffffffffffffffff811115610e6557610e656122c8565b604051908082528060200260200182016040528015610e9857816020015b6060815260200190600190039081610e835790505b5090504260005b88518163ffffffff16101561108557868163ffffffff1681518110610ec657610ec66122b2565b602002602001015160a0015163ffffffff16898263ffffffff1681518110610ef057610ef06122b2565b602002602001015160400151610f06919061205e565b67ffffffffffffffff168267ffffffffffffffff1610610f685760405162461bcd60e51b815260206004820152601560248201527f4472617743616c632f647261772d657870697265640000000000000000000000604482015260640161051c565b6000610fb2888363ffffffff1681518110610f8557610f856122b2565b60200260200101518d8463ffffffff1681518110610fa557610fa56122b2565b6020026020010151610dca565b905061102c8a8363ffffffff1681518110610fcf57610fcf6122b2565b6020026020010151600001518267ffffffffffffffff168d8c8663ffffffff1681518110610fff57610fff6122b2565b60200260200101518c8763ffffffff168151811061101f5761101f6122b2565b60200260200101516110b8565b868463ffffffff1681518110611044576110446122b2565b60200260200101868563ffffffff1681518110611063576110636122b2565b602090810291909101019190915252508061107d81612258565b915050610e9f565b50816040516020016110979190611e18565b60405160208183030381529060405293508294505050509550959350505050565b6000606060006110c7846107bb565b85516040805160108082526102208201909252929350909160009160208201610200803683370190505090506000866080015163ffffffff168363ffffffff1611156111555760405162461bcd60e51b815260206004820152601f60248201527f4472617743616c632f657863656564732d6d61782d757365722d7069636b7300604482015260640161051c565b60005b8363ffffffff168163ffffffff16101561136d578a898263ffffffff1681518110611185576111856122b2565b602002602001015167ffffffffffffffff16106111e45760405162461bcd60e51b815260206004820181905260248201527f4472617743616c632f696e73756666696369656e742d757365722d7069636b73604482015260640161051c565b63ffffffff81161561129b57886111fc6001836121f5565b63ffffffff1681518110611212576112126122b2565b602002602001015167ffffffffffffffff16898263ffffffff168151811061123c5761123c6122b2565b602002602001015167ffffffffffffffff161161129b5760405162461bcd60e51b815260206004820152601860248201527f4472617743616c632f7069636b732d617363656e64696e670000000000000000604482015260640161051c565b60008a8a8363ffffffff16815181106112b6576112b66122b2565b60200260200101516040516020016112e292919091825267ffffffffffffffff16602082015260400190565b6040516020818303038152906040528051906020012060001c9050600061130a828f896108c0565b9050601060ff82161015611358578360ff168160ff16111561132a578093505b848160ff168151811061133f5761133f6122b2565b6020026020010180518091906113549061223d565b9052505b5050808061136590612258565b915050611158565b5060008061137b898461143d565b905060005b8360ff16811161140957600085828151811061139e5761139e6122b2565b602002602001015111156113f7578481815181106113be576113be6122b2565b60200260200101518282815181106113d8576113d86122b2565b60200260200101516113ea91906121bf565b6113f49084612046565b92505b806114018161223d565b915050611380565b50633b9aca008961010001518361142091906121bf565b61142a91906120af565b9d939c50929a5050505050505050505050565b6060600061144c83600161208a565b60ff1667ffffffffffffffff811115611467576114676122c8565b604051908082528060200260200182016040528015611490578160200160208202803683370190505b50905060005b8360ff168160ff16116114e2576114b0858260ff16610770565b828260ff16815181106114c5576114c56122b2565b6020908102919091010152806114da8161227c565b915050611496565b509392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461150e57600080fd5b919050565b600082601f83011261152457600080fd5b61152c611fcd565b8083856102008601111561153f57600080fd5b60005b601081101561156b578135611556816122fc565b84526020938401939190910190600101611542565b509095945050505050565b600082601f83011261158757600080fd5b61158f611fcd565b808385610200860111156115a257600080fd5b60005b601081101561156b5781516115b9816122fc565b845260209384019391909101906001016115a5565b60008083601f8401126115e057600080fd5b50813567ffffffffffffffff8111156115f857600080fd5b6020830191508360208260051b850101111561161357600080fd5b9250929050565b6000610300828403121561162d57600080fd5b50919050565b6000610300828403121561164657600080fd5b61164e611f80565b905061165982611711565b815261166760208301611711565b6020820152611678604083016116fb565b6040820152611689606083016116fb565b606082015261169a608083016116fb565b60808201526116ab60a083016116fb565b60a08201526116bc60c083016116e5565b60c08201526116ce8360e08401611513565b60e08201526102e082013561010082015292915050565b803561150e816122de565b805161150e816122de565b803561150e816122fc565b805161150e816122fc565b803561150e81612324565b805161150e81612324565b60008060006040848603121561173c57600080fd5b611745846114ea565b9250602084013567ffffffffffffffff81111561176157600080fd5b61176d868287016115ce565b9497909650939450505050565b60008060008060006060868803121561179257600080fd5b61179b866114ea565b9450602086013567ffffffffffffffff808211156117b857600080fd5b6117c489838a016115ce565b909650945060408801359150808211156117dd57600080fd5b818801915088601f8301126117f157600080fd5b81358181111561180057600080fd5b89602082850101111561181257600080fd5b9699959850939650602001949392505050565b6000602080838503121561183857600080fd5b823567ffffffffffffffff8082111561185057600080fd5b818501915085601f83011261186457600080fd5b813561187761187282612022565b611ff1565b80828252858201915085850189878560051b880101111561189757600080fd5b60005b84811015611936578135868111156118b157600080fd5b8701603f81018c136118c257600080fd5b888101356118d261187282612022565b808282528b82019150604084018f60408560051b87010111156118f457600080fd5b600094505b8385101561192057803561190c8161230e565b835260019490940193918c01918c016118f9565b508752505050928701929087019060010161189a565b50909998505050505050505050565b6000602080838503121561195857600080fd5b825167ffffffffffffffff81111561196f57600080fd5b8301601f8101851361198057600080fd5b805161198e61187282612022565b8181528381019083850160a0808502860187018a10156119ad57600080fd5b60009550855b85811015611a315781838c0312156119c9578687fd5b6119d1611faa565b83518152888401516119e2816122fc565b818a01526040848101516119f58161230e565b90820152606084810151611a088161230e565b90820152608084810151611a1b816122fc565b90820152855293870193918101916001016119b3565b50919998505050505050505050565b60006020808385031215611a5357600080fd5b825167ffffffffffffffff811115611a6a57600080fd5b8301601f81018513611a7b57600080fd5b8051611a8961187282612022565b81815283810190838501610300808502860187018a1015611aa957600080fd5b60009550855b85811015611a315781838c031215611ac5578687fd5b611acd611f80565b611ad68461171c565b8152611ae389850161171c565b898201526040611af4818601611706565b908201526060611b05858201611706565b908201526080611b16858201611706565b9082015260a0611b27858201611706565b9082015260c0611b388582016116f0565b9082015260e0611b4a8d868301611576565b908201526102e084015161010082015285529387019391810191600101611aaf565b60006020808385031215611b7f57600080fd5b825167ffffffffffffffff811115611b9657600080fd5b8301601f81018513611ba757600080fd5b8051611bb561187282612022565b80828252848201915084840188868560051b8701011115611bd557600080fd5b600094505b83851015611bf8578051835260019490940193918501918501611bda565b50979650505050505050565b60006103008284031215611c1757600080fd5b6102b8838361161a565b6000806103208385031215611c3557600080fd5b611c3f848461161a565b94610300939093013593505050565b60006103008284031215611c6157600080fd5b6102b88383611633565b6000806103208385031215611c7f57600080fd5b611c3f8484611633565b600080600060608486031215611c9e57600080fd5b833592506020808501359250604085013567ffffffffffffffff811115611cc457600080fd5b8501601f81018713611cd557600080fd5b8035611ce361187282612022565b8082825284820191508484018a868560051b8701011115611d0357600080fd5b600094505b83851015611d26578035835260019490940193918501918501611d08565b5080955050505050509250925092565b60008060408385031215611d4957600080fd5b8235611d5481612324565b946020939093013593505050565b600081518084526020808501945080840160005b83811015611d9257815187529582019590820190600101611d76565b509495945050505050565b600081518084526020808501945080840160005b83811015611d9257815167ffffffffffffffff1687529582019590820190600101611db1565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000611e066060830185611d9d565b82810360408401526104818185611d9d565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611e8b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452611e79858351611d62565b94509285019290850190600101611e3f565b5092979650505050505050565b6020815260006102b86020830184611d62565b604081526000611ebe6040830185611d62565b602083820381850152845180835260005b81811015611eea578681018301518482018401528201611ecf565b81811115611efb5760008383860101525b50601f01601f19169190910101949350505050565b60208082528181018390526000908460408401835b86811015611f50578235611f38816122fc565b63ffffffff1682529183019190830190600101611f25565b509695505050505050565b604081526000611f6e6040830185611d9d565b82810360208401526107b28185611d9d565b604051610120810167ffffffffffffffff81118282101715611fa457611fa46122c8565b60405290565b60405160a0810167ffffffffffffffff81118282101715611fa457611fa46122c8565b604051610200810167ffffffffffffffff81118282101715611fa457611fa46122c8565b604051601f8201601f1916810167ffffffffffffffff8111828210171561201a5761201a6122c8565b604052919050565b600067ffffffffffffffff82111561203c5761203c6122c8565b5060051b60200190565b600082198211156120595761205961229c565b500190565b600067ffffffffffffffff8083168185168083038211156120815761208161229c565b01949350505050565b600060ff821660ff84168060ff038211156120a7576120a761229c565b019392505050565b6000826120cc57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561210c5781600019048211156120f2576120f261229c565b808516156120ff57918102915b93841c93908002906120d6565b509250929050565b60006102b860ff84168360008261212d575060016102bb565b8161213a575060006102bb565b8160018114612150576002811461215a57612176565b60019150506102bb565b60ff84111561216b5761216b61229c565b50506001821b6102bb565b5060208310610133831016604e8410600b8410161715612199575081810a6102bb565b6121a383836120d1565b80600019048211156121b7576121b761229c565b029392505050565b60008160001904831182151516156121d9576121d961229c565b500290565b6000828210156121f0576121f061229c565b500390565b600063ffffffff838116908316818110156122125761221261229c565b039392505050565b600060ff821660ff8416808210156122345761223461229c565b90039392505050565b60006000198214156122515761225161229c565b5060010190565b600063ffffffff808316818114156122725761227261229c565b6001019392505050565b600060ff821660ff8114156122935761229361229c565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6cffffffffffffffffffffffffff811681146122f957600080fd5b50565b63ffffffff811681146122f957600080fd5b67ffffffffffffffff811681146122f957600080fd5b60ff811681146122f957600080fdfea26469706673582212208938540598b2c0d8179196a51c6c70145121771baedf66e06ae7c3cc6047e5a464736f6c63430008060033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
