рдПрдХ рд╕рдлреЗрдж рдЭрдВрдбрд╛ рдкреЛрд╕реНрдЯ, рдпрд╛ рдореИрдВрдиреЗ рдЯреНрд░реИрдХрд░ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╕реЗ рдЖрдкрдХреЗ рд╡реАрдбрд┐рдпреЛ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЛ рдХреИрд╕реЗ рдмрдЪрд╛рдпрд╛

captain_barbossa.jpg

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рд╣рдореНрдо, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдорд┐рд▓ рдЪреБрдХреЗ рд╣реИрдВ ... рдЖрд╣, рд╣рд╛рдБред рдпрд╣рд╛рдВ рд╡рд╣ рдкреЛрд╕реНрдЯ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдордиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рддрдХ рд╕реАрдорд┐рдд рдХрд░реЗрдВ, рднреБрдЧрддрд╛рди рдХрд┐рдП рдЧрдП рд╡реАрдбрд┐рдпреЛ рдХреЗ рдмрдЬрд╛рдп рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╛рдЗрд▓реЗрдВ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ рдФрд░ рдЪреЛрд░реА рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдкрд╛рдареНрдпрдХреНрд░рдореЛрдВ рдХреЗ "рд╕рдВрд░рдХреНрд╖рдг" рдХрд╛ рдЖрдпреЛрдЬрди рдХрд░рддреЗ рд╕рдордп рд╣рд░ рд╕рдВрднрд╡ рддрд░реАрдХреЗ рд╕реЗ рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВред

рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдмрджрд▓реЗ рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд┐рдП рдмрд┐рдирд╛ рдЖрд▓реЛрдЪрдирд╛ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред "рдХреНрдпрд╛ рдЖрдк рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?" - рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рдЙрджреНрдЧрд╛рд░ рд╕реБрдирд╛рдИ рджрд┐рдПред "рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдХреЙрдореНрдкрд┐рдЯрд┐рдЯрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ, рдЕрдкрдиреЗ рдЙрддреНрдкрд╛рдж рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВ!" - рдореИрдВ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реВрдВред рдореЗрд▓рд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ ред рдмрд╣реБрдд рдХрдо рд╕реЗ рдХрдо, рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реАрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмрдЬрд╛рдп рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреБрдЯрд┐рд▓ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди


рдФрд░ рд╕рдорд╛рдзрд╛рди рд╕рдмрд╕реЗ рддреБрдЪреНрдЫ рд╣реИ, рджреЛрд╕реНрддреЛрдВ: рд╡реЙрдЯрд░рдорд╛рд░реНрдХред рд╣рд╛рдВ, рд╕рд┐рд░реНрдл рд╡реЙрдЯрд░рдорд╛рд░реНрдХред рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЬрдЯрд┐рд▓ рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╡реАрдбрд┐рдпреЛ рдЕрдиреБрдХреНрд░рдо "рд╕рд╛рдЗрди" рдХрд░реЗрдВред рдмрд╕ рдЗрддрдирд╛ рд╣реАред

рд░рдХреНрд╖рд╛рддреНрдордХ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдЯрд░рдорд╛рд░реНрдХ рдореЗрдВ рдХреМрди рд╕реЗ рдЧреБрдг рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП:

  1. рд╡реЙрдЯрд░рдорд╛рд░реНрдХ рдореЗрдВ рдРрд╕реА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╡реАрдбрд┐рдпреЛ рдХреЛрд░реНрд╕ рдЦрд░реАрджрдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рди рдХрд░рддреА рд╣реИред рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рд░реА рдХреА рдЧрдИ рдПрдХ рд╕рдХреНрд░рд┐рдпрдг рдХреБрдВрдЬреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рд▓реЙрдЧрд┐рди рд╡реАрдбрд┐рдпреЛ рдХреЛрд░реНрд╕ рдЦрд░реАрдж рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рд╕рдордп рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреА рдЦрд░реАрдж рдХреЗ рд╕рдордп рдХреЗ рдЕрдиреБрд░реВрдк рд╕рдордп (рдмреЗрд╢рдХ, рдпрджрд┐ рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЦрд░реАрджрд╛рд░ рдХреА рдкрд╣рдЪрд╛рди рдХреЗ рд╕рд╛рде рдЙрдиреНрд╣реЗрдВ рд╕рд╣рд╕рдВрдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ), рдпрд╛ рдЗрд╕ рдУрдкреЗрд░рд╛ рд╕реЗ рдХреБрдЫ рднреАред
  2. рд╡реЙрдЯрд░рдорд╛рд░реНрдХ рдХреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдлреНрд░реЗрдо рдХреЛ рдХрд╡рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд╡реАрдбрд┐рдпреЛ рдХреЛрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рдХрд╛рдЯ рди рд╕рдХреЗрдВред
  3. рд╡реЙрдЯрд░рдорд╛рд░реНрдХ рдУрд╡рд░рд▓реЗ рдпреЛрдЬрдирд╛ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддрд┐ рдХреЗ рд▓рд┐рдП рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЦрд▓рдирд╛рдпрдХ рдЙрд╕реА рд╡реЙрдЯрд░рдорд╛рд░реНрдХ рдХреЛ рдХрд╛рдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдорд╢реАрди рди рд▓рд┐рдЦреЗред

рдпрджрд┐ рдЖрдк рд╡реЙрдЯрд░рдорд╛рд░реНрдХ рдХреЛ рдмрд╣реБрдд рдкрд╛рд░рджрд░реНрд╢реА рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░реЗрдЧреА, рд▓реЗрдХрд┐рди рднреБрдЧрддрд╛рди рдХреЗ рджреМрд░рд╛рди рдкрд╛рдареНрдпрдХреНрд░рдо рд╡рд┐рд╡рд░рдг рдореЗрдВ рдпрд╣ рдЕрднреА рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЦреБрд▓рд╛рд╕рд╛ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдореБрджреНрд░реА рдбрд╛рдХреВ рдХреЛ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

  1. рдкреВрд░реЗ рд╡реЙрдЯрд░рдорд╛рд░реНрдХ рдХреЛ рдХрд╛рдЯреЗрдВ (рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рджреВрд╕рд░реА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╡реЙрдЯрд░рдорд╛рд░реНрдХ рдХреЛ рдкреВрд░реА рд╕реНрдХреНрд░реАрди рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдорд┐рдЯрд╛рдП рдЬрд╛рдиреЗ рдкрд░ рднреА рдЕрдкрдиреЗ рд╕реБрд░рдХреНрд╖рд╛рддреНрдордХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП), рдЬрд┐рд╕рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдХреНрд▓рд┐рдк рдХреЛ рдЕрдорд╛рдиреНрдп рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдП (рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрдм рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ рд╡реАрдбрд┐рдпреЛ, рд╡реАрдбрд┐рдпреЛ рдХрд╛ рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ)ред
  2. рд╡реАрдбрд┐рдпреЛ рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдиреБрдХрд╕рд╛рди рдкрд╣реБрдВрдЪрд╛рдП рдмрд┐рдирд╛ рд╡реЙрдЯрд░рдорд╛рд░реНрдХ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВред рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдЦрд░реЛрдВрдЪ рд╕реЗ рдПрдХ рд╡реАрдбрд┐рдпреЛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдФрд░ 3 рдЬреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдШреБрд╕рдкреИрдард┐рдП рдХреЗ рдкрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
  3. (?) рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ, рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ, рдЖрдк рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рд╣реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкреНрд░рдорд╛рдг


рдЖрдзреЗ рдШрдВрдЯреЗ рдореЗрдВ, 100 рд▓рд╛рдЗрдиреЛрдВ рдХреА рдПрдХ рддреБрдЪреНрдЫ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрдХрд▓рд┐рдд рдХреА рдЧрдИ рдереА, рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрд░рдХреНрд╖рдг рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕рд╛рджрдЧреА рдФрд░ рдкрд╣реБрдВрдЪ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреА рд╣реИред рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рджреЗрддрд╛ рд╣реВрдВ : рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдореИрдВ рдХрд┐рддрдирд╛ рд╕реНрдорд╛рд░реНрдЯ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдЬреЛ рдЫрд╡рд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ, рдЖрдзреЗ рдШрдВрдЯреЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб (рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рддрд╣рдд) рдХреА рд░рдЪрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рдпрд╣ рдХрд┐рддрдирд╛ рд╕рд░рд▓ рд╣реИ:

fckInfoprotectorV2.py
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Usage: python3 fckInfoprotectorV2.py import os from shutil import rmtree import numpy as np import cv2 class VideoSigner: def __init__(self, video, watermark): os.makedirs('original') os.makedirs('watermarked') self.vidin = cv2.VideoCapture(video) self.fps = self.vidin.get(cv2.CAP_PROP_FPS) self.frame_size = ( int(self.vidin.get(cv2.CAP_PROP_FRAME_WIDTH)), int(self.vidin.get(cv2.CAP_PROP_FRAME_HEIGHT)) ) self.watermark = cv2.imread(watermark, cv2.IMREAD_UNCHANGED) self.wH, self.wW = self.watermark.shape[:2] B, G, R, A = cv2.split(self.watermark) B = cv2.bitwise_and(B, B, mask=A) G = cv2.bitwise_and(G, G, mask=A) R = cv2.bitwise_and(R, R, mask=A) self.watermark = cv2.merge([B, G, R, A]) def __del__(self): rmtree('original') rmtree('watermarked') def _split(self): print('[*] Splitting video by frames... ', end='', flush=True) (success, image), count = self.vidin.read(), 0 while success: path = os.path.join('original', f'{count}.jpg') cv2.imwrite(path, image) success, image = self.vidin.read() count += 1 print('Done') def _watermark(self): print('[*] Signing each frame... ', end='', flush=True) for image_name in sorted( os.listdir('original'), key=lambda x: int(x.split('.')[0]) ): image_path = os.path.join('original', image_name) image = cv2.imread(image_path) h, w = image.shape[:2] image = np.dstack([ image, np.ones((h, w), dtype='uint8') * 255 ]) overlay = np.zeros((h, w, 4), dtype='uint8') half_h_diff = (h - self.wH) // 2 half_w_diff = (w - self.wW) // 2 overlay[half_h_diff:half_h_diff + self.wH, half_w_diff:half_w_diff + self.wW] = self.watermark output = image.copy() cv2.addWeighted(overlay, 0.25, output, 1.0, 0, output) path = os.path.join('watermarked', image_name) cv2.imwrite(path, output) print('Done') def _merge(self): print('[*] Merging signed frames... ', end='', flush=True) self.vidout = cv2.VideoWriter( 'signed.avi', cv2.VideoWriter_fourcc(*'XVID'), fps=self.fps, frameSize=self.frame_size ) for image_name in sorted( os.listdir('watermarked'), key=lambda x: int(x.split('.')[0]) ): image_path = os.path.join('watermarked', image_name) image = cv2.imread(image_path) self.vidout.write(image) print('Done') def sign(self): self._split() self._watermark() self._merge() if __name__ == '__main__': signer = VideoSigner('SampleVideo_1280x720_1mb.mp4', 'watermark.png') signer.sign() 


рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкрд░рд┐рдгрд╛рдо, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ:

sample_original.gif

sample_signed.gif


рдкреНрд░рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХреЗрд╡рд▓ рдЖрдо рдЕрдЪреНрдЫреЗ рдХреЗ рд▓рд┐рдПред

рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдореНрдорд╛рди рд╣реИред

Source: https://habr.com/ru/post/hi450344/


All Articles