рдкрд┐рдЫрд▓реА рдмрд╛рд░ , рд╣рдордиреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП SFINAE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдХрд┐ рдХреНрдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ, рдФрд░ рд╣рдордиреЗ рдЗрд╕реЗ
if constexpr
рдФрд░ рдЬреЗрдиреЗрд░рд┐рдХ рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреЛрдб рдЯрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗ рдпрджрд┐ рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ, рдЬрдмрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдЕрднреА рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ (рдФрд░ рддреНрдпрд╛рдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛) рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:
- рд╣рд░ рдмрд╛рд░ рдЖрдкрдХреЛ рдПрдХ
struct
рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред - рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдЬрдм рдЖрдк рдЗрд╕реЗ рдПрдХ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрддрдорд╛рди рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ рдЙрд╕ рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред
- рдЖрдкрдХреЛ рдПрдХ рдЕрдпреЛрдЧреНрдп рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ
struct
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ред
рд╣рдо рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рд╕рднреА рддреАрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдкрд╣рд▓реЗ рд╡рд╛рдВрдЫрд┐рдд рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВред

рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдРрд╕рд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдПрдХ
struct
рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
call_if_defined
рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдирдИ рдШреЛрд╖рдгрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╣реА рдШреЛрд╖рд┐рдд рд╣реЛ рдЪреБрдХрд╛ рд╣реИред рдФрд░ рдЬрдм рд╕реЗ рдЙрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЖрдк рдЙрд╕реЗ рдЙрд╕рдХреЗ рдЕрдпреЛрдЧреНрдп рдирд╛рдо, рдЙрд╕рдХреЗ рдкреВрд░реНрдг рдирд╛рдо рд╕реНрдерд╛рди рдпрд╛ рдмреАрдЪ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдо рдпрд╛ рдПрдХ рдЖрд╢реНрд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА (рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╡реЗ рдмреАрдЪ рдирд╣реАрдВ рд╣реИрдВ)ред
namespace app { void foo() { call_if_defined<awesome::special>([&](auto* p) {
рдЬреЛ рд▓реЛрдЧ рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рд▓реЗрдЦреЛрдВ рдХреА рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐
call_if_defined
рдкрджреНрдзрддрд┐ рдЙрд╕ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреА рд╣реИ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдерд╛ред рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдкрд░ рд╣реА рд▓реИрдореНрдмрдбрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред
рдЖрдЗрдП рдХрд░реАрдм рд╕реЗ рджреЗрдЦреЗрдВ:
template<typename... T, typename TLambda> void call_if_defined(TLambda&& lambda) { if constexpr ((... && is_complete_type_v<T>)) { lambda(static_cast<T*>(nullptr)...); } }
рдпрджрд┐ рдХреЛрд╖реНрдардХ (...) рдореЗрдВ рдбрдмрд▓ рдХреЛрд╖реНрдардХ рдЕрдЬреАрдм рд▓рдЧрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдмрд╛рд╣рд░реА рдХреЛрд╖реНрдардХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛
if constexpr
рджреНрд╡рд╛рд░рд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЖрдиреНрддрд░рд┐рдХ рдХреЛрд╖реНрдардХ
рдПрдХ рдХрдирд╡рд▓реНрд╢рди рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреЗ рд╣реИрдВред рд╕рдЬрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ
if constexpr ( (is_complete_type_v<T1> && is_complete_type_v<T2> && ... is_complete_type_v<Tn>))
рд▓реИрдореНрдмреНрдбрд╛ рдХреЙрд▓
рдкреИрд░рд╛рдореАрдЯрд░ рдкреИрдХреЗрдЬ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
lambda(static_cast<T*>(nullptr)...);
рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛрддрд╛ рд╣реИ
lambda(static_cast<T1*>(nullptr), static_cast<T2*>(nullptr), ..., static_cast<Tn*>(nullptr));
рдЬрд╣рд╛рдВ
static_cast<T*>(nullptr)
рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рджреЛрд╣рд░рд╛рдпрд╛
static_cast<T*>(nullptr)
ред
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реИрдореНрдмрдбрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВ:
void foo(Source const& source) { call_if_defined<special, magic>( [&](auto* p1, auto* p2) { using special = std::decay_t<decltype(*p1)>; using magic = std::decay_t<decltype(*p2)>; auto s = source.try_get<special>(); if (s) magic::add_magic(s); }); }
C ++ 20 рдЖрдкрдХреЛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
void foo(Source const& source) { call_if_defined<special, magic>( [&]<typename special, typename magic> (special*, magic*) { auto s = source.try_get<special>(); if (s) magic::add_magic(s); }); }
рдЬреЛ рдЖрдкрдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ
std::decay_t
рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реБрдП рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ
std::decay_t
ред
рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЗрд╕реЗ рдПрдХ рд╕реНрдкреНрд░рд┐рдВрдЧрдмреЛрд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╕рд░реНрдХрд┐рдЯ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рдиреЛрдЯ : рдпрд╣ рд▓реЗрдЦреЛрдВ рдХреА рдореБрдЦреНрдп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЪреМрдерд╛ рднрд╛рдЧ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдЕрдиреНрдп рднрд╛рдЧ (
1 ,
2 ,
3 ,
5 ) рд╣реИрдВред рдЕрдзреАрд░ рдХреЗ рд▓рд┐рдП: рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
template<typename, typename = void> constexpr bool is_type_complete_v = false; template<typename T> constexpr bool is_type_complete_v <T, std::void_t<decltype(sizeof(T))>> = true; template<typename... T, typename TLambda> void call_if_defined(TLambda&& lambda) { if constexpr ((... && is_complete_type_v<T>)) { lambda(static_cast<T*>(nullptr)...); } }
рд╡реИрд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рд╣реИ
рдПрдХ рджрд╢рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд╕реЗ,
рд╣реЙрдХ рдЧреЗрдо рдХреЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ 3 рдбреА рдореЗрдВ рдирд╡рд╛рдЪрд╛рд░ рдореЗрдВ рд╕рдмрд╕реЗ рдЖрдЧреЗ рд╣реИред рдЕрдиреБрднреВрддрд┐ рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, HoloLens рдЯреАрдо, рдЕрдм рд╣рдо рдЗрд╕ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдФрд░ Azure рдХреНрд▓рд╛рдЙрдб рдХреА рд╢рдХреНрддрд┐ рдХреЛ рдорд┐рд▓рд╛рдХрд░ рдХрдИ рд░реЛрдорд╛рдВрдЪрдХ рдирдИ рдорд┐рд╢реНрд░рд┐рдд-рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рд╕реЗрд╡рд╛рдПрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдШреЛрд╖рд┐рдд рдПрдЬрд╝реБрд░ рд░рд┐рдореЛрдЯ рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕реЗрд╡рд╛ рд╣реИред рд╣рдо рдПрдЖрд░, рд╡реАрдЖрд░ рдФрд░ рдХреНрд▓рд╛рдЙрдб рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднрд╛рд╡реБрдХ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдорд┐рд╢реНрд░рд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд╡реАрди рдкреНрд░рдерд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рд╣реЙрдХ рдореЗрдВ рдиреМрдХрд░рд┐рдпрд╛рдВ:- рдЖрдк рдкреНрд░рддрд┐рднрд╛рд╢рд╛рд▓реА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд╕рд╛рде рдЫреЛрдЯреА рдЯреАрдореЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ
- рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдирдИ рддрдХрдиреАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реЛрдЧрд╛ред
- рдЖрдк рдмрдбрд╝реА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓ рддрдХрдиреАрдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╕реБрд▓рдЭрд╛рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ
- рдЖрдк рджреБрдирд┐рдпрд╛ рднрд░ рдХреА рд╢рд╛рдВрдд рдЯреАрдореЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╣рдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдХрд░реНрддрд╡реНрдпреЛрдВ
- рдЙрдЪреНрдЪ-рдЧреБрдгрд╡рддреНрддрд╛, рдХреБрд╢рд▓ рдФрд░ рд╕реНрд╡рдЪреНрдЫ рдмрд╣реБ-рдордВрдЪ C ++ рдХреЛрдб рдХрд╛ рдбрд┐рдЬрд╛рдЗрди, рд╡рд┐рдХрд╛рд╕ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ
- рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реНрдХреЗрд▓реЗрдмрд▓ рдПрдЬрд╝реНрдпреЛрд░ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд░реЗрдВ
- рдЙрддреНрдкрд╛рдж рд╡рд┐рдХрд╛рд╕ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рдФрд░ рдмрд╛рд╣рд░реА рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдХрд░реЗрдВ
рдпреЛрдЧреНрдпрддрд╛
- C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░ рдбреАрдмрдЧрд┐рдВрдЧ рдХреМрд╢рд▓
- рдПрдХ рдХреЙрдорди рдХреЛрдб рд╡рд╛рд▓реА рдЯреАрдо рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛
- рдХреНрд▓рд╛рдЙрдб рдФрд░ рд╡рд┐рддрд░рд┐рдд рд╕реЗрд╡рд╛ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╡ (рдЙрджрд╛ред Azure рдмреИрдЪ, Azure Blob Storage, Docker, Telemetry)
рдПрдХ рдкреНрд▓рд╕ рд╣реЛрдЧрд╛
- C #, ASP.Net, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛
- рдПрдХрддрд╛, рдЕрд╡рд╛рд╕реНрддрд╡рд┐рдХ рдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдЦреЗрд▓ рдЗрдВрдЬрди
- рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡ 3 рдбреА, рдПрдЖрд░ рдпрд╛ рд╡реАрдЖрд░ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░реЗрдВ
- рдиреЗрдЯрд╡рд░реНрдХ рдФрд░ рд╕рд░реНрд╡рд░ рд╕реЗрд╡рд╛рдПрдВ
- рдкреНрд░рджрд░реНрд╢рди рдЕрдиреБрдХреВрд▓рди
рдЖрдк рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдФрд░
рдпрд╣рд╛рдВ рдпрд╛
рд▓рд┐рдВрдХреНрдбрдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдирд╛ рдЖрд╡реЗрджрди рдЬрдорд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред