рдХреЛрдЯрд▓рд┐рди рдкрд░ рдЪреЛрдХ рдиреЙрд░рд┐рд╕ рдлреИрдХреНрдЯреНрд╕ рдПрдВрдбреНрд░реЙрдЗрдб рдРрдк

рдХреЛрдЯрд▓рд┐рди рдкрд░ рдЪреЛрдХ рдиреЙрд░рд┐рд╕ рдлреИрдХреНрдЯреНрд╕ рдПрдВрдбреНрд░реЙрдЗрдб рдРрдк


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


рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ, рд╣рдо рдХреЛрдЯрд▓рд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрдХ рдиреЙрд░рд┐рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрдереНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВрдЧреЗред IDE рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо Android Studio рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде, рдЖрдк рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдЯрд▓рд┐рди рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХреИрд╕реЗ рдХрд░реЗрдВ рдФрд░ OkHttp 3 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред


рдЪрдХ рдиреЙрд░рд┐рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрдереНрдпреЛрдВ рдХреЗ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рддрдереНрдп рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдЬреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рддрдереНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред


OkHttp рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВ


рдиреЗрдЯрд╡рд░реНрдХ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо OkHttp рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреА build.gradle рдлрд╝рд╛рдЗрд▓ рдореЗрдВ OkHttp 3.10 рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 27 defaultConfig { applicationId "com.ssaurel.chucknorrisfacts" minSdkVersion 15 targetSdkVersion 27 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support.constraint:constraint-layout:1.1.2' implementation 'com.squareup.okhttp3:okhttp:3.10.0' } 

Android рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдиреЗрдЯрд╡рд░реНрдХ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП INTERNET рдЕрдиреБрдорддрд┐ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:


 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.ssaurel.chucknorrisfacts"> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд┐рд░реНрдорд╛рдг


рдЕрдЧрд▓рд╛ рдЪрд░рдг рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдирд╛ рд╣реИред рд╣рдо ConstraintLayout рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЗрдЖрдЙрдЯ рдХреЗ рдореВрд▓ рдШрдЯрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░реЗрдВрдЧреЗред


рд╣рдорд╛рд░реЗ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╕рдмрд╕реЗ рдКрдкрд░ рдПрдХ ImageView рдЬрд┐рд╕рдореЗрдВ рдЪрдХ рдиреЙрд░рд┐рд╕ рдХрд╛ рдЪреЗрд╣рд░рд╛ рд╣реЛрдЧрд╛:


рдЪрдХ рдиреЛрд░рд┐рд╕


рдлрд┐рд░ рд╣рдо рдПрдХ TextView рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЪрдХ рдиреЙрд░рд┐рд╕ рдХреЗ рддрдереНрдп рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗред TextView рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ ImageView рдареАрдХ рдиреАрдЪреЗ рд╕реНрдерд┐рдд рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдПрдХ рдмрдЯрди рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдирдпрд╛ рддрдереНрдп рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдЕрдВрдд рдореЗрдВ, ProgressBar рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрдЧрд╛ред


рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЖрдЙрдЯ рдорд┐рд▓рддрд╛ рд╣реИ:


 <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFFF" tools:context=".MainActivity"> <ImageView android:id="@+id/imageView" android:layout_width="200dp" android:layout_height="200dp" android:layout_marginEnd="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginStart="8dp" android:layout_marginTop="30dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/chucknorris" /> <TextView android:id="@+id/factTv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginStart="8dp" android:layout_marginTop="30dp" android:text="Chuck Norris Fact" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/imageView" android:textSize="20sp" android:paddingLeft="30dp" android:paddingRight="30dp" android:gravity="center_horizontal"/> <Button android:id="@+id/nextBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="30dp" android:layout_marginEnd="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginStart="8dp" android:text="Next" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> <ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="8dp" android:layout_marginEnd="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginStart="8dp" android:layout_marginTop="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" android:visibility="gone"/> </android.support.constraint.ConstraintLayout> 

рдПрдкреАрдЖрдИ рдкрд░реАрдХреНрд╖рдг


MainActivity рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ MainActivity рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ API рджреНрд╡рд╛рд░рд╛ рджреА рдЧрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрддреЗ рдкрд░ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдВрдЧреЗ: https://api.icndb.com/jokes/random ред


рдпрд╣ рд╡реЗрдм рд╕реЗрд╡рд╛ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рд╣рд░ рдХреЙрд▓ рдкрд░ рдЪрдХ рдиреЙрд░рд┐рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдирдпрд╛ рддрдереНрдп рджреЗрддреА рд╣реИред URL рдХреЛ рдПрдХ рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рджрд░реНрдЬ рдХрд░рдХреЗ, рдЖрдкрдХреЛ рдирд┐рдореНрди рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓реЗрдЧрд╛:


рдПрдкреАрдЖрдИ рдХреЙрд▓ рдкрд░рд┐рдгрд╛рдо


рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдордЬрд╛рдХ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП JSON рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕рдореЗрдВ рд╡рд╣ рддрдереНрдп рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


MainActivity рдХреЗ рд▓рд┐рдП рдХреЛрдЯрд▓рд┐рди рдХреЛрдб рд▓рд┐рдЦрдирд╛


рдЕрдм MainActivity рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп MainActivity ред рд╣рдо рдПрдХ рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдПрдкреАрдЖрдИ рдПрдВрдбрдкреЙрдЗрдВрдЯ URL рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рдХреЙрд▓ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рддрдм рд╣рдо OkHttpClient рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ OkHttpClient ред


onCreate MainActivity рдореЗрдердб рдореЗрдВ, рд╣рдореЗрдВ рдмрд╕ OnClickListener рдХреЛ рдПрдХ рдмрдЯрди рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЪрдХ рдиреЙрд░рд┐рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирдП рддрдереНрдпреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рдПрдкреАрдЖрдИ рд╡рд┐рд╢реЗрд╖ loadRandomFact рд╡рд┐рдзрд┐ рдореЗрдВ loadRandomFact рд╣реИред рд╣рдо рдиреЗрдЯрд╡рд░реНрдХ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ ProgressBar рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ URL рдХреЗ рд╕рд╛рде рдПрдХ Request рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВред


рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо newCall рдкрд░ OkHttpClient рдХреЙрд▓ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, Request рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ Callback рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде enqueue рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред


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


рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА MainActivity рд▓рд┐рдП рдирд┐рдореНрди рдХреЛрдб рдорд┐рд▓рддрд╛ рд╣реИ:


 package com.ssaurel.chucknorrisfacts import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.text.Html import android.view.View import kotlinx.android.synthetic.main.activity_main.* import okhttp3.* import org.json.JSONObject import java.io.IOException class MainActivity : AppCompatActivity() { val URL = "https://api.icndb.com/jokes/random" var okHttpClient: OkHttpClient = OkHttpClient() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) nextBtn.setOnClickListener { loadRandomFact() } } private fun loadRandomFact() { runOnUiThread { progressBar.visibility = View.VISIBLE } val request: Request = Request.Builder().url(URL).build() okHttpClient.newCall(request).enqueue(object: Callback { override fun onFailure(call: Call?, e: IOException?) { } override fun onResponse(call: Call?, response: Response?) { val json = response?.body()?.string() val txt = (JSONObject(json).getJSONObject("value").get("joke")).toString() runOnUiThread { progressBar.visibility = View.GONE factTv.text = Html.fromHtml(txt) } } }) } } 

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ


рдкрд╛рда рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣рд┐рд╕реНрд╕рд╛ред рдЬрдм рдЖрдк рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓реЗрдЧрд╛:


рддреИрдпрд╛рд░ рдЖрд╡реЗрджрди

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


All Articles