template<typename T, typename... Args>
constexpr bool is_nothrow_constructible() { return noexcept(T(declval<Args>()...)); }
template<typename T>
constexpr bool is_nothrow_default_constructible() { return noexcept(T()); }
template<typename T>
constexpr bool is_nothrow_copy_constructible() { return noexcept(T(declval<T>())); }
template<typename T>
constexpr bool is_nothrow_move_constructible() { return noexcept(T(declval<add_rvalue_reference<T>>())); }
template<typename T, typename X>
constexpr bool is_nothrow_assignable() { return noexcept(declval<T>() = declval<X>()); }
template<typename T, typename X>
constexpr bool is_nothrow_copy_assignable() { return is_nothrow_assignable<add_lvalue_reference<T>, const add_lvalue_reference<X>>(); }
template<typename T, typename X>
constexpr bool is_nothrow_move_assignable() { return is_nothrow_assignable<add_lvalue_reference<T>, add_rvalue_reference<X>>(); }
template<typename T>
constexpr bool is_nothrow_destructible() { return noexcept(declval<T>().~T()); }
ICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgogIGNvbnN0ZXhwciBib29sIGlzX25vdGhyb3dfY29uc3RydWN0aWJsZSgpIHsgcmV0dXJuIG5vZXhjZXB0KFQoZGVjbHZhbDxBcmdzPigpLi4uKSk7IH0KICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogIGNvbnN0ZXhwciBib29sIGlzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlKCkgeyByZXR1cm4gbm9leGNlcHQoVCgpKTsgfQogIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgY29uc3RleHByIGJvb2wgaXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdGlibGUoKSB7IHJldHVybiBub2V4Y2VwdChUKGRlY2x2YWw8VD4oKSkpOyB9CiAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICBjb25zdGV4cHIgYm9vbCBpc19ub3Rocm93X21vdmVfY29uc3RydWN0aWJsZSgpIHsgcmV0dXJuIG5vZXhjZXB0KFQoZGVjbHZhbDxhZGRfcnZhbHVlX3JlZmVyZW5jZTxUPj4oKSkpOyB9CiAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgWD4KICBjb25zdGV4cHIgYm9vbCBpc19ub3Rocm93X2Fzc2lnbmFibGUoKSB7IHJldHVybiBub2V4Y2VwdChkZWNsdmFsPFQ+KCkgPSBkZWNsdmFsPFg+KCkpOyB9CiAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgWD4KICBjb25zdGV4cHIgYm9vbCBpc19ub3Rocm93X2NvcHlfYXNzaWduYWJsZSgpIHsgcmV0dXJuIGlzX25vdGhyb3dfYXNzaWduYWJsZTxhZGRfbHZhbHVlX3JlZmVyZW5jZTxUPiwgY29uc3QgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8WD4+KCk7IH0KICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBYPgogIGNvbnN0ZXhwciBib29sIGlzX25vdGhyb3dfbW92ZV9hc3NpZ25hYmxlKCkgeyByZXR1cm4gaXNfbm90aHJvd19hc3NpZ25hYmxlPGFkZF9sdmFsdWVfcmVmZXJlbmNlPFQ+LCBhZGRfcnZhbHVlX3JlZmVyZW5jZTxYPj4oKTsgfQogIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgY29uc3RleHByIGJvb2wgaXNfbm90aHJvd19kZXN0cnVjdGlibGUoKSB7IHJldHVybiBub2V4Y2VwdChkZWNsdmFsPFQ+KCkuflQoKSk7IH0=