{"matchId":"39577033","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-07-02T19:38:24Z","creationBytecode":{"onchainBytecode":"0x608060405234801561001057600080fd5b50613410806100206000396000f3fe608060405234801561001057600080fd5b50600436106102ff5760003560e01c806379ba50971161019c578063ad38bf22116100ee578063dd62ed3e11610097578063f6ee1d8811610071578063f6ee1d88146106a9578063f9f92be4146106bc578063fe575a87146106cf57600080fd5b8063dd62ed3e14610654578063e5a6b10f1461068e578063f2fde38b1461069657600080fd5b8063c4d66de8116100c8578063c4d66de81461060d578063d3b3f8d414610620578063dbac26e91461063157600080fd5b8063ad38bf22146105d4578063b2118a8d146105e7578063bdd6265a146105fa57600080fd5b806395d89b4111610150578063a9059cbb1161012a578063a9059cbb1461058a578063aa20e1e41461059d578063aa271e1a146105b057600080fd5b806395d89b411461055c5780639f50d7d114610564578063a457c2d71461057757600080fd5b8063893d20e811610181578063893d20e8146105135780638a6db9c31461052a57806393596c7b1461054b57600080fd5b806379ba5097146105035780638456cb591461050b57600080fd5b806339509351116102555780634e44d956116102095780636ae8d6c8116101e35780636ae8d6c81461049e5780637008b548146104c857806370a08231146104d957600080fd5b80634e44d95614610453578063554bab3c146104665780635c975abb1461047957600080fd5b80633f4ba83a1161023a5780633f4ba83a1461042557806340c10f191461042d57806342966c681461044057600080fd5b806339509351146104015780633f02ebc41461041457600080fd5b806323b872dd116102b7578063313ce56711610291578063313ce567146103ae57806335d99f35146103c457806338a63183146103f057600080fd5b806323b872dd146103755780632ab60045146103885780633092afd51461039b57600080fd5b80630d96bcdb116102e85780630d96bcdb1461034557806318160ddd1461034f5780631a8952661461036257600080fd5b806306fdde0314610304578063095ea7b314610322575b600080fd5b61030c6106fb565b604051610319919061304e565b60405180910390f35b6103356103303660046130bf565b61078e565b6040519015158152602001610319565b61034d6108e1565b005b610132545b604051908152602001610319565b61034d6103703660046130eb565b6109a2565b61033561038336600461310f565b610a8c565b61034d6103963660046130eb565b610ce3565b6103356103a93660046130eb565b610dc9565b61012f5460405160ff9091168152602001610319565b610131546103d8906001600160a01b031681565b6040516001600160a01b039091168152602001610319565b60fb546001600160a01b03166103d8565b61033561040f3660046130bf565b610e6f565b6064546001600160a01b03166103d8565b61034d610ff0565b61033561043b3660046130bf565b6110db565b61034d61044e366004613150565b61146c565b6103356104613660046130bf565b6116ad565b61034d6104743660046130eb565b6117b6565b6096546103359074010000000000000000000000000000000000000000900460ff1681565b6103546104ac3660046130eb565b6001600160a01b03166000908152610136602052604090205490565b6096546001600160a01b03166103d8565b6103546104e73660046130eb565b6001600160a01b03166000908152610133602052604090205490565b61034d61189c565b61034d61198f565b6031546201000090046001600160a01b03166103d8565b6103546105383660046130eb565b6101366020526000908152604090205481565b6032546001600160a01b03166103d8565b61030c611a92565b61034d6105723660046130eb565b611aa2565b6103356105853660046130bf565b611b8e565b6103356105983660046130bf565b611d62565b61034d6105ab3660046130eb565b611ea5565b6103356105be3660046130eb565b6101356020526000908152604090205460ff1681565b61034d6105e23660046130eb565b611f92565b61034d6105f536600461310f565b61205f565b61034d6106083660046131c3565b6120bc565b61034d61061b3660046130eb565b6124db565b60c8546001600160a01b03166103d8565b61033561063f3660046130eb565b60c96020526000908152604090205460ff1681565b6103546106623660046132b1565b6001600160a01b0391821660009081526101346020908152604080832093909416825291909152205490565b61030c6125b0565b61034d6106a43660046130eb565b61263f565b61034d6106b73660046130eb565b61273a565b61034d6106ca3660046130eb565b612894565b6103356106dd3660046130eb565b6001600160a01b0316600090815260c9602052604090205460ff1690565b606061012d805461070b906132ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610737906132ea565b80156107845780601f1061075957610100808354040283529160200191610784565b820191906000526020600020905b81548152906001019060200180831161076757829003601f168201915b5050505050905090565b60965460009074010000000000000000000000000000000000000000900460ff16156107e6576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b03166108115760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561085b57604051630165e89360e11b81526001600160a01b03821660048201526024015b60405180910390fd5b60c85484906001600160a01b03166108865760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff16156108cb57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6108d63386866129d8565b506001949350505050565b603154610100900460ff16610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610852565b609680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055565b60c8546001600160a01b031633146109e6576040517f8062a71100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff16610a43576040517f403a94570000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610852565b6001600160a01b038116600081815260c96020526040808220805460ff19169055517f117e3210bb9aa7d9baff172026820255c6f6c30ba8999d1c2fd88e2848137c4e9190a250565b60965460009074010000000000000000000000000000000000000000900460ff1615610ae4576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316610b0f5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610b5457604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85485906001600160a01b0316610b7f5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610bc457604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85485906001600160a01b0316610bef5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610c3457604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6001600160a01b038716600090815261013460209081526040808320338452909152902054851115610c92576040517fc45cb51300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c9d878787612ab2565b6001600160a01b03871660009081526101346020908152604080832033845290915281208054879290610cd190849061336d565b90915550600198975050505050505050565b6064546001600160a01b03163314610d27576040517fd265da0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116610d67576040517f3e17108f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60fb80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a250565b610131546000906001600160a01b03163314610e11576040517fd5295ad100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216600081815261013560209081526040808320805460ff19169055610136909152808220829055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a25060015b919050565b60965460009074010000000000000000000000000000000000000000900460ff1615610ec7576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316610ef25760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610f3757604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b0316610f625760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610fa757604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b336000818152610134602090815260408083206001600160a01b038a168452909152902054610fe49082908890610fdf908990613384565b6129d8565b50600195945050505050565b6096546001600160a01b03163314611034576040517fe9b37cc700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60965474010000000000000000000000000000000000000000900460ff16611088576040517ff2bafdf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b60965460009074010000000000000000000000000000000000000000900460ff1615611133576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152610135602052604090205460ff1661117d576040517ff8d2906c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b03166111a85760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff16156111ed57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b03166112185760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561125d57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6001600160a01b03851661129d576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084116112d7576040517faf37b7a700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03861614611319576040517f35a84f2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0385166000908152610136602052604090205484111561136c576040517fc45cb51300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83610132600082825461137f9190613384565b90915550506001600160a01b03851660009081526101336020526040812080548692906113ad908490613384565b90915550506001600160a01b03851660009081526101366020526040812080548692906113db90849061336d565b90915550506040518481526001600160a01b0386169033907fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f89060200160405180910390a36040518481526001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3506001949350505050565b60965474010000000000000000000000000000000000000000900460ff16156114c1576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152610135602052604090205460ff1661150b576040517ff8d2906c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b03166115365760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561157b57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b3360009081526101336020526040902054826115c3576040517fdae7e6ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828110156115fd576040517f96ab19c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826101326000828254611610919061336d565b909155505033600090815261013360205260408120805485929061163590849061336d565b909155505060405183815233907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59060200160405180910390a260405183815260009033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050565b60965460009074010000000000000000000000000000000000000000900460ff1615611705576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610131546001600160a01b0316331461174a576040517fd5295ad100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316600081815261013560209081526040808320805460ff1916600117905561013682529182902085905590518481527f46980fca912ef9bcdbd36877427b6b90e860769f604e89c0e67720cece530d20910160405180910390a250600192915050565b6064546001600160a01b031633146117fa576040517fd265da0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811661183a576040517fcede3fa000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fb80482a293ca2e013eda8683c9bd7fc8347cfdaeea5ede58cba46df502c2a60490600090a250565b6032546001600160a01b031633146118e0576040517f2f89af8300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60318054603254620100006001600160a01b0391821681027fffffffffffffffffffff0000000000000000000000000000000000000000ffff84161790935591900416603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556031546040516001600160a01b03620100009092048216918316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6096546001600160a01b031633146119d3576040517fe9b37cc700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60965474010000000000000000000000000000000000000000900460ff1615611a28576040517f51a5370e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b606061012e805461070b906132ea565b6031546201000090046001600160a01b03163314611aec576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611b2c576040517f1517f65300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517f5a2812dc793378f68745c08c12995c38c2c2487fe9d0fa1badc4fe834f591b2490600090a250565b60965460009074010000000000000000000000000000000000000000900460ff1615611be6576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316611c115760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611c5657604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b0316611c815760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611cc657604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b336000818152610134602090815260408083206001600160a01b038a16845290915290205485811015611d46576040517f35e0a1250000000000000000000000000000000000000000000000000000000081526001600160a01b038084166004830152881660248201526044810182905260648101879052608401610852565b611d558288610fdf898561336d565b5060019695505050505050565b60965460009074010000000000000000000000000000000000000000900460ff1615611dba576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316611de55760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611e2a57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b0316611e555760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611e9a57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6108d6338686612ab2565b6031546201000090046001600160a01b03163314611eef576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611f2f576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61013180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fdb66dfa9c6b8f5226fe9aac7e51897ae8ee94ac31dc70bb6c9900b2574b707e690600090a250565b6064546001600160a01b03163314611fd6576040517fd265da0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611ffd5760405163b7d260ed60e01b815260040160405180910390fd5b60c880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fc67398012c111ce95ecb7429b933096c977380ee6c421175a71a4a4c6c88c06e90600090a250565b60fb546001600160a01b031633146120a3576040517f933efdd000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120b76001600160a01b0384168383612c28565b505050565b603154610100900460ff16158080156120dc5750603154600160ff909116105b806120f65750303b1580156120f6575060315460ff166001145b612182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610852565b6031805460ff1916600117905580156121c257603180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6121cb336124db565b6121d36108e1565b6001600160a01b038516612213576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416612253576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316612293576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166122d3576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122e061012d8d8d612f85565b506122ee61012e8b8b612f85565b506122fc6101308989612f85565b5061012f805460ff191660ff881617905561013180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b0388811691821790935560968054831688851617905560c88054831687851617905560fb80549092169285169290921790556040517fb309eb87a246e87330262e01f9d27364d7f2206fb1d5e421998090fcde32d34390600090a26040516001600160a01b038516907f4f68150eb56c53cc9373649e35bc37dd235a0c86e10aa23b8a835378136ac6a090600090a26040516001600160a01b038416907f5b7763c24622d383825c557446231d7c64358877092e307e719a8e7d22d7e30b90600090a260405160ff871681527f6d3352c892c287855203cb74eff23be26064d1777da8ad03c1ddb3450fba67659060200160405180910390a16040516001600160a01b038316907fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a280156124cd57603180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050505050565b603154610100900460ff16612572576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610852565b603180547fffffffffffffffffffff0000000000000000000000000000000000000000ffff16620100006001600160a01b0384160217905550565b50565b61013080546125be906132ea565b80601f01602080910402602001604051908101604052809291908181526020018280546125ea906132ea565b80156126375780601f1061260c57610100808354040283529160200191612637565b820191906000526020600020905b81548152906001019060200180831161261a57829003601f168201915b505050505081565b6031546201000090046001600160a01b03163314612689576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166126c9576040517f8df7153f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560315460405191926201000090910416907f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270090600090a350565b6031546201000090046001600160a01b03163314612784576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff166127d6576040517fa57ed36800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166000908152610133602052604090205480612827576040517f669567ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610132600082825461283a919061336d565b90915550506001600160a01b038216600081815261013360209081526040808320839055518481529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60c8546001600160a01b031633146128d8576040517f8062a71100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561291d57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c8546001600160a01b0382811691161415612965576040517f6982a42c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811661298c5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600081815260c96020526040808220805460ff19166001179055517fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b8559190a250565b6001600160a01b038316612a18576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216612a58576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038381166000818152610134602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591016116a0565b6001600160a01b038316612af2576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216612b32576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03831660009081526101336020526040902054811115612b85576040517f96ab19c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152610133602052604081208054839290612bae90849061336d565b90915550506001600160a01b0382166000908152610133602052604081208054839290612bdc908490613384565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116a091815260200190565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526120b792869291600091612ce6918516908490612d93565b9050805160001480612d07575080806020019051810190612d07919061339c565b6120b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610852565b6060612da28484600085612daa565b949350505050565b606082471015612e3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610852565b600080866001600160a01b03168587604051612e5891906133be565b60006040518083038185875af1925050503d8060008114612e95576040519150601f19603f3d011682016040523d82523d6000602084013e612e9a565b606091505b5091509150612eab87838387612eb6565b979650505050505050565b60608315612f3c578251612f35576001600160a01b0385163b612f35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610852565b5081612da2565b612da28383815115612f515781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610852919061304e565b828054612f91906132ea565b90600052602060002090601f016020900481019282612fb35760008555612ff9565b82601f10612fcc5782800160ff19823516178555612ff9565b82800160010185558215612ff9579182015b82811115612ff9578235825591602001919060010190612fde565b50613005929150613009565b5090565b5b80821115613005576000815560010161300a565b60005b83811015613039578181015183820152602001613021565b83811115613048576000848401525b50505050565b602081526000825180602084015261306d81604085016020870161301e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6001600160a01b03811681146125ad57600080fd5b8035610e6a8161309f565b600080604083850312156130d257600080fd5b82356130dd8161309f565b946020939093013593505050565b6000602082840312156130fd57600080fd5b81356131088161309f565b9392505050565b60008060006060848603121561312457600080fd5b833561312f8161309f565b9250602084013561313f8161309f565b929592945050506040919091013590565b60006020828403121561316257600080fd5b5035919050565b60008083601f84011261317b57600080fd5b50813567ffffffffffffffff81111561319357600080fd5b6020830191508360208285010111156131ab57600080fd5b9250929050565b803560ff81168114610e6a57600080fd5b60008060008060008060008060008060006101008c8e0312156131e557600080fd5b67ffffffffffffffff808d3511156131fc57600080fd5b6132098e8e358f01613169565b909c509a5060208d013581101561321f57600080fd5b61322f8e60208f01358f01613169565b909a50985060408d013581101561324557600080fd5b506132568d60408e01358e01613169565b909750955061326760608d016131b2565b945061327560808d016130b4565b935061328360a08d016130b4565b925061329160c08d016130b4565b915061329f60e08d016130b4565b90509295989b509295989b9093969950565b600080604083850312156132c457600080fd5b82356132cf8161309f565b915060208301356132df8161309f565b809150509250929050565b600181811c908216806132fe57607f821691505b60208210811415613338577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561337f5761337f61333e565b500390565b600082198211156133975761339761333e565b500190565b6000602082840312156133ae57600080fd5b8151801515811461310857600080fd5b600082516133d081846020870161301e565b919091019291505056fea264697066735822122036ecfbca8451d816ca219c19221f8a63dbbf4f98ad8d6f9106ba8881660fd56f64736f6c634300080b0033","recompiledBytecode":"0x608060405234801561001057600080fd5b50613410806100206000396000f3fe608060405234801561001057600080fd5b50600436106102ff5760003560e01c806379ba50971161019c578063ad38bf22116100ee578063dd62ed3e11610097578063f6ee1d8811610071578063f6ee1d88146106a9578063f9f92be4146106bc578063fe575a87146106cf57600080fd5b8063dd62ed3e14610654578063e5a6b10f1461068e578063f2fde38b1461069657600080fd5b8063c4d66de8116100c8578063c4d66de81461060d578063d3b3f8d414610620578063dbac26e91461063157600080fd5b8063ad38bf22146105d4578063b2118a8d146105e7578063bdd6265a146105fa57600080fd5b806395d89b4111610150578063a9059cbb1161012a578063a9059cbb1461058a578063aa20e1e41461059d578063aa271e1a146105b057600080fd5b806395d89b411461055c5780639f50d7d114610564578063a457c2d71461057757600080fd5b8063893d20e811610181578063893d20e8146105135780638a6db9c31461052a57806393596c7b1461054b57600080fd5b806379ba5097146105035780638456cb591461050b57600080fd5b806339509351116102555780634e44d956116102095780636ae8d6c8116101e35780636ae8d6c81461049e5780637008b548146104c857806370a08231146104d957600080fd5b80634e44d95614610453578063554bab3c146104665780635c975abb1461047957600080fd5b80633f4ba83a1161023a5780633f4ba83a1461042557806340c10f191461042d57806342966c681461044057600080fd5b806339509351146104015780633f02ebc41461041457600080fd5b806323b872dd116102b7578063313ce56711610291578063313ce567146103ae57806335d99f35146103c457806338a63183146103f057600080fd5b806323b872dd146103755780632ab60045146103885780633092afd51461039b57600080fd5b80630d96bcdb116102e85780630d96bcdb1461034557806318160ddd1461034f5780631a8952661461036257600080fd5b806306fdde0314610304578063095ea7b314610322575b600080fd5b61030c6106fb565b604051610319919061304e565b60405180910390f35b6103356103303660046130bf565b61078e565b6040519015158152602001610319565b61034d6108e1565b005b610132545b604051908152602001610319565b61034d6103703660046130eb565b6109a2565b61033561038336600461310f565b610a8c565b61034d6103963660046130eb565b610ce3565b6103356103a93660046130eb565b610dc9565b61012f5460405160ff9091168152602001610319565b610131546103d8906001600160a01b031681565b6040516001600160a01b039091168152602001610319565b60fb546001600160a01b03166103d8565b61033561040f3660046130bf565b610e6f565b6064546001600160a01b03166103d8565b61034d610ff0565b61033561043b3660046130bf565b6110db565b61034d61044e366004613150565b61146c565b6103356104613660046130bf565b6116ad565b61034d6104743660046130eb565b6117b6565b6096546103359074010000000000000000000000000000000000000000900460ff1681565b6103546104ac3660046130eb565b6001600160a01b03166000908152610136602052604090205490565b6096546001600160a01b03166103d8565b6103546104e73660046130eb565b6001600160a01b03166000908152610133602052604090205490565b61034d61189c565b61034d61198f565b6031546201000090046001600160a01b03166103d8565b6103546105383660046130eb565b6101366020526000908152604090205481565b6032546001600160a01b03166103d8565b61030c611a92565b61034d6105723660046130eb565b611aa2565b6103356105853660046130bf565b611b8e565b6103356105983660046130bf565b611d62565b61034d6105ab3660046130eb565b611ea5565b6103356105be3660046130eb565b6101356020526000908152604090205460ff1681565b61034d6105e23660046130eb565b611f92565b61034d6105f536600461310f565b61205f565b61034d6106083660046131c3565b6120bc565b61034d61061b3660046130eb565b6124db565b60c8546001600160a01b03166103d8565b61033561063f3660046130eb565b60c96020526000908152604090205460ff1681565b6103546106623660046132b1565b6001600160a01b0391821660009081526101346020908152604080832093909416825291909152205490565b61030c6125b0565b61034d6106a43660046130eb565b61263f565b61034d6106b73660046130eb565b61273a565b61034d6106ca3660046130eb565b612894565b6103356106dd3660046130eb565b6001600160a01b0316600090815260c9602052604090205460ff1690565b606061012d805461070b906132ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610737906132ea565b80156107845780601f1061075957610100808354040283529160200191610784565b820191906000526020600020905b81548152906001019060200180831161076757829003601f168201915b5050505050905090565b60965460009074010000000000000000000000000000000000000000900460ff16156107e6576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b03166108115760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561085b57604051630165e89360e11b81526001600160a01b03821660048201526024015b60405180910390fd5b60c85484906001600160a01b03166108865760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff16156108cb57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6108d63386866129d8565b506001949350505050565b603154610100900460ff16610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610852565b609680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055565b60c8546001600160a01b031633146109e6576040517f8062a71100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff16610a43576040517f403a94570000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610852565b6001600160a01b038116600081815260c96020526040808220805460ff19169055517f117e3210bb9aa7d9baff172026820255c6f6c30ba8999d1c2fd88e2848137c4e9190a250565b60965460009074010000000000000000000000000000000000000000900460ff1615610ae4576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316610b0f5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610b5457604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85485906001600160a01b0316610b7f5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610bc457604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85485906001600160a01b0316610bef5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610c3457604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6001600160a01b038716600090815261013460209081526040808320338452909152902054851115610c92576040517fc45cb51300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c9d878787612ab2565b6001600160a01b03871660009081526101346020908152604080832033845290915281208054879290610cd190849061336d565b90915550600198975050505050505050565b6064546001600160a01b03163314610d27576040517fd265da0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116610d67576040517f3e17108f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60fb80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a250565b610131546000906001600160a01b03163314610e11576040517fd5295ad100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216600081815261013560209081526040808320805460ff19169055610136909152808220829055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a25060015b919050565b60965460009074010000000000000000000000000000000000000000900460ff1615610ec7576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316610ef25760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610f3757604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b0316610f625760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610fa757604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b336000818152610134602090815260408083206001600160a01b038a168452909152902054610fe49082908890610fdf908990613384565b6129d8565b50600195945050505050565b6096546001600160a01b03163314611034576040517fe9b37cc700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60965474010000000000000000000000000000000000000000900460ff16611088576040517ff2bafdf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b60965460009074010000000000000000000000000000000000000000900460ff1615611133576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152610135602052604090205460ff1661117d576040517ff8d2906c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b03166111a85760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff16156111ed57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b03166112185760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561125d57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6001600160a01b03851661129d576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084116112d7576040517faf37b7a700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03861614611319576040517f35a84f2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0385166000908152610136602052604090205484111561136c576040517fc45cb51300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83610132600082825461137f9190613384565b90915550506001600160a01b03851660009081526101336020526040812080548692906113ad908490613384565b90915550506001600160a01b03851660009081526101366020526040812080548692906113db90849061336d565b90915550506040518481526001600160a01b0386169033907fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f89060200160405180910390a36040518481526001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3506001949350505050565b60965474010000000000000000000000000000000000000000900460ff16156114c1576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152610135602052604090205460ff1661150b576040517ff8d2906c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b03166115365760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561157b57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b3360009081526101336020526040902054826115c3576040517fdae7e6ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828110156115fd576040517f96ab19c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826101326000828254611610919061336d565b909155505033600090815261013360205260408120805485929061163590849061336d565b909155505060405183815233907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59060200160405180910390a260405183815260009033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050565b60965460009074010000000000000000000000000000000000000000900460ff1615611705576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610131546001600160a01b0316331461174a576040517fd5295ad100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316600081815261013560209081526040808320805460ff1916600117905561013682529182902085905590518481527f46980fca912ef9bcdbd36877427b6b90e860769f604e89c0e67720cece530d20910160405180910390a250600192915050565b6064546001600160a01b031633146117fa576040517fd265da0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811661183a576040517fcede3fa000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fb80482a293ca2e013eda8683c9bd7fc8347cfdaeea5ede58cba46df502c2a60490600090a250565b6032546001600160a01b031633146118e0576040517f2f89af8300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60318054603254620100006001600160a01b0391821681027fffffffffffffffffffff0000000000000000000000000000000000000000ffff84161790935591900416603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556031546040516001600160a01b03620100009092048216918316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6096546001600160a01b031633146119d3576040517fe9b37cc700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60965474010000000000000000000000000000000000000000900460ff1615611a28576040517f51a5370e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b606061012e805461070b906132ea565b6031546201000090046001600160a01b03163314611aec576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611b2c576040517f1517f65300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517f5a2812dc793378f68745c08c12995c38c2c2487fe9d0fa1badc4fe834f591b2490600090a250565b60965460009074010000000000000000000000000000000000000000900460ff1615611be6576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316611c115760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611c5657604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b0316611c815760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611cc657604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b336000818152610134602090815260408083206001600160a01b038a16845290915290205485811015611d46576040517f35e0a1250000000000000000000000000000000000000000000000000000000081526001600160a01b038084166004830152881660248201526044810182905260648101879052608401610852565b611d558288610fdf898561336d565b5060019695505050505050565b60965460009074010000000000000000000000000000000000000000900460ff1615611dba576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316611de55760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611e2a57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b0316611e555760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611e9a57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6108d6338686612ab2565b6031546201000090046001600160a01b03163314611eef576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611f2f576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61013180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fdb66dfa9c6b8f5226fe9aac7e51897ae8ee94ac31dc70bb6c9900b2574b707e690600090a250565b6064546001600160a01b03163314611fd6576040517fd265da0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611ffd5760405163b7d260ed60e01b815260040160405180910390fd5b60c880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fc67398012c111ce95ecb7429b933096c977380ee6c421175a71a4a4c6c88c06e90600090a250565b60fb546001600160a01b031633146120a3576040517f933efdd000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120b76001600160a01b0384168383612c28565b505050565b603154610100900460ff16158080156120dc5750603154600160ff909116105b806120f65750303b1580156120f6575060315460ff166001145b612182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610852565b6031805460ff1916600117905580156121c257603180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6121cb336124db565b6121d36108e1565b6001600160a01b038516612213576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416612253576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316612293576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166122d3576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122e061012d8d8d612f85565b506122ee61012e8b8b612f85565b506122fc6101308989612f85565b5061012f805460ff191660ff881617905561013180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b0388811691821790935560968054831688851617905560c88054831687851617905560fb80549092169285169290921790556040517fb309eb87a246e87330262e01f9d27364d7f2206fb1d5e421998090fcde32d34390600090a26040516001600160a01b038516907f4f68150eb56c53cc9373649e35bc37dd235a0c86e10aa23b8a835378136ac6a090600090a26040516001600160a01b038416907f5b7763c24622d383825c557446231d7c64358877092e307e719a8e7d22d7e30b90600090a260405160ff871681527f6d3352c892c287855203cb74eff23be26064d1777da8ad03c1ddb3450fba67659060200160405180910390a16040516001600160a01b038316907fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a280156124cd57603180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050505050565b603154610100900460ff16612572576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610852565b603180547fffffffffffffffffffff0000000000000000000000000000000000000000ffff16620100006001600160a01b0384160217905550565b50565b61013080546125be906132ea565b80601f01602080910402602001604051908101604052809291908181526020018280546125ea906132ea565b80156126375780601f1061260c57610100808354040283529160200191612637565b820191906000526020600020905b81548152906001019060200180831161261a57829003601f168201915b505050505081565b6031546201000090046001600160a01b03163314612689576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166126c9576040517f8df7153f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560315460405191926201000090910416907f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270090600090a350565b6031546201000090046001600160a01b03163314612784576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff166127d6576040517fa57ed36800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166000908152610133602052604090205480612827576040517f669567ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610132600082825461283a919061336d565b90915550506001600160a01b038216600081815261013360209081526040808320839055518481529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60c8546001600160a01b031633146128d8576040517f8062a71100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561291d57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c8546001600160a01b0382811691161415612965576040517f6982a42c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811661298c5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600081815260c96020526040808220805460ff19166001179055517fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b8559190a250565b6001600160a01b038316612a18576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216612a58576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038381166000818152610134602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591016116a0565b6001600160a01b038316612af2576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216612b32576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03831660009081526101336020526040902054811115612b85576040517f96ab19c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152610133602052604081208054839290612bae90849061336d565b90915550506001600160a01b0382166000908152610133602052604081208054839290612bdc908490613384565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116a091815260200190565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526120b792869291600091612ce6918516908490612d93565b9050805160001480612d07575080806020019051810190612d07919061339c565b6120b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610852565b6060612da28484600085612daa565b949350505050565b606082471015612e3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610852565b600080866001600160a01b03168587604051612e5891906133be565b60006040518083038185875af1925050503d8060008114612e95576040519150601f19603f3d011682016040523d82523d6000602084013e612e9a565b606091505b5091509150612eab87838387612eb6565b979650505050505050565b60608315612f3c578251612f35576001600160a01b0385163b612f35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610852565b5081612da2565b612da28383815115612f515781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610852919061304e565b828054612f91906132ea565b90600052602060002090601f016020900481019282612fb35760008555612ff9565b82601f10612fcc5782800160ff19823516178555612ff9565b82800160010185558215612ff9579182015b82811115612ff9578235825591602001919060010190612fde565b50613005929150613009565b5090565b5b80821115613005576000815560010161300a565b60005b83811015613039578181015183820152602001613021565b83811115613048576000848401525b50505050565b602081526000825180602084015261306d81604085016020870161301e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6001600160a01b03811681146125ad57600080fd5b8035610e6a8161309f565b600080604083850312156130d257600080fd5b82356130dd8161309f565b946020939093013593505050565b6000602082840312156130fd57600080fd5b81356131088161309f565b9392505050565b60008060006060848603121561312457600080fd5b833561312f8161309f565b9250602084013561313f8161309f565b929592945050506040919091013590565b60006020828403121561316257600080fd5b5035919050565b60008083601f84011261317b57600080fd5b50813567ffffffffffffffff81111561319357600080fd5b6020830191508360208285010111156131ab57600080fd5b9250929050565b803560ff81168114610e6a57600080fd5b60008060008060008060008060008060006101008c8e0312156131e557600080fd5b67ffffffffffffffff808d3511156131fc57600080fd5b6132098e8e358f01613169565b909c509a5060208d013581101561321f57600080fd5b61322f8e60208f01358f01613169565b909a50985060408d013581101561324557600080fd5b506132568d60408e01358e01613169565b909750955061326760608d016131b2565b945061327560808d016130b4565b935061328360a08d016130b4565b925061329160c08d016130b4565b915061329f60e08d016130b4565b90509295989b509295989b9093969950565b600080604083850312156132c457600080fd5b82356132cf8161309f565b915060208301356132df8161309f565b809150509250929050565b600181811c908216806132fe57607f821691505b60208210811415613338577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561337f5761337f61333e565b500390565b600082198211156133975761339761333e565b500190565b6000602082840312156133ae57600080fd5b8151801515811461310857600080fd5b600082516133d081846020870161301e565b919091019291505056fea264697066735822122036ecfbca8451d816ca219c19221f8a63dbbf4f98ad8d6f9106ba8881660fd56f64736f6c634300080b0033","sourceMap":"623:15436:13:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa264697066735822122036ecfbca8451d816ca219c19221f8a63dbbf4f98ad8d6f9106ba8881660fd56f64736f6c634300080b0033","offset":13307}},"transformations":[],"transformationValues":{}},"runtimeBytecode":{"onchainBytecode":"0x608060405234801561001057600080fd5b50600436106102ff5760003560e01c806379ba50971161019c578063ad38bf22116100ee578063dd62ed3e11610097578063f6ee1d8811610071578063f6ee1d88146106a9578063f9f92be4146106bc578063fe575a87146106cf57600080fd5b8063dd62ed3e14610654578063e5a6b10f1461068e578063f2fde38b1461069657600080fd5b8063c4d66de8116100c8578063c4d66de81461060d578063d3b3f8d414610620578063dbac26e91461063157600080fd5b8063ad38bf22146105d4578063b2118a8d146105e7578063bdd6265a146105fa57600080fd5b806395d89b4111610150578063a9059cbb1161012a578063a9059cbb1461058a578063aa20e1e41461059d578063aa271e1a146105b057600080fd5b806395d89b411461055c5780639f50d7d114610564578063a457c2d71461057757600080fd5b8063893d20e811610181578063893d20e8146105135780638a6db9c31461052a57806393596c7b1461054b57600080fd5b806379ba5097146105035780638456cb591461050b57600080fd5b806339509351116102555780634e44d956116102095780636ae8d6c8116101e35780636ae8d6c81461049e5780637008b548146104c857806370a08231146104d957600080fd5b80634e44d95614610453578063554bab3c146104665780635c975abb1461047957600080fd5b80633f4ba83a1161023a5780633f4ba83a1461042557806340c10f191461042d57806342966c681461044057600080fd5b806339509351146104015780633f02ebc41461041457600080fd5b806323b872dd116102b7578063313ce56711610291578063313ce567146103ae57806335d99f35146103c457806338a63183146103f057600080fd5b806323b872dd146103755780632ab60045146103885780633092afd51461039b57600080fd5b80630d96bcdb116102e85780630d96bcdb1461034557806318160ddd1461034f5780631a8952661461036257600080fd5b806306fdde0314610304578063095ea7b314610322575b600080fd5b61030c6106fb565b604051610319919061304e565b60405180910390f35b6103356103303660046130bf565b61078e565b6040519015158152602001610319565b61034d6108e1565b005b610132545b604051908152602001610319565b61034d6103703660046130eb565b6109a2565b61033561038336600461310f565b610a8c565b61034d6103963660046130eb565b610ce3565b6103356103a93660046130eb565b610dc9565b61012f5460405160ff9091168152602001610319565b610131546103d8906001600160a01b031681565b6040516001600160a01b039091168152602001610319565b60fb546001600160a01b03166103d8565b61033561040f3660046130bf565b610e6f565b6064546001600160a01b03166103d8565b61034d610ff0565b61033561043b3660046130bf565b6110db565b61034d61044e366004613150565b61146c565b6103356104613660046130bf565b6116ad565b61034d6104743660046130eb565b6117b6565b6096546103359074010000000000000000000000000000000000000000900460ff1681565b6103546104ac3660046130eb565b6001600160a01b03166000908152610136602052604090205490565b6096546001600160a01b03166103d8565b6103546104e73660046130eb565b6001600160a01b03166000908152610133602052604090205490565b61034d61189c565b61034d61198f565b6031546201000090046001600160a01b03166103d8565b6103546105383660046130eb565b6101366020526000908152604090205481565b6032546001600160a01b03166103d8565b61030c611a92565b61034d6105723660046130eb565b611aa2565b6103356105853660046130bf565b611b8e565b6103356105983660046130bf565b611d62565b61034d6105ab3660046130eb565b611ea5565b6103356105be3660046130eb565b6101356020526000908152604090205460ff1681565b61034d6105e23660046130eb565b611f92565b61034d6105f536600461310f565b61205f565b61034d6106083660046131c3565b6120bc565b61034d61061b3660046130eb565b6124db565b60c8546001600160a01b03166103d8565b61033561063f3660046130eb565b60c96020526000908152604090205460ff1681565b6103546106623660046132b1565b6001600160a01b0391821660009081526101346020908152604080832093909416825291909152205490565b61030c6125b0565b61034d6106a43660046130eb565b61263f565b61034d6106b73660046130eb565b61273a565b61034d6106ca3660046130eb565b612894565b6103356106dd3660046130eb565b6001600160a01b0316600090815260c9602052604090205460ff1690565b606061012d805461070b906132ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610737906132ea565b80156107845780601f1061075957610100808354040283529160200191610784565b820191906000526020600020905b81548152906001019060200180831161076757829003601f168201915b5050505050905090565b60965460009074010000000000000000000000000000000000000000900460ff16156107e6576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b03166108115760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561085b57604051630165e89360e11b81526001600160a01b03821660048201526024015b60405180910390fd5b60c85484906001600160a01b03166108865760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff16156108cb57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6108d63386866129d8565b506001949350505050565b603154610100900460ff16610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610852565b609680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055565b60c8546001600160a01b031633146109e6576040517f8062a71100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff16610a43576040517f403a94570000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610852565b6001600160a01b038116600081815260c96020526040808220805460ff19169055517f117e3210bb9aa7d9baff172026820255c6f6c30ba8999d1c2fd88e2848137c4e9190a250565b60965460009074010000000000000000000000000000000000000000900460ff1615610ae4576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316610b0f5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610b5457604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85485906001600160a01b0316610b7f5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610bc457604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85485906001600160a01b0316610bef5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610c3457604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6001600160a01b038716600090815261013460209081526040808320338452909152902054851115610c92576040517fc45cb51300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c9d878787612ab2565b6001600160a01b03871660009081526101346020908152604080832033845290915281208054879290610cd190849061336d565b90915550600198975050505050505050565b6064546001600160a01b03163314610d27576040517fd265da0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116610d67576040517f3e17108f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60fb80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a250565b610131546000906001600160a01b03163314610e11576040517fd5295ad100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216600081815261013560209081526040808320805460ff19169055610136909152808220829055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a25060015b919050565b60965460009074010000000000000000000000000000000000000000900460ff1615610ec7576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316610ef25760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610f3757604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b0316610f625760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610fa757604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b336000818152610134602090815260408083206001600160a01b038a168452909152902054610fe49082908890610fdf908990613384565b6129d8565b50600195945050505050565b6096546001600160a01b03163314611034576040517fe9b37cc700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60965474010000000000000000000000000000000000000000900460ff16611088576040517ff2bafdf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b60965460009074010000000000000000000000000000000000000000900460ff1615611133576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152610135602052604090205460ff1661117d576040517ff8d2906c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b03166111a85760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff16156111ed57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b03166112185760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561125d57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6001600160a01b03851661129d576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084116112d7576040517faf37b7a700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03861614611319576040517f35a84f2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0385166000908152610136602052604090205484111561136c576040517fc45cb51300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83610132600082825461137f9190613384565b90915550506001600160a01b03851660009081526101336020526040812080548692906113ad908490613384565b90915550506001600160a01b03851660009081526101366020526040812080548692906113db90849061336d565b90915550506040518481526001600160a01b0386169033907fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f89060200160405180910390a36040518481526001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3506001949350505050565b60965474010000000000000000000000000000000000000000900460ff16156114c1576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152610135602052604090205460ff1661150b576040517ff8d2906c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b03166115365760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561157b57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b3360009081526101336020526040902054826115c3576040517fdae7e6ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828110156115fd576040517f96ab19c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826101326000828254611610919061336d565b909155505033600090815261013360205260408120805485929061163590849061336d565b909155505060405183815233907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59060200160405180910390a260405183815260009033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050565b60965460009074010000000000000000000000000000000000000000900460ff1615611705576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610131546001600160a01b0316331461174a576040517fd5295ad100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316600081815261013560209081526040808320805460ff1916600117905561013682529182902085905590518481527f46980fca912ef9bcdbd36877427b6b90e860769f604e89c0e67720cece530d20910160405180910390a250600192915050565b6064546001600160a01b031633146117fa576040517fd265da0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811661183a576040517fcede3fa000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fb80482a293ca2e013eda8683c9bd7fc8347cfdaeea5ede58cba46df502c2a60490600090a250565b6032546001600160a01b031633146118e0576040517f2f89af8300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60318054603254620100006001600160a01b0391821681027fffffffffffffffffffff0000000000000000000000000000000000000000ffff84161790935591900416603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556031546040516001600160a01b03620100009092048216918316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6096546001600160a01b031633146119d3576040517fe9b37cc700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60965474010000000000000000000000000000000000000000900460ff1615611a28576040517f51a5370e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b606061012e805461070b906132ea565b6031546201000090046001600160a01b03163314611aec576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611b2c576040517f1517f65300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517f5a2812dc793378f68745c08c12995c38c2c2487fe9d0fa1badc4fe834f591b2490600090a250565b60965460009074010000000000000000000000000000000000000000900460ff1615611be6576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316611c115760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611c5657604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b0316611c815760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611cc657604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b336000818152610134602090815260408083206001600160a01b038a16845290915290205485811015611d46576040517f35e0a1250000000000000000000000000000000000000000000000000000000081526001600160a01b038084166004830152881660248201526044810182905260648101879052608401610852565b611d558288610fdf898561336d565b5060019695505050505050565b60965460009074010000000000000000000000000000000000000000900460ff1615611dba576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316611de55760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611e2a57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b0316611e555760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611e9a57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6108d6338686612ab2565b6031546201000090046001600160a01b03163314611eef576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611f2f576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61013180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fdb66dfa9c6b8f5226fe9aac7e51897ae8ee94ac31dc70bb6c9900b2574b707e690600090a250565b6064546001600160a01b03163314611fd6576040517fd265da0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611ffd5760405163b7d260ed60e01b815260040160405180910390fd5b60c880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fc67398012c111ce95ecb7429b933096c977380ee6c421175a71a4a4c6c88c06e90600090a250565b60fb546001600160a01b031633146120a3576040517f933efdd000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120b76001600160a01b0384168383612c28565b505050565b603154610100900460ff16158080156120dc5750603154600160ff909116105b806120f65750303b1580156120f6575060315460ff166001145b612182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610852565b6031805460ff1916600117905580156121c257603180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6121cb336124db565b6121d36108e1565b6001600160a01b038516612213576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416612253576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316612293576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166122d3576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122e061012d8d8d612f85565b506122ee61012e8b8b612f85565b506122fc6101308989612f85565b5061012f805460ff191660ff881617905561013180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b0388811691821790935560968054831688851617905560c88054831687851617905560fb80549092169285169290921790556040517fb309eb87a246e87330262e01f9d27364d7f2206fb1d5e421998090fcde32d34390600090a26040516001600160a01b038516907f4f68150eb56c53cc9373649e35bc37dd235a0c86e10aa23b8a835378136ac6a090600090a26040516001600160a01b038416907f5b7763c24622d383825c557446231d7c64358877092e307e719a8e7d22d7e30b90600090a260405160ff871681527f6d3352c892c287855203cb74eff23be26064d1777da8ad03c1ddb3450fba67659060200160405180910390a16040516001600160a01b038316907fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a280156124cd57603180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050505050565b603154610100900460ff16612572576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610852565b603180547fffffffffffffffffffff0000000000000000000000000000000000000000ffff16620100006001600160a01b0384160217905550565b50565b61013080546125be906132ea565b80601f01602080910402602001604051908101604052809291908181526020018280546125ea906132ea565b80156126375780601f1061260c57610100808354040283529160200191612637565b820191906000526020600020905b81548152906001019060200180831161261a57829003601f168201915b505050505081565b6031546201000090046001600160a01b03163314612689576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166126c9576040517f8df7153f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560315460405191926201000090910416907f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270090600090a350565b6031546201000090046001600160a01b03163314612784576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff166127d6576040517fa57ed36800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166000908152610133602052604090205480612827576040517f669567ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610132600082825461283a919061336d565b90915550506001600160a01b038216600081815261013360209081526040808320839055518481529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60c8546001600160a01b031633146128d8576040517f8062a71100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561291d57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c8546001600160a01b0382811691161415612965576040517f6982a42c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811661298c5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600081815260c96020526040808220805460ff19166001179055517fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b8559190a250565b6001600160a01b038316612a18576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216612a58576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038381166000818152610134602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591016116a0565b6001600160a01b038316612af2576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216612b32576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03831660009081526101336020526040902054811115612b85576040517f96ab19c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152610133602052604081208054839290612bae90849061336d565b90915550506001600160a01b0382166000908152610133602052604081208054839290612bdc908490613384565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116a091815260200190565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526120b792869291600091612ce6918516908490612d93565b9050805160001480612d07575080806020019051810190612d07919061339c565b6120b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610852565b6060612da28484600085612daa565b949350505050565b606082471015612e3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610852565b600080866001600160a01b03168587604051612e5891906133be565b60006040518083038185875af1925050503d8060008114612e95576040519150601f19603f3d011682016040523d82523d6000602084013e612e9a565b606091505b5091509150612eab87838387612eb6565b979650505050505050565b60608315612f3c578251612f35576001600160a01b0385163b612f35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610852565b5081612da2565b612da28383815115612f515781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610852919061304e565b828054612f91906132ea565b90600052602060002090601f016020900481019282612fb35760008555612ff9565b82601f10612fcc5782800160ff19823516178555612ff9565b82800160010185558215612ff9579182015b82811115612ff9578235825591602001919060010190612fde565b50613005929150613009565b5090565b5b80821115613005576000815560010161300a565b60005b83811015613039578181015183820152602001613021565b83811115613048576000848401525b50505050565b602081526000825180602084015261306d81604085016020870161301e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6001600160a01b03811681146125ad57600080fd5b8035610e6a8161309f565b600080604083850312156130d257600080fd5b82356130dd8161309f565b946020939093013593505050565b6000602082840312156130fd57600080fd5b81356131088161309f565b9392505050565b60008060006060848603121561312457600080fd5b833561312f8161309f565b9250602084013561313f8161309f565b929592945050506040919091013590565b60006020828403121561316257600080fd5b5035919050565b60008083601f84011261317b57600080fd5b50813567ffffffffffffffff81111561319357600080fd5b6020830191508360208285010111156131ab57600080fd5b9250929050565b803560ff81168114610e6a57600080fd5b60008060008060008060008060008060006101008c8e0312156131e557600080fd5b67ffffffffffffffff808d3511156131fc57600080fd5b6132098e8e358f01613169565b909c509a5060208d013581101561321f57600080fd5b61322f8e60208f01358f01613169565b909a50985060408d013581101561324557600080fd5b506132568d60408e01358e01613169565b909750955061326760608d016131b2565b945061327560808d016130b4565b935061328360a08d016130b4565b925061329160c08d016130b4565b915061329f60e08d016130b4565b90509295989b509295989b9093969950565b600080604083850312156132c457600080fd5b82356132cf8161309f565b915060208301356132df8161309f565b809150509250929050565b600181811c908216806132fe57607f821691505b60208210811415613338577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561337f5761337f61333e565b500390565b600082198211156133975761339761333e565b500190565b6000602082840312156133ae57600080fd5b8151801515811461310857600080fd5b600082516133d081846020870161301e565b919091019291505056fea264697066735822122036ecfbca8451d816ca219c19221f8a63dbbf4f98ad8d6f9106ba8881660fd56f64736f6c634300080b0033","recompiledBytecode":"0x608060405234801561001057600080fd5b50600436106102ff5760003560e01c806379ba50971161019c578063ad38bf22116100ee578063dd62ed3e11610097578063f6ee1d8811610071578063f6ee1d88146106a9578063f9f92be4146106bc578063fe575a87146106cf57600080fd5b8063dd62ed3e14610654578063e5a6b10f1461068e578063f2fde38b1461069657600080fd5b8063c4d66de8116100c8578063c4d66de81461060d578063d3b3f8d414610620578063dbac26e91461063157600080fd5b8063ad38bf22146105d4578063b2118a8d146105e7578063bdd6265a146105fa57600080fd5b806395d89b4111610150578063a9059cbb1161012a578063a9059cbb1461058a578063aa20e1e41461059d578063aa271e1a146105b057600080fd5b806395d89b411461055c5780639f50d7d114610564578063a457c2d71461057757600080fd5b8063893d20e811610181578063893d20e8146105135780638a6db9c31461052a57806393596c7b1461054b57600080fd5b806379ba5097146105035780638456cb591461050b57600080fd5b806339509351116102555780634e44d956116102095780636ae8d6c8116101e35780636ae8d6c81461049e5780637008b548146104c857806370a08231146104d957600080fd5b80634e44d95614610453578063554bab3c146104665780635c975abb1461047957600080fd5b80633f4ba83a1161023a5780633f4ba83a1461042557806340c10f191461042d57806342966c681461044057600080fd5b806339509351146104015780633f02ebc41461041457600080fd5b806323b872dd116102b7578063313ce56711610291578063313ce567146103ae57806335d99f35146103c457806338a63183146103f057600080fd5b806323b872dd146103755780632ab60045146103885780633092afd51461039b57600080fd5b80630d96bcdb116102e85780630d96bcdb1461034557806318160ddd1461034f5780631a8952661461036257600080fd5b806306fdde0314610304578063095ea7b314610322575b600080fd5b61030c6106fb565b604051610319919061304e565b60405180910390f35b6103356103303660046130bf565b61078e565b6040519015158152602001610319565b61034d6108e1565b005b610132545b604051908152602001610319565b61034d6103703660046130eb565b6109a2565b61033561038336600461310f565b610a8c565b61034d6103963660046130eb565b610ce3565b6103356103a93660046130eb565b610dc9565b61012f5460405160ff9091168152602001610319565b610131546103d8906001600160a01b031681565b6040516001600160a01b039091168152602001610319565b60fb546001600160a01b03166103d8565b61033561040f3660046130bf565b610e6f565b6064546001600160a01b03166103d8565b61034d610ff0565b61033561043b3660046130bf565b6110db565b61034d61044e366004613150565b61146c565b6103356104613660046130bf565b6116ad565b61034d6104743660046130eb565b6117b6565b6096546103359074010000000000000000000000000000000000000000900460ff1681565b6103546104ac3660046130eb565b6001600160a01b03166000908152610136602052604090205490565b6096546001600160a01b03166103d8565b6103546104e73660046130eb565b6001600160a01b03166000908152610133602052604090205490565b61034d61189c565b61034d61198f565b6031546201000090046001600160a01b03166103d8565b6103546105383660046130eb565b6101366020526000908152604090205481565b6032546001600160a01b03166103d8565b61030c611a92565b61034d6105723660046130eb565b611aa2565b6103356105853660046130bf565b611b8e565b6103356105983660046130bf565b611d62565b61034d6105ab3660046130eb565b611ea5565b6103356105be3660046130eb565b6101356020526000908152604090205460ff1681565b61034d6105e23660046130eb565b611f92565b61034d6105f536600461310f565b61205f565b61034d6106083660046131c3565b6120bc565b61034d61061b3660046130eb565b6124db565b60c8546001600160a01b03166103d8565b61033561063f3660046130eb565b60c96020526000908152604090205460ff1681565b6103546106623660046132b1565b6001600160a01b0391821660009081526101346020908152604080832093909416825291909152205490565b61030c6125b0565b61034d6106a43660046130eb565b61263f565b61034d6106b73660046130eb565b61273a565b61034d6106ca3660046130eb565b612894565b6103356106dd3660046130eb565b6001600160a01b0316600090815260c9602052604090205460ff1690565b606061012d805461070b906132ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610737906132ea565b80156107845780601f1061075957610100808354040283529160200191610784565b820191906000526020600020905b81548152906001019060200180831161076757829003601f168201915b5050505050905090565b60965460009074010000000000000000000000000000000000000000900460ff16156107e6576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b03166108115760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561085b57604051630165e89360e11b81526001600160a01b03821660048201526024015b60405180910390fd5b60c85484906001600160a01b03166108865760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff16156108cb57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6108d63386866129d8565b506001949350505050565b603154610100900460ff16610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610852565b609680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055565b60c8546001600160a01b031633146109e6576040517f8062a71100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff16610a43576040517f403a94570000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610852565b6001600160a01b038116600081815260c96020526040808220805460ff19169055517f117e3210bb9aa7d9baff172026820255c6f6c30ba8999d1c2fd88e2848137c4e9190a250565b60965460009074010000000000000000000000000000000000000000900460ff1615610ae4576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316610b0f5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610b5457604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85485906001600160a01b0316610b7f5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610bc457604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85485906001600160a01b0316610bef5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610c3457604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6001600160a01b038716600090815261013460209081526040808320338452909152902054851115610c92576040517fc45cb51300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c9d878787612ab2565b6001600160a01b03871660009081526101346020908152604080832033845290915281208054879290610cd190849061336d565b90915550600198975050505050505050565b6064546001600160a01b03163314610d27576040517fd265da0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116610d67576040517f3e17108f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60fb80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a250565b610131546000906001600160a01b03163314610e11576040517fd5295ad100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216600081815261013560209081526040808320805460ff19169055610136909152808220829055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a25060015b919050565b60965460009074010000000000000000000000000000000000000000900460ff1615610ec7576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316610ef25760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610f3757604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b0316610f625760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610fa757604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b336000818152610134602090815260408083206001600160a01b038a168452909152902054610fe49082908890610fdf908990613384565b6129d8565b50600195945050505050565b6096546001600160a01b03163314611034576040517fe9b37cc700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60965474010000000000000000000000000000000000000000900460ff16611088576040517ff2bafdf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b60965460009074010000000000000000000000000000000000000000900460ff1615611133576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152610135602052604090205460ff1661117d576040517ff8d2906c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b03166111a85760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff16156111ed57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b03166112185760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561125d57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6001600160a01b03851661129d576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084116112d7576040517faf37b7a700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03861614611319576040517f35a84f2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0385166000908152610136602052604090205484111561136c576040517fc45cb51300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83610132600082825461137f9190613384565b90915550506001600160a01b03851660009081526101336020526040812080548692906113ad908490613384565b90915550506001600160a01b03851660009081526101366020526040812080548692906113db90849061336d565b90915550506040518481526001600160a01b0386169033907fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f89060200160405180910390a36040518481526001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3506001949350505050565b60965474010000000000000000000000000000000000000000900460ff16156114c1576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152610135602052604090205460ff1661150b576040517ff8d2906c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b03166115365760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561157b57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b3360009081526101336020526040902054826115c3576040517fdae7e6ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828110156115fd576040517f96ab19c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826101326000828254611610919061336d565b909155505033600090815261013360205260408120805485929061163590849061336d565b909155505060405183815233907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59060200160405180910390a260405183815260009033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050565b60965460009074010000000000000000000000000000000000000000900460ff1615611705576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610131546001600160a01b0316331461174a576040517fd5295ad100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316600081815261013560209081526040808320805460ff1916600117905561013682529182902085905590518481527f46980fca912ef9bcdbd36877427b6b90e860769f604e89c0e67720cece530d20910160405180910390a250600192915050565b6064546001600160a01b031633146117fa576040517fd265da0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811661183a576040517fcede3fa000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fb80482a293ca2e013eda8683c9bd7fc8347cfdaeea5ede58cba46df502c2a60490600090a250565b6032546001600160a01b031633146118e0576040517f2f89af8300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60318054603254620100006001600160a01b0391821681027fffffffffffffffffffff0000000000000000000000000000000000000000ffff84161790935591900416603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556031546040516001600160a01b03620100009092048216918316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6096546001600160a01b031633146119d3576040517fe9b37cc700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60965474010000000000000000000000000000000000000000900460ff1615611a28576040517f51a5370e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b606061012e805461070b906132ea565b6031546201000090046001600160a01b03163314611aec576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611b2c576040517f1517f65300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517f5a2812dc793378f68745c08c12995c38c2c2487fe9d0fa1badc4fe834f591b2490600090a250565b60965460009074010000000000000000000000000000000000000000900460ff1615611be6576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316611c115760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611c5657604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b0316611c815760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611cc657604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b336000818152610134602090815260408083206001600160a01b038a16845290915290205485811015611d46576040517f35e0a1250000000000000000000000000000000000000000000000000000000081526001600160a01b038084166004830152881660248201526044810182905260648101879052608401610852565b611d558288610fdf898561336d565b5060019695505050505050565b60965460009074010000000000000000000000000000000000000000900460ff1615611dba576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316611de55760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611e2a57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b0316611e555760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611e9a57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6108d6338686612ab2565b6031546201000090046001600160a01b03163314611eef576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611f2f576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61013180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fdb66dfa9c6b8f5226fe9aac7e51897ae8ee94ac31dc70bb6c9900b2574b707e690600090a250565b6064546001600160a01b03163314611fd6576040517fd265da0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611ffd5760405163b7d260ed60e01b815260040160405180910390fd5b60c880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fc67398012c111ce95ecb7429b933096c977380ee6c421175a71a4a4c6c88c06e90600090a250565b60fb546001600160a01b031633146120a3576040517f933efdd000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120b76001600160a01b0384168383612c28565b505050565b603154610100900460ff16158080156120dc5750603154600160ff909116105b806120f65750303b1580156120f6575060315460ff166001145b612182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610852565b6031805460ff1916600117905580156121c257603180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6121cb336124db565b6121d36108e1565b6001600160a01b038516612213576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416612253576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316612293576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166122d3576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122e061012d8d8d612f85565b506122ee61012e8b8b612f85565b506122fc6101308989612f85565b5061012f805460ff191660ff881617905561013180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b0388811691821790935560968054831688851617905560c88054831687851617905560fb80549092169285169290921790556040517fb309eb87a246e87330262e01f9d27364d7f2206fb1d5e421998090fcde32d34390600090a26040516001600160a01b038516907f4f68150eb56c53cc9373649e35bc37dd235a0c86e10aa23b8a835378136ac6a090600090a26040516001600160a01b038416907f5b7763c24622d383825c557446231d7c64358877092e307e719a8e7d22d7e30b90600090a260405160ff871681527f6d3352c892c287855203cb74eff23be26064d1777da8ad03c1ddb3450fba67659060200160405180910390a16040516001600160a01b038316907fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a280156124cd57603180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050505050565b603154610100900460ff16612572576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610852565b603180547fffffffffffffffffffff0000000000000000000000000000000000000000ffff16620100006001600160a01b0384160217905550565b50565b61013080546125be906132ea565b80601f01602080910402602001604051908101604052809291908181526020018280546125ea906132ea565b80156126375780601f1061260c57610100808354040283529160200191612637565b820191906000526020600020905b81548152906001019060200180831161261a57829003601f168201915b505050505081565b6031546201000090046001600160a01b03163314612689576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166126c9576040517f8df7153f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560315460405191926201000090910416907f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270090600090a350565b6031546201000090046001600160a01b03163314612784576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff166127d6576040517fa57ed36800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166000908152610133602052604090205480612827576040517f669567ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610132600082825461283a919061336d565b90915550506001600160a01b038216600081815261013360209081526040808320839055518481529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60c8546001600160a01b031633146128d8576040517f8062a71100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561291d57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c8546001600160a01b0382811691161415612965576040517f6982a42c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811661298c5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600081815260c96020526040808220805460ff19166001179055517fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b8559190a250565b6001600160a01b038316612a18576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216612a58576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038381166000818152610134602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591016116a0565b6001600160a01b038316612af2576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216612b32576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03831660009081526101336020526040902054811115612b85576040517f96ab19c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152610133602052604081208054839290612bae90849061336d565b90915550506001600160a01b0382166000908152610133602052604081208054839290612bdc908490613384565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116a091815260200190565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526120b792869291600091612ce6918516908490612d93565b9050805160001480612d07575080806020019051810190612d07919061339c565b6120b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610852565b6060612da28484600085612daa565b949350505050565b606082471015612e3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610852565b600080866001600160a01b03168587604051612e5891906133be565b60006040518083038185875af1925050503d8060008114612e95576040519150601f19603f3d011682016040523d82523d6000602084013e612e9a565b606091505b5091509150612eab87838387612eb6565b979650505050505050565b60608315612f3c578251612f35576001600160a01b0385163b612f35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610852565b5081612da2565b612da28383815115612f515781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610852919061304e565b828054612f91906132ea565b90600052602060002090601f016020900481019282612fb35760008555612ff9565b82601f10612fcc5782800160ff19823516178555612ff9565b82800160010185558215612ff9579182015b82811115612ff9578235825591602001919060010190612fde565b50613005929150613009565b5090565b5b80821115613005576000815560010161300a565b60005b83811015613039578181015183820152602001613021565b83811115613048576000848401525b50505050565b602081526000825180602084015261306d81604085016020870161301e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6001600160a01b03811681146125ad57600080fd5b8035610e6a8161309f565b600080604083850312156130d257600080fd5b82356130dd8161309f565b946020939093013593505050565b6000602082840312156130fd57600080fd5b81356131088161309f565b9392505050565b60008060006060848603121561312457600080fd5b833561312f8161309f565b9250602084013561313f8161309f565b929592945050506040919091013590565b60006020828403121561316257600080fd5b5035919050565b60008083601f84011261317b57600080fd5b50813567ffffffffffffffff81111561319357600080fd5b6020830191508360208285010111156131ab57600080fd5b9250929050565b803560ff81168114610e6a57600080fd5b60008060008060008060008060008060006101008c8e0312156131e557600080fd5b67ffffffffffffffff808d3511156131fc57600080fd5b6132098e8e358f01613169565b909c509a5060208d013581101561321f57600080fd5b61322f8e60208f01358f01613169565b909a50985060408d013581101561324557600080fd5b506132568d60408e01358e01613169565b909750955061326760608d016131b2565b945061327560808d016130b4565b935061328360a08d016130b4565b925061329160c08d016130b4565b915061329f60e08d016130b4565b90509295989b509295989b9093969950565b600080604083850312156132c457600080fd5b82356132cf8161309f565b915060208301356132df8161309f565b809150509250929050565b600181811c908216806132fe57607f821691505b60208210811415613338577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561337f5761337f61333e565b500390565b600082198211156133975761339761333e565b500190565b6000602082840312156133ae57600080fd5b8151801515811461310857600080fd5b600082516133d081846020870161301e565b919091019291505056fea264697066735822122036ecfbca8451d816ca219c19221f8a63dbbf4f98ad8d6f9106ba8881660fd56f64736f6c634300080b0033","sourceMap":"623:15436:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6700:89;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8681:295;;;;;;:::i;:::-;;:::i;:::-;;;1507:14:14;;1500:22;1482:41;;1470:2;1455:18;8681:295:13;1342:187:14;2418:85:10;;;:::i;:::-;;8046:100:13;8127:12;;8046:100;;;1680:25:14;;;1668:2;1653:18;8046:100:13;1534:177:14;4033:233:8;;;;;;:::i;:::-;;:::i;9723:438:13:-;;;;;;:::i;:::-;;:::i;2193:224:12:-;;;;;;:::i;:::-;;:::i;11999:223:13:-;;;;;;:::i;:::-;;:::i;7154:89::-;7227:9;;7154:89;;7227:9;;;;2571:36:14;;2559:2;2544:18;7154:89:13;2429:184:14;848:27:13;;;;;-1:-1:-1;;;;;848:27:13;;;;;;-1:-1:-1;;;;;2782:55:14;;;2764:74;;2752:2;2737:18;848:27:13;2618:226:14;1090:83:12;1158:8;;-1:-1:-1;;;;;1158:8:12;1090:83;;14328:310:13;;;;;;:::i;:::-;;:::i;1301:102:11:-;1380:16;;-1:-1:-1;;;;;1380:16:11;1301:102;;2706:152:10;;;:::i;13072:636:13:-;;;;;;:::i;:::-;;:::i;12364:445::-;;;;;;:::i;:::-;;:::i;11497:336::-;;;;;;:::i;:::-;;:::i;3155:217:10:-;;;;;;:::i;:::-;;:::i;381:18::-;;;;;;;;;;;;7423:132:13;;;;;;:::i;:::-;-1:-1:-1;;;;;7525:23:13;7499:7;7525:23;;;:15;:23;;;;;;;7423:132;1830:84:10;1900:7;;-1:-1:-1;;;;;1900:7:10;1830:84;;8323:118:13;;;;;;:::i;:::-;-1:-1:-1;;;;;8417:17:13;8391:7;8417:17;;;:8;:17;;;;;;;8323:118;3320:217:9;;;:::i;2115:144:10:-;;;:::i;2219:82:9:-;2288:6;;;;;-1:-1:-1;;;;;2288:6:9;2219:82;;1085:50:13;;;;;;:::i;:::-;;;;;;;;;;;;;;2429:96:9;2505:13;;-1:-1:-1;;;;;2505:13:9;2429:96;;6899:93:13;;;:::i;1644:244:11:-;;;;;;:::i;:::-;;:::i;14880:506:13:-;;;;;;:::i;:::-;;:::i;10375:282::-;;;;;;:::i;:::-;;:::i;13849:237::-;;;;;;:::i;:::-;;:::i;1039:40::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;4588:257:8;;;;;;:::i;:::-;;:::i;1714:177:12:-;;;;;;:::i;:::-;;:::i;5459:1135:13:-;;;;;;:::i;:::-;;:::i;2008:91:9:-;;;;;;:::i;:::-;;:::i;2695:94:8:-;2770:12;;-1:-1:-1;;;;;2770:12:8;2695:94;;396:43;;;;;;:::i;:::-;;;;;;;;;;;;;;;;7798:139:13;;;;;;:::i;:::-;-1:-1:-1;;;;;7907:14:13;;;7881:7;7907:14;;;:7;:14;;;;;;;;:23;;;;;;;;;;;;;7798:139;820:22;;;:::i;2958:231:9:-;;;;;;:::i;:::-;;:::i;15627:359:13:-;;;;;;:::i;:::-;;:::i;3396:393:8:-;;;;;;:::i;:::-;;:::i;2976:115::-;;;;;;:::i;:::-;-1:-1:-1;;;;;3063:21:8;3040:4;3063:21;;;:11;:21;;;;;;;;;2976:115;6700:89:13;6745:13;6777:5;6770:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6700:89;:::o;8681:295::-;1462:6:10;;8892:4:13;;1462:6:10;;;;;1458:37;;;1477:18;;;;;;;;;;;;;;1458:37;2400:12:8::1;::::0;8831:10:13::1;::::0;-1:-1:-1;;;;;2400:12:8::1;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::1;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::1;;::::0;;;:11:::1;:21;::::0;;;;;::::1;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::1;::::0;::::1;2764:74:14::0;2737:18;;2509:43:8::1;;;;;;;;2475:77;2400:12:::2;::::0;8866:7:13;;-1:-1:-1;;;;;2400:12:8::2;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::2;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::2;;::::0;;;:11:::2;:21;::::0;;;;;::::2;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::2;::::0;::::2;2764:74:14::0;2737:18;;2509:43:8::2;2618:226:14::0;2475:77:8::2;8912:36:13::3;8921:10;8933:7;8942:5;8912:8;:36::i;:::-;-1:-1:-1::0;8965:4:13::3;::::0;8681:295;-1:-1:-1;;;;8681:295:13:o;2418:85:10:-;5374:13:0;;;;;;;5366:69;;;;;;;6418:2:14;5366:69:0;;;6400:21:14;6457:2;6437:18;;;6430:30;6496:34;6476:18;;;6469:62;6567:13;6547:18;;;6540:41;6598:19;;5366:69:0;6216:407:14;5366:69:0;2482:6:10::1;:14:::0;;;::::1;::::0;;2418:85::o;4033:233:8:-;1898:12;;-1:-1:-1;;;;;1898:12:8;1884:10;:26;1880:76;;1919:37;;;;;;;;;;;;;;1880:76;-1:-1:-1;;;;;4113:21:8;::::1;;::::0;;;:11:::1;:21;::::0;;;;;::::1;;4108:74;;4143:39;::::0;::::1;::::0;;-1:-1:-1;;;;;2782:55:14;;4143:39:8::1;::::0;::::1;2764:74:14::0;2737:18;;4143:39:8::1;2618:226:14::0;4108:74:8::1;-1:-1:-1::0;;;;;4192:21:8;::::1;4216:5;4192:21:::0;;;:11:::1;:21;::::0;;;;;:29;;-1:-1:-1;;4192:29:8::1;::::0;;4236:23;::::1;::::0;4216:5;4236:23:::1;4033:233:::0;:::o;9723:438:13:-;1462:6:10;;9968:4:13;;1462:6:10;;;;;1458:37;;;1477:18;;;;;;;;;;;;;;1458:37;2400:12:8::1;::::0;9883:10:13::1;::::0;-1:-1:-1;;;;;2400:12:8::1;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::1;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::1;;::::0;;;:11:::1;:21;::::0;;;;;::::1;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::1;::::0;::::1;2764:74:14::0;2737:18;;2509:43:8::1;2618:226:14::0;2475:77:8::1;2400:12:::2;::::0;9918:4:13;;-1:-1:-1;;;;;2400:12:8::2;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::2;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::2;;::::0;;;:11:::2;:21;::::0;;;;;::::2;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::2;::::0;::::2;2764:74:14::0;2737:18;;2509:43:8::2;2618:226:14::0;2475:77:8::2;2400:12:::3;::::0;9947:2:13;;-1:-1:-1;;;;;2400:12:8::3;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::3;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::3;;::::0;;;:11:::3;:21;::::0;;;;;::::3;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::3;::::0;::::3;2764:74:14::0;2737:18;;2509:43:8::3;2618:226:14::0;2475:77:8::3;-1:-1:-1::0;;;;;10000:13:13;::::4;;::::0;;;:7:::4;:13;::::0;;;;;;;10014:10:::4;10000:25:::0;;;;;;;;9992:33;::::4;9988:65;;;10034:19;;;;;;;;;;;;;;9988:65;10063:26;10073:4;10079:2;10083:5;10063:9;:26::i;:::-;-1:-1:-1::0;;;;;10099:13:13;::::4;;::::0;;;:7:::4;:13;::::0;;;;;;;10113:10:::4;10099:25:::0;;;;;;;:34;;10128:5;;10099:13;:34:::4;::::0;10128:5;;10099:34:::4;:::i;:::-;::::0;;;-1:-1:-1;10150:4:13::4;::::0;9723:438;-1:-1:-1;;;;;;;;9723:438:13:o;2193:224:12:-;1056:16:11;;-1:-1:-1;;;;;1056:16:11;1042:10;:30;1038:111;;1095:43;;;;;;;;;;;;;;1038:111;-1:-1:-1;;;;;2279:24:12;::::1;2275:63;;2312:26;;;;;;;;;;;;;;2275:63;2348:8;:21:::0;;;::::1;-1:-1:-1::0;;;;;2348:21:12;::::1;::::0;;::::1;::::0;;;2384:26:::1;::::0;::::1;::::0;-1:-1:-1;;2384:26:12::1;2193:224:::0;:::o;11999:223:13:-;4843:12;;12081:4;;-1:-1:-1;;;;;4843:12:13;4829:10;:26;4825:56;;4864:17;;;;;;;;;;;;;;4825:56;-1:-1:-1;;;;;12097:16:13;::::1;12116:5;12097:16:::0;;;:8:::1;:16;::::0;;;;;;;:24;;-1:-1:-1;;12097:24:13::1;::::0;;12131:15:::1;:23:::0;;;;;;:27;;;12173:21;::::1;::::0;12116:5;12173:21:::1;-1:-1:-1::0;12211:4:13::1;4891:1;11999:223:::0;;;:::o;14328:310::-;1462:6:10;;14496:4:13;;1462:6:10;;;;;1458:37;;;1477:18;;;;;;;;;;;;;;1458:37;2400:12:8::1;::::0;14451:10:13::1;::::0;-1:-1:-1;;;;;2400:12:8::1;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::1;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::1;;::::0;;;:11:::1;:21;::::0;;;;;::::1;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::1;::::0;::::1;2764:74:14::0;2737:18;;2509:43:8::1;2618:226:14::0;2475:77:8::1;2400:12:::2;::::0;14478:7:13;;-1:-1:-1;;;;;2400:12:8::2;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::2;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::2;;::::0;;;:11:::2;:21;::::0;;;;;::::2;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::2;::::0;::::2;2764:74:14::0;2737:18;;2509:43:8::2;2618:226:14::0;2475:77:8::2;14528:10:13::3;14512:13;14573:14:::0;;;:7:::3;:14;::::0;;;;;;;-1:-1:-1;;;;;14573:23:13;::::3;::::0;;;;;;;;14548:61:::3;::::0;14528:10;;14564:7;;14573:35:::3;::::0;14599:9;;14573:35:::3;:::i;:::-;14548:8;:61::i;:::-;-1:-1:-1::0;14627:4:13::3;::::0;14328:310;-1:-1:-1;;;;;14328:310:13:o;2706:152:10:-;1654:7;;-1:-1:-1;;;;;1654:7:10;1640:10;:21;1636:61;;1670:27;;;;;;;;;;;;;;1636:61;2760:6:::1;::::0;;;::::1;;;2755:47;;2775:27;;;;;;;;;;;;;;2755:47;2812:6;:14:::0;;;::::1;::::0;;2841:10:::1;::::0;::::1;::::0;2821:5:::1;::::0;2841:10:::1;2706:152::o:0;13072:636:13:-;1462:6:10;;13226:4:13;;1462:6:10;;;;;1458:37;;;1477:18;;;;;;;;;;;;;;1458:37;4640:10:13::1;4631:20;::::0;;;:8:::1;:20;::::0;;;;;::::1;;4626:45;;4660:11;;;;;;;;;;;;;;4626:45;2400:12:8::2;::::0;13185:10:13::2;::::0;-1:-1:-1;;;;;2400:12:8::2;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::2;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::2;;::::0;;;:11:::2;:21;::::0;;;;;::::2;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::2;::::0;::::2;2764:74:14::0;2737:18;;2509:43:8::2;2618:226:14::0;2475:77:8::2;2400:12:::3;::::0;13212:3:13;;-1:-1:-1;;;;;2400:12:8::3;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::3;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::3;;::::0;;;:11:::3;:21;::::0;;;;;::::3;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::3;::::0;::::3;2764:74:14::0;2737:18;;2509:43:8::3;2618:226:14::0;2475:77:8::3;-1:-1:-1::0;;;;;13246:17:13;::::4;13242:45;;13272:15;;;;;;;;;;;;;;13242:45;13312:1;13301:7;:12;13297:52;;13322:27;;;;;;;;;;;;;;13297:52;13363:10;-1:-1:-1::0;;;;;13363:17:13;::::4;;13359:46;;13389:16;;;;;;;;;;;;;;13359:46;-1:-1:-1::0;;;;;13419:20:13;::::4;;::::0;;;:15:::4;:20;::::0;;;;;:30;-1:-1:-1;13415:62:13::4;;;13458:19;;;;;;;;;;;;;;13415:62;13504:7;13488:12;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;13521:13:13;::::4;;::::0;;;:8:::4;:13;::::0;;;;:24;;13538:7;;13521:13;:24:::4;::::0;13538:7;;13521:24:::4;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;13555:20:13;::::4;;::::0;;;:15:::4;:20;::::0;;;;:31;;13579:7;;13555:20;:31:::4;::::0;13579:7;;13555:31:::4;:::i;:::-;::::0;;;-1:-1:-1;;13601:30:13::4;::::0;1680:25:14;;;-1:-1:-1;;;;;13601:30:13;::::4;::::0;13606:10:::4;::::0;13601:30:::4;::::0;1668:2:14;1653:18;13601:30:13::4;;;;;;;13646:34;::::0;1680:25:14;;;-1:-1:-1;;;;;13646:34:13;::::4;::::0;13663:1:::4;::::0;13646:34:::4;::::0;1668:2:14;1653:18;13646:34:13::4;;;;;;;-1:-1:-1::0;13697:4:13::4;::::0;13072:636;-1:-1:-1;;;;13072:636:13:o;12364:445::-;1462:6:10;;;;;;;1458:37;;;1477:18;;;;;;;;;;;;;;1458:37;4640:10:13::1;4631:20;::::0;;;:8:::1;:20;::::0;;;;;::::1;;4626:45;;4660:11;;;;;;;;;;;;;;4626:45;2400:12:8::2;::::0;12444:10:13::2;::::0;-1:-1:-1;;;;;2400:12:8::2;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::2;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::2;;::::0;;;:11:::2;:21;::::0;;;;;::::2;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::2;::::0;::::2;2764:74:14::0;2737:18;;2509:43:8::2;2618:226:14::0;2475:77:8::2;12493:10:13::3;12466:15;12484:20:::0;;;:8:::3;:20;::::0;;;;;12518:12;12514:55:::3;;12539:30;;;;;;;;;;;;;;12514:55;12593:7;12583;:17;12579:52;;;12609:22;;;;;;;;;;;;;;12579:52;12658:7;12642:12;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;12684:10:13::3;12675:20;::::0;;;:8:::3;:20;::::0;;;;:31;;12699:7;;12675:20;:31:::3;::::0;12699:7;;12675:31:::3;:::i;:::-;::::0;;;-1:-1:-1;;12721:25:13::3;::::0;1680::14;;;12726:10:13::3;::::0;12721:25:::3;::::0;1668:2:14;1653:18;12721:25:13::3;;;;;;;12761:41;::::0;1680:25:14;;;12790:1:13::3;::::0;12770:10:::3;::::0;12761:41:::3;::::0;1668:2:14;1653:18;12761:41:13::3;;;;;;;;12456:353;4681:1:::2;12364:445:::0;:::o;11497:336::-;1462:6:10;;11648:4:13;;1462:6:10;;;;;1458:37;;;1477:18;;;;;;;;;;;;;;1458:37;4843:12:13::1;::::0;-1:-1:-1;;;;;4843:12:13::1;4829:10;:26;4825:56;;4864:17;;;;;;;;;;;;;;4825:56;-1:-1:-1::0;;;;;11664:16:13;::::2;;::::0;;;:8:::2;:16;::::0;;;;;;;:23;;-1:-1:-1;;11664:23:13::2;11683:4;11664:23;::::0;;11697:15:::2;:23:::0;;;;;;:46;;;11759;;1680:25:14;;;11759:46:13::2;::::0;1653:18:14;11759:46:13::2;;;;;;;-1:-1:-1::0;11822:4:13::2;11497:336:::0;;;;:::o;3155:217:10:-;1056:16:11;;-1:-1:-1;;;;;1056:16:11;1042:10;:30;1038:111;;1095:43;;;;;;;;;;;;;;1038:111;-1:-1:-1;;;;;3240:24:10;::::1;3236:62;;3273:25;;;;;;;;;;;;;;3236:62;3308:7;:20:::0;;;::::1;-1:-1:-1::0;;;;;3308:20:10;::::1;::::0;;::::1;::::0;;;3343:22:::1;::::0;::::1;::::0;-1:-1:-1;;3343:22:10::1;3155:217:::0;:::o;3320::9:-;1777:13;;-1:-1:-1;;;;;1777:13:9;1763:10;:27;1759:72;;1799:32;;;;;;;;;;;;;;1759:72;3402:6:::1;::::0;;3427:13:::1;::::0;3402:6;-1:-1:-1;;;;;3427:13:9;;::::1;2711:17:::0;;;;;;;;;3402:6;;::::1;;3451:13;:26:::0;;;::::1;::::0;;3523:6:::1;::::0;3492:38:::1;::::0;-1:-1:-1;;;;;3523:6:9;;;::::1;::::0;::::1;::::0;3492:38;::::1;::::0;::::1;::::0;-1:-1:-1;;3492:38:9::1;3373:164;3320:217::o:0;2115:144:10:-;1654:7;;-1:-1:-1;;;;;1654:7:10;1640:10;:21;1636:61;;1670:27;;;;;;;;;;;;;;1636:61;2166:6:::1;::::0;;;::::1;;;2162:44;;;2181:25;;;;;;;;;;;;;;2162:44;2216:6;:13:::0;;;::::1;::::0;::::1;::::0;;2244:8:::1;::::0;::::1;::::0;2216:13;;2244:8:::1;2115:144::o:0;6899:93:13:-;6946:13;6978:7;6971:14;;;;;:::i;1644:244:11:-;1575:6:9;;;;;-1:-1:-1;;;;;1575:6:9;1561:10;:20;1557:58;;1590:25;;;;;;;;;;;;;;1557:58;-1:-1:-1;;;;;1724:23:11;::::1;1720:68;;1756:32;;;;;;;;;;;;;;1720:68;1798:16;:28:::0;;;::::1;-1:-1:-1::0;;;;;1798:28:11;::::1;::::0;;::::1;::::0;;;1841:40:::1;::::0;::::1;::::0;-1:-1:-1;;1841:40:11::1;1644:244:::0;:::o;14880:506:13:-;1462:6:10;;15048:4:13;;1462:6:10;;;;;1458:37;;;1477:18;;;;;;;;;;;;;;1458:37;2400:12:8::1;::::0;15003:10:13::1;::::0;-1:-1:-1;;;;;2400:12:8::1;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::1;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::1;;::::0;;;:11:::1;:21;::::0;;;;;::::1;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::1;::::0;::::1;2764:74:14::0;2737:18;;2509:43:8::1;2618:226:14::0;2475:77:8::1;2400:12:::2;::::0;15030:7:13;;-1:-1:-1;;;;;2400:12:8::2;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::2;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::2;;::::0;;;:11:::2;:21;::::0;;;;;::::2;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::2;::::0;::::2;2764:74:14::0;2737:18;;2509:43:8::2;2618:226:14::0;2475:77:8::2;15080:10:13::3;15064:13;15127:14:::0;;;:7:::3;:14;::::0;;;;;;;-1:-1:-1;;;;;15127:23:13;::::3;::::0;;;;;;;;15164:28;;::::3;15160:134;;;15215:68;::::0;::::3;::::0;;-1:-1:-1;;;;;7390:15:14;;;15215:68:13::3;::::0;::::3;7372:34:14::0;7442:15;;7422:18;;;7415:43;7474:18;;;7467:34;;;7517:18;;;7510:34;;;7283:19;;15215:68:13::3;7080:470:14::0;15160:134:13::3;15304:54;15313:5:::0;15320:7;15329:28:::3;15348:9:::0;15329:16;:28:::3;:::i;15304:54::-;-1:-1:-1::0;15375:4:13::3;::::0;14880:506;-1:-1:-1;;;;;;14880:506:13:o;10375:282::-;1462:6:10;;10577:4:13;;1462:6:10;;;;;1458:37;;;1477:18;;;;;;;;;;;;;;1458:37;2400:12:8::1;::::0;10521:10:13::1;::::0;-1:-1:-1;;;;;2400:12:8::1;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::1;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::1;;::::0;;;:11:::1;:21;::::0;;;;;::::1;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::1;::::0;::::1;2764:74:14::0;2737:18;;2509:43:8::1;2618:226:14::0;2475:77:8::1;2400:12:::2;::::0;10556:2:13;;-1:-1:-1;;;;;2400:12:8::2;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::2;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::2;;::::0;;;:11:::2;:21;::::0;;;;;::::2;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::2;::::0;::::2;2764:74:14::0;2737:18;;2509:43:8::2;2618:226:14::0;2475:77:8::2;10597:32:13::3;10607:10;10619:2;10623:5;10597:9;:32::i;13849:237::-:0;1575:6:9;;;;;-1:-1:-1;;;;;1575:6:9;1561:10;:20;1557:58;;1590:25;;;;;;;;;;;;;;1557:58;-1:-1:-1;;;;;13936:30:13;::::1;13932:58;;13975:15;;;;;;;;;;;;;;13932:58;14000:12;:31:::0;;;::::1;-1:-1:-1::0;;;;;14000:31:13;::::1;::::0;;::::1;::::0;;;14046:33:::1;::::0;::::1;::::0;-1:-1:-1;;14046:33:13::1;13849:237:::0;:::o;4588:257:8:-;1056:16:11;;-1:-1:-1;;;;;1056:16:11;1042:10;:30;1038:111;;1095:43;;;;;;;;;;;;;;1038:111;-1:-1:-1;;;;;4683:29:8;::::1;4679:72;;4721:30;;-1:-1:-1::0;;;4721:30:8::1;;;;;;;;;;;4679:72;4761:12;:30:::0;;;::::1;-1:-1:-1::0;;;;;4761:30:8;::::1;::::0;;::::1;::::0;;;4806:32:::1;::::0;::::1;::::0;-1:-1:-1;;4806:32:8::1;4588:257:::0;:::o;1714:177:12:-;1316:8;;-1:-1:-1;;;;;1316:8:12;1302:10;:22;1298:64;;1333:29;;;;;;;;;;;;;;1298:64;1846:38:::1;-1:-1:-1::0;;;;;1846:26:12;::::1;1873:2:::0;1877:6;1846:26:::1;:38::i;:::-;1714:177:::0;;;:::o;5459:1135:13:-;3302:13:0;;;;;;;3301:14;;3347:34;;;;-1:-1:-1;3365:12:0;;3380:1;3365:12;;;;:16;3347:34;3346:108;;;-1:-1:-1;3426:4:0;1713:19:1;:23;;;3387:66:0;;-1:-1:-1;3436:12:0;;;;;:17;3387:66;3325:201;;;;;;;7757:2:14;3325:201:0;;;7739:21:14;7796:2;7776:18;;;7769:30;7835:34;7815:18;;;7808:62;7906:16;7886:18;;;7879:44;7940:19;;3325:201:0;7555:410:14;3325:201:0;3536:12;:16;;-1:-1:-1;;3536:16:0;3551:1;3536:16;;;3562:65;;;;3596:13;:20;;;;;;;;3562:65;5779:30:13::1;5798:10;5779:18;:30::i;:::-;5819:29;:27;:29::i;:::-;-1:-1:-1::0;;;;;5863:29:13;::::1;5859:57;;5901:15;;;;;;;;;;;;;;5859:57;-1:-1:-1::0;;;;;5930:23:13;::::1;5926:51;;5962:15;;;;;;;;;;;;;;5926:51;-1:-1:-1::0;;;;;5991:28:13;::::1;5987:56;;6028:15;;;;;;;;;;;;;;5987:56;-1:-1:-1::0;;;;;6057:24:13;::::1;6053:52;;6090:15;;;;;;;;;;;;;;6053:52;6116:17;:5;6124:9:::0;;6116:17:::1;:::i;:::-;-1:-1:-1::0;6143:21:13::1;:7;6153:11:::0;;6143:21:::1;:::i;:::-;-1:-1:-1::0;6174:24:13::1;:8;6185:13:::0;;6174:24:::1;:::i;:::-;-1:-1:-1::0;6208:9:13::1;:25:::0;;-1:-1:-1;;6208:25:13::1;;::::0;::::1;;::::0;;6243:12:::1;:30:::0;;;;;::::1;-1:-1:-1::0;;;;;6243:30:13;;::::1;::::0;;::::1;::::0;;;6283:7:::1;:19:::0;;;::::1;::::0;;::::1;;::::0;;6312:12:::1;:29:::0;;;::::1;::::0;;::::1;;::::0;;6351:8:::1;:21:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;6388:32:::1;::::0;::::1;::::0;-1:-1:-1;;6388:32:13::1;6435:20;::::0;-1:-1:-1;;;;;6435:20:13;::::1;::::0;::::1;::::0;;;::::1;6470:30;::::0;-1:-1:-1;;;;;6470:30:13;::::1;::::0;::::1;::::0;;;::::1;6515:31;::::0;2601:4:14;2589:17;;2571:36;;6515:31:13::1;::::0;2559:2:14;2544:18;6515:31:13::1;;;;;;;6561:26;::::0;-1:-1:-1;;;;;6561:26:13;::::1;::::0;::::1;::::0;;;::::1;3651:14:0::0;3647:99;;;3681:13;:21;;;;;;3721:14;;-1:-1:-1;2571:36:14;;3721:14:0;;2559:2:14;2544:18;3721:14:0;;;;;;;3647:99;3269:483;5459:1135:13;;;;;;;;;;;:::o;2008:91:9:-;5374:13:0;;;;;;;5366:69;;;;;;;6418:2:14;5366:69:0;;;6400:21:14;6457:2;6437:18;;;6430:30;6496:34;6476:18;;;6469:62;6567:13;6547:18;;;6540:41;6598:19;;5366:69:0;6216:407:14;5366:69:0;2711:6:9;:17;;;;;-1:-1:-1;;;;;2711:17:9;;;;;;2008:91;:::o;2077:15::-:1;2008:91:::0;:::o;820:22:13:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2958:231:9:-;1575:6;;;;;-1:-1:-1;;;;;1575:6:9;1561:10;:20;1557:58;;1590:25;;;;;;;;;;;;;;1557:58;-1:-1:-1;;;;;3036:22:9;::::1;3032:59;;3067:24;;;;;;;;;;;;;;3032:59;3101:13;:24:::0;;;::::1;-1:-1:-1::0;;;;;3101:24:9;;::::1;::::0;;::::1;::::0;;;3165:6:::1;::::0;3140:42:::1;::::0;3101:24;;3165:6;;;::::1;;::::0;3140:42:::1;::::0;-1:-1:-1;;3140:42:9::1;2958:231:::0;:::o;15627:359:13:-;1575:6:9;;;;;-1:-1:-1;;;;;1575:6:9;1561:10;:20;1557:58;;1590:25;;;;;;;;;;;;;;1557:58;-1:-1:-1;;;;;15711:21:13;::::1;;::::0;;;:11:::1;:21;::::0;;;;;::::1;;15706:51;;15741:16;;;;;;;;;;;;;;15706:51;-1:-1:-1::0;;;;;15785:18:13;::::1;15767:15;15785:18:::0;;;:8:::1;:18;::::0;;;;;15817:12;15813:38:::1;;15838:13;;;;;;;;;;;;;;15813:38;15877:7;15861:12;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;15894:18:13;::::1;15915:1;15894:18:::0;;;:8:::1;:18;::::0;;;;;;;:22;;;15940:39;1680:25:14;;;15915:1:13;;15894:18;15940:39:::1;::::0;1653:18:14;15940:39:13::1;;;;;;;15696:290;15627:359:::0;:::o;3396:393:8:-;1898:12;;-1:-1:-1;;;;;1898:12:8;1884:10;:26;1880:76;;1919:37;;;;;;;;;;;;;;1880:76;-1:-1:-1;;;;;3472:21:8;::::1;;::::0;;;:11:::1;:21;::::0;;;;;::::1;;3468:77;;;3502:43;::::0;-1:-1:-1;;;3502:43:8;;-1:-1:-1;;;;;2782:55:14;;3502:43:8::1;::::0;::::1;2764:74:14::0;2737:18;;3502:43:8::1;2618:226:14::0;3468:77:8::1;3571:12;::::0;-1:-1:-1;;;;;3559:24:8;;::::1;3571:12:::0;::::1;3559:24;3555:78;;;3592:41;;;;;;;;;;;;;;3555:78;-1:-1:-1::0;;;;;3647:22:8;::::1;3643:65;;3678:30;;-1:-1:-1::0;;;3678:30:8::1;;;;;;;;;;;3643:65;-1:-1:-1::0;;;;;3718:21:8;::::1;;::::0;;;:11:::1;:21;::::0;;;;;:28;;-1:-1:-1;;3718:28:8::1;3742:4;3718:28;::::0;;3761:21;::::1;::::0;3718;3761::::1;3396:393:::0;:::o;9171:293:13:-;-1:-1:-1;;;;;9268:19:13;;9264:47;;9296:15;;;;;;;;;;;;;;9264:47;-1:-1:-1;;;;;9325:21:13;;9321:49;;9355:15;;;;;;;;;;;;;;9321:49;-1:-1:-1;;;;;9380:14:13;;;;;;;:7;:14;;;;;;;;:23;;;;;;;;;;;;;:31;;;9426;;1680:25:14;;;9426:31:13;;1653:18:14;9426:31:13;1534:177:14;10847:367:13;-1:-1:-1;;;;;10939:18:13;;10935:46;;10966:15;;;;;;;;;;;;;;10935:46;-1:-1:-1;;;;;10995:16:13;;10991:44;;11020:15;;;;;;;;;;;;;;10991:44;-1:-1:-1;;;;;11057:14:13;;;;;;:8;:14;;;;;;11049:22;;11045:57;;;11080:22;;;;;;;;;;;;;;11045:57;-1:-1:-1;;;;;11113:14:13;;;;;;:8;:14;;;;;:23;;11131:5;;11113:14;:23;;11131:5;;11113:23;:::i;:::-;;;;-1:-1:-1;;;;;;;11146:12:13;;;;;;:8;:12;;;;;:21;;11162:5;;11146:12;:21;;11162:5;;11146:21;:::i;:::-;;;;;;;;11197:2;-1:-1:-1;;;;;11182:25:13;11191:4;-1:-1:-1;;;;;11182:25:13;;11201:5;11182:25;;;;1680::14;;1668:2;1653:18;;1534:177;941:175:4;1050:58;;;-1:-1:-1;;;;;8361:55:14;;;1050:58:4;;;8343:74:14;8433:18;;;;8426:34;;;1050:58:4;;;;;;;;;;8316:18:14;;;;1050:58:4;;;;;;;;;;1073:23;1050:58;;;5641:69;;;;;;;;;;;;;;;;1023:86;;1043:5;;1050:58;-1:-1:-1;;5641:69:4;;:27;;;1050:58;;5641:27;:69::i;:::-;5615:95;;5728:10;:17;5749:1;5728:22;:56;;;;5765:10;5754:30;;;;;;;;;;;;:::i;:::-;5720:111;;;;;;;8955:2:14;5720:111:4;;;8937:21:14;8994:2;8974:18;;;8967:30;9033:34;9013:18;;;9006:62;9104:12;9084:18;;;9077:40;9134:19;;5720:111:4;8753:406:14;4108:223:5;4241:12;4272:52;4294:6;4302:4;4308:1;4311:12;4272:21;:52::i;:::-;4265:59;4108:223;-1:-1:-1;;;;4108:223:5:o;5165:446::-;5330:12;5387:5;5362:21;:30;;5354:81;;;;;;;9366:2:14;5354:81:5;;;9348:21:14;9405:2;9385:18;;;9378:30;9444:34;9424:18;;;9417:62;9515:8;9495:18;;;9488:36;9541:19;;5354:81:5;9164:402:14;5354:81:5;5446:12;5460:23;5487:6;-1:-1:-1;;;;;5487:11:5;5506:5;5513:4;5487:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5445:73;;;;5535:69;5562:6;5570:7;5579:10;5591:12;5535:26;:69::i;:::-;5528:76;5165:446;-1:-1:-1;;;;;;;5165:446:5:o;7671:628::-;7851:12;7879:7;7875:418;;;7906:17;;7902:286;;-1:-1:-1;;;;;1713:19:1;;;8113:60:5;;;;;;;10052:2:14;8113:60:5;;;10034:21:14;10091:2;10071:18;;;10064:30;10130:31;10110:18;;;10103:59;10179:18;;8113:60:5;9850:353:14;8113:60:5;-1:-1:-1;8208:10:5;8201:17;;7875:418;8249:33;8257:10;8269:12;8980:17;;:21;8976:379;;9208:10;9202:17;9264:15;9251:10;9247:2;9243:19;9236:44;8976:379;9331:12;9324:20;;;;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:258:14;86:1;96:113;110:6;107:1;104:13;96:113;;;186:11;;;180:18;167:11;;;160:39;132:2;125:10;96:113;;;227:6;224:1;221:13;218:48;;;262:1;253:6;248:3;244:16;237:27;218:48;;14:258;;;:::o;277:442::-;426:2;415:9;408:21;389:4;458:6;452:13;501:6;496:2;485:9;481:18;474:34;517:66;576:6;571:2;560:9;556:18;551:2;543:6;539:15;517:66;:::i;:::-;635:2;623:15;640:66;619:88;604:104;;;;710:2;600:113;;277:442;-1:-1:-1;;277:442:14:o;724:154::-;-1:-1:-1;;;;;803:5:14;799:54;792:5;789:65;779:93;;868:1;865;858:12;883:134;951:20;;980:31;951:20;980:31;:::i;1022:315::-;1090:6;1098;1151:2;1139:9;1130:7;1126:23;1122:32;1119:52;;;1167:1;1164;1157:12;1119:52;1206:9;1193:23;1225:31;1250:5;1225:31;:::i;:::-;1275:5;1327:2;1312:18;;;;1299:32;;-1:-1:-1;;;1022:315:14:o;1716:247::-;1775:6;1828:2;1816:9;1807:7;1803:23;1799:32;1796:52;;;1844:1;1841;1834:12;1796:52;1883:9;1870:23;1902:31;1927:5;1902:31;:::i;:::-;1952:5;1716:247;-1:-1:-1;;;1716:247:14:o;1968:456::-;2045:6;2053;2061;2114:2;2102:9;2093:7;2089:23;2085:32;2082:52;;;2130:1;2127;2120:12;2082:52;2169:9;2156:23;2188:31;2213:5;2188:31;:::i;:::-;2238:5;-1:-1:-1;2295:2:14;2280:18;;2267:32;2308:33;2267:32;2308:33;:::i;:::-;1968:456;;2360:7;;-1:-1:-1;;;2414:2:14;2399:18;;;;2386:32;;1968:456::o;2849:180::-;2908:6;2961:2;2949:9;2940:7;2936:23;2932:32;2929:52;;;2977:1;2974;2967:12;2929:52;-1:-1:-1;3000:23:14;;2849:180;-1:-1:-1;2849:180:14:o;3509:348::-;3561:8;3571:6;3625:3;3618:4;3610:6;3606:17;3602:27;3592:55;;3643:1;3640;3633:12;3592:55;-1:-1:-1;3666:20:14;;3709:18;3698:30;;3695:50;;;3741:1;3738;3731:12;3695:50;3778:4;3770:6;3766:17;3754:29;;3830:3;3823:4;3814:6;3806;3802:19;3798:30;3795:39;3792:59;;;3847:1;3844;3837:12;3792:59;3509:348;;;;;:::o;3862:156::-;3928:20;;3988:4;3977:16;;3967:27;;3957:55;;4008:1;4005;3998:12;4023:1353;4179:6;4187;4195;4203;4211;4219;4227;4235;4243;4251;4259:7;4313:3;4301:9;4292:7;4288:23;4284:33;4281:53;;;4330:1;4327;4320:12;4281:53;4353:18;4411:2;4399:9;4386:23;4383:31;4380:51;;;4427:1;4424;4417:12;4380:51;4466:76;4534:7;4521:9;4508:23;4497:9;4493:39;4466:76;:::i;:::-;4561:8;;-1:-1:-1;4588:8:14;-1:-1:-1;4639:2:14;4624:18;;4611:32;4608:40;-1:-1:-1;4605:60:14;;;4661:1;4658;4651:12;4605:60;4700:85;4777:7;4770:2;4759:9;4755:18;4742:32;4731:9;4727:48;4700:85;:::i;:::-;4804:8;;-1:-1:-1;4831:8:14;-1:-1:-1;4882:2:14;4867:18;;4854:32;4851:40;-1:-1:-1;4848:60:14;;;4904:1;4901;4894:12;4848:60;;4943:85;5020:7;5013:2;5002:9;4998:18;4985:32;4974:9;4970:48;4943:85;:::i;:::-;5047:8;;-1:-1:-1;5074:8:14;-1:-1:-1;5101:36:14;5133:2;5118:18;;5101:36;:::i;:::-;5091:46;;5156:39;5190:3;5179:9;5175:19;5156:39;:::i;:::-;5146:49;;5214:39;5248:3;5237:9;5233:19;5214:39;:::i;:::-;5204:49;;5272:39;5306:3;5295:9;5291:19;5272:39;:::i;:::-;5262:49;;5331:39;5365:3;5354:9;5350:19;5331:39;:::i;:::-;5320:50;;4023:1353;;;;;;;;;;;;;;:::o;5381:388::-;5449:6;5457;5510:2;5498:9;5489:7;5485:23;5481:32;5478:52;;;5526:1;5523;5516:12;5478:52;5565:9;5552:23;5584:31;5609:5;5584:31;:::i;:::-;5634:5;-1:-1:-1;5691:2:14;5676:18;;5663:32;5704:33;5663:32;5704:33;:::i;:::-;5756:7;5746:17;;;5381:388;;;;;:::o;5774:437::-;5853:1;5849:12;;;;5896;;;5917:61;;5971:4;5963:6;5959:17;5949:27;;5917:61;6024:2;6016:6;6013:14;5993:18;5990:38;5987:218;;;6061:77;6058:1;6051:88;6162:4;6159:1;6152:15;6190:4;6187:1;6180:15;5987:218;;5774:437;;;:::o;6628:184::-;6680:77;6677:1;6670:88;6777:4;6774:1;6767:15;6801:4;6798:1;6791:15;6817:125;6857:4;6885:1;6882;6879:8;6876:34;;;6890:18;;:::i;:::-;-1:-1:-1;6927:9:14;;6817:125::o;6947:128::-;6987:3;7018:1;7014:6;7011:1;7008:13;7005:39;;;7024:18;;:::i;:::-;-1:-1:-1;7060:9:14;;6947:128::o;8471:277::-;8538:6;8591:2;8579:9;8570:7;8566:23;8562:32;8559:52;;;8607:1;8604;8597:12;8559:52;8639:9;8633:16;8692:5;8685:13;8678:21;8671:5;8668:32;8658:60;;8714:1;8711;8704:12;9571:274;9700:3;9738:6;9732:13;9754:53;9800:6;9795:3;9788:4;9780:6;9776:17;9754:53;:::i;:::-;9823:16;;;;;9571:274;-1:-1:-1;;9571:274:14:o","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa264697066735822122036ecfbca8451d816ca219c19221f8a63dbbf4f98ad8d6f9106ba8881660fd56f64736f6c634300080b0033","offset":13275}},"immutableReferences":{},"transformations":[],"transformationValues":{}},"deployment":{"transactionHash":"0xbdaaa67b4efbe639b70a452d981ac4c024abb8b5d8ae0a0fb6ea09dddb0eedc0","blockNumber":"23076876","transactionIndex":"205","deployer":"0x794E5B5A0A3375FF9dfaaBD4E533c3adadC272C7"},"sources":{"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n *     function initialize() initializer public {\n *         __ERC20_init(\"MyToken\", \"MTK\");\n *     }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n *     function initializeV2() reinitializer(2) public {\n *         __ERC20Permit_init(\"MyToken\");\n *     }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n *     _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n    /**\n     * @dev Indicates that the contract has been initialized.\n     * @custom:oz-retyped-from bool\n     */\n    uint8 private _initialized;\n\n    /**\n     * @dev Indicates that the contract is in the process of being initialized.\n     */\n    bool private _initializing;\n\n    /**\n     * @dev Triggered when the contract has been initialized or reinitialized.\n     */\n    event Initialized(uint8 version);\n\n    /**\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n     * `onlyInitializing` functions can be used to initialize parent contracts.\n     *\n     * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n     * constructor.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier initializer() {\n        bool isTopLevelCall = !_initializing;\n        require(\n            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\n            \"Initializable: contract is already initialized\"\n        );\n        _initialized = 1;\n        if (isTopLevelCall) {\n            _initializing = true;\n        }\n        _;\n        if (isTopLevelCall) {\n            _initializing = false;\n            emit Initialized(1);\n        }\n    }\n\n    /**\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n     * used to initialize parent contracts.\n     *\n     * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n     * are added through upgrades and that require initialization.\n     *\n     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n     * cannot be nested. If one is invoked in the context of another, execution will revert.\n     *\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n     * a contract, executing them in the right order is up to the developer or operator.\n     *\n     * WARNING: setting the version to 255 will prevent any future reinitialization.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier reinitializer(uint8 version) {\n        require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n        _initialized = version;\n        _initializing = true;\n        _;\n        _initializing = false;\n        emit Initialized(version);\n    }\n\n    /**\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\n     */\n    modifier onlyInitializing() {\n        require(_initializing, \"Initializable: contract is not initializing\");\n        _;\n    }\n\n    /**\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n     * through proxies.\n     *\n     * Emits an {Initialized} event the first time it is successfully executed.\n     */\n    function _disableInitializers() internal virtual {\n        require(!_initializing, \"Initializable: contract is initializing\");\n        if (_initialized != type(uint8).max) {\n            _initialized = type(uint8).max;\n            emit Initialized(type(uint8).max);\n        }\n    }\n\n    /**\n     * @dev Returns the highest version that has been initialized. See {reinitializer}.\n     */\n    function _getInitializedVersion() internal view returns (uint8) {\n        return _initialized;\n    }\n\n    /**\n     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n     */\n    function _isInitializing() internal view returns (bool) {\n        return _initializing;\n    }\n}\n"},"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     *\n     * Furthermore, `isContract` will also return true if the target contract within\n     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n     * which only has an effect at the end of a transaction.\n     * ====\n     *\n     * [IMPORTANT]\n     * ====\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\n     *\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n     * constructor.\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize/address.code.length, which returns 0\n        // for contracts in construction, since the code is only stored at the end\n        // of the constructor execution.\n\n        return account.code.length > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n     *\n     * _Available since v4.8._\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        if (success) {\n            if (returndata.length == 0) {\n                // only check isContract if the call was successful and the return data is empty\n                // otherwise we already know that it was a contract\n                require(isContract(target), \"Address: call to non-contract\");\n            }\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason or using the provided one.\n     *\n     * _Available since v4.3._\n     */\n    function verifyCallResult(\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal pure returns (bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    function _revert(bytes memory returndata, string memory errorMessage) private pure {\n        // Look for revert reason and bubble it up if present\n        if (returndata.length > 0) {\n            // The easiest way to bubble the revert reason is using memory via assembly\n            /// @solidity memory-safe-assembly\n            assembly {\n                let returndata_size := mload(returndata)\n                revert(add(32, returndata), returndata_size)\n            }\n        } else {\n            revert(errorMessage);\n        }\n    }\n}\n"},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * ==== Security Considerations\n *\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\n * generally recommended is:\n *\n * ```solidity\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\n *     try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\n *     doThing(..., value);\n * }\n *\n * function doThing(..., uint256 value) public {\n *     token.safeTransferFrom(msg.sender, address(this), value);\n *     ...\n * }\n * ```\n *\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\n * {SafeERC20-safeTransferFrom}).\n *\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\n * contracts should have entry points that don't rely on permit.\n */\ninterface IERC20Permit {\n    /**\n     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n     * given ``owner``'s signed approval.\n     *\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n     * ordering also apply here.\n     *\n     * Emits an {Approval} event.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     * - `deadline` must be a timestamp in the future.\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n     * over the EIP712-formatted function arguments.\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\n     *\n     * For more information on the signature format, see the\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n     * section].\n     *\n     * CAUTION: See Security Considerations above.\n     */\n    function permit(\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) external;\n\n    /**\n     * @dev Returns the current nonce for `owner`. This value must be\n     * included whenever a signature is generated for {permit}.\n     *\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\n     * prevents a signature from being used multiple times.\n     */\n    function nonces(address owner) external view returns (uint256);\n\n    /**\n     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n     */\n    // solhint-disable-next-line func-name-mixedcase\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n"},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the amount of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the amount of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves `amount` tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Moves `amount` tokens from `from` to `to` using the\n     * allowance mechanism. `amount` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n"},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../extensions/IERC20Permit.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    using Address for address;\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n    }\n\n    /**\n     * @dev Deprecated. This function has issues similar to the ones found in\n     * {IERC20-approve}, and its usage is discouraged.\n     *\n     * Whenever possible, use {safeIncreaseAllowance} and\n     * {safeDecreaseAllowance} instead.\n     */\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\n        // safeApprove should only be called when setting an initial allowance,\n        // or when resetting it to zero. To increase and decrease it, use\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n        require(\n            (value == 0) || (token.allowance(address(this), spender) == 0),\n            \"SafeERC20: approve from non-zero to non-zero allowance\"\n        );\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        unchecked {\n            uint256 oldAllowance = token.allowance(address(this), spender);\n            require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n     * to be set to zero before setting it to a non-zero value, such as USDT.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\n\n        if (!_callOptionalReturnBool(token, approvalCall)) {\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\n            _callOptionalReturn(token, approvalCall);\n        }\n    }\n\n    /**\n     * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\n     * Revert on invalid signature.\n     */\n    function safePermit(\n        IERC20Permit token,\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) internal {\n        uint256 nonceBefore = token.nonces(owner);\n        token.permit(owner, spender, value, deadline, v, r, s);\n        uint256 nonceAfter = token.nonces(owner);\n        require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n        // the target address contains contract code and also asserts for success in the low-level call.\n\n        bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n        require(returndata.length == 0 || abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\n     */\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\n        // and not revert is the subcall reverts.\n\n        (bool success, bytes memory returndata) = address(token).call(data);\n        return\n            success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));\n    }\n}\n"},"@openzeppelin/contracts/utils/Address.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     *\n     * Furthermore, `isContract` will also return true if the target contract within\n     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n     * which only has an effect at the end of a transaction.\n     * ====\n     *\n     * [IMPORTANT]\n     * ====\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\n     *\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n     * constructor.\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize/address.code.length, which returns 0\n        // for contracts in construction, since the code is only stored at the end\n        // of the constructor execution.\n\n        return account.code.length > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n     *\n     * _Available since v4.8._\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        if (success) {\n            if (returndata.length == 0) {\n                // only check isContract if the call was successful and the return data is empty\n                // otherwise we already know that it was a contract\n                require(isContract(target), \"Address: call to non-contract\");\n            }\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason or using the provided one.\n     *\n     * _Available since v4.3._\n     */\n    function verifyCallResult(\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal pure returns (bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    function _revert(bytes memory returndata, string memory errorMessage) private pure {\n        // Look for revert reason and bubble it up if present\n        if (returndata.length > 0) {\n            // The easiest way to bubble the revert reason is using memory via assembly\n            /// @solidity memory-safe-assembly\n            assembly {\n                let returndata_size := mload(returndata)\n                revert(add(32, returndata), returndata_size)\n            }\n        } else {\n            revert(errorMessage);\n        }\n    }\n}\n"},"contracts/src/Minting/MinterManagerInterface.sol":{"content":"//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\n/**\n * @title MinterManagementInterface\n * @notice Interface that defines external functions for managing minters and their allowances.\n * @dev Implementing contracts should provide functionality for adding, removing, and configuring minters.\n */\ninterface MinterManagementInterface {\n    /**\n     * @notice Checks if an account is a registered minter.\n     * @param _account The address to check.\n     * @return A boolean indicating whether the address is a minter.\n     */\n    function isMinter(address _account) external view returns (bool);\n\n    /**\n     * @notice Gets the allowance of a minter.\n     * @param _minter The address of the minter.\n     * @return The amount of tokens the minter is allowed to mint.\n     */\n    function getMinterAllowance(address _minter) external view returns (uint256);\n\n    /**\n     * @notice Configures a new minter or updates the allowance of an existing minter.\n     * @param _minter The address of the minter.\n     * @param _minterAllowedAmount The new allowance for the minter.\n     * @return A boolean indicating whether the configuration was successful.\n     */\n    function configureMinter(address _minter, uint256 _minterAllowedAmount) external returns (bool);\n\n    /**\n     * @notice Removes a minter.\n     * @param _minter The address of the minter to remove.\n     * @return A boolean indicating whether the removal was successful.\n     */\n    function removeMinter(address _minter) external returns (bool);\n}\n"},"contracts/src/TokenContracts/AbstractTokenV1.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/**\n * @title AbstractTokenV1\n * @dev Abstract contract for ERC20 token operations. Defines internal functions for approving and transferring tokens.\n * Inherits from the IERC20 interface.\n */\nabstract contract AbstractTokenV1 is IERC20 {\n    /**\n     * @notice Internal function to set the allowance for a spender over the owner's tokens.\n     * @param owner The address of the token owner.\n     * @param spender The address of the spender.\n     * @param value The amount of tokens the spender is allowed to spend.\n     * @dev This function must be overridden in the derived contract.\n     */\n    function _approve(address owner, address spender, uint256 value) internal virtual;\n\n    /**\n     * @notice Internal function to transfer tokens from one address to another.\n     * @param from The address of the token sender.\n     * @param to The address of the token recipient.\n     * @param value The amount of tokens to transfer.\n     * @dev This function must be overridden in the derived contract.\n     */\n    function _transfer(address from, address to, uint256 value) internal virtual;\n\n    // Storage Gap for future upgrades\n    uint256[49] private __gap;\n}\n"},"contracts/src/TokenContracts/Blacklistable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\nimport {PermissionAdmin} from \"./PermissionAdmin.sol\";\n\n/**\n * @title Blacklistable\n * @notice Contract that allows accounts to be blacklisted by a \"blacklister\" role.\n * @dev Inherits from PermissionAdmin to manage blacklister permissions.\n */\nabstract contract Blacklistable is PermissionAdmin {\n    address internal _blacklister;\n    mapping(address => bool) public blacklisted;\n\n    /// @notice Emitted when an account is blacklisted.\n    /// @param _account The address of the blacklisted account.\n    event Blacklisted(address indexed _account);\n\n    /// @notice Emitted when an account is removed from the blacklist.\n    /// @param _account The address of the unblacklisted account.\n    event UnBlacklisted(address indexed _account);\n\n    /// @notice Emitted when the blacklister is changed.\n    /// @param newBlacklister The address of the new blacklister.\n    event BlacklisterChanged(address indexed newBlacklister);\n\n    /// @notice Error thrown when the caller is not the blacklister.\n    error Blacklistable__CallerNotBlacklister();\n\n    /// @notice Error thrown when trying to perform an operation with the zero address, which is prohibited.\n    error Blacklistable__NoZeroAddress();\n\n    /// @notice Error thrown when the account is already blacklisted.\n    /// @param account The address that is already blacklisted.\n    error Blacklistable__AccountBlacklisted(address account);\n\n    /// @notice Error thrown when the blacklister tries to blacklist themselves.\n    error Blacklistable__BlacklisterSelfBlacklist();\n\n    /// @notice Error thrown when trying to unblacklist an address that is already non blacklisted.\n    error Blacklistable__NotBlacklisted(address account);\n\n    /**\n     * @dev Modifier to make a function callable only by the blacklister.\n     */\n    modifier onlyBlacklister() {\n        if (msg.sender != _blacklister) revert Blacklistable__CallerNotBlacklister();\n        _;\n    }\n\n    /**\n    * @dev Ensures the specified account is not blacklisted and the blacklister is properly set.\n    * @param _account The address to check for blacklisting.\n    * @custom:revert Blacklistable__NoZeroAddress if the blacklister address has not been set (is zero).\n    * @custom:revert Blacklistable__AccountBlacklisted if the account is blacklisted.\n    */\n    modifier notBlacklisted(address _account) {\n        if (_blacklister == address(0)) revert Blacklistable__NoZeroAddress();\n        if (blacklisted[_account]) revert Blacklistable__AccountBlacklisted(_account);\n        _;\n    }\n\n    /**\n     * @notice Returns the current blacklister.\n     * @return The address of the current blacklister.\n     */\n    function getBlacklister() external view returns (address) {\n        return _blacklister;\n    }\n\n    /**\n     * @notice Checks if an account is blacklisted.\n     * @param _account The address to check.\n     * @return True if the account is blacklisted, false otherwise.\n     */\n    function isBlacklisted(address _account) external view returns (bool) {\n        return blacklisted[_account];\n    }\n\n    /**\n     * @notice Adds an account to the blacklist.\n     * @param _account The address to blacklist.\n     * @dev Emits a {Blacklisted} event.\n     * @dev Can only be called by the current blacklister.\n     * @dev The address cannot be the zero address or the blacklister's own address.\n     */\n    function blacklist(address _account) external onlyBlacklister {\n        if (blacklisted[_account]) revert Blacklistable__AccountBlacklisted(_account);\n        if (_account == _blacklister) revert Blacklistable__BlacklisterSelfBlacklist();\n        if (_account == address(0)) revert Blacklistable__NoZeroAddress();\n        blacklisted[_account] = true;\n        emit Blacklisted(_account);\n    }\n\n    /**\n     * @notice Removes an account from the blacklist.\n     * @param _account The address to remove from the blacklist.\n     * @dev Emits an {UnBlacklisted} event.\n     * @dev Can only be called by the current blacklister.\n     */\n    function unBlacklist(address _account) external onlyBlacklister {\n         if (!blacklisted[_account]) revert Blacklistable__NotBlacklisted(_account);\n        blacklisted[_account] = false;\n        emit UnBlacklisted(_account);\n    }\n\n    /**\n     * @notice Updates the blacklister role to a new address.\n     * @param _newBlacklister The address of the new blacklister.\n     * @dev Emits a {BlacklisterChanged} event.\n     * @dev Can only be called by the permission admin.\n     * @dev The new blacklister address cannot be the zero address.\n     */\n    function updateBlacklister(address _newBlacklister) external onlyPermissionAdmin {\n        if (_newBlacklister == address(0)) revert Blacklistable__NoZeroAddress();\n        _blacklister = _newBlacklister;\n        emit BlacklisterChanged(_blacklister);\n    }\n\n    // Storage Gap for future upgrades\n    uint256[49] private __gap;\n}\n"},"contracts/src/TokenContracts/Ownable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\n\n/**\n * @title Ownable\n * @dev The Ownable contract has an owner address and provides basic authorization control functions.\n * Inherits from Initializable for upgradeable contract pattern.\n */\ncontract Ownable is Initializable {\n    // Address of the contract owner\n    address private _owner;\n\n    // Address of the pending owner\n    address private _pendingOwner;\n\n    /**\n     * @notice Error thrown when a zero address is provided.\n     */\n    error Ownable__NoZeroAddress();\n\n    /**\n     * @notice Error thrown when a caller is not the owner.\n     */\n    error Ownable__CallerNotOwner();\n\n    /**\n     * @notice Error thrown when a caller is not the pending owner.\n     */\n    error Ownable__CallerNotPendingOwner();\n\n    /**\n     * @dev Event emitted when ownership is transferred.\n     * @param previousOwner The address of the previous owner.\n     * @param newOwner The address of the new owner.\n     */\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Event emitted when ownership transfer is started.\n     * @param previousOwner The address of the previous owner.\n     * @param newOwner The address of the new owner.\n     */\n    event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Modifier to check if the caller is the owner.\n     */\n    modifier onlyOwner() {\n        if (msg.sender != _owner) revert Ownable__CallerNotOwner();\n        _;\n    }\n\n    /**\n     * @dev Modifier to check if the caller is the pending owner.\n     */\n    modifier onlyPendingOwner() {\n        if (msg.sender != _pendingOwner) revert Ownable__CallerNotPendingOwner();\n        _;\n    }\n\n    /**\n     * @notice Initializes the contract setting the deployer as the initial owner.\n     * @param owner The address of the initial owner.\n     */\n    function initialize(address owner) public onlyInitializing {\n        setOwner(owner);\n    }\n\n    /**\n     * @notice Returns the address of the current owner.\n     * @return The address of the owner.\n     */\n    function getOwner() external view returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @notice Returns the address of the pending owner.\n     * @return The address of the pending owner.\n     */\n    function getPendingOwner() external view returns (address) {\n        return _pendingOwner;\n    }\n\n    /**\n     * @dev Sets a new owner address internally.\n     * @param newOwner The address to set as the new owner.\n     */\n    function setOwner(address newOwner) internal {\n        _owner = newOwner;\n    }\n\n    /**\n     * @notice Starts the ownership transfer of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     * @param newOwner The address to transfer ownership to.\n     */\n    function transferOwnership(address newOwner) external onlyOwner {\n        if (newOwner == address(0)) revert Ownable__NoZeroAddress();\n        _pendingOwner = newOwner;\n        emit OwnershipTransferStarted(_owner, newOwner);\n    }\n\n    /**\n     * @notice The new owner accepts the ownership transfer.\n     * Can only be called by the pending owner.\n     */\n    function acceptOwnership() external onlyPendingOwner {\n        address oldOwner = _owner;\n        setOwner(_pendingOwner);\n        _pendingOwner = address(0);\n        emit OwnershipTransferred(oldOwner, _owner);\n    }\n\n    // Storage Gap for future upgrades\n    uint256[49] private __gap;\n}"},"contracts/src/TokenContracts/Pausable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\nimport {PermissionAdmin} from \"./PermissionAdmin.sol\";\n\n/**\n * @title Pausable\n * @notice Base contract which allows children to implement an emergency stop mechanism.\n * @dev Inherits from PermissionAdmin to manage pauser permissions.\n */\nabstract contract Pausable is PermissionAdmin {\n    address internal _pauser;\n    bool public paused;\n\n    /// @notice Emitted when the contract is paused.\n    event Paused();\n\n    /// @notice Emitted when the contract is unpaused.\n    event Unpaused();\n\n    /// @notice Emitted when the pauser is changed.\n    /// @param newPauser The address of the new pauser.\n    event PauserChanged(address indexed newPauser);\n\n    /// @notice Error thrown when trying to perform an action while the contract is paused.\n    error Pausable__Paused();\n\n    /// @notice Error thrown when the caller is not the pauser.\n    error Pausable__CallerNotPauser();\n\n    /// @notice Error thrown when trying to pause the contract when it is already paused.\n    error Pausable__AlreadyPaused();\n\n    /// @notice Error thrown when trying to unpause the contract when it is not paused.\n    error Pausable__AlreadyUnpaused();\n\n    /// @notice Error thrown when trying to set the pauser to the zero address.\n    error Pausable__NoZeroAddress();\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is not paused.\n     */\n    modifier whenNotPaused() {\n        if (paused) revert Pausable__Paused();\n        _;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only by the pauser.\n     */\n    modifier onlyPauser() {\n        if (msg.sender != _pauser) revert Pausable__CallerNotPauser();\n        _;\n    }\n\n    /**\n     * @notice Returns the current pauser.\n     * @return The address of the current pauser.\n     */\n    function getPauser() external view returns (address) {\n        return _pauser;\n    }\n\n    /**\n     * @notice Called by the pauser to pause the contract, triggering the stopped state.\n     * @dev Emits a {Paused} event.\n     * @dev Can only be called by the current pauser.\n     */\n    function pause() external onlyPauser {\n        if (paused) revert Pausable__AlreadyPaused();\n        paused = true;\n        emit Paused();\n    }\n\n    /**\n     * @notice Initializes the contract in an unpaused state.\n     * @dev This function should be called during contract initialization.\n     */\n    function initializePausable() public onlyInitializing {\n        paused = false;\n    }\n\n    /**\n     * @notice Called by the pauser to unpause the contract, returning to normal state.\n     * @dev Emits an {Unpaused} event.\n     * @dev Can only be called by the current pauser.\n     */\n    function unpause() external onlyPauser {\n        if (!paused) revert Pausable__AlreadyUnpaused();\n        paused = false;\n        emit Unpaused();\n    }\n\n    /**\n     * @notice Updates the pauser role to a new address.\n     * @param _newPauser The address of the new pauser.\n     * @dev Emits a {PauserChanged} event.\n     * @dev Can only be called by the permission admin.\n     * @dev The new pauser address cannot be the zero address.\n     */\n    function updatePauser(address _newPauser) external onlyPermissionAdmin {\n        if (_newPauser == address(0)) revert Pausable__NoZeroAddress();\n        _pauser = _newPauser;\n        emit PauserChanged(_pauser);\n    }\n\n    // Storage Gap for future upgrades\n    uint256[49] private __gap;\n}\n"},"contracts/src/TokenContracts/PermissionAdmin.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\nimport {Ownable} from \"./Ownable.sol\";\n\n/**\n * @title PermissionAdmin\n * @notice Base contract which allows the owner to set an admin with the ability to select the pauser, blacklister, and rescuer.\n * @dev Only the contract owner can modify the admin. The admin has special permissions defined by this contract.\n */\nabstract contract PermissionAdmin is Ownable {\n    address private _permissionAdmin;\n\n    /// @notice Emitted when the permission admin is changed.\n    /// @param admin The new permission admin.\n    event PermissionAdminChanged(address indexed admin);\n\n    /// @notice Error thrown when the caller is not the permission admin.\n    error PermissionAdmin__CallerNotPermissionAdmin();\n\n    /// @notice Error thrown when trying to set the permission admin to the zero address.\n    error PermissionAdmin__NoZeroAddress();\n    \n    /**\n     * @dev Modifier to make a function callable only by the permission admin.\n     */\n    modifier onlyPermissionAdmin() {\n        if (msg.sender != _permissionAdmin) {\n            revert PermissionAdmin__CallerNotPermissionAdmin();\n        }\n        _;\n    }\n\n    /**\n     * @notice Returns the current permission admin.\n     * @return The address of the current permission admin.\n     */\n    function getPermissionAdmin() external view returns (address) {\n        return _permissionAdmin;\n    }\n\n    /**\n     * @notice Sets a new permission admin.\n     * @param _newAdmin The address of the new permission admin.\n     * @dev Only the contract owner can call this function. The new admin address cannot be the zero address.\n     */\n    function setPermissionAdmin(address _newAdmin) external onlyOwner {\n        if (_newAdmin == address(0)) revert PermissionAdmin__NoZeroAddress();\n        _permissionAdmin = _newAdmin;\n        emit PermissionAdminChanged(_permissionAdmin);\n    }\n\n    // Storage Gap for future upgrades\n    uint256[49] private __gap;\n}\n"},"contracts/src/TokenContracts/Rescuable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {PermissionAdmin} from \"./PermissionAdmin.sol\";\n\n/**\n * @title Rescuable\n * @notice Contract that allows rescuing ERC20 tokens locked up in this contract by a \"rescuer\" role.\n * @dev Inherits from PermissionAdmin to manage rescuer permissions.\n */\nabstract contract Rescuable is PermissionAdmin {\n    using SafeERC20 for IERC20;\n\n    address internal _rescuer;\n\n    /// @notice Error thrown when the caller is not the rescuer.\n    error Rescuable__CallerNotRescuer();\n\n    /// @notice Error thrown when trying to set the rescuer to the zero address.\n    error Rescuable__NoZeroAddress();\n\n    /// @notice Emitted when the rescuer is changed.\n    /// @param newRescuer The address of the new rescuer.\n    event RescuerChanged(address indexed newRescuer);\n\n    /**\n     * @notice Returns the current rescuer.\n     * @return The address of the current rescuer.\n     */\n    function rescuer() external view returns (address) {\n        return _rescuer;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only by the rescuer.\n     */\n    modifier onlyRescuer() {\n        if (msg.sender != _rescuer) revert Rescuable__CallerNotRescuer();\n        _;\n    }\n\n    /**\n     * @notice Rescue ERC20 tokens locked up in this contract.\n     * @param tokenContract The address of the ERC20 token contract.\n     * @param to The recipient address to receive the rescued tokens.\n     * @param amount The amount of tokens to withdraw.\n     * @dev Can only be called by the current rescuer.\n     */\n    function rescueERC20(\n        IERC20 tokenContract,\n        address to,\n        uint256 amount\n    ) external onlyRescuer {\n        tokenContract.safeTransfer(to, amount);\n    }\n\n    /**\n     * @notice Assign the rescuer role to a given address.\n     * @param newRescuer The address of the new rescuer.\n     * @dev Emits a {RescuerChanged} event.\n     * @dev Can only be called by the permission admin.\n     * @dev The new rescuer address cannot be the zero address.\n     */\n    function updateRescuer(address newRescuer) external onlyPermissionAdmin {\n        if (newRescuer == address(0)) revert Rescuable__NoZeroAddress();\n        _rescuer = newRescuer;\n        emit RescuerChanged(newRescuer);\n    }\n\n    // Storage Gap for future upgrades\n    uint256[49] private __gap;\n}\n"},"contracts/src/TokenContracts/TokenV1.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\nimport {AbstractTokenV1} from \"./AbstractTokenV1.sol\";\nimport {Ownable} from \"./Ownable.sol\";\nimport {Pausable} from \"./Pausable.sol\";\nimport {Blacklistable} from \"./Blacklistable.sol\";\nimport {Rescuable} from \"./Rescuable.sol\";\nimport {MinterManagementInterface} from \"../Minting/MinterManagerInterface.sol\";\n\n/**\n * @title TokenV1\n * @dev ERC20 Token backed by fiat reserves with additional functionality for minting, burning, pausing, blacklisting, and rescuing tokens.\n * Inherits MinterManagementInterface to comply with minter management specifications.\n */\ncontract TokenV1 is AbstractTokenV1, Ownable, Pausable, Blacklistable, Rescuable, MinterManagementInterface {\n    string private _name;\n    string private _symbol;\n    uint8 private _decimals;\n    string public currency;\n    address public masterMinter;\n\n    uint256 internal _totalSupply;\n\n    mapping(address => uint256) internal balances;\n    mapping(address => mapping(address => uint256)) internal allowed;\n    mapping(address => bool) public isMinter;\n    mapping(address => uint256) public minterAllowance; // Allowance set by approval\n\n    /**\n     * @dev Emitted when tokens are minted.\n     * @param minter The address of the minter.\n     * @param to The address of the recipient.\n     * @param amount The amount of tokens minted.\n     */\n    event Mint(address indexed minter, address indexed to, uint256 amount);\n\n    /**\n     * @dev Emitted when tokens are burned.\n     * @param burner The address of the burner.\n     * @param amount The amount of tokens burned.\n     */\n    event Burn(address indexed burner, uint256 amount);\n\n    /**\n     * @dev Emitted when a minter is configured.\n     * @param minter The address of the minter.\n     * @param minterAllowedAmount The allowance of the minter.\n     */\n    event MinterConfigured(address indexed minter, uint256 minterAllowedAmount);\n\n    /**\n     * @dev Emitted when a minter is removed.\n     * @param oldMinter The address of the removed minter.\n     */\n    event MinterRemoved(address indexed oldMinter);\n\n    /**\n     * @dev Emitted when the master minter is changed.\n     * @param newMasterMinter The address of the new master minter.\n     */\n    event MasterMinterChanged(address indexed newMasterMinter);\n\n    /**\n     * @dev Emitted when the token decimals are set.\n     * @param decimals The number of decimals set.\n     */\n    event TokenDecimalsSet(uint8 decimals);\n\n    /**\n     * @dev Emitted when a new master minter is set.\n     * @param newMasterMinter The address of the new master minter.\n     */\n    event NewMasterMinter(address indexed newMasterMinter);\n\n    /**\n     * @dev Emitted when a new pauser is set.\n     * @param newPauser The address of the new pauser.\n     */\n    event NewPauser(address indexed newPauser);\n\n    /**\n     * @dev Emitted when a new blacklister is set.\n     * @param newBlacklister The address of the new blacklister.\n     */\n    event NewBlacklister(address indexed newBlacklister);\n\n    /**\n     * @dev Error thrown when the caller is not a minter.\n     */\n    error NotMinter();\n\n    /**\n     * @dev Error thrown when the caller is not the master minter.\n     */\n    error NotMasterMinter();\n\n    /**\n     * @dev Error thrown when a zero address is provided.\n     */\n    error NoZeroAddress();\n\n    /**\n     * @dev Error thrown when the mint amount is zero.\n     */\n    error MintMustBeGreaterThanZero();\n\n    /**\n     * @dev Error thrown when the amount exceeds the balance.\n     */\n    error AmountExceedsBalance();\n\n    /**\n     * @dev Error thrown when the burn amount is not greater than zero.\n     */\n    error BurnAmountNotGreaterThanZero();\n\n    /**\n     * @dev Error thrown when the allowance is exceeded.\n     */\n    error AllowanceExceeded();\n\n    /**\n     * @dev Error thrown when a minter tries to mint to a different address.\n     */\n    error NotSelfMinting();\n\n    /**\n     * @dev Error thrown when an attempt to decrease the allowance fails.\n     * @param owner The owner address.\n     * @param spender The spender address.\n     * @param currentAllowance The current allowance.\n     * @param decrement The decrement amount.\n     */\n    error FailedDecreaseAllowance(address owner, address spender, uint256 currentAllowance, uint256 decrement);\n\n    /**\n     * @dev Error thrown when an address is not blacklisted.\n     */\n    error NotBlacklisted();\n\n    /**\n     * @dev Error thrown when an address has zero balance.\n     */\n    error ZeroBalance();\n\n    /**\n     * @dev Modifier to make a function callable only by a minter.\n     */\n    modifier onlyMinter() {\n        if (!isMinter[msg.sender]) revert NotMinter();\n        _;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only by the master minter.\n     */\n    modifier onlyMasterMinter() {\n        if (msg.sender != masterMinter) revert NotMasterMinter();\n        _;\n    }\n\n    /**\n     * @notice Initializes the token with given parameters at most once.\n     * @param tokenName The name of the token.\n     * @param tokenSymbol The symbol of the token.\n     * @param tokenCurrency The currency of the token.\n     * @param tokenDecimals The number of decimals the token uses.\n     * @param newMasterMinter The address of the new master minter.\n     * @param newPauser The address of the new pauser.\n     * @param newBlacklister The address of the new blacklister.\n     * @param newRescuer The address of the new rescuer.\n     */\n    function initializeToken(\n        string calldata tokenName,\n        string calldata tokenSymbol,\n        string calldata tokenCurrency,\n        uint8 tokenDecimals,\n        address newMasterMinter,\n        address newPauser,\n        address newBlacklister,\n        address newRescuer\n    ) public initializer {\n        Ownable.initialize(msg.sender);\n        Pausable.initializePausable();\n\n        if (newMasterMinter == address(0)) revert NoZeroAddress();\n        if (newPauser == address(0)) revert NoZeroAddress();\n        if (newBlacklister == address(0)) revert NoZeroAddress();\n        if (newRescuer == address(0)) revert NoZeroAddress();\n\n        _name = tokenName;\n        _symbol = tokenSymbol;\n        currency = tokenCurrency;\n        _decimals = tokenDecimals;\n        masterMinter = newMasterMinter;\n        _pauser = newPauser;\n        _blacklister = newBlacklister;\n        _rescuer = newRescuer;\n\n        emit NewMasterMinter(newMasterMinter);\n        emit NewPauser(newPauser);\n        emit NewBlacklister(newBlacklister);\n        emit TokenDecimalsSet(tokenDecimals);\n        emit RescuerChanged(newRescuer);\n    }\n\n    /**\n     * @notice Returns the name of the token.\n     * @return The name of the token.\n     */\n    function name() public view virtual returns (string memory) {\n        return _name;\n    }\n\n    /**\n     * @notice Returns the symbol of the token.\n     * @return The symbol of the token.\n     */\n    function symbol() public view virtual returns (string memory) {\n        return _symbol;\n    }\n\n    /**\n     * @notice Returns the number of decimals used to get its user representation.\n     * @return The number of decimals used by the token.\n     */\n    function decimals() public view virtual returns (uint8) {\n        return _decimals;\n    }\n\n    /**\n     * @notice Returns the minting allowance of a minter.\n     * @param minter The address of the minter.\n     * @return The minting allowance of the minter.\n     */\n    function getMinterAllowance(address minter) external view override returns (uint256) {\n        return minterAllowance[minter];\n    }\n\n    /**\n     * @notice Returns the amount of tokens that spender is allowed to transfer on behalf of owner.\n     * @param owner Token owner's address.\n     * @param spender Spender's address.\n     * @return The allowance amount.\n     */\n    function allowance(address owner, address spender) external view override returns (uint256) {\n        return allowed[owner][spender];\n    }\n\n    /**\n     * @notice Returns the total supply of the token.\n     * @return The total supply.\n     */\n    function totalSupply() external view override returns (uint256) {\n        return _totalSupply;\n    }\n\n    /**\n     * @notice Returns the token balance of an account.\n     * @param account The address of the account.\n     * @return The token balance of the account.\n     */\n    function balanceOf(address account) external view override returns (uint256) {\n        return balances[account];\n    }\n\n    /**\n     * @notice Sets spender's allowance over the caller's tokens to be a given value.\n     * @param spender Spender's address.\n     * @param value Allowance amount.\n     * @return True if the operation was successful.\n     */\n    function approve(\n        address spender,\n        uint256 value\n    )\n        external\n        override\n        whenNotPaused\n        notBlacklisted(msg.sender)\n        notBlacklisted(spender)\n        returns (bool)\n    {\n        _approve(msg.sender, spender, value);\n        return true;\n    }\n\n    /**\n     * @notice Internal function to set allowance.\n     * @param owner Token owner's address.\n     * @param spender Spender's address.\n     * @param value Allowance amount.\n     */\n    function _approve(address owner, address spender, uint256 value) internal override {\n        if (owner == address(0)) revert NoZeroAddress();\n        if (spender == address(0)) revert NoZeroAddress();\n        allowed[owner][spender] = value;\n        emit Approval(owner, spender, value);\n    }\n\n    /**\n     * @notice Transfers tokens from one address to another using allowance.\n     * @param from Payer's address.\n     * @param to Payee's address.\n     * @param value Transfer amount.\n     * @return True if the operation was successful.\n     */\n    function transferFrom(\n    address from,\n    address to,\n    uint256 value\n    )\n        external\n        override\n        whenNotPaused\n        notBlacklisted(msg.sender)\n        notBlacklisted(from)\n        notBlacklisted(to)\n        returns (bool)\n    {\n        if (value > allowed[from][msg.sender]) revert AllowanceExceeded();\n        _transfer(from, to, value);\n        allowed[from][msg.sender] -= value;\n        return true;\n    }\n\n    /**\n     * @notice Transfers tokens from the caller to another address.\n     * @param to Payee's address.\n     * @param value Transfer amount.\n     * @return True if the operation was successful.\n     */\n    function transfer(\n        address to,\n        uint256 value\n    )\n        external\n        override\n        whenNotPaused\n        notBlacklisted(msg.sender)\n        notBlacklisted(to)\n        returns (bool)\n    {\n        _transfer(msg.sender, to, value);\n        return true;\n    }\n\n    /**\n     * @notice Internal function to process token transfers.\n     * @param from Payer's address.\n     * @param to Payee's address.\n     * @param value Transfer amount.\n     */\n    function _transfer(address from, address to, uint256 value) internal override {\n        if (from == address(0)) revert NoZeroAddress();\n        if (to == address(0)) revert NoZeroAddress();\n        if (value > balances[from]) revert AmountExceedsBalance();\n\n        balances[from] -= value;\n        balances[to] += value;\n        emit Transfer(from, to, value);\n    }\n\n    /**\n     * @notice Configures a new minter or updates the allowance of an existing minter.\n     * @param minter The address of the minter.\n     * @param _minterAllowedAmount The minting allowance for the minter.\n     * @return True if the operation was successful.\n     */\n    function configureMinter(\n        address minter,\n        uint256 _minterAllowedAmount\n    ) external override whenNotPaused onlyMasterMinter returns (bool) {\n        isMinter[minter] = true;\n        minterAllowance[minter] = _minterAllowedAmount;\n\n        emit MinterConfigured(minter, _minterAllowedAmount);\n        return true;\n    }\n\n    /**\n     * @notice Removes a minter.\n     * @param minter The address of the minter to remove.\n     * @return True if the operation was successful.\n     */\n    function removeMinter(address minter) external override onlyMasterMinter returns (bool) {\n        isMinter[minter] = false;\n        minterAllowance[minter] = 0;\n        emit MinterRemoved(minter);\n        return true;\n    }\n\n    /**\n     * @notice Allows a minter to burn some of its own tokens.\n     * @param _amount The amount of tokens to be burned.\n     */\n    function burn(uint256 _amount) external whenNotPaused onlyMinter notBlacklisted(msg.sender) {\n        uint256 balance = balances[msg.sender];\n        if (_amount <= 0) revert BurnAmountNotGreaterThanZero();\n        if (balance < _amount) revert AmountExceedsBalance();\n\n        _totalSupply -= _amount;\n        balances[msg.sender] -= _amount;\n        emit Burn(msg.sender, _amount);\n        emit Transfer(msg.sender, address(0), _amount);\n    }\n\n    /**\n     * @notice Allows a minter to minter some of its tokens from allowance.\n     * @param _to The address to receive the minted tokens.\n     * @param _amount The amount of tokens to mint.\n     * @return True if the operation was successful.\n     */\n    function mint(\n        address _to,\n        uint256 _amount\n    ) public whenNotPaused onlyMinter notBlacklisted(msg.sender) notBlacklisted(_to) returns (bool) {\n        if (_to == address(0)) revert NoZeroAddress();\n        if (_amount <= 0) revert MintMustBeGreaterThanZero();\n        if (msg.sender != _to) revert NotSelfMinting();\n        if (minterAllowance[_to] < _amount) revert AllowanceExceeded();\n\n        _totalSupply += _amount;\n        balances[_to] += _amount;\n        minterAllowance[_to] -= _amount;\n        emit Mint(msg.sender, _to, _amount);\n        emit Transfer(address(0), _to, _amount);\n        return true;\n    }\n\n    /**\n     * @notice Updates the master minter address.\n     * @param _newMasterMinter The address of the new master minter.\n     */\n    function updateMasterMinter(address _newMasterMinter) external onlyOwner {\n        if (_newMasterMinter == address(0)) revert NoZeroAddress();\n        masterMinter = _newMasterMinter;\n        emit MasterMinterChanged(masterMinter);\n    }\n\n    /**\n     * @notice Increases the allowance by a given increment.\n     * @param spender Spender's address.\n     * @param increment The amount to increase the allowance by.\n     * @return True if the operation was successful.\n     */\n    function increaseAllowance(\n        address spender,\n        uint256 increment\n    ) external whenNotPaused notBlacklisted(msg.sender) notBlacklisted(spender) returns (bool) {\n        address owner = msg.sender;\n        _approve(owner, spender, allowed[owner][spender] + increment);\n\n        return true;\n    }\n\n    /**\n     * @notice Decreases the allowance by a given decrement.\n     * @param spender Spender's address.\n     * @param decrement The amount to decrease the allowance by.\n     * @return True if the operation was successful.\n     */\n    function decreaseAllowance(\n        address spender,\n        uint256 decrement\n    ) external whenNotPaused notBlacklisted(msg.sender) notBlacklisted(spender) returns (bool) {\n        address owner = msg.sender;\n        uint256 currentAllowance = allowed[owner][spender];\n        if (currentAllowance < decrement) {\n            revert FailedDecreaseAllowance(owner, spender, currentAllowance, decrement);\n        }\n\n        _approve(owner, spender, currentAllowance - decrement);\n        return true;\n    }\n\n    /**\n     * @notice Wipes the balance of a blacklisted address, decreasing the totalSupply.\n     * @dev Only the owner can call this function, and the address must be blacklisted.\n     * @param _account The address to wipe.\n     */\n    function wipeBlacklistedAddress(address _account) external onlyOwner {\n        if (!blacklisted[_account]) revert NotBlacklisted();\n        uint256 balance = balances[_account];\n        if (balance == 0) revert ZeroBalance();\n        _totalSupply -= balance;\n        balances[_account] = 0;\n        \n        emit Transfer(_account, address(0), balance);\n    }\n\n    // Storage Gap for future upgrades\n    uint256[49] private __gap;\n}\n"}},"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.8.11+commit.d7f03943","compilerSettings":{"metadata":{"useLiteralContent":true},"optimizer":{"runs":10000,"enabled":true}},"name":"TokenV1","fullyQualifiedName":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},"abi":[{"name":"AllowanceExceeded","type":"error","inputs":[]},{"name":"AmountExceedsBalance","type":"error","inputs":[]},{"name":"Blacklistable__AccountBlacklisted","type":"error","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"name":"Blacklistable__BlacklisterSelfBlacklist","type":"error","inputs":[]},{"name":"Blacklistable__CallerNotBlacklister","type":"error","inputs":[]},{"name":"Blacklistable__NoZeroAddress","type":"error","inputs":[]},{"name":"Blacklistable__NotBlacklisted","type":"error","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"name":"BurnAmountNotGreaterThanZero","type":"error","inputs":[]},{"name":"FailedDecreaseAllowance","type":"error","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"},{"name":"currentAllowance","type":"uint256","internalType":"uint256"},{"name":"decrement","type":"uint256","internalType":"uint256"}]},{"name":"MintMustBeGreaterThanZero","type":"error","inputs":[]},{"name":"NoZeroAddress","type":"error","inputs":[]},{"name":"NotBlacklisted","type":"error","inputs":[]},{"name":"NotMasterMinter","type":"error","inputs":[]},{"name":"NotMinter","type":"error","inputs":[]},{"name":"NotSelfMinting","type":"error","inputs":[]},{"name":"Ownable__CallerNotOwner","type":"error","inputs":[]},{"name":"Ownable__CallerNotPendingOwner","type":"error","inputs":[]},{"name":"Ownable__NoZeroAddress","type":"error","inputs":[]},{"name":"Pausable__AlreadyPaused","type":"error","inputs":[]},{"name":"Pausable__AlreadyUnpaused","type":"error","inputs":[]},{"name":"Pausable__CallerNotPauser","type":"error","inputs":[]},{"name":"Pausable__NoZeroAddress","type":"error","inputs":[]},{"name":"Pausable__Paused","type":"error","inputs":[]},{"name":"PermissionAdmin__CallerNotPermissionAdmin","type":"error","inputs":[]},{"name":"PermissionAdmin__NoZeroAddress","type":"error","inputs":[]},{"name":"Rescuable__CallerNotRescuer","type":"error","inputs":[]},{"name":"Rescuable__NoZeroAddress","type":"error","inputs":[]},{"name":"ZeroBalance","type":"error","inputs":[]},{"name":"Approval","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"spender","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Blacklisted","type":"event","inputs":[{"name":"_account","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"BlacklisterChanged","type":"event","inputs":[{"name":"newBlacklister","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Burn","type":"event","inputs":[{"name":"burner","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Initialized","type":"event","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"name":"MasterMinterChanged","type":"event","inputs":[{"name":"newMasterMinter","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Mint","type":"event","inputs":[{"name":"minter","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"MinterConfigured","type":"event","inputs":[{"name":"minter","type":"address","indexed":true,"internalType":"address"},{"name":"minterAllowedAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"MinterRemoved","type":"event","inputs":[{"name":"oldMinter","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"NewBlacklister","type":"event","inputs":[{"name":"newBlacklister","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"NewMasterMinter","type":"event","inputs":[{"name":"newMasterMinter","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"NewPauser","type":"event","inputs":[{"name":"newPauser","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"OwnershipTransferStarted","type":"event","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"OwnershipTransferred","type":"event","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Paused","type":"event","inputs":[],"anonymous":false},{"name":"PauserChanged","type":"event","inputs":[{"name":"newPauser","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"PermissionAdminChanged","type":"event","inputs":[{"name":"admin","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"RescuerChanged","type":"event","inputs":[{"name":"newRescuer","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"TokenDecimalsSet","type":"event","inputs":[{"name":"decimals","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"name":"Transfer","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"UnBlacklisted","type":"event","inputs":[{"name":"_account","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Unpaused","type":"event","inputs":[],"anonymous":false},{"name":"acceptOwnership","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"allowance","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"approve","type":"function","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"balanceOf","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"blacklist","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"blacklisted","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"burn","type":"function","inputs":[{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"configureMinter","type":"function","inputs":[{"name":"minter","type":"address","internalType":"address"},{"name":"_minterAllowedAmount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"currency","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"decimals","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"decreaseAllowance","type":"function","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"decrement","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"getBlacklister","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"getMinterAllowance","type":"function","inputs":[{"name":"minter","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getOwner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"getPauser","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"getPendingOwner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"getPermissionAdmin","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"increaseAllowance","type":"function","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"increment","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"initialize","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"initializePausable","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"initializeToken","type":"function","inputs":[{"name":"tokenName","type":"string","internalType":"string"},{"name":"tokenSymbol","type":"string","internalType":"string"},{"name":"tokenCurrency","type":"string","internalType":"string"},{"name":"tokenDecimals","type":"uint8","internalType":"uint8"},{"name":"newMasterMinter","type":"address","internalType":"address"},{"name":"newPauser","type":"address","internalType":"address"},{"name":"newBlacklister","type":"address","internalType":"address"},{"name":"newRescuer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"isBlacklisted","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isMinter","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"masterMinter","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"minterAllowance","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"pause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"paused","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"removeMinter","type":"function","inputs":[{"name":"minter","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"rescueERC20","type":"function","inputs":[{"name":"tokenContract","type":"address","internalType":"contract IERC20"},{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"rescuer","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"setPermissionAdmin","type":"function","inputs":[{"name":"_newAdmin","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"symbol","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"totalSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"transfer","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"transferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"transferOwnership","type":"function","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"unBlacklist","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"unpause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"updateBlacklister","type":"function","inputs":[{"name":"_newBlacklister","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"updateMasterMinter","type":"function","inputs":[{"name":"_newMasterMinter","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"updatePauser","type":"function","inputs":[{"name":"_newPauser","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"updateRescuer","type":"function","inputs":[{"name":"newRescuer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"wipeBlacklistedAddress","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"}],"metadata":{"compiler":{"version":"0.8.11+commit.d7f03943"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"AllowanceExceeded","type":"error"},{"inputs":[],"name":"AmountExceedsBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"Blacklistable__AccountBlacklisted","type":"error"},{"inputs":[],"name":"Blacklistable__BlacklisterSelfBlacklist","type":"error"},{"inputs":[],"name":"Blacklistable__CallerNotBlacklister","type":"error"},{"inputs":[],"name":"Blacklistable__NoZeroAddress","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"Blacklistable__NotBlacklisted","type":"error"},{"inputs":[],"name":"BurnAmountNotGreaterThanZero","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"currentAllowance","type":"uint256"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"FailedDecreaseAllowance","type":"error"},{"inputs":[],"name":"MintMustBeGreaterThanZero","type":"error"},{"inputs":[],"name":"NoZeroAddress","type":"error"},{"inputs":[],"name":"NotBlacklisted","type":"error"},{"inputs":[],"name":"NotMasterMinter","type":"error"},{"inputs":[],"name":"NotMinter","type":"error"},{"inputs":[],"name":"NotSelfMinting","type":"error"},{"inputs":[],"name":"Ownable__CallerNotOwner","type":"error"},{"inputs":[],"name":"Ownable__CallerNotPendingOwner","type":"error"},{"inputs":[],"name":"Ownable__NoZeroAddress","type":"error"},{"inputs":[],"name":"Pausable__AlreadyPaused","type":"error"},{"inputs":[],"name":"Pausable__AlreadyUnpaused","type":"error"},{"inputs":[],"name":"Pausable__CallerNotPauser","type":"error"},{"inputs":[],"name":"Pausable__NoZeroAddress","type":"error"},{"inputs":[],"name":"Pausable__Paused","type":"error"},{"inputs":[],"name":"PermissionAdmin__CallerNotPermissionAdmin","type":"error"},{"inputs":[],"name":"PermissionAdmin__NoZeroAddress","type":"error"},{"inputs":[],"name":"Rescuable__CallerNotRescuer","type":"error"},{"inputs":[],"name":"Rescuable__NoZeroAddress","type":"error"},{"inputs":[],"name":"ZeroBalance","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"}],"name":"Blacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newBlacklister","type":"address"}],"name":"BlacklisterChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newMasterMinter","type":"address"}],"name":"MasterMinterChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"minterAllowedAmount","type":"uint256"}],"name":"MinterConfigured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldMinter","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newBlacklister","type":"address"}],"name":"NewBlacklister","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newMasterMinter","type":"address"}],"name":"NewMasterMinter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newPauser","type":"address"}],"name":"NewPauser","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newPauser","type":"address"}],"name":"PauserChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"}],"name":"PermissionAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newRescuer","type":"address"}],"name":"RescuerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"decimals","type":"uint8"}],"name":"TokenDecimalsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"}],"name":"UnBlacklisted","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"uint256","name":"_minterAllowedAmount","type":"uint256"}],"name":"configureMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currency","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"decrement","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBlacklister","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"getMinterAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPauser","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPermissionAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"increment","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializePausable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"string","name":"tokenCurrency","type":"string"},{"internalType":"uint8","name":"tokenDecimals","type":"uint8"},{"internalType":"address","name":"newMasterMinter","type":"address"},{"internalType":"address","name":"newPauser","type":"address"},{"internalType":"address","name":"newBlacklister","type":"address"},{"internalType":"address","name":"newRescuer","type":"address"}],"name":"initializeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterMinter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minterAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"tokenContract","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescuer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newAdmin","type":"address"}],"name":"setPermissionAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"unBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newBlacklister","type":"address"}],"name":"updateBlacklister","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newMasterMinter","type":"address"}],"name":"updateMasterMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPauser","type":"address"}],"name":"updatePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRescuer","type":"address"}],"name":"updateRescuer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"wipeBlacklistedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"details":"ERC20 Token backed by fiat reserves with additional functionality for minting, burning, pausing, blacklisting, and rescuing tokens. Inherits MinterManagementInterface to comply with minter management specifications.","errors":{"AllowanceExceeded()":[{"details":"Error thrown when the allowance is exceeded."}],"AmountExceedsBalance()":[{"details":"Error thrown when the amount exceeds the balance."}],"Blacklistable__AccountBlacklisted(address)":[{"params":{"account":"The address that is already blacklisted."}}],"BurnAmountNotGreaterThanZero()":[{"details":"Error thrown when the burn amount is not greater than zero."}],"FailedDecreaseAllowance(address,address,uint256,uint256)":[{"details":"Error thrown when an attempt to decrease the allowance fails.","params":{"currentAllowance":"The current allowance.","decrement":"The decrement amount.","owner":"The owner address.","spender":"The spender address."}}],"MintMustBeGreaterThanZero()":[{"details":"Error thrown when the mint amount is zero."}],"NoZeroAddress()":[{"details":"Error thrown when a zero address is provided."}],"NotBlacklisted()":[{"details":"Error thrown when an address is not blacklisted."}],"NotMasterMinter()":[{"details":"Error thrown when the caller is not the master minter."}],"NotMinter()":[{"details":"Error thrown when the caller is not a minter."}],"NotSelfMinting()":[{"details":"Error thrown when a minter tries to mint to a different address."}],"ZeroBalance()":[{"details":"Error thrown when an address has zero balance."}]},"events":{"Burn(address,uint256)":{"details":"Emitted when tokens are burned.","params":{"amount":"The amount of tokens burned.","burner":"The address of the burner."}},"MasterMinterChanged(address)":{"details":"Emitted when the master minter is changed.","params":{"newMasterMinter":"The address of the new master minter."}},"Mint(address,address,uint256)":{"details":"Emitted when tokens are minted.","params":{"amount":"The amount of tokens minted.","minter":"The address of the minter.","to":"The address of the recipient."}},"MinterConfigured(address,uint256)":{"details":"Emitted when a minter is configured.","params":{"minter":"The address of the minter.","minterAllowedAmount":"The allowance of the minter."}},"MinterRemoved(address)":{"details":"Emitted when a minter is removed.","params":{"oldMinter":"The address of the removed minter."}},"NewBlacklister(address)":{"details":"Emitted when a new blacklister is set.","params":{"newBlacklister":"The address of the new blacklister."}},"NewMasterMinter(address)":{"details":"Emitted when a new master minter is set.","params":{"newMasterMinter":"The address of the new master minter."}},"NewPauser(address)":{"details":"Emitted when a new pauser is set.","params":{"newPauser":"The address of the new pauser."}},"TokenDecimalsSet(uint8)":{"details":"Emitted when the token decimals are set.","params":{"decimals":"The number of decimals set."}}},"kind":"dev","methods":{"allowance(address,address)":{"params":{"owner":"Token owner's address.","spender":"Spender's address."},"returns":{"_0":"The allowance amount."}},"approve(address,uint256)":{"params":{"spender":"Spender's address.","value":"Allowance amount."},"returns":{"_0":"True if the operation was successful."}},"balanceOf(address)":{"params":{"account":"The address of the account."},"returns":{"_0":"The token balance of the account."}},"blacklist(address)":{"details":"Emits a {Blacklisted} event.Can only be called by the current blacklister.The address cannot be the zero address or the blacklister's own address.","params":{"_account":"The address to blacklist."}},"burn(uint256)":{"params":{"_amount":"The amount of tokens to be burned."}},"configureMinter(address,uint256)":{"params":{"_minterAllowedAmount":"The minting allowance for the minter.","minter":"The address of the minter."},"returns":{"_0":"True if the operation was successful."}},"decimals()":{"returns":{"_0":"The number of decimals used by the token."}},"decreaseAllowance(address,uint256)":{"params":{"decrement":"The amount to decrease the allowance by.","spender":"Spender's address."},"returns":{"_0":"True if the operation was successful."}},"getBlacklister()":{"returns":{"_0":"The address of the current blacklister."}},"getMinterAllowance(address)":{"params":{"minter":"The address of the minter."},"returns":{"_0":"The minting allowance of the minter."}},"getOwner()":{"returns":{"_0":"The address of the owner."}},"getPauser()":{"returns":{"_0":"The address of the current pauser."}},"getPendingOwner()":{"returns":{"_0":"The address of the pending owner."}},"getPermissionAdmin()":{"returns":{"_0":"The address of the current permission admin."}},"increaseAllowance(address,uint256)":{"params":{"increment":"The amount to increase the allowance by.","spender":"Spender's address."},"returns":{"_0":"True if the operation was successful."}},"initialize(address)":{"params":{"owner":"The address of the initial owner."}},"initializePausable()":{"details":"This function should be called during contract initialization."},"initializeToken(string,string,string,uint8,address,address,address,address)":{"params":{"newBlacklister":"The address of the new blacklister.","newMasterMinter":"The address of the new master minter.","newPauser":"The address of the new pauser.","newRescuer":"The address of the new rescuer.","tokenCurrency":"The currency of the token.","tokenDecimals":"The number of decimals the token uses.","tokenName":"The name of the token.","tokenSymbol":"The symbol of the token."}},"isBlacklisted(address)":{"params":{"_account":"The address to check."},"returns":{"_0":"True if the account is blacklisted, false otherwise."}},"mint(address,uint256)":{"params":{"_amount":"The amount of tokens to mint.","_to":"The address to receive the minted tokens."},"returns":{"_0":"True if the operation was successful."}},"name()":{"returns":{"_0":"The name of the token."}},"pause()":{"details":"Emits a {Paused} event.Can only be called by the current pauser."},"removeMinter(address)":{"params":{"minter":"The address of the minter to remove."},"returns":{"_0":"True if the operation was successful."}},"rescueERC20(address,address,uint256)":{"details":"Can only be called by the current rescuer.","params":{"amount":"The amount of tokens to withdraw.","to":"The recipient address to receive the rescued tokens.","tokenContract":"The address of the ERC20 token contract."}},"rescuer()":{"returns":{"_0":"The address of the current rescuer."}},"setPermissionAdmin(address)":{"details":"Only the contract owner can call this function. The new admin address cannot be the zero address.","params":{"_newAdmin":"The address of the new permission admin."}},"symbol()":{"returns":{"_0":"The symbol of the token."}},"totalSupply()":{"returns":{"_0":"The total supply."}},"transfer(address,uint256)":{"params":{"to":"Payee's address.","value":"Transfer amount."},"returns":{"_0":"True if the operation was successful."}},"transferFrom(address,address,uint256)":{"params":{"from":"Payer's address.","to":"Payee's address.","value":"Transfer amount."},"returns":{"_0":"True if the operation was successful."}},"transferOwnership(address)":{"params":{"newOwner":"The address to transfer ownership to."}},"unBlacklist(address)":{"details":"Emits an {UnBlacklisted} event.Can only be called by the current blacklister.","params":{"_account":"The address to remove from the blacklist."}},"unpause()":{"details":"Emits an {Unpaused} event.Can only be called by the current pauser."},"updateBlacklister(address)":{"details":"Emits a {BlacklisterChanged} event.Can only be called by the permission admin.The new blacklister address cannot be the zero address.","params":{"_newBlacklister":"The address of the new blacklister."}},"updateMasterMinter(address)":{"params":{"_newMasterMinter":"The address of the new master minter."}},"updatePauser(address)":{"details":"Emits a {PauserChanged} event.Can only be called by the permission admin.The new pauser address cannot be the zero address.","params":{"_newPauser":"The address of the new pauser."}},"updateRescuer(address)":{"details":"Emits a {RescuerChanged} event.Can only be called by the permission admin.The new rescuer address cannot be the zero address.","params":{"newRescuer":"The address of the new rescuer."}},"wipeBlacklistedAddress(address)":{"details":"Only the owner can call this function, and the address must be blacklisted.","params":{"_account":"The address to wipe."}}},"stateVariables":{"isMinter":{"params":{"_account":"The address to check."},"return":"A boolean indicating whether the address is a minter.","returns":{"_0":"A boolean indicating whether the address is a minter."}}},"title":"TokenV1","version":1},"userdoc":{"errors":{"Blacklistable__AccountBlacklisted(address)":[{"notice":"Error thrown when the account is already blacklisted."}],"Blacklistable__BlacklisterSelfBlacklist()":[{"notice":"Error thrown when the blacklister tries to blacklist themselves."}],"Blacklistable__CallerNotBlacklister()":[{"notice":"Error thrown when the caller is not the blacklister."}],"Blacklistable__NoZeroAddress()":[{"notice":"Error thrown when trying to perform an operation with the zero address, which is prohibited."}],"Blacklistable__NotBlacklisted(address)":[{"notice":"Error thrown when trying to unblacklist an address that is already non blacklisted."}],"Ownable__CallerNotOwner()":[{"notice":"Error thrown when a caller is not the owner."}],"Ownable__CallerNotPendingOwner()":[{"notice":"Error thrown when a caller is not the pending owner."}],"Ownable__NoZeroAddress()":[{"notice":"Error thrown when a zero address is provided."}],"Pausable__AlreadyPaused()":[{"notice":"Error thrown when trying to pause the contract when it is already paused."}],"Pausable__AlreadyUnpaused()":[{"notice":"Error thrown when trying to unpause the contract when it is not paused."}],"Pausable__CallerNotPauser()":[{"notice":"Error thrown when the caller is not the pauser."}],"Pausable__NoZeroAddress()":[{"notice":"Error thrown when trying to set the pauser to the zero address."}],"Pausable__Paused()":[{"notice":"Error thrown when trying to perform an action while the contract is paused."}],"PermissionAdmin__CallerNotPermissionAdmin()":[{"notice":"Error thrown when the caller is not the permission admin."}],"PermissionAdmin__NoZeroAddress()":[{"notice":"Error thrown when trying to set the permission admin to the zero address."}],"Rescuable__CallerNotRescuer()":[{"notice":"Error thrown when the caller is not the rescuer."}],"Rescuable__NoZeroAddress()":[{"notice":"Error thrown when trying to set the rescuer to the zero address."}]},"events":{"Blacklisted(address)":{"notice":"Emitted when an account is blacklisted."},"BlacklisterChanged(address)":{"notice":"Emitted when the blacklister is changed."},"Paused()":{"notice":"Emitted when the contract is paused."},"PauserChanged(address)":{"notice":"Emitted when the pauser is changed."},"PermissionAdminChanged(address)":{"notice":"Emitted when the permission admin is changed."},"RescuerChanged(address)":{"notice":"Emitted when the rescuer is changed."},"UnBlacklisted(address)":{"notice":"Emitted when an account is removed from the blacklist."},"Unpaused()":{"notice":"Emitted when the contract is unpaused."}},"kind":"user","methods":{"acceptOwnership()":{"notice":"The new owner accepts the ownership transfer. Can only be called by the pending owner."},"allowance(address,address)":{"notice":"Returns the amount of tokens that spender is allowed to transfer on behalf of owner."},"approve(address,uint256)":{"notice":"Sets spender's allowance over the caller's tokens to be a given value."},"balanceOf(address)":{"notice":"Returns the token balance of an account."},"blacklist(address)":{"notice":"Adds an account to the blacklist."},"burn(uint256)":{"notice":"Allows a minter to burn some of its own tokens."},"configureMinter(address,uint256)":{"notice":"Configures a new minter or updates the allowance of an existing minter."},"decimals()":{"notice":"Returns the number of decimals used to get its user representation."},"decreaseAllowance(address,uint256)":{"notice":"Decreases the allowance by a given decrement."},"getBlacklister()":{"notice":"Returns the current blacklister."},"getMinterAllowance(address)":{"notice":"Returns the minting allowance of a minter."},"getOwner()":{"notice":"Returns the address of the current owner."},"getPauser()":{"notice":"Returns the current pauser."},"getPendingOwner()":{"notice":"Returns the address of the pending owner."},"getPermissionAdmin()":{"notice":"Returns the current permission admin."},"increaseAllowance(address,uint256)":{"notice":"Increases the allowance by a given increment."},"initialize(address)":{"notice":"Initializes the contract setting the deployer as the initial owner."},"initializePausable()":{"notice":"Initializes the contract in an unpaused state."},"initializeToken(string,string,string,uint8,address,address,address,address)":{"notice":"Initializes the token with given parameters at most once."},"isBlacklisted(address)":{"notice":"Checks if an account is blacklisted."},"isMinter(address)":{"notice":"Checks if an account is a registered minter."},"mint(address,uint256)":{"notice":"Allows a minter to minter some of its tokens from allowance."},"name()":{"notice":"Returns the name of the token."},"pause()":{"notice":"Called by the pauser to pause the contract, triggering the stopped state."},"removeMinter(address)":{"notice":"Removes a minter."},"rescueERC20(address,address,uint256)":{"notice":"Rescue ERC20 tokens locked up in this contract."},"rescuer()":{"notice":"Returns the current rescuer."},"setPermissionAdmin(address)":{"notice":"Sets a new permission admin."},"symbol()":{"notice":"Returns the symbol of the token."},"totalSupply()":{"notice":"Returns the total supply of the token."},"transfer(address,uint256)":{"notice":"Transfers tokens from the caller to another address."},"transferFrom(address,address,uint256)":{"notice":"Transfers tokens from one address to another using allowance."},"transferOwnership(address)":{"notice":"Starts the ownership transfer of the contract to a new account (`newOwner`). Can only be called by the current owner."},"unBlacklist(address)":{"notice":"Removes an account from the blacklist."},"unpause()":{"notice":"Called by the pauser to unpause the contract, returning to normal state."},"updateBlacklister(address)":{"notice":"Updates the blacklister role to a new address."},"updateMasterMinter(address)":{"notice":"Updates the master minter address."},"updatePauser(address)":{"notice":"Updates the pauser role to a new address."},"updateRescuer(address)":{"notice":"Assign the rescuer role to a given address."},"wipeBlacklistedAddress(address)":{"notice":"Wipes the balance of a blacklisted address, decreasing the totalSupply."}},"version":1}},"settings":{"compilationTarget":{"contracts/src/TokenContracts/TokenV1.sol":"TokenV1"},"evmVersion":"london","libraries":{},"metadata":{"bytecodeHash":"ipfs","useLiteralContent":true},"optimizer":{"enabled":true,"runs":10000},"remappings":[]},"sources":{"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n *     function initialize() initializer public {\n *         __ERC20_init(\"MyToken\", \"MTK\");\n *     }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n *     function initializeV2() reinitializer(2) public {\n *         __ERC20Permit_init(\"MyToken\");\n *     }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n *     _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n    /**\n     * @dev Indicates that the contract has been initialized.\n     * @custom:oz-retyped-from bool\n     */\n    uint8 private _initialized;\n\n    /**\n     * @dev Indicates that the contract is in the process of being initialized.\n     */\n    bool private _initializing;\n\n    /**\n     * @dev Triggered when the contract has been initialized or reinitialized.\n     */\n    event Initialized(uint8 version);\n\n    /**\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n     * `onlyInitializing` functions can be used to initialize parent contracts.\n     *\n     * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n     * constructor.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier initializer() {\n        bool isTopLevelCall = !_initializing;\n        require(\n            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\n            \"Initializable: contract is already initialized\"\n        );\n        _initialized = 1;\n        if (isTopLevelCall) {\n            _initializing = true;\n        }\n        _;\n        if (isTopLevelCall) {\n            _initializing = false;\n            emit Initialized(1);\n        }\n    }\n\n    /**\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n     * used to initialize parent contracts.\n     *\n     * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n     * are added through upgrades and that require initialization.\n     *\n     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n     * cannot be nested. If one is invoked in the context of another, execution will revert.\n     *\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n     * a contract, executing them in the right order is up to the developer or operator.\n     *\n     * WARNING: setting the version to 255 will prevent any future reinitialization.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier reinitializer(uint8 version) {\n        require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n        _initialized = version;\n        _initializing = true;\n        _;\n        _initializing = false;\n        emit Initialized(version);\n    }\n\n    /**\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\n     */\n    modifier onlyInitializing() {\n        require(_initializing, \"Initializable: contract is not initializing\");\n        _;\n    }\n\n    /**\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n     * through proxies.\n     *\n     * Emits an {Initialized} event the first time it is successfully executed.\n     */\n    function _disableInitializers() internal virtual {\n        require(!_initializing, \"Initializable: contract is initializing\");\n        if (_initialized != type(uint8).max) {\n            _initialized = type(uint8).max;\n            emit Initialized(type(uint8).max);\n        }\n    }\n\n    /**\n     * @dev Returns the highest version that has been initialized. See {reinitializer}.\n     */\n    function _getInitializedVersion() internal view returns (uint8) {\n        return _initialized;\n    }\n\n    /**\n     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n     */\n    function _isInitializing() internal view returns (bool) {\n        return _initializing;\n    }\n}\n","keccak256":"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794","license":"MIT"},"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     *\n     * Furthermore, `isContract` will also return true if the target contract within\n     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n     * which only has an effect at the end of a transaction.\n     * ====\n     *\n     * [IMPORTANT]\n     * ====\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\n     *\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n     * constructor.\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize/address.code.length, which returns 0\n        // for contracts in construction, since the code is only stored at the end\n        // of the constructor execution.\n\n        return account.code.length > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n     *\n     * _Available since v4.8._\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        if (success) {\n            if (returndata.length == 0) {\n                // only check isContract if the call was successful and the return data is empty\n                // otherwise we already know that it was a contract\n                require(isContract(target), \"Address: call to non-contract\");\n            }\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason or using the provided one.\n     *\n     * _Available since v4.3._\n     */\n    function verifyCallResult(\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal pure returns (bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    function _revert(bytes memory returndata, string memory errorMessage) private pure {\n        // Look for revert reason and bubble it up if present\n        if (returndata.length > 0) {\n            // The easiest way to bubble the revert reason is using memory via assembly\n            /// @solidity memory-safe-assembly\n            assembly {\n                let returndata_size := mload(returndata)\n                revert(add(32, returndata), returndata_size)\n            }\n        } else {\n            revert(errorMessage);\n        }\n    }\n}\n","keccak256":"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422","license":"MIT"},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the amount of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the amount of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves `amount` tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Moves `amount` tokens from `from` to `to` using the\n     * allowance mechanism. `amount` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n","keccak256":"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305","license":"MIT"},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * ==== Security Considerations\n *\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\n * generally recommended is:\n *\n * ```solidity\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\n *     try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\n *     doThing(..., value);\n * }\n *\n * function doThing(..., uint256 value) public {\n *     token.safeTransferFrom(msg.sender, address(this), value);\n *     ...\n * }\n * ```\n *\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\n * {SafeERC20-safeTransferFrom}).\n *\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\n * contracts should have entry points that don't rely on permit.\n */\ninterface IERC20Permit {\n    /**\n     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n     * given ``owner``'s signed approval.\n     *\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n     * ordering also apply here.\n     *\n     * Emits an {Approval} event.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     * - `deadline` must be a timestamp in the future.\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n     * over the EIP712-formatted function arguments.\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\n     *\n     * For more information on the signature format, see the\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n     * section].\n     *\n     * CAUTION: See Security Considerations above.\n     */\n    function permit(\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) external;\n\n    /**\n     * @dev Returns the current nonce for `owner`. This value must be\n     * included whenever a signature is generated for {permit}.\n     *\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\n     * prevents a signature from being used multiple times.\n     */\n    function nonces(address owner) external view returns (uint256);\n\n    /**\n     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n     */\n    // solhint-disable-next-line func-name-mixedcase\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n","keccak256":"0xb264c03a3442eb37a68ad620cefd1182766b58bee6cec40343480392d6b14d69","license":"MIT"},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../extensions/IERC20Permit.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    using Address for address;\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n    }\n\n    /**\n     * @dev Deprecated. This function has issues similar to the ones found in\n     * {IERC20-approve}, and its usage is discouraged.\n     *\n     * Whenever possible, use {safeIncreaseAllowance} and\n     * {safeDecreaseAllowance} instead.\n     */\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\n        // safeApprove should only be called when setting an initial allowance,\n        // or when resetting it to zero. To increase and decrease it, use\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n        require(\n            (value == 0) || (token.allowance(address(this), spender) == 0),\n            \"SafeERC20: approve from non-zero to non-zero allowance\"\n        );\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        unchecked {\n            uint256 oldAllowance = token.allowance(address(this), spender);\n            require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n     * to be set to zero before setting it to a non-zero value, such as USDT.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\n\n        if (!_callOptionalReturnBool(token, approvalCall)) {\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\n            _callOptionalReturn(token, approvalCall);\n        }\n    }\n\n    /**\n     * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\n     * Revert on invalid signature.\n     */\n    function safePermit(\n        IERC20Permit token,\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) internal {\n        uint256 nonceBefore = token.nonces(owner);\n        token.permit(owner, spender, value, deadline, v, r, s);\n        uint256 nonceAfter = token.nonces(owner);\n        require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n        // the target address contains contract code and also asserts for success in the low-level call.\n\n        bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n        require(returndata.length == 0 || abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\n     */\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\n        // and not revert is the subcall reverts.\n\n        (bool success, bytes memory returndata) = address(token).call(data);\n        return\n            success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));\n    }\n}\n","keccak256":"0xabefac93435967b4d36a4fabcbdbb918d1f0b7ae3c3d85bc30923b326c927ed1","license":"MIT"},"@openzeppelin/contracts/utils/Address.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     *\n     * Furthermore, `isContract` will also return true if the target contract within\n     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n     * which only has an effect at the end of a transaction.\n     * ====\n     *\n     * [IMPORTANT]\n     * ====\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\n     *\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n     * constructor.\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize/address.code.length, which returns 0\n        // for contracts in construction, since the code is only stored at the end\n        // of the constructor execution.\n\n        return account.code.length > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n     *\n     * _Available since v4.8._\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        if (success) {\n            if (returndata.length == 0) {\n                // only check isContract if the call was successful and the return data is empty\n                // otherwise we already know that it was a contract\n                require(isContract(target), \"Address: call to non-contract\");\n            }\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason or using the provided one.\n     *\n     * _Available since v4.3._\n     */\n    function verifyCallResult(\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal pure returns (bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    function _revert(bytes memory returndata, string memory errorMessage) private pure {\n        // Look for revert reason and bubble it up if present\n        if (returndata.length > 0) {\n            // The easiest way to bubble the revert reason is using memory via assembly\n            /// @solidity memory-safe-assembly\n            assembly {\n                let returndata_size := mload(returndata)\n                revert(add(32, returndata), returndata_size)\n            }\n        } else {\n            revert(errorMessage);\n        }\n    }\n}\n","keccak256":"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa","license":"MIT"},"contracts/src/Minting/MinterManagerInterface.sol":{"content":"//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\n/**\n * @title MinterManagementInterface\n * @notice Interface that defines external functions for managing minters and their allowances.\n * @dev Implementing contracts should provide functionality for adding, removing, and configuring minters.\n */\ninterface MinterManagementInterface {\n    /**\n     * @notice Checks if an account is a registered minter.\n     * @param _account The address to check.\n     * @return A boolean indicating whether the address is a minter.\n     */\n    function isMinter(address _account) external view returns (bool);\n\n    /**\n     * @notice Gets the allowance of a minter.\n     * @param _minter The address of the minter.\n     * @return The amount of tokens the minter is allowed to mint.\n     */\n    function getMinterAllowance(address _minter) external view returns (uint256);\n\n    /**\n     * @notice Configures a new minter or updates the allowance of an existing minter.\n     * @param _minter The address of the minter.\n     * @param _minterAllowedAmount The new allowance for the minter.\n     * @return A boolean indicating whether the configuration was successful.\n     */\n    function configureMinter(address _minter, uint256 _minterAllowedAmount) external returns (bool);\n\n    /**\n     * @notice Removes a minter.\n     * @param _minter The address of the minter to remove.\n     * @return A boolean indicating whether the removal was successful.\n     */\n    function removeMinter(address _minter) external returns (bool);\n}\n","keccak256":"0xfe064d5b36d033b5069dbe5729c3cc22d670e13f59f5bf0d271d9c4630404970","license":"MIT"},"contracts/src/TokenContracts/AbstractTokenV1.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/**\n * @title AbstractTokenV1\n * @dev Abstract contract for ERC20 token operations. Defines internal functions for approving and transferring tokens.\n * Inherits from the IERC20 interface.\n */\nabstract contract AbstractTokenV1 is IERC20 {\n    /**\n     * @notice Internal function to set the allowance for a spender over the owner's tokens.\n     * @param owner The address of the token owner.\n     * @param spender The address of the spender.\n     * @param value The amount of tokens the spender is allowed to spend.\n     * @dev This function must be overridden in the derived contract.\n     */\n    function _approve(address owner, address spender, uint256 value) internal virtual;\n\n    /**\n     * @notice Internal function to transfer tokens from one address to another.\n     * @param from The address of the token sender.\n     * @param to The address of the token recipient.\n     * @param value The amount of tokens to transfer.\n     * @dev This function must be overridden in the derived contract.\n     */\n    function _transfer(address from, address to, uint256 value) internal virtual;\n\n    // Storage Gap for future upgrades\n    uint256[49] private __gap;\n}\n","keccak256":"0xf7de2b5fb878e57e403e27a3a2a0fb777f01a5271fcc2ea2ac5e0c5aebef9dbb","license":"MIT"},"contracts/src/TokenContracts/Blacklistable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\nimport {PermissionAdmin} from \"./PermissionAdmin.sol\";\n\n/**\n * @title Blacklistable\n * @notice Contract that allows accounts to be blacklisted by a \"blacklister\" role.\n * @dev Inherits from PermissionAdmin to manage blacklister permissions.\n */\nabstract contract Blacklistable is PermissionAdmin {\n    address internal _blacklister;\n    mapping(address => bool) public blacklisted;\n\n    /// @notice Emitted when an account is blacklisted.\n    /// @param _account The address of the blacklisted account.\n    event Blacklisted(address indexed _account);\n\n    /// @notice Emitted when an account is removed from the blacklist.\n    /// @param _account The address of the unblacklisted account.\n    event UnBlacklisted(address indexed _account);\n\n    /// @notice Emitted when the blacklister is changed.\n    /// @param newBlacklister The address of the new blacklister.\n    event BlacklisterChanged(address indexed newBlacklister);\n\n    /// @notice Error thrown when the caller is not the blacklister.\n    error Blacklistable__CallerNotBlacklister();\n\n    /// @notice Error thrown when trying to perform an operation with the zero address, which is prohibited.\n    error Blacklistable__NoZeroAddress();\n\n    /// @notice Error thrown when the account is already blacklisted.\n    /// @param account The address that is already blacklisted.\n    error Blacklistable__AccountBlacklisted(address account);\n\n    /// @notice Error thrown when the blacklister tries to blacklist themselves.\n    error Blacklistable__BlacklisterSelfBlacklist();\n\n    /// @notice Error thrown when trying to unblacklist an address that is already non blacklisted.\n    error Blacklistable__NotBlacklisted(address account);\n\n    /**\n     * @dev Modifier to make a function callable only by the blacklister.\n     */\n    modifier onlyBlacklister() {\n        if (msg.sender != _blacklister) revert Blacklistable__CallerNotBlacklister();\n        _;\n    }\n\n    /**\n    * @dev Ensures the specified account is not blacklisted and the blacklister is properly set.\n    * @param _account The address to check for blacklisting.\n    * @custom:revert Blacklistable__NoZeroAddress if the blacklister address has not been set (is zero).\n    * @custom:revert Blacklistable__AccountBlacklisted if the account is blacklisted.\n    */\n    modifier notBlacklisted(address _account) {\n        if (_blacklister == address(0)) revert Blacklistable__NoZeroAddress();\n        if (blacklisted[_account]) revert Blacklistable__AccountBlacklisted(_account);\n        _;\n    }\n\n    /**\n     * @notice Returns the current blacklister.\n     * @return The address of the current blacklister.\n     */\n    function getBlacklister() external view returns (address) {\n        return _blacklister;\n    }\n\n    /**\n     * @notice Checks if an account is blacklisted.\n     * @param _account The address to check.\n     * @return True if the account is blacklisted, false otherwise.\n     */\n    function isBlacklisted(address _account) external view returns (bool) {\n        return blacklisted[_account];\n    }\n\n    /**\n     * @notice Adds an account to the blacklist.\n     * @param _account The address to blacklist.\n     * @dev Emits a {Blacklisted} event.\n     * @dev Can only be called by the current blacklister.\n     * @dev The address cannot be the zero address or the blacklister's own address.\n     */\n    function blacklist(address _account) external onlyBlacklister {\n        if (blacklisted[_account]) revert Blacklistable__AccountBlacklisted(_account);\n        if (_account == _blacklister) revert Blacklistable__BlacklisterSelfBlacklist();\n        if (_account == address(0)) revert Blacklistable__NoZeroAddress();\n        blacklisted[_account] = true;\n        emit Blacklisted(_account);\n    }\n\n    /**\n     * @notice Removes an account from the blacklist.\n     * @param _account The address to remove from the blacklist.\n     * @dev Emits an {UnBlacklisted} event.\n     * @dev Can only be called by the current blacklister.\n     */\n    function unBlacklist(address _account) external onlyBlacklister {\n         if (!blacklisted[_account]) revert Blacklistable__NotBlacklisted(_account);\n        blacklisted[_account] = false;\n        emit UnBlacklisted(_account);\n    }\n\n    /**\n     * @notice Updates the blacklister role to a new address.\n     * @param _newBlacklister The address of the new blacklister.\n     * @dev Emits a {BlacklisterChanged} event.\n     * @dev Can only be called by the permission admin.\n     * @dev The new blacklister address cannot be the zero address.\n     */\n    function updateBlacklister(address _newBlacklister) external onlyPermissionAdmin {\n        if (_newBlacklister == address(0)) revert Blacklistable__NoZeroAddress();\n        _blacklister = _newBlacklister;\n        emit BlacklisterChanged(_blacklister);\n    }\n\n    // Storage Gap for future upgrades\n    uint256[49] private __gap;\n}\n","keccak256":"0x567cf0588630276c10b9987e83501c0c7bf1191ec2c62d27e9b5d59128a94a95","license":"MIT"},"contracts/src/TokenContracts/Ownable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\n\n/**\n * @title Ownable\n * @dev The Ownable contract has an owner address and provides basic authorization control functions.\n * Inherits from Initializable for upgradeable contract pattern.\n */\ncontract Ownable is Initializable {\n    // Address of the contract owner\n    address private _owner;\n\n    // Address of the pending owner\n    address private _pendingOwner;\n\n    /**\n     * @notice Error thrown when a zero address is provided.\n     */\n    error Ownable__NoZeroAddress();\n\n    /**\n     * @notice Error thrown when a caller is not the owner.\n     */\n    error Ownable__CallerNotOwner();\n\n    /**\n     * @notice Error thrown when a caller is not the pending owner.\n     */\n    error Ownable__CallerNotPendingOwner();\n\n    /**\n     * @dev Event emitted when ownership is transferred.\n     * @param previousOwner The address of the previous owner.\n     * @param newOwner The address of the new owner.\n     */\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Event emitted when ownership transfer is started.\n     * @param previousOwner The address of the previous owner.\n     * @param newOwner The address of the new owner.\n     */\n    event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Modifier to check if the caller is the owner.\n     */\n    modifier onlyOwner() {\n        if (msg.sender != _owner) revert Ownable__CallerNotOwner();\n        _;\n    }\n\n    /**\n     * @dev Modifier to check if the caller is the pending owner.\n     */\n    modifier onlyPendingOwner() {\n        if (msg.sender != _pendingOwner) revert Ownable__CallerNotPendingOwner();\n        _;\n    }\n\n    /**\n     * @notice Initializes the contract setting the deployer as the initial owner.\n     * @param owner The address of the initial owner.\n     */\n    function initialize(address owner) public onlyInitializing {\n        setOwner(owner);\n    }\n\n    /**\n     * @notice Returns the address of the current owner.\n     * @return The address of the owner.\n     */\n    function getOwner() external view returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @notice Returns the address of the pending owner.\n     * @return The address of the pending owner.\n     */\n    function getPendingOwner() external view returns (address) {\n        return _pendingOwner;\n    }\n\n    /**\n     * @dev Sets a new owner address internally.\n     * @param newOwner The address to set as the new owner.\n     */\n    function setOwner(address newOwner) internal {\n        _owner = newOwner;\n    }\n\n    /**\n     * @notice Starts the ownership transfer of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     * @param newOwner The address to transfer ownership to.\n     */\n    function transferOwnership(address newOwner) external onlyOwner {\n        if (newOwner == address(0)) revert Ownable__NoZeroAddress();\n        _pendingOwner = newOwner;\n        emit OwnershipTransferStarted(_owner, newOwner);\n    }\n\n    /**\n     * @notice The new owner accepts the ownership transfer.\n     * Can only be called by the pending owner.\n     */\n    function acceptOwnership() external onlyPendingOwner {\n        address oldOwner = _owner;\n        setOwner(_pendingOwner);\n        _pendingOwner = address(0);\n        emit OwnershipTransferred(oldOwner, _owner);\n    }\n\n    // Storage Gap for future upgrades\n    uint256[49] private __gap;\n}","keccak256":"0xbc69a8b4f2f1f24a8656dcf7644b8ff8b4558cc07aceb903f8a4b74a6135f749","license":"MIT"},"contracts/src/TokenContracts/Pausable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\nimport {PermissionAdmin} from \"./PermissionAdmin.sol\";\n\n/**\n * @title Pausable\n * @notice Base contract which allows children to implement an emergency stop mechanism.\n * @dev Inherits from PermissionAdmin to manage pauser permissions.\n */\nabstract contract Pausable is PermissionAdmin {\n    address internal _pauser;\n    bool public paused;\n\n    /// @notice Emitted when the contract is paused.\n    event Paused();\n\n    /// @notice Emitted when the contract is unpaused.\n    event Unpaused();\n\n    /// @notice Emitted when the pauser is changed.\n    /// @param newPauser The address of the new pauser.\n    event PauserChanged(address indexed newPauser);\n\n    /// @notice Error thrown when trying to perform an action while the contract is paused.\n    error Pausable__Paused();\n\n    /// @notice Error thrown when the caller is not the pauser.\n    error Pausable__CallerNotPauser();\n\n    /// @notice Error thrown when trying to pause the contract when it is already paused.\n    error Pausable__AlreadyPaused();\n\n    /// @notice Error thrown when trying to unpause the contract when it is not paused.\n    error Pausable__AlreadyUnpaused();\n\n    /// @notice Error thrown when trying to set the pauser to the zero address.\n    error Pausable__NoZeroAddress();\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is not paused.\n     */\n    modifier whenNotPaused() {\n        if (paused) revert Pausable__Paused();\n        _;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only by the pauser.\n     */\n    modifier onlyPauser() {\n        if (msg.sender != _pauser) revert Pausable__CallerNotPauser();\n        _;\n    }\n\n    /**\n     * @notice Returns the current pauser.\n     * @return The address of the current pauser.\n     */\n    function getPauser() external view returns (address) {\n        return _pauser;\n    }\n\n    /**\n     * @notice Called by the pauser to pause the contract, triggering the stopped state.\n     * @dev Emits a {Paused} event.\n     * @dev Can only be called by the current pauser.\n     */\n    function pause() external onlyPauser {\n        if (paused) revert Pausable__AlreadyPaused();\n        paused = true;\n        emit Paused();\n    }\n\n    /**\n     * @notice Initializes the contract in an unpaused state.\n     * @dev This function should be called during contract initialization.\n     */\n    function initializePausable() public onlyInitializing {\n        paused = false;\n    }\n\n    /**\n     * @notice Called by the pauser to unpause the contract, returning to normal state.\n     * @dev Emits an {Unpaused} event.\n     * @dev Can only be called by the current pauser.\n     */\n    function unpause() external onlyPauser {\n        if (!paused) revert Pausable__AlreadyUnpaused();\n        paused = false;\n        emit Unpaused();\n    }\n\n    /**\n     * @notice Updates the pauser role to a new address.\n     * @param _newPauser The address of the new pauser.\n     * @dev Emits a {PauserChanged} event.\n     * @dev Can only be called by the permission admin.\n     * @dev The new pauser address cannot be the zero address.\n     */\n    function updatePauser(address _newPauser) external onlyPermissionAdmin {\n        if (_newPauser == address(0)) revert Pausable__NoZeroAddress();\n        _pauser = _newPauser;\n        emit PauserChanged(_pauser);\n    }\n\n    // Storage Gap for future upgrades\n    uint256[49] private __gap;\n}\n","keccak256":"0x506cdecfe07cf9ad6513e6b7154b005dd2bcbacf66411a44252398cdb08ca328","license":"MIT"},"contracts/src/TokenContracts/PermissionAdmin.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\nimport {Ownable} from \"./Ownable.sol\";\n\n/**\n * @title PermissionAdmin\n * @notice Base contract which allows the owner to set an admin with the ability to select the pauser, blacklister, and rescuer.\n * @dev Only the contract owner can modify the admin. The admin has special permissions defined by this contract.\n */\nabstract contract PermissionAdmin is Ownable {\n    address private _permissionAdmin;\n\n    /// @notice Emitted when the permission admin is changed.\n    /// @param admin The new permission admin.\n    event PermissionAdminChanged(address indexed admin);\n\n    /// @notice Error thrown when the caller is not the permission admin.\n    error PermissionAdmin__CallerNotPermissionAdmin();\n\n    /// @notice Error thrown when trying to set the permission admin to the zero address.\n    error PermissionAdmin__NoZeroAddress();\n    \n    /**\n     * @dev Modifier to make a function callable only by the permission admin.\n     */\n    modifier onlyPermissionAdmin() {\n        if (msg.sender != _permissionAdmin) {\n            revert PermissionAdmin__CallerNotPermissionAdmin();\n        }\n        _;\n    }\n\n    /**\n     * @notice Returns the current permission admin.\n     * @return The address of the current permission admin.\n     */\n    function getPermissionAdmin() external view returns (address) {\n        return _permissionAdmin;\n    }\n\n    /**\n     * @notice Sets a new permission admin.\n     * @param _newAdmin The address of the new permission admin.\n     * @dev Only the contract owner can call this function. The new admin address cannot be the zero address.\n     */\n    function setPermissionAdmin(address _newAdmin) external onlyOwner {\n        if (_newAdmin == address(0)) revert PermissionAdmin__NoZeroAddress();\n        _permissionAdmin = _newAdmin;\n        emit PermissionAdminChanged(_permissionAdmin);\n    }\n\n    // Storage Gap for future upgrades\n    uint256[49] private __gap;\n}\n","keccak256":"0x3125291a5f5437c83c1fa9945887e9c3c354e2a0904faf7038fa829dab3a0023","license":"MIT"},"contracts/src/TokenContracts/Rescuable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {PermissionAdmin} from \"./PermissionAdmin.sol\";\n\n/**\n * @title Rescuable\n * @notice Contract that allows rescuing ERC20 tokens locked up in this contract by a \"rescuer\" role.\n * @dev Inherits from PermissionAdmin to manage rescuer permissions.\n */\nabstract contract Rescuable is PermissionAdmin {\n    using SafeERC20 for IERC20;\n\n    address internal _rescuer;\n\n    /// @notice Error thrown when the caller is not the rescuer.\n    error Rescuable__CallerNotRescuer();\n\n    /// @notice Error thrown when trying to set the rescuer to the zero address.\n    error Rescuable__NoZeroAddress();\n\n    /// @notice Emitted when the rescuer is changed.\n    /// @param newRescuer The address of the new rescuer.\n    event RescuerChanged(address indexed newRescuer);\n\n    /**\n     * @notice Returns the current rescuer.\n     * @return The address of the current rescuer.\n     */\n    function rescuer() external view returns (address) {\n        return _rescuer;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only by the rescuer.\n     */\n    modifier onlyRescuer() {\n        if (msg.sender != _rescuer) revert Rescuable__CallerNotRescuer();\n        _;\n    }\n\n    /**\n     * @notice Rescue ERC20 tokens locked up in this contract.\n     * @param tokenContract The address of the ERC20 token contract.\n     * @param to The recipient address to receive the rescued tokens.\n     * @param amount The amount of tokens to withdraw.\n     * @dev Can only be called by the current rescuer.\n     */\n    function rescueERC20(\n        IERC20 tokenContract,\n        address to,\n        uint256 amount\n    ) external onlyRescuer {\n        tokenContract.safeTransfer(to, amount);\n    }\n\n    /**\n     * @notice Assign the rescuer role to a given address.\n     * @param newRescuer The address of the new rescuer.\n     * @dev Emits a {RescuerChanged} event.\n     * @dev Can only be called by the permission admin.\n     * @dev The new rescuer address cannot be the zero address.\n     */\n    function updateRescuer(address newRescuer) external onlyPermissionAdmin {\n        if (newRescuer == address(0)) revert Rescuable__NoZeroAddress();\n        _rescuer = newRescuer;\n        emit RescuerChanged(newRescuer);\n    }\n\n    // Storage Gap for future upgrades\n    uint256[49] private __gap;\n}\n","keccak256":"0x6e3f9c8bb0f4a17be5ba22cebc6d17959892c1587419a7a13990ea5d583b488a","license":"MIT"},"contracts/src/TokenContracts/TokenV1.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\nimport {AbstractTokenV1} from \"./AbstractTokenV1.sol\";\nimport {Ownable} from \"./Ownable.sol\";\nimport {Pausable} from \"./Pausable.sol\";\nimport {Blacklistable} from \"./Blacklistable.sol\";\nimport {Rescuable} from \"./Rescuable.sol\";\nimport {MinterManagementInterface} from \"../Minting/MinterManagerInterface.sol\";\n\n/**\n * @title TokenV1\n * @dev ERC20 Token backed by fiat reserves with additional functionality for minting, burning, pausing, blacklisting, and rescuing tokens.\n * Inherits MinterManagementInterface to comply with minter management specifications.\n */\ncontract TokenV1 is AbstractTokenV1, Ownable, Pausable, Blacklistable, Rescuable, MinterManagementInterface {\n    string private _name;\n    string private _symbol;\n    uint8 private _decimals;\n    string public currency;\n    address public masterMinter;\n\n    uint256 internal _totalSupply;\n\n    mapping(address => uint256) internal balances;\n    mapping(address => mapping(address => uint256)) internal allowed;\n    mapping(address => bool) public isMinter;\n    mapping(address => uint256) public minterAllowance; // Allowance set by approval\n\n    /**\n     * @dev Emitted when tokens are minted.\n     * @param minter The address of the minter.\n     * @param to The address of the recipient.\n     * @param amount The amount of tokens minted.\n     */\n    event Mint(address indexed minter, address indexed to, uint256 amount);\n\n    /**\n     * @dev Emitted when tokens are burned.\n     * @param burner The address of the burner.\n     * @param amount The amount of tokens burned.\n     */\n    event Burn(address indexed burner, uint256 amount);\n\n    /**\n     * @dev Emitted when a minter is configured.\n     * @param minter The address of the minter.\n     * @param minterAllowedAmount The allowance of the minter.\n     */\n    event MinterConfigured(address indexed minter, uint256 minterAllowedAmount);\n\n    /**\n     * @dev Emitted when a minter is removed.\n     * @param oldMinter The address of the removed minter.\n     */\n    event MinterRemoved(address indexed oldMinter);\n\n    /**\n     * @dev Emitted when the master minter is changed.\n     * @param newMasterMinter The address of the new master minter.\n     */\n    event MasterMinterChanged(address indexed newMasterMinter);\n\n    /**\n     * @dev Emitted when the token decimals are set.\n     * @param decimals The number of decimals set.\n     */\n    event TokenDecimalsSet(uint8 decimals);\n\n    /**\n     * @dev Emitted when a new master minter is set.\n     * @param newMasterMinter The address of the new master minter.\n     */\n    event NewMasterMinter(address indexed newMasterMinter);\n\n    /**\n     * @dev Emitted when a new pauser is set.\n     * @param newPauser The address of the new pauser.\n     */\n    event NewPauser(address indexed newPauser);\n\n    /**\n     * @dev Emitted when a new blacklister is set.\n     * @param newBlacklister The address of the new blacklister.\n     */\n    event NewBlacklister(address indexed newBlacklister);\n\n    /**\n     * @dev Error thrown when the caller is not a minter.\n     */\n    error NotMinter();\n\n    /**\n     * @dev Error thrown when the caller is not the master minter.\n     */\n    error NotMasterMinter();\n\n    /**\n     * @dev Error thrown when a zero address is provided.\n     */\n    error NoZeroAddress();\n\n    /**\n     * @dev Error thrown when the mint amount is zero.\n     */\n    error MintMustBeGreaterThanZero();\n\n    /**\n     * @dev Error thrown when the amount exceeds the balance.\n     */\n    error AmountExceedsBalance();\n\n    /**\n     * @dev Error thrown when the burn amount is not greater than zero.\n     */\n    error BurnAmountNotGreaterThanZero();\n\n    /**\n     * @dev Error thrown when the allowance is exceeded.\n     */\n    error AllowanceExceeded();\n\n    /**\n     * @dev Error thrown when a minter tries to mint to a different address.\n     */\n    error NotSelfMinting();\n\n    /**\n     * @dev Error thrown when an attempt to decrease the allowance fails.\n     * @param owner The owner address.\n     * @param spender The spender address.\n     * @param currentAllowance The current allowance.\n     * @param decrement The decrement amount.\n     */\n    error FailedDecreaseAllowance(address owner, address spender, uint256 currentAllowance, uint256 decrement);\n\n    /**\n     * @dev Error thrown when an address is not blacklisted.\n     */\n    error NotBlacklisted();\n\n    /**\n     * @dev Error thrown when an address has zero balance.\n     */\n    error ZeroBalance();\n\n    /**\n     * @dev Modifier to make a function callable only by a minter.\n     */\n    modifier onlyMinter() {\n        if (!isMinter[msg.sender]) revert NotMinter();\n        _;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only by the master minter.\n     */\n    modifier onlyMasterMinter() {\n        if (msg.sender != masterMinter) revert NotMasterMinter();\n        _;\n    }\n\n    /**\n     * @notice Initializes the token with given parameters at most once.\n     * @param tokenName The name of the token.\n     * @param tokenSymbol The symbol of the token.\n     * @param tokenCurrency The currency of the token.\n     * @param tokenDecimals The number of decimals the token uses.\n     * @param newMasterMinter The address of the new master minter.\n     * @param newPauser The address of the new pauser.\n     * @param newBlacklister The address of the new blacklister.\n     * @param newRescuer The address of the new rescuer.\n     */\n    function initializeToken(\n        string calldata tokenName,\n        string calldata tokenSymbol,\n        string calldata tokenCurrency,\n        uint8 tokenDecimals,\n        address newMasterMinter,\n        address newPauser,\n        address newBlacklister,\n        address newRescuer\n    ) public initializer {\n        Ownable.initialize(msg.sender);\n        Pausable.initializePausable();\n\n        if (newMasterMinter == address(0)) revert NoZeroAddress();\n        if (newPauser == address(0)) revert NoZeroAddress();\n        if (newBlacklister == address(0)) revert NoZeroAddress();\n        if (newRescuer == address(0)) revert NoZeroAddress();\n\n        _name = tokenName;\n        _symbol = tokenSymbol;\n        currency = tokenCurrency;\n        _decimals = tokenDecimals;\n        masterMinter = newMasterMinter;\n        _pauser = newPauser;\n        _blacklister = newBlacklister;\n        _rescuer = newRescuer;\n\n        emit NewMasterMinter(newMasterMinter);\n        emit NewPauser(newPauser);\n        emit NewBlacklister(newBlacklister);\n        emit TokenDecimalsSet(tokenDecimals);\n        emit RescuerChanged(newRescuer);\n    }\n\n    /**\n     * @notice Returns the name of the token.\n     * @return The name of the token.\n     */\n    function name() public view virtual returns (string memory) {\n        return _name;\n    }\n\n    /**\n     * @notice Returns the symbol of the token.\n     * @return The symbol of the token.\n     */\n    function symbol() public view virtual returns (string memory) {\n        return _symbol;\n    }\n\n    /**\n     * @notice Returns the number of decimals used to get its user representation.\n     * @return The number of decimals used by the token.\n     */\n    function decimals() public view virtual returns (uint8) {\n        return _decimals;\n    }\n\n    /**\n     * @notice Returns the minting allowance of a minter.\n     * @param minter The address of the minter.\n     * @return The minting allowance of the minter.\n     */\n    function getMinterAllowance(address minter) external view override returns (uint256) {\n        return minterAllowance[minter];\n    }\n\n    /**\n     * @notice Returns the amount of tokens that spender is allowed to transfer on behalf of owner.\n     * @param owner Token owner's address.\n     * @param spender Spender's address.\n     * @return The allowance amount.\n     */\n    function allowance(address owner, address spender) external view override returns (uint256) {\n        return allowed[owner][spender];\n    }\n\n    /**\n     * @notice Returns the total supply of the token.\n     * @return The total supply.\n     */\n    function totalSupply() external view override returns (uint256) {\n        return _totalSupply;\n    }\n\n    /**\n     * @notice Returns the token balance of an account.\n     * @param account The address of the account.\n     * @return The token balance of the account.\n     */\n    function balanceOf(address account) external view override returns (uint256) {\n        return balances[account];\n    }\n\n    /**\n     * @notice Sets spender's allowance over the caller's tokens to be a given value.\n     * @param spender Spender's address.\n     * @param value Allowance amount.\n     * @return True if the operation was successful.\n     */\n    function approve(\n        address spender,\n        uint256 value\n    )\n        external\n        override\n        whenNotPaused\n        notBlacklisted(msg.sender)\n        notBlacklisted(spender)\n        returns (bool)\n    {\n        _approve(msg.sender, spender, value);\n        return true;\n    }\n\n    /**\n     * @notice Internal function to set allowance.\n     * @param owner Token owner's address.\n     * @param spender Spender's address.\n     * @param value Allowance amount.\n     */\n    function _approve(address owner, address spender, uint256 value) internal override {\n        if (owner == address(0)) revert NoZeroAddress();\n        if (spender == address(0)) revert NoZeroAddress();\n        allowed[owner][spender] = value;\n        emit Approval(owner, spender, value);\n    }\n\n    /**\n     * @notice Transfers tokens from one address to another using allowance.\n     * @param from Payer's address.\n     * @param to Payee's address.\n     * @param value Transfer amount.\n     * @return True if the operation was successful.\n     */\n    function transferFrom(\n    address from,\n    address to,\n    uint256 value\n    )\n        external\n        override\n        whenNotPaused\n        notBlacklisted(msg.sender)\n        notBlacklisted(from)\n        notBlacklisted(to)\n        returns (bool)\n    {\n        if (value > allowed[from][msg.sender]) revert AllowanceExceeded();\n        _transfer(from, to, value);\n        allowed[from][msg.sender] -= value;\n        return true;\n    }\n\n    /**\n     * @notice Transfers tokens from the caller to another address.\n     * @param to Payee's address.\n     * @param value Transfer amount.\n     * @return True if the operation was successful.\n     */\n    function transfer(\n        address to,\n        uint256 value\n    )\n        external\n        override\n        whenNotPaused\n        notBlacklisted(msg.sender)\n        notBlacklisted(to)\n        returns (bool)\n    {\n        _transfer(msg.sender, to, value);\n        return true;\n    }\n\n    /**\n     * @notice Internal function to process token transfers.\n     * @param from Payer's address.\n     * @param to Payee's address.\n     * @param value Transfer amount.\n     */\n    function _transfer(address from, address to, uint256 value) internal override {\n        if (from == address(0)) revert NoZeroAddress();\n        if (to == address(0)) revert NoZeroAddress();\n        if (value > balances[from]) revert AmountExceedsBalance();\n\n        balances[from] -= value;\n        balances[to] += value;\n        emit Transfer(from, to, value);\n    }\n\n    /**\n     * @notice Configures a new minter or updates the allowance of an existing minter.\n     * @param minter The address of the minter.\n     * @param _minterAllowedAmount The minting allowance for the minter.\n     * @return True if the operation was successful.\n     */\n    function configureMinter(\n        address minter,\n        uint256 _minterAllowedAmount\n    ) external override whenNotPaused onlyMasterMinter returns (bool) {\n        isMinter[minter] = true;\n        minterAllowance[minter] = _minterAllowedAmount;\n\n        emit MinterConfigured(minter, _minterAllowedAmount);\n        return true;\n    }\n\n    /**\n     * @notice Removes a minter.\n     * @param minter The address of the minter to remove.\n     * @return True if the operation was successful.\n     */\n    function removeMinter(address minter) external override onlyMasterMinter returns (bool) {\n        isMinter[minter] = false;\n        minterAllowance[minter] = 0;\n        emit MinterRemoved(minter);\n        return true;\n    }\n\n    /**\n     * @notice Allows a minter to burn some of its own tokens.\n     * @param _amount The amount of tokens to be burned.\n     */\n    function burn(uint256 _amount) external whenNotPaused onlyMinter notBlacklisted(msg.sender) {\n        uint256 balance = balances[msg.sender];\n        if (_amount <= 0) revert BurnAmountNotGreaterThanZero();\n        if (balance < _amount) revert AmountExceedsBalance();\n\n        _totalSupply -= _amount;\n        balances[msg.sender] -= _amount;\n        emit Burn(msg.sender, _amount);\n        emit Transfer(msg.sender, address(0), _amount);\n    }\n\n    /**\n     * @notice Allows a minter to minter some of its tokens from allowance.\n     * @param _to The address to receive the minted tokens.\n     * @param _amount The amount of tokens to mint.\n     * @return True if the operation was successful.\n     */\n    function mint(\n        address _to,\n        uint256 _amount\n    ) public whenNotPaused onlyMinter notBlacklisted(msg.sender) notBlacklisted(_to) returns (bool) {\n        if (_to == address(0)) revert NoZeroAddress();\n        if (_amount <= 0) revert MintMustBeGreaterThanZero();\n        if (msg.sender != _to) revert NotSelfMinting();\n        if (minterAllowance[_to] < _amount) revert AllowanceExceeded();\n\n        _totalSupply += _amount;\n        balances[_to] += _amount;\n        minterAllowance[_to] -= _amount;\n        emit Mint(msg.sender, _to, _amount);\n        emit Transfer(address(0), _to, _amount);\n        return true;\n    }\n\n    /**\n     * @notice Updates the master minter address.\n     * @param _newMasterMinter The address of the new master minter.\n     */\n    function updateMasterMinter(address _newMasterMinter) external onlyOwner {\n        if (_newMasterMinter == address(0)) revert NoZeroAddress();\n        masterMinter = _newMasterMinter;\n        emit MasterMinterChanged(masterMinter);\n    }\n\n    /**\n     * @notice Increases the allowance by a given increment.\n     * @param spender Spender's address.\n     * @param increment The amount to increase the allowance by.\n     * @return True if the operation was successful.\n     */\n    function increaseAllowance(\n        address spender,\n        uint256 increment\n    ) external whenNotPaused notBlacklisted(msg.sender) notBlacklisted(spender) returns (bool) {\n        address owner = msg.sender;\n        _approve(owner, spender, allowed[owner][spender] + increment);\n\n        return true;\n    }\n\n    /**\n     * @notice Decreases the allowance by a given decrement.\n     * @param spender Spender's address.\n     * @param decrement The amount to decrease the allowance by.\n     * @return True if the operation was successful.\n     */\n    function decreaseAllowance(\n        address spender,\n        uint256 decrement\n    ) external whenNotPaused notBlacklisted(msg.sender) notBlacklisted(spender) returns (bool) {\n        address owner = msg.sender;\n        uint256 currentAllowance = allowed[owner][spender];\n        if (currentAllowance < decrement) {\n            revert FailedDecreaseAllowance(owner, spender, currentAllowance, decrement);\n        }\n\n        _approve(owner, spender, currentAllowance - decrement);\n        return true;\n    }\n\n    /**\n     * @notice Wipes the balance of a blacklisted address, decreasing the totalSupply.\n     * @dev Only the owner can call this function, and the address must be blacklisted.\n     * @param _account The address to wipe.\n     */\n    function wipeBlacklistedAddress(address _account) external onlyOwner {\n        if (!blacklisted[_account]) revert NotBlacklisted();\n        uint256 balance = balances[_account];\n        if (balance == 0) revert ZeroBalance();\n        _totalSupply -= balance;\n        balances[_account] = 0;\n        \n        emit Transfer(_account, address(0), balance);\n    }\n\n    // Storage Gap for future upgrades\n    uint256[49] private __gap;\n}\n","keccak256":"0x67b2703da11ed8d5688c32fc255463ec31f6a188e50559d28b948a760f9b1878","license":"MIT"}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_uint8":{"label":"uint8","encoding":"inplace","numberOfBytes":"1"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_string_storage":{"label":"string","encoding":"bytes","numberOfBytes":"32"},"t_mapping(t_address,t_bool)":{"key":"t_address","label":"mapping(address => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_array(t_uint256)49_storage":{"base":"t_uint256","label":"uint256[49]","encoding":"inplace","numberOfBytes":"1568"},"t_mapping(t_address,t_uint256)":{"key":"t_address","label":"mapping(address => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_mapping(t_address,t_uint256))":{"key":"t_address","label":"mapping(address => mapping(address => uint256))","value":"t_mapping(t_address,t_uint256)","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_array(t_uint256)49_storage","astId":1387,"label":"__gap","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"49","type":"t_uint8","astId":6,"label":"_initialized","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"49","type":"t_bool","astId":9,"label":"_initializing","offset":1,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"49","type":"t_address","astId":1608,"label":"_owner","offset":2,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"50","type":"t_address","astId":1610,"label":"_pendingOwner","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"51","type":"t_array(t_uint256)49_storage","astId":1760,"label":"__gap","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"100","type":"t_address","astId":1921,"label":"_permissionAdmin","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"101","type":"t_array(t_uint256)49_storage","astId":1986,"label":"__gap","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"150","type":"t_address","astId":1770,"label":"_pauser","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"150","type":"t_bool","astId":1772,"label":"paused","offset":20,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"151","type":"t_array(t_uint256)49_storage","astId":1911,"label":"__gap","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"200","type":"t_address","astId":1397,"label":"_blacklister","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"201","type":"t_mapping(t_address,t_bool)","astId":1401,"label":"blacklisted","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"202","type":"t_array(t_uint256)49_storage","astId":1598,"label":"__gap","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"251","type":"t_address","astId":2004,"label":"_rescuer","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"252","type":"t_array(t_uint256)49_storage","astId":2089,"label":"__gap","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"301","type":"t_string_storage","astId":2119,"label":"_name","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"302","type":"t_string_storage","astId":2121,"label":"_symbol","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"303","type":"t_uint8","astId":2123,"label":"_decimals","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"304","type":"t_string_storage","astId":2125,"label":"currency","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"305","type":"t_address","astId":2127,"label":"masterMinter","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"306","type":"t_uint256","astId":2129,"label":"_totalSupply","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"307","type":"t_mapping(t_address,t_uint256)","astId":2133,"label":"balances","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"308","type":"t_mapping(t_address,t_mapping(t_address,t_uint256))","astId":2139,"label":"allowed","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"309","type":"t_mapping(t_address,t_bool)","astId":2143,"label":"isMinter","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"310","type":"t_mapping(t_address,t_uint256)","astId":2147,"label":"minterAllowance","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"311","type":"t_array(t_uint256)49_storage","astId":3090,"label":"__gap","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"}]},"transientStorageLayout":null,"userdoc":{"kind":"user","errors":{"Pausable__Paused()":[{"notice":"Error thrown when trying to perform an action while the contract is paused."}],"Ownable__NoZeroAddress()":[{"notice":"Error thrown when a zero address is provided."}],"Ownable__CallerNotOwner()":[{"notice":"Error thrown when a caller is not the owner."}],"Pausable__AlreadyPaused()":[{"notice":"Error thrown when trying to pause the contract when it is already paused."}],"Pausable__NoZeroAddress()":[{"notice":"Error thrown when trying to set the pauser to the zero address."}],"Rescuable__NoZeroAddress()":[{"notice":"Error thrown when trying to set the rescuer to the zero address."}],"Pausable__AlreadyUnpaused()":[{"notice":"Error thrown when trying to unpause the contract when it is not paused."}],"Pausable__CallerNotPauser()":[{"notice":"Error thrown when the caller is not the pauser."}],"Rescuable__CallerNotRescuer()":[{"notice":"Error thrown when the caller is not the rescuer."}],"Blacklistable__NoZeroAddress()":[{"notice":"Error thrown when trying to perform an operation with the zero address, which is prohibited."}],"Ownable__CallerNotPendingOwner()":[{"notice":"Error thrown when a caller is not the pending owner."}],"PermissionAdmin__NoZeroAddress()":[{"notice":"Error thrown when trying to set the permission admin to the zero address."}],"Blacklistable__CallerNotBlacklister()":[{"notice":"Error thrown when the caller is not the blacklister."}],"Blacklistable__NotBlacklisted(address)":[{"notice":"Error thrown when trying to unblacklist an address that is already non blacklisted."}],"Blacklistable__BlacklisterSelfBlacklist()":[{"notice":"Error thrown when the blacklister tries to blacklist themselves."}],"Blacklistable__AccountBlacklisted(address)":[{"notice":"Error thrown when the account is already blacklisted."}],"PermissionAdmin__CallerNotPermissionAdmin()":[{"notice":"Error thrown when the caller is not the permission admin."}]},"events":{"Paused()":{"notice":"Emitted when the contract is paused."},"Unpaused()":{"notice":"Emitted when the contract is unpaused."},"Blacklisted(address)":{"notice":"Emitted when an account is blacklisted."},"PauserChanged(address)":{"notice":"Emitted when the pauser is changed."},"UnBlacklisted(address)":{"notice":"Emitted when an account is removed from the blacklist."},"RescuerChanged(address)":{"notice":"Emitted when the rescuer is changed."},"BlacklisterChanged(address)":{"notice":"Emitted when the blacklister is changed."},"PermissionAdminChanged(address)":{"notice":"Emitted when the permission admin is changed."}},"methods":{"name()":{"notice":"Returns the name of the token."},"pause()":{"notice":"Called by the pauser to pause the contract, triggering the stopped state."},"symbol()":{"notice":"Returns the symbol of the token."},"rescuer()":{"notice":"Returns the current rescuer."},"unpause()":{"notice":"Called by the pauser to unpause the contract, returning to normal state."},"decimals()":{"notice":"Returns the number of decimals used to get its user representation."},"getOwner()":{"notice":"Returns the address of the current owner."},"getPauser()":{"notice":"Returns the current pauser."},"burn(uint256)":{"notice":"Allows a minter to burn some of its own tokens."},"totalSupply()":{"notice":"Returns the total supply of the token."},"getBlacklister()":{"notice":"Returns the current blacklister."},"acceptOwnership()":{"notice":"The new owner accepts the ownership transfer. Can only be called by the pending owner."},"getPendingOwner()":{"notice":"Returns the address of the pending owner."},"isMinter(address)":{"notice":"Checks if an account is a registered minter."},"balanceOf(address)":{"notice":"Returns the token balance of an account."},"blacklist(address)":{"notice":"Adds an account to the blacklist."},"initialize(address)":{"notice":"Initializes the contract setting the deployer as the initial owner."},"getPermissionAdmin()":{"notice":"Returns the current permission admin."},"initializePausable()":{"notice":"Initializes the contract in an unpaused state."},"unBlacklist(address)":{"notice":"Removes an account from the blacklist."},"mint(address,uint256)":{"notice":"Allows a minter to minter some of its tokens from allowance."},"removeMinter(address)":{"notice":"Removes a minter."},"updatePauser(address)":{"notice":"Updates the pauser role to a new address."},"isBlacklisted(address)":{"notice":"Checks if an account is blacklisted."},"updateRescuer(address)":{"notice":"Assign the rescuer role to a given address."},"approve(address,uint256)":{"notice":"Sets spender's allowance over the caller's tokens to be a given value."},"transfer(address,uint256)":{"notice":"Transfers tokens from the caller to another address."},"allowance(address,address)":{"notice":"Returns the amount of tokens that spender is allowed to transfer on behalf of owner."},"transferOwnership(address)":{"notice":"Starts the ownership transfer of the contract to a new account (`newOwner`). Can only be called by the current owner."},"updateBlacklister(address)":{"notice":"Updates the blacklister role to a new address."},"getMinterAllowance(address)":{"notice":"Returns the minting allowance of a minter."},"setPermissionAdmin(address)":{"notice":"Sets a new permission admin."},"updateMasterMinter(address)":{"notice":"Updates the master minter address."},"wipeBlacklistedAddress(address)":{"notice":"Wipes the balance of a blacklisted address, decreasing the totalSupply."},"configureMinter(address,uint256)":{"notice":"Configures a new minter or updates the allowance of an existing minter."},"decreaseAllowance(address,uint256)":{"notice":"Decreases the allowance by a given decrement."},"increaseAllowance(address,uint256)":{"notice":"Increases the allowance by a given increment."},"rescueERC20(address,address,uint256)":{"notice":"Rescue ERC20 tokens locked up in this contract."},"transferFrom(address,address,uint256)":{"notice":"Transfers tokens from one address to another using allowance."},"initializeToken(string,string,string,uint8,address,address,address,address)":{"notice":"Initializes the token with given parameters at most once."}},"version":1},"devdoc":{"kind":"dev","title":"TokenV1","errors":{"NotMinter()":[{"details":"Error thrown when the caller is not a minter."}],"ZeroBalance()":[{"details":"Error thrown when an address has zero balance."}],"NoZeroAddress()":[{"details":"Error thrown when a zero address is provided."}],"NotBlacklisted()":[{"details":"Error thrown when an address is not blacklisted."}],"NotSelfMinting()":[{"details":"Error thrown when a minter tries to mint to a different address."}],"NotMasterMinter()":[{"details":"Error thrown when the caller is not the master minter."}],"AllowanceExceeded()":[{"details":"Error thrown when the allowance is exceeded."}],"AmountExceedsBalance()":[{"details":"Error thrown when the amount exceeds the balance."}],"MintMustBeGreaterThanZero()":[{"details":"Error thrown when the mint amount is zero."}],"BurnAmountNotGreaterThanZero()":[{"details":"Error thrown when the burn amount is not greater than zero."}],"Blacklistable__AccountBlacklisted(address)":[{"params":{"account":"The address that is already blacklisted."}}],"FailedDecreaseAllowance(address,address,uint256,uint256)":[{"params":{"owner":"The owner address.","spender":"The spender address.","decrement":"The decrement amount.","currentAllowance":"The current allowance."},"details":"Error thrown when an attempt to decrease the allowance fails."}]},"events":{"NewPauser(address)":{"params":{"newPauser":"The address of the new pauser."},"details":"Emitted when a new pauser is set."},"Burn(address,uint256)":{"params":{"amount":"The amount of tokens burned.","burner":"The address of the burner."},"details":"Emitted when tokens are burned."},"MinterRemoved(address)":{"params":{"oldMinter":"The address of the removed minter."},"details":"Emitted when a minter is removed."},"NewBlacklister(address)":{"params":{"newBlacklister":"The address of the new blacklister."},"details":"Emitted when a new blacklister is set."},"TokenDecimalsSet(uint8)":{"params":{"decimals":"The number of decimals set."},"details":"Emitted when the token decimals are set."},"NewMasterMinter(address)":{"params":{"newMasterMinter":"The address of the new master minter."},"details":"Emitted when a new master minter is set."},"MasterMinterChanged(address)":{"params":{"newMasterMinter":"The address of the new master minter."},"details":"Emitted when the master minter is changed."},"Mint(address,address,uint256)":{"params":{"to":"The address of the recipient.","amount":"The amount of tokens minted.","minter":"The address of the minter."},"details":"Emitted when tokens are minted."},"MinterConfigured(address,uint256)":{"params":{"minter":"The address of the minter.","minterAllowedAmount":"The allowance of the minter."},"details":"Emitted when a minter is configured."}},"details":"ERC20 Token backed by fiat reserves with additional functionality for minting, burning, pausing, blacklisting, and rescuing tokens. Inherits MinterManagementInterface to comply with minter management specifications.","methods":{"name()":{"returns":{"_0":"The name of the token."}},"pause()":{"details":"Emits a {Paused} event.Can only be called by the current pauser."},"symbol()":{"returns":{"_0":"The symbol of the token."}},"rescuer()":{"returns":{"_0":"The address of the current rescuer."}},"unpause()":{"details":"Emits an {Unpaused} event.Can only be called by the current pauser."},"decimals()":{"returns":{"_0":"The number of decimals used by the token."}},"getOwner()":{"returns":{"_0":"The address of the owner."}},"getPauser()":{"returns":{"_0":"The address of the current pauser."}},"burn(uint256)":{"params":{"_amount":"The amount of tokens to be burned."}},"totalSupply()":{"returns":{"_0":"The total supply."}},"getBlacklister()":{"returns":{"_0":"The address of the current blacklister."}},"getPendingOwner()":{"returns":{"_0":"The address of the pending owner."}},"balanceOf(address)":{"params":{"account":"The address of the account."},"returns":{"_0":"The token balance of the account."}},"blacklist(address)":{"params":{"_account":"The address to blacklist."},"details":"Emits a {Blacklisted} event.Can only be called by the current blacklister.The address cannot be the zero address or the blacklister's own address."},"initialize(address)":{"params":{"owner":"The address of the initial owner."}},"getPermissionAdmin()":{"returns":{"_0":"The address of the current permission admin."}},"initializePausable()":{"details":"This function should be called during contract initialization."},"unBlacklist(address)":{"params":{"_account":"The address to remove from the blacklist."},"details":"Emits an {UnBlacklisted} event.Can only be called by the current blacklister."},"mint(address,uint256)":{"params":{"_to":"The address to receive the minted tokens.","_amount":"The amount of tokens to mint."},"returns":{"_0":"True if the operation was successful."}},"removeMinter(address)":{"params":{"minter":"The address of the minter to remove."},"returns":{"_0":"True if the operation was successful."}},"updatePauser(address)":{"params":{"_newPauser":"The address of the new pauser."},"details":"Emits a {PauserChanged} event.Can only be called by the permission admin.The new pauser address cannot be the zero address."},"isBlacklisted(address)":{"params":{"_account":"The address to check."},"returns":{"_0":"True if the account is blacklisted, false otherwise."}},"updateRescuer(address)":{"params":{"newRescuer":"The address of the new rescuer."},"details":"Emits a {RescuerChanged} event.Can only be called by the permission admin.The new rescuer address cannot be the zero address."},"approve(address,uint256)":{"params":{"value":"Allowance amount.","spender":"Spender's address."},"returns":{"_0":"True if the operation was successful."}},"transfer(address,uint256)":{"params":{"to":"Payee's address.","value":"Transfer amount."},"returns":{"_0":"True if the operation was successful."}},"allowance(address,address)":{"params":{"owner":"Token owner's address.","spender":"Spender's address."},"returns":{"_0":"The allowance amount."}},"transferOwnership(address)":{"params":{"newOwner":"The address to transfer ownership to."}},"updateBlacklister(address)":{"params":{"_newBlacklister":"The address of the new blacklister."},"details":"Emits a {BlacklisterChanged} event.Can only be called by the permission admin.The new blacklister address cannot be the zero address."},"getMinterAllowance(address)":{"params":{"minter":"The address of the minter."},"returns":{"_0":"The minting allowance of the minter."}},"setPermissionAdmin(address)":{"params":{"_newAdmin":"The address of the new permission admin."},"details":"Only the contract owner can call this function. The new admin address cannot be the zero address."},"updateMasterMinter(address)":{"params":{"_newMasterMinter":"The address of the new master minter."}},"wipeBlacklistedAddress(address)":{"params":{"_account":"The address to wipe."},"details":"Only the owner can call this function, and the address must be blacklisted."},"configureMinter(address,uint256)":{"params":{"minter":"The address of the minter.","_minterAllowedAmount":"The minting allowance for the minter."},"returns":{"_0":"True if the operation was successful."}},"decreaseAllowance(address,uint256)":{"params":{"spender":"Spender's address.","decrement":"The amount to decrease the allowance by."},"returns":{"_0":"True if the operation was successful."}},"increaseAllowance(address,uint256)":{"params":{"spender":"Spender's address.","increment":"The amount to increase the allowance by."},"returns":{"_0":"True if the operation was successful."}},"rescueERC20(address,address,uint256)":{"params":{"to":"The recipient address to receive the rescued tokens.","amount":"The amount of tokens to withdraw.","tokenContract":"The address of the ERC20 token contract."},"details":"Can only be called by the current rescuer."},"transferFrom(address,address,uint256)":{"params":{"to":"Payee's address.","from":"Payer's address.","value":"Transfer amount."},"returns":{"_0":"True if the operation was successful."}},"initializeToken(string,string,string,uint8,address,address,address,address)":{"params":{"newPauser":"The address of the new pauser.","tokenName":"The name of the token.","newRescuer":"The address of the new rescuer.","tokenSymbol":"The symbol of the token.","tokenCurrency":"The currency of the token.","tokenDecimals":"The number of decimals the token uses.","newBlacklister":"The address of the new blacklister.","newMasterMinter":"The address of the new master minter."}}},"version":1,"stateVariables":{"isMinter":{"params":{"_account":"The address to check."},"return":"A boolean indicating whether the address is a minter.","returns":{"_0":"A boolean indicating whether the address is a minter."}}}},"sourceIds":{"contracts/src/TokenContracts/Ownable.sol":{"id":9},"contracts/src/TokenContracts/TokenV1.sol":{"id":13},"@openzeppelin/contracts/utils/Address.sol":{"id":5},"contracts/src/TokenContracts/Pausable.sol":{"id":10},"contracts/src/TokenContracts/Rescuable.sol":{"id":12},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"id":2},"contracts/src/TokenContracts/Blacklistable.sol":{"id":8},"contracts/src/Minting/MinterManagerInterface.sol":{"id":6},"contracts/src/TokenContracts/AbstractTokenV1.sol":{"id":7},"contracts/src/TokenContracts/PermissionAdmin.sol":{"id":11},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"id":4},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"id":3},"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol":{"id":1},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"id":0}},"additionalInput":null,"stdJsonInput":{"sources":{"contracts/src/TokenContracts/Ownable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\n\n/**\n * @title Ownable\n * @dev The Ownable contract has an owner address and provides basic authorization control functions.\n * Inherits from Initializable for upgradeable contract pattern.\n */\ncontract Ownable is Initializable {\n    // Address of the contract owner\n    address private _owner;\n\n    // Address of the pending owner\n    address private _pendingOwner;\n\n    /**\n     * @notice Error thrown when a zero address is provided.\n     */\n    error Ownable__NoZeroAddress();\n\n    /**\n     * @notice Error thrown when a caller is not the owner.\n     */\n    error Ownable__CallerNotOwner();\n\n    /**\n     * @notice Error thrown when a caller is not the pending owner.\n     */\n    error Ownable__CallerNotPendingOwner();\n\n    /**\n     * @dev Event emitted when ownership is transferred.\n     * @param previousOwner The address of the previous owner.\n     * @param newOwner The address of the new owner.\n     */\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Event emitted when ownership transfer is started.\n     * @param previousOwner The address of the previous owner.\n     * @param newOwner The address of the new owner.\n     */\n    event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Modifier to check if the caller is the owner.\n     */\n    modifier onlyOwner() {\n        if (msg.sender != _owner) revert Ownable__CallerNotOwner();\n        _;\n    }\n\n    /**\n     * @dev Modifier to check if the caller is the pending owner.\n     */\n    modifier onlyPendingOwner() {\n        if (msg.sender != _pendingOwner) revert Ownable__CallerNotPendingOwner();\n        _;\n    }\n\n    /**\n     * @notice Initializes the contract setting the deployer as the initial owner.\n     * @param owner The address of the initial owner.\n     */\n    function initialize(address owner) public onlyInitializing {\n        setOwner(owner);\n    }\n\n    /**\n     * @notice Returns the address of the current owner.\n     * @return The address of the owner.\n     */\n    function getOwner() external view returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @notice Returns the address of the pending owner.\n     * @return The address of the pending owner.\n     */\n    function getPendingOwner() external view returns (address) {\n        return _pendingOwner;\n    }\n\n    /**\n     * @dev Sets a new owner address internally.\n     * @param newOwner The address to set as the new owner.\n     */\n    function setOwner(address newOwner) internal {\n        _owner = newOwner;\n    }\n\n    /**\n     * @notice Starts the ownership transfer of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     * @param newOwner The address to transfer ownership to.\n     */\n    function transferOwnership(address newOwner) external onlyOwner {\n        if (newOwner == address(0)) revert Ownable__NoZeroAddress();\n        _pendingOwner = newOwner;\n        emit OwnershipTransferStarted(_owner, newOwner);\n    }\n\n    /**\n     * @notice The new owner accepts the ownership transfer.\n     * Can only be called by the pending owner.\n     */\n    function acceptOwnership() external onlyPendingOwner {\n        address oldOwner = _owner;\n        setOwner(_pendingOwner);\n        _pendingOwner = address(0);\n        emit OwnershipTransferred(oldOwner, _owner);\n    }\n\n    // Storage Gap for future upgrades\n    uint256[49] private __gap;\n}"},"contracts/src/TokenContracts/TokenV1.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\nimport {AbstractTokenV1} from \"./AbstractTokenV1.sol\";\nimport {Ownable} from \"./Ownable.sol\";\nimport {Pausable} from \"./Pausable.sol\";\nimport {Blacklistable} from \"./Blacklistable.sol\";\nimport {Rescuable} from \"./Rescuable.sol\";\nimport {MinterManagementInterface} from \"../Minting/MinterManagerInterface.sol\";\n\n/**\n * @title TokenV1\n * @dev ERC20 Token backed by fiat reserves with additional functionality for minting, burning, pausing, blacklisting, and rescuing tokens.\n * Inherits MinterManagementInterface to comply with minter management specifications.\n */\ncontract TokenV1 is AbstractTokenV1, Ownable, Pausable, Blacklistable, Rescuable, MinterManagementInterface {\n    string private _name;\n    string private _symbol;\n    uint8 private _decimals;\n    string public currency;\n    address public masterMinter;\n\n    uint256 internal _totalSupply;\n\n    mapping(address => uint256) internal balances;\n    mapping(address => mapping(address => uint256)) internal allowed;\n    mapping(address => bool) public isMinter;\n    mapping(address => uint256) public minterAllowance; // Allowance set by approval\n\n    /**\n     * @dev Emitted when tokens are minted.\n     * @param minter The address of the minter.\n     * @param to The address of the recipient.\n     * @param amount The amount of tokens minted.\n     */\n    event Mint(address indexed minter, address indexed to, uint256 amount);\n\n    /**\n     * @dev Emitted when tokens are burned.\n     * @param burner The address of the burner.\n     * @param amount The amount of tokens burned.\n     */\n    event Burn(address indexed burner, uint256 amount);\n\n    /**\n     * @dev Emitted when a minter is configured.\n     * @param minter The address of the minter.\n     * @param minterAllowedAmount The allowance of the minter.\n     */\n    event MinterConfigured(address indexed minter, uint256 minterAllowedAmount);\n\n    /**\n     * @dev Emitted when a minter is removed.\n     * @param oldMinter The address of the removed minter.\n     */\n    event MinterRemoved(address indexed oldMinter);\n\n    /**\n     * @dev Emitted when the master minter is changed.\n     * @param newMasterMinter The address of the new master minter.\n     */\n    event MasterMinterChanged(address indexed newMasterMinter);\n\n    /**\n     * @dev Emitted when the token decimals are set.\n     * @param decimals The number of decimals set.\n     */\n    event TokenDecimalsSet(uint8 decimals);\n\n    /**\n     * @dev Emitted when a new master minter is set.\n     * @param newMasterMinter The address of the new master minter.\n     */\n    event NewMasterMinter(address indexed newMasterMinter);\n\n    /**\n     * @dev Emitted when a new pauser is set.\n     * @param newPauser The address of the new pauser.\n     */\n    event NewPauser(address indexed newPauser);\n\n    /**\n     * @dev Emitted when a new blacklister is set.\n     * @param newBlacklister The address of the new blacklister.\n     */\n    event NewBlacklister(address indexed newBlacklister);\n\n    /**\n     * @dev Error thrown when the caller is not a minter.\n     */\n    error NotMinter();\n\n    /**\n     * @dev Error thrown when the caller is not the master minter.\n     */\n    error NotMasterMinter();\n\n    /**\n     * @dev Error thrown when a zero address is provided.\n     */\n    error NoZeroAddress();\n\n    /**\n     * @dev Error thrown when the mint amount is zero.\n     */\n    error MintMustBeGreaterThanZero();\n\n    /**\n     * @dev Error thrown when the amount exceeds the balance.\n     */\n    error AmountExceedsBalance();\n\n    /**\n     * @dev Error thrown when the burn amount is not greater than zero.\n     */\n    error BurnAmountNotGreaterThanZero();\n\n    /**\n     * @dev Error thrown when the allowance is exceeded.\n     */\n    error AllowanceExceeded();\n\n    /**\n     * @dev Error thrown when a minter tries to mint to a different address.\n     */\n    error NotSelfMinting();\n\n    /**\n     * @dev Error thrown when an attempt to decrease the allowance fails.\n     * @param owner The owner address.\n     * @param spender The spender address.\n     * @param currentAllowance The current allowance.\n     * @param decrement The decrement amount.\n     */\n    error FailedDecreaseAllowance(address owner, address spender, uint256 currentAllowance, uint256 decrement);\n\n    /**\n     * @dev Error thrown when an address is not blacklisted.\n     */\n    error NotBlacklisted();\n\n    /**\n     * @dev Error thrown when an address has zero balance.\n     */\n    error ZeroBalance();\n\n    /**\n     * @dev Modifier to make a function callable only by a minter.\n     */\n    modifier onlyMinter() {\n        if (!isMinter[msg.sender]) revert NotMinter();\n        _;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only by the master minter.\n     */\n    modifier onlyMasterMinter() {\n        if (msg.sender != masterMinter) revert NotMasterMinter();\n        _;\n    }\n\n    /**\n     * @notice Initializes the token with given parameters at most once.\n     * @param tokenName The name of the token.\n     * @param tokenSymbol The symbol of the token.\n     * @param tokenCurrency The currency of the token.\n     * @param tokenDecimals The number of decimals the token uses.\n     * @param newMasterMinter The address of the new master minter.\n     * @param newPauser The address of the new pauser.\n     * @param newBlacklister The address of the new blacklister.\n     * @param newRescuer The address of the new rescuer.\n     */\n    function initializeToken(\n        string calldata tokenName,\n        string calldata tokenSymbol,\n        string calldata tokenCurrency,\n        uint8 tokenDecimals,\n        address newMasterMinter,\n        address newPauser,\n        address newBlacklister,\n        address newRescuer\n    ) public initializer {\n        Ownable.initialize(msg.sender);\n        Pausable.initializePausable();\n\n        if (newMasterMinter == address(0)) revert NoZeroAddress();\n        if (newPauser == address(0)) revert NoZeroAddress();\n        if (newBlacklister == address(0)) revert NoZeroAddress();\n        if (newRescuer == address(0)) revert NoZeroAddress();\n\n        _name = tokenName;\n        _symbol = tokenSymbol;\n        currency = tokenCurrency;\n        _decimals = tokenDecimals;\n        masterMinter = newMasterMinter;\n        _pauser = newPauser;\n        _blacklister = newBlacklister;\n        _rescuer = newRescuer;\n\n        emit NewMasterMinter(newMasterMinter);\n        emit NewPauser(newPauser);\n        emit NewBlacklister(newBlacklister);\n        emit TokenDecimalsSet(tokenDecimals);\n        emit RescuerChanged(newRescuer);\n    }\n\n    /**\n     * @notice Returns the name of the token.\n     * @return The name of the token.\n     */\n    function name() public view virtual returns (string memory) {\n        return _name;\n    }\n\n    /**\n     * @notice Returns the symbol of the token.\n     * @return The symbol of the token.\n     */\n    function symbol() public view virtual returns (string memory) {\n        return _symbol;\n    }\n\n    /**\n     * @notice Returns the number of decimals used to get its user representation.\n     * @return The number of decimals used by the token.\n     */\n    function decimals() public view virtual returns (uint8) {\n        return _decimals;\n    }\n\n    /**\n     * @notice Returns the minting allowance of a minter.\n     * @param minter The address of the minter.\n     * @return The minting allowance of the minter.\n     */\n    function getMinterAllowance(address minter) external view override returns (uint256) {\n        return minterAllowance[minter];\n    }\n\n    /**\n     * @notice Returns the amount of tokens that spender is allowed to transfer on behalf of owner.\n     * @param owner Token owner's address.\n     * @param spender Spender's address.\n     * @return The allowance amount.\n     */\n    function allowance(address owner, address spender) external view override returns (uint256) {\n        return allowed[owner][spender];\n    }\n\n    /**\n     * @notice Returns the total supply of the token.\n     * @return The total supply.\n     */\n    function totalSupply() external view override returns (uint256) {\n        return _totalSupply;\n    }\n\n    /**\n     * @notice Returns the token balance of an account.\n     * @param account The address of the account.\n     * @return The token balance of the account.\n     */\n    function balanceOf(address account) external view override returns (uint256) {\n        return balances[account];\n    }\n\n    /**\n     * @notice Sets spender's allowance over the caller's tokens to be a given value.\n     * @param spender Spender's address.\n     * @param value Allowance amount.\n     * @return True if the operation was successful.\n     */\n    function approve(\n        address spender,\n        uint256 value\n    )\n        external\n        override\n        whenNotPaused\n        notBlacklisted(msg.sender)\n        notBlacklisted(spender)\n        returns (bool)\n    {\n        _approve(msg.sender, spender, value);\n        return true;\n    }\n\n    /**\n     * @notice Internal function to set allowance.\n     * @param owner Token owner's address.\n     * @param spender Spender's address.\n     * @param value Allowance amount.\n     */\n    function _approve(address owner, address spender, uint256 value) internal override {\n        if (owner == address(0)) revert NoZeroAddress();\n        if (spender == address(0)) revert NoZeroAddress();\n        allowed[owner][spender] = value;\n        emit Approval(owner, spender, value);\n    }\n\n    /**\n     * @notice Transfers tokens from one address to another using allowance.\n     * @param from Payer's address.\n     * @param to Payee's address.\n     * @param value Transfer amount.\n     * @return True if the operation was successful.\n     */\n    function transferFrom(\n    address from,\n    address to,\n    uint256 value\n    )\n        external\n        override\n        whenNotPaused\n        notBlacklisted(msg.sender)\n        notBlacklisted(from)\n        notBlacklisted(to)\n        returns (bool)\n    {\n        if (value > allowed[from][msg.sender]) revert AllowanceExceeded();\n        _transfer(from, to, value);\n        allowed[from][msg.sender] -= value;\n        return true;\n    }\n\n    /**\n     * @notice Transfers tokens from the caller to another address.\n     * @param to Payee's address.\n     * @param value Transfer amount.\n     * @return True if the operation was successful.\n     */\n    function transfer(\n        address to,\n        uint256 value\n    )\n        external\n        override\n        whenNotPaused\n        notBlacklisted(msg.sender)\n        notBlacklisted(to)\n        returns (bool)\n    {\n        _transfer(msg.sender, to, value);\n        return true;\n    }\n\n    /**\n     * @notice Internal function to process token transfers.\n     * @param from Payer's address.\n     * @param to Payee's address.\n     * @param value Transfer amount.\n     */\n    function _transfer(address from, address to, uint256 value) internal override {\n        if (from == address(0)) revert NoZeroAddress();\n        if (to == address(0)) revert NoZeroAddress();\n        if (value > balances[from]) revert AmountExceedsBalance();\n\n        balances[from] -= value;\n        balances[to] += value;\n        emit Transfer(from, to, value);\n    }\n\n    /**\n     * @notice Configures a new minter or updates the allowance of an existing minter.\n     * @param minter The address of the minter.\n     * @param _minterAllowedAmount The minting allowance for the minter.\n     * @return True if the operation was successful.\n     */\n    function configureMinter(\n        address minter,\n        uint256 _minterAllowedAmount\n    ) external override whenNotPaused onlyMasterMinter returns (bool) {\n        isMinter[minter] = true;\n        minterAllowance[minter] = _minterAllowedAmount;\n\n        emit MinterConfigured(minter, _minterAllowedAmount);\n        return true;\n    }\n\n    /**\n     * @notice Removes a minter.\n     * @param minter The address of the minter to remove.\n     * @return True if the operation was successful.\n     */\n    function removeMinter(address minter) external override onlyMasterMinter returns (bool) {\n        isMinter[minter] = false;\n        minterAllowance[minter] = 0;\n        emit MinterRemoved(minter);\n        return true;\n    }\n\n    /**\n     * @notice Allows a minter to burn some of its own tokens.\n     * @param _amount The amount of tokens to be burned.\n     */\n    function burn(uint256 _amount) external whenNotPaused onlyMinter notBlacklisted(msg.sender) {\n        uint256 balance = balances[msg.sender];\n        if (_amount <= 0) revert BurnAmountNotGreaterThanZero();\n        if (balance < _amount) revert AmountExceedsBalance();\n\n        _totalSupply -= _amount;\n        balances[msg.sender] -= _amount;\n        emit Burn(msg.sender, _amount);\n        emit Transfer(msg.sender, address(0), _amount);\n    }\n\n    /**\n     * @notice Allows a minter to minter some of its tokens from allowance.\n     * @param _to The address to receive the minted tokens.\n     * @param _amount The amount of tokens to mint.\n     * @return True if the operation was successful.\n     */\n    function mint(\n        address _to,\n        uint256 _amount\n    ) public whenNotPaused onlyMinter notBlacklisted(msg.sender) notBlacklisted(_to) returns (bool) {\n        if (_to == address(0)) revert NoZeroAddress();\n        if (_amount <= 0) revert MintMustBeGreaterThanZero();\n        if (msg.sender != _to) revert NotSelfMinting();\n        if (minterAllowance[_to] < _amount) revert AllowanceExceeded();\n\n        _totalSupply += _amount;\n        balances[_to] += _amount;\n        minterAllowance[_to] -= _amount;\n        emit Mint(msg.sender, _to, _amount);\n        emit Transfer(address(0), _to, _amount);\n        return true;\n    }\n\n    /**\n     * @notice Updates the master minter address.\n     * @param _newMasterMinter The address of the new master minter.\n     */\n    function updateMasterMinter(address _newMasterMinter) external onlyOwner {\n        if (_newMasterMinter == address(0)) revert NoZeroAddress();\n        masterMinter = _newMasterMinter;\n        emit MasterMinterChanged(masterMinter);\n    }\n\n    /**\n     * @notice Increases the allowance by a given increment.\n     * @param spender Spender's address.\n     * @param increment The amount to increase the allowance by.\n     * @return True if the operation was successful.\n     */\n    function increaseAllowance(\n        address spender,\n        uint256 increment\n    ) external whenNotPaused notBlacklisted(msg.sender) notBlacklisted(spender) returns (bool) {\n        address owner = msg.sender;\n        _approve(owner, spender, allowed[owner][spender] + increment);\n\n        return true;\n    }\n\n    /**\n     * @notice Decreases the allowance by a given decrement.\n     * @param spender Spender's address.\n     * @param decrement The amount to decrease the allowance by.\n     * @return True if the operation was successful.\n     */\n    function decreaseAllowance(\n        address spender,\n        uint256 decrement\n    ) external whenNotPaused notBlacklisted(msg.sender) notBlacklisted(spender) returns (bool) {\n        address owner = msg.sender;\n        uint256 currentAllowance = allowed[owner][spender];\n        if (currentAllowance < decrement) {\n            revert FailedDecreaseAllowance(owner, spender, currentAllowance, decrement);\n        }\n\n        _approve(owner, spender, currentAllowance - decrement);\n        return true;\n    }\n\n    /**\n     * @notice Wipes the balance of a blacklisted address, decreasing the totalSupply.\n     * @dev Only the owner can call this function, and the address must be blacklisted.\n     * @param _account The address to wipe.\n     */\n    function wipeBlacklistedAddress(address _account) external onlyOwner {\n        if (!blacklisted[_account]) revert NotBlacklisted();\n        uint256 balance = balances[_account];\n        if (balance == 0) revert ZeroBalance();\n        _totalSupply -= balance;\n        balances[_account] = 0;\n        \n        emit Transfer(_account, address(0), balance);\n    }\n\n    // Storage Gap for future upgrades\n    uint256[49] private __gap;\n}\n"},"@openzeppelin/contracts/utils/Address.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     *\n     * Furthermore, `isContract` will also return true if the target contract within\n     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n     * which only has an effect at the end of a transaction.\n     * ====\n     *\n     * [IMPORTANT]\n     * ====\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\n     *\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n     * constructor.\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize/address.code.length, which returns 0\n        // for contracts in construction, since the code is only stored at the end\n        // of the constructor execution.\n\n        return account.code.length > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n     *\n     * _Available since v4.8._\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        if (success) {\n            if (returndata.length == 0) {\n                // only check isContract if the call was successful and the return data is empty\n                // otherwise we already know that it was a contract\n                require(isContract(target), \"Address: call to non-contract\");\n            }\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason or using the provided one.\n     *\n     * _Available since v4.3._\n     */\n    function verifyCallResult(\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal pure returns (bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    function _revert(bytes memory returndata, string memory errorMessage) private pure {\n        // Look for revert reason and bubble it up if present\n        if (returndata.length > 0) {\n            // The easiest way to bubble the revert reason is using memory via assembly\n            /// @solidity memory-safe-assembly\n            assembly {\n                let returndata_size := mload(returndata)\n                revert(add(32, returndata), returndata_size)\n            }\n        } else {\n            revert(errorMessage);\n        }\n    }\n}\n"},"contracts/src/TokenContracts/Pausable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\nimport {PermissionAdmin} from \"./PermissionAdmin.sol\";\n\n/**\n * @title Pausable\n * @notice Base contract which allows children to implement an emergency stop mechanism.\n * @dev Inherits from PermissionAdmin to manage pauser permissions.\n */\nabstract contract Pausable is PermissionAdmin {\n    address internal _pauser;\n    bool public paused;\n\n    /// @notice Emitted when the contract is paused.\n    event Paused();\n\n    /// @notice Emitted when the contract is unpaused.\n    event Unpaused();\n\n    /// @notice Emitted when the pauser is changed.\n    /// @param newPauser The address of the new pauser.\n    event PauserChanged(address indexed newPauser);\n\n    /// @notice Error thrown when trying to perform an action while the contract is paused.\n    error Pausable__Paused();\n\n    /// @notice Error thrown when the caller is not the pauser.\n    error Pausable__CallerNotPauser();\n\n    /// @notice Error thrown when trying to pause the contract when it is already paused.\n    error Pausable__AlreadyPaused();\n\n    /// @notice Error thrown when trying to unpause the contract when it is not paused.\n    error Pausable__AlreadyUnpaused();\n\n    /// @notice Error thrown when trying to set the pauser to the zero address.\n    error Pausable__NoZeroAddress();\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is not paused.\n     */\n    modifier whenNotPaused() {\n        if (paused) revert Pausable__Paused();\n        _;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only by the pauser.\n     */\n    modifier onlyPauser() {\n        if (msg.sender != _pauser) revert Pausable__CallerNotPauser();\n        _;\n    }\n\n    /**\n     * @notice Returns the current pauser.\n     * @return The address of the current pauser.\n     */\n    function getPauser() external view returns (address) {\n        return _pauser;\n    }\n\n    /**\n     * @notice Called by the pauser to pause the contract, triggering the stopped state.\n     * @dev Emits a {Paused} event.\n     * @dev Can only be called by the current pauser.\n     */\n    function pause() external onlyPauser {\n        if (paused) revert Pausable__AlreadyPaused();\n        paused = true;\n        emit Paused();\n    }\n\n    /**\n     * @notice Initializes the contract in an unpaused state.\n     * @dev This function should be called during contract initialization.\n     */\n    function initializePausable() public onlyInitializing {\n        paused = false;\n    }\n\n    /**\n     * @notice Called by the pauser to unpause the contract, returning to normal state.\n     * @dev Emits an {Unpaused} event.\n     * @dev Can only be called by the current pauser.\n     */\n    function unpause() external onlyPauser {\n        if (!paused) revert Pausable__AlreadyUnpaused();\n        paused = false;\n        emit Unpaused();\n    }\n\n    /**\n     * @notice Updates the pauser role to a new address.\n     * @param _newPauser The address of the new pauser.\n     * @dev Emits a {PauserChanged} event.\n     * @dev Can only be called by the permission admin.\n     * @dev The new pauser address cannot be the zero address.\n     */\n    function updatePauser(address _newPauser) external onlyPermissionAdmin {\n        if (_newPauser == address(0)) revert Pausable__NoZeroAddress();\n        _pauser = _newPauser;\n        emit PauserChanged(_pauser);\n    }\n\n    // Storage Gap for future upgrades\n    uint256[49] private __gap;\n}\n"},"contracts/src/TokenContracts/Rescuable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {PermissionAdmin} from \"./PermissionAdmin.sol\";\n\n/**\n * @title Rescuable\n * @notice Contract that allows rescuing ERC20 tokens locked up in this contract by a \"rescuer\" role.\n * @dev Inherits from PermissionAdmin to manage rescuer permissions.\n */\nabstract contract Rescuable is PermissionAdmin {\n    using SafeERC20 for IERC20;\n\n    address internal _rescuer;\n\n    /// @notice Error thrown when the caller is not the rescuer.\n    error Rescuable__CallerNotRescuer();\n\n    /// @notice Error thrown when trying to set the rescuer to the zero address.\n    error Rescuable__NoZeroAddress();\n\n    /// @notice Emitted when the rescuer is changed.\n    /// @param newRescuer The address of the new rescuer.\n    event RescuerChanged(address indexed newRescuer);\n\n    /**\n     * @notice Returns the current rescuer.\n     * @return The address of the current rescuer.\n     */\n    function rescuer() external view returns (address) {\n        return _rescuer;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only by the rescuer.\n     */\n    modifier onlyRescuer() {\n        if (msg.sender != _rescuer) revert Rescuable__CallerNotRescuer();\n        _;\n    }\n\n    /**\n     * @notice Rescue ERC20 tokens locked up in this contract.\n     * @param tokenContract The address of the ERC20 token contract.\n     * @param to The recipient address to receive the rescued tokens.\n     * @param amount The amount of tokens to withdraw.\n     * @dev Can only be called by the current rescuer.\n     */\n    function rescueERC20(\n        IERC20 tokenContract,\n        address to,\n        uint256 amount\n    ) external onlyRescuer {\n        tokenContract.safeTransfer(to, amount);\n    }\n\n    /**\n     * @notice Assign the rescuer role to a given address.\n     * @param newRescuer The address of the new rescuer.\n     * @dev Emits a {RescuerChanged} event.\n     * @dev Can only be called by the permission admin.\n     * @dev The new rescuer address cannot be the zero address.\n     */\n    function updateRescuer(address newRescuer) external onlyPermissionAdmin {\n        if (newRescuer == address(0)) revert Rescuable__NoZeroAddress();\n        _rescuer = newRescuer;\n        emit RescuerChanged(newRescuer);\n    }\n\n    // Storage Gap for future upgrades\n    uint256[49] private __gap;\n}\n"},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the amount of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the amount of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves `amount` tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Moves `amount` tokens from `from` to `to` using the\n     * allowance mechanism. `amount` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n"},"contracts/src/TokenContracts/Blacklistable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\nimport {PermissionAdmin} from \"./PermissionAdmin.sol\";\n\n/**\n * @title Blacklistable\n * @notice Contract that allows accounts to be blacklisted by a \"blacklister\" role.\n * @dev Inherits from PermissionAdmin to manage blacklister permissions.\n */\nabstract contract Blacklistable is PermissionAdmin {\n    address internal _blacklister;\n    mapping(address => bool) public blacklisted;\n\n    /// @notice Emitted when an account is blacklisted.\n    /// @param _account The address of the blacklisted account.\n    event Blacklisted(address indexed _account);\n\n    /// @notice Emitted when an account is removed from the blacklist.\n    /// @param _account The address of the unblacklisted account.\n    event UnBlacklisted(address indexed _account);\n\n    /// @notice Emitted when the blacklister is changed.\n    /// @param newBlacklister The address of the new blacklister.\n    event BlacklisterChanged(address indexed newBlacklister);\n\n    /// @notice Error thrown when the caller is not the blacklister.\n    error Blacklistable__CallerNotBlacklister();\n\n    /// @notice Error thrown when trying to perform an operation with the zero address, which is prohibited.\n    error Blacklistable__NoZeroAddress();\n\n    /// @notice Error thrown when the account is already blacklisted.\n    /// @param account The address that is already blacklisted.\n    error Blacklistable__AccountBlacklisted(address account);\n\n    /// @notice Error thrown when the blacklister tries to blacklist themselves.\n    error Blacklistable__BlacklisterSelfBlacklist();\n\n    /// @notice Error thrown when trying to unblacklist an address that is already non blacklisted.\n    error Blacklistable__NotBlacklisted(address account);\n\n    /**\n     * @dev Modifier to make a function callable only by the blacklister.\n     */\n    modifier onlyBlacklister() {\n        if (msg.sender != _blacklister) revert Blacklistable__CallerNotBlacklister();\n        _;\n    }\n\n    /**\n    * @dev Ensures the specified account is not blacklisted and the blacklister is properly set.\n    * @param _account The address to check for blacklisting.\n    * @custom:revert Blacklistable__NoZeroAddress if the blacklister address has not been set (is zero).\n    * @custom:revert Blacklistable__AccountBlacklisted if the account is blacklisted.\n    */\n    modifier notBlacklisted(address _account) {\n        if (_blacklister == address(0)) revert Blacklistable__NoZeroAddress();\n        if (blacklisted[_account]) revert Blacklistable__AccountBlacklisted(_account);\n        _;\n    }\n\n    /**\n     * @notice Returns the current blacklister.\n     * @return The address of the current blacklister.\n     */\n    function getBlacklister() external view returns (address) {\n        return _blacklister;\n    }\n\n    /**\n     * @notice Checks if an account is blacklisted.\n     * @param _account The address to check.\n     * @return True if the account is blacklisted, false otherwise.\n     */\n    function isBlacklisted(address _account) external view returns (bool) {\n        return blacklisted[_account];\n    }\n\n    /**\n     * @notice Adds an account to the blacklist.\n     * @param _account The address to blacklist.\n     * @dev Emits a {Blacklisted} event.\n     * @dev Can only be called by the current blacklister.\n     * @dev The address cannot be the zero address or the blacklister's own address.\n     */\n    function blacklist(address _account) external onlyBlacklister {\n        if (blacklisted[_account]) revert Blacklistable__AccountBlacklisted(_account);\n        if (_account == _blacklister) revert Blacklistable__BlacklisterSelfBlacklist();\n        if (_account == address(0)) revert Blacklistable__NoZeroAddress();\n        blacklisted[_account] = true;\n        emit Blacklisted(_account);\n    }\n\n    /**\n     * @notice Removes an account from the blacklist.\n     * @param _account The address to remove from the blacklist.\n     * @dev Emits an {UnBlacklisted} event.\n     * @dev Can only be called by the current blacklister.\n     */\n    function unBlacklist(address _account) external onlyBlacklister {\n         if (!blacklisted[_account]) revert Blacklistable__NotBlacklisted(_account);\n        blacklisted[_account] = false;\n        emit UnBlacklisted(_account);\n    }\n\n    /**\n     * @notice Updates the blacklister role to a new address.\n     * @param _newBlacklister The address of the new blacklister.\n     * @dev Emits a {BlacklisterChanged} event.\n     * @dev Can only be called by the permission admin.\n     * @dev The new blacklister address cannot be the zero address.\n     */\n    function updateBlacklister(address _newBlacklister) external onlyPermissionAdmin {\n        if (_newBlacklister == address(0)) revert Blacklistable__NoZeroAddress();\n        _blacklister = _newBlacklister;\n        emit BlacklisterChanged(_blacklister);\n    }\n\n    // Storage Gap for future upgrades\n    uint256[49] private __gap;\n}\n"},"contracts/src/Minting/MinterManagerInterface.sol":{"content":"//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\n/**\n * @title MinterManagementInterface\n * @notice Interface that defines external functions for managing minters and their allowances.\n * @dev Implementing contracts should provide functionality for adding, removing, and configuring minters.\n */\ninterface MinterManagementInterface {\n    /**\n     * @notice Checks if an account is a registered minter.\n     * @param _account The address to check.\n     * @return A boolean indicating whether the address is a minter.\n     */\n    function isMinter(address _account) external view returns (bool);\n\n    /**\n     * @notice Gets the allowance of a minter.\n     * @param _minter The address of the minter.\n     * @return The amount of tokens the minter is allowed to mint.\n     */\n    function getMinterAllowance(address _minter) external view returns (uint256);\n\n    /**\n     * @notice Configures a new minter or updates the allowance of an existing minter.\n     * @param _minter The address of the minter.\n     * @param _minterAllowedAmount The new allowance for the minter.\n     * @return A boolean indicating whether the configuration was successful.\n     */\n    function configureMinter(address _minter, uint256 _minterAllowedAmount) external returns (bool);\n\n    /**\n     * @notice Removes a minter.\n     * @param _minter The address of the minter to remove.\n     * @return A boolean indicating whether the removal was successful.\n     */\n    function removeMinter(address _minter) external returns (bool);\n}\n"},"contracts/src/TokenContracts/AbstractTokenV1.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/**\n * @title AbstractTokenV1\n * @dev Abstract contract for ERC20 token operations. Defines internal functions for approving and transferring tokens.\n * Inherits from the IERC20 interface.\n */\nabstract contract AbstractTokenV1 is IERC20 {\n    /**\n     * @notice Internal function to set the allowance for a spender over the owner's tokens.\n     * @param owner The address of the token owner.\n     * @param spender The address of the spender.\n     * @param value The amount of tokens the spender is allowed to spend.\n     * @dev This function must be overridden in the derived contract.\n     */\n    function _approve(address owner, address spender, uint256 value) internal virtual;\n\n    /**\n     * @notice Internal function to transfer tokens from one address to another.\n     * @param from The address of the token sender.\n     * @param to The address of the token recipient.\n     * @param value The amount of tokens to transfer.\n     * @dev This function must be overridden in the derived contract.\n     */\n    function _transfer(address from, address to, uint256 value) internal virtual;\n\n    // Storage Gap for future upgrades\n    uint256[49] private __gap;\n}\n"},"contracts/src/TokenContracts/PermissionAdmin.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.11;\n\nimport {Ownable} from \"./Ownable.sol\";\n\n/**\n * @title PermissionAdmin\n * @notice Base contract which allows the owner to set an admin with the ability to select the pauser, blacklister, and rescuer.\n * @dev Only the contract owner can modify the admin. The admin has special permissions defined by this contract.\n */\nabstract contract PermissionAdmin is Ownable {\n    address private _permissionAdmin;\n\n    /// @notice Emitted when the permission admin is changed.\n    /// @param admin The new permission admin.\n    event PermissionAdminChanged(address indexed admin);\n\n    /// @notice Error thrown when the caller is not the permission admin.\n    error PermissionAdmin__CallerNotPermissionAdmin();\n\n    /// @notice Error thrown when trying to set the permission admin to the zero address.\n    error PermissionAdmin__NoZeroAddress();\n    \n    /**\n     * @dev Modifier to make a function callable only by the permission admin.\n     */\n    modifier onlyPermissionAdmin() {\n        if (msg.sender != _permissionAdmin) {\n            revert PermissionAdmin__CallerNotPermissionAdmin();\n        }\n        _;\n    }\n\n    /**\n     * @notice Returns the current permission admin.\n     * @return The address of the current permission admin.\n     */\n    function getPermissionAdmin() external view returns (address) {\n        return _permissionAdmin;\n    }\n\n    /**\n     * @notice Sets a new permission admin.\n     * @param _newAdmin The address of the new permission admin.\n     * @dev Only the contract owner can call this function. The new admin address cannot be the zero address.\n     */\n    function setPermissionAdmin(address _newAdmin) external onlyOwner {\n        if (_newAdmin == address(0)) revert PermissionAdmin__NoZeroAddress();\n        _permissionAdmin = _newAdmin;\n        emit PermissionAdminChanged(_permissionAdmin);\n    }\n\n    // Storage Gap for future upgrades\n    uint256[49] private __gap;\n}\n"},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\nimport \"../extensions/IERC20Permit.sol\";\nimport \"../../../utils/Address.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    using Address for address;\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n    }\n\n    /**\n     * @dev Deprecated. This function has issues similar to the ones found in\n     * {IERC20-approve}, and its usage is discouraged.\n     *\n     * Whenever possible, use {safeIncreaseAllowance} and\n     * {safeDecreaseAllowance} instead.\n     */\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\n        // safeApprove should only be called when setting an initial allowance,\n        // or when resetting it to zero. To increase and decrease it, use\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n        require(\n            (value == 0) || (token.allowance(address(this), spender) == 0),\n            \"SafeERC20: approve from non-zero to non-zero allowance\"\n        );\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        unchecked {\n            uint256 oldAllowance = token.allowance(address(this), spender);\n            require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n     * to be set to zero before setting it to a non-zero value, such as USDT.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\n\n        if (!_callOptionalReturnBool(token, approvalCall)) {\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\n            _callOptionalReturn(token, approvalCall);\n        }\n    }\n\n    /**\n     * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\n     * Revert on invalid signature.\n     */\n    function safePermit(\n        IERC20Permit token,\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) internal {\n        uint256 nonceBefore = token.nonces(owner);\n        token.permit(owner, spender, value, deadline, v, r, s);\n        uint256 nonceAfter = token.nonces(owner);\n        require(nonceAfter == nonceBefore + 1, \"SafeERC20: permit did not succeed\");\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\n        // the target address contains contract code and also asserts for success in the low-level call.\n\n        bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n        require(returndata.length == 0 || abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\n     */\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\n        // and not revert is the subcall reverts.\n\n        (bool success, bytes memory returndata) = address(token).call(data);\n        return\n            success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));\n    }\n}\n"},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * ==== Security Considerations\n *\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\n * generally recommended is:\n *\n * ```solidity\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\n *     try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\n *     doThing(..., value);\n * }\n *\n * function doThing(..., uint256 value) public {\n *     token.safeTransferFrom(msg.sender, address(this), value);\n *     ...\n * }\n * ```\n *\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\n * {SafeERC20-safeTransferFrom}).\n *\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\n * contracts should have entry points that don't rely on permit.\n */\ninterface IERC20Permit {\n    /**\n     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n     * given ``owner``'s signed approval.\n     *\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n     * ordering also apply here.\n     *\n     * Emits an {Approval} event.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     * - `deadline` must be a timestamp in the future.\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n     * over the EIP712-formatted function arguments.\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\n     *\n     * For more information on the signature format, see the\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n     * section].\n     *\n     * CAUTION: See Security Considerations above.\n     */\n    function permit(\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) external;\n\n    /**\n     * @dev Returns the current nonce for `owner`. This value must be\n     * included whenever a signature is generated for {permit}.\n     *\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\n     * prevents a signature from being used multiple times.\n     */\n    function nonces(address owner) external view returns (uint256);\n\n    /**\n     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n     */\n    // solhint-disable-next-line func-name-mixedcase\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n"},"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     *\n     * Furthermore, `isContract` will also return true if the target contract within\n     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n     * which only has an effect at the end of a transaction.\n     * ====\n     *\n     * [IMPORTANT]\n     * ====\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\n     *\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n     * constructor.\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize/address.code.length, which returns 0\n        // for contracts in construction, since the code is only stored at the end\n        // of the constructor execution.\n\n        return account.code.length > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n     *\n     * _Available since v4.8._\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        if (success) {\n            if (returndata.length == 0) {\n                // only check isContract if the call was successful and the return data is empty\n                // otherwise we already know that it was a contract\n                require(isContract(target), \"Address: call to non-contract\");\n            }\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason or using the provided one.\n     *\n     * _Available since v4.3._\n     */\n    function verifyCallResult(\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal pure returns (bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    function _revert(bytes memory returndata, string memory errorMessage) private pure {\n        // Look for revert reason and bubble it up if present\n        if (returndata.length > 0) {\n            // The easiest way to bubble the revert reason is using memory via assembly\n            /// @solidity memory-safe-assembly\n            assembly {\n                let returndata_size := mload(returndata)\n                revert(add(32, returndata), returndata_size)\n            }\n        } else {\n            revert(errorMessage);\n        }\n    }\n}\n"},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n *     function initialize() initializer public {\n *         __ERC20_init(\"MyToken\", \"MTK\");\n *     }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n *     function initializeV2() reinitializer(2) public {\n *         __ERC20Permit_init(\"MyToken\");\n *     }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n *     _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n    /**\n     * @dev Indicates that the contract has been initialized.\n     * @custom:oz-retyped-from bool\n     */\n    uint8 private _initialized;\n\n    /**\n     * @dev Indicates that the contract is in the process of being initialized.\n     */\n    bool private _initializing;\n\n    /**\n     * @dev Triggered when the contract has been initialized or reinitialized.\n     */\n    event Initialized(uint8 version);\n\n    /**\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n     * `onlyInitializing` functions can be used to initialize parent contracts.\n     *\n     * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n     * constructor.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier initializer() {\n        bool isTopLevelCall = !_initializing;\n        require(\n            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\n            \"Initializable: contract is already initialized\"\n        );\n        _initialized = 1;\n        if (isTopLevelCall) {\n            _initializing = true;\n        }\n        _;\n        if (isTopLevelCall) {\n            _initializing = false;\n            emit Initialized(1);\n        }\n    }\n\n    /**\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n     * used to initialize parent contracts.\n     *\n     * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n     * are added through upgrades and that require initialization.\n     *\n     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n     * cannot be nested. If one is invoked in the context of another, execution will revert.\n     *\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n     * a contract, executing them in the right order is up to the developer or operator.\n     *\n     * WARNING: setting the version to 255 will prevent any future reinitialization.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier reinitializer(uint8 version) {\n        require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n        _initialized = version;\n        _initializing = true;\n        _;\n        _initializing = false;\n        emit Initialized(version);\n    }\n\n    /**\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\n     */\n    modifier onlyInitializing() {\n        require(_initializing, \"Initializable: contract is not initializing\");\n        _;\n    }\n\n    /**\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n     * through proxies.\n     *\n     * Emits an {Initialized} event the first time it is successfully executed.\n     */\n    function _disableInitializers() internal virtual {\n        require(!_initializing, \"Initializable: contract is initializing\");\n        if (_initialized != type(uint8).max) {\n            _initialized = type(uint8).max;\n            emit Initialized(type(uint8).max);\n        }\n    }\n\n    /**\n     * @dev Returns the highest version that has been initialized. See {reinitializer}.\n     */\n    function _getInitializedVersion() internal view returns (uint8) {\n        return _initialized;\n    }\n\n    /**\n     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n     */\n    function _isInitializing() internal view returns (bool) {\n        return _initializing;\n    }\n}\n"}},"language":"Solidity","settings":{"metadata":{"useLiteralContent":true},"optimizer":{"runs":10000,"enabled":true}}},"stdJsonOutput":{"sources":{"contracts/src/TokenContracts/Ownable.sol":{"id":9},"contracts/src/TokenContracts/TokenV1.sol":{"id":13},"@openzeppelin/contracts/utils/Address.sol":{"id":5},"contracts/src/TokenContracts/Pausable.sol":{"id":10},"contracts/src/TokenContracts/Rescuable.sol":{"id":12},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"id":2},"contracts/src/TokenContracts/Blacklistable.sol":{"id":8},"contracts/src/Minting/MinterManagerInterface.sol":{"id":6},"contracts/src/TokenContracts/AbstractTokenV1.sol":{"id":7},"contracts/src/TokenContracts/PermissionAdmin.sol":{"id":11},"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"id":4},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"id":3},"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol":{"id":1},"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"id":0}},"contracts":{"contracts/src/TokenContracts/TokenV1.sol":{"TokenV1":{"abi":[{"name":"AllowanceExceeded","type":"error","inputs":[]},{"name":"AmountExceedsBalance","type":"error","inputs":[]},{"name":"Blacklistable__AccountBlacklisted","type":"error","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"name":"Blacklistable__BlacklisterSelfBlacklist","type":"error","inputs":[]},{"name":"Blacklistable__CallerNotBlacklister","type":"error","inputs":[]},{"name":"Blacklistable__NoZeroAddress","type":"error","inputs":[]},{"name":"Blacklistable__NotBlacklisted","type":"error","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"name":"BurnAmountNotGreaterThanZero","type":"error","inputs":[]},{"name":"FailedDecreaseAllowance","type":"error","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"},{"name":"currentAllowance","type":"uint256","internalType":"uint256"},{"name":"decrement","type":"uint256","internalType":"uint256"}]},{"name":"MintMustBeGreaterThanZero","type":"error","inputs":[]},{"name":"NoZeroAddress","type":"error","inputs":[]},{"name":"NotBlacklisted","type":"error","inputs":[]},{"name":"NotMasterMinter","type":"error","inputs":[]},{"name":"NotMinter","type":"error","inputs":[]},{"name":"NotSelfMinting","type":"error","inputs":[]},{"name":"Ownable__CallerNotOwner","type":"error","inputs":[]},{"name":"Ownable__CallerNotPendingOwner","type":"error","inputs":[]},{"name":"Ownable__NoZeroAddress","type":"error","inputs":[]},{"name":"Pausable__AlreadyPaused","type":"error","inputs":[]},{"name":"Pausable__AlreadyUnpaused","type":"error","inputs":[]},{"name":"Pausable__CallerNotPauser","type":"error","inputs":[]},{"name":"Pausable__NoZeroAddress","type":"error","inputs":[]},{"name":"Pausable__Paused","type":"error","inputs":[]},{"name":"PermissionAdmin__CallerNotPermissionAdmin","type":"error","inputs":[]},{"name":"PermissionAdmin__NoZeroAddress","type":"error","inputs":[]},{"name":"Rescuable__CallerNotRescuer","type":"error","inputs":[]},{"name":"Rescuable__NoZeroAddress","type":"error","inputs":[]},{"name":"ZeroBalance","type":"error","inputs":[]},{"name":"Approval","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"spender","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Blacklisted","type":"event","inputs":[{"name":"_account","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"BlacklisterChanged","type":"event","inputs":[{"name":"newBlacklister","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Burn","type":"event","inputs":[{"name":"burner","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Initialized","type":"event","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"name":"MasterMinterChanged","type":"event","inputs":[{"name":"newMasterMinter","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Mint","type":"event","inputs":[{"name":"minter","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"MinterConfigured","type":"event","inputs":[{"name":"minter","type":"address","indexed":true,"internalType":"address"},{"name":"minterAllowedAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"MinterRemoved","type":"event","inputs":[{"name":"oldMinter","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"NewBlacklister","type":"event","inputs":[{"name":"newBlacklister","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"NewMasterMinter","type":"event","inputs":[{"name":"newMasterMinter","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"NewPauser","type":"event","inputs":[{"name":"newPauser","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"OwnershipTransferStarted","type":"event","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"OwnershipTransferred","type":"event","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Paused","type":"event","inputs":[],"anonymous":false},{"name":"PauserChanged","type":"event","inputs":[{"name":"newPauser","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"PermissionAdminChanged","type":"event","inputs":[{"name":"admin","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"RescuerChanged","type":"event","inputs":[{"name":"newRescuer","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"TokenDecimalsSet","type":"event","inputs":[{"name":"decimals","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"name":"Transfer","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"UnBlacklisted","type":"event","inputs":[{"name":"_account","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Unpaused","type":"event","inputs":[],"anonymous":false},{"name":"acceptOwnership","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"allowance","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"approve","type":"function","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"balanceOf","type":"function","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"blacklist","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"blacklisted","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"burn","type":"function","inputs":[{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"configureMinter","type":"function","inputs":[{"name":"minter","type":"address","internalType":"address"},{"name":"_minterAllowedAmount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"currency","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"decimals","type":"function","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"decreaseAllowance","type":"function","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"decrement","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"getBlacklister","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"getMinterAllowance","type":"function","inputs":[{"name":"minter","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getOwner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"getPauser","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"getPendingOwner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"getPermissionAdmin","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"increaseAllowance","type":"function","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"increment","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"initialize","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"initializePausable","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"initializeToken","type":"function","inputs":[{"name":"tokenName","type":"string","internalType":"string"},{"name":"tokenSymbol","type":"string","internalType":"string"},{"name":"tokenCurrency","type":"string","internalType":"string"},{"name":"tokenDecimals","type":"uint8","internalType":"uint8"},{"name":"newMasterMinter","type":"address","internalType":"address"},{"name":"newPauser","type":"address","internalType":"address"},{"name":"newBlacklister","type":"address","internalType":"address"},{"name":"newRescuer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"isBlacklisted","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isMinter","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"masterMinter","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"minterAllowance","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"pause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"paused","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"removeMinter","type":"function","inputs":[{"name":"minter","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"rescueERC20","type":"function","inputs":[{"name":"tokenContract","type":"address","internalType":"contract IERC20"},{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"rescuer","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"setPermissionAdmin","type":"function","inputs":[{"name":"_newAdmin","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"symbol","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"totalSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"transfer","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"transferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"value","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"name":"transferOwnership","type":"function","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"unBlacklist","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"unpause","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"updateBlacklister","type":"function","inputs":[{"name":"_newBlacklister","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"updateMasterMinter","type":"function","inputs":[{"name":"_newMasterMinter","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"updatePauser","type":"function","inputs":[{"name":"_newPauser","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"updateRescuer","type":"function","inputs":[{"name":"newRescuer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"wipeBlacklistedAddress","type":"function","inputs":[{"name":"_account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"}],"metadata":"{\"compiler\":{\"version\":\"0.8.11+commit.d7f03943\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"AllowanceExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AmountExceedsBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Blacklistable__AccountBlacklisted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Blacklistable__BlacklisterSelfBlacklist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Blacklistable__CallerNotBlacklister\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Blacklistable__NoZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Blacklistable__NotBlacklisted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BurnAmountNotGreaterThanZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"currentAllowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"FailedDecreaseAllowance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintMustBeGreaterThanZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotBlacklisted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotMasterMinter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotMinter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotSelfMinting\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__CallerNotOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__CallerNotPendingOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Ownable__NoZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__AlreadyPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__AlreadyUnpaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__CallerNotPauser\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__NoZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Pausable__Paused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PermissionAdmin__CallerNotPermissionAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PermissionAdmin__NoZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Rescuable__CallerNotRescuer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Rescuable__NoZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroBalance\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"Blacklisted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newBlacklister\",\"type\":\"address\"}],\"name\":\"BlacklisterChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newMasterMinter\",\"type\":\"address\"}],\"name\":\"MasterMinterChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Mint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"minterAllowedAmount\",\"type\":\"uint256\"}],\"name\":\"MinterConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldMinter\",\"type\":\"address\"}],\"name\":\"MinterRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newBlacklister\",\"type\":\"address\"}],\"name\":\"NewBlacklister\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newMasterMinter\",\"type\":\"address\"}],\"name\":\"NewMasterMinter\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newPauser\",\"type\":\"address\"}],\"name\":\"NewPauser\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newPauser\",\"type\":\"address\"}],\"name\":\"PauserChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"name\":\"PermissionAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRescuer\",\"type\":\"address\"}],\"name\":\"RescuerChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"}],\"name\":\"TokenDecimalsSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"UnBlacklisted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"blacklist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"blacklisted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_minterAllowedAmount\",\"type\":\"uint256\"}],\"name\":\"configureMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currency\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"decrement\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlacklister\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"getMinterAllowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPauser\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPermissionAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"increment\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initializePausable\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"tokenCurrency\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"newMasterMinter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newPauser\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newBlacklister\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newRescuer\",\"type\":\"address\"}],\"name\":\"initializeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"isBlacklisted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"masterMinter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"minterAllowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"removeMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"tokenContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"rescueERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rescuer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newAdmin\",\"type\":\"address\"}],\"name\":\"setPermissionAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"unBlacklist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newBlacklister\",\"type\":\"address\"}],\"name\":\"updateBlacklister\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newMasterMinter\",\"type\":\"address\"}],\"name\":\"updateMasterMinter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newPauser\",\"type\":\"address\"}],\"name\":\"updatePauser\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRescuer\",\"type\":\"address\"}],\"name\":\"updateRescuer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"wipeBlacklistedAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"ERC20 Token backed by fiat reserves with additional functionality for minting, burning, pausing, blacklisting, and rescuing tokens. Inherits MinterManagementInterface to comply with minter management specifications.\",\"errors\":{\"AllowanceExceeded()\":[{\"details\":\"Error thrown when the allowance is exceeded.\"}],\"AmountExceedsBalance()\":[{\"details\":\"Error thrown when the amount exceeds the balance.\"}],\"Blacklistable__AccountBlacklisted(address)\":[{\"params\":{\"account\":\"The address that is already blacklisted.\"}}],\"BurnAmountNotGreaterThanZero()\":[{\"details\":\"Error thrown when the burn amount is not greater than zero.\"}],\"FailedDecreaseAllowance(address,address,uint256,uint256)\":[{\"details\":\"Error thrown when an attempt to decrease the allowance fails.\",\"params\":{\"currentAllowance\":\"The current allowance.\",\"decrement\":\"The decrement amount.\",\"owner\":\"The owner address.\",\"spender\":\"The spender address.\"}}],\"MintMustBeGreaterThanZero()\":[{\"details\":\"Error thrown when the mint amount is zero.\"}],\"NoZeroAddress()\":[{\"details\":\"Error thrown when a zero address is provided.\"}],\"NotBlacklisted()\":[{\"details\":\"Error thrown when an address is not blacklisted.\"}],\"NotMasterMinter()\":[{\"details\":\"Error thrown when the caller is not the master minter.\"}],\"NotMinter()\":[{\"details\":\"Error thrown when the caller is not a minter.\"}],\"NotSelfMinting()\":[{\"details\":\"Error thrown when a minter tries to mint to a different address.\"}],\"ZeroBalance()\":[{\"details\":\"Error thrown when an address has zero balance.\"}]},\"events\":{\"Burn(address,uint256)\":{\"details\":\"Emitted when tokens are burned.\",\"params\":{\"amount\":\"The amount of tokens burned.\",\"burner\":\"The address of the burner.\"}},\"MasterMinterChanged(address)\":{\"details\":\"Emitted when the master minter is changed.\",\"params\":{\"newMasterMinter\":\"The address of the new master minter.\"}},\"Mint(address,address,uint256)\":{\"details\":\"Emitted when tokens are minted.\",\"params\":{\"amount\":\"The amount of tokens minted.\",\"minter\":\"The address of the minter.\",\"to\":\"The address of the recipient.\"}},\"MinterConfigured(address,uint256)\":{\"details\":\"Emitted when a minter is configured.\",\"params\":{\"minter\":\"The address of the minter.\",\"minterAllowedAmount\":\"The allowance of the minter.\"}},\"MinterRemoved(address)\":{\"details\":\"Emitted when a minter is removed.\",\"params\":{\"oldMinter\":\"The address of the removed minter.\"}},\"NewBlacklister(address)\":{\"details\":\"Emitted when a new blacklister is set.\",\"params\":{\"newBlacklister\":\"The address of the new blacklister.\"}},\"NewMasterMinter(address)\":{\"details\":\"Emitted when a new master minter is set.\",\"params\":{\"newMasterMinter\":\"The address of the new master minter.\"}},\"NewPauser(address)\":{\"details\":\"Emitted when a new pauser is set.\",\"params\":{\"newPauser\":\"The address of the new pauser.\"}},\"TokenDecimalsSet(uint8)\":{\"details\":\"Emitted when the token decimals are set.\",\"params\":{\"decimals\":\"The number of decimals set.\"}}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"params\":{\"owner\":\"Token owner's address.\",\"spender\":\"Spender's address.\"},\"returns\":{\"_0\":\"The allowance amount.\"}},\"approve(address,uint256)\":{\"params\":{\"spender\":\"Spender's address.\",\"value\":\"Allowance amount.\"},\"returns\":{\"_0\":\"True if the operation was successful.\"}},\"balanceOf(address)\":{\"params\":{\"account\":\"The address of the account.\"},\"returns\":{\"_0\":\"The token balance of the account.\"}},\"blacklist(address)\":{\"details\":\"Emits a {Blacklisted} event.Can only be called by the current blacklister.The address cannot be the zero address or the blacklister's own address.\",\"params\":{\"_account\":\"The address to blacklist.\"}},\"burn(uint256)\":{\"params\":{\"_amount\":\"The amount of tokens to be burned.\"}},\"configureMinter(address,uint256)\":{\"params\":{\"_minterAllowedAmount\":\"The minting allowance for the minter.\",\"minter\":\"The address of the minter.\"},\"returns\":{\"_0\":\"True if the operation was successful.\"}},\"decimals()\":{\"returns\":{\"_0\":\"The number of decimals used by the token.\"}},\"decreaseAllowance(address,uint256)\":{\"params\":{\"decrement\":\"The amount to decrease the allowance by.\",\"spender\":\"Spender's address.\"},\"returns\":{\"_0\":\"True if the operation was successful.\"}},\"getBlacklister()\":{\"returns\":{\"_0\":\"The address of the current blacklister.\"}},\"getMinterAllowance(address)\":{\"params\":{\"minter\":\"The address of the minter.\"},\"returns\":{\"_0\":\"The minting allowance of the minter.\"}},\"getOwner()\":{\"returns\":{\"_0\":\"The address of the owner.\"}},\"getPauser()\":{\"returns\":{\"_0\":\"The address of the current pauser.\"}},\"getPendingOwner()\":{\"returns\":{\"_0\":\"The address of the pending owner.\"}},\"getPermissionAdmin()\":{\"returns\":{\"_0\":\"The address of the current permission admin.\"}},\"increaseAllowance(address,uint256)\":{\"params\":{\"increment\":\"The amount to increase the allowance by.\",\"spender\":\"Spender's address.\"},\"returns\":{\"_0\":\"True if the operation was successful.\"}},\"initialize(address)\":{\"params\":{\"owner\":\"The address of the initial owner.\"}},\"initializePausable()\":{\"details\":\"This function should be called during contract initialization.\"},\"initializeToken(string,string,string,uint8,address,address,address,address)\":{\"params\":{\"newBlacklister\":\"The address of the new blacklister.\",\"newMasterMinter\":\"The address of the new master minter.\",\"newPauser\":\"The address of the new pauser.\",\"newRescuer\":\"The address of the new rescuer.\",\"tokenCurrency\":\"The currency of the token.\",\"tokenDecimals\":\"The number of decimals the token uses.\",\"tokenName\":\"The name of the token.\",\"tokenSymbol\":\"The symbol of the token.\"}},\"isBlacklisted(address)\":{\"params\":{\"_account\":\"The address to check.\"},\"returns\":{\"_0\":\"True if the account is blacklisted, false otherwise.\"}},\"mint(address,uint256)\":{\"params\":{\"_amount\":\"The amount of tokens to mint.\",\"_to\":\"The address to receive the minted tokens.\"},\"returns\":{\"_0\":\"True if the operation was successful.\"}},\"name()\":{\"returns\":{\"_0\":\"The name of the token.\"}},\"pause()\":{\"details\":\"Emits a {Paused} event.Can only be called by the current pauser.\"},\"removeMinter(address)\":{\"params\":{\"minter\":\"The address of the minter to remove.\"},\"returns\":{\"_0\":\"True if the operation was successful.\"}},\"rescueERC20(address,address,uint256)\":{\"details\":\"Can only be called by the current rescuer.\",\"params\":{\"amount\":\"The amount of tokens to withdraw.\",\"to\":\"The recipient address to receive the rescued tokens.\",\"tokenContract\":\"The address of the ERC20 token contract.\"}},\"rescuer()\":{\"returns\":{\"_0\":\"The address of the current rescuer.\"}},\"setPermissionAdmin(address)\":{\"details\":\"Only the contract owner can call this function. The new admin address cannot be the zero address.\",\"params\":{\"_newAdmin\":\"The address of the new permission admin.\"}},\"symbol()\":{\"returns\":{\"_0\":\"The symbol of the token.\"}},\"totalSupply()\":{\"returns\":{\"_0\":\"The total supply.\"}},\"transfer(address,uint256)\":{\"params\":{\"to\":\"Payee's address.\",\"value\":\"Transfer amount.\"},\"returns\":{\"_0\":\"True if the operation was successful.\"}},\"transferFrom(address,address,uint256)\":{\"params\":{\"from\":\"Payer's address.\",\"to\":\"Payee's address.\",\"value\":\"Transfer amount.\"},\"returns\":{\"_0\":\"True if the operation was successful.\"}},\"transferOwnership(address)\":{\"params\":{\"newOwner\":\"The address to transfer ownership to.\"}},\"unBlacklist(address)\":{\"details\":\"Emits an {UnBlacklisted} event.Can only be called by the current blacklister.\",\"params\":{\"_account\":\"The address to remove from the blacklist.\"}},\"unpause()\":{\"details\":\"Emits an {Unpaused} event.Can only be called by the current pauser.\"},\"updateBlacklister(address)\":{\"details\":\"Emits a {BlacklisterChanged} event.Can only be called by the permission admin.The new blacklister address cannot be the zero address.\",\"params\":{\"_newBlacklister\":\"The address of the new blacklister.\"}},\"updateMasterMinter(address)\":{\"params\":{\"_newMasterMinter\":\"The address of the new master minter.\"}},\"updatePauser(address)\":{\"details\":\"Emits a {PauserChanged} event.Can only be called by the permission admin.The new pauser address cannot be the zero address.\",\"params\":{\"_newPauser\":\"The address of the new pauser.\"}},\"updateRescuer(address)\":{\"details\":\"Emits a {RescuerChanged} event.Can only be called by the permission admin.The new rescuer address cannot be the zero address.\",\"params\":{\"newRescuer\":\"The address of the new rescuer.\"}},\"wipeBlacklistedAddress(address)\":{\"details\":\"Only the owner can call this function, and the address must be blacklisted.\",\"params\":{\"_account\":\"The address to wipe.\"}}},\"stateVariables\":{\"isMinter\":{\"params\":{\"_account\":\"The address to check.\"},\"return\":\"A boolean indicating whether the address is a minter.\",\"returns\":{\"_0\":\"A boolean indicating whether the address is a minter.\"}}},\"title\":\"TokenV1\",\"version\":1},\"userdoc\":{\"errors\":{\"Blacklistable__AccountBlacklisted(address)\":[{\"notice\":\"Error thrown when the account is already blacklisted.\"}],\"Blacklistable__BlacklisterSelfBlacklist()\":[{\"notice\":\"Error thrown when the blacklister tries to blacklist themselves.\"}],\"Blacklistable__CallerNotBlacklister()\":[{\"notice\":\"Error thrown when the caller is not the blacklister.\"}],\"Blacklistable__NoZeroAddress()\":[{\"notice\":\"Error thrown when trying to perform an operation with the zero address, which is prohibited.\"}],\"Blacklistable__NotBlacklisted(address)\":[{\"notice\":\"Error thrown when trying to unblacklist an address that is already non blacklisted.\"}],\"Ownable__CallerNotOwner()\":[{\"notice\":\"Error thrown when a caller is not the owner.\"}],\"Ownable__CallerNotPendingOwner()\":[{\"notice\":\"Error thrown when a caller is not the pending owner.\"}],\"Ownable__NoZeroAddress()\":[{\"notice\":\"Error thrown when a zero address is provided.\"}],\"Pausable__AlreadyPaused()\":[{\"notice\":\"Error thrown when trying to pause the contract when it is already paused.\"}],\"Pausable__AlreadyUnpaused()\":[{\"notice\":\"Error thrown when trying to unpause the contract when it is not paused.\"}],\"Pausable__CallerNotPauser()\":[{\"notice\":\"Error thrown when the caller is not the pauser.\"}],\"Pausable__NoZeroAddress()\":[{\"notice\":\"Error thrown when trying to set the pauser to the zero address.\"}],\"Pausable__Paused()\":[{\"notice\":\"Error thrown when trying to perform an action while the contract is paused.\"}],\"PermissionAdmin__CallerNotPermissionAdmin()\":[{\"notice\":\"Error thrown when the caller is not the permission admin.\"}],\"PermissionAdmin__NoZeroAddress()\":[{\"notice\":\"Error thrown when trying to set the permission admin to the zero address.\"}],\"Rescuable__CallerNotRescuer()\":[{\"notice\":\"Error thrown when the caller is not the rescuer.\"}],\"Rescuable__NoZeroAddress()\":[{\"notice\":\"Error thrown when trying to set the rescuer to the zero address.\"}]},\"events\":{\"Blacklisted(address)\":{\"notice\":\"Emitted when an account is blacklisted.\"},\"BlacklisterChanged(address)\":{\"notice\":\"Emitted when the blacklister is changed.\"},\"Paused()\":{\"notice\":\"Emitted when the contract is paused.\"},\"PauserChanged(address)\":{\"notice\":\"Emitted when the pauser is changed.\"},\"PermissionAdminChanged(address)\":{\"notice\":\"Emitted when the permission admin is changed.\"},\"RescuerChanged(address)\":{\"notice\":\"Emitted when the rescuer is changed.\"},\"UnBlacklisted(address)\":{\"notice\":\"Emitted when an account is removed from the blacklist.\"},\"Unpaused()\":{\"notice\":\"Emitted when the contract is unpaused.\"}},\"kind\":\"user\",\"methods\":{\"acceptOwnership()\":{\"notice\":\"The new owner accepts the ownership transfer. Can only be called by the pending owner.\"},\"allowance(address,address)\":{\"notice\":\"Returns the amount of tokens that spender is allowed to transfer on behalf of owner.\"},\"approve(address,uint256)\":{\"notice\":\"Sets spender's allowance over the caller's tokens to be a given value.\"},\"balanceOf(address)\":{\"notice\":\"Returns the token balance of an account.\"},\"blacklist(address)\":{\"notice\":\"Adds an account to the blacklist.\"},\"burn(uint256)\":{\"notice\":\"Allows a minter to burn some of its own tokens.\"},\"configureMinter(address,uint256)\":{\"notice\":\"Configures a new minter or updates the allowance of an existing minter.\"},\"decimals()\":{\"notice\":\"Returns the number of decimals used to get its user representation.\"},\"decreaseAllowance(address,uint256)\":{\"notice\":\"Decreases the allowance by a given decrement.\"},\"getBlacklister()\":{\"notice\":\"Returns the current blacklister.\"},\"getMinterAllowance(address)\":{\"notice\":\"Returns the minting allowance of a minter.\"},\"getOwner()\":{\"notice\":\"Returns the address of the current owner.\"},\"getPauser()\":{\"notice\":\"Returns the current pauser.\"},\"getPendingOwner()\":{\"notice\":\"Returns the address of the pending owner.\"},\"getPermissionAdmin()\":{\"notice\":\"Returns the current permission admin.\"},\"increaseAllowance(address,uint256)\":{\"notice\":\"Increases the allowance by a given increment.\"},\"initialize(address)\":{\"notice\":\"Initializes the contract setting the deployer as the initial owner.\"},\"initializePausable()\":{\"notice\":\"Initializes the contract in an unpaused state.\"},\"initializeToken(string,string,string,uint8,address,address,address,address)\":{\"notice\":\"Initializes the token with given parameters at most once.\"},\"isBlacklisted(address)\":{\"notice\":\"Checks if an account is blacklisted.\"},\"isMinter(address)\":{\"notice\":\"Checks if an account is a registered minter.\"},\"mint(address,uint256)\":{\"notice\":\"Allows a minter to minter some of its tokens from allowance.\"},\"name()\":{\"notice\":\"Returns the name of the token.\"},\"pause()\":{\"notice\":\"Called by the pauser to pause the contract, triggering the stopped state.\"},\"removeMinter(address)\":{\"notice\":\"Removes a minter.\"},\"rescueERC20(address,address,uint256)\":{\"notice\":\"Rescue ERC20 tokens locked up in this contract.\"},\"rescuer()\":{\"notice\":\"Returns the current rescuer.\"},\"setPermissionAdmin(address)\":{\"notice\":\"Sets a new permission admin.\"},\"symbol()\":{\"notice\":\"Returns the symbol of the token.\"},\"totalSupply()\":{\"notice\":\"Returns the total supply of the token.\"},\"transfer(address,uint256)\":{\"notice\":\"Transfers tokens from the caller to another address.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Transfers tokens from one address to another using allowance.\"},\"transferOwnership(address)\":{\"notice\":\"Starts the ownership transfer of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"unBlacklist(address)\":{\"notice\":\"Removes an account from the blacklist.\"},\"unpause()\":{\"notice\":\"Called by the pauser to unpause the contract, returning to normal state.\"},\"updateBlacklister(address)\":{\"notice\":\"Updates the blacklister role to a new address.\"},\"updateMasterMinter(address)\":{\"notice\":\"Updates the master minter address.\"},\"updatePauser(address)\":{\"notice\":\"Updates the pauser role to a new address.\"},\"updateRescuer(address)\":{\"notice\":\"Assign the rescuer role to a given address.\"},\"wipeBlacklistedAddress(address)\":{\"notice\":\"Wipes the balance of a blacklisted address, decreasing the totalSupply.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/src/TokenContracts/TokenV1.sol\":\"TokenV1\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```solidity\\n * contract MyToken is ERC20Upgradeable {\\n *     function initialize() initializer public {\\n *         __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n *     }\\n * }\\n *\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n *     function initializeV2() reinitializer(2) public {\\n *         __ERC20Permit_init(\\\"MyToken\\\");\\n *     }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n *     _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     * @custom:oz-retyped-from bool\\n     */\\n    uint8 private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Triggered when the contract has been initialized or reinitialized.\\n     */\\n    event Initialized(uint8 version);\\n\\n    /**\\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n     * `onlyInitializing` functions can be used to initialize parent contracts.\\n     *\\n     * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\\n     * constructor.\\n     *\\n     * Emits an {Initialized} event.\\n     */\\n    modifier initializer() {\\n        bool isTopLevelCall = !_initializing;\\n        require(\\n            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\\n            \\\"Initializable: contract is already initialized\\\"\\n        );\\n        _initialized = 1;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n        }\\n        _;\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n            emit Initialized(1);\\n        }\\n    }\\n\\n    /**\\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n     * used to initialize parent contracts.\\n     *\\n     * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n     * are added through upgrades and that require initialization.\\n     *\\n     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n     * cannot be nested. If one is invoked in the context of another, execution will revert.\\n     *\\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n     * a contract, executing them in the right order is up to the developer or operator.\\n     *\\n     * WARNING: setting the version to 255 will prevent any future reinitialization.\\n     *\\n     * Emits an {Initialized} event.\\n     */\\n    modifier reinitializer(uint8 version) {\\n        require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n        _initialized = version;\\n        _initializing = true;\\n        _;\\n        _initializing = false;\\n        emit Initialized(version);\\n    }\\n\\n    /**\\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n     */\\n    modifier onlyInitializing() {\\n        require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n     * through proxies.\\n     *\\n     * Emits an {Initialized} event the first time it is successfully executed.\\n     */\\n    function _disableInitializers() internal virtual {\\n        require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n        if (_initialized != type(uint8).max) {\\n            _initialized = type(uint8).max;\\n            emit Initialized(type(uint8).max);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the highest version that has been initialized. See {reinitializer}.\\n     */\\n    function _getInitializedVersion() internal view returns (uint8) {\\n        return _initialized;\\n    }\\n\\n    /**\\n     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\\n     */\\n    function _isInitializing() internal view returns (bool) {\\n        return _initializing;\\n    }\\n}\\n\",\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     *\\n     * Furthermore, `isContract` will also return true if the target contract within\\n     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n     * which only has an effect at the end of a transaction.\\n     * ====\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n     *\\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n     * constructor.\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize/address.code.length, which returns 0\\n        // for contracts in construction, since the code is only stored at the end\\n        // of the constructor execution.\\n\\n        return account.code.length > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain `call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a delegate call.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function functionDelegateCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n     *\\n     * _Available since v4.8._\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        if (success) {\\n            if (returndata.length == 0) {\\n                // only check isContract if the call was successful and the return data is empty\\n                // otherwise we already know that it was a contract\\n                require(isContract(target), \\\"Address: call to non-contract\\\");\\n            }\\n            return returndata;\\n        } else {\\n            _revert(returndata, errorMessage);\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n     * revert reason or using the provided one.\\n     *\\n     * _Available since v4.3._\\n     */\\n    function verifyCallResult(\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal pure returns (bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            _revert(returndata, errorMessage);\\n        }\\n    }\\n\\n    function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n        // Look for revert reason and bubble it up if present\\n        if (returndata.length > 0) {\\n            // The easiest way to bubble the revert reason is using memory via assembly\\n            /// @solidity memory-safe-assembly\\n            assembly {\\n                let returndata_size := mload(returndata)\\n                revert(add(32, returndata), returndata_size)\\n            }\\n        } else {\\n            revert(errorMessage);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `from` to `to` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 amount) external returns (bool);\\n}\\n\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * ==== Security Considerations\\n *\\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\\n * generally recommended is:\\n *\\n * ```solidity\\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\\n *     try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\\n *     doThing(..., value);\\n * }\\n *\\n * function doThing(..., uint256 value) public {\\n *     token.safeTransferFrom(msg.sender, address(this), value);\\n *     ...\\n * }\\n * ```\\n *\\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\\n * {SafeERC20-safeTransferFrom}).\\n *\\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\\n * contracts should have entry points that don't rely on permit.\\n */\\ninterface IERC20Permit {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n     * given ``owner``'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     *\\n     * CAUTION: See Security Considerations above.\\n     */\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xb264c03a3442eb37a68ad620cefd1182766b58bee6cec40343480392d6b14d69\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\nimport \\\"../extensions/IERC20Permit.sol\\\";\\nimport \\\"../../../utils/Address.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    using Address for address;\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        require(\\n            (value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        unchecked {\\n            uint256 oldAllowance = token.allowance(address(this), spender);\\n            require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\\n     * Revert on invalid signature.\\n     */\\n    function safePermit(\\n        IERC20Permit token,\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) internal {\\n        uint256 nonceBefore = token.nonces(owner);\\n        token.permit(owner, spender, value, deadline, v, r, s);\\n        uint256 nonceAfter = token.nonces(owner);\\n        require(nonceAfter == nonceBefore + 1, \\\"SafeERC20: permit did not succeed\\\");\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        require(returndata.length == 0 || abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     *\\n     * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false\\n        // and not revert is the subcall reverts.\\n\\n        (bool success, bytes memory returndata) = address(token).call(data);\\n        return\\n            success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));\\n    }\\n}\\n\",\"keccak256\":\"0xabefac93435967b4d36a4fabcbdbb918d1f0b7ae3c3d85bc30923b326c927ed1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     *\\n     * Furthermore, `isContract` will also return true if the target contract within\\n     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n     * which only has an effect at the end of a transaction.\\n     * ====\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n     *\\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n     * constructor.\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize/address.code.length, which returns 0\\n        // for contracts in construction, since the code is only stored at the end\\n        // of the constructor execution.\\n\\n        return account.code.length > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain `call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a delegate call.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function functionDelegateCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n     *\\n     * _Available since v4.8._\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        if (success) {\\n            if (returndata.length == 0) {\\n                // only check isContract if the call was successful and the return data is empty\\n                // otherwise we already know that it was a contract\\n                require(isContract(target), \\\"Address: call to non-contract\\\");\\n            }\\n            return returndata;\\n        } else {\\n            _revert(returndata, errorMessage);\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n     * revert reason or using the provided one.\\n     *\\n     * _Available since v4.3._\\n     */\\n    function verifyCallResult(\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal pure returns (bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            _revert(returndata, errorMessage);\\n        }\\n    }\\n\\n    function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n        // Look for revert reason and bubble it up if present\\n        if (returndata.length > 0) {\\n            // The easiest way to bubble the revert reason is using memory via assembly\\n            /// @solidity memory-safe-assembly\\n            assembly {\\n                let returndata_size := mload(returndata)\\n                revert(add(32, returndata), returndata_size)\\n            }\\n        } else {\\n            revert(errorMessage);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"contracts/src/Minting/MinterManagerInterface.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.11;\\n\\n/**\\n * @title MinterManagementInterface\\n * @notice Interface that defines external functions for managing minters and their allowances.\\n * @dev Implementing contracts should provide functionality for adding, removing, and configuring minters.\\n */\\ninterface MinterManagementInterface {\\n    /**\\n     * @notice Checks if an account is a registered minter.\\n     * @param _account The address to check.\\n     * @return A boolean indicating whether the address is a minter.\\n     */\\n    function isMinter(address _account) external view returns (bool);\\n\\n    /**\\n     * @notice Gets the allowance of a minter.\\n     * @param _minter The address of the minter.\\n     * @return The amount of tokens the minter is allowed to mint.\\n     */\\n    function getMinterAllowance(address _minter) external view returns (uint256);\\n\\n    /**\\n     * @notice Configures a new minter or updates the allowance of an existing minter.\\n     * @param _minter The address of the minter.\\n     * @param _minterAllowedAmount The new allowance for the minter.\\n     * @return A boolean indicating whether the configuration was successful.\\n     */\\n    function configureMinter(address _minter, uint256 _minterAllowedAmount) external returns (bool);\\n\\n    /**\\n     * @notice Removes a minter.\\n     * @param _minter The address of the minter to remove.\\n     * @return A boolean indicating whether the removal was successful.\\n     */\\n    function removeMinter(address _minter) external returns (bool);\\n}\\n\",\"keccak256\":\"0xfe064d5b36d033b5069dbe5729c3cc22d670e13f59f5bf0d271d9c4630404970\",\"license\":\"MIT\"},\"contracts/src/TokenContracts/AbstractTokenV1.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.11;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\n\\n/**\\n * @title AbstractTokenV1\\n * @dev Abstract contract for ERC20 token operations. Defines internal functions for approving and transferring tokens.\\n * Inherits from the IERC20 interface.\\n */\\nabstract contract AbstractTokenV1 is IERC20 {\\n    /**\\n     * @notice Internal function to set the allowance for a spender over the owner's tokens.\\n     * @param owner The address of the token owner.\\n     * @param spender The address of the spender.\\n     * @param value The amount of tokens the spender is allowed to spend.\\n     * @dev This function must be overridden in the derived contract.\\n     */\\n    function _approve(address owner, address spender, uint256 value) internal virtual;\\n\\n    /**\\n     * @notice Internal function to transfer tokens from one address to another.\\n     * @param from The address of the token sender.\\n     * @param to The address of the token recipient.\\n     * @param value The amount of tokens to transfer.\\n     * @dev This function must be overridden in the derived contract.\\n     */\\n    function _transfer(address from, address to, uint256 value) internal virtual;\\n\\n    // Storage Gap for future upgrades\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xf7de2b5fb878e57e403e27a3a2a0fb777f01a5271fcc2ea2ac5e0c5aebef9dbb\",\"license\":\"MIT\"},\"contracts/src/TokenContracts/Blacklistable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.11;\\n\\nimport {PermissionAdmin} from \\\"./PermissionAdmin.sol\\\";\\n\\n/**\\n * @title Blacklistable\\n * @notice Contract that allows accounts to be blacklisted by a \\\"blacklister\\\" role.\\n * @dev Inherits from PermissionAdmin to manage blacklister permissions.\\n */\\nabstract contract Blacklistable is PermissionAdmin {\\n    address internal _blacklister;\\n    mapping(address => bool) public blacklisted;\\n\\n    /// @notice Emitted when an account is blacklisted.\\n    /// @param _account The address of the blacklisted account.\\n    event Blacklisted(address indexed _account);\\n\\n    /// @notice Emitted when an account is removed from the blacklist.\\n    /// @param _account The address of the unblacklisted account.\\n    event UnBlacklisted(address indexed _account);\\n\\n    /// @notice Emitted when the blacklister is changed.\\n    /// @param newBlacklister The address of the new blacklister.\\n    event BlacklisterChanged(address indexed newBlacklister);\\n\\n    /// @notice Error thrown when the caller is not the blacklister.\\n    error Blacklistable__CallerNotBlacklister();\\n\\n    /// @notice Error thrown when trying to perform an operation with the zero address, which is prohibited.\\n    error Blacklistable__NoZeroAddress();\\n\\n    /// @notice Error thrown when the account is already blacklisted.\\n    /// @param account The address that is already blacklisted.\\n    error Blacklistable__AccountBlacklisted(address account);\\n\\n    /// @notice Error thrown when the blacklister tries to blacklist themselves.\\n    error Blacklistable__BlacklisterSelfBlacklist();\\n\\n    /// @notice Error thrown when trying to unblacklist an address that is already non blacklisted.\\n    error Blacklistable__NotBlacklisted(address account);\\n\\n    /**\\n     * @dev Modifier to make a function callable only by the blacklister.\\n     */\\n    modifier onlyBlacklister() {\\n        if (msg.sender != _blacklister) revert Blacklistable__CallerNotBlacklister();\\n        _;\\n    }\\n\\n    /**\\n    * @dev Ensures the specified account is not blacklisted and the blacklister is properly set.\\n    * @param _account The address to check for blacklisting.\\n    * @custom:revert Blacklistable__NoZeroAddress if the blacklister address has not been set (is zero).\\n    * @custom:revert Blacklistable__AccountBlacklisted if the account is blacklisted.\\n    */\\n    modifier notBlacklisted(address _account) {\\n        if (_blacklister == address(0)) revert Blacklistable__NoZeroAddress();\\n        if (blacklisted[_account]) revert Blacklistable__AccountBlacklisted(_account);\\n        _;\\n    }\\n\\n    /**\\n     * @notice Returns the current blacklister.\\n     * @return The address of the current blacklister.\\n     */\\n    function getBlacklister() external view returns (address) {\\n        return _blacklister;\\n    }\\n\\n    /**\\n     * @notice Checks if an account is blacklisted.\\n     * @param _account The address to check.\\n     * @return True if the account is blacklisted, false otherwise.\\n     */\\n    function isBlacklisted(address _account) external view returns (bool) {\\n        return blacklisted[_account];\\n    }\\n\\n    /**\\n     * @notice Adds an account to the blacklist.\\n     * @param _account The address to blacklist.\\n     * @dev Emits a {Blacklisted} event.\\n     * @dev Can only be called by the current blacklister.\\n     * @dev The address cannot be the zero address or the blacklister's own address.\\n     */\\n    function blacklist(address _account) external onlyBlacklister {\\n        if (blacklisted[_account]) revert Blacklistable__AccountBlacklisted(_account);\\n        if (_account == _blacklister) revert Blacklistable__BlacklisterSelfBlacklist();\\n        if (_account == address(0)) revert Blacklistable__NoZeroAddress();\\n        blacklisted[_account] = true;\\n        emit Blacklisted(_account);\\n    }\\n\\n    /**\\n     * @notice Removes an account from the blacklist.\\n     * @param _account The address to remove from the blacklist.\\n     * @dev Emits an {UnBlacklisted} event.\\n     * @dev Can only be called by the current blacklister.\\n     */\\n    function unBlacklist(address _account) external onlyBlacklister {\\n         if (!blacklisted[_account]) revert Blacklistable__NotBlacklisted(_account);\\n        blacklisted[_account] = false;\\n        emit UnBlacklisted(_account);\\n    }\\n\\n    /**\\n     * @notice Updates the blacklister role to a new address.\\n     * @param _newBlacklister The address of the new blacklister.\\n     * @dev Emits a {BlacklisterChanged} event.\\n     * @dev Can only be called by the permission admin.\\n     * @dev The new blacklister address cannot be the zero address.\\n     */\\n    function updateBlacklister(address _newBlacklister) external onlyPermissionAdmin {\\n        if (_newBlacklister == address(0)) revert Blacklistable__NoZeroAddress();\\n        _blacklister = _newBlacklister;\\n        emit BlacklisterChanged(_blacklister);\\n    }\\n\\n    // Storage Gap for future upgrades\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x567cf0588630276c10b9987e83501c0c7bf1191ec2c62d27e9b5d59128a94a95\",\"license\":\"MIT\"},\"contracts/src/TokenContracts/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.11;\\n\\nimport {Initializable} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @title Ownable\\n * @dev The Ownable contract has an owner address and provides basic authorization control functions.\\n * Inherits from Initializable for upgradeable contract pattern.\\n */\\ncontract Ownable is Initializable {\\n    // Address of the contract owner\\n    address private _owner;\\n\\n    // Address of the pending owner\\n    address private _pendingOwner;\\n\\n    /**\\n     * @notice Error thrown when a zero address is provided.\\n     */\\n    error Ownable__NoZeroAddress();\\n\\n    /**\\n     * @notice Error thrown when a caller is not the owner.\\n     */\\n    error Ownable__CallerNotOwner();\\n\\n    /**\\n     * @notice Error thrown when a caller is not the pending owner.\\n     */\\n    error Ownable__CallerNotPendingOwner();\\n\\n    /**\\n     * @dev Event emitted when ownership is transferred.\\n     * @param previousOwner The address of the previous owner.\\n     * @param newOwner The address of the new owner.\\n     */\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Event emitted when ownership transfer is started.\\n     * @param previousOwner The address of the previous owner.\\n     * @param newOwner The address of the new owner.\\n     */\\n    event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Modifier to check if the caller is the owner.\\n     */\\n    modifier onlyOwner() {\\n        if (msg.sender != _owner) revert Ownable__CallerNotOwner();\\n        _;\\n    }\\n\\n    /**\\n     * @dev Modifier to check if the caller is the pending owner.\\n     */\\n    modifier onlyPendingOwner() {\\n        if (msg.sender != _pendingOwner) revert Ownable__CallerNotPendingOwner();\\n        _;\\n    }\\n\\n    /**\\n     * @notice Initializes the contract setting the deployer as the initial owner.\\n     * @param owner The address of the initial owner.\\n     */\\n    function initialize(address owner) public onlyInitializing {\\n        setOwner(owner);\\n    }\\n\\n    /**\\n     * @notice Returns the address of the current owner.\\n     * @return The address of the owner.\\n     */\\n    function getOwner() external view returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @notice Returns the address of the pending owner.\\n     * @return The address of the pending owner.\\n     */\\n    function getPendingOwner() external view returns (address) {\\n        return _pendingOwner;\\n    }\\n\\n    /**\\n     * @dev Sets a new owner address internally.\\n     * @param newOwner The address to set as the new owner.\\n     */\\n    function setOwner(address newOwner) internal {\\n        _owner = newOwner;\\n    }\\n\\n    /**\\n     * @notice Starts the ownership transfer of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     * @param newOwner The address to transfer ownership to.\\n     */\\n    function transferOwnership(address newOwner) external onlyOwner {\\n        if (newOwner == address(0)) revert Ownable__NoZeroAddress();\\n        _pendingOwner = newOwner;\\n        emit OwnershipTransferStarted(_owner, newOwner);\\n    }\\n\\n    /**\\n     * @notice The new owner accepts the ownership transfer.\\n     * Can only be called by the pending owner.\\n     */\\n    function acceptOwnership() external onlyPendingOwner {\\n        address oldOwner = _owner;\\n        setOwner(_pendingOwner);\\n        _pendingOwner = address(0);\\n        emit OwnershipTransferred(oldOwner, _owner);\\n    }\\n\\n    // Storage Gap for future upgrades\\n    uint256[49] private __gap;\\n}\",\"keccak256\":\"0xbc69a8b4f2f1f24a8656dcf7644b8ff8b4558cc07aceb903f8a4b74a6135f749\",\"license\":\"MIT\"},\"contracts/src/TokenContracts/Pausable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.11;\\n\\nimport {PermissionAdmin} from \\\"./PermissionAdmin.sol\\\";\\n\\n/**\\n * @title Pausable\\n * @notice Base contract which allows children to implement an emergency stop mechanism.\\n * @dev Inherits from PermissionAdmin to manage pauser permissions.\\n */\\nabstract contract Pausable is PermissionAdmin {\\n    address internal _pauser;\\n    bool public paused;\\n\\n    /// @notice Emitted when the contract is paused.\\n    event Paused();\\n\\n    /// @notice Emitted when the contract is unpaused.\\n    event Unpaused();\\n\\n    /// @notice Emitted when the pauser is changed.\\n    /// @param newPauser The address of the new pauser.\\n    event PauserChanged(address indexed newPauser);\\n\\n    /// @notice Error thrown when trying to perform an action while the contract is paused.\\n    error Pausable__Paused();\\n\\n    /// @notice Error thrown when the caller is not the pauser.\\n    error Pausable__CallerNotPauser();\\n\\n    /// @notice Error thrown when trying to pause the contract when it is already paused.\\n    error Pausable__AlreadyPaused();\\n\\n    /// @notice Error thrown when trying to unpause the contract when it is not paused.\\n    error Pausable__AlreadyUnpaused();\\n\\n    /// @notice Error thrown when trying to set the pauser to the zero address.\\n    error Pausable__NoZeroAddress();\\n\\n    /**\\n     * @dev Modifier to make a function callable only when the contract is not paused.\\n     */\\n    modifier whenNotPaused() {\\n        if (paused) revert Pausable__Paused();\\n        _;\\n    }\\n\\n    /**\\n     * @dev Modifier to make a function callable only by the pauser.\\n     */\\n    modifier onlyPauser() {\\n        if (msg.sender != _pauser) revert Pausable__CallerNotPauser();\\n        _;\\n    }\\n\\n    /**\\n     * @notice Returns the current pauser.\\n     * @return The address of the current pauser.\\n     */\\n    function getPauser() external view returns (address) {\\n        return _pauser;\\n    }\\n\\n    /**\\n     * @notice Called by the pauser to pause the contract, triggering the stopped state.\\n     * @dev Emits a {Paused} event.\\n     * @dev Can only be called by the current pauser.\\n     */\\n    function pause() external onlyPauser {\\n        if (paused) revert Pausable__AlreadyPaused();\\n        paused = true;\\n        emit Paused();\\n    }\\n\\n    /**\\n     * @notice Initializes the contract in an unpaused state.\\n     * @dev This function should be called during contract initialization.\\n     */\\n    function initializePausable() public onlyInitializing {\\n        paused = false;\\n    }\\n\\n    /**\\n     * @notice Called by the pauser to unpause the contract, returning to normal state.\\n     * @dev Emits an {Unpaused} event.\\n     * @dev Can only be called by the current pauser.\\n     */\\n    function unpause() external onlyPauser {\\n        if (!paused) revert Pausable__AlreadyUnpaused();\\n        paused = false;\\n        emit Unpaused();\\n    }\\n\\n    /**\\n     * @notice Updates the pauser role to a new address.\\n     * @param _newPauser The address of the new pauser.\\n     * @dev Emits a {PauserChanged} event.\\n     * @dev Can only be called by the permission admin.\\n     * @dev The new pauser address cannot be the zero address.\\n     */\\n    function updatePauser(address _newPauser) external onlyPermissionAdmin {\\n        if (_newPauser == address(0)) revert Pausable__NoZeroAddress();\\n        _pauser = _newPauser;\\n        emit PauserChanged(_pauser);\\n    }\\n\\n    // Storage Gap for future upgrades\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x506cdecfe07cf9ad6513e6b7154b005dd2bcbacf66411a44252398cdb08ca328\",\"license\":\"MIT\"},\"contracts/src/TokenContracts/PermissionAdmin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.11;\\n\\nimport {Ownable} from \\\"./Ownable.sol\\\";\\n\\n/**\\n * @title PermissionAdmin\\n * @notice Base contract which allows the owner to set an admin with the ability to select the pauser, blacklister, and rescuer.\\n * @dev Only the contract owner can modify the admin. The admin has special permissions defined by this contract.\\n */\\nabstract contract PermissionAdmin is Ownable {\\n    address private _permissionAdmin;\\n\\n    /// @notice Emitted when the permission admin is changed.\\n    /// @param admin The new permission admin.\\n    event PermissionAdminChanged(address indexed admin);\\n\\n    /// @notice Error thrown when the caller is not the permission admin.\\n    error PermissionAdmin__CallerNotPermissionAdmin();\\n\\n    /// @notice Error thrown when trying to set the permission admin to the zero address.\\n    error PermissionAdmin__NoZeroAddress();\\n    \\n    /**\\n     * @dev Modifier to make a function callable only by the permission admin.\\n     */\\n    modifier onlyPermissionAdmin() {\\n        if (msg.sender != _permissionAdmin) {\\n            revert PermissionAdmin__CallerNotPermissionAdmin();\\n        }\\n        _;\\n    }\\n\\n    /**\\n     * @notice Returns the current permission admin.\\n     * @return The address of the current permission admin.\\n     */\\n    function getPermissionAdmin() external view returns (address) {\\n        return _permissionAdmin;\\n    }\\n\\n    /**\\n     * @notice Sets a new permission admin.\\n     * @param _newAdmin The address of the new permission admin.\\n     * @dev Only the contract owner can call this function. The new admin address cannot be the zero address.\\n     */\\n    function setPermissionAdmin(address _newAdmin) external onlyOwner {\\n        if (_newAdmin == address(0)) revert PermissionAdmin__NoZeroAddress();\\n        _permissionAdmin = _newAdmin;\\n        emit PermissionAdminChanged(_permissionAdmin);\\n    }\\n\\n    // Storage Gap for future upgrades\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x3125291a5f5437c83c1fa9945887e9c3c354e2a0904faf7038fa829dab3a0023\",\"license\":\"MIT\"},\"contracts/src/TokenContracts/Rescuable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.11;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport {SafeERC20} from \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport {PermissionAdmin} from \\\"./PermissionAdmin.sol\\\";\\n\\n/**\\n * @title Rescuable\\n * @notice Contract that allows rescuing ERC20 tokens locked up in this contract by a \\\"rescuer\\\" role.\\n * @dev Inherits from PermissionAdmin to manage rescuer permissions.\\n */\\nabstract contract Rescuable is PermissionAdmin {\\n    using SafeERC20 for IERC20;\\n\\n    address internal _rescuer;\\n\\n    /// @notice Error thrown when the caller is not the rescuer.\\n    error Rescuable__CallerNotRescuer();\\n\\n    /// @notice Error thrown when trying to set the rescuer to the zero address.\\n    error Rescuable__NoZeroAddress();\\n\\n    /// @notice Emitted when the rescuer is changed.\\n    /// @param newRescuer The address of the new rescuer.\\n    event RescuerChanged(address indexed newRescuer);\\n\\n    /**\\n     * @notice Returns the current rescuer.\\n     * @return The address of the current rescuer.\\n     */\\n    function rescuer() external view returns (address) {\\n        return _rescuer;\\n    }\\n\\n    /**\\n     * @dev Modifier to make a function callable only by the rescuer.\\n     */\\n    modifier onlyRescuer() {\\n        if (msg.sender != _rescuer) revert Rescuable__CallerNotRescuer();\\n        _;\\n    }\\n\\n    /**\\n     * @notice Rescue ERC20 tokens locked up in this contract.\\n     * @param tokenContract The address of the ERC20 token contract.\\n     * @param to The recipient address to receive the rescued tokens.\\n     * @param amount The amount of tokens to withdraw.\\n     * @dev Can only be called by the current rescuer.\\n     */\\n    function rescueERC20(\\n        IERC20 tokenContract,\\n        address to,\\n        uint256 amount\\n    ) external onlyRescuer {\\n        tokenContract.safeTransfer(to, amount);\\n    }\\n\\n    /**\\n     * @notice Assign the rescuer role to a given address.\\n     * @param newRescuer The address of the new rescuer.\\n     * @dev Emits a {RescuerChanged} event.\\n     * @dev Can only be called by the permission admin.\\n     * @dev The new rescuer address cannot be the zero address.\\n     */\\n    function updateRescuer(address newRescuer) external onlyPermissionAdmin {\\n        if (newRescuer == address(0)) revert Rescuable__NoZeroAddress();\\n        _rescuer = newRescuer;\\n        emit RescuerChanged(newRescuer);\\n    }\\n\\n    // Storage Gap for future upgrades\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x6e3f9c8bb0f4a17be5ba22cebc6d17959892c1587419a7a13990ea5d583b488a\",\"license\":\"MIT\"},\"contracts/src/TokenContracts/TokenV1.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.11;\\n\\nimport {AbstractTokenV1} from \\\"./AbstractTokenV1.sol\\\";\\nimport {Ownable} from \\\"./Ownable.sol\\\";\\nimport {Pausable} from \\\"./Pausable.sol\\\";\\nimport {Blacklistable} from \\\"./Blacklistable.sol\\\";\\nimport {Rescuable} from \\\"./Rescuable.sol\\\";\\nimport {MinterManagementInterface} from \\\"../Minting/MinterManagerInterface.sol\\\";\\n\\n/**\\n * @title TokenV1\\n * @dev ERC20 Token backed by fiat reserves with additional functionality for minting, burning, pausing, blacklisting, and rescuing tokens.\\n * Inherits MinterManagementInterface to comply with minter management specifications.\\n */\\ncontract TokenV1 is AbstractTokenV1, Ownable, Pausable, Blacklistable, Rescuable, MinterManagementInterface {\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n    string public currency;\\n    address public masterMinter;\\n\\n    uint256 internal _totalSupply;\\n\\n    mapping(address => uint256) internal balances;\\n    mapping(address => mapping(address => uint256)) internal allowed;\\n    mapping(address => bool) public isMinter;\\n    mapping(address => uint256) public minterAllowance; // Allowance set by approval\\n\\n    /**\\n     * @dev Emitted when tokens are minted.\\n     * @param minter The address of the minter.\\n     * @param to The address of the recipient.\\n     * @param amount The amount of tokens minted.\\n     */\\n    event Mint(address indexed minter, address indexed to, uint256 amount);\\n\\n    /**\\n     * @dev Emitted when tokens are burned.\\n     * @param burner The address of the burner.\\n     * @param amount The amount of tokens burned.\\n     */\\n    event Burn(address indexed burner, uint256 amount);\\n\\n    /**\\n     * @dev Emitted when a minter is configured.\\n     * @param minter The address of the minter.\\n     * @param minterAllowedAmount The allowance of the minter.\\n     */\\n    event MinterConfigured(address indexed minter, uint256 minterAllowedAmount);\\n\\n    /**\\n     * @dev Emitted when a minter is removed.\\n     * @param oldMinter The address of the removed minter.\\n     */\\n    event MinterRemoved(address indexed oldMinter);\\n\\n    /**\\n     * @dev Emitted when the master minter is changed.\\n     * @param newMasterMinter The address of the new master minter.\\n     */\\n    event MasterMinterChanged(address indexed newMasterMinter);\\n\\n    /**\\n     * @dev Emitted when the token decimals are set.\\n     * @param decimals The number of decimals set.\\n     */\\n    event TokenDecimalsSet(uint8 decimals);\\n\\n    /**\\n     * @dev Emitted when a new master minter is set.\\n     * @param newMasterMinter The address of the new master minter.\\n     */\\n    event NewMasterMinter(address indexed newMasterMinter);\\n\\n    /**\\n     * @dev Emitted when a new pauser is set.\\n     * @param newPauser The address of the new pauser.\\n     */\\n    event NewPauser(address indexed newPauser);\\n\\n    /**\\n     * @dev Emitted when a new blacklister is set.\\n     * @param newBlacklister The address of the new blacklister.\\n     */\\n    event NewBlacklister(address indexed newBlacklister);\\n\\n    /**\\n     * @dev Error thrown when the caller is not a minter.\\n     */\\n    error NotMinter();\\n\\n    /**\\n     * @dev Error thrown when the caller is not the master minter.\\n     */\\n    error NotMasterMinter();\\n\\n    /**\\n     * @dev Error thrown when a zero address is provided.\\n     */\\n    error NoZeroAddress();\\n\\n    /**\\n     * @dev Error thrown when the mint amount is zero.\\n     */\\n    error MintMustBeGreaterThanZero();\\n\\n    /**\\n     * @dev Error thrown when the amount exceeds the balance.\\n     */\\n    error AmountExceedsBalance();\\n\\n    /**\\n     * @dev Error thrown when the burn amount is not greater than zero.\\n     */\\n    error BurnAmountNotGreaterThanZero();\\n\\n    /**\\n     * @dev Error thrown when the allowance is exceeded.\\n     */\\n    error AllowanceExceeded();\\n\\n    /**\\n     * @dev Error thrown when a minter tries to mint to a different address.\\n     */\\n    error NotSelfMinting();\\n\\n    /**\\n     * @dev Error thrown when an attempt to decrease the allowance fails.\\n     * @param owner The owner address.\\n     * @param spender The spender address.\\n     * @param currentAllowance The current allowance.\\n     * @param decrement The decrement amount.\\n     */\\n    error FailedDecreaseAllowance(address owner, address spender, uint256 currentAllowance, uint256 decrement);\\n\\n    /**\\n     * @dev Error thrown when an address is not blacklisted.\\n     */\\n    error NotBlacklisted();\\n\\n    /**\\n     * @dev Error thrown when an address has zero balance.\\n     */\\n    error ZeroBalance();\\n\\n    /**\\n     * @dev Modifier to make a function callable only by a minter.\\n     */\\n    modifier onlyMinter() {\\n        if (!isMinter[msg.sender]) revert NotMinter();\\n        _;\\n    }\\n\\n    /**\\n     * @dev Modifier to make a function callable only by the master minter.\\n     */\\n    modifier onlyMasterMinter() {\\n        if (msg.sender != masterMinter) revert NotMasterMinter();\\n        _;\\n    }\\n\\n    /**\\n     * @notice Initializes the token with given parameters at most once.\\n     * @param tokenName The name of the token.\\n     * @param tokenSymbol The symbol of the token.\\n     * @param tokenCurrency The currency of the token.\\n     * @param tokenDecimals The number of decimals the token uses.\\n     * @param newMasterMinter The address of the new master minter.\\n     * @param newPauser The address of the new pauser.\\n     * @param newBlacklister The address of the new blacklister.\\n     * @param newRescuer The address of the new rescuer.\\n     */\\n    function initializeToken(\\n        string calldata tokenName,\\n        string calldata tokenSymbol,\\n        string calldata tokenCurrency,\\n        uint8 tokenDecimals,\\n        address newMasterMinter,\\n        address newPauser,\\n        address newBlacklister,\\n        address newRescuer\\n    ) public initializer {\\n        Ownable.initialize(msg.sender);\\n        Pausable.initializePausable();\\n\\n        if (newMasterMinter == address(0)) revert NoZeroAddress();\\n        if (newPauser == address(0)) revert NoZeroAddress();\\n        if (newBlacklister == address(0)) revert NoZeroAddress();\\n        if (newRescuer == address(0)) revert NoZeroAddress();\\n\\n        _name = tokenName;\\n        _symbol = tokenSymbol;\\n        currency = tokenCurrency;\\n        _decimals = tokenDecimals;\\n        masterMinter = newMasterMinter;\\n        _pauser = newPauser;\\n        _blacklister = newBlacklister;\\n        _rescuer = newRescuer;\\n\\n        emit NewMasterMinter(newMasterMinter);\\n        emit NewPauser(newPauser);\\n        emit NewBlacklister(newBlacklister);\\n        emit TokenDecimalsSet(tokenDecimals);\\n        emit RescuerChanged(newRescuer);\\n    }\\n\\n    /**\\n     * @notice Returns the name of the token.\\n     * @return The name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @notice Returns the symbol of the token.\\n     * @return The symbol of the token.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @notice Returns the number of decimals used to get its user representation.\\n     * @return The number of decimals used by the token.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @notice Returns the minting allowance of a minter.\\n     * @param minter The address of the minter.\\n     * @return The minting allowance of the minter.\\n     */\\n    function getMinterAllowance(address minter) external view override returns (uint256) {\\n        return minterAllowance[minter];\\n    }\\n\\n    /**\\n     * @notice Returns the amount of tokens that spender is allowed to transfer on behalf of owner.\\n     * @param owner Token owner's address.\\n     * @param spender Spender's address.\\n     * @return The allowance amount.\\n     */\\n    function allowance(address owner, address spender) external view override returns (uint256) {\\n        return allowed[owner][spender];\\n    }\\n\\n    /**\\n     * @notice Returns the total supply of the token.\\n     * @return The total supply.\\n     */\\n    function totalSupply() external view override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @notice Returns the token balance of an account.\\n     * @param account The address of the account.\\n     * @return The token balance of the account.\\n     */\\n    function balanceOf(address account) external view override returns (uint256) {\\n        return balances[account];\\n    }\\n\\n    /**\\n     * @notice Sets spender's allowance over the caller's tokens to be a given value.\\n     * @param spender Spender's address.\\n     * @param value Allowance amount.\\n     * @return True if the operation was successful.\\n     */\\n    function approve(\\n        address spender,\\n        uint256 value\\n    )\\n        external\\n        override\\n        whenNotPaused\\n        notBlacklisted(msg.sender)\\n        notBlacklisted(spender)\\n        returns (bool)\\n    {\\n        _approve(msg.sender, spender, value);\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Internal function to set allowance.\\n     * @param owner Token owner's address.\\n     * @param spender Spender's address.\\n     * @param value Allowance amount.\\n     */\\n    function _approve(address owner, address spender, uint256 value) internal override {\\n        if (owner == address(0)) revert NoZeroAddress();\\n        if (spender == address(0)) revert NoZeroAddress();\\n        allowed[owner][spender] = value;\\n        emit Approval(owner, spender, value);\\n    }\\n\\n    /**\\n     * @notice Transfers tokens from one address to another using allowance.\\n     * @param from Payer's address.\\n     * @param to Payee's address.\\n     * @param value Transfer amount.\\n     * @return True if the operation was successful.\\n     */\\n    function transferFrom(\\n    address from,\\n    address to,\\n    uint256 value\\n    )\\n        external\\n        override\\n        whenNotPaused\\n        notBlacklisted(msg.sender)\\n        notBlacklisted(from)\\n        notBlacklisted(to)\\n        returns (bool)\\n    {\\n        if (value > allowed[from][msg.sender]) revert AllowanceExceeded();\\n        _transfer(from, to, value);\\n        allowed[from][msg.sender] -= value;\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Transfers tokens from the caller to another address.\\n     * @param to Payee's address.\\n     * @param value Transfer amount.\\n     * @return True if the operation was successful.\\n     */\\n    function transfer(\\n        address to,\\n        uint256 value\\n    )\\n        external\\n        override\\n        whenNotPaused\\n        notBlacklisted(msg.sender)\\n        notBlacklisted(to)\\n        returns (bool)\\n    {\\n        _transfer(msg.sender, to, value);\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Internal function to process token transfers.\\n     * @param from Payer's address.\\n     * @param to Payee's address.\\n     * @param value Transfer amount.\\n     */\\n    function _transfer(address from, address to, uint256 value) internal override {\\n        if (from == address(0)) revert NoZeroAddress();\\n        if (to == address(0)) revert NoZeroAddress();\\n        if (value > balances[from]) revert AmountExceedsBalance();\\n\\n        balances[from] -= value;\\n        balances[to] += value;\\n        emit Transfer(from, to, value);\\n    }\\n\\n    /**\\n     * @notice Configures a new minter or updates the allowance of an existing minter.\\n     * @param minter The address of the minter.\\n     * @param _minterAllowedAmount The minting allowance for the minter.\\n     * @return True if the operation was successful.\\n     */\\n    function configureMinter(\\n        address minter,\\n        uint256 _minterAllowedAmount\\n    ) external override whenNotPaused onlyMasterMinter returns (bool) {\\n        isMinter[minter] = true;\\n        minterAllowance[minter] = _minterAllowedAmount;\\n\\n        emit MinterConfigured(minter, _minterAllowedAmount);\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Removes a minter.\\n     * @param minter The address of the minter to remove.\\n     * @return True if the operation was successful.\\n     */\\n    function removeMinter(address minter) external override onlyMasterMinter returns (bool) {\\n        isMinter[minter] = false;\\n        minterAllowance[minter] = 0;\\n        emit MinterRemoved(minter);\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Allows a minter to burn some of its own tokens.\\n     * @param _amount The amount of tokens to be burned.\\n     */\\n    function burn(uint256 _amount) external whenNotPaused onlyMinter notBlacklisted(msg.sender) {\\n        uint256 balance = balances[msg.sender];\\n        if (_amount <= 0) revert BurnAmountNotGreaterThanZero();\\n        if (balance < _amount) revert AmountExceedsBalance();\\n\\n        _totalSupply -= _amount;\\n        balances[msg.sender] -= _amount;\\n        emit Burn(msg.sender, _amount);\\n        emit Transfer(msg.sender, address(0), _amount);\\n    }\\n\\n    /**\\n     * @notice Allows a minter to minter some of its tokens from allowance.\\n     * @param _to The address to receive the minted tokens.\\n     * @param _amount The amount of tokens to mint.\\n     * @return True if the operation was successful.\\n     */\\n    function mint(\\n        address _to,\\n        uint256 _amount\\n    ) public whenNotPaused onlyMinter notBlacklisted(msg.sender) notBlacklisted(_to) returns (bool) {\\n        if (_to == address(0)) revert NoZeroAddress();\\n        if (_amount <= 0) revert MintMustBeGreaterThanZero();\\n        if (msg.sender != _to) revert NotSelfMinting();\\n        if (minterAllowance[_to] < _amount) revert AllowanceExceeded();\\n\\n        _totalSupply += _amount;\\n        balances[_to] += _amount;\\n        minterAllowance[_to] -= _amount;\\n        emit Mint(msg.sender, _to, _amount);\\n        emit Transfer(address(0), _to, _amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Updates the master minter address.\\n     * @param _newMasterMinter The address of the new master minter.\\n     */\\n    function updateMasterMinter(address _newMasterMinter) external onlyOwner {\\n        if (_newMasterMinter == address(0)) revert NoZeroAddress();\\n        masterMinter = _newMasterMinter;\\n        emit MasterMinterChanged(masterMinter);\\n    }\\n\\n    /**\\n     * @notice Increases the allowance by a given increment.\\n     * @param spender Spender's address.\\n     * @param increment The amount to increase the allowance by.\\n     * @return True if the operation was successful.\\n     */\\n    function increaseAllowance(\\n        address spender,\\n        uint256 increment\\n    ) external whenNotPaused notBlacklisted(msg.sender) notBlacklisted(spender) returns (bool) {\\n        address owner = msg.sender;\\n        _approve(owner, spender, allowed[owner][spender] + increment);\\n\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Decreases the allowance by a given decrement.\\n     * @param spender Spender's address.\\n     * @param decrement The amount to decrease the allowance by.\\n     * @return True if the operation was successful.\\n     */\\n    function decreaseAllowance(\\n        address spender,\\n        uint256 decrement\\n    ) external whenNotPaused notBlacklisted(msg.sender) notBlacklisted(spender) returns (bool) {\\n        address owner = msg.sender;\\n        uint256 currentAllowance = allowed[owner][spender];\\n        if (currentAllowance < decrement) {\\n            revert FailedDecreaseAllowance(owner, spender, currentAllowance, decrement);\\n        }\\n\\n        _approve(owner, spender, currentAllowance - decrement);\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Wipes the balance of a blacklisted address, decreasing the totalSupply.\\n     * @dev Only the owner can call this function, and the address must be blacklisted.\\n     * @param _account The address to wipe.\\n     */\\n    function wipeBlacklistedAddress(address _account) external onlyOwner {\\n        if (!blacklisted[_account]) revert NotBlacklisted();\\n        uint256 balance = balances[_account];\\n        if (balance == 0) revert ZeroBalance();\\n        _totalSupply -= balance;\\n        balances[_account] = 0;\\n        \\n        emit Transfer(_account, address(0), balance);\\n    }\\n\\n    // Storage Gap for future upgrades\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x67b2703da11ed8d5688c32fc255463ec31f6a188e50559d28b948a760f9b1878\",\"license\":\"MIT\"}},\"version\":1}","userdoc":{"kind":"user","errors":{"Pausable__Paused()":[{"notice":"Error thrown when trying to perform an action while the contract is paused."}],"Ownable__NoZeroAddress()":[{"notice":"Error thrown when a zero address is provided."}],"Ownable__CallerNotOwner()":[{"notice":"Error thrown when a caller is not the owner."}],"Pausable__AlreadyPaused()":[{"notice":"Error thrown when trying to pause the contract when it is already paused."}],"Pausable__NoZeroAddress()":[{"notice":"Error thrown when trying to set the pauser to the zero address."}],"Rescuable__NoZeroAddress()":[{"notice":"Error thrown when trying to set the rescuer to the zero address."}],"Pausable__AlreadyUnpaused()":[{"notice":"Error thrown when trying to unpause the contract when it is not paused."}],"Pausable__CallerNotPauser()":[{"notice":"Error thrown when the caller is not the pauser."}],"Rescuable__CallerNotRescuer()":[{"notice":"Error thrown when the caller is not the rescuer."}],"Blacklistable__NoZeroAddress()":[{"notice":"Error thrown when trying to perform an operation with the zero address, which is prohibited."}],"Ownable__CallerNotPendingOwner()":[{"notice":"Error thrown when a caller is not the pending owner."}],"PermissionAdmin__NoZeroAddress()":[{"notice":"Error thrown when trying to set the permission admin to the zero address."}],"Blacklistable__CallerNotBlacklister()":[{"notice":"Error thrown when the caller is not the blacklister."}],"Blacklistable__NotBlacklisted(address)":[{"notice":"Error thrown when trying to unblacklist an address that is already non blacklisted."}],"Blacklistable__BlacklisterSelfBlacklist()":[{"notice":"Error thrown when the blacklister tries to blacklist themselves."}],"Blacklistable__AccountBlacklisted(address)":[{"notice":"Error thrown when the account is already blacklisted."}],"PermissionAdmin__CallerNotPermissionAdmin()":[{"notice":"Error thrown when the caller is not the permission admin."}]},"events":{"Paused()":{"notice":"Emitted when the contract is paused."},"Unpaused()":{"notice":"Emitted when the contract is unpaused."},"Blacklisted(address)":{"notice":"Emitted when an account is blacklisted."},"PauserChanged(address)":{"notice":"Emitted when the pauser is changed."},"UnBlacklisted(address)":{"notice":"Emitted when an account is removed from the blacklist."},"RescuerChanged(address)":{"notice":"Emitted when the rescuer is changed."},"BlacklisterChanged(address)":{"notice":"Emitted when the blacklister is changed."},"PermissionAdminChanged(address)":{"notice":"Emitted when the permission admin is changed."}},"methods":{"name()":{"notice":"Returns the name of the token."},"pause()":{"notice":"Called by the pauser to pause the contract, triggering the stopped state."},"symbol()":{"notice":"Returns the symbol of the token."},"rescuer()":{"notice":"Returns the current rescuer."},"unpause()":{"notice":"Called by the pauser to unpause the contract, returning to normal state."},"decimals()":{"notice":"Returns the number of decimals used to get its user representation."},"getOwner()":{"notice":"Returns the address of the current owner."},"getPauser()":{"notice":"Returns the current pauser."},"burn(uint256)":{"notice":"Allows a minter to burn some of its own tokens."},"totalSupply()":{"notice":"Returns the total supply of the token."},"getBlacklister()":{"notice":"Returns the current blacklister."},"acceptOwnership()":{"notice":"The new owner accepts the ownership transfer. Can only be called by the pending owner."},"getPendingOwner()":{"notice":"Returns the address of the pending owner."},"isMinter(address)":{"notice":"Checks if an account is a registered minter."},"balanceOf(address)":{"notice":"Returns the token balance of an account."},"blacklist(address)":{"notice":"Adds an account to the blacklist."},"initialize(address)":{"notice":"Initializes the contract setting the deployer as the initial owner."},"getPermissionAdmin()":{"notice":"Returns the current permission admin."},"initializePausable()":{"notice":"Initializes the contract in an unpaused state."},"unBlacklist(address)":{"notice":"Removes an account from the blacklist."},"mint(address,uint256)":{"notice":"Allows a minter to minter some of its tokens from allowance."},"removeMinter(address)":{"notice":"Removes a minter."},"updatePauser(address)":{"notice":"Updates the pauser role to a new address."},"isBlacklisted(address)":{"notice":"Checks if an account is blacklisted."},"updateRescuer(address)":{"notice":"Assign the rescuer role to a given address."},"approve(address,uint256)":{"notice":"Sets spender's allowance over the caller's tokens to be a given value."},"transfer(address,uint256)":{"notice":"Transfers tokens from the caller to another address."},"allowance(address,address)":{"notice":"Returns the amount of tokens that spender is allowed to transfer on behalf of owner."},"transferOwnership(address)":{"notice":"Starts the ownership transfer of the contract to a new account (`newOwner`). Can only be called by the current owner."},"updateBlacklister(address)":{"notice":"Updates the blacklister role to a new address."},"getMinterAllowance(address)":{"notice":"Returns the minting allowance of a minter."},"setPermissionAdmin(address)":{"notice":"Sets a new permission admin."},"updateMasterMinter(address)":{"notice":"Updates the master minter address."},"wipeBlacklistedAddress(address)":{"notice":"Wipes the balance of a blacklisted address, decreasing the totalSupply."},"configureMinter(address,uint256)":{"notice":"Configures a new minter or updates the allowance of an existing minter."},"decreaseAllowance(address,uint256)":{"notice":"Decreases the allowance by a given decrement."},"increaseAllowance(address,uint256)":{"notice":"Increases the allowance by a given increment."},"rescueERC20(address,address,uint256)":{"notice":"Rescue ERC20 tokens locked up in this contract."},"transferFrom(address,address,uint256)":{"notice":"Transfers tokens from one address to another using allowance."},"initializeToken(string,string,string,uint8,address,address,address,address)":{"notice":"Initializes the token with given parameters at most once."}},"version":1},"devdoc":{"kind":"dev","title":"TokenV1","errors":{"NotMinter()":[{"details":"Error thrown when the caller is not a minter."}],"ZeroBalance()":[{"details":"Error thrown when an address has zero balance."}],"NoZeroAddress()":[{"details":"Error thrown when a zero address is provided."}],"NotBlacklisted()":[{"details":"Error thrown when an address is not blacklisted."}],"NotSelfMinting()":[{"details":"Error thrown when a minter tries to mint to a different address."}],"NotMasterMinter()":[{"details":"Error thrown when the caller is not the master minter."}],"AllowanceExceeded()":[{"details":"Error thrown when the allowance is exceeded."}],"AmountExceedsBalance()":[{"details":"Error thrown when the amount exceeds the balance."}],"MintMustBeGreaterThanZero()":[{"details":"Error thrown when the mint amount is zero."}],"BurnAmountNotGreaterThanZero()":[{"details":"Error thrown when the burn amount is not greater than zero."}],"Blacklistable__AccountBlacklisted(address)":[{"params":{"account":"The address that is already blacklisted."}}],"FailedDecreaseAllowance(address,address,uint256,uint256)":[{"params":{"owner":"The owner address.","spender":"The spender address.","decrement":"The decrement amount.","currentAllowance":"The current allowance."},"details":"Error thrown when an attempt to decrease the allowance fails."}]},"events":{"NewPauser(address)":{"params":{"newPauser":"The address of the new pauser."},"details":"Emitted when a new pauser is set."},"Burn(address,uint256)":{"params":{"amount":"The amount of tokens burned.","burner":"The address of the burner."},"details":"Emitted when tokens are burned."},"MinterRemoved(address)":{"params":{"oldMinter":"The address of the removed minter."},"details":"Emitted when a minter is removed."},"NewBlacklister(address)":{"params":{"newBlacklister":"The address of the new blacklister."},"details":"Emitted when a new blacklister is set."},"TokenDecimalsSet(uint8)":{"params":{"decimals":"The number of decimals set."},"details":"Emitted when the token decimals are set."},"NewMasterMinter(address)":{"params":{"newMasterMinter":"The address of the new master minter."},"details":"Emitted when a new master minter is set."},"MasterMinterChanged(address)":{"params":{"newMasterMinter":"The address of the new master minter."},"details":"Emitted when the master minter is changed."},"Mint(address,address,uint256)":{"params":{"to":"The address of the recipient.","amount":"The amount of tokens minted.","minter":"The address of the minter."},"details":"Emitted when tokens are minted."},"MinterConfigured(address,uint256)":{"params":{"minter":"The address of the minter.","minterAllowedAmount":"The allowance of the minter."},"details":"Emitted when a minter is configured."}},"details":"ERC20 Token backed by fiat reserves with additional functionality for minting, burning, pausing, blacklisting, and rescuing tokens. Inherits MinterManagementInterface to comply with minter management specifications.","methods":{"name()":{"returns":{"_0":"The name of the token."}},"pause()":{"details":"Emits a {Paused} event.Can only be called by the current pauser."},"symbol()":{"returns":{"_0":"The symbol of the token."}},"rescuer()":{"returns":{"_0":"The address of the current rescuer."}},"unpause()":{"details":"Emits an {Unpaused} event.Can only be called by the current pauser."},"decimals()":{"returns":{"_0":"The number of decimals used by the token."}},"getOwner()":{"returns":{"_0":"The address of the owner."}},"getPauser()":{"returns":{"_0":"The address of the current pauser."}},"burn(uint256)":{"params":{"_amount":"The amount of tokens to be burned."}},"totalSupply()":{"returns":{"_0":"The total supply."}},"getBlacklister()":{"returns":{"_0":"The address of the current blacklister."}},"getPendingOwner()":{"returns":{"_0":"The address of the pending owner."}},"balanceOf(address)":{"params":{"account":"The address of the account."},"returns":{"_0":"The token balance of the account."}},"blacklist(address)":{"params":{"_account":"The address to blacklist."},"details":"Emits a {Blacklisted} event.Can only be called by the current blacklister.The address cannot be the zero address or the blacklister's own address."},"initialize(address)":{"params":{"owner":"The address of the initial owner."}},"getPermissionAdmin()":{"returns":{"_0":"The address of the current permission admin."}},"initializePausable()":{"details":"This function should be called during contract initialization."},"unBlacklist(address)":{"params":{"_account":"The address to remove from the blacklist."},"details":"Emits an {UnBlacklisted} event.Can only be called by the current blacklister."},"mint(address,uint256)":{"params":{"_to":"The address to receive the minted tokens.","_amount":"The amount of tokens to mint."},"returns":{"_0":"True if the operation was successful."}},"removeMinter(address)":{"params":{"minter":"The address of the minter to remove."},"returns":{"_0":"True if the operation was successful."}},"updatePauser(address)":{"params":{"_newPauser":"The address of the new pauser."},"details":"Emits a {PauserChanged} event.Can only be called by the permission admin.The new pauser address cannot be the zero address."},"isBlacklisted(address)":{"params":{"_account":"The address to check."},"returns":{"_0":"True if the account is blacklisted, false otherwise."}},"updateRescuer(address)":{"params":{"newRescuer":"The address of the new rescuer."},"details":"Emits a {RescuerChanged} event.Can only be called by the permission admin.The new rescuer address cannot be the zero address."},"approve(address,uint256)":{"params":{"value":"Allowance amount.","spender":"Spender's address."},"returns":{"_0":"True if the operation was successful."}},"transfer(address,uint256)":{"params":{"to":"Payee's address.","value":"Transfer amount."},"returns":{"_0":"True if the operation was successful."}},"allowance(address,address)":{"params":{"owner":"Token owner's address.","spender":"Spender's address."},"returns":{"_0":"The allowance amount."}},"transferOwnership(address)":{"params":{"newOwner":"The address to transfer ownership to."}},"updateBlacklister(address)":{"params":{"_newBlacklister":"The address of the new blacklister."},"details":"Emits a {BlacklisterChanged} event.Can only be called by the permission admin.The new blacklister address cannot be the zero address."},"getMinterAllowance(address)":{"params":{"minter":"The address of the minter."},"returns":{"_0":"The minting allowance of the minter."}},"setPermissionAdmin(address)":{"params":{"_newAdmin":"The address of the new permission admin."},"details":"Only the contract owner can call this function. The new admin address cannot be the zero address."},"updateMasterMinter(address)":{"params":{"_newMasterMinter":"The address of the new master minter."}},"wipeBlacklistedAddress(address)":{"params":{"_account":"The address to wipe."},"details":"Only the owner can call this function, and the address must be blacklisted."},"configureMinter(address,uint256)":{"params":{"minter":"The address of the minter.","_minterAllowedAmount":"The minting allowance for the minter."},"returns":{"_0":"True if the operation was successful."}},"decreaseAllowance(address,uint256)":{"params":{"spender":"Spender's address.","decrement":"The amount to decrease the allowance by."},"returns":{"_0":"True if the operation was successful."}},"increaseAllowance(address,uint256)":{"params":{"spender":"Spender's address.","increment":"The amount to increase the allowance by."},"returns":{"_0":"True if the operation was successful."}},"rescueERC20(address,address,uint256)":{"params":{"to":"The recipient address to receive the rescued tokens.","amount":"The amount of tokens to withdraw.","tokenContract":"The address of the ERC20 token contract."},"details":"Can only be called by the current rescuer."},"transferFrom(address,address,uint256)":{"params":{"to":"Payee's address.","from":"Payer's address.","value":"Transfer amount."},"returns":{"_0":"True if the operation was successful."}},"initializeToken(string,string,string,uint8,address,address,address,address)":{"params":{"newPauser":"The address of the new pauser.","tokenName":"The name of the token.","newRescuer":"The address of the new rescuer.","tokenSymbol":"The symbol of the token.","tokenCurrency":"The currency of the token.","tokenDecimals":"The number of decimals the token uses.","newBlacklister":"The address of the new blacklister.","newMasterMinter":"The address of the new master minter."}}},"version":1,"stateVariables":{"isMinter":{"params":{"_account":"The address to check."},"return":"A boolean indicating whether the address is a minter.","returns":{"_0":"A boolean indicating whether the address is a minter."}}}},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_uint8":{"label":"uint8","encoding":"inplace","numberOfBytes":"1"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_string_storage":{"label":"string","encoding":"bytes","numberOfBytes":"32"},"t_mapping(t_address,t_bool)":{"key":"t_address","label":"mapping(address => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_array(t_uint256)49_storage":{"base":"t_uint256","label":"uint256[49]","encoding":"inplace","numberOfBytes":"1568"},"t_mapping(t_address,t_uint256)":{"key":"t_address","label":"mapping(address => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_mapping(t_address,t_uint256))":{"key":"t_address","label":"mapping(address => mapping(address => uint256))","value":"t_mapping(t_address,t_uint256)","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_array(t_uint256)49_storage","astId":1387,"label":"__gap","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"49","type":"t_uint8","astId":6,"label":"_initialized","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"49","type":"t_bool","astId":9,"label":"_initializing","offset":1,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"49","type":"t_address","astId":1608,"label":"_owner","offset":2,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"50","type":"t_address","astId":1610,"label":"_pendingOwner","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"51","type":"t_array(t_uint256)49_storage","astId":1760,"label":"__gap","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"100","type":"t_address","astId":1921,"label":"_permissionAdmin","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"101","type":"t_array(t_uint256)49_storage","astId":1986,"label":"__gap","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"150","type":"t_address","astId":1770,"label":"_pauser","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"150","type":"t_bool","astId":1772,"label":"paused","offset":20,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"151","type":"t_array(t_uint256)49_storage","astId":1911,"label":"__gap","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"200","type":"t_address","astId":1397,"label":"_blacklister","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"201","type":"t_mapping(t_address,t_bool)","astId":1401,"label":"blacklisted","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"202","type":"t_array(t_uint256)49_storage","astId":1598,"label":"__gap","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"251","type":"t_address","astId":2004,"label":"_rescuer","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"252","type":"t_array(t_uint256)49_storage","astId":2089,"label":"__gap","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"301","type":"t_string_storage","astId":2119,"label":"_name","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"302","type":"t_string_storage","astId":2121,"label":"_symbol","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"303","type":"t_uint8","astId":2123,"label":"_decimals","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"304","type":"t_string_storage","astId":2125,"label":"currency","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"305","type":"t_address","astId":2127,"label":"masterMinter","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"306","type":"t_uint256","astId":2129,"label":"_totalSupply","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"307","type":"t_mapping(t_address,t_uint256)","astId":2133,"label":"balances","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"308","type":"t_mapping(t_address,t_mapping(t_address,t_uint256))","astId":2139,"label":"allowed","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"309","type":"t_mapping(t_address,t_bool)","astId":2143,"label":"isMinter","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"310","type":"t_mapping(t_address,t_uint256)","astId":2147,"label":"minterAllowance","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"},{"slot":"311","type":"t_array(t_uint256)49_storage","astId":3090,"label":"__gap","offset":0,"contract":"contracts/src/TokenContracts/TokenV1.sol:TokenV1"}]},"transientStorageLayout":null,"evm":{"bytecode":{"object":"608060405234801561001057600080fd5b50613410806100206000396000f3fe608060405234801561001057600080fd5b50600436106102ff5760003560e01c806379ba50971161019c578063ad38bf22116100ee578063dd62ed3e11610097578063f6ee1d8811610071578063f6ee1d88146106a9578063f9f92be4146106bc578063fe575a87146106cf57600080fd5b8063dd62ed3e14610654578063e5a6b10f1461068e578063f2fde38b1461069657600080fd5b8063c4d66de8116100c8578063c4d66de81461060d578063d3b3f8d414610620578063dbac26e91461063157600080fd5b8063ad38bf22146105d4578063b2118a8d146105e7578063bdd6265a146105fa57600080fd5b806395d89b4111610150578063a9059cbb1161012a578063a9059cbb1461058a578063aa20e1e41461059d578063aa271e1a146105b057600080fd5b806395d89b411461055c5780639f50d7d114610564578063a457c2d71461057757600080fd5b8063893d20e811610181578063893d20e8146105135780638a6db9c31461052a57806393596c7b1461054b57600080fd5b806379ba5097146105035780638456cb591461050b57600080fd5b806339509351116102555780634e44d956116102095780636ae8d6c8116101e35780636ae8d6c81461049e5780637008b548146104c857806370a08231146104d957600080fd5b80634e44d95614610453578063554bab3c146104665780635c975abb1461047957600080fd5b80633f4ba83a1161023a5780633f4ba83a1461042557806340c10f191461042d57806342966c681461044057600080fd5b806339509351146104015780633f02ebc41461041457600080fd5b806323b872dd116102b7578063313ce56711610291578063313ce567146103ae57806335d99f35146103c457806338a63183146103f057600080fd5b806323b872dd146103755780632ab60045146103885780633092afd51461039b57600080fd5b80630d96bcdb116102e85780630d96bcdb1461034557806318160ddd1461034f5780631a8952661461036257600080fd5b806306fdde0314610304578063095ea7b314610322575b600080fd5b61030c6106fb565b604051610319919061304e565b60405180910390f35b6103356103303660046130bf565b61078e565b6040519015158152602001610319565b61034d6108e1565b005b610132545b604051908152602001610319565b61034d6103703660046130eb565b6109a2565b61033561038336600461310f565b610a8c565b61034d6103963660046130eb565b610ce3565b6103356103a93660046130eb565b610dc9565b61012f5460405160ff9091168152602001610319565b610131546103d8906001600160a01b031681565b6040516001600160a01b039091168152602001610319565b60fb546001600160a01b03166103d8565b61033561040f3660046130bf565b610e6f565b6064546001600160a01b03166103d8565b61034d610ff0565b61033561043b3660046130bf565b6110db565b61034d61044e366004613150565b61146c565b6103356104613660046130bf565b6116ad565b61034d6104743660046130eb565b6117b6565b6096546103359074010000000000000000000000000000000000000000900460ff1681565b6103546104ac3660046130eb565b6001600160a01b03166000908152610136602052604090205490565b6096546001600160a01b03166103d8565b6103546104e73660046130eb565b6001600160a01b03166000908152610133602052604090205490565b61034d61189c565b61034d61198f565b6031546201000090046001600160a01b03166103d8565b6103546105383660046130eb565b6101366020526000908152604090205481565b6032546001600160a01b03166103d8565b61030c611a92565b61034d6105723660046130eb565b611aa2565b6103356105853660046130bf565b611b8e565b6103356105983660046130bf565b611d62565b61034d6105ab3660046130eb565b611ea5565b6103356105be3660046130eb565b6101356020526000908152604090205460ff1681565b61034d6105e23660046130eb565b611f92565b61034d6105f536600461310f565b61205f565b61034d6106083660046131c3565b6120bc565b61034d61061b3660046130eb565b6124db565b60c8546001600160a01b03166103d8565b61033561063f3660046130eb565b60c96020526000908152604090205460ff1681565b6103546106623660046132b1565b6001600160a01b0391821660009081526101346020908152604080832093909416825291909152205490565b61030c6125b0565b61034d6106a43660046130eb565b61263f565b61034d6106b73660046130eb565b61273a565b61034d6106ca3660046130eb565b612894565b6103356106dd3660046130eb565b6001600160a01b0316600090815260c9602052604090205460ff1690565b606061012d805461070b906132ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610737906132ea565b80156107845780601f1061075957610100808354040283529160200191610784565b820191906000526020600020905b81548152906001019060200180831161076757829003601f168201915b5050505050905090565b60965460009074010000000000000000000000000000000000000000900460ff16156107e6576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b03166108115760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561085b57604051630165e89360e11b81526001600160a01b03821660048201526024015b60405180910390fd5b60c85484906001600160a01b03166108865760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff16156108cb57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6108d63386866129d8565b506001949350505050565b603154610100900460ff16610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610852565b609680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055565b60c8546001600160a01b031633146109e6576040517f8062a71100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff16610a43576040517f403a94570000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610852565b6001600160a01b038116600081815260c96020526040808220805460ff19169055517f117e3210bb9aa7d9baff172026820255c6f6c30ba8999d1c2fd88e2848137c4e9190a250565b60965460009074010000000000000000000000000000000000000000900460ff1615610ae4576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316610b0f5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610b5457604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85485906001600160a01b0316610b7f5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610bc457604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85485906001600160a01b0316610bef5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610c3457604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6001600160a01b038716600090815261013460209081526040808320338452909152902054851115610c92576040517fc45cb51300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c9d878787612ab2565b6001600160a01b03871660009081526101346020908152604080832033845290915281208054879290610cd190849061336d565b90915550600198975050505050505050565b6064546001600160a01b03163314610d27576040517fd265da0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116610d67576040517f3e17108f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60fb80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a250565b610131546000906001600160a01b03163314610e11576040517fd5295ad100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216600081815261013560209081526040808320805460ff19169055610136909152808220829055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a25060015b919050565b60965460009074010000000000000000000000000000000000000000900460ff1615610ec7576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316610ef25760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610f3757604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b0316610f625760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610fa757604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b336000818152610134602090815260408083206001600160a01b038a168452909152902054610fe49082908890610fdf908990613384565b6129d8565b50600195945050505050565b6096546001600160a01b03163314611034576040517fe9b37cc700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60965474010000000000000000000000000000000000000000900460ff16611088576040517ff2bafdf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b60965460009074010000000000000000000000000000000000000000900460ff1615611133576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152610135602052604090205460ff1661117d576040517ff8d2906c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b03166111a85760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff16156111ed57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b03166112185760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561125d57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6001600160a01b03851661129d576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084116112d7576040517faf37b7a700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03861614611319576040517f35a84f2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0385166000908152610136602052604090205484111561136c576040517fc45cb51300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83610132600082825461137f9190613384565b90915550506001600160a01b03851660009081526101336020526040812080548692906113ad908490613384565b90915550506001600160a01b03851660009081526101366020526040812080548692906113db90849061336d565b90915550506040518481526001600160a01b0386169033907fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f89060200160405180910390a36040518481526001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3506001949350505050565b60965474010000000000000000000000000000000000000000900460ff16156114c1576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152610135602052604090205460ff1661150b576040517ff8d2906c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b03166115365760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561157b57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b3360009081526101336020526040902054826115c3576040517fdae7e6ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828110156115fd576040517f96ab19c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826101326000828254611610919061336d565b909155505033600090815261013360205260408120805485929061163590849061336d565b909155505060405183815233907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59060200160405180910390a260405183815260009033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050565b60965460009074010000000000000000000000000000000000000000900460ff1615611705576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610131546001600160a01b0316331461174a576040517fd5295ad100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316600081815261013560209081526040808320805460ff1916600117905561013682529182902085905590518481527f46980fca912ef9bcdbd36877427b6b90e860769f604e89c0e67720cece530d20910160405180910390a250600192915050565b6064546001600160a01b031633146117fa576040517fd265da0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811661183a576040517fcede3fa000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fb80482a293ca2e013eda8683c9bd7fc8347cfdaeea5ede58cba46df502c2a60490600090a250565b6032546001600160a01b031633146118e0576040517f2f89af8300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60318054603254620100006001600160a01b0391821681027fffffffffffffffffffff0000000000000000000000000000000000000000ffff84161790935591900416603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556031546040516001600160a01b03620100009092048216918316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6096546001600160a01b031633146119d3576040517fe9b37cc700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60965474010000000000000000000000000000000000000000900460ff1615611a28576040517f51a5370e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b606061012e805461070b906132ea565b6031546201000090046001600160a01b03163314611aec576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611b2c576040517f1517f65300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517f5a2812dc793378f68745c08c12995c38c2c2487fe9d0fa1badc4fe834f591b2490600090a250565b60965460009074010000000000000000000000000000000000000000900460ff1615611be6576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316611c115760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611c5657604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b0316611c815760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611cc657604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b336000818152610134602090815260408083206001600160a01b038a16845290915290205485811015611d46576040517f35e0a1250000000000000000000000000000000000000000000000000000000081526001600160a01b038084166004830152881660248201526044810182905260648101879052608401610852565b611d558288610fdf898561336d565b5060019695505050505050565b60965460009074010000000000000000000000000000000000000000900460ff1615611dba576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316611de55760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611e2a57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b0316611e555760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611e9a57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6108d6338686612ab2565b6031546201000090046001600160a01b03163314611eef576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611f2f576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61013180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fdb66dfa9c6b8f5226fe9aac7e51897ae8ee94ac31dc70bb6c9900b2574b707e690600090a250565b6064546001600160a01b03163314611fd6576040517fd265da0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611ffd5760405163b7d260ed60e01b815260040160405180910390fd5b60c880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fc67398012c111ce95ecb7429b933096c977380ee6c421175a71a4a4c6c88c06e90600090a250565b60fb546001600160a01b031633146120a3576040517f933efdd000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120b76001600160a01b0384168383612c28565b505050565b603154610100900460ff16158080156120dc5750603154600160ff909116105b806120f65750303b1580156120f6575060315460ff166001145b612182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610852565b6031805460ff1916600117905580156121c257603180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6121cb336124db565b6121d36108e1565b6001600160a01b038516612213576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416612253576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316612293576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166122d3576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122e061012d8d8d612f85565b506122ee61012e8b8b612f85565b506122fc6101308989612f85565b5061012f805460ff191660ff881617905561013180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b0388811691821790935560968054831688851617905560c88054831687851617905560fb80549092169285169290921790556040517fb309eb87a246e87330262e01f9d27364d7f2206fb1d5e421998090fcde32d34390600090a26040516001600160a01b038516907f4f68150eb56c53cc9373649e35bc37dd235a0c86e10aa23b8a835378136ac6a090600090a26040516001600160a01b038416907f5b7763c24622d383825c557446231d7c64358877092e307e719a8e7d22d7e30b90600090a260405160ff871681527f6d3352c892c287855203cb74eff23be26064d1777da8ad03c1ddb3450fba67659060200160405180910390a16040516001600160a01b038316907fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a280156124cd57603180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050505050565b603154610100900460ff16612572576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610852565b603180547fffffffffffffffffffff0000000000000000000000000000000000000000ffff16620100006001600160a01b0384160217905550565b50565b61013080546125be906132ea565b80601f01602080910402602001604051908101604052809291908181526020018280546125ea906132ea565b80156126375780601f1061260c57610100808354040283529160200191612637565b820191906000526020600020905b81548152906001019060200180831161261a57829003601f168201915b505050505081565b6031546201000090046001600160a01b03163314612689576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166126c9576040517f8df7153f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560315460405191926201000090910416907f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270090600090a350565b6031546201000090046001600160a01b03163314612784576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff166127d6576040517fa57ed36800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166000908152610133602052604090205480612827576040517f669567ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610132600082825461283a919061336d565b90915550506001600160a01b038216600081815261013360209081526040808320839055518481529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60c8546001600160a01b031633146128d8576040517f8062a71100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561291d57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c8546001600160a01b0382811691161415612965576040517f6982a42c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811661298c5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600081815260c96020526040808220805460ff19166001179055517fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b8559190a250565b6001600160a01b038316612a18576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216612a58576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038381166000818152610134602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591016116a0565b6001600160a01b038316612af2576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216612b32576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03831660009081526101336020526040902054811115612b85576040517f96ab19c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152610133602052604081208054839290612bae90849061336d565b90915550506001600160a01b0382166000908152610133602052604081208054839290612bdc908490613384565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116a091815260200190565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526120b792869291600091612ce6918516908490612d93565b9050805160001480612d07575080806020019051810190612d07919061339c565b6120b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610852565b6060612da28484600085612daa565b949350505050565b606082471015612e3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610852565b600080866001600160a01b03168587604051612e5891906133be565b60006040518083038185875af1925050503d8060008114612e95576040519150601f19603f3d011682016040523d82523d6000602084013e612e9a565b606091505b5091509150612eab87838387612eb6565b979650505050505050565b60608315612f3c578251612f35576001600160a01b0385163b612f35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610852565b5081612da2565b612da28383815115612f515781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610852919061304e565b828054612f91906132ea565b90600052602060002090601f016020900481019282612fb35760008555612ff9565b82601f10612fcc5782800160ff19823516178555612ff9565b82800160010185558215612ff9579182015b82811115612ff9578235825591602001919060010190612fde565b50613005929150613009565b5090565b5b80821115613005576000815560010161300a565b60005b83811015613039578181015183820152602001613021565b83811115613048576000848401525b50505050565b602081526000825180602084015261306d81604085016020870161301e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6001600160a01b03811681146125ad57600080fd5b8035610e6a8161309f565b600080604083850312156130d257600080fd5b82356130dd8161309f565b946020939093013593505050565b6000602082840312156130fd57600080fd5b81356131088161309f565b9392505050565b60008060006060848603121561312457600080fd5b833561312f8161309f565b9250602084013561313f8161309f565b929592945050506040919091013590565b60006020828403121561316257600080fd5b5035919050565b60008083601f84011261317b57600080fd5b50813567ffffffffffffffff81111561319357600080fd5b6020830191508360208285010111156131ab57600080fd5b9250929050565b803560ff81168114610e6a57600080fd5b60008060008060008060008060008060006101008c8e0312156131e557600080fd5b67ffffffffffffffff808d3511156131fc57600080fd5b6132098e8e358f01613169565b909c509a5060208d013581101561321f57600080fd5b61322f8e60208f01358f01613169565b909a50985060408d013581101561324557600080fd5b506132568d60408e01358e01613169565b909750955061326760608d016131b2565b945061327560808d016130b4565b935061328360a08d016130b4565b925061329160c08d016130b4565b915061329f60e08d016130b4565b90509295989b509295989b9093969950565b600080604083850312156132c457600080fd5b82356132cf8161309f565b915060208301356132df8161309f565b809150509250929050565b600181811c908216806132fe57607f821691505b60208210811415613338577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561337f5761337f61333e565b500390565b600082198211156133975761339761333e565b500190565b6000602082840312156133ae57600080fd5b8151801515811461310857600080fd5b600082516133d081846020870161301e565b919091019291505056fea264697066735822122036ecfbca8451d816ca219c19221f8a63dbbf4f98ad8d6f9106ba8881660fd56f64736f6c634300080b0033","sourceMap":"623:15436:13:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"608060405234801561001057600080fd5b50600436106102ff5760003560e01c806379ba50971161019c578063ad38bf22116100ee578063dd62ed3e11610097578063f6ee1d8811610071578063f6ee1d88146106a9578063f9f92be4146106bc578063fe575a87146106cf57600080fd5b8063dd62ed3e14610654578063e5a6b10f1461068e578063f2fde38b1461069657600080fd5b8063c4d66de8116100c8578063c4d66de81461060d578063d3b3f8d414610620578063dbac26e91461063157600080fd5b8063ad38bf22146105d4578063b2118a8d146105e7578063bdd6265a146105fa57600080fd5b806395d89b4111610150578063a9059cbb1161012a578063a9059cbb1461058a578063aa20e1e41461059d578063aa271e1a146105b057600080fd5b806395d89b411461055c5780639f50d7d114610564578063a457c2d71461057757600080fd5b8063893d20e811610181578063893d20e8146105135780638a6db9c31461052a57806393596c7b1461054b57600080fd5b806379ba5097146105035780638456cb591461050b57600080fd5b806339509351116102555780634e44d956116102095780636ae8d6c8116101e35780636ae8d6c81461049e5780637008b548146104c857806370a08231146104d957600080fd5b80634e44d95614610453578063554bab3c146104665780635c975abb1461047957600080fd5b80633f4ba83a1161023a5780633f4ba83a1461042557806340c10f191461042d57806342966c681461044057600080fd5b806339509351146104015780633f02ebc41461041457600080fd5b806323b872dd116102b7578063313ce56711610291578063313ce567146103ae57806335d99f35146103c457806338a63183146103f057600080fd5b806323b872dd146103755780632ab60045146103885780633092afd51461039b57600080fd5b80630d96bcdb116102e85780630d96bcdb1461034557806318160ddd1461034f5780631a8952661461036257600080fd5b806306fdde0314610304578063095ea7b314610322575b600080fd5b61030c6106fb565b604051610319919061304e565b60405180910390f35b6103356103303660046130bf565b61078e565b6040519015158152602001610319565b61034d6108e1565b005b610132545b604051908152602001610319565b61034d6103703660046130eb565b6109a2565b61033561038336600461310f565b610a8c565b61034d6103963660046130eb565b610ce3565b6103356103a93660046130eb565b610dc9565b61012f5460405160ff9091168152602001610319565b610131546103d8906001600160a01b031681565b6040516001600160a01b039091168152602001610319565b60fb546001600160a01b03166103d8565b61033561040f3660046130bf565b610e6f565b6064546001600160a01b03166103d8565b61034d610ff0565b61033561043b3660046130bf565b6110db565b61034d61044e366004613150565b61146c565b6103356104613660046130bf565b6116ad565b61034d6104743660046130eb565b6117b6565b6096546103359074010000000000000000000000000000000000000000900460ff1681565b6103546104ac3660046130eb565b6001600160a01b03166000908152610136602052604090205490565b6096546001600160a01b03166103d8565b6103546104e73660046130eb565b6001600160a01b03166000908152610133602052604090205490565b61034d61189c565b61034d61198f565b6031546201000090046001600160a01b03166103d8565b6103546105383660046130eb565b6101366020526000908152604090205481565b6032546001600160a01b03166103d8565b61030c611a92565b61034d6105723660046130eb565b611aa2565b6103356105853660046130bf565b611b8e565b6103356105983660046130bf565b611d62565b61034d6105ab3660046130eb565b611ea5565b6103356105be3660046130eb565b6101356020526000908152604090205460ff1681565b61034d6105e23660046130eb565b611f92565b61034d6105f536600461310f565b61205f565b61034d6106083660046131c3565b6120bc565b61034d61061b3660046130eb565b6124db565b60c8546001600160a01b03166103d8565b61033561063f3660046130eb565b60c96020526000908152604090205460ff1681565b6103546106623660046132b1565b6001600160a01b0391821660009081526101346020908152604080832093909416825291909152205490565b61030c6125b0565b61034d6106a43660046130eb565b61263f565b61034d6106b73660046130eb565b61273a565b61034d6106ca3660046130eb565b612894565b6103356106dd3660046130eb565b6001600160a01b0316600090815260c9602052604090205460ff1690565b606061012d805461070b906132ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610737906132ea565b80156107845780601f1061075957610100808354040283529160200191610784565b820191906000526020600020905b81548152906001019060200180831161076757829003601f168201915b5050505050905090565b60965460009074010000000000000000000000000000000000000000900460ff16156107e6576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b03166108115760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561085b57604051630165e89360e11b81526001600160a01b03821660048201526024015b60405180910390fd5b60c85484906001600160a01b03166108865760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff16156108cb57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6108d63386866129d8565b506001949350505050565b603154610100900460ff16610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610852565b609680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055565b60c8546001600160a01b031633146109e6576040517f8062a71100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff16610a43576040517f403a94570000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610852565b6001600160a01b038116600081815260c96020526040808220805460ff19169055517f117e3210bb9aa7d9baff172026820255c6f6c30ba8999d1c2fd88e2848137c4e9190a250565b60965460009074010000000000000000000000000000000000000000900460ff1615610ae4576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316610b0f5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610b5457604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85485906001600160a01b0316610b7f5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610bc457604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85485906001600160a01b0316610bef5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610c3457604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6001600160a01b038716600090815261013460209081526040808320338452909152902054851115610c92576040517fc45cb51300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c9d878787612ab2565b6001600160a01b03871660009081526101346020908152604080832033845290915281208054879290610cd190849061336d565b90915550600198975050505050505050565b6064546001600160a01b03163314610d27576040517fd265da0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116610d67576040517f3e17108f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60fb80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a250565b610131546000906001600160a01b03163314610e11576040517fd5295ad100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216600081815261013560209081526040808320805460ff19169055610136909152808220829055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a25060015b919050565b60965460009074010000000000000000000000000000000000000000900460ff1615610ec7576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316610ef25760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610f3757604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b0316610f625760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615610fa757604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b336000818152610134602090815260408083206001600160a01b038a168452909152902054610fe49082908890610fdf908990613384565b6129d8565b50600195945050505050565b6096546001600160a01b03163314611034576040517fe9b37cc700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60965474010000000000000000000000000000000000000000900460ff16611088576040517ff2bafdf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b60965460009074010000000000000000000000000000000000000000900460ff1615611133576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152610135602052604090205460ff1661117d576040517ff8d2906c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b03166111a85760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff16156111ed57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b03166112185760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561125d57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6001600160a01b03851661129d576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084116112d7576040517faf37b7a700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03861614611319576040517f35a84f2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0385166000908152610136602052604090205484111561136c576040517fc45cb51300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83610132600082825461137f9190613384565b90915550506001600160a01b03851660009081526101336020526040812080548692906113ad908490613384565b90915550506001600160a01b03851660009081526101366020526040812080548692906113db90849061336d565b90915550506040518481526001600160a01b0386169033907fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f89060200160405180910390a36040518481526001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3506001949350505050565b60965474010000000000000000000000000000000000000000900460ff16156114c1576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152610135602052604090205460ff1661150b576040517ff8d2906c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b03166115365760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561157b57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b3360009081526101336020526040902054826115c3576040517fdae7e6ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828110156115fd576040517f96ab19c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826101326000828254611610919061336d565b909155505033600090815261013360205260408120805485929061163590849061336d565b909155505060405183815233907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59060200160405180910390a260405183815260009033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050565b60965460009074010000000000000000000000000000000000000000900460ff1615611705576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610131546001600160a01b0316331461174a576040517fd5295ad100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316600081815261013560209081526040808320805460ff1916600117905561013682529182902085905590518481527f46980fca912ef9bcdbd36877427b6b90e860769f604e89c0e67720cece530d20910160405180910390a250600192915050565b6064546001600160a01b031633146117fa576040517fd265da0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811661183a576040517fcede3fa000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fb80482a293ca2e013eda8683c9bd7fc8347cfdaeea5ede58cba46df502c2a60490600090a250565b6032546001600160a01b031633146118e0576040517f2f89af8300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60318054603254620100006001600160a01b0391821681027fffffffffffffffffffff0000000000000000000000000000000000000000ffff84161790935591900416603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556031546040516001600160a01b03620100009092048216918316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6096546001600160a01b031633146119d3576040517fe9b37cc700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60965474010000000000000000000000000000000000000000900460ff1615611a28576040517f51a5370e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b606061012e805461070b906132ea565b6031546201000090046001600160a01b03163314611aec576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611b2c576040517f1517f65300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517f5a2812dc793378f68745c08c12995c38c2c2487fe9d0fa1badc4fe834f591b2490600090a250565b60965460009074010000000000000000000000000000000000000000900460ff1615611be6576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316611c115760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611c5657604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b0316611c815760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611cc657604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b336000818152610134602090815260408083206001600160a01b038a16845290915290205485811015611d46576040517f35e0a1250000000000000000000000000000000000000000000000000000000081526001600160a01b038084166004830152881660248201526044810182905260648101879052608401610852565b611d558288610fdf898561336d565b5060019695505050505050565b60965460009074010000000000000000000000000000000000000000900460ff1615611dba576040517f059519da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c85433906001600160a01b0316611de55760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611e2a57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c85484906001600160a01b0316611e555760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff1615611e9a57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b6108d6338686612ab2565b6031546201000090046001600160a01b03163314611eef576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611f2f576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61013180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fdb66dfa9c6b8f5226fe9aac7e51897ae8ee94ac31dc70bb6c9900b2574b707e690600090a250565b6064546001600160a01b03163314611fd6576040517fd265da0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116611ffd5760405163b7d260ed60e01b815260040160405180910390fd5b60c880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fc67398012c111ce95ecb7429b933096c977380ee6c421175a71a4a4c6c88c06e90600090a250565b60fb546001600160a01b031633146120a3576040517f933efdd000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120b76001600160a01b0384168383612c28565b505050565b603154610100900460ff16158080156120dc5750603154600160ff909116105b806120f65750303b1580156120f6575060315460ff166001145b612182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610852565b6031805460ff1916600117905580156121c257603180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6121cb336124db565b6121d36108e1565b6001600160a01b038516612213576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416612253576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316612293576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166122d3576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122e061012d8d8d612f85565b506122ee61012e8b8b612f85565b506122fc6101308989612f85565b5061012f805460ff191660ff881617905561013180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b0388811691821790935560968054831688851617905560c88054831687851617905560fb80549092169285169290921790556040517fb309eb87a246e87330262e01f9d27364d7f2206fb1d5e421998090fcde32d34390600090a26040516001600160a01b038516907f4f68150eb56c53cc9373649e35bc37dd235a0c86e10aa23b8a835378136ac6a090600090a26040516001600160a01b038416907f5b7763c24622d383825c557446231d7c64358877092e307e719a8e7d22d7e30b90600090a260405160ff871681527f6d3352c892c287855203cb74eff23be26064d1777da8ad03c1ddb3450fba67659060200160405180910390a16040516001600160a01b038316907fe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a90600090a280156124cd57603180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050505050565b603154610100900460ff16612572576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610852565b603180547fffffffffffffffffffff0000000000000000000000000000000000000000ffff16620100006001600160a01b0384160217905550565b50565b61013080546125be906132ea565b80601f01602080910402602001604051908101604052809291908181526020018280546125ea906132ea565b80156126375780601f1061260c57610100808354040283529160200191612637565b820191906000526020600020905b81548152906001019060200180831161261a57829003601f168201915b505050505081565b6031546201000090046001600160a01b03163314612689576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166126c9576040517f8df7153f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560315460405191926201000090910416907f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270090600090a350565b6031546201000090046001600160a01b03163314612784576040517f6250be2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff166127d6576040517fa57ed36800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166000908152610133602052604090205480612827576040517f669567ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610132600082825461283a919061336d565b90915550506001600160a01b038216600081815261013360209081526040808320839055518481529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60c8546001600160a01b031633146128d8576040517f8062a71100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260c9602052604090205460ff161561291d57604051630165e89360e11b81526001600160a01b0382166004820152602401610852565b60c8546001600160a01b0382811691161415612965576040517f6982a42c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03811661298c5760405163b7d260ed60e01b815260040160405180910390fd5b6001600160a01b038116600081815260c96020526040808220805460ff19166001179055517fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b8559190a250565b6001600160a01b038316612a18576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216612a58576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038381166000818152610134602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591016116a0565b6001600160a01b038316612af2576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216612b32576040517fddbadd5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03831660009081526101336020526040902054811115612b85576040517f96ab19c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152610133602052604081208054839290612bae90849061336d565b90915550506001600160a01b0382166000908152610133602052604081208054839290612bdc908490613384565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116a091815260200190565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526120b792869291600091612ce6918516908490612d93565b9050805160001480612d07575080806020019051810190612d07919061339c565b6120b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610852565b6060612da28484600085612daa565b949350505050565b606082471015612e3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610852565b600080866001600160a01b03168587604051612e5891906133be565b60006040518083038185875af1925050503d8060008114612e95576040519150601f19603f3d011682016040523d82523d6000602084013e612e9a565b606091505b5091509150612eab87838387612eb6565b979650505050505050565b60608315612f3c578251612f35576001600160a01b0385163b612f35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610852565b5081612da2565b612da28383815115612f515781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610852919061304e565b828054612f91906132ea565b90600052602060002090601f016020900481019282612fb35760008555612ff9565b82601f10612fcc5782800160ff19823516178555612ff9565b82800160010185558215612ff9579182015b82811115612ff9578235825591602001919060010190612fde565b50613005929150613009565b5090565b5b80821115613005576000815560010161300a565b60005b83811015613039578181015183820152602001613021565b83811115613048576000848401525b50505050565b602081526000825180602084015261306d81604085016020870161301e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6001600160a01b03811681146125ad57600080fd5b8035610e6a8161309f565b600080604083850312156130d257600080fd5b82356130dd8161309f565b946020939093013593505050565b6000602082840312156130fd57600080fd5b81356131088161309f565b9392505050565b60008060006060848603121561312457600080fd5b833561312f8161309f565b9250602084013561313f8161309f565b929592945050506040919091013590565b60006020828403121561316257600080fd5b5035919050565b60008083601f84011261317b57600080fd5b50813567ffffffffffffffff81111561319357600080fd5b6020830191508360208285010111156131ab57600080fd5b9250929050565b803560ff81168114610e6a57600080fd5b60008060008060008060008060008060006101008c8e0312156131e557600080fd5b67ffffffffffffffff808d3511156131fc57600080fd5b6132098e8e358f01613169565b909c509a5060208d013581101561321f57600080fd5b61322f8e60208f01358f01613169565b909a50985060408d013581101561324557600080fd5b506132568d60408e01358e01613169565b909750955061326760608d016131b2565b945061327560808d016130b4565b935061328360a08d016130b4565b925061329160c08d016130b4565b915061329f60e08d016130b4565b90509295989b509295989b9093969950565b600080604083850312156132c457600080fd5b82356132cf8161309f565b915060208301356132df8161309f565b809150509250929050565b600181811c908216806132fe57607f821691505b60208210811415613338577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561337f5761337f61333e565b500390565b600082198211156133975761339761333e565b500190565b6000602082840312156133ae57600080fd5b8151801515811461310857600080fd5b600082516133d081846020870161301e565b919091019291505056fea264697066735822122036ecfbca8451d816ca219c19221f8a63dbbf4f98ad8d6f9106ba8881660fd56f64736f6c634300080b0033","sourceMap":"623:15436:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6700:89;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8681:295;;;;;;:::i;:::-;;:::i;:::-;;;1507:14:14;;1500:22;1482:41;;1470:2;1455:18;8681:295:13;1342:187:14;2418:85:10;;;:::i;:::-;;8046:100:13;8127:12;;8046:100;;;1680:25:14;;;1668:2;1653:18;8046:100:13;1534:177:14;4033:233:8;;;;;;:::i;:::-;;:::i;9723:438:13:-;;;;;;:::i;:::-;;:::i;2193:224:12:-;;;;;;:::i;:::-;;:::i;11999:223:13:-;;;;;;:::i;:::-;;:::i;7154:89::-;7227:9;;7154:89;;7227:9;;;;2571:36:14;;2559:2;2544:18;7154:89:13;2429:184:14;848:27:13;;;;;-1:-1:-1;;;;;848:27:13;;;;;;-1:-1:-1;;;;;2782:55:14;;;2764:74;;2752:2;2737:18;848:27:13;2618:226:14;1090:83:12;1158:8;;-1:-1:-1;;;;;1158:8:12;1090:83;;14328:310:13;;;;;;:::i;:::-;;:::i;1301:102:11:-;1380:16;;-1:-1:-1;;;;;1380:16:11;1301:102;;2706:152:10;;;:::i;13072:636:13:-;;;;;;:::i;:::-;;:::i;12364:445::-;;;;;;:::i;:::-;;:::i;11497:336::-;;;;;;:::i;:::-;;:::i;3155:217:10:-;;;;;;:::i;:::-;;:::i;381:18::-;;;;;;;;;;;;7423:132:13;;;;;;:::i;:::-;-1:-1:-1;;;;;7525:23:13;7499:7;7525:23;;;:15;:23;;;;;;;7423:132;1830:84:10;1900:7;;-1:-1:-1;;;;;1900:7:10;1830:84;;8323:118:13;;;;;;:::i;:::-;-1:-1:-1;;;;;8417:17:13;8391:7;8417:17;;;:8;:17;;;;;;;8323:118;3320:217:9;;;:::i;2115:144:10:-;;;:::i;2219:82:9:-;2288:6;;;;;-1:-1:-1;;;;;2288:6:9;2219:82;;1085:50:13;;;;;;:::i;:::-;;;;;;;;;;;;;;2429:96:9;2505:13;;-1:-1:-1;;;;;2505:13:9;2429:96;;6899:93:13;;;:::i;1644:244:11:-;;;;;;:::i;:::-;;:::i;14880:506:13:-;;;;;;:::i;:::-;;:::i;10375:282::-;;;;;;:::i;:::-;;:::i;13849:237::-;;;;;;:::i;:::-;;:::i;1039:40::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;4588:257:8;;;;;;:::i;:::-;;:::i;1714:177:12:-;;;;;;:::i;:::-;;:::i;5459:1135:13:-;;;;;;:::i;:::-;;:::i;2008:91:9:-;;;;;;:::i;:::-;;:::i;2695:94:8:-;2770:12;;-1:-1:-1;;;;;2770:12:8;2695:94;;396:43;;;;;;:::i;:::-;;;;;;;;;;;;;;;;7798:139:13;;;;;;:::i;:::-;-1:-1:-1;;;;;7907:14:13;;;7881:7;7907:14;;;:7;:14;;;;;;;;:23;;;;;;;;;;;;;7798:139;820:22;;;:::i;2958:231:9:-;;;;;;:::i;:::-;;:::i;15627:359:13:-;;;;;;:::i;:::-;;:::i;3396:393:8:-;;;;;;:::i;:::-;;:::i;2976:115::-;;;;;;:::i;:::-;-1:-1:-1;;;;;3063:21:8;3040:4;3063:21;;;:11;:21;;;;;;;;;2976:115;6700:89:13;6745:13;6777:5;6770:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6700:89;:::o;8681:295::-;1462:6:10;;8892:4:13;;1462:6:10;;;;;1458:37;;;1477:18;;;;;;;;;;;;;;1458:37;2400:12:8::1;::::0;8831:10:13::1;::::0;-1:-1:-1;;;;;2400:12:8::1;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::1;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::1;;::::0;;;:11:::1;:21;::::0;;;;;::::1;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::1;::::0;::::1;2764:74:14::0;2737:18;;2509:43:8::1;;;;;;;;2475:77;2400:12:::2;::::0;8866:7:13;;-1:-1:-1;;;;;2400:12:8::2;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::2;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::2;;::::0;;;:11:::2;:21;::::0;;;;;::::2;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::2;::::0;::::2;2764:74:14::0;2737:18;;2509:43:8::2;2618:226:14::0;2475:77:8::2;8912:36:13::3;8921:10;8933:7;8942:5;8912:8;:36::i;:::-;-1:-1:-1::0;8965:4:13::3;::::0;8681:295;-1:-1:-1;;;;8681:295:13:o;2418:85:10:-;5374:13:0;;;;;;;5366:69;;;;;;;6418:2:14;5366:69:0;;;6400:21:14;6457:2;6437:18;;;6430:30;6496:34;6476:18;;;6469:62;6567:13;6547:18;;;6540:41;6598:19;;5366:69:0;6216:407:14;5366:69:0;2482:6:10::1;:14:::0;;;::::1;::::0;;2418:85::o;4033:233:8:-;1898:12;;-1:-1:-1;;;;;1898:12:8;1884:10;:26;1880:76;;1919:37;;;;;;;;;;;;;;1880:76;-1:-1:-1;;;;;4113:21:8;::::1;;::::0;;;:11:::1;:21;::::0;;;;;::::1;;4108:74;;4143:39;::::0;::::1;::::0;;-1:-1:-1;;;;;2782:55:14;;4143:39:8::1;::::0;::::1;2764:74:14::0;2737:18;;4143:39:8::1;2618:226:14::0;4108:74:8::1;-1:-1:-1::0;;;;;4192:21:8;::::1;4216:5;4192:21:::0;;;:11:::1;:21;::::0;;;;;:29;;-1:-1:-1;;4192:29:8::1;::::0;;4236:23;::::1;::::0;4216:5;4236:23:::1;4033:233:::0;:::o;9723:438:13:-;1462:6:10;;9968:4:13;;1462:6:10;;;;;1458:37;;;1477:18;;;;;;;;;;;;;;1458:37;2400:12:8::1;::::0;9883:10:13::1;::::0;-1:-1:-1;;;;;2400:12:8::1;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::1;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::1;;::::0;;;:11:::1;:21;::::0;;;;;::::1;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::1;::::0;::::1;2764:74:14::0;2737:18;;2509:43:8::1;2618:226:14::0;2475:77:8::1;2400:12:::2;::::0;9918:4:13;;-1:-1:-1;;;;;2400:12:8::2;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::2;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::2;;::::0;;;:11:::2;:21;::::0;;;;;::::2;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::2;::::0;::::2;2764:74:14::0;2737:18;;2509:43:8::2;2618:226:14::0;2475:77:8::2;2400:12:::3;::::0;9947:2:13;;-1:-1:-1;;;;;2400:12:8::3;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::3;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::3;;::::0;;;:11:::3;:21;::::0;;;;;::::3;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::3;::::0;::::3;2764:74:14::0;2737:18;;2509:43:8::3;2618:226:14::0;2475:77:8::3;-1:-1:-1::0;;;;;10000:13:13;::::4;;::::0;;;:7:::4;:13;::::0;;;;;;;10014:10:::4;10000:25:::0;;;;;;;;9992:33;::::4;9988:65;;;10034:19;;;;;;;;;;;;;;9988:65;10063:26;10073:4;10079:2;10083:5;10063:9;:26::i;:::-;-1:-1:-1::0;;;;;10099:13:13;::::4;;::::0;;;:7:::4;:13;::::0;;;;;;;10113:10:::4;10099:25:::0;;;;;;;:34;;10128:5;;10099:13;:34:::4;::::0;10128:5;;10099:34:::4;:::i;:::-;::::0;;;-1:-1:-1;10150:4:13::4;::::0;9723:438;-1:-1:-1;;;;;;;;9723:438:13:o;2193:224:12:-;1056:16:11;;-1:-1:-1;;;;;1056:16:11;1042:10;:30;1038:111;;1095:43;;;;;;;;;;;;;;1038:111;-1:-1:-1;;;;;2279:24:12;::::1;2275:63;;2312:26;;;;;;;;;;;;;;2275:63;2348:8;:21:::0;;;::::1;-1:-1:-1::0;;;;;2348:21:12;::::1;::::0;;::::1;::::0;;;2384:26:::1;::::0;::::1;::::0;-1:-1:-1;;2384:26:12::1;2193:224:::0;:::o;11999:223:13:-;4843:12;;12081:4;;-1:-1:-1;;;;;4843:12:13;4829:10;:26;4825:56;;4864:17;;;;;;;;;;;;;;4825:56;-1:-1:-1;;;;;12097:16:13;::::1;12116:5;12097:16:::0;;;:8:::1;:16;::::0;;;;;;;:24;;-1:-1:-1;;12097:24:13::1;::::0;;12131:15:::1;:23:::0;;;;;;:27;;;12173:21;::::1;::::0;12116:5;12173:21:::1;-1:-1:-1::0;12211:4:13::1;4891:1;11999:223:::0;;;:::o;14328:310::-;1462:6:10;;14496:4:13;;1462:6:10;;;;;1458:37;;;1477:18;;;;;;;;;;;;;;1458:37;2400:12:8::1;::::0;14451:10:13::1;::::0;-1:-1:-1;;;;;2400:12:8::1;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::1;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::1;;::::0;;;:11:::1;:21;::::0;;;;;::::1;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::1;::::0;::::1;2764:74:14::0;2737:18;;2509:43:8::1;2618:226:14::0;2475:77:8::1;2400:12:::2;::::0;14478:7:13;;-1:-1:-1;;;;;2400:12:8::2;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::2;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::2;;::::0;;;:11:::2;:21;::::0;;;;;::::2;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::2;::::0;::::2;2764:74:14::0;2737:18;;2509:43:8::2;2618:226:14::0;2475:77:8::2;14528:10:13::3;14512:13;14573:14:::0;;;:7:::3;:14;::::0;;;;;;;-1:-1:-1;;;;;14573:23:13;::::3;::::0;;;;;;;;14548:61:::3;::::0;14528:10;;14564:7;;14573:35:::3;::::0;14599:9;;14573:35:::3;:::i;:::-;14548:8;:61::i;:::-;-1:-1:-1::0;14627:4:13::3;::::0;14328:310;-1:-1:-1;;;;;14328:310:13:o;2706:152:10:-;1654:7;;-1:-1:-1;;;;;1654:7:10;1640:10;:21;1636:61;;1670:27;;;;;;;;;;;;;;1636:61;2760:6:::1;::::0;;;::::1;;;2755:47;;2775:27;;;;;;;;;;;;;;2755:47;2812:6;:14:::0;;;::::1;::::0;;2841:10:::1;::::0;::::1;::::0;2821:5:::1;::::0;2841:10:::1;2706:152::o:0;13072:636:13:-;1462:6:10;;13226:4:13;;1462:6:10;;;;;1458:37;;;1477:18;;;;;;;;;;;;;;1458:37;4640:10:13::1;4631:20;::::0;;;:8:::1;:20;::::0;;;;;::::1;;4626:45;;4660:11;;;;;;;;;;;;;;4626:45;2400:12:8::2;::::0;13185:10:13::2;::::0;-1:-1:-1;;;;;2400:12:8::2;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::2;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::2;;::::0;;;:11:::2;:21;::::0;;;;;::::2;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::2;::::0;::::2;2764:74:14::0;2737:18;;2509:43:8::2;2618:226:14::0;2475:77:8::2;2400:12:::3;::::0;13212:3:13;;-1:-1:-1;;;;;2400:12:8::3;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::3;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::3;;::::0;;;:11:::3;:21;::::0;;;;;::::3;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::3;::::0;::::3;2764:74:14::0;2737:18;;2509:43:8::3;2618:226:14::0;2475:77:8::3;-1:-1:-1::0;;;;;13246:17:13;::::4;13242:45;;13272:15;;;;;;;;;;;;;;13242:45;13312:1;13301:7;:12;13297:52;;13322:27;;;;;;;;;;;;;;13297:52;13363:10;-1:-1:-1::0;;;;;13363:17:13;::::4;;13359:46;;13389:16;;;;;;;;;;;;;;13359:46;-1:-1:-1::0;;;;;13419:20:13;::::4;;::::0;;;:15:::4;:20;::::0;;;;;:30;-1:-1:-1;13415:62:13::4;;;13458:19;;;;;;;;;;;;;;13415:62;13504:7;13488:12;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;13521:13:13;::::4;;::::0;;;:8:::4;:13;::::0;;;;:24;;13538:7;;13521:13;:24:::4;::::0;13538:7;;13521:24:::4;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;13555:20:13;::::4;;::::0;;;:15:::4;:20;::::0;;;;:31;;13579:7;;13555:20;:31:::4;::::0;13579:7;;13555:31:::4;:::i;:::-;::::0;;;-1:-1:-1;;13601:30:13::4;::::0;1680:25:14;;;-1:-1:-1;;;;;13601:30:13;::::4;::::0;13606:10:::4;::::0;13601:30:::4;::::0;1668:2:14;1653:18;13601:30:13::4;;;;;;;13646:34;::::0;1680:25:14;;;-1:-1:-1;;;;;13646:34:13;::::4;::::0;13663:1:::4;::::0;13646:34:::4;::::0;1668:2:14;1653:18;13646:34:13::4;;;;;;;-1:-1:-1::0;13697:4:13::4;::::0;13072:636;-1:-1:-1;;;;13072:636:13:o;12364:445::-;1462:6:10;;;;;;;1458:37;;;1477:18;;;;;;;;;;;;;;1458:37;4640:10:13::1;4631:20;::::0;;;:8:::1;:20;::::0;;;;;::::1;;4626:45;;4660:11;;;;;;;;;;;;;;4626:45;2400:12:8::2;::::0;12444:10:13::2;::::0;-1:-1:-1;;;;;2400:12:8::2;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::2;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::2;;::::0;;;:11:::2;:21;::::0;;;;;::::2;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::2;::::0;::::2;2764:74:14::0;2737:18;;2509:43:8::2;2618:226:14::0;2475:77:8::2;12493:10:13::3;12466:15;12484:20:::0;;;:8:::3;:20;::::0;;;;;12518:12;12514:55:::3;;12539:30;;;;;;;;;;;;;;12514:55;12593:7;12583;:17;12579:52;;;12609:22;;;;;;;;;;;;;;12579:52;12658:7;12642:12;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;12684:10:13::3;12675:20;::::0;;;:8:::3;:20;::::0;;;;:31;;12699:7;;12675:20;:31:::3;::::0;12699:7;;12675:31:::3;:::i;:::-;::::0;;;-1:-1:-1;;12721:25:13::3;::::0;1680::14;;;12726:10:13::3;::::0;12721:25:::3;::::0;1668:2:14;1653:18;12721:25:13::3;;;;;;;12761:41;::::0;1680:25:14;;;12790:1:13::3;::::0;12770:10:::3;::::0;12761:41:::3;::::0;1668:2:14;1653:18;12761:41:13::3;;;;;;;;12456:353;4681:1:::2;12364:445:::0;:::o;11497:336::-;1462:6:10;;11648:4:13;;1462:6:10;;;;;1458:37;;;1477:18;;;;;;;;;;;;;;1458:37;4843:12:13::1;::::0;-1:-1:-1;;;;;4843:12:13::1;4829:10;:26;4825:56;;4864:17;;;;;;;;;;;;;;4825:56;-1:-1:-1::0;;;;;11664:16:13;::::2;;::::0;;;:8:::2;:16;::::0;;;;;;;:23;;-1:-1:-1;;11664:23:13::2;11683:4;11664:23;::::0;;11697:15:::2;:23:::0;;;;;;:46;;;11759;;1680:25:14;;;11759:46:13::2;::::0;1653:18:14;11759:46:13::2;;;;;;;-1:-1:-1::0;11822:4:13::2;11497:336:::0;;;;:::o;3155:217:10:-;1056:16:11;;-1:-1:-1;;;;;1056:16:11;1042:10;:30;1038:111;;1095:43;;;;;;;;;;;;;;1038:111;-1:-1:-1;;;;;3240:24:10;::::1;3236:62;;3273:25;;;;;;;;;;;;;;3236:62;3308:7;:20:::0;;;::::1;-1:-1:-1::0;;;;;3308:20:10;::::1;::::0;;::::1;::::0;;;3343:22:::1;::::0;::::1;::::0;-1:-1:-1;;3343:22:10::1;3155:217:::0;:::o;3320::9:-;1777:13;;-1:-1:-1;;;;;1777:13:9;1763:10;:27;1759:72;;1799:32;;;;;;;;;;;;;;1759:72;3402:6:::1;::::0;;3427:13:::1;::::0;3402:6;-1:-1:-1;;;;;3427:13:9;;::::1;2711:17:::0;;;;;;;;;3402:6;;::::1;;3451:13;:26:::0;;;::::1;::::0;;3523:6:::1;::::0;3492:38:::1;::::0;-1:-1:-1;;;;;3523:6:9;;;::::1;::::0;::::1;::::0;3492:38;::::1;::::0;::::1;::::0;-1:-1:-1;;3492:38:9::1;3373:164;3320:217::o:0;2115:144:10:-;1654:7;;-1:-1:-1;;;;;1654:7:10;1640:10;:21;1636:61;;1670:27;;;;;;;;;;;;;;1636:61;2166:6:::1;::::0;;;::::1;;;2162:44;;;2181:25;;;;;;;;;;;;;;2162:44;2216:6;:13:::0;;;::::1;::::0;::::1;::::0;;2244:8:::1;::::0;::::1;::::0;2216:13;;2244:8:::1;2115:144::o:0;6899:93:13:-;6946:13;6978:7;6971:14;;;;;:::i;1644:244:11:-;1575:6:9;;;;;-1:-1:-1;;;;;1575:6:9;1561:10;:20;1557:58;;1590:25;;;;;;;;;;;;;;1557:58;-1:-1:-1;;;;;1724:23:11;::::1;1720:68;;1756:32;;;;;;;;;;;;;;1720:68;1798:16;:28:::0;;;::::1;-1:-1:-1::0;;;;;1798:28:11;::::1;::::0;;::::1;::::0;;;1841:40:::1;::::0;::::1;::::0;-1:-1:-1;;1841:40:11::1;1644:244:::0;:::o;14880:506:13:-;1462:6:10;;15048:4:13;;1462:6:10;;;;;1458:37;;;1477:18;;;;;;;;;;;;;;1458:37;2400:12:8::1;::::0;15003:10:13::1;::::0;-1:-1:-1;;;;;2400:12:8::1;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::1;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::1;;::::0;;;:11:::1;:21;::::0;;;;;::::1;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::1;::::0;::::1;2764:74:14::0;2737:18;;2509:43:8::1;2618:226:14::0;2475:77:8::1;2400:12:::2;::::0;15030:7:13;;-1:-1:-1;;;;;2400:12:8::2;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::2;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::2;;::::0;;;:11:::2;:21;::::0;;;;;::::2;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::2;::::0;::::2;2764:74:14::0;2737:18;;2509:43:8::2;2618:226:14::0;2475:77:8::2;15080:10:13::3;15064:13;15127:14:::0;;;:7:::3;:14;::::0;;;;;;;-1:-1:-1;;;;;15127:23:13;::::3;::::0;;;;;;;;15164:28;;::::3;15160:134;;;15215:68;::::0;::::3;::::0;;-1:-1:-1;;;;;7390:15:14;;;15215:68:13::3;::::0;::::3;7372:34:14::0;7442:15;;7422:18;;;7415:43;7474:18;;;7467:34;;;7517:18;;;7510:34;;;7283:19;;15215:68:13::3;7080:470:14::0;15160:134:13::3;15304:54;15313:5:::0;15320:7;15329:28:::3;15348:9:::0;15329:16;:28:::3;:::i;15304:54::-;-1:-1:-1::0;15375:4:13::3;::::0;14880:506;-1:-1:-1;;;;;;14880:506:13:o;10375:282::-;1462:6:10;;10577:4:13;;1462:6:10;;;;;1458:37;;;1477:18;;;;;;;;;;;;;;1458:37;2400:12:8::1;::::0;10521:10:13::1;::::0;-1:-1:-1;;;;;2400:12:8::1;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::1;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::1;;::::0;;;:11:::1;:21;::::0;;;;;::::1;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::1;::::0;::::1;2764:74:14::0;2737:18;;2509:43:8::1;2618:226:14::0;2475:77:8::1;2400:12:::2;::::0;10556:2:13;;-1:-1:-1;;;;;2400:12:8::2;2396:69;;2435:30;;-1:-1:-1::0;;;2435:30:8::2;;;;;;;;;;;2396:69;-1:-1:-1::0;;;;;2479:21:8;::::2;;::::0;;;:11:::2;:21;::::0;;;;;::::2;;2475:77;;;2509:43;::::0;-1:-1:-1;;;2509:43:8;;-1:-1:-1;;;;;2782:55:14;;2509:43:8::2;::::0;::::2;2764:74:14::0;2737:18;;2509:43:8::2;2618:226:14::0;2475:77:8::2;10597:32:13::3;10607:10;10619:2;10623:5;10597:9;:32::i;13849:237::-:0;1575:6:9;;;;;-1:-1:-1;;;;;1575:6:9;1561:10;:20;1557:58;;1590:25;;;;;;;;;;;;;;1557:58;-1:-1:-1;;;;;13936:30:13;::::1;13932:58;;13975:15;;;;;;;;;;;;;;13932:58;14000:12;:31:::0;;;::::1;-1:-1:-1::0;;;;;14000:31:13;::::1;::::0;;::::1;::::0;;;14046:33:::1;::::0;::::1;::::0;-1:-1:-1;;14046:33:13::1;13849:237:::0;:::o;4588:257:8:-;1056:16:11;;-1:-1:-1;;;;;1056:16:11;1042:10;:30;1038:111;;1095:43;;;;;;;;;;;;;;1038:111;-1:-1:-1;;;;;4683:29:8;::::1;4679:72;;4721:30;;-1:-1:-1::0;;;4721:30:8::1;;;;;;;;;;;4679:72;4761:12;:30:::0;;;::::1;-1:-1:-1::0;;;;;4761:30:8;::::1;::::0;;::::1;::::0;;;4806:32:::1;::::0;::::1;::::0;-1:-1:-1;;4806:32:8::1;4588:257:::0;:::o;1714:177:12:-;1316:8;;-1:-1:-1;;;;;1316:8:12;1302:10;:22;1298:64;;1333:29;;;;;;;;;;;;;;1298:64;1846:38:::1;-1:-1:-1::0;;;;;1846:26:12;::::1;1873:2:::0;1877:6;1846:26:::1;:38::i;:::-;1714:177:::0;;;:::o;5459:1135:13:-;3302:13:0;;;;;;;3301:14;;3347:34;;;;-1:-1:-1;3365:12:0;;3380:1;3365:12;;;;:16;3347:34;3346:108;;;-1:-1:-1;3426:4:0;1713:19:1;:23;;;3387:66:0;;-1:-1:-1;3436:12:0;;;;;:17;3387:66;3325:201;;;;;;;7757:2:14;3325:201:0;;;7739:21:14;7796:2;7776:18;;;7769:30;7835:34;7815:18;;;7808:62;7906:16;7886:18;;;7879:44;7940:19;;3325:201:0;7555:410:14;3325:201:0;3536:12;:16;;-1:-1:-1;;3536:16:0;3551:1;3536:16;;;3562:65;;;;3596:13;:20;;;;;;;;3562:65;5779:30:13::1;5798:10;5779:18;:30::i;:::-;5819:29;:27;:29::i;:::-;-1:-1:-1::0;;;;;5863:29:13;::::1;5859:57;;5901:15;;;;;;;;;;;;;;5859:57;-1:-1:-1::0;;;;;5930:23:13;::::1;5926:51;;5962:15;;;;;;;;;;;;;;5926:51;-1:-1:-1::0;;;;;5991:28:13;::::1;5987:56;;6028:15;;;;;;;;;;;;;;5987:56;-1:-1:-1::0;;;;;6057:24:13;::::1;6053:52;;6090:15;;;;;;;;;;;;;;6053:52;6116:17;:5;6124:9:::0;;6116:17:::1;:::i;:::-;-1:-1:-1::0;6143:21:13::1;:7;6153:11:::0;;6143:21:::1;:::i;:::-;-1:-1:-1::0;6174:24:13::1;:8;6185:13:::0;;6174:24:::1;:::i;:::-;-1:-1:-1::0;6208:9:13::1;:25:::0;;-1:-1:-1;;6208:25:13::1;;::::0;::::1;;::::0;;6243:12:::1;:30:::0;;;;;::::1;-1:-1:-1::0;;;;;6243:30:13;;::::1;::::0;;::::1;::::0;;;6283:7:::1;:19:::0;;;::::1;::::0;;::::1;;::::0;;6312:12:::1;:29:::0;;;::::1;::::0;;::::1;;::::0;;6351:8:::1;:21:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;6388:32:::1;::::0;::::1;::::0;-1:-1:-1;;6388:32:13::1;6435:20;::::0;-1:-1:-1;;;;;6435:20:13;::::1;::::0;::::1;::::0;;;::::1;6470:30;::::0;-1:-1:-1;;;;;6470:30:13;::::1;::::0;::::1;::::0;;;::::1;6515:31;::::0;2601:4:14;2589:17;;2571:36;;6515:31:13::1;::::0;2559:2:14;2544:18;6515:31:13::1;;;;;;;6561:26;::::0;-1:-1:-1;;;;;6561:26:13;::::1;::::0;::::1;::::0;;;::::1;3651:14:0::0;3647:99;;;3681:13;:21;;;;;;3721:14;;-1:-1:-1;2571:36:14;;3721:14:0;;2559:2:14;2544:18;3721:14:0;;;;;;;3647:99;3269:483;5459:1135:13;;;;;;;;;;;:::o;2008:91:9:-;5374:13:0;;;;;;;5366:69;;;;;;;6418:2:14;5366:69:0;;;6400:21:14;6457:2;6437:18;;;6430:30;6496:34;6476:18;;;6469:62;6567:13;6547:18;;;6540:41;6598:19;;5366:69:0;6216:407:14;5366:69:0;2711:6:9;:17;;;;;-1:-1:-1;;;;;2711:17:9;;;;;;2008:91;:::o;2077:15::-:1;2008:91:::0;:::o;820:22:13:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2958:231:9:-;1575:6;;;;;-1:-1:-1;;;;;1575:6:9;1561:10;:20;1557:58;;1590:25;;;;;;;;;;;;;;1557:58;-1:-1:-1;;;;;3036:22:9;::::1;3032:59;;3067:24;;;;;;;;;;;;;;3032:59;3101:13;:24:::0;;;::::1;-1:-1:-1::0;;;;;3101:24:9;;::::1;::::0;;::::1;::::0;;;3165:6:::1;::::0;3140:42:::1;::::0;3101:24;;3165:6;;;::::1;;::::0;3140:42:::1;::::0;-1:-1:-1;;3140:42:9::1;2958:231:::0;:::o;15627:359:13:-;1575:6:9;;;;;-1:-1:-1;;;;;1575:6:9;1561:10;:20;1557:58;;1590:25;;;;;;;;;;;;;;1557:58;-1:-1:-1;;;;;15711:21:13;::::1;;::::0;;;:11:::1;:21;::::0;;;;;::::1;;15706:51;;15741:16;;;;;;;;;;;;;;15706:51;-1:-1:-1::0;;;;;15785:18:13;::::1;15767:15;15785:18:::0;;;:8:::1;:18;::::0;;;;;15817:12;15813:38:::1;;15838:13;;;;;;;;;;;;;;15813:38;15877:7;15861:12;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;15894:18:13;::::1;15915:1;15894:18:::0;;;:8:::1;:18;::::0;;;;;;;:22;;;15940:39;1680:25:14;;;15915:1:13;;15894:18;15940:39:::1;::::0;1653:18:14;15940:39:13::1;;;;;;;15696:290;15627:359:::0;:::o;3396:393:8:-;1898:12;;-1:-1:-1;;;;;1898:12:8;1884:10;:26;1880:76;;1919:37;;;;;;;;;;;;;;1880:76;-1:-1:-1;;;;;3472:21:8;::::1;;::::0;;;:11:::1;:21;::::0;;;;;::::1;;3468:77;;;3502:43;::::0;-1:-1:-1;;;3502:43:8;;-1:-1:-1;;;;;2782:55:14;;3502:43:8::1;::::0;::::1;2764:74:14::0;2737:18;;3502:43:8::1;2618:226:14::0;3468:77:8::1;3571:12;::::0;-1:-1:-1;;;;;3559:24:8;;::::1;3571:12:::0;::::1;3559:24;3555:78;;;3592:41;;;;;;;;;;;;;;3555:78;-1:-1:-1::0;;;;;3647:22:8;::::1;3643:65;;3678:30;;-1:-1:-1::0;;;3678:30:8::1;;;;;;;;;;;3643:65;-1:-1:-1::0;;;;;3718:21:8;::::1;;::::0;;;:11:::1;:21;::::0;;;;;:28;;-1:-1:-1;;3718:28:8::1;3742:4;3718:28;::::0;;3761:21;::::1;::::0;3718;3761::::1;3396:393:::0;:::o;9171:293:13:-;-1:-1:-1;;;;;9268:19:13;;9264:47;;9296:15;;;;;;;;;;;;;;9264:47;-1:-1:-1;;;;;9325:21:13;;9321:49;;9355:15;;;;;;;;;;;;;;9321:49;-1:-1:-1;;;;;9380:14:13;;;;;;;:7;:14;;;;;;;;:23;;;;;;;;;;;;;:31;;;9426;;1680:25:14;;;9426:31:13;;1653:18:14;9426:31:13;1534:177:14;10847:367:13;-1:-1:-1;;;;;10939:18:13;;10935:46;;10966:15;;;;;;;;;;;;;;10935:46;-1:-1:-1;;;;;10995:16:13;;10991:44;;11020:15;;;;;;;;;;;;;;10991:44;-1:-1:-1;;;;;11057:14:13;;;;;;:8;:14;;;;;;11049:22;;11045:57;;;11080:22;;;;;;;;;;;;;;11045:57;-1:-1:-1;;;;;11113:14:13;;;;;;:8;:14;;;;;:23;;11131:5;;11113:14;:23;;11131:5;;11113:23;:::i;:::-;;;;-1:-1:-1;;;;;;;11146:12:13;;;;;;:8;:12;;;;;:21;;11162:5;;11146:12;:21;;11162:5;;11146:21;:::i;:::-;;;;;;;;11197:2;-1:-1:-1;;;;;11182:25:13;11191:4;-1:-1:-1;;;;;11182:25:13;;11201:5;11182:25;;;;1680::14;;1668:2;1653:18;;1534:177;941:175:4;1050:58;;;-1:-1:-1;;;;;8361:55:14;;;1050:58:4;;;8343:74:14;8433:18;;;;8426:34;;;1050:58:4;;;;;;;;;;8316:18:14;;;;1050:58:4;;;;;;;;;;1073:23;1050:58;;;5641:69;;;;;;;;;;;;;;;;1023:86;;1043:5;;1050:58;-1:-1:-1;;5641:69:4;;:27;;;1050:58;;5641:27;:69::i;:::-;5615:95;;5728:10;:17;5749:1;5728:22;:56;;;;5765:10;5754:30;;;;;;;;;;;;:::i;:::-;5720:111;;;;;;;8955:2:14;5720:111:4;;;8937:21:14;8994:2;8974:18;;;8967:30;9033:34;9013:18;;;9006:62;9104:12;9084:18;;;9077:40;9134:19;;5720:111:4;8753:406:14;4108:223:5;4241:12;4272:52;4294:6;4302:4;4308:1;4311:12;4272:21;:52::i;:::-;4265:59;4108:223;-1:-1:-1;;;;4108:223:5:o;5165:446::-;5330:12;5387:5;5362:21;:30;;5354:81;;;;;;;9366:2:14;5354:81:5;;;9348:21:14;9405:2;9385:18;;;9378:30;9444:34;9424:18;;;9417:62;9515:8;9495:18;;;9488:36;9541:19;;5354:81:5;9164:402:14;5354:81:5;5446:12;5460:23;5487:6;-1:-1:-1;;;;;5487:11:5;5506:5;5513:4;5487:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5445:73;;;;5535:69;5562:6;5570:7;5579:10;5591:12;5535:26;:69::i;:::-;5528:76;5165:446;-1:-1:-1;;;;;;;5165:446:5:o;7671:628::-;7851:12;7879:7;7875:418;;;7906:17;;7902:286;;-1:-1:-1;;;;;1713:19:1;;;8113:60:5;;;;;;;10052:2:14;8113:60:5;;;10034:21:14;10091:2;10071:18;;;10064:30;10130:31;10110:18;;;10103:59;10179:18;;8113:60:5;9850:353:14;8113:60:5;-1:-1:-1;8208:10:5;8201:17;;7875:418;8249:33;8257:10;8269:12;8980:17;;:21;8976:379;;9208:10;9202:17;9264:15;9251:10;9247:2;9243:19;9236:44;8976:379;9331:12;9324:20;;;;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:258:14;86:1;96:113;110:6;107:1;104:13;96:113;;;186:11;;;180:18;167:11;;;160:39;132:2;125:10;96:113;;;227:6;224:1;221:13;218:48;;;262:1;253:6;248:3;244:16;237:27;218:48;;14:258;;;:::o;277:442::-;426:2;415:9;408:21;389:4;458:6;452:13;501:6;496:2;485:9;481:18;474:34;517:66;576:6;571:2;560:9;556:18;551:2;543:6;539:15;517:66;:::i;:::-;635:2;623:15;640:66;619:88;604:104;;;;710:2;600:113;;277:442;-1:-1:-1;;277:442:14:o;724:154::-;-1:-1:-1;;;;;803:5:14;799:54;792:5;789:65;779:93;;868:1;865;858:12;883:134;951:20;;980:31;951:20;980:31;:::i;1022:315::-;1090:6;1098;1151:2;1139:9;1130:7;1126:23;1122:32;1119:52;;;1167:1;1164;1157:12;1119:52;1206:9;1193:23;1225:31;1250:5;1225:31;:::i;:::-;1275:5;1327:2;1312:18;;;;1299:32;;-1:-1:-1;;;1022:315:14:o;1716:247::-;1775:6;1828:2;1816:9;1807:7;1803:23;1799:32;1796:52;;;1844:1;1841;1834:12;1796:52;1883:9;1870:23;1902:31;1927:5;1902:31;:::i;:::-;1952:5;1716:247;-1:-1:-1;;;1716:247:14:o;1968:456::-;2045:6;2053;2061;2114:2;2102:9;2093:7;2089:23;2085:32;2082:52;;;2130:1;2127;2120:12;2082:52;2169:9;2156:23;2188:31;2213:5;2188:31;:::i;:::-;2238:5;-1:-1:-1;2295:2:14;2280:18;;2267:32;2308:33;2267:32;2308:33;:::i;:::-;1968:456;;2360:7;;-1:-1:-1;;;2414:2:14;2399:18;;;;2386:32;;1968:456::o;2849:180::-;2908:6;2961:2;2949:9;2940:7;2936:23;2932:32;2929:52;;;2977:1;2974;2967:12;2929:52;-1:-1:-1;3000:23:14;;2849:180;-1:-1:-1;2849:180:14:o;3509:348::-;3561:8;3571:6;3625:3;3618:4;3610:6;3606:17;3602:27;3592:55;;3643:1;3640;3633:12;3592:55;-1:-1:-1;3666:20:14;;3709:18;3698:30;;3695:50;;;3741:1;3738;3731:12;3695:50;3778:4;3770:6;3766:17;3754:29;;3830:3;3823:4;3814:6;3806;3802:19;3798:30;3795:39;3792:59;;;3847:1;3844;3837:12;3792:59;3509:348;;;;;:::o;3862:156::-;3928:20;;3988:4;3977:16;;3967:27;;3957:55;;4008:1;4005;3998:12;4023:1353;4179:6;4187;4195;4203;4211;4219;4227;4235;4243;4251;4259:7;4313:3;4301:9;4292:7;4288:23;4284:33;4281:53;;;4330:1;4327;4320:12;4281:53;4353:18;4411:2;4399:9;4386:23;4383:31;4380:51;;;4427:1;4424;4417:12;4380:51;4466:76;4534:7;4521:9;4508:23;4497:9;4493:39;4466:76;:::i;:::-;4561:8;;-1:-1:-1;4588:8:14;-1:-1:-1;4639:2:14;4624:18;;4611:32;4608:40;-1:-1:-1;4605:60:14;;;4661:1;4658;4651:12;4605:60;4700:85;4777:7;4770:2;4759:9;4755:18;4742:32;4731:9;4727:48;4700:85;:::i;:::-;4804:8;;-1:-1:-1;4831:8:14;-1:-1:-1;4882:2:14;4867:18;;4854:32;4851:40;-1:-1:-1;4848:60:14;;;4904:1;4901;4894:12;4848:60;;4943:85;5020:7;5013:2;5002:9;4998:18;4985:32;4974:9;4970:48;4943:85;:::i;:::-;5047:8;;-1:-1:-1;5074:8:14;-1:-1:-1;5101:36:14;5133:2;5118:18;;5101:36;:::i;:::-;5091:46;;5156:39;5190:3;5179:9;5175:19;5156:39;:::i;:::-;5146:49;;5214:39;5248:3;5237:9;5233:19;5214:39;:::i;:::-;5204:49;;5272:39;5306:3;5295:9;5291:19;5272:39;:::i;:::-;5262:49;;5331:39;5365:3;5354:9;5350:19;5331:39;:::i;:::-;5320:50;;4023:1353;;;;;;;;;;;;;;:::o;5381:388::-;5449:6;5457;5510:2;5498:9;5489:7;5485:23;5481:32;5478:52;;;5526:1;5523;5516:12;5478:52;5565:9;5552:23;5584:31;5609:5;5584:31;:::i;:::-;5634:5;-1:-1:-1;5691:2:14;5676:18;;5663:32;5704:33;5663:32;5704:33;:::i;:::-;5756:7;5746:17;;;5381:388;;;;;:::o;5774:437::-;5853:1;5849:12;;;;5896;;;5917:61;;5971:4;5963:6;5959:17;5949:27;;5917:61;6024:2;6016:6;6013:14;5993:18;5990:38;5987:218;;;6061:77;6058:1;6051:88;6162:4;6159:1;6152:15;6190:4;6187:1;6180:15;5987:218;;5774:437;;;:::o;6628:184::-;6680:77;6677:1;6670:88;6777:4;6774:1;6767:15;6801:4;6798:1;6791:15;6817:125;6857:4;6885:1;6882;6879:8;6876:34;;;6890:18;;:::i;:::-;-1:-1:-1;6927:9:14;;6817:125::o;6947:128::-;6987:3;7018:1;7014:6;7011:1;7008:13;7005:39;;;7024:18;;:::i;:::-;-1:-1:-1;7060:9:14;;6947:128::o;8471:277::-;8538:6;8591:2;8579:9;8570:7;8566:23;8562:32;8559:52;;;8607:1;8604;8597:12;8559:52;8639:9;8633:16;8692:5;8685:13;8678:21;8671:5;8668:32;8658:60;;8714:1;8711;8704:12;9571:274;9700:3;9738:6;9732:13;9754:53;9800:6;9795:3;9788:4;9780:6;9776:17;9754:53;:::i;:::-;9823:16;;;;;9571:274;-1:-1:-1;;9571:274:14:o","linkReferences":{},"immutableReferences":{}}}}}}},"signatures":{"function":[{"signature":"acceptOwnership()","signatureHash4":"0x79ba5097","signatureHash32":"0x79ba5097e5519a381a52113cdcc59540d13f73fd9d26abc0453484a096cc96f2"},{"signature":"allowance(address,address)","signatureHash4":"0xdd62ed3e","signatureHash32":"0xdd62ed3e90e97b3d417db9c0c7522647811bafca5afc6694f143588d255fdfb4"},{"signature":"approve(address,uint256)","signatureHash4":"0x095ea7b3","signatureHash32":"0x095ea7b334ae44009aa867bfb386f5c3b4b443ac6f0ee573fa91c4608fbadfba"},{"signature":"balanceOf(address)","signatureHash4":"0x70a08231","signatureHash32":"0x70a08231b98ef4ca268c9cc3f6b4590e4bfec28280db06bb5d45e689f2a360be"},{"signature":"blacklist(address)","signatureHash4":"0xf9f92be4","signatureHash32":"0xf9f92be441c8f544944bc2b7efa558c4f30a652089630b59da607468343ee059"},{"signature":"blacklisted(address)","signatureHash4":"0xdbac26e9","signatureHash32":"0xdbac26e908d6d788ca26eee9d726d69d77db9b9cb5a2d0311249fc8f381536da"},{"signature":"burn(uint256)","signatureHash4":"0x42966c68","signatureHash32":"0x42966c689b5afe9b9b3f8a7103b2a19980d59629bfd6a20a60972312ed41d836"},{"signature":"configureMinter(address,uint256)","signatureHash4":"0x4e44d956","signatureHash32":"0x4e44d95606b0c58e06f67ad0cdce63976176121e763db54dfdc14df30c37fb13"},{"signature":"currency()","signatureHash4":"0xe5a6b10f","signatureHash32":"0xe5a6b10f53324a67c055e9cafcc226a53226664fc6be13e31307bf0b4bdf4001"},{"signature":"decimals()","signatureHash4":"0x313ce567","signatureHash32":"0x313ce567add4d438edf58b94ff345d7d38c45b17dfc0f947988d7819dca364f9"},{"signature":"decreaseAllowance(address,uint256)","signatureHash4":"0xa457c2d7","signatureHash32":"0xa457c2d77307f80ff2f3ac810ec99eb18ae2cffee13b29c90c9324546e374be5"},{"signature":"getBlacklister()","signatureHash4":"0xd3b3f8d4","signatureHash32":"0xd3b3f8d4b4f13b722c989fbb864b7193f0ef31c173ea130b2728d663f44527b9"},{"signature":"getMinterAllowance(address)","signatureHash4":"0x6ae8d6c8","signatureHash32":"0x6ae8d6c834762534dbd1f4e8d92056ff5f38f83485250f79be1e93b103dfe296"},{"signature":"getOwner()","signatureHash4":"0x893d20e8","signatureHash32":"0x893d20e82e7de4dc20ab2c04d17aa0699b89c86c9cd36ed761f937e212e0018a"},{"signature":"getPauser()","signatureHash4":"0x7008b548","signatureHash32":"0x7008b5489fb6294070b02a6daf2321ce9afe4cd321304da3187f6c225de15fa8"},{"signature":"getPendingOwner()","signatureHash4":"0x93596c7b","signatureHash32":"0x93596c7b5742f6e3523977a235700f9b36e0538287e4ff369163c7ad53cde4b0"},{"signature":"getPermissionAdmin()","signatureHash4":"0x3f02ebc4","signatureHash32":"0x3f02ebc4696136d67bbe56fe2ef6ea6256165beac73161eb098b04c3984e876b"},{"signature":"increaseAllowance(address,uint256)","signatureHash4":"0x39509351","signatureHash32":"0x39509351d3325647dde3fdd3c8b249adfe89ef4f16d76d83768e6df7a5cd81d6"},{"signature":"initialize(address)","signatureHash4":"0xc4d66de8","signatureHash32":"0xc4d66de8473e8f74cb05df264ee8262da16b56717ef1f05d73bfdcea3adc85e5"},{"signature":"initializePausable()","signatureHash4":"0x0d96bcdb","signatureHash32":"0x0d96bcdb552cfc5d6efe119d86e9b8adc89eeae3299543d699c852a858af733a"},{"signature":"initializeToken(string,string,string,uint8,address,address,address,address)","signatureHash4":"0xbdd6265a","signatureHash32":"0xbdd6265a6d73535c6deee2eaf05b291f633bf2e7694e760897861274b3d5776c"},{"signature":"isBlacklisted(address)","signatureHash4":"0xfe575a87","signatureHash32":"0xfe575a87aab505e234db2b42c812533d8e3bd159f25615abf29ce636184a6cb4"},{"signature":"isMinter(address)","signatureHash4":"0xaa271e1a","signatureHash32":"0xaa271e1a9a41b51f5b4e2e4ce717c974174719a5ddc12cee839f0eabbdf42748"},{"signature":"masterMinter()","signatureHash4":"0x35d99f35","signatureHash32":"0x35d99f353f882da0674c8dcc1f8d21e11e672d57a7541320771109c10ef04273"},{"signature":"mint(address,uint256)","signatureHash4":"0x40c10f19","signatureHash32":"0x40c10f19c047ae7dfa66d6312b683d2ea3dfbcb4159e96b967c5f4b0a86f2842"},{"signature":"minterAllowance(address)","signatureHash4":"0x8a6db9c3","signatureHash32":"0x8a6db9c3777c8f025ba81b92c56579bf9ebedd697c3b6a9f9023bc501625fdad"},{"signature":"name()","signatureHash4":"0x06fdde03","signatureHash32":"0x06fdde0383f15d582d1a74511486c9ddf862a882fb7904b3d9fe9b8b8e58a796"},{"signature":"pause()","signatureHash4":"0x8456cb59","signatureHash32":"0x8456cb591a934d53f6ccc6332123a165a1f3562907bf11330d847a29ca49eb89"},{"signature":"paused()","signatureHash4":"0x5c975abb","signatureHash32":"0x5c975abbf8c4d6efa68fc896e233763eb503f2318260b7bf59b19412913788b2"},{"signature":"removeMinter(address)","signatureHash4":"0x3092afd5","signatureHash32":"0x3092afd5301157b753073c7ad0be8f571723d525a965784cda36e0fef2c3a548"},{"signature":"rescueERC20(address,address,uint256)","signatureHash4":"0xb2118a8d","signatureHash32":"0xb2118a8de81d5c16f247e4298cf102832b5b6f8c1ddd3832b9b1842141c1d70b"},{"signature":"rescuer()","signatureHash4":"0x38a63183","signatureHash32":"0x38a631831abcc747e91f9a86836a748a5960c2d99d6dab38c6afdebd5b775f6b"},{"signature":"setPermissionAdmin(address)","signatureHash4":"0x9f50d7d1","signatureHash32":"0x9f50d7d1bd8aba2ac3e10522a725c6dfb90b30d1e1f7e4424051645f7a75f5ba"},{"signature":"symbol()","signatureHash4":"0x95d89b41","signatureHash32":"0x95d89b41e2f5f391a79ec54e9d87c79d6e777c63e32c28da95b4e9e4a79250ec"},{"signature":"totalSupply()","signatureHash4":"0x18160ddd","signatureHash32":"0x18160ddd7f15c72528c2f94fd8dfe3c8d5aa26e2c50c7d81f4bc7bee8d4b7932"},{"signature":"transfer(address,uint256)","signatureHash4":"0xa9059cbb","signatureHash32":"0xa9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b"},{"signature":"transferFrom(address,address,uint256)","signatureHash4":"0x23b872dd","signatureHash32":"0x23b872dd7302113369cda2901243429419bec145408fa8b352b3dd92b66c680b"},{"signature":"transferOwnership(address)","signatureHash4":"0xf2fde38b","signatureHash32":"0xf2fde38b092330466c661fc723d5289b90272a3e580e3187d1d7ef788506c557"},{"signature":"unBlacklist(address)","signatureHash4":"0x1a895266","signatureHash32":"0x1a8952661f1a18650a85550010a666fc22490e1601acd702a0f0f6606e0270ef"},{"signature":"unpause()","signatureHash4":"0x3f4ba83a","signatureHash32":"0x3f4ba83af89dc9793996d9e56b8abe6dc88cd97c9c2bb23027806e9c1ffd54dc"},{"signature":"updateBlacklister(address)","signatureHash4":"0xad38bf22","signatureHash32":"0xad38bf22734839bbd190b5f046a808a988bb4ffd8fb1b1dbb6a5db7eb1bdfdb6"},{"signature":"updateMasterMinter(address)","signatureHash4":"0xaa20e1e4","signatureHash32":"0xaa20e1e49f8822fc8d1bb540d6706f8db45f4ad12a55bbebcf867df1a51a8579"},{"signature":"updatePauser(address)","signatureHash4":"0x554bab3c","signatureHash32":"0x554bab3c056ab9ed9bc43674db1259a0fa5636b8b9c8ae41b02b64701445335b"},{"signature":"updateRescuer(address)","signatureHash4":"0x2ab60045","signatureHash32":"0x2ab60045fb0e9f6c8c5fc20ff7eecbbd8562814ea0c4948192f861061a6fe1a4"},{"signature":"wipeBlacklistedAddress(address)","signatureHash4":"0xf6ee1d88","signatureHash32":"0xf6ee1d88e47769a6e8da02cf86386826f62f540755934fb729510c261e8c668a"}],"event":[{"signature":"Approval(address,address,uint256)","signatureHash4":"0x8c5be1e5","signatureHash32":"0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925"},{"signature":"Blacklisted(address)","signatureHash4":"0xffa4e618","signatureHash32":"0xffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b855"},{"signature":"BlacklisterChanged(address)","signatureHash4":"0xc6739801","signatureHash32":"0xc67398012c111ce95ecb7429b933096c977380ee6c421175a71a4a4c6c88c06e"},{"signature":"Burn(address,uint256)","signatureHash4":"0xcc16f5db","signatureHash32":"0xcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5"},{"signature":"Initialized(uint8)","signatureHash4":"0x7f26b83f","signatureHash32":"0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"},{"signature":"MasterMinterChanged(address)","signatureHash4":"0xdb66dfa9","signatureHash32":"0xdb66dfa9c6b8f5226fe9aac7e51897ae8ee94ac31dc70bb6c9900b2574b707e6"},{"signature":"Mint(address,address,uint256)","signatureHash4":"0xab8530f8","signatureHash32":"0xab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8"},{"signature":"MinterConfigured(address,uint256)","signatureHash4":"0x46980fca","signatureHash32":"0x46980fca912ef9bcdbd36877427b6b90e860769f604e89c0e67720cece530d20"},{"signature":"MinterRemoved(address)","signatureHash4":"0xe94479a9","signatureHash32":"0xe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb66692"},{"signature":"NewBlacklister(address)","signatureHash4":"0x5b7763c2","signatureHash32":"0x5b7763c24622d383825c557446231d7c64358877092e307e719a8e7d22d7e30b"},{"signature":"NewMasterMinter(address)","signatureHash4":"0xb309eb87","signatureHash32":"0xb309eb87a246e87330262e01f9d27364d7f2206fb1d5e421998090fcde32d343"},{"signature":"NewPauser(address)","signatureHash4":"0x4f68150e","signatureHash32":"0x4f68150eb56c53cc9373649e35bc37dd235a0c86e10aa23b8a835378136ac6a0"},{"signature":"OwnershipTransferred(address,address)","signatureHash4":"0x8be0079c","signatureHash32":"0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0"},{"signature":"OwnershipTransferStarted(address,address)","signatureHash4":"0x38d16b8c","signatureHash32":"0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700"},{"signature":"Paused()","signatureHash4":"0x9e87fac8","signatureHash32":"0x9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e752"},{"signature":"PauserChanged(address)","signatureHash4":"0xb80482a2","signatureHash32":"0xb80482a293ca2e013eda8683c9bd7fc8347cfdaeea5ede58cba46df502c2a604"},{"signature":"PermissionAdminChanged(address)","signatureHash4":"0x5a2812dc","signatureHash32":"0x5a2812dc793378f68745c08c12995c38c2c2487fe9d0fa1badc4fe834f591b24"},{"signature":"RescuerChanged(address)","signatureHash4":"0xe475e580","signatureHash32":"0xe475e580d85111348e40d8ca33cfdd74c30fe1655c2d8537a13abc10065ffa5a"},{"signature":"TokenDecimalsSet(uint8)","signatureHash4":"0x6d3352c8","signatureHash32":"0x6d3352c892c287855203cb74eff23be26064d1777da8ad03c1ddb3450fba6765"},{"signature":"Transfer(address,address,uint256)","signatureHash4":"0xddf252ad","signatureHash32":"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"},{"signature":"UnBlacklisted(address)","signatureHash4":"0x117e3210","signatureHash32":"0x117e3210bb9aa7d9baff172026820255c6f6c30ba8999d1c2fd88e2848137c4e"},{"signature":"Unpaused()","signatureHash4":"0xa45f47fd","signatureHash32":"0xa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d16933"}],"error":[{"signature":"AllowanceExceeded()","signatureHash4":"0xc45cb513","signatureHash32":"0xc45cb51341d4b1dc04f3a364679aeb22d1837a8ab505408de039aa870f9d1fe8"},{"signature":"AmountExceedsBalance()","signatureHash4":"0x96ab19c8","signatureHash32":"0x96ab19c82ea0e7379608e4dcc906ac9c83a5518c1d33c48d7cbf4d2646ac1a0c"},{"signature":"Blacklistable__AccountBlacklisted(address)","signatureHash4":"0x02cbd126","signatureHash32":"0x02cbd1265d43d5d03686a93d15f5d1c27c3ddae01aef9f2577b0e4d615ad9d62"},{"signature":"Blacklistable__BlacklisterSelfBlacklist()","signatureHash4":"0x6982a42c","signatureHash32":"0x6982a42c7dd4c28f059777c59045557cd91402d9abefe401cd7d643818433c0c"},{"signature":"Blacklistable__CallerNotBlacklister()","signatureHash4":"0x8062a711","signatureHash32":"0x8062a7115c7b7c6c06ff78fe8ec5af7914d9454525f781782e3866f379d2630a"},{"signature":"Blacklistable__NotBlacklisted(address)","signatureHash4":"0x403a9457","signatureHash32":"0x403a94579fe0c75dbd46a281b4e7947af8257f0b436c08e8f475f8be10661224"},{"signature":"Blacklistable__NoZeroAddress()","signatureHash4":"0xb7d260ed","signatureHash32":"0xb7d260ed408616aef75a89de4f10682626bb5afd8bcf02e7cd00e49e5e23f08d"},{"signature":"BurnAmountNotGreaterThanZero()","signatureHash4":"0xdae7e6ca","signatureHash32":"0xdae7e6caacdb99438fac92f1094b297ab84cb158aed7631e988e219f942473fd"},{"signature":"FailedDecreaseAllowance(address,address,uint256,uint256)","signatureHash4":"0x35e0a125","signatureHash32":"0x35e0a1250886873820ac2c7f6967697236ae3a4e4c723b8d95c3d503b387d24a"},{"signature":"MintMustBeGreaterThanZero()","signatureHash4":"0xaf37b7a7","signatureHash32":"0xaf37b7a7102e7b5470fe9b378c0f0b8aebef1bb231f5f24fae5f4d19a4f14010"},{"signature":"NotBlacklisted()","signatureHash4":"0xa57ed368","signatureHash32":"0xa57ed368ad2ff221f701fb228c80080e24465a29c64d8e187c42a72919be6c58"},{"signature":"NotMasterMinter()","signatureHash4":"0xd5295ad1","signatureHash32":"0xd5295ad1606cc25250a861ca10f9ca65ef24fbe2a4d19382c87b54c414bd2155"},{"signature":"NotMinter()","signatureHash4":"0xf8d2906c","signatureHash32":"0xf8d2906ce84a96639fbeeedc84c13a0873e5d5e48a49a084ea78b44722550223"},{"signature":"NotSelfMinting()","signatureHash4":"0x35a84f27","signatureHash32":"0x35a84f275e3097761c0a9b9f67b963b190960c433aafb25734e55c9b2321a1c6"},{"signature":"NoZeroAddress()","signatureHash4":"0xddbadd5f","signatureHash32":"0xddbadd5f06ef4237bcf52eb7ede361d06d210115f81336fb5a9f333e9bb13f0b"},{"signature":"Ownable__CallerNotOwner()","signatureHash4":"0x6250be29","signatureHash32":"0x6250be2967995336ce70124d6c42fc3ee7ae9af466c0e1529101c34113bd6ca3"},{"signature":"Ownable__CallerNotPendingOwner()","signatureHash4":"0x2f89af83","signatureHash32":"0x2f89af8300a8598f93a068c20f39a8bc01a660f55a0bfc72dd47508ed444dbc1"},{"signature":"Ownable__NoZeroAddress()","signatureHash4":"0x8df7153f","signatureHash32":"0x8df7153f9625657b69dd66f8b40afb7a87fca6c6c78046ae1bc73e4d73f16cb8"},{"signature":"Pausable__AlreadyPaused()","signatureHash4":"0x51a5370e","signatureHash32":"0x51a5370ebc9ce7bbe6d88abbd82985725d5eca666acdafb67e918001ed0dd8d8"},{"signature":"Pausable__AlreadyUnpaused()","signatureHash4":"0xf2bafdf1","signatureHash32":"0xf2bafdf1a6ad32bc3204236889e934528ae7b31fcdef04adf148dbb011fd2696"},{"signature":"Pausable__CallerNotPauser()","signatureHash4":"0xe9b37cc7","signatureHash32":"0xe9b37cc7e95e19b880a6d43b03267bef65baf66f88fc15cbea6fd699622a9e64"},{"signature":"Pausable__NoZeroAddress()","signatureHash4":"0xcede3fa0","signatureHash32":"0xcede3fa0845bc5b19f6937c041ec36b948e86009c26adec6a6e96d047645d1f5"},{"signature":"Pausable__Paused()","signatureHash4":"0x059519da","signatureHash32":"0x059519daf0fdc21be87758fbcebb5ed09a79b870c1efbfa4617f8a3503793dbb"},{"signature":"PermissionAdmin__CallerNotPermissionAdmin()","signatureHash4":"0xd265da0c","signatureHash32":"0xd265da0c53f40478c1e1e4d305d208555feee22e0a33a9842a066d944ac053df"},{"signature":"PermissionAdmin__NoZeroAddress()","signatureHash4":"0x1517f653","signatureHash32":"0x1517f65332db0b03d9681d053af8dfe522e45b0e509e98eeed8a7aefeffcb08a"},{"signature":"Rescuable__CallerNotRescuer()","signatureHash4":"0x933efdd0","signatureHash32":"0x933efdd0e07a9aaf77421c62dc0861c6e81ddddf04392dec3635d655b6fe2cd5"},{"signature":"Rescuable__NoZeroAddress()","signatureHash4":"0x3e17108f","signatureHash32":"0x3e17108f666d55997d83f5307883f87832bc43e2b25c54e0d60779c12d37b607"},{"signature":"ZeroBalance()","signatureHash4":"0x669567ea","signatureHash32":"0x669567ea45849e2be6dd4df6e83e9e07b5ea429935d0a5a24f25812fa72480b4"}]},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"match":"exact_match","chainId":"1","address":"0x7Df0b1F63E0A467B6aa95b4ed6D299daB9f73750"}