diff --git a/.github/ISSUE_TEMPLATE/BUG_REPORT.yml b/.github/ISSUE_TEMPLATE/BUG_REPORT.yml index 1f38088e6..86ebca997 100644 --- a/.github/ISSUE_TEMPLATE/BUG_REPORT.yml +++ b/.github/ISSUE_TEMPLATE/BUG_REPORT.yml @@ -34,7 +34,7 @@ body: label: Operating system description: > Your operating system name, version and desktop environment. - Please don't use kernel version (uname), it's useless. + **Don't use kernel version (uname), it's useless.** validations: required: true - type: input @@ -42,9 +42,9 @@ body: label: Version of Kotatogram Desktop description: > Please note we don't support versions from Linux distro repositories. - If you need support for these versions, please contact your distro maintainer + If you need support for these versions, **please contact your distro maintainer** or your distro bugtracker. - Don't use 'latest', specify actual version, that's a reason to close your issue. + **Don't use 'latest'**, specify actual version, **that's a reason to close your issue**. validations: required: true - type: dropdown @@ -60,8 +60,19 @@ body: - Other (unofficial) source validations: required: true + - type: input + attributes: + label: Crash ID + description: > + If you're reporting a crash, please enter the crash ID from the crash reporter + opening on the next launch after crash. **You have to enable beta versions + installation in Settings -> Advanced for the reporter to appear.** + You don't have to wait for a beta version to arrive. - type: textarea attributes: label: Logs + description: > + You can find log.txt using the `viewlogs` + [cheat code](https://github.com/telegramdesktop/tdesktop/wiki/Cheat-Codes). placeholder: Insert log.txt here (if necessary) render: shell diff --git a/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.yml b/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.yml index c12d84206..2327e1305 100644 --- a/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.yml +++ b/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.yml @@ -2,7 +2,6 @@ name: Feature request description: Suggest an idea. labels: [enhancement] -title: "[Feature Request] " body: - type: textarea attributes: diff --git a/.github/ISSUE_TEMPLATE/QUESTION.md b/.github/ISSUE_TEMPLATE/QUESTION.md deleted file mode 100644 index ffd57814a..000000000 --- a/.github/ISSUE_TEMPLATE/QUESTION.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -name: Question -about: Ask a question. -title: "[Question] " -labels: 'question' -assignees: '' - ---- diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..f73fc436f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,11 @@ +blank_issues_enabled: false +contact_links: + - name: Platform-wide issue + url: https://bugs.telegram.org + about: Any bug report or feature request affecting more than only Telegram Desktop. + - name: Issue of other client + url: https://bugs.telegram.org + about: Any bug report or feature request not about Telegram Desktop. + - name: Question + url: https://t.me/TelegramDesktopTalk + about: Ask a question. diff --git a/.github/stale.yml b/.github/stale.yml deleted file mode 100644 index 40a568cf2..000000000 --- a/.github/stale.yml +++ /dev/null @@ -1,21 +0,0 @@ -# Number of days of inactivity before an issue becomes stale -daysUntilStale: 180 -# Number of days of inactivity before a stale issue is closed -daysUntilClose: 30 -# Issues with these labels will never be considered stale -exemptLabels: [ "enhancement" ] -# Label to use when marking an issue as stale -staleLabel: stale -# Comment to post when marking an issue as stale. Set to `false` to disable -markComment: | - Hey there! - - This issue was inactive for a long time and will be automatically closed in 30 days if there isn't any further activity. We therefore assume that the user has lost interest or resolved the problem on their own. - - Don't worry though; if this is an error, let us know with a comment and we'll be happy to reopen the issue. - - Thanks! -# Comment to post when closing a stale issue. Set to `false` to disable -closeComment: false -# Process only issues -only: issues diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index dc456da5c..7a65b483f 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -15,11 +15,30 @@ jobs: name: Ubuntu runs-on: ubuntu-latest + env: + IMAGE_TAG: ghcr.io/${{ github.repository }}/centos_env:latest + steps: - name: Clone. - uses: actions/checkout@v2 + uses: actions/checkout@v3.1.0 with: submodules: recursive + - name: First set up. + run: | + sudo apt update + curl -sSL https://install.python-poetry.org | python3 - + echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u $ --password-stdin + + - name: Free up some disk space. + uses: jlumbroso/free-disk-space@f68fdb76e2ea636224182cfb7377ff9a1708f9b8 + - name: Docker image build. - run: docker build -t telegram_desktop Telegram/build/docker/centos_env + run: | + cd Telegram/build/docker/centos_env + poetry install + DEBUG= LTO= poetry run gen_dockerfile | DOCKER_BUILDKIT=1 docker build -t $IMAGE_TAG - + + - name: Push the Docker image. + if: ${{ github.ref_name == github.event.repository.default_branch }} + run: docker push $IMAGE_TAG diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 92ab91271..705d6538a 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -5,7 +5,6 @@ on: paths-ignore: - 'docs/**' - '**.md' - - '!docs/building-linux.md' - 'kotatogram_changes.txt' - 'changelog.txt' - 'LEGAL' @@ -25,7 +24,6 @@ on: paths-ignore: - 'docs/**' - '**.md' - - '!docs/building-linux.md' - 'kotatogram_changes.txt' - 'changelog.txt' - 'LEGAL' @@ -45,28 +43,18 @@ on: jobs: linux: - name: CentOS 7 + name: Rocky Linux 8 if: > !(github.event_name == 'push' && contains(github.event.head_commit.message, '[skip ci]')) && !(github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name) runs-on: ubuntu-latest - container: - image: docker.pkg.github.com/kotatogram/kotatogram-desktop/centos_env - credentials: - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - defaults: - run: - shell: scl enable llvm-toolset-7.0 -- scl enable devtoolset-10 -- bash --noprofile --norc -eo pipefail {0} strategy: matrix: defines: - "" - #- "DESKTOP_APP_DISABLE_DBUS_INTEGRATION" #- "DESKTOP_APP_DISABLE_X11_INTEGRATION" #- "DESKTOP_APP_DISABLE_WAYLAND_INTEGRATION" @@ -78,19 +66,20 @@ jobs: run: echo "REPO_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV - name: Clone. - uses: actions/checkout@v2 + uses: actions/checkout@v3.1.0 with: submodules: recursive path: ${{ env.REPO_NAME }} - name: First set up. run: | - gcc --version - ln -s $LibrariesPath Libraries + echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u $ --password-stdin + docker pull ghcr.io/$GITHUB_REPOSITORY/centos_env + docker tag ghcr.io/$GITHUB_REPOSITORY/centos_env tdesktop:centos_env - name: Kotatogram Desktop build. run: | - cd $REPO_NAME/Telegram + cd $REPO_NAME DEFINE="" if [ -n "${{ matrix.defines }}" ]; then @@ -101,17 +90,21 @@ jobs: echo "ARTIFACT_NAME=Kotatogram" >> $GITHUB_ENV fi - ./configure.sh \ + docker run --rm \ + -v $PWD:/usr/src/tdesktop \ + -e CONFIG=Debug \ + tdesktop:centos_env \ + /usr/src/tdesktop/Telegram/build/docker/centos_env/build.sh \ + -D CMAKE_C_FLAGS_DEBUG="" \ + -D CMAKE_CXX_FLAGS_DEBUG="" \ -D CMAKE_C_FLAGS="-Werror" \ -D CMAKE_CXX_FLAGS="-Werror" \ -D CMAKE_EXE_LINKER_FLAGS="-s" \ -D TDESKTOP_API_TEST=ON \ - -D DESKTOP_APP_USE_PACKAGED=OFF \ + -D DESKTOP_APP_DISABLE_AUTOUPDATE=OFF \ -D DESKTOP_APP_DISABLE_CRASH_REPORTS=OFF \ $DEFINE - cmake --build ../out --config Debug --parallel - - name: Check. run: | filePath="$REPO_NAME/out/Debug/Kotatogram" @@ -130,7 +123,7 @@ jobs: run: | cd $REPO_NAME/out/Debug mkdir artifact - mv Kotatogram artifact/ + mv {Kotatogram,Updater} artifact/ - uses: actions/upload-artifact@master if: env.UPLOAD_ARTIFACT == 'true' name: Upload artifact. diff --git a/.github/workflows/mac-kotato.yml b/.github/workflows/mac-kotato.yml deleted file mode 100644 index 4d8e75510..000000000 --- a/.github/workflows/mac-kotato.yml +++ /dev/null @@ -1,179 +0,0 @@ -name: MacOS Kotato. - -on: - push: - paths-ignore: - - 'docs/**' - - '**.md' - - 'kotatogram_changes.txt' - - 'changelog.txt' - - 'LEGAL' - - 'LICENSE' - - '.github/**' - - '!.github/workflows/mac-kotato.yml' - - 'lib/xdg/**' - - 'snap/**' - - 'Telegram/build/**' - - 'Telegram/Patches/**' - - 'Telegram/Resources/uwp/**' - - 'Telegram/Resources/winrc/**' - - 'Telegram/SourceFiles/platform/win/**' - - 'Telegram/SourceFiles/platform/linux/**' - - 'Telegram/configure.bat' - pull_request: - paths-ignore: - - 'docs/**' - - '**.md' - - 'kotatogram_changes.txt' - - 'changelog.txt' - - 'LEGAL' - - 'LICENSE' - - '.github/**' - - '!.github/workflows/mac-kotato.yml' - - 'lib/xdg/**' - - 'snap/**' - - 'Telegram/build/**' - - 'Telegram/Patches/**' - - 'Telegram/Resources/uwp/**' - - 'Telegram/Resources/winrc/**' - - 'Telegram/SourceFiles/platform/win/**' - - 'Telegram/SourceFiles/platform/linux/**' - - 'Telegram/configure.bat' - -jobs: - - macos: - name: MacOS - if: > - !(github.event_name == 'push' - && contains(github.event.head_commit.message, '[skip ci]')) - && !(github.event_name == 'pull_request' - && github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name) - runs-on: macos-latest - - strategy: - matrix: - defines: - - "" - - env: - GIT: "https://github.com" - OPENALDIR: /usr/local/opt/openal-soft - OPENSSL_ROOT_DIR: /usr/local/opt/openssl@1.1 - PKG_CONFIG_PATH: /usr/local/opt/ffmpeg@4/lib/pkgconfig - UPLOAD_ARTIFACT: "false" - ONLY_CACHE: "false" - MANUAL_CACHING: "1" - AUTO_CACHING: "1" - - steps: - - name: Get repository name. - run: echo "REPO_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV - - - name: Clone. - uses: actions/checkout@v2 - with: - submodules: recursive - path: ${{ env.REPO_NAME }} - - - name: First set up. - run: | - brew install autoconf automake cmake ffmpeg@4 openal-soft openssl@1.1 opus ninja pkg-config python qt yasm xz - sudo xcode-select -s /Applications/Xcode.app/Contents/Developer - - xcodebuild -version > CACHE_KEY.txt - echo $MANUAL_CACHING >> CACHE_KEY.txt - echo "$GITHUB_WORKSPACE" >> CACHE_KEY.txt - if [ "$AUTO_CACHING" = "1" ]; then - thisFile=$REPO_NAME/.github/workflows/mac-kotato.yml - echo `md5 -q $thisFile` >> CACHE_KEY.txt - fi - echo "CACHE_KEY=`md5 -q CACHE_KEY.txt`" >> $GITHUB_ENV - - mkdir -p Libraries/macos - cd Libraries/macos - echo "LibrariesPath=`pwd`" >> $GITHUB_ENV - - curl -o tg_owt-version.json https://api.github.com/repos/desktop-app/tg_owt/git/refs/heads/master - - - name: Rnnoise. - run: | - cd $LibrariesPath - - git clone --depth=1 https://gitlab.xiph.org/xiph/rnnoise.git - cd rnnoise - ./autogen.sh - ./configure --disable-examples --disable-doc - make -j$(sysctl -n hw.logicalcpu) - make install - - - name: WebRTC cache. - id: cache-webrtc - uses: actions/cache@v2 - with: - path: ${{ env.LibrariesPath }}/tg_owt - key: ${{ runner.OS }}-webrtc-${{ env.CACHE_KEY }}-${{ hashFiles('**/tg_owt-version.json') }} - - name: WebRTC. - if: steps.cache-webrtc.outputs.cache-hit != 'true' - run: | - cd $LibrariesPath - - git clone --recursive --depth=1 $GIT/desktop-app/tg_owt.git - cd tg_owt - - cmake -B build . \ - -GNinja \ - -DCMAKE_BUILD_TYPE=Debug \ - -DBUILD_SHARED_LIBS=OFF \ - -DTG_OWT_BUILD_AUDIO_BACKENDS=OFF - - cmake --build build --parallel - - - name: Kotatogram Desktop build. - if: env.ONLY_CACHE == 'false' - env: - tg_owt_DIR: ${{ env.LibrariesPath }}/tg_owt/build - run: | - cd $REPO_NAME - - DEFINE="" - if [ -n "${{ matrix.defines }}" ]; then - DEFINE="-D ${{ matrix.defines }}=ON" - echo Define from matrix: $DEFINE - echo "ARTIFACT_NAME=Kotatogram_${{ matrix.defines }}" >> $GITHUB_ENV - else - echo "ARTIFACT_NAME=Kotatogram" >> $GITHUB_ENV - fi - - cmake -Bbuild -GNinja . \ - -DCMAKE_BUILD_TYPE=Debug \ - -DCMAKE_FIND_FRAMEWORK=LAST \ - -DCMAKE_C_FLAGS="-Werror" \ - -DCMAKE_CXX_FLAGS="-Werror" \ - -DTDESKTOP_API_TEST=ON \ - -DDESKTOP_APP_USE_PACKAGED_LAZY=ON \ - $DEFINE - - cmake --build build --parallel - - cd build - macdeployqt Kotatogram.app - codesign --remove-signature Kotatogram.app - python ../Telegram/build/fix_paths_mac.py Kotatogram.app/Contents/MacOS/Kotatogram - - mkdir dmgsrc - mv Kotatogram.app dmgsrc - hdiutil create -volname Kotatogram -srcfolder dmgsrc -ov -format UDZO Kotatogram.dmg - - - name: Move artifact. - if: env.UPLOAD_ARTIFACT == 'true' - run: | - cd $REPO_NAME/build - mkdir artifact - mv Kotatogram.dmg artifact/ - - uses: actions/upload-artifact@master - if: env.UPLOAD_ARTIFACT == 'true' - name: Upload artifact. - with: - name: ${{ env.ARTIFACT_NAME }} - path: ${{ env.REPO_NAME }}/build/artifact/ diff --git a/.github/workflows/mac.yml b/.github/workflows/mac.yml index 15caa07b7..94d9b8c6a 100644 --- a/.github/workflows/mac.yml +++ b/.github/workflows/mac.yml @@ -5,7 +5,6 @@ on: paths-ignore: - 'docs/**' - '**.md' - - '!docs/building-mac.md' - 'kotatogram_changes.txt' - 'changelog.txt' - 'LEGAL' @@ -24,7 +23,6 @@ on: paths-ignore: - 'docs/**' - '**.md' - - '!docs/building-mac.md' - 'kotatogram_changes.txt' - 'changelog.txt' - 'LEGAL' @@ -49,7 +47,7 @@ jobs: && contains(github.event.head_commit.message, '[skip ci]')) && !(github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name) - runs-on: macos-latest + runs-on: macos-13 strategy: matrix: @@ -58,13 +56,14 @@ jobs: env: UPLOAD_ARTIFACT: "false" ONLY_CACHE: "false" + PREPARE_PATH: "Telegram/build/prepare/prepare.py" steps: - name: Get repository name. run: echo "REPO_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV - name: Clone. - uses: actions/checkout@v2 + uses: actions/checkout@v3.1.0 with: submodules: recursive path: ${{ env.REPO_NAME }} @@ -72,8 +71,7 @@ jobs: - name: First set up. run: | sudo chown -R `whoami`:admin /usr/local/share - brew install automake fdk-aac lame libass libtool libvorbis libvpx \ - ninja opus sdl shtool texi2html theora x264 xvid yasm pkg-config + brew install automake ninja pkg-config nasm meson # Disable spotlight. sudo mdutil -a -i off @@ -82,17 +80,19 @@ jobs: - name: ThirdParty cache. id: cache-third-party - uses: actions/cache@v2 + uses: actions/cache@v3.0.11 with: path: ThirdParty - key: ${{ runner.OS }}-third-party + key: ${{ runner.OS }}-third-party-${{ hashFiles(format('{0}/{1}', env.REPO_NAME, env.PREPARE_PATH)) }} + restore-keys: ${{ runner.OS }}-third-party- - name: Libraries cache. id: cache-libs - uses: actions/cache@v2 + uses: actions/cache@v3.0.11 with: path: Libraries - key: ${{ runner.OS }}-libs + key: ${{ runner.OS }}-libs-${{ hashFiles(format('{0}/{1}', env.REPO_NAME, env.PREPARE_PATH)) }} + restore-keys: ${{ runner.OS }}-libs- - name: Libraries. run: | @@ -120,8 +120,9 @@ jobs: ./configure.sh \ -D CMAKE_C_FLAGS="-Werror" \ -D CMAKE_CXX_FLAGS="-Werror" \ + -D CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED=NO \ -D TDESKTOP_API_TEST=ON \ - -D DESKTOP_APP_USE_PACKAGED=OFF \ + -D DESKTOP_APP_DISABLE_AUTOUPDATE=OFF \ -D DESKTOP_APP_DISABLE_CRASH_REPORTS=OFF \ $DEFINE diff --git a/.github/workflows/mac_packaged.yml b/.github/workflows/mac_packaged.yml new file mode 100644 index 000000000..23187ffcc --- /dev/null +++ b/.github/workflows/mac_packaged.yml @@ -0,0 +1,161 @@ +name: MacOS Packaged. + +on: + push: + paths-ignore: + - 'docs/**' + - '**.md' + - 'changelog.txt' + - 'LEGAL' + - 'LICENSE' + - '.github/**' + - '!.github/workflows/mac_packaged.yml' + - 'lib/xdg/**' + - 'snap/**' + - 'Telegram/build/**' + - 'Telegram/Resources/uwp/**' + - 'Telegram/Resources/winrc/**' + - 'Telegram/SourceFiles/platform/win/**' + - 'Telegram/SourceFiles/platform/linux/**' + - 'Telegram/configure.bat' + pull_request: + paths-ignore: + - 'docs/**' + - '**.md' + - 'changelog.txt' + - 'LEGAL' + - 'LICENSE' + - '.github/**' + - '!.github/workflows/mac_packaged.yml' + - 'lib/xdg/**' + - 'snap/**' + - 'Telegram/build/**' + - 'Telegram/Resources/uwp/**' + - 'Telegram/Resources/winrc/**' + - 'Telegram/SourceFiles/platform/win/**' + - 'Telegram/SourceFiles/platform/linux/**' + - 'Telegram/configure.bat' + +jobs: + + macos: + name: MacOS + runs-on: macos-13 + + strategy: + matrix: + defines: + - "" + + env: + GIT: "https://github.com" + OPENALDIR: "/usr/local/opt/openal-soft" + UPLOAD_ARTIFACT: "false" + ONLY_CACHE: "false" + MANUAL_CACHING: "1" + AUTO_CACHING: "1" + + steps: + - name: Get repository name. + run: echo "REPO_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV + + - name: Clone. + uses: actions/checkout@v3.1.0 + with: + submodules: recursive + path: ${{ env.REPO_NAME }} + + - name: First set up. + run: | + brew update + brew upgrade || true + brew install autoconf automake boost cmake ffmpeg openal-soft openssl opus ninja pkg-config python qt yasm xz + sudo xcode-select -s /Applications/Xcode.app/Contents/Developer + + xcodebuild -version > CACHE_KEY.txt + brew list --versions >> CACHE_KEY.txt + echo $MANUAL_CACHING >> CACHE_KEY.txt + echo "$GITHUB_WORKSPACE" >> CACHE_KEY.txt + if [ "$AUTO_CACHING" = "1" ]; then + thisFile=$REPO_NAME/.github/workflows/mac_packaged.yml + echo `md5 -q $thisFile` >> CACHE_KEY.txt + fi + echo "CACHE_KEY=`md5 -q CACHE_KEY.txt`" >> $GITHUB_ENV + + echo "LibrariesPath=`pwd`" >> $GITHUB_ENV + + curl -o tg_owt-version.json https://api.github.com/repos/desktop-app/tg_owt/git/refs/heads/master + + - name: RNNoise. + run: | + cd $LibrariesPath + + git clone --depth=1 https://gitlab.xiph.org/xiph/rnnoise.git + cd rnnoise + ./autogen.sh + ./configure --disable-examples --disable-doc + make -j$(sysctl -n hw.logicalcpu) + make install + + - name: WebRTC cache. + id: cache-webrtc + uses: actions/cache@v3.0.11 + with: + path: ${{ env.LibrariesPath }}/tg_owt + key: ${{ runner.OS }}-webrtc-${{ env.CACHE_KEY }}-${{ hashFiles('**/tg_owt-version.json') }} + - name: WebRTC. + if: steps.cache-webrtc.outputs.cache-hit != 'true' + run: | + cd $LibrariesPath + + git clone --recursive --depth=1 $GIT/desktop-app/tg_owt.git + cd tg_owt + + cmake -B build . -GNinja -DCMAKE_BUILD_TYPE=Debug + cmake --build build --parallel + + - name: Telegram Desktop build. + if: env.ONLY_CACHE == 'false' + env: + tg_owt_DIR: ${{ env.LibrariesPath }}/tg_owt/build + run: | + cd $REPO_NAME + + DEFINE="" + if [ -n "${{ matrix.defines }}" ]; then + DEFINE="-D ${{ matrix.defines }}=ON" + echo Define from matrix: $DEFINE + echo "ARTIFACT_NAME=Telegram_${{ matrix.defines }}" >> $GITHUB_ENV + else + echo "ARTIFACT_NAME=Telegram" >> $GITHUB_ENV + fi + + cmake -Bbuild -GNinja . \ + -DCMAKE_BUILD_TYPE=Debug \ + -DCMAKE_FIND_FRAMEWORK=LAST \ + -DTDESKTOP_API_TEST=ON \ + -DDESKTOP_APP_USE_PACKAGED_LAZY=ON \ + $DEFINE + + cmake --build build --parallel + + cd build + macdeployqt Kotatogram.app + codesign --remove-signature Kotatogram.app + + mkdir dmgsrc + mv Kotatogram.app dmgsrc + hdiutil create -volname Kotatogram -srcfolder dmgsrc -ov -format UDZO Kotatogram.dmg + + - name: Move artifact. + if: env.UPLOAD_ARTIFACT == 'true' + run: | + cd $REPO_NAME/build + mkdir artifact + mv Kotatogram.dmg artifact/ + - uses: actions/upload-artifact@master + if: env.UPLOAD_ARTIFACT == 'true' + name: Upload artifact. + with: + name: ${{ env.ARTIFACT_NAME }} + path: ${{ env.REPO_NAME }}/build/artifact/ diff --git a/.github/workflows/master_updater.yml b/.github/workflows/master_updater.yml index 333eb43dd..284bb844e 100644 --- a/.github/workflows/master_updater.yml +++ b/.github/workflows/master_updater.yml @@ -11,7 +11,9 @@ jobs: SKIP: "0" to_branch: "master" steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v4.1.0 + with: + fetch-depth: 0 if: env.SKIP == '0' - name: Push the code to the master branch. if: env.SKIP == '0' diff --git a/.github/workflows/no-response.yml b/.github/workflows/no-response.yml index 4d19e1048..f414a55fd 100644 --- a/.github/workflows/no-response.yml +++ b/.github/workflows/no-response.yml @@ -9,11 +9,38 @@ on: - cron: '0 0 * * *' jobs: - noResponse: + waiting-for-answer: runs-on: ubuntu-latest steps: - uses: lee-dohm/no-response@v0.5.0 with: token: ${{ github.token }} - # Label requiring a response responseRequiredLabel: waiting for answer + + needs-user-action: + runs-on: ubuntu-latest + steps: + - uses: lee-dohm/no-response@v0.5.0 + with: + token: ${{ github.token }} + responseRequiredLabel: needs user action + + cant-reproduce: + if: github.event_name != 'issue_comment' + runs-on: ubuntu-latest + steps: + - uses: lee-dohm/no-response@v0.5.0 + with: + token: ${{ github.token }} + responseRequiredLabel: cant reproduce + closeComment: > + This issue has been automatically closed because no developer succeeded to + reproduce the issue with the given reproduction steps. With only the + information that is currently in the issue, we don't have enough + information to take action. Please reach out if you find what's missing to + reproduce the issue so that we can investigate further. + + + Note that GitHub is a developer communication platform. If you're an ordinary + user seeking for help, get to support crew via `Settings -> Ask question` in + the application. diff --git a/.github/workflows/snap.yml b/.github/workflows/snap.yml new file mode 100644 index 000000000..c2e5dbafe --- /dev/null +++ b/.github/workflows/snap.yml @@ -0,0 +1,83 @@ +name: Snap. + +on: + push: + paths-ignore: + - 'docs/**' + - '**.md' + - 'changelog.txt' + - 'LEGAL' + - 'LICENSE' + - '.github/**' + - '!.github/workflows/snap.yml' + - 'Telegram/build/**' + - 'Telegram/Resources/uwp/**' + - 'Telegram/Resources/winrc/**' + - 'Telegram/SourceFiles/platform/win/**' + - 'Telegram/SourceFiles/platform/mac/**' + - 'Telegram/Telegram/**' + - 'Telegram/configure.bat' + - 'Telegram/Telegram.plist' + pull_request: + paths-ignore: + - 'docs/**' + - '**.md' + - 'changelog.txt' + - 'LEGAL' + - 'LICENSE' + - '.github/**' + - '!.github/workflows/snap.yml' + - 'Telegram/build/**' + - 'Telegram/Resources/uwp/**' + - 'Telegram/Resources/winrc/**' + - 'Telegram/SourceFiles/platform/win/**' + - 'Telegram/SourceFiles/platform/mac/**' + - 'Telegram/Telegram/**' + - 'Telegram/configure.bat' + - 'Telegram/Telegram.plist' + +jobs: + + snap: + name: Ubuntu + runs-on: ubuntu-20.04 + + env: + UPLOAD_ARTIFACT: "false" + + steps: + - name: Clone. + uses: actions/checkout@v3.1.0 + with: + fetch-depth: 0 + submodules: recursive + + - name: First set up. + run: | + sudo iptables -P FORWARD ACCEPT + sudo snap install --classic snapcraft + sudo usermod -aG lxd $USER + sudo snap run lxd init --auto + sudo snap run lxd waitready + + - name: Free up some disk space. + uses: jlumbroso/free-disk-space@f68fdb76e2ea636224182cfb7377ff9a1708f9b8 + + - name: Telegram Desktop snap build. + run: sg lxd -c 'snap run snapcraft -v' + + - name: Move artifact. + if: env.UPLOAD_ARTIFACT == 'true' + run: | + artifact_name=$(echo telegram-desktop_*.snap) + echo "ARTIFACT_NAME=$artifact_name" >> $GITHUB_ENV + + mkdir artifact + mv $artifact_name artifact + + - uses: actions/upload-artifact@master + if: env.UPLOAD_ARTIFACT == 'true' + name: Upload artifact. + with: + name: ${{ env.ARTIFACT_NAME }} + path: artifact diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 000000000..219f95a82 --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,25 @@ +name: 'Close stale issues and PRs' +on: + schedule: + - cron: '30 1 * * *' + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v5 + with: + stale-issue-message: | + Hey there! + + This issue was inactive for a long time and will be automatically closed in 30 days if there isn't any further activity. We therefore assume that the user has lost interest or resolved the problem on their own. + + Don't worry though; if this is an error, let us know with a comment and we'll be happy to reopen the issue. + + Thanks! + stale-issue-label: 'stale' + exempt-issue-labels: 'enhancement' + days-before-stale: 180 + days-before-close: 30 + days-before-pr-stale: -1 + operations-per-run: 1000 diff --git a/.github/workflows/win.yml b/.github/workflows/win.yml index b489a0f32..2c60ada70 100644 --- a/.github/workflows/win.yml +++ b/.github/workflows/win.yml @@ -5,7 +5,6 @@ on: paths-ignore: - 'docs/**' - '**.md' - - '!docs/building-win.md' - 'kotatogram_changes.txt' - 'changelog.txt' - 'LEGAL' @@ -14,7 +13,7 @@ on: - '!.github/workflows/win.yml' - 'lib/xdg/**' - 'snap/**' - - 'Telegram/build/**' + - 'Telegram/build/docker/**' - 'Telegram/Resources/uwp/**' - 'Telegram/SourceFiles/platform/linux/**' - 'Telegram/SourceFiles/platform/mac/**' @@ -25,7 +24,6 @@ on: paths-ignore: - 'docs/**' - '**.md' - - '!docs/building-win.md' - 'kotatogram_changes.txt' - 'changelog.txt' - 'LEGAL' @@ -34,7 +32,7 @@ on: - '!.github/workflows/win.yml' - 'lib/xdg/**' - 'snap/**' - - 'Telegram/build/**' + - 'Telegram/build/docker/**' - 'Telegram/Resources/uwp/**' - 'Telegram/SourceFiles/platform/linux/**' - 'Telegram/SourceFiles/platform/mac/**' @@ -56,6 +54,7 @@ jobs: strategy: matrix: arch: [Win32, x64] + generator: ["", "Ninja Multi-Config"] env: UPLOAD_ARTIFACT: "true" @@ -65,45 +64,33 @@ jobs: defaults: run: shell: cmd - working-directory: ${{ github.workspace }} steps: - name: Prepare directories. run: | mkdir %userprofile%\TBuild\Libraries - echo TBUILD=%userprofile%\TBuild>>%GITHUB_ENV% + mklink /d %GITHUB_WORKSPACE%\TBuild %userprofile%\TBuild + echo TBUILD=%GITHUB_WORKSPACE%\TBuild>>%GITHUB_ENV% - name: Get repository name. shell: bash run: echo "REPO_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV - - uses: ilammy/msvc-dev-cmd@v1.10.0 + - uses: ilammy/msvc-dev-cmd@v1.12.0 name: Native Tools Command Prompt. with: arch: ${{ matrix.arch }} - name: Clone. - uses: LebedevRI/checkout@issue197 + uses: actions/checkout@v3.1.0 with: submodules: recursive path: ${{ env.TBUILD }}\${{ env.REPO_NAME }} - - name: Choco installs. - run: | - choco install --no-progress -y nasm strawberryperl yasm jom ninja - py -m pip install pywin32 - - - name: Install msys64. - run: | - mkdir %TBUILD%\ThirdParty - xcopy /E /I C:\msys64 %TBUILD%\ThirdParty\msys64 - - name: Set up environment paths. shell: bash run: | - echo "C:\\Strawberry\\perl\\bin\\" >> $GITHUB_PATH - echo "C:\\Program Files\\NASM\\" >> $GITHUB_PATH - echo "C:\\ProgramData\\chocolatey\\lib\\ninja\\tools\\" >> $GITHUB_PATH + echo "CACHE_KEY=$(sha256sum $TBUILD/$REPO_NAME/$PREPARE_PATH | awk '{ print $1 }')" >> $GITHUB_ENV echo "Configurate git for cherry-picks." git config --global user.email "you@example.com" @@ -116,36 +103,65 @@ jobs: - name: Libraries cache. id: cache-libs - uses: actions/cache@v2 + uses: actions/cache@v3.0.11 with: - path: ${{ env.TBUILD }}/Libraries - key: ${{ runner.OS }}-libs + path: ${{ env.TBUILD }}\Libraries + key: ${{ runner.OS }}-${{ matrix.arch }}-libs-${{ env.CACHE_KEY }} + restore-keys: ${{ runner.OS }}-${{ matrix.arch }}-libs- - name: Libraries. env: GYP_MSVS_OVERRIDE_PATH: 'C:\Program Files\Microsoft Visual Studio\2022\Enterprise\' GYP_MSVS_VERSION: 2022 run: | - C: cd %TBUILD% - %REPO_NAME%/Telegram/build/prepare/win.bat skip-release silent + %REPO_NAME%\Telegram\build\prepare\win.bat skip-release silent - - name: Read defines. + - name: Read configuration matrix. shell: bash run: | + ARTIFACT_NAME="Kotatogram" + + ARCH="" + if [ -n "${{ matrix.arch }}" ]; then + case "${{ matrix.arch }}" in + Win32) ARCH="x86";; + *) ARCH="${{ matrix.arch }}";; + esac + echo "Architecture from matrix: $ARCH" + ARTIFACT_NAME="${ARTIFACT_NAME}_${{ matrix.arch }}" + fi + + GENERATOR="" + if [ -n "${{ matrix.generator }}" ]; then + GENERATOR="-G \"${{ matrix.generator }}\"" + echo "Generator from matrix: $GENERATOR" + ARTIFACT_NAME="${ARTIFACT_NAME}_${{ matrix.generator }}" + fi + echo "TDESKTOP_BUILD_GENERATOR=$GENERATOR" >> $GITHUB_ENV + + [ -n "$GENERATOR" ] && ARCH="" + echo "TDESKTOP_BUILD_ARCH=$ARCH" >> $GITHUB_ENV + DEFINE="" if [ -n "${{ matrix.defines }}" ]; then DEFINE="-D ${{ matrix.defines }}=ON" - echo Define from matrix: $DEFINE - echo "ARTIFACT_NAME=Kotatogram_${{ matrix.defines }}" >> $GITHUB_ENV - else - echo "ARTIFACT_NAME=Kotatogram" >> $GITHUB_ENV + echo "Define from matrix: $DEFINE" + ARTIFACT_NAME="${ARTIFACT_NAME}_${{ matrix.defines }}" fi echo "TDESKTOP_BUILD_DEFINE=$DEFINE" >> $GITHUB_ENV + echo "ARTIFACT_NAME=$ARTIFACT_NAME" >> $GITHUB_ENV + + API="-D TDESKTOP_API_TEST=ON" + if [ $GITHUB_REF == 'refs/heads/nightly' ]; then + echo "Use the open credentials." + API="-D TDESKTOP_API_ID=611335 -D TDESKTOP_API_HASH=d524b414d21f4d37f08684c1df41ac9c" + fi + echo "TDESKTOP_BUILD_API=$API" >> $GITHUB_ENV + - name: Free up some disk space. run: | - C: cd %TBUILD% del /S Libraries\*.pdb del /S Libraries\*.pch @@ -154,33 +170,38 @@ jobs: - name: Kotatogram Desktop build. if: env.ONLY_CACHE == 'false' run: | - C: cd %TBUILD%\%REPO_NAME%\Telegram call configure.bat ^ - ${{ matrix.arch }} ^ - -D TDESKTOP_API_TEST=ON ^ - -D DESKTOP_APP_USE_PACKAGED=OFF ^ + %TDESKTOP_BUILD_GENERATOR% ^ + %TDESKTOP_BUILD_ARCH% ^ + %TDESKTOP_BUILD_API% ^ + -D DESKTOP_APP_DISABLE_AUTOUPDATE=OFF ^ -D DESKTOP_APP_DISABLE_CRASH_REPORTS=OFF ^ -D DESKTOP_APP_NO_PDB=ON ^ - %TDESKTOP_BUILD_DEFINE% ^ - -DCMAKE_SYSTEM_VERSION=%SDK% + %TDESKTOP_BUILD_DEFINE% if "${{ matrix.arch }}" == "x64" ( cd ..\out64 ) else ( cd ..\out ) - msbuild -m Telegram.sln /p:Configuration=Debug,Platform=${{ matrix.arch }},DebugSymbols=false,DebugType=none + cmake --build . --config Debug --parallel - name: Move artifact. - if: env.UPLOAD_ARTIFACT == 'true' + if: (env.UPLOAD_ARTIFACT == 'true') || (github.ref == 'refs/heads/nightly') run: | + if "${{ matrix.arch }}" == "x64" ( + set OUT=%TBUILD%\%REPO_NAME%\out64\Debug + ) else ( + set OUT=%TBUILD%\%REPO_NAME%\out\Debug + ) mkdir artifact - move %TBUILD%\%REPO_NAME%\out\Debug\Kotatogram.exe artifact/ + move %OUT%\Kotatogram.exe artifact/ + move %OUT%\Updater.exe artifact/ - uses: actions/upload-artifact@master name: Upload artifact. - if: env.UPLOAD_ARTIFACT == 'true' + if: (env.UPLOAD_ARTIFACT == 'true') || (github.ref == 'refs/heads/nightly') with: name: ${{ env.ARTIFACT_NAME }} path: artifact\ diff --git a/.github/workflows/winget.yml b/.github/workflows/winget.yml new file mode 100644 index 000000000..0ff2d50d8 --- /dev/null +++ b/.github/workflows/winget.yml @@ -0,0 +1,20 @@ +name: Publish to WinGet +on: + release: + types: [released, prereleased] +jobs: + publish: + runs-on: windows-latest # action can only be run on windows + steps: + - if: github.event.action == 'released' + uses: telegramdesktop/winget-releaser@main + with: + identifier: Telegram.TelegramDesktop + installers-regex: 't(setup|portable).*(exe|zip)$' + token: ${{ secrets.WINGET_TOKEN }} + - if: github.event.action == 'prereleased' + uses: telegramdesktop/winget-releaser@main + with: + identifier: Telegram.TelegramDesktop.Beta + installers-regex: 't(setup|portable).*(exe|zip)$' + token: ${{ secrets.WINGET_TOKEN }} diff --git a/.gitmodules b/.gitmodules index 1dad63ff5..07f7ed400 100644 --- a/.gitmodules +++ b/.gitmodules @@ -3,7 +3,7 @@ url = https://github.com/telegramdesktop/libtgvoip [submodule "Telegram/ThirdParty/GSL"] path = Telegram/ThirdParty/GSL - url = https://github.com/Microsoft/GSL.git + url = https://github.com/desktop-app/GSL.git [submodule "Telegram/ThirdParty/xxHash"] path = Telegram/ThirdParty/xxHash url = https://github.com/Cyan4973/xxHash.git @@ -58,9 +58,6 @@ [submodule "Telegram/ThirdParty/range-v3"] path = Telegram/ThirdParty/range-v3 url = https://github.com/ericniebler/range-v3.git -[submodule "Telegram/ThirdParty/fcitx-qt5"] - path = Telegram/ThirdParty/fcitx-qt5 - url = https://github.com/fcitx/fcitx-qt5.git [submodule "Telegram/ThirdParty/nimf"] path = Telegram/ThirdParty/nimf url = https://github.com/hamonikr/nimf.git @@ -79,24 +76,30 @@ [submodule "Telegram/lib_webview"] path = Telegram/lib_webview url = https://github.com/desktop-app/lib_webview.git -[submodule "Telegram/lib_waylandshells"] - path = Telegram/lib_waylandshells - url = https://github.com/desktop-app/lib_waylandshells.git -[submodule "Telegram/ThirdParty/jemalloc"] - path = Telegram/ThirdParty/jemalloc - url = https://github.com/jemalloc/jemalloc -[submodule "Telegram/ThirdParty/kwayland"] - path = Telegram/ThirdParty/kwayland - url = https://github.com/KDE/kwayland.git [submodule "Telegram/ThirdParty/dispatch"] path = Telegram/ThirdParty/dispatch url = https://github.com/apple/swift-corelibs-libdispatch -[submodule "Telegram/ThirdParty/extra-cmake-modules"] - path = Telegram/ThirdParty/extra-cmake-modules - url = https://github.com/KDE/extra-cmake-modules.git [submodule "Telegram/ThirdParty/plasma-wayland-protocols"] path = Telegram/ThirdParty/plasma-wayland-protocols url = https://github.com/KDE/plasma-wayland-protocols.git [submodule "Telegram/ThirdParty/wayland-protocols"] path = Telegram/ThirdParty/wayland-protocols url = https://github.com/gitlab-freedesktop-mirrors/wayland-protocols.git +[submodule "Telegram/ThirdParty/kimageformats"] + path = Telegram/ThirdParty/kimageformats + url = https://github.com/KDE/kimageformats.git +[submodule "Telegram/ThirdParty/kcoreaddons"] + path = Telegram/ThirdParty/kcoreaddons + url = https://github.com/KDE/kcoreaddons.git +[submodule "Telegram/ThirdParty/cld3"] + path = Telegram/ThirdParty/cld3 + url = https://github.com/google/cld3.git +[submodule "Telegram/ThirdParty/wayland"] + path = Telegram/ThirdParty/wayland + url = https://github.com/gitlab-freedesktop-mirrors/wayland.git +[submodule "Telegram/ThirdParty/libprisma"] + path = Telegram/ThirdParty/libprisma + url = https://github.com/desktop-app/libprisma.git +[submodule "Telegram/ThirdParty/xdg-desktop-portal"] + path = Telegram/ThirdParty/xdg-desktop-portal + url = https://github.com/flatpak/xdg-desktop-portal.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 15fda1981..dcf88602f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,9 +4,15 @@ # For license and copyright information please follow this link: # https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL -cmake_minimum_required(VERSION 3.16) -cmake_policy(SET CMP0076 NEW) -cmake_policy(SET CMP0091 NEW) +if (APPLE) + # target_precompile_headers with COMPILE_LANGUAGE restriction. + cmake_minimum_required(VERSION 3.23) +else() + cmake_minimum_required(VERSION 3.16) +endif() +if (POLICY CMP0149) + cmake_policy(SET CMP0149 NEW) +endif() set_property(GLOBAL PROPERTY USE_FOLDERS ON) @@ -16,7 +22,9 @@ desktop_app_parse_version(Telegram/build/version) set(project_langs C CXX) if (APPLE) - set(project_langs C CXX OBJC OBJCXX) + list(APPEND project_langs OBJC OBJCXX) +elseif (LINUX) + list(APPEND project_langs ASM) endif() project(Telegram @@ -31,10 +39,17 @@ get_filename_component(third_party_loc "Telegram/ThirdParty" REALPATH) get_filename_component(submodules_loc "Telegram" REALPATH) get_filename_component(cmake_helpers_loc "cmake" REALPATH) +if (NOT DESKTOP_APP_USE_PACKAGED AND WIN32) + set(Python3_EXECUTABLE ${CMAKE_CURRENT_SOURCE_DIR}/../ThirdParty/python/Scripts/python) +endif() + include(cmake/variables.cmake) include(cmake/nice_target_sources.cmake) -include(cmake/target_link_static_libraries.cmake) +include(cmake/target_compile_options_if_exists.cmake) include(cmake/target_link_frameworks.cmake) +include(cmake/target_link_optional_libraries.cmake) +include(cmake/target_link_options_if_exists.cmake) +include(cmake/target_link_static_libraries.cmake) include(cmake/init_target.cmake) include(cmake/generate_target.cmake) include(cmake/nuget.cmake) @@ -43,6 +58,13 @@ include(cmake/target_prepare_qrc.cmake) include(cmake/options.cmake) +if (NOT DESKTOP_APP_USE_PACKAGED) + if (WIN32) + set(qt_version 5.15.13) + elseif (APPLE) + set(qt_version 6.2.7) + endif() +endif() include(cmake/external/qt/package.cmake) set(desktop_app_skip_libs diff --git a/LEGAL b/LEGAL index d4a4ae82e..5d0f5e8a7 100644 --- a/LEGAL +++ b/LEGAL @@ -1,7 +1,7 @@ This file is part of Telegram Desktop, the official desktop application for the Telegram messaging service. -Copyright (c) 2014-2022 The Telegram Desktop Authors. +Copyright (c) 2014-2024 The Telegram Desktop Authors. Telegram Desktop is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index 3eb4de392..3bcc09d6e 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -12,15 +12,10 @@ add_subdirectory(lib_crl) add_subdirectory(lib_base) add_subdirectory(lib_ui) add_subdirectory(lib_tl) -if (NOT DESKTOP_APP_DISABLE_SPELLCHECK) - add_subdirectory(lib_spellcheck) -endif() +add_subdirectory(lib_spellcheck) add_subdirectory(lib_storage) add_subdirectory(lib_lottie) add_subdirectory(lib_qr) -if (LINUX AND NOT DESKTOP_APP_DISABLE_WAYLAND_INTEGRATION) - add_subdirectory(lib_waylandshells) -endif() add_subdirectory(lib_webrtc) add_subdirectory(lib_webview) add_subdirectory(codegen) @@ -33,9 +28,11 @@ include(cmake/lib_ffmpeg.cmake) include(cmake/lib_stripe.cmake) include(cmake/lib_tgvoip.cmake) include(cmake/lib_tgcalls.cmake) +include(cmake/lib_prisma.cmake) include(cmake/td_export.cmake) -include(cmake/td_mtproto.cmake) +include(cmake/td_iv.cmake) include(cmake/td_lang.cmake) +include(cmake/td_mtproto.cmake) include(cmake/td_scheme.cmake) include(cmake/td_ui.cmake) include(cmake/generate_appdata_changelog.cmake) @@ -51,7 +48,6 @@ if (WIN32) endif() set_target_properties(Telegram PROPERTIES AUTOMOC ON) -target_prepare_qrc(Telegram) target_link_libraries(Telegram PRIVATE @@ -67,8 +63,9 @@ PRIVATE desktop-app::external_minizip tdesktop::td_export - tdesktop::td_mtproto + tdesktop::td_iv tdesktop::td_lang + tdesktop::td_mtproto tdesktop::td_scheme tdesktop::td_ui desktop-app::lib_webrtc @@ -76,15 +73,16 @@ PRIVATE desktop-app::lib_crl desktop-app::lib_ui desktop-app::lib_tl + desktop-app::lib_spellcheck desktop-app::lib_storage desktop-app::lib_lottie desktop-app::lib_qr desktop-app::lib_webview desktop-app::lib_ffmpeg desktop-app::lib_stripe - desktop-app::external_lz4 desktop-app::external_rlottie desktop-app::external_zlib + desktop-app::external_kcoreaddons desktop-app::external_qt_static_plugins desktop-app::external_qt desktop-app::external_qr_code_generator @@ -95,7 +93,7 @@ PRIVATE desktop-app::external_xxhash ) -target_precompile_headers(Telegram PRIVATE ${src_loc}/stdafx.h) +target_precompile_headers(Telegram PRIVATE $<$:${src_loc}/stdafx.h>) nice_target_sources(Telegram ${src_loc} PRIVATE ${style_files} @@ -116,6 +114,7 @@ PRIVATE api/api_chat_participants.h api/api_cloud_password.cpp api/api_cloud_password.h + api/api_common.cpp api/api_common.h api/api_confirm_phone.cpp api/api_confirm_phone.h @@ -129,10 +128,24 @@ PRIVATE api/api_invite_links.h api/api_media.cpp api/api_media.h + api/api_messages_search.cpp + api/api_messages_search.h + api/api_messages_search_merged.cpp + api/api_messages_search_merged.h + api/api_peer_colors.cpp + api/api_peer_colors.h api/api_peer_photo.cpp api/api_peer_photo.h api/api_polls.cpp api/api_polls.h + api/api_premium.cpp + api/api_premium.h + api/api_premium_option.cpp + api/api_premium_option.h + api/api_report.cpp + api/api_report.h + api/api_ringtones.cpp + api/api_ringtones.h api/api_self_destruct.cpp api/api_self_destruct.h api/api_send_progress.cpp @@ -143,34 +156,56 @@ PRIVATE api/api_sensitive_content.h api/api_single_message_search.cpp api/api_single_message_search.h + api/api_statistics.cpp + api/api_statistics.h api/api_text_entities.cpp api/api_text_entities.h api/api_toggling_media.cpp api/api_toggling_media.h + api/api_transcribes.cpp + api/api_transcribes.h api/api_unread_things.cpp api/api_unread_things.h api/api_updates.cpp api/api_updates.h + api/api_user_names.cpp + api/api_user_names.h api/api_user_privacy.cpp api/api_user_privacy.h api/api_views.cpp api/api_views.h + api/api_websites.cpp + api/api_websites.h api/api_who_reacted.cpp api/api_who_reacted.h boxes/filters/edit_filter_box.cpp boxes/filters/edit_filter_box.h boxes/filters/edit_filter_chats_list.cpp boxes/filters/edit_filter_chats_list.h + boxes/filters/edit_filter_chats_preview.cpp + boxes/filters/edit_filter_chats_preview.h + boxes/filters/edit_filter_links.cpp + boxes/filters/edit_filter_links.h + boxes/peers/add_bot_to_chat_box.cpp + boxes/peers/add_bot_to_chat_box.h boxes/peers/add_participants_box.cpp boxes/peers/add_participants_box.h + boxes/peers/choose_peer_box.cpp + boxes/peers/choose_peer_box.h boxes/peers/edit_contact_box.cpp boxes/peers/edit_contact_box.h + boxes/peers/edit_forum_topic_box.cpp + boxes/peers/edit_forum_topic_box.h boxes/peers/edit_linked_chat_box.cpp boxes/peers/edit_linked_chat_box.h + boxes/peers/edit_members_visible.cpp + boxes/peers/edit_members_visible.h boxes/peers/edit_participant_box.cpp boxes/peers/edit_participant_box.h boxes/peers/edit_participants_box.cpp boxes/peers/edit_participants_box.h + boxes/peers/edit_peer_color_box.cpp + boxes/peers/edit_peer_color_box.h boxes/peers/edit_peer_common.h boxes/peers/edit_peer_info_box.cpp boxes/peers/edit_peer_info_box.h @@ -178,8 +213,6 @@ PRIVATE boxes/peers/edit_peer_invite_link.h boxes/peers/edit_peer_invite_links.cpp boxes/peers/edit_peer_invite_links.h - boxes/peers/edit_peer_history_visibility_box.cpp - boxes/peers/edit_peer_history_visibility_box.h boxes/peers/edit_peer_permissions_box.cpp boxes/peers/edit_peer_permissions_box.h boxes/peers/edit_peer_reactions.cpp @@ -188,10 +221,14 @@ PRIVATE boxes/peers/edit_peer_requests_box.h boxes/peers/edit_peer_type_box.cpp boxes/peers/edit_peer_type_box.h + boxes/peers/edit_peer_usernames_list.cpp + boxes/peers/edit_peer_usernames_list.h boxes/peers/peer_short_info_box.cpp boxes/peers/peer_short_info_box.h boxes/peers/prepare_short_info_box.cpp boxes/peers/prepare_short_info_box.h + boxes/peers/replace_boost_box.cpp + boxes/peers/replace_boost_box.h boxes/about_box.cpp boxes/about_box.h boxes/about_sponsored_box.cpp @@ -208,8 +245,8 @@ PRIVATE boxes/background_box.h boxes/background_preview_box.cpp boxes/background_preview_box.h - boxes/change_phone_box.cpp - boxes/change_phone_box.h + boxes/choose_filter_box.cpp + boxes/choose_filter_box.h boxes/connection_box.cpp boxes/connection_box.h boxes/create_poll_box.cpp @@ -222,18 +259,16 @@ PRIVATE boxes/download_path_box.h boxes/edit_caption_box.cpp boxes/edit_caption_box.h - boxes/edit_color_box.cpp - boxes/edit_color_box.h boxes/edit_privacy_box.cpp boxes/edit_privacy_box.h + boxes/gift_premium_box.cpp + boxes/gift_premium_box.h boxes/language_box.cpp boxes/language_box.h boxes/local_storage_box.cpp boxes/local_storage_box.h boxes/max_invite_box.cpp boxes/max_invite_box.h - boxes/mute_settings_box.cpp - boxes/mute_settings_box.h boxes/peer_list_box.cpp boxes/peer_list_box.h boxes/peer_list_controllers.cpp @@ -246,6 +281,16 @@ PRIVATE boxes/phone_banned_box.h boxes/pin_messages_box.cpp boxes/pin_messages_box.h + boxes/premium_limits_box.cpp + boxes/premium_limits_box.h + boxes/premium_preview_box.cpp + boxes/premium_preview_box.h + boxes/reactions_settings_box.cpp + boxes/reactions_settings_box.h + boxes/report_messages_box.cpp + boxes/report_messages_box.h + boxes/ringtones_box.cpp + boxes/ringtones_box.h boxes/self_destruction_box.cpp boxes/self_destruction_box.h boxes/send_files_box.cpp @@ -258,6 +303,8 @@ PRIVATE boxes/sticker_set_box.h boxes/stickers_box.cpp boxes/stickers_box.h + boxes/translate_box.cpp + boxes/translate_box.h boxes/url_auth_box.cpp boxes/url_auth_box.h boxes/username_box.cpp @@ -280,6 +327,8 @@ PRIVATE calls/group/calls_group_menu.h calls/group/calls_group_panel.cpp calls/group/calls_group_panel.h + calls/group/calls_group_rtmp.cpp + calls/group/calls_group_rtmp.h calls/group/calls_group_settings.cpp calls/group/calls_group_settings.h calls/group/calls_group_toasts.cpp @@ -314,6 +363,9 @@ PRIVATE calls/calls_video_bubble.h calls/calls_video_incoming.cpp calls/calls_video_incoming.h + chat_helpers/compose/compose_features.h + chat_helpers/compose/compose_show.cpp + chat_helpers/compose/compose_show.h chat_helpers/bot_command.cpp chat_helpers/bot_command.h chat_helpers/bot_keyboard.cpp @@ -334,16 +386,20 @@ PRIVATE chat_helpers/gifs_list_widget.h chat_helpers/message_field.cpp chat_helpers/message_field.h - chat_helpers/send_context_menu.cpp - chat_helpers/send_context_menu.h + chat_helpers/share_message_phrase_factory.cpp + chat_helpers/share_message_phrase_factory.h chat_helpers/spellchecker_common.cpp chat_helpers/spellchecker_common.h + chat_helpers/stickers_dice_pack.cpp + chat_helpers/stickers_dice_pack.h chat_helpers/stickers_emoji_image_loader.cpp chat_helpers/stickers_emoji_image_loader.h chat_helpers/stickers_emoji_pack.cpp chat_helpers/stickers_emoji_pack.h - chat_helpers/stickers_dice_pack.cpp - chat_helpers/stickers_dice_pack.h + chat_helpers/stickers_gift_box_pack.cpp + chat_helpers/stickers_gift_box_pack.h + chat_helpers/stickers_list_footer.cpp + chat_helpers/stickers_list_footer.h chat_helpers/stickers_list_widget.cpp chat_helpers/stickers_list_widget.h chat_helpers/stickers_lottie.cpp @@ -354,6 +410,8 @@ PRIVATE chat_helpers/tabbed_section.h chat_helpers/tabbed_selector.cpp chat_helpers/tabbed_selector.h + chat_helpers/ttl_media_layer_widget.cpp + chat_helpers/ttl_media_layer_widget.h core/application.cpp core/application.h core/base_integration.cpp @@ -372,6 +430,7 @@ PRIVATE core/crash_report_window.h core/crash_reports.cpp core/crash_reports.h + core/deadlock_detector.h core/file_utilities.cpp core/file_utilities.h core/launcher.cpp @@ -391,6 +450,20 @@ PRIVATE core/version.h countries/countries_manager.cpp countries/countries_manager.h + data/business/data_business_chatbots.cpp + data/business/data_business_chatbots.h + data/business/data_business_common.cpp + data/business/data_business_common.h + data/business/data_business_info.cpp + data/business/data_business_info.h + data/business/data_shortcut_messages.cpp + data/business/data_shortcut_messages.h + data/notify/data_notify_settings.cpp + data/notify/data_notify_settings.h + data/notify/data_peer_notify_settings.cpp + data/notify/data_peer_notify_settings.h + data/stickers/data_custom_emoji.cpp + data/stickers/data_custom_emoji.h data/stickers/data_stickers_set.cpp data/stickers/data_stickers_set.h data/stickers/data_stickers.cpp @@ -402,6 +475,9 @@ PRIVATE data/data_audio_msg_id.h data/data_auto_download.cpp data/data_auto_download.h + data/data_boosts.h + data/data_bot_app.cpp + data/data_bot_app.h data/data_chat.cpp data/data_chat.h data/data_chat_filters.cpp @@ -424,10 +500,20 @@ PRIVATE data/data_document_media.h data/data_document_resolver.cpp data/data_document_resolver.h + data/data_download_manager.cpp + data/data_download_manager.h data/data_drafts.cpp data/data_drafts.h + data/data_emoji_statuses.cpp + data/data_emoji_statuses.h data/data_folder.cpp data/data_folder.h + data/data_forum.cpp + data/data_forum.h + data/data_forum_icons.cpp + data/data_forum_icons.h + data/data_forum_topic.cpp + data/data_forum_topic.h data/data_file_click_handler.cpp data/data_file_click_handler.h data/data_file_origin.cpp @@ -441,21 +527,26 @@ PRIVATE data/data_groups.h data/data_histories.cpp data/data_histories.h + data/data_lastseen_status.h data/data_location.cpp data/data_location.h data/data_media_rotation.cpp data/data_media_rotation.h data/data_media_types.cpp data/data_media_types.h - data/data_messages.cpp - data/data_messages.h + # data/data_messages.cpp + # data/data_messages.h + data/data_message_reaction_id.cpp + data/data_message_reaction_id.h data/data_message_reactions.cpp data/data_message_reactions.h data/data_msg_id.h - data/data_notify_settings.cpp - data/data_notify_settings.h data/data_peer.cpp data/data_peer.h + data/data_peer_bot_command.cpp + data/data_peer_bot_command.h + data/data_peer_bot_commands.cpp + data/data_peer_bot_commands.h data/data_peer_id.cpp data/data_peer_id.h data/data_peer_values.cpp @@ -466,12 +557,18 @@ PRIVATE data/data_photo_media.h data/data_poll.cpp data/data_poll.h + data/data_premium_limits.cpp + data/data_premium_limits.h data/data_pts_waiter.cpp data/data_pts_waiter.h data/data_replies_list.cpp data/data_replies_list.h data/data_reply_preview.cpp data/data_reply_preview.h + data/data_saved_messages.cpp + data/data_saved_messages.h + data/data_saved_sublist.cpp + data/data_saved_sublist.h data/data_search_controller.cpp data/data_search_controller.h data/data_send_action.cpp @@ -486,14 +583,25 @@ PRIVATE data/data_sparse_ids.h data/data_sponsored_messages.cpp data/data_sponsored_messages.h + data/data_statistics.h + data/data_stories.cpp + data/data_stories.h + data/data_stories_ids.cpp + data/data_stories_ids.h + data/data_story.cpp + data/data_story.h data/data_streaming.cpp data/data_streaming.h + data/data_thread.cpp + data/data_thread.h data/data_types.cpp data/data_types.h data/data_user.cpp data/data_user.h data/data_user_photos.cpp data/data_user_photos.h + data/data_user_names.cpp + data/data_user_names.h data/data_wall_paper.cpp data/data_wall_paper.h data/data_web_page.cpp @@ -516,12 +624,20 @@ PRIVATE dialogs/dialogs_row.h dialogs/dialogs_search_from_controllers.cpp dialogs/dialogs_search_from_controllers.h + dialogs/dialogs_search_tags.cpp + dialogs/dialogs_search_tags.h dialogs/dialogs_widget.cpp dialogs/dialogs_widget.h dialogs/ui/dialogs_layout.cpp dialogs/ui/dialogs_layout.h dialogs/ui/dialogs_message_view.cpp dialogs/ui/dialogs_message_view.h + dialogs/ui/dialogs_stories_content.cpp + dialogs/ui/dialogs_stories_content.h + dialogs/ui/dialogs_topics_view.cpp + dialogs/ui/dialogs_topics_view.h + dialogs/ui/dialogs_video_userpic.cpp + dialogs/ui/dialogs_video_userpic.h editor/color_picker.cpp editor/color_picker.h editor/controllers/controllers.h @@ -562,62 +678,101 @@ PRIVATE history/view/controls/compose_controls_common.h history/view/controls/history_view_compose_controls.cpp history/view/controls/history_view_compose_controls.h + history/view/controls/history_view_compose_search.cpp + history/view/controls/history_view_compose_search.h + history/view/controls/history_view_draft_options.cpp + history/view/controls/history_view_draft_options.h + history/view/controls/history_view_forward_panel.cpp + history/view/controls/history_view_forward_panel.h history/view/controls/history_view_ttl_button.cpp history/view/controls/history_view_ttl_button.h history/view/controls/history_view_voice_record_bar.cpp history/view/controls/history_view_voice_record_bar.h - history/view/controls/history_view_voice_record_button.cpp - history/view/controls/history_view_voice_record_button.h - history/view/media/history_view_call.h + history/view/controls/history_view_webpage_processor.cpp + history/view/controls/history_view_webpage_processor.h history/view/media/history_view_call.cpp - history/view/media/history_view_contact.h + history/view/media/history_view_call.h history/view/media/history_view_contact.cpp - history/view/media/history_view_dice.h + history/view/media/history_view_contact.h + history/view/media/history_view_custom_emoji.cpp + history/view/media/history_view_custom_emoji.h history/view/media/history_view_dice.cpp - history/view/media/history_view_document.h + history/view/media/history_view_dice.h history/view/media/history_view_document.cpp - history/view/media/history_view_file.h + history/view/media/history_view_document.h + history/view/media/history_view_extended_preview.cpp + history/view/media/history_view_extended_preview.h history/view/media/history_view_file.cpp - history/view/media/history_view_game.h + history/view/media/history_view_file.h history/view/media/history_view_game.cpp - history/view/media/history_view_gif.h + history/view/media/history_view_game.h history/view/media/history_view_gif.cpp - history/view/media/history_view_invoice.h + history/view/media/history_view_gif.h + history/view/media/history_view_giveaway.cpp + history/view/media/history_view_giveaway.h history/view/media/history_view_invoice.cpp - history/view/media/history_view_large_emoji.h + history/view/media/history_view_invoice.h history/view/media/history_view_large_emoji.cpp - history/view/media/history_view_location.h + history/view/media/history_view_large_emoji.h history/view/media/history_view_location.cpp - history/view/media/history_view_media.h + history/view/media/history_view_location.h history/view/media/history_view_media.cpp - history/view/media/history_view_media_common.h + history/view/media/history_view_media.h history/view/media/history_view_media_common.cpp - history/view/media/history_view_media_grouped.h + history/view/media/history_view_media_common.h history/view/media/history_view_media_grouped.cpp - history/view/media/history_view_media_unwrapped.h + history/view/media/history_view_media_grouped.h + history/view/media/history_view_media_spoiler.cpp + history/view/media/history_view_media_spoiler.h history/view/media/history_view_media_unwrapped.cpp - history/view/media/history_view_photo.h + history/view/media/history_view_media_unwrapped.h history/view/media/history_view_photo.cpp - history/view/media/history_view_poll.h + history/view/media/history_view_photo.h history/view/media/history_view_poll.cpp - history/view/media/history_view_slot_machine.h + history/view/media/history_view_poll.h + history/view/media/history_view_premium_gift.cpp + history/view/media/history_view_premium_gift.h + history/view/media/history_view_service_box.cpp + history/view/media/history_view_service_box.h + history/view/media/history_view_similar_channels.cpp + history/view/media/history_view_similar_channels.h history/view/media/history_view_slot_machine.cpp - history/view/media/history_view_sticker.h + history/view/media/history_view_slot_machine.h history/view/media/history_view_sticker.cpp - history/view/media/history_view_theme_document.h + history/view/media/history_view_sticker.h + history/view/media/history_view_sticker_player.cpp + history/view/media/history_view_sticker_player.h + history/view/media/history_view_sticker_player_abstract.h + history/view/media/history_view_story_mention.cpp + history/view/media/history_view_story_mention.h history/view/media/history_view_theme_document.cpp - history/view/media/history_view_web_page.h + history/view/media/history_view_theme_document.h + history/view/media/history_view_userpic_suggestion.cpp + history/view/media/history_view_userpic_suggestion.h history/view/media/history_view_web_page.cpp - history/view/reactions/message_reactions_list.cpp - history/view/reactions/message_reactions_list.h - history/view/reactions/message_reactions_selector.cpp - history/view/reactions/message_reactions_selector.h + history/view/media/history_view_web_page.h + history/view/reactions/history_view_reactions.cpp + history/view/reactions/history_view_reactions.h + history/view/reactions/history_view_reactions_button.cpp + history/view/reactions/history_view_reactions_button.h + history/view/reactions/history_view_reactions_list.cpp + history/view/reactions/history_view_reactions_list.h + history/view/reactions/history_view_reactions_selector.cpp + history/view/reactions/history_view_reactions_selector.h + history/view/reactions/history_view_reactions_strip.cpp + history/view/reactions/history_view_reactions_strip.h + history/view/reactions/history_view_reactions_tabs.cpp + history/view/reactions/history_view_reactions_tabs.h + history/view/history_view_about_view.cpp + history/view/history_view_about_view.h history/view/history_view_bottom_info.cpp history/view/history_view_bottom_info.h history/view/history_view_contact_status.cpp history/view/history_view_contact_status.h history/view/history_view_context_menu.cpp history/view/history_view_context_menu.h + history/view/history_view_corner_buttons.cpp + history/view/history_view_corner_buttons.h history/view/history_view_cursor_state.cpp history/view/history_view_cursor_state.h history/view/history_view_element.cpp @@ -640,14 +795,12 @@ PRIVATE history/view/history_view_pinned_section.h history/view/history_view_pinned_tracker.cpp history/view/history_view_pinned_tracker.h - history/view/history_view_react_animation.cpp - history/view/history_view_react_animation.h - history/view/history_view_react_button.cpp - history/view/history_view_react_button.h - history/view/history_view_reactions.cpp - history/view/history_view_reactions.h + history/view/history_view_quick_action.cpp + history/view/history_view_quick_action.h history/view/history_view_replies_section.cpp history/view/history_view_replies_section.h + history/view/history_view_reply.cpp + history/view/history_view_reply.h history/view/history_view_requests_bar.cpp history/view/history_view_requests_bar.h history/view/history_view_schedule_box.cpp @@ -660,6 +813,18 @@ PRIVATE history/view/history_view_service_message.h history/view/history_view_spoiler_click_handler.cpp history/view/history_view_spoiler_click_handler.h + history/view/history_view_sponsored_click_handler.cpp + history/view/history_view_sponsored_click_handler.h + history/view/history_view_sticker_toast.cpp + history/view/history_view_sticker_toast.h + history/view/history_view_sublist_section.cpp + history/view/history_view_sublist_section.h + history/view/history_view_transcribe_button.cpp + history/view/history_view_transcribe_button.h + history/view/history_view_translate_bar.cpp + history/view/history_view_translate_bar.h + history/view/history_view_translate_tracker.cpp + history/view/history_view_translate_tracker.h history/view/history_view_top_bar_widget.cpp history/view/history_view_top_bar_widget.h history/view/history_view_view_button.cpp @@ -676,6 +841,8 @@ PRIVATE history/history_item_components.h history/history_item_edition.cpp history/history_item_edition.h + history/history_item_helpers.cpp + history/history_item_helpers.h history/history_item_reply_markup.cpp history/history_item_reply_markup.h history/history_item_text.cpp @@ -684,14 +851,108 @@ PRIVATE history/history_inner_widget.h history/history_location_manager.cpp history/history_location_manager.h - history/history_message.cpp - history/history_message.h - history/history_service.cpp - history/history_service.h + history/history_translation.cpp + history/history_translation.h history/history_unread_things.cpp history/history_unread_things.h + history/history_view_highlight_manager.cpp + history/history_view_highlight_manager.h history/history_widget.cpp history/history_widget.h + info/boosts/giveaway/giveaway_list_controllers.cpp + info/boosts/giveaway/giveaway_list_controllers.h + info/boosts/create_giveaway_box.cpp + info/boosts/create_giveaway_box.h + info/boosts/info_boosts_inner_widget.cpp + info/boosts/info_boosts_inner_widget.h + info/boosts/info_boosts_widget.cpp + info/boosts/info_boosts_widget.h + info/common_groups/info_common_groups_inner_widget.cpp + info/common_groups/info_common_groups_inner_widget.h + info/common_groups/info_common_groups_widget.cpp + info/common_groups/info_common_groups_widget.h + info/downloads/info_downloads_inner_widget.cpp + info/downloads/info_downloads_inner_widget.h + info/downloads/info_downloads_provider.cpp + info/downloads/info_downloads_provider.h + info/downloads/info_downloads_widget.cpp + info/downloads/info_downloads_widget.h + info/media/info_media_buttons.h + info/media/info_media_common.cpp + info/media/info_media_common.h + info/media/info_media_empty_widget.cpp + info/media/info_media_empty_widget.h + info/media/info_media_inner_widget.cpp + info/media/info_media_inner_widget.h + info/media/info_media_list_section.cpp + info/media/info_media_list_section.h + info/media/info_media_list_widget.cpp + info/media/info_media_list_widget.h + info/media/info_media_provider.cpp + info/media/info_media_provider.h + info/media/info_media_widget.cpp + info/media/info_media_widget.h + info/members/info_members_widget.cpp + info/members/info_members_widget.h + info/polls/info_polls_results_inner_widget.cpp + info/polls/info_polls_results_inner_widget.h + info/polls/info_polls_results_widget.cpp + info/polls/info_polls_results_widget.h + info/profile/info_profile_actions.cpp + info/profile/info_profile_actions.h + info/profile/info_profile_badge.cpp + info/profile/info_profile_badge.h + info/profile/info_profile_cover.cpp + info/profile/info_profile_cover.h + info/profile/info_profile_emoji_status_panel.cpp + info/profile/info_profile_emoji_status_panel.h + info/profile/info_profile_inner_widget.cpp + info/profile/info_profile_inner_widget.h + info/profile/info_profile_members.cpp + info/profile/info_profile_members.h + info/profile/info_profile_members_controllers.cpp + info/profile/info_profile_members_controllers.h + info/profile/info_profile_phone_menu.cpp + info/profile/info_profile_phone_menu.h + info/profile/info_profile_text.cpp + info/profile/info_profile_text.h + info/profile/info_profile_values.cpp + info/profile/info_profile_values.h + info/profile/info_profile_widget.cpp + info/profile/info_profile_widget.h + info/saved/info_saved_sublists_widget.cpp + info/saved/info_saved_sublists_widget.h + info/settings/info_settings_widget.cpp + info/settings/info_settings_widget.h + info/similar_channels/info_similar_channels_widget.cpp + info/similar_channels/info_similar_channels_widget.h + info/statistics/info_statistics_common.h + info/statistics/info_statistics_inner_widget.cpp + info/statistics/info_statistics_inner_widget.h + info/statistics/info_statistics_list_controllers.cpp + info/statistics/info_statistics_list_controllers.h + info/statistics/info_statistics_recent_message.cpp + info/statistics/info_statistics_recent_message.h + info/statistics/info_statistics_widget.cpp + info/statistics/info_statistics_widget.h + info/stories/info_stories_inner_widget.cpp + info/stories/info_stories_inner_widget.h + info/stories/info_stories_provider.cpp + info/stories/info_stories_provider.h + info/stories/info_stories_widget.cpp + info/stories/info_stories_widget.h + info/userpic/info_userpic_colors_editor.cpp + info/userpic/info_userpic_colors_editor.h + info/userpic/info_userpic_emoji_builder.cpp + info/userpic/info_userpic_emoji_builder.h + info/userpic/info_userpic_emoji_builder_common.cpp + info/userpic/info_userpic_emoji_builder_common.h + info/userpic/info_userpic_emoji_builder_menu_item.cpp + info/userpic/info_userpic_emoji_builder_menu_item.h + info/userpic/info_userpic_emoji_builder_preview.cpp + info/userpic/info_userpic_emoji_builder_preview.h + info/userpic/info_userpic_emoji_builder_widget.cpp + info/userpic/info_userpic_emoji_builder_widget.h info/info_content_widget.cpp info/info_content_widget.h info/info_controller.cpp @@ -706,45 +967,8 @@ PRIVATE info/info_top_bar.h info/info_wrap_widget.cpp info/info_wrap_widget.h - info/common_groups/info_common_groups_inner_widget.cpp - info/common_groups/info_common_groups_inner_widget.h - info/common_groups/info_common_groups_widget.cpp - info/common_groups/info_common_groups_widget.h - info/media/info_media_buttons.h - info/media/info_media_empty_widget.cpp - info/media/info_media_empty_widget.h - info/media/info_media_inner_widget.cpp - info/media/info_media_inner_widget.h - info/media/info_media_list_widget.cpp - info/media/info_media_list_widget.h - info/media/info_media_widget.cpp - info/media/info_media_widget.h - info/members/info_members_widget.cpp - info/members/info_members_widget.h - info/polls/info_polls_results_inner_widget.cpp - info/polls/info_polls_results_inner_widget.h - info/polls/info_polls_results_widget.cpp - info/polls/info_polls_results_widget.h - info/profile/info_profile_actions.cpp - info/profile/info_profile_actions.h - info/profile/info_profile_cover.cpp - info/profile/info_profile_cover.h - info/profile/info_profile_icon.cpp - info/profile/info_profile_icon.h - info/profile/info_profile_inner_widget.cpp - info/profile/info_profile_inner_widget.h - info/profile/info_profile_members.cpp - info/profile/info_profile_members.h - info/profile/info_profile_members_controllers.cpp - info/profile/info_profile_members_controllers.h - info/profile/info_profile_text.cpp - info/profile/info_profile_text.h - info/profile/info_profile_values.cpp - info/profile/info_profile_values.h - info/profile/info_profile_widget.cpp - info/profile/info_profile_widget.h - info/settings/info_settings_widget.cpp - info/settings/info_settings_widget.h + inline_bots/bot_attach_web_view.cpp + inline_bots/bot_attach_web_view.h inline_bots/inline_bot_layout_internal.cpp inline_bots/inline_bot_layout_internal.h inline_bots/inline_bot_layout_item.cpp @@ -773,6 +997,8 @@ PRIVATE intro/intro_step.h intro/intro_widget.cpp intro/intro_widget.h + iv/iv_instance.cpp + iv/iv_instance.h kotato/boxes/kotato_confirm_box.cpp kotato/boxes/kotato_confirm_box.h kotato/boxes/kotato_fonts_box.cpp @@ -783,6 +1009,8 @@ PRIVATE kotato/boxes/kotato_unpin_box.h kotato/kotato_lang.cpp kotato/kotato_lang.h + kotato/kotato_radius.cpp + kotato/kotato_radius.h kotato/kotato_settings.cpp kotato/kotato_settings.h kotato/kotato_settings_menu.cpp @@ -804,6 +1032,8 @@ PRIVATE main/main_account.h main/main_app_config.cpp main/main_app_config.h + main/main_app_config_values.cpp + main/main_app_config_values.h main/main_domain.cpp main/main_domain.h main/main_session.cpp @@ -812,12 +1042,13 @@ PRIVATE main/main_session_settings.h main/session/send_as_peers.cpp main/session/send_as_peers.h - media/system_media_controls_manager.h - media/system_media_controls_manager.cpp + main/session/session_show.cpp + main/session/session_show.h media/audio/media_audio.cpp media/audio/media_audio.h media/audio/media_audio_capture.cpp media/audio/media_audio_capture.h + media/audio/media_audio_capture_common.h media/audio/media_audio_ffmpeg_loader.cpp media/audio/media_audio_ffmpeg_loader.h media/audio/media_audio_loader.cpp @@ -828,10 +1059,6 @@ PRIVATE media/audio/media_audio_track.h media/audio/media_child_ffmpeg_loader.cpp media/audio/media_child_ffmpeg_loader.h - media/audio/media_openal_functions.cpp - media/audio/media_openal_functions.h - media/player/media_player_button.cpp - media/player/media_player_button.h media/player/media_player_float.cpp media/player/media_player_float.h media/player/media_player_instance.cpp @@ -842,6 +1069,32 @@ PRIVATE media/player/media_player_volume_controller.h media/player/media_player_widget.cpp media/player/media_player_widget.h + media/stories/media_stories_caption_full_view.cpp + media/stories/media_stories_caption_full_view.h + media/stories/media_stories_controller.cpp + media/stories/media_stories_controller.h + media/stories/media_stories_delegate.cpp + media/stories/media_stories_delegate.h + media/stories/media_stories_header.cpp + media/stories/media_stories_header.h + media/stories/media_stories_reactions.cpp + media/stories/media_stories_reactions.h + media/stories/media_stories_recent_views.cpp + media/stories/media_stories_recent_views.h + media/stories/media_stories_reply.cpp + media/stories/media_stories_reply.h + media/stories/media_stories_repost_view.cpp + media/stories/media_stories_repost_view.h + media/stories/media_stories_share.cpp + media/stories/media_stories_share.h + media/stories/media_stories_sibling.cpp + media/stories/media_stories_sibling.h + media/stories/media_stories_slider.cpp + media/stories/media_stories_slider.h + media/stories/media_stories_stealth.cpp + media/stories/media_stories_stealth.h + media/stories/media_stories_view.cpp + media/stories/media_stories_view.h media/streaming/media_streaming_audio_track.cpp media/streaming/media_streaming_audio_track.h media/streaming/media_streaming_common.h @@ -887,6 +1140,18 @@ PRIVATE media/view/media_view_playback_progress.cpp media/view/media_view_playback_progress.h media/view/media_view_open_common.h + media/system_media_controls_manager.h + media/system_media_controls_manager.cpp + menu/menu_antispam_validator.cpp + menu/menu_antispam_validator.h + menu/menu_item_download_files.cpp + menu/menu_item_download_files.h + menu/menu_mute.cpp + menu/menu_mute.h + menu/menu_send.cpp + menu/menu_send.h + menu/menu_ttl_validator.cpp + menu/menu_ttl_validator.h mtproto/config_loader.cpp mtproto/config_loader.h mtproto/connection_abstract.cpp @@ -944,8 +1209,6 @@ PRIVATE platform/linux/linux_wayland_integration_dummy.cpp platform/linux/linux_wayland_integration.cpp platform/linux/linux_wayland_integration.h - platform/linux/linux_xdp_file_dialog.cpp - platform/linux/linux_xdp_file_dialog.h platform/linux/linux_xdp_open_with_dialog.cpp platform/linux/linux_xdp_open_with_dialog.h platform/linux/file_utilities_linux.cpp @@ -956,11 +1219,13 @@ PRIVATE platform/linux/integration_linux.h platform/linux/main_window_linux.cpp platform/linux/main_window_linux.h - platform/linux/notifications_manager_linux_dummy.cpp platform/linux/notifications_manager_linux.cpp platform/linux/notifications_manager_linux.h + platform/linux/overlay_widget_linux.h platform/linux/specific_linux.cpp platform/linux/specific_linux.h + platform/linux/tray_linux.cpp + platform/linux/tray_linux.h platform/mac/file_utilities_mac.mm platform/mac/file_utilities_mac.h platform/mac/launcher_mac.mm @@ -972,10 +1237,14 @@ PRIVATE platform/mac/main_window_mac.h platform/mac/notifications_manager_mac.mm platform/mac/notifications_manager_mac.h + platform/mac/overlay_widget_mac.h + platform/mac/overlay_widget_mac.mm platform/mac/specific_mac.mm platform/mac/specific_mac.h platform/mac/specific_mac_p.mm platform/mac/specific_mac_p.h + platform/mac/tray_mac.mm + platform/mac/tray_mac.h platform/mac/window_title_mac.mm platform/mac/touchbar/items/mac_formatter_item.h platform/mac/touchbar/items/mac_formatter_item.mm @@ -995,8 +1264,6 @@ PRIVATE platform/mac/touchbar/mac_touchbar_manager.mm platform/mac/touchbar/mac_touchbar_media_view.h platform/mac/touchbar/mac_touchbar_media_view.mm - platform/win/audio_win.cpp - platform/win/audio_win.h platform/win/file_utilities_win.cpp platform/win/file_utilities_win.h platform/win/launcher_win.cpp @@ -1007,8 +1274,11 @@ PRIVATE platform/win/main_window_win.h platform/win/notifications_manager_win.cpp platform/win/notifications_manager_win.h + platform/win/overlay_widget_win.h platform/win/specific_win.cpp platform/win/specific_win.h + platform/win/tray_win.cpp + platform/win/tray_win.h platform/win/windows_app_user_model_id.cpp platform/win/windows_app_user_model_id.h platform/win/windows_dlls.cpp @@ -1017,14 +1287,16 @@ PRIVATE platform/win/windows_autostart_task.h platform/win/windows_toast_activator.cpp platform/win/windows_toast_activator.h - platform/platform_audio.h platform/platform_file_utilities.h platform/platform_launcher.h platform/platform_integration.cpp platform/platform_integration.h platform/platform_main_window.h platform/platform_notifications_manager.h + platform/platform_overlay_widget.cpp + platform/platform_overlay_widget.h platform/platform_specific.h + platform/platform_tray.h platform/platform_window_title.h profile/profile_back_button.cpp profile/profile_back_button.h @@ -1036,32 +1308,81 @@ PRIVATE profile/profile_block_widget.h profile/profile_cover_drop_area.cpp profile/profile_cover_drop_area.h + settings/business/settings_away_message.cpp + settings/business/settings_away_message.h + settings/business/settings_shortcut_messages.cpp + settings/business/settings_shortcut_messages.h + settings/business/settings_chatbots.cpp + settings/business/settings_chatbots.h + settings/business/settings_greeting.cpp + settings/business/settings_greeting.h + settings/business/settings_location.cpp + settings/business/settings_location.h + settings/business/settings_quick_replies.cpp + settings/business/settings_quick_replies.h + settings/business/settings_recipients_helper.cpp + settings/business/settings_recipients_helper.h + settings/business/settings_working_hours.cpp + settings/business/settings_working_hours.h + settings/cloud_password/settings_cloud_password_common.cpp + settings/cloud_password/settings_cloud_password_common.h + settings/cloud_password/settings_cloud_password_email.cpp + settings/cloud_password/settings_cloud_password_email.h + settings/cloud_password/settings_cloud_password_email_confirm.cpp + settings/cloud_password/settings_cloud_password_email_confirm.h + settings/cloud_password/settings_cloud_password_hint.cpp + settings/cloud_password/settings_cloud_password_hint.h + settings/cloud_password/settings_cloud_password_input.cpp + settings/cloud_password/settings_cloud_password_input.h + settings/cloud_password/settings_cloud_password_manage.cpp + settings/cloud_password/settings_cloud_password_manage.h + settings/cloud_password/settings_cloud_password_start.cpp + settings/cloud_password/settings_cloud_password_start.h settings/settings_advanced.cpp settings/settings_advanced.h + settings/settings_blocked_peers.cpp + settings/settings_blocked_peers.h + settings/settings_business.cpp + settings/settings_business.h settings/settings_chat.cpp settings/settings_chat.h settings/settings_calls.cpp settings/settings_calls.h settings/settings_codes.cpp settings/settings_codes.h - settings/settings_common.cpp - settings/settings_common.h + settings/settings_common_session.cpp + settings/settings_common_session.h settings/settings_experimental.cpp settings/settings_experimental.h settings/settings_folders.cpp settings/settings_folders.h + settings/settings_global_ttl.cpp + settings/settings_global_ttl.h settings/settings_information.cpp settings/settings_information.h settings/settings_intro.cpp settings/settings_intro.h + settings/settings_local_passcode.cpp + settings/settings_local_passcode.h settings/settings_main.cpp settings/settings_main.h settings/settings_notifications.cpp settings/settings_notifications.h + settings/settings_notifications_type.cpp + settings/settings_notifications_type.h + settings/settings_power_saving.cpp + settings/settings_power_saving.h + settings/settings_premium.cpp + settings/settings_premium.h settings/settings_privacy_controllers.cpp settings/settings_privacy_controllers.h settings/settings_privacy_security.cpp settings/settings_privacy_security.h + settings/settings_scale_preview.cpp + settings/settings_scale_preview.h + settings/settings_type.h + settings/settings_websites.cpp + settings/settings_websites.h storage/details/storage_file_utilities.cpp storage/details/storage_file_utilities.h storage/details/storage_settings_scheme.cpp @@ -1090,8 +1411,6 @@ PRIVATE storage/storage_account.h storage/storage_cloud_blob.cpp storage/storage_cloud_blob.h - storage/storage_cloud_song_cover.cpp - storage/storage_cloud_song_cover.h storage/storage_domain.cpp storage/storage_domain.h storage/storage_facade.cpp @@ -1124,10 +1443,17 @@ PRIVATE ui/chat/choose_send_as.h ui/chat/choose_theme_controller.cpp ui/chat/choose_theme_controller.h - ui/effects/fireworks_animation.cpp - ui/effects/fireworks_animation.h - ui/effects/round_checkbox.cpp - ui/effects/round_checkbox.h + ui/controls/silent_toggle.cpp + ui/controls/silent_toggle.h + ui/controls/userpic_button.cpp + ui/controls/userpic_button.h + ui/effects/emoji_fly_animation.cpp + ui/effects/emoji_fly_animation.h + ui/effects/message_sending_animation_common.h + ui/effects/message_sending_animation_controller.cpp + ui/effects/message_sending_animation_controller.h + ui/effects/reaction_fly_animation.cpp + ui/effects/reaction_fly_animation.h ui/effects/send_action_animations.cpp ui/effects/send_action_animations.h ui/image/image.cpp @@ -1138,12 +1464,10 @@ PRIVATE ui/image/image_location_factory.h ui/widgets/level_meter.cpp ui/widgets/level_meter.h - ui/widgets/multi_select.cpp - ui/widgets/multi_select.h ui/countryinput.cpp ui/countryinput.h - ui/empty_userpic.cpp - ui/empty_userpic.h + ui/dynamic_thumbnails.cpp + ui/dynamic_thumbnails.h ui/filter_icons.cpp ui/filter_icons.h ui/filter_icon_panel.cpp @@ -1153,8 +1477,6 @@ PRIVATE ui/resize_area.h ui/search_field_controller.cpp ui/search_field_controller.h - ui/special_buttons.cpp - ui/special_buttons.h ui/text/format_song_document_name.cpp ui/text/format_song_document_name.h ui/unread_badge.cpp @@ -1186,13 +1508,12 @@ PRIVATE window/window_main_menu.h window/window_media_preview.cpp window/window_media_preview.h - window/window_outdated_bar.cpp - window/window_outdated_bar.h window/window_peer_menu.cpp window/window_peer_menu.h window/window_section_common.h window/window_session_controller.cpp window/window_session_controller.h + window/window_session_controller_link_info.h window/window_slide_animation.cpp window/window_slide_animation.h window/window_top_bar_wrap.h @@ -1217,8 +1538,6 @@ PRIVATE apiwrap.cpp apiwrap.h config.h - facades.cpp - facades.h logs.cpp logs.h main.cpp @@ -1229,6 +1548,8 @@ PRIVATE settings.cpp settings.h stdafx.h + tray.cpp + tray.h ) if (NOT build_winstore) @@ -1238,20 +1559,6 @@ if (NOT build_winstore) ) endif() -if (DESKTOP_APP_DISABLE_DBUS_INTEGRATION) - remove_target_sources(Telegram ${src_loc} - platform/linux/linux_xdp_file_dialog.cpp - platform/linux/linux_xdp_file_dialog.h - platform/linux/linux_xdp_open_with_dialog.cpp - platform/linux/linux_xdp_open_with_dialog.h - platform/linux/notifications_manager_linux.cpp - ) -else() - remove_target_sources(Telegram ${src_loc} - platform/linux/notifications_manager_linux_dummy.cpp - ) -endif() - if (DESKTOP_APP_DISABLE_WAYLAND_INTEGRATION) remove_target_sources(Telegram ${src_loc} platform/linux/linux_wayland_integration.cpp @@ -1277,7 +1584,11 @@ PRIVATE qrc/emoji_5.qrc qrc/emoji_6.qrc qrc/emoji_7.qrc + qrc/emoji_8.qrc qrc/emoji_preview.qrc + qrc/telegram/animations.qrc + qrc/telegram/export.qrc + qrc/telegram/iv.qrc qrc/telegram/telegram.qrc qrc/telegram/sounds.qrc winrc/Kotatogram.rc @@ -1287,6 +1598,13 @@ PRIVATE numbers.txt ) +if (APPLE AND NOT build_macstore) + nice_target_sources(Telegram ${res_loc} + PRIVATE + qrc/telegram/mac_icons.qrc + ) +endif() + if (WIN32) # message(${CMAKE_GENERATOR}) # mt.exe -manifest "${res_loc}/winrc/Telegram.manifest" "-inputresource:\"$\";#1" "-outputresource:\"$\";#1" >NUL @@ -1305,20 +1623,40 @@ elseif (APPLE) target_link_libraries(Telegram PRIVATE desktop-app::external_iconv) endif() - set(appicon_path ${CMAKE_CURRENT_SOURCE_DIR}/Telegram/Images.xcassets/Icon.iconset) - - add_custom_command( - OUTPUT AppIcon.icns - COMMAND iconutil - ARGS - --convert icns - --output AppIcon.icns - ${appicon_path} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - ) - - set_source_files_properties(AppIcon.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources) - target_add_resource(Telegram AppIcon.icns) + set(icons_path ${CMAKE_CURRENT_SOURCE_DIR}/Telegram/Images.xcassets) + if (CMAKE_GENERATOR STREQUAL Xcode) + target_add_resource(Telegram ${icons_path}) + else() + set(icon_path ${icons_path}/Icon.iconset) + find_program(ICONUTIL iconutil) + find_program(PNG2ICNS png2icns) + if (ICONUTIL) + add_custom_command( + OUTPUT Icon.icns + COMMAND ${ICONUTIL} + ARGS + --convert icns + --output Icon.icns + ${icon_path} + ) + elseif (PNG2ICNS) + add_custom_command( + OUTPUT Icon.icns + COMMAND ${PNG2ICNS} + ARGS + Icon.icns + ${icon_path}/icon_16x16.png + ${icon_path}/icon_32x32.png + ${icon_path}/icon_128x128.png + ${icon_path}/icon_256x256.png + ${icon_path}/icon_512x512.png + ) + endif() + if (ICONUTIL OR PNG2ICNS) + set_source_files_properties(Icon.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources) + target_add_resource(Telegram Icon.icns) + endif() + endif() set(lang_packs en @@ -1343,34 +1681,29 @@ elseif (APPLE) PRE_LINK COMMAND mkdir -p $/../Resources COMMAND cp ${CMAKE_BINARY_DIR}/lib_ui.rcc $/../Resources + COMMAND cp ${CMAKE_BINARY_DIR}/lib_spellcheck.rcc $/../Resources ) - if (NOT build_macstore) + if (NOT build_macstore AND NOT DESKTOP_APP_DISABLE_CRASH_REPORTS) + if (DESKTOP_APP_MAC_ARCH STREQUAL "x86_64" OR DESKTOP_APP_MAC_ARCH STREQUAL "arm64") + set(crashpad_dir_part ".${DESKTOP_APP_MAC_ARCH}") + else() + set(crashpad_dir_part "") + endif() add_custom_command(TARGET Telegram PRE_LINK - COMMAND mkdir -p $/../Frameworks - COMMAND cp $ $/../Frameworks/ + COMMAND mkdir -p $/../Helpers + COMMAND cp ${libs_loc}/crashpad/out/$,Debug,Release>${crashpad_dir_part}/crashpad_handler $/../Helpers/ ) - if (NOT DESKTOP_APP_DISABLE_CRASH_REPORTS) - if (DESKTOP_APP_MAC_ARCH STREQUAL "x86_64" OR DESKTOP_APP_MAC_ARCH STREQUAL "arm64") - set(crashpad_dir_part ".${DESKTOP_APP_MAC_ARCH}") - else() - set(crashpad_dir_part "") - endif() - add_custom_command(TARGET Telegram - PRE_LINK - COMMAND mkdir -p $/../Helpers - COMMAND cp ${libs_loc}/crashpad/out/$,Debug,Release>${crashpad_dir_part}/crashpad_handler $/../Helpers/ - ) - endif() endif() else() - if (NOT DESKTOP_APP_DISABLE_DBUS_INTEGRATION) - target_link_libraries(Telegram - PRIVATE - desktop-app::external_glibmm - desktop-app::external_glib - ) - endif() + target_link_libraries(Telegram + PRIVATE + desktop-app::external_glibmm + ) + + include(${cmake_helpers_loc}/external/glib/generate_dbus.cmake) + generate_dbus(Telegram org.freedesktop.portal. XdpBackground ${third_party_loc}/xdg-desktop-portal/data/org.freedesktop.portal.Background.xml) + generate_dbus(Telegram org.freedesktop. XdgNotifications ${src_loc}/platform/linux/org.freedesktop.Notifications.xml) if (NOT DESKTOP_APP_DISABLE_X11_INTEGRATION) target_link_libraries(Telegram @@ -1380,10 +1713,15 @@ else() endif() if (NOT DESKTOP_APP_DISABLE_WAYLAND_INTEGRATION) + qt_generate_wayland_protocol_client_sources(Telegram + FILES + ${third_party_loc}/wayland/protocol/wayland.xml + ${third_party_loc}/plasma-wayland-protocols/src/protocols/plasma-shell.xml + ) + target_link_libraries(Telegram PRIVATE - desktop-app::lib_waylandshells - desktop-app::external_kwayland + desktop-app::external_wayland_client ) endif() endif() @@ -1413,6 +1751,12 @@ else() set(bundle_entitlements "Telegram.entitlements") endif() +if (CMAKE_GENERATOR STREQUAL Xcode) + set(bundle_identifier_plist "$(PRODUCT_BUNDLE_IDENTIFIER)") +else() + set(bundle_identifier_plist ${bundle_identifier}) +endif() + set_target_properties(Telegram PROPERTIES OUTPUT_NAME ${output_name} MACOSX_BUNDLE_GUI_IDENTIFIER ${bundle_identifier} @@ -1428,6 +1772,7 @@ set_target_properties(Telegram PROPERTIES XCODE_ATTRIBUTE_ALWAYS_SEARCH_USER_PATHS NO XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY libc++ XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS --deep + XCODE_ATTRIBUTE_CLANG_DEBUG_INFORMATION_LEVEL $,default,line-tables-only> ) set(entitlement_sources "${CMAKE_CURRENT_SOURCE_DIR}/Telegram/Telegram.entitlements" @@ -1445,6 +1790,15 @@ PRIVATE G_LOG_DOMAIN="Kotatogram" ) +execute_process( + COMMAND git describe --tags --always + OUTPUT_VARIABLE KTGDESKTOP_GIT_VERSION +) +string(REGEX REPLACE "^(k|v)([0-9]\\.[0-9])" "\\2" KTGDESKTOP_GIT_VERSION "${KTGDESKTOP_GIT_VERSION}") +if (KTGDESKTOP_GIT_VERSION) + target_compile_definitions(Telegram PRIVATE KTGDESKTOP_GIT_VERSION="${KTGDESKTOP_GIT_VERSION}") +endif() + if (APPLE OR "${CMAKE_GENERATOR}" STREQUAL "Ninja Multi-Config" OR NOT CMAKE_EXECUTABLE_SUFFIX STREQUAL "" @@ -1488,7 +1842,9 @@ if (WIN32) ) endif() -if ((NOT DESKTOP_APP_DISABLE_AUTOUPDATE OR APPLE) AND NOT build_macstore AND NOT build_winstore) +target_prepare_qrc(Telegram) + +if (NOT DESKTOP_APP_DISABLE_AUTOUPDATE AND NOT build_macstore AND NOT build_winstore) add_executable(Updater WIN32) init_non_host_target(Updater) @@ -1535,6 +1891,12 @@ if ((NOT DESKTOP_APP_DISABLE_AUTOUPDATE OR APPLE) AND NOT build_macstore AND NOT else() target_link_options(Updater PRIVATE -municode) endif() + elseif (APPLE) + add_custom_command(TARGET Updater + PRE_LINK + COMMAND mkdir -p $/../Frameworks + COMMAND cp $ $/../Frameworks/ + ) endif() if (DESKTOP_APP_SPECIAL_TARGET OR KTGDESKTOP_ENABLE_PACKER) @@ -1577,8 +1939,9 @@ endif() if (LINUX AND DESKTOP_APP_USE_PACKAGED) include(GNUInstallDirs) - configure_file("../lib/xdg/kotatogramdesktop.metainfo.xml.in" "${CMAKE_CURRENT_BINARY_DIR}/kotatogramdesktop.metainfo.xml" @ONLY) - # generate_appdata_changelog(Telegram "${CMAKE_SOURCE_DIR}/changelog.txt" "${CMAKE_CURRENT_BINARY_DIR}/kotatogramdesktop.metainfo.xml") + configure_file("../lib/xdg/io.github.kotatogram.service" "${CMAKE_CURRENT_BINARY_DIR}/io.github.kotatogram.service" @ONLY) + configure_file("../lib/xdg/io.github.kotatogram.metainfo.xml" "${CMAKE_CURRENT_BINARY_DIR}/io.github.kotatogram.metainfo.xml" @ONLY) + #generate_appdata_changelog(Telegram "${CMAKE_SOURCE_DIR}/changelog.txt" "${CMAKE_CURRENT_BINARY_DIR}/io.github.kotatogram.metainfo.xml") install(TARGETS Telegram RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" BUNDLE DESTINATION "${CMAKE_INSTALL_BINDIR}") install(FILES "Resources/art/icon16.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/16x16/apps" RENAME "kotatogram.png") install(FILES "Resources/art/icon32.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/32x32/apps" RENAME "kotatogram.png") @@ -1587,6 +1950,8 @@ if (LINUX AND DESKTOP_APP_USE_PACKAGED) install(FILES "Resources/art/icon128.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/128x128/apps" RENAME "kotatogram.png") install(FILES "Resources/art/icon256.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/256x256/apps" RENAME "kotatogram.png") install(FILES "Resources/art/icon512.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/512x512/apps" RENAME "kotatogram.png") - install(FILES "../lib/xdg/kotatogramdesktop.desktop" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications" RENAME "${TDESKTOP_LAUNCHER_BASENAME}.desktop") - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/kotatogramdesktop.metainfo.xml" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/metainfo" RENAME "${TDESKTOP_LAUNCHER_BASENAME}.metainfo.xml") + install(FILES "Resources/icons/tray_monochrome.svg" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/symbolic/apps" RENAME "kotatogram-symbolic.svg") + install(FILES "../lib/xdg/io.github.kotatogram.desktop" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications") + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/io.github.kotatogram.service" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/dbus-1/services") + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/io.github.kotatogram.metainfo.xml" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/metainfo") endif() diff --git a/Telegram/Resources/animations/blocked_peers_empty.tgs b/Telegram/Resources/animations/blocked_peers_empty.tgs new file mode 100644 index 000000000..02d5a9de6 Binary files /dev/null and b/Telegram/Resources/animations/blocked_peers_empty.tgs differ diff --git a/Telegram/Resources/animations/change_number.tgs b/Telegram/Resources/animations/change_number.tgs new file mode 100644 index 000000000..fc113e1da Binary files /dev/null and b/Telegram/Resources/animations/change_number.tgs differ diff --git a/Telegram/Resources/animations/cloud_filters.tgs b/Telegram/Resources/animations/cloud_filters.tgs new file mode 100644 index 000000000..3e71d25b4 Binary files /dev/null and b/Telegram/Resources/animations/cloud_filters.tgs differ diff --git a/Telegram/Resources/animations/cloud_password/email.tgs b/Telegram/Resources/animations/cloud_password/email.tgs new file mode 100644 index 000000000..c8aa2e7b3 Binary files /dev/null and b/Telegram/Resources/animations/cloud_password/email.tgs differ diff --git a/Telegram/Resources/animations/cloud_password/hint.tgs b/Telegram/Resources/animations/cloud_password/hint.tgs new file mode 100644 index 000000000..c85dd321d Binary files /dev/null and b/Telegram/Resources/animations/cloud_password/hint.tgs differ diff --git a/Telegram/Resources/animations/cloud_password/intro.tgs b/Telegram/Resources/animations/cloud_password/intro.tgs new file mode 100644 index 000000000..853827521 Binary files /dev/null and b/Telegram/Resources/animations/cloud_password/intro.tgs differ diff --git a/Telegram/Resources/animations/cloud_password/password_input.tgs b/Telegram/Resources/animations/cloud_password/password_input.tgs new file mode 100644 index 000000000..f16eca5ad Binary files /dev/null and b/Telegram/Resources/animations/cloud_password/password_input.tgs differ diff --git a/Telegram/Resources/animations/discussion.tgs b/Telegram/Resources/animations/discussion.tgs new file mode 100644 index 000000000..b513b9457 Binary files /dev/null and b/Telegram/Resources/animations/discussion.tgs differ diff --git a/Telegram/Resources/animations/filters.tgs b/Telegram/Resources/animations/filters.tgs new file mode 100644 index 000000000..41b820a74 Binary files /dev/null and b/Telegram/Resources/animations/filters.tgs differ diff --git a/Telegram/Resources/animations/greeting.tgs b/Telegram/Resources/animations/greeting.tgs new file mode 100644 index 000000000..dd1ab78d2 Binary files /dev/null and b/Telegram/Resources/animations/greeting.tgs differ diff --git a/Telegram/Resources/animations/hours.tgs b/Telegram/Resources/animations/hours.tgs new file mode 100644 index 000000000..d49a48c32 Binary files /dev/null and b/Telegram/Resources/animations/hours.tgs differ diff --git a/Telegram/Resources/animations/local_passcode_enter.tgs b/Telegram/Resources/animations/local_passcode_enter.tgs new file mode 100644 index 000000000..e46c05c6e Binary files /dev/null and b/Telegram/Resources/animations/local_passcode_enter.tgs differ diff --git a/Telegram/Resources/animations/location.tgs b/Telegram/Resources/animations/location.tgs new file mode 100644 index 000000000..32ba54f16 Binary files /dev/null and b/Telegram/Resources/animations/location.tgs differ diff --git a/Telegram/Resources/animations/palette.tgs b/Telegram/Resources/animations/palette.tgs new file mode 100644 index 000000000..cc4887f94 Binary files /dev/null and b/Telegram/Resources/animations/palette.tgs differ diff --git a/Telegram/Resources/animations/phone.tgs b/Telegram/Resources/animations/phone.tgs new file mode 100644 index 000000000..7541526af Binary files /dev/null and b/Telegram/Resources/animations/phone.tgs differ diff --git a/Telegram/Resources/animations/robot.tgs b/Telegram/Resources/animations/robot.tgs new file mode 100644 index 000000000..0076344f4 Binary files /dev/null and b/Telegram/Resources/animations/robot.tgs differ diff --git a/Telegram/Resources/animations/sleep.tgs b/Telegram/Resources/animations/sleep.tgs new file mode 100644 index 000000000..b766d6e43 Binary files /dev/null and b/Telegram/Resources/animations/sleep.tgs differ diff --git a/Telegram/Resources/animations/stats.tgs b/Telegram/Resources/animations/stats.tgs new file mode 100644 index 000000000..4966041ce Binary files /dev/null and b/Telegram/Resources/animations/stats.tgs differ diff --git a/Telegram/Resources/animations/ttl.tgs b/Telegram/Resources/animations/ttl.tgs new file mode 100644 index 000000000..14c228a7f Binary files /dev/null and b/Telegram/Resources/animations/ttl.tgs differ diff --git a/Telegram/Resources/animations/voice_ttl_idle.tgs b/Telegram/Resources/animations/voice_ttl_idle.tgs new file mode 100644 index 000000000..016611298 Binary files /dev/null and b/Telegram/Resources/animations/voice_ttl_idle.tgs differ diff --git a/Telegram/Resources/animations/voice_ttl_start.tgs b/Telegram/Resources/animations/voice_ttl_start.tgs new file mode 100644 index 000000000..835556dd0 Binary files /dev/null and b/Telegram/Resources/animations/voice_ttl_start.tgs differ diff --git a/Telegram/Resources/animations/writing.tgs b/Telegram/Resources/animations/writing.tgs new file mode 100644 index 000000000..47caac05a Binary files /dev/null and b/Telegram/Resources/animations/writing.tgs differ diff --git a/Telegram/Resources/art/business_logo.png b/Telegram/Resources/art/business_logo.png new file mode 100644 index 000000000..25c357e50 Binary files /dev/null and b/Telegram/Resources/art/business_logo.png differ diff --git a/Telegram/Resources/art/icon_round512@2x.png b/Telegram/Resources/art/icon_round512@2x.png new file mode 100644 index 000000000..8f7b1098b Binary files /dev/null and b/Telegram/Resources/art/icon_round512@2x.png differ diff --git a/Telegram/Resources/art/topic_icons/blue.svg b/Telegram/Resources/art/topic_icons/blue.svg new file mode 100644 index 000000000..eb2a99bfc --- /dev/null +++ b/Telegram/Resources/art/topic_icons/blue.svg @@ -0,0 +1,18 @@ + + + topic blue + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telegram/Resources/art/topic_icons/general.svg b/Telegram/Resources/art/topic_icons/general.svg new file mode 100644 index 000000000..140ed8da5 --- /dev/null +++ b/Telegram/Resources/art/topic_icons/general.svg @@ -0,0 +1,7 @@ + + + general + + + + \ No newline at end of file diff --git a/Telegram/Resources/art/topic_icons/gray.svg b/Telegram/Resources/art/topic_icons/gray.svg new file mode 100644 index 000000000..b4db98c3f --- /dev/null +++ b/Telegram/Resources/art/topic_icons/gray.svg @@ -0,0 +1,18 @@ + + + topic gray + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telegram/Resources/art/topic_icons/green.svg b/Telegram/Resources/art/topic_icons/green.svg new file mode 100644 index 000000000..9140843ed --- /dev/null +++ b/Telegram/Resources/art/topic_icons/green.svg @@ -0,0 +1,18 @@ + + + topic green + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telegram/Resources/art/topic_icons/red.svg b/Telegram/Resources/art/topic_icons/red.svg new file mode 100644 index 000000000..8b7293c8c --- /dev/null +++ b/Telegram/Resources/art/topic_icons/red.svg @@ -0,0 +1,18 @@ + + + topic red + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telegram/Resources/art/topic_icons/rose.svg b/Telegram/Resources/art/topic_icons/rose.svg new file mode 100644 index 000000000..a730c0ea7 --- /dev/null +++ b/Telegram/Resources/art/topic_icons/rose.svg @@ -0,0 +1,18 @@ + + + topic rose + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telegram/Resources/art/topic_icons/violet.svg b/Telegram/Resources/art/topic_icons/violet.svg new file mode 100644 index 000000000..a54dfc5d2 --- /dev/null +++ b/Telegram/Resources/art/topic_icons/violet.svg @@ -0,0 +1,18 @@ + + + topic violet + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telegram/Resources/art/topic_icons/yellow.svg b/Telegram/Resources/art/topic_icons/yellow.svg new file mode 100644 index 000000000..c478ddfbe --- /dev/null +++ b/Telegram/Resources/art/topic_icons/yellow.svg @@ -0,0 +1,18 @@ + + + topic yellow + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telegram/Resources/art/ttl/video_message_icon.svg b/Telegram/Resources/art/ttl/video_message_icon.svg new file mode 100644 index 000000000..aeadc8385 --- /dev/null +++ b/Telegram/Resources/art/ttl/video_message_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Telegram/Resources/art/winners.tgs b/Telegram/Resources/art/winners.tgs new file mode 100644 index 000000000..d1112ecbe Binary files /dev/null and b/Telegram/Resources/art/winners.tgs differ diff --git a/Telegram/Resources/day-blue.tdesktop-theme b/Telegram/Resources/day-blue.tdesktop-theme index 2a413f9dc..54d4dfa29 100644 Binary files a/Telegram/Resources/day-blue.tdesktop-theme and b/Telegram/Resources/day-blue.tdesktop-theme differ diff --git a/Telegram/Resources/day-custom-base.tdesktop-theme b/Telegram/Resources/day-custom-base.tdesktop-theme index 2b662d1a3..d10f68c75 100644 Binary files a/Telegram/Resources/day-custom-base.tdesktop-theme and b/Telegram/Resources/day-custom-base.tdesktop-theme differ diff --git a/Telegram/Resources/emoji/emoji_1.webp b/Telegram/Resources/emoji/emoji_1.webp index 5cf0ce171..4bf92eca5 100644 Binary files a/Telegram/Resources/emoji/emoji_1.webp and b/Telegram/Resources/emoji/emoji_1.webp differ diff --git a/Telegram/Resources/emoji/emoji_2.webp b/Telegram/Resources/emoji/emoji_2.webp index e8c6b0526..988947793 100644 Binary files a/Telegram/Resources/emoji/emoji_2.webp and b/Telegram/Resources/emoji/emoji_2.webp differ diff --git a/Telegram/Resources/emoji/emoji_3.webp b/Telegram/Resources/emoji/emoji_3.webp index da371dbb3..5e2172deb 100644 Binary files a/Telegram/Resources/emoji/emoji_3.webp and b/Telegram/Resources/emoji/emoji_3.webp differ diff --git a/Telegram/Resources/emoji/emoji_4.webp b/Telegram/Resources/emoji/emoji_4.webp index 0a924eca9..4859c1337 100644 Binary files a/Telegram/Resources/emoji/emoji_4.webp and b/Telegram/Resources/emoji/emoji_4.webp differ diff --git a/Telegram/Resources/emoji/emoji_5.webp b/Telegram/Resources/emoji/emoji_5.webp index b8f816ca8..3539ebe03 100644 Binary files a/Telegram/Resources/emoji/emoji_5.webp and b/Telegram/Resources/emoji/emoji_5.webp differ diff --git a/Telegram/Resources/emoji/emoji_6.webp b/Telegram/Resources/emoji/emoji_6.webp index d2f5ff27e..8da39a6b1 100644 Binary files a/Telegram/Resources/emoji/emoji_6.webp and b/Telegram/Resources/emoji/emoji_6.webp differ diff --git a/Telegram/Resources/emoji/emoji_7.webp b/Telegram/Resources/emoji/emoji_7.webp index a09573ffb..3c31b2345 100644 Binary files a/Telegram/Resources/emoji/emoji_7.webp and b/Telegram/Resources/emoji/emoji_7.webp differ diff --git a/Telegram/Resources/emoji/emoji_8.webp b/Telegram/Resources/emoji/emoji_8.webp new file mode 100644 index 000000000..c3e6b3b0d Binary files /dev/null and b/Telegram/Resources/emoji/emoji_8.webp differ diff --git a/Telegram/Resources/export_html/css/style.css b/Telegram/Resources/export_html/css/style.css index 456d59f46..102f5f3a5 100644 --- a/Telegram/Resources/export_html/css/style.css +++ b/Telegram/Resources/export_html/css/style.css @@ -111,6 +111,11 @@ pre { border-radius: 50%; overflow: hidden; } +.story { + display: block; + border-radius: 4px; + overflow: hidden; +} .userpic .initials { display: block; color: #fff; @@ -194,6 +199,10 @@ a.block_link:hover { text-decoration: none !important; background-color: #f5f7f8; } +a.expanded { + padding: 2px 8px; + margin: -2px -8px; +} .sections { padding: 11px 0; } @@ -428,6 +437,9 @@ div.toast_shown { .section.sessions { background-image: url(../images/section_sessions.png); } +.section.stories { + background-image: url(../images/section_stories.png); +} .section.web { background-image: url(../images/section_web.png); } @@ -489,6 +501,9 @@ div.toast_shown { .section.sessions { background-image: url(../images/section_sessions@2x.png); } +.section.stories { + background-image: url(../images/section_stories@2x.png); +} .section.web { background-image: url(../images/section_web@2x.png); } @@ -544,3 +559,26 @@ div.toast_shown { opacity: 0; user-select: none; } + +.bot_buttons_table { + border-spacing: 0px 2px; + width: 100%; +} +.bot_button { + border-radius: 8px; + text-align: center; + vertical-align: middle; + background-color: #168acd40; +} +.bot_button_row { + display: table; + table-layout: fixed; + padding: 0px; + width:100%; +} +.bot_button_row div { + display: table-cell; +} +.bot_button_column_separator { + width: 2px +} diff --git a/Telegram/Resources/export_html/images/section_stories.png b/Telegram/Resources/export_html/images/section_stories.png new file mode 100644 index 000000000..650c69c91 Binary files /dev/null and b/Telegram/Resources/export_html/images/section_stories.png differ diff --git a/Telegram/Resources/export_html/images/section_stories@2x.png b/Telegram/Resources/export_html/images/section_stories@2x.png new file mode 100644 index 000000000..429245138 Binary files /dev/null and b/Telegram/Resources/export_html/images/section_stories@2x.png differ diff --git a/Telegram/Resources/export_html/js/script.js b/Telegram/Resources/export_html/js/script.js index 23b4009e5..284232202 100644 --- a/Telegram/Resources/export_html/js/script.js +++ b/Telegram/Resources/export_html/js/script.js @@ -52,6 +52,22 @@ function ShowMentionName() { return false; } +function ShowNotLoadedEmoji() { + ShowToast("This custom emoji is not included, change data exporting settings to download."); + return false; +} + +function ShowNotAvailableEmoji() { + ShowToast("This custom emoji is not available."); + return false; +} + +function ShowTextCopied(content) { + navigator.clipboard.writeText(content); + ShowToast("Text copied to clipboard."); + return false; +} + function ShowSpoiler(target) { if (target.classList.contains("hidden")) { target.classList.toggle("hidden"); diff --git a/Telegram/Resources/icons/archive_userpic.png b/Telegram/Resources/icons/archive_userpic.png index 00d2d7347..a00a7a61b 100644 Binary files a/Telegram/Resources/icons/archive_userpic.png and b/Telegram/Resources/icons/archive_userpic.png differ diff --git a/Telegram/Resources/icons/archive_userpic@2x.png b/Telegram/Resources/icons/archive_userpic@2x.png index a1b6aee6f..88767e039 100644 Binary files a/Telegram/Resources/icons/archive_userpic@2x.png and b/Telegram/Resources/icons/archive_userpic@2x.png differ diff --git a/Telegram/Resources/icons/archive_userpic@3x.png b/Telegram/Resources/icons/archive_userpic@3x.png index fb77161ef..d0076e1fe 100644 Binary files a/Telegram/Resources/icons/archive_userpic@3x.png and b/Telegram/Resources/icons/archive_userpic@3x.png differ diff --git a/Telegram/Resources/icons/boosts/boost_mini2.png b/Telegram/Resources/icons/boosts/boost_mini2.png new file mode 100644 index 000000000..b4884ccc8 Binary files /dev/null and b/Telegram/Resources/icons/boosts/boost_mini2.png differ diff --git a/Telegram/Resources/icons/boosts/boost_mini2@2x.png b/Telegram/Resources/icons/boosts/boost_mini2@2x.png new file mode 100644 index 000000000..9fb6e01e9 Binary files /dev/null and b/Telegram/Resources/icons/boosts/boost_mini2@2x.png differ diff --git a/Telegram/Resources/icons/boosts/boost_mini2@3x.png b/Telegram/Resources/icons/boosts/boost_mini2@3x.png new file mode 100644 index 000000000..16aff7dbe Binary files /dev/null and b/Telegram/Resources/icons/boosts/boost_mini2@3x.png differ diff --git a/Telegram/Resources/icons/boosts/boost_unclaimed.png b/Telegram/Resources/icons/boosts/boost_unclaimed.png new file mode 100644 index 000000000..fb093176f Binary files /dev/null and b/Telegram/Resources/icons/boosts/boost_unclaimed.png differ diff --git a/Telegram/Resources/icons/boosts/boost_unclaimed@2x.png b/Telegram/Resources/icons/boosts/boost_unclaimed@2x.png new file mode 100644 index 000000000..30d5bd6bc Binary files /dev/null and b/Telegram/Resources/icons/boosts/boost_unclaimed@2x.png differ diff --git a/Telegram/Resources/icons/boosts/boost_unclaimed@3x.png b/Telegram/Resources/icons/boosts/boost_unclaimed@3x.png new file mode 100644 index 000000000..f63cca1c9 Binary files /dev/null and b/Telegram/Resources/icons/boosts/boost_unclaimed@3x.png differ diff --git a/Telegram/Resources/icons/boosts/boost_unknown.png b/Telegram/Resources/icons/boosts/boost_unknown.png new file mode 100644 index 000000000..78f642852 Binary files /dev/null and b/Telegram/Resources/icons/boosts/boost_unknown.png differ diff --git a/Telegram/Resources/icons/boosts/boost_unknown@2x.png b/Telegram/Resources/icons/boosts/boost_unknown@2x.png new file mode 100644 index 000000000..ad22dc971 Binary files /dev/null and b/Telegram/Resources/icons/boosts/boost_unknown@2x.png differ diff --git a/Telegram/Resources/icons/boosts/boost_unknown@3x.png b/Telegram/Resources/icons/boosts/boost_unknown@3x.png new file mode 100644 index 000000000..bbf4532a2 Binary files /dev/null and b/Telegram/Resources/icons/boosts/boost_unknown@3x.png differ diff --git a/Telegram/Resources/icons/boosts/filled_gift.png b/Telegram/Resources/icons/boosts/filled_gift.png new file mode 100644 index 000000000..123818f74 Binary files /dev/null and b/Telegram/Resources/icons/boosts/filled_gift.png differ diff --git a/Telegram/Resources/icons/boosts/filled_gift@2x.png b/Telegram/Resources/icons/boosts/filled_gift@2x.png new file mode 100644 index 000000000..13e5102ed Binary files /dev/null and b/Telegram/Resources/icons/boosts/filled_gift@2x.png differ diff --git a/Telegram/Resources/icons/boosts/filled_gift@3x.png b/Telegram/Resources/icons/boosts/filled_gift@3x.png new file mode 100644 index 000000000..7e3ad4e24 Binary files /dev/null and b/Telegram/Resources/icons/boosts/filled_gift@3x.png differ diff --git a/Telegram/Resources/icons/boosts/mini_gift.png b/Telegram/Resources/icons/boosts/mini_gift.png new file mode 100644 index 000000000..1008e5124 Binary files /dev/null and b/Telegram/Resources/icons/boosts/mini_gift.png differ diff --git a/Telegram/Resources/icons/boosts/mini_gift@2x.png b/Telegram/Resources/icons/boosts/mini_gift@2x.png new file mode 100644 index 000000000..462d38764 Binary files /dev/null and b/Telegram/Resources/icons/boosts/mini_gift@2x.png differ diff --git a/Telegram/Resources/icons/boosts/mini_gift@3x.png b/Telegram/Resources/icons/boosts/mini_gift@3x.png new file mode 100644 index 000000000..8858b4fff Binary files /dev/null and b/Telegram/Resources/icons/boosts/mini_gift@3x.png differ diff --git a/Telegram/Resources/icons/boosts/mini_giveaway.png b/Telegram/Resources/icons/boosts/mini_giveaway.png new file mode 100644 index 000000000..79ffc0f1d Binary files /dev/null and b/Telegram/Resources/icons/boosts/mini_giveaway.png differ diff --git a/Telegram/Resources/icons/boosts/mini_giveaway@2x.png b/Telegram/Resources/icons/boosts/mini_giveaway@2x.png new file mode 100644 index 000000000..bb5e94a65 Binary files /dev/null and b/Telegram/Resources/icons/boosts/mini_giveaway@2x.png differ diff --git a/Telegram/Resources/icons/boosts/mini_giveaway@3x.png b/Telegram/Resources/icons/boosts/mini_giveaway@3x.png new file mode 100644 index 000000000..c9f853452 Binary files /dev/null and b/Telegram/Resources/icons/boosts/mini_giveaway@3x.png differ diff --git a/Telegram/Resources/icons/bubble_tail1.png b/Telegram/Resources/icons/bubble_tail1.png deleted file mode 100644 index 65d577e95..000000000 Binary files a/Telegram/Resources/icons/bubble_tail1.png and /dev/null differ diff --git a/Telegram/Resources/icons/bubble_tail1@2x.png b/Telegram/Resources/icons/bubble_tail1@2x.png deleted file mode 100644 index ebeca1511..000000000 Binary files a/Telegram/Resources/icons/bubble_tail1@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/bubble_tail1@3x.png b/Telegram/Resources/icons/bubble_tail1@3x.png deleted file mode 100644 index e11ccb08b..000000000 Binary files a/Telegram/Resources/icons/bubble_tail1@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/bubble_tail2.png b/Telegram/Resources/icons/bubble_tail2.png deleted file mode 100644 index 3b6614560..000000000 Binary files a/Telegram/Resources/icons/bubble_tail2.png and /dev/null differ diff --git a/Telegram/Resources/icons/bubble_tail2@2x.png b/Telegram/Resources/icons/bubble_tail2@2x.png deleted file mode 100644 index eb2b0a364..000000000 Binary files a/Telegram/Resources/icons/bubble_tail2@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/bubble_tail2@3x.png b/Telegram/Resources/icons/bubble_tail2@3x.png deleted file mode 100644 index aa368174b..000000000 Binary files a/Telegram/Resources/icons/bubble_tail2@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/calendar_down.png b/Telegram/Resources/icons/calendar_down.png index e7213ec36..f0357feba 100644 Binary files a/Telegram/Resources/icons/calendar_down.png and b/Telegram/Resources/icons/calendar_down.png differ diff --git a/Telegram/Resources/icons/calendar_down@2x.png b/Telegram/Resources/icons/calendar_down@2x.png index 8ee33ea61..f15877eb2 100644 Binary files a/Telegram/Resources/icons/calendar_down@2x.png and b/Telegram/Resources/icons/calendar_down@2x.png differ diff --git a/Telegram/Resources/icons/calendar_down@3x.png b/Telegram/Resources/icons/calendar_down@3x.png index f48c3def0..06c06e6b0 100644 Binary files a/Telegram/Resources/icons/calendar_down@3x.png and b/Telegram/Resources/icons/calendar_down@3x.png differ diff --git a/Telegram/Resources/icons/calls/call_arrow_in.png b/Telegram/Resources/icons/calls/call_arrow_in.png index a5331ec85..76e136a67 100644 Binary files a/Telegram/Resources/icons/calls/call_arrow_in.png and b/Telegram/Resources/icons/calls/call_arrow_in.png differ diff --git a/Telegram/Resources/icons/calls/call_arrow_in@2x.png b/Telegram/Resources/icons/calls/call_arrow_in@2x.png index 59c1fe963..dd7838ab4 100644 Binary files a/Telegram/Resources/icons/calls/call_arrow_in@2x.png and b/Telegram/Resources/icons/calls/call_arrow_in@2x.png differ diff --git a/Telegram/Resources/icons/calls/call_arrow_in@3x.png b/Telegram/Resources/icons/calls/call_arrow_in@3x.png index ca09f2cbc..b8eefab96 100644 Binary files a/Telegram/Resources/icons/calls/call_arrow_in@3x.png and b/Telegram/Resources/icons/calls/call_arrow_in@3x.png differ diff --git a/Telegram/Resources/icons/calls/call_arrow_out.png b/Telegram/Resources/icons/calls/call_arrow_out.png index dd334ebe8..815b45a91 100644 Binary files a/Telegram/Resources/icons/calls/call_arrow_out.png and b/Telegram/Resources/icons/calls/call_arrow_out.png differ diff --git a/Telegram/Resources/icons/calls/call_arrow_out@2x.png b/Telegram/Resources/icons/calls/call_arrow_out@2x.png index 61830afb5..5b25ef80a 100644 Binary files a/Telegram/Resources/icons/calls/call_arrow_out@2x.png and b/Telegram/Resources/icons/calls/call_arrow_out@2x.png differ diff --git a/Telegram/Resources/icons/calls/call_arrow_out@3x.png b/Telegram/Resources/icons/calls/call_arrow_out@3x.png index 7215f8694..42d56a700 100644 Binary files a/Telegram/Resources/icons/calls/call_arrow_out@3x.png and b/Telegram/Resources/icons/calls/call_arrow_out@3x.png differ diff --git a/Telegram/Resources/icons/calls/navbar_pin.png b/Telegram/Resources/icons/calls/navbar_pin.png new file mode 100644 index 000000000..a24740603 Binary files /dev/null and b/Telegram/Resources/icons/calls/navbar_pin.png differ diff --git a/Telegram/Resources/icons/calls/navbar_pin@2x.png b/Telegram/Resources/icons/calls/navbar_pin@2x.png new file mode 100644 index 000000000..862df2676 Binary files /dev/null and b/Telegram/Resources/icons/calls/navbar_pin@2x.png differ diff --git a/Telegram/Resources/icons/calls/navbar_pin@3x.png b/Telegram/Resources/icons/calls/navbar_pin@3x.png new file mode 100644 index 000000000..651bf075b Binary files /dev/null and b/Telegram/Resources/icons/calls/navbar_pin@3x.png differ diff --git a/Telegram/Resources/icons/calls/navbar_pin_filled.png b/Telegram/Resources/icons/calls/navbar_pin_filled.png new file mode 100644 index 000000000..9059f4c61 Binary files /dev/null and b/Telegram/Resources/icons/calls/navbar_pin_filled.png differ diff --git a/Telegram/Resources/icons/calls/navbar_pin_filled@2x.png b/Telegram/Resources/icons/calls/navbar_pin_filled@2x.png new file mode 100644 index 000000000..d75faf36b Binary files /dev/null and b/Telegram/Resources/icons/calls/navbar_pin_filled@2x.png differ diff --git a/Telegram/Resources/icons/calls/navbar_pin_filled@3x.png b/Telegram/Resources/icons/calls/navbar_pin_filled@3x.png new file mode 100644 index 000000000..ab1a5b425 Binary files /dev/null and b/Telegram/Resources/icons/calls/navbar_pin_filled@3x.png differ diff --git a/Telegram/Resources/icons/chat/audio_once.png b/Telegram/Resources/icons/chat/audio_once.png new file mode 100644 index 000000000..4d1f93652 Binary files /dev/null and b/Telegram/Resources/icons/chat/audio_once.png differ diff --git a/Telegram/Resources/icons/chat/audio_once@2x.png b/Telegram/Resources/icons/chat/audio_once@2x.png new file mode 100644 index 000000000..f66cfbbcb Binary files /dev/null and b/Telegram/Resources/icons/chat/audio_once@2x.png differ diff --git a/Telegram/Resources/icons/chat/audio_once@3x.png b/Telegram/Resources/icons/chat/audio_once@3x.png new file mode 100644 index 000000000..bce2481c5 Binary files /dev/null and b/Telegram/Resources/icons/chat/audio_once@3x.png differ diff --git a/Telegram/Resources/icons/chat/input_attach.png b/Telegram/Resources/icons/chat/input_attach.png index cfc7ae195..852c1d4ec 100644 Binary files a/Telegram/Resources/icons/chat/input_attach.png and b/Telegram/Resources/icons/chat/input_attach.png differ diff --git a/Telegram/Resources/icons/chat/input_attach@2x.png b/Telegram/Resources/icons/chat/input_attach@2x.png index 19787fa84..42fd92806 100644 Binary files a/Telegram/Resources/icons/chat/input_attach@2x.png and b/Telegram/Resources/icons/chat/input_attach@2x.png differ diff --git a/Telegram/Resources/icons/chat/input_attach@3x.png b/Telegram/Resources/icons/chat/input_attach@3x.png index d24e17ddf..1e46a7c10 100644 Binary files a/Telegram/Resources/icons/chat/input_attach@3x.png and b/Telegram/Resources/icons/chat/input_attach@3x.png differ diff --git a/Telegram/Resources/icons/chat/input_autodelete.png b/Telegram/Resources/icons/chat/input_autodelete.png new file mode 100644 index 000000000..68f8f7b74 Binary files /dev/null and b/Telegram/Resources/icons/chat/input_autodelete.png differ diff --git a/Telegram/Resources/icons/chat/input_autodelete@2x.png b/Telegram/Resources/icons/chat/input_autodelete@2x.png new file mode 100644 index 000000000..37c858111 Binary files /dev/null and b/Telegram/Resources/icons/chat/input_autodelete@2x.png differ diff --git a/Telegram/Resources/icons/chat/input_autodelete@3x.png b/Telegram/Resources/icons/chat/input_autodelete@3x.png new file mode 100644 index 000000000..2ad4551d1 Binary files /dev/null and b/Telegram/Resources/icons/chat/input_autodelete@3x.png differ diff --git a/Telegram/Resources/icons/chat/input_autodelete_1d.png b/Telegram/Resources/icons/chat/input_autodelete_1d.png deleted file mode 100644 index 82a7179ea..000000000 Binary files a/Telegram/Resources/icons/chat/input_autodelete_1d.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/input_autodelete_1d@2x.png b/Telegram/Resources/icons/chat/input_autodelete_1d@2x.png deleted file mode 100644 index 7b18d0760..000000000 Binary files a/Telegram/Resources/icons/chat/input_autodelete_1d@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/input_autodelete_1d@3x.png b/Telegram/Resources/icons/chat/input_autodelete_1d@3x.png deleted file mode 100644 index 95b78d7a7..000000000 Binary files a/Telegram/Resources/icons/chat/input_autodelete_1d@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/input_autodelete_1d_ru.png b/Telegram/Resources/icons/chat/input_autodelete_1d_ru.png deleted file mode 100644 index 7a9d6f650..000000000 Binary files a/Telegram/Resources/icons/chat/input_autodelete_1d_ru.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/input_autodelete_1d_ru@2x.png b/Telegram/Resources/icons/chat/input_autodelete_1d_ru@2x.png deleted file mode 100644 index ee33f2d76..000000000 Binary files a/Telegram/Resources/icons/chat/input_autodelete_1d_ru@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/input_autodelete_1d_ru@3x.png b/Telegram/Resources/icons/chat/input_autodelete_1d_ru@3x.png deleted file mode 100644 index 568994ea3..000000000 Binary files a/Telegram/Resources/icons/chat/input_autodelete_1d_ru@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/input_autodelete_30d.png b/Telegram/Resources/icons/chat/input_autodelete_30d.png deleted file mode 100644 index dc06d9a4d..000000000 Binary files a/Telegram/Resources/icons/chat/input_autodelete_30d.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/input_autodelete_30d@2x.png b/Telegram/Resources/icons/chat/input_autodelete_30d@2x.png deleted file mode 100644 index b9f03cbbb..000000000 Binary files a/Telegram/Resources/icons/chat/input_autodelete_30d@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/input_autodelete_30d@3x.png b/Telegram/Resources/icons/chat/input_autodelete_30d@3x.png deleted file mode 100644 index 69674dfda..000000000 Binary files a/Telegram/Resources/icons/chat/input_autodelete_30d@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/input_autodelete_30d_ru.png b/Telegram/Resources/icons/chat/input_autodelete_30d_ru.png deleted file mode 100644 index 138415b3f..000000000 Binary files a/Telegram/Resources/icons/chat/input_autodelete_30d_ru.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/input_autodelete_30d_ru@2x.png b/Telegram/Resources/icons/chat/input_autodelete_30d_ru@2x.png deleted file mode 100644 index 8ee216c1e..000000000 Binary files a/Telegram/Resources/icons/chat/input_autodelete_30d_ru@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/input_autodelete_30d_ru@3x.png b/Telegram/Resources/icons/chat/input_autodelete_30d_ru@3x.png deleted file mode 100644 index 77ba43466..000000000 Binary files a/Telegram/Resources/icons/chat/input_autodelete_30d_ru@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/input_autodelete_7d.png b/Telegram/Resources/icons/chat/input_autodelete_7d.png deleted file mode 100644 index 2f3a867fa..000000000 Binary files a/Telegram/Resources/icons/chat/input_autodelete_7d.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/input_autodelete_7d@2x.png b/Telegram/Resources/icons/chat/input_autodelete_7d@2x.png deleted file mode 100644 index 183764926..000000000 Binary files a/Telegram/Resources/icons/chat/input_autodelete_7d@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/input_autodelete_7d@3x.png b/Telegram/Resources/icons/chat/input_autodelete_7d@3x.png deleted file mode 100644 index 0c54ebc5f..000000000 Binary files a/Telegram/Resources/icons/chat/input_autodelete_7d@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/input_autodelete_7d_ru.png b/Telegram/Resources/icons/chat/input_autodelete_7d_ru.png deleted file mode 100644 index c4e563716..000000000 Binary files a/Telegram/Resources/icons/chat/input_autodelete_7d_ru.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/input_autodelete_7d_ru@2x.png b/Telegram/Resources/icons/chat/input_autodelete_7d_ru@2x.png deleted file mode 100644 index 330343b0a..000000000 Binary files a/Telegram/Resources/icons/chat/input_autodelete_7d_ru@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/input_autodelete_7d_ru@3x.png b/Telegram/Resources/icons/chat/input_autodelete_7d_ru@3x.png deleted file mode 100644 index cbabf3178..000000000 Binary files a/Telegram/Resources/icons/chat/input_autodelete_7d_ru@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/input_bot_command.png b/Telegram/Resources/icons/chat/input_bot_command.png index f9863a78a..de47f606a 100644 Binary files a/Telegram/Resources/icons/chat/input_bot_command.png and b/Telegram/Resources/icons/chat/input_bot_command.png differ diff --git a/Telegram/Resources/icons/chat/input_bot_command@2x.png b/Telegram/Resources/icons/chat/input_bot_command@2x.png index 11b5db90e..fc879a405 100644 Binary files a/Telegram/Resources/icons/chat/input_bot_command@2x.png and b/Telegram/Resources/icons/chat/input_bot_command@2x.png differ diff --git a/Telegram/Resources/icons/chat/input_bot_command@3x.png b/Telegram/Resources/icons/chat/input_bot_command@3x.png index 6116615c7..09308bfe5 100644 Binary files a/Telegram/Resources/icons/chat/input_bot_command@3x.png and b/Telegram/Resources/icons/chat/input_bot_command@3x.png differ diff --git a/Telegram/Resources/icons/chat/input_bot_keyboard.png b/Telegram/Resources/icons/chat/input_bot_keyboard.png index c39fed337..56366259c 100644 Binary files a/Telegram/Resources/icons/chat/input_bot_keyboard.png and b/Telegram/Resources/icons/chat/input_bot_keyboard.png differ diff --git a/Telegram/Resources/icons/chat/input_bot_keyboard@2x.png b/Telegram/Resources/icons/chat/input_bot_keyboard@2x.png index 0d6b9e60d..fa9c349e3 100644 Binary files a/Telegram/Resources/icons/chat/input_bot_keyboard@2x.png and b/Telegram/Resources/icons/chat/input_bot_keyboard@2x.png differ diff --git a/Telegram/Resources/icons/chat/input_bot_keyboard@3x.png b/Telegram/Resources/icons/chat/input_bot_keyboard@3x.png index 3f85cd407..2ddaa5d2f 100644 Binary files a/Telegram/Resources/icons/chat/input_bot_keyboard@3x.png and b/Telegram/Resources/icons/chat/input_bot_keyboard@3x.png differ diff --git a/Telegram/Resources/icons/chat/input_bot_keyboard_hide.png b/Telegram/Resources/icons/chat/input_bot_keyboard_hide.png index c76fed691..ce4857792 100644 Binary files a/Telegram/Resources/icons/chat/input_bot_keyboard_hide.png and b/Telegram/Resources/icons/chat/input_bot_keyboard_hide.png differ diff --git a/Telegram/Resources/icons/chat/input_bot_keyboard_hide@2x.png b/Telegram/Resources/icons/chat/input_bot_keyboard_hide@2x.png index 7540076dc..b16a2f634 100644 Binary files a/Telegram/Resources/icons/chat/input_bot_keyboard_hide@2x.png and b/Telegram/Resources/icons/chat/input_bot_keyboard_hide@2x.png differ diff --git a/Telegram/Resources/icons/chat/input_bot_keyboard_hide@3x.png b/Telegram/Resources/icons/chat/input_bot_keyboard_hide@3x.png index 83c00a7e1..80fc2b800 100644 Binary files a/Telegram/Resources/icons/chat/input_bot_keyboard_hide@3x.png and b/Telegram/Resources/icons/chat/input_bot_keyboard_hide@3x.png differ diff --git a/Telegram/Resources/icons/chat/input_draw.png b/Telegram/Resources/icons/chat/input_draw.png new file mode 100644 index 000000000..37f5c854c Binary files /dev/null and b/Telegram/Resources/icons/chat/input_draw.png differ diff --git a/Telegram/Resources/icons/chat/input_draw@2x.png b/Telegram/Resources/icons/chat/input_draw@2x.png new file mode 100644 index 000000000..0087392e5 Binary files /dev/null and b/Telegram/Resources/icons/chat/input_draw@2x.png differ diff --git a/Telegram/Resources/icons/chat/input_draw@3x.png b/Telegram/Resources/icons/chat/input_draw@3x.png new file mode 100644 index 000000000..e2fd682f6 Binary files /dev/null and b/Telegram/Resources/icons/chat/input_draw@3x.png differ diff --git a/Telegram/Resources/icons/chat/input_edit.png b/Telegram/Resources/icons/chat/input_edit.png index 28639bab2..432825313 100644 Binary files a/Telegram/Resources/icons/chat/input_edit.png and b/Telegram/Resources/icons/chat/input_edit.png differ diff --git a/Telegram/Resources/icons/chat/input_edit@2x.png b/Telegram/Resources/icons/chat/input_edit@2x.png index 8e7bbf2ed..70c031a4a 100644 Binary files a/Telegram/Resources/icons/chat/input_edit@2x.png and b/Telegram/Resources/icons/chat/input_edit@2x.png differ diff --git a/Telegram/Resources/icons/chat/input_edit@3x.png b/Telegram/Resources/icons/chat/input_edit@3x.png index 7da15659a..fa6be01a5 100644 Binary files a/Telegram/Resources/icons/chat/input_edit@3x.png and b/Telegram/Resources/icons/chat/input_edit@3x.png differ diff --git a/Telegram/Resources/icons/chat/input_forward.png b/Telegram/Resources/icons/chat/input_forward.png index c04e20ceb..2d9c78335 100644 Binary files a/Telegram/Resources/icons/chat/input_forward.png and b/Telegram/Resources/icons/chat/input_forward.png differ diff --git a/Telegram/Resources/icons/chat/input_forward@2x.png b/Telegram/Resources/icons/chat/input_forward@2x.png index c500804d0..26e435458 100644 Binary files a/Telegram/Resources/icons/chat/input_forward@2x.png and b/Telegram/Resources/icons/chat/input_forward@2x.png differ diff --git a/Telegram/Resources/icons/chat/input_forward@3x.png b/Telegram/Resources/icons/chat/input_forward@3x.png index 9df3f2369..488f8e1e1 100644 Binary files a/Telegram/Resources/icons/chat/input_forward@3x.png and b/Telegram/Resources/icons/chat/input_forward@3x.png differ diff --git a/Telegram/Resources/icons/chat/input_like.png b/Telegram/Resources/icons/chat/input_like.png new file mode 100644 index 000000000..c7ccead7e Binary files /dev/null and b/Telegram/Resources/icons/chat/input_like.png differ diff --git a/Telegram/Resources/icons/chat/input_like@2x.png b/Telegram/Resources/icons/chat/input_like@2x.png new file mode 100644 index 000000000..965ae814b Binary files /dev/null and b/Telegram/Resources/icons/chat/input_like@2x.png differ diff --git a/Telegram/Resources/icons/chat/input_like@3x.png b/Telegram/Resources/icons/chat/input_like@3x.png new file mode 100644 index 000000000..cb2285df9 Binary files /dev/null and b/Telegram/Resources/icons/chat/input_like@3x.png differ diff --git a/Telegram/Resources/icons/chat/input_liked.png b/Telegram/Resources/icons/chat/input_liked.png new file mode 100644 index 000000000..5a267ca1d Binary files /dev/null and b/Telegram/Resources/icons/chat/input_liked.png differ diff --git a/Telegram/Resources/icons/chat/input_liked@2x.png b/Telegram/Resources/icons/chat/input_liked@2x.png new file mode 100644 index 000000000..600b472be Binary files /dev/null and b/Telegram/Resources/icons/chat/input_liked@2x.png differ diff --git a/Telegram/Resources/icons/chat/input_liked@3x.png b/Telegram/Resources/icons/chat/input_liked@3x.png new file mode 100644 index 000000000..5d6c546e6 Binary files /dev/null and b/Telegram/Resources/icons/chat/input_liked@3x.png differ diff --git a/Telegram/Resources/icons/chat/input_link_settings.png b/Telegram/Resources/icons/chat/input_link_settings.png new file mode 100644 index 000000000..bd01d4ad1 Binary files /dev/null and b/Telegram/Resources/icons/chat/input_link_settings.png differ diff --git a/Telegram/Resources/icons/chat/input_link_settings@2x.png b/Telegram/Resources/icons/chat/input_link_settings@2x.png new file mode 100644 index 000000000..0eb12d203 Binary files /dev/null and b/Telegram/Resources/icons/chat/input_link_settings@2x.png differ diff --git a/Telegram/Resources/icons/chat/input_link_settings@3x.png b/Telegram/Resources/icons/chat/input_link_settings@3x.png new file mode 100644 index 000000000..851858faf Binary files /dev/null and b/Telegram/Resources/icons/chat/input_link_settings@3x.png differ diff --git a/Telegram/Resources/icons/chat/input_record.png b/Telegram/Resources/icons/chat/input_record.png index 35efc9b52..af2c2eed4 100644 Binary files a/Telegram/Resources/icons/chat/input_record.png and b/Telegram/Resources/icons/chat/input_record.png differ diff --git a/Telegram/Resources/icons/chat/input_record@2x.png b/Telegram/Resources/icons/chat/input_record@2x.png index 3bfefbbb1..0d0869951 100644 Binary files a/Telegram/Resources/icons/chat/input_record@2x.png and b/Telegram/Resources/icons/chat/input_record@2x.png differ diff --git a/Telegram/Resources/icons/chat/input_record@3x.png b/Telegram/Resources/icons/chat/input_record@3x.png index 851e517bd..df31cf9e8 100644 Binary files a/Telegram/Resources/icons/chat/input_record@3x.png and b/Telegram/Resources/icons/chat/input_record@3x.png differ diff --git a/Telegram/Resources/icons/chat/input_record_filled.png b/Telegram/Resources/icons/chat/input_record_filled.png index 48b9786b4..d1c14a2c2 100644 Binary files a/Telegram/Resources/icons/chat/input_record_filled.png and b/Telegram/Resources/icons/chat/input_record_filled.png differ diff --git a/Telegram/Resources/icons/chat/input_record_filled@2x.png b/Telegram/Resources/icons/chat/input_record_filled@2x.png index 3ff966ba0..e02119463 100644 Binary files a/Telegram/Resources/icons/chat/input_record_filled@2x.png and b/Telegram/Resources/icons/chat/input_record_filled@2x.png differ diff --git a/Telegram/Resources/icons/chat/input_record_filled@3x.png b/Telegram/Resources/icons/chat/input_record_filled@3x.png index 481fbc14a..1a2211196 100644 Binary files a/Telegram/Resources/icons/chat/input_record_filled@3x.png and b/Telegram/Resources/icons/chat/input_record_filled@3x.png differ diff --git a/Telegram/Resources/icons/chat/input_replace.png b/Telegram/Resources/icons/chat/input_replace.png new file mode 100644 index 000000000..e0bc68cb3 Binary files /dev/null and b/Telegram/Resources/icons/chat/input_replace.png differ diff --git a/Telegram/Resources/icons/chat/input_replace@2x.png b/Telegram/Resources/icons/chat/input_replace@2x.png new file mode 100644 index 000000000..3a634692a Binary files /dev/null and b/Telegram/Resources/icons/chat/input_replace@2x.png differ diff --git a/Telegram/Resources/icons/chat/input_replace@3x.png b/Telegram/Resources/icons/chat/input_replace@3x.png new file mode 100644 index 000000000..edcd082af Binary files /dev/null and b/Telegram/Resources/icons/chat/input_replace@3x.png differ diff --git a/Telegram/Resources/icons/chat/input_reply.png b/Telegram/Resources/icons/chat/input_reply.png deleted file mode 100644 index f20b99773..000000000 Binary files a/Telegram/Resources/icons/chat/input_reply.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/input_reply@2x.png b/Telegram/Resources/icons/chat/input_reply@2x.png deleted file mode 100644 index e44f5f79e..000000000 Binary files a/Telegram/Resources/icons/chat/input_reply@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/input_reply@3x.png b/Telegram/Resources/icons/chat/input_reply@3x.png deleted file mode 100644 index 97688789f..000000000 Binary files a/Telegram/Resources/icons/chat/input_reply@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/input_reply_quote.png b/Telegram/Resources/icons/chat/input_reply_quote.png new file mode 100644 index 000000000..0f0ade5dc Binary files /dev/null and b/Telegram/Resources/icons/chat/input_reply_quote.png differ diff --git a/Telegram/Resources/icons/chat/input_reply_quote@2x.png b/Telegram/Resources/icons/chat/input_reply_quote@2x.png new file mode 100644 index 000000000..c7bcb7d8e Binary files /dev/null and b/Telegram/Resources/icons/chat/input_reply_quote@2x.png differ diff --git a/Telegram/Resources/icons/chat/input_reply_quote@3x.png b/Telegram/Resources/icons/chat/input_reply_quote@3x.png new file mode 100644 index 000000000..f1bc500a1 Binary files /dev/null and b/Telegram/Resources/icons/chat/input_reply_quote@3x.png differ diff --git a/Telegram/Resources/icons/chat/input_reply_settings.png b/Telegram/Resources/icons/chat/input_reply_settings.png new file mode 100644 index 000000000..9b67e535c Binary files /dev/null and b/Telegram/Resources/icons/chat/input_reply_settings.png differ diff --git a/Telegram/Resources/icons/chat/input_reply_settings@2x.png b/Telegram/Resources/icons/chat/input_reply_settings@2x.png new file mode 100644 index 000000000..2a4aef116 Binary files /dev/null and b/Telegram/Resources/icons/chat/input_reply_settings@2x.png differ diff --git a/Telegram/Resources/icons/chat/input_reply_settings@3x.png b/Telegram/Resources/icons/chat/input_reply_settings@3x.png new file mode 100644 index 000000000..e2f131d6a Binary files /dev/null and b/Telegram/Resources/icons/chat/input_reply_settings@3x.png differ diff --git a/Telegram/Resources/icons/chat/input_save.png b/Telegram/Resources/icons/chat/input_save.png index 766d7585a..762ae8f4b 100644 Binary files a/Telegram/Resources/icons/chat/input_save.png and b/Telegram/Resources/icons/chat/input_save.png differ diff --git a/Telegram/Resources/icons/chat/input_save@2x.png b/Telegram/Resources/icons/chat/input_save@2x.png index f8314d4e2..68d1cdfdf 100644 Binary files a/Telegram/Resources/icons/chat/input_save@2x.png and b/Telegram/Resources/icons/chat/input_save@2x.png differ diff --git a/Telegram/Resources/icons/chat/input_save@3x.png b/Telegram/Resources/icons/chat/input_save@3x.png index fb49ed6a5..d0995b86c 100644 Binary files a/Telegram/Resources/icons/chat/input_save@3x.png and b/Telegram/Resources/icons/chat/input_save@3x.png differ diff --git a/Telegram/Resources/icons/chat/input_scheduled.png b/Telegram/Resources/icons/chat/input_scheduled.png index 054948651..2f057ff29 100644 Binary files a/Telegram/Resources/icons/chat/input_scheduled.png and b/Telegram/Resources/icons/chat/input_scheduled.png differ diff --git a/Telegram/Resources/icons/chat/input_scheduled@2x.png b/Telegram/Resources/icons/chat/input_scheduled@2x.png index e080db29e..213da8d67 100644 Binary files a/Telegram/Resources/icons/chat/input_scheduled@2x.png and b/Telegram/Resources/icons/chat/input_scheduled@2x.png differ diff --git a/Telegram/Resources/icons/chat/input_scheduled@3x.png b/Telegram/Resources/icons/chat/input_scheduled@3x.png index cab04cfad..a7e336763 100644 Binary files a/Telegram/Resources/icons/chat/input_scheduled@3x.png and b/Telegram/Resources/icons/chat/input_scheduled@3x.png differ diff --git a/Telegram/Resources/icons/chat/input_scheduled_dot.png b/Telegram/Resources/icons/chat/input_scheduled_dot.png index 30dc17fb0..b68359d94 100644 Binary files a/Telegram/Resources/icons/chat/input_scheduled_dot.png and b/Telegram/Resources/icons/chat/input_scheduled_dot.png differ diff --git a/Telegram/Resources/icons/chat/input_scheduled_dot@2x.png b/Telegram/Resources/icons/chat/input_scheduled_dot@2x.png index 81abce9ab..e8bd9ed74 100644 Binary files a/Telegram/Resources/icons/chat/input_scheduled_dot@2x.png and b/Telegram/Resources/icons/chat/input_scheduled_dot@2x.png differ diff --git a/Telegram/Resources/icons/chat/input_scheduled_dot@3x.png b/Telegram/Resources/icons/chat/input_scheduled_dot@3x.png index e67ec3123..d1199622e 100644 Binary files a/Telegram/Resources/icons/chat/input_scheduled_dot@3x.png and b/Telegram/Resources/icons/chat/input_scheduled_dot@3x.png differ diff --git a/Telegram/Resources/icons/chat/input_silent.png b/Telegram/Resources/icons/chat/input_silent.png index a3258b083..e109ec878 100644 Binary files a/Telegram/Resources/icons/chat/input_silent.png and b/Telegram/Resources/icons/chat/input_silent.png differ diff --git a/Telegram/Resources/icons/chat/input_silent@2x.png b/Telegram/Resources/icons/chat/input_silent@2x.png index a66514ca8..5e9059e25 100644 Binary files a/Telegram/Resources/icons/chat/input_silent@2x.png and b/Telegram/Resources/icons/chat/input_silent@2x.png differ diff --git a/Telegram/Resources/icons/chat/input_silent@3x.png b/Telegram/Resources/icons/chat/input_silent@3x.png index 05c56955e..e213f6e56 100644 Binary files a/Telegram/Resources/icons/chat/input_silent@3x.png and b/Telegram/Resources/icons/chat/input_silent@3x.png differ diff --git a/Telegram/Resources/icons/chat/input_silent_on.png b/Telegram/Resources/icons/chat/input_silent_on.png new file mode 100644 index 000000000..1d80850c9 Binary files /dev/null and b/Telegram/Resources/icons/chat/input_silent_on.png differ diff --git a/Telegram/Resources/icons/chat/input_silent_on@2x.png b/Telegram/Resources/icons/chat/input_silent_on@2x.png new file mode 100644 index 000000000..f10fafeca Binary files /dev/null and b/Telegram/Resources/icons/chat/input_silent_on@2x.png differ diff --git a/Telegram/Resources/icons/chat/input_silent_on@3x.png b/Telegram/Resources/icons/chat/input_silent_on@3x.png new file mode 100644 index 000000000..49fc440e1 Binary files /dev/null and b/Telegram/Resources/icons/chat/input_silent_on@3x.png differ diff --git a/Telegram/Resources/icons/chat/input_smile_face.png b/Telegram/Resources/icons/chat/input_smile_face.png index 044bb0c44..8d836cef4 100644 Binary files a/Telegram/Resources/icons/chat/input_smile_face.png and b/Telegram/Resources/icons/chat/input_smile_face.png differ diff --git a/Telegram/Resources/icons/chat/input_smile_face@2x.png b/Telegram/Resources/icons/chat/input_smile_face@2x.png index a6386c056..88c4320b7 100644 Binary files a/Telegram/Resources/icons/chat/input_smile_face@2x.png and b/Telegram/Resources/icons/chat/input_smile_face@2x.png differ diff --git a/Telegram/Resources/icons/chat/input_smile_face@3x.png b/Telegram/Resources/icons/chat/input_smile_face@3x.png index faac7bc86..6e26d44ab 100644 Binary files a/Telegram/Resources/icons/chat/input_smile_face@3x.png and b/Telegram/Resources/icons/chat/input_smile_face@3x.png differ diff --git a/Telegram/Resources/icons/chat/large_away.png b/Telegram/Resources/icons/chat/large_away.png new file mode 100644 index 000000000..b0a943e0c Binary files /dev/null and b/Telegram/Resources/icons/chat/large_away.png differ diff --git a/Telegram/Resources/icons/chat/large_away@2x.png b/Telegram/Resources/icons/chat/large_away@2x.png new file mode 100644 index 000000000..ca2b6adb6 Binary files /dev/null and b/Telegram/Resources/icons/chat/large_away@2x.png differ diff --git a/Telegram/Resources/icons/chat/large_away@3x.png b/Telegram/Resources/icons/chat/large_away@3x.png new file mode 100644 index 000000000..064090f76 Binary files /dev/null and b/Telegram/Resources/icons/chat/large_away@3x.png differ diff --git a/Telegram/Resources/icons/chat/large_greeting.png b/Telegram/Resources/icons/chat/large_greeting.png new file mode 100644 index 000000000..0b1cb033e Binary files /dev/null and b/Telegram/Resources/icons/chat/large_greeting.png differ diff --git a/Telegram/Resources/icons/chat/large_greeting@2x.png b/Telegram/Resources/icons/chat/large_greeting@2x.png new file mode 100644 index 000000000..66fd705ad Binary files /dev/null and b/Telegram/Resources/icons/chat/large_greeting@2x.png differ diff --git a/Telegram/Resources/icons/chat/large_greeting@3x.png b/Telegram/Resources/icons/chat/large_greeting@3x.png new file mode 100644 index 000000000..cd08060ff Binary files /dev/null and b/Telegram/Resources/icons/chat/large_greeting@3x.png differ diff --git a/Telegram/Resources/icons/chat/large_lockedchat.png b/Telegram/Resources/icons/chat/large_lockedchat.png new file mode 100644 index 000000000..812b705b3 Binary files /dev/null and b/Telegram/Resources/icons/chat/large_lockedchat.png differ diff --git a/Telegram/Resources/icons/chat/large_lockedchat@2x.png b/Telegram/Resources/icons/chat/large_lockedchat@2x.png new file mode 100644 index 000000000..30bf73e9b Binary files /dev/null and b/Telegram/Resources/icons/chat/large_lockedchat@2x.png differ diff --git a/Telegram/Resources/icons/chat/large_lockedchat@3x.png b/Telegram/Resources/icons/chat/large_lockedchat@3x.png new file mode 100644 index 000000000..a0174e129 Binary files /dev/null and b/Telegram/Resources/icons/chat/large_lockedchat@3x.png differ diff --git a/Telegram/Resources/icons/chat/large_quickreply.png b/Telegram/Resources/icons/chat/large_quickreply.png new file mode 100644 index 000000000..084b399ea Binary files /dev/null and b/Telegram/Resources/icons/chat/large_quickreply.png differ diff --git a/Telegram/Resources/icons/chat/large_quickreply@2x.png b/Telegram/Resources/icons/chat/large_quickreply@2x.png new file mode 100644 index 000000000..5ec1ffe4f Binary files /dev/null and b/Telegram/Resources/icons/chat/large_quickreply@2x.png differ diff --git a/Telegram/Resources/icons/chat/large_quickreply@3x.png b/Telegram/Resources/icons/chat/large_quickreply@3x.png new file mode 100644 index 000000000..8bc18f9ad Binary files /dev/null and b/Telegram/Resources/icons/chat/large_quickreply@3x.png differ diff --git a/Telegram/Resources/icons/chat/link_photo_enlarge.png b/Telegram/Resources/icons/chat/link_photo_enlarge.png new file mode 100644 index 000000000..c4ba35289 Binary files /dev/null and b/Telegram/Resources/icons/chat/link_photo_enlarge.png differ diff --git a/Telegram/Resources/icons/chat/link_photo_enlarge@2x.png b/Telegram/Resources/icons/chat/link_photo_enlarge@2x.png new file mode 100644 index 000000000..02e1328ed Binary files /dev/null and b/Telegram/Resources/icons/chat/link_photo_enlarge@2x.png differ diff --git a/Telegram/Resources/icons/chat/link_photo_enlarge@3x.png b/Telegram/Resources/icons/chat/link_photo_enlarge@3x.png new file mode 100644 index 000000000..3dbc8aad4 Binary files /dev/null and b/Telegram/Resources/icons/chat/link_photo_enlarge@3x.png differ diff --git a/Telegram/Resources/icons/chat/mini_copy.png b/Telegram/Resources/icons/chat/mini_copy.png new file mode 100644 index 000000000..05af01e49 Binary files /dev/null and b/Telegram/Resources/icons/chat/mini_copy.png differ diff --git a/Telegram/Resources/icons/chat/mini_copy@2x.png b/Telegram/Resources/icons/chat/mini_copy@2x.png new file mode 100644 index 000000000..69693d749 Binary files /dev/null and b/Telegram/Resources/icons/chat/mini_copy@2x.png differ diff --git a/Telegram/Resources/icons/chat/mini_copy@3x.png b/Telegram/Resources/icons/chat/mini_copy@3x.png new file mode 100644 index 000000000..809361d53 Binary files /dev/null and b/Telegram/Resources/icons/chat/mini_copy@3x.png differ diff --git a/Telegram/Resources/icons/chat/mini_lock.png b/Telegram/Resources/icons/chat/mini_lock.png new file mode 100644 index 000000000..a81e9beb5 Binary files /dev/null and b/Telegram/Resources/icons/chat/mini_lock.png differ diff --git a/Telegram/Resources/icons/chat/mini_lock@2x.png b/Telegram/Resources/icons/chat/mini_lock@2x.png new file mode 100644 index 000000000..e4936715f Binary files /dev/null and b/Telegram/Resources/icons/chat/mini_lock@2x.png differ diff --git a/Telegram/Resources/icons/chat/mini_lock@3x.png b/Telegram/Resources/icons/chat/mini_lock@3x.png new file mode 100644 index 000000000..2fd8ee86a Binary files /dev/null and b/Telegram/Resources/icons/chat/mini_lock@3x.png differ diff --git a/Telegram/Resources/icons/chat/mini_media_once.png b/Telegram/Resources/icons/chat/mini_media_once.png new file mode 100644 index 000000000..8984491b7 Binary files /dev/null and b/Telegram/Resources/icons/chat/mini_media_once.png differ diff --git a/Telegram/Resources/icons/chat/mini_media_once@2x.png b/Telegram/Resources/icons/chat/mini_media_once@2x.png new file mode 100644 index 000000000..f8514d3af Binary files /dev/null and b/Telegram/Resources/icons/chat/mini_media_once@2x.png differ diff --git a/Telegram/Resources/icons/chat/mini_media_once@3x.png b/Telegram/Resources/icons/chat/mini_media_once@3x.png new file mode 100644 index 000000000..3900061be Binary files /dev/null and b/Telegram/Resources/icons/chat/mini_media_once@3x.png differ diff --git a/Telegram/Resources/icons/chat/mini_quote.png b/Telegram/Resources/icons/chat/mini_quote.png new file mode 100644 index 000000000..7c021f6ef Binary files /dev/null and b/Telegram/Resources/icons/chat/mini_quote.png differ diff --git a/Telegram/Resources/icons/chat/mini_quote@2x.png b/Telegram/Resources/icons/chat/mini_quote@2x.png new file mode 100644 index 000000000..f4a9b43f5 Binary files /dev/null and b/Telegram/Resources/icons/chat/mini_quote@2x.png differ diff --git a/Telegram/Resources/icons/chat/mini_quote@3x.png b/Telegram/Resources/icons/chat/mini_quote@3x.png new file mode 100644 index 000000000..2c572bd02 Binary files /dev/null and b/Telegram/Resources/icons/chat/mini_quote@3x.png differ diff --git a/Telegram/Resources/icons/chat/mini_subscribers.png b/Telegram/Resources/icons/chat/mini_subscribers.png new file mode 100644 index 000000000..d9cac3f63 Binary files /dev/null and b/Telegram/Resources/icons/chat/mini_subscribers.png differ diff --git a/Telegram/Resources/icons/chat/mini_subscribers@2x.png b/Telegram/Resources/icons/chat/mini_subscribers@2x.png new file mode 100644 index 000000000..1e6a9f054 Binary files /dev/null and b/Telegram/Resources/icons/chat/mini_subscribers@2x.png differ diff --git a/Telegram/Resources/icons/chat/mini_subscribers@3x.png b/Telegram/Resources/icons/chat/mini_subscribers@3x.png new file mode 100644 index 000000000..1e4a68bc7 Binary files /dev/null and b/Telegram/Resources/icons/chat/mini_subscribers@3x.png differ diff --git a/Telegram/Resources/icons/chat/reactions_bubble.png b/Telegram/Resources/icons/chat/reactions_bubble.png new file mode 100644 index 000000000..b7c428757 Binary files /dev/null and b/Telegram/Resources/icons/chat/reactions_bubble.png differ diff --git a/Telegram/Resources/icons/chat/reactions_bubble@2x.png b/Telegram/Resources/icons/chat/reactions_bubble@2x.png new file mode 100644 index 000000000..d98f19194 Binary files /dev/null and b/Telegram/Resources/icons/chat/reactions_bubble@2x.png differ diff --git a/Telegram/Resources/icons/chat/reactions_bubble@3x.png b/Telegram/Resources/icons/chat/reactions_bubble@3x.png new file mode 100644 index 000000000..53bbc4cf9 Binary files /dev/null and b/Telegram/Resources/icons/chat/reactions_bubble@3x.png differ diff --git a/Telegram/Resources/icons/chat/reactions_bubble_shadow.png b/Telegram/Resources/icons/chat/reactions_bubble_shadow.png new file mode 100644 index 000000000..27cecc54b Binary files /dev/null and b/Telegram/Resources/icons/chat/reactions_bubble_shadow.png differ diff --git a/Telegram/Resources/icons/chat/reactions_bubble_shadow@2x.png b/Telegram/Resources/icons/chat/reactions_bubble_shadow@2x.png new file mode 100644 index 000000000..d6875ca32 Binary files /dev/null and b/Telegram/Resources/icons/chat/reactions_bubble_shadow@2x.png differ diff --git a/Telegram/Resources/icons/chat/reactions_bubble_shadow@3x.png b/Telegram/Resources/icons/chat/reactions_bubble_shadow@3x.png new file mode 100644 index 000000000..2e8f80f73 Binary files /dev/null and b/Telegram/Resources/icons/chat/reactions_bubble_shadow@3x.png differ diff --git a/Telegram/Resources/icons/chat/reactions_expand_panel.png b/Telegram/Resources/icons/chat/reactions_expand_panel.png new file mode 100644 index 000000000..35ceca70c Binary files /dev/null and b/Telegram/Resources/icons/chat/reactions_expand_panel.png differ diff --git a/Telegram/Resources/icons/chat/reactions_expand_panel@2x.png b/Telegram/Resources/icons/chat/reactions_expand_panel@2x.png new file mode 100644 index 000000000..b76326d45 Binary files /dev/null and b/Telegram/Resources/icons/chat/reactions_expand_panel@2x.png differ diff --git a/Telegram/Resources/icons/chat/reactions_expand_panel@3x.png b/Telegram/Resources/icons/chat/reactions_expand_panel@3x.png new file mode 100644 index 000000000..3c5a48b5f Binary files /dev/null and b/Telegram/Resources/icons/chat/reactions_expand_panel@3x.png differ diff --git a/Telegram/Resources/icons/chat/reactions_premium_bg.png b/Telegram/Resources/icons/chat/reactions_premium_bg.png new file mode 100644 index 000000000..fbac75ad6 Binary files /dev/null and b/Telegram/Resources/icons/chat/reactions_premium_bg.png differ diff --git a/Telegram/Resources/icons/chat/reactions_premium_bg@2x.png b/Telegram/Resources/icons/chat/reactions_premium_bg@2x.png new file mode 100644 index 000000000..20cc69e9c Binary files /dev/null and b/Telegram/Resources/icons/chat/reactions_premium_bg@2x.png differ diff --git a/Telegram/Resources/icons/chat/reactions_premium_bg@3x.png b/Telegram/Resources/icons/chat/reactions_premium_bg@3x.png new file mode 100644 index 000000000..791ae612c Binary files /dev/null and b/Telegram/Resources/icons/chat/reactions_premium_bg@3x.png differ diff --git a/Telegram/Resources/icons/chat/reactions_premium_star.png b/Telegram/Resources/icons/chat/reactions_premium_star.png new file mode 100644 index 000000000..6e14fb008 Binary files /dev/null and b/Telegram/Resources/icons/chat/reactions_premium_star.png differ diff --git a/Telegram/Resources/icons/chat/reactions_premium_star@2x.png b/Telegram/Resources/icons/chat/reactions_premium_star@2x.png new file mode 100644 index 000000000..c2d4aea54 Binary files /dev/null and b/Telegram/Resources/icons/chat/reactions_premium_star@2x.png differ diff --git a/Telegram/Resources/icons/chat/reactions_premium_star@3x.png b/Telegram/Resources/icons/chat/reactions_premium_star@3x.png new file mode 100644 index 000000000..e46f5c98e Binary files /dev/null and b/Telegram/Resources/icons/chat/reactions_premium_star@3x.png differ diff --git a/Telegram/Resources/icons/chat/reactions_round_big.png b/Telegram/Resources/icons/chat/reactions_round_big.png new file mode 100644 index 000000000..773b9f1c9 Binary files /dev/null and b/Telegram/Resources/icons/chat/reactions_round_big.png differ diff --git a/Telegram/Resources/icons/chat/reactions_round_big@2x.png b/Telegram/Resources/icons/chat/reactions_round_big@2x.png new file mode 100644 index 000000000..e74f7fc48 Binary files /dev/null and b/Telegram/Resources/icons/chat/reactions_round_big@2x.png differ diff --git a/Telegram/Resources/icons/chat/reactions_round_big@3x.png b/Telegram/Resources/icons/chat/reactions_round_big@3x.png new file mode 100644 index 000000000..d0007a00b Binary files /dev/null and b/Telegram/Resources/icons/chat/reactions_round_big@3x.png differ diff --git a/Telegram/Resources/icons/chat/reactions_round_small.png b/Telegram/Resources/icons/chat/reactions_round_small.png new file mode 100644 index 000000000..32df70aae Binary files /dev/null and b/Telegram/Resources/icons/chat/reactions_round_small.png differ diff --git a/Telegram/Resources/icons/chat/reactions_round_small@2x.png b/Telegram/Resources/icons/chat/reactions_round_small@2x.png new file mode 100644 index 000000000..548d984c8 Binary files /dev/null and b/Telegram/Resources/icons/chat/reactions_round_small@2x.png differ diff --git a/Telegram/Resources/icons/chat/reactions_round_small@3x.png b/Telegram/Resources/icons/chat/reactions_round_small@3x.png new file mode 100644 index 000000000..e5f648353 Binary files /dev/null and b/Telegram/Resources/icons/chat/reactions_round_small@3x.png differ diff --git a/Telegram/Resources/icons/chat/reply_type_channel.png b/Telegram/Resources/icons/chat/reply_type_channel.png new file mode 100644 index 000000000..8aa9e90f8 Binary files /dev/null and b/Telegram/Resources/icons/chat/reply_type_channel.png differ diff --git a/Telegram/Resources/icons/chat/reply_type_channel@2x.png b/Telegram/Resources/icons/chat/reply_type_channel@2x.png new file mode 100644 index 000000000..cb8bb8c2b Binary files /dev/null and b/Telegram/Resources/icons/chat/reply_type_channel@2x.png differ diff --git a/Telegram/Resources/icons/chat/reply_type_channel@3x.png b/Telegram/Resources/icons/chat/reply_type_channel@3x.png new file mode 100644 index 000000000..e659c35ac Binary files /dev/null and b/Telegram/Resources/icons/chat/reply_type_channel@3x.png differ diff --git a/Telegram/Resources/icons/chat/reply_type_group.png b/Telegram/Resources/icons/chat/reply_type_group.png new file mode 100644 index 000000000..b40ba4b81 Binary files /dev/null and b/Telegram/Resources/icons/chat/reply_type_group.png differ diff --git a/Telegram/Resources/icons/chat/reply_type_group@2x.png b/Telegram/Resources/icons/chat/reply_type_group@2x.png new file mode 100644 index 000000000..8ad079fb3 Binary files /dev/null and b/Telegram/Resources/icons/chat/reply_type_group@2x.png differ diff --git a/Telegram/Resources/icons/chat/reply_type_group@3x.png b/Telegram/Resources/icons/chat/reply_type_group@3x.png new file mode 100644 index 000000000..11dd58c19 Binary files /dev/null and b/Telegram/Resources/icons/chat/reply_type_group@3x.png differ diff --git a/Telegram/Resources/icons/chat/reply_type_user.png b/Telegram/Resources/icons/chat/reply_type_user.png new file mode 100644 index 000000000..f2d6cf6fc Binary files /dev/null and b/Telegram/Resources/icons/chat/reply_type_user.png differ diff --git a/Telegram/Resources/icons/chat/reply_type_user@2x.png b/Telegram/Resources/icons/chat/reply_type_user@2x.png new file mode 100644 index 000000000..8ef54da95 Binary files /dev/null and b/Telegram/Resources/icons/chat/reply_type_user@2x.png differ diff --git a/Telegram/Resources/icons/chat/reply_type_user@3x.png b/Telegram/Resources/icons/chat/reply_type_user@3x.png new file mode 100644 index 000000000..67a947f36 Binary files /dev/null and b/Telegram/Resources/icons/chat/reply_type_user@3x.png differ diff --git a/Telegram/Resources/icons/chat/voice_to_text.png b/Telegram/Resources/icons/chat/voice_to_text.png new file mode 100644 index 000000000..b677a7c5e Binary files /dev/null and b/Telegram/Resources/icons/chat/voice_to_text.png differ diff --git a/Telegram/Resources/icons/chat/voice_to_text@2x.png b/Telegram/Resources/icons/chat/voice_to_text@2x.png new file mode 100644 index 000000000..224b40bb3 Binary files /dev/null and b/Telegram/Resources/icons/chat/voice_to_text@2x.png differ diff --git a/Telegram/Resources/icons/chat/voice_to_text@3x.png b/Telegram/Resources/icons/chat/voice_to_text@3x.png new file mode 100644 index 000000000..731ba5aad Binary files /dev/null and b/Telegram/Resources/icons/chat/voice_to_text@3x.png differ diff --git a/Telegram/Resources/icons/chat/voice_to_text_collapse.png b/Telegram/Resources/icons/chat/voice_to_text_collapse.png new file mode 100644 index 000000000..752f8be2f Binary files /dev/null and b/Telegram/Resources/icons/chat/voice_to_text_collapse.png differ diff --git a/Telegram/Resources/icons/chat/voice_to_text_collapse@2x.png b/Telegram/Resources/icons/chat/voice_to_text_collapse@2x.png new file mode 100644 index 000000000..da161b733 Binary files /dev/null and b/Telegram/Resources/icons/chat/voice_to_text_collapse@2x.png differ diff --git a/Telegram/Resources/icons/chat/voice_to_text_collapse@3x.png b/Telegram/Resources/icons/chat/voice_to_text_collapse@3x.png new file mode 100644 index 000000000..204ffcbac Binary files /dev/null and b/Telegram/Resources/icons/chat/voice_to_text_collapse@3x.png differ diff --git a/Telegram/Resources/icons/contacts_alphabet.png b/Telegram/Resources/icons/contacts_alphabet.png index 8a8c99aa1..0e7e3c44a 100644 Binary files a/Telegram/Resources/icons/contacts_alphabet.png and b/Telegram/Resources/icons/contacts_alphabet.png differ diff --git a/Telegram/Resources/icons/contacts_alphabet@2x.png b/Telegram/Resources/icons/contacts_alphabet@2x.png index 59b724d9b..8b81881f3 100644 Binary files a/Telegram/Resources/icons/contacts_alphabet@2x.png and b/Telegram/Resources/icons/contacts_alphabet@2x.png differ diff --git a/Telegram/Resources/icons/contacts_alphabet@3x.png b/Telegram/Resources/icons/contacts_alphabet@3x.png index 72a22f9f5..930728caa 100644 Binary files a/Telegram/Resources/icons/contacts_alphabet@3x.png and b/Telegram/Resources/icons/contacts_alphabet@3x.png differ diff --git a/Telegram/Resources/icons/contacts_online.png b/Telegram/Resources/icons/contacts_online.png index 8fe7e9b16..86079b2b7 100644 Binary files a/Telegram/Resources/icons/contacts_online.png and b/Telegram/Resources/icons/contacts_online.png differ diff --git a/Telegram/Resources/icons/contacts_online@2x.png b/Telegram/Resources/icons/contacts_online@2x.png index 3549bc947..e059f3e9d 100644 Binary files a/Telegram/Resources/icons/contacts_online@2x.png and b/Telegram/Resources/icons/contacts_online@2x.png differ diff --git a/Telegram/Resources/icons/contacts_online@3x.png b/Telegram/Resources/icons/contacts_online@3x.png index 5cf60407b..ed58ef9f0 100644 Binary files a/Telegram/Resources/icons/contacts_online@3x.png and b/Telegram/Resources/icons/contacts_online@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/avatar_hidden.png b/Telegram/Resources/icons/dialogs/avatar_hidden.png new file mode 100644 index 000000000..e032148c8 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/avatar_hidden.png differ diff --git a/Telegram/Resources/icons/dialogs/avatar_hidden@2x.png b/Telegram/Resources/icons/dialogs/avatar_hidden@2x.png new file mode 100644 index 000000000..ef143054e Binary files /dev/null and b/Telegram/Resources/icons/dialogs/avatar_hidden@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/avatar_hidden@3x.png b/Telegram/Resources/icons/dialogs/avatar_hidden@3x.png new file mode 100644 index 000000000..f6ef6b733 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/avatar_hidden@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/avatar_notes.png b/Telegram/Resources/icons/dialogs/avatar_notes.png new file mode 100644 index 000000000..740d38910 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/avatar_notes.png differ diff --git a/Telegram/Resources/icons/dialogs/avatar_notes@2x.png b/Telegram/Resources/icons/dialogs/avatar_notes@2x.png new file mode 100644 index 000000000..98dc7c89c Binary files /dev/null and b/Telegram/Resources/icons/dialogs/avatar_notes@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/avatar_notes@3x.png b/Telegram/Resources/icons/dialogs/avatar_notes@3x.png new file mode 100644 index 000000000..735961bd9 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/avatar_notes@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_calendar.png b/Telegram/Resources/icons/dialogs/dialogs_calendar.png index b62520990..5114466a1 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_calendar.png and b/Telegram/Resources/icons/dialogs/dialogs_calendar.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_calendar@2x.png b/Telegram/Resources/icons/dialogs/dialogs_calendar@2x.png index 07bbba161..4e9c94681 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_calendar@2x.png and b/Telegram/Resources/icons/dialogs/dialogs_calendar@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_calendar@3x.png b/Telegram/Resources/icons/dialogs/dialogs_calendar@3x.png index db5f07a82..de54df801 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_calendar@3x.png and b/Telegram/Resources/icons/dialogs/dialogs_calendar@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_cancel_search.png b/Telegram/Resources/icons/dialogs/dialogs_cancel_search.png index 211db7e35..c52c80cd7 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_cancel_search.png and b/Telegram/Resources/icons/dialogs/dialogs_cancel_search.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_cancel_search@2x.png b/Telegram/Resources/icons/dialogs/dialogs_cancel_search@2x.png index f20842fbc..7557a51ca 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_cancel_search@2x.png and b/Telegram/Resources/icons/dialogs/dialogs_cancel_search@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_cancel_search@3x.png b/Telegram/Resources/icons/dialogs/dialogs_cancel_search@3x.png index e47946615..4a2a700cc 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_cancel_search@3x.png and b/Telegram/Resources/icons/dialogs/dialogs_cancel_search@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_channel.png b/Telegram/Resources/icons/dialogs/dialogs_channel.png index a47d6e293..4bebdc359 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_channel.png and b/Telegram/Resources/icons/dialogs/dialogs_channel.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_channel@2x.png b/Telegram/Resources/icons/dialogs/dialogs_channel@2x.png index b02ba1a28..32476163c 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_channel@2x.png and b/Telegram/Resources/icons/dialogs/dialogs_channel@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_channel@3x.png b/Telegram/Resources/icons/dialogs/dialogs_channel@3x.png index 57b6e17f4..995afdc0c 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_channel@3x.png and b/Telegram/Resources/icons/dialogs/dialogs_channel@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_chat.png b/Telegram/Resources/icons/dialogs/dialogs_chat.png index ed06e1647..733b510a1 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_chat.png and b/Telegram/Resources/icons/dialogs/dialogs_chat.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_chat@2x.png b/Telegram/Resources/icons/dialogs/dialogs_chat@2x.png index a5e8674e9..9541c3963 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_chat@2x.png and b/Telegram/Resources/icons/dialogs/dialogs_chat@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_chat@3x.png b/Telegram/Resources/icons/dialogs/dialogs_chat@3x.png index a98228cec..7ab5802ed 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_chat@3x.png and b/Telegram/Resources/icons/dialogs/dialogs_chat@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_downloads.png b/Telegram/Resources/icons/dialogs/dialogs_downloads.png new file mode 100644 index 000000000..fd23ff3c8 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_downloads.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_downloads@2x.png b/Telegram/Resources/icons/dialogs/dialogs_downloads@2x.png new file mode 100644 index 000000000..e52d981fc Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_downloads@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_downloads@3x.png b/Telegram/Resources/icons/dialogs/dialogs_downloads@3x.png new file mode 100644 index 000000000..24b4d8af1 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_downloads@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_forum.png b/Telegram/Resources/icons/dialogs/dialogs_forum.png new file mode 100644 index 000000000..3b589bf06 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_forum.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_forum@2x.png b/Telegram/Resources/icons/dialogs/dialogs_forum@2x.png new file mode 100644 index 000000000..e0b170f74 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_forum@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_forum@3x.png b/Telegram/Resources/icons/dialogs/dialogs_forum@3x.png new file mode 100644 index 000000000..43cf0b718 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_forum@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_lock.png b/Telegram/Resources/icons/dialogs/dialogs_lock.png deleted file mode 100644 index 5067efdfe..000000000 Binary files a/Telegram/Resources/icons/dialogs/dialogs_lock.png and /dev/null differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_lock@2x.png b/Telegram/Resources/icons/dialogs/dialogs_lock@2x.png deleted file mode 100644 index d8f8bfd74..000000000 Binary files a/Telegram/Resources/icons/dialogs/dialogs_lock@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_lock@3x.png b/Telegram/Resources/icons/dialogs/dialogs_lock@3x.png deleted file mode 100644 index 700e216af..000000000 Binary files a/Telegram/Resources/icons/dialogs/dialogs_lock@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_lock_off.png b/Telegram/Resources/icons/dialogs/dialogs_lock_off.png new file mode 100644 index 000000000..2459e1137 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_lock_off.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_lock_off@2x.png b/Telegram/Resources/icons/dialogs/dialogs_lock_off@2x.png new file mode 100644 index 000000000..33b77eb3f Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_lock_off@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_lock_off@3x.png b/Telegram/Resources/icons/dialogs/dialogs_lock_off@3x.png new file mode 100644 index 000000000..7653aa431 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_lock_off@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_lock_on.png b/Telegram/Resources/icons/dialogs/dialogs_lock_on.png new file mode 100644 index 000000000..8209991f3 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_lock_on.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_lock_on@2x.png b/Telegram/Resources/icons/dialogs/dialogs_lock_on@2x.png new file mode 100644 index 000000000..c4e3d6b25 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_lock_on@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_lock_on@3x.png b/Telegram/Resources/icons/dialogs/dialogs_lock_on@3x.png new file mode 100644 index 000000000..67c7d7c71 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_lock_on@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_menu.png b/Telegram/Resources/icons/dialogs/dialogs_menu.png index bc7231d99..869a9026c 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_menu.png and b/Telegram/Resources/icons/dialogs/dialogs_menu.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_menu@2x.png b/Telegram/Resources/icons/dialogs/dialogs_menu@2x.png index e96e6885b..c6146dbc3 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_menu@2x.png and b/Telegram/Resources/icons/dialogs/dialogs_menu@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_menu@3x.png b/Telegram/Resources/icons/dialogs/dialogs_menu@3x.png index c5bcbf1d9..ab4ee2319 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_menu@3x.png and b/Telegram/Resources/icons/dialogs/dialogs_menu@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_menu_unread.png b/Telegram/Resources/icons/dialogs/dialogs_menu_unread.png index 436ee7d52..159d06953 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_menu_unread.png and b/Telegram/Resources/icons/dialogs/dialogs_menu_unread.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_menu_unread@2x.png b/Telegram/Resources/icons/dialogs/dialogs_menu_unread@2x.png index 9be9f4f30..f483f3caa 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_menu_unread@2x.png and b/Telegram/Resources/icons/dialogs/dialogs_menu_unread@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_menu_unread@3x.png b/Telegram/Resources/icons/dialogs/dialogs_menu_unread@3x.png index 2c58e2c98..d6879e8c9 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_menu_unread@3x.png and b/Telegram/Resources/icons/dialogs/dialogs_menu_unread@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_premium.png b/Telegram/Resources/icons/dialogs/dialogs_premium.png new file mode 100644 index 000000000..199597443 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_premium.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_premium@2x.png b/Telegram/Resources/icons/dialogs/dialogs_premium@2x.png new file mode 100644 index 000000000..7caa2f465 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_premium@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_premium@3x.png b/Telegram/Resources/icons/dialogs/dialogs_premium@3x.png new file mode 100644 index 000000000..7996adc28 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_premium@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_reaction.png b/Telegram/Resources/icons/dialogs/dialogs_reaction.png index 1ea3423d2..25ac8ccd1 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_reaction.png and b/Telegram/Resources/icons/dialogs/dialogs_reaction.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_reaction@2x.png b/Telegram/Resources/icons/dialogs/dialogs_reaction@2x.png index 8e8a802df..cc22d2386 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_reaction@2x.png and b/Telegram/Resources/icons/dialogs/dialogs_reaction@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_reaction@3x.png b/Telegram/Resources/icons/dialogs/dialogs_reaction@3x.png index a5754543a..a93e9a58c 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_reaction@3x.png and b/Telegram/Resources/icons/dialogs/dialogs_reaction@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_received.png b/Telegram/Resources/icons/dialogs/dialogs_received.png index e49b4237b..c018233da 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_received.png and b/Telegram/Resources/icons/dialogs/dialogs_received.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_received@2x.png b/Telegram/Resources/icons/dialogs/dialogs_received@2x.png index 55895e72f..bf0411ec8 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_received@2x.png and b/Telegram/Resources/icons/dialogs/dialogs_received@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_received@3x.png b/Telegram/Resources/icons/dialogs/dialogs_received@3x.png index c2302ab4b..78d2fa0ef 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_received@3x.png and b/Telegram/Resources/icons/dialogs/dialogs_received@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_search_from.png b/Telegram/Resources/icons/dialogs/dialogs_search_from.png index 61aa969dd..16e7443c5 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_search_from.png and b/Telegram/Resources/icons/dialogs/dialogs_search_from.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_search_from@2x.png b/Telegram/Resources/icons/dialogs/dialogs_search_from@2x.png index 40341aaaa..123a2fd70 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_search_from@2x.png and b/Telegram/Resources/icons/dialogs/dialogs_search_from@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_search_from@3x.png b/Telegram/Resources/icons/dialogs/dialogs_search_from@3x.png index 08453e54f..6d74aa7ba 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_search_from@3x.png and b/Telegram/Resources/icons/dialogs/dialogs_search_from@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_sending.png b/Telegram/Resources/icons/dialogs/dialogs_sending.png index f8069970f..f18e1ad3f 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_sending.png and b/Telegram/Resources/icons/dialogs/dialogs_sending.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_sending@2x.png b/Telegram/Resources/icons/dialogs/dialogs_sending@2x.png index f83e71981..3d566ca04 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_sending@2x.png and b/Telegram/Resources/icons/dialogs/dialogs_sending@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_sending@3x.png b/Telegram/Resources/icons/dialogs/dialogs_sending@3x.png index 6734ace1e..f453e457e 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_sending@3x.png and b/Telegram/Resources/icons/dialogs/dialogs_sending@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_sent.png b/Telegram/Resources/icons/dialogs/dialogs_sent.png index 341f6d3b9..c56f23ad6 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_sent.png and b/Telegram/Resources/icons/dialogs/dialogs_sent.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_sent@2x.png b/Telegram/Resources/icons/dialogs/dialogs_sent@2x.png index 10ff7a134..32536874e 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_sent@2x.png and b/Telegram/Resources/icons/dialogs/dialogs_sent@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_sent@3x.png b/Telegram/Resources/icons/dialogs/dialogs_sent@3x.png index 1140b44bc..6a798bbf8 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_sent@3x.png and b/Telegram/Resources/icons/dialogs/dialogs_sent@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_topic_arrow.png b/Telegram/Resources/icons/dialogs/dialogs_topic_arrow.png new file mode 100644 index 000000000..a998c1ad1 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_topic_arrow.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_topic_arrow@2x.png b/Telegram/Resources/icons/dialogs/dialogs_topic_arrow@2x.png new file mode 100644 index 000000000..16b43d5ff Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_topic_arrow@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_topic_arrow@3x.png b/Telegram/Resources/icons/dialogs/dialogs_topic_arrow@3x.png new file mode 100644 index 000000000..f8e31f59e Binary files /dev/null and b/Telegram/Resources/icons/dialogs/dialogs_topic_arrow@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_unlock.png b/Telegram/Resources/icons/dialogs/dialogs_unlock.png deleted file mode 100644 index d98ce184e..000000000 Binary files a/Telegram/Resources/icons/dialogs/dialogs_unlock.png and /dev/null differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_unlock@2x.png b/Telegram/Resources/icons/dialogs/dialogs_unlock@2x.png deleted file mode 100644 index a6c7bbd2f..000000000 Binary files a/Telegram/Resources/icons/dialogs/dialogs_unlock@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_unlock@3x.png b/Telegram/Resources/icons/dialogs/dialogs_unlock@3x.png deleted file mode 100644 index 457c1064c..000000000 Binary files a/Telegram/Resources/icons/dialogs/dialogs_unlock@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_verified_check.png b/Telegram/Resources/icons/dialogs/dialogs_verified_check.png index 14dfa4ee6..dc9c4b0da 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_verified_check.png and b/Telegram/Resources/icons/dialogs/dialogs_verified_check.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_verified_check@2x.png b/Telegram/Resources/icons/dialogs/dialogs_verified_check@2x.png index 1caf9a685..677770111 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_verified_check@2x.png and b/Telegram/Resources/icons/dialogs/dialogs_verified_check@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_verified_check@3x.png b/Telegram/Resources/icons/dialogs/dialogs_verified_check@3x.png index f2b4cea40..ceffe4197 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_verified_check@3x.png and b/Telegram/Resources/icons/dialogs/dialogs_verified_check@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_verified_star.png b/Telegram/Resources/icons/dialogs/dialogs_verified_star.png index 334e70cdf..24adac8ca 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_verified_star.png and b/Telegram/Resources/icons/dialogs/dialogs_verified_star.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_verified_star@2x.png b/Telegram/Resources/icons/dialogs/dialogs_verified_star@2x.png index 9bfd666d5..98d33bd22 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_verified_star@2x.png and b/Telegram/Resources/icons/dialogs/dialogs_verified_star@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/dialogs_verified_star@3x.png b/Telegram/Resources/icons/dialogs/dialogs_verified_star@3x.png index bcfd5eeb7..55734f48e 100644 Binary files a/Telegram/Resources/icons/dialogs/dialogs_verified_star@3x.png and b/Telegram/Resources/icons/dialogs/dialogs_verified_star@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/inaccessible_userpic.png b/Telegram/Resources/icons/dialogs/inaccessible_userpic.png new file mode 100644 index 000000000..0ea974ff2 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/inaccessible_userpic.png differ diff --git a/Telegram/Resources/icons/dialogs/inaccessible_userpic@2x.png b/Telegram/Resources/icons/dialogs/inaccessible_userpic@2x.png new file mode 100644 index 000000000..38fa1308a Binary files /dev/null and b/Telegram/Resources/icons/dialogs/inaccessible_userpic@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/inaccessible_userpic@3x.png b/Telegram/Resources/icons/dialogs/inaccessible_userpic@3x.png new file mode 100644 index 000000000..454ad3951 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/inaccessible_userpic@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/mini_arrow.png b/Telegram/Resources/icons/dialogs/mini_arrow.png new file mode 100644 index 000000000..81b5076f8 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/mini_arrow.png differ diff --git a/Telegram/Resources/icons/dialogs/mini_arrow@2x.png b/Telegram/Resources/icons/dialogs/mini_arrow@2x.png new file mode 100644 index 000000000..6e1e87682 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/mini_arrow@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/mini_arrow@3x.png b/Telegram/Resources/icons/dialogs/mini_arrow@3x.png new file mode 100644 index 000000000..36fd0e0c3 Binary files /dev/null and b/Telegram/Resources/icons/dialogs/mini_arrow@3x.png differ diff --git a/Telegram/Resources/icons/dialogs/mini_tag_lock.png b/Telegram/Resources/icons/dialogs/mini_tag_lock.png new file mode 100644 index 000000000..cb1e4d76a Binary files /dev/null and b/Telegram/Resources/icons/dialogs/mini_tag_lock.png differ diff --git a/Telegram/Resources/icons/dialogs/mini_tag_lock@2x.png b/Telegram/Resources/icons/dialogs/mini_tag_lock@2x.png new file mode 100644 index 000000000..cc875b7fa Binary files /dev/null and b/Telegram/Resources/icons/dialogs/mini_tag_lock@2x.png differ diff --git a/Telegram/Resources/icons/dialogs/mini_tag_lock@3x.png b/Telegram/Resources/icons/dialogs/mini_tag_lock@3x.png new file mode 100644 index 000000000..68254340d Binary files /dev/null and b/Telegram/Resources/icons/dialogs/mini_tag_lock@3x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_activities.png b/Telegram/Resources/icons/emoji/emoji_activities.png new file mode 100644 index 000000000..c4ac15d3d Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_activities.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_activities@2x.png b/Telegram/Resources/icons/emoji/emoji_activities@2x.png new file mode 100644 index 000000000..21f705376 Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_activities@2x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_activities@3x.png b/Telegram/Resources/icons/emoji/emoji_activities@3x.png new file mode 100644 index 000000000..530cabe63 Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_activities@3x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_back.png b/Telegram/Resources/icons/emoji/emoji_back.png new file mode 100644 index 000000000..31c82fc34 Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_back.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_back@2x.png b/Telegram/Resources/icons/emoji/emoji_back@2x.png new file mode 100644 index 000000000..ff0e0f556 Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_back@2x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_back@3x.png b/Telegram/Resources/icons/emoji/emoji_back@3x.png new file mode 100644 index 000000000..b45d24e3b Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_back@3x.png differ diff --git a/Telegram/Resources/icons/emoji_delete.png b/Telegram/Resources/icons/emoji/emoji_delete.png similarity index 100% rename from Telegram/Resources/icons/emoji_delete.png rename to Telegram/Resources/icons/emoji/emoji_delete.png diff --git a/Telegram/Resources/icons/emoji_delete@2x.png b/Telegram/Resources/icons/emoji/emoji_delete@2x.png similarity index 100% rename from Telegram/Resources/icons/emoji_delete@2x.png rename to Telegram/Resources/icons/emoji/emoji_delete@2x.png diff --git a/Telegram/Resources/icons/emoji_delete@3x.png b/Telegram/Resources/icons/emoji/emoji_delete@3x.png similarity index 100% rename from Telegram/Resources/icons/emoji_delete@3x.png rename to Telegram/Resources/icons/emoji/emoji_delete@3x.png diff --git a/Telegram/Resources/icons/emoji_delete_bg.png b/Telegram/Resources/icons/emoji/emoji_delete_bg.png similarity index 100% rename from Telegram/Resources/icons/emoji_delete_bg.png rename to Telegram/Resources/icons/emoji/emoji_delete_bg.png diff --git a/Telegram/Resources/icons/emoji_delete_bg@2x.png b/Telegram/Resources/icons/emoji/emoji_delete_bg@2x.png similarity index 100% rename from Telegram/Resources/icons/emoji_delete_bg@2x.png rename to Telegram/Resources/icons/emoji/emoji_delete_bg@2x.png diff --git a/Telegram/Resources/icons/emoji_delete_bg@3x.png b/Telegram/Resources/icons/emoji/emoji_delete_bg@3x.png similarity index 100% rename from Telegram/Resources/icons/emoji_delete_bg@3x.png rename to Telegram/Resources/icons/emoji/emoji_delete_bg@3x.png diff --git a/Telegram/Resources/icons/emoji/emoji_food.png b/Telegram/Resources/icons/emoji/emoji_food.png new file mode 100644 index 000000000..245bd448d Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_food.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_food@2x.png b/Telegram/Resources/icons/emoji/emoji_food@2x.png new file mode 100644 index 000000000..d65918c90 Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_food@2x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_food@3x.png b/Telegram/Resources/icons/emoji/emoji_food@3x.png new file mode 100644 index 000000000..6072c340e Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_food@3x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_love.png b/Telegram/Resources/icons/emoji/emoji_love.png new file mode 100644 index 000000000..011916865 Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_love.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_love@2x.png b/Telegram/Resources/icons/emoji/emoji_love@2x.png new file mode 100644 index 000000000..1bf0d31ca Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_love@2x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_love@3x.png b/Telegram/Resources/icons/emoji/emoji_love@3x.png new file mode 100644 index 000000000..098a42156 Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_love@3x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_nature.png b/Telegram/Resources/icons/emoji/emoji_nature.png new file mode 100644 index 000000000..4848d3d4c Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_nature.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_nature@2x.png b/Telegram/Resources/icons/emoji/emoji_nature@2x.png new file mode 100644 index 000000000..e2927607b Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_nature@2x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_nature@3x.png b/Telegram/Resources/icons/emoji/emoji_nature@3x.png new file mode 100644 index 000000000..f72fbe8fe Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_nature@3x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_objects.png b/Telegram/Resources/icons/emoji/emoji_objects.png new file mode 100644 index 000000000..733db2699 Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_objects.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_objects@2x.png b/Telegram/Resources/icons/emoji/emoji_objects@2x.png new file mode 100644 index 000000000..5a1663491 Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_objects@2x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_objects@3x.png b/Telegram/Resources/icons/emoji/emoji_objects@3x.png new file mode 100644 index 000000000..12525379e Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_objects@3x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_recent.png b/Telegram/Resources/icons/emoji/emoji_recent.png new file mode 100644 index 000000000..f260f7cb6 Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_recent.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_recent@2x.png b/Telegram/Resources/icons/emoji/emoji_recent@2x.png new file mode 100644 index 000000000..a61bef009 Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_recent@2x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_recent@3x.png b/Telegram/Resources/icons/emoji/emoji_recent@3x.png new file mode 100644 index 000000000..2b10fc362 Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_recent@3x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_search_input.png b/Telegram/Resources/icons/emoji/emoji_search_input.png new file mode 100644 index 000000000..8ee7bdce9 Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_search_input.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_search_input@2x.png b/Telegram/Resources/icons/emoji/emoji_search_input@2x.png new file mode 100644 index 000000000..9b7798f00 Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_search_input@2x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_search_input@3x.png b/Telegram/Resources/icons/emoji/emoji_search_input@3x.png new file mode 100644 index 000000000..af792f172 Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_search_input@3x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_settings.png b/Telegram/Resources/icons/emoji/emoji_settings.png new file mode 100644 index 000000000..5ae663fd4 Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_settings.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_settings@2x.png b/Telegram/Resources/icons/emoji/emoji_settings@2x.png new file mode 100644 index 000000000..eb081d4c6 Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_settings@2x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_settings@3x.png b/Telegram/Resources/icons/emoji/emoji_settings@3x.png new file mode 100644 index 000000000..2fcaf619b Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_settings@3x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_skin.png b/Telegram/Resources/icons/emoji/emoji_skin.png new file mode 100644 index 000000000..776617ebe Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_skin.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_skin@2x.png b/Telegram/Resources/icons/emoji/emoji_skin@2x.png new file mode 100644 index 000000000..a53f5c18e Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_skin@2x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_skin@3x.png b/Telegram/Resources/icons/emoji/emoji_skin@3x.png new file mode 100644 index 000000000..fd756d0a9 Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_skin@3x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_smile.png b/Telegram/Resources/icons/emoji/emoji_smile.png new file mode 100644 index 000000000..3b868e80b Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_smile.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_smile@2x.png b/Telegram/Resources/icons/emoji/emoji_smile@2x.png new file mode 100644 index 000000000..d6edb7347 Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_smile@2x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_smile@3x.png b/Telegram/Resources/icons/emoji/emoji_smile@3x.png new file mode 100644 index 000000000..3d198a5e3 Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_smile@3x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_travel.png b/Telegram/Resources/icons/emoji/emoji_travel.png new file mode 100644 index 000000000..824d92d0f Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_travel.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_travel@2x.png b/Telegram/Resources/icons/emoji/emoji_travel@2x.png new file mode 100644 index 000000000..2cbf8fbae Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_travel@2x.png differ diff --git a/Telegram/Resources/icons/emoji/emoji_travel@3x.png b/Telegram/Resources/icons/emoji/emoji_travel@3x.png new file mode 100644 index 000000000..b2b8f9007 Binary files /dev/null and b/Telegram/Resources/icons/emoji/emoji_travel@3x.png differ diff --git a/Telegram/Resources/icons/emoji/premium_lock.png b/Telegram/Resources/icons/emoji/premium_lock.png new file mode 100644 index 000000000..0498a400e Binary files /dev/null and b/Telegram/Resources/icons/emoji/premium_lock.png differ diff --git a/Telegram/Resources/icons/emoji/premium_lock@2x.png b/Telegram/Resources/icons/emoji/premium_lock@2x.png new file mode 100644 index 000000000..78390b734 Binary files /dev/null and b/Telegram/Resources/icons/emoji/premium_lock@2x.png differ diff --git a/Telegram/Resources/icons/emoji/premium_lock@3x.png b/Telegram/Resources/icons/emoji/premium_lock@3x.png new file mode 100644 index 000000000..81b8e0600 Binary files /dev/null and b/Telegram/Resources/icons/emoji/premium_lock@3x.png differ diff --git a/Telegram/Resources/icons/emoji/stickers_premium.png b/Telegram/Resources/icons/emoji/stickers_premium.png new file mode 100644 index 000000000..f2fc24545 Binary files /dev/null and b/Telegram/Resources/icons/emoji/stickers_premium.png differ diff --git a/Telegram/Resources/icons/emoji/stickers_premium@2x.png b/Telegram/Resources/icons/emoji/stickers_premium@2x.png new file mode 100644 index 000000000..71b77efe2 Binary files /dev/null and b/Telegram/Resources/icons/emoji/stickers_premium@2x.png differ diff --git a/Telegram/Resources/icons/emoji/stickers_premium@3x.png b/Telegram/Resources/icons/emoji/stickers_premium@3x.png new file mode 100644 index 000000000..9676bc9c5 Binary files /dev/null and b/Telegram/Resources/icons/emoji/stickers_premium@3x.png differ diff --git a/Telegram/Resources/icons/emoji_activity.png b/Telegram/Resources/icons/emoji_activity.png deleted file mode 100644 index a892affd5..000000000 Binary files a/Telegram/Resources/icons/emoji_activity.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_activity@2x.png b/Telegram/Resources/icons/emoji_activity@2x.png deleted file mode 100644 index 26b91a1ed..000000000 Binary files a/Telegram/Resources/icons/emoji_activity@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_activity@3x.png b/Telegram/Resources/icons/emoji_activity@3x.png deleted file mode 100644 index b7fa59814..000000000 Binary files a/Telegram/Resources/icons/emoji_activity@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_empty.png b/Telegram/Resources/icons/emoji_empty.png new file mode 100644 index 000000000..585818d88 Binary files /dev/null and b/Telegram/Resources/icons/emoji_empty.png differ diff --git a/Telegram/Resources/icons/emoji_empty@2x.png b/Telegram/Resources/icons/emoji_empty@2x.png new file mode 100644 index 000000000..69bebad76 Binary files /dev/null and b/Telegram/Resources/icons/emoji_empty@2x.png differ diff --git a/Telegram/Resources/icons/emoji_empty@3x.png b/Telegram/Resources/icons/emoji_empty@3x.png new file mode 100644 index 000000000..f52bf552b Binary files /dev/null and b/Telegram/Resources/icons/emoji_empty@3x.png differ diff --git a/Telegram/Resources/icons/emoji_faved.png b/Telegram/Resources/icons/emoji_faved.png deleted file mode 100644 index a3578243d..000000000 Binary files a/Telegram/Resources/icons/emoji_faved.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_faved@2x.png b/Telegram/Resources/icons/emoji_faved@2x.png deleted file mode 100644 index a79dd5e3f..000000000 Binary files a/Telegram/Resources/icons/emoji_faved@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_faved@3x.png b/Telegram/Resources/icons/emoji_faved@3x.png deleted file mode 100644 index 8a6509124..000000000 Binary files a/Telegram/Resources/icons/emoji_faved@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_food.png b/Telegram/Resources/icons/emoji_food.png deleted file mode 100644 index 3112f2006..000000000 Binary files a/Telegram/Resources/icons/emoji_food.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_food@2x.png b/Telegram/Resources/icons/emoji_food@2x.png deleted file mode 100644 index 1b2c83ee6..000000000 Binary files a/Telegram/Resources/icons/emoji_food@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_food@3x.png b/Telegram/Resources/icons/emoji_food@3x.png deleted file mode 100644 index 4a88adee6..000000000 Binary files a/Telegram/Resources/icons/emoji_food@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_nature.png b/Telegram/Resources/icons/emoji_nature.png deleted file mode 100644 index 6e284c5fd..000000000 Binary files a/Telegram/Resources/icons/emoji_nature.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_nature@2x.png b/Telegram/Resources/icons/emoji_nature@2x.png deleted file mode 100644 index dfacd7545..000000000 Binary files a/Telegram/Resources/icons/emoji_nature@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_nature@3x.png b/Telegram/Resources/icons/emoji_nature@3x.png deleted file mode 100644 index 3a5b89c68..000000000 Binary files a/Telegram/Resources/icons/emoji_nature@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_objects.png b/Telegram/Resources/icons/emoji_objects.png deleted file mode 100644 index 744b522c0..000000000 Binary files a/Telegram/Resources/icons/emoji_objects.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_objects@2x.png b/Telegram/Resources/icons/emoji_objects@2x.png deleted file mode 100644 index b332bbac6..000000000 Binary files a/Telegram/Resources/icons/emoji_objects@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_objects@3x.png b/Telegram/Resources/icons/emoji_objects@3x.png deleted file mode 100644 index 266c08b07..000000000 Binary files a/Telegram/Resources/icons/emoji_objects@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_people.png b/Telegram/Resources/icons/emoji_people.png deleted file mode 100644 index 36985b165..000000000 Binary files a/Telegram/Resources/icons/emoji_people.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_people@2x.png b/Telegram/Resources/icons/emoji_people@2x.png deleted file mode 100644 index d8358c6f9..000000000 Binary files a/Telegram/Resources/icons/emoji_people@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_people@3x.png b/Telegram/Resources/icons/emoji_people@3x.png deleted file mode 100644 index 1ed2a3cc1..000000000 Binary files a/Telegram/Resources/icons/emoji_people@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_recent.png b/Telegram/Resources/icons/emoji_recent.png deleted file mode 100644 index f7545e600..000000000 Binary files a/Telegram/Resources/icons/emoji_recent.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_recent@2x.png b/Telegram/Resources/icons/emoji_recent@2x.png deleted file mode 100644 index 796247f9d..000000000 Binary files a/Telegram/Resources/icons/emoji_recent@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_recent@3x.png b/Telegram/Resources/icons/emoji_recent@3x.png deleted file mode 100644 index c568efe05..000000000 Binary files a/Telegram/Resources/icons/emoji_recent@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_settings.png b/Telegram/Resources/icons/emoji_settings.png deleted file mode 100644 index 74c86fce8..000000000 Binary files a/Telegram/Resources/icons/emoji_settings.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_settings@2x.png b/Telegram/Resources/icons/emoji_settings@2x.png deleted file mode 100644 index 9143ac836..000000000 Binary files a/Telegram/Resources/icons/emoji_settings@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_settings@3x.png b/Telegram/Resources/icons/emoji_settings@3x.png deleted file mode 100644 index 8b92f5326..000000000 Binary files a/Telegram/Resources/icons/emoji_settings@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_switch.png b/Telegram/Resources/icons/emoji_switch.png deleted file mode 100644 index 702e8ff36..000000000 Binary files a/Telegram/Resources/icons/emoji_switch.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_switch@2x.png b/Telegram/Resources/icons/emoji_switch@2x.png deleted file mode 100644 index 5230585da..000000000 Binary files a/Telegram/Resources/icons/emoji_switch@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_switch@3x.png b/Telegram/Resources/icons/emoji_switch@3x.png deleted file mode 100644 index 21573373a..000000000 Binary files a/Telegram/Resources/icons/emoji_switch@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_symbols.png b/Telegram/Resources/icons/emoji_symbols.png deleted file mode 100644 index 8f08db937..000000000 Binary files a/Telegram/Resources/icons/emoji_symbols.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_symbols@2x.png b/Telegram/Resources/icons/emoji_symbols@2x.png deleted file mode 100644 index 65a3a6731..000000000 Binary files a/Telegram/Resources/icons/emoji_symbols@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_symbols@3x.png b/Telegram/Resources/icons/emoji_symbols@3x.png deleted file mode 100644 index 1305ac241..000000000 Binary files a/Telegram/Resources/icons/emoji_symbols@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_travel.png b/Telegram/Resources/icons/emoji_travel.png deleted file mode 100644 index c5770698d..000000000 Binary files a/Telegram/Resources/icons/emoji_travel.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_travel@2x.png b/Telegram/Resources/icons/emoji_travel@2x.png deleted file mode 100644 index d5896eb17..000000000 Binary files a/Telegram/Resources/icons/emoji_travel@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/emoji_travel@3x.png b/Telegram/Resources/icons/emoji_travel@3x.png deleted file mode 100644 index f54b62fe8..000000000 Binary files a/Telegram/Resources/icons/emoji_travel@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/fast_to_original.png b/Telegram/Resources/icons/fast_to_original.png index c6f95228e..450dbd4a9 100644 Binary files a/Telegram/Resources/icons/fast_to_original.png and b/Telegram/Resources/icons/fast_to_original.png differ diff --git a/Telegram/Resources/icons/fast_to_original@2x.png b/Telegram/Resources/icons/fast_to_original@2x.png index 2bdbd9bb0..101beffc5 100644 Binary files a/Telegram/Resources/icons/fast_to_original@2x.png and b/Telegram/Resources/icons/fast_to_original@2x.png differ diff --git a/Telegram/Resources/icons/fast_to_original@3x.png b/Telegram/Resources/icons/fast_to_original@3x.png index 87f4cabcd..bc6bceea9 100644 Binary files a/Telegram/Resources/icons/fast_to_original@3x.png and b/Telegram/Resources/icons/fast_to_original@3x.png differ diff --git a/Telegram/Resources/icons/filters/filters_all.png b/Telegram/Resources/icons/filters/filters_all.png deleted file mode 100644 index 9cf16f5e0..000000000 Binary files a/Telegram/Resources/icons/filters/filters_all.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_all@2x.png b/Telegram/Resources/icons/filters/filters_all@2x.png deleted file mode 100644 index fc14b63b6..000000000 Binary files a/Telegram/Resources/icons/filters/filters_all@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_all@3x.png b/Telegram/Resources/icons/filters/filters_all@3x.png deleted file mode 100644 index e1cc8aa77..000000000 Binary files a/Telegram/Resources/icons/filters/filters_all@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_all_active.png b/Telegram/Resources/icons/filters/filters_all_active.png deleted file mode 100644 index c2a0fb691..000000000 Binary files a/Telegram/Resources/icons/filters/filters_all_active.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_all_active@2x.png b/Telegram/Resources/icons/filters/filters_all_active@2x.png deleted file mode 100644 index fa027ea7f..000000000 Binary files a/Telegram/Resources/icons/filters/filters_all_active@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_all_active@3x.png b/Telegram/Resources/icons/filters/filters_all_active@3x.png deleted file mode 100644 index 99d77e8c1..000000000 Binary files a/Telegram/Resources/icons/filters/filters_all_active@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_bots.png b/Telegram/Resources/icons/filters/filters_bots.png deleted file mode 100644 index 590b15279..000000000 Binary files a/Telegram/Resources/icons/filters/filters_bots.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_bots@2x.png b/Telegram/Resources/icons/filters/filters_bots@2x.png deleted file mode 100644 index c152af138..000000000 Binary files a/Telegram/Resources/icons/filters/filters_bots@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_bots@3x.png b/Telegram/Resources/icons/filters/filters_bots@3x.png deleted file mode 100644 index 867e63a7d..000000000 Binary files a/Telegram/Resources/icons/filters/filters_bots@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_bots_active.png b/Telegram/Resources/icons/filters/filters_bots_active.png deleted file mode 100644 index 3342d8671..000000000 Binary files a/Telegram/Resources/icons/filters/filters_bots_active.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_bots_active@2x.png b/Telegram/Resources/icons/filters/filters_bots_active@2x.png deleted file mode 100644 index 6788eb795..000000000 Binary files a/Telegram/Resources/icons/filters/filters_bots_active@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_bots_active@3x.png b/Telegram/Resources/icons/filters/filters_bots_active@3x.png deleted file mode 100644 index 7bf3a689d..000000000 Binary files a/Telegram/Resources/icons/filters/filters_bots_active@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_channels.png b/Telegram/Resources/icons/filters/filters_channels.png deleted file mode 100644 index be77932b8..000000000 Binary files a/Telegram/Resources/icons/filters/filters_channels.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_channels@2x.png b/Telegram/Resources/icons/filters/filters_channels@2x.png deleted file mode 100644 index 697e07daf..000000000 Binary files a/Telegram/Resources/icons/filters/filters_channels@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_channels@3x.png b/Telegram/Resources/icons/filters/filters_channels@3x.png deleted file mode 100644 index 3dc154a45..000000000 Binary files a/Telegram/Resources/icons/filters/filters_channels@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_channels_active.png b/Telegram/Resources/icons/filters/filters_channels_active.png deleted file mode 100644 index 202ce0368..000000000 Binary files a/Telegram/Resources/icons/filters/filters_channels_active.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_channels_active@2x.png b/Telegram/Resources/icons/filters/filters_channels_active@2x.png deleted file mode 100644 index 64306644f..000000000 Binary files a/Telegram/Resources/icons/filters/filters_channels_active@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_channels_active@3x.png b/Telegram/Resources/icons/filters/filters_channels_active@3x.png deleted file mode 100644 index c5428670e..000000000 Binary files a/Telegram/Resources/icons/filters/filters_channels_active@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_custom.png b/Telegram/Resources/icons/filters/filters_custom.png deleted file mode 100644 index 499de7caa..000000000 Binary files a/Telegram/Resources/icons/filters/filters_custom.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_custom@2x.png b/Telegram/Resources/icons/filters/filters_custom@2x.png deleted file mode 100644 index 2d8ef3270..000000000 Binary files a/Telegram/Resources/icons/filters/filters_custom@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_custom@3x.png b/Telegram/Resources/icons/filters/filters_custom@3x.png deleted file mode 100644 index 4e0b2a126..000000000 Binary files a/Telegram/Resources/icons/filters/filters_custom@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_custom_active.png b/Telegram/Resources/icons/filters/filters_custom_active.png deleted file mode 100644 index 740235201..000000000 Binary files a/Telegram/Resources/icons/filters/filters_custom_active.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_custom_active@2x.png b/Telegram/Resources/icons/filters/filters_custom_active@2x.png deleted file mode 100644 index 4a25cbaef..000000000 Binary files a/Telegram/Resources/icons/filters/filters_custom_active@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_custom_active@3x.png b/Telegram/Resources/icons/filters/filters_custom_active@3x.png deleted file mode 100644 index 5e696988c..000000000 Binary files a/Telegram/Resources/icons/filters/filters_custom_active@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_edit.png b/Telegram/Resources/icons/filters/filters_edit.png deleted file mode 100644 index 853d5f598..000000000 Binary files a/Telegram/Resources/icons/filters/filters_edit.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_edit@2x.png b/Telegram/Resources/icons/filters/filters_edit@2x.png deleted file mode 100644 index 2236b91f6..000000000 Binary files a/Telegram/Resources/icons/filters/filters_edit@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_edit@3x.png b/Telegram/Resources/icons/filters/filters_edit@3x.png deleted file mode 100644 index 28fd6076a..000000000 Binary files a/Telegram/Resources/icons/filters/filters_edit@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_groups.png b/Telegram/Resources/icons/filters/filters_groups.png deleted file mode 100644 index 24d62f890..000000000 Binary files a/Telegram/Resources/icons/filters/filters_groups.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_groups@2x.png b/Telegram/Resources/icons/filters/filters_groups@2x.png deleted file mode 100644 index 00e515474..000000000 Binary files a/Telegram/Resources/icons/filters/filters_groups@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_groups@3x.png b/Telegram/Resources/icons/filters/filters_groups@3x.png deleted file mode 100644 index 9f3ff16e5..000000000 Binary files a/Telegram/Resources/icons/filters/filters_groups@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_groups_active.png b/Telegram/Resources/icons/filters/filters_groups_active.png deleted file mode 100644 index a5a143946..000000000 Binary files a/Telegram/Resources/icons/filters/filters_groups_active.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_groups_active@2x.png b/Telegram/Resources/icons/filters/filters_groups_active@2x.png deleted file mode 100644 index 6f87b49e4..000000000 Binary files a/Telegram/Resources/icons/filters/filters_groups_active@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_groups_active@3x.png b/Telegram/Resources/icons/filters/filters_groups_active@3x.png deleted file mode 100644 index 342825ff2..000000000 Binary files a/Telegram/Resources/icons/filters/filters_groups_active@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_private.png b/Telegram/Resources/icons/filters/filters_private.png deleted file mode 100644 index 68924026e..000000000 Binary files a/Telegram/Resources/icons/filters/filters_private.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_private@2x.png b/Telegram/Resources/icons/filters/filters_private@2x.png deleted file mode 100644 index c39dc8d74..000000000 Binary files a/Telegram/Resources/icons/filters/filters_private@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_private@3x.png b/Telegram/Resources/icons/filters/filters_private@3x.png deleted file mode 100644 index 42ce50320..000000000 Binary files a/Telegram/Resources/icons/filters/filters_private@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_private_active.png b/Telegram/Resources/icons/filters/filters_private_active.png deleted file mode 100644 index 912ea878d..000000000 Binary files a/Telegram/Resources/icons/filters/filters_private_active.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_private_active@2x.png b/Telegram/Resources/icons/filters/filters_private_active@2x.png deleted file mode 100644 index c83948ad4..000000000 Binary files a/Telegram/Resources/icons/filters/filters_private_active@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_private_active@3x.png b/Telegram/Resources/icons/filters/filters_private_active@3x.png deleted file mode 100644 index 2bf50ef6e..000000000 Binary files a/Telegram/Resources/icons/filters/filters_private_active@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_setup.png b/Telegram/Resources/icons/filters/filters_setup.png deleted file mode 100644 index 49602582f..000000000 Binary files a/Telegram/Resources/icons/filters/filters_setup.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_setup@2x.png b/Telegram/Resources/icons/filters/filters_setup@2x.png deleted file mode 100644 index 519f77fef..000000000 Binary files a/Telegram/Resources/icons/filters/filters_setup@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_setup@3x.png b/Telegram/Resources/icons/filters/filters_setup@3x.png deleted file mode 100644 index 87ab4420c..000000000 Binary files a/Telegram/Resources/icons/filters/filters_setup@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_type_read.png b/Telegram/Resources/icons/filters/filters_type_read.png deleted file mode 100644 index 689da4ca7..000000000 Binary files a/Telegram/Resources/icons/filters/filters_type_read.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_type_read@2x.png b/Telegram/Resources/icons/filters/filters_type_read@2x.png deleted file mode 100644 index f874a3c28..000000000 Binary files a/Telegram/Resources/icons/filters/filters_type_read@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_type_read@3x.png b/Telegram/Resources/icons/filters/filters_type_read@3x.png deleted file mode 100644 index b2a8feea1..000000000 Binary files a/Telegram/Resources/icons/filters/filters_type_read@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_unmuted.png b/Telegram/Resources/icons/filters/filters_unmuted.png deleted file mode 100644 index 819d3f7ec..000000000 Binary files a/Telegram/Resources/icons/filters/filters_unmuted.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_unmuted@2x.png b/Telegram/Resources/icons/filters/filters_unmuted@2x.png deleted file mode 100644 index 3244112e8..000000000 Binary files a/Telegram/Resources/icons/filters/filters_unmuted@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_unmuted@3x.png b/Telegram/Resources/icons/filters/filters_unmuted@3x.png deleted file mode 100644 index 113455c3e..000000000 Binary files a/Telegram/Resources/icons/filters/filters_unmuted@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_unmuted_active.png b/Telegram/Resources/icons/filters/filters_unmuted_active.png deleted file mode 100644 index 39da6995d..000000000 Binary files a/Telegram/Resources/icons/filters/filters_unmuted_active.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_unmuted_active@2x.png b/Telegram/Resources/icons/filters/filters_unmuted_active@2x.png deleted file mode 100644 index 1613a7ef3..000000000 Binary files a/Telegram/Resources/icons/filters/filters_unmuted_active@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_unmuted_active@3x.png b/Telegram/Resources/icons/filters/filters_unmuted_active@3x.png deleted file mode 100644 index 1cb402100..000000000 Binary files a/Telegram/Resources/icons/filters/filters_unmuted_active@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_unread.png b/Telegram/Resources/icons/filters/filters_unread.png deleted file mode 100644 index 1ed90a352..000000000 Binary files a/Telegram/Resources/icons/filters/filters_unread.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_unread@2x.png b/Telegram/Resources/icons/filters/filters_unread@2x.png deleted file mode 100644 index 907daf84a..000000000 Binary files a/Telegram/Resources/icons/filters/filters_unread@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_unread@3x.png b/Telegram/Resources/icons/filters/filters_unread@3x.png deleted file mode 100644 index c6577a20c..000000000 Binary files a/Telegram/Resources/icons/filters/filters_unread@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_unread_active.png b/Telegram/Resources/icons/filters/filters_unread_active.png deleted file mode 100644 index b7169765c..000000000 Binary files a/Telegram/Resources/icons/filters/filters_unread_active.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_unread_active@2x.png b/Telegram/Resources/icons/filters/filters_unread_active@2x.png deleted file mode 100644 index 38bcba696..000000000 Binary files a/Telegram/Resources/icons/filters/filters_unread_active@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/filters_unread_active@3x.png b/Telegram/Resources/icons/filters/filters_unread_active@3x.png deleted file mode 100644 index 99bd33737..000000000 Binary files a/Telegram/Resources/icons/filters/filters_unread_active@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_cat.png b/Telegram/Resources/icons/filters/folders_cat.png deleted file mode 100644 index 67748a1f6..000000000 Binary files a/Telegram/Resources/icons/filters/folders_cat.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_cat@2x.png b/Telegram/Resources/icons/filters/folders_cat@2x.png deleted file mode 100644 index aa08a4b4c..000000000 Binary files a/Telegram/Resources/icons/filters/folders_cat@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_cat@3x.png b/Telegram/Resources/icons/filters/folders_cat@3x.png deleted file mode 100644 index ef978ea92..000000000 Binary files a/Telegram/Resources/icons/filters/folders_cat@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_cat_active.png b/Telegram/Resources/icons/filters/folders_cat_active.png deleted file mode 100644 index 6f9e33981..000000000 Binary files a/Telegram/Resources/icons/filters/folders_cat_active.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_cat_active@2x.png b/Telegram/Resources/icons/filters/folders_cat_active@2x.png deleted file mode 100644 index 012424ade..000000000 Binary files a/Telegram/Resources/icons/filters/folders_cat_active@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_cat_active@3x.png b/Telegram/Resources/icons/filters/folders_cat_active@3x.png deleted file mode 100644 index 13ed57f1d..000000000 Binary files a/Telegram/Resources/icons/filters/folders_cat_active@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_crown.png b/Telegram/Resources/icons/filters/folders_crown.png deleted file mode 100644 index ab4a48567..000000000 Binary files a/Telegram/Resources/icons/filters/folders_crown.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_crown@2x.png b/Telegram/Resources/icons/filters/folders_crown@2x.png deleted file mode 100644 index a091297e7..000000000 Binary files a/Telegram/Resources/icons/filters/folders_crown@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_crown@3x.png b/Telegram/Resources/icons/filters/folders_crown@3x.png deleted file mode 100644 index b7d609191..000000000 Binary files a/Telegram/Resources/icons/filters/folders_crown@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_crown_active.png b/Telegram/Resources/icons/filters/folders_crown_active.png deleted file mode 100644 index f14e27d9a..000000000 Binary files a/Telegram/Resources/icons/filters/folders_crown_active.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_crown_active@2x.png b/Telegram/Resources/icons/filters/folders_crown_active@2x.png deleted file mode 100644 index be26b69d7..000000000 Binary files a/Telegram/Resources/icons/filters/folders_crown_active@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_crown_active@3x.png b/Telegram/Resources/icons/filters/folders_crown_active@3x.png deleted file mode 100644 index 0399765e7..000000000 Binary files a/Telegram/Resources/icons/filters/folders_crown_active@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_favorite.png b/Telegram/Resources/icons/filters/folders_favorite.png deleted file mode 100644 index 400fb9612..000000000 Binary files a/Telegram/Resources/icons/filters/folders_favorite.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_favorite@2x.png b/Telegram/Resources/icons/filters/folders_favorite@2x.png deleted file mode 100644 index 36102a2b5..000000000 Binary files a/Telegram/Resources/icons/filters/folders_favorite@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_favorite@3x.png b/Telegram/Resources/icons/filters/folders_favorite@3x.png deleted file mode 100644 index 117bd86c5..000000000 Binary files a/Telegram/Resources/icons/filters/folders_favorite@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_favorite_active.png b/Telegram/Resources/icons/filters/folders_favorite_active.png deleted file mode 100644 index e45aa53a4..000000000 Binary files a/Telegram/Resources/icons/filters/folders_favorite_active.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_favorite_active@2x.png b/Telegram/Resources/icons/filters/folders_favorite_active@2x.png deleted file mode 100644 index faebedbba..000000000 Binary files a/Telegram/Resources/icons/filters/folders_favorite_active@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_favorite_active@3x.png b/Telegram/Resources/icons/filters/folders_favorite_active@3x.png deleted file mode 100644 index 88d4504ac..000000000 Binary files a/Telegram/Resources/icons/filters/folders_favorite_active@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_flower.png b/Telegram/Resources/icons/filters/folders_flower.png deleted file mode 100644 index 3c452c82a..000000000 Binary files a/Telegram/Resources/icons/filters/folders_flower.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_flower@2x.png b/Telegram/Resources/icons/filters/folders_flower@2x.png deleted file mode 100644 index e6ad0af47..000000000 Binary files a/Telegram/Resources/icons/filters/folders_flower@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_flower@3x.png b/Telegram/Resources/icons/filters/folders_flower@3x.png deleted file mode 100644 index a143804cc..000000000 Binary files a/Telegram/Resources/icons/filters/folders_flower@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_flower_active.png b/Telegram/Resources/icons/filters/folders_flower_active.png deleted file mode 100644 index 598554c47..000000000 Binary files a/Telegram/Resources/icons/filters/folders_flower_active.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_flower_active@2x.png b/Telegram/Resources/icons/filters/folders_flower_active@2x.png deleted file mode 100644 index d4d897d0b..000000000 Binary files a/Telegram/Resources/icons/filters/folders_flower_active@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_flower_active@3x.png b/Telegram/Resources/icons/filters/folders_flower_active@3x.png deleted file mode 100644 index ecb2169eb..000000000 Binary files a/Telegram/Resources/icons/filters/folders_flower_active@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_game.png b/Telegram/Resources/icons/filters/folders_game.png deleted file mode 100644 index 69119b7d9..000000000 Binary files a/Telegram/Resources/icons/filters/folders_game.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_game@2x.png b/Telegram/Resources/icons/filters/folders_game@2x.png deleted file mode 100644 index 09fd05fe4..000000000 Binary files a/Telegram/Resources/icons/filters/folders_game@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_game@3x.png b/Telegram/Resources/icons/filters/folders_game@3x.png deleted file mode 100644 index 84e31f533..000000000 Binary files a/Telegram/Resources/icons/filters/folders_game@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_game_active.png b/Telegram/Resources/icons/filters/folders_game_active.png deleted file mode 100644 index 37ed6f20a..000000000 Binary files a/Telegram/Resources/icons/filters/folders_game_active.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_game_active@2x.png b/Telegram/Resources/icons/filters/folders_game_active@2x.png deleted file mode 100644 index 5e6d6edc1..000000000 Binary files a/Telegram/Resources/icons/filters/folders_game_active@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_game_active@3x.png b/Telegram/Resources/icons/filters/folders_game_active@3x.png deleted file mode 100644 index 594930468..000000000 Binary files a/Telegram/Resources/icons/filters/folders_game_active@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_home.png b/Telegram/Resources/icons/filters/folders_home.png deleted file mode 100644 index 59ef27c92..000000000 Binary files a/Telegram/Resources/icons/filters/folders_home.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_home@2x.png b/Telegram/Resources/icons/filters/folders_home@2x.png deleted file mode 100644 index 4ec5954c7..000000000 Binary files a/Telegram/Resources/icons/filters/folders_home@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_home@3x.png b/Telegram/Resources/icons/filters/folders_home@3x.png deleted file mode 100644 index 52e147732..000000000 Binary files a/Telegram/Resources/icons/filters/folders_home@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_home_active.png b/Telegram/Resources/icons/filters/folders_home_active.png deleted file mode 100644 index cfd99be56..000000000 Binary files a/Telegram/Resources/icons/filters/folders_home_active.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_home_active@2x.png b/Telegram/Resources/icons/filters/folders_home_active@2x.png deleted file mode 100644 index 55aee99ed..000000000 Binary files a/Telegram/Resources/icons/filters/folders_home_active@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_home_active@3x.png b/Telegram/Resources/icons/filters/folders_home_active@3x.png deleted file mode 100644 index 6d148e115..000000000 Binary files a/Telegram/Resources/icons/filters/folders_home_active@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_love.png b/Telegram/Resources/icons/filters/folders_love.png deleted file mode 100644 index 701cd807f..000000000 Binary files a/Telegram/Resources/icons/filters/folders_love.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_love@2x.png b/Telegram/Resources/icons/filters/folders_love@2x.png deleted file mode 100644 index 27e5a1dc9..000000000 Binary files a/Telegram/Resources/icons/filters/folders_love@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_love@3x.png b/Telegram/Resources/icons/filters/folders_love@3x.png deleted file mode 100644 index 41b44363e..000000000 Binary files a/Telegram/Resources/icons/filters/folders_love@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_love_active.png b/Telegram/Resources/icons/filters/folders_love_active.png deleted file mode 100644 index cea3b50dc..000000000 Binary files a/Telegram/Resources/icons/filters/folders_love_active.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_love_active@2x.png b/Telegram/Resources/icons/filters/folders_love_active@2x.png deleted file mode 100644 index 55997b62d..000000000 Binary files a/Telegram/Resources/icons/filters/folders_love_active@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_love_active@3x.png b/Telegram/Resources/icons/filters/folders_love_active@3x.png deleted file mode 100644 index b1477710a..000000000 Binary files a/Telegram/Resources/icons/filters/folders_love_active@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_mask.png b/Telegram/Resources/icons/filters/folders_mask.png deleted file mode 100644 index 86dc6c336..000000000 Binary files a/Telegram/Resources/icons/filters/folders_mask.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_mask@2x.png b/Telegram/Resources/icons/filters/folders_mask@2x.png deleted file mode 100644 index 42fa98a5d..000000000 Binary files a/Telegram/Resources/icons/filters/folders_mask@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_mask@3x.png b/Telegram/Resources/icons/filters/folders_mask@3x.png deleted file mode 100644 index 14eb2ded4..000000000 Binary files a/Telegram/Resources/icons/filters/folders_mask@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_mask_active.png b/Telegram/Resources/icons/filters/folders_mask_active.png deleted file mode 100644 index 837922a11..000000000 Binary files a/Telegram/Resources/icons/filters/folders_mask_active.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_mask_active@2x.png b/Telegram/Resources/icons/filters/folders_mask_active@2x.png deleted file mode 100644 index 9d7918a6a..000000000 Binary files a/Telegram/Resources/icons/filters/folders_mask_active@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_mask_active@3x.png b/Telegram/Resources/icons/filters/folders_mask_active@3x.png deleted file mode 100644 index 9c36ab932..000000000 Binary files a/Telegram/Resources/icons/filters/folders_mask_active@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_party.png b/Telegram/Resources/icons/filters/folders_party.png deleted file mode 100644 index 144a8600d..000000000 Binary files a/Telegram/Resources/icons/filters/folders_party.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_party@2x.png b/Telegram/Resources/icons/filters/folders_party@2x.png deleted file mode 100644 index 4c4d99218..000000000 Binary files a/Telegram/Resources/icons/filters/folders_party@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_party@3x.png b/Telegram/Resources/icons/filters/folders_party@3x.png deleted file mode 100644 index 652338b07..000000000 Binary files a/Telegram/Resources/icons/filters/folders_party@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_party_active.png b/Telegram/Resources/icons/filters/folders_party_active.png deleted file mode 100644 index 16ab0fcfb..000000000 Binary files a/Telegram/Resources/icons/filters/folders_party_active.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_party_active@2x.png b/Telegram/Resources/icons/filters/folders_party_active@2x.png deleted file mode 100644 index e12213328..000000000 Binary files a/Telegram/Resources/icons/filters/folders_party_active@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_party_active@3x.png b/Telegram/Resources/icons/filters/folders_party_active@3x.png deleted file mode 100644 index 123d39f2a..000000000 Binary files a/Telegram/Resources/icons/filters/folders_party_active@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_sport.png b/Telegram/Resources/icons/filters/folders_sport.png deleted file mode 100644 index b59aa62a3..000000000 Binary files a/Telegram/Resources/icons/filters/folders_sport.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_sport@2x.png b/Telegram/Resources/icons/filters/folders_sport@2x.png deleted file mode 100644 index 16d7bdf57..000000000 Binary files a/Telegram/Resources/icons/filters/folders_sport@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_sport@3x.png b/Telegram/Resources/icons/filters/folders_sport@3x.png deleted file mode 100644 index 422af43e6..000000000 Binary files a/Telegram/Resources/icons/filters/folders_sport@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_sport_active.png b/Telegram/Resources/icons/filters/folders_sport_active.png deleted file mode 100644 index c3581bc34..000000000 Binary files a/Telegram/Resources/icons/filters/folders_sport_active.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_sport_active@2x.png b/Telegram/Resources/icons/filters/folders_sport_active@2x.png deleted file mode 100644 index 50138d104..000000000 Binary files a/Telegram/Resources/icons/filters/folders_sport_active@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_sport_active@3x.png b/Telegram/Resources/icons/filters/folders_sport_active@3x.png deleted file mode 100644 index f4bdb1f09..000000000 Binary files a/Telegram/Resources/icons/filters/folders_sport_active@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_study.png b/Telegram/Resources/icons/filters/folders_study.png deleted file mode 100644 index dbbb4cc2f..000000000 Binary files a/Telegram/Resources/icons/filters/folders_study.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_study@2x.png b/Telegram/Resources/icons/filters/folders_study@2x.png deleted file mode 100644 index 96b281491..000000000 Binary files a/Telegram/Resources/icons/filters/folders_study@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_study@3x.png b/Telegram/Resources/icons/filters/folders_study@3x.png deleted file mode 100644 index c76dc5cf2..000000000 Binary files a/Telegram/Resources/icons/filters/folders_study@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_study_active.png b/Telegram/Resources/icons/filters/folders_study_active.png deleted file mode 100644 index 379d32854..000000000 Binary files a/Telegram/Resources/icons/filters/folders_study_active.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_study_active@2x.png b/Telegram/Resources/icons/filters/folders_study_active@2x.png deleted file mode 100644 index 4ba6d66b9..000000000 Binary files a/Telegram/Resources/icons/filters/folders_study_active@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_study_active@3x.png b/Telegram/Resources/icons/filters/folders_study_active@3x.png deleted file mode 100644 index dff4822fe..000000000 Binary files a/Telegram/Resources/icons/filters/folders_study_active@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_trade.png b/Telegram/Resources/icons/filters/folders_trade.png deleted file mode 100644 index 62cbae9a8..000000000 Binary files a/Telegram/Resources/icons/filters/folders_trade.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_trade@2x.png b/Telegram/Resources/icons/filters/folders_trade@2x.png deleted file mode 100644 index db435b6eb..000000000 Binary files a/Telegram/Resources/icons/filters/folders_trade@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_trade@3x.png b/Telegram/Resources/icons/filters/folders_trade@3x.png deleted file mode 100644 index c854a9497..000000000 Binary files a/Telegram/Resources/icons/filters/folders_trade@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_travel.png b/Telegram/Resources/icons/filters/folders_travel.png deleted file mode 100644 index 886fcaf53..000000000 Binary files a/Telegram/Resources/icons/filters/folders_travel.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_travel@2x.png b/Telegram/Resources/icons/filters/folders_travel@2x.png deleted file mode 100644 index e5df48b95..000000000 Binary files a/Telegram/Resources/icons/filters/folders_travel@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_travel@3x.png b/Telegram/Resources/icons/filters/folders_travel@3x.png deleted file mode 100644 index 0897aeee3..000000000 Binary files a/Telegram/Resources/icons/filters/folders_travel@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_travel_active.png b/Telegram/Resources/icons/filters/folders_travel_active.png deleted file mode 100644 index 7774ca025..000000000 Binary files a/Telegram/Resources/icons/filters/folders_travel_active.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_travel_active@2x.png b/Telegram/Resources/icons/filters/folders_travel_active@2x.png deleted file mode 100644 index 059b6b0ff..000000000 Binary files a/Telegram/Resources/icons/filters/folders_travel_active@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_travel_active@3x.png b/Telegram/Resources/icons/filters/folders_travel_active@3x.png deleted file mode 100644 index 2a5b35492..000000000 Binary files a/Telegram/Resources/icons/filters/folders_travel_active@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_work.png b/Telegram/Resources/icons/filters/folders_work.png deleted file mode 100644 index 9be9132ee..000000000 Binary files a/Telegram/Resources/icons/filters/folders_work.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_work@2x.png b/Telegram/Resources/icons/filters/folders_work@2x.png deleted file mode 100644 index a70a41ac1..000000000 Binary files a/Telegram/Resources/icons/filters/folders_work@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_work@3x.png b/Telegram/Resources/icons/filters/folders_work@3x.png deleted file mode 100644 index 91d9b99cb..000000000 Binary files a/Telegram/Resources/icons/filters/folders_work@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_work_active.png b/Telegram/Resources/icons/filters/folders_work_active.png deleted file mode 100644 index 26fceb1a0..000000000 Binary files a/Telegram/Resources/icons/filters/folders_work_active.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_work_active@2x.png b/Telegram/Resources/icons/filters/folders_work_active@2x.png deleted file mode 100644 index 2dbd8b3f0..000000000 Binary files a/Telegram/Resources/icons/filters/folders_work_active@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/filters/folders_work_active@3x.png b/Telegram/Resources/icons/filters/folders_work_active@3x.png deleted file mode 100644 index c4391725c..000000000 Binary files a/Telegram/Resources/icons/filters/folders_work_active@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/folders/folder_existing_chats.png b/Telegram/Resources/icons/folders/folder_existing_chats.png new file mode 100644 index 000000000..e54a10425 Binary files /dev/null and b/Telegram/Resources/icons/folders/folder_existing_chats.png differ diff --git a/Telegram/Resources/icons/folders/folder_existing_chats@2x.png b/Telegram/Resources/icons/folders/folder_existing_chats@2x.png new file mode 100644 index 000000000..e3a73f7e1 Binary files /dev/null and b/Telegram/Resources/icons/folders/folder_existing_chats@2x.png differ diff --git a/Telegram/Resources/icons/folders/folder_existing_chats@3x.png b/Telegram/Resources/icons/folders/folder_existing_chats@3x.png new file mode 100644 index 000000000..2b37db754 Binary files /dev/null and b/Telegram/Resources/icons/folders/folder_existing_chats@3x.png differ diff --git a/Telegram/Resources/icons/folders/folder_new_chats.png b/Telegram/Resources/icons/folders/folder_new_chats.png new file mode 100644 index 000000000..03c8380d4 Binary files /dev/null and b/Telegram/Resources/icons/folders/folder_new_chats.png differ diff --git a/Telegram/Resources/icons/folders/folder_new_chats@2x.png b/Telegram/Resources/icons/folders/folder_new_chats@2x.png new file mode 100644 index 000000000..f91df7635 Binary files /dev/null and b/Telegram/Resources/icons/folders/folder_new_chats@2x.png differ diff --git a/Telegram/Resources/icons/folders/folder_new_chats@3x.png b/Telegram/Resources/icons/folders/folder_new_chats@3x.png new file mode 100644 index 000000000..d379a9e4b Binary files /dev/null and b/Telegram/Resources/icons/folders/folder_new_chats@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_airplane.png b/Telegram/Resources/icons/folders/folders_airplane.png new file mode 100644 index 000000000..39e49b399 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_airplane.png differ diff --git a/Telegram/Resources/icons/folders/folders_airplane@2x.png b/Telegram/Resources/icons/folders/folders_airplane@2x.png new file mode 100644 index 000000000..d2faec1e2 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_airplane@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_airplane@3x.png b/Telegram/Resources/icons/folders/folders_airplane@3x.png new file mode 100644 index 000000000..c1a3be559 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_airplane@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_all.png b/Telegram/Resources/icons/folders/folders_all.png new file mode 100644 index 000000000..d56a23b18 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_all.png differ diff --git a/Telegram/Resources/icons/folders/folders_all@2x.png b/Telegram/Resources/icons/folders/folders_all@2x.png new file mode 100644 index 000000000..f1271c31b Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_all@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_all@3x.png b/Telegram/Resources/icons/folders/folders_all@3x.png new file mode 100644 index 000000000..dca593193 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_all@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_book.png b/Telegram/Resources/icons/folders/folders_book.png new file mode 100644 index 000000000..006d2c916 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_book.png differ diff --git a/Telegram/Resources/icons/folders/folders_book@2x.png b/Telegram/Resources/icons/folders/folders_book@2x.png new file mode 100644 index 000000000..99b789c42 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_book@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_book@3x.png b/Telegram/Resources/icons/folders/folders_book@3x.png new file mode 100644 index 000000000..552ba9e6b Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_book@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_bots.png b/Telegram/Resources/icons/folders/folders_bots.png new file mode 100644 index 000000000..b1e762272 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_bots.png differ diff --git a/Telegram/Resources/icons/folders/folders_bots@2x.png b/Telegram/Resources/icons/folders/folders_bots@2x.png new file mode 100644 index 000000000..78822c1ee Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_bots@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_bots@3x.png b/Telegram/Resources/icons/folders/folders_bots@3x.png new file mode 100644 index 000000000..59be79bf2 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_bots@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_cat.png b/Telegram/Resources/icons/folders/folders_cat.png new file mode 100644 index 000000000..5956d8886 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_cat.png differ diff --git a/Telegram/Resources/icons/folders/folders_cat@2x.png b/Telegram/Resources/icons/folders/folders_cat@2x.png new file mode 100644 index 000000000..43e4722b8 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_cat@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_cat@3x.png b/Telegram/Resources/icons/folders/folders_cat@3x.png new file mode 100644 index 000000000..c76dde442 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_cat@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_channels.png b/Telegram/Resources/icons/folders/folders_channels.png new file mode 100644 index 000000000..7299caa89 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_channels.png differ diff --git a/Telegram/Resources/icons/folders/folders_channels@2x.png b/Telegram/Resources/icons/folders/folders_channels@2x.png new file mode 100644 index 000000000..bc2aa02af Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_channels@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_channels@3x.png b/Telegram/Resources/icons/folders/folders_channels@3x.png new file mode 100644 index 000000000..304990052 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_channels@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_crown.png b/Telegram/Resources/icons/folders/folders_crown.png new file mode 100644 index 000000000..b4262b229 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_crown.png differ diff --git a/Telegram/Resources/icons/folders/folders_crown@2x.png b/Telegram/Resources/icons/folders/folders_crown@2x.png new file mode 100644 index 000000000..720eddf46 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_crown@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_crown@3x.png b/Telegram/Resources/icons/folders/folders_crown@3x.png new file mode 100644 index 000000000..dac1982c9 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_crown@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_custom.png b/Telegram/Resources/icons/folders/folders_custom.png new file mode 100644 index 000000000..a2f87768e Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_custom.png differ diff --git a/Telegram/Resources/icons/folders/folders_custom@2x.png b/Telegram/Resources/icons/folders/folders_custom@2x.png new file mode 100644 index 000000000..fe97fc1d1 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_custom@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_custom@3x.png b/Telegram/Resources/icons/folders/folders_custom@3x.png new file mode 100644 index 000000000..656c7a498 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_custom@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_edit.png b/Telegram/Resources/icons/folders/folders_edit.png new file mode 100644 index 000000000..18716efd5 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_edit.png differ diff --git a/Telegram/Resources/icons/folders/folders_edit@2x.png b/Telegram/Resources/icons/folders/folders_edit@2x.png new file mode 100644 index 000000000..632c15070 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_edit@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_edit@3x.png b/Telegram/Resources/icons/folders/folders_edit@3x.png new file mode 100644 index 000000000..96344e532 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_edit@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_favorite.png b/Telegram/Resources/icons/folders/folders_favorite.png new file mode 100644 index 000000000..bcca10f25 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_favorite.png differ diff --git a/Telegram/Resources/icons/folders/folders_favorite@2x.png b/Telegram/Resources/icons/folders/folders_favorite@2x.png new file mode 100644 index 000000000..fc4c45530 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_favorite@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_favorite@3x.png b/Telegram/Resources/icons/folders/folders_favorite@3x.png new file mode 100644 index 000000000..7e76b2e59 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_favorite@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_flower.png b/Telegram/Resources/icons/folders/folders_flower.png new file mode 100644 index 000000000..20b66148d Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_flower.png differ diff --git a/Telegram/Resources/icons/folders/folders_flower@2x.png b/Telegram/Resources/icons/folders/folders_flower@2x.png new file mode 100644 index 000000000..63441079c Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_flower@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_flower@3x.png b/Telegram/Resources/icons/folders/folders_flower@3x.png new file mode 100644 index 000000000..30dcf9e5d Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_flower@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_game.png b/Telegram/Resources/icons/folders/folders_game.png new file mode 100644 index 000000000..ce070bd6e Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_game.png differ diff --git a/Telegram/Resources/icons/folders/folders_game@2x.png b/Telegram/Resources/icons/folders/folders_game@2x.png new file mode 100644 index 000000000..732b7587b Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_game@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_game@3x.png b/Telegram/Resources/icons/folders/folders_game@3x.png new file mode 100644 index 000000000..ed2160102 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_game@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_group.png b/Telegram/Resources/icons/folders/folders_group.png new file mode 100644 index 000000000..79f49b3cf Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_group.png differ diff --git a/Telegram/Resources/icons/folders/folders_group@2x.png b/Telegram/Resources/icons/folders/folders_group@2x.png new file mode 100644 index 000000000..c052721df Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_group@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_group@3x.png b/Telegram/Resources/icons/folders/folders_group@3x.png new file mode 100644 index 000000000..a153a8335 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_group@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_home.png b/Telegram/Resources/icons/folders/folders_home.png new file mode 100644 index 000000000..2f96f5b9b Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_home.png differ diff --git a/Telegram/Resources/icons/folders/folders_home@2x.png b/Telegram/Resources/icons/folders/folders_home@2x.png new file mode 100644 index 000000000..4084925c5 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_home@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_home@3x.png b/Telegram/Resources/icons/folders/folders_home@3x.png new file mode 100644 index 000000000..2d2581df2 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_home@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_light.png b/Telegram/Resources/icons/folders/folders_light.png new file mode 100644 index 000000000..427e54e4a Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_light.png differ diff --git a/Telegram/Resources/icons/folders/folders_light@2x.png b/Telegram/Resources/icons/folders/folders_light@2x.png new file mode 100644 index 000000000..cc3a02d96 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_light@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_light@3x.png b/Telegram/Resources/icons/folders/folders_light@3x.png new file mode 100644 index 000000000..46664bd7c Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_light@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_like.png b/Telegram/Resources/icons/folders/folders_like.png new file mode 100644 index 000000000..5e4011e50 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_like.png differ diff --git a/Telegram/Resources/icons/folders/folders_like@2x.png b/Telegram/Resources/icons/folders/folders_like@2x.png new file mode 100644 index 000000000..670e020e8 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_like@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_like@3x.png b/Telegram/Resources/icons/folders/folders_like@3x.png new file mode 100644 index 000000000..7007ab20a Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_like@3x.png differ diff --git a/Telegram/Resources/icons/filters/filters_local_book.png b/Telegram/Resources/icons/folders/folders_local_book.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_book.png rename to Telegram/Resources/icons/folders/folders_local_book.png diff --git a/Telegram/Resources/icons/filters/filters_local_book@2x.png b/Telegram/Resources/icons/folders/folders_local_book@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_book@2x.png rename to Telegram/Resources/icons/folders/folders_local_book@2x.png diff --git a/Telegram/Resources/icons/filters/filters_local_book@3x.png b/Telegram/Resources/icons/folders/folders_local_book@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_book@3x.png rename to Telegram/Resources/icons/folders/folders_local_book@3x.png diff --git a/Telegram/Resources/icons/filters/filters_local_book_active.png b/Telegram/Resources/icons/folders/folders_local_book_active.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_book_active.png rename to Telegram/Resources/icons/folders/folders_local_book_active.png diff --git a/Telegram/Resources/icons/filters/filters_local_book_active@2x.png b/Telegram/Resources/icons/folders/folders_local_book_active@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_book_active@2x.png rename to Telegram/Resources/icons/folders/folders_local_book_active@2x.png diff --git a/Telegram/Resources/icons/filters/filters_local_book_active@3x.png b/Telegram/Resources/icons/folders/folders_local_book_active@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_book_active@3x.png rename to Telegram/Resources/icons/folders/folders_local_book_active@3x.png diff --git a/Telegram/Resources/icons/filters/filters_local_brackets.png b/Telegram/Resources/icons/folders/folders_local_brackets.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_brackets.png rename to Telegram/Resources/icons/folders/folders_local_brackets.png diff --git a/Telegram/Resources/icons/filters/filters_local_brackets@2x.png b/Telegram/Resources/icons/folders/folders_local_brackets@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_brackets@2x.png rename to Telegram/Resources/icons/folders/folders_local_brackets@2x.png diff --git a/Telegram/Resources/icons/filters/filters_local_brackets@3x.png b/Telegram/Resources/icons/folders/folders_local_brackets@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_brackets@3x.png rename to Telegram/Resources/icons/folders/folders_local_brackets@3x.png diff --git a/Telegram/Resources/icons/filters/filters_local_candle.png b/Telegram/Resources/icons/folders/folders_local_candle.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_candle.png rename to Telegram/Resources/icons/folders/folders_local_candle.png diff --git a/Telegram/Resources/icons/filters/filters_local_candle@2x.png b/Telegram/Resources/icons/folders/folders_local_candle@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_candle@2x.png rename to Telegram/Resources/icons/folders/folders_local_candle@2x.png diff --git a/Telegram/Resources/icons/filters/filters_local_candle@3x.png b/Telegram/Resources/icons/folders/folders_local_candle@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_candle@3x.png rename to Telegram/Resources/icons/folders/folders_local_candle@3x.png diff --git a/Telegram/Resources/icons/filters/filters_local_candle_active.png b/Telegram/Resources/icons/folders/folders_local_candle_active.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_candle_active.png rename to Telegram/Resources/icons/folders/folders_local_candle_active.png diff --git a/Telegram/Resources/icons/filters/filters_local_candle_active@2x.png b/Telegram/Resources/icons/folders/folders_local_candle_active@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_candle_active@2x.png rename to Telegram/Resources/icons/folders/folders_local_candle_active@2x.png diff --git a/Telegram/Resources/icons/filters/filters_local_candle_active@3x.png b/Telegram/Resources/icons/folders/folders_local_candle_active@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_candle_active@3x.png rename to Telegram/Resources/icons/folders/folders_local_candle_active@3x.png diff --git a/Telegram/Resources/icons/filters/filters_local_city.png b/Telegram/Resources/icons/folders/folders_local_city.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_city.png rename to Telegram/Resources/icons/folders/folders_local_city.png diff --git a/Telegram/Resources/icons/filters/filters_local_city@2x.png b/Telegram/Resources/icons/folders/folders_local_city@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_city@2x.png rename to Telegram/Resources/icons/folders/folders_local_city@2x.png diff --git a/Telegram/Resources/icons/filters/filters_local_city@3x.png b/Telegram/Resources/icons/folders/folders_local_city@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_city@3x.png rename to Telegram/Resources/icons/folders/folders_local_city@3x.png diff --git a/Telegram/Resources/icons/filters/filters_local_city_active.png b/Telegram/Resources/icons/folders/folders_local_city_active.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_city_active.png rename to Telegram/Resources/icons/folders/folders_local_city_active.png diff --git a/Telegram/Resources/icons/filters/filters_local_city_active@2x.png b/Telegram/Resources/icons/folders/folders_local_city_active@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_city_active@2x.png rename to Telegram/Resources/icons/folders/folders_local_city_active@2x.png diff --git a/Telegram/Resources/icons/filters/filters_local_city_active@3x.png b/Telegram/Resources/icons/folders/folders_local_city_active@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_city_active@3x.png rename to Telegram/Resources/icons/folders/folders_local_city_active@3x.png diff --git a/Telegram/Resources/icons/filters/filters_local_desktop.png b/Telegram/Resources/icons/folders/folders_local_desktop.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_desktop.png rename to Telegram/Resources/icons/folders/folders_local_desktop.png diff --git a/Telegram/Resources/icons/filters/filters_local_desktop@2x.png b/Telegram/Resources/icons/folders/folders_local_desktop@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_desktop@2x.png rename to Telegram/Resources/icons/folders/folders_local_desktop@2x.png diff --git a/Telegram/Resources/icons/filters/filters_local_desktop@3x.png b/Telegram/Resources/icons/folders/folders_local_desktop@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_desktop@3x.png rename to Telegram/Resources/icons/folders/folders_local_desktop@3x.png diff --git a/Telegram/Resources/icons/filters/filters_local_desktop_active.png b/Telegram/Resources/icons/folders/folders_local_desktop_active.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_desktop_active.png rename to Telegram/Resources/icons/folders/folders_local_desktop_active.png diff --git a/Telegram/Resources/icons/filters/filters_local_desktop_active@2x.png b/Telegram/Resources/icons/folders/folders_local_desktop_active@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_desktop_active@2x.png rename to Telegram/Resources/icons/folders/folders_local_desktop_active@2x.png diff --git a/Telegram/Resources/icons/filters/filters_local_desktop_active@3x.png b/Telegram/Resources/icons/folders/folders_local_desktop_active@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_desktop_active@3x.png rename to Telegram/Resources/icons/folders/folders_local_desktop_active@3x.png diff --git a/Telegram/Resources/icons/filters/filters_local_earth.png b/Telegram/Resources/icons/folders/folders_local_earth.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_earth.png rename to Telegram/Resources/icons/folders/folders_local_earth.png diff --git a/Telegram/Resources/icons/filters/filters_local_earth@2x.png b/Telegram/Resources/icons/folders/folders_local_earth@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_earth@2x.png rename to Telegram/Resources/icons/folders/folders_local_earth@2x.png diff --git a/Telegram/Resources/icons/filters/filters_local_earth@3x.png b/Telegram/Resources/icons/folders/folders_local_earth@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_earth@3x.png rename to Telegram/Resources/icons/folders/folders_local_earth@3x.png diff --git a/Telegram/Resources/icons/filters/filters_local_music.png b/Telegram/Resources/icons/folders/folders_local_music.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_music.png rename to Telegram/Resources/icons/folders/folders_local_music.png diff --git a/Telegram/Resources/icons/filters/filters_local_music@2x.png b/Telegram/Resources/icons/folders/folders_local_music@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_music@2x.png rename to Telegram/Resources/icons/folders/folders_local_music@2x.png diff --git a/Telegram/Resources/icons/filters/filters_local_music@3x.png b/Telegram/Resources/icons/folders/folders_local_music@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_music@3x.png rename to Telegram/Resources/icons/folders/folders_local_music@3x.png diff --git a/Telegram/Resources/icons/filters/filters_local_music_active.png b/Telegram/Resources/icons/folders/folders_local_music_active.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_music_active.png rename to Telegram/Resources/icons/folders/folders_local_music_active.png diff --git a/Telegram/Resources/icons/filters/filters_local_music_active@2x.png b/Telegram/Resources/icons/folders/folders_local_music_active@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_music_active@2x.png rename to Telegram/Resources/icons/folders/folders_local_music_active@2x.png diff --git a/Telegram/Resources/icons/filters/filters_local_music_active@3x.png b/Telegram/Resources/icons/folders/folders_local_music_active@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_music_active@3x.png rename to Telegram/Resources/icons/folders/folders_local_music_active@3x.png diff --git a/Telegram/Resources/icons/filters/filters_local_news.png b/Telegram/Resources/icons/folders/folders_local_news.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_news.png rename to Telegram/Resources/icons/folders/folders_local_news.png diff --git a/Telegram/Resources/icons/filters/filters_local_news@2x.png b/Telegram/Resources/icons/folders/folders_local_news@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_news@2x.png rename to Telegram/Resources/icons/folders/folders_local_news@2x.png diff --git a/Telegram/Resources/icons/filters/filters_local_news@3x.png b/Telegram/Resources/icons/folders/folders_local_news@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_news@3x.png rename to Telegram/Resources/icons/folders/folders_local_news@3x.png diff --git a/Telegram/Resources/icons/filters/filters_local_news_active.png b/Telegram/Resources/icons/folders/folders_local_news_active.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_news_active.png rename to Telegram/Resources/icons/folders/folders_local_news_active.png diff --git a/Telegram/Resources/icons/filters/filters_local_news_active@2x.png b/Telegram/Resources/icons/folders/folders_local_news_active@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_news_active@2x.png rename to Telegram/Resources/icons/folders/folders_local_news_active@2x.png diff --git a/Telegram/Resources/icons/filters/filters_local_news_active@3x.png b/Telegram/Resources/icons/folders/folders_local_news_active@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_news_active@3x.png rename to Telegram/Resources/icons/folders/folders_local_news_active@3x.png diff --git a/Telegram/Resources/icons/filters/filters_local_phone.png b/Telegram/Resources/icons/folders/folders_local_phone.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_phone.png rename to Telegram/Resources/icons/folders/folders_local_phone.png diff --git a/Telegram/Resources/icons/filters/filters_local_phone@2x.png b/Telegram/Resources/icons/folders/folders_local_phone@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_phone@2x.png rename to Telegram/Resources/icons/folders/folders_local_phone@2x.png diff --git a/Telegram/Resources/icons/filters/filters_local_phone@3x.png b/Telegram/Resources/icons/folders/folders_local_phone@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_phone@3x.png rename to Telegram/Resources/icons/folders/folders_local_phone@3x.png diff --git a/Telegram/Resources/icons/filters/filters_local_phone_active.png b/Telegram/Resources/icons/folders/folders_local_phone_active.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_phone_active.png rename to Telegram/Resources/icons/folders/folders_local_phone_active.png diff --git a/Telegram/Resources/icons/filters/filters_local_phone_active@2x.png b/Telegram/Resources/icons/folders/folders_local_phone_active@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_phone_active@2x.png rename to Telegram/Resources/icons/folders/folders_local_phone_active@2x.png diff --git a/Telegram/Resources/icons/filters/filters_local_phone_active@3x.png b/Telegram/Resources/icons/folders/folders_local_phone_active@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_phone_active@3x.png rename to Telegram/Resources/icons/folders/folders_local_phone_active@3x.png diff --git a/Telegram/Resources/icons/filters/filters_local_smile.png b/Telegram/Resources/icons/folders/folders_local_smile.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_smile.png rename to Telegram/Resources/icons/folders/folders_local_smile.png diff --git a/Telegram/Resources/icons/filters/filters_local_smile@2x.png b/Telegram/Resources/icons/folders/folders_local_smile@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_smile@2x.png rename to Telegram/Resources/icons/folders/folders_local_smile@2x.png diff --git a/Telegram/Resources/icons/filters/filters_local_smile@3x.png b/Telegram/Resources/icons/folders/folders_local_smile@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_smile@3x.png rename to Telegram/Resources/icons/folders/folders_local_smile@3x.png diff --git a/Telegram/Resources/icons/filters/filters_local_smile_active.png b/Telegram/Resources/icons/folders/folders_local_smile_active.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_smile_active.png rename to Telegram/Resources/icons/folders/folders_local_smile_active.png diff --git a/Telegram/Resources/icons/filters/filters_local_smile_active@2x.png b/Telegram/Resources/icons/folders/folders_local_smile_active@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_smile_active@2x.png rename to Telegram/Resources/icons/folders/folders_local_smile_active@2x.png diff --git a/Telegram/Resources/icons/filters/filters_local_smile_active@3x.png b/Telegram/Resources/icons/folders/folders_local_smile_active@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_smile_active@3x.png rename to Telegram/Resources/icons/folders/folders_local_smile_active@3x.png diff --git a/Telegram/Resources/icons/filters/filters_local_sun.png b/Telegram/Resources/icons/folders/folders_local_sun.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_sun.png rename to Telegram/Resources/icons/folders/folders_local_sun.png diff --git a/Telegram/Resources/icons/filters/filters_local_sun@2x.png b/Telegram/Resources/icons/folders/folders_local_sun@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_sun@2x.png rename to Telegram/Resources/icons/folders/folders_local_sun@2x.png diff --git a/Telegram/Resources/icons/filters/filters_local_sun@3x.png b/Telegram/Resources/icons/folders/folders_local_sun@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_sun@3x.png rename to Telegram/Resources/icons/folders/folders_local_sun@3x.png diff --git a/Telegram/Resources/icons/filters/filters_local_sun_active.png b/Telegram/Resources/icons/folders/folders_local_sun_active.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_sun_active.png rename to Telegram/Resources/icons/folders/folders_local_sun_active.png diff --git a/Telegram/Resources/icons/filters/filters_local_sun_active@2x.png b/Telegram/Resources/icons/folders/folders_local_sun_active@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_sun_active@2x.png rename to Telegram/Resources/icons/folders/folders_local_sun_active@2x.png diff --git a/Telegram/Resources/icons/filters/filters_local_sun_active@3x.png b/Telegram/Resources/icons/folders/folders_local_sun_active@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_sun_active@3x.png rename to Telegram/Resources/icons/folders/folders_local_sun_active@3x.png diff --git a/Telegram/Resources/icons/filters/filters_local_video.png b/Telegram/Resources/icons/folders/folders_local_video.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_video.png rename to Telegram/Resources/icons/folders/folders_local_video.png diff --git a/Telegram/Resources/icons/filters/filters_local_video@2x.png b/Telegram/Resources/icons/folders/folders_local_video@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_video@2x.png rename to Telegram/Resources/icons/folders/folders_local_video@2x.png diff --git a/Telegram/Resources/icons/filters/filters_local_video@3x.png b/Telegram/Resources/icons/folders/folders_local_video@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_video@3x.png rename to Telegram/Resources/icons/folders/folders_local_video@3x.png diff --git a/Telegram/Resources/icons/filters/filters_local_video_active.png b/Telegram/Resources/icons/folders/folders_local_video_active.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_video_active.png rename to Telegram/Resources/icons/folders/folders_local_video_active.png diff --git a/Telegram/Resources/icons/filters/filters_local_video_active@2x.png b/Telegram/Resources/icons/folders/folders_local_video_active@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_video_active@2x.png rename to Telegram/Resources/icons/folders/folders_local_video_active@2x.png diff --git a/Telegram/Resources/icons/filters/filters_local_video_active@3x.png b/Telegram/Resources/icons/folders/folders_local_video_active@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_local_video_active@3x.png rename to Telegram/Resources/icons/folders/folders_local_video_active@3x.png diff --git a/Telegram/Resources/icons/folders/folders_love.png b/Telegram/Resources/icons/folders/folders_love.png new file mode 100644 index 000000000..b14d93849 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_love.png differ diff --git a/Telegram/Resources/icons/folders/folders_love@2x.png b/Telegram/Resources/icons/folders/folders_love@2x.png new file mode 100644 index 000000000..b297c63b4 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_love@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_love@3x.png b/Telegram/Resources/icons/folders/folders_love@3x.png new file mode 100644 index 000000000..489925989 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_love@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_mask.png b/Telegram/Resources/icons/folders/folders_mask.png new file mode 100644 index 000000000..2ffa33582 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_mask.png differ diff --git a/Telegram/Resources/icons/folders/folders_mask@2x.png b/Telegram/Resources/icons/folders/folders_mask@2x.png new file mode 100644 index 000000000..02d1d2e83 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_mask@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_mask@3x.png b/Telegram/Resources/icons/folders/folders_mask@3x.png new file mode 100644 index 000000000..3cd81fbe2 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_mask@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_money.png b/Telegram/Resources/icons/folders/folders_money.png new file mode 100644 index 000000000..44607557b Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_money.png differ diff --git a/Telegram/Resources/icons/folders/folders_money@2x.png b/Telegram/Resources/icons/folders/folders_money@2x.png new file mode 100644 index 000000000..f9c0b7954 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_money@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_money@3x.png b/Telegram/Resources/icons/folders/folders_money@3x.png new file mode 100644 index 000000000..ad5dd2a53 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_money@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_note.png b/Telegram/Resources/icons/folders/folders_note.png new file mode 100644 index 000000000..c53505431 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_note.png differ diff --git a/Telegram/Resources/icons/folders/folders_note@2x.png b/Telegram/Resources/icons/folders/folders_note@2x.png new file mode 100644 index 000000000..71948a212 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_note@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_note@3x.png b/Telegram/Resources/icons/folders/folders_note@3x.png new file mode 100644 index 000000000..8aa935bac Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_note@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_palette.png b/Telegram/Resources/icons/folders/folders_palette.png new file mode 100644 index 000000000..4dca73fe8 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_palette.png differ diff --git a/Telegram/Resources/icons/folders/folders_palette@2x.png b/Telegram/Resources/icons/folders/folders_palette@2x.png new file mode 100644 index 000000000..4544f0994 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_palette@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_palette@3x.png b/Telegram/Resources/icons/folders/folders_palette@3x.png new file mode 100644 index 000000000..431af6466 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_palette@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_party.png b/Telegram/Resources/icons/folders/folders_party.png new file mode 100644 index 000000000..97bcb2834 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_party.png differ diff --git a/Telegram/Resources/icons/folders/folders_party@2x.png b/Telegram/Resources/icons/folders/folders_party@2x.png new file mode 100644 index 000000000..ed962e68e Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_party@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_party@3x.png b/Telegram/Resources/icons/folders/folders_party@3x.png new file mode 100644 index 000000000..5ce1c36c3 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_party@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_poo.png b/Telegram/Resources/icons/folders/folders_poo.png new file mode 100644 index 000000000..e6900b870 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_poo.png differ diff --git a/Telegram/Resources/icons/folders/folders_poo@2x.png b/Telegram/Resources/icons/folders/folders_poo@2x.png new file mode 100644 index 000000000..102530c0f Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_poo@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_poo@3x.png b/Telegram/Resources/icons/folders/folders_poo@3x.png new file mode 100644 index 000000000..45fcd7915 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_poo@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_private.png b/Telegram/Resources/icons/folders/folders_private.png new file mode 100644 index 000000000..33bfc60bd Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_private.png differ diff --git a/Telegram/Resources/icons/folders/folders_private@2x.png b/Telegram/Resources/icons/folders/folders_private@2x.png new file mode 100644 index 000000000..d8ad983f3 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_private@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_private@3x.png b/Telegram/Resources/icons/folders/folders_private@3x.png new file mode 100644 index 000000000..a69c13159 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_private@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_setup.png b/Telegram/Resources/icons/folders/folders_setup.png new file mode 100644 index 000000000..db548b523 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_setup.png differ diff --git a/Telegram/Resources/icons/folders/folders_setup@2x.png b/Telegram/Resources/icons/folders/folders_setup@2x.png new file mode 100644 index 000000000..2747415d2 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_setup@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_setup@3x.png b/Telegram/Resources/icons/folders/folders_setup@3x.png new file mode 100644 index 000000000..fdf16f8c2 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_setup@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_sport.png b/Telegram/Resources/icons/folders/folders_sport.png new file mode 100644 index 000000000..a73c37bd4 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_sport.png differ diff --git a/Telegram/Resources/icons/folders/folders_sport@2x.png b/Telegram/Resources/icons/folders/folders_sport@2x.png new file mode 100644 index 000000000..538100c6a Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_sport@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_sport@3x.png b/Telegram/Resources/icons/folders/folders_sport@3x.png new file mode 100644 index 000000000..691e16cf1 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_sport@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_study.png b/Telegram/Resources/icons/folders/folders_study.png new file mode 100644 index 000000000..b6233dc26 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_study.png differ diff --git a/Telegram/Resources/icons/folders/folders_study@2x.png b/Telegram/Resources/icons/folders/folders_study@2x.png new file mode 100644 index 000000000..93a00fc4f Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_study@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_study@3x.png b/Telegram/Resources/icons/folders/folders_study@3x.png new file mode 100644 index 000000000..2ebdebeec Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_study@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_trade.png b/Telegram/Resources/icons/folders/folders_trade.png new file mode 100644 index 000000000..837af196d Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_trade.png differ diff --git a/Telegram/Resources/icons/folders/folders_trade@2x.png b/Telegram/Resources/icons/folders/folders_trade@2x.png new file mode 100644 index 000000000..95bf995eb Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_trade@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_trade@3x.png b/Telegram/Resources/icons/folders/folders_trade@3x.png new file mode 100644 index 000000000..8bd8e5a2f Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_trade@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_travel.png b/Telegram/Resources/icons/folders/folders_travel.png new file mode 100644 index 000000000..128933d8d Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_travel.png differ diff --git a/Telegram/Resources/icons/folders/folders_travel@2x.png b/Telegram/Resources/icons/folders/folders_travel@2x.png new file mode 100644 index 000000000..042899343 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_travel@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_travel@3x.png b/Telegram/Resources/icons/folders/folders_travel@3x.png new file mode 100644 index 000000000..caaf29d46 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_travel@3x.png differ diff --git a/Telegram/Resources/icons/filters/filters_type_admin.png b/Telegram/Resources/icons/folders/folders_type_admin.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_admin.png rename to Telegram/Resources/icons/folders/folders_type_admin.png diff --git a/Telegram/Resources/icons/filters/filters_type_admin@2x.png b/Telegram/Resources/icons/folders/folders_type_admin@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_admin@2x.png rename to Telegram/Resources/icons/folders/folders_type_admin@2x.png diff --git a/Telegram/Resources/icons/filters/filters_type_admin@3x.png b/Telegram/Resources/icons/folders/folders_type_admin@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_admin@3x.png rename to Telegram/Resources/icons/folders/folders_type_admin@3x.png diff --git a/Telegram/Resources/icons/filters/filters_type_archived.png b/Telegram/Resources/icons/folders/folders_type_archived.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_archived.png rename to Telegram/Resources/icons/folders/folders_type_archived.png diff --git a/Telegram/Resources/icons/filters/filters_type_archived@2x.png b/Telegram/Resources/icons/folders/folders_type_archived@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_archived@2x.png rename to Telegram/Resources/icons/folders/folders_type_archived@2x.png diff --git a/Telegram/Resources/icons/filters/filters_type_archived@3x.png b/Telegram/Resources/icons/folders/folders_type_archived@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_archived@3x.png rename to Telegram/Resources/icons/folders/folders_type_archived@3x.png diff --git a/Telegram/Resources/icons/filters/filters_type_bots.png b/Telegram/Resources/icons/folders/folders_type_bots.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_bots.png rename to Telegram/Resources/icons/folders/folders_type_bots.png diff --git a/Telegram/Resources/icons/filters/filters_type_bots@2x.png b/Telegram/Resources/icons/folders/folders_type_bots@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_bots@2x.png rename to Telegram/Resources/icons/folders/folders_type_bots@2x.png diff --git a/Telegram/Resources/icons/filters/filters_type_bots@3x.png b/Telegram/Resources/icons/folders/folders_type_bots@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_bots@3x.png rename to Telegram/Resources/icons/folders/folders_type_bots@3x.png diff --git a/Telegram/Resources/icons/filters/filters_type_channels.png b/Telegram/Resources/icons/folders/folders_type_channels.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_channels.png rename to Telegram/Resources/icons/folders/folders_type_channels.png diff --git a/Telegram/Resources/icons/filters/filters_type_channels@2x.png b/Telegram/Resources/icons/folders/folders_type_channels@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_channels@2x.png rename to Telegram/Resources/icons/folders/folders_type_channels@2x.png diff --git a/Telegram/Resources/icons/filters/filters_type_channels@3x.png b/Telegram/Resources/icons/folders/folders_type_channels@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_channels@3x.png rename to Telegram/Resources/icons/folders/folders_type_channels@3x.png diff --git a/Telegram/Resources/icons/filters/filters_type_contacts.png b/Telegram/Resources/icons/folders/folders_type_contacts.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_contacts.png rename to Telegram/Resources/icons/folders/folders_type_contacts.png diff --git a/Telegram/Resources/icons/filters/filters_type_contacts@2x.png b/Telegram/Resources/icons/folders/folders_type_contacts@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_contacts@2x.png rename to Telegram/Resources/icons/folders/folders_type_contacts@2x.png diff --git a/Telegram/Resources/icons/filters/filters_type_contacts@3x.png b/Telegram/Resources/icons/folders/folders_type_contacts@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_contacts@3x.png rename to Telegram/Resources/icons/folders/folders_type_contacts@3x.png diff --git a/Telegram/Resources/icons/filters/filters_type_filtered.png b/Telegram/Resources/icons/folders/folders_type_filtered.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_filtered.png rename to Telegram/Resources/icons/folders/folders_type_filtered.png diff --git a/Telegram/Resources/icons/filters/filters_type_filtered@2x.png b/Telegram/Resources/icons/folders/folders_type_filtered@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_filtered@2x.png rename to Telegram/Resources/icons/folders/folders_type_filtered@2x.png diff --git a/Telegram/Resources/icons/filters/filters_type_filtered@3x.png b/Telegram/Resources/icons/folders/folders_type_filtered@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_filtered@3x.png rename to Telegram/Resources/icons/folders/folders_type_filtered@3x.png diff --git a/Telegram/Resources/icons/filters/filters_type_groups.png b/Telegram/Resources/icons/folders/folders_type_groups.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_groups.png rename to Telegram/Resources/icons/folders/folders_type_groups.png diff --git a/Telegram/Resources/icons/filters/filters_type_groups@2x.png b/Telegram/Resources/icons/folders/folders_type_groups@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_groups@2x.png rename to Telegram/Resources/icons/folders/folders_type_groups@2x.png diff --git a/Telegram/Resources/icons/filters/filters_type_groups@3x.png b/Telegram/Resources/icons/folders/folders_type_groups@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_groups@3x.png rename to Telegram/Resources/icons/folders/folders_type_groups@3x.png diff --git a/Telegram/Resources/icons/filters/filters_type_muted.png b/Telegram/Resources/icons/folders/folders_type_muted.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_muted.png rename to Telegram/Resources/icons/folders/folders_type_muted.png diff --git a/Telegram/Resources/icons/filters/filters_type_muted@2x.png b/Telegram/Resources/icons/folders/folders_type_muted@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_muted@2x.png rename to Telegram/Resources/icons/folders/folders_type_muted@2x.png diff --git a/Telegram/Resources/icons/filters/filters_type_muted@3x.png b/Telegram/Resources/icons/folders/folders_type_muted@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_muted@3x.png rename to Telegram/Resources/icons/folders/folders_type_muted@3x.png diff --git a/Telegram/Resources/icons/filters/filters_type_noncontacts.png b/Telegram/Resources/icons/folders/folders_type_noncontacts.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_noncontacts.png rename to Telegram/Resources/icons/folders/folders_type_noncontacts.png diff --git a/Telegram/Resources/icons/filters/filters_type_noncontacts@2x.png b/Telegram/Resources/icons/folders/folders_type_noncontacts@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_noncontacts@2x.png rename to Telegram/Resources/icons/folders/folders_type_noncontacts@2x.png diff --git a/Telegram/Resources/icons/filters/filters_type_noncontacts@3x.png b/Telegram/Resources/icons/folders/folders_type_noncontacts@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_noncontacts@3x.png rename to Telegram/Resources/icons/folders/folders_type_noncontacts@3x.png diff --git a/Telegram/Resources/icons/filters/filters_type_not_admin.png b/Telegram/Resources/icons/folders/folders_type_not_admin.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_not_admin.png rename to Telegram/Resources/icons/folders/folders_type_not_admin.png diff --git a/Telegram/Resources/icons/filters/filters_type_not_admin@2x.png b/Telegram/Resources/icons/folders/folders_type_not_admin@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_not_admin@2x.png rename to Telegram/Resources/icons/folders/folders_type_not_admin@2x.png diff --git a/Telegram/Resources/icons/filters/filters_type_not_admin@3x.png b/Telegram/Resources/icons/folders/folders_type_not_admin@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_not_admin@3x.png rename to Telegram/Resources/icons/folders/folders_type_not_admin@3x.png diff --git a/Telegram/Resources/icons/filters/filters_type_not_owner.png b/Telegram/Resources/icons/folders/folders_type_not_owner.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_not_owner.png rename to Telegram/Resources/icons/folders/folders_type_not_owner.png diff --git a/Telegram/Resources/icons/filters/filters_type_not_owner@2x.png b/Telegram/Resources/icons/folders/folders_type_not_owner@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_not_owner@2x.png rename to Telegram/Resources/icons/folders/folders_type_not_owner@2x.png diff --git a/Telegram/Resources/icons/filters/filters_type_not_owner@3x.png b/Telegram/Resources/icons/folders/folders_type_not_owner@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_not_owner@3x.png rename to Telegram/Resources/icons/folders/folders_type_not_owner@3x.png diff --git a/Telegram/Resources/icons/filters/filters_type_owner.png b/Telegram/Resources/icons/folders/folders_type_owner.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_owner.png rename to Telegram/Resources/icons/folders/folders_type_owner.png diff --git a/Telegram/Resources/icons/filters/filters_type_owner@2x.png b/Telegram/Resources/icons/folders/folders_type_owner@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_owner@2x.png rename to Telegram/Resources/icons/folders/folders_type_owner@2x.png diff --git a/Telegram/Resources/icons/filters/filters_type_owner@3x.png b/Telegram/Resources/icons/folders/folders_type_owner@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_owner@3x.png rename to Telegram/Resources/icons/folders/folders_type_owner@3x.png diff --git a/Telegram/Resources/icons/folders/folders_type_read.png b/Telegram/Resources/icons/folders/folders_type_read.png new file mode 100644 index 000000000..56dee358a Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_type_read.png differ diff --git a/Telegram/Resources/icons/folders/folders_type_read@2x.png b/Telegram/Resources/icons/folders/folders_type_read@2x.png new file mode 100644 index 000000000..d88d4e919 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_type_read@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_type_read@3x.png b/Telegram/Resources/icons/folders/folders_type_read@3x.png new file mode 100644 index 000000000..3cddeb6a6 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_type_read@3x.png differ diff --git a/Telegram/Resources/icons/filters/filters_type_recent.png b/Telegram/Resources/icons/folders/folders_type_recent.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_recent.png rename to Telegram/Resources/icons/folders/folders_type_recent.png diff --git a/Telegram/Resources/icons/filters/filters_type_recent@2x.png b/Telegram/Resources/icons/folders/folders_type_recent@2x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_recent@2x.png rename to Telegram/Resources/icons/folders/folders_type_recent@2x.png diff --git a/Telegram/Resources/icons/filters/filters_type_recent@3x.png b/Telegram/Resources/icons/folders/folders_type_recent@3x.png similarity index 100% rename from Telegram/Resources/icons/filters/filters_type_recent@3x.png rename to Telegram/Resources/icons/folders/folders_type_recent@3x.png diff --git a/Telegram/Resources/icons/folders/folders_unmuted.png b/Telegram/Resources/icons/folders/folders_unmuted.png new file mode 100644 index 000000000..427493375 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_unmuted.png differ diff --git a/Telegram/Resources/icons/folders/folders_unmuted@2x.png b/Telegram/Resources/icons/folders/folders_unmuted@2x.png new file mode 100644 index 000000000..0fad53fd6 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_unmuted@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_unmuted@3x.png b/Telegram/Resources/icons/folders/folders_unmuted@3x.png new file mode 100644 index 000000000..63fe905df Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_unmuted@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_unread.png b/Telegram/Resources/icons/folders/folders_unread.png new file mode 100644 index 000000000..c15fc1633 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_unread.png differ diff --git a/Telegram/Resources/icons/folders/folders_unread@2x.png b/Telegram/Resources/icons/folders/folders_unread@2x.png new file mode 100644 index 000000000..26a79c9a4 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_unread@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_unread@3x.png b/Telegram/Resources/icons/folders/folders_unread@3x.png new file mode 100644 index 000000000..0afa74f39 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_unread@3x.png differ diff --git a/Telegram/Resources/icons/folders/folders_work.png b/Telegram/Resources/icons/folders/folders_work.png new file mode 100644 index 000000000..308772a62 Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_work.png differ diff --git a/Telegram/Resources/icons/folders/folders_work@2x.png b/Telegram/Resources/icons/folders/folders_work@2x.png new file mode 100644 index 000000000..50368dc3f Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_work@2x.png differ diff --git a/Telegram/Resources/icons/folders/folders_work@3x.png b/Telegram/Resources/icons/folders/folders_work@3x.png new file mode 100644 index 000000000..798bab02d Binary files /dev/null and b/Telegram/Resources/icons/folders/folders_work@3x.png differ diff --git a/Telegram/Resources/icons/fragment.png b/Telegram/Resources/icons/fragment.png new file mode 100644 index 000000000..d56b3eaac Binary files /dev/null and b/Telegram/Resources/icons/fragment.png differ diff --git a/Telegram/Resources/icons/fragment@2x.png b/Telegram/Resources/icons/fragment@2x.png new file mode 100644 index 000000000..453b4b2b8 Binary files /dev/null and b/Telegram/Resources/icons/fragment@2x.png differ diff --git a/Telegram/Resources/icons/fragment@3x.png b/Telegram/Resources/icons/fragment@3x.png new file mode 100644 index 000000000..154c121c5 Binary files /dev/null and b/Telegram/Resources/icons/fragment@3x.png differ diff --git a/Telegram/Resources/icons/history_comments.png b/Telegram/Resources/icons/history_comments.png index 068e9c15d..3e0938fbb 100644 Binary files a/Telegram/Resources/icons/history_comments.png and b/Telegram/Resources/icons/history_comments.png differ diff --git a/Telegram/Resources/icons/history_comments@2x.png b/Telegram/Resources/icons/history_comments@2x.png index f67f3c9a0..c22d1ac71 100644 Binary files a/Telegram/Resources/icons/history_comments@2x.png and b/Telegram/Resources/icons/history_comments@2x.png differ diff --git a/Telegram/Resources/icons/history_comments@3x.png b/Telegram/Resources/icons/history_comments@3x.png index b19d206cd..d6b250249 100644 Binary files a/Telegram/Resources/icons/history_comments@3x.png and b/Telegram/Resources/icons/history_comments@3x.png differ diff --git a/Telegram/Resources/icons/history_comments_open.png b/Telegram/Resources/icons/history_comments_open.png index 4edb30aca..6cb7ec3be 100644 Binary files a/Telegram/Resources/icons/history_comments_open.png and b/Telegram/Resources/icons/history_comments_open.png differ diff --git a/Telegram/Resources/icons/history_comments_open@2x.png b/Telegram/Resources/icons/history_comments_open@2x.png index 75bd3b0ce..ad5a55f67 100644 Binary files a/Telegram/Resources/icons/history_comments_open@2x.png and b/Telegram/Resources/icons/history_comments_open@2x.png differ diff --git a/Telegram/Resources/icons/history_comments_open@3x.png b/Telegram/Resources/icons/history_comments_open@3x.png index 94f7cecf5..f062d3ee2 100644 Binary files a/Telegram/Resources/icons/history_comments_open@3x.png and b/Telegram/Resources/icons/history_comments_open@3x.png differ diff --git a/Telegram/Resources/icons/history_down_arrow.png b/Telegram/Resources/icons/history_down_arrow.png index 330ab4a2d..7cd14b104 100644 Binary files a/Telegram/Resources/icons/history_down_arrow.png and b/Telegram/Resources/icons/history_down_arrow.png differ diff --git a/Telegram/Resources/icons/history_down_arrow@2x.png b/Telegram/Resources/icons/history_down_arrow@2x.png index 3695282d5..418387115 100644 Binary files a/Telegram/Resources/icons/history_down_arrow@2x.png and b/Telegram/Resources/icons/history_down_arrow@2x.png differ diff --git a/Telegram/Resources/icons/history_down_arrow@3x.png b/Telegram/Resources/icons/history_down_arrow@3x.png index ef04b07f5..c5e8ebb1b 100644 Binary files a/Telegram/Resources/icons/history_down_arrow@3x.png and b/Telegram/Resources/icons/history_down_arrow@3x.png differ diff --git a/Telegram/Resources/icons/history_file_cancel.png b/Telegram/Resources/icons/history_file_cancel.png index 8ec157e20..900e673d9 100644 Binary files a/Telegram/Resources/icons/history_file_cancel.png and b/Telegram/Resources/icons/history_file_cancel.png differ diff --git a/Telegram/Resources/icons/history_file_cancel@2x.png b/Telegram/Resources/icons/history_file_cancel@2x.png index f7992a20c..744748ca9 100644 Binary files a/Telegram/Resources/icons/history_file_cancel@2x.png and b/Telegram/Resources/icons/history_file_cancel@2x.png differ diff --git a/Telegram/Resources/icons/history_file_cancel@3x.png b/Telegram/Resources/icons/history_file_cancel@3x.png index 0a5228bc6..367364547 100644 Binary files a/Telegram/Resources/icons/history_file_cancel@3x.png and b/Telegram/Resources/icons/history_file_cancel@3x.png differ diff --git a/Telegram/Resources/icons/history_file_document.png b/Telegram/Resources/icons/history_file_document.png index 4e9b36908..4253ca826 100644 Binary files a/Telegram/Resources/icons/history_file_document.png and b/Telegram/Resources/icons/history_file_document.png differ diff --git a/Telegram/Resources/icons/history_file_document@2x.png b/Telegram/Resources/icons/history_file_document@2x.png index 740c79060..8ae488a0e 100644 Binary files a/Telegram/Resources/icons/history_file_document@2x.png and b/Telegram/Resources/icons/history_file_document@2x.png differ diff --git a/Telegram/Resources/icons/history_file_document@3x.png b/Telegram/Resources/icons/history_file_document@3x.png index fbedbfda1..13704645a 100644 Binary files a/Telegram/Resources/icons/history_file_document@3x.png and b/Telegram/Resources/icons/history_file_document@3x.png differ diff --git a/Telegram/Resources/icons/history_file_download.png b/Telegram/Resources/icons/history_file_download.png index 038012321..c6124021d 100644 Binary files a/Telegram/Resources/icons/history_file_download.png and b/Telegram/Resources/icons/history_file_download.png differ diff --git a/Telegram/Resources/icons/history_file_download@2x.png b/Telegram/Resources/icons/history_file_download@2x.png index 71db5f64d..66a14d7e6 100644 Binary files a/Telegram/Resources/icons/history_file_download@2x.png and b/Telegram/Resources/icons/history_file_download@2x.png differ diff --git a/Telegram/Resources/icons/history_file_download@3x.png b/Telegram/Resources/icons/history_file_download@3x.png index b20814742..6f142fa05 100644 Binary files a/Telegram/Resources/icons/history_file_download@3x.png and b/Telegram/Resources/icons/history_file_download@3x.png differ diff --git a/Telegram/Resources/icons/history_file_image.png b/Telegram/Resources/icons/history_file_image.png index 689d62062..85f395f02 100644 Binary files a/Telegram/Resources/icons/history_file_image.png and b/Telegram/Resources/icons/history_file_image.png differ diff --git a/Telegram/Resources/icons/history_file_image@2x.png b/Telegram/Resources/icons/history_file_image@2x.png index 294ec43a4..3d9e384eb 100644 Binary files a/Telegram/Resources/icons/history_file_image@2x.png and b/Telegram/Resources/icons/history_file_image@2x.png differ diff --git a/Telegram/Resources/icons/history_file_image@3x.png b/Telegram/Resources/icons/history_file_image@3x.png index 630918202..d993e1466 100644 Binary files a/Telegram/Resources/icons/history_file_image@3x.png and b/Telegram/Resources/icons/history_file_image@3x.png differ diff --git a/Telegram/Resources/icons/history_file_pause.png b/Telegram/Resources/icons/history_file_pause.png index 85ea133ff..f70f7a912 100644 Binary files a/Telegram/Resources/icons/history_file_pause.png and b/Telegram/Resources/icons/history_file_pause.png differ diff --git a/Telegram/Resources/icons/history_file_pause@2x.png b/Telegram/Resources/icons/history_file_pause@2x.png index c101828cf..524a87cf3 100644 Binary files a/Telegram/Resources/icons/history_file_pause@2x.png and b/Telegram/Resources/icons/history_file_pause@2x.png differ diff --git a/Telegram/Resources/icons/history_file_pause@3x.png b/Telegram/Resources/icons/history_file_pause@3x.png index 7b97e46f2..f99cac040 100644 Binary files a/Telegram/Resources/icons/history_file_pause@3x.png and b/Telegram/Resources/icons/history_file_pause@3x.png differ diff --git a/Telegram/Resources/icons/history_file_play.png b/Telegram/Resources/icons/history_file_play.png index 36cf135f9..1dbcb0a19 100644 Binary files a/Telegram/Resources/icons/history_file_play.png and b/Telegram/Resources/icons/history_file_play.png differ diff --git a/Telegram/Resources/icons/history_file_play@2x.png b/Telegram/Resources/icons/history_file_play@2x.png index 97605dfda..b008b429e 100644 Binary files a/Telegram/Resources/icons/history_file_play@2x.png and b/Telegram/Resources/icons/history_file_play@2x.png differ diff --git a/Telegram/Resources/icons/history_file_play@3x.png b/Telegram/Resources/icons/history_file_play@3x.png index f3ba409bc..b5be7c7d3 100644 Binary files a/Telegram/Resources/icons/history_file_play@3x.png and b/Telegram/Resources/icons/history_file_play@3x.png differ diff --git a/Telegram/Resources/icons/history_received.png b/Telegram/Resources/icons/history_received.png index 30f9ff68f..f236362ac 100644 Binary files a/Telegram/Resources/icons/history_received.png and b/Telegram/Resources/icons/history_received.png differ diff --git a/Telegram/Resources/icons/history_received@2x.png b/Telegram/Resources/icons/history_received@2x.png index a4e03b1d0..e981586cb 100644 Binary files a/Telegram/Resources/icons/history_received@2x.png and b/Telegram/Resources/icons/history_received@2x.png differ diff --git a/Telegram/Resources/icons/history_received@3x.png b/Telegram/Resources/icons/history_received@3x.png index 273fa8b03..273aeb259 100644 Binary files a/Telegram/Resources/icons/history_received@3x.png and b/Telegram/Resources/icons/history_received@3x.png differ diff --git a/Telegram/Resources/icons/history_replies.png b/Telegram/Resources/icons/history_replies.png index e3df0b27c..5cf970592 100644 Binary files a/Telegram/Resources/icons/history_replies.png and b/Telegram/Resources/icons/history_replies.png differ diff --git a/Telegram/Resources/icons/history_replies@2x.png b/Telegram/Resources/icons/history_replies@2x.png index 274b59e61..13819389c 100644 Binary files a/Telegram/Resources/icons/history_replies@2x.png and b/Telegram/Resources/icons/history_replies@2x.png differ diff --git a/Telegram/Resources/icons/history_replies@3x.png b/Telegram/Resources/icons/history_replies@3x.png index 4e70b5b31..d8381b128 100644 Binary files a/Telegram/Resources/icons/history_replies@3x.png and b/Telegram/Resources/icons/history_replies@3x.png differ diff --git a/Telegram/Resources/icons/history_sent.png b/Telegram/Resources/icons/history_sent.png index dfd691c94..0fc1c58b4 100644 Binary files a/Telegram/Resources/icons/history_sent.png and b/Telegram/Resources/icons/history_sent.png differ diff --git a/Telegram/Resources/icons/history_sent@2x.png b/Telegram/Resources/icons/history_sent@2x.png index ffc898e52..8bb81ea78 100644 Binary files a/Telegram/Resources/icons/history_sent@2x.png and b/Telegram/Resources/icons/history_sent@2x.png differ diff --git a/Telegram/Resources/icons/history_sent@3x.png b/Telegram/Resources/icons/history_sent@3x.png index e8a138541..a75d1cc84 100644 Binary files a/Telegram/Resources/icons/history_sent@3x.png and b/Telegram/Resources/icons/history_sent@3x.png differ diff --git a/Telegram/Resources/icons/history_unread_mention.png b/Telegram/Resources/icons/history_unread_mention.png index 5e06356cd..2101780b1 100644 Binary files a/Telegram/Resources/icons/history_unread_mention.png and b/Telegram/Resources/icons/history_unread_mention.png differ diff --git a/Telegram/Resources/icons/history_unread_mention@2x.png b/Telegram/Resources/icons/history_unread_mention@2x.png index fa7f3f655..af29042bc 100644 Binary files a/Telegram/Resources/icons/history_unread_mention@2x.png and b/Telegram/Resources/icons/history_unread_mention@2x.png differ diff --git a/Telegram/Resources/icons/history_unread_mention@3x.png b/Telegram/Resources/icons/history_unread_mention@3x.png index 67c6286f9..366fcc322 100644 Binary files a/Telegram/Resources/icons/history_unread_mention@3x.png and b/Telegram/Resources/icons/history_unread_mention@3x.png differ diff --git a/Telegram/Resources/icons/history_unread_reaction.png b/Telegram/Resources/icons/history_unread_reaction.png index 778b75ed5..5be6275a7 100644 Binary files a/Telegram/Resources/icons/history_unread_reaction.png and b/Telegram/Resources/icons/history_unread_reaction.png differ diff --git a/Telegram/Resources/icons/history_unread_reaction@2x.png b/Telegram/Resources/icons/history_unread_reaction@2x.png index 358de2cfb..1bfe1c92d 100644 Binary files a/Telegram/Resources/icons/history_unread_reaction@2x.png and b/Telegram/Resources/icons/history_unread_reaction@2x.png differ diff --git a/Telegram/Resources/icons/history_unread_reaction@3x.png b/Telegram/Resources/icons/history_unread_reaction@3x.png index a6978d5de..50f822ae1 100644 Binary files a/Telegram/Resources/icons/history_unread_reaction@3x.png and b/Telegram/Resources/icons/history_unread_reaction@3x.png differ diff --git a/Telegram/Resources/icons/info/edit/antispam.png b/Telegram/Resources/icons/info/edit/antispam.png new file mode 100644 index 000000000..47558ed36 Binary files /dev/null and b/Telegram/Resources/icons/info/edit/antispam.png differ diff --git a/Telegram/Resources/icons/info/edit/antispam@2x.png b/Telegram/Resources/icons/info/edit/antispam@2x.png new file mode 100644 index 000000000..5e0ace7f3 Binary files /dev/null and b/Telegram/Resources/icons/info/edit/antispam@2x.png differ diff --git a/Telegram/Resources/icons/info/edit/antispam@3x.png b/Telegram/Resources/icons/info/edit/antispam@3x.png new file mode 100644 index 000000000..16e2a595c Binary files /dev/null and b/Telegram/Resources/icons/info/edit/antispam@3x.png differ diff --git a/Telegram/Resources/icons/info/edit/channel_manage_signature.png b/Telegram/Resources/icons/info/edit/channel_manage_signature.png new file mode 100644 index 000000000..2b009d54f Binary files /dev/null and b/Telegram/Resources/icons/info/edit/channel_manage_signature.png differ diff --git a/Telegram/Resources/icons/info/edit/channel_manage_signature@2x.png b/Telegram/Resources/icons/info/edit/channel_manage_signature@2x.png new file mode 100644 index 000000000..7481d9f04 Binary files /dev/null and b/Telegram/Resources/icons/info/edit/channel_manage_signature@2x.png differ diff --git a/Telegram/Resources/icons/info/edit/channel_manage_signature@3x.png b/Telegram/Resources/icons/info/edit/channel_manage_signature@3x.png new file mode 100644 index 000000000..7baba394d Binary files /dev/null and b/Telegram/Resources/icons/info/edit/channel_manage_signature@3x.png differ diff --git a/Telegram/Resources/icons/info/edit/create_channel.png b/Telegram/Resources/icons/info/edit/create_channel.png new file mode 100644 index 000000000..dd2a9b1d8 Binary files /dev/null and b/Telegram/Resources/icons/info/edit/create_channel.png differ diff --git a/Telegram/Resources/icons/info/edit/create_channel@2x.png b/Telegram/Resources/icons/info/edit/create_channel@2x.png new file mode 100644 index 000000000..1b6d4789c Binary files /dev/null and b/Telegram/Resources/icons/info/edit/create_channel@2x.png differ diff --git a/Telegram/Resources/icons/info/edit/create_channel@3x.png b/Telegram/Resources/icons/info/edit/create_channel@3x.png new file mode 100644 index 000000000..bb05933d5 Binary files /dev/null and b/Telegram/Resources/icons/info/edit/create_channel@3x.png differ diff --git a/Telegram/Resources/icons/info/edit/create_group.png b/Telegram/Resources/icons/info/edit/create_group.png new file mode 100644 index 000000000..45e1cb91f Binary files /dev/null and b/Telegram/Resources/icons/info/edit/create_group.png differ diff --git a/Telegram/Resources/icons/info/edit/create_group@2x.png b/Telegram/Resources/icons/info/edit/create_group@2x.png new file mode 100644 index 000000000..cdd6b4a24 Binary files /dev/null and b/Telegram/Resources/icons/info/edit/create_group@2x.png differ diff --git a/Telegram/Resources/icons/info/edit/create_group@3x.png b/Telegram/Resources/icons/info/edit/create_group@3x.png new file mode 100644 index 000000000..e6b65c1ae Binary files /dev/null and b/Telegram/Resources/icons/info/edit/create_group@3x.png differ diff --git a/Telegram/Resources/icons/info/edit/dotsmini.png b/Telegram/Resources/icons/info/edit/dotsmini.png index 94bce645c..5d98d38d3 100644 Binary files a/Telegram/Resources/icons/info/edit/dotsmini.png and b/Telegram/Resources/icons/info/edit/dotsmini.png differ diff --git a/Telegram/Resources/icons/info/edit/dotsmini@2x.png b/Telegram/Resources/icons/info/edit/dotsmini@2x.png index 92a9ae7bc..56a590f32 100644 Binary files a/Telegram/Resources/icons/info/edit/dotsmini@2x.png and b/Telegram/Resources/icons/info/edit/dotsmini@2x.png differ diff --git a/Telegram/Resources/icons/info/edit/dotsmini@3x.png b/Telegram/Resources/icons/info/edit/dotsmini@3x.png index 1e4188622..7008f3641 100644 Binary files a/Telegram/Resources/icons/info/edit/dotsmini@3x.png and b/Telegram/Resources/icons/info/edit/dotsmini@3x.png differ diff --git a/Telegram/Resources/icons/info/edit/expand_arrow_small.png b/Telegram/Resources/icons/info/edit/expand_arrow_small.png new file mode 100644 index 000000000..839b55ad0 Binary files /dev/null and b/Telegram/Resources/icons/info/edit/expand_arrow_small.png differ diff --git a/Telegram/Resources/icons/info/edit/expand_arrow_small@2x.png b/Telegram/Resources/icons/info/edit/expand_arrow_small@2x.png new file mode 100644 index 000000000..ba6eda83b Binary files /dev/null and b/Telegram/Resources/icons/info/edit/expand_arrow_small@2x.png differ diff --git a/Telegram/Resources/icons/info/edit/expand_arrow_small@3x.png b/Telegram/Resources/icons/info/edit/expand_arrow_small@3x.png new file mode 100644 index 000000000..993b88a48 Binary files /dev/null and b/Telegram/Resources/icons/info/edit/expand_arrow_small@3x.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_actions.png b/Telegram/Resources/icons/info/edit/group_manage_actions.png index 3c1d15b2d..a1edd3cfa 100644 Binary files a/Telegram/Resources/icons/info/edit/group_manage_actions.png and b/Telegram/Resources/icons/info/edit/group_manage_actions.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_actions@2x.png b/Telegram/Resources/icons/info/edit/group_manage_actions@2x.png index b04ad81f4..8463e220c 100644 Binary files a/Telegram/Resources/icons/info/edit/group_manage_actions@2x.png and b/Telegram/Resources/icons/info/edit/group_manage_actions@2x.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_actions@3x.png b/Telegram/Resources/icons/info/edit/group_manage_actions@3x.png index 004040f69..28f23489f 100644 Binary files a/Telegram/Resources/icons/info/edit/group_manage_actions@3x.png and b/Telegram/Resources/icons/info/edit/group_manage_actions@3x.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_admins.png b/Telegram/Resources/icons/info/edit/group_manage_admins.png index 79c0cb7ca..c1c4c95bb 100644 Binary files a/Telegram/Resources/icons/info/edit/group_manage_admins.png and b/Telegram/Resources/icons/info/edit/group_manage_admins.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_admins@2x.png b/Telegram/Resources/icons/info/edit/group_manage_admins@2x.png index bfd3265c7..709e80574 100644 Binary files a/Telegram/Resources/icons/info/edit/group_manage_admins@2x.png and b/Telegram/Resources/icons/info/edit/group_manage_admins@2x.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_admins@3x.png b/Telegram/Resources/icons/info/edit/group_manage_admins@3x.png index c57d003cb..9dcd0742b 100644 Binary files a/Telegram/Resources/icons/info/edit/group_manage_admins@3x.png and b/Telegram/Resources/icons/info/edit/group_manage_admins@3x.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_join_requests.png b/Telegram/Resources/icons/info/edit/group_manage_join_requests.png new file mode 100644 index 000000000..4d6476a05 Binary files /dev/null and b/Telegram/Resources/icons/info/edit/group_manage_join_requests.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_join_requests@2x.png b/Telegram/Resources/icons/info/edit/group_manage_join_requests@2x.png new file mode 100644 index 000000000..fe106db99 Binary files /dev/null and b/Telegram/Resources/icons/info/edit/group_manage_join_requests@2x.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_join_requests@3x.png b/Telegram/Resources/icons/info/edit/group_manage_join_requests@3x.png new file mode 100644 index 000000000..c6e0ae226 Binary files /dev/null and b/Telegram/Resources/icons/info/edit/group_manage_join_requests@3x.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_links.png b/Telegram/Resources/icons/info/edit/group_manage_links.png index f865287de..3cec723db 100644 Binary files a/Telegram/Resources/icons/info/edit/group_manage_links.png and b/Telegram/Resources/icons/info/edit/group_manage_links.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_links@2x.png b/Telegram/Resources/icons/info/edit/group_manage_links@2x.png index 671b6419b..c48a70f22 100644 Binary files a/Telegram/Resources/icons/info/edit/group_manage_links@2x.png and b/Telegram/Resources/icons/info/edit/group_manage_links@2x.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_links@3x.png b/Telegram/Resources/icons/info/edit/group_manage_links@3x.png index 07258c5df..0e084b5d6 100644 Binary files a/Telegram/Resources/icons/info/edit/group_manage_links@3x.png and b/Telegram/Resources/icons/info/edit/group_manage_links@3x.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_members.png b/Telegram/Resources/icons/info/edit/group_manage_members.png deleted file mode 100644 index 8cf516c31..000000000 Binary files a/Telegram/Resources/icons/info/edit/group_manage_members.png and /dev/null differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_members@2x.png b/Telegram/Resources/icons/info/edit/group_manage_members@2x.png deleted file mode 100644 index f9c210aff..000000000 Binary files a/Telegram/Resources/icons/info/edit/group_manage_members@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_members@3x.png b/Telegram/Resources/icons/info/edit/group_manage_members@3x.png deleted file mode 100644 index 220e567f3..000000000 Binary files a/Telegram/Resources/icons/info/edit/group_manage_members@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_permissions.png b/Telegram/Resources/icons/info/edit/group_manage_permissions.png index 1fcce1ee1..bcf7f4567 100644 Binary files a/Telegram/Resources/icons/info/edit/group_manage_permissions.png and b/Telegram/Resources/icons/info/edit/group_manage_permissions.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_permissions@2x.png b/Telegram/Resources/icons/info/edit/group_manage_permissions@2x.png index 594f89414..c8b74c35d 100644 Binary files a/Telegram/Resources/icons/info/edit/group_manage_permissions@2x.png and b/Telegram/Resources/icons/info/edit/group_manage_permissions@2x.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_permissions@3x.png b/Telegram/Resources/icons/info/edit/group_manage_permissions@3x.png index ae6732b32..894504ae3 100644 Binary files a/Telegram/Resources/icons/info/edit/group_manage_permissions@3x.png and b/Telegram/Resources/icons/info/edit/group_manage_permissions@3x.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_reactions.png b/Telegram/Resources/icons/info/edit/group_manage_reactions.png index 14265081a..b1aa70cac 100644 Binary files a/Telegram/Resources/icons/info/edit/group_manage_reactions.png and b/Telegram/Resources/icons/info/edit/group_manage_reactions.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_reactions@2x.png b/Telegram/Resources/icons/info/edit/group_manage_reactions@2x.png index 029743d6b..ca37d3892 100644 Binary files a/Telegram/Resources/icons/info/edit/group_manage_reactions@2x.png and b/Telegram/Resources/icons/info/edit/group_manage_reactions@2x.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_reactions@3x.png b/Telegram/Resources/icons/info/edit/group_manage_reactions@3x.png index d3f774a2c..1de249117 100644 Binary files a/Telegram/Resources/icons/info/edit/group_manage_reactions@3x.png and b/Telegram/Resources/icons/info/edit/group_manage_reactions@3x.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_type.png b/Telegram/Resources/icons/info/edit/group_manage_type.png new file mode 100644 index 000000000..9bd8a1930 Binary files /dev/null and b/Telegram/Resources/icons/info/edit/group_manage_type.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_type@2x.png b/Telegram/Resources/icons/info/edit/group_manage_type@2x.png new file mode 100644 index 000000000..408c982e9 Binary files /dev/null and b/Telegram/Resources/icons/info/edit/group_manage_type@2x.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_type@3x.png b/Telegram/Resources/icons/info/edit/group_manage_type@3x.png new file mode 100644 index 000000000..6e691af00 Binary files /dev/null and b/Telegram/Resources/icons/info/edit/group_manage_type@3x.png differ diff --git a/Telegram/Resources/icons/info/edit/hidden_members.png b/Telegram/Resources/icons/info/edit/hidden_members.png new file mode 100644 index 000000000..5023e3ae7 Binary files /dev/null and b/Telegram/Resources/icons/info/edit/hidden_members.png differ diff --git a/Telegram/Resources/icons/info/edit/hidden_members@2x.png b/Telegram/Resources/icons/info/edit/hidden_members@2x.png new file mode 100644 index 000000000..6e26f1cbe Binary files /dev/null and b/Telegram/Resources/icons/info/edit/hidden_members@2x.png differ diff --git a/Telegram/Resources/icons/info/edit/hidden_members@3x.png b/Telegram/Resources/icons/info/edit/hidden_members@3x.png new file mode 100644 index 000000000..aa5143791 Binary files /dev/null and b/Telegram/Resources/icons/info/edit/hidden_members@3x.png differ diff --git a/Telegram/Resources/icons/info/edit/stickers_add.png b/Telegram/Resources/icons/info/edit/stickers_add.png new file mode 100644 index 000000000..d4c77a202 Binary files /dev/null and b/Telegram/Resources/icons/info/edit/stickers_add.png differ diff --git a/Telegram/Resources/icons/info/edit/stickers_add@2x.png b/Telegram/Resources/icons/info/edit/stickers_add@2x.png new file mode 100644 index 000000000..f188f440d Binary files /dev/null and b/Telegram/Resources/icons/info/edit/stickers_add@2x.png differ diff --git a/Telegram/Resources/icons/info/edit/stickers_add@3x.png b/Telegram/Resources/icons/info/edit/stickers_add@3x.png new file mode 100644 index 000000000..48de8115e Binary files /dev/null and b/Telegram/Resources/icons/info/edit/stickers_add@3x.png differ diff --git a/Telegram/Resources/icons/info/inaccessible_userpic.png b/Telegram/Resources/icons/info/inaccessible_userpic.png new file mode 100644 index 000000000..426fa1ee5 Binary files /dev/null and b/Telegram/Resources/icons/info/inaccessible_userpic.png differ diff --git a/Telegram/Resources/icons/info/inaccessible_userpic@2x.png b/Telegram/Resources/icons/info/inaccessible_userpic@2x.png new file mode 100644 index 000000000..aabebd344 Binary files /dev/null and b/Telegram/Resources/icons/info/inaccessible_userpic@2x.png differ diff --git a/Telegram/Resources/icons/info/inaccessible_userpic@3x.png b/Telegram/Resources/icons/info/inaccessible_userpic@3x.png new file mode 100644 index 000000000..1b943895d Binary files /dev/null and b/Telegram/Resources/icons/info/inaccessible_userpic@3x.png differ diff --git a/Telegram/Resources/icons/info/info_add_member.png b/Telegram/Resources/icons/info/info_add_member.png new file mode 100644 index 000000000..9216406a1 Binary files /dev/null and b/Telegram/Resources/icons/info/info_add_member.png differ diff --git a/Telegram/Resources/icons/info/info_add_member@2x.png b/Telegram/Resources/icons/info/info_add_member@2x.png new file mode 100644 index 000000000..c380208fa Binary files /dev/null and b/Telegram/Resources/icons/info/info_add_member@2x.png differ diff --git a/Telegram/Resources/icons/info/info_add_member@3x.png b/Telegram/Resources/icons/info/info_add_member@3x.png new file mode 100644 index 000000000..b86d192ea Binary files /dev/null and b/Telegram/Resources/icons/info/info_add_member@3x.png differ diff --git a/Telegram/Resources/icons/info/info_back.png b/Telegram/Resources/icons/info/info_back.png new file mode 100644 index 000000000..d3d79367c Binary files /dev/null and b/Telegram/Resources/icons/info/info_back.png differ diff --git a/Telegram/Resources/icons/info/info_back@2x.png b/Telegram/Resources/icons/info/info_back@2x.png new file mode 100644 index 000000000..f2440fba3 Binary files /dev/null and b/Telegram/Resources/icons/info/info_back@2x.png differ diff --git a/Telegram/Resources/icons/info/info_back@3x.png b/Telegram/Resources/icons/info/info_back@3x.png new file mode 100644 index 000000000..629c05c44 Binary files /dev/null and b/Telegram/Resources/icons/info/info_back@3x.png differ diff --git a/Telegram/Resources/icons/info/info_blacklist.png b/Telegram/Resources/icons/info/info_blacklist.png new file mode 100644 index 000000000..6fabfff96 Binary files /dev/null and b/Telegram/Resources/icons/info/info_blacklist.png differ diff --git a/Telegram/Resources/icons/info/info_blacklist@2x.png b/Telegram/Resources/icons/info/info_blacklist@2x.png new file mode 100644 index 000000000..e05e0362d Binary files /dev/null and b/Telegram/Resources/icons/info/info_blacklist@2x.png differ diff --git a/Telegram/Resources/icons/info/info_blacklist@3x.png b/Telegram/Resources/icons/info/info_blacklist@3x.png new file mode 100644 index 000000000..3d740024f Binary files /dev/null and b/Telegram/Resources/icons/info/info_blacklist@3x.png differ diff --git a/Telegram/Resources/icons/info/info_block.png b/Telegram/Resources/icons/info/info_block.png new file mode 100644 index 000000000..fed8a03cd Binary files /dev/null and b/Telegram/Resources/icons/info/info_block.png differ diff --git a/Telegram/Resources/icons/info/info_block@2x.png b/Telegram/Resources/icons/info/info_block@2x.png new file mode 100644 index 000000000..d69c7630b Binary files /dev/null and b/Telegram/Resources/icons/info/info_block@2x.png differ diff --git a/Telegram/Resources/icons/info/info_block@3x.png b/Telegram/Resources/icons/info/info_block@3x.png new file mode 100644 index 000000000..b9a41cb9f Binary files /dev/null and b/Telegram/Resources/icons/info/info_block@3x.png differ diff --git a/Telegram/Resources/icons/info/info_close.png b/Telegram/Resources/icons/info/info_close.png new file mode 100644 index 000000000..408502bda Binary files /dev/null and b/Telegram/Resources/icons/info/info_close.png differ diff --git a/Telegram/Resources/icons/info/info_close@2x.png b/Telegram/Resources/icons/info/info_close@2x.png new file mode 100644 index 000000000..5cb69dd8b Binary files /dev/null and b/Telegram/Resources/icons/info/info_close@2x.png differ diff --git a/Telegram/Resources/icons/info/info_close@3x.png b/Telegram/Resources/icons/info/info_close@3x.png new file mode 100644 index 000000000..867c3f9cb Binary files /dev/null and b/Telegram/Resources/icons/info/info_close@3x.png differ diff --git a/Telegram/Resources/icons/info/info_colors_add.png b/Telegram/Resources/icons/info/info_colors_add.png new file mode 100644 index 000000000..bf89de76e Binary files /dev/null and b/Telegram/Resources/icons/info/info_colors_add.png differ diff --git a/Telegram/Resources/icons/info/info_colors_add@2x.png b/Telegram/Resources/icons/info/info_colors_add@2x.png new file mode 100644 index 000000000..58873de2a Binary files /dev/null and b/Telegram/Resources/icons/info/info_colors_add@2x.png differ diff --git a/Telegram/Resources/icons/info/info_colors_add@3x.png b/Telegram/Resources/icons/info/info_colors_add@3x.png new file mode 100644 index 000000000..88a9ced45 Binary files /dev/null and b/Telegram/Resources/icons/info/info_colors_add@3x.png differ diff --git a/Telegram/Resources/icons/info/info_colors_remove.png b/Telegram/Resources/icons/info/info_colors_remove.png new file mode 100644 index 000000000..c83104449 Binary files /dev/null and b/Telegram/Resources/icons/info/info_colors_remove.png differ diff --git a/Telegram/Resources/icons/info/info_colors_remove@2x.png b/Telegram/Resources/icons/info/info_colors_remove@2x.png new file mode 100644 index 000000000..e891c990f Binary files /dev/null and b/Telegram/Resources/icons/info/info_colors_remove@2x.png differ diff --git a/Telegram/Resources/icons/info/info_colors_remove@3x.png b/Telegram/Resources/icons/info/info_colors_remove@3x.png new file mode 100644 index 000000000..ba78ac375 Binary files /dev/null and b/Telegram/Resources/icons/info/info_colors_remove@3x.png differ diff --git a/Telegram/Resources/icons/info/info_common_groups.png b/Telegram/Resources/icons/info/info_common_groups.png new file mode 100644 index 000000000..6968a8196 Binary files /dev/null and b/Telegram/Resources/icons/info/info_common_groups.png differ diff --git a/Telegram/Resources/icons/info/info_common_groups@2x.png b/Telegram/Resources/icons/info/info_common_groups@2x.png new file mode 100644 index 000000000..7ab568983 Binary files /dev/null and b/Telegram/Resources/icons/info/info_common_groups@2x.png differ diff --git a/Telegram/Resources/icons/info/info_common_groups@3x.png b/Telegram/Resources/icons/info/info_common_groups@3x.png new file mode 100644 index 000000000..d92cb08c1 Binary files /dev/null and b/Telegram/Resources/icons/info/info_common_groups@3x.png differ diff --git a/Telegram/Resources/icons/info/info_delete.png b/Telegram/Resources/icons/info/info_delete.png new file mode 100644 index 000000000..f759bec11 Binary files /dev/null and b/Telegram/Resources/icons/info/info_delete.png differ diff --git a/Telegram/Resources/icons/info/info_delete@2x.png b/Telegram/Resources/icons/info/info_delete@2x.png new file mode 100644 index 000000000..c14cb71b5 Binary files /dev/null and b/Telegram/Resources/icons/info/info_delete@2x.png differ diff --git a/Telegram/Resources/icons/info/info_delete@3x.png b/Telegram/Resources/icons/info/info_delete@3x.png new file mode 100644 index 000000000..9477ac440 Binary files /dev/null and b/Telegram/Resources/icons/info/info_delete@3x.png differ diff --git a/Telegram/Resources/icons/info/info_edit.png b/Telegram/Resources/icons/info/info_edit.png new file mode 100644 index 000000000..027a6c31a Binary files /dev/null and b/Telegram/Resources/icons/info/info_edit.png differ diff --git a/Telegram/Resources/icons/info/info_edit@2x.png b/Telegram/Resources/icons/info/info_edit@2x.png new file mode 100644 index 000000000..c48d44f8a Binary files /dev/null and b/Telegram/Resources/icons/info/info_edit@2x.png differ diff --git a/Telegram/Resources/icons/info/info_edit@3x.png b/Telegram/Resources/icons/info/info_edit@3x.png new file mode 100644 index 000000000..3caa3d7f2 Binary files /dev/null and b/Telegram/Resources/icons/info/info_edit@3x.png differ diff --git a/Telegram/Resources/icons/info/info_information.png b/Telegram/Resources/icons/info/info_information.png new file mode 100644 index 000000000..0814d7536 Binary files /dev/null and b/Telegram/Resources/icons/info/info_information.png differ diff --git a/Telegram/Resources/icons/info/info_information@2x.png b/Telegram/Resources/icons/info/info_information@2x.png new file mode 100644 index 000000000..33447a76b Binary files /dev/null and b/Telegram/Resources/icons/info/info_information@2x.png differ diff --git a/Telegram/Resources/icons/info/info_information@3x.png b/Telegram/Resources/icons/info/info_information@3x.png new file mode 100644 index 000000000..5a750462a Binary files /dev/null and b/Telegram/Resources/icons/info/info_information@3x.png differ diff --git a/Telegram/Resources/icons/info/info_leave.png b/Telegram/Resources/icons/info/info_leave.png new file mode 100644 index 000000000..38d05ecc7 Binary files /dev/null and b/Telegram/Resources/icons/info/info_leave.png differ diff --git a/Telegram/Resources/icons/info/info_leave@2x.png b/Telegram/Resources/icons/info/info_leave@2x.png new file mode 100644 index 000000000..2993b4399 Binary files /dev/null and b/Telegram/Resources/icons/info/info_leave@2x.png differ diff --git a/Telegram/Resources/icons/info/info_leave@3x.png b/Telegram/Resources/icons/info/info_leave@3x.png new file mode 100644 index 000000000..40f708824 Binary files /dev/null and b/Telegram/Resources/icons/info/info_leave@3x.png differ diff --git a/Telegram/Resources/icons/info/info_media_audio.png b/Telegram/Resources/icons/info/info_media_audio.png new file mode 100644 index 000000000..00ac8a96a Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_audio.png differ diff --git a/Telegram/Resources/icons/info/info_media_audio@2x.png b/Telegram/Resources/icons/info/info_media_audio@2x.png new file mode 100644 index 000000000..cb1a64c21 Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_audio@2x.png differ diff --git a/Telegram/Resources/icons/info/info_media_audio@3x.png b/Telegram/Resources/icons/info/info_media_audio@3x.png new file mode 100644 index 000000000..604fcdbf3 Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_audio@3x.png differ diff --git a/Telegram/Resources/icons/info_media_audio_empty.png b/Telegram/Resources/icons/info/info_media_audio_empty.png similarity index 100% rename from Telegram/Resources/icons/info_media_audio_empty.png rename to Telegram/Resources/icons/info/info_media_audio_empty.png diff --git a/Telegram/Resources/icons/info_media_audio_empty@2x.png b/Telegram/Resources/icons/info/info_media_audio_empty@2x.png similarity index 100% rename from Telegram/Resources/icons/info_media_audio_empty@2x.png rename to Telegram/Resources/icons/info/info_media_audio_empty@2x.png diff --git a/Telegram/Resources/icons/info_media_audio_empty@3x.png b/Telegram/Resources/icons/info/info_media_audio_empty@3x.png similarity index 100% rename from Telegram/Resources/icons/info_media_audio_empty@3x.png rename to Telegram/Resources/icons/info/info_media_audio_empty@3x.png diff --git a/Telegram/Resources/icons/info/info_media_delete.png b/Telegram/Resources/icons/info/info_media_delete.png new file mode 100644 index 000000000..b70917939 Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_delete.png differ diff --git a/Telegram/Resources/icons/info/info_media_delete@2x.png b/Telegram/Resources/icons/info/info_media_delete@2x.png new file mode 100644 index 000000000..6cd110ce5 Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_delete@2x.png differ diff --git a/Telegram/Resources/icons/info/info_media_delete@3x.png b/Telegram/Resources/icons/info/info_media_delete@3x.png new file mode 100644 index 000000000..904892080 Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_delete@3x.png differ diff --git a/Telegram/Resources/icons/info/info_media_file.png b/Telegram/Resources/icons/info/info_media_file.png new file mode 100644 index 000000000..3341fb56f Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_file.png differ diff --git a/Telegram/Resources/icons/info/info_media_file@2x.png b/Telegram/Resources/icons/info/info_media_file@2x.png new file mode 100644 index 000000000..dc8d0ebdb Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_file@2x.png differ diff --git a/Telegram/Resources/icons/info/info_media_file@3x.png b/Telegram/Resources/icons/info/info_media_file@3x.png new file mode 100644 index 000000000..f436d894c Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_file@3x.png differ diff --git a/Telegram/Resources/icons/info_media_file_empty.png b/Telegram/Resources/icons/info/info_media_file_empty.png similarity index 100% rename from Telegram/Resources/icons/info_media_file_empty.png rename to Telegram/Resources/icons/info/info_media_file_empty.png diff --git a/Telegram/Resources/icons/info_media_file_empty@2x.png b/Telegram/Resources/icons/info/info_media_file_empty@2x.png similarity index 100% rename from Telegram/Resources/icons/info_media_file_empty@2x.png rename to Telegram/Resources/icons/info/info_media_file_empty@2x.png diff --git a/Telegram/Resources/icons/info_media_file_empty@3x.png b/Telegram/Resources/icons/info/info_media_file_empty@3x.png similarity index 100% rename from Telegram/Resources/icons/info_media_file_empty@3x.png rename to Telegram/Resources/icons/info/info_media_file_empty@3x.png diff --git a/Telegram/Resources/icons/info/info_media_forward.png b/Telegram/Resources/icons/info/info_media_forward.png new file mode 100644 index 000000000..1d081019b Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_forward.png differ diff --git a/Telegram/Resources/icons/info/info_media_forward@2x.png b/Telegram/Resources/icons/info/info_media_forward@2x.png new file mode 100644 index 000000000..b7b272d54 Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_forward@2x.png differ diff --git a/Telegram/Resources/icons/info/info_media_forward@3x.png b/Telegram/Resources/icons/info/info_media_forward@3x.png new file mode 100644 index 000000000..972c4da9b Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_forward@3x.png differ diff --git a/Telegram/Resources/icons/info/info_media_gif.png b/Telegram/Resources/icons/info/info_media_gif.png new file mode 100644 index 000000000..948822fe2 Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_gif.png differ diff --git a/Telegram/Resources/icons/info/info_media_gif@2x.png b/Telegram/Resources/icons/info/info_media_gif@2x.png new file mode 100644 index 000000000..870d14517 Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_gif@2x.png differ diff --git a/Telegram/Resources/icons/info/info_media_gif@3x.png b/Telegram/Resources/icons/info/info_media_gif@3x.png new file mode 100644 index 000000000..5ba8da9d1 Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_gif@3x.png differ diff --git a/Telegram/Resources/icons/info/info_media_link.png b/Telegram/Resources/icons/info/info_media_link.png new file mode 100644 index 000000000..8a9da5b5e Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_link.png differ diff --git a/Telegram/Resources/icons/info/info_media_link@2x.png b/Telegram/Resources/icons/info/info_media_link@2x.png new file mode 100644 index 000000000..c5a1081fb Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_link@2x.png differ diff --git a/Telegram/Resources/icons/info/info_media_link@3x.png b/Telegram/Resources/icons/info/info_media_link@3x.png new file mode 100644 index 000000000..84fe5db4e Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_link@3x.png differ diff --git a/Telegram/Resources/icons/info_media_link_empty.png b/Telegram/Resources/icons/info/info_media_link_empty.png similarity index 100% rename from Telegram/Resources/icons/info_media_link_empty.png rename to Telegram/Resources/icons/info/info_media_link_empty.png diff --git a/Telegram/Resources/icons/info_media_link_empty@2x.png b/Telegram/Resources/icons/info/info_media_link_empty@2x.png similarity index 100% rename from Telegram/Resources/icons/info_media_link_empty@2x.png rename to Telegram/Resources/icons/info/info_media_link_empty@2x.png diff --git a/Telegram/Resources/icons/info_media_link_empty@3x.png b/Telegram/Resources/icons/info/info_media_link_empty@3x.png similarity index 100% rename from Telegram/Resources/icons/info_media_link_empty@3x.png rename to Telegram/Resources/icons/info/info_media_link_empty@3x.png diff --git a/Telegram/Resources/icons/info/info_media_photo.png b/Telegram/Resources/icons/info/info_media_photo.png new file mode 100644 index 000000000..49ac0b46e Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_photo.png differ diff --git a/Telegram/Resources/icons/info/info_media_photo@2x.png b/Telegram/Resources/icons/info/info_media_photo@2x.png new file mode 100644 index 000000000..ec1c9eae9 Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_photo@2x.png differ diff --git a/Telegram/Resources/icons/info/info_media_photo@3x.png b/Telegram/Resources/icons/info/info_media_photo@3x.png new file mode 100644 index 000000000..402336888 Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_photo@3x.png differ diff --git a/Telegram/Resources/icons/info_media_photo_empty.png b/Telegram/Resources/icons/info/info_media_photo_empty.png similarity index 100% rename from Telegram/Resources/icons/info_media_photo_empty.png rename to Telegram/Resources/icons/info/info_media_photo_empty.png diff --git a/Telegram/Resources/icons/info_media_photo_empty@2x.png b/Telegram/Resources/icons/info/info_media_photo_empty@2x.png similarity index 100% rename from Telegram/Resources/icons/info_media_photo_empty@2x.png rename to Telegram/Resources/icons/info/info_media_photo_empty@2x.png diff --git a/Telegram/Resources/icons/info_media_photo_empty@3x.png b/Telegram/Resources/icons/info/info_media_photo_empty@3x.png similarity index 100% rename from Telegram/Resources/icons/info_media_photo_empty@3x.png rename to Telegram/Resources/icons/info/info_media_photo_empty@3x.png diff --git a/Telegram/Resources/icons/info/info_media_round.png b/Telegram/Resources/icons/info/info_media_round.png new file mode 100644 index 000000000..c96a0ab4d Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_round.png differ diff --git a/Telegram/Resources/icons/info/info_media_round@2x.png b/Telegram/Resources/icons/info/info_media_round@2x.png new file mode 100644 index 000000000..f4607e76d Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_round@2x.png differ diff --git a/Telegram/Resources/icons/info/info_media_round@3x.png b/Telegram/Resources/icons/info/info_media_round@3x.png new file mode 100644 index 000000000..4c7fbdaba Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_round@3x.png differ diff --git a/Telegram/Resources/icons/info/info_media_saved.png b/Telegram/Resources/icons/info/info_media_saved.png new file mode 100644 index 000000000..0b3ebc5dd Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_saved.png differ diff --git a/Telegram/Resources/icons/info/info_media_saved@2x.png b/Telegram/Resources/icons/info/info_media_saved@2x.png new file mode 100644 index 000000000..aa91e6fb8 Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_saved@2x.png differ diff --git a/Telegram/Resources/icons/info/info_media_saved@3x.png b/Telegram/Resources/icons/info/info_media_saved@3x.png new file mode 100644 index 000000000..6c9814fe1 Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_saved@3x.png differ diff --git a/Telegram/Resources/icons/info/info_media_stories.png b/Telegram/Resources/icons/info/info_media_stories.png new file mode 100644 index 000000000..5b4cb99be Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_stories.png differ diff --git a/Telegram/Resources/icons/info/info_media_stories@2x.png b/Telegram/Resources/icons/info/info_media_stories@2x.png new file mode 100644 index 000000000..fc0a2f6e3 Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_stories@2x.png differ diff --git a/Telegram/Resources/icons/info/info_media_stories@3x.png b/Telegram/Resources/icons/info/info_media_stories@3x.png new file mode 100644 index 000000000..df8a23bbd Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_stories@3x.png differ diff --git a/Telegram/Resources/icons/info/info_media_story_empty.png b/Telegram/Resources/icons/info/info_media_story_empty.png new file mode 100644 index 000000000..6196956ba Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_story_empty.png differ diff --git a/Telegram/Resources/icons/info/info_media_story_empty@2x.png b/Telegram/Resources/icons/info/info_media_story_empty@2x.png new file mode 100644 index 000000000..c3e6997cd Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_story_empty@2x.png differ diff --git a/Telegram/Resources/icons/info/info_media_story_empty@3x.png b/Telegram/Resources/icons/info/info_media_story_empty@3x.png new file mode 100644 index 000000000..b6422809d Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_story_empty@3x.png differ diff --git a/Telegram/Resources/icons/info/info_media_video.png b/Telegram/Resources/icons/info/info_media_video.png new file mode 100644 index 000000000..93aa1be1c Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_video.png differ diff --git a/Telegram/Resources/icons/info/info_media_video@2x.png b/Telegram/Resources/icons/info/info_media_video@2x.png new file mode 100644 index 000000000..17c760aa6 Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_video@2x.png differ diff --git a/Telegram/Resources/icons/info/info_media_video@3x.png b/Telegram/Resources/icons/info/info_media_video@3x.png new file mode 100644 index 000000000..1e2265b29 Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_video@3x.png differ diff --git a/Telegram/Resources/icons/info_media_video_empty.png b/Telegram/Resources/icons/info/info_media_video_empty.png similarity index 100% rename from Telegram/Resources/icons/info_media_video_empty.png rename to Telegram/Resources/icons/info/info_media_video_empty.png diff --git a/Telegram/Resources/icons/info_media_video_empty@2x.png b/Telegram/Resources/icons/info/info_media_video_empty@2x.png similarity index 100% rename from Telegram/Resources/icons/info_media_video_empty@2x.png rename to Telegram/Resources/icons/info/info_media_video_empty@2x.png diff --git a/Telegram/Resources/icons/info_media_video_empty@3x.png b/Telegram/Resources/icons/info/info_media_video_empty@3x.png similarity index 100% rename from Telegram/Resources/icons/info_media_video_empty@3x.png rename to Telegram/Resources/icons/info/info_media_video_empty@3x.png diff --git a/Telegram/Resources/icons/info/info_media_voice.png b/Telegram/Resources/icons/info/info_media_voice.png new file mode 100644 index 000000000..6bc3d49fe Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_voice.png differ diff --git a/Telegram/Resources/icons/info/info_media_voice@2x.png b/Telegram/Resources/icons/info/info_media_voice@2x.png new file mode 100644 index 000000000..aebbe7b9f Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_voice@2x.png differ diff --git a/Telegram/Resources/icons/info/info_media_voice@3x.png b/Telegram/Resources/icons/info/info_media_voice@3x.png new file mode 100644 index 000000000..d3306b03f Binary files /dev/null and b/Telegram/Resources/icons/info/info_media_voice@3x.png differ diff --git a/Telegram/Resources/icons/info_media_voice_empty.png b/Telegram/Resources/icons/info/info_media_voice_empty.png similarity index 100% rename from Telegram/Resources/icons/info_media_voice_empty.png rename to Telegram/Resources/icons/info/info_media_voice_empty.png diff --git a/Telegram/Resources/icons/info_media_voice_empty@2x.png b/Telegram/Resources/icons/info/info_media_voice_empty@2x.png similarity index 100% rename from Telegram/Resources/icons/info_media_voice_empty@2x.png rename to Telegram/Resources/icons/info/info_media_voice_empty@2x.png diff --git a/Telegram/Resources/icons/info_media_voice_empty@3x.png b/Telegram/Resources/icons/info/info_media_voice_empty@3x.png similarity index 100% rename from Telegram/Resources/icons/info_media_voice_empty@3x.png rename to Telegram/Resources/icons/info/info_media_voice_empty@3x.png diff --git a/Telegram/Resources/icons/info/info_members.png b/Telegram/Resources/icons/info/info_members.png new file mode 100644 index 000000000..6968a8196 Binary files /dev/null and b/Telegram/Resources/icons/info/info_members.png differ diff --git a/Telegram/Resources/icons/info/info_members@2x.png b/Telegram/Resources/icons/info/info_members@2x.png new file mode 100644 index 000000000..7ab568983 Binary files /dev/null and b/Telegram/Resources/icons/info/info_members@2x.png differ diff --git a/Telegram/Resources/icons/info/info_members@3x.png b/Telegram/Resources/icons/info/info_members@3x.png new file mode 100644 index 000000000..d92cb08c1 Binary files /dev/null and b/Telegram/Resources/icons/info/info_members@3x.png differ diff --git a/Telegram/Resources/icons/info/info_notifications.png b/Telegram/Resources/icons/info/info_notifications.png new file mode 100644 index 000000000..b718b038f Binary files /dev/null and b/Telegram/Resources/icons/info/info_notifications.png differ diff --git a/Telegram/Resources/icons/info/info_notifications@2x.png b/Telegram/Resources/icons/info/info_notifications@2x.png new file mode 100644 index 000000000..8b06c68fa Binary files /dev/null and b/Telegram/Resources/icons/info/info_notifications@2x.png differ diff --git a/Telegram/Resources/icons/info/info_notifications@3x.png b/Telegram/Resources/icons/info/info_notifications@3x.png new file mode 100644 index 000000000..5a0610015 Binary files /dev/null and b/Telegram/Resources/icons/info/info_notifications@3x.png differ diff --git a/Telegram/Resources/icons/info_notifications_active.png b/Telegram/Resources/icons/info/info_notifications_active.png similarity index 100% rename from Telegram/Resources/icons/info_notifications_active.png rename to Telegram/Resources/icons/info/info_notifications_active.png diff --git a/Telegram/Resources/icons/info_notifications_active@2x.png b/Telegram/Resources/icons/info/info_notifications_active@2x.png similarity index 100% rename from Telegram/Resources/icons/info_notifications_active@2x.png rename to Telegram/Resources/icons/info/info_notifications_active@2x.png diff --git a/Telegram/Resources/icons/info_notifications_active@3x.png b/Telegram/Resources/icons/info/info_notifications_active@3x.png similarity index 100% rename from Telegram/Resources/icons/info_notifications_active@3x.png rename to Telegram/Resources/icons/info/info_notifications_active@3x.png diff --git a/Telegram/Resources/icons/info/info_permissions.png b/Telegram/Resources/icons/info/info_permissions.png new file mode 100644 index 000000000..6b37b2b7e Binary files /dev/null and b/Telegram/Resources/icons/info/info_permissions.png differ diff --git a/Telegram/Resources/icons/info/info_permissions@2x.png b/Telegram/Resources/icons/info/info_permissions@2x.png new file mode 100644 index 000000000..b36128f80 Binary files /dev/null and b/Telegram/Resources/icons/info/info_permissions@2x.png differ diff --git a/Telegram/Resources/icons/info/info_permissions@3x.png b/Telegram/Resources/icons/info/info_permissions@3x.png new file mode 100644 index 000000000..70039de05 Binary files /dev/null and b/Telegram/Resources/icons/info/info_permissions@3x.png differ diff --git a/Telegram/Resources/icons/info/info_report.png b/Telegram/Resources/icons/info/info_report.png new file mode 100644 index 000000000..f32548026 Binary files /dev/null and b/Telegram/Resources/icons/info/info_report.png differ diff --git a/Telegram/Resources/icons/info/info_report@2x.png b/Telegram/Resources/icons/info/info_report@2x.png new file mode 100644 index 000000000..97a6d9f4d Binary files /dev/null and b/Telegram/Resources/icons/info/info_report@2x.png differ diff --git a/Telegram/Resources/icons/info/info_report@3x.png b/Telegram/Resources/icons/info/info_report@3x.png new file mode 100644 index 000000000..bec061f13 Binary files /dev/null and b/Telegram/Resources/icons/info/info_report@3x.png differ diff --git a/Telegram/Resources/icons/info_rights_lock.png b/Telegram/Resources/icons/info/info_rights_lock.png similarity index 100% rename from Telegram/Resources/icons/info_rights_lock.png rename to Telegram/Resources/icons/info/info_rights_lock.png diff --git a/Telegram/Resources/icons/info_rights_lock@2x.png b/Telegram/Resources/icons/info/info_rights_lock@2x.png similarity index 100% rename from Telegram/Resources/icons/info_rights_lock@2x.png rename to Telegram/Resources/icons/info/info_rights_lock@2x.png diff --git a/Telegram/Resources/icons/info_rights_lock@3x.png b/Telegram/Resources/icons/info/info_rights_lock@3x.png similarity index 100% rename from Telegram/Resources/icons/info_rights_lock@3x.png rename to Telegram/Resources/icons/info/info_rights_lock@3x.png diff --git a/Telegram/Resources/icons/info/info_search.png b/Telegram/Resources/icons/info/info_search.png new file mode 100644 index 000000000..026de4c93 Binary files /dev/null and b/Telegram/Resources/icons/info/info_search.png differ diff --git a/Telegram/Resources/icons/info/info_search@2x.png b/Telegram/Resources/icons/info/info_search@2x.png new file mode 100644 index 000000000..388fb7c7a Binary files /dev/null and b/Telegram/Resources/icons/info/info_search@2x.png differ diff --git a/Telegram/Resources/icons/info/info_search@3x.png b/Telegram/Resources/icons/info/info_search@3x.png new file mode 100644 index 000000000..dbf470ac7 Binary files /dev/null and b/Telegram/Resources/icons/info/info_search@3x.png differ diff --git a/Telegram/Resources/icons/info/info_share.png b/Telegram/Resources/icons/info/info_share.png new file mode 100644 index 000000000..39024f9ec Binary files /dev/null and b/Telegram/Resources/icons/info/info_share.png differ diff --git a/Telegram/Resources/icons/info/info_share@2x.png b/Telegram/Resources/icons/info/info_share@2x.png new file mode 100644 index 000000000..5cc49c940 Binary files /dev/null and b/Telegram/Resources/icons/info/info_share@2x.png differ diff --git a/Telegram/Resources/icons/info/info_share@3x.png b/Telegram/Resources/icons/info/info_share@3x.png new file mode 100644 index 000000000..465bd951b Binary files /dev/null and b/Telegram/Resources/icons/info/info_share@3x.png differ diff --git a/Telegram/Resources/icons/info/info_stories_archive.png b/Telegram/Resources/icons/info/info_stories_archive.png new file mode 100644 index 000000000..9b4b79ce4 Binary files /dev/null and b/Telegram/Resources/icons/info/info_stories_archive.png differ diff --git a/Telegram/Resources/icons/info/info_stories_archive@2x.png b/Telegram/Resources/icons/info/info_stories_archive@2x.png new file mode 100644 index 000000000..831363fa5 Binary files /dev/null and b/Telegram/Resources/icons/info/info_stories_archive@2x.png differ diff --git a/Telegram/Resources/icons/info/info_stories_archive@3x.png b/Telegram/Resources/icons/info/info_stories_archive@3x.png new file mode 100644 index 000000000..e02e85c6c Binary files /dev/null and b/Telegram/Resources/icons/info/info_stories_archive@3x.png differ diff --git a/Telegram/Resources/icons/info/info_stories_recent.png b/Telegram/Resources/icons/info/info_stories_recent.png new file mode 100644 index 000000000..341ee2a06 Binary files /dev/null and b/Telegram/Resources/icons/info/info_stories_recent.png differ diff --git a/Telegram/Resources/icons/info/info_stories_recent@2x.png b/Telegram/Resources/icons/info/info_stories_recent@2x.png new file mode 100644 index 000000000..ecb3fc72d Binary files /dev/null and b/Telegram/Resources/icons/info/info_stories_recent@2x.png differ diff --git a/Telegram/Resources/icons/info/info_stories_recent@3x.png b/Telegram/Resources/icons/info/info_stories_recent@3x.png new file mode 100644 index 000000000..bacf1a3c1 Binary files /dev/null and b/Telegram/Resources/icons/info/info_stories_recent@3x.png differ diff --git a/Telegram/Resources/icons/info/info_stories_to_archive.png b/Telegram/Resources/icons/info/info_stories_to_archive.png new file mode 100644 index 000000000..f9c81896e Binary files /dev/null and b/Telegram/Resources/icons/info/info_stories_to_archive.png differ diff --git a/Telegram/Resources/icons/info/info_stories_to_archive@2x.png b/Telegram/Resources/icons/info/info_stories_to_archive@2x.png new file mode 100644 index 000000000..ef905891c Binary files /dev/null and b/Telegram/Resources/icons/info/info_stories_to_archive@2x.png differ diff --git a/Telegram/Resources/icons/info/info_stories_to_archive@3x.png b/Telegram/Resources/icons/info/info_stories_to_archive@3x.png new file mode 100644 index 000000000..bc2fc30af Binary files /dev/null and b/Telegram/Resources/icons/info/info_stories_to_archive@3x.png differ diff --git a/Telegram/Resources/icons/info/info_stories_to_profile.png b/Telegram/Resources/icons/info/info_stories_to_profile.png new file mode 100644 index 000000000..cfe465c5b Binary files /dev/null and b/Telegram/Resources/icons/info/info_stories_to_profile.png differ diff --git a/Telegram/Resources/icons/info/info_stories_to_profile@2x.png b/Telegram/Resources/icons/info/info_stories_to_profile@2x.png new file mode 100644 index 000000000..1e9990c2f Binary files /dev/null and b/Telegram/Resources/icons/info/info_stories_to_profile@2x.png differ diff --git a/Telegram/Resources/icons/info/info_stories_to_profile@3x.png b/Telegram/Resources/icons/info/info_stories_to_profile@3x.png new file mode 100644 index 000000000..414fa60a2 Binary files /dev/null and b/Telegram/Resources/icons/info/info_stories_to_profile@3x.png differ diff --git a/Telegram/Resources/icons/info_actions.png b/Telegram/Resources/icons/info_actions.png deleted file mode 100644 index 30c270a73..000000000 Binary files a/Telegram/Resources/icons/info_actions.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_actions@2x.png b/Telegram/Resources/icons/info_actions@2x.png deleted file mode 100644 index 65aa8cf4b..000000000 Binary files a/Telegram/Resources/icons/info_actions@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_actions@3x.png b/Telegram/Resources/icons/info_actions@3x.png deleted file mode 100644 index 815d72c59..000000000 Binary files a/Telegram/Resources/icons/info_actions@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_add_member.png b/Telegram/Resources/icons/info_add_member.png deleted file mode 100644 index 4b0e5cb6e..000000000 Binary files a/Telegram/Resources/icons/info_add_member.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_add_member@2x.png b/Telegram/Resources/icons/info_add_member@2x.png deleted file mode 100644 index 0b71d8a2d..000000000 Binary files a/Telegram/Resources/icons/info_add_member@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_add_member@3x.png b/Telegram/Resources/icons/info_add_member@3x.png deleted file mode 100644 index e421b070e..000000000 Binary files a/Telegram/Resources/icons/info_add_member@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_administrators.png b/Telegram/Resources/icons/info_administrators.png deleted file mode 100644 index 18629085a..000000000 Binary files a/Telegram/Resources/icons/info_administrators.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_administrators@2x.png b/Telegram/Resources/icons/info_administrators@2x.png deleted file mode 100644 index c23630fa8..000000000 Binary files a/Telegram/Resources/icons/info_administrators@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_administrators@3x.png b/Telegram/Resources/icons/info_administrators@3x.png deleted file mode 100644 index 26f81d940..000000000 Binary files a/Telegram/Resources/icons/info_administrators@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_back.png b/Telegram/Resources/icons/info_back.png deleted file mode 100644 index e53ce913d..000000000 Binary files a/Telegram/Resources/icons/info_back.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_back@2x.png b/Telegram/Resources/icons/info_back@2x.png deleted file mode 100644 index aac5c40e9..000000000 Binary files a/Telegram/Resources/icons/info_back@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_back@3x.png b/Telegram/Resources/icons/info_back@3x.png deleted file mode 100644 index 96bbb7100..000000000 Binary files a/Telegram/Resources/icons/info_back@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_blacklist.png b/Telegram/Resources/icons/info_blacklist.png deleted file mode 100644 index 8907a45cc..000000000 Binary files a/Telegram/Resources/icons/info_blacklist.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_blacklist@2x.png b/Telegram/Resources/icons/info_blacklist@2x.png deleted file mode 100644 index 597edc9db..000000000 Binary files a/Telegram/Resources/icons/info_blacklist@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_blacklist@3x.png b/Telegram/Resources/icons/info_blacklist@3x.png deleted file mode 100644 index fdc18c75d..000000000 Binary files a/Telegram/Resources/icons/info_blacklist@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_close.png b/Telegram/Resources/icons/info_close.png deleted file mode 100644 index 51520916b..000000000 Binary files a/Telegram/Resources/icons/info_close.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_close@2x.png b/Telegram/Resources/icons/info_close@2x.png deleted file mode 100644 index 94b5089f9..000000000 Binary files a/Telegram/Resources/icons/info_close@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_close@3x.png b/Telegram/Resources/icons/info_close@3x.png deleted file mode 100644 index 11c77f389..000000000 Binary files a/Telegram/Resources/icons/info_close@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_common_groups.png b/Telegram/Resources/icons/info_common_groups.png deleted file mode 100644 index 01c36139f..000000000 Binary files a/Telegram/Resources/icons/info_common_groups.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_common_groups@2x.png b/Telegram/Resources/icons/info_common_groups@2x.png deleted file mode 100644 index f7a86e6be..000000000 Binary files a/Telegram/Resources/icons/info_common_groups@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_common_groups@3x.png b/Telegram/Resources/icons/info_common_groups@3x.png deleted file mode 100644 index 7432ebcc3..000000000 Binary files a/Telegram/Resources/icons/info_common_groups@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_information.png b/Telegram/Resources/icons/info_information.png deleted file mode 100644 index 60f49e72b..000000000 Binary files a/Telegram/Resources/icons/info_information.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_information@2x.png b/Telegram/Resources/icons/info_information@2x.png deleted file mode 100644 index dd0091259..000000000 Binary files a/Telegram/Resources/icons/info_information@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_information@3x.png b/Telegram/Resources/icons/info_information@3x.png deleted file mode 100644 index 49c6caf22..000000000 Binary files a/Telegram/Resources/icons/info_information@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_audio.png b/Telegram/Resources/icons/info_media_audio.png deleted file mode 100644 index 10c6061d8..000000000 Binary files a/Telegram/Resources/icons/info_media_audio.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_audio@2x.png b/Telegram/Resources/icons/info_media_audio@2x.png deleted file mode 100644 index 2f74dfcfa..000000000 Binary files a/Telegram/Resources/icons/info_media_audio@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_audio@3x.png b/Telegram/Resources/icons/info_media_audio@3x.png deleted file mode 100644 index 9d0730f18..000000000 Binary files a/Telegram/Resources/icons/info_media_audio@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_delete.png b/Telegram/Resources/icons/info_media_delete.png deleted file mode 100644 index 5702d982e..000000000 Binary files a/Telegram/Resources/icons/info_media_delete.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_delete@2x.png b/Telegram/Resources/icons/info_media_delete@2x.png deleted file mode 100644 index c33801c8f..000000000 Binary files a/Telegram/Resources/icons/info_media_delete@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_delete@3x.png b/Telegram/Resources/icons/info_media_delete@3x.png deleted file mode 100644 index d4a97c6ae..000000000 Binary files a/Telegram/Resources/icons/info_media_delete@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_file.png b/Telegram/Resources/icons/info_media_file.png deleted file mode 100644 index 851dd9324..000000000 Binary files a/Telegram/Resources/icons/info_media_file.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_file@2x.png b/Telegram/Resources/icons/info_media_file@2x.png deleted file mode 100644 index b417d1312..000000000 Binary files a/Telegram/Resources/icons/info_media_file@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_file@3x.png b/Telegram/Resources/icons/info_media_file@3x.png deleted file mode 100644 index 024f8f8d1..000000000 Binary files a/Telegram/Resources/icons/info_media_file@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_forward.png b/Telegram/Resources/icons/info_media_forward.png deleted file mode 100644 index 8726f1802..000000000 Binary files a/Telegram/Resources/icons/info_media_forward.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_forward@2x.png b/Telegram/Resources/icons/info_media_forward@2x.png deleted file mode 100644 index a141387a5..000000000 Binary files a/Telegram/Resources/icons/info_media_forward@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_forward@3x.png b/Telegram/Resources/icons/info_media_forward@3x.png deleted file mode 100644 index 89dbab915..000000000 Binary files a/Telegram/Resources/icons/info_media_forward@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_gif.png b/Telegram/Resources/icons/info_media_gif.png deleted file mode 100644 index 3b44ac891..000000000 Binary files a/Telegram/Resources/icons/info_media_gif.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_gif@2x.png b/Telegram/Resources/icons/info_media_gif@2x.png deleted file mode 100644 index 7a458e125..000000000 Binary files a/Telegram/Resources/icons/info_media_gif@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_gif@3x.png b/Telegram/Resources/icons/info_media_gif@3x.png deleted file mode 100644 index 304ecd2c3..000000000 Binary files a/Telegram/Resources/icons/info_media_gif@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_link.png b/Telegram/Resources/icons/info_media_link.png deleted file mode 100644 index 376cdcef3..000000000 Binary files a/Telegram/Resources/icons/info_media_link.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_link@2x.png b/Telegram/Resources/icons/info_media_link@2x.png deleted file mode 100644 index 3b08ddfab..000000000 Binary files a/Telegram/Resources/icons/info_media_link@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_link@3x.png b/Telegram/Resources/icons/info_media_link@3x.png deleted file mode 100644 index 7e4cd74f1..000000000 Binary files a/Telegram/Resources/icons/info_media_link@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_photo.png b/Telegram/Resources/icons/info_media_photo.png deleted file mode 100644 index 1d3997637..000000000 Binary files a/Telegram/Resources/icons/info_media_photo.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_photo@2x.png b/Telegram/Resources/icons/info_media_photo@2x.png deleted file mode 100644 index 3d516e922..000000000 Binary files a/Telegram/Resources/icons/info_media_photo@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_photo@3x.png b/Telegram/Resources/icons/info_media_photo@3x.png deleted file mode 100644 index 311331cf2..000000000 Binary files a/Telegram/Resources/icons/info_media_photo@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_round.png b/Telegram/Resources/icons/info_media_round.png deleted file mode 100644 index 012cd90c5..000000000 Binary files a/Telegram/Resources/icons/info_media_round.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_round@2x.png b/Telegram/Resources/icons/info_media_round@2x.png deleted file mode 100644 index 825b7ceed..000000000 Binary files a/Telegram/Resources/icons/info_media_round@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_round@3x.png b/Telegram/Resources/icons/info_media_round@3x.png deleted file mode 100644 index 7776d09c2..000000000 Binary files a/Telegram/Resources/icons/info_media_round@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_video.png b/Telegram/Resources/icons/info_media_video.png deleted file mode 100644 index a319475a0..000000000 Binary files a/Telegram/Resources/icons/info_media_video.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_video@2x.png b/Telegram/Resources/icons/info_media_video@2x.png deleted file mode 100644 index d684dc0c2..000000000 Binary files a/Telegram/Resources/icons/info_media_video@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_video@3x.png b/Telegram/Resources/icons/info_media_video@3x.png deleted file mode 100644 index 427e87c3a..000000000 Binary files a/Telegram/Resources/icons/info_media_video@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_voice.png b/Telegram/Resources/icons/info_media_voice.png deleted file mode 100644 index 8a476735a..000000000 Binary files a/Telegram/Resources/icons/info_media_voice.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_voice@2x.png b/Telegram/Resources/icons/info_media_voice@2x.png deleted file mode 100644 index a4daf1d7c..000000000 Binary files a/Telegram/Resources/icons/info_media_voice@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_media_voice@3x.png b/Telegram/Resources/icons/info_media_voice@3x.png deleted file mode 100644 index 055983fe2..000000000 Binary files a/Telegram/Resources/icons/info_media_voice@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_members.png b/Telegram/Resources/icons/info_members.png deleted file mode 100644 index 5d5520b84..000000000 Binary files a/Telegram/Resources/icons/info_members.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_members@2x.png b/Telegram/Resources/icons/info_members@2x.png deleted file mode 100644 index 781bb0cd8..000000000 Binary files a/Telegram/Resources/icons/info_members@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_members@3x.png b/Telegram/Resources/icons/info_members@3x.png deleted file mode 100644 index 472dea122..000000000 Binary files a/Telegram/Resources/icons/info_members@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_notifications.png b/Telegram/Resources/icons/info_notifications.png deleted file mode 100644 index 651e78f2c..000000000 Binary files a/Telegram/Resources/icons/info_notifications.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_notifications@2x.png b/Telegram/Resources/icons/info_notifications@2x.png deleted file mode 100644 index fecc98cef..000000000 Binary files a/Telegram/Resources/icons/info_notifications@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_notifications@3x.png b/Telegram/Resources/icons/info_notifications@3x.png deleted file mode 100644 index c5898d774..000000000 Binary files a/Telegram/Resources/icons/info_notifications@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_permissions.png b/Telegram/Resources/icons/info_permissions.png deleted file mode 100644 index 37d5e44d0..000000000 Binary files a/Telegram/Resources/icons/info_permissions.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_permissions@2x.png b/Telegram/Resources/icons/info_permissions@2x.png deleted file mode 100644 index 2a9922d22..000000000 Binary files a/Telegram/Resources/icons/info_permissions@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_permissions@3x.png b/Telegram/Resources/icons/info_permissions@3x.png deleted file mode 100644 index e6929d154..000000000 Binary files a/Telegram/Resources/icons/info_permissions@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_recent_actions.png b/Telegram/Resources/icons/info_recent_actions.png deleted file mode 100644 index ec6b701b0..000000000 Binary files a/Telegram/Resources/icons/info_recent_actions.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_recent_actions@2x.png b/Telegram/Resources/icons/info_recent_actions@2x.png deleted file mode 100644 index 432446119..000000000 Binary files a/Telegram/Resources/icons/info_recent_actions@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/info_recent_actions@3x.png b/Telegram/Resources/icons/info_recent_actions@3x.png deleted file mode 100644 index 366794067..000000000 Binary files a/Telegram/Resources/icons/info_recent_actions@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/inline_button_url.png b/Telegram/Resources/icons/inline_button_url.png index 33b1061d1..7f30b90ba 100644 Binary files a/Telegram/Resources/icons/inline_button_url.png and b/Telegram/Resources/icons/inline_button_url.png differ diff --git a/Telegram/Resources/icons/inline_button_url@2x.png b/Telegram/Resources/icons/inline_button_url@2x.png index b0579663b..1d5a999db 100644 Binary files a/Telegram/Resources/icons/inline_button_url@2x.png and b/Telegram/Resources/icons/inline_button_url@2x.png differ diff --git a/Telegram/Resources/icons/inline_button_url@3x.png b/Telegram/Resources/icons/inline_button_url@3x.png index d6887d45a..e299f9168 100644 Binary files a/Telegram/Resources/icons/inline_button_url@3x.png and b/Telegram/Resources/icons/inline_button_url@3x.png differ diff --git a/Telegram/Resources/icons/inline_button_web.png b/Telegram/Resources/icons/inline_button_web.png new file mode 100644 index 000000000..bfecfa02f Binary files /dev/null and b/Telegram/Resources/icons/inline_button_web.png differ diff --git a/Telegram/Resources/icons/inline_button_web@2x.png b/Telegram/Resources/icons/inline_button_web@2x.png new file mode 100644 index 000000000..9d33b9235 Binary files /dev/null and b/Telegram/Resources/icons/inline_button_web@2x.png differ diff --git a/Telegram/Resources/icons/inline_button_web@3x.png b/Telegram/Resources/icons/inline_button_web@3x.png new file mode 100644 index 000000000..c820324d2 Binary files /dev/null and b/Telegram/Resources/icons/inline_button_web@3x.png differ diff --git a/Telegram/Resources/icons/intro_country_dropdown.png b/Telegram/Resources/icons/intro_country_dropdown.png index e65ed5a5a..afe169a58 100644 Binary files a/Telegram/Resources/icons/intro_country_dropdown.png and b/Telegram/Resources/icons/intro_country_dropdown.png differ diff --git a/Telegram/Resources/icons/intro_country_dropdown@2x.png b/Telegram/Resources/icons/intro_country_dropdown@2x.png index 712294a4b..82c8dcd35 100644 Binary files a/Telegram/Resources/icons/intro_country_dropdown@2x.png and b/Telegram/Resources/icons/intro_country_dropdown@2x.png differ diff --git a/Telegram/Resources/icons/intro_country_dropdown@3x.png b/Telegram/Resources/icons/intro_country_dropdown@3x.png index 3a152c7c0..03a2a8048 100644 Binary files a/Telegram/Resources/icons/intro_country_dropdown@3x.png and b/Telegram/Resources/icons/intro_country_dropdown@3x.png differ diff --git a/Telegram/Resources/icons/limits/accounts.png b/Telegram/Resources/icons/limits/accounts.png new file mode 100644 index 000000000..84205fe9b Binary files /dev/null and b/Telegram/Resources/icons/limits/accounts.png differ diff --git a/Telegram/Resources/icons/limits/accounts@2x.png b/Telegram/Resources/icons/limits/accounts@2x.png new file mode 100644 index 000000000..7b5dc5206 Binary files /dev/null and b/Telegram/Resources/icons/limits/accounts@2x.png differ diff --git a/Telegram/Resources/icons/limits/accounts@3x.png b/Telegram/Resources/icons/limits/accounts@3x.png new file mode 100644 index 000000000..43210dd1c Binary files /dev/null and b/Telegram/Resources/icons/limits/accounts@3x.png differ diff --git a/Telegram/Resources/icons/limits/boost.png b/Telegram/Resources/icons/limits/boost.png new file mode 100644 index 000000000..b2c8bc7a0 Binary files /dev/null and b/Telegram/Resources/icons/limits/boost.png differ diff --git a/Telegram/Resources/icons/limits/boost@2x.png b/Telegram/Resources/icons/limits/boost@2x.png new file mode 100644 index 000000000..a4c54adcd Binary files /dev/null and b/Telegram/Resources/icons/limits/boost@2x.png differ diff --git a/Telegram/Resources/icons/limits/boost@3x.png b/Telegram/Resources/icons/limits/boost@3x.png new file mode 100644 index 000000000..194195fdb Binary files /dev/null and b/Telegram/Resources/icons/limits/boost@3x.png differ diff --git a/Telegram/Resources/icons/limits/chats.png b/Telegram/Resources/icons/limits/chats.png new file mode 100644 index 000000000..2c3815a8e Binary files /dev/null and b/Telegram/Resources/icons/limits/chats.png differ diff --git a/Telegram/Resources/icons/limits/chats@2x.png b/Telegram/Resources/icons/limits/chats@2x.png new file mode 100644 index 000000000..414acb193 Binary files /dev/null and b/Telegram/Resources/icons/limits/chats@2x.png differ diff --git a/Telegram/Resources/icons/limits/chats@3x.png b/Telegram/Resources/icons/limits/chats@3x.png new file mode 100644 index 000000000..c814dd199 Binary files /dev/null and b/Telegram/Resources/icons/limits/chats@3x.png differ diff --git a/Telegram/Resources/icons/limits/files.png b/Telegram/Resources/icons/limits/files.png new file mode 100644 index 000000000..48ed2f5d9 Binary files /dev/null and b/Telegram/Resources/icons/limits/files.png differ diff --git a/Telegram/Resources/icons/limits/files@2x.png b/Telegram/Resources/icons/limits/files@2x.png new file mode 100644 index 000000000..368d56ca9 Binary files /dev/null and b/Telegram/Resources/icons/limits/files@2x.png differ diff --git a/Telegram/Resources/icons/limits/files@3x.png b/Telegram/Resources/icons/limits/files@3x.png new file mode 100644 index 000000000..8b204778c Binary files /dev/null and b/Telegram/Resources/icons/limits/files@3x.png differ diff --git a/Telegram/Resources/icons/limits/folders.png b/Telegram/Resources/icons/limits/folders.png new file mode 100644 index 000000000..6c94dab31 Binary files /dev/null and b/Telegram/Resources/icons/limits/folders.png differ diff --git a/Telegram/Resources/icons/limits/folders@2x.png b/Telegram/Resources/icons/limits/folders@2x.png new file mode 100644 index 000000000..6372f5a9a Binary files /dev/null and b/Telegram/Resources/icons/limits/folders@2x.png differ diff --git a/Telegram/Resources/icons/limits/folders@3x.png b/Telegram/Resources/icons/limits/folders@3x.png new file mode 100644 index 000000000..0c515302e Binary files /dev/null and b/Telegram/Resources/icons/limits/folders@3x.png differ diff --git a/Telegram/Resources/icons/limits/groups.png b/Telegram/Resources/icons/limits/groups.png new file mode 100644 index 000000000..06948fb75 Binary files /dev/null and b/Telegram/Resources/icons/limits/groups.png differ diff --git a/Telegram/Resources/icons/limits/groups@2x.png b/Telegram/Resources/icons/limits/groups@2x.png new file mode 100644 index 000000000..b4176982e Binary files /dev/null and b/Telegram/Resources/icons/limits/groups@2x.png differ diff --git a/Telegram/Resources/icons/limits/groups@3x.png b/Telegram/Resources/icons/limits/groups@3x.png new file mode 100644 index 000000000..ba35f5398 Binary files /dev/null and b/Telegram/Resources/icons/limits/groups@3x.png differ diff --git a/Telegram/Resources/icons/limits/links.png b/Telegram/Resources/icons/limits/links.png new file mode 100644 index 000000000..96d576129 Binary files /dev/null and b/Telegram/Resources/icons/limits/links.png differ diff --git a/Telegram/Resources/icons/limits/links@2x.png b/Telegram/Resources/icons/limits/links@2x.png new file mode 100644 index 000000000..90ac07fdd Binary files /dev/null and b/Telegram/Resources/icons/limits/links@2x.png differ diff --git a/Telegram/Resources/icons/limits/links@3x.png b/Telegram/Resources/icons/limits/links@3x.png new file mode 100644 index 000000000..926a5ad40 Binary files /dev/null and b/Telegram/Resources/icons/limits/links@3x.png differ diff --git a/Telegram/Resources/icons/limits/pins.png b/Telegram/Resources/icons/limits/pins.png new file mode 100644 index 000000000..572cffebf Binary files /dev/null and b/Telegram/Resources/icons/limits/pins.png differ diff --git a/Telegram/Resources/icons/limits/pins@2x.png b/Telegram/Resources/icons/limits/pins@2x.png new file mode 100644 index 000000000..a1f4bbd40 Binary files /dev/null and b/Telegram/Resources/icons/limits/pins@2x.png differ diff --git a/Telegram/Resources/icons/limits/pins@3x.png b/Telegram/Resources/icons/limits/pins@3x.png new file mode 100644 index 000000000..a7bfe571a Binary files /dev/null and b/Telegram/Resources/icons/limits/pins@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/download.png b/Telegram/Resources/icons/mediaview/download.png new file mode 100644 index 000000000..1c15631e5 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/download.png differ diff --git a/Telegram/Resources/icons/mediaview/download@2x.png b/Telegram/Resources/icons/mediaview/download@2x.png new file mode 100644 index 000000000..36edd45eb Binary files /dev/null and b/Telegram/Resources/icons/mediaview/download@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/download@3x.png b/Telegram/Resources/icons/mediaview/download@3x.png new file mode 100644 index 000000000..ff3e812ec Binary files /dev/null and b/Telegram/Resources/icons/mediaview/download@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/download_locked.png b/Telegram/Resources/icons/mediaview/download_locked.png new file mode 100644 index 000000000..206d5893d Binary files /dev/null and b/Telegram/Resources/icons/mediaview/download_locked.png differ diff --git a/Telegram/Resources/icons/mediaview/download_locked@2x.png b/Telegram/Resources/icons/mediaview/download_locked@2x.png new file mode 100644 index 000000000..46bac9086 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/download_locked@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/download_locked@3x.png b/Telegram/Resources/icons/mediaview/download_locked@3x.png new file mode 100644 index 000000000..57752e830 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/download_locked@3x.png differ diff --git a/Telegram/Resources/icons/mediaview_file_corner.png b/Telegram/Resources/icons/mediaview/file_corner.png similarity index 100% rename from Telegram/Resources/icons/mediaview_file_corner.png rename to Telegram/Resources/icons/mediaview/file_corner.png diff --git a/Telegram/Resources/icons/mediaview_file_corner@2x.png b/Telegram/Resources/icons/mediaview/file_corner@2x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_file_corner@2x.png rename to Telegram/Resources/icons/mediaview/file_corner@2x.png diff --git a/Telegram/Resources/icons/mediaview_file_corner@3x.png b/Telegram/Resources/icons/mediaview/file_corner@3x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_file_corner@3x.png rename to Telegram/Resources/icons/mediaview/file_corner@3x.png diff --git a/Telegram/Resources/icons/mediaview/mini_close_friends.png b/Telegram/Resources/icons/mediaview/mini_close_friends.png new file mode 100644 index 000000000..5c3072447 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/mini_close_friends.png differ diff --git a/Telegram/Resources/icons/mediaview/mini_close_friends@2x.png b/Telegram/Resources/icons/mediaview/mini_close_friends@2x.png new file mode 100644 index 000000000..82dd44af9 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/mini_close_friends@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/mini_close_friends@3x.png b/Telegram/Resources/icons/mediaview/mini_close_friends@3x.png new file mode 100644 index 000000000..1f024ce73 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/mini_close_friends@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/mini_contacts.png b/Telegram/Resources/icons/mediaview/mini_contacts.png new file mode 100644 index 000000000..bc716cab4 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/mini_contacts.png differ diff --git a/Telegram/Resources/icons/mediaview/mini_contacts@2x.png b/Telegram/Resources/icons/mediaview/mini_contacts@2x.png new file mode 100644 index 000000000..a7df593e8 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/mini_contacts@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/mini_contacts@3x.png b/Telegram/Resources/icons/mediaview/mini_contacts@3x.png new file mode 100644 index 000000000..50c9ff55f Binary files /dev/null and b/Telegram/Resources/icons/mediaview/mini_contacts@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/mini_repost.png b/Telegram/Resources/icons/mediaview/mini_repost.png new file mode 100644 index 000000000..95e0e71eb Binary files /dev/null and b/Telegram/Resources/icons/mediaview/mini_repost.png differ diff --git a/Telegram/Resources/icons/mediaview/mini_repost@2x.png b/Telegram/Resources/icons/mediaview/mini_repost@2x.png new file mode 100644 index 000000000..47e5fd6af Binary files /dev/null and b/Telegram/Resources/icons/mediaview/mini_repost@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/mini_repost@3x.png b/Telegram/Resources/icons/mediaview/mini_repost@3x.png new file mode 100644 index 000000000..3b73fe2d3 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/mini_repost@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/mini_selected_contacts.png b/Telegram/Resources/icons/mediaview/mini_selected_contacts.png new file mode 100644 index 000000000..c3ca5b06d Binary files /dev/null and b/Telegram/Resources/icons/mediaview/mini_selected_contacts.png differ diff --git a/Telegram/Resources/icons/mediaview/mini_selected_contacts@2x.png b/Telegram/Resources/icons/mediaview/mini_selected_contacts@2x.png new file mode 100644 index 000000000..d12f95496 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/mini_selected_contacts@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/mini_selected_contacts@3x.png b/Telegram/Resources/icons/mediaview/mini_selected_contacts@3x.png new file mode 100644 index 000000000..90860348b Binary files /dev/null and b/Telegram/Resources/icons/mediaview/mini_selected_contacts@3x.png differ diff --git a/Telegram/Resources/icons/mediaview_more.png b/Telegram/Resources/icons/mediaview/more.png similarity index 100% rename from Telegram/Resources/icons/mediaview_more.png rename to Telegram/Resources/icons/mediaview/more.png diff --git a/Telegram/Resources/icons/mediaview_more@2x.png b/Telegram/Resources/icons/mediaview/more@2x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_more@2x.png rename to Telegram/Resources/icons/mediaview/more@2x.png diff --git a/Telegram/Resources/icons/mediaview_more@3x.png b/Telegram/Resources/icons/mediaview/more@3x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_more@3x.png rename to Telegram/Resources/icons/mediaview/more@3x.png diff --git a/Telegram/Resources/icons/mediaview/next.png b/Telegram/Resources/icons/mediaview/next.png new file mode 100644 index 000000000..785425070 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/next.png differ diff --git a/Telegram/Resources/icons/mediaview/next@2x.png b/Telegram/Resources/icons/mediaview/next@2x.png new file mode 100644 index 000000000..81c5463d8 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/next@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/next@3x.png b/Telegram/Resources/icons/mediaview/next@3x.png new file mode 100644 index 000000000..8bc7d530c Binary files /dev/null and b/Telegram/Resources/icons/mediaview/next@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/next_shadow.png b/Telegram/Resources/icons/mediaview/next_shadow.png new file mode 100644 index 000000000..0e432c95a Binary files /dev/null and b/Telegram/Resources/icons/mediaview/next_shadow.png differ diff --git a/Telegram/Resources/icons/mediaview/next_shadow@2x.png b/Telegram/Resources/icons/mediaview/next_shadow@2x.png new file mode 100644 index 000000000..bcf60caa7 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/next_shadow@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/next_shadow@3x.png b/Telegram/Resources/icons/mediaview/next_shadow@3x.png new file mode 100644 index 000000000..48eb42399 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/next_shadow@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/rotate.png b/Telegram/Resources/icons/mediaview/rotate.png new file mode 100644 index 000000000..14104385b Binary files /dev/null and b/Telegram/Resources/icons/mediaview/rotate.png differ diff --git a/Telegram/Resources/icons/mediaview/rotate@2x.png b/Telegram/Resources/icons/mediaview/rotate@2x.png new file mode 100644 index 000000000..a846ec5bf Binary files /dev/null and b/Telegram/Resources/icons/mediaview/rotate@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/rotate@3x.png b/Telegram/Resources/icons/mediaview/rotate@3x.png new file mode 100644 index 000000000..bfa39cd9f Binary files /dev/null and b/Telegram/Resources/icons/mediaview/rotate@3x.png differ diff --git a/Telegram/Resources/icons/mediaview_save_check.png b/Telegram/Resources/icons/mediaview/save_check.png similarity index 100% rename from Telegram/Resources/icons/mediaview_save_check.png rename to Telegram/Resources/icons/mediaview/save_check.png diff --git a/Telegram/Resources/icons/mediaview_save_check@2x.png b/Telegram/Resources/icons/mediaview/save_check@2x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_save_check@2x.png rename to Telegram/Resources/icons/mediaview/save_check@2x.png diff --git a/Telegram/Resources/icons/mediaview_save_check@3x.png b/Telegram/Resources/icons/mediaview/save_check@3x.png similarity index 100% rename from Telegram/Resources/icons/mediaview_save_check@3x.png rename to Telegram/Resources/icons/mediaview/save_check@3x.png diff --git a/Telegram/Resources/icons/mediaview/shadow_bottom.png b/Telegram/Resources/icons/mediaview/shadow_bottom.png new file mode 100644 index 000000000..bd3799f32 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/shadow_bottom.png differ diff --git a/Telegram/Resources/icons/mediaview/shadow_bottom@2x.png b/Telegram/Resources/icons/mediaview/shadow_bottom@2x.png new file mode 100644 index 000000000..72a588323 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/shadow_bottom@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/shadow_bottom@3x.png b/Telegram/Resources/icons/mediaview/shadow_bottom@3x.png new file mode 100644 index 000000000..3870e77d2 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/shadow_bottom@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/shadow_top.png b/Telegram/Resources/icons/mediaview/shadow_top.png new file mode 100644 index 000000000..bc809219f Binary files /dev/null and b/Telegram/Resources/icons/mediaview/shadow_top.png differ diff --git a/Telegram/Resources/icons/mediaview/shadow_top@2x.png b/Telegram/Resources/icons/mediaview/shadow_top@2x.png new file mode 100644 index 000000000..2c329add7 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/shadow_top@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/shadow_top@3x.png b/Telegram/Resources/icons/mediaview/shadow_top@3x.png new file mode 100644 index 000000000..57d6e4fdb Binary files /dev/null and b/Telegram/Resources/icons/mediaview/shadow_top@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_button_close_mac.png b/Telegram/Resources/icons/mediaview/title_button_close_mac.png new file mode 100644 index 000000000..8df83a2d7 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_button_close_mac.png differ diff --git a/Telegram/Resources/icons/mediaview/title_button_close_mac@2x.png b/Telegram/Resources/icons/mediaview/title_button_close_mac@2x.png new file mode 100644 index 000000000..e35cd25b9 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_button_close_mac@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_button_close_mac@3x.png b/Telegram/Resources/icons/mediaview/title_button_close_mac@3x.png new file mode 100644 index 000000000..ede3dd807 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_button_close_mac@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_button_mac.png b/Telegram/Resources/icons/mediaview/title_button_mac.png new file mode 100644 index 000000000..258c40348 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_button_mac.png differ diff --git a/Telegram/Resources/icons/mediaview/title_button_mac@2x.png b/Telegram/Resources/icons/mediaview/title_button_mac@2x.png new file mode 100644 index 000000000..411f40563 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_button_mac@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_button_mac@3x.png b/Telegram/Resources/icons/mediaview/title_button_mac@3x.png new file mode 100644 index 000000000..e9add22c2 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_button_mac@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_button_maximize_mac.png b/Telegram/Resources/icons/mediaview/title_button_maximize_mac.png new file mode 100644 index 000000000..76b05acab Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_button_maximize_mac.png differ diff --git a/Telegram/Resources/icons/mediaview/title_button_maximize_mac@2x.png b/Telegram/Resources/icons/mediaview/title_button_maximize_mac@2x.png new file mode 100644 index 000000000..4a09bdeb6 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_button_maximize_mac@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_button_maximize_mac@3x.png b/Telegram/Resources/icons/mediaview/title_button_maximize_mac@3x.png new file mode 100644 index 000000000..b832a810e Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_button_maximize_mac@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_button_minimize_mac.png b/Telegram/Resources/icons/mediaview/title_button_minimize_mac.png new file mode 100644 index 000000000..494cbd965 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_button_minimize_mac.png differ diff --git a/Telegram/Resources/icons/mediaview/title_button_minimize_mac@2x.png b/Telegram/Resources/icons/mediaview/title_button_minimize_mac@2x.png new file mode 100644 index 000000000..4aa1c2152 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_button_minimize_mac@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_button_minimize_mac@3x.png b/Telegram/Resources/icons/mediaview/title_button_minimize_mac@3x.png new file mode 100644 index 000000000..1fa050c8e Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_button_minimize_mac@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_button_shadow_mac.png b/Telegram/Resources/icons/mediaview/title_button_shadow_mac.png new file mode 100644 index 000000000..10b33a61a Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_button_shadow_mac.png differ diff --git a/Telegram/Resources/icons/mediaview/title_button_shadow_mac@2x.png b/Telegram/Resources/icons/mediaview/title_button_shadow_mac@2x.png new file mode 100644 index 000000000..5b62a0987 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_button_shadow_mac@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_button_shadow_mac@3x.png b/Telegram/Resources/icons/mediaview/title_button_shadow_mac@3x.png new file mode 100644 index 000000000..a358b377e Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_button_shadow_mac@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_button_shrink_mac.png b/Telegram/Resources/icons/mediaview/title_button_shrink_mac.png new file mode 100644 index 000000000..b5d8829bc Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_button_shrink_mac.png differ diff --git a/Telegram/Resources/icons/mediaview/title_button_shrink_mac@2x.png b/Telegram/Resources/icons/mediaview/title_button_shrink_mac@2x.png new file mode 100644 index 000000000..249011ff3 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_button_shrink_mac@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_button_shrink_mac@3x.png b/Telegram/Resources/icons/mediaview/title_button_shrink_mac@3x.png new file mode 100644 index 000000000..fda973db0 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_button_shrink_mac@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_close.png b/Telegram/Resources/icons/mediaview/title_viewer_button_close.png new file mode 100644 index 000000000..6cacc40cf Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_close.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_close@2x.png b/Telegram/Resources/icons/mediaview/title_viewer_button_close@2x.png new file mode 100644 index 000000000..04a35b7db Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_close@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_close@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_button_close@3x.png new file mode 100644 index 000000000..74b637e15 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_close@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_maximize.png b/Telegram/Resources/icons/mediaview/title_viewer_button_maximize.png new file mode 100644 index 000000000..0023e0551 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_maximize.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_maximize@2x.png b/Telegram/Resources/icons/mediaview/title_viewer_button_maximize@2x.png new file mode 100644 index 000000000..8b8b2f1ad Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_maximize@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_maximize@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_button_maximize@3x.png new file mode 100644 index 000000000..a36a73d54 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_maximize@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_minimize.png b/Telegram/Resources/icons/mediaview/title_viewer_button_minimize.png new file mode 100644 index 000000000..b1577578a Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_minimize.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_minimize@2x.png b/Telegram/Resources/icons/mediaview/title_viewer_button_minimize@2x.png new file mode 100644 index 000000000..fc183b360 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_minimize@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_minimize@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_button_minimize@3x.png new file mode 100644 index 000000000..e7336cef3 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_minimize@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_restore.png b/Telegram/Resources/icons/mediaview/title_viewer_button_restore.png new file mode 100644 index 000000000..a171db17b Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_restore.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_restore@2x.png b/Telegram/Resources/icons/mediaview/title_viewer_button_restore@2x.png new file mode 100644 index 000000000..a62d1a7e1 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_restore@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_restore@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_button_restore@3x.png new file mode 100644 index 000000000..1651e5d62 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_button_restore@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_close.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_close.png new file mode 100644 index 000000000..9f319e196 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_close.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_close@2x.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_close@2x.png new file mode 100644 index 000000000..088b66f1c Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_close@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_close@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_close@3x.png new file mode 100644 index 000000000..2ee92d25b Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_close@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize.png new file mode 100644 index 000000000..69cd79d4e Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize@2x.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize@2x.png new file mode 100644 index 000000000..cc39d499f Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize@3x.png new file mode 100644 index 000000000..11d3a9f35 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize.png new file mode 100644 index 000000000..89a0f911e Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize@2x.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize@2x.png new file mode 100644 index 000000000..368a4b1d2 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize@3x.png new file mode 100644 index 000000000..df9993eef Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_minimize@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_restore.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_restore.png new file mode 100644 index 000000000..ec21a77d6 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_restore.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_restore@2x.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_restore@2x.png new file mode 100644 index 000000000..c516259aa Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_restore@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_restore@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_restore@3x.png new file mode 100644 index 000000000..4952b8c87 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/title_viewer_shadow_restore@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/viewer_share.png b/Telegram/Resources/icons/mediaview/viewer_share.png new file mode 100644 index 000000000..14861b1ee Binary files /dev/null and b/Telegram/Resources/icons/mediaview/viewer_share.png differ diff --git a/Telegram/Resources/icons/mediaview/viewer_share@2x.png b/Telegram/Resources/icons/mediaview/viewer_share@2x.png new file mode 100644 index 000000000..7c6e9341e Binary files /dev/null and b/Telegram/Resources/icons/mediaview/viewer_share@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/viewer_share@3x.png b/Telegram/Resources/icons/mediaview/viewer_share@3x.png new file mode 100644 index 000000000..43310c895 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/viewer_share@3x.png differ diff --git a/Telegram/Resources/icons/mediaview/views.png b/Telegram/Resources/icons/mediaview/views.png new file mode 100644 index 000000000..e8496be33 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/views.png differ diff --git a/Telegram/Resources/icons/mediaview/views@2x.png b/Telegram/Resources/icons/mediaview/views@2x.png new file mode 100644 index 000000000..30b516900 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/views@2x.png differ diff --git a/Telegram/Resources/icons/mediaview/views@3x.png b/Telegram/Resources/icons/mediaview/views@3x.png new file mode 100644 index 000000000..523f11cc8 Binary files /dev/null and b/Telegram/Resources/icons/mediaview/views@3x.png differ diff --git a/Telegram/Resources/icons/mediaview_close.png b/Telegram/Resources/icons/mediaview_close.png deleted file mode 100644 index 891b4735a..000000000 Binary files a/Telegram/Resources/icons/mediaview_close.png and /dev/null differ diff --git a/Telegram/Resources/icons/mediaview_close@2x.png b/Telegram/Resources/icons/mediaview_close@2x.png deleted file mode 100644 index 03995759f..000000000 Binary files a/Telegram/Resources/icons/mediaview_close@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/mediaview_close@3x.png b/Telegram/Resources/icons/mediaview_close@3x.png deleted file mode 100644 index b52db954c..000000000 Binary files a/Telegram/Resources/icons/mediaview_close@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/mediaview_download.png b/Telegram/Resources/icons/mediaview_download.png deleted file mode 100644 index 8866edd51..000000000 Binary files a/Telegram/Resources/icons/mediaview_download.png and /dev/null differ diff --git a/Telegram/Resources/icons/mediaview_download@2x.png b/Telegram/Resources/icons/mediaview_download@2x.png deleted file mode 100644 index e5c3cf39f..000000000 Binary files a/Telegram/Resources/icons/mediaview_download@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/mediaview_download@3x.png b/Telegram/Resources/icons/mediaview_download@3x.png deleted file mode 100644 index 20e22ce52..000000000 Binary files a/Telegram/Resources/icons/mediaview_download@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/mediaview_next.png b/Telegram/Resources/icons/mediaview_next.png deleted file mode 100644 index 8a1869c77..000000000 Binary files a/Telegram/Resources/icons/mediaview_next.png and /dev/null differ diff --git a/Telegram/Resources/icons/mediaview_next@2x.png b/Telegram/Resources/icons/mediaview_next@2x.png deleted file mode 100644 index 360fae2ce..000000000 Binary files a/Telegram/Resources/icons/mediaview_next@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/mediaview_next@3x.png b/Telegram/Resources/icons/mediaview_next@3x.png deleted file mode 100644 index 06197f226..000000000 Binary files a/Telegram/Resources/icons/mediaview_next@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/mediaview_rotate.png b/Telegram/Resources/icons/mediaview_rotate.png deleted file mode 100644 index 818a9b872..000000000 Binary files a/Telegram/Resources/icons/mediaview_rotate.png and /dev/null differ diff --git a/Telegram/Resources/icons/mediaview_rotate@2x.png b/Telegram/Resources/icons/mediaview_rotate@2x.png deleted file mode 100644 index 1fc04404b..000000000 Binary files a/Telegram/Resources/icons/mediaview_rotate@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/mediaview_rotate@3x.png b/Telegram/Resources/icons/mediaview_rotate@3x.png deleted file mode 100644 index 8369b477b..000000000 Binary files a/Telegram/Resources/icons/mediaview_rotate@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu/add_account.png b/Telegram/Resources/icons/menu/add_account.png index 535725f0b..9dfe9df6a 100644 Binary files a/Telegram/Resources/icons/menu/add_account.png and b/Telegram/Resources/icons/menu/add_account.png differ diff --git a/Telegram/Resources/icons/menu/add_account@2x.png b/Telegram/Resources/icons/menu/add_account@2x.png index ef74df51a..820c83d6a 100644 Binary files a/Telegram/Resources/icons/menu/add_account@2x.png and b/Telegram/Resources/icons/menu/add_account@2x.png differ diff --git a/Telegram/Resources/icons/menu/add_account@3x.png b/Telegram/Resources/icons/menu/add_account@3x.png index 22d6c56c4..31edceebe 100644 Binary files a/Telegram/Resources/icons/menu/add_account@3x.png and b/Telegram/Resources/icons/menu/add_account@3x.png differ diff --git a/Telegram/Resources/icons/menu/add_to_folder.png b/Telegram/Resources/icons/menu/add_to_folder.png new file mode 100644 index 000000000..bf27766b5 Binary files /dev/null and b/Telegram/Resources/icons/menu/add_to_folder.png differ diff --git a/Telegram/Resources/icons/menu/add_to_folder@2x.png b/Telegram/Resources/icons/menu/add_to_folder@2x.png new file mode 100644 index 000000000..57e8540b3 Binary files /dev/null and b/Telegram/Resources/icons/menu/add_to_folder@2x.png differ diff --git a/Telegram/Resources/icons/menu/add_to_folder@3x.png b/Telegram/Resources/icons/menu/add_to_folder@3x.png new file mode 100644 index 000000000..169156cac Binary files /dev/null and b/Telegram/Resources/icons/menu/add_to_folder@3x.png differ diff --git a/Telegram/Resources/icons/menu/admin.png b/Telegram/Resources/icons/menu/admin.png index 6ddda6a10..9afd2a2f6 100644 Binary files a/Telegram/Resources/icons/menu/admin.png and b/Telegram/Resources/icons/menu/admin.png differ diff --git a/Telegram/Resources/icons/menu/admin@2x.png b/Telegram/Resources/icons/menu/admin@2x.png index d63fde8cc..4ab83131b 100644 Binary files a/Telegram/Resources/icons/menu/admin@2x.png and b/Telegram/Resources/icons/menu/admin@2x.png differ diff --git a/Telegram/Resources/icons/menu/admin@3x.png b/Telegram/Resources/icons/menu/admin@3x.png index 6d87a2798..20dd81cc4 100644 Binary files a/Telegram/Resources/icons/menu/admin@3x.png and b/Telegram/Resources/icons/menu/admin@3x.png differ diff --git a/Telegram/Resources/icons/menu/admin_promote.png b/Telegram/Resources/icons/menu/admin_promote.png index 9ad438f57..bae252d5b 100644 Binary files a/Telegram/Resources/icons/menu/admin_promote.png and b/Telegram/Resources/icons/menu/admin_promote.png differ diff --git a/Telegram/Resources/icons/menu/admin_promote@2x.png b/Telegram/Resources/icons/menu/admin_promote@2x.png index f76977c15..14c75ec93 100644 Binary files a/Telegram/Resources/icons/menu/admin_promote@2x.png and b/Telegram/Resources/icons/menu/admin_promote@2x.png differ diff --git a/Telegram/Resources/icons/menu/admin_promote@3x.png b/Telegram/Resources/icons/menu/admin_promote@3x.png index 2ab636832..444f63830 100644 Binary files a/Telegram/Resources/icons/menu/admin_promote@3x.png and b/Telegram/Resources/icons/menu/admin_promote@3x.png differ diff --git a/Telegram/Resources/icons/menu/all_media.png b/Telegram/Resources/icons/menu/all_media.png index 7d8119b3d..e19e8fb36 100644 Binary files a/Telegram/Resources/icons/menu/all_media.png and b/Telegram/Resources/icons/menu/all_media.png differ diff --git a/Telegram/Resources/icons/menu/all_media@2x.png b/Telegram/Resources/icons/menu/all_media@2x.png index a689a34bb..53cb43f0b 100644 Binary files a/Telegram/Resources/icons/menu/all_media@2x.png and b/Telegram/Resources/icons/menu/all_media@2x.png differ diff --git a/Telegram/Resources/icons/menu/all_media@3x.png b/Telegram/Resources/icons/menu/all_media@3x.png index d5390cc6d..6b95bd2d8 100644 Binary files a/Telegram/Resources/icons/menu/all_media@3x.png and b/Telegram/Resources/icons/menu/all_media@3x.png differ diff --git a/Telegram/Resources/icons/menu/antispam.png b/Telegram/Resources/icons/menu/antispam.png new file mode 100644 index 000000000..201dd2fbb Binary files /dev/null and b/Telegram/Resources/icons/menu/antispam.png differ diff --git a/Telegram/Resources/icons/menu/antispam@2x.png b/Telegram/Resources/icons/menu/antispam@2x.png new file mode 100644 index 000000000..f465352f2 Binary files /dev/null and b/Telegram/Resources/icons/menu/antispam@2x.png differ diff --git a/Telegram/Resources/icons/menu/antispam@3x.png b/Telegram/Resources/icons/menu/antispam@3x.png new file mode 100644 index 000000000..43e7f8778 Binary files /dev/null and b/Telegram/Resources/icons/menu/antispam@3x.png differ diff --git a/Telegram/Resources/icons/menu/archive.png b/Telegram/Resources/icons/menu/archive.png index 4fce81e92..0f310903e 100644 Binary files a/Telegram/Resources/icons/menu/archive.png and b/Telegram/Resources/icons/menu/archive.png differ diff --git a/Telegram/Resources/icons/menu/archive@2x.png b/Telegram/Resources/icons/menu/archive@2x.png index feb6cab45..4e096974a 100644 Binary files a/Telegram/Resources/icons/menu/archive@2x.png and b/Telegram/Resources/icons/menu/archive@2x.png differ diff --git a/Telegram/Resources/icons/menu/archive@3x.png b/Telegram/Resources/icons/menu/archive@3x.png index 9be5d6369..acb069114 100644 Binary files a/Telegram/Resources/icons/menu/archive@3x.png and b/Telegram/Resources/icons/menu/archive@3x.png differ diff --git a/Telegram/Resources/icons/menu/archive_open.png b/Telegram/Resources/icons/menu/archive_open.png new file mode 100644 index 000000000..2e3090130 Binary files /dev/null and b/Telegram/Resources/icons/menu/archive_open.png differ diff --git a/Telegram/Resources/icons/menu/archive_open@2x.png b/Telegram/Resources/icons/menu/archive_open@2x.png new file mode 100644 index 000000000..c95bd9f66 Binary files /dev/null and b/Telegram/Resources/icons/menu/archive_open@2x.png differ diff --git a/Telegram/Resources/icons/menu/archive_open@3x.png b/Telegram/Resources/icons/menu/archive_open@3x.png new file mode 100644 index 000000000..74687f9ec Binary files /dev/null and b/Telegram/Resources/icons/menu/archive_open@3x.png differ diff --git a/Telegram/Resources/icons/menu/auto_delete.png b/Telegram/Resources/icons/menu/auto_delete.png new file mode 100644 index 000000000..c1fd7790c Binary files /dev/null and b/Telegram/Resources/icons/menu/auto_delete.png differ diff --git a/Telegram/Resources/icons/menu/auto_delete@2x.png b/Telegram/Resources/icons/menu/auto_delete@2x.png new file mode 100644 index 000000000..72a6c2279 Binary files /dev/null and b/Telegram/Resources/icons/menu/auto_delete@2x.png differ diff --git a/Telegram/Resources/icons/menu/auto_delete@3x.png b/Telegram/Resources/icons/menu/auto_delete@3x.png new file mode 100644 index 000000000..73a58632e Binary files /dev/null and b/Telegram/Resources/icons/menu/auto_delete@3x.png differ diff --git a/Telegram/Resources/icons/menu/auto_delete_plain.png b/Telegram/Resources/icons/menu/auto_delete_plain.png new file mode 100644 index 000000000..a5da8a94a Binary files /dev/null and b/Telegram/Resources/icons/menu/auto_delete_plain.png differ diff --git a/Telegram/Resources/icons/menu/auto_delete_plain@2x.png b/Telegram/Resources/icons/menu/auto_delete_plain@2x.png new file mode 100644 index 000000000..f855a5bcd Binary files /dev/null and b/Telegram/Resources/icons/menu/auto_delete_plain@2x.png differ diff --git a/Telegram/Resources/icons/menu/auto_delete_plain@3x.png b/Telegram/Resources/icons/menu/auto_delete_plain@3x.png new file mode 100644 index 000000000..5d034aec6 Binary files /dev/null and b/Telegram/Resources/icons/menu/auto_delete_plain@3x.png differ diff --git a/Telegram/Resources/icons/menu/block.png b/Telegram/Resources/icons/menu/block.png index 6c81ea74d..5cf611982 100644 Binary files a/Telegram/Resources/icons/menu/block.png and b/Telegram/Resources/icons/menu/block.png differ diff --git a/Telegram/Resources/icons/menu/block@2x.png b/Telegram/Resources/icons/menu/block@2x.png index 90612c87d..cc84bda3c 100644 Binary files a/Telegram/Resources/icons/menu/block@2x.png and b/Telegram/Resources/icons/menu/block@2x.png differ diff --git a/Telegram/Resources/icons/menu/block@3x.png b/Telegram/Resources/icons/menu/block@3x.png index 7eb4c2925..5c5627253 100644 Binary files a/Telegram/Resources/icons/menu/block@3x.png and b/Telegram/Resources/icons/menu/block@3x.png differ diff --git a/Telegram/Resources/icons/menu/boosts.png b/Telegram/Resources/icons/menu/boosts.png new file mode 100644 index 000000000..64a5ae3b9 Binary files /dev/null and b/Telegram/Resources/icons/menu/boosts.png differ diff --git a/Telegram/Resources/icons/menu/boosts@2x.png b/Telegram/Resources/icons/menu/boosts@2x.png new file mode 100644 index 000000000..0478fa660 Binary files /dev/null and b/Telegram/Resources/icons/menu/boosts@2x.png differ diff --git a/Telegram/Resources/icons/menu/boosts@3x.png b/Telegram/Resources/icons/menu/boosts@3x.png new file mode 100644 index 000000000..33590248c Binary files /dev/null and b/Telegram/Resources/icons/menu/boosts@3x.png differ diff --git a/Telegram/Resources/icons/menu/bot_commands.png b/Telegram/Resources/icons/menu/bot_commands.png new file mode 100644 index 000000000..198b475be Binary files /dev/null and b/Telegram/Resources/icons/menu/bot_commands.png differ diff --git a/Telegram/Resources/icons/menu/bot_commands@2x.png b/Telegram/Resources/icons/menu/bot_commands@2x.png new file mode 100644 index 000000000..2ab6754f8 Binary files /dev/null and b/Telegram/Resources/icons/menu/bot_commands@2x.png differ diff --git a/Telegram/Resources/icons/menu/bot_commands@3x.png b/Telegram/Resources/icons/menu/bot_commands@3x.png new file mode 100644 index 000000000..1d0974ca4 Binary files /dev/null and b/Telegram/Resources/icons/menu/bot_commands@3x.png differ diff --git a/Telegram/Resources/icons/menu/calendar.png b/Telegram/Resources/icons/menu/calendar.png index b61e0f528..97b1ec554 100644 Binary files a/Telegram/Resources/icons/menu/calendar.png and b/Telegram/Resources/icons/menu/calendar.png differ diff --git a/Telegram/Resources/icons/menu/calendar@2x.png b/Telegram/Resources/icons/menu/calendar@2x.png index 7fbdb5060..bda0f3fb5 100644 Binary files a/Telegram/Resources/icons/menu/calendar@2x.png and b/Telegram/Resources/icons/menu/calendar@2x.png differ diff --git a/Telegram/Resources/icons/menu/calendar@3x.png b/Telegram/Resources/icons/menu/calendar@3x.png index 5f9447922..9721e515b 100644 Binary files a/Telegram/Resources/icons/menu/calendar@3x.png and b/Telegram/Resources/icons/menu/calendar@3x.png differ diff --git a/Telegram/Resources/icons/menu/calls_receive.png b/Telegram/Resources/icons/menu/calls_receive.png new file mode 100644 index 000000000..cfe1f6699 Binary files /dev/null and b/Telegram/Resources/icons/menu/calls_receive.png differ diff --git a/Telegram/Resources/icons/menu/calls_receive@2x.png b/Telegram/Resources/icons/menu/calls_receive@2x.png new file mode 100644 index 000000000..83e8e622d Binary files /dev/null and b/Telegram/Resources/icons/menu/calls_receive@2x.png differ diff --git a/Telegram/Resources/icons/menu/calls_receive@3x.png b/Telegram/Resources/icons/menu/calls_receive@3x.png new file mode 100644 index 000000000..a74e596a7 Binary files /dev/null and b/Telegram/Resources/icons/menu/calls_receive@3x.png differ diff --git a/Telegram/Resources/icons/menu/cancel.png b/Telegram/Resources/icons/menu/cancel.png index c52cecef6..5b77f7a46 100644 Binary files a/Telegram/Resources/icons/menu/cancel.png and b/Telegram/Resources/icons/menu/cancel.png differ diff --git a/Telegram/Resources/icons/menu/cancel@2x.png b/Telegram/Resources/icons/menu/cancel@2x.png index 2bb92f3ee..667ee8024 100644 Binary files a/Telegram/Resources/icons/menu/cancel@2x.png and b/Telegram/Resources/icons/menu/cancel@2x.png differ diff --git a/Telegram/Resources/icons/menu/cancel@3x.png b/Telegram/Resources/icons/menu/cancel@3x.png index 3114f1ec0..0144388a9 100644 Binary files a/Telegram/Resources/icons/menu/cancel@3x.png and b/Telegram/Resources/icons/menu/cancel@3x.png differ diff --git a/Telegram/Resources/icons/menu/channel.png b/Telegram/Resources/icons/menu/channel.png new file mode 100644 index 000000000..d6caf7131 Binary files /dev/null and b/Telegram/Resources/icons/menu/channel.png differ diff --git a/Telegram/Resources/icons/menu/channel@2x.png b/Telegram/Resources/icons/menu/channel@2x.png new file mode 100644 index 000000000..c68e6a6b0 Binary files /dev/null and b/Telegram/Resources/icons/menu/channel@2x.png differ diff --git a/Telegram/Resources/icons/menu/channel@3x.png b/Telegram/Resources/icons/menu/channel@3x.png new file mode 100644 index 000000000..0ce3d46a9 Binary files /dev/null and b/Telegram/Resources/icons/menu/channel@3x.png differ diff --git a/Telegram/Resources/icons/menu/chat_bubble.png b/Telegram/Resources/icons/menu/chat_bubble.png new file mode 100644 index 000000000..a22bd585d Binary files /dev/null and b/Telegram/Resources/icons/menu/chat_bubble.png differ diff --git a/Telegram/Resources/icons/menu/chat_bubble@2x.png b/Telegram/Resources/icons/menu/chat_bubble@2x.png new file mode 100644 index 000000000..8da64703f Binary files /dev/null and b/Telegram/Resources/icons/menu/chat_bubble@2x.png differ diff --git a/Telegram/Resources/icons/menu/chat_bubble@3x.png b/Telegram/Resources/icons/menu/chat_bubble@3x.png new file mode 100644 index 000000000..5862e9228 Binary files /dev/null and b/Telegram/Resources/icons/menu/chat_bubble@3x.png differ diff --git a/Telegram/Resources/icons/menu/chat_discuss.png b/Telegram/Resources/icons/menu/chat_discuss.png new file mode 100644 index 000000000..014033429 Binary files /dev/null and b/Telegram/Resources/icons/menu/chat_discuss.png differ diff --git a/Telegram/Resources/icons/menu/chat_discuss@2x.png b/Telegram/Resources/icons/menu/chat_discuss@2x.png new file mode 100644 index 000000000..2b266a33d Binary files /dev/null and b/Telegram/Resources/icons/menu/chat_discuss@2x.png differ diff --git a/Telegram/Resources/icons/menu/chat_discuss@3x.png b/Telegram/Resources/icons/menu/chat_discuss@3x.png new file mode 100644 index 000000000..2a54806d8 Binary files /dev/null and b/Telegram/Resources/icons/menu/chat_discuss@3x.png differ diff --git a/Telegram/Resources/icons/menu/clear.png b/Telegram/Resources/icons/menu/clear.png index 36dba229d..faea962c3 100644 Binary files a/Telegram/Resources/icons/menu/clear.png and b/Telegram/Resources/icons/menu/clear.png differ diff --git a/Telegram/Resources/icons/menu/clear@2x.png b/Telegram/Resources/icons/menu/clear@2x.png index 9b249b44c..01a732c06 100644 Binary files a/Telegram/Resources/icons/menu/clear@2x.png and b/Telegram/Resources/icons/menu/clear@2x.png differ diff --git a/Telegram/Resources/icons/menu/clear@3x.png b/Telegram/Resources/icons/menu/clear@3x.png index a83adaa89..726ab4059 100644 Binary files a/Telegram/Resources/icons/menu/clear@3x.png and b/Telegram/Resources/icons/menu/clear@3x.png differ diff --git a/Telegram/Resources/icons/menu/collapse.png b/Telegram/Resources/icons/menu/collapse.png index 956c75aa8..113fde444 100644 Binary files a/Telegram/Resources/icons/menu/collapse.png and b/Telegram/Resources/icons/menu/collapse.png differ diff --git a/Telegram/Resources/icons/menu/collapse@2x.png b/Telegram/Resources/icons/menu/collapse@2x.png index 028c6cf9b..9a8b776b8 100644 Binary files a/Telegram/Resources/icons/menu/collapse@2x.png and b/Telegram/Resources/icons/menu/collapse@2x.png differ diff --git a/Telegram/Resources/icons/menu/collapse@3x.png b/Telegram/Resources/icons/menu/collapse@3x.png index 1f4936b5d..f843963a3 100644 Binary files a/Telegram/Resources/icons/menu/collapse@3x.png and b/Telegram/Resources/icons/menu/collapse@3x.png differ diff --git a/Telegram/Resources/icons/menu/colors.png b/Telegram/Resources/icons/menu/colors.png index b4113d0f1..8e3cf9735 100644 Binary files a/Telegram/Resources/icons/menu/colors.png and b/Telegram/Resources/icons/menu/colors.png differ diff --git a/Telegram/Resources/icons/menu/colors@2x.png b/Telegram/Resources/icons/menu/colors@2x.png index 868687c0d..0f6ea0a2b 100644 Binary files a/Telegram/Resources/icons/menu/colors@2x.png and b/Telegram/Resources/icons/menu/colors@2x.png differ diff --git a/Telegram/Resources/icons/menu/colors@3x.png b/Telegram/Resources/icons/menu/colors@3x.png index 19641ef37..4acf319aa 100644 Binary files a/Telegram/Resources/icons/menu/colors@3x.png and b/Telegram/Resources/icons/menu/colors@3x.png differ diff --git a/Telegram/Resources/icons/menu/copy.png b/Telegram/Resources/icons/menu/copy.png index a7e8215e1..82e454de4 100644 Binary files a/Telegram/Resources/icons/menu/copy.png and b/Telegram/Resources/icons/menu/copy.png differ diff --git a/Telegram/Resources/icons/menu/copy@2x.png b/Telegram/Resources/icons/menu/copy@2x.png index 54a5623e6..e4e52ddb4 100644 Binary files a/Telegram/Resources/icons/menu/copy@2x.png and b/Telegram/Resources/icons/menu/copy@2x.png differ diff --git a/Telegram/Resources/icons/menu/copy@3x.png b/Telegram/Resources/icons/menu/copy@3x.png index 91f9b0582..7c3e6fc14 100644 Binary files a/Telegram/Resources/icons/menu/copy@3x.png and b/Telegram/Resources/icons/menu/copy@3x.png differ diff --git a/Telegram/Resources/icons/menu/copyright.png b/Telegram/Resources/icons/menu/copyright.png new file mode 100644 index 000000000..72b5630b5 Binary files /dev/null and b/Telegram/Resources/icons/menu/copyright.png differ diff --git a/Telegram/Resources/icons/menu/copyright@2x.png b/Telegram/Resources/icons/menu/copyright@2x.png new file mode 100644 index 000000000..7ad15646a Binary files /dev/null and b/Telegram/Resources/icons/menu/copyright@2x.png differ diff --git a/Telegram/Resources/icons/menu/copyright@3x.png b/Telegram/Resources/icons/menu/copyright@3x.png new file mode 100644 index 000000000..6ef3d5eb8 Binary files /dev/null and b/Telegram/Resources/icons/menu/copyright@3x.png differ diff --git a/Telegram/Resources/icons/menu/create_poll.png b/Telegram/Resources/icons/menu/create_poll.png index de5f8018f..f045a587f 100644 Binary files a/Telegram/Resources/icons/menu/create_poll.png and b/Telegram/Resources/icons/menu/create_poll.png differ diff --git a/Telegram/Resources/icons/menu/create_poll@2x.png b/Telegram/Resources/icons/menu/create_poll@2x.png index 99a38d215..8d88697fa 100644 Binary files a/Telegram/Resources/icons/menu/create_poll@2x.png and b/Telegram/Resources/icons/menu/create_poll@2x.png differ diff --git a/Telegram/Resources/icons/menu/create_poll@3x.png b/Telegram/Resources/icons/menu/create_poll@3x.png index 7e9732dc8..7bbba36fb 100644 Binary files a/Telegram/Resources/icons/menu/create_poll@3x.png and b/Telegram/Resources/icons/menu/create_poll@3x.png differ diff --git a/Telegram/Resources/icons/menu/customize.png b/Telegram/Resources/icons/menu/customize.png new file mode 100644 index 000000000..ef86a7a98 Binary files /dev/null and b/Telegram/Resources/icons/menu/customize.png differ diff --git a/Telegram/Resources/icons/menu/customize@2x.png b/Telegram/Resources/icons/menu/customize@2x.png new file mode 100644 index 000000000..4ed42cbaa Binary files /dev/null and b/Telegram/Resources/icons/menu/customize@2x.png differ diff --git a/Telegram/Resources/icons/menu/customize@3x.png b/Telegram/Resources/icons/menu/customize@3x.png new file mode 100644 index 000000000..87463e1af Binary files /dev/null and b/Telegram/Resources/icons/menu/customize@3x.png differ diff --git a/Telegram/Resources/icons/menu/delete.png b/Telegram/Resources/icons/menu/delete.png index a87bbf735..608b61214 100644 Binary files a/Telegram/Resources/icons/menu/delete.png and b/Telegram/Resources/icons/menu/delete.png differ diff --git a/Telegram/Resources/icons/menu/delete@2x.png b/Telegram/Resources/icons/menu/delete@2x.png index 4c3b41ac6..b226d45ab 100644 Binary files a/Telegram/Resources/icons/menu/delete@2x.png and b/Telegram/Resources/icons/menu/delete@2x.png differ diff --git a/Telegram/Resources/icons/menu/delete@3x.png b/Telegram/Resources/icons/menu/delete@3x.png index d94002fdf..4cb1d06e9 100644 Binary files a/Telegram/Resources/icons/menu/delete@3x.png and b/Telegram/Resources/icons/menu/delete@3x.png differ diff --git a/Telegram/Resources/icons/menu/devices.png b/Telegram/Resources/icons/menu/devices.png new file mode 100644 index 000000000..192140249 Binary files /dev/null and b/Telegram/Resources/icons/menu/devices.png differ diff --git a/Telegram/Resources/icons/menu/devices@2x.png b/Telegram/Resources/icons/menu/devices@2x.png new file mode 100644 index 000000000..6ac88a975 Binary files /dev/null and b/Telegram/Resources/icons/menu/devices@2x.png differ diff --git a/Telegram/Resources/icons/menu/devices@3x.png b/Telegram/Resources/icons/menu/devices@3x.png new file mode 100644 index 000000000..a5b443200 Binary files /dev/null and b/Telegram/Resources/icons/menu/devices@3x.png differ diff --git a/Telegram/Resources/icons/menu/disable.png b/Telegram/Resources/icons/menu/disable.png new file mode 100644 index 000000000..2f5f1437d Binary files /dev/null and b/Telegram/Resources/icons/menu/disable.png differ diff --git a/Telegram/Resources/icons/menu/disable@2x.png b/Telegram/Resources/icons/menu/disable@2x.png new file mode 100644 index 000000000..a514806d1 Binary files /dev/null and b/Telegram/Resources/icons/menu/disable@2x.png differ diff --git a/Telegram/Resources/icons/menu/disable@3x.png b/Telegram/Resources/icons/menu/disable@3x.png new file mode 100644 index 000000000..7a903fdb4 Binary files /dev/null and b/Telegram/Resources/icons/menu/disable@3x.png differ diff --git a/Telegram/Resources/icons/menu/discussion.png b/Telegram/Resources/icons/menu/discussion.png index 180a17d2b..e6b5eb756 100644 Binary files a/Telegram/Resources/icons/menu/discussion.png and b/Telegram/Resources/icons/menu/discussion.png differ diff --git a/Telegram/Resources/icons/menu/discussion@2x.png b/Telegram/Resources/icons/menu/discussion@2x.png index c7f148d6d..a4753abe5 100644 Binary files a/Telegram/Resources/icons/menu/discussion@2x.png and b/Telegram/Resources/icons/menu/discussion@2x.png differ diff --git a/Telegram/Resources/icons/menu/discussion@3x.png b/Telegram/Resources/icons/menu/discussion@3x.png index 44f2f40a1..172762fa1 100644 Binary files a/Telegram/Resources/icons/menu/discussion@3x.png and b/Telegram/Resources/icons/menu/discussion@3x.png differ diff --git a/Telegram/Resources/icons/menu/dock_bounce.png b/Telegram/Resources/icons/menu/dock_bounce.png new file mode 100644 index 000000000..b538f11e0 Binary files /dev/null and b/Telegram/Resources/icons/menu/dock_bounce.png differ diff --git a/Telegram/Resources/icons/menu/dock_bounce@2x.png b/Telegram/Resources/icons/menu/dock_bounce@2x.png new file mode 100644 index 000000000..232aaa82c Binary files /dev/null and b/Telegram/Resources/icons/menu/dock_bounce@2x.png differ diff --git a/Telegram/Resources/icons/menu/dock_bounce@3x.png b/Telegram/Resources/icons/menu/dock_bounce@3x.png new file mode 100644 index 000000000..5bc6d3dd3 Binary files /dev/null and b/Telegram/Resources/icons/menu/dock_bounce@3x.png differ diff --git a/Telegram/Resources/icons/menu/download.png b/Telegram/Resources/icons/menu/download.png index 822e8716b..f78cfb45c 100644 Binary files a/Telegram/Resources/icons/menu/download.png and b/Telegram/Resources/icons/menu/download.png differ diff --git a/Telegram/Resources/icons/menu/download@2x.png b/Telegram/Resources/icons/menu/download@2x.png index e9a78093e..e88f2fcc7 100644 Binary files a/Telegram/Resources/icons/menu/download@2x.png and b/Telegram/Resources/icons/menu/download@2x.png differ diff --git a/Telegram/Resources/icons/menu/download@3x.png b/Telegram/Resources/icons/menu/download@3x.png index 9c19c3c06..0765db31a 100644 Binary files a/Telegram/Resources/icons/menu/download@3x.png and b/Telegram/Resources/icons/menu/download@3x.png differ diff --git a/Telegram/Resources/icons/menu/download_locked.png b/Telegram/Resources/icons/menu/download_locked.png new file mode 100644 index 000000000..824ca3707 Binary files /dev/null and b/Telegram/Resources/icons/menu/download_locked.png differ diff --git a/Telegram/Resources/icons/menu/download_locked@2x.png b/Telegram/Resources/icons/menu/download_locked@2x.png new file mode 100644 index 000000000..1e2dde2ce Binary files /dev/null and b/Telegram/Resources/icons/menu/download_locked@2x.png differ diff --git a/Telegram/Resources/icons/menu/download_locked@3x.png b/Telegram/Resources/icons/menu/download_locked@3x.png new file mode 100644 index 000000000..69d05e38d Binary files /dev/null and b/Telegram/Resources/icons/menu/download_locked@3x.png differ diff --git a/Telegram/Resources/icons/menu/drugs.png b/Telegram/Resources/icons/menu/drugs.png new file mode 100644 index 000000000..8b689d54e Binary files /dev/null and b/Telegram/Resources/icons/menu/drugs.png differ diff --git a/Telegram/Resources/icons/menu/drugs@2x.png b/Telegram/Resources/icons/menu/drugs@2x.png new file mode 100644 index 000000000..977574e32 Binary files /dev/null and b/Telegram/Resources/icons/menu/drugs@2x.png differ diff --git a/Telegram/Resources/icons/menu/drugs@3x.png b/Telegram/Resources/icons/menu/drugs@3x.png new file mode 100644 index 000000000..049dc0e75 Binary files /dev/null and b/Telegram/Resources/icons/menu/drugs@3x.png differ diff --git a/Telegram/Resources/icons/menu/edit.png b/Telegram/Resources/icons/menu/edit.png index b328e4b99..c6506c9fe 100644 Binary files a/Telegram/Resources/icons/menu/edit.png and b/Telegram/Resources/icons/menu/edit.png differ diff --git a/Telegram/Resources/icons/menu/edit@2x.png b/Telegram/Resources/icons/menu/edit@2x.png index 208dd25f2..a1b832c47 100644 Binary files a/Telegram/Resources/icons/menu/edit@2x.png and b/Telegram/Resources/icons/menu/edit@2x.png differ diff --git a/Telegram/Resources/icons/menu/edit@3x.png b/Telegram/Resources/icons/menu/edit@3x.png index f95298a9d..fb8701601 100644 Binary files a/Telegram/Resources/icons/menu/edit@3x.png and b/Telegram/Resources/icons/menu/edit@3x.png differ diff --git a/Telegram/Resources/icons/menu/emoji.png b/Telegram/Resources/icons/menu/emoji.png new file mode 100644 index 000000000..0820c4c24 Binary files /dev/null and b/Telegram/Resources/icons/menu/emoji.png differ diff --git a/Telegram/Resources/icons/menu/emoji@2x.png b/Telegram/Resources/icons/menu/emoji@2x.png new file mode 100644 index 000000000..24ced3250 Binary files /dev/null and b/Telegram/Resources/icons/menu/emoji@2x.png differ diff --git a/Telegram/Resources/icons/menu/emoji@3x.png b/Telegram/Resources/icons/menu/emoji@3x.png new file mode 100644 index 000000000..d2251e543 Binary files /dev/null and b/Telegram/Resources/icons/menu/emoji@3x.png differ diff --git a/Telegram/Resources/icons/menu/expand.png b/Telegram/Resources/icons/menu/expand.png index ad25da472..83aabe76e 100644 Binary files a/Telegram/Resources/icons/menu/expand.png and b/Telegram/Resources/icons/menu/expand.png differ diff --git a/Telegram/Resources/icons/menu/expand@2x.png b/Telegram/Resources/icons/menu/expand@2x.png index 7ababd7d5..dc7cf9702 100644 Binary files a/Telegram/Resources/icons/menu/expand@2x.png and b/Telegram/Resources/icons/menu/expand@2x.png differ diff --git a/Telegram/Resources/icons/menu/expand@3x.png b/Telegram/Resources/icons/menu/expand@3x.png index 0ad14a423..85c580bc1 100644 Binary files a/Telegram/Resources/icons/menu/expand@3x.png and b/Telegram/Resources/icons/menu/expand@3x.png differ diff --git a/Telegram/Resources/icons/menu/experimental.png b/Telegram/Resources/icons/menu/experimental.png new file mode 100644 index 000000000..f84b745a9 Binary files /dev/null and b/Telegram/Resources/icons/menu/experimental.png differ diff --git a/Telegram/Resources/icons/menu/experimental@2x.png b/Telegram/Resources/icons/menu/experimental@2x.png new file mode 100644 index 000000000..e56b0c3ed Binary files /dev/null and b/Telegram/Resources/icons/menu/experimental@2x.png differ diff --git a/Telegram/Resources/icons/menu/experimental@3x.png b/Telegram/Resources/icons/menu/experimental@3x.png new file mode 100644 index 000000000..d2c1efdd2 Binary files /dev/null and b/Telegram/Resources/icons/menu/experimental@3x.png differ diff --git a/Telegram/Resources/icons/menu/export.png b/Telegram/Resources/icons/menu/export.png index 81303d4c8..b9185a238 100644 Binary files a/Telegram/Resources/icons/menu/export.png and b/Telegram/Resources/icons/menu/export.png differ diff --git a/Telegram/Resources/icons/menu/export@2x.png b/Telegram/Resources/icons/menu/export@2x.png index e64e11e24..c95fc4603 100644 Binary files a/Telegram/Resources/icons/menu/export@2x.png and b/Telegram/Resources/icons/menu/export@2x.png differ diff --git a/Telegram/Resources/icons/menu/export@3x.png b/Telegram/Resources/icons/menu/export@3x.png index 76e573e13..3d48c4394 100644 Binary files a/Telegram/Resources/icons/menu/export@3x.png and b/Telegram/Resources/icons/menu/export@3x.png differ diff --git a/Telegram/Resources/icons/menu/export_theme.png b/Telegram/Resources/icons/menu/export_theme.png index 84a40f33e..9273eb7e0 100644 Binary files a/Telegram/Resources/icons/menu/export_theme.png and b/Telegram/Resources/icons/menu/export_theme.png differ diff --git a/Telegram/Resources/icons/menu/export_theme@2x.png b/Telegram/Resources/icons/menu/export_theme@2x.png index 845195c2a..d9722d4c6 100644 Binary files a/Telegram/Resources/icons/menu/export_theme@2x.png and b/Telegram/Resources/icons/menu/export_theme@2x.png differ diff --git a/Telegram/Resources/icons/menu/export_theme@3x.png b/Telegram/Resources/icons/menu/export_theme@3x.png index 99e5001ee..29801c322 100644 Binary files a/Telegram/Resources/icons/menu/export_theme@3x.png and b/Telegram/Resources/icons/menu/export_theme@3x.png differ diff --git a/Telegram/Resources/icons/menu/fake.png b/Telegram/Resources/icons/menu/fake.png new file mode 100644 index 000000000..cf0c3ef92 Binary files /dev/null and b/Telegram/Resources/icons/menu/fake.png differ diff --git a/Telegram/Resources/icons/menu/fake@2x.png b/Telegram/Resources/icons/menu/fake@2x.png new file mode 100644 index 000000000..7d47bbe03 Binary files /dev/null and b/Telegram/Resources/icons/menu/fake@2x.png differ diff --git a/Telegram/Resources/icons/menu/fake@3x.png b/Telegram/Resources/icons/menu/fake@3x.png new file mode 100644 index 000000000..50ba1415d Binary files /dev/null and b/Telegram/Resources/icons/menu/fake@3x.png differ diff --git a/Telegram/Resources/icons/menu/false_positive.png b/Telegram/Resources/icons/menu/false_positive.png new file mode 100644 index 000000000..a3a44132c Binary files /dev/null and b/Telegram/Resources/icons/menu/false_positive.png differ diff --git a/Telegram/Resources/icons/menu/false_positive@2x.png b/Telegram/Resources/icons/menu/false_positive@2x.png new file mode 100644 index 000000000..17b4eac5f Binary files /dev/null and b/Telegram/Resources/icons/menu/false_positive@2x.png differ diff --git a/Telegram/Resources/icons/menu/false_positive@3x.png b/Telegram/Resources/icons/menu/false_positive@3x.png new file mode 100644 index 000000000..58d468ba3 Binary files /dev/null and b/Telegram/Resources/icons/menu/false_positive@3x.png differ diff --git a/Telegram/Resources/icons/menu/faq.png b/Telegram/Resources/icons/menu/faq.png new file mode 100644 index 000000000..e280515e6 Binary files /dev/null and b/Telegram/Resources/icons/menu/faq.png differ diff --git a/Telegram/Resources/icons/menu/faq@2x.png b/Telegram/Resources/icons/menu/faq@2x.png new file mode 100644 index 000000000..c44914078 Binary files /dev/null and b/Telegram/Resources/icons/menu/faq@2x.png differ diff --git a/Telegram/Resources/icons/menu/faq@3x.png b/Telegram/Resources/icons/menu/faq@3x.png new file mode 100644 index 000000000..853065e0b Binary files /dev/null and b/Telegram/Resources/icons/menu/faq@3x.png differ diff --git a/Telegram/Resources/icons/menu/favorite.png b/Telegram/Resources/icons/menu/favorite.png index 82cfd19a2..274c6e601 100644 Binary files a/Telegram/Resources/icons/menu/favorite.png and b/Telegram/Resources/icons/menu/favorite.png differ diff --git a/Telegram/Resources/icons/menu/favorite@2x.png b/Telegram/Resources/icons/menu/favorite@2x.png index 346986459..3aa5c6944 100644 Binary files a/Telegram/Resources/icons/menu/favorite@2x.png and b/Telegram/Resources/icons/menu/favorite@2x.png differ diff --git a/Telegram/Resources/icons/menu/favorite@3x.png b/Telegram/Resources/icons/menu/favorite@3x.png index 5a58bcc49..4077efc5e 100644 Binary files a/Telegram/Resources/icons/menu/favorite@3x.png and b/Telegram/Resources/icons/menu/favorite@3x.png differ diff --git a/Telegram/Resources/icons/menu/file.png b/Telegram/Resources/icons/menu/file.png new file mode 100644 index 000000000..4bf456b4c Binary files /dev/null and b/Telegram/Resources/icons/menu/file.png differ diff --git a/Telegram/Resources/icons/menu/file@2x.png b/Telegram/Resources/icons/menu/file@2x.png new file mode 100644 index 000000000..d18f28300 Binary files /dev/null and b/Telegram/Resources/icons/menu/file@2x.png differ diff --git a/Telegram/Resources/icons/menu/file@3x.png b/Telegram/Resources/icons/menu/file@3x.png new file mode 100644 index 000000000..cb4542036 Binary files /dev/null and b/Telegram/Resources/icons/menu/file@3x.png differ diff --git a/Telegram/Resources/icons/menu/flip.png b/Telegram/Resources/icons/menu/flip.png index 34acb7b99..ec8836120 100644 Binary files a/Telegram/Resources/icons/menu/flip.png and b/Telegram/Resources/icons/menu/flip.png differ diff --git a/Telegram/Resources/icons/menu/flip@2x.png b/Telegram/Resources/icons/menu/flip@2x.png index 596076d1d..1fdd5cae0 100644 Binary files a/Telegram/Resources/icons/menu/flip@2x.png and b/Telegram/Resources/icons/menu/flip@2x.png differ diff --git a/Telegram/Resources/icons/menu/flip@3x.png b/Telegram/Resources/icons/menu/flip@3x.png index f5dca8fe9..e17a9faca 100644 Binary files a/Telegram/Resources/icons/menu/flip@3x.png and b/Telegram/Resources/icons/menu/flip@3x.png differ diff --git a/Telegram/Resources/icons/menu/forward.png b/Telegram/Resources/icons/menu/forward.png index c2c141a05..4a50099f4 100644 Binary files a/Telegram/Resources/icons/menu/forward.png and b/Telegram/Resources/icons/menu/forward.png differ diff --git a/Telegram/Resources/icons/menu/forward@2x.png b/Telegram/Resources/icons/menu/forward@2x.png index ad8b12b8d..c27765246 100644 Binary files a/Telegram/Resources/icons/menu/forward@2x.png and b/Telegram/Resources/icons/menu/forward@2x.png differ diff --git a/Telegram/Resources/icons/menu/forward@3x.png b/Telegram/Resources/icons/menu/forward@3x.png index 5a645c291..557b032ef 100644 Binary files a/Telegram/Resources/icons/menu/forward@3x.png and b/Telegram/Resources/icons/menu/forward@3x.png differ diff --git a/Telegram/Resources/icons/menu/gif.png b/Telegram/Resources/icons/menu/gif.png index 9a76a1c8f..3e00fb65c 100644 Binary files a/Telegram/Resources/icons/menu/gif.png and b/Telegram/Resources/icons/menu/gif.png differ diff --git a/Telegram/Resources/icons/menu/gif@2x.png b/Telegram/Resources/icons/menu/gif@2x.png index 4f87590c4..232000a1d 100644 Binary files a/Telegram/Resources/icons/menu/gif@2x.png and b/Telegram/Resources/icons/menu/gif@2x.png differ diff --git a/Telegram/Resources/icons/menu/gif@3x.png b/Telegram/Resources/icons/menu/gif@3x.png index eccd873f1..eb64ef7d5 100644 Binary files a/Telegram/Resources/icons/menu/gif@3x.png and b/Telegram/Resources/icons/menu/gif@3x.png differ diff --git a/Telegram/Resources/icons/menu/gift_premium.png b/Telegram/Resources/icons/menu/gift_premium.png new file mode 100644 index 000000000..cb18442df Binary files /dev/null and b/Telegram/Resources/icons/menu/gift_premium.png differ diff --git a/Telegram/Resources/icons/menu/gift_premium@2x.png b/Telegram/Resources/icons/menu/gift_premium@2x.png new file mode 100644 index 000000000..e7472fdf1 Binary files /dev/null and b/Telegram/Resources/icons/menu/gift_premium@2x.png differ diff --git a/Telegram/Resources/icons/menu/gift_premium@3x.png b/Telegram/Resources/icons/menu/gift_premium@3x.png new file mode 100644 index 000000000..61be0204d Binary files /dev/null and b/Telegram/Resources/icons/menu/gift_premium@3x.png differ diff --git a/Telegram/Resources/icons/menu/group_log.png b/Telegram/Resources/icons/menu/group_log.png new file mode 100644 index 000000000..5452f7975 Binary files /dev/null and b/Telegram/Resources/icons/menu/group_log.png differ diff --git a/Telegram/Resources/icons/menu/group_log@2x.png b/Telegram/Resources/icons/menu/group_log@2x.png new file mode 100644 index 000000000..b372a0cf6 Binary files /dev/null and b/Telegram/Resources/icons/menu/group_log@2x.png differ diff --git a/Telegram/Resources/icons/menu/group_log@3x.png b/Telegram/Resources/icons/menu/group_log@3x.png new file mode 100644 index 000000000..678b9dc62 Binary files /dev/null and b/Telegram/Resources/icons/menu/group_log@3x.png differ diff --git a/Telegram/Resources/icons/menu/group_reactions.png b/Telegram/Resources/icons/menu/group_reactions.png new file mode 100644 index 000000000..c941a5955 Binary files /dev/null and b/Telegram/Resources/icons/menu/group_reactions.png differ diff --git a/Telegram/Resources/icons/menu/group_reactions@2x.png b/Telegram/Resources/icons/menu/group_reactions@2x.png new file mode 100644 index 000000000..406d42273 Binary files /dev/null and b/Telegram/Resources/icons/menu/group_reactions@2x.png differ diff --git a/Telegram/Resources/icons/menu/group_reactions@3x.png b/Telegram/Resources/icons/menu/group_reactions@3x.png new file mode 100644 index 000000000..caf8ae470 Binary files /dev/null and b/Telegram/Resources/icons/menu/group_reactions@3x.png differ diff --git a/Telegram/Resources/icons/menu/groups.png b/Telegram/Resources/icons/menu/groups.png new file mode 100644 index 000000000..2fc454a36 Binary files /dev/null and b/Telegram/Resources/icons/menu/groups.png differ diff --git a/Telegram/Resources/icons/menu/groups@2x.png b/Telegram/Resources/icons/menu/groups@2x.png new file mode 100644 index 000000000..986bc696d Binary files /dev/null and b/Telegram/Resources/icons/menu/groups@2x.png differ diff --git a/Telegram/Resources/icons/menu/groups@3x.png b/Telegram/Resources/icons/menu/groups@3x.png new file mode 100644 index 000000000..28ed4085f Binary files /dev/null and b/Telegram/Resources/icons/menu/groups@3x.png differ diff --git a/Telegram/Resources/icons/menu/groups_create.png b/Telegram/Resources/icons/menu/groups_create.png new file mode 100644 index 000000000..5d6bb4c00 Binary files /dev/null and b/Telegram/Resources/icons/menu/groups_create.png differ diff --git a/Telegram/Resources/icons/menu/groups_create@2x.png b/Telegram/Resources/icons/menu/groups_create@2x.png new file mode 100644 index 000000000..cf110c030 Binary files /dev/null and b/Telegram/Resources/icons/menu/groups_create@2x.png differ diff --git a/Telegram/Resources/icons/menu/groups_create@3x.png b/Telegram/Resources/icons/menu/groups_create@3x.png new file mode 100644 index 000000000..b45349322 Binary files /dev/null and b/Telegram/Resources/icons/menu/groups_create@3x.png differ diff --git a/Telegram/Resources/icons/menu/header_mode_day.png b/Telegram/Resources/icons/menu/header_mode_day.png new file mode 100644 index 000000000..9ad57435e Binary files /dev/null and b/Telegram/Resources/icons/menu/header_mode_day.png differ diff --git a/Telegram/Resources/icons/menu/header_mode_day@2x.png b/Telegram/Resources/icons/menu/header_mode_day@2x.png new file mode 100644 index 000000000..13dd35f30 Binary files /dev/null and b/Telegram/Resources/icons/menu/header_mode_day@2x.png differ diff --git a/Telegram/Resources/icons/menu/header_mode_day@3x.png b/Telegram/Resources/icons/menu/header_mode_day@3x.png new file mode 100644 index 000000000..5f6ad557f Binary files /dev/null and b/Telegram/Resources/icons/menu/header_mode_day@3x.png differ diff --git a/Telegram/Resources/icons/menu/header_mode_night.png b/Telegram/Resources/icons/menu/header_mode_night.png new file mode 100644 index 000000000..43cf44547 Binary files /dev/null and b/Telegram/Resources/icons/menu/header_mode_night.png differ diff --git a/Telegram/Resources/icons/menu/header_mode_night@2x.png b/Telegram/Resources/icons/menu/header_mode_night@2x.png new file mode 100644 index 000000000..0d397e35d Binary files /dev/null and b/Telegram/Resources/icons/menu/header_mode_night@2x.png differ diff --git a/Telegram/Resources/icons/menu/header_mode_night@3x.png b/Telegram/Resources/icons/menu/header_mode_night@3x.png new file mode 100644 index 000000000..65ba723e2 Binary files /dev/null and b/Telegram/Resources/icons/menu/header_mode_night@3x.png differ diff --git a/Telegram/Resources/icons/menu/hide_members.png b/Telegram/Resources/icons/menu/hide_members.png new file mode 100644 index 000000000..5e81f7655 Binary files /dev/null and b/Telegram/Resources/icons/menu/hide_members.png differ diff --git a/Telegram/Resources/icons/menu/hide_members@2x.png b/Telegram/Resources/icons/menu/hide_members@2x.png new file mode 100644 index 000000000..e10056514 Binary files /dev/null and b/Telegram/Resources/icons/menu/hide_members@2x.png differ diff --git a/Telegram/Resources/icons/menu/hide_members@3x.png b/Telegram/Resources/icons/menu/hide_members@3x.png new file mode 100644 index 000000000..011d3c425 Binary files /dev/null and b/Telegram/Resources/icons/menu/hide_members@3x.png differ diff --git a/Telegram/Resources/icons/menu/image.png b/Telegram/Resources/icons/menu/image.png new file mode 100644 index 000000000..c7f5c3c2f Binary files /dev/null and b/Telegram/Resources/icons/menu/image.png differ diff --git a/Telegram/Resources/icons/menu/image@2x.png b/Telegram/Resources/icons/menu/image@2x.png new file mode 100644 index 000000000..aba87b945 Binary files /dev/null and b/Telegram/Resources/icons/menu/image@2x.png differ diff --git a/Telegram/Resources/icons/menu/image@3x.png b/Telegram/Resources/icons/menu/image@3x.png new file mode 100644 index 000000000..7f6ebd378 Binary files /dev/null and b/Telegram/Resources/icons/menu/image@3x.png differ diff --git a/Telegram/Resources/icons/menu/import_theme.png b/Telegram/Resources/icons/menu/import_theme.png index f5af2f897..0338b292d 100644 Binary files a/Telegram/Resources/icons/menu/import_theme.png and b/Telegram/Resources/icons/menu/import_theme.png differ diff --git a/Telegram/Resources/icons/menu/import_theme@2x.png b/Telegram/Resources/icons/menu/import_theme@2x.png index 575e1e439..29b15457c 100644 Binary files a/Telegram/Resources/icons/menu/import_theme@2x.png and b/Telegram/Resources/icons/menu/import_theme@2x.png differ diff --git a/Telegram/Resources/icons/menu/import_theme@3x.png b/Telegram/Resources/icons/menu/import_theme@3x.png index 2169f43c3..99d01938e 100644 Binary files a/Telegram/Resources/icons/menu/import_theme@3x.png and b/Telegram/Resources/icons/menu/import_theme@3x.png differ diff --git a/Telegram/Resources/icons/menu/info.png b/Telegram/Resources/icons/menu/info.png index 7753fe9f4..31404161c 100644 Binary files a/Telegram/Resources/icons/menu/info.png and b/Telegram/Resources/icons/menu/info.png differ diff --git a/Telegram/Resources/icons/menu/info@2x.png b/Telegram/Resources/icons/menu/info@2x.png index bf7e1d2d6..c6287d144 100644 Binary files a/Telegram/Resources/icons/menu/info@2x.png and b/Telegram/Resources/icons/menu/info@2x.png differ diff --git a/Telegram/Resources/icons/menu/info@3x.png b/Telegram/Resources/icons/menu/info@3x.png index af96e7cbf..e707aa012 100644 Binary files a/Telegram/Resources/icons/menu/info@3x.png and b/Telegram/Resources/icons/menu/info@3x.png differ diff --git a/Telegram/Resources/icons/menu/info_notifications.png b/Telegram/Resources/icons/menu/info_notifications.png new file mode 100644 index 000000000..3686dba72 Binary files /dev/null and b/Telegram/Resources/icons/menu/info_notifications.png differ diff --git a/Telegram/Resources/icons/menu/info_notifications@2x.png b/Telegram/Resources/icons/menu/info_notifications@2x.png new file mode 100644 index 000000000..ed724c7f2 Binary files /dev/null and b/Telegram/Resources/icons/menu/info_notifications@2x.png differ diff --git a/Telegram/Resources/icons/menu/info_notifications@3x.png b/Telegram/Resources/icons/menu/info_notifications@3x.png new file mode 100644 index 000000000..de98cf241 Binary files /dev/null and b/Telegram/Resources/icons/menu/info_notifications@3x.png differ diff --git a/Telegram/Resources/icons/menu/invite.png b/Telegram/Resources/icons/menu/invite.png index ea0de5b30..2bcd04349 100644 Binary files a/Telegram/Resources/icons/menu/invite.png and b/Telegram/Resources/icons/menu/invite.png differ diff --git a/Telegram/Resources/icons/menu/invite@2x.png b/Telegram/Resources/icons/menu/invite@2x.png index c2609e6df..5eb8317de 100644 Binary files a/Telegram/Resources/icons/menu/invite@2x.png and b/Telegram/Resources/icons/menu/invite@2x.png differ diff --git a/Telegram/Resources/icons/menu/invite@3x.png b/Telegram/Resources/icons/menu/invite@3x.png index 06bfa637b..34fdd94fd 100644 Binary files a/Telegram/Resources/icons/menu/invite@3x.png and b/Telegram/Resources/icons/menu/invite@3x.png differ diff --git a/Telegram/Resources/icons/menu/ip_address.png b/Telegram/Resources/icons/menu/ip_address.png new file mode 100644 index 000000000..3aa87b0aa Binary files /dev/null and b/Telegram/Resources/icons/menu/ip_address.png differ diff --git a/Telegram/Resources/icons/menu/ip_address@2x.png b/Telegram/Resources/icons/menu/ip_address@2x.png new file mode 100644 index 000000000..1184e10b0 Binary files /dev/null and b/Telegram/Resources/icons/menu/ip_address@2x.png differ diff --git a/Telegram/Resources/icons/menu/ip_address@3x.png b/Telegram/Resources/icons/menu/ip_address@3x.png new file mode 100644 index 000000000..3cee2b09d Binary files /dev/null and b/Telegram/Resources/icons/menu/ip_address@3x.png differ diff --git a/Telegram/Resources/icons/menu/leave.png b/Telegram/Resources/icons/menu/leave.png index f5f97bc1b..4f257ce15 100644 Binary files a/Telegram/Resources/icons/menu/leave.png and b/Telegram/Resources/icons/menu/leave.png differ diff --git a/Telegram/Resources/icons/menu/leave@2x.png b/Telegram/Resources/icons/menu/leave@2x.png index 055a952d9..09bfd0376 100644 Binary files a/Telegram/Resources/icons/menu/leave@2x.png and b/Telegram/Resources/icons/menu/leave@2x.png differ diff --git a/Telegram/Resources/icons/menu/leave@3x.png b/Telegram/Resources/icons/menu/leave@3x.png index ba42fe7b1..578a95311 100644 Binary files a/Telegram/Resources/icons/menu/leave@3x.png and b/Telegram/Resources/icons/menu/leave@3x.png differ diff --git a/Telegram/Resources/icons/menu/link.png b/Telegram/Resources/icons/menu/link.png index 55f7d4f69..dc611cf33 100644 Binary files a/Telegram/Resources/icons/menu/link.png and b/Telegram/Resources/icons/menu/link.png differ diff --git a/Telegram/Resources/icons/menu/link@2x.png b/Telegram/Resources/icons/menu/link@2x.png index 8eaf08544..6b87b7b11 100644 Binary files a/Telegram/Resources/icons/menu/link@2x.png and b/Telegram/Resources/icons/menu/link@2x.png differ diff --git a/Telegram/Resources/icons/menu/link@3x.png b/Telegram/Resources/icons/menu/link@3x.png index 2b8a3d165..ebf04e7fc 100644 Binary files a/Telegram/Resources/icons/menu/link@3x.png and b/Telegram/Resources/icons/menu/link@3x.png differ diff --git a/Telegram/Resources/icons/menu/link_above.png b/Telegram/Resources/icons/menu/link_above.png new file mode 100644 index 000000000..1f8881dfe Binary files /dev/null and b/Telegram/Resources/icons/menu/link_above.png differ diff --git a/Telegram/Resources/icons/menu/link_above@2x.png b/Telegram/Resources/icons/menu/link_above@2x.png new file mode 100644 index 000000000..61c53d18e Binary files /dev/null and b/Telegram/Resources/icons/menu/link_above@2x.png differ diff --git a/Telegram/Resources/icons/menu/link_above@3x.png b/Telegram/Resources/icons/menu/link_above@3x.png new file mode 100644 index 000000000..be58d0df3 Binary files /dev/null and b/Telegram/Resources/icons/menu/link_above@3x.png differ diff --git a/Telegram/Resources/icons/menu/link_below.png b/Telegram/Resources/icons/menu/link_below.png new file mode 100644 index 000000000..315150fa6 Binary files /dev/null and b/Telegram/Resources/icons/menu/link_below.png differ diff --git a/Telegram/Resources/icons/menu/link_below@2x.png b/Telegram/Resources/icons/menu/link_below@2x.png new file mode 100644 index 000000000..f30fe99b4 Binary files /dev/null and b/Telegram/Resources/icons/menu/link_below@2x.png differ diff --git a/Telegram/Resources/icons/menu/link_below@3x.png b/Telegram/Resources/icons/menu/link_below@3x.png new file mode 100644 index 000000000..39f6fbf1a Binary files /dev/null and b/Telegram/Resources/icons/menu/link_below@3x.png differ diff --git a/Telegram/Resources/icons/menu/link_enlarge.png b/Telegram/Resources/icons/menu/link_enlarge.png new file mode 100644 index 000000000..4750b24d6 Binary files /dev/null and b/Telegram/Resources/icons/menu/link_enlarge.png differ diff --git a/Telegram/Resources/icons/menu/link_enlarge@2x.png b/Telegram/Resources/icons/menu/link_enlarge@2x.png new file mode 100644 index 000000000..ff98f6dc4 Binary files /dev/null and b/Telegram/Resources/icons/menu/link_enlarge@2x.png differ diff --git a/Telegram/Resources/icons/menu/link_enlarge@3x.png b/Telegram/Resources/icons/menu/link_enlarge@3x.png new file mode 100644 index 000000000..78b3f137b Binary files /dev/null and b/Telegram/Resources/icons/menu/link_enlarge@3x.png differ diff --git a/Telegram/Resources/icons/menu/link_shrink.png b/Telegram/Resources/icons/menu/link_shrink.png new file mode 100644 index 000000000..48bf8f035 Binary files /dev/null and b/Telegram/Resources/icons/menu/link_shrink.png differ diff --git a/Telegram/Resources/icons/menu/link_shrink@2x.png b/Telegram/Resources/icons/menu/link_shrink@2x.png new file mode 100644 index 000000000..289e1f69d Binary files /dev/null and b/Telegram/Resources/icons/menu/link_shrink@2x.png differ diff --git a/Telegram/Resources/icons/menu/link_shrink@3x.png b/Telegram/Resources/icons/menu/link_shrink@3x.png new file mode 100644 index 000000000..dfb66a523 Binary files /dev/null and b/Telegram/Resources/icons/menu/link_shrink@3x.png differ diff --git a/Telegram/Resources/icons/menu/links_profile.png b/Telegram/Resources/icons/menu/links_profile.png new file mode 100644 index 000000000..da8497860 Binary files /dev/null and b/Telegram/Resources/icons/menu/links_profile.png differ diff --git a/Telegram/Resources/icons/menu/links_profile@2x.png b/Telegram/Resources/icons/menu/links_profile@2x.png new file mode 100644 index 000000000..26dfa285e Binary files /dev/null and b/Telegram/Resources/icons/menu/links_profile@2x.png differ diff --git a/Telegram/Resources/icons/menu/links_profile@3x.png b/Telegram/Resources/icons/menu/links_profile@3x.png new file mode 100644 index 000000000..fef135b0d Binary files /dev/null and b/Telegram/Resources/icons/menu/links_profile@3x.png differ diff --git a/Telegram/Resources/icons/menu/lock.png b/Telegram/Resources/icons/menu/lock.png new file mode 100644 index 000000000..7e7c58bbb Binary files /dev/null and b/Telegram/Resources/icons/menu/lock.png differ diff --git a/Telegram/Resources/icons/menu/lock@2x.png b/Telegram/Resources/icons/menu/lock@2x.png new file mode 100644 index 000000000..2887113a8 Binary files /dev/null and b/Telegram/Resources/icons/menu/lock@2x.png differ diff --git a/Telegram/Resources/icons/menu/lock@3x.png b/Telegram/Resources/icons/menu/lock@3x.png new file mode 100644 index 000000000..f960d6a5d Binary files /dev/null and b/Telegram/Resources/icons/menu/lock@3x.png differ diff --git a/Telegram/Resources/icons/menu/manage.png b/Telegram/Resources/icons/menu/manage.png index 36acf2de9..a31439749 100644 Binary files a/Telegram/Resources/icons/menu/manage.png and b/Telegram/Resources/icons/menu/manage.png differ diff --git a/Telegram/Resources/icons/menu/manage@2x.png b/Telegram/Resources/icons/menu/manage@2x.png index 21ccea940..2f2cb22bc 100644 Binary files a/Telegram/Resources/icons/menu/manage@2x.png and b/Telegram/Resources/icons/menu/manage@2x.png differ diff --git a/Telegram/Resources/icons/menu/manage@3x.png b/Telegram/Resources/icons/menu/manage@3x.png index 7b9767c87..6119ec74f 100644 Binary files a/Telegram/Resources/icons/menu/manage@3x.png and b/Telegram/Resources/icons/menu/manage@3x.png differ diff --git a/Telegram/Resources/icons/menu/mode_messages.png b/Telegram/Resources/icons/menu/mode_messages.png new file mode 100644 index 000000000..a1a15eea2 Binary files /dev/null and b/Telegram/Resources/icons/menu/mode_messages.png differ diff --git a/Telegram/Resources/icons/menu/mode_messages@2x.png b/Telegram/Resources/icons/menu/mode_messages@2x.png new file mode 100644 index 000000000..0218c696f Binary files /dev/null and b/Telegram/Resources/icons/menu/mode_messages@2x.png differ diff --git a/Telegram/Resources/icons/menu/mode_messages@3x.png b/Telegram/Resources/icons/menu/mode_messages@3x.png new file mode 100644 index 000000000..faffe713b Binary files /dev/null and b/Telegram/Resources/icons/menu/mode_messages@3x.png differ diff --git a/Telegram/Resources/icons/menu/mode_topics.png b/Telegram/Resources/icons/menu/mode_topics.png new file mode 100644 index 000000000..e64c31734 Binary files /dev/null and b/Telegram/Resources/icons/menu/mode_topics.png differ diff --git a/Telegram/Resources/icons/menu/mode_topics@2x.png b/Telegram/Resources/icons/menu/mode_topics@2x.png new file mode 100644 index 000000000..11eccab70 Binary files /dev/null and b/Telegram/Resources/icons/menu/mode_topics@2x.png differ diff --git a/Telegram/Resources/icons/menu/mode_topics@3x.png b/Telegram/Resources/icons/menu/mode_topics@3x.png new file mode 100644 index 000000000..e0b678367 Binary files /dev/null and b/Telegram/Resources/icons/menu/mode_topics@3x.png differ diff --git a/Telegram/Resources/icons/menu/move_from_menu.png b/Telegram/Resources/icons/menu/move_from_menu.png index 0dc84b3df..b5c33b892 100644 Binary files a/Telegram/Resources/icons/menu/move_from_menu.png and b/Telegram/Resources/icons/menu/move_from_menu.png differ diff --git a/Telegram/Resources/icons/menu/move_from_menu@2x.png b/Telegram/Resources/icons/menu/move_from_menu@2x.png index ffb80903e..125b69a67 100644 Binary files a/Telegram/Resources/icons/menu/move_from_menu@2x.png and b/Telegram/Resources/icons/menu/move_from_menu@2x.png differ diff --git a/Telegram/Resources/icons/menu/move_from_menu@3x.png b/Telegram/Resources/icons/menu/move_from_menu@3x.png index 9822e6f2c..a5ed3f1f7 100644 Binary files a/Telegram/Resources/icons/menu/move_from_menu@3x.png and b/Telegram/Resources/icons/menu/move_from_menu@3x.png differ diff --git a/Telegram/Resources/icons/menu/move_to_menu.png b/Telegram/Resources/icons/menu/move_to_menu.png index 5fe3b32c5..03f60dcc2 100644 Binary files a/Telegram/Resources/icons/menu/move_to_menu.png and b/Telegram/Resources/icons/menu/move_to_menu.png differ diff --git a/Telegram/Resources/icons/menu/move_to_menu@2x.png b/Telegram/Resources/icons/menu/move_to_menu@2x.png index 10a49d83b..c7d161c4a 100644 Binary files a/Telegram/Resources/icons/menu/move_to_menu@2x.png and b/Telegram/Resources/icons/menu/move_to_menu@2x.png differ diff --git a/Telegram/Resources/icons/menu/move_to_menu@3x.png b/Telegram/Resources/icons/menu/move_to_menu@3x.png index 4cf99120c..f883afe7d 100644 Binary files a/Telegram/Resources/icons/menu/move_to_menu@3x.png and b/Telegram/Resources/icons/menu/move_to_menu@3x.png differ diff --git a/Telegram/Resources/icons/menu/mute.png b/Telegram/Resources/icons/menu/mute.png index af32326f4..b774995f3 100644 Binary files a/Telegram/Resources/icons/menu/mute.png and b/Telegram/Resources/icons/menu/mute.png differ diff --git a/Telegram/Resources/icons/menu/mute@2x.png b/Telegram/Resources/icons/menu/mute@2x.png index 935b2ece5..3d576be00 100644 Binary files a/Telegram/Resources/icons/menu/mute@2x.png and b/Telegram/Resources/icons/menu/mute@2x.png differ diff --git a/Telegram/Resources/icons/menu/mute@3x.png b/Telegram/Resources/icons/menu/mute@3x.png index 4762b83de..6935bac0c 100644 Binary files a/Telegram/Resources/icons/menu/mute@3x.png and b/Telegram/Resources/icons/menu/mute@3x.png differ diff --git a/Telegram/Resources/icons/menu/mute_for.png b/Telegram/Resources/icons/menu/mute_for.png new file mode 100644 index 000000000..bd3c18340 Binary files /dev/null and b/Telegram/Resources/icons/menu/mute_for.png differ diff --git a/Telegram/Resources/icons/menu/mute_for@2x.png b/Telegram/Resources/icons/menu/mute_for@2x.png new file mode 100644 index 000000000..69daac808 Binary files /dev/null and b/Telegram/Resources/icons/menu/mute_for@2x.png differ diff --git a/Telegram/Resources/icons/menu/mute_for@3x.png b/Telegram/Resources/icons/menu/mute_for@3x.png new file mode 100644 index 000000000..8d1e82b13 Binary files /dev/null and b/Telegram/Resources/icons/menu/mute_for@3x.png differ diff --git a/Telegram/Resources/icons/menu/mute_for_plain.png b/Telegram/Resources/icons/menu/mute_for_plain.png new file mode 100644 index 000000000..3c4a0db02 Binary files /dev/null and b/Telegram/Resources/icons/menu/mute_for_plain.png differ diff --git a/Telegram/Resources/icons/menu/mute_for_plain@2x.png b/Telegram/Resources/icons/menu/mute_for_plain@2x.png new file mode 100644 index 000000000..eeabd53e0 Binary files /dev/null and b/Telegram/Resources/icons/menu/mute_for_plain@2x.png differ diff --git a/Telegram/Resources/icons/menu/mute_for_plain@3x.png b/Telegram/Resources/icons/menu/mute_for_plain@3x.png new file mode 100644 index 000000000..ab53dceb5 Binary files /dev/null and b/Telegram/Resources/icons/menu/mute_for_plain@3x.png differ diff --git a/Telegram/Resources/icons/menu/network.png b/Telegram/Resources/icons/menu/network.png new file mode 100644 index 000000000..c1f4b9829 Binary files /dev/null and b/Telegram/Resources/icons/menu/network.png differ diff --git a/Telegram/Resources/icons/menu/network@2x.png b/Telegram/Resources/icons/menu/network@2x.png new file mode 100644 index 000000000..76f22a6ae Binary files /dev/null and b/Telegram/Resources/icons/menu/network@2x.png differ diff --git a/Telegram/Resources/icons/menu/network@3x.png b/Telegram/Resources/icons/menu/network@3x.png new file mode 100644 index 000000000..0f0e8a6fa Binary files /dev/null and b/Telegram/Resources/icons/menu/network@3x.png differ diff --git a/Telegram/Resources/icons/menu/new_window.png b/Telegram/Resources/icons/menu/new_window.png new file mode 100644 index 000000000..5b926de16 Binary files /dev/null and b/Telegram/Resources/icons/menu/new_window.png differ diff --git a/Telegram/Resources/icons/menu/new_window@2x.png b/Telegram/Resources/icons/menu/new_window@2x.png new file mode 100644 index 000000000..6003b7f75 Binary files /dev/null and b/Telegram/Resources/icons/menu/new_window@2x.png differ diff --git a/Telegram/Resources/icons/menu/new_window@3x.png b/Telegram/Resources/icons/menu/new_window@3x.png new file mode 100644 index 000000000..873e18171 Binary files /dev/null and b/Telegram/Resources/icons/menu/new_window@3x.png differ diff --git a/Telegram/Resources/icons/menu/night_mode.png b/Telegram/Resources/icons/menu/night_mode.png new file mode 100644 index 000000000..531195e73 Binary files /dev/null and b/Telegram/Resources/icons/menu/night_mode.png differ diff --git a/Telegram/Resources/icons/menu/night_mode@2x.png b/Telegram/Resources/icons/menu/night_mode@2x.png new file mode 100644 index 000000000..1742270a3 Binary files /dev/null and b/Telegram/Resources/icons/menu/night_mode@2x.png differ diff --git a/Telegram/Resources/icons/menu/night_mode@3x.png b/Telegram/Resources/icons/menu/night_mode@3x.png new file mode 100644 index 000000000..601217161 Binary files /dev/null and b/Telegram/Resources/icons/menu/night_mode@3x.png differ diff --git a/Telegram/Resources/icons/menu/palette.png b/Telegram/Resources/icons/menu/palette.png index 2ce5d44a1..829042125 100644 Binary files a/Telegram/Resources/icons/menu/palette.png and b/Telegram/Resources/icons/menu/palette.png differ diff --git a/Telegram/Resources/icons/menu/palette@2x.png b/Telegram/Resources/icons/menu/palette@2x.png index b88969cf1..1d47fbe4c 100644 Binary files a/Telegram/Resources/icons/menu/palette@2x.png and b/Telegram/Resources/icons/menu/palette@2x.png differ diff --git a/Telegram/Resources/icons/menu/palette@3x.png b/Telegram/Resources/icons/menu/palette@3x.png index 444a7c928..8f5ce351e 100644 Binary files a/Telegram/Resources/icons/menu/palette@3x.png and b/Telegram/Resources/icons/menu/palette@3x.png differ diff --git a/Telegram/Resources/icons/menu/payment_address.png b/Telegram/Resources/icons/menu/payment_address.png new file mode 100644 index 000000000..a7cc0eb69 Binary files /dev/null and b/Telegram/Resources/icons/menu/payment_address.png differ diff --git a/Telegram/Resources/icons/menu/payment_address@2x.png b/Telegram/Resources/icons/menu/payment_address@2x.png new file mode 100644 index 000000000..12daa492c Binary files /dev/null and b/Telegram/Resources/icons/menu/payment_address@2x.png differ diff --git a/Telegram/Resources/icons/menu/payment_address@3x.png b/Telegram/Resources/icons/menu/payment_address@3x.png new file mode 100644 index 000000000..3172912c6 Binary files /dev/null and b/Telegram/Resources/icons/menu/payment_address@3x.png differ diff --git a/Telegram/Resources/icons/menu/payment_email.png b/Telegram/Resources/icons/menu/payment_email.png new file mode 100644 index 000000000..5a1c58863 Binary files /dev/null and b/Telegram/Resources/icons/menu/payment_email.png differ diff --git a/Telegram/Resources/icons/menu/payment_email@2x.png b/Telegram/Resources/icons/menu/payment_email@2x.png new file mode 100644 index 000000000..a8af89a41 Binary files /dev/null and b/Telegram/Resources/icons/menu/payment_email@2x.png differ diff --git a/Telegram/Resources/icons/menu/payment_email@3x.png b/Telegram/Resources/icons/menu/payment_email@3x.png new file mode 100644 index 000000000..b47586e27 Binary files /dev/null and b/Telegram/Resources/icons/menu/payment_email@3x.png differ diff --git a/Telegram/Resources/icons/menu/permissions.png b/Telegram/Resources/icons/menu/permissions.png index ab4309f71..47ca33fa1 100644 Binary files a/Telegram/Resources/icons/menu/permissions.png and b/Telegram/Resources/icons/menu/permissions.png differ diff --git a/Telegram/Resources/icons/menu/permissions@2x.png b/Telegram/Resources/icons/menu/permissions@2x.png index 777467dba..e7520e77b 100644 Binary files a/Telegram/Resources/icons/menu/permissions@2x.png and b/Telegram/Resources/icons/menu/permissions@2x.png differ diff --git a/Telegram/Resources/icons/menu/permissions@3x.png b/Telegram/Resources/icons/menu/permissions@3x.png index ec4c420d4..cf92707d0 100644 Binary files a/Telegram/Resources/icons/menu/permissions@3x.png and b/Telegram/Resources/icons/menu/permissions@3x.png differ diff --git a/Telegram/Resources/icons/menu/personal.png b/Telegram/Resources/icons/menu/personal.png new file mode 100644 index 000000000..a06200b21 Binary files /dev/null and b/Telegram/Resources/icons/menu/personal.png differ diff --git a/Telegram/Resources/icons/menu/personal@2x.png b/Telegram/Resources/icons/menu/personal@2x.png new file mode 100644 index 000000000..351a04cda Binary files /dev/null and b/Telegram/Resources/icons/menu/personal@2x.png differ diff --git a/Telegram/Resources/icons/menu/personal@3x.png b/Telegram/Resources/icons/menu/personal@3x.png new file mode 100644 index 000000000..e6b502a71 Binary files /dev/null and b/Telegram/Resources/icons/menu/personal@3x.png differ diff --git a/Telegram/Resources/icons/menu/phone.png b/Telegram/Resources/icons/menu/phone.png new file mode 100644 index 000000000..d059c8e9a Binary files /dev/null and b/Telegram/Resources/icons/menu/phone.png differ diff --git a/Telegram/Resources/icons/menu/phone@2x.png b/Telegram/Resources/icons/menu/phone@2x.png new file mode 100644 index 000000000..920fc33b4 Binary files /dev/null and b/Telegram/Resources/icons/menu/phone@2x.png differ diff --git a/Telegram/Resources/icons/menu/phone@3x.png b/Telegram/Resources/icons/menu/phone@3x.png new file mode 100644 index 000000000..853e7e11a Binary files /dev/null and b/Telegram/Resources/icons/menu/phone@3x.png differ diff --git a/Telegram/Resources/icons/menu/photo_set.png b/Telegram/Resources/icons/menu/photo_set.png new file mode 100644 index 000000000..d96cdb0ec Binary files /dev/null and b/Telegram/Resources/icons/menu/photo_set.png differ diff --git a/Telegram/Resources/icons/menu/photo_set@2x.png b/Telegram/Resources/icons/menu/photo_set@2x.png new file mode 100644 index 000000000..dd6989d16 Binary files /dev/null and b/Telegram/Resources/icons/menu/photo_set@2x.png differ diff --git a/Telegram/Resources/icons/menu/photo_set@3x.png b/Telegram/Resources/icons/menu/photo_set@3x.png new file mode 100644 index 000000000..46dd9aa59 Binary files /dev/null and b/Telegram/Resources/icons/menu/photo_set@3x.png differ diff --git a/Telegram/Resources/icons/menu/photo_suggest.png b/Telegram/Resources/icons/menu/photo_suggest.png new file mode 100644 index 000000000..a62bbd802 Binary files /dev/null and b/Telegram/Resources/icons/menu/photo_suggest.png differ diff --git a/Telegram/Resources/icons/menu/photo_suggest@2x.png b/Telegram/Resources/icons/menu/photo_suggest@2x.png new file mode 100644 index 000000000..e18e19cc0 Binary files /dev/null and b/Telegram/Resources/icons/menu/photo_suggest@2x.png differ diff --git a/Telegram/Resources/icons/menu/photo_suggest@3x.png b/Telegram/Resources/icons/menu/photo_suggest@3x.png new file mode 100644 index 000000000..3fed79585 Binary files /dev/null and b/Telegram/Resources/icons/menu/photo_suggest@3x.png differ diff --git a/Telegram/Resources/icons/menu/pin.png b/Telegram/Resources/icons/menu/pin.png index 33d71245d..d08c95ba0 100644 Binary files a/Telegram/Resources/icons/menu/pin.png and b/Telegram/Resources/icons/menu/pin.png differ diff --git a/Telegram/Resources/icons/menu/pin@2x.png b/Telegram/Resources/icons/menu/pin@2x.png index 08c797846..8ab099781 100644 Binary files a/Telegram/Resources/icons/menu/pin@2x.png and b/Telegram/Resources/icons/menu/pin@2x.png differ diff --git a/Telegram/Resources/icons/menu/pin@3x.png b/Telegram/Resources/icons/menu/pin@3x.png index 3540c235c..78817f9bb 100644 Binary files a/Telegram/Resources/icons/menu/pin@3x.png and b/Telegram/Resources/icons/menu/pin@3x.png differ diff --git a/Telegram/Resources/icons/menu/porn.png b/Telegram/Resources/icons/menu/porn.png new file mode 100644 index 000000000..e28131840 Binary files /dev/null and b/Telegram/Resources/icons/menu/porn.png differ diff --git a/Telegram/Resources/icons/menu/porn@2x.png b/Telegram/Resources/icons/menu/porn@2x.png new file mode 100644 index 000000000..9c90ad7dd Binary files /dev/null and b/Telegram/Resources/icons/menu/porn@2x.png differ diff --git a/Telegram/Resources/icons/menu/porn@3x.png b/Telegram/Resources/icons/menu/porn@3x.png new file mode 100644 index 000000000..cbf82e2cc Binary files /dev/null and b/Telegram/Resources/icons/menu/porn@3x.png differ diff --git a/Telegram/Resources/icons/menu/power_usage.png b/Telegram/Resources/icons/menu/power_usage.png new file mode 100644 index 000000000..a6a8015c6 Binary files /dev/null and b/Telegram/Resources/icons/menu/power_usage.png differ diff --git a/Telegram/Resources/icons/menu/power_usage@2x.png b/Telegram/Resources/icons/menu/power_usage@2x.png new file mode 100644 index 000000000..cf2e46f6c Binary files /dev/null and b/Telegram/Resources/icons/menu/power_usage@2x.png differ diff --git a/Telegram/Resources/icons/menu/power_usage@3x.png b/Telegram/Resources/icons/menu/power_usage@3x.png new file mode 100644 index 000000000..cb81ed700 Binary files /dev/null and b/Telegram/Resources/icons/menu/power_usage@3x.png differ diff --git a/Telegram/Resources/icons/menu/premium.png b/Telegram/Resources/icons/menu/premium.png new file mode 100644 index 000000000..56e0e0e94 Binary files /dev/null and b/Telegram/Resources/icons/menu/premium.png differ diff --git a/Telegram/Resources/icons/menu/premium@2x.png b/Telegram/Resources/icons/menu/premium@2x.png new file mode 100644 index 000000000..64913421b Binary files /dev/null and b/Telegram/Resources/icons/menu/premium@2x.png differ diff --git a/Telegram/Resources/icons/menu/premium@3x.png b/Telegram/Resources/icons/menu/premium@3x.png new file mode 100644 index 000000000..0ba0e8b9f Binary files /dev/null and b/Telegram/Resources/icons/menu/premium@3x.png differ diff --git a/Telegram/Resources/icons/menu/profile.png b/Telegram/Resources/icons/menu/profile.png index df63a62ba..99861b419 100644 Binary files a/Telegram/Resources/icons/menu/profile.png and b/Telegram/Resources/icons/menu/profile.png differ diff --git a/Telegram/Resources/icons/menu/profile@2x.png b/Telegram/Resources/icons/menu/profile@2x.png index c029da4ef..14faac768 100644 Binary files a/Telegram/Resources/icons/menu/profile@2x.png and b/Telegram/Resources/icons/menu/profile@2x.png differ diff --git a/Telegram/Resources/icons/menu/profile@3x.png b/Telegram/Resources/icons/menu/profile@3x.png index e7df675b1..f760db92b 100644 Binary files a/Telegram/Resources/icons/menu/profile@3x.png and b/Telegram/Resources/icons/menu/profile@3x.png differ diff --git a/Telegram/Resources/icons/menu/qr_code.png b/Telegram/Resources/icons/menu/qr_code.png index 81a8a966b..867d86e50 100644 Binary files a/Telegram/Resources/icons/menu/qr_code.png and b/Telegram/Resources/icons/menu/qr_code.png differ diff --git a/Telegram/Resources/icons/menu/qr_code@2x.png b/Telegram/Resources/icons/menu/qr_code@2x.png index 7b872deed..c6ca5db52 100644 Binary files a/Telegram/Resources/icons/menu/qr_code@2x.png and b/Telegram/Resources/icons/menu/qr_code@2x.png differ diff --git a/Telegram/Resources/icons/menu/qr_code@3x.png b/Telegram/Resources/icons/menu/qr_code@3x.png index 79254064d..b6bc8a98f 100644 Binary files a/Telegram/Resources/icons/menu/qr_code@3x.png and b/Telegram/Resources/icons/menu/qr_code@3x.png differ diff --git a/Telegram/Resources/icons/menu/read.png b/Telegram/Resources/icons/menu/read.png index 748dceb40..a1538ee45 100644 Binary files a/Telegram/Resources/icons/menu/read.png and b/Telegram/Resources/icons/menu/read.png differ diff --git a/Telegram/Resources/icons/menu/read@2x.png b/Telegram/Resources/icons/menu/read@2x.png index aa2a81d5b..fed58a586 100644 Binary files a/Telegram/Resources/icons/menu/read@2x.png and b/Telegram/Resources/icons/menu/read@2x.png differ diff --git a/Telegram/Resources/icons/menu/read@3x.png b/Telegram/Resources/icons/menu/read@3x.png index bf5e2b7ea..418b9c82b 100644 Binary files a/Telegram/Resources/icons/menu/read@3x.png and b/Telegram/Resources/icons/menu/read@3x.png differ diff --git a/Telegram/Resources/icons/menu/read_audio.png b/Telegram/Resources/icons/menu/read_audio.png index d5c17e8ee..487af35fe 100644 Binary files a/Telegram/Resources/icons/menu/read_audio.png and b/Telegram/Resources/icons/menu/read_audio.png differ diff --git a/Telegram/Resources/icons/menu/read_audio@2x.png b/Telegram/Resources/icons/menu/read_audio@2x.png index 02cc1967d..2b0673dec 100644 Binary files a/Telegram/Resources/icons/menu/read_audio@2x.png and b/Telegram/Resources/icons/menu/read_audio@2x.png differ diff --git a/Telegram/Resources/icons/menu/read_audio@3x.png b/Telegram/Resources/icons/menu/read_audio@3x.png index 3114aac3c..f3b35e1af 100644 Binary files a/Telegram/Resources/icons/menu/read_audio@3x.png and b/Telegram/Resources/icons/menu/read_audio@3x.png differ diff --git a/Telegram/Resources/icons/menu/read_react_s.png b/Telegram/Resources/icons/menu/read_react_s.png new file mode 100644 index 000000000..8bc379107 Binary files /dev/null and b/Telegram/Resources/icons/menu/read_react_s.png differ diff --git a/Telegram/Resources/icons/menu/read_react_s@2x.png b/Telegram/Resources/icons/menu/read_react_s@2x.png new file mode 100644 index 000000000..6faa7707b Binary files /dev/null and b/Telegram/Resources/icons/menu/read_react_s@2x.png differ diff --git a/Telegram/Resources/icons/menu/read_react_s@3x.png b/Telegram/Resources/icons/menu/read_react_s@3x.png new file mode 100644 index 000000000..1be7ec033 Binary files /dev/null and b/Telegram/Resources/icons/menu/read_react_s@3x.png differ diff --git a/Telegram/Resources/icons/menu/read_reactions.png b/Telegram/Resources/icons/menu/read_reactions.png index b9a718528..639b5fde6 100644 Binary files a/Telegram/Resources/icons/menu/read_reactions.png and b/Telegram/Resources/icons/menu/read_reactions.png differ diff --git a/Telegram/Resources/icons/menu/read_reactions@2x.png b/Telegram/Resources/icons/menu/read_reactions@2x.png index aeb806f0f..2c514e64b 100644 Binary files a/Telegram/Resources/icons/menu/read_reactions@2x.png and b/Telegram/Resources/icons/menu/read_reactions@2x.png differ diff --git a/Telegram/Resources/icons/menu/read_reactions@3x.png b/Telegram/Resources/icons/menu/read_reactions@3x.png index e39e7e45a..b350b5cd1 100644 Binary files a/Telegram/Resources/icons/menu/read_reactions@3x.png and b/Telegram/Resources/icons/menu/read_reactions@3x.png differ diff --git a/Telegram/Resources/icons/menu/read_ticks.png b/Telegram/Resources/icons/menu/read_ticks.png index 69a7cf5c9..af0709d54 100644 Binary files a/Telegram/Resources/icons/menu/read_ticks.png and b/Telegram/Resources/icons/menu/read_ticks.png differ diff --git a/Telegram/Resources/icons/menu/read_ticks@2x.png b/Telegram/Resources/icons/menu/read_ticks@2x.png index 477f34d42..edea7820e 100644 Binary files a/Telegram/Resources/icons/menu/read_ticks@2x.png and b/Telegram/Resources/icons/menu/read_ticks@2x.png differ diff --git a/Telegram/Resources/icons/menu/read_ticks@3x.png b/Telegram/Resources/icons/menu/read_ticks@3x.png index 86c38f0c2..1e90e9d28 100644 Binary files a/Telegram/Resources/icons/menu/read_ticks@3x.png and b/Telegram/Resources/icons/menu/read_ticks@3x.png differ diff --git a/Telegram/Resources/icons/menu/read_ticks_s.png b/Telegram/Resources/icons/menu/read_ticks_s.png new file mode 100644 index 000000000..7482108a6 Binary files /dev/null and b/Telegram/Resources/icons/menu/read_ticks_s.png differ diff --git a/Telegram/Resources/icons/menu/read_ticks_s@2x.png b/Telegram/Resources/icons/menu/read_ticks_s@2x.png new file mode 100644 index 000000000..2566c99cb Binary files /dev/null and b/Telegram/Resources/icons/menu/read_ticks_s@2x.png differ diff --git a/Telegram/Resources/icons/menu/read_ticks_s@3x.png b/Telegram/Resources/icons/menu/read_ticks_s@3x.png new file mode 100644 index 000000000..cf5d9d82b Binary files /dev/null and b/Telegram/Resources/icons/menu/read_ticks_s@3x.png differ diff --git a/Telegram/Resources/icons/menu/recovery_email.png b/Telegram/Resources/icons/menu/recovery_email.png new file mode 100644 index 000000000..a9d149fed Binary files /dev/null and b/Telegram/Resources/icons/menu/recovery_email.png differ diff --git a/Telegram/Resources/icons/menu/recovery_email@2x.png b/Telegram/Resources/icons/menu/recovery_email@2x.png new file mode 100644 index 000000000..dd378b846 Binary files /dev/null and b/Telegram/Resources/icons/menu/recovery_email@2x.png differ diff --git a/Telegram/Resources/icons/menu/recovery_email@3x.png b/Telegram/Resources/icons/menu/recovery_email@3x.png new file mode 100644 index 000000000..1372dd22c Binary files /dev/null and b/Telegram/Resources/icons/menu/recovery_email@3x.png differ diff --git a/Telegram/Resources/icons/menu/remove.png b/Telegram/Resources/icons/menu/remove.png new file mode 100644 index 000000000..e8c9534cd Binary files /dev/null and b/Telegram/Resources/icons/menu/remove.png differ diff --git a/Telegram/Resources/icons/menu/remove@2x.png b/Telegram/Resources/icons/menu/remove@2x.png new file mode 100644 index 000000000..b064e3efe Binary files /dev/null and b/Telegram/Resources/icons/menu/remove@2x.png differ diff --git a/Telegram/Resources/icons/menu/remove@3x.png b/Telegram/Resources/icons/menu/remove@3x.png new file mode 100644 index 000000000..90b1b337d Binary files /dev/null and b/Telegram/Resources/icons/menu/remove@3x.png differ diff --git a/Telegram/Resources/icons/menu/reply.png b/Telegram/Resources/icons/menu/reply.png index 6d14fe2f3..a40619d2e 100644 Binary files a/Telegram/Resources/icons/menu/reply.png and b/Telegram/Resources/icons/menu/reply.png differ diff --git a/Telegram/Resources/icons/menu/reply@2x.png b/Telegram/Resources/icons/menu/reply@2x.png index b0c2f125e..8ea749d73 100644 Binary files a/Telegram/Resources/icons/menu/reply@2x.png and b/Telegram/Resources/icons/menu/reply@2x.png differ diff --git a/Telegram/Resources/icons/menu/reply@3x.png b/Telegram/Resources/icons/menu/reply@3x.png index 4b006f222..04c83d47f 100644 Binary files a/Telegram/Resources/icons/menu/reply@3x.png and b/Telegram/Resources/icons/menu/reply@3x.png differ diff --git a/Telegram/Resources/icons/menu/report.png b/Telegram/Resources/icons/menu/report.png index f78d51534..16c2833fc 100644 Binary files a/Telegram/Resources/icons/menu/report.png and b/Telegram/Resources/icons/menu/report.png differ diff --git a/Telegram/Resources/icons/menu/report@2x.png b/Telegram/Resources/icons/menu/report@2x.png index 607e9eb2c..0f4178c61 100644 Binary files a/Telegram/Resources/icons/menu/report@2x.png and b/Telegram/Resources/icons/menu/report@2x.png differ diff --git a/Telegram/Resources/icons/menu/report@3x.png b/Telegram/Resources/icons/menu/report@3x.png index 83a0229f5..2ffed6fdb 100644 Binary files a/Telegram/Resources/icons/menu/report@3x.png and b/Telegram/Resources/icons/menu/report@3x.png differ diff --git a/Telegram/Resources/icons/menu/reschedule.png b/Telegram/Resources/icons/menu/reschedule.png index 52f25f4f1..84e3fb28c 100644 Binary files a/Telegram/Resources/icons/menu/reschedule.png and b/Telegram/Resources/icons/menu/reschedule.png differ diff --git a/Telegram/Resources/icons/menu/reschedule@2x.png b/Telegram/Resources/icons/menu/reschedule@2x.png index 85464053a..382e23b8c 100644 Binary files a/Telegram/Resources/icons/menu/reschedule@2x.png and b/Telegram/Resources/icons/menu/reschedule@2x.png differ diff --git a/Telegram/Resources/icons/menu/reschedule@3x.png b/Telegram/Resources/icons/menu/reschedule@3x.png index e64a3c489..dde3223b0 100644 Binary files a/Telegram/Resources/icons/menu/reschedule@3x.png and b/Telegram/Resources/icons/menu/reschedule@3x.png differ diff --git a/Telegram/Resources/icons/menu/restart_bot.png b/Telegram/Resources/icons/menu/restart_bot.png index 713b28023..c0e519dbb 100644 Binary files a/Telegram/Resources/icons/menu/restart_bot.png and b/Telegram/Resources/icons/menu/restart_bot.png differ diff --git a/Telegram/Resources/icons/menu/restart_bot@2x.png b/Telegram/Resources/icons/menu/restart_bot@2x.png index 4f35a7aa3..77fc7c146 100644 Binary files a/Telegram/Resources/icons/menu/restart_bot@2x.png and b/Telegram/Resources/icons/menu/restart_bot@2x.png differ diff --git a/Telegram/Resources/icons/menu/restart_bot@3x.png b/Telegram/Resources/icons/menu/restart_bot@3x.png index 3429d712e..62a2a93e6 100644 Binary files a/Telegram/Resources/icons/menu/restart_bot@3x.png and b/Telegram/Resources/icons/menu/restart_bot@3x.png differ diff --git a/Telegram/Resources/icons/menu/restore.png b/Telegram/Resources/icons/menu/restore.png index 77c5cada6..9845be464 100644 Binary files a/Telegram/Resources/icons/menu/restore.png and b/Telegram/Resources/icons/menu/restore.png differ diff --git a/Telegram/Resources/icons/menu/restore@2x.png b/Telegram/Resources/icons/menu/restore@2x.png index c375ba499..5c70d551c 100644 Binary files a/Telegram/Resources/icons/menu/restore@2x.png and b/Telegram/Resources/icons/menu/restore@2x.png differ diff --git a/Telegram/Resources/icons/menu/restore@3x.png b/Telegram/Resources/icons/menu/restore@3x.png index 5afae757e..61f68ace6 100644 Binary files a/Telegram/Resources/icons/menu/restore@3x.png and b/Telegram/Resources/icons/menu/restore@3x.png differ diff --git a/Telegram/Resources/icons/menu/retract_vote.png b/Telegram/Resources/icons/menu/retract_vote.png index ae18d51e9..066a2687a 100644 Binary files a/Telegram/Resources/icons/menu/retract_vote.png and b/Telegram/Resources/icons/menu/retract_vote.png differ diff --git a/Telegram/Resources/icons/menu/retract_vote@2x.png b/Telegram/Resources/icons/menu/retract_vote@2x.png index 20a18160b..f39eb3eae 100644 Binary files a/Telegram/Resources/icons/menu/retract_vote@2x.png and b/Telegram/Resources/icons/menu/retract_vote@2x.png differ diff --git a/Telegram/Resources/icons/menu/retract_vote@3x.png b/Telegram/Resources/icons/menu/retract_vote@3x.png index ee6da2efd..443fea7fa 100644 Binary files a/Telegram/Resources/icons/menu/retract_vote@3x.png and b/Telegram/Resources/icons/menu/retract_vote@3x.png differ diff --git a/Telegram/Resources/icons/menu/save_image.png b/Telegram/Resources/icons/menu/save_image.png index 51899e994..674f8f99d 100644 Binary files a/Telegram/Resources/icons/menu/save_image.png and b/Telegram/Resources/icons/menu/save_image.png differ diff --git a/Telegram/Resources/icons/menu/save_image@2x.png b/Telegram/Resources/icons/menu/save_image@2x.png index 05d1dae5c..3b18135c2 100644 Binary files a/Telegram/Resources/icons/menu/save_image@2x.png and b/Telegram/Resources/icons/menu/save_image@2x.png differ diff --git a/Telegram/Resources/icons/menu/save_image@3x.png b/Telegram/Resources/icons/menu/save_image@3x.png index 1464a3d67..b48252f4e 100644 Binary files a/Telegram/Resources/icons/menu/save_image@3x.png and b/Telegram/Resources/icons/menu/save_image@3x.png differ diff --git a/Telegram/Resources/icons/menu/saved_messages.png b/Telegram/Resources/icons/menu/saved_messages.png new file mode 100644 index 000000000..3b8ba1eb7 Binary files /dev/null and b/Telegram/Resources/icons/menu/saved_messages.png differ diff --git a/Telegram/Resources/icons/menu/saved_messages@2x.png b/Telegram/Resources/icons/menu/saved_messages@2x.png new file mode 100644 index 000000000..b89a09231 Binary files /dev/null and b/Telegram/Resources/icons/menu/saved_messages@2x.png differ diff --git a/Telegram/Resources/icons/menu/saved_messages@3x.png b/Telegram/Resources/icons/menu/saved_messages@3x.png new file mode 100644 index 000000000..6fa7627de Binary files /dev/null and b/Telegram/Resources/icons/menu/saved_messages@3x.png differ diff --git a/Telegram/Resources/icons/menu/search.png b/Telegram/Resources/icons/menu/search.png index 330527560..749f66a84 100644 Binary files a/Telegram/Resources/icons/menu/search.png and b/Telegram/Resources/icons/menu/search.png differ diff --git a/Telegram/Resources/icons/menu/search@2x.png b/Telegram/Resources/icons/menu/search@2x.png index f01073322..fd31430a2 100644 Binary files a/Telegram/Resources/icons/menu/search@2x.png and b/Telegram/Resources/icons/menu/search@2x.png differ diff --git a/Telegram/Resources/icons/menu/search@3x.png b/Telegram/Resources/icons/menu/search@3x.png index 197f7a24c..586d54dca 100644 Binary files a/Telegram/Resources/icons/menu/search@3x.png and b/Telegram/Resources/icons/menu/search@3x.png differ diff --git a/Telegram/Resources/icons/menu/select.png b/Telegram/Resources/icons/menu/select.png index b67513cf5..0aa7863e1 100644 Binary files a/Telegram/Resources/icons/menu/select.png and b/Telegram/Resources/icons/menu/select.png differ diff --git a/Telegram/Resources/icons/menu/select@2x.png b/Telegram/Resources/icons/menu/select@2x.png index 901bf9e49..3d5b7f52e 100644 Binary files a/Telegram/Resources/icons/menu/select@2x.png and b/Telegram/Resources/icons/menu/select@2x.png differ diff --git a/Telegram/Resources/icons/menu/select@3x.png b/Telegram/Resources/icons/menu/select@3x.png index fad75def0..f63a25b39 100644 Binary files a/Telegram/Resources/icons/menu/select@3x.png and b/Telegram/Resources/icons/menu/select@3x.png differ diff --git a/Telegram/Resources/icons/menu/send.png b/Telegram/Resources/icons/menu/send.png index 3daa1f2d8..2c3baee3e 100644 Binary files a/Telegram/Resources/icons/menu/send.png and b/Telegram/Resources/icons/menu/send.png differ diff --git a/Telegram/Resources/icons/menu/send@2x.png b/Telegram/Resources/icons/menu/send@2x.png index 3c7fb0829..b59c1b533 100644 Binary files a/Telegram/Resources/icons/menu/send@2x.png and b/Telegram/Resources/icons/menu/send@2x.png differ diff --git a/Telegram/Resources/icons/menu/send@3x.png b/Telegram/Resources/icons/menu/send@3x.png index 3cf5d4a3e..5c5fadb10 100644 Binary files a/Telegram/Resources/icons/menu/send@3x.png and b/Telegram/Resources/icons/menu/send@3x.png differ diff --git a/Telegram/Resources/icons/menu/send_when_online.png b/Telegram/Resources/icons/menu/send_when_online.png index c351562eb..b69f19b71 100644 Binary files a/Telegram/Resources/icons/menu/send_when_online.png and b/Telegram/Resources/icons/menu/send_when_online.png differ diff --git a/Telegram/Resources/icons/menu/send_when_online@2x.png b/Telegram/Resources/icons/menu/send_when_online@2x.png index 9099425f7..7afff1a92 100644 Binary files a/Telegram/Resources/icons/menu/send_when_online@2x.png and b/Telegram/Resources/icons/menu/send_when_online@2x.png differ diff --git a/Telegram/Resources/icons/menu/send_when_online@3x.png b/Telegram/Resources/icons/menu/send_when_online@3x.png index 57be0db3d..61f3b3173 100644 Binary files a/Telegram/Resources/icons/menu/send_when_online@3x.png and b/Telegram/Resources/icons/menu/send_when_online@3x.png differ diff --git a/Telegram/Resources/icons/menu/settings.png b/Telegram/Resources/icons/menu/settings.png index 9b7ba02b3..27b0cbcd6 100644 Binary files a/Telegram/Resources/icons/menu/settings.png and b/Telegram/Resources/icons/menu/settings.png differ diff --git a/Telegram/Resources/icons/menu/settings@2x.png b/Telegram/Resources/icons/menu/settings@2x.png index 79cd023ac..76e0fbbe4 100644 Binary files a/Telegram/Resources/icons/menu/settings@2x.png and b/Telegram/Resources/icons/menu/settings@2x.png differ diff --git a/Telegram/Resources/icons/menu/settings@3x.png b/Telegram/Resources/icons/menu/settings@3x.png index df1656833..5135a603e 100644 Binary files a/Telegram/Resources/icons/menu/settings@3x.png and b/Telegram/Resources/icons/menu/settings@3x.png differ diff --git a/Telegram/Resources/icons/menu/share.png b/Telegram/Resources/icons/menu/share.png index 0083d3ce9..f7556dd4b 100644 Binary files a/Telegram/Resources/icons/menu/share.png and b/Telegram/Resources/icons/menu/share.png differ diff --git a/Telegram/Resources/icons/menu/share2.png b/Telegram/Resources/icons/menu/share2.png index cc8d32ac2..23ae02c18 100644 Binary files a/Telegram/Resources/icons/menu/share2.png and b/Telegram/Resources/icons/menu/share2.png differ diff --git a/Telegram/Resources/icons/menu/share2@2x.png b/Telegram/Resources/icons/menu/share2@2x.png index 5b5fe0069..457fa6574 100644 Binary files a/Telegram/Resources/icons/menu/share2@2x.png and b/Telegram/Resources/icons/menu/share2@2x.png differ diff --git a/Telegram/Resources/icons/menu/share2@3x.png b/Telegram/Resources/icons/menu/share2@3x.png index 450f17fdb..22e5b84ac 100644 Binary files a/Telegram/Resources/icons/menu/share2@3x.png and b/Telegram/Resources/icons/menu/share2@3x.png differ diff --git a/Telegram/Resources/icons/menu/share@2x.png b/Telegram/Resources/icons/menu/share@2x.png index 71fd45bc8..c4917d7e4 100644 Binary files a/Telegram/Resources/icons/menu/share@2x.png and b/Telegram/Resources/icons/menu/share@2x.png differ diff --git a/Telegram/Resources/icons/menu/share@3x.png b/Telegram/Resources/icons/menu/share@3x.png index 9f2dadbbd..9956c0129 100644 Binary files a/Telegram/Resources/icons/menu/share@3x.png and b/Telegram/Resources/icons/menu/share@3x.png differ diff --git a/Telegram/Resources/icons/menu/shop.png b/Telegram/Resources/icons/menu/shop.png new file mode 100644 index 000000000..80dfbc6f1 Binary files /dev/null and b/Telegram/Resources/icons/menu/shop.png differ diff --git a/Telegram/Resources/icons/menu/shop@2x.png b/Telegram/Resources/icons/menu/shop@2x.png new file mode 100644 index 000000000..38625e754 Binary files /dev/null and b/Telegram/Resources/icons/menu/shop@2x.png differ diff --git a/Telegram/Resources/icons/menu/shop@3x.png b/Telegram/Resources/icons/menu/shop@3x.png new file mode 100644 index 000000000..0da0b229c Binary files /dev/null and b/Telegram/Resources/icons/menu/shop@3x.png differ diff --git a/Telegram/Resources/icons/menu/show_in_chat.png b/Telegram/Resources/icons/menu/show_in_chat.png index e9e7c0b1b..4d3da0457 100644 Binary files a/Telegram/Resources/icons/menu/show_in_chat.png and b/Telegram/Resources/icons/menu/show_in_chat.png differ diff --git a/Telegram/Resources/icons/menu/show_in_chat@2x.png b/Telegram/Resources/icons/menu/show_in_chat@2x.png index a69a81931..fcbd319ce 100644 Binary files a/Telegram/Resources/icons/menu/show_in_chat@2x.png and b/Telegram/Resources/icons/menu/show_in_chat@2x.png differ diff --git a/Telegram/Resources/icons/menu/show_in_chat@3x.png b/Telegram/Resources/icons/menu/show_in_chat@3x.png index 3e363244c..61a108d9d 100644 Binary files a/Telegram/Resources/icons/menu/show_in_chat@3x.png and b/Telegram/Resources/icons/menu/show_in_chat@3x.png differ diff --git a/Telegram/Resources/icons/menu/show_in_folder.png b/Telegram/Resources/icons/menu/show_in_folder.png index c10ca4ac1..0137c5a2a 100644 Binary files a/Telegram/Resources/icons/menu/show_in_folder.png and b/Telegram/Resources/icons/menu/show_in_folder.png differ diff --git a/Telegram/Resources/icons/menu/show_in_folder@2x.png b/Telegram/Resources/icons/menu/show_in_folder@2x.png index 0ff5f823c..31bacb2f8 100644 Binary files a/Telegram/Resources/icons/menu/show_in_folder@2x.png and b/Telegram/Resources/icons/menu/show_in_folder@2x.png differ diff --git a/Telegram/Resources/icons/menu/show_in_folder@3x.png b/Telegram/Resources/icons/menu/show_in_folder@3x.png index fd4c34710..422c4dea6 100644 Binary files a/Telegram/Resources/icons/menu/show_in_folder@3x.png and b/Telegram/Resources/icons/menu/show_in_folder@3x.png differ diff --git a/Telegram/Resources/icons/menu/signed.png b/Telegram/Resources/icons/menu/signed.png new file mode 100644 index 000000000..ab59a070d Binary files /dev/null and b/Telegram/Resources/icons/menu/signed.png differ diff --git a/Telegram/Resources/icons/menu/signed@2x.png b/Telegram/Resources/icons/menu/signed@2x.png new file mode 100644 index 000000000..e8a3faaf1 Binary files /dev/null and b/Telegram/Resources/icons/menu/signed@2x.png differ diff --git a/Telegram/Resources/icons/menu/signed@3x.png b/Telegram/Resources/icons/menu/signed@3x.png new file mode 100644 index 000000000..2a9e1011f Binary files /dev/null and b/Telegram/Resources/icons/menu/signed@3x.png differ diff --git a/Telegram/Resources/icons/menu/silent.png b/Telegram/Resources/icons/menu/silent.png new file mode 100644 index 000000000..16602a7c5 Binary files /dev/null and b/Telegram/Resources/icons/menu/silent.png differ diff --git a/Telegram/Resources/icons/menu/silent@2x.png b/Telegram/Resources/icons/menu/silent@2x.png new file mode 100644 index 000000000..6d6dabab1 Binary files /dev/null and b/Telegram/Resources/icons/menu/silent@2x.png differ diff --git a/Telegram/Resources/icons/menu/silent@3x.png b/Telegram/Resources/icons/menu/silent@3x.png new file mode 100644 index 000000000..e4f4f943c Binary files /dev/null and b/Telegram/Resources/icons/menu/silent@3x.png differ diff --git a/Telegram/Resources/icons/menu/sound_add.png b/Telegram/Resources/icons/menu/sound_add.png new file mode 100644 index 000000000..f2d02e3d3 Binary files /dev/null and b/Telegram/Resources/icons/menu/sound_add.png differ diff --git a/Telegram/Resources/icons/menu/sound_add@2x.png b/Telegram/Resources/icons/menu/sound_add@2x.png new file mode 100644 index 000000000..a310c1bd8 Binary files /dev/null and b/Telegram/Resources/icons/menu/sound_add@2x.png differ diff --git a/Telegram/Resources/icons/menu/sound_add@3x.png b/Telegram/Resources/icons/menu/sound_add@3x.png new file mode 100644 index 000000000..736d44807 Binary files /dev/null and b/Telegram/Resources/icons/menu/sound_add@3x.png differ diff --git a/Telegram/Resources/icons/menu/sound_disable.png b/Telegram/Resources/icons/menu/sound_disable.png new file mode 100644 index 000000000..75b6855f6 Binary files /dev/null and b/Telegram/Resources/icons/menu/sound_disable.png differ diff --git a/Telegram/Resources/icons/menu/sound_disable@2x.png b/Telegram/Resources/icons/menu/sound_disable@2x.png new file mode 100644 index 000000000..61cd25584 Binary files /dev/null and b/Telegram/Resources/icons/menu/sound_disable@2x.png differ diff --git a/Telegram/Resources/icons/menu/sound_disable@3x.png b/Telegram/Resources/icons/menu/sound_disable@3x.png new file mode 100644 index 000000000..720679458 Binary files /dev/null and b/Telegram/Resources/icons/menu/sound_disable@3x.png differ diff --git a/Telegram/Resources/icons/menu/sound_enable.png b/Telegram/Resources/icons/menu/sound_enable.png new file mode 100644 index 000000000..ae80664c2 Binary files /dev/null and b/Telegram/Resources/icons/menu/sound_enable.png differ diff --git a/Telegram/Resources/icons/menu/sound_enable@2x.png b/Telegram/Resources/icons/menu/sound_enable@2x.png new file mode 100644 index 000000000..57f11693c Binary files /dev/null and b/Telegram/Resources/icons/menu/sound_enable@2x.png differ diff --git a/Telegram/Resources/icons/menu/sound_enable@3x.png b/Telegram/Resources/icons/menu/sound_enable@3x.png new file mode 100644 index 000000000..c91d56032 Binary files /dev/null and b/Telegram/Resources/icons/menu/sound_enable@3x.png differ diff --git a/Telegram/Resources/icons/menu/sound_select.png b/Telegram/Resources/icons/menu/sound_select.png new file mode 100644 index 000000000..99587321d Binary files /dev/null and b/Telegram/Resources/icons/menu/sound_select.png differ diff --git a/Telegram/Resources/icons/menu/sound_select@2x.png b/Telegram/Resources/icons/menu/sound_select@2x.png new file mode 100644 index 000000000..387ea1788 Binary files /dev/null and b/Telegram/Resources/icons/menu/sound_select@2x.png differ diff --git a/Telegram/Resources/icons/menu/sound_select@3x.png b/Telegram/Resources/icons/menu/sound_select@3x.png new file mode 100644 index 000000000..93eb1f8bd Binary files /dev/null and b/Telegram/Resources/icons/menu/sound_select@3x.png differ diff --git a/Telegram/Resources/icons/menu/spoiler_off.png b/Telegram/Resources/icons/menu/spoiler_off.png new file mode 100644 index 000000000..c694fd15d Binary files /dev/null and b/Telegram/Resources/icons/menu/spoiler_off.png differ diff --git a/Telegram/Resources/icons/menu/spoiler_off@2x.png b/Telegram/Resources/icons/menu/spoiler_off@2x.png new file mode 100644 index 000000000..9400628b8 Binary files /dev/null and b/Telegram/Resources/icons/menu/spoiler_off@2x.png differ diff --git a/Telegram/Resources/icons/menu/spoiler_off@3x.png b/Telegram/Resources/icons/menu/spoiler_off@3x.png new file mode 100644 index 000000000..ce6598ad8 Binary files /dev/null and b/Telegram/Resources/icons/menu/spoiler_off@3x.png differ diff --git a/Telegram/Resources/icons/menu/spoiler_on.png b/Telegram/Resources/icons/menu/spoiler_on.png new file mode 100644 index 000000000..8c295861e Binary files /dev/null and b/Telegram/Resources/icons/menu/spoiler_on.png differ diff --git a/Telegram/Resources/icons/menu/spoiler_on@2x.png b/Telegram/Resources/icons/menu/spoiler_on@2x.png new file mode 100644 index 000000000..2e4e74961 Binary files /dev/null and b/Telegram/Resources/icons/menu/spoiler_on@2x.png differ diff --git a/Telegram/Resources/icons/menu/spoiler_on@3x.png b/Telegram/Resources/icons/menu/spoiler_on@3x.png new file mode 100644 index 000000000..23c83bbba Binary files /dev/null and b/Telegram/Resources/icons/menu/spoiler_on@3x.png differ diff --git a/Telegram/Resources/icons/menu/start_stream.png b/Telegram/Resources/icons/menu/start_stream.png new file mode 100644 index 000000000..a227d9b26 Binary files /dev/null and b/Telegram/Resources/icons/menu/start_stream.png differ diff --git a/Telegram/Resources/icons/menu/start_stream@2x.png b/Telegram/Resources/icons/menu/start_stream@2x.png new file mode 100644 index 000000000..cd079f659 Binary files /dev/null and b/Telegram/Resources/icons/menu/start_stream@2x.png differ diff --git a/Telegram/Resources/icons/menu/start_stream@3x.png b/Telegram/Resources/icons/menu/start_stream@3x.png new file mode 100644 index 000000000..314aae9fe Binary files /dev/null and b/Telegram/Resources/icons/menu/start_stream@3x.png differ diff --git a/Telegram/Resources/icons/menu/start_stream_with.png b/Telegram/Resources/icons/menu/start_stream_with.png new file mode 100644 index 000000000..d6115a134 Binary files /dev/null and b/Telegram/Resources/icons/menu/start_stream_with.png differ diff --git a/Telegram/Resources/icons/menu/start_stream_with@2x.png b/Telegram/Resources/icons/menu/start_stream_with@2x.png new file mode 100644 index 000000000..be9c9ab1f Binary files /dev/null and b/Telegram/Resources/icons/menu/start_stream_with@2x.png differ diff --git a/Telegram/Resources/icons/menu/start_stream_with@3x.png b/Telegram/Resources/icons/menu/start_stream_with@3x.png new file mode 100644 index 000000000..c0c346114 Binary files /dev/null and b/Telegram/Resources/icons/menu/start_stream_with@3x.png differ diff --git a/Telegram/Resources/icons/menu/stats.png b/Telegram/Resources/icons/menu/stats.png new file mode 100644 index 000000000..0bafaa395 Binary files /dev/null and b/Telegram/Resources/icons/menu/stats.png differ diff --git a/Telegram/Resources/icons/menu/stats@2x.png b/Telegram/Resources/icons/menu/stats@2x.png new file mode 100644 index 000000000..18db4e9ec Binary files /dev/null and b/Telegram/Resources/icons/menu/stats@2x.png differ diff --git a/Telegram/Resources/icons/menu/stats@3x.png b/Telegram/Resources/icons/menu/stats@3x.png new file mode 100644 index 000000000..77bc3547d Binary files /dev/null and b/Telegram/Resources/icons/menu/stats@3x.png differ diff --git a/Telegram/Resources/icons/menu/stealth.png b/Telegram/Resources/icons/menu/stealth.png new file mode 100644 index 000000000..af12353a9 Binary files /dev/null and b/Telegram/Resources/icons/menu/stealth.png differ diff --git a/Telegram/Resources/icons/menu/stealth@2x.png b/Telegram/Resources/icons/menu/stealth@2x.png new file mode 100644 index 000000000..50706a61f Binary files /dev/null and b/Telegram/Resources/icons/menu/stealth@2x.png differ diff --git a/Telegram/Resources/icons/menu/stealth@3x.png b/Telegram/Resources/icons/menu/stealth@3x.png new file mode 100644 index 000000000..c659d25b8 Binary files /dev/null and b/Telegram/Resources/icons/menu/stealth@3x.png differ diff --git a/Telegram/Resources/icons/menu/stealth_locked.png b/Telegram/Resources/icons/menu/stealth_locked.png new file mode 100644 index 000000000..dbc0cb5e3 Binary files /dev/null and b/Telegram/Resources/icons/menu/stealth_locked.png differ diff --git a/Telegram/Resources/icons/menu/stealth_locked@2x.png b/Telegram/Resources/icons/menu/stealth_locked@2x.png new file mode 100644 index 000000000..979e23d5c Binary files /dev/null and b/Telegram/Resources/icons/menu/stealth_locked@2x.png differ diff --git a/Telegram/Resources/icons/menu/stealth_locked@3x.png b/Telegram/Resources/icons/menu/stealth_locked@3x.png new file mode 100644 index 000000000..07278760a Binary files /dev/null and b/Telegram/Resources/icons/menu/stealth_locked@3x.png differ diff --git a/Telegram/Resources/icons/menu/stickers.png b/Telegram/Resources/icons/menu/stickers.png index cd5982410..85ff22cfc 100644 Binary files a/Telegram/Resources/icons/menu/stickers.png and b/Telegram/Resources/icons/menu/stickers.png differ diff --git a/Telegram/Resources/icons/menu/stickers@2x.png b/Telegram/Resources/icons/menu/stickers@2x.png index 58b4c68fa..f681ecce6 100644 Binary files a/Telegram/Resources/icons/menu/stickers@2x.png and b/Telegram/Resources/icons/menu/stickers@2x.png differ diff --git a/Telegram/Resources/icons/menu/stickers@3x.png b/Telegram/Resources/icons/menu/stickers@3x.png index b2ee00182..cc688e32f 100644 Binary files a/Telegram/Resources/icons/menu/stickers@3x.png and b/Telegram/Resources/icons/menu/stickers@3x.png differ diff --git a/Telegram/Resources/icons/menu/stop_poll.png b/Telegram/Resources/icons/menu/stop_poll.png deleted file mode 100644 index fefc3b20d..000000000 Binary files a/Telegram/Resources/icons/menu/stop_poll.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu/stop_poll@2x.png b/Telegram/Resources/icons/menu/stop_poll@2x.png deleted file mode 100644 index 36844744e..000000000 Binary files a/Telegram/Resources/icons/menu/stop_poll@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu/stop_poll@3x.png b/Telegram/Resources/icons/menu/stop_poll@3x.png deleted file mode 100644 index e776e66ad..000000000 Binary files a/Telegram/Resources/icons/menu/stop_poll@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu/storage.png b/Telegram/Resources/icons/menu/storage.png new file mode 100644 index 000000000..ce6ffd0a3 Binary files /dev/null and b/Telegram/Resources/icons/menu/storage.png differ diff --git a/Telegram/Resources/icons/menu/storage@2x.png b/Telegram/Resources/icons/menu/storage@2x.png new file mode 100644 index 000000000..c38320ba7 Binary files /dev/null and b/Telegram/Resources/icons/menu/storage@2x.png differ diff --git a/Telegram/Resources/icons/menu/storage@3x.png b/Telegram/Resources/icons/menu/storage@3x.png new file mode 100644 index 000000000..532f2ec0f Binary files /dev/null and b/Telegram/Resources/icons/menu/storage@3x.png differ diff --git a/Telegram/Resources/icons/menu/stories_archive.png b/Telegram/Resources/icons/menu/stories_archive.png new file mode 100644 index 000000000..a98e8583c Binary files /dev/null and b/Telegram/Resources/icons/menu/stories_archive.png differ diff --git a/Telegram/Resources/icons/menu/stories_archive@2x.png b/Telegram/Resources/icons/menu/stories_archive@2x.png new file mode 100644 index 000000000..5c5602569 Binary files /dev/null and b/Telegram/Resources/icons/menu/stories_archive@2x.png differ diff --git a/Telegram/Resources/icons/menu/stories_archive@3x.png b/Telegram/Resources/icons/menu/stories_archive@3x.png new file mode 100644 index 000000000..715f241ba Binary files /dev/null and b/Telegram/Resources/icons/menu/stories_archive@3x.png differ diff --git a/Telegram/Resources/icons/menu/stories_archive_section.png b/Telegram/Resources/icons/menu/stories_archive_section.png new file mode 100644 index 000000000..d86b5dc87 Binary files /dev/null and b/Telegram/Resources/icons/menu/stories_archive_section.png differ diff --git a/Telegram/Resources/icons/menu/stories_archive_section@2x.png b/Telegram/Resources/icons/menu/stories_archive_section@2x.png new file mode 100644 index 000000000..f2c59be33 Binary files /dev/null and b/Telegram/Resources/icons/menu/stories_archive_section@2x.png differ diff --git a/Telegram/Resources/icons/menu/stories_archive_section@3x.png b/Telegram/Resources/icons/menu/stories_archive_section@3x.png new file mode 100644 index 000000000..f6369c74c Binary files /dev/null and b/Telegram/Resources/icons/menu/stories_archive_section@3x.png differ diff --git a/Telegram/Resources/icons/menu/stories_save.png b/Telegram/Resources/icons/menu/stories_save.png new file mode 100644 index 000000000..68d2a12f4 Binary files /dev/null and b/Telegram/Resources/icons/menu/stories_save.png differ diff --git a/Telegram/Resources/icons/menu/stories_save@2x.png b/Telegram/Resources/icons/menu/stories_save@2x.png new file mode 100644 index 000000000..327054159 Binary files /dev/null and b/Telegram/Resources/icons/menu/stories_save@2x.png differ diff --git a/Telegram/Resources/icons/menu/stories_save@3x.png b/Telegram/Resources/icons/menu/stories_save@3x.png new file mode 100644 index 000000000..e97dac0ab Binary files /dev/null and b/Telegram/Resources/icons/menu/stories_save@3x.png differ diff --git a/Telegram/Resources/icons/menu/stories_saved_section.png b/Telegram/Resources/icons/menu/stories_saved_section.png new file mode 100644 index 000000000..31a29d96b Binary files /dev/null and b/Telegram/Resources/icons/menu/stories_saved_section.png differ diff --git a/Telegram/Resources/icons/menu/stories_saved_section@2x.png b/Telegram/Resources/icons/menu/stories_saved_section@2x.png new file mode 100644 index 000000000..02a9f4687 Binary files /dev/null and b/Telegram/Resources/icons/menu/stories_saved_section@2x.png differ diff --git a/Telegram/Resources/icons/menu/stories_saved_section@3x.png b/Telegram/Resources/icons/menu/stories_saved_section@3x.png new file mode 100644 index 000000000..8de09fb32 Binary files /dev/null and b/Telegram/Resources/icons/menu/stories_saved_section@3x.png differ diff --git a/Telegram/Resources/icons/menu/stories_to_chats.png b/Telegram/Resources/icons/menu/stories_to_chats.png new file mode 100644 index 000000000..b5129521c Binary files /dev/null and b/Telegram/Resources/icons/menu/stories_to_chats.png differ diff --git a/Telegram/Resources/icons/menu/stories_to_chats@2x.png b/Telegram/Resources/icons/menu/stories_to_chats@2x.png new file mode 100644 index 000000000..575fcc811 Binary files /dev/null and b/Telegram/Resources/icons/menu/stories_to_chats@2x.png differ diff --git a/Telegram/Resources/icons/menu/stories_to_chats@3x.png b/Telegram/Resources/icons/menu/stories_to_chats@3x.png new file mode 100644 index 000000000..00f6b959b Binary files /dev/null and b/Telegram/Resources/icons/menu/stories_to_chats@3x.png differ diff --git a/Telegram/Resources/icons/menu/submenu_arrow.png b/Telegram/Resources/icons/menu/submenu_arrow.png new file mode 100644 index 000000000..022a5fd50 Binary files /dev/null and b/Telegram/Resources/icons/menu/submenu_arrow.png differ diff --git a/Telegram/Resources/icons/menu/submenu_arrow@2x.png b/Telegram/Resources/icons/menu/submenu_arrow@2x.png new file mode 100644 index 000000000..2b2337921 Binary files /dev/null and b/Telegram/Resources/icons/menu/submenu_arrow@2x.png differ diff --git a/Telegram/Resources/icons/menu/submenu_arrow@3x.png b/Telegram/Resources/icons/menu/submenu_arrow@3x.png new file mode 100644 index 000000000..b63fca348 Binary files /dev/null and b/Telegram/Resources/icons/menu/submenu_arrow@3x.png differ diff --git a/Telegram/Resources/icons/menu/tag_filter.png b/Telegram/Resources/icons/menu/tag_filter.png new file mode 100644 index 000000000..1bef612c5 Binary files /dev/null and b/Telegram/Resources/icons/menu/tag_filter.png differ diff --git a/Telegram/Resources/icons/menu/tag_filter@2x.png b/Telegram/Resources/icons/menu/tag_filter@2x.png new file mode 100644 index 000000000..056113881 Binary files /dev/null and b/Telegram/Resources/icons/menu/tag_filter@2x.png differ diff --git a/Telegram/Resources/icons/menu/tag_filter@3x.png b/Telegram/Resources/icons/menu/tag_filter@3x.png new file mode 100644 index 000000000..e8661460e Binary files /dev/null and b/Telegram/Resources/icons/menu/tag_filter@3x.png differ diff --git a/Telegram/Resources/icons/menu/tag_remove.png b/Telegram/Resources/icons/menu/tag_remove.png new file mode 100644 index 000000000..0a495b4ef Binary files /dev/null and b/Telegram/Resources/icons/menu/tag_remove.png differ diff --git a/Telegram/Resources/icons/menu/tag_remove@2x.png b/Telegram/Resources/icons/menu/tag_remove@2x.png new file mode 100644 index 000000000..521ab6968 Binary files /dev/null and b/Telegram/Resources/icons/menu/tag_remove@2x.png differ diff --git a/Telegram/Resources/icons/menu/tag_remove@3x.png b/Telegram/Resources/icons/menu/tag_remove@3x.png new file mode 100644 index 000000000..5ebfb2b91 Binary files /dev/null and b/Telegram/Resources/icons/menu/tag_remove@3x.png differ diff --git a/Telegram/Resources/icons/menu/tag_rename.png b/Telegram/Resources/icons/menu/tag_rename.png new file mode 100644 index 000000000..69040f6aa Binary files /dev/null and b/Telegram/Resources/icons/menu/tag_rename.png differ diff --git a/Telegram/Resources/icons/menu/tag_rename@2x.png b/Telegram/Resources/icons/menu/tag_rename@2x.png new file mode 100644 index 000000000..2eb0fb82f Binary files /dev/null and b/Telegram/Resources/icons/menu/tag_rename@2x.png differ diff --git a/Telegram/Resources/icons/menu/tag_rename@3x.png b/Telegram/Resources/icons/menu/tag_rename@3x.png new file mode 100644 index 000000000..ec18a3f00 Binary files /dev/null and b/Telegram/Resources/icons/menu/tag_rename@3x.png differ diff --git a/Telegram/Resources/icons/menu/timer.png b/Telegram/Resources/icons/menu/timer.png new file mode 100644 index 000000000..5fe0383b4 Binary files /dev/null and b/Telegram/Resources/icons/menu/timer.png differ diff --git a/Telegram/Resources/icons/menu/timer@2x.png b/Telegram/Resources/icons/menu/timer@2x.png new file mode 100644 index 000000000..28d3d1480 Binary files /dev/null and b/Telegram/Resources/icons/menu/timer@2x.png differ diff --git a/Telegram/Resources/icons/menu/timer@3x.png b/Telegram/Resources/icons/menu/timer@3x.png new file mode 100644 index 000000000..173ad913d Binary files /dev/null and b/Telegram/Resources/icons/menu/timer@3x.png differ diff --git a/Telegram/Resources/icons/menu/topics.png b/Telegram/Resources/icons/menu/topics.png new file mode 100644 index 000000000..3e5eed67b Binary files /dev/null and b/Telegram/Resources/icons/menu/topics.png differ diff --git a/Telegram/Resources/icons/menu/topics@2x.png b/Telegram/Resources/icons/menu/topics@2x.png new file mode 100644 index 000000000..789d9cf60 Binary files /dev/null and b/Telegram/Resources/icons/menu/topics@2x.png differ diff --git a/Telegram/Resources/icons/menu/topics@3x.png b/Telegram/Resources/icons/menu/topics@3x.png new file mode 100644 index 000000000..f5c03b336 Binary files /dev/null and b/Telegram/Resources/icons/menu/topics@3x.png differ diff --git a/Telegram/Resources/icons/menu/translate.png b/Telegram/Resources/icons/menu/translate.png new file mode 100644 index 000000000..b37521976 Binary files /dev/null and b/Telegram/Resources/icons/menu/translate.png differ diff --git a/Telegram/Resources/icons/menu/translate@2x.png b/Telegram/Resources/icons/menu/translate@2x.png new file mode 100644 index 000000000..b4b7b9a26 Binary files /dev/null and b/Telegram/Resources/icons/menu/translate@2x.png differ diff --git a/Telegram/Resources/icons/menu/translate@3x.png b/Telegram/Resources/icons/menu/translate@3x.png new file mode 100644 index 000000000..1ee1ff844 Binary files /dev/null and b/Telegram/Resources/icons/menu/translate@3x.png differ diff --git a/Telegram/Resources/icons/menu/unarchive.png b/Telegram/Resources/icons/menu/unarchive.png index 358c6f38d..5b73b0f5b 100644 Binary files a/Telegram/Resources/icons/menu/unarchive.png and b/Telegram/Resources/icons/menu/unarchive.png differ diff --git a/Telegram/Resources/icons/menu/unarchive@2x.png b/Telegram/Resources/icons/menu/unarchive@2x.png index 807a027da..0161fb017 100644 Binary files a/Telegram/Resources/icons/menu/unarchive@2x.png and b/Telegram/Resources/icons/menu/unarchive@2x.png differ diff --git a/Telegram/Resources/icons/menu/unarchive@3x.png b/Telegram/Resources/icons/menu/unarchive@3x.png index 95e772123..dcd9bac16 100644 Binary files a/Telegram/Resources/icons/menu/unarchive@3x.png and b/Telegram/Resources/icons/menu/unarchive@3x.png differ diff --git a/Telegram/Resources/icons/menu/unblock.png b/Telegram/Resources/icons/menu/unblock.png index 9c204d83d..d5e7b77de 100644 Binary files a/Telegram/Resources/icons/menu/unblock.png and b/Telegram/Resources/icons/menu/unblock.png differ diff --git a/Telegram/Resources/icons/menu/unblock@2x.png b/Telegram/Resources/icons/menu/unblock@2x.png index 3908aaedb..f9dd07e35 100644 Binary files a/Telegram/Resources/icons/menu/unblock@2x.png and b/Telegram/Resources/icons/menu/unblock@2x.png differ diff --git a/Telegram/Resources/icons/menu/unblock@3x.png b/Telegram/Resources/icons/menu/unblock@3x.png index 8307f541e..b77f8a013 100644 Binary files a/Telegram/Resources/icons/menu/unblock@3x.png and b/Telegram/Resources/icons/menu/unblock@3x.png differ diff --git a/Telegram/Resources/icons/menu/unfavorite.png b/Telegram/Resources/icons/menu/unfavorite.png index dbad8a154..a5144121d 100644 Binary files a/Telegram/Resources/icons/menu/unfavorite.png and b/Telegram/Resources/icons/menu/unfavorite.png differ diff --git a/Telegram/Resources/icons/menu/unfavorite@2x.png b/Telegram/Resources/icons/menu/unfavorite@2x.png index 976f45135..ff09e666c 100644 Binary files a/Telegram/Resources/icons/menu/unfavorite@2x.png and b/Telegram/Resources/icons/menu/unfavorite@2x.png differ diff --git a/Telegram/Resources/icons/menu/unfavorite@3x.png b/Telegram/Resources/icons/menu/unfavorite@3x.png index 65642ed70..9f92ba418 100644 Binary files a/Telegram/Resources/icons/menu/unfavorite@3x.png and b/Telegram/Resources/icons/menu/unfavorite@3x.png differ diff --git a/Telegram/Resources/icons/menu/unmute.png b/Telegram/Resources/icons/menu/unmute.png index c6aa5c4cb..6ca7b4649 100644 Binary files a/Telegram/Resources/icons/menu/unmute.png and b/Telegram/Resources/icons/menu/unmute.png differ diff --git a/Telegram/Resources/icons/menu/unmute@2x.png b/Telegram/Resources/icons/menu/unmute@2x.png index b274b61ee..72b30b701 100644 Binary files a/Telegram/Resources/icons/menu/unmute@2x.png and b/Telegram/Resources/icons/menu/unmute@2x.png differ diff --git a/Telegram/Resources/icons/menu/unmute@3x.png b/Telegram/Resources/icons/menu/unmute@3x.png index 5808a5594..e7d8d7cc4 100644 Binary files a/Telegram/Resources/icons/menu/unmute@3x.png and b/Telegram/Resources/icons/menu/unmute@3x.png differ diff --git a/Telegram/Resources/icons/menu/unpin.png b/Telegram/Resources/icons/menu/unpin.png index 9c62c0c33..39dd422b3 100644 Binary files a/Telegram/Resources/icons/menu/unpin.png and b/Telegram/Resources/icons/menu/unpin.png differ diff --git a/Telegram/Resources/icons/menu/unpin@2x.png b/Telegram/Resources/icons/menu/unpin@2x.png index 37c34e80b..2139c7251 100644 Binary files a/Telegram/Resources/icons/menu/unpin@2x.png and b/Telegram/Resources/icons/menu/unpin@2x.png differ diff --git a/Telegram/Resources/icons/menu/unpin@3x.png b/Telegram/Resources/icons/menu/unpin@3x.png index 0151d858d..fc5d64a4c 100644 Binary files a/Telegram/Resources/icons/menu/unpin@3x.png and b/Telegram/Resources/icons/menu/unpin@3x.png differ diff --git a/Telegram/Resources/icons/menu/unread.png b/Telegram/Resources/icons/menu/unread.png index 0e8396588..1d6177c1e 100644 Binary files a/Telegram/Resources/icons/menu/unread.png and b/Telegram/Resources/icons/menu/unread.png differ diff --git a/Telegram/Resources/icons/menu/unread@2x.png b/Telegram/Resources/icons/menu/unread@2x.png index b452b9e74..435897922 100644 Binary files a/Telegram/Resources/icons/menu/unread@2x.png and b/Telegram/Resources/icons/menu/unread@2x.png differ diff --git a/Telegram/Resources/icons/menu/unread@3x.png b/Telegram/Resources/icons/menu/unread@3x.png index d8571a7c9..046db9de1 100644 Binary files a/Telegram/Resources/icons/menu/unread@3x.png and b/Telegram/Resources/icons/menu/unread@3x.png differ diff --git a/Telegram/Resources/icons/menu/video_chat.png b/Telegram/Resources/icons/menu/video_chat.png new file mode 100644 index 000000000..fd5728dc7 Binary files /dev/null and b/Telegram/Resources/icons/menu/video_chat.png differ diff --git a/Telegram/Resources/icons/menu/video_chat@2x.png b/Telegram/Resources/icons/menu/video_chat@2x.png new file mode 100644 index 000000000..63cb517db Binary files /dev/null and b/Telegram/Resources/icons/menu/video_chat@2x.png differ diff --git a/Telegram/Resources/icons/menu/video_chat@3x.png b/Telegram/Resources/icons/menu/video_chat@3x.png new file mode 100644 index 000000000..e6d49c028 Binary files /dev/null and b/Telegram/Resources/icons/menu/video_chat@3x.png differ diff --git a/Telegram/Resources/icons/menu/view_replies.png b/Telegram/Resources/icons/menu/view_replies.png index 2f57201cc..d075f8d66 100644 Binary files a/Telegram/Resources/icons/menu/view_replies.png and b/Telegram/Resources/icons/menu/view_replies.png differ diff --git a/Telegram/Resources/icons/menu/view_replies@2x.png b/Telegram/Resources/icons/menu/view_replies@2x.png index 4121c8a13..6970c2529 100644 Binary files a/Telegram/Resources/icons/menu/view_replies@2x.png and b/Telegram/Resources/icons/menu/view_replies@2x.png differ diff --git a/Telegram/Resources/icons/menu/view_replies@3x.png b/Telegram/Resources/icons/menu/view_replies@3x.png index 8055156bd..d3c1156ee 100644 Binary files a/Telegram/Resources/icons/menu/view_replies@3x.png and b/Telegram/Resources/icons/menu/view_replies@3x.png differ diff --git a/Telegram/Resources/icons/menu/violence.png b/Telegram/Resources/icons/menu/violence.png new file mode 100644 index 000000000..39ee442ee Binary files /dev/null and b/Telegram/Resources/icons/menu/violence.png differ diff --git a/Telegram/Resources/icons/menu/violence@2x.png b/Telegram/Resources/icons/menu/violence@2x.png new file mode 100644 index 000000000..a8b81fb8e Binary files /dev/null and b/Telegram/Resources/icons/menu/violence@2x.png differ diff --git a/Telegram/Resources/icons/menu/violence@3x.png b/Telegram/Resources/icons/menu/violence@3x.png new file mode 100644 index 000000000..4d6513944 Binary files /dev/null and b/Telegram/Resources/icons/menu/violence@3x.png differ diff --git a/Telegram/Resources/icons/menu_add_account.png b/Telegram/Resources/icons/menu_add_account.png deleted file mode 100644 index 25de7ef71..000000000 Binary files a/Telegram/Resources/icons/menu_add_account.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_add_account@2x.png b/Telegram/Resources/icons/menu_add_account@2x.png deleted file mode 100644 index 70265c3b3..000000000 Binary files a/Telegram/Resources/icons/menu_add_account@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_add_account@3x.png b/Telegram/Resources/icons/menu_add_account@3x.png deleted file mode 100644 index 9a111d9bf..000000000 Binary files a/Telegram/Resources/icons/menu_add_account@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_calls.png b/Telegram/Resources/icons/menu_calls.png deleted file mode 100644 index a88e1226a..000000000 Binary files a/Telegram/Resources/icons/menu_calls.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_calls@2x.png b/Telegram/Resources/icons/menu_calls@2x.png deleted file mode 100644 index 18f189a5c..000000000 Binary files a/Telegram/Resources/icons/menu_calls@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_calls@3x.png b/Telegram/Resources/icons/menu_calls@3x.png deleted file mode 100644 index ff274b720..000000000 Binary files a/Telegram/Resources/icons/menu_calls@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_cloud.png b/Telegram/Resources/icons/menu_cloud.png deleted file mode 100644 index 837fb5074..000000000 Binary files a/Telegram/Resources/icons/menu_cloud.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_cloud@2x.png b/Telegram/Resources/icons/menu_cloud@2x.png deleted file mode 100644 index 7ecd31190..000000000 Binary files a/Telegram/Resources/icons/menu_cloud@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_contacts.png b/Telegram/Resources/icons/menu_contacts.png deleted file mode 100644 index 5df86715b..000000000 Binary files a/Telegram/Resources/icons/menu_contacts.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_contacts@2x.png b/Telegram/Resources/icons/menu_contacts@2x.png deleted file mode 100644 index 5b879588a..000000000 Binary files a/Telegram/Resources/icons/menu_contacts@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_fix_order.png b/Telegram/Resources/icons/menu_fix_order.png deleted file mode 100644 index 3532df78b..000000000 Binary files a/Telegram/Resources/icons/menu_fix_order.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_fix_order@2x.png b/Telegram/Resources/icons/menu_fix_order@2x.png deleted file mode 100644 index 7f614949f..000000000 Binary files a/Telegram/Resources/icons/menu_fix_order@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_fix_order@3x.png b/Telegram/Resources/icons/menu_fix_order@3x.png deleted file mode 100644 index f1547f7db..000000000 Binary files a/Telegram/Resources/icons/menu_fix_order@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_help.png b/Telegram/Resources/icons/menu_help.png deleted file mode 100644 index 80de9d1ea..000000000 Binary files a/Telegram/Resources/icons/menu_help.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_help@2x.png b/Telegram/Resources/icons/menu_help@2x.png deleted file mode 100644 index 1444e19c9..000000000 Binary files a/Telegram/Resources/icons/menu_help@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_new_channel.png b/Telegram/Resources/icons/menu_new_channel.png deleted file mode 100644 index 26cfa9b74..000000000 Binary files a/Telegram/Resources/icons/menu_new_channel.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_new_channel@2x.png b/Telegram/Resources/icons/menu_new_channel@2x.png deleted file mode 100644 index d735771a8..000000000 Binary files a/Telegram/Resources/icons/menu_new_channel@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_new_channel@3x.png b/Telegram/Resources/icons/menu_new_channel@3x.png deleted file mode 100644 index bd69025fd..000000000 Binary files a/Telegram/Resources/icons/menu_new_channel@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_new_group.png b/Telegram/Resources/icons/menu_new_group.png deleted file mode 100644 index 77a4e4201..000000000 Binary files a/Telegram/Resources/icons/menu_new_group.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_new_group@2x.png b/Telegram/Resources/icons/menu_new_group@2x.png deleted file mode 100644 index 33ed7b53c..000000000 Binary files a/Telegram/Resources/icons/menu_new_group@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_new_group@3x.png b/Telegram/Resources/icons/menu_new_group@3x.png deleted file mode 100644 index 18948c9c4..000000000 Binary files a/Telegram/Resources/icons/menu_new_group@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_night_mode.png b/Telegram/Resources/icons/menu_night_mode.png deleted file mode 100644 index 0bcd64145..000000000 Binary files a/Telegram/Resources/icons/menu_night_mode.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_night_mode@2x.png b/Telegram/Resources/icons/menu_night_mode@2x.png deleted file mode 100644 index 53ad3d7fc..000000000 Binary files a/Telegram/Resources/icons/menu_night_mode@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_night_mode@3x.png b/Telegram/Resources/icons/menu_night_mode@3x.png deleted file mode 100644 index 5fa4859cb..000000000 Binary files a/Telegram/Resources/icons/menu_night_mode@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_reload.png b/Telegram/Resources/icons/menu_reload.png deleted file mode 100644 index d54f7d0b0..000000000 Binary files a/Telegram/Resources/icons/menu_reload.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_reload@2x.png b/Telegram/Resources/icons/menu_reload@2x.png deleted file mode 100644 index ed37c4f74..000000000 Binary files a/Telegram/Resources/icons/menu_reload@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/menu_reload@3x.png b/Telegram/Resources/icons/menu_reload@3x.png deleted file mode 100644 index 4bf8e37e4..000000000 Binary files a/Telegram/Resources/icons/menu_reload@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/message_psa_tooltip.png b/Telegram/Resources/icons/message_psa_tooltip.png index 01a75e411..96b08ac17 100644 Binary files a/Telegram/Resources/icons/message_psa_tooltip.png and b/Telegram/Resources/icons/message_psa_tooltip.png differ diff --git a/Telegram/Resources/icons/message_psa_tooltip@2x.png b/Telegram/Resources/icons/message_psa_tooltip@2x.png index 4bb0c04f0..2c331169c 100644 Binary files a/Telegram/Resources/icons/message_psa_tooltip@2x.png and b/Telegram/Resources/icons/message_psa_tooltip@2x.png differ diff --git a/Telegram/Resources/icons/message_psa_tooltip@3x.png b/Telegram/Resources/icons/message_psa_tooltip@3x.png index 6f8a029e5..865c44d01 100644 Binary files a/Telegram/Resources/icons/message_psa_tooltip@3x.png and b/Telegram/Resources/icons/message_psa_tooltip@3x.png differ diff --git a/Telegram/Resources/icons/mini_forward.png b/Telegram/Resources/icons/mini_forward.png new file mode 100644 index 000000000..e51712b55 Binary files /dev/null and b/Telegram/Resources/icons/mini_forward.png differ diff --git a/Telegram/Resources/icons/mini_forward@2x.png b/Telegram/Resources/icons/mini_forward@2x.png new file mode 100644 index 000000000..8a8b8dd57 Binary files /dev/null and b/Telegram/Resources/icons/mini_forward@2x.png differ diff --git a/Telegram/Resources/icons/mini_forward@3x.png b/Telegram/Resources/icons/mini_forward@3x.png new file mode 100644 index 000000000..f6ca40a23 Binary files /dev/null and b/Telegram/Resources/icons/mini_forward@3x.png differ diff --git a/Telegram/Resources/icons/mini_reply_story.png b/Telegram/Resources/icons/mini_reply_story.png new file mode 100644 index 000000000..d1b436beb Binary files /dev/null and b/Telegram/Resources/icons/mini_reply_story.png differ diff --git a/Telegram/Resources/icons/mini_reply_story@2x.png b/Telegram/Resources/icons/mini_reply_story@2x.png new file mode 100644 index 000000000..8eddfb9ef Binary files /dev/null and b/Telegram/Resources/icons/mini_reply_story@2x.png differ diff --git a/Telegram/Resources/icons/mini_reply_story@3x.png b/Telegram/Resources/icons/mini_reply_story@3x.png new file mode 100644 index 000000000..e836bcd3d Binary files /dev/null and b/Telegram/Resources/icons/mini_reply_story@3x.png differ diff --git a/Telegram/Resources/icons/payments/payment_address.png b/Telegram/Resources/icons/payments/payment_address.png index dcc9b2f81..4dedb30a4 100644 Binary files a/Telegram/Resources/icons/payments/payment_address.png and b/Telegram/Resources/icons/payments/payment_address.png differ diff --git a/Telegram/Resources/icons/payments/payment_address@2x.png b/Telegram/Resources/icons/payments/payment_address@2x.png index 5b4cea3d3..d5315ab48 100644 Binary files a/Telegram/Resources/icons/payments/payment_address@2x.png and b/Telegram/Resources/icons/payments/payment_address@2x.png differ diff --git a/Telegram/Resources/icons/payments/payment_address@3x.png b/Telegram/Resources/icons/payments/payment_address@3x.png index f15568019..b1890b018 100644 Binary files a/Telegram/Resources/icons/payments/payment_address@3x.png and b/Telegram/Resources/icons/payments/payment_address@3x.png differ diff --git a/Telegram/Resources/icons/payments/payment_card.png b/Telegram/Resources/icons/payments/payment_card.png index 6e80687c6..fde38c1a3 100644 Binary files a/Telegram/Resources/icons/payments/payment_card.png and b/Telegram/Resources/icons/payments/payment_card.png differ diff --git a/Telegram/Resources/icons/payments/payment_card@2x.png b/Telegram/Resources/icons/payments/payment_card@2x.png index 1fd98a77c..f7f4449af 100644 Binary files a/Telegram/Resources/icons/payments/payment_card@2x.png and b/Telegram/Resources/icons/payments/payment_card@2x.png differ diff --git a/Telegram/Resources/icons/payments/payment_card@3x.png b/Telegram/Resources/icons/payments/payment_card@3x.png index ae50fe67d..3286feaeb 100644 Binary files a/Telegram/Resources/icons/payments/payment_card@3x.png and b/Telegram/Resources/icons/payments/payment_card@3x.png differ diff --git a/Telegram/Resources/icons/payments/payment_email.png b/Telegram/Resources/icons/payments/payment_email.png index 41154157b..e4d03fbeb 100644 Binary files a/Telegram/Resources/icons/payments/payment_email.png and b/Telegram/Resources/icons/payments/payment_email.png differ diff --git a/Telegram/Resources/icons/payments/payment_email@2x.png b/Telegram/Resources/icons/payments/payment_email@2x.png index d6b6ab150..ae26ccba2 100644 Binary files a/Telegram/Resources/icons/payments/payment_email@2x.png and b/Telegram/Resources/icons/payments/payment_email@2x.png differ diff --git a/Telegram/Resources/icons/payments/payment_email@3x.png b/Telegram/Resources/icons/payments/payment_email@3x.png index 5f113ae76..b954362bb 100644 Binary files a/Telegram/Resources/icons/payments/payment_email@3x.png and b/Telegram/Resources/icons/payments/payment_email@3x.png differ diff --git a/Telegram/Resources/icons/payments/payment_name.png b/Telegram/Resources/icons/payments/payment_name.png index fdeb96631..04a22caed 100644 Binary files a/Telegram/Resources/icons/payments/payment_name.png and b/Telegram/Resources/icons/payments/payment_name.png differ diff --git a/Telegram/Resources/icons/payments/payment_name@2x.png b/Telegram/Resources/icons/payments/payment_name@2x.png index 2bcacb374..47974c470 100644 Binary files a/Telegram/Resources/icons/payments/payment_name@2x.png and b/Telegram/Resources/icons/payments/payment_name@2x.png differ diff --git a/Telegram/Resources/icons/payments/payment_name@3x.png b/Telegram/Resources/icons/payments/payment_name@3x.png index 23d2ee243..4dd92ad81 100644 Binary files a/Telegram/Resources/icons/payments/payment_name@3x.png and b/Telegram/Resources/icons/payments/payment_name@3x.png differ diff --git a/Telegram/Resources/icons/payments/payment_phone.png b/Telegram/Resources/icons/payments/payment_phone.png index 87b185d8c..8fe0a1654 100644 Binary files a/Telegram/Resources/icons/payments/payment_phone.png and b/Telegram/Resources/icons/payments/payment_phone.png differ diff --git a/Telegram/Resources/icons/payments/payment_phone@2x.png b/Telegram/Resources/icons/payments/payment_phone@2x.png index d047fb5b4..cc3b2c8e6 100644 Binary files a/Telegram/Resources/icons/payments/payment_phone@2x.png and b/Telegram/Resources/icons/payments/payment_phone@2x.png differ diff --git a/Telegram/Resources/icons/payments/payment_phone@3x.png b/Telegram/Resources/icons/payments/payment_phone@3x.png index ff201d3e8..94cb40b05 100644 Binary files a/Telegram/Resources/icons/payments/payment_phone@3x.png and b/Telegram/Resources/icons/payments/payment_phone@3x.png differ diff --git a/Telegram/Resources/icons/payments/payment_shipping.png b/Telegram/Resources/icons/payments/payment_shipping.png index aa618f5fb..6628b0d92 100644 Binary files a/Telegram/Resources/icons/payments/payment_shipping.png and b/Telegram/Resources/icons/payments/payment_shipping.png differ diff --git a/Telegram/Resources/icons/payments/payment_shipping@2x.png b/Telegram/Resources/icons/payments/payment_shipping@2x.png index 3315d9a9c..d77dbac90 100644 Binary files a/Telegram/Resources/icons/payments/payment_shipping@2x.png and b/Telegram/Resources/icons/payments/payment_shipping@2x.png differ diff --git a/Telegram/Resources/icons/payments/payment_shipping@3x.png b/Telegram/Resources/icons/payments/payment_shipping@3x.png index 8b08421d0..ffe2fbe9d 100644 Binary files a/Telegram/Resources/icons/payments/payment_shipping@3x.png and b/Telegram/Resources/icons/payments/payment_shipping@3x.png differ diff --git a/Telegram/Resources/icons/phone_simcard_from.png b/Telegram/Resources/icons/phone_simcard_from.png deleted file mode 100644 index e9a8e089a..000000000 Binary files a/Telegram/Resources/icons/phone_simcard_from.png and /dev/null differ diff --git a/Telegram/Resources/icons/phone_simcard_from@2x.png b/Telegram/Resources/icons/phone_simcard_from@2x.png deleted file mode 100644 index 5eb9e027b..000000000 Binary files a/Telegram/Resources/icons/phone_simcard_from@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/phone_simcard_from@3x.png b/Telegram/Resources/icons/phone_simcard_from@3x.png deleted file mode 100644 index a0df7abaa..000000000 Binary files a/Telegram/Resources/icons/phone_simcard_from@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/phone_simcard_migrate.png b/Telegram/Resources/icons/phone_simcard_migrate.png deleted file mode 100644 index 4f260997c..000000000 Binary files a/Telegram/Resources/icons/phone_simcard_migrate.png and /dev/null differ diff --git a/Telegram/Resources/icons/phone_simcard_migrate@2x.png b/Telegram/Resources/icons/phone_simcard_migrate@2x.png deleted file mode 100644 index 4a27a4aaf..000000000 Binary files a/Telegram/Resources/icons/phone_simcard_migrate@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/phone_simcard_migrate@3x.png b/Telegram/Resources/icons/phone_simcard_migrate@3x.png deleted file mode 100644 index 4df340aff..000000000 Binary files a/Telegram/Resources/icons/phone_simcard_migrate@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/phone_simcard_to.png b/Telegram/Resources/icons/phone_simcard_to.png deleted file mode 100644 index ace803c02..000000000 Binary files a/Telegram/Resources/icons/phone_simcard_to.png and /dev/null differ diff --git a/Telegram/Resources/icons/phone_simcard_to@2x.png b/Telegram/Resources/icons/phone_simcard_to@2x.png deleted file mode 100644 index 710808ec2..000000000 Binary files a/Telegram/Resources/icons/phone_simcard_to@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/phone_simcard_to@3x.png b/Telegram/Resources/icons/phone_simcard_to@3x.png deleted file mode 100644 index fa2d93ffa..000000000 Binary files a/Telegram/Resources/icons/phone_simcard_to@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/photo_editor/flip.png b/Telegram/Resources/icons/photo_editor/flip.png index a6ff6c254..e751a33e1 100644 Binary files a/Telegram/Resources/icons/photo_editor/flip.png and b/Telegram/Resources/icons/photo_editor/flip.png differ diff --git a/Telegram/Resources/icons/photo_editor/flip@2x.png b/Telegram/Resources/icons/photo_editor/flip@2x.png index 3dd4f6ad7..1a2ab86e0 100644 Binary files a/Telegram/Resources/icons/photo_editor/flip@2x.png and b/Telegram/Resources/icons/photo_editor/flip@2x.png differ diff --git a/Telegram/Resources/icons/photo_editor/flip@3x.png b/Telegram/Resources/icons/photo_editor/flip@3x.png index d9ef7e42a..d65697d70 100644 Binary files a/Telegram/Resources/icons/photo_editor/flip@3x.png and b/Telegram/Resources/icons/photo_editor/flip@3x.png differ diff --git a/Telegram/Resources/icons/photo_editor/paint.png b/Telegram/Resources/icons/photo_editor/paint.png index f923c90cb..aad8e497e 100644 Binary files a/Telegram/Resources/icons/photo_editor/paint.png and b/Telegram/Resources/icons/photo_editor/paint.png differ diff --git a/Telegram/Resources/icons/photo_editor/paint@2x.png b/Telegram/Resources/icons/photo_editor/paint@2x.png index 439424c95..d7a3bd82a 100644 Binary files a/Telegram/Resources/icons/photo_editor/paint@2x.png and b/Telegram/Resources/icons/photo_editor/paint@2x.png differ diff --git a/Telegram/Resources/icons/photo_editor/paint@3x.png b/Telegram/Resources/icons/photo_editor/paint@3x.png index 9193d920b..fed47f425 100644 Binary files a/Telegram/Resources/icons/photo_editor/paint@3x.png and b/Telegram/Resources/icons/photo_editor/paint@3x.png differ diff --git a/Telegram/Resources/icons/photo_editor/rotate.png b/Telegram/Resources/icons/photo_editor/rotate.png index 163d581a6..c0dd23cea 100644 Binary files a/Telegram/Resources/icons/photo_editor/rotate.png and b/Telegram/Resources/icons/photo_editor/rotate.png differ diff --git a/Telegram/Resources/icons/photo_editor/rotate@2x.png b/Telegram/Resources/icons/photo_editor/rotate@2x.png index 3f7068d1a..ff9d83c3c 100644 Binary files a/Telegram/Resources/icons/photo_editor/rotate@2x.png and b/Telegram/Resources/icons/photo_editor/rotate@2x.png differ diff --git a/Telegram/Resources/icons/photo_editor/rotate@3x.png b/Telegram/Resources/icons/photo_editor/rotate@3x.png index d64683a49..1ddc726ec 100644 Binary files a/Telegram/Resources/icons/photo_editor/rotate@3x.png and b/Telegram/Resources/icons/photo_editor/rotate@3x.png differ diff --git a/Telegram/Resources/icons/photo_editor/undo.png b/Telegram/Resources/icons/photo_editor/undo.png index 5e14d5894..64a3593e5 100644 Binary files a/Telegram/Resources/icons/photo_editor/undo.png and b/Telegram/Resources/icons/photo_editor/undo.png differ diff --git a/Telegram/Resources/icons/photo_editor/undo@2x.png b/Telegram/Resources/icons/photo_editor/undo@2x.png index 80d34741b..8faa12e6d 100644 Binary files a/Telegram/Resources/icons/photo_editor/undo@2x.png and b/Telegram/Resources/icons/photo_editor/undo@2x.png differ diff --git a/Telegram/Resources/icons/photo_editor/undo@3x.png b/Telegram/Resources/icons/photo_editor/undo@3x.png index ecdf7836b..37641354e 100644 Binary files a/Telegram/Resources/icons/photo_editor/undo@3x.png and b/Telegram/Resources/icons/photo_editor/undo@3x.png differ diff --git a/Telegram/Resources/icons/pinned_show_all.png b/Telegram/Resources/icons/pinned_show_all.png index af6e182ad..3bd4d0c77 100644 Binary files a/Telegram/Resources/icons/pinned_show_all.png and b/Telegram/Resources/icons/pinned_show_all.png differ diff --git a/Telegram/Resources/icons/pinned_show_all@2x.png b/Telegram/Resources/icons/pinned_show_all@2x.png index f00311c0c..be0b4b0d8 100644 Binary files a/Telegram/Resources/icons/pinned_show_all@2x.png and b/Telegram/Resources/icons/pinned_show_all@2x.png differ diff --git a/Telegram/Resources/icons/pinned_show_all@3x.png b/Telegram/Resources/icons/pinned_show_all@3x.png index 09e63eb9a..39d1d93e8 100644 Binary files a/Telegram/Resources/icons/pinned_show_all@3x.png and b/Telegram/Resources/icons/pinned_show_all@3x.png differ diff --git a/Telegram/Resources/icons/player/panel_close.png b/Telegram/Resources/icons/player/panel_close.png index 2e333de42..9e7594b69 100644 Binary files a/Telegram/Resources/icons/player/panel_close.png and b/Telegram/Resources/icons/player/panel_close.png differ diff --git a/Telegram/Resources/icons/player/panel_close@2x.png b/Telegram/Resources/icons/player/panel_close@2x.png index 1a70b887f..eb6e710bc 100644 Binary files a/Telegram/Resources/icons/player/panel_close@2x.png and b/Telegram/Resources/icons/player/panel_close@2x.png differ diff --git a/Telegram/Resources/icons/player/panel_close@3x.png b/Telegram/Resources/icons/player/panel_close@3x.png index 1ac24a1c6..e9e4d7795 100644 Binary files a/Telegram/Resources/icons/player/panel_close@3x.png and b/Telegram/Resources/icons/player/panel_close@3x.png differ diff --git a/Telegram/Resources/icons/player/player_backward.png b/Telegram/Resources/icons/player/player_backward.png index d2cac60d1..6dd0e1578 100644 Binary files a/Telegram/Resources/icons/player/player_backward.png and b/Telegram/Resources/icons/player/player_backward.png differ diff --git a/Telegram/Resources/icons/player/player_backward@2x.png b/Telegram/Resources/icons/player/player_backward@2x.png index e7afc81f3..ab24effae 100644 Binary files a/Telegram/Resources/icons/player/player_backward@2x.png and b/Telegram/Resources/icons/player/player_backward@2x.png differ diff --git a/Telegram/Resources/icons/player/player_backward@3x.png b/Telegram/Resources/icons/player/player_backward@3x.png index e83867321..5aea6896c 100644 Binary files a/Telegram/Resources/icons/player/player_backward@3x.png and b/Telegram/Resources/icons/player/player_backward@3x.png differ diff --git a/Telegram/Resources/icons/player/player_check.png b/Telegram/Resources/icons/player/player_check.png index cdba65b47..285a76b88 100644 Binary files a/Telegram/Resources/icons/player/player_check.png and b/Telegram/Resources/icons/player/player_check.png differ diff --git a/Telegram/Resources/icons/player/player_check@2x.png b/Telegram/Resources/icons/player/player_check@2x.png index 9d432032b..7a51614af 100644 Binary files a/Telegram/Resources/icons/player/player_check@2x.png and b/Telegram/Resources/icons/player/player_check@2x.png differ diff --git a/Telegram/Resources/icons/player/player_check@3x.png b/Telegram/Resources/icons/player/player_check@3x.png index 097ad06c5..c9cc4b1c7 100644 Binary files a/Telegram/Resources/icons/player/player_check@3x.png and b/Telegram/Resources/icons/player/player_check@3x.png differ diff --git a/Telegram/Resources/icons/player/player_forward.png b/Telegram/Resources/icons/player/player_forward.png index 9a28263a7..adda5406f 100644 Binary files a/Telegram/Resources/icons/player/player_forward.png and b/Telegram/Resources/icons/player/player_forward.png differ diff --git a/Telegram/Resources/icons/player/player_forward@2x.png b/Telegram/Resources/icons/player/player_forward@2x.png index d1de2c67a..2c31059d8 100644 Binary files a/Telegram/Resources/icons/player/player_forward@2x.png and b/Telegram/Resources/icons/player/player_forward@2x.png differ diff --git a/Telegram/Resources/icons/player/player_forward@3x.png b/Telegram/Resources/icons/player/player_forward@3x.png index c59050a84..8e37465ec 100644 Binary files a/Telegram/Resources/icons/player/player_forward@3x.png and b/Telegram/Resources/icons/player/player_forward@3x.png differ diff --git a/Telegram/Resources/icons/player/player_fullscreen.png b/Telegram/Resources/icons/player/player_fullscreen.png index bb3bbd363..29f7b1b62 100644 Binary files a/Telegram/Resources/icons/player/player_fullscreen.png and b/Telegram/Resources/icons/player/player_fullscreen.png differ diff --git a/Telegram/Resources/icons/player/player_fullscreen@2x.png b/Telegram/Resources/icons/player/player_fullscreen@2x.png index 79abf0a88..8380f1859 100644 Binary files a/Telegram/Resources/icons/player/player_fullscreen@2x.png and b/Telegram/Resources/icons/player/player_fullscreen@2x.png differ diff --git a/Telegram/Resources/icons/player/player_fullscreen@3x.png b/Telegram/Resources/icons/player/player_fullscreen@3x.png index 9354611f5..77ebb58bd 100644 Binary files a/Telegram/Resources/icons/player/player_fullscreen@3x.png and b/Telegram/Resources/icons/player/player_fullscreen@3x.png differ diff --git a/Telegram/Resources/icons/player/player_mini_full.png b/Telegram/Resources/icons/player/player_mini_full.png index a56beec23..a0c01b157 100644 Binary files a/Telegram/Resources/icons/player/player_mini_full.png and b/Telegram/Resources/icons/player/player_mini_full.png differ diff --git a/Telegram/Resources/icons/player/player_mini_full@2x.png b/Telegram/Resources/icons/player/player_mini_full@2x.png index 919fa5588..fdb27f196 100644 Binary files a/Telegram/Resources/icons/player/player_mini_full@2x.png and b/Telegram/Resources/icons/player/player_mini_full@2x.png differ diff --git a/Telegram/Resources/icons/player/player_mini_full@3x.png b/Telegram/Resources/icons/player/player_mini_full@3x.png index 554968fce..2dfdb6411 100644 Binary files a/Telegram/Resources/icons/player/player_mini_full@3x.png and b/Telegram/Resources/icons/player/player_mini_full@3x.png differ diff --git a/Telegram/Resources/icons/player/player_mini_half.png b/Telegram/Resources/icons/player/player_mini_half.png index b73618710..e89fe4200 100644 Binary files a/Telegram/Resources/icons/player/player_mini_half.png and b/Telegram/Resources/icons/player/player_mini_half.png differ diff --git a/Telegram/Resources/icons/player/player_mini_half@2x.png b/Telegram/Resources/icons/player/player_mini_half@2x.png index 34c4263dc..e261f0808 100644 Binary files a/Telegram/Resources/icons/player/player_mini_half@2x.png and b/Telegram/Resources/icons/player/player_mini_half@2x.png differ diff --git a/Telegram/Resources/icons/player/player_mini_half@3x.png b/Telegram/Resources/icons/player/player_mini_half@3x.png index 308a16a04..4ad6f3b5e 100644 Binary files a/Telegram/Resources/icons/player/player_mini_half@3x.png and b/Telegram/Resources/icons/player/player_mini_half@3x.png differ diff --git a/Telegram/Resources/icons/player/player_mini_off.png b/Telegram/Resources/icons/player/player_mini_off.png index a650f55d2..08d5de9f1 100644 Binary files a/Telegram/Resources/icons/player/player_mini_off.png and b/Telegram/Resources/icons/player/player_mini_off.png differ diff --git a/Telegram/Resources/icons/player/player_mini_off@2x.png b/Telegram/Resources/icons/player/player_mini_off@2x.png index c3150639b..fa16cb764 100644 Binary files a/Telegram/Resources/icons/player/player_mini_off@2x.png and b/Telegram/Resources/icons/player/player_mini_off@2x.png differ diff --git a/Telegram/Resources/icons/player/player_mini_off@3x.png b/Telegram/Resources/icons/player/player_mini_off@3x.png index f4792b216..6d62c0164 100644 Binary files a/Telegram/Resources/icons/player/player_mini_off@3x.png and b/Telegram/Resources/icons/player/player_mini_off@3x.png differ diff --git a/Telegram/Resources/icons/player/player_minimize.png b/Telegram/Resources/icons/player/player_minimize.png index a4d648eb7..662c532ec 100644 Binary files a/Telegram/Resources/icons/player/player_minimize.png and b/Telegram/Resources/icons/player/player_minimize.png differ diff --git a/Telegram/Resources/icons/player/player_minimize@2x.png b/Telegram/Resources/icons/player/player_minimize@2x.png index efbd5b0c9..13c175a35 100644 Binary files a/Telegram/Resources/icons/player/player_minimize@2x.png and b/Telegram/Resources/icons/player/player_minimize@2x.png differ diff --git a/Telegram/Resources/icons/player/player_minimize@3x.png b/Telegram/Resources/icons/player/player_minimize@3x.png index 16367d5d6..4fde439dd 100644 Binary files a/Telegram/Resources/icons/player/player_minimize@3x.png and b/Telegram/Resources/icons/player/player_minimize@3x.png differ diff --git a/Telegram/Resources/icons/player/player_more.png b/Telegram/Resources/icons/player/player_more.png index b61a629d8..a0603fb43 100644 Binary files a/Telegram/Resources/icons/player/player_more.png and b/Telegram/Resources/icons/player/player_more.png differ diff --git a/Telegram/Resources/icons/player/player_more@2x.png b/Telegram/Resources/icons/player/player_more@2x.png index 0fd9fdab2..d729c2305 100644 Binary files a/Telegram/Resources/icons/player/player_more@2x.png and b/Telegram/Resources/icons/player/player_more@2x.png differ diff --git a/Telegram/Resources/icons/player/player_more@3x.png b/Telegram/Resources/icons/player/player_more@3x.png index 0ca0520d6..3ca179488 100644 Binary files a/Telegram/Resources/icons/player/player_more@3x.png and b/Telegram/Resources/icons/player/player_more@3x.png differ diff --git a/Telegram/Resources/icons/player/player_order.png b/Telegram/Resources/icons/player/player_order.png index ed2b10e71..2d44eefc6 100644 Binary files a/Telegram/Resources/icons/player/player_order.png and b/Telegram/Resources/icons/player/player_order.png differ diff --git a/Telegram/Resources/icons/player/player_order@2x.png b/Telegram/Resources/icons/player/player_order@2x.png index 2ae4fc734..76e30a792 100644 Binary files a/Telegram/Resources/icons/player/player_order@2x.png and b/Telegram/Resources/icons/player/player_order@2x.png differ diff --git a/Telegram/Resources/icons/player/player_order@3x.png b/Telegram/Resources/icons/player/player_order@3x.png index a372bff44..be44a9930 100644 Binary files a/Telegram/Resources/icons/player/player_order@3x.png and b/Telegram/Resources/icons/player/player_order@3x.png differ diff --git a/Telegram/Resources/icons/player/player_pause.png b/Telegram/Resources/icons/player/player_pause.png index f7001be9d..b40213cbb 100644 Binary files a/Telegram/Resources/icons/player/player_pause.png and b/Telegram/Resources/icons/player/player_pause.png differ diff --git a/Telegram/Resources/icons/player/player_pause@2x.png b/Telegram/Resources/icons/player/player_pause@2x.png index 61e268caf..a8e819654 100644 Binary files a/Telegram/Resources/icons/player/player_pause@2x.png and b/Telegram/Resources/icons/player/player_pause@2x.png differ diff --git a/Telegram/Resources/icons/player/player_pause@3x.png b/Telegram/Resources/icons/player/player_pause@3x.png index 8cc548561..71d9fd6eb 100644 Binary files a/Telegram/Resources/icons/player/player_pause@3x.png and b/Telegram/Resources/icons/player/player_pause@3x.png differ diff --git a/Telegram/Resources/icons/player/player_pause_big.png b/Telegram/Resources/icons/player/player_pause_big.png new file mode 100644 index 000000000..99c9207f1 Binary files /dev/null and b/Telegram/Resources/icons/player/player_pause_big.png differ diff --git a/Telegram/Resources/icons/player/player_pause_big@2x.png b/Telegram/Resources/icons/player/player_pause_big@2x.png new file mode 100644 index 000000000..74538bd9f Binary files /dev/null and b/Telegram/Resources/icons/player/player_pause_big@2x.png differ diff --git a/Telegram/Resources/icons/player/player_pause_big@3x.png b/Telegram/Resources/icons/player/player_pause_big@3x.png new file mode 100644 index 000000000..7913d8741 Binary files /dev/null and b/Telegram/Resources/icons/player/player_pause_big@3x.png differ diff --git a/Telegram/Resources/icons/player/player_pip.png b/Telegram/Resources/icons/player/player_pip.png index 52e167ba1..155555bbd 100644 Binary files a/Telegram/Resources/icons/player/player_pip.png and b/Telegram/Resources/icons/player/player_pip.png differ diff --git a/Telegram/Resources/icons/player/player_pip@2x.png b/Telegram/Resources/icons/player/player_pip@2x.png index bfa8e10f7..d37c609ad 100644 Binary files a/Telegram/Resources/icons/player/player_pip@2x.png and b/Telegram/Resources/icons/player/player_pip@2x.png differ diff --git a/Telegram/Resources/icons/player/player_pip@3x.png b/Telegram/Resources/icons/player/player_pip@3x.png index cf0cd7990..d921c88c5 100644 Binary files a/Telegram/Resources/icons/player/player_pip@3x.png and b/Telegram/Resources/icons/player/player_pip@3x.png differ diff --git a/Telegram/Resources/icons/player/player_play.png b/Telegram/Resources/icons/player/player_play.png index 3488f2692..816e5ef1e 100644 Binary files a/Telegram/Resources/icons/player/player_play.png and b/Telegram/Resources/icons/player/player_play.png differ diff --git a/Telegram/Resources/icons/player/player_play@2x.png b/Telegram/Resources/icons/player/player_play@2x.png index 7c283f331..a4e130c4a 100644 Binary files a/Telegram/Resources/icons/player/player_play@2x.png and b/Telegram/Resources/icons/player/player_play@2x.png differ diff --git a/Telegram/Resources/icons/player/player_play@3x.png b/Telegram/Resources/icons/player/player_play@3x.png index aa280b9a2..0a101f3f6 100644 Binary files a/Telegram/Resources/icons/player/player_play@3x.png and b/Telegram/Resources/icons/player/player_play@3x.png differ diff --git a/Telegram/Resources/icons/player/player_play_big.png b/Telegram/Resources/icons/player/player_play_big.png new file mode 100644 index 000000000..449760247 Binary files /dev/null and b/Telegram/Resources/icons/player/player_play_big.png differ diff --git a/Telegram/Resources/icons/player/player_play_big@2x.png b/Telegram/Resources/icons/player/player_play_big@2x.png new file mode 100644 index 000000000..152d34fd8 Binary files /dev/null and b/Telegram/Resources/icons/player/player_play_big@2x.png differ diff --git a/Telegram/Resources/icons/player/player_play_big@3x.png b/Telegram/Resources/icons/player/player_play_big@3x.png new file mode 100644 index 000000000..35bbf5c53 Binary files /dev/null and b/Telegram/Resources/icons/player/player_play_big@3x.png differ diff --git a/Telegram/Resources/icons/player/player_repeat.png b/Telegram/Resources/icons/player/player_repeat.png index 1667941e7..b13c3c025 100644 Binary files a/Telegram/Resources/icons/player/player_repeat.png and b/Telegram/Resources/icons/player/player_repeat.png differ diff --git a/Telegram/Resources/icons/player/player_repeat@2x.png b/Telegram/Resources/icons/player/player_repeat@2x.png index ae686e152..10a955139 100644 Binary files a/Telegram/Resources/icons/player/player_repeat@2x.png and b/Telegram/Resources/icons/player/player_repeat@2x.png differ diff --git a/Telegram/Resources/icons/player/player_repeat@3x.png b/Telegram/Resources/icons/player/player_repeat@3x.png index 01afab9b3..441f65bfc 100644 Binary files a/Telegram/Resources/icons/player/player_repeat@3x.png and b/Telegram/Resources/icons/player/player_repeat@3x.png differ diff --git a/Telegram/Resources/icons/player/player_repeat_single.png b/Telegram/Resources/icons/player/player_repeat_single.png index d3d81db04..d45a8a363 100644 Binary files a/Telegram/Resources/icons/player/player_repeat_single.png and b/Telegram/Resources/icons/player/player_repeat_single.png differ diff --git a/Telegram/Resources/icons/player/player_repeat_single@2x.png b/Telegram/Resources/icons/player/player_repeat_single@2x.png index 0bb671ed1..5c162addb 100644 Binary files a/Telegram/Resources/icons/player/player_repeat_single@2x.png and b/Telegram/Resources/icons/player/player_repeat_single@2x.png differ diff --git a/Telegram/Resources/icons/player/player_repeat_single@3x.png b/Telegram/Resources/icons/player/player_repeat_single@3x.png index a6aa0c883..3b2a35b95 100644 Binary files a/Telegram/Resources/icons/player/player_repeat_single@3x.png and b/Telegram/Resources/icons/player/player_repeat_single@3x.png differ diff --git a/Telegram/Resources/icons/player/player_reverse.png b/Telegram/Resources/icons/player/player_reverse.png deleted file mode 100644 index dea0be2df..000000000 Binary files a/Telegram/Resources/icons/player/player_reverse.png and /dev/null differ diff --git a/Telegram/Resources/icons/player/player_reverse@2x.png b/Telegram/Resources/icons/player/player_reverse@2x.png deleted file mode 100644 index d3af5baf6..000000000 Binary files a/Telegram/Resources/icons/player/player_reverse@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/player/player_reverse@3x.png b/Telegram/Resources/icons/player/player_reverse@3x.png deleted file mode 100644 index 9b01d7a1b..000000000 Binary files a/Telegram/Resources/icons/player/player_reverse@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/player/player_shuffle.png b/Telegram/Resources/icons/player/player_shuffle.png index 1986e7329..da4e9c76b 100644 Binary files a/Telegram/Resources/icons/player/player_shuffle.png and b/Telegram/Resources/icons/player/player_shuffle.png differ diff --git a/Telegram/Resources/icons/player/player_shuffle@2x.png b/Telegram/Resources/icons/player/player_shuffle@2x.png index 3c2751ac8..862395114 100644 Binary files a/Telegram/Resources/icons/player/player_shuffle@2x.png and b/Telegram/Resources/icons/player/player_shuffle@2x.png differ diff --git a/Telegram/Resources/icons/player/player_shuffle@3x.png b/Telegram/Resources/icons/player/player_shuffle@3x.png index f743ba906..69ad651d4 100644 Binary files a/Telegram/Resources/icons/player/player_shuffle@3x.png and b/Telegram/Resources/icons/player/player_shuffle@3x.png differ diff --git a/Telegram/Resources/icons/player/player_speed.png b/Telegram/Resources/icons/player/player_speed.png new file mode 100644 index 000000000..fe29a80c6 Binary files /dev/null and b/Telegram/Resources/icons/player/player_speed.png differ diff --git a/Telegram/Resources/icons/player/player_speed@2x.png b/Telegram/Resources/icons/player/player_speed@2x.png new file mode 100644 index 000000000..c1c387372 Binary files /dev/null and b/Telegram/Resources/icons/player/player_speed@2x.png differ diff --git a/Telegram/Resources/icons/player/player_speed@3x.png b/Telegram/Resources/icons/player/player_speed@3x.png new file mode 100644 index 000000000..286a4a3b9 Binary files /dev/null and b/Telegram/Resources/icons/player/player_speed@3x.png differ diff --git a/Telegram/Resources/icons/player/player_volume_off.png b/Telegram/Resources/icons/player/player_volume_off.png index 88ed4e391..0e5c893ba 100644 Binary files a/Telegram/Resources/icons/player/player_volume_off.png and b/Telegram/Resources/icons/player/player_volume_off.png differ diff --git a/Telegram/Resources/icons/player/player_volume_off@2x.png b/Telegram/Resources/icons/player/player_volume_off@2x.png index 267bcc6f7..dcc4f69f3 100644 Binary files a/Telegram/Resources/icons/player/player_volume_off@2x.png and b/Telegram/Resources/icons/player/player_volume_off@2x.png differ diff --git a/Telegram/Resources/icons/player/player_volume_off@3x.png b/Telegram/Resources/icons/player/player_volume_off@3x.png index 9556ac795..4d2c5c6f9 100644 Binary files a/Telegram/Resources/icons/player/player_volume_off@3x.png and b/Telegram/Resources/icons/player/player_volume_off@3x.png differ diff --git a/Telegram/Resources/icons/player/player_volume_on.png b/Telegram/Resources/icons/player/player_volume_on.png index eaddd3674..8aff2e4da 100644 Binary files a/Telegram/Resources/icons/player/player_volume_on.png and b/Telegram/Resources/icons/player/player_volume_on.png differ diff --git a/Telegram/Resources/icons/player/player_volume_on@2x.png b/Telegram/Resources/icons/player/player_volume_on@2x.png index f931fe241..77bf6b06b 100644 Binary files a/Telegram/Resources/icons/player/player_volume_on@2x.png and b/Telegram/Resources/icons/player/player_volume_on@2x.png differ diff --git a/Telegram/Resources/icons/player/player_volume_on@3x.png b/Telegram/Resources/icons/player/player_volume_on@3x.png index 5d10c66a6..c868accca 100644 Binary files a/Telegram/Resources/icons/player/player_volume_on@3x.png and b/Telegram/Resources/icons/player/player_volume_on@3x.png differ diff --git a/Telegram/Resources/icons/player/player_volume_small.png b/Telegram/Resources/icons/player/player_volume_small.png index 8cbcaf5c4..0365afa33 100644 Binary files a/Telegram/Resources/icons/player/player_volume_small.png and b/Telegram/Resources/icons/player/player_volume_small.png differ diff --git a/Telegram/Resources/icons/player/player_volume_small@2x.png b/Telegram/Resources/icons/player/player_volume_small@2x.png index 3098bed94..25ad96230 100644 Binary files a/Telegram/Resources/icons/player/player_volume_small@2x.png and b/Telegram/Resources/icons/player/player_volume_small@2x.png differ diff --git a/Telegram/Resources/icons/player/player_volume_small@3x.png b/Telegram/Resources/icons/player/player_volume_small@3x.png index a10b418ae..3cd717371 100644 Binary files a/Telegram/Resources/icons/player/player_volume_small@3x.png and b/Telegram/Resources/icons/player/player_volume_small@3x.png differ diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_0.5.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_0.5.png new file mode 100644 index 000000000..f3fb2c8b7 Binary files /dev/null and b/Telegram/Resources/icons/player/speed/audiospeed_menu_0.5.png differ diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_0.5@2x.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_0.5@2x.png new file mode 100644 index 000000000..23be463ef Binary files /dev/null and b/Telegram/Resources/icons/player/speed/audiospeed_menu_0.5@2x.png differ diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_0.5@3x.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_0.5@3x.png new file mode 100644 index 000000000..030a4e04e Binary files /dev/null and b/Telegram/Resources/icons/player/speed/audiospeed_menu_0.5@3x.png differ diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_1.0.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.0.png new file mode 100644 index 000000000..bfa0669d2 Binary files /dev/null and b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.0.png differ diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_1.0@2x.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.0@2x.png new file mode 100644 index 000000000..6cb73540f Binary files /dev/null and b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.0@2x.png differ diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_1.0@3x.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.0@3x.png new file mode 100644 index 000000000..e78836e41 Binary files /dev/null and b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.0@3x.png differ diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_1.2.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.2.png new file mode 100644 index 000000000..a75d3573b Binary files /dev/null and b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.2.png differ diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_1.2@2x.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.2@2x.png new file mode 100644 index 000000000..93c3cc58a Binary files /dev/null and b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.2@2x.png differ diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_1.2@3x.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.2@3x.png new file mode 100644 index 000000000..38fdf1ead Binary files /dev/null and b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.2@3x.png differ diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_1.5.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.5.png new file mode 100644 index 000000000..95fef6aa8 Binary files /dev/null and b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.5.png differ diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_1.5@2x.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.5@2x.png new file mode 100644 index 000000000..a376a4e52 Binary files /dev/null and b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.5@2x.png differ diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_1.5@3x.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.5@3x.png new file mode 100644 index 000000000..ebdcebda1 Binary files /dev/null and b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.5@3x.png differ diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_1.7.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.7.png new file mode 100644 index 000000000..1cc20e56d Binary files /dev/null and b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.7.png differ diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_1.7@2x.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.7@2x.png new file mode 100644 index 000000000..7bd696eb6 Binary files /dev/null and b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.7@2x.png differ diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_1.7@3x.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.7@3x.png new file mode 100644 index 000000000..16dc797bc Binary files /dev/null and b/Telegram/Resources/icons/player/speed/audiospeed_menu_1.7@3x.png differ diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_2.0.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_2.0.png new file mode 100644 index 000000000..f0245ccb2 Binary files /dev/null and b/Telegram/Resources/icons/player/speed/audiospeed_menu_2.0.png differ diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_2.0@2x.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_2.0@2x.png new file mode 100644 index 000000000..a43c31618 Binary files /dev/null and b/Telegram/Resources/icons/player/speed/audiospeed_menu_2.0@2x.png differ diff --git a/Telegram/Resources/icons/player/speed/audiospeed_menu_2.0@3x.png b/Telegram/Resources/icons/player/speed/audiospeed_menu_2.0@3x.png new file mode 100644 index 000000000..227902b9d Binary files /dev/null and b/Telegram/Resources/icons/player/speed/audiospeed_menu_2.0@3x.png differ diff --git a/Telegram/Resources/icons/player/voice_speed/voice_speed0.5.png b/Telegram/Resources/icons/player/voice_speed/voice_speed0.5.png deleted file mode 100644 index a209f0ff1..000000000 Binary files a/Telegram/Resources/icons/player/voice_speed/voice_speed0.5.png and /dev/null differ diff --git a/Telegram/Resources/icons/player/voice_speed/voice_speed0.5@2x.png b/Telegram/Resources/icons/player/voice_speed/voice_speed0.5@2x.png deleted file mode 100644 index ee279c333..000000000 Binary files a/Telegram/Resources/icons/player/voice_speed/voice_speed0.5@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/player/voice_speed/voice_speed0.5@3x.png b/Telegram/Resources/icons/player/voice_speed/voice_speed0.5@3x.png deleted file mode 100644 index 2d7c14d6c..000000000 Binary files a/Telegram/Resources/icons/player/voice_speed/voice_speed0.5@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/player/voice_speed/voice_speed1.5.png b/Telegram/Resources/icons/player/voice_speed/voice_speed1.5.png deleted file mode 100644 index cae61e3e9..000000000 Binary files a/Telegram/Resources/icons/player/voice_speed/voice_speed1.5.png and /dev/null differ diff --git a/Telegram/Resources/icons/player/voice_speed/voice_speed1.5@2x.png b/Telegram/Resources/icons/player/voice_speed/voice_speed1.5@2x.png deleted file mode 100644 index 680a02eb9..000000000 Binary files a/Telegram/Resources/icons/player/voice_speed/voice_speed1.5@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/player/voice_speed/voice_speed1.5@3x.png b/Telegram/Resources/icons/player/voice_speed/voice_speed1.5@3x.png deleted file mode 100644 index 07faa2ea1..000000000 Binary files a/Telegram/Resources/icons/player/voice_speed/voice_speed1.5@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/player/voice_speed/voice_speed2.png b/Telegram/Resources/icons/player/voice_speed/voice_speed2.png deleted file mode 100644 index f2cda767d..000000000 Binary files a/Telegram/Resources/icons/player/voice_speed/voice_speed2.png and /dev/null differ diff --git a/Telegram/Resources/icons/player/voice_speed/voice_speed2@2x.png b/Telegram/Resources/icons/player/voice_speed/voice_speed2@2x.png deleted file mode 100644 index 22d3ee280..000000000 Binary files a/Telegram/Resources/icons/player/voice_speed/voice_speed2@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/player/voice_speed/voice_speed2@3x.png b/Telegram/Resources/icons/player/voice_speed/voice_speed2@3x.png deleted file mode 100644 index facf359c7..000000000 Binary files a/Telegram/Resources/icons/player/voice_speed/voice_speed2@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/profile_admin_star.png b/Telegram/Resources/icons/profile_admin_star.png deleted file mode 100644 index bee28eba7..000000000 Binary files a/Telegram/Resources/icons/profile_admin_star.png and /dev/null differ diff --git a/Telegram/Resources/icons/profile_admin_star@2x.png b/Telegram/Resources/icons/profile_admin_star@2x.png deleted file mode 100644 index 4756363b4..000000000 Binary files a/Telegram/Resources/icons/profile_admin_star@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/profile_admin_star@3x.png b/Telegram/Resources/icons/profile_admin_star@3x.png deleted file mode 100644 index 376b48673..000000000 Binary files a/Telegram/Resources/icons/profile_admin_star@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/profile_premium.png b/Telegram/Resources/icons/profile_premium.png new file mode 100644 index 000000000..b62c55739 Binary files /dev/null and b/Telegram/Resources/icons/profile_premium.png differ diff --git a/Telegram/Resources/icons/profile_premium@2x.png b/Telegram/Resources/icons/profile_premium@2x.png new file mode 100644 index 000000000..5c72af415 Binary files /dev/null and b/Telegram/Resources/icons/profile_premium@2x.png differ diff --git a/Telegram/Resources/icons/profile_premium@3x.png b/Telegram/Resources/icons/profile_premium@3x.png new file mode 100644 index 000000000..f309d0aac Binary files /dev/null and b/Telegram/Resources/icons/profile_premium@3x.png differ diff --git a/Telegram/Resources/icons/profile_verified_check.png b/Telegram/Resources/icons/profile_verified_check.png index fafa4023a..45ce8c9ec 100644 Binary files a/Telegram/Resources/icons/profile_verified_check.png and b/Telegram/Resources/icons/profile_verified_check.png differ diff --git a/Telegram/Resources/icons/profile_verified_check@2x.png b/Telegram/Resources/icons/profile_verified_check@2x.png index 790cc94cd..b9180a6b1 100644 Binary files a/Telegram/Resources/icons/profile_verified_check@2x.png and b/Telegram/Resources/icons/profile_verified_check@2x.png differ diff --git a/Telegram/Resources/icons/profile_verified_check@3x.png b/Telegram/Resources/icons/profile_verified_check@3x.png index 511c349f2..3b61b0f78 100644 Binary files a/Telegram/Resources/icons/profile_verified_check@3x.png and b/Telegram/Resources/icons/profile_verified_check@3x.png differ diff --git a/Telegram/Resources/icons/profile_verified_star.png b/Telegram/Resources/icons/profile_verified_star.png index ef20dc84b..bc19c2dcb 100644 Binary files a/Telegram/Resources/icons/profile_verified_star.png and b/Telegram/Resources/icons/profile_verified_star.png differ diff --git a/Telegram/Resources/icons/profile_verified_star@2x.png b/Telegram/Resources/icons/profile_verified_star@2x.png index 967762a59..8db01d0be 100644 Binary files a/Telegram/Resources/icons/profile_verified_star@2x.png and b/Telegram/Resources/icons/profile_verified_star@2x.png differ diff --git a/Telegram/Resources/icons/profile_verified_star@3x.png b/Telegram/Resources/icons/profile_verified_star@3x.png index 8ada01147..c999dabaa 100644 Binary files a/Telegram/Resources/icons/profile_verified_star@3x.png and b/Telegram/Resources/icons/profile_verified_star@3x.png differ diff --git a/Telegram/Resources/icons/proxy_off.png b/Telegram/Resources/icons/proxy_off.png index 2f1f6e6a9..c246255a0 100644 Binary files a/Telegram/Resources/icons/proxy_off.png and b/Telegram/Resources/icons/proxy_off.png differ diff --git a/Telegram/Resources/icons/proxy_off@2x.png b/Telegram/Resources/icons/proxy_off@2x.png index 2a1e1d85f..4afc9c3d5 100644 Binary files a/Telegram/Resources/icons/proxy_off@2x.png and b/Telegram/Resources/icons/proxy_off@2x.png differ diff --git a/Telegram/Resources/icons/proxy_off@3x.png b/Telegram/Resources/icons/proxy_off@3x.png index 99dd48f08..ddefed77c 100644 Binary files a/Telegram/Resources/icons/proxy_off@3x.png and b/Telegram/Resources/icons/proxy_off@3x.png differ diff --git a/Telegram/Resources/icons/proxy_on.png b/Telegram/Resources/icons/proxy_on.png index 38511caee..e336edd71 100644 Binary files a/Telegram/Resources/icons/proxy_on.png and b/Telegram/Resources/icons/proxy_on.png differ diff --git a/Telegram/Resources/icons/proxy_on@2x.png b/Telegram/Resources/icons/proxy_on@2x.png index 0399707fa..a2f6ca679 100644 Binary files a/Telegram/Resources/icons/proxy_on@2x.png and b/Telegram/Resources/icons/proxy_on@2x.png differ diff --git a/Telegram/Resources/icons/proxy_on@3x.png b/Telegram/Resources/icons/proxy_on@3x.png index 770ec312b..88df39ed5 100644 Binary files a/Telegram/Resources/icons/proxy_on@3x.png and b/Telegram/Resources/icons/proxy_on@3x.png differ diff --git a/Telegram/Resources/icons/quiz_explain.png b/Telegram/Resources/icons/quiz_explain.png index c49ccd4d0..6d06514cc 100644 Binary files a/Telegram/Resources/icons/quiz_explain.png and b/Telegram/Resources/icons/quiz_explain.png differ diff --git a/Telegram/Resources/icons/quiz_explain@2x.png b/Telegram/Resources/icons/quiz_explain@2x.png index 3e9f8ba54..163445504 100644 Binary files a/Telegram/Resources/icons/quiz_explain@2x.png and b/Telegram/Resources/icons/quiz_explain@2x.png differ diff --git a/Telegram/Resources/icons/quiz_explain@3x.png b/Telegram/Resources/icons/quiz_explain@3x.png index 2c3b51b85..a4b6f08bb 100644 Binary files a/Telegram/Resources/icons/quiz_explain@3x.png and b/Telegram/Resources/icons/quiz_explain@3x.png differ diff --git a/Telegram/Resources/icons/quiz_timer.png b/Telegram/Resources/icons/quiz_timer.png index 9c075162f..36f59ca69 100644 Binary files a/Telegram/Resources/icons/quiz_timer.png and b/Telegram/Resources/icons/quiz_timer.png differ diff --git a/Telegram/Resources/icons/quiz_timer@2x.png b/Telegram/Resources/icons/quiz_timer@2x.png index d0a839c03..fe3ed207e 100644 Binary files a/Telegram/Resources/icons/quiz_timer@2x.png and b/Telegram/Resources/icons/quiz_timer@2x.png differ diff --git a/Telegram/Resources/icons/quiz_timer@3x.png b/Telegram/Resources/icons/quiz_timer@3x.png index ad6c49b50..ffdece6f3 100644 Binary files a/Telegram/Resources/icons/quiz_timer@3x.png and b/Telegram/Resources/icons/quiz_timer@3x.png differ diff --git a/Telegram/Resources/icons/send_media/send_media_replace.png b/Telegram/Resources/icons/send_media/send_media_replace.png index 116844339..262550ad4 100644 Binary files a/Telegram/Resources/icons/send_media/send_media_replace.png and b/Telegram/Resources/icons/send_media/send_media_replace.png differ diff --git a/Telegram/Resources/icons/send_media/send_media_replace@2x.png b/Telegram/Resources/icons/send_media/send_media_replace@2x.png index 56b56d93d..6bbcd0b6c 100644 Binary files a/Telegram/Resources/icons/send_media/send_media_replace@2x.png and b/Telegram/Resources/icons/send_media/send_media_replace@2x.png differ diff --git a/Telegram/Resources/icons/send_media/send_media_replace@3x.png b/Telegram/Resources/icons/send_media/send_media_replace@3x.png index db25fb7f9..31b27a730 100644 Binary files a/Telegram/Resources/icons/send_media/send_media_replace@3x.png and b/Telegram/Resources/icons/send_media/send_media_replace@3x.png differ diff --git a/Telegram/Resources/icons/settings/account.png b/Telegram/Resources/icons/settings/account.png new file mode 100644 index 000000000..cbb8fffcd Binary files /dev/null and b/Telegram/Resources/icons/settings/account.png differ diff --git a/Telegram/Resources/icons/settings/account@2x.png b/Telegram/Resources/icons/settings/account@2x.png new file mode 100644 index 000000000..a893c53b1 Binary files /dev/null and b/Telegram/Resources/icons/settings/account@2x.png differ diff --git a/Telegram/Resources/icons/settings/account@3x.png b/Telegram/Resources/icons/settings/account@3x.png new file mode 100644 index 000000000..493007fd6 Binary files /dev/null and b/Telegram/Resources/icons/settings/account@3x.png differ diff --git a/Telegram/Resources/icons/settings/add.png b/Telegram/Resources/icons/settings/add.png new file mode 100644 index 000000000..b4f18d5de Binary files /dev/null and b/Telegram/Resources/icons/settings/add.png differ diff --git a/Telegram/Resources/icons/settings/add@2x.png b/Telegram/Resources/icons/settings/add@2x.png new file mode 100644 index 000000000..d40c899cc Binary files /dev/null and b/Telegram/Resources/icons/settings/add@2x.png differ diff --git a/Telegram/Resources/icons/settings/add@3x.png b/Telegram/Resources/icons/settings/add@3x.png new file mode 100644 index 000000000..5a8daff62 Binary files /dev/null and b/Telegram/Resources/icons/settings/add@3x.png differ diff --git a/Telegram/Resources/icons/settings/advanced.png b/Telegram/Resources/icons/settings/advanced.png new file mode 100644 index 000000000..d56476381 Binary files /dev/null and b/Telegram/Resources/icons/settings/advanced.png differ diff --git a/Telegram/Resources/icons/settings/advanced@2x.png b/Telegram/Resources/icons/settings/advanced@2x.png new file mode 100644 index 000000000..7f7872d33 Binary files /dev/null and b/Telegram/Resources/icons/settings/advanced@2x.png differ diff --git a/Telegram/Resources/icons/settings/advanced@3x.png b/Telegram/Resources/icons/settings/advanced@3x.png new file mode 100644 index 000000000..88a7d0a58 Binary files /dev/null and b/Telegram/Resources/icons/settings/advanced@3x.png differ diff --git a/Telegram/Resources/icons/settings/archive.png b/Telegram/Resources/icons/settings/archive.png new file mode 100644 index 000000000..3847af0a8 Binary files /dev/null and b/Telegram/Resources/icons/settings/archive.png differ diff --git a/Telegram/Resources/icons/settings/archive@2x.png b/Telegram/Resources/icons/settings/archive@2x.png new file mode 100644 index 000000000..9baee48d3 Binary files /dev/null and b/Telegram/Resources/icons/settings/archive@2x.png differ diff --git a/Telegram/Resources/icons/settings/archive@3x.png b/Telegram/Resources/icons/settings/archive@3x.png new file mode 100644 index 000000000..4e42c4aa0 Binary files /dev/null and b/Telegram/Resources/icons/settings/archive@3x.png differ diff --git a/Telegram/Resources/icons/settings/arrows.png b/Telegram/Resources/icons/settings/arrows.png new file mode 100644 index 000000000..ce4d5cd75 Binary files /dev/null and b/Telegram/Resources/icons/settings/arrows.png differ diff --git a/Telegram/Resources/icons/settings/arrows@2x.png b/Telegram/Resources/icons/settings/arrows@2x.png new file mode 100644 index 000000000..dcba1e4f6 Binary files /dev/null and b/Telegram/Resources/icons/settings/arrows@2x.png differ diff --git a/Telegram/Resources/icons/settings/arrows@3x.png b/Telegram/Resources/icons/settings/arrows@3x.png new file mode 100644 index 000000000..9bda1806c Binary files /dev/null and b/Telegram/Resources/icons/settings/arrows@3x.png differ diff --git a/Telegram/Resources/icons/settings/ask_question.png b/Telegram/Resources/icons/settings/ask_question.png new file mode 100644 index 000000000..311553669 Binary files /dev/null and b/Telegram/Resources/icons/settings/ask_question.png differ diff --git a/Telegram/Resources/icons/settings/ask_question@2x.png b/Telegram/Resources/icons/settings/ask_question@2x.png new file mode 100644 index 000000000..39ef38554 Binary files /dev/null and b/Telegram/Resources/icons/settings/ask_question@2x.png differ diff --git a/Telegram/Resources/icons/settings/ask_question@3x.png b/Telegram/Resources/icons/settings/ask_question@3x.png new file mode 100644 index 000000000..107f94cd6 Binary files /dev/null and b/Telegram/Resources/icons/settings/ask_question@3x.png differ diff --git a/Telegram/Resources/icons/settings/battery.png b/Telegram/Resources/icons/settings/battery.png new file mode 100644 index 000000000..4287599be Binary files /dev/null and b/Telegram/Resources/icons/settings/battery.png differ diff --git a/Telegram/Resources/icons/settings/battery@2x.png b/Telegram/Resources/icons/settings/battery@2x.png new file mode 100644 index 000000000..b45409949 Binary files /dev/null and b/Telegram/Resources/icons/settings/battery@2x.png differ diff --git a/Telegram/Resources/icons/settings/battery@3x.png b/Telegram/Resources/icons/settings/battery@3x.png new file mode 100644 index 000000000..2c1fe9a28 Binary files /dev/null and b/Telegram/Resources/icons/settings/battery@3x.png differ diff --git a/Telegram/Resources/icons/settings/blocked.png b/Telegram/Resources/icons/settings/blocked.png new file mode 100644 index 000000000..394b9f289 Binary files /dev/null and b/Telegram/Resources/icons/settings/blocked.png differ diff --git a/Telegram/Resources/icons/settings/blocked@2x.png b/Telegram/Resources/icons/settings/blocked@2x.png new file mode 100644 index 000000000..ad15b0ed1 Binary files /dev/null and b/Telegram/Resources/icons/settings/blocked@2x.png differ diff --git a/Telegram/Resources/icons/settings/blocked@3x.png b/Telegram/Resources/icons/settings/blocked@3x.png new file mode 100644 index 000000000..64ff47658 Binary files /dev/null and b/Telegram/Resources/icons/settings/blocked@3x.png differ diff --git a/Telegram/Resources/icons/settings/calls.png b/Telegram/Resources/icons/settings/calls.png new file mode 100644 index 000000000..acc767e6e Binary files /dev/null and b/Telegram/Resources/icons/settings/calls.png differ diff --git a/Telegram/Resources/icons/settings/calls@2x.png b/Telegram/Resources/icons/settings/calls@2x.png new file mode 100644 index 000000000..2979b5df9 Binary files /dev/null and b/Telegram/Resources/icons/settings/calls@2x.png differ diff --git a/Telegram/Resources/icons/settings/calls@3x.png b/Telegram/Resources/icons/settings/calls@3x.png new file mode 100644 index 000000000..e46d52239 Binary files /dev/null and b/Telegram/Resources/icons/settings/calls@3x.png differ diff --git a/Telegram/Resources/icons/settings/channel.png b/Telegram/Resources/icons/settings/channel.png new file mode 100644 index 000000000..1248e6f7e Binary files /dev/null and b/Telegram/Resources/icons/settings/channel.png differ diff --git a/Telegram/Resources/icons/settings/channel@2x.png b/Telegram/Resources/icons/settings/channel@2x.png new file mode 100644 index 000000000..edee414ff Binary files /dev/null and b/Telegram/Resources/icons/settings/channel@2x.png differ diff --git a/Telegram/Resources/icons/settings/channel@3x.png b/Telegram/Resources/icons/settings/channel@3x.png new file mode 100644 index 000000000..39b116e56 Binary files /dev/null and b/Telegram/Resources/icons/settings/channel@3x.png differ diff --git a/Telegram/Resources/icons/settings/chat.png b/Telegram/Resources/icons/settings/chat.png new file mode 100644 index 000000000..376c189f1 Binary files /dev/null and b/Telegram/Resources/icons/settings/chat.png differ diff --git a/Telegram/Resources/icons/settings/chat@2x.png b/Telegram/Resources/icons/settings/chat@2x.png new file mode 100644 index 000000000..ef625f1a5 Binary files /dev/null and b/Telegram/Resources/icons/settings/chat@2x.png differ diff --git a/Telegram/Resources/icons/settings/chat@3x.png b/Telegram/Resources/icons/settings/chat@3x.png new file mode 100644 index 000000000..5594a8613 Binary files /dev/null and b/Telegram/Resources/icons/settings/chat@3x.png differ diff --git a/Telegram/Resources/icons/settings/cloud.png b/Telegram/Resources/icons/settings/cloud.png new file mode 100644 index 000000000..a671b324c Binary files /dev/null and b/Telegram/Resources/icons/settings/cloud.png differ diff --git a/Telegram/Resources/icons/settings/cloud@2x.png b/Telegram/Resources/icons/settings/cloud@2x.png new file mode 100644 index 000000000..a2fe0079b Binary files /dev/null and b/Telegram/Resources/icons/settings/cloud@2x.png differ diff --git a/Telegram/Resources/icons/settings/cloud@3x.png b/Telegram/Resources/icons/settings/cloud@3x.png new file mode 100644 index 000000000..3cbc43cf7 Binary files /dev/null and b/Telegram/Resources/icons/settings/cloud@3x.png differ diff --git a/Telegram/Resources/icons/settings/devices/terminate_all.png b/Telegram/Resources/icons/settings/devices/terminate_all.png deleted file mode 100644 index ccf538575..000000000 Binary files a/Telegram/Resources/icons/settings/devices/terminate_all.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/devices/terminate_all@2x.png b/Telegram/Resources/icons/settings/devices/terminate_all@2x.png deleted file mode 100644 index 8720d7f23..000000000 Binary files a/Telegram/Resources/icons/settings/devices/terminate_all@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/devices/terminate_all@3x.png b/Telegram/Resources/icons/settings/devices/terminate_all@3x.png deleted file mode 100644 index d4da46f9f..000000000 Binary files a/Telegram/Resources/icons/settings/devices/terminate_all@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/dino.svg b/Telegram/Resources/icons/settings/dino.svg new file mode 100644 index 000000000..24ebe83cf --- /dev/null +++ b/Telegram/Resources/icons/settings/dino.svg @@ -0,0 +1,23 @@ + + + Ava 162 Rexy + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telegram/Resources/icons/settings/dock.png b/Telegram/Resources/icons/settings/dock.png new file mode 100644 index 000000000..310e1b6b1 Binary files /dev/null and b/Telegram/Resources/icons/settings/dock.png differ diff --git a/Telegram/Resources/icons/settings/dock@2x.png b/Telegram/Resources/icons/settings/dock@2x.png new file mode 100644 index 000000000..b768df23f Binary files /dev/null and b/Telegram/Resources/icons/settings/dock@2x.png differ diff --git a/Telegram/Resources/icons/settings/dock@3x.png b/Telegram/Resources/icons/settings/dock@3x.png new file mode 100644 index 000000000..88185cb23 Binary files /dev/null and b/Telegram/Resources/icons/settings/dock@3x.png differ diff --git a/Telegram/Resources/icons/settings/download.png b/Telegram/Resources/icons/settings/download.png new file mode 100644 index 000000000..e5534b7cc Binary files /dev/null and b/Telegram/Resources/icons/settings/download.png differ diff --git a/Telegram/Resources/icons/settings/download@2x.png b/Telegram/Resources/icons/settings/download@2x.png new file mode 100644 index 000000000..8a5a4464a Binary files /dev/null and b/Telegram/Resources/icons/settings/download@2x.png differ diff --git a/Telegram/Resources/icons/settings/download@3x.png b/Telegram/Resources/icons/settings/download@3x.png new file mode 100644 index 000000000..f302e56b7 Binary files /dev/null and b/Telegram/Resources/icons/settings/download@3x.png differ diff --git a/Telegram/Resources/icons/settings/email.png b/Telegram/Resources/icons/settings/email.png new file mode 100644 index 000000000..3c95d18da Binary files /dev/null and b/Telegram/Resources/icons/settings/email.png differ diff --git a/Telegram/Resources/icons/settings/email@2x.png b/Telegram/Resources/icons/settings/email@2x.png new file mode 100644 index 000000000..8c1eac98c Binary files /dev/null and b/Telegram/Resources/icons/settings/email@2x.png differ diff --git a/Telegram/Resources/icons/settings/email@3x.png b/Telegram/Resources/icons/settings/email@3x.png new file mode 100644 index 000000000..0c6e01a0d Binary files /dev/null and b/Telegram/Resources/icons/settings/email@3x.png differ diff --git a/Telegram/Resources/icons/settings/emoji.png b/Telegram/Resources/icons/settings/emoji.png new file mode 100644 index 000000000..70440bfe7 Binary files /dev/null and b/Telegram/Resources/icons/settings/emoji.png differ diff --git a/Telegram/Resources/icons/settings/emoji@2x.png b/Telegram/Resources/icons/settings/emoji@2x.png new file mode 100644 index 000000000..b95369896 Binary files /dev/null and b/Telegram/Resources/icons/settings/emoji@2x.png differ diff --git a/Telegram/Resources/icons/settings/emoji@3x.png b/Telegram/Resources/icons/settings/emoji@3x.png new file mode 100644 index 000000000..2146cb449 Binary files /dev/null and b/Telegram/Resources/icons/settings/emoji@3x.png differ diff --git a/Telegram/Resources/icons/settings/faq.png b/Telegram/Resources/icons/settings/faq.png new file mode 100644 index 000000000..25eff5236 Binary files /dev/null and b/Telegram/Resources/icons/settings/faq.png differ diff --git a/Telegram/Resources/icons/settings/faq@2x.png b/Telegram/Resources/icons/settings/faq@2x.png new file mode 100644 index 000000000..4703e1268 Binary files /dev/null and b/Telegram/Resources/icons/settings/faq@2x.png differ diff --git a/Telegram/Resources/icons/settings/faq@3x.png b/Telegram/Resources/icons/settings/faq@3x.png new file mode 100644 index 000000000..6df95ffba Binary files /dev/null and b/Telegram/Resources/icons/settings/faq@3x.png differ diff --git a/Telegram/Resources/icons/settings/folder_links.png b/Telegram/Resources/icons/settings/folder_links.png new file mode 100644 index 000000000..da8497860 Binary files /dev/null and b/Telegram/Resources/icons/settings/folder_links.png differ diff --git a/Telegram/Resources/icons/settings/folder_links@2x.png b/Telegram/Resources/icons/settings/folder_links@2x.png new file mode 100644 index 000000000..26dfa285e Binary files /dev/null and b/Telegram/Resources/icons/settings/folder_links@2x.png differ diff --git a/Telegram/Resources/icons/settings/folder_links@3x.png b/Telegram/Resources/icons/settings/folder_links@3x.png new file mode 100644 index 000000000..fef135b0d Binary files /dev/null and b/Telegram/Resources/icons/settings/folder_links@3x.png differ diff --git a/Telegram/Resources/icons/settings/folders.png b/Telegram/Resources/icons/settings/folders.png new file mode 100644 index 000000000..b68f55380 Binary files /dev/null and b/Telegram/Resources/icons/settings/folders.png differ diff --git a/Telegram/Resources/icons/settings/folders@2x.png b/Telegram/Resources/icons/settings/folders@2x.png new file mode 100644 index 000000000..318e36b0f Binary files /dev/null and b/Telegram/Resources/icons/settings/folders@2x.png differ diff --git a/Telegram/Resources/icons/settings/folders@3x.png b/Telegram/Resources/icons/settings/folders@3x.png new file mode 100644 index 000000000..6d4ced4fc Binary files /dev/null and b/Telegram/Resources/icons/settings/folders@3x.png differ diff --git a/Telegram/Resources/icons/settings/forward.png b/Telegram/Resources/icons/settings/forward.png new file mode 100644 index 000000000..8aedeed9e Binary files /dev/null and b/Telegram/Resources/icons/settings/forward.png differ diff --git a/Telegram/Resources/icons/settings/forward@2x.png b/Telegram/Resources/icons/settings/forward@2x.png new file mode 100644 index 000000000..0cdbe6f9b Binary files /dev/null and b/Telegram/Resources/icons/settings/forward@2x.png differ diff --git a/Telegram/Resources/icons/settings/forward@3x.png b/Telegram/Resources/icons/settings/forward@3x.png new file mode 100644 index 000000000..04eb48179 Binary files /dev/null and b/Telegram/Resources/icons/settings/forward@3x.png differ diff --git a/Telegram/Resources/icons/settings/group.png b/Telegram/Resources/icons/settings/group.png new file mode 100644 index 000000000..06f26d6f0 Binary files /dev/null and b/Telegram/Resources/icons/settings/group.png differ diff --git a/Telegram/Resources/icons/settings/group@2x.png b/Telegram/Resources/icons/settings/group@2x.png new file mode 100644 index 000000000..27c32bef4 Binary files /dev/null and b/Telegram/Resources/icons/settings/group@2x.png differ diff --git a/Telegram/Resources/icons/settings/group@3x.png b/Telegram/Resources/icons/settings/group@3x.png new file mode 100644 index 000000000..b377b4a99 Binary files /dev/null and b/Telegram/Resources/icons/settings/group@3x.png differ diff --git a/Telegram/Resources/icons/settings/interface_scale.png b/Telegram/Resources/icons/settings/interface_scale.png new file mode 100644 index 000000000..4b658fd10 Binary files /dev/null and b/Telegram/Resources/icons/settings/interface_scale.png differ diff --git a/Telegram/Resources/icons/settings/interface_scale@2x.png b/Telegram/Resources/icons/settings/interface_scale@2x.png new file mode 100644 index 000000000..7c49ea83f Binary files /dev/null and b/Telegram/Resources/icons/settings/interface_scale@2x.png differ diff --git a/Telegram/Resources/icons/settings/interface_scale@3x.png b/Telegram/Resources/icons/settings/interface_scale@3x.png new file mode 100644 index 000000000..eb9c96f0a Binary files /dev/null and b/Telegram/Resources/icons/settings/interface_scale@3x.png differ diff --git a/Telegram/Resources/icons/settings/key.png b/Telegram/Resources/icons/settings/key.png new file mode 100644 index 000000000..6daaa1dfd Binary files /dev/null and b/Telegram/Resources/icons/settings/key.png differ diff --git a/Telegram/Resources/icons/settings/key@2x.png b/Telegram/Resources/icons/settings/key@2x.png new file mode 100644 index 000000000..49afae7ef Binary files /dev/null and b/Telegram/Resources/icons/settings/key@2x.png differ diff --git a/Telegram/Resources/icons/settings/key@3x.png b/Telegram/Resources/icons/settings/key@3x.png new file mode 100644 index 000000000..8e116d26e Binary files /dev/null and b/Telegram/Resources/icons/settings/key@3x.png differ diff --git a/Telegram/Resources/icons/settings/kotato.png b/Telegram/Resources/icons/settings/kotato.png new file mode 100644 index 000000000..23c74dbec Binary files /dev/null and b/Telegram/Resources/icons/settings/kotato.png differ diff --git a/Telegram/Resources/icons/settings/kotato@2x.png b/Telegram/Resources/icons/settings/kotato@2x.png new file mode 100644 index 000000000..04b3997dc Binary files /dev/null and b/Telegram/Resources/icons/settings/kotato@2x.png differ diff --git a/Telegram/Resources/icons/settings/kotato@3x.png b/Telegram/Resources/icons/settings/kotato@3x.png new file mode 100644 index 000000000..842bd3494 Binary files /dev/null and b/Telegram/Resources/icons/settings/kotato@3x.png differ diff --git a/Telegram/Resources/icons/settings/kotato_old.png b/Telegram/Resources/icons/settings/kotato_old.png new file mode 100644 index 000000000..78af364a3 Binary files /dev/null and b/Telegram/Resources/icons/settings/kotato_old.png differ diff --git a/Telegram/Resources/icons/settings/kotato_old@2x.png b/Telegram/Resources/icons/settings/kotato_old@2x.png new file mode 100644 index 000000000..aa3213202 Binary files /dev/null and b/Telegram/Resources/icons/settings/kotato_old@2x.png differ diff --git a/Telegram/Resources/icons/settings/kotato_old@3x.png b/Telegram/Resources/icons/settings/kotato_old@3x.png new file mode 100644 index 000000000..7d2d7e2eb Binary files /dev/null and b/Telegram/Resources/icons/settings/kotato_old@3x.png differ diff --git a/Telegram/Resources/icons/settings/language.png b/Telegram/Resources/icons/settings/language.png new file mode 100644 index 000000000..6c216cb9f Binary files /dev/null and b/Telegram/Resources/icons/settings/language.png differ diff --git a/Telegram/Resources/icons/settings/language@2x.png b/Telegram/Resources/icons/settings/language@2x.png new file mode 100644 index 000000000..03c584523 Binary files /dev/null and b/Telegram/Resources/icons/settings/language@2x.png differ diff --git a/Telegram/Resources/icons/settings/language@3x.png b/Telegram/Resources/icons/settings/language@3x.png new file mode 100644 index 000000000..1a3ecca9a Binary files /dev/null and b/Telegram/Resources/icons/settings/language@3x.png differ diff --git a/Telegram/Resources/icons/settings/laptop.png b/Telegram/Resources/icons/settings/laptop.png new file mode 100644 index 000000000..62a1e866d Binary files /dev/null and b/Telegram/Resources/icons/settings/laptop.png differ diff --git a/Telegram/Resources/icons/settings/laptop@2x.png b/Telegram/Resources/icons/settings/laptop@2x.png new file mode 100644 index 000000000..c14f28bf3 Binary files /dev/null and b/Telegram/Resources/icons/settings/laptop@2x.png differ diff --git a/Telegram/Resources/icons/settings/laptop@3x.png b/Telegram/Resources/icons/settings/laptop@3x.png new file mode 100644 index 000000000..314dc3de7 Binary files /dev/null and b/Telegram/Resources/icons/settings/laptop@3x.png differ diff --git a/Telegram/Resources/icons/settings/lock.png b/Telegram/Resources/icons/settings/lock.png new file mode 100644 index 000000000..40daf45a1 Binary files /dev/null and b/Telegram/Resources/icons/settings/lock.png differ diff --git a/Telegram/Resources/icons/settings/lock@2x.png b/Telegram/Resources/icons/settings/lock@2x.png new file mode 100644 index 000000000..efc00159b Binary files /dev/null and b/Telegram/Resources/icons/settings/lock@2x.png differ diff --git a/Telegram/Resources/icons/settings/lock@3x.png b/Telegram/Resources/icons/settings/lock@3x.png new file mode 100644 index 000000000..62c1815cb Binary files /dev/null and b/Telegram/Resources/icons/settings/lock@3x.png differ diff --git a/Telegram/Resources/icons/settings/mention.png b/Telegram/Resources/icons/settings/mention.png new file mode 100644 index 000000000..04c76d4ec Binary files /dev/null and b/Telegram/Resources/icons/settings/mention.png differ diff --git a/Telegram/Resources/icons/settings/mention@2x.png b/Telegram/Resources/icons/settings/mention@2x.png new file mode 100644 index 000000000..911fdc778 Binary files /dev/null and b/Telegram/Resources/icons/settings/mention@2x.png differ diff --git a/Telegram/Resources/icons/settings/mention@3x.png b/Telegram/Resources/icons/settings/mention@3x.png new file mode 100644 index 000000000..aa0a816da Binary files /dev/null and b/Telegram/Resources/icons/settings/mention@3x.png differ diff --git a/Telegram/Resources/icons/settings/minus.png b/Telegram/Resources/icons/settings/minus.png new file mode 100644 index 000000000..531e2e0b2 Binary files /dev/null and b/Telegram/Resources/icons/settings/minus.png differ diff --git a/Telegram/Resources/icons/settings/minus@2x.png b/Telegram/Resources/icons/settings/minus@2x.png new file mode 100644 index 000000000..9703085aa Binary files /dev/null and b/Telegram/Resources/icons/settings/minus@2x.png differ diff --git a/Telegram/Resources/icons/settings/minus@3x.png b/Telegram/Resources/icons/settings/minus@3x.png new file mode 100644 index 000000000..10a127ea2 Binary files /dev/null and b/Telegram/Resources/icons/settings/minus@3x.png differ diff --git a/Telegram/Resources/icons/settings/night.png b/Telegram/Resources/icons/settings/night.png new file mode 100644 index 000000000..ce1b75200 Binary files /dev/null and b/Telegram/Resources/icons/settings/night.png differ diff --git a/Telegram/Resources/icons/settings/night@2x.png b/Telegram/Resources/icons/settings/night@2x.png new file mode 100644 index 000000000..52ea9170c Binary files /dev/null and b/Telegram/Resources/icons/settings/night@2x.png differ diff --git a/Telegram/Resources/icons/settings/night@3x.png b/Telegram/Resources/icons/settings/night@3x.png new file mode 100644 index 000000000..58ee424c1 Binary files /dev/null and b/Telegram/Resources/icons/settings/night@3x.png differ diff --git a/Telegram/Resources/icons/settings/notifications.png b/Telegram/Resources/icons/settings/notifications.png new file mode 100644 index 000000000..78ad4bea9 Binary files /dev/null and b/Telegram/Resources/icons/settings/notifications.png differ diff --git a/Telegram/Resources/icons/settings/notifications@2x.png b/Telegram/Resources/icons/settings/notifications@2x.png new file mode 100644 index 000000000..bac28778f Binary files /dev/null and b/Telegram/Resources/icons/settings/notifications@2x.png differ diff --git a/Telegram/Resources/icons/settings/notifications@3x.png b/Telegram/Resources/icons/settings/notifications@3x.png new file mode 100644 index 000000000..bf3332f03 Binary files /dev/null and b/Telegram/Resources/icons/settings/notifications@3x.png differ diff --git a/Telegram/Resources/icons/settings/online.png b/Telegram/Resources/icons/settings/online.png new file mode 100644 index 000000000..84a2e0796 Binary files /dev/null and b/Telegram/Resources/icons/settings/online.png differ diff --git a/Telegram/Resources/icons/settings/online@2x.png b/Telegram/Resources/icons/settings/online@2x.png new file mode 100644 index 000000000..f5a6f47b2 Binary files /dev/null and b/Telegram/Resources/icons/settings/online@2x.png differ diff --git a/Telegram/Resources/icons/settings/online@3x.png b/Telegram/Resources/icons/settings/online@3x.png new file mode 100644 index 000000000..b626b15ca Binary files /dev/null and b/Telegram/Resources/icons/settings/online@3x.png differ diff --git a/Telegram/Resources/icons/settings/palette.png b/Telegram/Resources/icons/settings/palette.png new file mode 100644 index 000000000..f2f606d54 Binary files /dev/null and b/Telegram/Resources/icons/settings/palette.png differ diff --git a/Telegram/Resources/icons/settings/palette@2x.png b/Telegram/Resources/icons/settings/palette@2x.png new file mode 100644 index 000000000..95f328bde Binary files /dev/null and b/Telegram/Resources/icons/settings/palette@2x.png differ diff --git a/Telegram/Resources/icons/settings/palette@3x.png b/Telegram/Resources/icons/settings/palette@3x.png new file mode 100644 index 000000000..be6fa7fb3 Binary files /dev/null and b/Telegram/Resources/icons/settings/palette@3x.png differ diff --git a/Telegram/Resources/icons/settings/photo.png b/Telegram/Resources/icons/settings/photo.png new file mode 100644 index 000000000..ef6d4e0a6 Binary files /dev/null and b/Telegram/Resources/icons/settings/photo.png differ diff --git a/Telegram/Resources/icons/settings/photo@2x.png b/Telegram/Resources/icons/settings/photo@2x.png new file mode 100644 index 000000000..845623e7e Binary files /dev/null and b/Telegram/Resources/icons/settings/photo@2x.png differ diff --git a/Telegram/Resources/icons/settings/photo@3x.png b/Telegram/Resources/icons/settings/photo@3x.png new file mode 100644 index 000000000..1258fa5e2 Binary files /dev/null and b/Telegram/Resources/icons/settings/photo@3x.png differ diff --git a/Telegram/Resources/icons/settings/pin.png b/Telegram/Resources/icons/settings/pin.png new file mode 100644 index 000000000..d446e5be0 Binary files /dev/null and b/Telegram/Resources/icons/settings/pin.png differ diff --git a/Telegram/Resources/icons/settings/pin@2x.png b/Telegram/Resources/icons/settings/pin@2x.png new file mode 100644 index 000000000..2895bf0c7 Binary files /dev/null and b/Telegram/Resources/icons/settings/pin@2x.png differ diff --git a/Telegram/Resources/icons/settings/pin@3x.png b/Telegram/Resources/icons/settings/pin@3x.png new file mode 100644 index 000000000..65ec72306 Binary files /dev/null and b/Telegram/Resources/icons/settings/pin@3x.png differ diff --git a/Telegram/Resources/icons/settings/plus.png b/Telegram/Resources/icons/settings/plus.png new file mode 100644 index 000000000..04de61be3 Binary files /dev/null and b/Telegram/Resources/icons/settings/plus.png differ diff --git a/Telegram/Resources/icons/settings/plus@2x.png b/Telegram/Resources/icons/settings/plus@2x.png new file mode 100644 index 000000000..9a3e54740 Binary files /dev/null and b/Telegram/Resources/icons/settings/plus@2x.png differ diff --git a/Telegram/Resources/icons/settings/plus@3x.png b/Telegram/Resources/icons/settings/plus@3x.png new file mode 100644 index 000000000..91d045ee2 Binary files /dev/null and b/Telegram/Resources/icons/settings/plus@3x.png differ diff --git a/Telegram/Resources/icons/settings/position.png b/Telegram/Resources/icons/settings/position.png new file mode 100644 index 000000000..922250425 Binary files /dev/null and b/Telegram/Resources/icons/settings/position.png differ diff --git a/Telegram/Resources/icons/settings/position@2x.png b/Telegram/Resources/icons/settings/position@2x.png new file mode 100644 index 000000000..9f10178bf Binary files /dev/null and b/Telegram/Resources/icons/settings/position@2x.png differ diff --git a/Telegram/Resources/icons/settings/position@3x.png b/Telegram/Resources/icons/settings/position@3x.png new file mode 100644 index 000000000..d9119fb77 Binary files /dev/null and b/Telegram/Resources/icons/settings/position@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/arrow.png b/Telegram/Resources/icons/settings/premium/arrow.png new file mode 100644 index 000000000..0f6433a6e Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/arrow.png differ diff --git a/Telegram/Resources/icons/settings/premium/arrow@2x.png b/Telegram/Resources/icons/settings/premium/arrow@2x.png new file mode 100644 index 000000000..c15a9880d Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/arrow@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/arrow@3x.png b/Telegram/Resources/icons/settings/premium/arrow@3x.png new file mode 100644 index 000000000..e2585a5c4 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/arrow@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/business/business_away.png b/Telegram/Resources/icons/settings/premium/business/business_away.png new file mode 100644 index 000000000..b6fe3bede Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/business/business_away.png differ diff --git a/Telegram/Resources/icons/settings/premium/business/business_away@2x.png b/Telegram/Resources/icons/settings/premium/business/business_away@2x.png new file mode 100644 index 000000000..be8035562 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/business/business_away@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/business/business_away@3x.png b/Telegram/Resources/icons/settings/premium/business/business_away@3x.png new file mode 100644 index 000000000..59afa2748 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/business/business_away@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/business/business_chatbots.png b/Telegram/Resources/icons/settings/premium/business/business_chatbots.png new file mode 100644 index 000000000..aaa60e6a4 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/business/business_chatbots.png differ diff --git a/Telegram/Resources/icons/settings/premium/business/business_chatbots@2x.png b/Telegram/Resources/icons/settings/premium/business/business_chatbots@2x.png new file mode 100644 index 000000000..e48940aaa Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/business/business_chatbots@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/business/business_chatbots@3x.png b/Telegram/Resources/icons/settings/premium/business/business_chatbots@3x.png new file mode 100644 index 000000000..2db7e80ea Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/business/business_chatbots@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/business/business_hours.png b/Telegram/Resources/icons/settings/premium/business/business_hours.png new file mode 100644 index 000000000..c6f0d03e3 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/business/business_hours.png differ diff --git a/Telegram/Resources/icons/settings/premium/business/business_hours@2x.png b/Telegram/Resources/icons/settings/premium/business/business_hours@2x.png new file mode 100644 index 000000000..ce0984920 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/business/business_hours@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/business/business_hours@3x.png b/Telegram/Resources/icons/settings/premium/business/business_hours@3x.png new file mode 100644 index 000000000..0aee12c23 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/business/business_hours@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/business/business_location.png b/Telegram/Resources/icons/settings/premium/business/business_location.png new file mode 100644 index 000000000..ae7020aad Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/business/business_location.png differ diff --git a/Telegram/Resources/icons/settings/premium/business/business_location@2x.png b/Telegram/Resources/icons/settings/premium/business/business_location@2x.png new file mode 100644 index 000000000..49b7ee3c8 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/business/business_location@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/business/business_location@3x.png b/Telegram/Resources/icons/settings/premium/business/business_location@3x.png new file mode 100644 index 000000000..a442c069d Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/business/business_location@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/business/business_quick.png b/Telegram/Resources/icons/settings/premium/business/business_quick.png new file mode 100644 index 000000000..a9e7e1d1f Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/business/business_quick.png differ diff --git a/Telegram/Resources/icons/settings/premium/business/business_quick@2x.png b/Telegram/Resources/icons/settings/premium/business/business_quick@2x.png new file mode 100644 index 000000000..3f4c1852e Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/business/business_quick@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/business/business_quick@3x.png b/Telegram/Resources/icons/settings/premium/business/business_quick@3x.png new file mode 100644 index 000000000..d927c704f Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/business/business_quick@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/channels_off.png b/Telegram/Resources/icons/settings/premium/channels_off.png new file mode 100644 index 000000000..108a1573f Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/channels_off.png differ diff --git a/Telegram/Resources/icons/settings/premium/channels_off@2x.png b/Telegram/Resources/icons/settings/premium/channels_off@2x.png new file mode 100644 index 000000000..18ec1bb77 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/channels_off@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/channels_off@3x.png b/Telegram/Resources/icons/settings/premium/channels_off@3x.png new file mode 100644 index 000000000..22e083d65 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/channels_off@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/double.png b/Telegram/Resources/icons/settings/premium/double.png new file mode 100644 index 000000000..388994de8 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/double.png differ diff --git a/Telegram/Resources/icons/settings/premium/double@2x.png b/Telegram/Resources/icons/settings/premium/double@2x.png new file mode 100644 index 000000000..62ef97fc8 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/double@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/double@3x.png b/Telegram/Resources/icons/settings/premium/double@3x.png new file mode 100644 index 000000000..2de7119b2 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/double@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_color_names.png b/Telegram/Resources/icons/settings/premium/features/feature_color_names.png new file mode 100644 index 000000000..4acd54d82 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_color_names.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_color_names@2x.png b/Telegram/Resources/icons/settings/premium/features/feature_color_names@2x.png new file mode 100644 index 000000000..f8dd406fe Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_color_names@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_color_names@3x.png b/Telegram/Resources/icons/settings/premium/features/feature_color_names@3x.png new file mode 100644 index 000000000..1bd9d32ae Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_color_names@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_custombg.png b/Telegram/Resources/icons/settings/premium/features/feature_custombg.png new file mode 100644 index 000000000..234f29434 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_custombg.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_custombg@2x.png b/Telegram/Resources/icons/settings/premium/features/feature_custombg@2x.png new file mode 100644 index 000000000..0fb615748 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_custombg@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_custombg@3x.png b/Telegram/Resources/icons/settings/premium/features/feature_custombg@3x.png new file mode 100644 index 000000000..571d1379e Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_custombg@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_emoji_pack.png b/Telegram/Resources/icons/settings/premium/features/feature_emoji_pack.png new file mode 100644 index 000000000..327d069c7 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_emoji_pack.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_emoji_pack@2x.png b/Telegram/Resources/icons/settings/premium/features/feature_emoji_pack@2x.png new file mode 100644 index 000000000..076b08433 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_emoji_pack@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_emoji_pack@3x.png b/Telegram/Resources/icons/settings/premium/features/feature_emoji_pack@3x.png new file mode 100644 index 000000000..4325db686 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_emoji_pack@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_links.png b/Telegram/Resources/icons/settings/premium/features/feature_links.png new file mode 100644 index 000000000..11c44d03f Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_links.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_links2.png b/Telegram/Resources/icons/settings/premium/features/feature_links2.png new file mode 100644 index 000000000..8bfedd0f4 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_links2.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_links2@2x.png b/Telegram/Resources/icons/settings/premium/features/feature_links2@2x.png new file mode 100644 index 000000000..c89f73225 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_links2@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_links2@3x.png b/Telegram/Resources/icons/settings/premium/features/feature_links2@3x.png new file mode 100644 index 000000000..66c9d9d3a Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_links2@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_links@2x.png b/Telegram/Resources/icons/settings/premium/features/feature_links@2x.png new file mode 100644 index 000000000..78ebcd323 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_links@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_links@3x.png b/Telegram/Resources/icons/settings/premium/features/feature_links@3x.png new file mode 100644 index 000000000..80b73df03 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_links@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_reactions.png b/Telegram/Resources/icons/settings/premium/features/feature_reactions.png new file mode 100644 index 000000000..efbe55f2a Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_reactions.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_reactions@2x.png b/Telegram/Resources/icons/settings/premium/features/feature_reactions@2x.png new file mode 100644 index 000000000..b73917126 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_reactions@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_reactions@3x.png b/Telegram/Resources/icons/settings/premium/features/feature_reactions@3x.png new file mode 100644 index 000000000..c71f495be Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_reactions@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_status.png b/Telegram/Resources/icons/settings/premium/features/feature_status.png new file mode 100644 index 000000000..b7969a460 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_status.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_status@2x.png b/Telegram/Resources/icons/settings/premium/features/feature_status@2x.png new file mode 100644 index 000000000..10f2a645e Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_status@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_status@3x.png b/Telegram/Resources/icons/settings/premium/features/feature_status@3x.png new file mode 100644 index 000000000..5f93a1e33 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_status@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_stories.png b/Telegram/Resources/icons/settings/premium/features/feature_stories.png new file mode 100644 index 000000000..7420822b7 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_stories.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_stories@2x.png b/Telegram/Resources/icons/settings/premium/features/feature_stories@2x.png new file mode 100644 index 000000000..ec1d7e056 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_stories@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_stories@3x.png b/Telegram/Resources/icons/settings/premium/features/feature_stories@3x.png new file mode 100644 index 000000000..86e53f601 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_stories@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_voice.png b/Telegram/Resources/icons/settings/premium/features/feature_voice.png new file mode 100644 index 000000000..3f8f0a9c3 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_voice.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_voice@2x.png b/Telegram/Resources/icons/settings/premium/features/feature_voice@2x.png new file mode 100644 index 000000000..75ffbbf9d Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_voice@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_voice@3x.png b/Telegram/Resources/icons/settings/premium/features/feature_voice@3x.png new file mode 100644 index 000000000..176153370 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_voice@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_wallpaper.png b/Telegram/Resources/icons/settings/premium/features/feature_wallpaper.png new file mode 100644 index 000000000..a88ef05cf Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_wallpaper.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_wallpaper@2x.png b/Telegram/Resources/icons/settings/premium/features/feature_wallpaper@2x.png new file mode 100644 index 000000000..ad2bc2ed5 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_wallpaper@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/features/feature_wallpaper@3x.png b/Telegram/Resources/icons/settings/premium/features/feature_wallpaper@3x.png new file mode 100644 index 000000000..6e0c0765a Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/features/feature_wallpaper@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/files.png b/Telegram/Resources/icons/settings/premium/files.png new file mode 100644 index 000000000..f82c4e495 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/files.png differ diff --git a/Telegram/Resources/icons/settings/premium/files@2x.png b/Telegram/Resources/icons/settings/premium/files@2x.png new file mode 100644 index 000000000..cffe00909 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/files@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/files@3x.png b/Telegram/Resources/icons/settings/premium/files@3x.png new file mode 100644 index 000000000..4c20f6d87 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/files@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/large_lastseen.png b/Telegram/Resources/icons/settings/premium/large_lastseen.png new file mode 100644 index 000000000..e47bd7935 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/large_lastseen.png differ diff --git a/Telegram/Resources/icons/settings/premium/large_lastseen@2x.png b/Telegram/Resources/icons/settings/premium/large_lastseen@2x.png new file mode 100644 index 000000000..305b6a491 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/large_lastseen@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/large_lastseen@3x.png b/Telegram/Resources/icons/settings/premium/large_lastseen@3x.png new file mode 100644 index 000000000..0cd1e12ab Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/large_lastseen@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/large_readtime.png b/Telegram/Resources/icons/settings/premium/large_readtime.png new file mode 100644 index 000000000..c06294a82 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/large_readtime.png differ diff --git a/Telegram/Resources/icons/settings/premium/large_readtime@2x.png b/Telegram/Resources/icons/settings/premium/large_readtime@2x.png new file mode 100644 index 000000000..f30a355ee Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/large_readtime@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/large_readtime@3x.png b/Telegram/Resources/icons/settings/premium/large_readtime@3x.png new file mode 100644 index 000000000..1e7d022a3 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/large_readtime@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/lastseen.png b/Telegram/Resources/icons/settings/premium/lastseen.png new file mode 100644 index 000000000..9299ed216 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/lastseen.png differ diff --git a/Telegram/Resources/icons/settings/premium/lastseen@2x.png b/Telegram/Resources/icons/settings/premium/lastseen@2x.png new file mode 100644 index 000000000..994a90719 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/lastseen@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/lastseen@3x.png b/Telegram/Resources/icons/settings/premium/lastseen@3x.png new file mode 100644 index 000000000..42b3f1865 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/lastseen@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/like.png b/Telegram/Resources/icons/settings/premium/like.png new file mode 100644 index 000000000..77e9f63a1 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/like.png differ diff --git a/Telegram/Resources/icons/settings/premium/like@2x.png b/Telegram/Resources/icons/settings/premium/like@2x.png new file mode 100644 index 000000000..183760ba7 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/like@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/like@3x.png b/Telegram/Resources/icons/settings/premium/like@3x.png new file mode 100644 index 000000000..0e5e12899 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/like@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/market.png b/Telegram/Resources/icons/settings/premium/market.png new file mode 100644 index 000000000..3c2b9cd2d Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/market.png differ diff --git a/Telegram/Resources/icons/settings/premium/market@2x.png b/Telegram/Resources/icons/settings/premium/market@2x.png new file mode 100644 index 000000000..1ae9e950a Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/market@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/market@3x.png b/Telegram/Resources/icons/settings/premium/market@3x.png new file mode 100644 index 000000000..5d132577d Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/market@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/play.png b/Telegram/Resources/icons/settings/premium/play.png new file mode 100644 index 000000000..0a3d57697 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/play.png differ diff --git a/Telegram/Resources/icons/settings/premium/play@2x.png b/Telegram/Resources/icons/settings/premium/play@2x.png new file mode 100644 index 000000000..ef9bca6e1 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/play@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/play@3x.png b/Telegram/Resources/icons/settings/premium/play@3x.png new file mode 100644 index 000000000..4bc9dcb1c Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/play@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/privacy.png b/Telegram/Resources/icons/settings/premium/privacy.png new file mode 100644 index 000000000..9d2309768 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/privacy.png differ diff --git a/Telegram/Resources/icons/settings/premium/privacy@2x.png b/Telegram/Resources/icons/settings/premium/privacy@2x.png new file mode 100644 index 000000000..f82d78947 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/privacy@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/privacy@3x.png b/Telegram/Resources/icons/settings/premium/privacy@3x.png new file mode 100644 index 000000000..ce3c77543 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/privacy@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/speed.png b/Telegram/Resources/icons/settings/premium/speed.png new file mode 100644 index 000000000..29ab2bb05 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/speed.png differ diff --git a/Telegram/Resources/icons/settings/premium/speed@2x.png b/Telegram/Resources/icons/settings/premium/speed@2x.png new file mode 100644 index 000000000..69689a452 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/speed@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/speed@3x.png b/Telegram/Resources/icons/settings/premium/speed@3x.png new file mode 100644 index 000000000..f0be41b0b Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/speed@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/star.png b/Telegram/Resources/icons/settings/premium/star.png new file mode 100644 index 000000000..82fa9b74c Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/star.png differ diff --git a/Telegram/Resources/icons/settings/premium/star@2x.png b/Telegram/Resources/icons/settings/premium/star@2x.png new file mode 100644 index 000000000..24e485e35 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/star@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/star@3x.png b/Telegram/Resources/icons/settings/premium/star@3x.png new file mode 100644 index 000000000..024947d92 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/star@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/status.png b/Telegram/Resources/icons/settings/premium/status.png new file mode 100644 index 000000000..712c91ba0 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/status.png differ diff --git a/Telegram/Resources/icons/settings/premium/status@2x.png b/Telegram/Resources/icons/settings/premium/status@2x.png new file mode 100644 index 000000000..f0e395b4e Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/status@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/status@3x.png b/Telegram/Resources/icons/settings/premium/status@3x.png new file mode 100644 index 000000000..9127319e9 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/status@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/stories_caption.png b/Telegram/Resources/icons/settings/premium/stories_caption.png new file mode 100644 index 000000000..d73bc9068 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/stories_caption.png differ diff --git a/Telegram/Resources/icons/settings/premium/stories_caption@2x.png b/Telegram/Resources/icons/settings/premium/stories_caption@2x.png new file mode 100644 index 000000000..e67594df0 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/stories_caption@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/stories_caption@3x.png b/Telegram/Resources/icons/settings/premium/stories_caption@3x.png new file mode 100644 index 000000000..373884ace Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/stories_caption@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/stories_order.png b/Telegram/Resources/icons/settings/premium/stories_order.png new file mode 100644 index 000000000..3051561df Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/stories_order.png differ diff --git a/Telegram/Resources/icons/settings/premium/stories_order@2x.png b/Telegram/Resources/icons/settings/premium/stories_order@2x.png new file mode 100644 index 000000000..4b4f64ceb Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/stories_order@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/stories_order@3x.png b/Telegram/Resources/icons/settings/premium/stories_order@3x.png new file mode 100644 index 000000000..d550ddcef Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/stories_order@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/tags.png b/Telegram/Resources/icons/settings/premium/tags.png new file mode 100644 index 000000000..9a761e7b0 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/tags.png differ diff --git a/Telegram/Resources/icons/settings/premium/tags@2x.png b/Telegram/Resources/icons/settings/premium/tags@2x.png new file mode 100644 index 000000000..194aec649 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/tags@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/tags@3x.png b/Telegram/Resources/icons/settings/premium/tags@3x.png new file mode 100644 index 000000000..f6b8511cf Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/tags@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/timer.png b/Telegram/Resources/icons/settings/premium/timer.png new file mode 100644 index 000000000..5fe0383b4 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/timer.png differ diff --git a/Telegram/Resources/icons/settings/premium/timer@2x.png b/Telegram/Resources/icons/settings/premium/timer@2x.png new file mode 100644 index 000000000..28d3d1480 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/timer@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/timer@3x.png b/Telegram/Resources/icons/settings/premium/timer@3x.png new file mode 100644 index 000000000..173ad913d Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/timer@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/translations.png b/Telegram/Resources/icons/settings/premium/translations.png new file mode 100644 index 000000000..8427739b4 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/translations.png differ diff --git a/Telegram/Resources/icons/settings/premium/translations@2x.png b/Telegram/Resources/icons/settings/premium/translations@2x.png new file mode 100644 index 000000000..5938dfc8b Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/translations@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/translations@3x.png b/Telegram/Resources/icons/settings/premium/translations@3x.png new file mode 100644 index 000000000..e3b81828f Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/translations@3x.png differ diff --git a/Telegram/Resources/icons/settings/premium/voice.png b/Telegram/Resources/icons/settings/premium/voice.png new file mode 100644 index 000000000..7d83225f9 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/voice.png differ diff --git a/Telegram/Resources/icons/settings/premium/voice@2x.png b/Telegram/Resources/icons/settings/premium/voice@2x.png new file mode 100644 index 000000000..650696908 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/voice@2x.png differ diff --git a/Telegram/Resources/icons/settings/premium/voice@3x.png b/Telegram/Resources/icons/settings/premium/voice@3x.png new file mode 100644 index 000000000..bffe3be39 Binary files /dev/null and b/Telegram/Resources/icons/settings/premium/voice@3x.png differ diff --git a/Telegram/Resources/icons/settings/reload.png b/Telegram/Resources/icons/settings/reload.png new file mode 100644 index 000000000..e8ad977a9 Binary files /dev/null and b/Telegram/Resources/icons/settings/reload.png differ diff --git a/Telegram/Resources/icons/settings/reload@2x.png b/Telegram/Resources/icons/settings/reload@2x.png new file mode 100644 index 000000000..8a0d60c51 Binary files /dev/null and b/Telegram/Resources/icons/settings/reload@2x.png differ diff --git a/Telegram/Resources/icons/settings/reload@3x.png b/Telegram/Resources/icons/settings/reload@3x.png new file mode 100644 index 000000000..161e5e6ee Binary files /dev/null and b/Telegram/Resources/icons/settings/reload@3x.png differ diff --git a/Telegram/Resources/icons/settings/remove.png b/Telegram/Resources/icons/settings/remove.png new file mode 100644 index 000000000..087a4c374 Binary files /dev/null and b/Telegram/Resources/icons/settings/remove.png differ diff --git a/Telegram/Resources/icons/settings/remove@2x.png b/Telegram/Resources/icons/settings/remove@2x.png new file mode 100644 index 000000000..81b4161b4 Binary files /dev/null and b/Telegram/Resources/icons/settings/remove@2x.png differ diff --git a/Telegram/Resources/icons/settings/remove@3x.png b/Telegram/Resources/icons/settings/remove@3x.png new file mode 100644 index 000000000..4fbf2e331 Binary files /dev/null and b/Telegram/Resources/icons/settings/remove@3x.png differ diff --git a/Telegram/Resources/icons/settings/saved_messages.png b/Telegram/Resources/icons/settings/saved_messages.png new file mode 100644 index 000000000..bd0ced24d Binary files /dev/null and b/Telegram/Resources/icons/settings/saved_messages.png differ diff --git a/Telegram/Resources/icons/settings/saved_messages@2x.png b/Telegram/Resources/icons/settings/saved_messages@2x.png new file mode 100644 index 000000000..686e8af02 Binary files /dev/null and b/Telegram/Resources/icons/settings/saved_messages@2x.png differ diff --git a/Telegram/Resources/icons/settings/saved_messages@3x.png b/Telegram/Resources/icons/settings/saved_messages@3x.png new file mode 100644 index 000000000..304198b33 Binary files /dev/null and b/Telegram/Resources/icons/settings/saved_messages@3x.png differ diff --git a/Telegram/Resources/icons/settings/settings.png b/Telegram/Resources/icons/settings/settings.png new file mode 100644 index 000000000..c2761c595 Binary files /dev/null and b/Telegram/Resources/icons/settings/settings.png differ diff --git a/Telegram/Resources/icons/settings/settings@2x.png b/Telegram/Resources/icons/settings/settings@2x.png new file mode 100644 index 000000000..a6f463a20 Binary files /dev/null and b/Telegram/Resources/icons/settings/settings@2x.png differ diff --git a/Telegram/Resources/icons/settings/settings@3x.png b/Telegram/Resources/icons/settings/settings@3x.png new file mode 100644 index 000000000..d59d28346 Binary files /dev/null and b/Telegram/Resources/icons/settings/settings@3x.png differ diff --git a/Telegram/Resources/icons/settings/settings_advanced.png b/Telegram/Resources/icons/settings/settings_advanced.png deleted file mode 100644 index 469abcaf8..000000000 Binary files a/Telegram/Resources/icons/settings/settings_advanced.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_advanced@2x.png b/Telegram/Resources/icons/settings/settings_advanced@2x.png deleted file mode 100644 index 95a6e3c3f..000000000 Binary files a/Telegram/Resources/icons/settings/settings_advanced@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_advanced@3x.png b/Telegram/Resources/icons/settings/settings_advanced@3x.png deleted file mode 100644 index bdcd1797e..000000000 Binary files a/Telegram/Resources/icons/settings/settings_advanced@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_chat.png b/Telegram/Resources/icons/settings/settings_chat.png deleted file mode 100644 index ca3b669ce..000000000 Binary files a/Telegram/Resources/icons/settings/settings_chat.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_chat@2x.png b/Telegram/Resources/icons/settings/settings_chat@2x.png deleted file mode 100644 index 30b4f3e0b..000000000 Binary files a/Telegram/Resources/icons/settings/settings_chat@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_chat@3x.png b/Telegram/Resources/icons/settings/settings_chat@3x.png deleted file mode 100644 index a312eadf0..000000000 Binary files a/Telegram/Resources/icons/settings/settings_chat@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_cloud.png b/Telegram/Resources/icons/settings/settings_cloud.png deleted file mode 100644 index c28239251..000000000 Binary files a/Telegram/Resources/icons/settings/settings_cloud.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_cloud@2x.png b/Telegram/Resources/icons/settings/settings_cloud@2x.png deleted file mode 100644 index 6e004a9ba..000000000 Binary files a/Telegram/Resources/icons/settings/settings_cloud@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_cloud@3x.png b/Telegram/Resources/icons/settings/settings_cloud@3x.png deleted file mode 100644 index 3cb99dfab..000000000 Binary files a/Telegram/Resources/icons/settings/settings_cloud@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_edit.png b/Telegram/Resources/icons/settings/settings_edit.png deleted file mode 100644 index fad4f64fa..000000000 Binary files a/Telegram/Resources/icons/settings/settings_edit.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_edit@2x.png b/Telegram/Resources/icons/settings/settings_edit@2x.png deleted file mode 100644 index f4b7e547c..000000000 Binary files a/Telegram/Resources/icons/settings/settings_edit@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_edit@3x.png b/Telegram/Resources/icons/settings/settings_edit@3x.png deleted file mode 100644 index cb01f9122..000000000 Binary files a/Telegram/Resources/icons/settings/settings_edit@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_emoji.png b/Telegram/Resources/icons/settings/settings_emoji.png deleted file mode 100644 index ecd4e2893..000000000 Binary files a/Telegram/Resources/icons/settings/settings_emoji.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_emoji@2x.png b/Telegram/Resources/icons/settings/settings_emoji@2x.png deleted file mode 100644 index aba065d27..000000000 Binary files a/Telegram/Resources/icons/settings/settings_emoji@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_emoji@3x.png b/Telegram/Resources/icons/settings/settings_emoji@3x.png deleted file mode 100644 index 01f089b2d..000000000 Binary files a/Telegram/Resources/icons/settings/settings_emoji@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_faq.png b/Telegram/Resources/icons/settings/settings_faq.png deleted file mode 100644 index 2e4693de2..000000000 Binary files a/Telegram/Resources/icons/settings/settings_faq.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_faq@2x.png b/Telegram/Resources/icons/settings/settings_faq@2x.png deleted file mode 100644 index 1657cca23..000000000 Binary files a/Telegram/Resources/icons/settings/settings_faq@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_faq@3x.png b/Telegram/Resources/icons/settings/settings_faq@3x.png deleted file mode 100644 index c1a4dd22b..000000000 Binary files a/Telegram/Resources/icons/settings/settings_faq@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_folders.png b/Telegram/Resources/icons/settings/settings_folders.png deleted file mode 100644 index bb941b3e2..000000000 Binary files a/Telegram/Resources/icons/settings/settings_folders.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_folders@2x.png b/Telegram/Resources/icons/settings/settings_folders@2x.png deleted file mode 100644 index 468d20aee..000000000 Binary files a/Telegram/Resources/icons/settings/settings_folders@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_folders@3x.png b/Telegram/Resources/icons/settings/settings_folders@3x.png deleted file mode 100644 index 9300c2dc6..000000000 Binary files a/Telegram/Resources/icons/settings/settings_folders@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_information.png b/Telegram/Resources/icons/settings/settings_information.png deleted file mode 100644 index 02cf5c07a..000000000 Binary files a/Telegram/Resources/icons/settings/settings_information.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_information@2x.png b/Telegram/Resources/icons/settings/settings_information@2x.png deleted file mode 100644 index b335acf21..000000000 Binary files a/Telegram/Resources/icons/settings/settings_information@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_information@3x.png b/Telegram/Resources/icons/settings/settings_information@3x.png deleted file mode 100644 index 489f2ac0a..000000000 Binary files a/Telegram/Resources/icons/settings/settings_information@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_interface_scale.png b/Telegram/Resources/icons/settings/settings_interface_scale.png deleted file mode 100644 index 7db6e9f25..000000000 Binary files a/Telegram/Resources/icons/settings/settings_interface_scale.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_interface_scale@2x.png b/Telegram/Resources/icons/settings/settings_interface_scale@2x.png deleted file mode 100644 index 7187b9b22..000000000 Binary files a/Telegram/Resources/icons/settings/settings_interface_scale@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_interface_scale@3x.png b/Telegram/Resources/icons/settings/settings_interface_scale@3x.png deleted file mode 100644 index 3bcca5b7f..000000000 Binary files a/Telegram/Resources/icons/settings/settings_interface_scale@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_kotato.png b/Telegram/Resources/icons/settings/settings_kotato.png deleted file mode 100644 index 5cbf718c2..000000000 Binary files a/Telegram/Resources/icons/settings/settings_kotato.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_kotato@2x.png b/Telegram/Resources/icons/settings/settings_kotato@2x.png deleted file mode 100644 index 2e871fcf6..000000000 Binary files a/Telegram/Resources/icons/settings/settings_kotato@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_kotato@3x.png b/Telegram/Resources/icons/settings/settings_kotato@3x.png deleted file mode 100644 index b187ccb2e..000000000 Binary files a/Telegram/Resources/icons/settings/settings_kotato@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_kotato_old.png b/Telegram/Resources/icons/settings/settings_kotato_old.png deleted file mode 100644 index 17cf76b1e..000000000 Binary files a/Telegram/Resources/icons/settings/settings_kotato_old.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_kotato_old@2x.png b/Telegram/Resources/icons/settings/settings_kotato_old@2x.png deleted file mode 100644 index 2eb82f743..000000000 Binary files a/Telegram/Resources/icons/settings/settings_kotato_old@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_kotato_old@3x.png b/Telegram/Resources/icons/settings/settings_kotato_old@3x.png deleted file mode 100644 index c267c40d0..000000000 Binary files a/Telegram/Resources/icons/settings/settings_kotato_old@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_language.png b/Telegram/Resources/icons/settings/settings_language.png deleted file mode 100644 index b921ea427..000000000 Binary files a/Telegram/Resources/icons/settings/settings_language.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_language@2x.png b/Telegram/Resources/icons/settings/settings_language@2x.png deleted file mode 100644 index 6c070e3e3..000000000 Binary files a/Telegram/Resources/icons/settings/settings_language@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_language@3x.png b/Telegram/Resources/icons/settings/settings_language@3x.png deleted file mode 100644 index 6619203f5..000000000 Binary files a/Telegram/Resources/icons/settings/settings_language@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_notifications.png b/Telegram/Resources/icons/settings/settings_notifications.png deleted file mode 100644 index c6baf4125..000000000 Binary files a/Telegram/Resources/icons/settings/settings_notifications.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_notifications@2x.png b/Telegram/Resources/icons/settings/settings_notifications@2x.png deleted file mode 100644 index 998b44c34..000000000 Binary files a/Telegram/Resources/icons/settings/settings_notifications@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_notifications@3x.png b/Telegram/Resources/icons/settings/settings_notifications@3x.png deleted file mode 100644 index 74815bc59..000000000 Binary files a/Telegram/Resources/icons/settings/settings_notifications@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_privacy_security.png b/Telegram/Resources/icons/settings/settings_privacy_security.png deleted file mode 100644 index 573abf2bc..000000000 Binary files a/Telegram/Resources/icons/settings/settings_privacy_security.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_privacy_security@2x.png b/Telegram/Resources/icons/settings/settings_privacy_security@2x.png deleted file mode 100644 index 5b5bacc99..000000000 Binary files a/Telegram/Resources/icons/settings/settings_privacy_security@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_privacy_security@3x.png b/Telegram/Resources/icons/settings/settings_privacy_security@3x.png deleted file mode 100644 index f4a37722e..000000000 Binary files a/Telegram/Resources/icons/settings/settings_privacy_security@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_themes.png b/Telegram/Resources/icons/settings/settings_themes.png deleted file mode 100644 index fd36932b5..000000000 Binary files a/Telegram/Resources/icons/settings/settings_themes.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_themes@2x.png b/Telegram/Resources/icons/settings/settings_themes@2x.png deleted file mode 100644 index b26c2cd2b..000000000 Binary files a/Telegram/Resources/icons/settings/settings_themes@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_themes@3x.png b/Telegram/Resources/icons/settings/settings_themes@3x.png deleted file mode 100644 index 0694f77bc..000000000 Binary files a/Telegram/Resources/icons/settings/settings_themes@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_username.png b/Telegram/Resources/icons/settings/settings_username.png deleted file mode 100644 index 0f55678e9..000000000 Binary files a/Telegram/Resources/icons/settings/settings_username.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_username@2x.png b/Telegram/Resources/icons/settings/settings_username@2x.png deleted file mode 100644 index 7125e84bc..000000000 Binary files a/Telegram/Resources/icons/settings/settings_username@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/settings_username@3x.png b/Telegram/Resources/icons/settings/settings_username@3x.png deleted file mode 100644 index c35e1a78d..000000000 Binary files a/Telegram/Resources/icons/settings/settings_username@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/settings/sound.png b/Telegram/Resources/icons/settings/sound.png new file mode 100644 index 000000000..c8061b175 Binary files /dev/null and b/Telegram/Resources/icons/settings/sound.png differ diff --git a/Telegram/Resources/icons/settings/sound@2x.png b/Telegram/Resources/icons/settings/sound@2x.png new file mode 100644 index 000000000..1d8d85954 Binary files /dev/null and b/Telegram/Resources/icons/settings/sound@2x.png differ diff --git a/Telegram/Resources/icons/settings/sound@3x.png b/Telegram/Resources/icons/settings/sound@3x.png new file mode 100644 index 000000000..3c1e3a2fd Binary files /dev/null and b/Telegram/Resources/icons/settings/sound@3x.png differ diff --git a/Telegram/Resources/icons/settings/star.svg b/Telegram/Resources/icons/settings/star.svg new file mode 100644 index 000000000..ec5f637d2 --- /dev/null +++ b/Telegram/Resources/icons/settings/star.svg @@ -0,0 +1 @@ +gradientPlaceholder diff --git a/Telegram/Resources/icons/settings/starmini.svg b/Telegram/Resources/icons/settings/starmini.svg new file mode 100644 index 000000000..13e53a95d --- /dev/null +++ b/Telegram/Resources/icons/settings/starmini.svg @@ -0,0 +1,7 @@ + + +ministar + + + + diff --git a/Telegram/Resources/icons/settings/stickers.png b/Telegram/Resources/icons/settings/stickers.png new file mode 100644 index 000000000..064eec67a Binary files /dev/null and b/Telegram/Resources/icons/settings/stickers.png differ diff --git a/Telegram/Resources/icons/settings/stickers@2x.png b/Telegram/Resources/icons/settings/stickers@2x.png new file mode 100644 index 000000000..274bd286b Binary files /dev/null and b/Telegram/Resources/icons/settings/stickers@2x.png differ diff --git a/Telegram/Resources/icons/settings/stickers@3x.png b/Telegram/Resources/icons/settings/stickers@3x.png new file mode 100644 index 000000000..df6b71ea7 Binary files /dev/null and b/Telegram/Resources/icons/settings/stickers@3x.png differ diff --git a/Telegram/Resources/icons/settings/stories.png b/Telegram/Resources/icons/settings/stories.png new file mode 100644 index 000000000..c41ac06dd Binary files /dev/null and b/Telegram/Resources/icons/settings/stories.png differ diff --git a/Telegram/Resources/icons/settings/stories@2x.png b/Telegram/Resources/icons/settings/stories@2x.png new file mode 100644 index 000000000..82e24fc67 Binary files /dev/null and b/Telegram/Resources/icons/settings/stories@2x.png differ diff --git a/Telegram/Resources/icons/settings/stories@3x.png b/Telegram/Resources/icons/settings/stories@3x.png new file mode 100644 index 000000000..23c70a8cc Binary files /dev/null and b/Telegram/Resources/icons/settings/stories@3x.png differ diff --git a/Telegram/Resources/icons/settings/timer.png b/Telegram/Resources/icons/settings/timer.png new file mode 100644 index 000000000..e6893f7c7 Binary files /dev/null and b/Telegram/Resources/icons/settings/timer.png differ diff --git a/Telegram/Resources/icons/settings/timer@2x.png b/Telegram/Resources/icons/settings/timer@2x.png new file mode 100644 index 000000000..d1c986c73 Binary files /dev/null and b/Telegram/Resources/icons/settings/timer@2x.png differ diff --git a/Telegram/Resources/icons/settings/timer@3x.png b/Telegram/Resources/icons/settings/timer@3x.png new file mode 100644 index 000000000..215564243 Binary files /dev/null and b/Telegram/Resources/icons/settings/timer@3x.png differ diff --git a/Telegram/Resources/icons/settings/tips.png b/Telegram/Resources/icons/settings/tips.png new file mode 100644 index 000000000..505aac951 Binary files /dev/null and b/Telegram/Resources/icons/settings/tips.png differ diff --git a/Telegram/Resources/icons/settings/tips@2x.png b/Telegram/Resources/icons/settings/tips@2x.png new file mode 100644 index 000000000..af7604a24 Binary files /dev/null and b/Telegram/Resources/icons/settings/tips@2x.png differ diff --git a/Telegram/Resources/icons/settings/tips@3x.png b/Telegram/Resources/icons/settings/tips@3x.png new file mode 100644 index 000000000..5ec4c2e2c Binary files /dev/null and b/Telegram/Resources/icons/settings/tips@3x.png differ diff --git a/Telegram/Resources/icons/settings/topics.png b/Telegram/Resources/icons/settings/topics.png new file mode 100644 index 000000000..2a2563d90 Binary files /dev/null and b/Telegram/Resources/icons/settings/topics.png differ diff --git a/Telegram/Resources/icons/settings/topics@2x.png b/Telegram/Resources/icons/settings/topics@2x.png new file mode 100644 index 000000000..4d6dee8d1 Binary files /dev/null and b/Telegram/Resources/icons/settings/topics@2x.png differ diff --git a/Telegram/Resources/icons/settings/topics@3x.png b/Telegram/Resources/icons/settings/topics@3x.png new file mode 100644 index 000000000..dd963ffdf Binary files /dev/null and b/Telegram/Resources/icons/settings/topics@3x.png differ diff --git a/Telegram/Resources/icons/settings/ttl.png b/Telegram/Resources/icons/settings/ttl.png new file mode 100644 index 000000000..a8263fe2e Binary files /dev/null and b/Telegram/Resources/icons/settings/ttl.png differ diff --git a/Telegram/Resources/icons/settings/ttl/autodelete_off.png b/Telegram/Resources/icons/settings/ttl/autodelete_off.png new file mode 100644 index 000000000..5423957b9 Binary files /dev/null and b/Telegram/Resources/icons/settings/ttl/autodelete_off.png differ diff --git a/Telegram/Resources/icons/settings/ttl/autodelete_off@2x.png b/Telegram/Resources/icons/settings/ttl/autodelete_off@2x.png new file mode 100644 index 000000000..2327d2ed3 Binary files /dev/null and b/Telegram/Resources/icons/settings/ttl/autodelete_off@2x.png differ diff --git a/Telegram/Resources/icons/settings/ttl/autodelete_off@3x.png b/Telegram/Resources/icons/settings/ttl/autodelete_off@3x.png new file mode 100644 index 000000000..a441bf814 Binary files /dev/null and b/Telegram/Resources/icons/settings/ttl/autodelete_off@3x.png differ diff --git a/Telegram/Resources/icons/settings/ttl/autodelete_on.png b/Telegram/Resources/icons/settings/ttl/autodelete_on.png new file mode 100644 index 000000000..640200904 Binary files /dev/null and b/Telegram/Resources/icons/settings/ttl/autodelete_on.png differ diff --git a/Telegram/Resources/icons/settings/ttl/autodelete_on@2x.png b/Telegram/Resources/icons/settings/ttl/autodelete_on@2x.png new file mode 100644 index 000000000..14b364d5f Binary files /dev/null and b/Telegram/Resources/icons/settings/ttl/autodelete_on@2x.png differ diff --git a/Telegram/Resources/icons/settings/ttl/autodelete_on@3x.png b/Telegram/Resources/icons/settings/ttl/autodelete_on@3x.png new file mode 100644 index 000000000..daecd5b11 Binary files /dev/null and b/Telegram/Resources/icons/settings/ttl/autodelete_on@3x.png differ diff --git a/Telegram/Resources/icons/settings/ttl@2x.png b/Telegram/Resources/icons/settings/ttl@2x.png new file mode 100644 index 000000000..01a63ec35 Binary files /dev/null and b/Telegram/Resources/icons/settings/ttl@2x.png differ diff --git a/Telegram/Resources/icons/settings/ttl@3x.png b/Telegram/Resources/icons/settings/ttl@3x.png new file mode 100644 index 000000000..a80936938 Binary files /dev/null and b/Telegram/Resources/icons/settings/ttl@3x.png differ diff --git a/Telegram/Resources/icons/settings/user.png b/Telegram/Resources/icons/settings/user.png new file mode 100644 index 000000000..ae91dfea0 Binary files /dev/null and b/Telegram/Resources/icons/settings/user.png differ diff --git a/Telegram/Resources/icons/settings/user@2x.png b/Telegram/Resources/icons/settings/user@2x.png new file mode 100644 index 000000000..d9bbbc15e Binary files /dev/null and b/Telegram/Resources/icons/settings/user@2x.png differ diff --git a/Telegram/Resources/icons/settings/user@3x.png b/Telegram/Resources/icons/settings/user@3x.png new file mode 100644 index 000000000..39ed102de Binary files /dev/null and b/Telegram/Resources/icons/settings/user@3x.png differ diff --git a/Telegram/Resources/icons/settings/video_calls.png b/Telegram/Resources/icons/settings/video_calls.png new file mode 100644 index 000000000..85fe8d4e4 Binary files /dev/null and b/Telegram/Resources/icons/settings/video_calls.png differ diff --git a/Telegram/Resources/icons/settings/video_calls@2x.png b/Telegram/Resources/icons/settings/video_calls@2x.png new file mode 100644 index 000000000..10907b17f Binary files /dev/null and b/Telegram/Resources/icons/settings/video_calls@2x.png differ diff --git a/Telegram/Resources/icons/settings/video_calls@3x.png b/Telegram/Resources/icons/settings/video_calls@3x.png new file mode 100644 index 000000000..910862b9f Binary files /dev/null and b/Telegram/Resources/icons/settings/video_calls@3x.png differ diff --git a/Telegram/Resources/icons/statistics/mini_stats_like.png b/Telegram/Resources/icons/statistics/mini_stats_like.png new file mode 100644 index 000000000..0f21e7213 Binary files /dev/null and b/Telegram/Resources/icons/statistics/mini_stats_like.png differ diff --git a/Telegram/Resources/icons/statistics/mini_stats_like@2x.png b/Telegram/Resources/icons/statistics/mini_stats_like@2x.png new file mode 100644 index 000000000..1c72c0131 Binary files /dev/null and b/Telegram/Resources/icons/statistics/mini_stats_like@2x.png differ diff --git a/Telegram/Resources/icons/statistics/mini_stats_like@3x.png b/Telegram/Resources/icons/statistics/mini_stats_like@3x.png new file mode 100644 index 000000000..5a02e90e0 Binary files /dev/null and b/Telegram/Resources/icons/statistics/mini_stats_like@3x.png differ diff --git a/Telegram/Resources/icons/statistics/mini_stats_share.png b/Telegram/Resources/icons/statistics/mini_stats_share.png new file mode 100644 index 000000000..17772dc34 Binary files /dev/null and b/Telegram/Resources/icons/statistics/mini_stats_share.png differ diff --git a/Telegram/Resources/icons/statistics/mini_stats_share@2x.png b/Telegram/Resources/icons/statistics/mini_stats_share@2x.png new file mode 100644 index 000000000..d5785b282 Binary files /dev/null and b/Telegram/Resources/icons/statistics/mini_stats_share@2x.png differ diff --git a/Telegram/Resources/icons/statistics/mini_stats_share@3x.png b/Telegram/Resources/icons/statistics/mini_stats_share@3x.png new file mode 100644 index 000000000..8a0e1a72d Binary files /dev/null and b/Telegram/Resources/icons/statistics/mini_stats_share@3x.png differ diff --git a/Telegram/Resources/icons/stickers_add.png b/Telegram/Resources/icons/stickers_add.png deleted file mode 100644 index 39a2a9f6e..000000000 Binary files a/Telegram/Resources/icons/stickers_add.png and /dev/null differ diff --git a/Telegram/Resources/icons/stickers_add@2x.png b/Telegram/Resources/icons/stickers_add@2x.png deleted file mode 100644 index 3351e67a2..000000000 Binary files a/Telegram/Resources/icons/stickers_add@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/stickers_add@3x.png b/Telegram/Resources/icons/stickers_add@3x.png deleted file mode 100644 index 3b52aa36a..000000000 Binary files a/Telegram/Resources/icons/stickers_add@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/stickers_add_dot.png b/Telegram/Resources/icons/stickers_add_dot.png deleted file mode 100644 index 6bb2364b5..000000000 Binary files a/Telegram/Resources/icons/stickers_add_dot.png and /dev/null differ diff --git a/Telegram/Resources/icons/stickers_add_dot@2x.png b/Telegram/Resources/icons/stickers_add_dot@2x.png deleted file mode 100644 index 94a129bad..000000000 Binary files a/Telegram/Resources/icons/stickers_add_dot@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/stickers_add_dot@3x.png b/Telegram/Resources/icons/stickers_add_dot@3x.png deleted file mode 100644 index 699d72914..000000000 Binary files a/Telegram/Resources/icons/stickers_add_dot@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/stickers_add_unread.png b/Telegram/Resources/icons/stickers_add_unread.png deleted file mode 100644 index a6c899e13..000000000 Binary files a/Telegram/Resources/icons/stickers_add_unread.png and /dev/null differ diff --git a/Telegram/Resources/icons/stickers_add_unread@2x.png b/Telegram/Resources/icons/stickers_add_unread@2x.png deleted file mode 100644 index db1b65583..000000000 Binary files a/Telegram/Resources/icons/stickers_add_unread@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/stickers_add_unread@3x.png b/Telegram/Resources/icons/stickers_add_unread@3x.png deleted file mode 100644 index 07e4b40c8..000000000 Binary files a/Telegram/Resources/icons/stickers_add_unread@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/stickers_recent.png b/Telegram/Resources/icons/stickers_recent.png deleted file mode 100644 index 287d06a6b..000000000 Binary files a/Telegram/Resources/icons/stickers_recent.png and /dev/null differ diff --git a/Telegram/Resources/icons/stickers_recent@2x.png b/Telegram/Resources/icons/stickers_recent@2x.png deleted file mode 100644 index aea8a48da..000000000 Binary files a/Telegram/Resources/icons/stickers_recent@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/stickers_recent@3x.png b/Telegram/Resources/icons/stickers_recent@3x.png deleted file mode 100644 index bbf9b57e4..000000000 Binary files a/Telegram/Resources/icons/stickers_recent@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/stickers_reorder.png b/Telegram/Resources/icons/stickers_reorder.png index d49b58f44..0acfad213 100644 Binary files a/Telegram/Resources/icons/stickers_reorder.png and b/Telegram/Resources/icons/stickers_reorder.png differ diff --git a/Telegram/Resources/icons/stickers_reorder@2x.png b/Telegram/Resources/icons/stickers_reorder@2x.png index d0d660eda..be8595505 100644 Binary files a/Telegram/Resources/icons/stickers_reorder@2x.png and b/Telegram/Resources/icons/stickers_reorder@2x.png differ diff --git a/Telegram/Resources/icons/stickers_reorder@3x.png b/Telegram/Resources/icons/stickers_reorder@3x.png index 606b39c60..c0b5e9a11 100644 Binary files a/Telegram/Resources/icons/stickers_reorder@3x.png and b/Telegram/Resources/icons/stickers_reorder@3x.png differ diff --git a/Telegram/Resources/icons/stickers_search.png b/Telegram/Resources/icons/stickers_search.png deleted file mode 100644 index d451df620..000000000 Binary files a/Telegram/Resources/icons/stickers_search.png and /dev/null differ diff --git a/Telegram/Resources/icons/stickers_search@2x.png b/Telegram/Resources/icons/stickers_search@2x.png deleted file mode 100644 index 723dfc088..000000000 Binary files a/Telegram/Resources/icons/stickers_search@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/stickers_search@3x.png b/Telegram/Resources/icons/stickers_search@3x.png deleted file mode 100644 index 2571f0b6d..000000000 Binary files a/Telegram/Resources/icons/stickers_search@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/stories/boost_mini.png b/Telegram/Resources/icons/stories/boost_mini.png new file mode 100644 index 000000000..90a24d8f1 Binary files /dev/null and b/Telegram/Resources/icons/stories/boost_mini.png differ diff --git a/Telegram/Resources/icons/stories/boost_mini@2x.png b/Telegram/Resources/icons/stories/boost_mini@2x.png new file mode 100644 index 000000000..fd746a03a Binary files /dev/null and b/Telegram/Resources/icons/stories/boost_mini@2x.png differ diff --git a/Telegram/Resources/icons/stories/boost_mini@3x.png b/Telegram/Resources/icons/stories/boost_mini@3x.png new file mode 100644 index 000000000..637a5716d Binary files /dev/null and b/Telegram/Resources/icons/stories/boost_mini@3x.png differ diff --git a/Telegram/Resources/icons/stories/boosts_mini.png b/Telegram/Resources/icons/stories/boosts_mini.png new file mode 100644 index 000000000..80c667ecc Binary files /dev/null and b/Telegram/Resources/icons/stories/boosts_mini.png differ diff --git a/Telegram/Resources/icons/stories/boosts_mini@2x.png b/Telegram/Resources/icons/stories/boosts_mini@2x.png new file mode 100644 index 000000000..95a806396 Binary files /dev/null and b/Telegram/Resources/icons/stories/boosts_mini@2x.png differ diff --git a/Telegram/Resources/icons/stories/boosts_mini@3x.png b/Telegram/Resources/icons/stories/boosts_mini@3x.png new file mode 100644 index 000000000..423de8209 Binary files /dev/null and b/Telegram/Resources/icons/stories/boosts_mini@3x.png differ diff --git a/Telegram/Resources/icons/stories/next.png b/Telegram/Resources/icons/stories/next.png new file mode 100644 index 000000000..dd997b2d0 Binary files /dev/null and b/Telegram/Resources/icons/stories/next.png differ diff --git a/Telegram/Resources/icons/stories/next@2x.png b/Telegram/Resources/icons/stories/next@2x.png new file mode 100644 index 000000000..82b819e9e Binary files /dev/null and b/Telegram/Resources/icons/stories/next@2x.png differ diff --git a/Telegram/Resources/icons/stories/next@3x.png b/Telegram/Resources/icons/stories/next@3x.png new file mode 100644 index 000000000..3550c8cce Binary files /dev/null and b/Telegram/Resources/icons/stories/next@3x.png differ diff --git a/Telegram/Resources/icons/stories/stealth_25m.png b/Telegram/Resources/icons/stories/stealth_25m.png new file mode 100644 index 000000000..77fb7fdbb Binary files /dev/null and b/Telegram/Resources/icons/stories/stealth_25m.png differ diff --git a/Telegram/Resources/icons/stories/stealth_25m@2x.png b/Telegram/Resources/icons/stories/stealth_25m@2x.png new file mode 100644 index 000000000..6ec9a01f7 Binary files /dev/null and b/Telegram/Resources/icons/stories/stealth_25m@2x.png differ diff --git a/Telegram/Resources/icons/stories/stealth_25m@3x.png b/Telegram/Resources/icons/stories/stealth_25m@3x.png new file mode 100644 index 000000000..e1601cd0e Binary files /dev/null and b/Telegram/Resources/icons/stories/stealth_25m@3x.png differ diff --git a/Telegram/Resources/icons/stories/stealth_5m.png b/Telegram/Resources/icons/stories/stealth_5m.png new file mode 100644 index 000000000..51f1cdfc3 Binary files /dev/null and b/Telegram/Resources/icons/stories/stealth_5m.png differ diff --git a/Telegram/Resources/icons/stories/stealth_5m@2x.png b/Telegram/Resources/icons/stories/stealth_5m@2x.png new file mode 100644 index 000000000..dd0804fea Binary files /dev/null and b/Telegram/Resources/icons/stories/stealth_5m@2x.png differ diff --git a/Telegram/Resources/icons/stories/stealth_5m@3x.png b/Telegram/Resources/icons/stories/stealth_5m@3x.png new file mode 100644 index 000000000..c635dec9f Binary files /dev/null and b/Telegram/Resources/icons/stories/stealth_5m@3x.png differ diff --git a/Telegram/Resources/icons/stories/stealth_logo.png b/Telegram/Resources/icons/stories/stealth_logo.png new file mode 100644 index 000000000..10a249195 Binary files /dev/null and b/Telegram/Resources/icons/stories/stealth_logo.png differ diff --git a/Telegram/Resources/icons/stories/stealth_logo@2x.png b/Telegram/Resources/icons/stories/stealth_logo@2x.png new file mode 100644 index 000000000..4300b18f1 Binary files /dev/null and b/Telegram/Resources/icons/stories/stealth_logo@2x.png differ diff --git a/Telegram/Resources/icons/stories/stealth_logo@3x.png b/Telegram/Resources/icons/stories/stealth_logo@3x.png new file mode 100644 index 000000000..161618d20 Binary files /dev/null and b/Telegram/Resources/icons/stories/stealth_logo@3x.png differ diff --git a/Telegram/Resources/icons/title_back.png b/Telegram/Resources/icons/title_back.png index 0cc9212f4..eec32bec0 100644 Binary files a/Telegram/Resources/icons/title_back.png and b/Telegram/Resources/icons/title_back.png differ diff --git a/Telegram/Resources/icons/title_back@2x.png b/Telegram/Resources/icons/title_back@2x.png index 71efbcf01..45a581d33 100644 Binary files a/Telegram/Resources/icons/title_back@2x.png and b/Telegram/Resources/icons/title_back@2x.png differ diff --git a/Telegram/Resources/icons/title_back@3x.png b/Telegram/Resources/icons/title_back@3x.png index 0f1a497df..5d366221a 100644 Binary files a/Telegram/Resources/icons/title_back@3x.png and b/Telegram/Resources/icons/title_back@3x.png differ diff --git a/Telegram/Resources/icons/title_search.png b/Telegram/Resources/icons/title_search.png index b9184b6ba..ce1325fe3 100644 Binary files a/Telegram/Resources/icons/title_search.png and b/Telegram/Resources/icons/title_search.png differ diff --git a/Telegram/Resources/icons/title_search@2x.png b/Telegram/Resources/icons/title_search@2x.png index 12e04f843..919ec048e 100644 Binary files a/Telegram/Resources/icons/title_search@2x.png and b/Telegram/Resources/icons/title_search@2x.png differ diff --git a/Telegram/Resources/icons/title_search@3x.png b/Telegram/Resources/icons/title_search@3x.png index 0afeefd81..3fb7dc979 100644 Binary files a/Telegram/Resources/icons/title_search@3x.png and b/Telegram/Resources/icons/title_search@3x.png differ diff --git a/Telegram/Resources/icons/top_bar_call.png b/Telegram/Resources/icons/top_bar_call.png index 795149269..0e0207b1e 100644 Binary files a/Telegram/Resources/icons/top_bar_call.png and b/Telegram/Resources/icons/top_bar_call.png differ diff --git a/Telegram/Resources/icons/top_bar_call@2x.png b/Telegram/Resources/icons/top_bar_call@2x.png index f15093923..bdc074cfc 100644 Binary files a/Telegram/Resources/icons/top_bar_call@2x.png and b/Telegram/Resources/icons/top_bar_call@2x.png differ diff --git a/Telegram/Resources/icons/top_bar_call@3x.png b/Telegram/Resources/icons/top_bar_call@3x.png index 4fc5b0d5c..c7ef9a3b0 100644 Binary files a/Telegram/Resources/icons/top_bar_call@3x.png and b/Telegram/Resources/icons/top_bar_call@3x.png differ diff --git a/Telegram/Resources/icons/top_bar_group_call.png b/Telegram/Resources/icons/top_bar_group_call.png index b084f255b..9c58f5018 100644 Binary files a/Telegram/Resources/icons/top_bar_group_call.png and b/Telegram/Resources/icons/top_bar_group_call.png differ diff --git a/Telegram/Resources/icons/top_bar_group_call@2x.png b/Telegram/Resources/icons/top_bar_group_call@2x.png index 12534f224..275da87ff 100644 Binary files a/Telegram/Resources/icons/top_bar_group_call@2x.png and b/Telegram/Resources/icons/top_bar_group_call@2x.png differ diff --git a/Telegram/Resources/icons/top_bar_group_call@3x.png b/Telegram/Resources/icons/top_bar_group_call@3x.png index 08df3a7fa..a7e243ba1 100644 Binary files a/Telegram/Resources/icons/top_bar_group_call@3x.png and b/Telegram/Resources/icons/top_bar_group_call@3x.png differ diff --git a/Telegram/Resources/icons/top_bar_profile.png b/Telegram/Resources/icons/top_bar_profile.png index 0d28dee1e..61f61ff2b 100644 Binary files a/Telegram/Resources/icons/top_bar_profile.png and b/Telegram/Resources/icons/top_bar_profile.png differ diff --git a/Telegram/Resources/icons/top_bar_profile@2x.png b/Telegram/Resources/icons/top_bar_profile@2x.png index 7bfdc3bcb..69654802b 100644 Binary files a/Telegram/Resources/icons/top_bar_profile@2x.png and b/Telegram/Resources/icons/top_bar_profile@2x.png differ diff --git a/Telegram/Resources/icons/top_bar_profile@3x.png b/Telegram/Resources/icons/top_bar_profile@3x.png index 85c780e6d..e5a9eb106 100644 Binary files a/Telegram/Resources/icons/top_bar_profile@3x.png and b/Telegram/Resources/icons/top_bar_profile@3x.png differ diff --git a/Telegram/Resources/icons/top_bar_search.png b/Telegram/Resources/icons/top_bar_search.png index cd1ac34e6..8ebbca44d 100644 Binary files a/Telegram/Resources/icons/top_bar_search.png and b/Telegram/Resources/icons/top_bar_search.png differ diff --git a/Telegram/Resources/icons/top_bar_search@2x.png b/Telegram/Resources/icons/top_bar_search@2x.png index c1acb1ab3..a5c566be6 100644 Binary files a/Telegram/Resources/icons/top_bar_search@2x.png and b/Telegram/Resources/icons/top_bar_search@2x.png differ diff --git a/Telegram/Resources/icons/top_bar_search@3x.png b/Telegram/Resources/icons/top_bar_search@3x.png index 34292c172..998ae3c7e 100644 Binary files a/Telegram/Resources/icons/top_bar_search@3x.png and b/Telegram/Resources/icons/top_bar_search@3x.png differ diff --git a/Telegram/Resources/icons/tray_monochrome.svg b/Telegram/Resources/icons/tray_monochrome.svg new file mode 100644 index 000000000..da313739e --- /dev/null +++ b/Telegram/Resources/icons/tray_monochrome.svg @@ -0,0 +1,127 @@ + + + + Kotato Logo + + + + + + + + + + + + + + + + + + + + + + + + Kotato Logo + + + + diff --git a/Telegram/Resources/icons/voice_lock/audio_once_bg.png b/Telegram/Resources/icons/voice_lock/audio_once_bg.png new file mode 100644 index 000000000..62778676c Binary files /dev/null and b/Telegram/Resources/icons/voice_lock/audio_once_bg.png differ diff --git a/Telegram/Resources/icons/voice_lock/audio_once_bg@2x.png b/Telegram/Resources/icons/voice_lock/audio_once_bg@2x.png new file mode 100644 index 000000000..225d6af3b Binary files /dev/null and b/Telegram/Resources/icons/voice_lock/audio_once_bg@2x.png differ diff --git a/Telegram/Resources/icons/voice_lock/audio_once_bg@3x.png b/Telegram/Resources/icons/voice_lock/audio_once_bg@3x.png new file mode 100644 index 000000000..1d82b2d6e Binary files /dev/null and b/Telegram/Resources/icons/voice_lock/audio_once_bg@3x.png differ diff --git a/Telegram/Resources/icons/voice_lock/audio_once_number.png b/Telegram/Resources/icons/voice_lock/audio_once_number.png new file mode 100644 index 000000000..61e22f105 Binary files /dev/null and b/Telegram/Resources/icons/voice_lock/audio_once_number.png differ diff --git a/Telegram/Resources/icons/voice_lock/audio_once_number@2x.png b/Telegram/Resources/icons/voice_lock/audio_once_number@2x.png new file mode 100644 index 000000000..15047cb48 Binary files /dev/null and b/Telegram/Resources/icons/voice_lock/audio_once_number@2x.png differ diff --git a/Telegram/Resources/icons/voice_lock/audio_once_number@3x.png b/Telegram/Resources/icons/voice_lock/audio_once_number@3x.png new file mode 100644 index 000000000..6e39511e1 Binary files /dev/null and b/Telegram/Resources/icons/voice_lock/audio_once_number@3x.png differ diff --git a/Telegram/Resources/icons/voice_lock/input_mic_s.png b/Telegram/Resources/icons/voice_lock/input_mic_s.png new file mode 100644 index 000000000..86c1146a5 Binary files /dev/null and b/Telegram/Resources/icons/voice_lock/input_mic_s.png differ diff --git a/Telegram/Resources/icons/voice_lock/input_mic_s@2x.png b/Telegram/Resources/icons/voice_lock/input_mic_s@2x.png new file mode 100644 index 000000000..e70fd6a66 Binary files /dev/null and b/Telegram/Resources/icons/voice_lock/input_mic_s@2x.png differ diff --git a/Telegram/Resources/icons/voice_lock/input_mic_s@3x.png b/Telegram/Resources/icons/voice_lock/input_mic_s@3x.png new file mode 100644 index 000000000..d7a4ad981 Binary files /dev/null and b/Telegram/Resources/icons/voice_lock/input_mic_s@3x.png differ diff --git a/Telegram/Resources/icons/voice_lock/recorded_delete.png b/Telegram/Resources/icons/voice_lock/recorded_delete.png new file mode 100644 index 000000000..f204f8f22 Binary files /dev/null and b/Telegram/Resources/icons/voice_lock/recorded_delete.png differ diff --git a/Telegram/Resources/icons/voice_lock/recorded_delete@2x.png b/Telegram/Resources/icons/voice_lock/recorded_delete@2x.png new file mode 100644 index 000000000..8bebe1a61 Binary files /dev/null and b/Telegram/Resources/icons/voice_lock/recorded_delete@2x.png differ diff --git a/Telegram/Resources/icons/voice_lock/recorded_delete@3x.png b/Telegram/Resources/icons/voice_lock/recorded_delete@3x.png new file mode 100644 index 000000000..db0067c53 Binary files /dev/null and b/Telegram/Resources/icons/voice_lock/recorded_delete@3x.png differ diff --git a/Telegram/Resources/icons/voice_lock/voice_arrow.png b/Telegram/Resources/icons/voice_lock/voice_arrow.png index e42af30b0..5e5286ac9 100644 Binary files a/Telegram/Resources/icons/voice_lock/voice_arrow.png and b/Telegram/Resources/icons/voice_lock/voice_arrow.png differ diff --git a/Telegram/Resources/icons/voice_lock/voice_arrow@2x.png b/Telegram/Resources/icons/voice_lock/voice_arrow@2x.png index d8196558a..951a16fef 100644 Binary files a/Telegram/Resources/icons/voice_lock/voice_arrow@2x.png and b/Telegram/Resources/icons/voice_lock/voice_arrow@2x.png differ diff --git a/Telegram/Resources/icons/voice_lock/voice_arrow@3x.png b/Telegram/Resources/icons/voice_lock/voice_arrow@3x.png index 83b3cfb88..ee8ad9b29 100644 Binary files a/Telegram/Resources/icons/voice_lock/voice_arrow@3x.png and b/Telegram/Resources/icons/voice_lock/voice_arrow@3x.png differ diff --git a/Telegram/Resources/icons/win_quit.png b/Telegram/Resources/icons/win_quit.png new file mode 100644 index 000000000..a823f133e Binary files /dev/null and b/Telegram/Resources/icons/win_quit.png differ diff --git a/Telegram/Resources/icons/win_quit@2x.png b/Telegram/Resources/icons/win_quit@2x.png new file mode 100644 index 000000000..569097eda Binary files /dev/null and b/Telegram/Resources/icons/win_quit@2x.png differ diff --git a/Telegram/Resources/icons/win_quit@3x.png b/Telegram/Resources/icons/win_quit@3x.png new file mode 100644 index 000000000..c11e92bb2 Binary files /dev/null and b/Telegram/Resources/icons/win_quit@3x.png differ diff --git a/Telegram/Resources/iv_html/highlight.9.12.0.css b/Telegram/Resources/iv_html/highlight.9.12.0.css new file mode 100644 index 000000000..7d8be18d0 --- /dev/null +++ b/Telegram/Resources/iv_html/highlight.9.12.0.css @@ -0,0 +1 @@ +.hljs{display:block;overflow-x:auto;padding:0.5em;background:#F0F0F0}.hljs,.hljs-subst{color:#444}.hljs-comment{color:#888888}.hljs-keyword,.hljs-attribute,.hljs-selector-tag,.hljs-meta-keyword,.hljs-doctag,.hljs-name{font-weight:bold}.hljs-type,.hljs-string,.hljs-number,.hljs-selector-id,.hljs-selector-class,.hljs-quote,.hljs-template-tag,.hljs-deletion{color:#880000}.hljs-title,.hljs-section{color:#880000;font-weight:bold}.hljs-regexp,.hljs-symbol,.hljs-variable,.hljs-template-variable,.hljs-link,.hljs-selector-attr,.hljs-selector-pseudo{color:#BC6060}.hljs-literal{color:#78A960}.hljs-built_in,.hljs-bullet,.hljs-code,.hljs-addition{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta-string{color:#4d99bf}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold} \ No newline at end of file diff --git a/Telegram/Resources/iv_html/highlight.9.12.0.js b/Telegram/Resources/iv_html/highlight.9.12.0.js new file mode 100644 index 000000000..f30a334c9 --- /dev/null +++ b/Telegram/Resources/iv_html/highlight.9.12.0.js @@ -0,0 +1,3 @@ +/*! highlight.js v9.12.0 | BSD3 License | git.io/hljslicense */ +!function(e){var t="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):t&&(t.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return t.hljs}))}(function(e){function t(e){return e.replace(/&/g,"&").replace(//g,">")}function r(e){return e.nodeName.toLowerCase()}function a(e,t){var r=e&&e.exec(t);return r&&0===r.index}function n(e){return E.test(e)}function i(e){var t,r,a,i,s=e.className+" ";if(s+=e.parentNode?e.parentNode.className:"",r=M.exec(s))return w(r[1])?r[1]:"no-highlight";for(s=s.split(/\s+/),t=0,a=s.length;a>t;t++)if(i=s[t],n(i)||w(i))return i}function s(e){var t,r={},a=Array.prototype.slice.call(arguments,1);for(t in e)r[t]=e[t];return a.forEach(function(e){for(t in e)r[t]=e[t]}),r}function c(e){var t=[];return function a(e,n){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?n+=i.nodeValue.length:1===i.nodeType&&(t.push({event:"start",offset:n,node:i}),n=a(i,n),r(i).match(/br|hr|img|input/)||t.push({event:"stop",offset:n,node:i}));return n}(e,0),t}function o(e,a,n){function i(){return e.length&&a.length?e[0].offset!==a[0].offset?e[0].offset"}function c(e){u+=""}function o(e){("start"===e.event?s:c)(e.node)}for(var l=0,u="",d=[];e.length||a.length;){var b=i();if(u+=t(n.substring(l,b[0].offset)),l=b[0].offset,b===e){d.reverse().forEach(c);do o(b.splice(0,1)[0]),b=i();while(b===e&&b.length&&b[0].offset===l);d.reverse().forEach(s)}else"start"===b[0].event?d.push(b[0].node):d.pop(),o(b.splice(0,1)[0])}return u+t(n.substr(l))}function l(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(t){return s(e,{v:null},t)})),e.cached_variants||e.eW&&[s(e)]||[e]}function u(e){function t(e){return e&&e.source||e}function r(r,a){return new RegExp(t(r),"m"+(e.cI?"i":"")+(a?"g":""))}function a(n,i){if(!n.compiled){if(n.compiled=!0,n.k=n.k||n.bK,n.k){var s={},c=function(t,r){e.cI&&(r=r.toLowerCase()),r.split(" ").forEach(function(e){var r=e.split("|");s[r[0]]=[t,r[1]?Number(r[1]):1]})};"string"==typeof n.k?c("keyword",n.k):k(n.k).forEach(function(e){c(e,n.k[e])}),n.k=s}n.lR=r(n.l||/\w+/,!0),i&&(n.bK&&(n.b="\\b("+n.bK.split(" ").join("|")+")\\b"),n.b||(n.b=/\B|\b/),n.bR=r(n.b),n.e||n.eW||(n.e=/\B|\b/),n.e&&(n.eR=r(n.e)),n.tE=t(n.e)||"",n.eW&&i.tE&&(n.tE+=(n.e?"|":"")+i.tE)),n.i&&(n.iR=r(n.i)),null==n.r&&(n.r=1),n.c||(n.c=[]),n.c=Array.prototype.concat.apply([],n.c.map(function(e){return l("self"===e?n:e)})),n.c.forEach(function(e){a(e,n)}),n.starts&&a(n.starts,i);var o=n.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([n.tE,n.i]).map(t).filter(Boolean);n.t=o.length?r(o.join("|"),!0):{exec:function(){return null}}}}a(e)}function d(e,r,n,i){function s(e,t){var r,n;for(r=0,n=t.c.length;n>r;r++)if(a(t.c[r].bR,e))return t.c[r]}function c(e,t){if(a(e.eR,t)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?c(e.parent,t):void 0}function o(e,t){return!n&&a(t.iR,e)}function l(e,t){var r=v.cI?t[0].toLowerCase():t[0];return e.k.hasOwnProperty(r)&&e.k[r]}function p(e,t,r,a){var n=a?"":L.classPrefix,i='',i+t+s}function m(){var e,r,a,n;if(!N.k)return t(E);for(n="",r=0,N.lR.lastIndex=0,a=N.lR.exec(E);a;)n+=t(E.substring(r,a.index)),e=l(N,a),e?(M+=e[1],n+=p(e[0],t(a[0]))):n+=t(a[0]),r=N.lR.lastIndex,a=N.lR.exec(E);return n+t(E.substr(r))}function f(){var e="string"==typeof N.sL;if(e&&!x[N.sL])return t(E);var r=e?d(N.sL,E,!0,k[N.sL]):b(E,N.sL.length?N.sL:void 0);return N.r>0&&(M+=r.r),e&&(k[N.sL]=r.top),p(r.language,r.value,!1,!0)}function g(){C+=null!=N.sL?f():m(),E=""}function _(e){C+=e.cN?p(e.cN,"",!0):"",N=Object.create(e,{parent:{value:N}})}function h(e,t){if(E+=e,null==t)return g(),0;var r=s(t,N);if(r)return r.skip?E+=t:(r.eB&&(E+=t),g(),r.rB||r.eB||(E=t)),_(r,t),r.rB?0:t.length;var a=c(N,t);if(a){var n=N;n.skip?E+=t:(n.rE||n.eE||(E+=t),g(),n.eE&&(E=t));do N.cN&&(C+=R),N.skip||(M+=N.r),N=N.parent;while(N!==a.parent);return a.starts&&_(a.starts,""),n.rE?0:t.length}if(o(t,N))throw new Error('Illegal lexeme "'+t+'" for mode "'+(N.cN||"")+'"');return E+=t,t.length||1}var v=w(e);if(!v)throw new Error('Unknown language: "'+e+'"');u(v);var y,N=i||v,k={},C="";for(y=N;y!==v;y=y.parent)y.cN&&(C=p(y.cN,"",!0)+C);var E="",M=0;try{for(var B,S,$=0;;){if(N.t.lastIndex=$,B=N.t.exec(r),!B)break;S=h(r.substring($,B.index),B[0]),$=B.index+S}for(h(r.substr($)),y=N;y.parent;y=y.parent)y.cN&&(C+=R);return{r:M,value:C,language:e,top:N}}catch(A){if(A.message&&-1!==A.message.indexOf("Illegal"))return{r:0,value:t(r)};throw A}}function b(e,r){r=r||L.languages||k(x);var a={r:0,value:t(e)},n=a;return r.filter(w).forEach(function(t){var r=d(t,e,!1);r.language=t,r.r>n.r&&(n=r),r.r>a.r&&(n=a,a=r)}),n.language&&(a.second_best=n),a}function p(e){return L.tabReplace||L.useBR?e.replace(B,function(e,t){return L.useBR&&"\n"===e?"
":L.tabReplace?t.replace(/\t/g,L.tabReplace):""}):e}function m(e,t,r){var a=t?C[t]:r,n=[e.trim()];return e.match(/\bhljs\b/)||n.push("hljs"),-1===e.indexOf(a)&&n.push(a),n.join(" ").trim()}function f(e){var t,r,a,s,l,u=i(e);n(u)||(L.useBR?(t=document.createElementNS("http://www.w3.org/1999/xhtml","div"),t.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):t=e,l=t.textContent,a=u?d(u,l,!0):b(l),r=c(t),r.length&&(s=document.createElementNS("http://www.w3.org/1999/xhtml","div"),s.innerHTML=a.value,a.value=o(r,c(s),l)),a.value=p(a.value),e.innerHTML=a.value,e.className=m(e.className,u,a.language),e.result={language:a.language,re:a.r},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.r}))}function g(e){L=s(L,e)}function _(){if(!_.called){_.called=!0;var e=document.querySelectorAll("pre code");N.forEach.call(e,f)}}function h(){addEventListener("DOMContentLoaded",_,!1),addEventListener("load",_,!1)}function v(t,r){var a=x[t]=r(e);a.aliases&&a.aliases.forEach(function(e){C[e]=t})}function y(){return k(x)}function w(e){return e=(e||"").toLowerCase(),x[e]||x[C[e]]}var N=[],k=Object.keys,x={},C={},E=/^(no-?highlight|plain|text)$/i,M=/\blang(?:uage)?-([\w-]+)\b/i,B=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,R="
",L={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=d,e.highlightAuto=b,e.fixMarkup=p,e.highlightBlock=f,e.configure=g,e.initHighlighting=_,e.initHighlightingOnLoad=h,e.registerLanguage=v,e.listLanguages=y,e.getLanguage=w,e.inherit=s,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.C=function(t,r,a){var n=e.inherit({cN:"comment",b:t,e:r,c:[]},a||{});return n.c.push(e.PWM),n.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),n},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e.registerLanguage("apache",function(e){var t={cN:"number",b:"[\\$%]\\d+"};return{aliases:["apacheconf"],cI:!0,c:[e.HCM,{cN:"section",b:""},{cN:"attribute",b:/\w+/,r:0,k:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"meta",b:"\\s\\[",e:"\\]$"},{cN:"variable",b:"[\\$%]\\{",e:"\\}",c:["self",t]},t,e.QSM]}}],i:/\S/}}),e.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},r={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/\b-?[a-z\._]+\b/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,r,a,t]}}),e.registerLanguage("coffeescript",function(e){var t={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super yield import export from as default await then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",built_in:"npm require console print module global window document"},r="[A-Za-z$_][0-9A-Za-z$_]*",a={cN:"subst",b:/#\{/,e:/}/,k:t},n=[e.BNM,e.inherit(e.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/"""/,e:/"""/,c:[e.BE,a]},{b:/"/,e:/"/,c:[e.BE,a]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[a,e.HCM]},{b:"//[gim]*",r:0},{b:/\/(?![ *])(\\\/|.)*?\/[gim]*(?=\W|$)/}]},{b:"@"+r},{sL:"javascript",eB:!0,eE:!0,v:[{b:"```",e:"```"},{b:"`",e:"`"}]}];a.c=n;var i=e.inherit(e.TM,{b:r}),s="(\\(.*\\))?\\s*\\B[-=]>",c={cN:"params",b:"\\([^\\(]",rB:!0,c:[{b:/\(/,e:/\)/,k:t,c:["self"].concat(n)}]};return{aliases:["coffee","cson","iced"],k:t,i:/\/\*/,c:n.concat([e.C("###","###"),e.HCM,{cN:"function",b:"^\\s*"+r+"\\s*=\\s*"+s,e:"[-=]>",rB:!0,c:[i,c]},{b:/[:\(,=]\s*/,r:0,c:[{cN:"function",b:s,e:"[-=]>",rB:!0,c:[c]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:!0,i:/[:="\[\]]/,c:[i]},i]},{b:r+":",e:":",rB:!0,rE:!0,r:0}])}}),e.registerLanguage("cpp",function(e){var t={cN:"keyword",b:"\\b[a-z\\d_]*_t\\b"},r={cN:"string",v:[{b:'(u8?|U)?L?"',e:'"',i:"\\n",c:[e.BE]},{b:'(u8?|U)?R"',e:'"',c:[e.BE]},{b:"'\\\\?.",e:"'",i:"."}]},a={cN:"number",v:[{b:"\\b(0b[01']+)"},{b:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{b:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],r:0},n={cN:"meta",b:/#\s*[a-z]+\b/,e:/$/,k:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},c:[{b:/\\\n/,r:0},e.inherit(r,{cN:"meta-string"}),{cN:"meta-string",b:/<[^\n>]*>/,e:/$/,i:"\\n"},e.CLCM,e.CBCM]},i=e.IR+"\\s*\\(",s={keyword:"int float while private char catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignof constexpr decltype noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and or not",built_in:"std string cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr",literal:"true false nullptr NULL"},c=[t,e.CLCM,e.CBCM,a,r];return{aliases:["c","cc","h","c++","h++","hpp"],k:s,i:"",k:s,c:["self",t]},{b:e.IR+"::",k:s},{v:[{b:/=/,e:/;/},{b:/\(/,e:/\)/},{bK:"new throw return else",e:/;/}],k:s,c:c.concat([{b:/\(/,e:/\)/,k:s,c:c.concat(["self"]),r:0}]),r:0},{cN:"function",b:"("+e.IR+"[\\*&\\s]+)+"+i,rB:!0,e:/[{;=]/,eE:!0,k:s,i:/[^\w\s\*&]/,c:[{b:i,rB:!0,c:[e.TM],r:0},{cN:"params",b:/\(/,e:/\)/,k:s,r:0,c:[e.CLCM,e.CBCM,r,a,t]},e.CLCM,e.CBCM,n]},{cN:"class",bK:"class struct",e:/[{;:]/,c:[{b://,c:["self"]},e.TM]}]),exports:{preprocessor:n,strings:r,k:s}}}),e.registerLanguage("cs",function(e){var t={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long nameof object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let on orderby partial remove select set value var where yield",literal:"null false true"},r={cN:"string",b:'@"',e:'"',c:[{b:'""'}]},a=e.inherit(r,{i:/\n/}),n={cN:"subst",b:"{",e:"}",k:t},i=e.inherit(n,{i:/\n/}),s={cN:"string",b:/\$"/,e:'"',i:/\n/,c:[{b:"{{"},{b:"}}"},e.BE,i]},c={cN:"string",b:/\$@"/,e:'"',c:[{b:"{{"},{b:"}}"},{b:'""'},n]},o=e.inherit(c,{i:/\n/,c:[{b:"{{"},{b:"}}"},{b:'""'},i]});n.c=[c,s,r,e.ASM,e.QSM,e.CNM,e.CBCM],i.c=[o,s,a,e.ASM,e.QSM,e.CNM,e.inherit(e.CBCM,{i:/\n/})];var l={v:[c,s,r,e.ASM,e.QSM]},u=e.IR+"(<"+e.IR+"(\\s*,\\s*"+e.IR+")*>)?(\\[\\])?";return{aliases:["csharp"],k:t,i:/::/,c:[e.C("///","$",{rB:!0,c:[{cN:"doctag",v:[{b:"///",r:0},{b:""},{b:""}]}]}),e.CLCM,e.CBCM,{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},l,e.CNM,{bK:"class interface",e:/[{;=]/,i:/[^\s:]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:"namespace",e:/[{;=]/,i:/[^\s:]/,c:[e.inherit(e.TM,{b:"[a-zA-Z](\\.?\\w)*"}),e.CLCM,e.CBCM]},{cN:"meta",b:"^\\s*\\[",eB:!0,e:"\\]",eE:!0,c:[{cN:"meta-string",b:/"/,e:/"/}]},{bK:"new return throw await else",r:0},{cN:"function",b:"("+u+"\\s+)+"+e.IR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:t,c:[{b:e.IR+"\\s*\\(",rB:!0,c:[e.TM],r:0},{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,r:0,c:[l,e.CNM,e.CBCM]},e.CLCM,e.CBCM]}]}}),e.registerLanguage("css",function(e){var t="[a-zA-Z-][a-zA-Z0-9_-]*",r={b:/[A-Z\_\.\-]+\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\w-]+\(/,rB:!0,c:[{cN:"built_in",b:/[\w-]+/},{b:/\(/,e:/\)/,c:[e.ASM,e.QSM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"number",b:"#[0-9A-Fa-f]+"},{cN:"meta",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,{cN:"selector-id",b:/#[A-Za-z0-9_-]+/},{cN:"selector-class",b:/\.[A-Za-z0-9_-]+/},{cN:"selector-attr",b:/\[/,e:/\]/,i:"$"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{b:"@",e:"[{;]",i:/:/,c:[{cN:"keyword",b:/\w+/},{b:/\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:"selector-tag",b:t,r:0},{b:"{",e:"}",i:/\S/,c:[e.CBCM,r]}]}}),e.registerLanguage("diff",function(e){return{aliases:["patch"],c:[{cN:"meta",r:10,v:[{b:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"comment",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\-{3}/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+{3}/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"addition",b:"^\\!",e:"$"}]}}),e.registerLanguage("http",function(e){var t="HTTP/[0-9\\.]+";return{aliases:["https"],i:"\\S",c:[{b:"^"+t,e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{b:"^[A-Z]+ (.*?) "+t+"$",rB:!0,e:"$",c:[{cN:"string",b:" ",e:" ",eB:!0,eE:!0},{b:t},{cN:"keyword",b:"[A-Z]+"}]},{cN:"attribute",b:"^\\w",e:": ",eE:!0,i:"\\n|\\s|=",starts:{e:"$",r:0}},{b:"\\n\\n",starts:{sL:[],eW:!0}}]}}),e.registerLanguage("ini",function(e){var t={cN:"string",c:[e.BE],v:[{b:"'''",e:"'''",r:10},{b:'"""',e:'"""',r:10},{b:'"',e:'"'},{b:"'",e:"'"}]};return{aliases:["toml"],cI:!0,i:/\S/,c:[e.C(";","$"),e.HCM,{cN:"section",b:/^\s*\[+/,e:/\]+/},{b:/^[a-z0-9\[\]_-]+\s*=\s*/,e:"$",rB:!0,c:[{cN:"attr",b:/[a-z0-9\[\]_-]+/},{b:/=/,eW:!0,r:0,c:[{cN:"literal",b:/\bon|off|true|false|yes|no\b/},{cN:"variable",v:[{b:/\$[\w\d"][\w\d_]*/},{b:/\$\{(.*?)}/}]},t,{cN:"number",b:/([\+\-]+)?[\d]+_[\d_]+/},e.NM]}]}]}}),e.registerLanguage("java",function(e){var t="[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",r=t+"(<"+t+"(\\s*,\\s*"+t+")*>)?",a="false synchronized int abstract float private char boolean static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",n="\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",i={cN:"number",b:n,r:0};return{aliases:["jsp"],k:a,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"new throw return else",r:0},{cN:"function",b:"("+r+"\\s+)+"+e.UIR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:a,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,k:a,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},i,{cN:"meta",b:"@[A-Za-z]+"}]}}),e.registerLanguage("javascript",function(e){var t="[A-Za-z$_][0-9A-Za-z$_]*",r={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},a={cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},n={cN:"subst",b:"\\$\\{",e:"\\}",k:r,c:[]},i={cN:"string",b:"`",e:"`",c:[e.BE,n]};n.c=[e.ASM,e.QSM,i,a,e.RM];var s=n.c.concat([e.CBCM,e.CLCM]);return{aliases:["js","jsx"],k:r,c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,i,e.CLCM,e.CBCM,a,{b:/[{,]\s*/,r:0,c:[{b:t+"\\s*:",rB:!0,r:0,c:[{cN:"attr",b:t,r:0}]}]},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+t+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:t},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:r,c:s}]}]},{b://,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:[{b:/<\w+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:t}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:s}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}}),e.registerLanguage("json",function(e){var t={literal:"true false null"},r=[e.QSM,e.CNM],a={e:",",eW:!0,eE:!0,c:r,k:t},n={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(a,{b:/:/})],i:"\\S"},i={b:"\\[",e:"\\]",c:[e.inherit(a)],i:"\\S"};return r.splice(r.length,0,n,i),{c:r,k:t,i:"\\S"}}),e.registerLanguage("makefile",function(e){var t={cN:"variable",v:[{b:"\\$\\("+e.UIR+"\\)",c:[e.BE]},{b:/\$[@%`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},e.C("",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0}]},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[r],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[r],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"meta",v:[{b:/<\?xml/,e:/\?>/,r:10},{b:/<\?\w+/,e:/\?>/}]},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},r]}]}}),e.registerLanguage("markdown",function(e){return{aliases:["md","mkdown","mkd"],c:[{cN:"section",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"quote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"^```w*s*$",e:"^```s*$"},{b:"`.+?`"},{b:"^( {4}| )",e:"$",r:0}]},{b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].*?[\\)\\]]",rB:!0,c:[{cN:"string",b:"\\[",e:"\\]",eB:!0,rE:!0,r:0},{cN:"link",b:"\\]\\(",e:"\\)",eB:!0,eE:!0},{cN:"symbol",b:"\\]\\[",e:"\\]",eB:!0,eE:!0}],r:10},{b:/^\[[^\n]+\]:/,rB:!0,c:[{cN:"symbol",b:/\[/,e:/\]/,eB:!0,eE:!0},{cN:"link",b:/:\s*/,e:/$/,eB:!0}]}]}}),e.registerLanguage("nginx",function(e){var t={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+e.UIR}]},r={eW:!0,l:"[a-z/_]+",k:{literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[e.HCM,{cN:"string",c:[e.BE,t],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{b:"([a-z]+):/",e:"\\s",eW:!0,eE:!0,c:[t]},{cN:"regexp",c:[e.BE,t],v:[{b:"\\s\\^",e:"\\s|{|;",rE:!0},{b:"~\\*?\\s+",e:"\\s|{|;",rE:!0},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},t]};return{aliases:["nginxconf"],c:[e.HCM,{b:e.UIR+"\\s+{",rB:!0,e:"{",c:[{cN:"section",b:e.UIR}],r:0},{b:e.UIR+"\\s",e:";|{",rB:!0,c:[{cN:"attribute",b:e.UIR,starts:r}],r:0}],i:"[^\\s\\}]"}}),e.registerLanguage("objectivec",function(e){var t={cN:"built_in",b:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},r={keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},a=/[a-zA-Z@][a-zA-Z0-9_]*/,n="@interface @class @protocol @implementation";return{aliases:["mm","objc","obj-c"],k:r,l:a,i:""}]}]},{cN:"class",b:"("+n.split(" ").join("|")+")\\b",e:"({|$)",eE:!0,k:n,l:a,c:[e.UTM]},{b:"\\."+e.UIR,r:0}]}}),e.registerLanguage("perl",function(e){var t="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when",r={cN:"subst",b:"[$@]\\{",e:"\\}",k:t},a={b:"->{",e:"}"},n={v:[{b:/\$\d/},{b:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{b:/[\$%@][^\s\w{]/,r:0}]},i=[e.BE,r,n],s=[n,e.HCM,e.C("^\\=\\w","\\=cut",{eW:!0}),a,{cN:"string",c:i,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[e.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[e.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[e.HCM,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],r:0}]},{cN:"function",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",eE:!0,r:5,c:[e.TM]},{b:"-\\w\\b",r:0},{b:"^__DATA__$",e:"^__END__$",sL:"mojolicious",c:[{b:"^@@.*",e:"$",cN:"comment"}]}];return r.c=s,a.c=s,{aliases:["pl","pm"],l:/[\w\.]+/,k:t,c:s}}),e.registerLanguage("php",function(e){var t={b:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},r={cN:"meta",b:/<\?(php)?|\?>/},a={cN:"string",c:[e.BE,r],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},n={v:[e.BNM,e.CNM]};return{aliases:["php3","php4","php5","php6"],cI:!0,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[e.HCM,e.C("//","$",{c:[r]}),e.C("/\\*","\\*/",{c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.C("__halt_compiler.+?;",!1,{eW:!0,k:"__halt_compiler",l:e.UIR}),{cN:"string",b:/<<<['"]?\w+['"]?$/,e:/^\w+;?$/,c:[e.BE,{cN:"subst",v:[{b:/\$\w+/},{b:/\{\$/,e:/\}/}]}]},r,{cN:"keyword",b:/\$this\b/},t,{b:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{cN:"function",bK:"function",e:/[;{]/,eE:!0,i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",t,e.CBCM,a,n]}]},{cN:"class",bK:"class interface",e:"{",eE:!0,i:/[:\(\$"]/,c:[{bK:"extends implements"},e.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[e.UTM]},{bK:"use",e:";",c:[e.UTM]},{b:"=>"},a,n]}}),e.registerLanguage("python",function(e){var t={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},r={cN:"meta",b:/^(>>>|\.\.\.) /},a={cN:"subst",b:/\{/,e:/\}/,k:t,i:/#/},n={cN:"string",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[r],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[r],r:10},{b:/(fr|rf|f)'''/,e:/'''/,c:[r,a]},{b:/(fr|rf|f)"""/,e:/"""/,c:[r,a]},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},{b:/(fr|rf|f)'/,e:/'/,c:[a]},{b:/(fr|rf|f)"/,e:/"/,c:[a]},e.ASM,e.QSM]},i={cN:"number",r:0,v:[{b:e.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:e.CNR+"[lLjJ]?"}]},s={cN:"params",b:/\(/,e:/\)/,c:["self",r,i,n]};return a.c=[n,i,r],{aliases:["py","gyp"],k:t,i:/(<\/|->|\?)|=>/,c:[r,i,n,e.HCM,{v:[{cN:"function",bK:"def"},{cN:"class",bK:"class"}],e:/:/,i:/[${=;\n,]/,c:[e.UTM,s,{b:/->/,eW:!0,k:"None"}]},{cN:"meta",b:/^[\t ]*@/,e:/$/},{b:/\b(print|exec)\(/}]}}),e.registerLanguage("ruby",function(e){ +var t="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",r={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},a={cN:"doctag",b:"@[A-Za-z]+"},n={b:"#<",e:">"},i=[e.C("#","$",{c:[a]}),e.C("^\\=begin","^\\=end",{c:[a],r:10}),e.C("^__END__","\\n$")],s={cN:"subst",b:"#\\{",e:"}",k:r},c={cN:"string",c:[e.BE,s],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%[qQwWx]?\\(",e:"\\)"},{b:"%[qQwWx]?\\[",e:"\\]"},{b:"%[qQwWx]?{",e:"}"},{b:"%[qQwWx]?<",e:">"},{b:"%[qQwWx]?/",e:"/"},{b:"%[qQwWx]?%",e:"%"},{b:"%[qQwWx]?-",e:"-"},{b:"%[qQwWx]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{b:/<<(-?)\w+$/,e:/^\s*\w+$/}]},o={cN:"params",b:"\\(",e:"\\)",endsParent:!0,k:r},l=[c,n,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<\\s*",c:[{b:"("+e.IR+"::)?"+e.IR}]}].concat(i)},{cN:"function",bK:"def",e:"$|;",c:[e.inherit(e.TM,{b:t}),o].concat(i)},{b:e.IR+"::"},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":(?!\\s)",c:[c,{b:t}],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{cN:"params",b:/\|/,e:/\|/,k:r},{b:"("+e.RSR+"|unless)\\s*",k:"unless",c:[n,{cN:"regexp",c:[e.BE,s],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}].concat(i),r:0}].concat(i);s.c=l,o.c=l;var u="[>?]>",d="[\\w#]+\\(\\w+\\):\\d+:\\d+>",b="(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>",p=[{b:/^\s*=>/,starts:{e:"$",c:l}},{cN:"meta",b:"^("+u+"|"+d+"|"+b+")",starts:{e:"$",c:l}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:r,i:/\/\*/,c:i.concat(p).concat(l)}}),e.registerLanguage("shell",function(e){return{aliases:["console"],c:[{cN:"meta",b:"^\\s{0,3}[\\w\\d\\[\\]()@-]*[>%$#]",starts:{e:"$",sL:"bash"}}]}}),e.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*#]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null",built_in:"array bigint binary bit blob boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t]},e.CBCM,t]}}),e}); \ No newline at end of file diff --git a/Telegram/Resources/iv_html/morphdom-umd.min.2.7.2.js b/Telegram/Resources/iv_html/morphdom-umd.min.2.7.2.js new file mode 100644 index 000000000..1e40c7eae --- /dev/null +++ b/Telegram/Resources/iv_html/morphdom-umd.min.2.7.2.js @@ -0,0 +1 @@ +(function(global,factory){typeof exports==="object"&&typeof module!=="undefined"?module.exports=factory():typeof define==="function"&&define.amd?define(factory):(global=global||self,global.morphdom=factory())})(this,function(){"use strict";var DOCUMENT_FRAGMENT_NODE=11;function morphAttrs(fromNode,toNode){var toNodeAttrs=toNode.attributes;var attr;var attrName;var attrNamespaceURI;var attrValue;var fromValue;if(toNode.nodeType===DOCUMENT_FRAGMENT_NODE||fromNode.nodeType===DOCUMENT_FRAGMENT_NODE){return}for(var i=toNodeAttrs.length-1;i>=0;i--){attr=toNodeAttrs[i];attrName=attr.name;attrNamespaceURI=attr.namespaceURI;attrValue=attr.value;if(attrNamespaceURI){attrName=attr.localName||attrName;fromValue=fromNode.getAttributeNS(attrNamespaceURI,attrName);if(fromValue!==attrValue){if(attr.prefix==="xmlns"){attrName=attr.name}fromNode.setAttributeNS(attrNamespaceURI,attrName,attrValue)}}else{fromValue=fromNode.getAttribute(attrName);if(fromValue!==attrValue){fromNode.setAttribute(attrName,attrValue)}}}var fromNodeAttrs=fromNode.attributes;for(var d=fromNodeAttrs.length-1;d>=0;d--){attr=fromNodeAttrs[d];attrName=attr.name;attrNamespaceURI=attr.namespaceURI;if(attrNamespaceURI){attrName=attr.localName||attrName;if(!toNode.hasAttributeNS(attrNamespaceURI,attrName)){fromNode.removeAttributeNS(attrNamespaceURI,attrName)}}else{if(!toNode.hasAttribute(attrName)){fromNode.removeAttribute(attrName)}}}}var range;var NS_XHTML="http://www.w3.org/1999/xhtml";var doc=typeof document==="undefined"?undefined:document;var HAS_TEMPLATE_SUPPORT=!!doc&&"content"in doc.createElement("template");var HAS_RANGE_SUPPORT=!!doc&&doc.createRange&&"createContextualFragment"in doc.createRange();function createFragmentFromTemplate(str){var template=doc.createElement("template");template.innerHTML=str;return template.content.childNodes[0]}function createFragmentFromRange(str){if(!range){range=doc.createRange();range.selectNode(doc.body)}var fragment=range.createContextualFragment(str);return fragment.childNodes[0]}function createFragmentFromWrap(str){var fragment=doc.createElement("body");fragment.innerHTML=str;return fragment.childNodes[0]}function toElement(str){str=str.trim();if(HAS_TEMPLATE_SUPPORT){return createFragmentFromTemplate(str)}else if(HAS_RANGE_SUPPORT){return createFragmentFromRange(str)}return createFragmentFromWrap(str)}function compareNodeNames(fromEl,toEl){var fromNodeName=fromEl.nodeName;var toNodeName=toEl.nodeName;var fromCodeStart,toCodeStart;if(fromNodeName===toNodeName){return true}fromCodeStart=fromNodeName.charCodeAt(0);toCodeStart=toNodeName.charCodeAt(0);if(fromCodeStart<=90&&toCodeStart>=97){return fromNodeName===toNodeName.toUpperCase()}else if(toCodeStart<=90&&fromCodeStart>=97){return toNodeName===fromNodeName.toUpperCase()}else{return false}}function createElementNS(name,namespaceURI){return!namespaceURI||namespaceURI===NS_XHTML?doc.createElement(name):doc.createElementNS(namespaceURI,name)}function moveChildren(fromEl,toEl){var curChild=fromEl.firstChild;while(curChild){var nextChild=curChild.nextSibling;toEl.appendChild(curChild);curChild=nextChild}return toEl}function syncBooleanAttrProp(fromEl,toEl,name){if(fromEl[name]!==toEl[name]){fromEl[name]=toEl[name];if(fromEl[name]){fromEl.setAttribute(name,"")}else{fromEl.removeAttribute(name)}}}var specialElHandlers={OPTION:function(fromEl,toEl){var parentNode=fromEl.parentNode;if(parentNode){var parentName=parentNode.nodeName.toUpperCase();if(parentName==="OPTGROUP"){parentNode=parentNode.parentNode;parentName=parentNode&&parentNode.nodeName.toUpperCase()}if(parentName==="SELECT"&&!parentNode.hasAttribute("multiple")){if(fromEl.hasAttribute("selected")&&!toEl.selected){fromEl.setAttribute("selected","selected");fromEl.removeAttribute("selected")}parentNode.selectedIndex=-1}}syncBooleanAttrProp(fromEl,toEl,"selected")},INPUT:function(fromEl,toEl){syncBooleanAttrProp(fromEl,toEl,"checked");syncBooleanAttrProp(fromEl,toEl,"disabled");if(fromEl.value!==toEl.value){fromEl.value=toEl.value}if(!toEl.hasAttribute("value")){fromEl.removeAttribute("value")}},TEXTAREA:function(fromEl,toEl){var newValue=toEl.value;if(fromEl.value!==newValue){fromEl.value=newValue}var firstChild=fromEl.firstChild;if(firstChild){var oldValue=firstChild.nodeValue;if(oldValue==newValue||!newValue&&oldValue==fromEl.placeholder){return}firstChild.nodeValue=newValue}},SELECT:function(fromEl,toEl){if(!toEl.hasAttribute("multiple")){var selectedIndex=-1;var i=0;var curChild=fromEl.firstChild;var optgroup;var nodeName;while(curChild){nodeName=curChild.nodeName&&curChild.nodeName.toUpperCase();if(nodeName==="OPTGROUP"){optgroup=curChild;curChild=optgroup.firstChild}else{if(nodeName==="OPTION"){if(curChild.hasAttribute("selected")){selectedIndex=i;break}i++}curChild=curChild.nextSibling;if(!curChild&&optgroup){curChild=optgroup.nextSibling;optgroup=null}}}fromEl.selectedIndex=selectedIndex}}};var ELEMENT_NODE=1;var DOCUMENT_FRAGMENT_NODE$1=11;var TEXT_NODE=3;var COMMENT_NODE=8;function noop(){}function defaultGetNodeKey(node){if(node){return node.getAttribute&&node.getAttribute("id")||node.id}}function morphdomFactory(morphAttrs){return function morphdom(fromNode,toNode,options){if(!options){options={}}if(typeof toNode==="string"){if(fromNode.nodeName==="#document"||fromNode.nodeName==="HTML"||fromNode.nodeName==="BODY"){var toNodeHtml=toNode;toNode=doc.createElement("html");toNode.innerHTML=toNodeHtml}else{toNode=toElement(toNode)}}else if(toNode.nodeType===DOCUMENT_FRAGMENT_NODE$1){toNode=toNode.firstElementChild}var getNodeKey=options.getNodeKey||defaultGetNodeKey;var onBeforeNodeAdded=options.onBeforeNodeAdded||noop;var onNodeAdded=options.onNodeAdded||noop;var onBeforeElUpdated=options.onBeforeElUpdated||noop;var onElUpdated=options.onElUpdated||noop;var onBeforeNodeDiscarded=options.onBeforeNodeDiscarded||noop;var onNodeDiscarded=options.onNodeDiscarded||noop;var onBeforeElChildrenUpdated=options.onBeforeElChildrenUpdated||noop;var skipFromChildren=options.skipFromChildren||noop;var addChild=options.addChild||function(parent,child){return parent.appendChild(child)};var childrenOnly=options.childrenOnly===true;var fromNodesLookup=Object.create(null);var keyedRemovalList=[];function addKeyedRemoval(key){keyedRemovalList.push(key)}function walkDiscardedChildNodes(node,skipKeyedNodes){if(node.nodeType===ELEMENT_NODE){var curChild=node.firstChild;while(curChild){var key=undefined;if(skipKeyedNodes&&(key=getNodeKey(curChild))){addKeyedRemoval(key)}else{onNodeDiscarded(curChild);if(curChild.firstChild){walkDiscardedChildNodes(curChild,skipKeyedNodes)}}curChild=curChild.nextSibling}}}function removeNode(node,parentNode,skipKeyedNodes){if(onBeforeNodeDiscarded(node)===false){return}if(parentNode){parentNode.removeChild(node)}onNodeDiscarded(node);walkDiscardedChildNodes(node,skipKeyedNodes)}function indexTree(node){if(node.nodeType===ELEMENT_NODE||node.nodeType===DOCUMENT_FRAGMENT_NODE$1){var curChild=node.firstChild;while(curChild){var key=getNodeKey(curChild);if(key){fromNodesLookup[key]=curChild}indexTree(curChild);curChild=curChild.nextSibling}}}indexTree(fromNode);function handleNodeAdded(el){onNodeAdded(el);var curChild=el.firstChild;while(curChild){var nextSibling=curChild.nextSibling;var key=getNodeKey(curChild);if(key){var unmatchedFromEl=fromNodesLookup[key];if(unmatchedFromEl&&compareNodeNames(curChild,unmatchedFromEl)){curChild.parentNode.replaceChild(unmatchedFromEl,curChild);morphEl(unmatchedFromEl,curChild)}else{handleNodeAdded(curChild)}}else{handleNodeAdded(curChild)}curChild=nextSibling}}function cleanupFromEl(fromEl,curFromNodeChild,curFromNodeKey){while(curFromNodeChild){var fromNextSibling=curFromNodeChild.nextSibling;if(curFromNodeKey=getNodeKey(curFromNodeChild)){addKeyedRemoval(curFromNodeKey)}else{removeNode(curFromNodeChild,fromEl,true)}curFromNodeChild=fromNextSibling}}function morphEl(fromEl,toEl,childrenOnly){var toElKey=getNodeKey(toEl);if(toElKey){delete fromNodesLookup[toElKey]}if(!childrenOnly){if(onBeforeElUpdated(fromEl,toEl)===false){return}morphAttrs(fromEl,toEl);onElUpdated(fromEl);if(onBeforeElChildrenUpdated(fromEl,toEl)===false){return}}if(fromEl.nodeName!=="TEXTAREA"){morphChildren(fromEl,toEl)}else{specialElHandlers.TEXTAREA(fromEl,toEl)}}function morphChildren(fromEl,toEl){var skipFrom=skipFromChildren(fromEl,toEl);var curToNodeChild=toEl.firstChild;var curFromNodeChild=fromEl.firstChild;var curToNodeKey;var curFromNodeKey;var fromNextSibling;var toNextSibling;var matchingFromEl;outer:while(curToNodeChild){toNextSibling=curToNodeChild.nextSibling;curToNodeKey=getNodeKey(curToNodeChild);while(!skipFrom&&curFromNodeChild){fromNextSibling=curFromNodeChild.nextSibling;if(curToNodeChild.isSameNode&&curToNodeChild.isSameNode(curFromNodeChild)){curToNodeChild=toNextSibling;curFromNodeChild=fromNextSibling;continue outer}curFromNodeKey=getNodeKey(curFromNodeChild);var curFromNodeType=curFromNodeChild.nodeType;var isCompatible=undefined;if(curFromNodeType===curToNodeChild.nodeType){if(curFromNodeType===ELEMENT_NODE){if(curToNodeKey){if(curToNodeKey!==curFromNodeKey){if(matchingFromEl=fromNodesLookup[curToNodeKey]){if(fromNextSibling===matchingFromEl){isCompatible=false}else{fromEl.insertBefore(matchingFromEl,curFromNodeChild);if(curFromNodeKey){addKeyedRemoval(curFromNodeKey)}else{removeNode(curFromNodeChild,fromEl,true)}curFromNodeChild=matchingFromEl;curFromNodeKey=getNodeKey(curFromNodeChild)}}else{isCompatible=false}}}else if(curFromNodeKey){isCompatible=false}isCompatible=isCompatible!==false&&compareNodeNames(curFromNodeChild,curToNodeChild);if(isCompatible){morphEl(curFromNodeChild,curToNodeChild)}}else if(curFromNodeType===TEXT_NODE||curFromNodeType==COMMENT_NODE){isCompatible=true;if(curFromNodeChild.nodeValue!==curToNodeChild.nodeValue){curFromNodeChild.nodeValue=curToNodeChild.nodeValue}}}if(isCompatible){curToNodeChild=toNextSibling;curFromNodeChild=fromNextSibling;continue outer}if(curFromNodeKey){addKeyedRemoval(curFromNodeKey)}else{removeNode(curFromNodeChild,fromEl,true)}curFromNodeChild=fromNextSibling}if(curToNodeKey&&(matchingFromEl=fromNodesLookup[curToNodeKey])&&compareNodeNames(matchingFromEl,curToNodeChild)){if(!skipFrom){addChild(fromEl,matchingFromEl)}morphEl(matchingFromEl,curToNodeChild)}else{var onBeforeNodeAddedResult=onBeforeNodeAdded(curToNodeChild);if(onBeforeNodeAddedResult!==false){if(onBeforeNodeAddedResult){curToNodeChild=onBeforeNodeAddedResult}if(curToNodeChild.actualize){curToNodeChild=curToNodeChild.actualize(fromEl.ownerDocument||doc)}addChild(fromEl,curToNodeChild);handleNodeAdded(curToNodeChild)}}curToNodeChild=toNextSibling;curFromNodeChild=fromNextSibling}cleanupFromEl(fromEl,curFromNodeChild,curFromNodeKey);var specialElHandler=specialElHandlers[fromEl.nodeName];if(specialElHandler){specialElHandler(fromEl,toEl)}}var morphedNode=fromNode;var morphedNodeType=morphedNode.nodeType;var toNodeType=toNode.nodeType;if(!childrenOnly){if(morphedNodeType===ELEMENT_NODE){if(toNodeType===ELEMENT_NODE){if(!compareNodeNames(fromNode,toNode)){onNodeDiscarded(fromNode);morphedNode=moveChildren(fromNode,createElementNS(toNode.nodeName,toNode.namespaceURI))}}else{morphedNode=toNode}}else if(morphedNodeType===TEXT_NODE||morphedNodeType===COMMENT_NODE){if(toNodeType===morphedNodeType){if(morphedNode.nodeValue!==toNode.nodeValue){morphedNode.nodeValue=toNode.nodeValue}return morphedNode}else{morphedNode=toNode}}}if(morphedNode===toNode){onNodeDiscarded(fromNode)}else{if(toNode.isSameNode&&toNode.isSameNode(morphedNode)){return}morphEl(morphedNode,toNode,childrenOnly);if(keyedRemovalList){for(var i=0,len=keyedRemovalList.length;i li, +article ol > li { + padding-left: 4px; +} +article.rtl ul > li, +article.rtl ol > li { + padding-right: 4px; + padding-left: 0; +} +/*article ul > li { + position: relative; +} +article ul > li:before { + content: '\2022'; + position: absolute; + display: block; + font-size: 163%; + left: -19px; + top: 1px; +} +article.rtl ul > li:before { + left: auto; + right: -19px; +}*/ +article ul ul, +article ul ol, +article ol ul, +article ol ol { + margin: 0 0 12px; +} + +article table { + width: 100%; + border-collapse: collapse; +} +article table.bordered, +article table.bordered td, +article table.bordered th { + border: 1px solid var(--td-history-to-down-shadow); +} +article table.striped tr:nth-child(odd) td { + background-color: var(--td-box-divider-bg); +} +article table caption { + font-size: 15px; + line-height: 18px; + margin: 4px 0 7px; + text-align: left; + color: var(--td-window-sub-text-fg); +} +article.rtl table caption { + text-align: right; +} +article td, +article th { + font-size: 15px; + line-height: 21px; + padding: 6px 5px 5px; + background-color: var(--td-window-bg); + vertical-align: middle; + font-weight: normal; + text-align: left; +} +article th { + background-color: var(--td-box-divider-bg); +} +article.rtl table td, +article.rtl table th { + text-align: right; +} +article details { + position: relative; + margin: 0 0 12px; + padding: 0 0 1px; +} +article details:before { + content: ''; + display: block; + border-bottom: 1px solid var(--td-history-to-down-shadow); + position: absolute; + left: 18px; + right: 0; + bottom: 0; +} +article.rtl details:before { + right: 18px; + left: 0; +} +article details + details { + margin-top: -12px; +} +article details > details:last-child { + margin-bottom: -1px; +} +article summary { + padding: 10px 18px 10px 42px; + line-height: 25px; + min-height: 25px; +} +article.rtl summary { + padding-left: 18px; + padding-right: 42px; +} +article summary:hover { + cursor: pointer; +} +article summary:focus { + outline: none; +} +article summary::-webkit-details-marker { + display: none; +} +article summary::marker { + content: ''; +} +article summary:before { + content: ''; + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAICAYAAADN5B7xAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAH1JREFUeNqEjUEKgCAQRSfrNi1bdZFadJjsMC46SSAIHqjB5mcFqdFfhD3eUyKZtb6ln92O2janmXdvrRu+ZTfAgasu1jAHU4qiHAwc/Ff4oCQKsxxZ0NT33XrxUTjkWvgiXFf3TWkU6Vt+XihH515yFiQRpfLnEMUw3yHAABZNTT9emBrvAAAAAElFTkSuQmCC'); + transition: all .2s ease; + display: inline-block; + position: absolute; + width: 12px; + height: 8px; + left: 18px; + top: 18px; +} +article.rtl summary:before { + right: 18px; + left: auto; +} +@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { + article summary:before { + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAQCAYAAAAMJL+VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPxJREFUeNq8lEESgiAUhgFbZ0epSW28gB2pZbrrSukBHDWto1TrwHih45AiaDOxesLP9w1PBlzXNfrLSNPqkGWV8ysHGMBqv4mAlyFC7MRPk+T51Z0Lh73AAJZgIoRFUR/bEMb4TggJPG9TTIUzxmIuWHWzOCLfQQgwRiedRMBpIsObFvn+NgSTLEE2bCiKm6eDQ0bAkS2v4AjYuPvJcqtEu9DDshaB665zFZzSV6yCfyr5JplLTOA9wZiEg/a+72Qic9nxubMOPijQSZraCK4UjEiezSVYmsBHBSrJAEIJ1wr0knG4kUAt0cONBX2JGXzGi1uG7SNmOt4CDADc4r+K4txg+wAAAABJRU5ErkJggg=='); + background-size: 12px 8px; + } +} +article details[open] > summary:before { + /*transform: rotateZ(-180deg);*/ + transform: scaleY(-1); +} +article li summary { + padding-left: 24px; +} +article li details:before, +article li summary:before { + left: 0; +} + +img, +video, +iframe { + max-width: 100%; + max-height: 480px; + vertical-align: top; +} +video { + width: 100%; +} +audio { + width: 100%; + width: calc(100% - 36px); + margin: 0 18px; + vertical-align: top; +} +img { + font-size: 12px; + line-height: 14px; + color: var(--td-window-sub-text-fg); +} +img.pic { + max-height: none; + font-size: inherit; + vertical-align: middle; + position: relative; + top: -0.1em; +} +img.pic.optional { + opacity: 0.4; +} +body:hover img.pic.optional { + opacity: 1; +} +iframe.autosize { + max-height: none; +} +.iframe-wrap { + max-width: 100%; + vertical-align: top; + display: inline-block; + position: relative; +} +.iframe-wrap iframe { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; +} +figure { + margin: 0 0 16px; + padding: 0; + text-align: center; + position: relative; +} +figure.nowide { + margin-left: 18px; + margin-right: 18px; +} +figure.nowide figcaption { + padding-left: 0; + padding-right: 0; +} +ul figure.nowide, +ol figure.nowide { + margin: 0 0 12px; +} +figure > figure { + margin: 0; +} +figcaption { + font-size: 15px; + color: var(--td-window-sub-text-fg); + padding: 6px 18px 0; + line-height: 19px; + text-align: left; +} +article.rtl figcaption { + text-align: right; +} +ul figcaption, +ol figcaption { + padding-left: 0; + padding-right: 0; +} +figcaption > cite { + font-family: 'Helvetica Neue'; + font-size: 12px; + display: block; + line-height: 15px; + padding: 2px 0 0; + font-style: normal; +} +footer { + margin: 12px 18px; + color: var(--td-window-sub-text-fg); +} + +figure.slideshow-wrap { + position: relative; +} +figure.slideshow { + position: absolute; + top: 0px; + white-space: nowrap; + width: 100%; + background: #000; + overflow: hidden; +} +figure.slideshow a { + transition: margin 200ms ease-in-out; +} +figure.slideshow .photo-wrap, +figure.slideshow .video-wrap { + position: static !important; + display: inline-block; + margin: 0; + vertical-align: middle; +} +.slideshow-buttons { + position: absolute; + width: 100%; + bottom: 10px; + white-space: nowrap; + overflow: hidden; + z-index: 3; +} +.slideshow-buttons > fieldset { + padding: 0; + margin: 0; + border: none; + line-height: 0; + overflow: hidden; + overflow-x: auto; + min-width: auto; +} +.slideshow-buttons label { + display: inline-block; + padding: 7px; + cursor: pointer; +} +.slideshow-buttons input { + position: absolute; + left: -10000px; +} +.slideshow-buttons label i { + display: inline-block; + background: #fff; + box-shadow: 0 0 3px rgba(0, 0, 0, .4); + border-radius: 3.5px; + width: 7px; + height: 7px; + opacity: .6; + transition: opacity .3s; +} +.slideshow-buttons input:checked ~ i { + opacity: 1; +} +.slideshow-next, +.slideshow-prev { + position: absolute; + z-index: 4; + top: 0; + width: 25%; + max-width: 128px; + height: 100%; + cursor: pointer; + transition: opacity 200ms ease-in-out; + user-select: none; + opacity: 0.6; +} +.slideshow-next { + right: 0; + background: linear-gradient(to right, rgba(0,0,0,0) 0%, rgba(0,0,0,0.6) 100%); +} +.slideshow-prev { + left: 0; + background: linear-gradient(to left, rgba(0,0,0,0) 0%, rgba(0,0,0,0.6) 100%); +} +.slideshow-next:hover { + opacity: 1; +} +.slideshow-prev:hover { + opacity: 1; +} +.slideshow-prev svg, +.slideshow-next svg { + fill: none; + top: calc(50% - 12px); + position: absolute; + z-index: 5; + width: 24px; + height: 24px; + pointer-events: none; +} +.slideshow-prev svg { + left: calc(min(50% - 12px, 20px)); +} +.slideshow-next svg { + right: calc(min(50% - 12px, 20px)); +} +.slideshow-prev path, +.slideshow-next path { + stroke-width: 1.4; + stroke: #fff; +} + +figure.collage-wrap { + margin: 0px 12px; +} +figure.collage-wrap figcaption { + padding: 6px 6px 0px; +} +figure.collage { + overflow: hidden; + border-radius: 6px; +} +figure.collage .photo-wrap, +figure.collage .video-wrap { + position: absolute; +} +figure.collage .photo-wrap .photo { + background-size: cover; +} +figure.collage .video-wrap video { + object-fit: cover; + position: absolute; + top: 50%; + left: 50%; + width: auto; + height: auto; + min-width: 100%; + min-height: 100%; + transform: translate(-50%, -50%); +} +figure.collage .video-wrap .video-small, +video[autoplay] { + pointer-events: none; +} + +figure.table-wrap { + overflow: auto; + -webkit-overflow-scrolling: touch; +} +figure.table { + display: table-cell; + padding: 0 18px; +} +article ol figure.table-wrap, +article ul figure.table-wrap { + margin-top: 7px; +} +article ol figure.table, +article ul figure.table { + padding: 0; +} + +figure blockquote.embed-post { + text-align: left; + margin-bottom: 0; +} +article.rtl figure blockquote.embed-post { + text-align: right; +} +blockquote.embed-post address { + margin: 0; + padding: 5px 0 9px; + overflow: hidden; +} +blockquote.embed-post address figure { + width: 50px; + height: 50px; + float: left; + margin: 0 12px 0 0; + background: no-repeat center; + background-size: cover; + border-radius: 50%; +} +article.rtl blockquote.embed-post address figure { + float: right; + margin-left: 12px; + margin-right: 0; +} +blockquote.embed-post address a { + display: inline-block; + padding-top: 2px; + font-size: 17px; + font-weight: 600; + color: var(--td-window-fg); +} +blockquote.embed-post address time { + display: block; + line-height: 19px; +} +blockquote.embed-post p, +blockquote.embed-post blockquote { + margin: 0 0 7px; + clear: left; +} +blockquote.embed-post figcaption { + padding-left: 0; + padding-right: 0; +} +blockquote.embed-post figure.collage { + margin-left: -2px; + margin-right: -2px; +} +blockquote.embed-post footer { + margin: 12px 0 0; + font-style: normal; +} +blockquote.embed-post footer hr { + display: none; +} + +section.embed-post { + display: block; + width: auto; + height: auto; + background: var(--td-box-divider-bg); + margin: 0 18px 12px; + padding: 24px 18px; + text-align: center; +} +section.embed-post strong { + font-size: 21px; + font-weight: normal; + display: block; + color: var(--td-window-sub-text-fg); +} +section.embed-post small { + display: block; + color: var(--td-window-sub-text-fg); +} + + +section.related { + margin: 7px 0 12px; +} +section.related h4 { + font-family: 'Helvetica Neue'; + font-size: 17px; + line-height: 26px; + font-weight: 500; + display: block; + padding: 7px 18px; + background: var(--td-box-divider-bg); + margin: 0; + color: var(--td-window-fg); +} +section.related a.related-link { + display: block; + padding: 15px 18px 16px; + background: var(--td-window-bg); + position: relative; + overflow: hidden; +} +section.related a.related-link:after { + content: ''; + display: block; + border-bottom: 1px solid var(--td-history-to-down-shadow); + position: absolute; + left: 18px; + right: 0; + bottom: 0; +} +section.related .related-link-url { + display: block; + font-size: 15px; + line-height: 18px; + padding: 7px 0; + color: var(--td-window-sub-text-fg); + word-break: break-word; +} +section.related .related-link-thumb { + display: inline-block; + float: right; + width: 87px; + height: 87px; + border-radius: 4px; + background: no-repeat center; + background-size: cover; + margin-left: 15px; +} +section.related .related-link-content { + display: block; + margin: -3px 0; +} +section.related .related-link-title { + font-size: 15px; + font-weight: 500; + line-height: 18px; + display: block; + display: -webkit-box; + margin-bottom: 4px; + max-height: 36px; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; + white-space: pre-wrap; + color: var(--td-window-fg); +} +section.related .related-link-desc { + font-size: 14px; + line-height: 17px; + display: block; + display: -webkit-box; + max-height: 51px; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; + white-space: pre-wrap; + color: var(--td-window-fg); +} +section.related .related-link-source { + font-size: 13px; + line-height: 17px; + display: block; + overflow: hidden; + margin-top: 4px; + text-overflow: ellipsis; + white-space: nowrap; + color: var(--td-window-sub-text-fg); +} + +section.message { + position: absolute; + display: table; + width: 100%; + height: 100%; +} +section.message.static { + position: static; + min-height: 200px; + height: 100vh; +} +section.message > aside { + display: table-cell; + vertical-align: middle; + text-align: center; + color: var(--td-window-sub-text-fg); + font-size: 24px; + pointer-events: none; +} +section.message > aside > cite { + display: block; + font-size: 14px; + padding: 10px 0 0; + font-style: normal; + color: var(--td-window-sub-text-fg); +} + +section.channel { + margin-top: -16px; + margin-bottom: -9px; +} +section.channel:first-child { + margin-top: 0; +} +section.channel > a { + display: block; + background: var(--td-box-divider-bg); +} +section.channel > a > div.join { + color: var(--td-window-active-text-fg); + font-weight: 500; + padding: 7px 18px; + float: right; +} +section.channel.joined > a > div.join { + display: none; +} +section.channel > a > div.join:hover { + text-decoration: underline; +} +section.channel > a > div.join span:before { + content: var(--td-lng-group-call-join); +} +section.channel > a > h4 { + font-family: 'Helvetica Neue'; + font-size: 17px; + line-height: 26px; + font-weight: 500; + margin: 0; + color: var(--td-window-fg); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + padding: 7px 18px; +} + +.pullquote { + text-align: center; + max-width: 420px; + font-size: 19px; + display: block; + margin: 0 auto; +} +.photo-wrap, +.video-wrap { + width: 100%; + margin: 0 auto; + position: relative; + overflow: hidden; +} +.photo-bg, +.video-bg { + background-size: cover; + background-position: center; + background-repeat: no-repeat; + position: absolute; + filter: blur(16px); + width: 100%; + height: 100%; +} +.video-bg, +video { + position: absolute; + top: 0px; +} +.photo { + position: relative; + background-size: contain; + background-position: center; + background-repeat: no-repeat; +} +.photo, +video { + opacity: 0; + transition: opacity 300ms ease-in-out; +} +.photo.loaded, +video.loaded { + opacity: 1; +} +.video-play-outer { + position: relative; + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; +} +.video-play { + position: relative; + width: 48px; + height: 0; + padding-top: 48px; + max-width: 48px; + max-height: 48px; + background-color: rgba(0, 0, 0, 0.34); + border-radius: 50%; + display: flex; + justify-content: center; + align-items: center; + overflow: hidden; +} +.video-play::before { + content: ''; + position: absolute; + margin: -48px -4px 0px 0px; + width: 0; + height: 0; + border-style: solid; + border-width: 10px 0 10px 16px; + border-color: transparent transparent transparent white; +} + +.toast { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background-color: var(--td-toast-bg); + color: var(--td-toast-fg); + padding: 10px 20px; + border-radius: 6px; + z-index: 9999; + opacity: 0; + animation: fadeIn 200ms linear forwards; +} +.toast.hiding { + opacity: 1; + animation: fadeOut 1000ms linear forwards; +} diff --git a/Telegram/Resources/iv_html/page.js b/Telegram/Resources/iv_html/page.js new file mode 100644 index 000000000..efac9fa65 --- /dev/null +++ b/Telegram/Resources/iv_html/page.js @@ -0,0 +1,622 @@ +var IV = { + notify: function(message) { + if (window.external && window.external.invoke) { + window.external.invoke(JSON.stringify(message)); + } + }, + frameClickHandler: function(e) { + var target = e.target; + var context = ''; + while (target) { + if (target.tagName == 'AUDIO' || target.tagName == 'VIDEO') { + return; + } + if (context === '' + && target.hasAttribute + && target.hasAttribute('data-context')) { + context = String(target.getAttribute('data-context')); + } + if (target.tagName == 'A') { + break; + } + target = target.parentNode; + } + if (!target || !target.hasAttribute('href')) { + return; + } + var base = document.createElement('A'); + base.href = window.location.href; + if (base.origin != target.origin + || base.pathname != target.pathname + || base.search != target.search) { + IV.notify({ + event: 'link_click', + url: target.href, + context: context, + }); + } else if (target.hash.length < 2) { + IV.jumpToHash(''); + } else { + IV.jumpToHash(target.hash.substr(1)); + } + e.preventDefault(); + }, + getElementTop: function (element) { + var top = 0; + while (element && !element.classList.contains('page-scroll')) { + top += element.offsetTop; + element = element.offsetParent; + } + return top; + }, + jumpToHash: function (hash, instant) { + var current = IV.computeCurrentState(); + current.hash = hash; + window.history.replaceState( + current, + '', + 'page' + IV.index + '.html'); + if (hash == '') { + IV.scrollTo(0, instant); + return; + } + + var element = document.getElementsByName(hash)[0]; + if (element) { + IV.scrollTo(IV.getElementTop(element), instant); + } + }, + frameKeyDown: function (e) { + const keyW = (e.key === 'w') + || (e.code === 'KeyW') + || (e.keyCode === 87); + const keyQ = (e.key === 'q') + || (e.code === 'KeyQ') + || (e.keyCode === 81); + const keyM = (e.key === 'm') + || (e.code === 'KeyM') + || (e.keyCode === 77); + if ((e.metaKey || e.ctrlKey) && (keyW || keyQ || keyM)) { + e.preventDefault(); + IV.notify({ + event: 'keydown', + modifier: e.ctrlKey ? 'ctrl' : 'cmd', + key: keyW ? 'w' : keyQ ? 'q' : 'm', + }); + } else if (e.key === 'Escape' || e.keyCode === 27) { + e.preventDefault(); + if (IV.position) { + window.history.back(); + } else { + IV.notify({ + event: 'keydown', + key: 'escape', + }); + } + } + }, + frameMouseEnter: function (e) { + IV.notify({ event: 'mouseenter' }); + }, + frameMouseUp: function (e) { + IV.notify({ event: 'mouseup' }); + }, + lastScrollTop: 0, + frameScrolled: function (e) { + const was = IV.lastScrollTop; + IV.lastScrollTop = IV.findPageScroll().scrollTop; + IV.updateJumpToTop(was < IV.lastScrollTop); + IV.checkVideos(); + }, + updateJumpToTop: function (scrolledDown) { + if (IV.lastScrollTop < 100) { + document.getElementById('bottom_up').classList.add('hidden'); + } else if (scrolledDown && IV.lastScrollTop > 200) { + document.getElementById('bottom_up').classList.remove('hidden'); + } + }, + updateStyles: function (styles) { + if (IV.styles !== styles) { + IV.styles = styles; + document.getElementsByTagName('html')[0].style = styles; + } + }, + toggleChannelJoined: function (id, joined) { + const channels = document.getElementsByClassName('channel'); + const full = 'channel' + id; + for (var i = 0; i < channels.length; ++i) { + const channel = channels[i]; + if (String(channel.getAttribute('data-context')) === full) { + channel.classList.toggle('joined', joined); + } + } + }, + slideshowSlide: function(el, delta) { + var dir = window.getComputedStyle(el, null).direction || 'ltr'; + var marginProp = dir == 'rtl' ? 'marginRight' : 'marginLeft'; + if (delta) { + var form = el.parentNode.firstChild; + var s = form.s; + const next = +s.value + delta; + s.value = (next == s.length) ? 0 : (next == -1) ? (s.length - 1) : next; + s.forEach(function(el){ el.checked && el.parentNode.scrollIntoView && el.parentNode.scrollIntoView({behavior: 'smooth', block: 'center', inline: 'center'}); }); + form.nextSibling.firstChild.style[marginProp] = (-100 * s.value) + '%'; + } else { + el.form.nextSibling.firstChild.style[marginProp] = (-100 * el.value) + '%'; + } + return false; + }, + initPreBlocks: function() { + if (!hljs) { + return; + } + var pres = document.getElementsByTagName('pre'); + for (var i = 0; i < pres.length; i++) { + if (pres[i].hasAttribute('data-language')) { + hljs.highlightBlock(pres[i]); + } + } + }, + initEmbedBlocks: function() { + var iframes = document.getElementsByTagName('iframe'); + for (var i = 0; i < iframes.length; i++) { + (function(iframe) { + window.addEventListener('message', function(event) { + if (event.source !== iframe.contentWindow || + event.origin != window.origin) { + return; + } + try { + var data = JSON.parse(event.data); + } catch(e) { + var data = {}; + } + if (data.eventType == 'resize_frame') { + if (data.eventData.height) { + iframe.style.height = data.eventData.height + 'px'; + } + } + }, false); + })(iframes[i]); + } + }, + addRipple: function (button, x, y) { + const ripple = document.createElement('span'); + ripple.classList.add('ripple'); + + const inner = document.createElement('span'); + inner.classList.add('inner'); + x -= button.offsetLeft; + y -= button.offsetTop; + + const mx = button.clientWidth - x; + const my = button.clientHeight - y; + const sq1 = x * x + y * y; + const sq2 = mx * mx + y * y; + const sq3 = x * x + my * my; + const sq4 = mx * mx + my * my; + const radius = Math.sqrt(Math.max(sq1, sq2, sq3, sq4)); + + inner.style.width = inner.style.height = `${2 * radius}px`; + inner.style.left = `${x - radius}px`; + inner.style.top = `${y - radius}px`; + inner.classList.add('inner'); + + ripple.addEventListener('animationend', function (e) { + if (e.animationName === 'fadeOut') { + ripple.remove(); + } + }); + + ripple.appendChild(inner); + button.appendChild(ripple); + }, + stopRipples: function (button) { + const id = button.id ? button.id : button; + button = document.getElementById(id); + const ripples = button.getElementsByClassName('ripple'); + for (var i = 0; i < ripples.length; ++i) { + const ripple = ripples[i]; + if (!ripple.classList.contains('hiding')) { + ripple.classList.add('hiding'); + } + } + }, + init: function () { + var current = IV.computeCurrentState(); + window.history.replaceState(current, '', IV.pageUrl(0)); + IV.jumpToHash(current.hash, true); + + IV.lastScrollTop = window.history.state.scroll; + IV.findPageScroll().onscroll = IV.frameScrolled; + + const buttons = document.getElementsByClassName('fixed_button'); + for (let i = 0; i < buttons.length; ++i) { + const button = buttons[i]; + button.addEventListener('mousedown', function (e) { + IV.addRipple(e.currentTarget, e.clientX, e.clientY); + }); + button.addEventListener('mouseup', function (e) { + const id = e.currentTarget.id; + setTimeout(function () { + IV.stopRipples(id); + }, 0); + }); + button.addEventListener('mouseleave', function (e) { + IV.stopRipples(e.currentTarget); + }); + } + IV.initMedia(); + IV.notify({ event: 'ready' }); + + IV.forceScrollFocus(); + IV.frameScrolled(); + }, + initMedia: function () { + var scroll = IV.findPageScroll(); + const photos = scroll.getElementsByClassName('photo'); + for (let i = 0; i < photos.length; ++i) { + const photo = photos[i]; + if (photo.classList.contains('loaded')) { + continue; + } + + const url = photo.style.backgroundImage; + if (!url || url.length < 7) { + continue; + } + var img = new Image(); + img.onload = function () { + photo.classList.add('loaded'); + } + img.src = url.substr(5, url.length - 7); + if (img.complete) { + photo.classList.add('loaded'); + IV.stopAnimations(photo); + } + } + IV.videos = []; + const videos = scroll.getElementsByClassName('video'); + for (let i = 0; i < videos.length; ++i) { + const element = videos[i]; + IV.videos.push({ + element: element, + src: String(element.getAttribute('data-src')), + autoplay: (element.getAttribute('data-autoplay') == '1'), + loop: (element.getAttribute('data-loop') == '1'), + small: (element.getAttribute('data-small') == '1'), + filled: (element.firstChild + && element.firstChild.tagName == 'VIDEO'), + }); + } + }, + checkVideos: function () { + const visibleTop = IV.lastScrollTop; + const visibleBottom = visibleTop + IV.findPageScroll().offsetHeight; + const videos = IV.videos; + for (let i = 0; i < videos.length; ++i) { + const video = videos[i]; + const element = video.element; + const wrap = element.offsetParent; // video-wrap + const top = IV.getElementTop(wrap); + const bottom = top + wrap.offsetHeight; + if (top < visibleBottom && bottom > visibleTop) { + if (!video.created) { + video.created = new Date(); + video.loaded = false; + element.innerHTML = ''; + var media = element.firstChild; + media.oncanplay = IV.checkVideos; + media.onloadeddata = IV.checkVideos; + } + } else if (video.created && video.autoplay) { + video.created = false; + element.innerHTML = ''; + } + if (video.created && !video.loaded) { + var media = element.firstChild; + const HAVE_CURRENT_DATA = 2; + if (media && media.readyState >= HAVE_CURRENT_DATA) { + video.loaded = true; + media.classList.add('loaded'); + if ((new Date() - video.created) < 100) { + IV.stopAnimations(media); + } + } + } + } + }, + showTooltip: function (text) { + var toast = document.createElement('div'); + toast.classList.add('toast'); + toast.textContent = text; + document.body.appendChild(toast); + setTimeout(function () { + toast.classList.add('hiding'); + }, 2000); + setTimeout(function () { + document.body.removeChild(toast); + }, 3000); + }, + scrollTo: function (y, instant) { + if (y < 200) { + document.getElementById('bottom_up').classList.add('hidden'); + } + IV.findPageScroll().scrollTo({ + top: y || 0, + behavior: instant ? 'instant' : 'smooth' + }); + }, + computeCurrentState: function () { + var now = IV.findPageScroll(); + return { + position: IV.position, + index: IV.index, + hash: ((!window.history.state + || window.history.state.hash === undefined) + ? window.location.hash.substr(1) + : window.history.state.hash), + scroll: now ? now.scrollTop : 0 + }; + }, + pageUrl: function (index, hash) { + var result = 'page' + index + '.html'; + if (hash) { + result += '#' + hash; + } + return result; + }, + navigateTo: function (index, hash) { + if (!index && !IV.index) { + IV.navigateToDOM(IV.index, hash); + return; + } + IV.pending = [index, hash]; + if (!IV.cache[index]) { + IV.loadPage(index); + } else if (IV.cache[index].dom) { + IV.navigateToDOM(index, hash); + } else if (IV.cache[index].content) { + IV.navigateToLoaded(index, hash); + } + }, + applyUpdatedContent: function (index) { + if (IV.index != index) { + IV.cache[index].contentUpdated = (IV.cache[index].dom !== undefined); + return; + } + var data = JSON.parse(IV.cache[index].content); + var article = function (el) { + return el.getElementsByTagName('article')[0]; + }; + var from = article(IV.findPageScroll()); + var to = article(IV.makeScrolledContent(data.html)); + morphdom(from, to, { + onBeforeElUpdated: function (fromEl, toEl) { + if (fromEl.classList.contains('video') + && toEl.classList.contains('video') + && fromEl.hasAttribute('data-src') + && toEl.hasAttribute('data-src') + && (fromEl.getAttribute('data-src') + == toEl.getAttribute('data-src'))) { + return false; + } else if (fromEl.classList.contains('loaded')) { + toEl.classList.add('loaded'); + } + return !fromEl.isEqualNode(toEl); + } + }); + IV.initMedia(); + eval(data.js); + }, + loadPage: function (index) { + if (!IV.cache[index]) { + IV.cache[index] = {}; + } + IV.cache[index].loading = true; + + let xhr = new XMLHttpRequest(); + xhr.onload = function () { + IV.cache[index].loading = false; + IV.cache[index].content = xhr.responseText; + IV.applyUpdatedContent(index); + if (IV.pending && IV.pending[0] == index) { + IV.navigateToLoaded(index, IV.pending[1]); + } + if (IV.cache[index].reloadPending) { + IV.cache[index].reloadPending = false; + IV.reloadPage(index); + } + } + + xhr.open('GET', 'page' + index + '.json'); + xhr.send(); + }, + reloadPage: function (index) { + if (IV.cache[index] && IV.cache[index].loading) { + IV.cache[index].reloadPending = true; + return; + } + IV.loadPage(index); + }, + + makeScrolledContent: function (html) { + var result = document.createElement('div'); + result.className = 'page-scroll'; + result.tabIndex = '-1'; + result.innerHTML = '
' + + html + + '
'; + result.onscroll = IV.frameScrolled; + return result; + }, + navigateToLoaded: function (index, hash) { + if (IV.cache[index].dom) { + IV.navigateToDOM(index, hash); + } else { + var data = JSON.parse(IV.cache[index].content); + IV.cache[index].dom = IV.makeScrolledContent(data.html); + + IV.navigateToDOM(index, hash); + eval(data.js); + } + }, + navigateToDOM: function (index, hash) { + IV.pending = null; + if (IV.index == index) { + IV.jumpToHash(hash); + IV.forceScrollFocus(); + return; + } + window.history.replaceState( + IV.computeCurrentState(), + '', + IV.pageUrl(IV.index)); + + IV.position = IV.position + 1; + window.history.pushState( + { position: IV.position, index: index, hash: hash }, + '', + IV.pageUrl(index)); + IV.showDOM(index, hash); + }, + findPageScroll: function () { + var all = document.getElementsByClassName('page-scroll'); + for (i = 0; i < all.length; ++i) { + if (!all[i].classList.contains('hidden-left') + && !all[i].classList.contains('hidden-right')) { + return all[i]; + } + } + return null; + }, + showDOM: function (index, hash, scroll) { + IV.pending = null; + if (IV.index != index) { + var initial = !window.history.state + || window.history.state.position === undefined; + var back = initial + || IV.position > window.history.state.position; + IV.position = initial ? 0 : window.history.state.position; + + var now = IV.cache[index].dom; + var was = IV.findPageScroll(); + if (!IV.cache[IV.index]) { + IV.cache[IV.index] = {}; + } + IV.cache[IV.index].dom = was; + was.parentNode.appendChild(now); + if (scroll !== undefined) { + now.scrollTop = scroll; + setTimeout(function () { + // When returning by history.back to an URL with a hash + // for the first time browser forces the scroll to the + // hash instead of the saved scroll position. + // + // This workaround prevents incorrect scroll position. + now.scrollTop = scroll; + }, 0); + } + + now.classList.add(back ? 'hidden-left' : 'hidden-right'); + now.classList.remove(back ? 'hidden-right' : 'hidden-left'); + IV.stopAnimations(now.firstChild); + + if (!was.listening) { + was.listening = true; + was.firstChild.addEventListener('transitionend', function (e) { + if (was.classList.contains('hidden-left') + || was.classList.contains('hidden-right')) { + if (was.parentNode) { + was.parentNode.removeChild(was); + var videos = was.getElementsByClassName('video'); + for (var i = 0; i < videos.length; ++i) { + videos[i].innerHTML = ''; + } + } + } + }); + } + + was.classList.add(back ? 'hidden-right' : 'hidden-left'); + now.classList.remove(back ? 'hidden-left' : 'hidden-right'); + + IV.index = index; + IV.notify({ + event: 'location_change', + index: IV.index, + position: IV.position, + hash: IV.computeCurrentState().hash, + }); + if (IV.cache[index].contentUpdated) { + IV.cache[index].contentUpdated = false; + IV.applyUpdatedContent(index); + } else { + IV.initMedia(); + } + if (scroll === undefined) { + IV.jumpToHash(hash, true); + } else { + IV.lastScrollTop = scroll; + IV.updateJumpToTop(true); + } + } else if (scroll !== undefined) { + IV.scrollTo(scroll); + IV.lastScrollTop = scroll; + IV.updateJumpToTop(true); + } else { + IV.jumpToHash(hash); + } + + IV.forceScrollFocus(); + IV.frameScrolled(); + }, + forceScrollFocus: function () { + IV.findPageScroll().focus(); + setTimeout(function () { + // Doesn't work on #hash-ed pages in Windows WebView2 otherwise. + IV.findPageScroll().focus(); + }, 100); + }, + stopAnimations: function (element) { + element.getAnimations().forEach( + (animation) => animation.finish()); + }, + back: function () { + window.history.back(); + }, + + videos: {}, + videosPlaying: {}, + + cache: {}, + index: 0, + position: 0 +}; + +document.onclick = IV.frameClickHandler; +document.onkeydown = IV.frameKeyDown; +document.onmouseenter = IV.frameMouseEnter; +document.onmouseup = IV.frameMouseUp; +document.onresize = IV.checkVideos; +window.onmessage = IV.postMessageHandler; +window.addEventListener('popstate', function (e) { + if (e.state) { + IV.showDOM(e.state.index, e.state.hash, e.state.scroll); + } +}); +document.addEventListener("DOMContentLoaded", IV.forceScrollFocus); diff --git a/Telegram/Resources/langs/cloud_lang.strings b/Telegram/Resources/langs/cloud_lang.strings index 1abb893e7..c9d4af958 100644 --- a/Telegram/Resources/langs/cloud_lang.strings +++ b/Telegram/Resources/langs/cloud_lang.strings @@ -35,7 +35,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "cloud_lng_passport_in_it" = "Italian"; "cloud_lng_passport_in_ja" = "Japanese"; "cloud_lng_passport_in_ka" = "Georgian"; -"cloud_lng_passport_in_km" = "Khmer"; +// "cloud_lng_passport_in_km" = "Khmer"; "cloud_lng_passport_in_ko" = "Korean"; "cloud_lng_passport_in_lo" = "Lao"; "cloud_lng_passport_in_lt" = "Lithuanian"; @@ -58,3 +58,99 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "cloud_lng_passport_in_uk" = "Ukrainian"; "cloud_lng_passport_in_uz" = "Uzbek"; "cloud_lng_passport_in_vi" = "Vietnamese"; + +"cloud_lng_translate_to_ar" = "Arabic"; +"cloud_lng_translate_to_az" = "Azerbaijani"; +"cloud_lng_translate_to_bg" = "Bulgarian"; +// "cloud_lng_translate_to_bn" = "Bangla"; +"cloud_lng_translate_to_cs" = "Czech"; +"cloud_lng_translate_to_da" = "Danish"; +"cloud_lng_translate_to_de" = "German"; +// "cloud_lng_translate_to_dv" = "Divehi"; +// "cloud_lng_translate_to_dz" = "Dzongkha"; +"cloud_lng_translate_to_el" = "Greek"; +"cloud_lng_translate_to_en" = "English"; +"cloud_lng_translate_to_es" = "Spanish"; +"cloud_lng_translate_to_et" = "Estonian"; +"cloud_lng_translate_to_fa" = "Persian"; +"cloud_lng_translate_to_fr" = "French"; +"cloud_lng_translate_to_he" = "Hebrew"; +"cloud_lng_translate_to_hr" = "Croatian"; +"cloud_lng_translate_to_hu" = "Hungarian"; +"cloud_lng_translate_to_hy" = "Armenian"; +"cloud_lng_translate_to_id" = "Indonesian"; +"cloud_lng_translate_to_is" = "Icelandic"; +"cloud_lng_translate_to_it" = "Italian"; +"cloud_lng_translate_to_ja" = "Japanese"; +"cloud_lng_translate_to_ka" = "Georgian"; +// "cloud_lng_translate_to_km" = "Khmer"; +"cloud_lng_translate_to_ko" = "Korean"; +"cloud_lng_translate_to_lo" = "Lao"; +"cloud_lng_translate_to_lt" = "Lithuanian"; +"cloud_lng_translate_to_lv" = "Latvian"; +"cloud_lng_translate_to_mk" = "Macedonian"; +"cloud_lng_translate_to_mn" = "Mongolian"; +"cloud_lng_translate_to_ms" = "Malay"; +"cloud_lng_translate_to_my" = "Burmese"; +"cloud_lng_translate_to_ne" = "Nepali"; +"cloud_lng_translate_to_nl" = "Dutch"; +"cloud_lng_translate_to_pl" = "Polish"; +"cloud_lng_translate_to_pt" = "Portuguese"; +"cloud_lng_translate_to_ro" = "Romanian"; +"cloud_lng_translate_to_ru" = "Russian"; +"cloud_lng_translate_to_sk" = "Slovak"; +"cloud_lng_translate_to_sl" = "Slovenian"; +"cloud_lng_translate_to_th" = "Thai"; +"cloud_lng_translate_to_tk" = "Turkmen"; +"cloud_lng_translate_to_tr" = "Turkish"; +"cloud_lng_translate_to_uk" = "Ukrainian"; +"cloud_lng_translate_to_uz" = "Uzbek"; +"cloud_lng_translate_to_vi" = "Vietnamese"; + +"cloud_lng_language_ar" = "Arabic"; +"cloud_lng_language_az" = "Azerbaijani"; +"cloud_lng_language_bg" = "Bulgarian"; +// "cloud_lng_language_bn" = "Bangla"; +"cloud_lng_language_cs" = "Czech"; +"cloud_lng_language_da" = "Danish"; +"cloud_lng_language_de" = "German"; +// "cloud_lng_language_dv" = "Divehi"; +// "cloud_lng_language_dz" = "Dzongkha"; +"cloud_lng_language_el" = "Greek"; +"cloud_lng_language_en" = "English"; +"cloud_lng_language_es" = "Spanish"; +"cloud_lng_language_et" = "Estonian"; +"cloud_lng_language_fa" = "Persian"; +"cloud_lng_language_fr" = "French"; +"cloud_lng_language_he" = "Hebrew"; +"cloud_lng_language_hr" = "Croatian"; +"cloud_lng_language_hu" = "Hungarian"; +"cloud_lng_language_hy" = "Armenian"; +"cloud_lng_language_id" = "Indonesian"; +"cloud_lng_language_is" = "Icelandic"; +"cloud_lng_language_it" = "Italian"; +"cloud_lng_language_ja" = "Japanese"; +"cloud_lng_language_ka" = "Georgian"; +// "cloud_lng_language_km" = "Khmer"; +"cloud_lng_language_ko" = "Korean"; +"cloud_lng_language_lo" = "Lao"; +"cloud_lng_language_lt" = "Lithuanian"; +"cloud_lng_language_lv" = "Latvian"; +"cloud_lng_language_mk" = "Macedonian"; +"cloud_lng_language_mn" = "Mongolian"; +"cloud_lng_language_ms" = "Malay"; +"cloud_lng_language_my" = "Burmese"; +"cloud_lng_language_ne" = "Nepali"; +"cloud_lng_language_nl" = "Dutch"; +"cloud_lng_language_pl" = "Polish"; +"cloud_lng_language_pt" = "Portuguese"; +"cloud_lng_language_ro" = "Romanian"; +"cloud_lng_language_ru" = "Russian"; +"cloud_lng_language_sk" = "Slovak"; +"cloud_lng_language_sl" = "Slovenian"; +"cloud_lng_language_th" = "Thai"; +"cloud_lng_language_tk" = "Turkmen"; +"cloud_lng_language_tr" = "Turkish"; +"cloud_lng_language_uk" = "Ukrainian"; +"cloud_lng_language_uz" = "Uzbek"; +"cloud_lng_language_vi" = "Vietnamese"; diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 4bd7fc27e..2d0f0c406 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -13,10 +13,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_menu_settings" = "Settings"; "lng_menu_about" = "About"; "lng_menu_update" = "Update"; -"lng_menu_back" = "Back"; "lng_menu_night_mode" = "Night Mode"; "lng_menu_add_account" = "Add Account"; "lng_menu_activate" = "Activate"; +"lng_menu_set_status" = "Set Emoji Status"; +"lng_menu_change_status" = "Change Emoji Status"; +"lng_menu_my_stories" = "My Stories"; "lng_disable_notifications_from_tray" = "Disable notifications"; "lng_enable_notifications_from_tray" = "Enable notifications"; @@ -84,6 +86,36 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_calendar_days#one" = "{count} day"; "lng_calendar_days#other" = "{count} days"; +"lng_seconds#one" = "{count} second"; +"lng_seconds#other" = "{count} seconds"; +"lng_minutes#one" = "{count} minute"; +"lng_minutes#other" = "{count} minutes"; +"lng_hours#one" = "{count} hour"; +"lng_hours#other" = "{count} hours"; +"lng_days#one" = "{count} day"; +"lng_days#other" = "{count} days"; +"lng_weeks#one" = "{count} week"; +"lng_weeks#other" = "{count} weeks"; +"lng_months#one" = "{count} month"; +"lng_months#other" = "{count} months"; +"lng_years#one" = "{count} year"; +"lng_years#other" = "{count} years"; + +"lng_seconds_tiny#one" = "{count}s"; +"lng_seconds_tiny#other" = "{count}s"; +"lng_minutes_tiny#one" = "{count}m"; +"lng_minutes_tiny#other" = "{count}m"; +"lng_hours_tiny#one" = "{count}h"; +"lng_hours_tiny#other" = "{count}h"; +"lng_days_tiny#one" = "{count}d"; +"lng_days_tiny#other" = "{count}d"; +"lng_weeks_tiny#one" = "{count}w"; +"lng_weeks_tiny#other" = "{count}w"; +"lng_months_tiny#one" = "{count}m"; +"lng_months_tiny#other" = "{count}m"; +"lng_years_tiny#one" = "{count}y"; +"lng_years_tiny#other" = "{count}y"; + "lng_box_ok" = "OK"; "lng_box_done" = "Done"; "lng_box_yes" = "Yes"; @@ -93,12 +125,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_continue" = "Continue"; "lng_close" = "Close"; "lng_connecting" = "Connecting..."; -"lng_connecting_to_proxy" = "Connecting to proxy..."; -"lng_connecting_settings" = "Settings"; "lng_reconnecting#one" = "Reconnect in {count} s..."; "lng_reconnecting#other" = "Reconnect in {count} s..."; "lng_reconnecting_try_now" = "Try now"; +"lng_code_block_header_copy" = "copy"; + "lng_status_service_notifications" = "service notifications"; "lng_status_support" = "support"; "lng_status_bot" = "bot"; @@ -109,6 +141,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_status_last_week" = "last seen within a week"; "lng_status_last_month" = "last seen within a month"; "lng_status_lastseen_now" = "last seen just now"; +"lng_status_lastseen_when" = "when?"; "lng_status_lastseen_minutes#one" = "last seen {count} minute ago"; "lng_status_lastseen_minutes#other" = "last seen {count} minutes ago"; "lng_status_lastseen_hours#one" = "last seen {count} hour ago"; @@ -134,15 +167,119 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_scam_badge" = "SCAM"; "lng_fake_badge" = "FAKE"; +"lng_remember" = "Remember this choice"; + +"lng_lastseen_show_title" = "Show Your Last Seen"; +"lng_lastseen_show_about" = "To see **{user}'s** Last Seen time, either start\nshowing your own Last Seen time..."; +"lng_lastseen_show_button" = "Show My Last Seen"; +"lng_lastseen_or" = "or"; +"lng_lastseen_premium_title" = "Upgrade to Premium"; +"lng_lastseen_premium_about" = "Subscription will let you see **{user}'s** Last Seen\nstatus without showing yours."; +"lng_lastseen_premium_button" = "Subscribe to Telegram Premium"; +"lng_lastseen_shown_toast" = "Your last seen time is now visible."; + +"lng_readtime_show_title" = "Show Your Read Date"; +"lng_readtime_show_about" = "To see when **{user}** read the message,\neither start showing your own read time..."; +"lng_readtime_show_button" = "Show My Read Time"; +"lng_readtime_or" = "or"; +"lng_readtime_premium_title" = "Upgrade to Premium"; +"lng_readtime_premium_about" = "Subscription will let you see **{user}'s** read time\nwithout showing yours."; +"lng_readtime_premium_button" = "Subscribe to Telegram Premium"; +"lng_readtime_shown_toast" = "Your read times are now visible."; + +"lng_channels_limit_title" = "Too Many Communities"; +"lng_channels_limit1#one" = "You are a member of **{count}** groups and channels."; +"lng_channels_limit1#other" = "You are a member of **{count}** groups and channels."; +"lng_channels_limit2#one" = "Please leave some before joining a new one - or upgrade to **Telegram Premium** to double the limit to **{count}** groups and channels."; +"lng_channels_limit2#other" = "Please leave some before joining a new one - or upgrade to **Telegram Premium** to double the limit to **{count}** groups and channels."; +"lng_channels_limit2_final" = "Please leave some before joining a new one."; +"lng_channels_leave_title" = "Least active communities"; +"lng_channels_leave_status" = "{type}, inactive {time}"; +"lng_channels_leave#one" = "Leave {count} community"; +"lng_channels_leave#other" = "Leave {count} communities"; +"lng_channels_leave_done" = "You've left the selected communities."; + +"lng_links_limit_title" = "Too Many Public Links"; +"lng_links_limit1#one" = "You have reserved **{count}** public link."; +"lng_links_limit1#other" = "You have reserved **{count}** public links."; +"lng_links_limit2#one" = "Try revoking the link from an older group or channel, or upgrade to **Telegram Premium** to double the limit to **{count}** public link."; +"lng_links_limit2#other" = "Try revoking the link from an older group or channel, or upgrade to **Telegram Premium** to double the limit to **{count}** public links."; +"lng_links_limit2_final" = "Try revoking the link from an older group or channel"; +"lng_links_revoke_title" = "Your public communities"; + +"lng_filter_chats_limit_title" = "Limit Reached"; +"lng_filter_chats_limit1#one" = "Sorry, you can't add more than **{count}** chat to a folder."; +"lng_filter_chats_limit1#other" = "Sorry, you can't add more than **{count}** chats to a folder."; +"lng_filter_chats_exlude_limit1#one" = "Sorry, you can't exlude more than **{count}** chat from a folder."; +"lng_filter_chats_exlude_limit1#other" = "Sorry, you can't exlude more than **{count}** chats from a folder."; +"lng_filter_chats_limit2#one" = "You can increase this limit to **{count}** by upgrading to **Telegram Premium**."; +"lng_filter_chats_limit2#other" = "You can increase this limit to **{count}** by upgrading to **Telegram Premium**."; + +"lng_filters_limit_title" = "Limit Reached"; +"lng_filters_limit1#one" = "You have reached the limit of **{count}** folder."; +"lng_filters_limit1#other" = "You have reached the limit of **{count}** folders."; +"lng_filters_limit2#one" = "You can double the limit to **{count}** folder by subscribing to **Telegram Premium**."; +"lng_filters_limit2#other" = "You can double the limit to **{count}** folders by subscribing to **Telegram Premium**."; + +"lng_filter_pin_limit_title" = "Limit Reached"; +"lng_filter_pin_limit1#one" = "Sorry, you can't pin more than **{count}** chat to the top."; +"lng_filter_pin_limit1#other" = "Sorry, you can't pin more than **{count}** chats to the top."; +"lng_filter_pin_limit2#one" = "Unpin some of the currently pinned ones or subscribe to **Telegram Premium** to double the limit to **{count}** chat."; +"lng_filter_pin_limit2#other" = "Unpin some of the currently pinned ones or subscribe to **Telegram Premium** to double the limit to **{count}** chats."; + +"lng_forum_pin_limit#one" = "Sorry, you can't pin more than **{count}** topic to the top."; +"lng_forum_pin_limit#other" = "Sorry, you can't pin more than **{count}** topics to the top."; + +"lng_fave_sticker_limit_title#one" = "The Limit of {count} Stickers Reached"; +"lng_fave_sticker_limit_title#other" = "The Limit of {count} Stickers Reached"; +"lng_fave_sticker_limit_more#one" = "An older sticker was replaced with this one.\nYou can {link} to {count} sticker."; +"lng_fave_sticker_limit_more#other" = "An older sticker was replaced with this one.\nYou can {link} to {count} stickers."; +"lng_fave_sticker_limit_link" = "increase the limit"; + +"lng_saved_gif_limit_title#one" = "The Limit of {count} GIF Reached"; +"lng_saved_gif_limit_title#other" = "The Limit of {count} GIFs Reached"; +"lng_saved_gif_limit_more#one" = "An older GIF was replaced with this one.\nYou can {link} to {count} GIF."; +"lng_saved_gif_limit_more#other" = "An older GIF was replaced with this one.\nYou can {link} to {count} GIFs."; +"lng_saved_gif_limit_link" = "increase the limit"; + +"lng_caption_limit_title" = "Limit Reached"; +"lng_caption_limit1#one" = "Sorry, you can't use more than **{count}** character in media captions."; +"lng_caption_limit1#other" = "Sorry, you can't use more than **{count}** characters in media captions."; +"lng_caption_limit2#one" = "Make the caption shorter or subscribe to **Telegram Premium** to double the limit to **{count}** character."; +"lng_caption_limit2#other" = "Make the caption shorter or subscribe to **Telegram Premium** to double the limit to **{count}** characters."; +"lng_caption_limit_reached#one" = "You've reached the media caption limit. Please make the caption shorter by {count} character."; +"lng_caption_limit_reached#other" = "You've reached the media caption limit. Please make the caption shorter by {count} characters."; + +"lng_file_size_limit_title" = "File Too Large"; +"lng_file_size_limit#one" = "{count} Gb"; +"lng_file_size_limit#other" = "{count} Gb"; +"lng_file_size_limit1" = "The document can't be sent, because it is larger than {size}."; +"lng_file_size_limit2" = "You can double this limit to {size} per document by subscribing to **Telegram Premium**."; + +"lng_filter_links_limit_title" = "Limit Reached"; +"lng_filter_links_limit1#one" = "Sorry, you can't create more than **{count}** invite link."; +"lng_filter_links_limit1#other" = "Sorry, you can't create more than **{count}** invite links."; +"lng_filter_links_limit2#one" = "You can increase the limit to **{count}** link by subscribing to **Telegram Premium**."; +"lng_filter_links_limit2#other" = "You can increase the limit to **{count}** links by subscribing to **Telegram Premium**."; + +"lng_filter_shared_limit_title" = "Limit Reached"; +"lng_filter_shared_limit1#one" = "Sorry, you can't add more than **{count}** shareable folders."; +"lng_filter_shared_limit1#other" = "Sorry, you can't add more than **{count}** shareable folders."; +"lng_filter_shared_limit2#one" = "You can increase the limit up to **{count}** folder by subscribing to **Telegram Premium**."; +"lng_filter_shared_limit2#other" = "You can increase the limit up to **{count}** folders by subscribing to **Telegram Premium**."; + +"lng_limits_increase" = "Increase Limit"; + +"lng_sticker_premium_text" = "This pack contains premium stickers like this one."; +"lng_sticker_premium_view" = "View"; +"lng_animated_emoji_text" = "Subscribe to **Telegram Premium** to unlock this emoji."; +"lng_animated_emoji_saved" = "Try sending these emoji in **Saved Messages** for free to test."; +"lng_animated_emoji_saved_open" = "Open"; + "lng_flood_error" = "Too many tries. Please try again later."; -"lng_gif_error" = "An error has occurred while reading GIF animation :("; "lng_edit_error" = "You cannot edit this message"; -"lng_join_channel_error" = "Sorry, you have joined too many channels and supergroups. Please leave some before joining this one."; -"lng_migrate_error" = "This action will convert the group to a supergroup. Unfortunately, you are a member of too many supergroups and channels. Please leave some of the channels or groups you don't need before proceeding."; "lng_error_phone_flood" = "Sorry, you have deleted and re-created your account too many times recently. Please wait for a few days before signing up again."; "lng_error_start_minimized_passcoded" = "You have set a local passcode, so Telegram Desktop can't be launched minimised; it will ask you to enter your passcode before it can start working."; -"lng_error_pinned_max#one" = "Sorry, you can pin no more than {count} chat to the top."; -"lng_error_pinned_max#other" = "Sorry, you can pin no more than {count} chats to the top."; "lng_error_public_groups_denied" = "Unfortunately, you were banned from participating in public groups.\n{more_info}"; "lng_error_cant_add_member" = "Sorry, you can't add the bot to this group. Ask a group admin to do it."; "lng_error_cant_add_bot" = "Sorry, this bot can't be added to groups."; @@ -156,6 +293,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_error_noforwards_channel" = "Sorry, forwarding from this channel is disabled by admins."; "lng_error_nocopy_group" = "Sorry, copying from this group is disabled by admins."; "lng_error_nocopy_channel" = "Sorry, copying from this channel is disabled by admins."; +"lng_error_nocopy_story" = "Sorry, copying of this story is disabled by the author."; "lng_sure_add_admin_invite" = "This user is not a member of this group. Add them to the group and promote them to admin?"; "lng_sure_add_admin_invite_channel" = "This user is not a subscriber of this channel. Add them to the channel and promote them to admin?"; "lng_sure_add_admin_unremove" = "This user is currently restricted or removed. Are you sure you want to promote them?"; @@ -166,15 +304,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_proxy_unsupported" = "Your Telegram Desktop version doesn't support this proxy type or the proxy link is invalid. Please update Telegram Desktop to the latest version."; "lng_edit_deleted" = "This message was deleted"; -"lng_edit_too_long" = "Your message text is too long"; +"lng_edit_limit_reached#one" = "You've reached the message text limit. Please make the text shorter by {count} character."; +"lng_edit_limit_reached#other" = "You've reached the message text limit. Please make the text shorter by {count} characters."; "lng_edit_message" = "Edit message"; "lng_edit_message_text" = "New message text..."; "lng_deleted" = "Deleted Account"; "lng_deleted_message" = "Deleted message"; +"lng_deleted_story" = "Deleted story"; "lng_pinned_message" = "Pinned message"; "lng_pinned_previous" = "Previous message"; -"lng_pinned_poll" = "Pinned poll"; -"lng_pinned_quiz" = "Pinned quiz"; "lng_pinned_unpin_sure" = "Would you like to unpin this message?"; "lng_pinned_pin_sure" = "Would you like to pin this message?"; "lng_pinned_pin_sure_group" = "Do you want to pin this message for all members in the group?"; @@ -199,21 +337,25 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_edit_caption_voice" = "Sorry, you can't edit your message while you're having an unsent voice message."; "lng_intro_about" = "Welcome to the official Telegram Desktop app.\nIt's fast and secure."; -"lng_start_msgs" = "START MESSAGING"; +"lng_start_msgs" = "Start messaging"; -"lng_intro_next" = "NEXT"; -"lng_intro_finish" = "SIGN UP"; -"lng_intro_submit" = "SUBMIT"; +"lng_intro_next" = "Next"; +"lng_intro_finish" = "Sign up"; +"lng_intro_submit" = "Submit"; "lng_photo_caption" = "Caption"; "lng_photos_comment" = "Comment"; "lng_intro_qr_title" = "Scan From Mobile Telegram"; "lng_intro_qr_step1" = "Open Telegram on your phone"; -"lng_intro_qr_step2" = "Go to Settings > Devices > Scan QR Code"; +"lng_intro_qr_step2" = "Go to Settings > Devices > Link Desktop"; "lng_intro_qr_step3" = "Scan this image to Log In"; "lng_intro_qr_skip" = "Or log in using your phone number"; +"lng_intro_fragment_title" = "Enter code"; +"lng_intro_fragment_about" = "Get the code for {phone_number} in the Anonymous Numbers section on Fragment."; +"lng_intro_fragment_button" = "Open Fragment"; + "lng_phone_title" = "Your Phone Number"; "lng_phone_desc" = "Please confirm your country code and\nenter your mobile phone number."; "lng_phone_to_qr" = "Quick log in using QR code"; @@ -227,13 +369,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_code_desc" = "We have sent you a message with activation\ncode to your phone. Please enter it below."; "lng_code_from_telegram" = "Please enter the code you've just received\nin your previous **Telegram** app."; "lng_code_no_telegram" = "Send code via SMS"; -"lng_code_register_phone" = "If you already signed up for Telegram, please enter the code which was sent to your mobile app.\n\nIf you haven’t signed up yet, please register from your phone or tablet first."; "lng_code_call" = "Telegram will call you in {minutes}:{seconds}"; "lng_code_calling" = "Requesting a call from Telegram..."; "lng_code_called" = "Telegram dialed your number"; "lng_bad_phone" = "Invalid phone number. Please try again."; -"lng_bad_phone_noreg" = "Phone number not registered."; "lng_bad_code" = "You have entered an invalid code."; "lng_bad_name" = "Please enter your first and last name."; "lng_bad_photo" = "Sorry, Telegram can't process that type of image."; @@ -250,19 +390,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_signin_bad_password" = "You have entered a wrong password."; "lng_signin_wrong_code" = "You have entered an invalid code."; "lng_signin_try_password" = "Having trouble accessing your email?"; -"lng_signin_password_removed" = "Your cloud password was disabled.\nYou can set up a new one in Settings."; "lng_signin_no_email_forgot" = "Since you didn't provide a recovery email when setting up your password, your remaining options are either to remember your password or to reset your account."; "lng_signin_cant_email_forgot" = "If you can't restore access to the email, your remaining options are either to remember your password or to reset your account."; "lng_signin_reset_account" = "Reset your account"; "lng_signin_sure_reset" = "Warning!\n\nYou will lose all your chats and messages, along with any media and files you shared!\n\nDo you want to reset your account?"; "lng_signin_reset" = "Reset"; "lng_signin_reset_wait" = "Since the account {phone_number} is active and protected by a password, we will delete it in 1 week for security purposes. You can cancel this process at any time.\n\nYou’ll be able to reset your account in:\n{when}"; -"lng_signin_reset_days#one" = "{count} day"; -"lng_signin_reset_days#other" = "{count} days"; -"lng_signin_reset_hours#one" = "{count} hour"; -"lng_signin_reset_hours#other" = "{count} hours"; -"lng_signin_reset_minutes#one" = "{count} minute"; -"lng_signin_reset_minutes#other" = "{count} minutes"; "lng_signin_reset_in_days" = "{days_count} {hours_count} {minutes_count}"; "lng_signin_reset_in_hours" = "{hours_count} {minutes_count}"; "lng_signin_reset_cancelled" = "Your recent attempts to reset this account have been cancelled by its active user. Please try again in 7 days."; @@ -278,59 +411,79 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_dlg_filter" = "Search"; "lng_dlg_new_group_name" = "Group name"; "lng_dlg_new_channel_name" = "Channel name"; -"lng_no_contacts" = "You have no contacts"; +"lng_dlg_new_bot_name" = "Bot name"; "lng_no_chats" = "Your chats will be here"; "lng_no_chats_filter" = "No chats currently belong to this folder."; +"lng_no_saved_sublists" = "You can save messages from other chats here."; "lng_contacts_loading" = "Loading..."; "lng_contacts_not_found" = "No contacts found"; +"lng_topics_not_found" = "No topics found."; "lng_dlg_search_for_messages" = "Search for messages"; "lng_update_telegram" = "Update Telegram"; "lng_dlg_search_in" = "Search messages in"; "lng_dlg_search_from" = "From: {user}"; "lng_settings_save" = "Save"; -"lng_settings_upload" = "Set Profile Photo"; -"lng_settings_crop_profile" = "Select an area for your profile photo"; -"lng_settings_uploading_photo" = "Uploading photo..."; -"lng_settings_edit" = "Edit"; -"lng_settings_drop_area_subtitle" = "to set it as your photo"; +"lng_settings_apply" = "Apply"; "lng_username_title" = "Username"; -"lng_username_about" = "You can choose a username on Telegram.\nIf you do, other people will be able to find\nyou by this username and contact you\nwithout knowing your phone number.\n\nYou can use a-z, 0-9 and underscores.\nMinimum length is 5 characters."; +"lng_username_description1" = "You can choose a username on Telegram. If you do, other people will be able to find you by this username and contact you without knowing your phone number."; +"lng_username_description2" = "You can use **a-z**, **0-9** and **underscores**.\nMinimum length is **5 characters**."; "lng_username_choose" = "Choose your username."; "lng_username_invalid" = "This username is invalid."; "lng_username_occupied" = "This username is already occupied."; "lng_username_too_short" = "This username is too short."; +"lng_username_purchase_available" = "**This username is already taken.** However, it is currently available for purchase. {link}"; +"lng_username_purchase_available_link" = "Learn more..."; "lng_username_bad_symbols" = "Only a-z, 0-9, and underscores allowed."; "lng_username_available" = "This username is available."; "lng_username_not_found" = "User @{user} not found."; -"lng_username_link_willbe" = "This link will open a chat with you:"; +"lng_username_by_phone_not_found" = "User {phone} not found."; +"lng_username_app_not_found" = "Bot application not found."; "lng_username_link" = "This link opens a chat with you:"; "lng_username_copied" = "Link copied to clipboard."; -"lng_bio_title" = "Edit your bio"; +"lng_usernames_edit" = "click to edit"; +"lng_usernames_active" = "active"; +"lng_usernames_non_active" = "non active"; +"lng_usernames_subtitle" = "Usernames order"; +"lng_usernames_activate_error#one" = "Sorry, you can't activate more than **{count}** usernames."; +"lng_usernames_activate_error#other" = "Sorry, you can't activate more than **{count}** usernames."; +"lng_usernames_activate_description" = "Do you want to show this username on your info page?"; +"lng_usernames_activate_confirm" = "Show"; +"lng_channel_usernames_subtitle" = "Links order"; +"lng_usernames_deactivate_description" = "Do you want to hide this username from your info page?"; +"lng_usernames_deactivate_confirm" = "Hide"; +"lng_usernames_description" = "Drag and drop links to change the order in which they will be displayed on your info page."; + +"lng_channel_usernames_activate_description" = "Do you want to show this link on the channel info page?"; +"lng_channel_usernames_deactivate_description" = "Do you want to hide this link from the channel info page?"; +"lng_channel_usernames_description" = "Drag and drop links to change the order in which they will be displayed on the channel info page."; + +"lng_bot_username_title" = "Public Link"; +"lng_bot_username_description1" = "This link cannot be edited. You can acquire additional usernames on {link}."; +"lng_bot_username_description1_link" = "Fragment"; +"lng_bot_usernames_activate_description" = "Do you want to show this link on the bot info page?"; +"lng_bot_usernames_deactivate_description" = "Do you want to hide this link from the bot info page?"; +"lng_bot_usernames_description" = "Drag and drop links to change the order in which they will be displayed on the bot info page."; + "lng_bio_placeholder" = "Bio"; -"lng_bio_about" = "You can add a few lines about yourself. Anyone who opens your profile will see this text."; "lng_settings_section_info" = "My info"; -"lng_settings_username" = "Username:"; -"lng_settings_choose_username" = "Choose username"; -"lng_settings_empty_bio" = "None"; "lng_settings_section_notify" = "Notifications"; "lng_settings_show_from" = "Show notifications from"; "lng_settings_notify_all" = "All accounts"; "lng_settings_notify_all_about" = "Turn this off if you want to receive notifications only from the account you are currently using."; +"lng_settings_notify_global" = "Global settings"; "lng_settings_notify_title" = "Notifications for chats"; "lng_settings_desktop_notify" = "Desktop notifications"; -"lng_settings_show_name" = "Show sender's name"; -"lng_settings_show_preview" = "Show message preview"; "lng_settings_native_title" = "Native notifications"; "lng_settings_use_windows" = "Use Windows notifications"; "lng_settings_use_native_notifications" = "Use native notifications"; "lng_settings_notifications_position" = "Location on the screen"; "lng_settings_notifications_count" = "Notifications count"; -"lng_settings_sound_notify" = "Play sound"; +"lng_settings_sound_allowed" = "Allow sound"; "lng_settings_alert_windows" = "Flash the taskbar icon"; "lng_settings_alert_mac" = "Bounce the dock icon"; "lng_settings_alert_linux" = "Draw attention to the window"; @@ -342,11 +495,45 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_settings_events_pinned" = "Pinned messages"; "lng_settings_notifications_calls_title" = "Calls"; +"lng_notification_preview_title" = "Dino Rex"; +"lng_notification_preview_text" = "It's morning in Tokyo 😎"; +"lng_notification_show_name" = "Name"; +"lng_notification_show_text" = "Text"; "lng_notification_preview" = "You have a new message"; "lng_notification_reply" = "Reply"; "lng_notification_hide_all" = "Hide all"; "lng_notification_sample" = "This is a sample notification"; "lng_notification_reminder" = "Reminder"; +"lng_notification_private_chats" = "Private chats"; +"lng_notification_groups" = "Groups"; +"lng_notification_channels" = "Channels"; +"lng_notification_click_to_change" = "Click here to change"; +"lng_notification_on" = "On, {exceptions}"; +"lng_notification_off" = "Off, {exceptions}"; +"lng_notification_exceptions#one" = "{count} exception"; +"lng_notification_exceptions#other" = "{count} exceptions"; +"lng_notification_exceptions_title" = "Exceptions"; +"lng_notification_title_private_chats" = "Notifications for private chats"; +"lng_notification_about_private_chats#one" = "Please note that **{count} chat** is listed as an exception and won't be affected by this change."; +"lng_notification_about_private_chats#other" = "Please note that **{count} chats** are listed as exceptions and won't be affected by this change."; +"lng_notification_title_groups" = "Notifications for groups"; +"lng_notification_about_groups#one" = "Please note that **{count} group** is listed as an exception and won't be affected by this change."; +"lng_notification_about_groups#other" = "Please note that **{count} groups** are listed as exceptions and won't be affected by this change."; +"lng_notification_title_channels" = "Notifications for channels"; +"lng_notification_about_channels#one" = "Please note that **{count} channel** is listed as an exception and won't be affected by this change."; +"lng_notification_about_channels#other" = "Please note that **{count} channels** are listed as exceptions and won't be affected by this change."; +"lng_notification_exceptions_view" = "View exceptions"; +"lng_notification_enable" = "Enable notifications"; +"lng_notification_sound" = "Sound"; +"lng_notification_tone" = "Notification tone"; +"lng_notification_exceptions_muted" = "Muted"; +"lng_notification_exceptions_unmuted" = "Unmuted"; +"lng_notification_exceptions_add" = "Add an exception"; +"lng_notification_exceptions_clear" = "Delete all exceptions"; +"lng_notification_exceptions_clear_sure" = "Are you sure you want to delete all exceptions?"; +"lng_notification_exceptions_clear_button" = "Delete"; +"lng_notification_exceptions_remove" = "Remove"; +"lng_notification_context_remove" = "Remove exception"; "lng_reaction_text" = "{reaction} to your «{text}»"; "lng_reaction_notext" = "{reaction} to your message"; @@ -358,40 +545,42 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_reaction_voice_message" = "{reaction} to your voice message"; "lng_reaction_contact" = "{reaction} to your contact {name}"; "lng_reaction_location" = "{reaction} to your map"; -"lng_reaction_live_location" = "{reaction} to your live location"; "lng_reaction_poll" = "{reaction} to your poll {title}"; "lng_reaction_quiz" = "{reaction} to your quiz {title}"; "lng_reaction_game" = "{reaction} to your game"; "lng_reaction_invoice" = "{reaction} to your invoice"; "lng_reaction_gif" = "{reaction} to your GIF"; -"lng_settings_section_general" = "General"; -"lng_settings_change_lang" = "Change language"; "lng_languages" = "Languages"; +"lng_languages_none" = "No languages found."; +"lng_languages_count#one" = "{count} language"; +"lng_languages_count#other" = "{count} languages"; "lng_sure_save_language" = "Telegram will restart in order to change language"; "lng_settings_update_automatically" = "Update automatically"; "lng_settings_install_beta" = "Install beta versions"; -"lng_settings_current_version_label" = "Version {version}:"; "lng_settings_current_version" = "Version {version}"; "lng_settings_check_now" = "Check for updates"; "lng_settings_update_checking" = "Checking for updates..."; "lng_settings_latest_installed" = "Latest version is installed"; -"lng_settings_downloading" = "Downloading update {ready} / {total} MB..."; "lng_settings_update_ready" = "New version is ready"; -"lng_settings_update_now" = "Restart Now"; "lng_settings_update_fail" = "Update check failed :("; "lng_settings_workmode_tray" = "Show tray icon"; "lng_settings_workmode_window" = "Show taskbar icon"; "lng_settings_close_to_taskbar" = "Close to taskbar"; +"lng_settings_monochrome_icon" = "Use monochrome icon"; +"lng_settings_window_system" = "Window title"; +"lng_settings_title_chat_name" = "Show chat name"; +"lng_settings_title_account_name" = "Show active account"; +"lng_settings_title_total_count" = "Total unread count"; "lng_settings_native_frame" = "Use system window frame"; +"lng_settings_qt_frame" = "Use Qt window frame"; "lng_settings_auto_start" = "Launch Telegram when system starts"; "lng_settings_start_min" = "Launch minimized"; "lng_settings_auto_start_disabled_uwp" = "Starting with the system was disabled in Windows Settings.\n\nPlease enable Telegram Desktop in the Startup Apps Settings."; "lng_settings_open_system_settings" = "Open Settings"; "lng_settings_add_sendto" = "Place Telegram in \"Send to\" menu"; "lng_settings_mac_warn_before_quit" = "Show warning before quitting with {text}"; -"lng_settings_section_scale" = "Interface Scale"; -"lng_settings_scale_auto" = "Auto ({cur})"; +"lng_settings_mac_round_icon" = "Round application icon"; "lng_settings_experimental" = "Experimental settings"; "lng_settings_experimental_about" = "Warning! Those are experimental settings. Some may not work. Others may break the app. Any of them may disappear in the next version without a trace. Use at your own risk."; @@ -401,20 +590,29 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_settings_section_chat_settings" = "Chat Settings"; "lng_settings_replace_emojis" = "Replace emoji"; "lng_settings_suggest_emoji" = "Suggest emoji replacements"; +"lng_settings_suggest_animated_emoji" = "Suggest animated emoji"; "lng_settings_suggest_by_emoji" = "Suggest popular stickers by emoji"; "lng_settings_loop_stickers" = "Loop animated stickers"; "lng_settings_large_emoji" = "Large emoji"; -"lng_settings_view_emojis" = "View list"; "lng_settings_send_enter" = "Send by Enter"; "lng_settings_send_ctrlenter" = "Send by Ctrl+Enter"; "lng_settings_send_cmdenter" = "Send by Cmd+Enter"; +"lng_settings_chat_quick_action_reply" = "Reply with double click"; +"lng_settings_chat_quick_action_react" = "Send reaction with double click"; +"lng_settings_chat_corner_reaction" = "Reaction button on messages"; + +"lng_settings_chat_reactions_title" = "Quick Reaction"; +"lng_settings_chat_reactions_subtitle" = "Choose your favorite reaction"; +"lng_settings_chat_message_reply_from" = "Bob Harris"; +"lng_settings_chat_message_reply" = "Good morning"; +"lng_settings_chat_message" = "Do you know what time it is?"; "lng_settings_section_filters" = "Folders"; "lng_settings_section_background" = "Chat background"; -"lng_settings_bg_use_default" = "Use default color theme"; "lng_settings_bg_from_gallery" = "Choose from gallery"; "lng_settings_bg_from_file" = "Choose from file"; +"lng_settings_bg_remove" = "Remove wallpaper"; "lng_settings_bg_theme_edit" = "Edit theme"; "lng_settings_bg_theme_create" = "Create new theme"; "lng_settings_bg_cloud_themes" = "Custom themes"; @@ -428,15 +626,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_settings_call_section_input" = "Microphone"; "lng_settings_call_input_device" = "Input device"; "lng_settings_call_output_device" = "Output device"; -"lng_settings_call_input_volume" = "Input volume: {percent}%"; -"lng_settings_call_output_volume" = "Output volume: {percent}%"; -"lng_settings_call_test_mic" = "Test microphone"; -"lng_settings_call_stop_mic_test" = "Stop test"; "lng_settings_call_section_other" = "Other settings"; "lng_settings_call_open_system_prefs" = "Open system sound preferences"; "lng_settings_call_accept_calls" = "Accept calls from this device"; "lng_settings_call_device_default" = "Same as the System"; -"lng_settings_call_audio_ducking" = "Mute other sounds during calls"; + +"lng_settings_section_devices" = "Speakers and Camera"; +"lng_settings_devices_calls" = "Calls and video chats"; +"lng_settings_devices_calls_same" = "Use the same devices for calls"; +"lng_settings_devices_inactive" = "Unavailable"; "lng_settings_language" = "Language"; "lng_settings_default_scale" = "Default interface scale"; @@ -448,21 +646,25 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_settings_calls_peer_to_peer_title" = "Peer-to-peer"; "lng_settings_calls_peer_to_peer_button" = "Use peer-to-peer with"; "lng_settings_groups_invite" = "Groups"; -"lng_settings_group_privacy_about" = "Change who can add you to groups and channels."; "lng_settings_phone_number_privacy" = "Phone number"; "lng_settings_forwards_privacy" = "Forwarded messages"; "lng_settings_profile_photo_privacy" = "Profile photo"; -"lng_settings_sessions_about" = "Control your sessions on other devices."; -"lng_settings_passcode_disable" = "Disable passcode"; -"lng_settings_password_disable" = "Disable cloud password"; +"lng_settings_messages_privacy" = "Messages"; +"lng_settings_voices_privacy" = "Voice messages"; +"lng_settings_bio_privacy" = "Bio"; +"lng_settings_privacy_premium" = "Only subscribers of {link} can restrict receiving voice messages."; +"lng_settings_privacy_premium_link" = "Telegram Premium"; +"lng_settings_passcode_disable" = "Disable Passcode"; +"lng_settings_passcode_disable_sure" = "Are you sure you want to disable passcode?"; +"lng_settings_password_disable" = "Disable Cloud Password"; "lng_settings_password_abort" = "Abort two-step verification setup"; -"lng_settings_password_reenter_email" = "Re-enter recovery email"; "lng_settings_about_bio" = "Any details such as age, occupation or city.\nExample: 23 y.o. designer from San Francisco"; "lng_settings_name_label" = "Name"; "lng_settings_username_label" = "Username"; "lng_settings_phone_label" = "Phone number"; "lng_settings_username_add" = "Add username"; -"lng_settings_close_sure" = "Are you sure you want to close this page? You didn't save your changes."; +"lng_settings_username_about" = "Username lets people contact you on Telegram without needing your phone number."; +"lng_settings_add_account_about" = "You can add up to four accounts with different phone numbers."; "lng_settings_peer_to_peer_about" = "Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may slightly decrease audio quality."; "lng_settings_advanced" = "Advanced"; "lng_settings_stickers_emoji" = "Stickers and emoji"; @@ -475,18 +677,25 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_settings_theme_accent_title" = "Choose accent color"; "lng_settings_data_storage" = "Data and storage"; "lng_settings_information" = "Edit profile"; +"lng_settings_my_account" = "My Account"; +"lng_settings_security" = "Security"; "lng_settings_passcode_title" = "Local passcode"; -"lng_settings_password_title" = "Two-step verification"; "lng_settings_sessions_title" = "Active sessions"; +"lng_settings_sessions_about" = "Review the list of devices where you are logged into your Telegram account."; +"lng_settings_archive_title" = "Archive Settings"; "lng_settings_new_unknown" = "New chats from unknown users"; "lng_settings_auto_archive" = "Archive and Mute"; "lng_settings_auto_archive_about" = "Automatically archive and mute new chats, groups and channels from non-contacts."; +"lng_settings_unmuted_chats" = "Unmuted chats"; +"lng_settings_always_in_archive" = "Always keep archived"; +"lng_settings_unmuted_chats_about" = "Keep archived chats in the Archive even if they are unmuted and get a new message."; +"lng_settings_chats_from_folders" = "Chats from folders"; +"lng_settings_chats_from_folders_about" = "Keep archived chats from folders in the Archive even if they are unmuted and get a new message."; "lng_settings_destroy_title" = "Delete my account"; -"lng_settings_network_proxy" = "Network and proxy"; "lng_settings_version_info" = "Version and updates"; "lng_settings_system_integration" = "System integration"; "lng_settings_performance" = "Performance"; -"lng_settings_enable_animations" = "Enable animations"; +"lng_settings_enable_hwaccel" = "Hardware accelerated video decoding"; "lng_settings_enable_opengl" = "Enable OpenGL rendering for media"; "lng_settings_angle_backend" = "ANGLE graphics backend"; "lng_settings_angle_backend_auto" = "Auto"; @@ -500,6 +709,91 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_settings_sensitive_about" = "Display sensitive media in public channels on all your Telegram devices."; "lng_settings_security_bots" = "Bots and websites"; "lng_settings_clear_payment_info" = "Clear Payment and Shipping Info"; +"lng_settings_logged_in" = "Connected websites"; +"lng_settings_logged_in_title" = "Logged in with Telegram"; +"lng_settings_logged_in_description" = "You can log in on websites that support signing in with Telegram."; +"lng_settings_disconnect_all" = "Disconnect all websites"; +"lng_settings_disconnect_title" = "Disconnect website"; +"lng_settings_disconnect_sure" = "Are you sure you want to disconnect {domain}?"; +"lng_settings_disconnect_block" = "Block {name}"; +"lng_settings_disconnect_all_title" = "Disconnect websites"; +"lng_settings_disconnect_all_sure" = "Are you sure you want to disconnect all websites where you logged in with Telegram?"; +"lng_settings_disconnect" = "Disconnect"; +"lng_settings_connected_title" = "Connected websites"; + +"lng_settings_power_menu" = "Battery and Animations"; +"lng_settings_power_title" = "Power Usage"; +"lng_settings_power_subtitle" = "Power saving options"; +"lng_settings_power_stickers" = "Animated Stickers"; +"lng_settings_power_stickers_panel" = "Autoplay in panel"; +"lng_settings_power_stickers_chat" = "Autoplay in chat"; +"lng_settings_power_emoji" = "Animated Emoji"; +"lng_settings_power_emoji_panel" = "Autoplay in panel"; +"lng_settings_power_emoji_reactions" = "Autoplay in reactions menu"; +"lng_settings_power_emoji_chat" = "Autoplay in messages"; +"lng_settings_power_emoji_status" = "Autoplay in premium status"; +"lng_settings_power_chat" = "Animations in Chats"; +"lng_settings_power_chat_background" = "Background rotation"; +"lng_settings_power_chat_spoiler" = "Animated spoiler effect"; +"lng_settings_power_calls" = "Animations in Calls"; +"lng_settings_power_ui" = "Interface animations"; +"lng_settings_power_auto" = "Save Power on Low Battery"; +"lng_settings_power_auto_about" = "Automatically disable all animations when your laptop is in a battery saving mode."; +"lng_settings_power_turn_off" = "Please turn off Save Power on Low Battery to change these settings."; + +"lng_settings_cloud_password_on" = "On"; +"lng_settings_cloud_password_off" = "Off"; +"lng_settings_cloud_password_start_title" = "Two-Step Verification"; +"lng_settings_cloud_password_password_title" = "Password"; +"lng_settings_cloud_password_hint_title" = "Password Hint"; +"lng_settings_cloud_password_email_title" = "Recovery Email"; +"lng_settings_cloud_password_start_about" = "Protect your Telegram account with an additional password."; +"lng_settings_cloud_password_hint_about" = "You can create a hint for your password."; +"lng_settings_cloud_password_email_about" = "Please enter your new recovery email. It is the only way to recover a forgotten password."; +"lng_settings_cloud_password_password_subtitle" = "Create Password"; +"lng_settings_cloud_password_check_subtitle" = "Your Password"; +"lng_settings_cloud_password_hint_subtitle" = "Add Password Hint"; +"lng_settings_cloud_password_email_subtitle" = "Add Recovery Email"; +"lng_settings_cloud_password_email_recovery_subtitle" = "Password Recovery"; +"lng_settings_cloud_password_manage_about1" = "You have Two-Step Verification enabled, so your account is protected with an additional password."; +"lng_settings_cloud_password_manage_about2" = "This email is the only way to recover a forgotten password."; +"lng_settings_cloud_password_manage_disable_sure" = "Are you sure you want to disable your password?"; +"lng_settings_cloud_password_manage_email_new" = "Set Recovery Email"; +"lng_settings_cloud_password_manage_email_change" = "Change Recovery Email"; +"lng_settings_cloud_password_manage_password_change" = "Change Password"; +"lng_settings_cloud_password_skip_hint" = "Skip hint"; +"lng_settings_cloud_password_save" = "Save and Finish"; +"lng_settings_cloud_password_email_confirm" = "Confirm and Finish"; +"lng_settings_cloud_password_reset_in" = "You can reset your password in {duration}."; + +"lng_settings_ttl_title" = "Auto-Delete Messages"; +"lng_settings_ttl_about" = "Automatically delete messages for everyone after a period of time in all new chats you start."; +"lng_settings_ttl_after" = "After {after_duration}"; +"lng_settings_ttl_after_hours#one" = "{count} hour"; +"lng_settings_ttl_after_hours#other" = "{count} hours"; +"lng_settings_ttl_after_days#one" = "{count} day"; +"lng_settings_ttl_after_days#other" = "{count} days"; +"lng_settings_ttl_after_weeks#one" = "{count} week"; +"lng_settings_ttl_after_weeks#other" = "{count} weeks"; +"lng_settings_ttl_after_months#one" = "{count} month"; +"lng_settings_ttl_after_months#other" = "{count} months"; +"lng_settings_ttl_after_years#one" = "{count} year"; +"lng_settings_ttl_after_years#other" = "{count} years"; +"lng_settings_ttl_after_off" = "Off"; +"lng_settings_ttl_after_custom" = "Set Custom Time"; +"lng_settings_ttl_after_about" = "If enabled, all new messages in chats you start will be automatically deleted for everyone at some point after they have been sent. You can also {link}."; +"lng_settings_ttl_after_about_link" = "apply this setting for your existing chats"; +"lng_settings_ttl_after_subtitle" = "Self-destruct timer"; +"lng_settings_ttl_after_sure" = "Are you sure you want all messages in new chats started by you to be automatically deleted for everyone {after_duration} after they have been sent?"; +"lng_settings_ttl_after_toast" = "Messages in all new chats you start will be automatically deleted after {after_duration}."; + +"lng_settings_ttl_select_chats_sorry" = "Sorry, you can't set self-destruct timer for this chat."; +"lng_settings_ttl_select_chats_status" = "auto-delete after {after_duration}"; +"lng_settings_ttl_select_chats_status_disabled" = "auto-deletion disabled"; +"lng_settings_ttl_select_chats_toast#one" = "Self-destruct timer for {duration} has been enabled in {count} selected chat."; +"lng_settings_ttl_select_chats_toast#other" = "Self-destruct timer for {duration} has been enabled in {count} selected chats."; +"lng_settings_ttl_select_chats_disabled_toast#one" = "Self-destruct timer has been disabled in {count} selected chat."; +"lng_settings_ttl_select_chats_disabled_toast#other" = "Self-destruct timer has been disabled in {count} selected chats."; "lng_clear_payment_info_title" = "Clear payment info"; "lng_clear_payment_info_sure" = "Are you sure you want to clear your payment and shipping info?"; @@ -508,11 +802,33 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_clear_payment_info_clear" = "Clear"; "lng_clear_payment_info_confirm" = "Delete your shipping info and instruct all payment providers to remove your saved credit cards? Note that Telegram never stores your credit card data."; +"lng_settings_theme_settings" = "Theme settings"; +"lng_settings_theme_name_color" = "Your name color"; "lng_settings_auto_night_mode" = "Auto-Night mode"; -"lng_settings_auto_night_enabled" = "Match the system settings"; +"lng_settings_auto_night_mode_off" = "Off"; +"lng_settings_auto_night_mode_on" = "System"; "lng_settings_auto_night_warning" = "You have enabled auto-night mode. If you want to change the dark mode settings, you'll need to disable it first."; "lng_settings_auto_night_disable" = "Disable"; +"lng_settings_color_title" = "Color preview"; +"lng_settings_color_reply" = "Reply to your message"; +"lng_settings_color_reply_channel" = "Reply to your channel message"; +"lng_settings_color_text" = "Your name and replies to your messages will be shown in the selected color."; +"lng_settings_color_text_channel" = "The name of the channel and replies to its messages will be shown in the selected color."; +"lng_settings_color_link_name" = "Telegram"; +"lng_settings_color_link_title" = "Link Preview"; +"lng_settings_color_link_description" = "Your selected color will also tint the link preview."; +"lng_settings_color_about" = "You can choose a color to tint your name, the links you send, and replies to your messages."; +"lng_settings_color_about_channel" = "You can choose a color to tint your channel's name, the links it sends, and replies to its messages."; +"lng_settings_color_emoji" = "Add icons to replies"; +"lng_settings_color_emoji_remove" = "Remove icon"; +"lng_settings_color_emoji_off" = "Off"; +"lng_settings_color_emoji_about" = "Make replies to your messages stand out by adding custom patterns to them."; +"lng_settings_color_emoji_about_channel" = "Make replies to your channel's messages stand out by adding custom patterns to them."; +"lng_settings_color_subscribe" = "Subscribe to {link} to choose a custom color for your name."; +"lng_settings_color_changed" = "Your name color has been updated!"; +"lng_settings_color_changed_channel" = "Your channel color has been updated!"; + "lng_suggest_hide_new_title" = "Hide new chats?"; "lng_suggest_hide_new_about" = "You are receiving lots of new chats from users who are not in your Contact List.\n\nDo you want to have such chats **automatically muted** and **archived**?"; "lng_suggest_hide_new_to_settings" = "Go to Settings"; @@ -525,7 +841,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_settings_manage_enabled_dictionary" = "Dictionary is enabled"; "lng_settings_manage_remove_dictionary" = "Remove Dictionary"; -"lng_backgrounds_header" = "Choose your new chat background"; +"lng_settings_gift_premium" = "Premium Gifting"; +"lng_settings_gift_premium_users_confirm" = "Proceed"; +"lng_settings_gift_premium_users_error#one" = "You can select maximum {count} user."; +"lng_settings_gift_premium_users_error#other" = "You can select maximum {count} users."; + +"lng_backgrounds_header" = "Choose Wallpaper"; "lng_theme_sure_keep" = "Keep this theme?"; "lng_theme_reverting#one" = "Reverting to the old theme in {count} second."; "lng_theme_reverting#other" = "Reverting to the old theme in {count} seconds."; @@ -540,29 +861,35 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_background_text1" = "Ah, you kids today with techno music! You should enjoy the classics, like Hasselhoff!"; "lng_background_text2" = "I can't even take you seriously right now."; "lng_background_bad_link" = "This background link appears to be invalid."; -"lng_background_gradient_unsupported" = "Telegram Desktop doesn't support gradient backgrounds yet."; -"lng_background_apply" = "Apply"; "lng_background_share" = "Share"; "lng_background_link_copied" = "Link copied to clipboard"; "lng_background_blur" = "Blurred"; "lng_background_sure_delete" = "Are you sure you want to delete this background?"; +"lng_background_other_info" = "{user} will be able to apply this wallpaper"; +"lng_background_other_channel" = "All subscribers will see this wallpaper"; +"lng_background_other_group" = "All members will see this wallpaper"; +"lng_background_apply1" = "Apply the wallpaper in this chat."; +"lng_background_apply2" = "Enjoy the view."; +"lng_background_apply_button" = "Apply For This Chat"; +"lng_background_dimming" = "Background dimming"; +"lng_background_sure_reset_default" = "Are you sure you want to reset the wallpaper?"; +"lng_background_reset_default" = "Reset"; +"lng_background_apply_me" = "Apply for me"; +"lng_background_apply_both" = "Apply for me and {user}"; +"lng_background_apply_channel" = "Apply For Channel"; +"lng_background_apply_group" = "Apply For Group"; "lng_download_path_ask" = "Ask download path for each file"; "lng_download_path" = "Download path"; "lng_download_path_temp" = "Temp folder"; "lng_download_path_default" = "Default folder"; -"lng_download_path_clear" = "Clear all"; "lng_download_path_header" = "Choose download path"; "lng_download_path_default_radio" = "Telegram folder in system «Downloads»"; "lng_download_path_temp_radio" = "Temp folder, cleared on logout or uninstall"; "lng_download_path_dir_radio" = "Custom folder, cleared only manually"; "lng_download_path_choose" = "Choose download path"; -"lng_sure_clear_downloads" = "Do you want to remove all downloaded files from temp folder? It is done automatically on logout or program uninstall."; -"lng_download_path_failed" = "File download could not be started.\n\nThis might be because the download location you've selected is invalid. Try changing the \"Download path\" in Settings."; -"lng_download_path_settings" = "Settings"; +"lng_download_path_failed" = "File download could not be started.\n\nThe default download location will be used now. You can always change it in Settings > Advanced > Download Path.\n\nPlease try once again."; "lng_download_finish_failed" = "File download could not be finished.\n\nWould you like to try again?"; -"lng_download_path_clearing" = "Clearing..."; -"lng_download_path_cleared" = "Cleared!"; "lng_settings_section_privacy" = "Privacy and Security"; @@ -582,40 +909,29 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_local_storage_size_limit" = "Total size limit: {size}"; "lng_local_storage_media_limit" = "Media cache limit: {size}"; "lng_local_storage_time_limit" = "Clear files older than: {limit}"; -"lng_local_storage_limit_weeks#one" = "{count} week"; -"lng_local_storage_limit_weeks#other" = "{count} weeks"; -"lng_local_storage_limit_months#one" = "{count} month"; -"lng_local_storage_limit_months#other" = "{count} months"; "lng_local_storage_limit_never" = "Never"; "lng_local_storage_summary" = "Summary"; "lng_local_storage_clear_some" = "Clear"; "lng_local_storage_clear" = "Clear all"; "lng_local_storage_clearing" = "Clearing..."; -"lng_settings_section_advanced_settings" = "Advanced Settings"; -"lng_settings_enable_night_theme" = "Enable night mode"; -"lng_settings_disable_night_theme" = "Disable night mode"; - "lng_passcode_remove_button" = "Remove"; -"lng_passcode_turn_on" = "Turn on local passcode"; -"lng_passcode_change" = "Change local passcode"; +"lng_passcode_change" = "Change Passcode"; "lng_passcode_create" = "Local passcode"; "lng_passcode_remove" = "Remove local passcode"; -"lng_passcode_turn_off" = "Turn off"; "lng_passcode_autolock" = "Auto-Lock"; "lng_passcode_autolock_away" = "Auto-Lock if away for..."; "lng_passcode_autolock_inactive" = "Auto-Lock if inactive for..."; -"lng_passcode_autolock_minutes#one" = "{count} minute"; -"lng_passcode_autolock_minutes#other" = "{count} minutes"; -"lng_passcode_autolock_hours#one" = "{count} hour"; -"lng_passcode_autolock_hours#other" = "{count} hours"; "lng_passcode_autolock_hours_minutes" = "{hours_count}h {minutes_count}m"; "lng_passcode_enter_old" = "Enter current passcode"; "lng_passcode_enter_first" = "Enter a passcode"; "lng_passcode_enter_new" = "Enter new passcode"; "lng_passcode_confirm_new" = "Re-enter new passcode"; "lng_passcode_about" = "When a local passcode is set, a lock icon appears at the top of your chats list. Click it to lock the app.\n\nNote: if you forget your local passcode, you'll need to relogin in Telegram Desktop."; +"lng_passcode_about1" = "When a local passcode is set, a lock icon appears at the top of your chats list."; +"lng_passcode_about2" = "Click it to lock Telegram Desktop."; +"lng_passcode_about3" = "Note: if you forget your passcode, you'll need to log out of Telegram Desktop and log in again."; "lng_passcode_differ" = "Passcodes are different"; "lng_passcode_wrong" = "Wrong passcode"; "lng_passcode_is_same" = "Passcode was not changed"; @@ -623,31 +939,31 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_passcode_ph" = "Your passcode"; "lng_passcode_submit" = "Submit"; "lng_passcode_logout" = "Log out"; -"lng_passcode_need_unblock" = "You need to unlock me first."; +"lng_passcode_create_button" = "Save Passcode"; +"lng_passcode_check_button" = "Submit"; +"lng_passcode_change_button" = "Save Passcode"; +"lng_passcode_create_title" = "Create Local Passcode"; +"lng_passcode_check_title" = "Enter Passcode"; +"lng_passcode_change_title" = "Enter Passcode"; "lng_cloud_password_waiting_code" = "Confirmation code sent to {email}..."; "lng_cloud_password_confirm" = "Confirm recovery email"; "lng_cloud_password_change" = "Change cloud password"; "lng_cloud_password_create" = "Cloud password"; "lng_cloud_password_remove" = "Remove cloud password"; -"lng_cloud_password_set" = "Enable two-step verification"; -"lng_cloud_password_edit" = "Change cloud password"; -"lng_cloud_password_reset_in" = "Reset password in"; "lng_cloud_password_reset_ready" = "Reset password"; -"lng_cloud_password_reset_cancel" = "Cancel password reset"; "lng_cloud_password_enter_old" = "Enter current password"; "lng_cloud_password_enter_first" = "Enter a password"; -"lng_cloud_password_enter_new" = "Enter new password"; -"lng_cloud_password_confirm_new" = "Re-enter new password"; -"lng_cloud_password_hint" = "Enter password hint"; +"lng_cloud_password_enter_new" = "Enter password"; +"lng_cloud_password_confirm_new" = "Re-enter password"; +"lng_cloud_password_hint" = "Enter Password Hint"; "lng_cloud_password_change_hint" = "Enter new password hint"; "lng_cloud_password_bad" = "Password and hint cannot be the same."; -"lng_cloud_password_email" = "Enter recovery email"; +"lng_cloud_password_email" = "Enter Email"; "lng_cloud_password_bad_email" = "Incorrect email, please try other."; "lng_cloud_password_about" = "This password will be asked when you log in on a new device in addition to the SMS code."; "lng_cloud_password_about_recover" = "Warning! Are you sure you don't want to\nadd a password recovery email?\n\nIf you forget your password, you will\nlose access to your Telegram account."; "lng_cloud_password_skip_email" = "Skip email"; -"lng_cloud_password_almost" = "A confirmation link was sent to the\nemail you provided. Two-step verification will be enabled as soon as you follow that link."; "lng_cloud_password_was_set" = "Two-step verification enabled."; "lng_cloud_password_updated" = "Your cloud password was updated."; "lng_cloud_password_removed" = "Two-step verification was disabled."; @@ -657,22 +973,18 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_cloud_password_passport_losing" = "Warning! All data saved in your Telegram Passport will be lost!"; "lng_cloud_password_resend" = "Resend code"; "lng_cloud_password_resent" = "Code was resent."; -"lng_cloud_password_reset_title" = "Reset password"; "lng_cloud_password_reset_no_email" = "Since you didn't provide a recovery email when setting up your password, your remaining options are either to remember your password or wait 7 days until your password is reset."; "lng_cloud_password_reset_with_email" = "If you don't have access to your recovery email, your remaining options are either to remember your password or wait 7 days until your password resets."; "lng_cloud_password_reset_ok" = "Reset"; "lng_cloud_password_reset_cancel_title" = "Cancel reset"; "lng_cloud_password_reset_cancel_sure" = "Cancel the password reset process? If you request a new reset later, it will take another 7 days."; "lng_cloud_password_reset_later" = "You recently requested a password reset that was cancelled. Please wait {duration} before making a new request."; +"lng_cloud_password_expired" = "Please re-enter your password."; "lng_connection_auto_connecting" = "Default (connecting...)"; "lng_connection_auto" = "Default ({transport} used)"; "lng_connection_proxy_connecting" = "Connecting through proxy..."; "lng_connection_proxy" = "{transport} with proxy"; -"lng_connection_header" = "Connection type"; -"lng_connection_auto_rb" = "Auto (TCP if available or HTTP)"; -"lng_connection_http_proxy_rb" = "HTTP with custom http-proxy"; -"lng_connection_tcp_proxy_rb" = "TCP with custom socks5-proxy"; "lng_connection_try_ipv6" = "Try connecting through IPv6"; "lng_connection_host_ph" = "Hostname"; "lng_connection_port_ph" = "Port"; @@ -715,11 +1027,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_settings_show_sessions" = "Show all sessions"; "lng_settings_export_data" = "Export Telegram data"; "lng_settings_destroy_if" = "If away for..."; -"lng_settings_change_phone" = "Change phone number"; "lng_settings_terminate_title" = "Terminate old sessions"; "lng_settings_terminate_if" = "If inactive for..."; -"lng_settings_reset" = "Terminate all other sessions"; "lng_settings_reset_sure" = "Are you sure you want to terminate\nall other sessions?"; "lng_settings_reset_one_sure" = "Do you want to terminate this session?"; "lng_settings_reset_button" = "Terminate"; @@ -732,6 +1042,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_settings_faq_button" = "Go to FAQ"; "lng_settings_ask_ok" = "Ask a Volunteer"; "lng_settings_faq" = "Telegram FAQ"; +"lng_settings_features" = "Telegram Features"; "lng_settings_logout" = "Log Out"; "lng_sure_logout" = "Are you sure you want to log out?"; @@ -750,6 +1061,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_sessions_terminate" = "Terminate Session"; "lng_sessions_application" = "Application"; "lng_sessions_system" = "System version"; +"lng_sessions_browser" = "Browser"; "lng_sessions_ip" = "IP address"; "lng_sessions_location" = "Location"; "lng_sessions_location_about" = "This location is based only on the IP address and may not always be accurate."; @@ -767,10 +1079,16 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_blocked_list_confirm_text" = "Do you want to block {name} from messaging and calling you on Telegram?"; "lng_blocked_list_confirm_clear" = "Delete this chat"; "lng_blocked_list_confirm_ok" = "Block"; +"lng_blocked_list_empty_title" = "No blocked users"; +"lng_blocked_list_empty_description" = "You haven't blocked anyone yet."; +"lng_blocked_list_subtitle#one" = "{count} blocked user"; +"lng_blocked_list_subtitle#other" = "{count} blocked users"; "lng_edit_privacy_everyone" = "Everybody"; "lng_edit_privacy_contacts" = "My contacts"; +"lng_edit_privacy_close_friends" = "Close friends"; "lng_edit_privacy_nobody" = "Nobody"; +"lng_edit_privacy_premium" = "Premium users"; "lng_edit_privacy_exceptions" = "Add exceptions"; "lng_edit_privacy_exceptions_count#one" = "{count} user"; @@ -797,6 +1115,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_edit_privacy_lastseen_exceptions" = "These settings will override the values above."; "lng_edit_privacy_lastseen_always_title" = "Always share with"; "lng_edit_privacy_lastseen_never_title" = "Never share with"; +"lng_edit_lastseen_hide_read_time" = "Hide read time"; +"lng_edit_lastseen_hide_read_time_about" = "Hide the time when you read messages from people who can't see your last seen. If you turn this on, their read time will also be hidden from you. This setting does not affect group chats."; +"lng_edit_lastseen_subscribe" = "Subscribe to Telegram Premium"; +"lng_edit_lastseen_subscribe_about" = "If you subscribe to Premium, you will see other users' last seen and read time even if you hid yours from them (unless they specifically restricted it)."; "lng_edit_privacy_groups_title" = "Group invite settings"; "lng_edit_privacy_groups_header" = "Who can invite you to groups and channels"; @@ -806,6 +1128,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_edit_privacy_groups_always_title" = "Always allow"; "lng_edit_privacy_groups_never_title" = "Never allow"; +"lng_edit_privacy_about_title" = "Bio privacy settings"; +"lng_edit_privacy_about_header" = "Who can see my bio"; +"lng_edit_privacy_about_always_empty" = "Always allow"; +"lng_edit_privacy_about_never_empty" = "Never allow"; +"lng_edit_privacy_about_exceptions" = "These users will or will not be able to see your profile bio regardless of the settings above."; +"lng_edit_privacy_about_always_title" = "Always allow"; +"lng_edit_privacy_about_never_title" = "Never allow"; + "lng_edit_privacy_calls_title" = "Voice calls privacy"; "lng_edit_privacy_calls_header" = "Who can call you"; "lng_edit_privacy_calls_always_empty" = "Always allow"; @@ -832,6 +1162,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_edit_privacy_forwards_always_empty" = "Always allow"; "lng_edit_privacy_forwards_never_empty" = "Never allow"; "lng_edit_privacy_forwards_exceptions" = "These settings will override the values above."; +"lng_edit_privacy_forwards_exceptions_everyone" = "You can add users or entire groups which will not see your profile photo."; +"lng_edit_privacy_forwards_exceptions_nobody" = "Add users or entire groups which will still see your profile photo."; "lng_edit_privacy_forwards_always_title" = "Always allow"; "lng_edit_privacy_forwards_never_title" = "Never allow"; "lng_edit_privacy_forwards_sample_message" = "Reinhardt, we need to find you some new tunes 🎶"; @@ -843,131 +1175,180 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_edit_privacy_profile_photo_header" = "Who can see my profile photo"; "lng_edit_privacy_profile_photo_always_empty" = "Always allow"; "lng_edit_privacy_profile_photo_never_empty" = "Never allow"; -"lng_edit_privacy_profile_photo_exceptions" = "These settings will override the values above."; "lng_edit_privacy_profile_photo_always_title" = "Always allow"; "lng_edit_privacy_profile_photo_never_title" = "Never allow"; +"lng_edit_privacy_profile_photo_public_set" = "Set Public Photo"; +"lng_edit_privacy_profile_photo_public_update" = "Update Public Photo"; +"lng_edit_privacy_profile_photo_public_remove" = "Remove Public Photo"; +"lng_edit_privacy_profile_photo_public_about" = "You can upload a public photo for those who are restricted from viewing your real profile photo."; + +"lng_edit_privacy_voices_title" = "Voice messages settings"; +"lng_edit_privacy_voices_header" = "Who can send me voice messages"; +"lng_edit_privacy_voices_always_empty" = "Always allow"; +"lng_edit_privacy_voices_never_empty" = "Never allow"; +"lng_edit_privacy_voices_exceptions" = "These users will or will not be able to send voice and video messages to you regardless of the settings above."; +"lng_edit_privacy_voices_always_title" = "Always allow"; +"lng_edit_privacy_voices_never_title" = "Never allow"; + +"lng_messages_privacy_title" = "Messages"; +"lng_messages_privacy_subtitle" = "Who can send me messages?"; +"lng_messages_privacy_everyone" = "Everybody"; +"lng_messages_privacy_restricted" = "My Contacts and Premium Users"; +"lng_messages_privacy_about" = "You can restrict incoming messages to only contacts and Premium users."; +"lng_messages_privacy_premium_button" = "Subscribe to Telegram Premium"; +"lng_messages_privacy_premium_about" = "Subscribe now to change this setting and get access to other exclusive features of Telegram Premium."; +"lng_messages_privacy_premium" = "Only subscribers of {link} can select this option."; +"lng_messages_privacy_premium_link" = "Telegram Premium"; "lng_self_destruct_title" = "Account self-destruction"; "lng_self_destruct_description" = "If you don't come online at least once within this period, your account will be deleted along with all groups, messages and contacts."; "lng_self_destruct_sessions_title" = "Session termination"; "lng_self_destruct_sessions_description" = "If you don't come online from a specific session at least once within this period, it will be terminated."; -"lng_self_destruct_weeks#one" = "{count} week"; -"lng_self_destruct_weeks#other" = "{count} weeks"; -"lng_self_destruct_months#one" = "{count} month"; -"lng_self_destruct_months#other" = "{count} months"; -"lng_self_destruct_years#one" = "{count} year"; -"lng_self_destruct_years#other" = "{count} years"; -"lng_change_phone_title" = "Change phone number"; -"lng_change_phone_about" = "You can change your Telegram number\nhere. Your account and all your cloud data\n— messages, media, contacts, etc. will be\nmoved to the new number.\n\n**Important**: all your Telegram contacts will\nget your **new number** added to their address\nbook, provided they had your old number and\nyou haven't blocked them in Telegram."; -"lng_change_phone_warning" = "All your Telegram contacts will get your new number added to their address book, provided they had your old number and you haven't blocked them in Telegram."; -"lng_change_phone_occupied" = "The number {phone} is already connected to a Telegram account. Please delete that account before migrating to the new number."; -"lng_change_phone_button" = "Change number"; -"lng_change_phone_new_title" = "Enter new number"; -"lng_change_phone_new_description" = "We will send an SMS with a confirmation code to your new number."; "lng_change_phone_new_submit" = "Submit"; "lng_change_phone_code_title" = "Enter code"; -"lng_change_phone_code_description" = "We've sent an SMS with a confirmation code to your phone {phone}."; -"lng_change_phone_success" = "Your phone number has been changed."; +"lng_change_phone_error" = "You can only change your phone number using mobile Telegram apps. Please use an official Telegram app on your phone to update your number."; -"lng_mute_duration_hours#one" = "For {count} hour"; -"lng_mute_duration_hours#other" = "For {count} hours"; -"lng_mute_duration_days#one" = "For {count} day"; -"lng_mute_duration_days#other" = "For {count} days"; -"lng_mute_duration_forever" = "Forever"; -"lng_mute_box_tip" = "Choose for how long you would like to turn off notifications for the following chat"; +"lng_mute_menu_mute" = "Mute"; +"lng_mute_menu_unmute" = "Unmute"; +"lng_mute_menu_duration_any" = "Mute for {duration}"; +"lng_mute_menu_duration" = "Mute for..."; +"lng_mute_menu_duration_forever" = "Mute forever"; +"lng_mute_menu_duration_unmute" = "Unmute"; +"lng_mute_menu_sound_on" = "Enable sound"; +"lng_mute_menu_sound_off" = "Disable sound"; +"lng_mute_menu_sound_select" = "Select sound"; +"lng_mute_box_title" = "Mute notifications for..."; "lng_preview_loading" = "Getting Link Info..."; +"lng_preview_cant" = "Could not generate preview for this link."; "lng_profile_settings_section" = "Settings"; -"lng_profile_actions_section" = "Actions"; "lng_profile_bot_settings" = "Bot Settings"; "lng_profile_bot_help" = "Bot Help"; "lng_profile_bot_privacy" = "Bot Privacy Policy"; -"lng_profile_invite_link_section" = "Invite link"; -"lng_profile_create_public_link" = "Create public link"; -"lng_profile_edit_public_link" = "Edit public link"; -"lng_profile_search_members" = "Search members"; "lng_profile_common_groups#one" = "{count} group in common"; "lng_profile_common_groups#other" = "{count} groups in common"; +"lng_profile_similar_channels#one" = "{count} similar channel"; +"lng_profile_similar_channels#other" = "{count} similar channels"; +"lng_profile_saved_messages#one" = "{count} saved message"; +"lng_profile_saved_messages#other" = "{count} saved messages"; "lng_profile_participants_section" = "Members"; "lng_profile_subscribers_section" = "Subscribers"; -"lng_profile_mobile_number" = "Mobile:"; -"lng_profile_username" = "Username:"; -"lng_profile_link" = "Link:"; -"lng_profile_bio" = "Bio:"; "lng_profile_add_contact" = "Add Contact"; -"lng_profile_edit_contact" = "Edit"; "lng_profile_clear_and_exit" = "Delete and exit"; "lng_profile_leave_channel" = "Leave channel"; "lng_profile_delete_channel" = "Delete channel"; "lng_profile_leave_group" = "Leave group"; "lng_profile_delete_group" = "Delete group"; "lng_profile_report" = "Report"; -"lng_profile_search_messages" = "Search for messages"; "lng_profile_block_bot" = "Stop and block bot"; "lng_profile_restart_bot" = "Restart bot"; "lng_profile_invite_to_group" = "Add to Group"; -"lng_profile_delete_contact" = "Delete"; -"lng_profile_set_group_photo" = "Set Photo"; +"lng_profile_add_bot_as_admin" = "Add to Group or Channel"; +"lng_profile_invite_to_channel" = "Add to Channel"; +"lng_profile_invite_to_group_about" = "This bot is able to manage a group."; +"lng_profile_invite_to_channel_about" = "This bot is able to manage a channel."; +"lng_profile_add_bot_as_admin_about" = "This bot is able to manage a group or channel."; "lng_profile_add_participant" = "Add Members"; "lng_profile_add_via_link" = "Invite via Link"; +"lng_profile_hide_participants" = "Hide Members"; +"lng_profile_hide_participants_about" = "Switch this on to hide the list of members in this group. Admins will remain visible."; "lng_profile_view_channel" = "View Channel"; "lng_profile_view_discussion" = "View discussion"; "lng_profile_join_channel" = "Join Channel"; "lng_profile_join_group" = "Join Group"; -"lng_profile_delete_and_exit" = "Leave"; +"lng_profile_apply_to_join_group" = "Apply to Join Group"; "lng_profile_kick" = "Remove"; "lng_profile_delete_removed" = "Delete"; "lng_profile_sure_kick" = "Remove {user} from the group?"; "lng_profile_sure_kick_channel" = "Remove {user} from the channel?"; "lng_profile_sure_remove_admin" = "Remove {user} from admins?"; "lng_profile_loading" = "Loading..."; +"lng_profile_saved_stories#one" = "{count} saved story"; +"lng_profile_saved_stories#other" = "{count} saved stories"; +"lng_profile_posts#one" = "{count} post"; +"lng_profile_posts#other" = "{count} posts"; "lng_profile_photos#one" = "{count} photo"; "lng_profile_photos#other" = "{count} photos"; -"lng_profile_photos_header" = "Photos"; "lng_profile_gifs#one" = "{count} GIF"; "lng_profile_gifs#other" = "{count} GIFs"; -"lng_profile_gifs_header" = "GIFs"; "lng_profile_videos#one" = "{count} video"; "lng_profile_videos#other" = "{count} videos"; -"lng_profile_videos_header" = "Videos"; "lng_profile_songs#one" = "{count} audio file"; "lng_profile_songs#other" = "{count} audio files"; -"lng_profile_songs_header" = "Audio files"; "lng_profile_files#one" = "{count} file"; "lng_profile_files#other" = "{count} files"; -"lng_profile_files_header" = "Files"; "lng_profile_audios#one" = "{count} voice message"; "lng_profile_audios#other" = "{count} voice messages"; -"lng_profile_audios_header" = "Voice messages"; "lng_profile_shared_links#one" = "{count} shared link"; "lng_profile_shared_links#other" = "{count} shared links"; -"lng_profile_shared_links_header" = "Shared links"; "lng_profile_copy_phone" = "Copy Phone Number"; "lng_profile_copy_fullname" = "Copy Name"; -"lng_profile_drop_area_title" = "Drop your image here"; -"lng_profile_drop_area_subtitle" = "to set it as a group photo"; -"lng_profile_drop_area_subtitle_channel" = "to set it as a channel photo"; -"lng_profile_top_bar_share_contact" = "Share"; +"lng_profile_photo_by_you" = "photo set by you"; +"lng_profile_public_photo" = "public photo"; + +"lng_via_link_group_one" = "**{user}** restricts adding them to groups.\nYou can send them an invite link as message instead."; +"lng_via_link_group_many#one" = "**{count} user** restricts adding them to groups.\nYou can send them an invite link as message instead."; +"lng_via_link_group_many#other" = "**{count} users** restrict adding them to groups.\nYou can send them an invite link as message instead."; +"lng_via_link_channel_one" = "**{user}** restricts adding them to channels.\nYou can send them an invite link as message instead."; +"lng_via_link_channel_many#one" = "**{count} user** restricts adding them to channels.\nYou can send them an invite link as message instead."; +"lng_via_link_channel_many#other" = "**{count} users** restrict adding them to channels.\nYou can send them an invite link as message instead."; +"lng_via_link_send" = "Send Invite Link"; +"lng_via_link_cant" = "You can't create a link"; +"lng_via_link_cant_one" = "**{user}** can only by invited via link, but you don't have permission to share invite links to this group."; +"lng_via_link_cant_many#one" = "**{count} user** can only by invited via link, but you don't have permission to share invite links to this group."; +"lng_via_link_cant_many#other" = "**{count} users** can only by invited via link, but you don't have permission to share invite links to this group."; +"lng_via_link_shared_one" = "Link shared with **{user}**."; +"lng_via_link_shared_many#one" = "Link shared with **{count} user**."; +"lng_via_link_shared_many#other" = "Link shared with **{count} users**."; -"lng_profile_info_section" = "Info"; -"lng_info_tab_media" = "Media"; "lng_info_mobile_label" = "Mobile"; +"lng_info_mobile_context_menu_fragment_about" = "This number is not tied to a SIM card and was acquired on {link}."; +"lng_info_mobile_context_menu_fragment_about_link" = "Fragment"; "lng_info_mobile_hidden" = "Hidden"; "lng_info_username_label" = "Username"; +"lng_info_usernames_label" = "also"; "lng_info_bio_label" = "Bio"; "lng_info_link_label" = "Link"; "lng_info_location_label" = "Location"; "lng_info_about_label" = "About"; +"lng_info_work_open" = "Open"; +"lng_info_work_closed" = "Closed"; +"lng_info_hours_label" = "Business hours"; +"lng_info_hours_closed" = "closed"; +"lng_info_hours_opens_in_minutes#one" = "opens in {count} minute"; +"lng_info_hours_opens_in_minutes#other" = "opens in {count} minutes"; +"lng_info_hours_opens_in_hours#one" = "opens in {count} hour"; +"lng_info_hours_opens_in_hours#other" = "opens in {count} hours"; +"lng_info_hours_opens_in_days#one" = "opens in {count} day"; +"lng_info_hours_opens_in_days#other" = "opens in {count} days"; +"lng_info_hours_open_full" = "open 24 hours"; +"lng_info_hours_next_day" = "{time} (next day)"; +"lng_info_hours_local_time" = "local time"; +"lng_info_hours_my_time" = "my time"; "lng_info_user_title" = "User Info"; "lng_info_bot_title" = "Bot Info"; "lng_info_group_title" = "Group Info"; "lng_info_channel_title" = "Channel Info"; +"lng_info_topic_title" = "Topic Info"; "lng_profile_enable_notifications" = "Notifications"; "lng_profile_send_message" = "Send Message"; "lng_info_add_as_contact" = "Add to contacts"; "lng_profile_shared_media" = "Shared media"; +"lng_profile_suggest_photo" = "Suggest Profile Photo"; +"lng_profile_set_photo_for" = "Set Profile Photo"; +"lng_profile_photo_reset" = "Reset to Original"; +"lng_profile_suggest_sure" = "You can suggest {user} to set this photo for their page."; +"lng_profile_suggest_button" = "Suggest"; +"lng_profile_set_personal_sure" = "Only you will see this photo and it will replace any photo {user} sets for themselves."; +"lng_profile_accept_photo_sure" = "{user} suggests you to use this profile photo for your Telegram account."; +"lng_profile_set_photo_button" = "Set Photo"; +"lng_profile_accept_video_sure" = "{user} suggests you to use this profile video for your Telegram account."; +"lng_profile_set_video_button" = "Set Video"; +"lng_profile_changed_photo_title" = "Photo updated"; +"lng_profile_changed_photo_about" = "You can change it in {link}."; +"lng_profile_changed_photo_link" = "Settings"; "lng_media_type_photos" = "Photos"; "lng_media_type_gifs" = "GIFs"; "lng_media_type_videos" = "Videos"; @@ -977,7 +1358,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_media_type_links" = "Shared links"; "lng_media_type_rounds" = "Video messages"; "lng_profile_common_groups_section" = "Groups in common"; -"lng_profile_share_contact" = "Share Contact"; "lng_info_edit_contact" = "Edit contact"; "lng_info_delete_contact" = "Delete contact"; "lng_info_share_contact" = "Share contact"; @@ -985,8 +1365,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_profile_delete_conversation" = "Delete conversation"; "lng_profile_block_user" = "Block user"; "lng_profile_unblock_user" = "Unblock user"; -"lng_profile_export_chat" = "Export chat history"; -"lng_profile_export_channel" = "Export channel history"; +"lng_profile_export_chat" = "Export history"; +"lng_profile_gift_premium" = "Gift Premium"; "lng_media_selected_photo#one" = "{count} Photo"; "lng_media_selected_photo#other" = "{count} Photos"; "lng_media_selected_gif#one" = "{count} GIF"; @@ -1014,8 +1394,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_manage_group_title" = "Manage Group"; "lng_manage_channel_title" = "Manage Channel"; -"lng_manage_group_info" = "Group Info"; -"lng_manage_channel_info" = "Channel Info"; +"lng_manage_bot_title" = "Manage Bot"; "lng_manage_peer_recent_actions" = "Recent Actions"; "lng_manage_peer_members" = "Members"; "lng_manage_peer_subscribers" = "Subscribers"; @@ -1025,14 +1404,33 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_manage_peer_permissions" = "Permissions"; "lng_manage_peer_invite_links" = "Invite links"; "lng_manage_peer_reactions" = "Reactions"; +"lng_manage_peer_reactions_on" = "All"; "lng_manage_peer_reactions_off" = "Off"; "lng_manage_peer_requests" = "Member Requests"; "lng_manage_peer_requests_channel" = "Subscriber Requests"; "lng_manage_peer_reactions_enable" = "Enable Reactions"; -"lng_manage_peer_reactions_about" = "Allow members to react to group messages."; "lng_manage_peer_reactions_about_channel" = "Allow subscribers to react to channel posts."; +"lng_manage_peer_reactions_all" = "All reactions"; +"lng_manage_peer_reactions_all_about" = "Members of the group can use any emoji as reactions to messages."; +"lng_manage_peer_reactions_some" = "Some reactions"; +"lng_manage_peer_reactions_some_about" = "You can select emoji that will allow members of your group to react to messages."; +"lng_manage_peer_reactions_none" = "No reactions"; +"lng_manage_peer_reactions_none_about" = "Members of the group can't add any reactions to messages."; +"lng_manage_peer_reactions_some_title" = "Only allow these reactions"; "lng_manage_peer_reactions_available" = "Available reactions"; +"lng_manage_peer_reactions_own" = "You can also {link} emoji packs and use them as reactions."; +"lng_manage_peer_reactions_own_link" = "create your own"; +"lng_manage_peer_reactions_level#one" = "Your channel needs to reach level **{count}** to use **{same_count}** custom reaction."; +"lng_manage_peer_reactions_level#other" = "Your channel needs to reach level **{count}** to use **{same_count}** custom reactions."; +"lng_manage_peer_reactions_boost" = "Boost your channel {link}."; +"lng_manage_peer_reactions_boost_link" = "here"; +"lng_manage_peer_reactions_limit" = "Channels can't have more custom reactions."; + +"lng_manage_peer_antispam" = "Aggressive Anti-Spam"; +"lng_manage_peer_antispam_about" = "Telegram will filter more spam but may occasionally affect ordinary messages. You can report False Positives in Recent Actions."; +"lng_manage_peer_antispam_not_enough#one" = "Aggressive filtering can be enabled only in groups with more than **{count} member**."; +"lng_manage_peer_antispam_not_enough#other" = "Aggressive filtering can be enabled only in groups with more than **{count} members**."; "lng_manage_peer_group_type" = "Group type"; "lng_manage_peer_channel_type" = "Channel type"; @@ -1044,17 +1442,30 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_manage_public_group_title" = "Public"; "lng_manage_private_peer_title" = "Private"; "lng_manage_public_peer_title" = "Public"; +"lng_manage_peer_send_title" = "Who can send new messages?"; +"lng_manage_peer_send_only_members" = "Only members"; +"lng_manage_peer_send_only_members_about" = "Turn this on if you expect users to join your group before being able to send messages."; +"lng_manage_peer_send_approve_members" = "Approve new members"; +"lng_manage_peer_send_approve_members_about" = "Turn this on if you want users to join the group only after they are approved by an admin."; "lng_manage_peer_no_forwards_title" = "Saving content"; "lng_manage_peer_no_forwards" = "Restrict saving content"; "lng_manage_peer_no_forwards_about" = "Members won't be able to forward messages from this group or save media files."; "lng_manage_peer_no_forwards_about_channel" = "Subscribers won't be able to forward messages from this channel or save media files."; +"lng_manage_peer_bot_public_link" = "Public Link"; +"lng_manage_peer_bot_public_links" = "Public Links"; +"lng_manage_peer_bot_edit_intro" = "Edit Intro"; +"lng_manage_peer_bot_edit_commands" = "Edit Commands"; +"lng_manage_peer_bot_edit_settings" = "Change Bot Settings"; +"lng_manage_peer_bot_about" = "Use {bot} to manage this bot."; +"lng_manage_peer_bot_delete" = "Delete Bot"; + "lng_manage_discussion_group" = "Discussion"; "lng_manage_discussion_group_add" = "Add a group"; "lng_manage_linked_channel" = "Linked channel"; "lng_manage_linked_channel_restore" = "Restore linked channel"; -"lng_manage_discussion_group_about" = "Select a group chat for discussion that will be displayed in your channel."; -"lng_manage_discussion_group_about_chosen" = "A link to {group} is shown to all subscribers in the bottom panel."; +"lng_manage_discussion_group_about" = "Select a group chat that will host comments from your channel."; +"lng_manage_discussion_group_about_chosen" = "{group} is selected as the group that hosts comments for your channel."; "lng_manage_discussion_group_create" = "Create a new group"; "lng_manage_discussion_group_unlink" = "Unlink group"; "lng_manage_discussion_group_posted" = "Everything you post in the channel is forwarded to this group."; @@ -1076,32 +1487,45 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_manage_history_visibility_hidden_about" = "New members won't see earlier messages."; "lng_manage_history_visibility_hidden_legacy" = "New members won't see more than 100 previous messages."; -"lng_manage_messages_ttl_title" = "Auto-delete messages"; -"lng_manage_messages_ttl_never" = "Off"; -"lng_manage_messages_ttl_after1" = "1 day"; -"lng_manage_messages_ttl_after2" = "1 week"; -"lng_manage_messages_ttl_after3" = "1 month"; +"lng_manage_messages_ttl_title" = "Auto-delete after..."; +"lng_manage_messages_ttl_disable" = "Disable"; +"lng_manage_messages_ttl_after1" = "1 hour"; +"lng_manage_messages_ttl_after2" = "1 day"; +"lng_manage_messages_ttl_after3" = "1 week"; +"lng_manage_messages_ttl_after4" = "1 month"; +"lng_manage_messages_ttl_after_custom" = "Custom"; +"lng_manage_messages_ttl_menu" = "Auto-Delete"; "lng_ttl_edit_about" = "Automatically delete new messages after a certain period of time for you and {user}."; "lng_ttl_edit_about_group" = "Automatically delete new messages sent in this chat after a certain period of time."; "lng_ttl_edit_about_channel" = "Automatically delete new messages sent in this channel after a certain period of time."; -"lng_ttl_edit_save" = "Confirm"; +"lng_ttl_edit_about2" = "You can also set your default {link} for all chats in Settings."; +"lng_ttl_edit_about2_link" = "self-destruct timer"; "lng_ttl_about_tooltip" = "New messages in this chat will be automatically deleted in {duration}."; "lng_ttl_about_tooltip_channel" = "New messages in this chat will be automatically deleted in {duration}."; "lng_ttl_about_tooltip_off" = "Auto-delete is now disabled."; -"lng_ttl_about_duration1" = "1 day"; -"lng_ttl_about_duration2" = "1 week"; -"lng_ttl_about_duration3" = "1 month"; "lng_report_title" = "Report channel"; "lng_report_group_title" = "Report group"; "lng_report_bot_title" = "Report bot"; "lng_report_message_title" = "Report message"; +"lng_report_profile_photo_title" = "Report profile photo"; +"lng_report_profile_video_title" = "Report profile video"; +"lng_report_group_photo_title" = "Report group photo"; +"lng_report_group_video_title" = "Report group video"; +"lng_report_channel_photo_title" = "Report channel photo"; +"lng_report_channel_video_title" = "Report channel video"; +"lng_report_story" = "Report story"; "lng_report_please_select_messages" = "Please select messages to report."; "lng_report_select_messages" = "Select messages"; "lng_report_messages_none" = "Select Messages"; "lng_report_messages_count#one" = "Report {count} Message"; "lng_report_messages_count#other" = "Report {count} Messages"; +"lng_report_reaction" = "Report reaction"; +"lng_report_and_ban" = "Ban and report"; +"lng_report_reaction_title" = "Report reaction"; +"lng_report_reaction_about" = "Are you sure you want to report reactions from this user?"; +"lng_report_and_ban_button" = "Ban user"; "lng_report_details_about" = "Please enter any additional details relevant to your report."; "lng_report_details" = "Additional Details"; "lng_report_reason_spam" = "Spam"; @@ -1109,8 +1533,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_report_reason_violence" = "Violence"; "lng_report_reason_child_abuse" = "Child Abuse"; "lng_report_reason_pornography" = "Pornography"; +"lng_report_reason_copyright" = "Copyright"; +"lng_report_reason_illegal_drugs" = "Illegal Drugs"; +"lng_report_reason_personal_details" = "Personal Details"; "lng_report_reason_other" = "Other"; -"lng_report_reason_description" = "Description"; "lng_report_button" = "Report"; "lng_report_thanks" = "Thank you! Your report will be reviewed by our team very soon."; @@ -1129,14 +1555,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_channel_removed_list_about" = "Users removed from the channel by admins cannot rejoin it via invite links."; "lng_group_removed_list_about" = "Users removed from the group by admins cannot rejoin it via invite links."; -"lng_chat_all_members_admins" = "All Members Are Admins"; -"lng_chat_about_all_admins" = "Group members can add new members, edit name and photo of the group."; -"lng_chat_about_admins" = "Group admins can add and remove members, edit name and photo of the group."; - "lng_participant_filter" = "Search"; "lng_participant_invite" = "Invite"; +"lng_participant_invite_history" = "Show the last 100 messages"; +"lng_participant_invite_sure" = "Are you sure you want to add **{user}** to **{group}**?"; +"lng_participant_invite_sure_many#one" = "Are you sure you want to add {count} member to **{group}**?"; +"lng_participant_invite_sure_many#other" = "Are you sure you want to add {count} members to **{group}**?"; "lng_participant_invite_sorry#one" = "Sorry, you can only add the first {count} member to a channel personally.\n\nFrom now on, people will need to join via your invite link."; "lng_participant_invite_sorry#other" = "Sorry, you can only add the first {count} members to a channel personally.\n\nFrom now on, people will need to join via your invite link."; + "lng_create_group_back" = "Back"; "lng_create_group_next" = "Next"; "lng_create_group_create" = "Create"; @@ -1163,19 +1590,16 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_create_channel_link_too_short" = "Sorry, this link is too short"; "lng_create_channel_link_bad_symbols" = "Only 0-9, a-z, and underscores allowed."; "lng_create_channel_link_available" = "This link is available"; +"lng_create_channel_link_pending" = "Checking name..."; "lng_create_channel_link_copied" = "Link copied to clipboard"; -"lng_create_group_crop" = "Select an area for group photo"; -"lng_create_channel_crop" = "Select an area for channel photo"; - "lng_failed_add_participant" = "Could not add user. Please try again later."; "lng_failed_add_not_mutual" = "Sorry, if a person leaves a group, only a mutual contact can bring them back (they need to have your phone number, and you need theirs)."; -"lng_failed_add_not_mutual_channel" = "Sorry, if a person leaves a channel, only a mutual contact can bring them back (they need to have your phone number, and you need theirs)."; "lng_sure_delete_contact" = "Are you sure you want to delete {contact} from your contact list?"; -"lng_sure_delete_history" = "Are you sure you want to delete all message history with {contact}?\n\nThis action cannot be undone."; -"lng_sure_delete_group_history" = "Are you sure, you want to delete all message history in «{group}»?\n\nThis action cannot be undone."; -"lng_sure_delete_and_exit" = "Are you sure, you want to delete all message history and leave «{group}»?\n\nThis action cannot be undone."; +"lng_sure_delete_history" = "Are you sure you want to clear your chat history with **{contact}**?\n\nThis action cannot be undone."; +"lng_sure_delete_group_history" = "Are you sure, you want to delete all message history in **«{group}»**?\n\nThis action cannot be undone."; +"lng_sure_delete_and_exit" = "Are you sure, you want to delete all message history and leave **«{group}»**?\n\nThis action cannot be undone."; "lng_sure_leave_channel" = "Are you sure you want to leave\nthis channel?"; "lng_sure_delete_channel" = "Are you sure you want to delete this channel? All members will be removed and all messages will be lost."; "lng_sure_leave_group" = "Are you sure you want to leave this group?"; @@ -1190,9 +1614,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_message_empty" = "Empty Message"; "lng_message_unsupported" = "This message is not supported by your version of Telegram Desktop. Please update to the latest version in Settings, or install it from {link}"; +"lng_message_not_found" = "Message doesn't exist."; -"lng_duration_seconds#one" = "{count} second"; -"lng_duration_seconds#other" = "{count} seconds"; "lng_duration_minsec_minutes#one" = "{count} min"; "lng_duration_minsec_minutes#other" = "{count} min"; "lng_duration_minsec_seconds#one" = "{count} sec"; @@ -1235,11 +1658,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_action_ttl_changed" = "{from} has set messages to auto-delete in {duration}"; "lng_action_ttl_changed_you" = "You set messages to auto-delete in {duration}"; "lng_action_ttl_changed_channel" = "New messages will auto-delete in {duration}"; +"lng_action_ttl_global" = "{from} uses a self-destruct timer for all chats. All new messages in this chat will be automatically deleted after {duration} they've been sent."; +"lng_action_ttl_global_me" = "You set a self-destruct timer for all chats. All new messages in this chat will be automatically deleted after {duration} they’ve been sent."; "lng_action_ttl_removed" = "{from} has set messages not to auto-delete"; "lng_action_ttl_removed_you" = "You disabled the auto-delete timer"; "lng_action_ttl_removed_channel" = "New messages will not auto-delete"; "lng_action_created_channel" = "Channel created"; -"lng_action_group_migrate" = "The group was upgraded to a supergroup"; "lng_action_pinned_message" = "{from} pinned «{text}»"; "lng_action_pinned_media" = "{from} pinned {media}"; "lng_action_pinned_media_photo" = "a photo"; @@ -1254,6 +1678,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_action_pinned_media_sticker" = "a sticker"; "lng_action_pinned_media_emoji_sticker" = "a {emoji} sticker"; "lng_action_pinned_media_game" = "the game «{game}»"; +"lng_action_pinned_media_story" = "a story"; "lng_action_game_score#one" = "{from} scored {count} in {game}"; "lng_action_game_score#other" = "{from} scored {count} in {game}"; "lng_action_game_you_scored#one" = "You scored {count} in {game}"; @@ -1264,9 +1689,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_action_game_you_scored_no_game#other" = "You scored {count}"; "lng_action_payment_done" = "You have just successfully transferred {amount} to {user}"; "lng_action_payment_done_for" = "You have just successfully transferred {amount} to {user} for {invoice}"; +"lng_action_payment_init_recurring_for" = "You have just successfully transferred {amount} to {user} for {invoice} and allowed future recurring payments"; +"lng_action_payment_init_recurring" = "You have just successfully transferred {amount} to {user} and allowed future recurring payments"; +"lng_action_payment_used_recurring" = "You were charged {amount} via recurring payment"; "lng_action_took_screenshot" = "{from} took a screenshot!"; "lng_action_you_took_screenshot" = "You took a screenshot!"; "lng_action_bot_allowed_from_domain" = "You allowed this bot to message you when you logged in on {domain}."; +"lng_action_bot_allowed_from_app" = "You allowed this bot to message you when you opened {app}."; "lng_action_secure_values_sent" = "{user} received the following documents: {documents}"; "lng_action_secure_personal_details" = "personal details"; "lng_action_secure_proof_of_identity" = "proof of identity"; @@ -1282,9 +1711,68 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_action_you_theme_disabled" = "You disabled chat theme"; "lng_action_theme_disabled" = "{from} disabled chat theme"; "lng_action_proximity_distance_m#one" = "{count} meter"; -"lng_action_proximity_distance_m#other" = "{count} metres"; +"lng_action_proximity_distance_m#other" = "{count} meters"; "lng_action_proximity_distance_km#one" = "{count} km"; "lng_action_proximity_distance_km#other" = "{count} km"; +"lng_action_webview_data_done" = "You have just successfully transferred data from the «{text}» button to the bot."; +"lng_action_gift_received" = "{user} sent you a gift for {cost}"; +"lng_action_gift_received_me" = "You sent to {user} a gift for {cost}"; +"lng_action_suggested_photo_me" = "You suggested {user} to use this profile photo."; +"lng_action_suggested_photo" = "{user} suggests you to use this profile photo."; +"lng_action_suggested_photo_button" = "View Photo"; +"lng_action_suggested_video_me" = "You suggested {user} to use this profile video."; +"lng_action_suggested_video" = "{user} suggests you to use this profile video."; +"lng_action_suggested_video_button" = "View Video"; +"lng_action_attach_menu_bot_allowed" = "You allowed this bot to message you when you added it in the attachment menu."; +"lng_action_webapp_bot_allowed" = "You allowed this bot to message you in his web-app."; +"lng_action_set_wallpaper_me" = "You set a new wallpaper for this chat."; +"lng_action_set_wallpaper" = "{user} set a new wallpaper for this chat."; +"lng_action_set_wallpaper_both_me" = "You set a new wallpaper for {user} and you."; +"lng_action_set_wallpaper_button" = "View Wallpaper"; +"lng_action_set_wallpaper_remove" = "Remove"; +"lng_action_set_same_wallpaper_me" = "You set the same wallpaper for this chat."; +"lng_action_set_same_wallpaper" = "{user} set the same wallpaper for this chat."; +"lng_action_topic_created_inside" = "Topic created"; +"lng_action_topic_closed_inside" = "Topic closed"; +"lng_action_topic_reopened_inside" = "Topic reopened"; +"lng_action_topic_hidden_inside" = "Topic hidden"; +"lng_action_topic_unhidden_inside" = "Topic unhidden"; +"lng_action_topic_created" = "«{topic}» was created"; +"lng_action_topic_closed" = "«{topic}» was closed"; +"lng_action_topic_reopened" = "«{topic}» was reopened"; +"lng_action_topic_hidden" = "«{topic}» was hidden"; +"lng_action_topic_unhidden" = "«{topic}» was unhidden"; +"lng_action_topic_placeholder" = "topic"; +"lng_action_topic_renamed" = "{from} renamed the {link} to «{title}»"; +"lng_action_topic_icon_changed" = "{from} changed the {link} icon to {emoji}"; +"lng_action_topic_icon_removed" = "{from} removed the {link} icon"; +"lng_action_shared_chat_with_bot" = "You shared {chat} with {bot}"; +"lng_action_story_mention_me" = "You mentioned {user} in a story"; +"lng_action_story_mention" = "{user} mentioned you in a story"; +"lng_action_story_mention_button" = "View Story"; +"lng_action_story_mention_me_unavailable" = "The story where you mentioned {user} is no longer available."; +"lng_action_story_mention_unavailable" = "The story where {user} mentioned you is no longer available."; +"lng_action_giveaway_started_group" = "{from} just started a giveaway of Telegram Premium subscriptions to its members."; +"lng_action_giveaway_started" = "{from} just started a giveaway of Telegram Premium subscriptions to its followers."; +"lng_action_giveaway_results#one" = "{count} winner of the giveaway was randomly selected by Telegram and received private messages with giftcodes."; +"lng_action_giveaway_results#other" = "{count} winners of the giveaway were randomly selected by Telegram and received private messages with giftcodes."; +"lng_action_giveaway_results_some" = "Some winners of the giveaway were randomly selected by Telegram and received private messages with giftcodes."; +"lng_action_giveaway_results_none" = "No winners of the giveaway could be selected."; +"lng_action_boost_apply#one" = "{from} boosted the group"; +"lng_action_boost_apply#other" = "{from} boosted the group {count} times"; + +"lng_similar_channels_title" = "Similar channels"; +"lng_similar_channels_view_all" = "View all"; +"lng_similar_channels_more" = "More Channels"; +"lng_similar_channels_premium_all#one" = "Subscribe to {link} to unlock up to **{count}** similar channel."; +"lng_similar_channels_premium_all#other" = "Subscribe to {link} to unlock up to **{count}** similar channels."; +"lng_similar_channels_premium_all_link" = "Telegram Premium"; +"lng_similar_channels_show_more" = "Show more channels"; + +"lng_premium_gift_duration_months#one" = "for {count} month"; +"lng_premium_gift_duration_months#other" = "for {count} months"; +"lng_premium_gift_duration_years#one" = "for {count} year"; +"lng_premium_gift_duration_years#other" = "for {count} years"; "lng_ttl_photo_received" = "{from} sent you a self-destructing photo. Please view it on your mobile."; "lng_ttl_photo_sent" = "You sent a self-destructing photo."; @@ -1292,19 +1780,23 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_ttl_video_received" = "{from} sent you a self-destructing video. Please view it on your mobile."; "lng_ttl_video_sent" = "You sent a self-destructing video."; "lng_ttl_video_expired" = "Video has expired"; +"lng_ttl_voice_sent" = "You sent a self-destructing voice messsage."; +"lng_ttl_voice_expired" = "Voice message expired"; +"lng_ttl_round_sent" = "You sent a self-destructing video message."; +"lng_ttl_round_expired" = "Round message expired"; +"lng_ttl_voice_tooltip_in" = "This voice message can only be played once."; +"lng_ttl_voice_tooltip_out" = "This message will disappear once **{user}** plays it once."; +"lng_ttl_voice_close_in" = "Delete and close"; +"lng_ttl_round_tooltip_in" = "This video message can only be played once."; +"lng_ttl_round_tooltip_out" = "This message will disappear once **{user}** plays it once."; -"lng_profile_migrate_reached#one" = "{count} member limit reached"; -"lng_profile_migrate_reached#other" = "{count} members limit reached"; -"lng_profile_migrate_body" = "To add more members, you can upgrade your group to a supergroup."; -"lng_profile_migrate_learn_more" = "Learn more »"; -"lng_profile_migrate_button" = "Upgrade to supergroup"; "lng_profile_add_more_after_create" = "You will be able to add more members after you create the group."; +"lng_profile_camera_title" = "Capture yourself"; "lng_channel_not_accessible" = "Sorry, this channel is not accessible."; "lng_group_not_accessible" = "Sorry, this group is not accessible."; "lng_group_full" = "Sorry, this group is full."; -"lng_channels_too_much_public_about" = "Sorry, you have reserved too many public usernames. You can revoke the link from one of your older groups or channels."; "lng_channels_too_much_public_revoke_confirm_group" = "Are you sure you want to revoke the link {link}?\n\nThe group «{group}» will become private."; "lng_channels_too_much_public_revoke_confirm_channel" = "Are you sure you want to revoke the link {link}?\n\nThe channel «{group}» will become private."; "lng_channels_too_much_public_revoke" = "Revoke"; @@ -1312,7 +1804,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_channels_too_much_located_other" = "Sorry, the target user has too many location-based groups already. Please ask them to delete or transfer one of their existing ones first."; "lng_group_invite_bad_link" = "This invite link is broken or has expired."; -"lng_group_invite_join" = "Join"; "lng_group_invite_members#one" = "{count} member, among them:"; "lng_group_invite_members#other" = "{count} members, among them:"; @@ -1323,15 +1814,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_group_invite_copied" = "Invite link copied to clipboard."; "lng_group_invite_no_room" = "Unable to join this group because there are too many members in it already."; -"lng_group_invite_permanent" = "Permanent link"; "lng_group_invite_copy" = "Copy Link"; "lng_group_invite_share" = "Share Link"; -"lng_group_invite_revoke" = "Revoke Link"; "lng_group_invite_reactivate" = "Reactivate Link"; "lng_group_invite_delete" = "Delete Link"; "lng_group_invite_no_joined" = "No one joined yet"; "lng_group_invite_joined#one" = "{count} joined"; "lng_group_invite_joined#other" = "{count} joined"; +"lng_group_invite_joined_via_filter" = "joined via a folder invite link"; "lng_group_invite_remaining#one" = "{count} remaining"; "lng_group_invite_remaining#other" = "{count} remaining"; "lng_group_invite_requested#one" = "{count} requested"; @@ -1344,8 +1834,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_group_invite_days_left#other" = "{count} days left"; "lng_group_invite_about_permanent_group" = "Anyone who has Telegram installed will be able to join your group by following this link."; "lng_group_invite_about_permanent_channel" = "Anyone who has Telegram installed will be able to join your channel by following this link."; -"lng_group_invite_manage" = "Manage Invite Links"; -"lng_group_invite_manage_about" = "You can create additional invite links that have limited time or number of usages."; "lng_group_invite_title" = "Invite links"; "lng_group_invite_add" = "Create a New Link"; "lng_group_invite_add_about" = "You can generate invite links that will expire after they've been used."; @@ -1382,7 +1870,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_group_invite_other_title" = "Links created by other admins"; "lng_group_invite_other_count#one" = "{count} invite link"; "lng_group_invite_other_count#other" = "{count} invite links"; -"lng_group_invite_permanent_other" = "Permanent link of this admin"; "lng_group_invite_other_list" = "Links created by this admin"; "lng_group_invite_expired_about" = "The time limit for this link has expired."; "lng_group_invite_used_about" = "This link reached its usage limit."; @@ -1420,6 +1907,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_context_about_private_link" = "This link will only work for members of this chat."; "lng_forwarded" = "Forwarded from {user}"; +"lng_forwarded_story" = "Story from {user}"; +"lng_forwarded_story_expired" = "This story has expired."; "lng_forwarded_date" = "Original: {date}"; "lng_forwarded_channel" = "Forwarded from {channel}"; "lng_forwarded_psa_default" = "Forwarded from {channel}"; @@ -1429,15 +1918,21 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_forwarded_hidden" = "The account was hidden by the user."; "lng_forwarded_imported" = "This message was imported from another app. It may not be real."; "lng_signed_author" = "Author: {user}"; -"lng_in_reply_to" = "In reply to"; -"lng_sponsored" = "sponsored"; +"lng_sponsored_message_title" = "Sponsored"; +"lng_recommended_message_title" = "Recommended"; "lng_edited" = "edited"; +"lng_commented" = "commented"; "lng_edited_date" = "Edited: {date}"; "lng_sent_date" = "Sent: {date}"; +"lng_views_tooltip#one" = "Views: {count}"; +"lng_views_tooltip#other" = "Views: {count}"; +"lng_forwards_tooltip#one" = "Forwards: {count}"; +"lng_forwards_tooltip#other" = "Forwards: {count}"; "lng_imported" = "imported"; "lng_admin_badge" = "admin"; "lng_owner_badge" = "owner"; "lng_channel_badge" = "channel"; +"lng_topic_author_badge" = "Topic Author"; "lng_fast_reply" = "Reply"; "lng_cancel_edit_post_sure" = "Cancel editing?"; "lng_cancel_edit_post_yes" = "Yes"; @@ -1446,10 +1941,17 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_bot_share_location_unavailable" = "Sorry, location sharing is currently unavailable in Telegram Desktop."; "lng_bot_share_phone" = "Do you want to share your phone number with this bot?"; "lng_bot_share_phone_confirm" = "Share"; +"lng_bot_allow_write_title" = "Allow messaging"; +"lng_bot_allow_write" = "Do you want to allow this bot writing you?"; +"lng_bot_allow_write_confirm" = "Allow"; "lng_attach_failed" = "Failed"; "lng_attach_file" = "File"; "lng_attach_photo" = "Photo"; +"lng_attach_camera" = "Camera"; +"lng_attach_document" = "Document"; +"lng_attach_photo_or_video" = "Photo or video"; +"lng_attach_profile_emoji" = "Use an Emoji"; "lng_media_open_with" = "Open With"; "lng_media_download" = "Download"; @@ -1480,12 +1982,18 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_emoji_category5" = "Travel & Places"; "lng_emoji_category6" = "Objects"; "lng_emoji_category7" = "Symbols & Flags"; -"lng_emoji_hide_panel" = "Click here to hide the emoji sidebar"; "lng_emoji_manage_sets" = "Choose emoji set"; "lng_emoji_set_ready" = "Downloaded"; "lng_emoji_set_active" = "Current set"; "lng_emoji_set_download" = "Download {size}"; "lng_emoji_set_loading" = "{percent}, {progress}"; +"lng_emoji_color_all" = "Choose color for all emoji"; +"lng_emoji_copy" = "Copy emoji"; +"lng_emoji_view_pack" = "View pack"; +"lng_emoji_remove_recent" = "Remove from recents"; +"lng_emoji_reset_recent" = "Reset recents"; +"lng_emoji_reset_recent_sure" = "Do you want to reset recent emoji?"; +"lng_emoji_reset_recent_button" = "Reset"; "lng_recent_stickers" = "Frequently used"; "lng_faved_stickers_add" = "Add to Favorites"; @@ -1494,6 +2002,613 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_group_stickers" = "Group stickers"; "lng_group_stickers_description" = "You can choose a sticker set which will be available for every member while in the group chat."; "lng_group_stickers_add" = "Choose sticker set"; +"lng_group_emoji" = "Group emoji pack"; +"lng_group_emoji_description" = "Choose an emoji pack that will be available to all members within the group."; + +"lng_premium" = "Premium"; +"lng_premium_free" = "Free"; +"lng_premium_more_about" = "More About Telegram Premium"; +"lng_premium_unlock_reactions" = "Unlock Premium Reactions"; +"lng_premium_unlock_stickers" = "Unlock Premium Stickers"; +"lng_premium_unlock_emoji" = "Unlock Animated Emoji"; +"lng_premium_unlock_status" = "Unlock Emoji Status"; + +"lng_premium_subscribe_months_12" = "Annual"; +"lng_premium_subscribe_months_6" = "Semiannual"; +"lng_premium_subscribe_months_1" = "Monthly"; +"lng_premium_subscribe_total" = "{cost} per year"; +"lng_premium_subscribe_button" = "Subscribe for {cost} per month"; + +"lng_premium_emoji_status_title" = "{user} set this emoji from {link} as their current status."; +"lng_premium_emoji_status_title_colored" = "{user} set this emoji as their current status."; +"lng_premium_emoji_status_about" = "Emoji status is a premium feature. Other features included in **Telegram Premium**:"; +"lng_premium_emoji_status_button" = "Unlock Emoji Status"; + +"lng_premium_summary_user_title" = "{user} is a subscriber of Telegram Premium."; +"lng_premium_summary_user_about" = "Owners of Telegram Premium accounts have exclusive access to multiple additional features."; + +"lng_premium_summary_title" = "Telegram Premium"; +"lng_premium_summary_top_about" = "Go **beyond the limits**, get **exclusive features** and support us by subscribing to **Telegram Premium**."; +"lng_premium_summary_title_subscribed" = "You are all set!"; +"lng_premium_summary_subtitle_gift#one" = "{user} has gifted you a {count}-month subscription for Telegram Premium."; +"lng_premium_summary_subtitle_gift#other" = "{user} has gifted you a {count}-months subscription for Telegram Premium."; +"lng_premium_summary_subtitle_gift_me#one" = "You gifted {user} a {count}-month subscription for Telegram Premium."; +"lng_premium_summary_subtitle_gift_me#other" = "You gifted {user} a {count}-months subscription for Telegram Premium."; +"lng_premium_summary_subtitle_wallpapers" = "Wallpapers for Both Sides"; +"lng_premium_summary_about_wallpapers" = "Set custom wallpapers for you and your chat partner."; +"lng_premium_summary_subtitle_stories" = "Upgraded Stories"; +"lng_premium_summary_about_stories" = "Priority order, stealth mode, permanent views history and more."; +"lng_premium_summary_subtitle_double_limits" = "Doubled Limits"; +"lng_premium_summary_about_double_limits" = "Up to 1000 channels, 20 folders, 10 pins, 20 public links, 4 accounts and more."; +"lng_premium_summary_subtitle_more_upload" = "4Gb Upload Size"; +"lng_premium_summary_about_more_upload" = "Increased upload size from 2Gb to 4Gb per document, unlimited storage overall."; +"lng_premium_summary_subtitle_faster_download" = "Faster Download Speed"; +"lng_premium_summary_about_faster_download" = "No more limits on the speed with which media and documents are downloaded."; +"lng_premium_summary_subtitle_voice_to_text" = "Voice-to-Text Conversion"; +"lng_premium_summary_about_voice_to_text" = "Ability to read the transcript of any incoming voice message."; +"lng_premium_summary_subtitle_no_ads" = "No Ads"; +"lng_premium_summary_about_no_ads" = "No more ads in public channels where Telegram sometimes shows ads."; +"lng_premium_summary_subtitle_emoji_status" = "Emoji Status"; +"lng_premium_summary_about_emoji_status" = "Add any of thousands emoji next to your name to display current activity."; +"lng_premium_summary_subtitle_infinite_reactions" = "Infinite Reactions"; +"lng_premium_summary_about_infinite_reactions" = "React with thousands of emoji — with multiple reactions per message."; +"lng_premium_summary_subtitle_tags_for_messages" = "Tags for Messages"; +"lng_premium_summary_about_tags_for_messages" = "Organize your Saved Messages with tags for quicker access."; +"lng_premium_summary_subtitle_last_seen" = "Last Seen Times"; +"lng_premium_summary_about_last_seen" = "View the last seen and read times of others even if you hide yours."; +"lng_premium_summary_subtitle_message_privacy" = "Message Privacy"; +"lng_premium_summary_about_message_privacy" = "Restrict people you don't know from sending you messages."; +"lng_premium_summary_subtitle_premium_stickers" = "Premium Stickers"; +"lng_premium_summary_about_premium_stickers" = "Exclusive enlarged stickers featuring additional effects, updated monthly."; +"lng_premium_summary_subtitle_animated_emoji" = "Animated Emoji"; +"lng_premium_summary_about_animated_emoji" = "Include animated emoji from different emoji sets in any message you send."; +"lng_premium_summary_subtitle_advanced_chat_management" = "Advanced Chat Management"; +"lng_premium_summary_about_advanced_chat_management" = "Tools to set default folder, auto-archive and hide new chats from non-contacts."; +"lng_premium_summary_subtitle_profile_badge" = "Profile Badge"; +"lng_premium_summary_about_profile_badge" = "A badge next to your name showing that you are helping support Telegram."; +"lng_premium_summary_subtitle_animated_userpics" = "Animated Profile Pictures"; +"lng_premium_summary_about_animated_userpics" = "Video avatars animated in chat lists and chats to allow for additional self-expression."; +"lng_premium_summary_subtitle_translation" = "Real-Time Translation"; +"lng_premium_summary_about_translation" = "Real-time translation of channels and chats into other languages."; +"lng_premium_summary_subtitle_business" = "Telegram Business"; +"lng_premium_summary_about_business" = "Upgrade your account with business features such as location, opening hours and quick replies."; +"lng_premium_summary_bottom_subtitle" = "About Telegram Premium"; +"lng_premium_summary_bottom_about" = "While the free version of Telegram already gives its users more than any other messaging application, **Telegram Premium** pushes its capabilities even further.\n\n**Telegram Premium** is a paid option, because most Premium Features require additional expenses from Telegram to third parties such as data center providers and server manufacturers. Contributions from **Telegram Premium** users allow us to cover such costs and also help Telegram stay free for everyone."; +"lng_premium_summary_button" = "Subscribe for {cost} per month"; + +"lng_premium_summary_new_badge" = "NEW"; + +"lng_premium_success" = "You've successfully subscribed to Telegram Premium!"; +"lng_premium_unavailable" = "This feature requires subscription to **Telegram Premium**.\n\nUnfortunately, **Telegram Premium** is not available in your region."; + +// Upgraded Stories. +"lng_premium_stories_subtitle_order" = "Priority Order"; +"lng_premium_stories_about_order" = "Get more views as your stories are always displayed first."; + +"lng_premium_stories_subtitle_stealth" = "Stealth Mode"; +"lng_premium_stories_about_stealth" = "Hide the fact that you viewed other people's stories."; + +"lng_premium_stories_subtitle_views" = "Permanent Views History"; +"lng_premium_stories_about_views" = "Check who opens your stories – even after they expire."; + +"lng_premium_stories_subtitle_expiration" = "Expiration Durations*"; +"lng_premium_stories_about_expiration" = "Set custom expiration durations like 6 or 48 hours for your stories."; + +"lng_premium_stories_subtitle_download" = "Download Stories"; +"lng_premium_stories_about_download" = "Save other people's unprotected stories to your disk."; + +"lng_premium_stories_subtitle_caption" = "Longer Captions*"; +"lng_premium_stories_about_caption" = "Add ten times longer captions to your stories – up to 2048 symbols."; + +"lng_premium_stories_subtitle_links" = "Links and Formatting*"; +"lng_premium_stories_about_links" = "Add links and formatting in captions of your stories."; + +"lng_premium_stories_about_mobile" = "* Available when posting stories from Telegram apps for iOS and Android."; + +// Doubled Limits. +"lng_premium_double_limits_subtitle_channels" = "Groups and Channels"; +"lng_premium_double_limits_about_channels#one" = "Join up to {count} channels and large groups"; +"lng_premium_double_limits_about_channels#other" = "Join up to {count} channels and large groups"; + +"lng_premium_double_limits_subtitle_pins" = "Pinned Chats"; +"lng_premium_double_limits_about_pins#one" = "Pin up to {count} chats in your main chat list"; +"lng_premium_double_limits_about_pins#other" = "Pin up to {count} chats in your main chat list"; + +"lng_premium_double_limits_subtitle_links" = "Public Links"; +"lng_premium_double_limits_about_links#one" = "Reserve up to {count} t.me/name links"; +"lng_premium_double_limits_about_links#other" = "Reserve up to {count} t.me/name links"; + +"lng_premium_double_limits_subtitle_gifs" = "Saved GIFs"; +"lng_premium_double_limits_about_gifs#one" = "Save up to {count} GIFs in your Favorite GIFs"; +"lng_premium_double_limits_about_gifs#other" = "Save up to {count} GIFs in your Favorite GIFs"; + +"lng_premium_double_limits_subtitle_stickers" = "Favorite Stickers"; +"lng_premium_double_limits_about_stickers#one" = "Save up to {count} stickers in your Favorite stickers"; +"lng_premium_double_limits_about_stickers#other" = "Save up to {count} stickers in your Favorite stickers"; + +"lng_premium_double_limits_subtitle_bio" = "Bio"; +"lng_premium_double_limits_about_bio" = "Add more symbols and use links in your bio"; + +"lng_premium_double_limits_subtitle_captions" = "Captions"; +"lng_premium_double_limits_about_captions" = "Use longer description for your photos and videos"; + +"lng_premium_double_limits_subtitle_folders" = "Folders"; +"lng_premium_double_limits_about_folders#one" = "Organize your chats into {count} folders"; +"lng_premium_double_limits_about_folders#other" = "Organize your chats into {count} folders"; + +"lng_premium_double_limits_subtitle_folder_chats" = "Chats per Folder"; +"lng_premium_double_limits_about_folder_chats#one" = "Add up to {count} chats into each of your folders"; +"lng_premium_double_limits_about_folder_chats#other" = "Add up to {count} chats into each of your folders"; + +"lng_premium_double_limits_subtitle_accounts" = "Connected Accounts"; +"lng_premium_double_limits_about_accounts#one" = "Connect {count} account with different mobile numbers"; +"lng_premium_double_limits_about_accounts#other" = "Connect {count} accounts with different mobile numbers"; +// + +"lng_premium_gift_title" = "Gift Telegram Premium"; +"lng_premium_gift_about" = "Let **{user}** enjoy exclusive features of Telegram with **Telegram Premium**."; +"lng_premium_gift_button" = "Gift Subscription for {cost}"; +"lng_premium_gift_per" = "{cost} / month"; +"lng_premium_gift_terms" = "You can review the list of features and terms of use for Telegram Premium {link}."; +"lng_premium_gift_terms_link" = "here"; +"lng_premium_gifts_about_user1" = "Give **{user}** access to exclusive features."; +"lng_premium_gifts_about_user2" = "Give **{user}** and **{second_user}** access to exclusive features."; +"lng_premium_gifts_about_user3" = "Give **{user}**, **{second_user}** and **{name}** access to exclusive features."; +"lng_premium_gifts_about_user_more#one" = "Give **{user}**, **{second_user}**, **{name}** and **{count}** more friend access to exclusive features."; +"lng_premium_gifts_about_user_more#other" = "Give **{user}**, **{second_user}**, **{name}** and **{count}** more friends access to exclusive features."; +"lng_premium_gifts_about_reward#one" = "You will receive {emoji}**{count}** boost."; +"lng_premium_gifts_about_reward#other" = "You will receive {emoji}**{count}** boosts."; +"lng_premium_gifts_about_paid_title" = "Gifts Sent!"; +"lng_premium_gifts_about_paid1" = "**{user}** has been notified about the gifts you purchased."; +"lng_premium_gifts_about_paid2" = "**{user}** and **{second_user}** have been notified about the gifts you purchased."; +"lng_premium_gifts_about_paid3" = "**{user}**, **{second_user}** and **{name}** have been notified about the gifts you purchased."; +"lng_premium_gifts_about_paid_more#one" = "**{user}**, **{second_user}**, **{name}** and **{count}** other have been notified about the gifts you purchased."; +"lng_premium_gifts_about_paid_more#other" = "**{user}**, **{second_user}**, **{name}** and **{count}** others have been notified about the gifts you purchased."; +"lng_premium_gifts_about_paid_below#one" = "They now have access to additional features."; +"lng_premium_gifts_about_paid_below#other" = "They now have access to additional features."; +"lng_premium_gifts_summary_subtitle" = "What's Included"; +"lng_premium_gifts_terms" = "By gifting Telegram Premium, you agree to the Telegram {link} and {policy}."; +"lng_premium_gifts_terms_policy" = "Privacy Policy"; + +"lng_business_title" = "Telegram Business"; +"lng_business_about" = "Turn your account to a business page with these additional features."; +"lng_business_unlocked" = "You have now unlocked these additional business features."; +"lng_business_subtitle_location" = "Location"; +"lng_business_about_location" = "Display the location of your business on your account."; +"lng_business_subtitle_opening_hours" = "Opening Hours"; +"lng_business_about_opening_hours" = "Show to your customers when you are open for business."; +"lng_business_subtitle_quick_replies" = "Quick Replies"; +"lng_business_about_quick_replies" = "Set up shortcuts up to 20 messages each to respond to customers faster."; +"lng_business_subtitle_greeting_messages" = "Greeting Messages"; +"lng_business_about_greeting_messages" = "Create greetings that will be automatically sent to new customers."; +"lng_business_subtitle_away_messages" = "Away Messages"; +"lng_business_about_away_messages" = "Define messages that are automatically sent when you are off."; +"lng_business_subtitle_chatbots" = "Chatbots"; +"lng_business_about_chatbots" = "Add any third party chatbots that will process customer interactions."; + +"lng_location_title" = "Location"; +"lng_location_about" = "Display the location of your business on your account."; +"lng_location_address" = "Enter Address"; +"lng_location_fallback" = "You can set your location on the map from your mobile device."; + +"lng_hours_title" = "Business Hours"; +"lng_hours_about" = "Turn this on to show your opening hours schedule to your customers."; +"lng_hours_show" = "Show Business Hours"; +"lng_hours_time_zone" = "Time Zone"; +"lng_hours_monday" = "Monday"; +"lng_hours_tuesday" = "Tuesday"; +"lng_hours_wednesday" = "Wednesday"; +"lng_hours_thursday" = "Thursday"; +"lng_hours_friday" = "Friday"; +"lng_hours_saturday" = "Saturday"; +"lng_hours_sunday" = "Sunday"; +"lng_hours_closed" = "Closed"; +"lng_hours_open_full" = "Open 24 hours"; +"lng_hours_next_day" = "{time} (Next day)"; +"lng_hours_on_next_day" = "Next day {time}"; +"lng_hours_time_zone_title" = "Choose Time Zone"; +"lng_hours_add_button" = "Add a Set of Hours"; +"lng_hours_opening" = "Opening Time"; +"lng_hours_closing" = "Closing Time"; +"lng_hours_remove" = "Remove"; +"lng_hours_about_day" = "Specify your working hours during the day."; + +"lng_replies_title" = "Quick Replies"; +"lng_replies_about" = "Set up shortcuts with rich text and media to respond to messages faster."; +"lng_replies_add" = "Add Quick Reply"; +"lng_replies_add_title" = "New Quick Reply"; +"lng_replies_add_shortcut" = "Add a shortcut for your reply."; +"lng_replies_add_placeholder" = "Shortcut"; +"lng_replies_add_exists" = "This shortcut already exists."; +"lng_replies_empty_title" = "New Quick Reply"; +"lng_replies_empty_about" = "Enter a message below that will be sent in chat when you type {shortcut}.\n\nYou can access Quick Replies in any chat by typing /."; +"lng_replies_remove_title" = "Remove Shortcut"; +"lng_replies_remove_text" = "You didn't create a quick reply message. Do you want to remove the shortcut?"; +"lng_replies_edit_title" = "Edit Shortcut"; +"lng_replies_edit_about" = "Edit the name for this shortcut."; +"lng_replies_message_placeholder" = "Add a Quick Reply"; +"lng_replies_delete_sure" = "Are you sure you want to delete this quick reply with all its messages?"; +"lng_replies_error_occupied" = "This shortcut is already used."; +"lng_replies_edit_button" = "Edit Quick Replies"; + +"lng_greeting_title" = "Greeting Message"; +"lng_greeting_about" = "Greet customers when they message you the first time or after a period of no activity."; +"lng_greeting_enable" = "Send Greeting Message"; +"lng_greeting_create" = "Create a Greeting Message"; +"lng_greeting_recipients" = "Recipients"; +"lng_greeting_select" = "Select chats or entire chat categories for sending a greeting message."; +"lng_greeting_period_title" = "Period of no activity"; +"lng_greeting_period_about" = "Choose how many days should pass after your last interaction with a recipient to send them a greeting in response to their message."; +"lng_greeting_empty_title" = "New Greeting Message"; +"lng_greeting_empty_about" = "Create greetings that will be automatically sent to new customers."; +"lng_greeting_message_placeholder" = "Add a Greeting"; +"lng_greeting_limit_reached" = "You have too many quick replies. Remove one to add a greeting message."; +"lng_greeting_recipients_empty" = "Please choose at least one recipient."; + +"lng_away_title" = "Away Message"; +"lng_away_about" = "Automatically reply with a message when you are away."; +"lng_away_enable" = "Send Away Message"; +"lng_away_create" = "Create an Away Message"; +"lng_away_schedule" = "Schedule"; +"lng_away_schedule_always" = "Send Always"; +"lng_away_schedule_outside" = "Outside of Business Hours"; +"lng_away_schedule_custom" = "Custom Schedule"; +"lng_away_custom_start" = "Start Time"; +"lng_away_custom_end" = "End Time"; +"lng_away_offline_only" = "Only if Offline"; +"lng_away_offline_only_about" = "Don't send the away message if you've recently been online."; +"lng_away_recipients" = "Recipients"; +"lng_away_select" = "Select chats or entire chat categories for sending an away message."; +"lng_away_empty_title" = "New Away Message"; +"lng_away_empty_about" = "Add messages that will be automatically sent when you are off."; +"lng_away_message_placeholder" = "Add an Away Message"; +"lng_away_limit_reached" = "You have too many quick replies. Remove one to add an away message."; + +"lng_business_edit_messages" = "Edit messages"; +"lng_business_limit_reached#one" = "Limit of {count} message reached."; +"lng_business_limit_reached#other" = "Limit of {count} messages reached."; + +"lng_chatbots_title" = "Chatbots"; +"lng_chatbots_about" = "Add a bot to your account to help you automatically process and respond to the messages you receive. {link}"; +"lng_chatbots_about_link" = "Learn more..."; +"lng_chatbots_placeholder" = "Enter bot URL or username"; +"lng_chatbots_add_about" = "Enter the link to the Telegram bot that you want to automatically process your chats."; +"lng_chatbots_access_title" = "Chats accessible for the bot"; +"lng_chatbots_all_except" = "All 1-to-1 Chats Except..."; +"lng_chatbots_selected" = "Only Selected Chats"; +"lng_chatbots_excluded_title" = "Excluded chats"; +"lng_chatbots_exclude_button" = "Exclude Chats"; +"lng_chatbots_included_title" = "Included chats"; +"lng_chatbots_include_button" = "Select Chats"; +"lng_chatbots_exclude_about" = "Select chats or entire chat categories which the bot will not have access to."; +"lng_chatbots_permissions_title" = "Bot permissions"; +"lng_chatbots_reply" = "Reply to Messages"; +"lng_chatbots_reply_about" = "The bot will be able to view all new incoming messages, but not the messages that had been sent before you added the bot."; +"lng_chatbots_remove" = "Remove Bot"; +"lng_chatbots_not_found" = "Chatbot not found."; +"lng_chatbots_add" = "Add"; +"lng_chatbots_info_url" = "https://telegram.org/privacy"; + +"lng_boost_channel_button" = "Boost Channel"; +"lng_boost_group_button" = "Boost Group"; +"lng_boost_again_button" = "Boost Again"; +"lng_boost_group_about" = "Boost your group to unlock additional\nappearance settings."; +"lng_boost_level#one" = "Level {count}"; +"lng_boost_level#other" = "Level {count}"; +"lng_boost_level_unlocks#one" = "Level {count} Unlocks:"; +"lng_boost_level_unlocks#other" = "Level {count} Unlocks:"; +"lng_boost_channel_title_first" = "Enable stories for channel"; +"lng_boost_channel_title_first_group" = "Enable stories for group"; +"lng_boost_channel_needs_unlock#one" = "{channel} needs **{count}** more boost to unlock new features."; +"lng_boost_channel_needs_unlock#other" = "{channel} needs **{count}** more boosts to unlock new features."; +//"lng_boost_channel_needs_first#one" = "{channel} needs **{count}** more boost to enable posting stories. Help make it possible!"; +//"lng_boost_channel_needs_first#other" = "{channel} needs **{count}** more boosts to enable posting stories. Help make it possible!"; +"lng_boost_channel_title_more" = "Help upgrade channel"; +"lng_boost_channel_title_more_group" = "Help upgrade group"; +//"lng_boost_channel_needs_more#one" = "{channel} needs **{count}** more boost to be able to {post}."; +//"lng_boost_channel_needs_more#other" = "{channel} needs **{count}** more boosts to be able to {post}."; +"lng_boost_channel_title_max" = "Maximum level reached"; +"lng_boost_channel_you_title" = "You boosted {channel}!"; +//"lng_boost_channel_you_first#one" = "This channel needs **{count}** more boost\nto enable stories."; +//"lng_boost_channel_you_first#other" = "This channel needs **{count}** more boosts\nto enable stories."; +//"lng_boost_channel_you_more#one" = "This channel needs **{count}** more boost\nto be able to {post}."; +//"lng_boost_channel_you_more#other" = "This channel needs **{count}** more boosts\nto be able to {post}."; +"lng_boost_channel_reached_first" = "This channel reached **Level 1** and can now post stories."; +"lng_boost_channel_reached_more#one" = "This channel reached **Level {count}** and can now {post}."; +"lng_boost_channel_reached_more#other" = "This channel reached **Level {count}** and can now {post}."; +//"lng_boost_channel_you_first_group#one" = "This group needs **{count}** more boost\nto enable stories."; +//"lng_boost_channel_you_first_group#other" = "This group needs **{count}** more boosts\nto enable stories."; +//"lng_boost_channel_you_more_group#one" = "This group needs **{count}** more boost\nto be able to {post}."; +//"lng_boost_channel_you_more_group#other" = "This group needs **{count}** more boosts\nto be able to {post}."; +"lng_boost_channel_reached_first_group" = "This group reached **Level 1** and can now post stories."; +"lng_boost_channel_reached_more_group#one" = "This group reached **Level {count}** and can now {post}."; +"lng_boost_channel_reached_more_group#other" = "This group reached **Level {count}** and can now {post}."; +"lng_boost_channel_post_stories#one" = "post **{count} story** per day"; +"lng_boost_channel_post_stories#other" = "post **{count} stories** per day"; +"lng_boost_channel_features" = "Your boosts will help {channel} to unlock new features."; +"lng_boost_group_lift_restrictions" = "Boost the group to remove messaging restrictions."; +"lng_boost_group_lift_restrictions_many#one" = "Boost the group **{count} times** to remove messaging restrictions."; +"lng_boost_group_lift_restrictions_many#other" = "Boost the group **{count} times** to remove messaging restrictions."; +"lng_boost_error_gifted_title" = "Can't boost with gifted Premium!"; +"lng_boost_error_gifted_text" = "Because your **Telegram Premium** subscription was gifted to you, you can't use it to boost channels."; +"lng_boost_error_gifted_text_group" = "Because your **Telegram Premium** subscription was gifted to you, you can't use it to boost groups."; +"lng_boost_need_more" = "More boosts needed"; +"lng_boost_need_more_text#one" = "To boost {channel}, gift **Telegram Premium** to a friend and get **{count}** boosts."; +"lng_boost_need_more_text#other" = "To boost {channel}, gift **Telegram Premium** to a friend and get **{count}** boosts."; +"lng_boost_need_more_again#one" = "To boost {channel} again, gift **Telegram Premium** to a friend and get **{count}** additional boost."; +"lng_boost_need_more_again#other" = "To boost {channel} again, gift **Telegram Premium** to a friend and get **{count}** additional boosts."; +"lng_boost_error_already_title" = "Already Boosted!"; +"lng_boost_error_already_text" = "You are already boosting this channel."; +"lng_boost_error_already_text_group" = "You are already boosting this group."; +"lng_boost_error_premium_title" = "Premium needed!"; +"lng_boost_error_premium_text_group" = "Only **Telegram Premium** subscribers can boost groups. Do you want to subscribe to **Telegram Premium**?"; +"lng_boost_error_premium_text" = "Only **Telegram Premium** subscribers can boost channels. Do you want to subscribe to **Telegram Premium**?"; +"lng_boost_error_premium_yes" = "Yes"; +"lng_boost_error_flood_title" = "Can't boost too often!"; +"lng_boost_error_flood_text_group" = "You can change the group you boost only once a day. Next time you can boost is in {left}."; +"lng_boost_error_flood_text" = "You can change the channel you boost only once a day. Next time you can boost is in {left}."; +"lng_boost_now_instead" = "You currently boost {channel}. Do you want to boost {other} instead?"; +"lng_boost_now_replace" = "Replace"; +"lng_boost_reassign_title" = "Reassign boost"; +"lng_boost_reassign_text" = "To boost {channel}, reassign a previous boost or {gift}."; +"lng_boost_reassign_gift#one" = "gift **Telegram Premium** to a friend to get **{count}** additional boost"; +"lng_boost_reassign_gift#other" = "gift **Telegram Premium** to a friend to get **{count}** additional boosts"; +"lng_boost_remove_title" = "Remove your boost from"; +"lng_boost_reassign_button" = "Reassign"; +"lng_boost_available_in" = "available in {duration}"; +"lng_boost_available_in_toast#one" = "Wait until the boost is available or get **{count}** more boost by gifting a **Telegram Premium** subscription."; +"lng_boost_available_in_toast#other" = "Wait until the boost is available or get **{count}** more boosts by gifting a **Telegram Premium** subscription."; +"lng_boost_reassign_done#one" = "{count} boost is reassigned from {channels}."; +"lng_boost_reassign_done#other" = "{count} boosts are reassigned from {channels}."; +"lng_boost_reassign_channels#one" = "{count} channel"; +"lng_boost_reassign_channels#other" = "{count} channels"; +"lng_boost_reassign_groups#one" = "{count} group"; +"lng_boost_reassign_groups#other" = "{count} groups"; +"lng_boost_reassign_mixed#one" = "{count} group or channel"; +"lng_boost_reassign_mixed#other" = "{count} groups and channels"; + +"lng_boost_channel_title_color" = "Enable colors"; +"lng_boost_channel_needs_level_color#one" = "Your channel needs to reach **Level {count}** to change channel color."; +"lng_boost_channel_needs_level_color#other" = "Your channel needs to reach **Level {count}** to change channel color."; + +"lng_boost_channel_title_wallpaper" = "Enable wallpapers"; +"lng_boost_channel_needs_level_wallpaper#one" = "Your channel needs to reach **Level {count}** to change channel wallpaper."; +"lng_boost_channel_needs_level_wallpaper#other" = "Your channel needs to reach **Level {count}** to change channel wallpaper."; +"lng_boost_group_needs_level_wallpaper#one" = "Your group needs to reach **Level {count}** to change group wallpaper."; +"lng_boost_group_needs_level_wallpaper#other" = "Your group needs to reach **Level {count}** to change group wallpaper."; + +"lng_boost_channel_title_status" = "Enable emoji status"; +"lng_boost_channel_needs_level_status#one" = "Your channel needs to reach **Level {count}** to set emoji status."; +"lng_boost_channel_needs_level_status#other" = "Your channel needs to reach **Level {count}** to set emoji status."; +"lng_boost_group_needs_level_status#one" = "Your group needs to reach **Level {count}** to set emoji status."; +"lng_boost_group_needs_level_status#other" = "Your group needs to reach **Level {count}** to set emoji status."; + +"lng_boost_channel_title_reactions" = "Custom reactions"; +"lng_boost_channel_needs_level_reactions#one" = "Your channel needs to reach **Level {count}** to add **{same_count}** custom emoji as a reaction."; +"lng_boost_channel_needs_level_reactions#other" = "Your channel needs to reach **Level {count}** to add **{same_count}** custom emoji as reactions."; + +"lng_boost_group_title_emoji" = "Enable emoji pack"; +"lng_boost_group_needs_level_emoji#one" = "Your group needs to reach **Level {count}** to set emoji pack."; +"lng_boost_group_needs_level_emoji#other" = "Your group needs to reach **Level {count}** to set emoji pack."; + +"lng_boost_channel_ask" = "Ask your **Premium** subscribers to boost your channel with this link:"; +"lng_boost_channel_ask_button" = "Copy Link"; +"lng_boost_channel_or" = "or"; +"lng_boost_channel_gifting" = "Boost your channel by gifting your subscribers Telegram Premium. {link}"; +"lng_boost_channel_gifting_link" = "Get boosts >"; + +"lng_feature_stories#one" = "**{count}** Story Per Day"; +"lng_feature_stories#other" = "**{count}** Stories Per Day"; +"lng_feature_reactions#one" = "**{count}** Custom Reaction"; +"lng_feature_reactions#other" = "**{count}** Custom Reactions"; +"lng_feature_name_color_channel#one" = "**{count}** Channel Name Color"; +"lng_feature_name_color_channel#other" = "**{count}** Channel Name Colors"; +"lng_feature_link_style_channel#one" = "**{count}** Style for Links and Quotes"; +"lng_feature_link_style_channel#other" = "**{count}** Styles for Links and Quotes"; +"lng_feature_link_emoji" = "Custom Logo for Links and Quotes"; +"lng_feature_emoji_status" = "**1000+** Emoji Statuses"; +"lng_feature_backgrounds_channel#one" = "**{count}** Channel Background"; +"lng_feature_backgrounds_channel#other" = "**{count}** Channel Backgrounds"; +"lng_feature_custom_background_channel" = "Custom Channel Background"; +"lng_feature_backgrounds_group#one" = "**{count}** Group Background"; +"lng_feature_backgrounds_group#other" = "**{count}** Group Backgrounds"; +"lng_feature_custom_background_group" = "Custom Group Background"; +"lng_feature_custom_emoji_pack" = "Custom Emoji Pack"; +"lng_feature_transcribe" = "Voice-to-Text Conversion"; + +"lng_giveaway_new_title" = "Boosts via Gifts"; +"lng_giveaway_new_about" = "Get more boosts for your channel by gifting Premium to your subscribers."; +"lng_giveaway_new_about_group" = "Get more boosts for your group by gifting Premium to your subscribers."; +"lng_giveaway_create_option" = "Create Giveaway"; +"lng_giveaway_create_subtitle" = "winners are chosen randomly"; +"lng_giveaway_award_option" = "Award Specific Users"; +"lng_giveaway_award_subtitle" = "Select recipients >"; +"lng_giveaway_award_chosen#one" = "{count} recipient >"; +"lng_giveaway_award_chosen#other" = "{count} recipients >"; +"lng_giveaway_quantity_title" = "Quantity of prizes"; +"lng_giveaway_quantity#one" = "{count} boost"; +"lng_giveaway_quantity#other" = "{count} boosts"; +"lng_giveaway_quantity_about" = "Choose how many Premium subscriptions to give away and boosts to receive."; +"lng_giveaway_channels_title" = "Channels included in the giveaway"; +"lng_giveaway_channels_this#one" = "this channel will receive {count} boost"; +"lng_giveaway_channels_this#other" = "this channel will receive {count} boosts"; +"lng_giveaway_channels_this_group#one" = "this group will receive {count} boost"; +"lng_giveaway_channels_this_group#other" = "this group will receive {count} boosts"; +"lng_giveaway_channels_add" = "Add Channel"; +"lng_giveaway_channels_about" = "Choose the channels the users need to join to take part in the giveaway."; +"lng_giveaway_users_title" = "Users eligible for the giveaway"; +"lng_giveaway_users_all" = "All subscribers"; +"lng_giveaway_users_all_group" = "All members"; +"lng_giveaway_users_from_all_countries" = "from all countries"; +"lng_giveaway_users_from_one_country" = "from {country}"; +"lng_giveaway_users_from_countries#one" = "from {count} country"; +"lng_giveaway_users_from_countries#other" = "from {count} countries"; +"lng_giveaway_users_new" = "Only new subscribers"; +"lng_giveaway_users_new_group" = "Only new members"; +"lng_giveaway_users_about" = "Choose if you want to limit the giveaway only to those who joined the channel after the giveaway started or to users from specific countries."; +"lng_giveaway_users_about_group" = "Choose if you want to limit the giveaway only to those who joined the group after the giveaway started or to members from specific countries."; +"lng_giveaway_start" = "Start Giveaway"; +"lng_giveaway_award" = "Gift Premium"; +"lng_giveaway_start_sure" = "Are you sure you want to start this prepaid giveaway now? This action cannot be undone."; +"lng_giveaway_date_title" = "Date when giveaway ends"; +"lng_giveaway_date" = "Date and Time"; +"lng_giveaway_date_about#one" = "Choose when {count} subscriber of your channel will be randomly selected to receive Telegram Premium."; +"lng_giveaway_date_about#other" = "Choose when {count} subscribers of your channel will be randomly selected to receive Telegram Premium."; +"lng_giveaway_date_about_group#one" = "Choose when {count} members of your group will be randomly selected to receive Telegram Premium."; +"lng_giveaway_date_about_group#other" = "Choose when {count} members of your group will be randomly selected to receive Telegram Premium."; +"lng_giveaway_duration_title#one" = "Duration of Premium subscription"; +"lng_giveaway_duration_title#other" = "Duration of Premium subscriptions"; +"lng_giveaway_duration_price" = "{price} x {amount}"; +"lng_giveaway_date_select" = "Select Date and Time"; +"lng_giveaway_date_confirm" = "Confirm"; +"lng_giveaway_recipients_save" = "Save Recipients"; +"lng_giveaway_recipients_deselect" = "Deselect All"; +"lng_giveaway_maximum_countries_error#one" = "You can select maximum {count} country."; +"lng_giveaway_maximum_countries_error#other" = "You can select maximum {count} countries."; +"lng_giveaway_maximum_channels_error#one" = "You can select maximum {count} channel."; +"lng_giveaway_maximum_channels_error#other" = "You can select maximum {count} channels."; +"lng_giveaway_maximum_users_error#one" = "You can select maximum {count} user."; +"lng_giveaway_maximum_users_error#other" = "You can select maximum {count} users."; +"lng_giveaway_channels_confirm_title" = "Channel is Private"; +"lng_giveaway_channels_confirm_about" = "Are you sure you want to add a private channel? Users won't be able to join it without an invite link."; +"lng_giveaway_additional_prizes" = "Additional prizes"; +"lng_giveaway_additional_about" = "Turn this on if you want to give the winners your own prizes in addition to Premium subscriptions."; +"lng_giveaway_additional_prizes_ph" = "Enter your prize"; +"lng_giveaway_prizes_just_premium#one" = "All prizes: **{count}** Telegram Premium subscription {duration}."; +"lng_giveaway_prizes_just_premium#other" = "All prizes: **{count}** Telegram Premium subscriptions {duration}."; +"lng_giveaway_prizes_additional#one" = "All prizes: **{count}** {prize} with Telegram Premium subscription {duration}."; +"lng_giveaway_prizes_additional#other" = "All prizes: **{count}** {prize} with Telegram Premium subscriptions {duration}."; +"lng_giveaway_show_winners" = "Show winners"; +"lng_giveaway_show_winners_about" = "Choose whether to make the list of winners public when the giveaway ends."; + +"lng_giveaway_created_title" = "Giveaway created"; +"lng_giveaway_created_body" = "Check your channels' {link} to see how this giveaway boosted your channel."; +"lng_giveaway_created_body_group" = "Check your groups' {link} to see how this giveaway boosted your group."; +"lng_giveaway_awarded_title" = "Premium subscriptions gifted"; +"lng_giveaway_awarded_body" = "Check your channels' {link} to see how gifts boosted your channel."; +"lng_giveaway_awarded_body_group" = "Check your groups' {link} to see how gifts boosted your group."; +"lng_giveaway_created_link" = "Statistics"; + +"lng_prize_title" = "Congratulations!"; +"lng_prize_about" = "You won a prize in a giveaway organized by {channel}."; +"lng_prize_duration" = "Your prize is a **Telegram Premium** subscription {duration}."; +"lng_prize_gift_about" = "You've received a gift from {channel}."; +"lng_prize_gift_duration" = "Your gift is a **Telegram Premium** subscription {duration}."; +"lng_prize_open" = "Open Gift Link"; +"lng_prize_unclaimed_title" = "Unclaimed Prize"; +"lng_prize_unclaimed_about" = "You have an unclaimed prize from a giveaway by {channel}."; +"lng_prize_unclaimed_duration" = "This prize is a **Telegram Premium** subscription {duration}."; + +"lng_prizes_title#one" = "Giveaway Prize"; +"lng_prizes_title#other" = "Giveaway Prizes"; +"lng_prizes_additional#one" = "**{count}** {prize}"; +"lng_prizes_additional#other" = "**{count}** {prize}"; +"lng_prizes_additional_with" = "with"; +"lng_prizes_about#one" = "**{count}** Telegram Premium Subscription {duration}."; +"lng_prizes_about#other" = "**{count}** Telegram Premium Subscriptions {duration}."; +"lng_prizes_participants" = "Participants"; +"lng_prizes_participants_all#one" = "All subscribers of the channel:"; +"lng_prizes_participants_all#other" = "All subscribers of the channels:"; +"lng_prizes_participants_all_group#one" = "All members of the group:"; +"lng_prizes_participants_all_group#other" = "All members of the groups:"; +"lng_prizes_participants_all_mixed#one" = "All members of the group:"; +"lng_prizes_participants_all_mixed#other" = "All members of the groups and channels:"; +"lng_prizes_participants_new#one" = "All users who joined the channel below after this date:"; +"lng_prizes_participants_new#other" = "All users who joined the channels below after this date:"; +"lng_prizes_participants_new_group#one" = "All users who joined the group below after this date:"; +"lng_prizes_participants_new_group#other" = "All users who joined the groups below after this date:"; +"lng_prizes_participants_new_mixed#one" = "All users who joined the group below after this date:"; +"lng_prizes_participants_new_mixed#other" = "All users who joined the groups and channels below after this date:"; +"lng_prizes_countries" = "from {countries}"; +"lng_prizes_countries_and_one" = "{countries}, {country}"; +"lng_prizes_countries_and_last" = "{countries} and {country}"; +"lng_prizes_date" = "Winners Selection Date"; +"lng_prizes_how_works" = "Learn more"; +"lng_prizes_how_title" = "About this giveaway"; +"lng_prizes_end_title" = "Giveaway ended"; +"lng_prizes_how_text" = "This giveaway is sponsored by {admins}."; +"lng_prizes_end_text" = "This giveaway was sponsored by {admins}."; +"lng_prizes_admins#one" = "the admins of {channel}, who aquired **{count} Telegram Premium** subscription {duration} for its followers"; +"lng_prizes_admins#other" = "the admins of {channel}, who aquired **{count} Telegram Premium** subscriptions {duration} for its followers"; +"lng_prizes_admins_group#one" = "the admins of {channel}, who aquired **{count} Telegram Premium** subscription {duration} for its members"; +"lng_prizes_admins_group#other" = "the admins of {channel}, who aquired **{count} Telegram Premium** subscriptions {duration} for its members"; +"lng_prizes_additional_added#one" = "{channel} also included **{count} {prize}** in the prize. Admins of the channel are responsible for delivering this prize."; +"lng_prizes_additional_added#other" = "{channel} also included **{count} {prize}** in the prizes. Admins of the channel are responsible for delivering these prizes."; +"lng_prizes_additional_added_group#one" = "{channel} also included **{count} {prize}** in the prize. Admins of the group are responsible for delivering this prize."; +"lng_prizes_additional_added_group#other" = "{channel} also included **{count} {prize}** in the prizes. Admins of the group are responsible for delivering these prizes."; +"lng_prizes_how_when_finish" = "On {date}, Telegram will automatically select {winners}."; +"lng_prizes_end_when_finish" = "On {date}, Telegram automatically selected {winners}."; +"lng_prizes_end_activated#one" = "**{count}** of the winners already used their gift link."; +"lng_prizes_end_activated#other" = "**{count}** of the winners already used their gift links."; +"lng_prizes_winners_all_of_one#one" = "{count} random subscriber of {channel}"; +"lng_prizes_winners_all_of_one#other" = "{count} random subscribers of {channel}"; +"lng_prizes_winners_all_of_one_group#one" = "{count} random member of {channel}"; +"lng_prizes_winners_all_of_one_group#other" = "{count} random members of {channel}"; +"lng_prizes_winners_all_of_many#one" = "{count} random subscriber of {channel} and other listed groups and channels"; +"lng_prizes_winners_all_of_many#other" = "{count} random subscribers of {channel} and other listed groups and channels"; +"lng_prizes_winners_all_of_many_group#one" = "{count} random member of {channel} and other listed groups and channels"; +"lng_prizes_winners_all_of_many_group#other" = "{count} random members of {channel} and other listed groups and channels"; +"lng_prizes_winners_new_of_one#one" = "{count} random user that joined {channel} after {start_date}"; +"lng_prizes_winners_new_of_one#other" = "{count} random users that joined {channel} after {start_date}"; +"lng_prizes_winners_new_of_many#one" = "{count} random user that joined {channel} and other listed groups and channels after {start_date}"; +"lng_prizes_winners_new_of_many#other" = "{count} random users that joined {channel} and other listed groups and channels after {start_date}"; +"lng_prizes_how_participate_one" = "To take part in this giveaway please join {channel} before {date}."; +"lng_prizes_how_participate_many" = "To take part in this giveaway please join {channel} and other listed groups and channels before {date}."; +"lng_prizes_how_no_admin" = "You are not eligible to participate in this giveaway, because you are an admin of participating channel ({channel})."; +"lng_prizes_how_no_admin_group" = "You are not eligible to participate in this giveaway, because you are an admin of participating group ({channel})."; +"lng_prizes_how_no_joined" = "You are not eligible to participate in this giveaway, because you joined this channel on {date}, which is before the contest started."; +"lng_prizes_how_no_joined_group" = "You are not eligible to participate in this giveaway, because you joined this group on {date}, which is before the contest started."; +"lng_prizes_how_no_country" = "You are not eligible to participate in this giveaway, because your country is not included in the terms of the giveaway."; +"lng_prizes_how_yes_joined_one" = "You are participating in this giveaway, because you have joined {channel}."; +"lng_prizes_how_yes_joined_many" = "You are participating in this giveaway, because you have joined {channel} (and other listed groups and channels)."; +"lng_prizes_you_won" = "You won a prize in this giveaway {cup}"; +"lng_prizes_view_prize" = "View my prize"; +"lng_prizes_you_didnt" = "You didn't win a prize in this giveaway."; +"lng_prizes_cancelled" = "The channel cancelled the prizes by reversing the payment for them."; +"lng_prizes_cancelled_group" = "The channel cancelled the prizes by reversing the payment for them."; +"lng_prizes_badge" = "x{amount}"; + +"lng_prizes_results_title" = "Winners Selected!"; +"lng_prizes_results_about#one" = "**{count}** winner of the {link} was randomly selected by Telegram."; +"lng_prizes_results_about#other" = "**{count}** winners of the {link} were randomly selected by Telegram."; +"lng_prizes_results_link" = "Giveaway"; +"lng_prizes_results_winners" = "Winners"; +"lng_prizes_results_more#one" = "and {count} more!"; +"lng_prizes_results_more#other" = "and {count} more!"; +"lng_prizes_results_all" = "All winners received gift links in private messages."; +"lng_prizes_results_some" = "Some winners couldn't be selected."; + +"lng_gift_link_title" = "Gift Link"; +"lng_gift_link_about" = "This link allows you to activate\na **Telegram Premium** subscription."; +"lng_gift_link_label_from" = "From"; +"lng_gift_link_label_to" = "To"; +"lng_gift_link_label_to_unclaimed" = "No recipient"; +"lng_gift_link_label_gift" = "Gift"; +"lng_gift_link_gift_premium" = "Telegram Premium {duration}"; +"lng_gift_link_label_reason" = "Reason"; +"lng_gift_link_reason_giveaway" = "Giveaway"; +"lng_gift_link_reason_unclaimed" = "Incomplete Giveaway"; +"lng_gift_link_reason_chosen" = "You were selected by the channel"; +"lng_gift_link_label_date" = "Date"; +"lng_gift_link_also_send" = "You can also {link} to a friend as a gift."; +"lng_gift_link_also_send_link" = "send this link"; +"lng_gift_link_use" = "Use Link"; +"lng_gift_link_used_title" = "Used Gift Link"; +"lng_gift_link_used_about" = "This link was used to activate\na **Telegram Premium** subscription."; +"lng_gift_link_used_footer" = "This link was used on {date}."; +"lng_gift_link_expired" = "Gift code link expired"; +"lng_gift_link_pending_about" = "This link allows {user} to activate\na **Telegram Premium** subscription."; +"lng_gift_link_pending_toast" = "Only the recipient can see the link."; +"lng_gift_link_pending_footer" = "This link hasn't been activated yet."; + +"lng_accounts_limit_title" = "Limit Reached"; +"lng_accounts_limit1#one" = "You have reached the limit of **{count}** connected accounts."; +"lng_accounts_limit1#other" = "You have reached the limit of **{count}** connected accounts."; +"lng_accounts_limit2" = "You can free one space by subscribing to **Telegram Premium** with one of these connected accounts:"; + +"lng_emoji_status_for_title" = "Set Status for..."; +"lng_emoji_status_for_submit" = "Set Status"; +"lng_emoji_status_menu_duration_any" = "Set Status for {duration}"; "lng_group_about_header" = "You have created a group."; "lng_group_about_text" = "Groups can have:"; @@ -1507,6 +2622,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_switch_gifs" = "GIFs"; "lng_switch_masks" = "Masks"; "lng_stickers_featured_add" = "Add"; +"lng_stickers_featured_installed" = "Added"; +"lng_emoji_featured_unlock" = "Unlock"; +"lng_emoji_premium_restore" = "Restore"; "lng_gifs_search" = "Search GIFs"; "lng_gifs_no_saved" = "You have no saved GIFs yet."; @@ -1522,11 +2640,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_stickers_remove_pack" = "Remove «{sticker_pack}»?"; "lng_stickers_add_pack" = "Add stickers"; "lng_stickers_add_masks" = "Add masks"; +"lng_stickers_add_emoji" = "Add emoji"; "lng_stickers_share_pack" = "Share Stickers"; "lng_stickers_share_masks" = "Share Masks"; +"lng_stickers_share_emoji" = "Share Emoji"; "lng_stickers_not_found" = "Sticker pack not found."; "lng_stickers_packs_archived" = "Some of your unused stickers have been archived to make room for the sets you've activated."; "lng_stickers_copied" = "Sticker pack link copied to clipboard."; +"lng_stickers_copied_emoji" = "Emoji pack link copied to clipboard."; "lng_stickers_default_set" = "Great Minds"; "lng_stickers_you_have" = "Manage sticker packs"; "lng_stickers_return" = "Undo"; @@ -1534,19 +2655,27 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_stickers_count#other" = "{count} stickers"; "lng_masks_count#one" = "{count} mask"; "lng_masks_count#other" = "{count} masks"; +"lng_custom_emoji_count#one" = "{count} emoji"; +"lng_custom_emoji_count#other" = "{count} emoji"; "lng_stickers_attached_sets" = "Sets of attached stickers"; +"lng_custom_emoji_used_sets" = "Sets of used emoji"; +"lng_custom_emoji_remove_pack_button" = "Remove Emoji"; "lng_stickers_group_set" = "Group sticker set"; "lng_stickers_remove_group_set" = "Remove group sticker set?"; "lng_stickers_group_from_your" = "Choose from your stickers"; "lng_stickers_group_from_featured" = "Choose from trending stickers"; -"lng_stickers_search_sets" = "Search sticker sets"; "lng_stickers_nothing_found" = "No stickers found"; "lng_stickers_remove_pack_confirm" = "Remove"; "lng_stickers_archive_pack" = "Archive Stickers"; "lng_stickers_has_been_archived" = "Sticker pack has been archived."; +"lng_emoji_group_set" = "Group emoji set"; +"lng_emoji_remove_group_set" = "Remove group emoji set?"; +"lng_emoji_group_from_your" = "Choose from your emoji"; +"lng_emoji_group_from_featured" = "Choose from trending emoji"; "lng_masks_archive_pack" = "Archive Masks"; "lng_masks_has_been_archived" = "Mask pack has been archived."; "lng_masks_installed" = "Mask pack has been installed."; +"lng_emoji_nothing_found" = "No emoji found"; "lng_in_dlg_photo" = "Photo"; "lng_in_dlg_album" = "Album"; @@ -1555,13 +2684,27 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_in_dlg_contact" = "Contact"; "lng_in_dlg_audio" = "Voice message"; "lng_in_dlg_video_message" = "Video message"; +"lng_in_dlg_voice_message_ttl" = "One-time Voice Message"; +"lng_in_dlg_video_message_ttl" = "One-time Video Message"; "lng_in_dlg_file" = "File"; "lng_in_dlg_sticker" = "Sticker"; "lng_in_dlg_sticker_emoji" = "{emoji} Sticker"; "lng_in_dlg_poll" = "Poll"; +"lng_in_dlg_story" = "Story"; +"lng_in_dlg_story_expired" = "Expired story"; +"lng_in_dlg_media_count#one" = "{count} media"; +"lng_in_dlg_media_count#other" = "{count} media"; +"lng_in_dlg_photo_count#one" = "{count} photo"; +"lng_in_dlg_photo_count#other" = "{count} photos"; +"lng_in_dlg_video_count#one" = "{count} video"; +"lng_in_dlg_video_count#other" = "{count} videos"; +"lng_in_dlg_file_count#one" = "{count} file"; +"lng_in_dlg_file_count#other" = "{count} files"; +"lng_in_dlg_audio_count#one" = "{count} audio"; +"lng_in_dlg_audio_count#other" = "{count} audio"; "lng_ban_user" = "Ban User"; -"lng_delete_all_from" = "Delete all from this user"; +"lng_delete_all_from_user" = "Delete all from {user}"; "lng_report_spam" = "Report Spam"; "lng_report_spam_and_leave" = "Report spam and leave"; "lng_report_spam_done" = "Thank you for your report."; @@ -1579,6 +2722,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_new_contact_unarchive" = "Unarchive"; "lng_new_contact_from_request_channel" = "{user} is an admin of {name}, a channel you requested to join."; "lng_new_contact_from_request_group" = "{user} is an admin of {name}, a group you requested to join."; +"lng_new_contact_about_status" = "This account uses {emoji} as a custom status next to its\nname. Such emoji statuses are available to all\nsubscribers of {link}."; +"lng_new_contact_about_status_link" = "Telegram Premium"; "lng_from_request_title_channel" = "Chat with channel's admin"; "lng_from_request_title_group" = "Chat with group's admin"; "lng_from_request_body" = "You received this message because you requested to join {name} on {date}."; @@ -1588,7 +2733,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_cant_more_info" = "More info »"; "lng_cant_invite_banned" = "Sorry, only admin can add this user."; "lng_cant_invite_privacy" = "Sorry, you cannot add this user to groups because of their privacy settings."; -"lng_cant_invite_privacy_channel" = "Sorry, you cannot add this user to channels because of their privacy settings."; "lng_cant_invite_bot_to_channel" = "Sorry, bots can only be added to channels as administrators."; "lng_cant_do_this" = "Sorry, this action is unavailable."; "lng_cant_invite_offer_admin" = "Bots can only be added as administrators."; @@ -1606,13 +2750,32 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_broadcast_ph" = "Broadcast a message..."; "lng_broadcast_silent_ph" = "Silent broadcast..."; "lng_send_anonymous_ph" = "Send anonymously..."; +"lng_story_reply_ph" = "Reply privately..."; +"lng_story_comment_ph" = "Comment story..."; +"lng_send_text_no" = "Text not allowed."; +"lng_send_text_no_about" = "The admins of this group only allow sending {types}."; +"lng_send_text_type_and_last" = "{types} and {last}"; +"lng_send_text_type_photos" = "Photos"; +"lng_send_text_type_videos" = "Video files"; +"lng_send_text_type_video_messages" = "Video Messages"; +"lng_send_text_type_music" = "Music"; +"lng_send_text_type_voice_messages" = "Voice Messages"; +"lng_send_text_type_files" = "Files"; +"lng_send_text_type_stickers" = "Stickers & GIFs"; +"lng_send_text_type_polls" = "Polls"; + "lng_send_as_title" = "Send message as..."; "lng_send_as_anonymous_admin" = "Anonymous admin"; +"lng_send_as_premium_required" = "Subscribe to {link} to be able to comment on behalf of your channels in group chats."; +"lng_send_as_premium_required_link" = "Telegram Premium"; "lng_record_cancel" = "Release outside this field to cancel"; +"lng_record_cancel_stories" = "Release outside to cancel"; "lng_record_lock_cancel_sure" = "Are you sure you want to stop recording and discard your voice message?"; "lng_record_listen_cancel_sure" = "Are you sure you want to discard your recorded voice message?"; "lng_record_lock_discard" = "Discard"; "lng_record_hold_tip" = "Please hold the mouse button pressed to record a voice message."; +"lng_record_once_first_tooltip" = "Click to set this message to **Play Once**."; +"lng_record_once_active_tooltip" = "The recipients will be able to listen to it only once."; "lng_will_be_notified" = "Members will be notified when you post"; "lng_wont_be_notified" = "Members will not be notified when you post"; "lng_willbe_history" = "Please select a chat to start messaging"; @@ -1627,6 +2790,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_saved_messages" = "Saved Messages"; "lng_saved_short" = "Save"; "lng_saved_forward_here" = "Forward messages here for quick access"; +"lng_saved_quote_here" = "Quote here to save"; +"lng_saved_open_chat" = "Open Chat"; +"lng_saved_open_channel" = "Open Channel"; +"lng_saved_open_group" = "Open Group"; +"lng_saved_about_hidden" = "Senders of this messages restricted to link their name when forwarding."; "lng_scheduled_messages" = "Scheduled Messages"; "lng_scheduled_messages_empty" = "No scheduled messages here yet..."; @@ -1644,6 +2812,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_replies_header#one" = "{count} reply"; "lng_replies_header#other" = "{count} replies"; "lng_replies_header_none" = "Replies"; +"lng_replies_view_topic" = "View in Topic"; "lng_comments_header#one" = "{count} comment"; "lng_comments_header#other" = "{count} comments"; "lng_comments_header_none" = "Comments"; @@ -1652,6 +2821,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_comments_open_none" = "Leave a comment"; "lng_replies_view_original" = "View in chat"; "lng_replies_messages" = "Replies"; +"lng_hidden_author_messages" = "Author Hidden"; +"lng_my_notes" = "My Notes"; "lng_replies_discussion_started" = "Discussion started"; "lng_replies_no_comments" = "No comments here yet..."; @@ -1668,8 +2839,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_dialogs_text_from_wrapped" = "{from}:"; "lng_dialogs_text_media" = "{media_part} {caption}"; "lng_dialogs_text_media_wrapped" = "{media},"; -"lng_dialogs_show_all_chats" = "Show all chats"; -"lng_dialogs_hide_muted_chats" = "Hide muted chats"; +"lng_dialogs_text_from_in_topic" = "{from} {topic}"; "lng_dialogs_skip_archive_in_search" = "Skip results from archive"; "lng_dialogs_show_archive_in_search" = "With results from archive"; @@ -1680,6 +2850,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_open_link" = "Open"; "lng_allow_bot_pass" = "Allow {bot_name} to pass your Telegram name and ID to the web pages you open via this bot?"; "lng_allow_bot" = "Allow"; +"lng_allow_bot_webview" = "{bot_name} would like to open its web app to proceed.\n\nIt will be able to access your **IP address** and basic device info."; "lng_url_auth_open_confirm" = "Do you want to open {link}?"; "lng_url_auth_login_option" = "Log in to {domain} as {user}"; "lng_url_auth_allow_messages" = "Allow {bot} to send me messages"; @@ -1695,6 +2866,37 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_bot_chats_not_found" = "No chats found"; "lng_bot_sure_share_game" = "Share the game with {user}?"; "lng_bot_sure_share_game_group" = "Share the game with «{group}»?"; +"lng_bot_groups_manage" = "Groups I manage"; +"lng_bot_channels_manage" = "Channels I manage"; +"lng_bot_groups" = "Groups"; +"lng_bot_add_title" = "Add Bot"; +"lng_bot_as_admin_check" = "Admin rights"; +"lng_bot_add_as_admin" = "Add Bot as Admin"; +"lng_bot_add_as_member" = "Add Bot as Member"; +"lng_bot_sure_add_text_group" = "Are you sure you want to add this bot as an admin in the group {group}?"; +"lng_bot_sure_add_text_channel" = "Are you sure you want to add this bot as an admin in the channel {group}?"; +"lng_bot_no_webview" = "Unfortunately, you can't open such menu with current system configuration."; +"lng_bot_remove_from_menu" = "Remove From Menu"; +"lng_bot_remove_from_menu_sure" = "Remove {bot} from the attachment menu?"; +"lng_bot_remove_from_menu_done" = "Bot removed from the menu."; +"lng_bot_remove_from_side_menu" = "Remove From Menu"; +"lng_bot_remove_from_side_menu_sure" = "Remove {bot} from the main menu?"; +"lng_bot_remove_from_side_menu_done" = "Bot removed from the main menu."; +"lng_bot_settings" = "Settings"; +"lng_bot_open" = "Open Bot"; +"lng_bot_reload_page" = "Reload Page"; +"lng_bot_add_to_menu" = "{bot} asks your permission to be added as an option to your attachments menu so you can access it from any chat."; +"lng_bot_add_to_menu_done" = "Bot added to the menu."; +"lng_bot_will_be_added" = "{bot} shortcuts will be added to the attachment options and the main menu."; +"lng_bot_side_menu_new" = "NEW"; +"lng_bot_menu_not_supported" = "This bot isn't supported in the attach menu."; +"lng_bot_menu_already_added" = "This bot is already added in your attach menu."; +"lng_bot_menu_button" = "Menu"; +"lng_bot_close_warning_title" = "Warning"; +"lng_bot_close_warning" = "Changes that you made may not be saved."; +"lng_bot_close_warning_sure" = "Close anyway"; +"lng_bot_add_to_side_menu" = "{bot} asks your permission to be added as an option to your main menu so you can access it any time."; +"lng_bot_add_to_side_menu_done" = "Bot added to the main menu."; "lng_typing" = "typing"; "lng_user_typing" = "{user} is typing"; @@ -1744,10 +2946,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_choose_files" = "Choose files"; "lng_game_tag" = "Game"; +"lng_context_new_window" = "Open in new window"; "lng_context_view_profile" = "View profile"; "lng_context_send_message" = "Send message"; "lng_context_view_group" = "View group info"; "lng_context_view_channel" = "View channel info"; +"lng_context_view_topic" = "View topic info"; "lng_context_hide_psa" = "Hide this announcement"; "lng_context_pin_to_top" = "Pin to top"; "lng_context_unpin_from_top" = "Unpin from top"; @@ -1763,8 +2967,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_context_archive_to_menu" = "Move to main menu"; "lng_context_archive_to_list" = "Move to chats list"; "lng_context_archive_to_menu_info" = "Archive moved to the main menu!\nYou can return it from the context menu of the archive button."; +"lng_context_archive_settings" = "Archive settings"; -"lng_context_mute" = "Mute notifications"; +"lng_context_mute" = "Mute"; "lng_context_unmute" = "Unmute"; "lng_context_promote_admin" = "Promote to admin"; @@ -1776,9 +2981,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_context_copy_link" = "Copy Link"; "lng_context_copy_message_link" = "Copy Message Link"; "lng_context_copy_post_link" = "Copy Post Link"; +"lng_context_copy_topic_link" = "Copy Topic Link"; "lng_context_copy_email" = "Copy Email Address"; "lng_context_copy_hashtag" = "Copy Hashtag"; "lng_context_copy_mention" = "Copy Username"; +"lng_context_copy_filename" = "Copy Filename"; "lng_context_save_image" = "Save Image As..."; "lng_context_copy_image" = "Copy Image"; "lng_context_cancel_download" = "Cancel Download"; @@ -1794,9 +3001,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_context_open_gif" = "Open GIF"; "lng_context_save_gif" = "Save GIF"; "lng_context_delete_gif" = "Delete GIF"; +"lng_context_open_channel" = "Open Channel"; +"lng_context_open_group" = "Open Group"; "lng_context_attached_stickers" = "Attached Stickers"; "lng_context_to_msg" = "Go To Message"; "lng_context_reply_msg" = "Reply"; +"lng_context_quote_and_reply" = "Quote & Reply"; "lng_context_edit_msg" = "Edit"; "lng_context_forward_msg" = "Forward Message"; "lng_context_send_now_msg" = "Send now"; @@ -1814,6 +3024,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_context_send_now_selected" = "Send selected now"; "lng_context_reschedule_selected" = "Reschedule Selected"; "lng_context_delete_selected" = "Delete Selected"; +"lng_context_save_images_selected" = "Save Selected"; +"lng_context_save_documents_selected" = "Download Selected"; "lng_context_clear_selection" = "Clear Selection"; "lng_context_seen_loading" = "Loading..."; "lng_context_seen_text#one" = "{count} Seen"; @@ -1829,23 +3041,79 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_context_seen_reacted#other" = "{count} Reacted"; "lng_context_seen_reacted_none" = "Nobody Reacted"; "lng_context_seen_reacted_all" = "Show All Reactions"; -"lng_context_set_as_quick" = "Set As Quick"; +"lng_context_set_as_quick" = "Set as Quick"; +"lng_context_filter_by_tag" = "Filter by Tag"; +"lng_context_tag_add_name" = "Add Name"; +"lng_context_tag_edit_name" = "Edit Name"; +"lng_context_remove_tag" = "Remove Tag"; +"lng_context_delete_from_disk" = "Delete from disk"; +"lng_context_delete_all_files" = "Delete all files"; +"lng_context_save_custom_sound" = "Save for notifications"; +"lng_context_translate" = "Translate"; +"lng_context_translate_selected" = "Translate Selected Text"; +"lng_context_read_hidden" = "read"; +"lng_context_read_show" = "show when"; +"lng_context_edit_shortcut" = "Edit Shortcut"; +"lng_context_delete_shortcut" = "Delete Quick Reply"; + +"lng_add_tag_about" = "Tag this message with an emoji for quick search."; +"lng_subscribe_tag_about" = "Organize your Saved Messages with tags. {link}"; +"lng_subscribe_tag_link" = "Learn More..."; +"lng_edit_tag_about" = "You can label your emoji tag with a text name."; +"lng_edit_tag_name" = "Name"; +"lng_add_tag_button" = "Add tags"; +"lng_add_tag_phrase" = "to messages {arrow}"; +"lng_add_tag_phrase_long" = "to your Saved Messages {arrow}"; +"lng_unlock_tags" = "Unlock"; + +"lng_context_animated_emoji" = "This message contains emoji from **{name} pack**."; +"lng_context_animated_emoji_many#one" = "This message contains emoji from **{count} pack**."; +"lng_context_animated_emoji_many#other" = "This message contains emoji from **{count} packs**."; +"lng_context_animated_reaction" = "This reaction is from **{name} pack**."; +"lng_context_animated_tag" = "This tag is from **{name} pack**."; +"lng_context_animated_reactions" = "Reactions contain emoji from **{name} pack**."; +"lng_context_animated_reactions_many#one" = "Reactions contain emoji from **{count} pack**."; +"lng_context_animated_reactions_many#other" = "Reactions contain emoji from **{count} packs**."; + +"lng_context_spoiler_effect" = "Hide with Spoiler"; +"lng_context_disable_spoiler" = "Remove Spoiler"; + +"lng_translate_show_original" = "Show Original"; +"lng_translate_bar_to" = "Translate to {name}"; +"lng_translate_bar_to_other" = "Translate to {name}"; +"lng_translate_menu_to" = "Translate To"; +"lng_translate_menu_dont" = "Don't translate {name}"; +"lng_translate_menu_dont_other" = "Don't translate {name}"; +"lng_translate_menu_hide" = "Hide"; +"lng_translate_hidden_user" = "Translation bar is now hidden for this chat."; +"lng_translate_hidden_group" = "Translation bar is now hidden for this group."; +"lng_translate_hidden_channel" = "Translation bar is now hidden for this channel."; +"lng_translate_dont_added" = "{name} is added to the Do Not Translate list."; +"lng_translate_settings" = "Settings"; +"lng_translate_undo" = "Undo"; + +"lng_downloads_section" = "Downloads"; +"lng_downloads_view_in_chat" = "View in chat"; +"lng_downloads_view_in_section" = "View in downloads"; +"lng_downloads_delete_sure_one" = "Do you want to delete this file?"; +"lng_downloads_delete_sure_all" = "Do you want to delete all files?"; +"lng_downloads_delete_sure#one" = "Do you want to delete {count} file?"; +"lng_downloads_delete_sure#other" = "Do you want to delete {count} files?"; +"lng_downloads_delete_in_cloud_one" = "It will be deleted from your disk, but will remain accessible in the cloud."; +"lng_downloads_delete_in_cloud" = "They will be deleted from your disk, but will remain accessible in the cloud."; "lng_send_image_empty" = "Could not send an empty file: {name}"; -"lng_send_image_too_large" = "Could not send a file, because it is larger than 1500 MB: {name}"; "lng_send_images_selected#one" = "{count} image selected"; "lng_send_images_selected#other" = "{count} images selected"; -"lng_send_photos#one" = "Send {count} photo"; -"lng_send_photos#other" = "Send {count} photos"; -"lng_send_separate_photos" = "Send as separate photos"; -"lng_send_separate_photos_videos" = "Send as separate media"; "lng_send_files_selected#one" = "{count} file selected"; "lng_send_files_selected#other" = "{count} files selected"; -"lng_send_files#one" = "Send {count} file"; -"lng_send_files#other" = "Send {count} files"; "lng_send_grouped" = "Group items"; +"lng_send_compressed_one" = "Compress the image"; "lng_send_compressed" = "Compress images"; "lng_send_media_invalid_files" = "Sorry, no valid files found."; +"lng_send_image" = "Send an image"; +"lng_send_file" = "Send a file"; +"lng_send_video" = "Send a video file"; "lng_forward_choose" = "Choose recipient..."; "lng_forward_cant" = "Sorry, no way to forward here :("; @@ -1861,6 +3129,27 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_forwarding_from_two" = "{user} and {second_user}"; "lng_inline_switch_choose" = "Choose conversation..."; "lng_inline_switch_cant" = "Sorry, no way to write here :("; +"lng_preview_reply_to" = "Reply to {name}"; +"lng_preview_reply_to_quote" = "Reply to quote by {name}"; + +"lng_reply_in_another_title" = "Reply in..."; +"lng_reply_in_another_chat" = "Reply in Another Chat"; +"lng_reply_show_in_chat" = "Show in Chat"; +"lng_reply_remove" = "Do Not Reply"; +"lng_reply_about_quote" = "You can select specific part to quote."; +"lng_reply_options_header" = "Reply to Message"; +"lng_reply_options_quote" = "Update Quote"; +"lng_reply_header_short" = "Reply"; +"lng_reply_quote_selected" = "Quote Selected"; +"lng_reply_from_private_chat" = "This reply is from a private chat."; +"lng_link_options_header" = "Link Preview Settings"; +"lng_link_header_short" = "Link"; +"lng_link_move_up" = "Move Up"; +"lng_link_move_down" = "Move Down"; +"lng_link_shrink_photo" = "Shrink Photo"; +"lng_link_enlarge_photo" = "Enlarge Photo"; +"lng_link_remove" = "Do Not Preview"; +"lng_link_about_choose" = "Click on a link to generate its preview."; "lng_share_cant" = "Sorry, no way to share here :("; "lng_reply_cant" = "Sorry, no way to reply to an old message in supergroup :("; @@ -1872,6 +3161,16 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_share_wrong_user" = "This game was opened from a different user."; "lng_share_game_link_copied" = "Game link copied to clipboard."; "lng_share_done" = "Done!"; +"lng_share_message_to_saved_messages" = "Message forwarded to **Saved Messages**."; +"lng_share_messages_to_saved_messages" = "Messages forwarded to **Saved Messages**."; +"lng_share_message_to_chat" = "Message forwarded to **{chat}**."; +"lng_share_messages_to_chat" = "Messages forwarded to **{chat}**."; +"lng_share_message_to_two_chats" = "Message forwarded to **{user}** and **{chat}**."; +"lng_share_messages_to_two_chats" = "Messages forwarded to **{user}** and **{chat}**."; +"lng_share_message_to_many_chats#one" = "Message forwarded to **{count} chat**."; +"lng_share_message_to_many_chats#other" = "Message forwarded to **{count} chats**."; +"lng_share_messages_to_many_chats#one" = "Messages forwarded to **{count} chat**."; +"lng_share_messages_to_many_chats#other" = "Messages forwarded to **{count} chats**."; "lng_contact_phone" = "Phone Number"; "lng_enter_contact_data" = "New Contact"; @@ -1881,18 +3180,34 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_contact_phone_will_be_shared" = "You can make your phone visible to {user}."; "lng_edit_contact_title" = "Edit contact name"; "lng_edit_channel_title" = "Edit channel"; +"lng_edit_bot_title" = "Edit bot"; "lng_edit_sign_messages" = "Sign messages"; "lng_edit_group" = "Edit group"; +"lng_edit_channel_color" = "Change name color"; +"lng_edit_channel_level_min" = "Level 1+"; +"lng_edit_channel_wallpaper" = "Channel wallpaper"; +"lng_edit_channel_wallpaper_about" = "Set a wallpaper that will be visible for everyone reading your channel."; +"lng_edit_channel_wallpaper_group" = "Group wallpaper"; +"lng_edit_channel_wallpaper_about_group" = "Set a wallpaper that will be visible for everyone participating in your group."; +"lng_edit_channel_status" = "Channel emoji status"; +"lng_edit_channel_status_about" = "Choose a status that will be shown next to the channel's name."; +"lng_edit_channel_status_group" = "Group emoji status"; +"lng_edit_channel_status_about_group" = "Choose a status that will be shown next to the group's name."; "lng_edit_self_title" = "Edit your name"; "lng_confirm_contact_data" = "New Contact"; "lng_add_contact" = "Create"; "lng_add_contact_button" = "New contact"; "lng_contacts_header" = "Contacts"; +"lng_contacts_hidden_stories" = "Hidden Stories"; +"lng_contacts_stories_status#one" = "{count} story"; +"lng_contacts_stories_status#other" = "{count} stories"; +"lng_contacts_stories_status_new#one" = "{count} new story"; +"lng_contacts_stories_status_new#other" = "{count} new stories"; "lng_contact_not_joined" = "Unfortunately {name} has not joined Telegram yet, but you can send them an invitation.\n\nWe will notify you about any of your contacts who join Telegram."; "lng_try_other_contact" = "Try someone else"; "lng_create_group_link" = "Link"; "lng_create_group_invite_link" = "Invite link"; -"lng_create_group_description" = "Description (optional)"; +"lng_create_group_description" = "Add description..."; "lng_drag_images_here" = "Drop images here"; "lng_drag_photos_here" = "Drop photos here"; @@ -1928,12 +3243,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_selected_unsend_about_group#one" = "You can also delete the {count} message you sent from the inboxes of other group members by checking \"Unsend my messages\"."; "lng_selected_unsend_about_group#other" = "You can also delete the {count} messages you sent from the inboxes of other group members by checking \"Unsend my messages\"."; "lng_delete_for_everyone_check" = "Delete for everyone"; -"lng_delete_for_other_check" = "Also delete for {user}"; +"lng_delete_for_other_check" = "Also delete for **{user}**"; "lng_delete_for_other_my" = "Unsend my messages"; "lng_box_delete" = "Delete"; "lng_box_leave" = "Leave"; "lng_upload_sure_stop" = "Are you sure you want to stop uploading your files?\n\nIf you do, you'll need to start over."; +"lng_download_sure_stop" = "Are you sure you want to stop downloading your files?\n\nIf you do, you'll need to start over."; "lng_upload_show_file" = "Show file"; "lng_about_version" = "version {version}"; @@ -1949,28 +3265,43 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_search_found_results#other" = "Found {count} messages"; "lng_search_global_results" = "Global search results"; "lng_search_messages_from" = "Show messages from"; +"lng_search_messages_n_of_amount" = "{n} of {amount}"; +"lng_search_messages_none" = "No result"; "lng_media_save_progress" = "{ready} of {total} {mb}"; "lng_mediaview_save_as" = "Save As..."; "lng_mediaview_copy" = "Copy"; "lng_mediaview_forward" = "Forward"; "lng_mediaview_delete" = "Delete"; +"lng_mediaview_save_to_profile" = "Save to Profile"; +"lng_mediaview_archive_story" = "Archive Story"; "lng_mediaview_photos_all" = "View all photos"; "lng_mediaview_files_all" = "View all files"; "lng_mediaview_single_photo" = "Single Photo"; "lng_mediaview_group_photo" = "Group Photo"; "lng_mediaview_channel_photo" = "Channel Photo"; "lng_mediaview_profile_photo" = "Profile Photo"; +"lng_mediaview_profile_public_photo" = "Public Photo"; +"lng_mediaview_profile_photo_by_you" = "Photo set by you"; "lng_mediaview_file_n_of_amount" = "{file} {n} of {amount}"; "lng_mediaview_n_of_amount" = "Photo {n} of {amount}"; "lng_mediaview_doc_image" = "File"; "lng_mediaview_today" = "today at {time}"; "lng_mediaview_yesterday" = "yesterday at {time}"; +"lng_mediaview_just_now" = "just now"; +"lng_mediaview_minutes_ago#one" = "{count} minute ago"; +"lng_mediaview_minutes_ago#other" = "{count} minutes ago"; +"lng_mediaview_hours_ago#one" = "{count} hour ago"; +"lng_mediaview_hours_ago#other" = "{count} hours ago"; "lng_mediaview_date_time" = "{date} at {time}"; +"lng_mediaview_set_userpic" = "Set as Main"; +"lng_mediaview_report_profile_photo" = "Report"; +"lng_mediaview_title" = "Media viewer"; "lng_mediaview_saved_to" = "Image was saved to your {downloads} folder"; +"lng_mediaview_saved_images_to" = "Images were saved to your {downloads} folder"; +"lng_mediaview_video_saved_to" = "Video file was saved to your {downloads} folder"; "lng_mediaview_downloads" = "Downloads"; -"lng_mediaview_video_loading" = "Loading - {percent}"; "lng_mediaview_playback_speed" = "Playback speed: {speed}"; "lng_mediaview_rotate_video" = "Rotate video"; @@ -1981,8 +3312,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_theme_preview_users#one" = "{count} person is using this theme"; "lng_theme_preview_users#other" = "{count} people are using this theme"; -"lng_new_authorization" = "{name},\nWe detected a login into your account from a new device on {day}, {date} at {time}\n\nDevice: {device}\nLocation: {location}\n\nIf this wasn't you, you can go to Settings — Show all sessions and terminate that session.\n\nIf you think that somebody logged in to your account against your will, you can enable two-step verification in Settings.\n\nSincerely,\nThe Telegram Team"; - "lng_new_version_wrap" = "Telegram Desktop was updated to version {version}\n\n{changes}\n\nFull version history is available here:\n{link}"; "lng_new_version_minor" = "— Bug fixes and other minor improvements"; @@ -1992,6 +3321,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_menu_formatting_italic" = "Italic"; "lng_menu_formatting_underline" = "Underline"; "lng_menu_formatting_strike_out" = "Strike-through"; +"lng_menu_formatting_blockquote" = "Quote"; "lng_menu_formatting_monospace" = "Monospace"; "lng_menu_formatting_spoiler" = "Spoiler"; "lng_menu_formatting_link_create" = "Create link"; @@ -2004,6 +3334,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_formatting_link_create" = "Create"; "lng_text_copied" = "Text copied to clipboard."; +"lng_code_copied" = "Block copied to clipboard."; "lng_spellchecker_submenu" = "Spelling"; "lng_spellchecker_add" = "Add to Dictionary"; @@ -2026,9 +3357,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_theme_editor_saved_to_jpg" = "Saved to JPEG, {size}"; "lng_theme_editor_read_from_jpg" = "JPEG image, {size}"; "lng_theme_editor_read_from_png" = "PNG image, {size}"; -"lng_theme_editor_export" = "Export"; "lng_theme_editor_choose_image" = "Choose background image"; -"lng_theme_editor_save_palette" = "Save palette file"; "lng_theme_editor_choose_name" = "Save theme file"; "lng_theme_editor_error" = "The editor encountered an error :( See 'log.txt' for details."; "lng_theme_editor_sure_close" = "Are you sure you want to close the editor? Your changes won't be saved."; @@ -2039,7 +3368,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_theme_editor_save_button" = "Save theme"; "lng_theme_editor_create_title" = "Create theme"; -"lng_theme_editor_attach_title" = "Attach desktop theme"; "lng_theme_editor_create" = "Create"; "lng_theme_editor_name" = "Theme name"; "lng_theme_editor_create_description" = "New theme will be based on your currently selected colors and wallpaper. Alternatively, you can import existing theme or color palette from file."; @@ -2052,13 +3380,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_theme_editor_menu_import" = "Import theme"; "lng_theme_editor_menu_show" = "Show palette file"; -"lng_payments_not_supported" = "Sorry, Telegram Desktop doesn't support payments yet. Please use one of our mobile apps to do this."; -"lng_payments_webview_no_card" = "Unfortunately, you can't add a new card with current system configuration."; "lng_payments_webview_no_use" = "Unfortunately, you can't use payments with current system configuration."; "lng_payments_webview_install_edge" = "Please install {link}."; -"lng_payments_webview_install_webkit" = "Please install WebKitGTK (webkit2gtk-5.0/webkit2gtk-4.1/webkit2gtk-4.0) using your package manager."; -"lng_payments_webview_switch_mutter" = "Qt's window embedding doesn't work well with Mutter window manager. Please switch to another window manager or desktop environment."; -"lng_payments_webview_switch_wayland" = "There is no way to embed WebView window on Wayland. Please switch to X11."; +"lng_payments_webview_install_webkit" = "Please install WebKitGTK (webkitgtk-6.0/webkit2gtk-4.1/webkit2gtk-4.0) using your package manager."; +"lng_payments_webview_update_windows" = "Please update your system to Windows 8.1 or later."; "lng_payments_sure_close" = "Are you sure you want to close this payment form? The changes you made will be lost."; "lng_payments_receipt_label" = "Receipt"; "lng_payments_receipt_label_test" = "Test receipt"; @@ -2116,6 +3441,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_payments_precheckout_failed" = "The bot couldn't process your payment. Your card has not been billed."; "lng_payments_already_paid" = "You have already paid for this item."; +"lng_payments_terms_title" = "Terms of Service"; +"lng_payments_terms_text" = "Subscribe and accept terms of service of {bot}?"; +"lng_payments_terms_text_once" = "Are you accepting terms of service of {bot}?"; +"lng_payments_terms_agree" = "I agree to {link}"; +"lng_payments_terms_link" = "Terms of Service"; +"lng_payments_terms_accept" = "Accept"; + "lng_call_status_incoming" = "is calling you..."; "lng_call_status_connecting" = "connecting..."; "lng_call_status_exchanging" = "exchanging encryption keys..."; @@ -2126,6 +3458,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_call_status_failed" = "failed to connect"; "lng_call_status_ringing" = "ringing..."; "lng_call_status_busy" = "line busy"; +"lng_call_status_sure" = "Click on the Camera icon if you want to start a video call."; "lng_call_fingerprint_tooltip" = "If emoji on {user}'s screen are the same, this call is 100% secure"; "lng_call_error_not_available" = "Sorry, {user} doesn't accept calls."; @@ -2148,6 +3481,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_call_box_clear_all" = "Clear All"; "lng_call_box_clear_sure" = "Are you sure you want to completely clear your calls log?"; "lng_call_box_clear_button" = "Clear"; +"lng_call_box_groupcalls_subtitle" = "Active video chats"; "lng_call_outgoing" = "Outgoing call"; "lng_call_video_outgoing" = "Outgoing video call"; @@ -2165,6 +3499,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_call_rate_label" = "Please rate the quality of your call"; "lng_call_rate_comment" = "Comment (optional)"; +"lng_call_start" = "Start Call"; "lng_call_start_video" = "Start Video"; "lng_call_stop_video" = "Stop Video"; "lng_call_screencast" = "Screencast"; @@ -2184,22 +3519,17 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_group_call_inactive" = "listening"; "lng_group_call_raised_hand_status" = "wants to speak"; "lng_group_call_settings" = "Settings"; -"lng_group_call_share_button" = "Share"; "lng_group_call_video" = "Video"; "lng_group_call_screen_share_start" = "Share Screen"; "lng_group_call_screen_share_stop" = "Stop Sharing"; "lng_group_call_screen_title" = "Screen {index}"; "lng_group_call_screen_share_audio" = "Share System Audio"; -"lng_group_call_unmute_small" = "Unmute"; -"lng_group_call_more" = "More"; "lng_group_call_unmute" = "Unmute"; "lng_group_call_unmute_sub" = "Hold space bar to temporarily unmute."; "lng_group_call_you_are_live" = "You are Live"; "lng_group_call_force_muted" = "Muted by admin"; "lng_group_call_force_muted_sub" = "You are in Listen Only mode"; -"lng_group_call_raise_hand_tip" = "Click if you want to speak"; "lng_group_call_raised_hand" = "You asked to speak"; -"lng_group_call_raised_hand_sub" = "We let the speakers know"; "lng_group_call_connecting" = "Connecting..."; "lng_group_call_leave" = "Leave"; "lng_group_call_leave_title" = "Leave voice chat"; @@ -2283,14 +3613,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_group_call_context_remove" = "Remove"; "lng_group_call_remove_channel" = "Remove {channel} from the voice chat?"; "lng_group_call_remove_channel_from_channel" = "Remove {channel} from the live stream?"; -"lng_group_call_duration_days#one" = "{count} day"; -"lng_group_call_duration_days#other" = "{count} days"; -"lng_group_call_duration_hours#one" = "{count} hour"; -"lng_group_call_duration_hours#other" = "{count} hours"; -"lng_group_call_duration_minutes#one" = "{count} minute"; -"lng_group_call_duration_minutes#other" = "{count} minutes"; -"lng_group_call_duration_seconds#one" = "{count} second"; -"lng_group_call_duration_seconds#other" = "{count} seconds"; "lng_group_call_mac_access" = "Telegram Desktop does not have access to system wide keyboard input required for Push to Talk."; "lng_group_call_mac_input" = "Please allow **Input Monitoring** for Telegram in Privacy Settings."; "lng_group_call_mac_accessibility" = "Please allow **Accessibility** for Telegram in Privacy Settings.\n\nApp restart may be required."; @@ -2351,6 +3673,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_group_call_unpinned_camera" = "{user}'s video is unpinned."; "lng_group_call_unpinned_screen" = "{user}'s screencast is unpinned."; "lng_group_call_sure_screencast" = "{user} is screensharing. This action will make your screencast pinned for all participants."; +"lng_group_call_pinned_on_top" = "Live stream is pinned on top."; +"lng_group_call_unpinned_on_top" = "Live stream is unpinned from top."; "lng_group_call_recording_start_sure" = "Participants will see the chat is being recorded."; "lng_group_call_recording_stop_sure" = "Do you want to stop recording this chat?"; "lng_group_call_recording_start_field" = "Recording Title"; @@ -2368,6 +3692,32 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_group_call_title_changed_channel" = "Live stream title changed to {title}"; "lng_group_call_join_as_changed" = "Members of this voice chat will now see you as {name}"; "lng_group_call_join_as_changed_channel" = "Members of this live stream will now see you as {name}"; +"lng_group_call_no_stream_admin" = "Oops! Telegram doesn't see any stream coming from your streaming app. Please make sure you entered the right Server URL and Stream Key in your app.."; +"lng_group_call_no_stream" = "{group} is currently not broadcasting live stream data to Telegram."; + +"lng_menu_start_group_call" = "Start video chat"; +"lng_menu_start_group_call_scheduled" = "Schedule video chat"; +"lng_menu_start_group_call_with" = "Stream with..."; +"lng_menu_start_group_call_join" = "Join video chat"; +"lng_menu_start_group_call_options" = "Video chat"; +"lng_menu_start_group_call_channel" = "Start live stream"; +"lng_menu_start_group_call_scheduled_channel" = "Schedule live stream"; +"lng_menu_start_group_call_with_channel" = "Stream with..."; + +"lng_group_call_rtmp_title" = "Stream with other apps"; +"lng_group_call_rtmp_url_subtitle" = "Server URL"; +"lng_group_call_rtmp_url_copy" = "Copy Server URL"; +"lng_group_call_rtmp_url_copied" = "Server URL copied to clipboard."; +"lng_group_call_rtmp_key_subtitle" = "Stream Key"; +"lng_group_call_rtmp_key_copy" = "Copy Stream Key"; +"lng_group_call_rtmp_key_copied" = "Stream Key copied to clipboard."; +"lng_group_call_rtmp_key_warning" = "**Never share your Stream Key with anyone or show it on stream!**"; +"lng_group_call_rtmp_info" = "To stream video with another app, enter these Server URL and Stream Key in your streaming app.\n\nOnce you start broadcasting in your streaming app, click Start Streaming below."; +"lng_group_call_rtmp_start" = "Start Streaming"; +"lng_group_call_rtmp_revoke" = "Revoke Stream Key"; +"lng_group_call_rtmp_revoke_sure" = "Are you sure you want to revoke your Server URL and Stream Key?"; +"lng_group_call_rtmp_viewers#one" = "{count} viewer"; +"lng_group_call_rtmp_viewers#other" = "{count} viewers"; "lng_no_mic_permission" = "Telegram needs access to your microphone so that you can make calls and record voice messages."; @@ -2377,6 +3727,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_audio_player_reverse" = "Reverse order"; "lng_audio_player_shuffle" = "Shuffle"; +"lng_audio_transcribe_long" = "This voice message is too long."; +"lng_audio_transcribe_trials_left#one" = "You have {count} free transcription left until {date}."; +"lng_audio_transcribe_trials_left#other" = "You have {count} free transcriptions left until {date}."; +"lng_audio_transcribe_trials_over" = "You have used all your free transcriptions this week. Wait until {date} to use it again or subscribe to {link} now."; "lng_rights_edit_admin" = "Manage permissions"; "lng_rights_edit_admin_header" = "What can this admin do?"; @@ -2396,22 +3750,21 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_rights_default_restrictions_header" = "What can members of this group do?"; "lng_rights_slowmode_header" = "Slow mode"; "lng_rights_slowmode_off" = "Off"; -"lng_rights_slowmode_seconds#one" = "{count}s"; -"lng_rights_slowmode_seconds#other" = "{count}s"; -"lng_rights_slowmode_minutes#one" = "{count}m"; -"lng_rights_slowmode_minutes#other" = "{count}m"; -"lng_rights_slowmode_hours#one" = "{count}h"; -"lng_rights_slowmode_hours#other" = "{count}h"; "lng_rights_slowmode_about" = "Members will be able to send only one message per this interval."; "lng_rights_slowmode_about_interval" = "Members will be able to send only one message {interval}."; "lng_rights_slowmode_interval_seconds#one" = "every {count} second"; "lng_rights_slowmode_interval_seconds#other" = "every {count} seconds"; "lng_rights_slowmode_interval_minutes#one" = "every {count} minute"; "lng_rights_slowmode_interval_minutes#other" = "every {count} minutes"; +"lng_rights_boosts_no_restrict" = "Do not restrict boosters"; +"lng_rights_boosts_about" = "Turn this on to always allow users who boosted your group to send messages and media."; +"lng_rights_boosts_about_on" = "Choose how many boosts a user must give to the group to bypass restrictions on sending messages."; "lng_slowmode_enabled"= "Slow mode is enabled. You can send your next message in {left}."; "lng_slowmode_no_many" = "Slow mode is enabled. You can't send more than one message at a time."; "lng_slowmode_too_long" = "Sorry, this text is too long to send as one message.\n\nSlow mode is enabled. You can't send more than one message at a time."; +"lng_slowmode_seconds#one" = "{count} second"; +"lng_slowmode_seconds#other" = "{count} seconds"; "lng_rights_gigagroup_title" = "Broadcast group"; "lng_rights_gigagroup_convert" = "Convert to Broadcast Group"; @@ -2429,26 +3782,39 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_gigagroup_suggest_more" = "Learn more"; "lng_rights_channel_info" = "Change channel info"; +"lng_rights_channel_manage" = "Manage messages"; "lng_rights_channel_post" = "Post messages"; "lng_rights_channel_edit" = "Edit messages of others"; "lng_rights_channel_delete" = "Delete messages of others"; +"lng_rights_channel_manage_stories" = "Manage stories"; +"lng_rights_channel_post_stories" = "Post stories"; +"lng_rights_channel_edit_stories" = "Edit stories of others"; +"lng_rights_channel_delete_stories" = "Delete stories of others"; "lng_rights_channel_manage_calls" = "Manage live streams"; "lng_rights_group_info" = "Change group info"; "lng_rights_group_ban" = "Ban users"; "lng_rights_group_invite_link" = "Invite users via link"; "lng_rights_group_invite" = "Add users"; "lng_rights_group_pin" = "Pin messages"; +"lng_rights_group_topics" = "Manage topics"; +"lng_rights_group_add_topics" = "Create topics"; "lng_rights_group_manage_calls" = "Manage voice chats"; "lng_rights_group_delete" = "Delete messages"; "lng_rights_group_anonymous" = "Remain Anonymous"; "lng_rights_add_admins" = "Add new admins"; -"lng_rights_chat_read" = "Read messages"; "lng_rights_chat_send_text" = "Send messages"; "lng_rights_chat_send_media" = "Send media"; "lng_rights_chat_send_stickers" = "Send stickers & GIFs"; "lng_rights_chat_send_links" = "Embed links"; "lng_rights_chat_send_polls" = "Send polls"; "lng_rights_chat_add_members" = "Add members"; +"lng_rights_chat_photos" = "Photos"; +"lng_rights_chat_videos" = "Video files"; +"lng_rights_chat_stickers" = "Stickers & GIFs"; +"lng_rights_chat_music" = "Music"; +"lng_rights_chat_files" = "Files"; +"lng_rights_chat_voice_messages" = "Voice messages"; +"lng_rights_chat_video_messages" = "Video messages"; "lng_rights_chat_banned_until_header" = "Restricted until"; "lng_rights_chat_banned_forever" = "Forever"; "lng_rights_chat_banned_day#one" = "For {count} day"; @@ -2478,21 +3844,37 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_bots_password_confirm_description" = "Please enter your password to confirm the action."; "lng_restricted_send_message" = "The admins of this group restricted you from writing here."; -"lng_restricted_send_media" = "The admins of this group restricted you from posting media content here."; +"lng_restricted_send_photos" = "The admins of this group restricted you from posting photos here."; +"lng_restricted_send_videos" = "The admins of this group restricted you from posting video files here."; +"lng_restricted_send_music" = "The admins of this group restricted you from posting music here."; +"lng_restricted_send_files" = "The admins of this group restricted you from posting files here."; +"lng_restricted_send_voice_messages_group" = "The admins of this group restricted you from posting voice messages here."; +"lng_restricted_send_video_messages_group" = "The admins of this group restricted you from posting video messages here."; "lng_restricted_send_stickers" = "The admins of this group restricted you from posting stickers here."; "lng_restricted_send_gifs" = "The admins of this group restricted you from posting GIFs here."; "lng_restricted_send_inline" = "The admins of this group restricted you from posting inline content here."; "lng_restricted_send_polls" = "The admins of this group restricted you from posting polls here."; +"lng_restricted_boost_group" = "Boost this group to send messages"; "lng_restricted_send_message_until" = "The admins of this group restricted you from writing here until {date}, {time}."; -"lng_restricted_send_media_until" = "The admins of this group restricted you from posting media content here until {date}, {time}."; +"lng_restricted_send_photos_until" = "The admins of this group restricted you from posting photos here until {date}, {time}."; +"lng_restricted_send_videos_until" = "The admins of this group restricted you from posting video files here until {date}, {time}."; +"lng_restricted_send_music_until" = "The admins of this group restricted you from posting music here until {date}, {time}."; +"lng_restricted_send_files_until" = "The admins of this group restricted you from posting files here until {date}, {time}."; +"lng_restricted_send_voice_messages_until" = "The admins of this group restricted you from posting voice messages here until {date}, {time}."; +"lng_restricted_send_video_messages_until" = "The admins of this group restricted you from posting video messages here until {date}, {time}."; "lng_restricted_send_stickers_until" = "The admins of this group restricted you from posting stickers here until {date}, {time}."; "lng_restricted_send_gifs_until" = "The admins of this group restricted you from posting GIFs here until {date}, {time}."; "lng_restricted_send_inline_until" = "The admins of this group restricted you from posting inline content here until {date}, {time}."; "lng_restricted_send_polls_until" = "The admins of this group restricted you from posting polls here until {date}, {time}."; "lng_restricted_send_message_all" = "Writing messages isn't allowed in this group."; -"lng_restricted_send_media_all" = "Posting media content isn't allowed in this group."; +"lng_restricted_send_photos_all" = "Posting photos isn't allowed in this group."; +"lng_restricted_send_videos_all" = "Posting video files isn't allowed in this group."; +"lng_restricted_send_music_all" = "Posting music isn't allowed in this group."; +"lng_restricted_send_files_all" = "Posting files isn't allowed in this group."; +"lng_restricted_send_voice_messages_all" = "Posting voice messages isn't allowed in this group."; +"lng_restricted_send_video_messages_all" = "Posting video messages isn't allowed in this group."; "lng_restricted_send_stickers_all" = "Posting stickers isn't allowed in this group."; "lng_restricted_send_gifs_all" = "Posting GIFs isn't allowed in this group."; "lng_restricted_send_inline_all" = "Posting inline content isn't allowed in this group."; @@ -2500,14 +3882,21 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_restricted_send_public_polls" = "Sorry, public polls can't be forwarded to channels."; +"lng_restricted_send_voice_messages" = "{user} restricted sending of voice messages to them."; +"lng_restricted_send_video_messages" = "{user} restricted sending of video messages to them."; +"lng_restricted_send_non_premium" = "Only Premium users can message {user}."; +"lng_restricted_send_non_premium_more" = "Learn more..."; + +"lng_send_non_premium_text" = "Subscribe to **Premium**\n to message {user}."; +"lng_send_non_premium_go" = "Get Premium"; +"lng_send_non_premium_story" = "Replies restricted"; +"lng_send_non_premium_unlock" = "unlock"; +"lng_send_non_premium_message_toast" = "**{user}** only accepts messages from contacts and {link} subscribers."; +"lng_send_non_premium_message_toast_link" = "Telegram Premium"; + "lng_exceptions_list_title" = "Exceptions"; "lng_removed_list_title" = "Removed users"; -"lng_admin_log_slow_mode_seconds#one" = "{count} second"; -"lng_admin_log_slow_mode_seconds#other" = "{count} seconds"; -"lng_admin_log_slow_mode_minutes#one" = "{count} minute"; -"lng_admin_log_slow_mode_minutes#other" = "{count} minutes"; - "lng_admin_log_title_all" = "All actions"; "lng_admin_log_title_selected" = "Selected actions"; "lng_admin_log_filter" = "Filter"; @@ -2525,6 +3914,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_admin_log_filter_voice_chats_channel" = "Live stream"; "lng_admin_log_filter_invite_links" = "Invite links"; "lng_admin_log_filter_members_removed" = "Leaving members"; +"lng_admin_log_filter_topics" = "Topics"; "lng_admin_log_filter_all_admins" = "All users and admins"; "lng_admin_log_about" = "What is this?"; "lng_admin_log_about_text" = "This is a list of all service actions taken by the group's members and admins in the last 48 hours."; @@ -2537,7 +3927,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_admin_log_no_events_text_channel" = "There were no service actions\ntaken by the channels's admins\nin the last 48 hours."; "lng_admin_log_empty_text" = "Empty"; -"lng_admin_log_changed_title_group" = "{from} changed group name to «{title}»"; "lng_admin_log_changed_title_channel" = "{from} changed channel name to «{title}»"; "lng_admin_log_changed_description_group" = "{from} edited group description:"; "lng_admin_log_removed_description_group" = "{from} removed group description"; @@ -2549,6 +3938,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_admin_log_changed_link_channel" = "{from} changed channel link:"; "lng_admin_log_removed_link_channel" = "{from} removed channel link"; "lng_admin_log_previous_link" = "Previous link"; +"lng_admin_log_reordered_link_group" = "{from} reordered group links:"; +"lng_admin_log_reordered_link_channel" = "{from} reordered channel links:"; +"lng_admin_log_previous_links_order" = "Previous order"; +"lng_admin_log_activated_link" = "{from} activated @{link} username"; +"lng_admin_log_deactivated_link" = "{from} deactivated @{link} username"; "lng_admin_log_changed_photo_group" = "{from} changed group photo"; "lng_admin_log_changed_photo_channel" = "{from} changed channel photo"; "lng_admin_log_removed_photo_group" = "{from} removed group photo"; @@ -2564,7 +3958,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_admin_log_pinned_message" = "{from} pinned this message:"; "lng_admin_log_unpinned_message" = "{from} unpinned this message"; "lng_admin_log_edited_caption" = "{from} edited caption:"; -"lng_admin_log_removed_caption" = "{from} removed caption"; +"lng_admin_log_edited_media" = "{from} edited media:"; +"lng_admin_log_edited_media_and_caption" = "{from} edited media and caption:"; +"lng_admin_log_edited_media_and_removed_caption" = "{from} edited media and removed caption:"; +"lng_admin_log_removed_caption" = "{from} removed caption:"; "lng_admin_log_previous_caption" = "Original caption"; "lng_admin_log_edited_message" = "{from} edited this message:"; "lng_admin_log_previous_message" = "Original message"; @@ -2574,8 +3971,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_admin_log_participant_joined_channel" = "{from} joined the channel"; "lng_admin_log_participant_joined_by_link" = "{from} joined the group via {link}"; "lng_admin_log_participant_joined_by_link_channel" = "{from} joined the channel via {link}"; +"lng_admin_log_participant_joined_by_filter_link" = "{from} joined the group via {link} from a folder"; +"lng_admin_log_participant_joined_by_filter_link_channel" = "{from} joined the channel via {link} from a folder"; "lng_admin_log_participant_approved_by_link" = "{from} was approved to join the group via {link} by {user}"; "lng_admin_log_participant_approved_by_link_channel" = "{from} was approved to join the channel via {link} by {user}"; +"lng_admin_log_participant_approved_by_request" = "{from} joined to the group via public request, approved by {user}"; +"lng_admin_log_participant_approved_by_request_channel" = "{from} joined to the channel via public request, approved by {user}"; "lng_admin_log_revoke_invite_link" = "{from} revoked invite link {link}"; "lng_admin_log_delete_invite_link" = "{from} deleted invite link {link}"; "lng_admin_log_participant_left" = "{from} left the group"; @@ -2591,6 +3992,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_admin_log_changed_stickers_group" = "{from} changed the group's {sticker_set}"; "lng_admin_log_changed_stickers_set" = "sticker set"; "lng_admin_log_removed_stickers_group" = "{from} removed the group's sticker set"; +"lng_admin_log_changed_emoji_group" = "{from} changed the group's {sticker_set}"; +"lng_admin_log_changed_emoji_set" = "emoji set"; +"lng_admin_log_removed_emoji_group" = "{from} removed the group's emoji set"; "lng_admin_log_changed_linked_chat" = "{from} changed the discussion group to «{chat}»"; "lng_admin_log_removed_linked_chat" = "{from} removed the discussion group"; "lng_admin_log_changed_linked_channel" = "{from} changed the linked channel to «{chat}»"; @@ -2613,23 +4017,57 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_admin_log_disallowed_unmute_self_channel" = "{from} started muting new live stream members"; "lng_admin_log_participant_volume" = "{from} changed voice chat volume for {user} to {percent}"; "lng_admin_log_participant_volume_channel" = "{from} changed live stream volume for {user} to {percent}"; +"lng_admin_log_antispam_enabled" = "{from} enabled aggressive anti-spam"; +"lng_admin_log_antispam_disabled" = "{from} disabled aggressive anti-spam"; +"lng_admin_log_change_color" = "{from} changed channel color from {previous} to {color}"; +"lng_admin_log_set_background_emoji" = "{from} set channel background emoji to {emoji}"; +"lng_admin_log_change_background_emoji" = "{from} changed channel background emoji from {previous} to {emoji}"; +"lng_admin_log_removed_background_emoji" = "{from} removed channel background emoji {emoji}"; +"lng_admin_log_change_profile_color" = "{from} changed channel profile color from {previous} to {color}"; +"lng_admin_log_set_profile_background_emoji" = "{from} set channel profile background emoji to {emoji}"; +"lng_admin_log_change_profile_background_emoji" = "{from} changed channel profile background emoji from {previous} to {emoji}"; +"lng_admin_log_removed_profile_background_emoji" = "{from} removed channel profile background emoji {emoji}"; +"lng_admin_log_change_wallpaper" = "{from} changed channel wallpaper"; +"lng_admin_log_set_status" = "{from} set channel emoji status to {emoji}"; +"lng_admin_log_change_status" = "{from} changed channel emoji status from {previous} to {emoji}"; +"lng_admin_log_removed_status" = "{from} removed channel emoji status {emoji}"; +"lng_admin_log_set_status_until" = "{from} set channel emoji status to {emoji} until {date}"; +"lng_admin_log_change_status_until" = "{from} changed channel emoji status from {previous} to {emoji} until {date}"; "lng_admin_log_user_with_username" = "{name} ({mention})"; "lng_admin_log_messages_ttl_set" = "{from} enabled messages auto-delete after {duration}"; "lng_admin_log_messages_ttl_changed" = "{from} changed messages auto-delete period from {previous} to {duration}"; "lng_admin_log_messages_ttl_removed" = "{from} disabled messages auto-deletion after {duration}"; "lng_admin_log_reactions_disabled" = "{from} disabled reactions"; "lng_admin_log_reactions_updated" = "{from} updated the list of allowed reactions to: {emoji}"; +"lng_admin_log_reactions_allowed_all" = "{from} allowed all reactions"; +"lng_admin_log_reactions_allowed_official" = "{from} allowed all official reactions"; "lng_admin_log_edited_invite_link" = "edited invite link {link}"; "lng_admin_log_invite_link_expire_date" = "Expire date: {previous} -> {limit}"; "lng_admin_log_invite_link_usage_limit" = "Usage limit: {previous} -> {limit}"; "lng_admin_log_invite_link_label" = "Name: {previous} -> {limit}"; "lng_admin_log_invite_link_request_needed" = "Now admin approval is required to join."; "lng_admin_log_invite_link_request_not_needed" = "Now admin approval is not required to join."; +"lng_admin_log_topics_enabled" = "{from} enabled topics"; +"lng_admin_log_topics_disabled" = "{from} disabled topics"; +"lng_admin_log_topics_created" = "{from} created topic {topic}"; +"lng_admin_log_topics_changed" = "{from} changed topic {topic} to {new_topic}"; +"lng_admin_log_topics_closed" = "{from} closed topic {topic}"; +"lng_admin_log_topics_reopened" = "{from} reopened topic {topic}"; +"lng_admin_log_topics_hidden" = "{from} hid topic {topic}"; +"lng_admin_log_topics_unhidden" = "{from} unhid topic {topic}"; +"lng_admin_log_topics_deleted" = "{from} deleted topic {topic}"; +"lng_admin_log_topics_pinned" = "{from} pinned topic {topic}"; +"lng_admin_log_topics_unpinned" = "{from} unpinned topic {topic}"; "lng_admin_log_restricted_forever" = "indefinitely"; "lng_admin_log_restricted_until" = "until {date}"; "lng_admin_log_banned_view_messages" = "Read messages"; "lng_admin_log_banned_send_messages" = "Send messages"; -"lng_admin_log_banned_send_media" = "Send media"; +"lng_admin_log_banned_send_photos" = "Send photos"; +"lng_admin_log_banned_send_videos" = "Send video files"; +"lng_admin_log_banned_send_music" = "Send music"; +"lng_admin_log_banned_send_files" = "Send files"; +"lng_admin_log_banned_send_voice_messages" = "Send voice messages"; +"lng_admin_log_banned_send_video_messages" = "Send video messages"; "lng_admin_log_banned_send_stickers" = "Send stickers & GIFs"; "lng_admin_log_banned_embed_links" = "Embed links"; "lng_admin_log_banned_send_polls" = "Send polls"; @@ -2637,14 +4075,24 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_admin_log_admin_post_messages" = "Post messages"; "lng_admin_log_admin_edit_messages" = "Edit messages"; "lng_admin_log_admin_delete_messages" = "Delete messages"; +"lng_admin_log_admin_post_stories" = "Post stories"; +"lng_admin_log_admin_edit_stories" = "Edit stories"; +"lng_admin_log_admin_delete_stories" = "Delete stories"; +"lng_admin_log_admin_remain_anonymous" = "Remain anonymous"; "lng_admin_log_admin_ban_users" = "Ban users"; "lng_admin_log_admin_invite_users" = "Add members"; "lng_admin_log_admin_invite_link" = "Invite users via link"; "lng_admin_log_admin_pin_messages" = "Pin messages"; +"lng_admin_log_admin_manage_topics" = "Manage topics"; +"lng_admin_log_admin_create_topics" = "Create topics"; "lng_admin_log_admin_manage_calls" = "Manage voice chats"; "lng_admin_log_admin_manage_calls_channel" = "Manage live streams"; "lng_admin_log_admin_add_admins" = "Add new admins"; +"lng_admin_log_antispam_menu_report" = "Report False Positive"; +"lng_admin_log_antispam_menu_report_toast" = "You can manage anti-spam settings in {link}."; +"lng_admin_log_antispam_menu_report_toast_link" = "Group Info > Administrators"; + "lng_terms_signup" = "By signing up,\nyou agree to the {link}."; "lng_terms_signup_link" = "Terms of Service"; "lng_terms_header" = "Terms of Service"; @@ -2728,8 +4176,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_passport_authorize" = "Authorize"; "lng_passport_form_error" = "Could not get authorization form."; "lng_passport_save_value" = "Save"; -"lng_passport_saving" = "Saving..."; -"lng_passport_uploading" = "Uploading..."; "lng_passport_scan_index" = "Scan {index}"; "lng_passport_upload_scans" = "Upload scans"; "lng_passport_upload_more" = "Upload additional scans"; @@ -2817,6 +4263,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_export_option_info_about" = "Your chosen screen name, username, phone number and profile pictures."; "lng_export_option_contacts" = "Contacts list"; "lng_export_option_contacts_about" = "If you allow access, contacts are continuously synced with Telegram. You can adjust this in Settings > Privacy & Security on mobile devices."; +"lng_export_option_stories" = "Stories archive"; +"lng_export_option_stories_about" = "All stories you posted from Telegram mobile apps."; "lng_export_option_sessions" = "Active sessions"; "lng_export_option_sessions_about" = "We store this to display your connected devices in Settings > Privacy & Security > Active Sessions."; "lng_export_header_other" = "Other"; @@ -2845,6 +4293,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_export_option_choose_format" = "Choose export format"; "lng_export_option_html" = "Human-readable HTML"; "lng_export_option_json" = "Machine-readable JSON"; +"lng_export_option_html_and_json" = "Both"; "lng_export_limits" = "From: {from}, to: {till}"; "lng_export_beginning" = "the oldest message"; "lng_export_end" = "present"; @@ -2855,7 +4304,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_export_state_userpics" = "Profile pictures"; "lng_export_state_chats_list" = "Processing chats..."; "lng_export_state_chats" = "Chats"; -"lng_export_state_ready_progress" = "{ready} / {total}"; "lng_export_skip_file" = "Skip this file"; "lng_export_progress" = "You can close this window now. Please don't quit Telegram until the data export is completed."; "lng_export_stop" = "Stop"; @@ -2869,8 +4317,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_export_invalid" = "Sorry, you have started a new data export, so this data export is now cancelled."; "lng_export_delay" = "Sorry, for security reasons, you will be able to begin downloading your data in {hours}. We have notified all your devices about the export request to make sure it's authorized and to give you time to react if it's not.\n\nPlease come back on {date} and repeat the request using the same device."; "lng_export_delay_less_than_hour" = "less than an hour"; -"lng_export_delay_hours#one" = "{count} hour"; -"lng_export_delay_hours#other" = "{count} hours"; "lng_export_suggest_title" = "Data export ready"; "lng_export_suggest_text" = "You can now download the data you requested. Start exporting data?"; "lng_export_suggest_cancel" = "Not now"; @@ -2893,6 +4339,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_language_not_ready_about" = "Unfortunately, this custom language pack ({lang_name}) doesn't contain data for Telegram Desktop. You can contribute to this language pack using the {link}."; "lng_language_not_ready_link" = "translations platform"; +"lng_translate_box_error" = "Translate failed."; + +"lng_translate_settings_subtitle" = "Translate Messages"; +"lng_translate_settings_show" = "Show Translate Button"; +"lng_translate_settings_chat" = "Translate Entire Chat"; +"lng_translate_settings_choose" = "Do Not Translate"; +"lng_translate_settings_about" = "The 'Translate' button will appear when you open a context menu on a text message."; +"lng_translate_settings_one" = "Please choose at least one language so that it can be used as the \"Translate to\" language."; + "lng_launch_exe_warning" = "This file has a {extension} extension.\nAre you sure you want to run it?"; "lng_launch_svg_warning" = "Opening this file can potentially expose your IP address to its sender. Continue?"; "lng_launch_exe_sure" = "Run"; @@ -2962,6 +4417,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_filters_restore" = "Undo"; "lng_filters_new" = "New Folder"; "lng_filters_edit" = "Edit Folder"; +"lng_filters_setup_menu" = "Edit Folders"; "lng_filters_new_name" = "Folder name"; "lng_filters_add_chats" = "Add chats"; "lng_filters_remove_chats" = "Remove chats"; @@ -2975,41 +4431,109 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_filters_edit_types" = "Chat types"; "lng_filters_edit_chats" = "Chats"; "lng_filters_include_contacts" = "Contacts"; -"lng_filters_include_non_contacts" = "Non-Contacts"; "lng_filters_include_groups" = "Groups"; "lng_filters_include_channels" = "Channels"; "lng_filters_include_bots" = "Bots"; -"lng_filters_exclude_muted" = "Muted"; -"lng_filters_exclude_read" = "Read"; -"lng_filters_exclude_archived" = "Archived"; "lng_filters_name_people" = "People"; "lng_filters_name_unread" = "Unread"; "lng_filters_name_unmuted" = "Unmuted"; -"lng_filters_add" = "Done"; -"lng_filters_limit" = "Sorry, you have reached folders limit."; "lng_filters_empty" = "Please choose at least one chat for this folder."; "lng_filters_default" = "Please change at least one rule for this folder."; "lng_filters_type_contacts" = "Contacts"; "lng_filters_type_non_contacts" = "Non-Contacts"; "lng_filters_type_groups" = "Groups"; "lng_filters_type_channels" = "Channels"; +"lng_filters_type_new" = "New Chats"; +"lng_filters_type_existing" = "Existing Chats"; "lng_filters_type_bots" = "Bots"; "lng_filters_type_no_archived" = "Archived"; "lng_filters_type_no_muted" = "Muted"; "lng_filters_type_no_read" = "Read"; "lng_filters_icon_header" = "Choose an icon"; -"lng_filters_error_pinned_max" = "Sorry, you can't pin any more chats to the top."; "lng_filters_context_edit" = "Edit Folder"; "lng_filters_context_remove" = "Remove"; "lng_filters_remove_sure" = "This will remove the folder, your chats will not be deleted."; "lng_filters_remove_yes" = "Remove"; +"lng_filters_menu_add" = "Add to folder"; +"lng_filters_toast_add" = "{chat} added to {folder} folder"; +"lng_filters_toast_remove" = "{chat} removed from {folder} folder"; +"lng_filters_shareable_status" = "shareable folder"; + +"lng_filters_delete_sure" = "Are you sure you want to delete this folder? This will also deactivate all the invite links used to share this folder."; +"lng_filters_link" = "Share Folder"; +"lng_filters_link_has" = "Invite links"; +"lng_filters_link_badge" = "New"; +"lng_filters_link_create" = "Create an Invite Link"; +"lng_filters_link_cant" = "No way to share folders with chat types or excluded chats."; +"lng_filters_link_about" = "Share access to some of this folder's groups and channels with others."; +"lng_filters_link_about_many" = "Create more links to set up different access levels for different people."; +"lng_filters_link_title" = "Share Folder"; +"lng_filters_link_share_about" = "Anyone with this link can add the {folder} folder and the chats selected below."; +"lng_filters_link_subtitle" = "Invite link"; +"lng_filters_link_chats_none" = "No chats selected"; +"lng_filters_link_chats#one" = "{count} chat selected"; +"lng_filters_link_chats#other" = "{count} chats selected"; +"lng_filters_link_bot_status" = "you can't share chats with bots"; +"lng_filters_link_bot_error" = "Chats with bots can't be shared."; +"lng_filters_link_private_status" = "you can't share private chats"; +"lng_filters_link_private_error" = "Private chats can't be shared."; +"lng_filters_link_noadmin_status" = "you can't invite others here"; +"lng_filters_link_noadmin_group_error" = "You don't have the admin rights to share invite links to this private group."; +"lng_filters_link_noadmin_channel_error" = "You don't have the admin rights to share invite links to this private channel."; +"lng_filters_link_already_group" = "you are already a member"; +"lng_filters_link_already_channel" = "you are already subscribed"; +"lng_filters_link_inaccessible" = "chat is inaccessible"; +"lng_filters_link_chats_about" = "Select groups and channels that you want everyone who adds the folder via invite link to join."; +"lng_filters_link_no_about" = "There are no chats in this folder that you can share with others."; +"lng_filters_link_chats_no" = "These chats cannot be shared"; +"lng_filters_link_chats_no_about" = "You can only share groups and channels in which you are allowed to create invite links."; +"lng_filters_link_name_it" = "Name Link"; +"lng_filters_link_delete_sure" = "Are you sure you want to delete this link?"; +"lng_filters_link_qr_about" = "Everyone on Telegram can scan this code to add this folder and join the chats included in this invite link."; +"lng_filters_link_group_admin_error" = "One of the groups in this folder can’t be added because one of its admins has too many groups and channels."; +"lng_filters_by_link_title" = "Add Folder"; +"lng_filters_by_link_sure" = "Do you want to add a new chat folder {folder} and join its groups and channels?"; +"lng_filters_by_link_join#one" = "{count} chat to join"; +"lng_filters_by_link_join#other" = "{count} chats to join"; +"lng_filters_by_link_add_button" = "Add {folder}"; +"lng_filters_by_link_add_no" = "Do not add this folder"; +"lng_filters_by_link_more" = "Add Chats to Folder"; +"lng_filters_by_link_more_sure" = "Do you want to join chats and add them to the folder {folder}?"; +"lng_filters_by_link_about" = "You can deselect the chats you don't want to join."; +"lng_filters_by_link_and_join_button#one" = "Join Chat"; +"lng_filters_by_link_and_join_button#other" = "Join Chats"; +"lng_filters_by_link_join_no" = "Do not join any chats"; +"lng_filters_by_link_already" = "Folder already added"; +"lng_filters_by_link_already_about" = "You have already added the folder {folder} and all its chats."; +"lng_filters_by_link_in#one" = "{count} chat in this folder"; +"lng_filters_by_link_in#other" = "{count} chats in this folder"; +"lng_filters_by_link_remove" = "Remove Folder"; +"lng_filters_by_link_remove_sure" = "Do you also want to quit the chats included in the folder {folder}?"; +"lng_filters_by_link_quit#one" = "{count} chat to quit"; +"lng_filters_by_link_quit#other" = "{count} chats to quit"; +"lng_filters_by_link_select" = "Select All"; +"lng_filters_by_link_deselect" = "Deselect All"; +"lng_filters_by_link_about_quit" = "You can deselect the chats you don't want to quit."; +"lng_filters_by_link_remove_button" = "Remove Folder and Keep Chats"; +"lng_filters_by_link_and_quit_button#one" = "Remove Folder and Chat"; +"lng_filters_by_link_and_quit_button#other" = "Remove Folder and Chats"; +"lng_filters_added_title" = "Folder {folder} Added"; +"lng_filters_added_also#one" = "You also joined {count} chat."; +"lng_filters_added_also#other" = "You also joined {count} chats."; +"lng_filters_updated_title" = "Folder {folder} Updated"; +"lng_filters_updated_also#one" = "You have joined {count} new chat."; +"lng_filters_updated_also#other" = "You have joined {count} new chats."; +"lng_filters_bar_you_can#one" = "You can join {count} new chat"; +"lng_filters_bar_you_can#other" = "You can join {count} new chats"; +"lng_filters_bar_view#one" = "Click here to view it"; +"lng_filters_bar_view#other" = "Click here to view them"; "lng_chat_theme_change" = "Change colors"; +"lng_chat_theme_wallpaper" = "Set Wallpaper"; "lng_chat_theme_none" = "No\nTheme"; "lng_chat_theme_apply" = "Apply Theme"; -"lng_chat_theme_reset" = "Reset Theme"; -"lng_chat_theme_dont" = "Do Not Set Theme"; -"lng_chat_theme_title" = "Select theme"; +"lng_chat_theme_change_wallpaper" = "Change Wallpaper"; +"lng_chat_theme_title" = "Choose theme"; "lng_chat_theme_cant_voice" = "Sorry, you can't change the chat theme while you're having an unsent voice message."; "lng_photo_editor_menu_delete" = "Delete"; @@ -3018,23 +4542,334 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_voice_speed_slow" = "Slow"; "lng_voice_speed_normal" = "Normal"; +"lng_voice_speed_medium" = "Medium"; "lng_voice_speed_fast" = "Fast"; "lng_voice_speed_very_fast" = "Very fast"; +"lng_voice_speed_super_fast" = "Super fast"; "lng_view_button_user" = "View user"; "lng_view_button_bot" = "View bot"; "lng_view_button_group" = "View group"; "lng_view_button_channel" = "View channel"; +"lng_view_button_bot_app" = "Open app"; "lng_view_button_background" = "View background"; "lng_view_button_theme" = "View theme"; "lng_view_button_message" = "View message"; +"lng_view_button_story" = "View story"; "lng_view_button_voice_chat" = "Voice chat"; "lng_view_button_voice_chat_channel" = "Live stream"; "lng_view_button_request_join" = "Request to Join"; +"lng_view_button_external_link" = "Open link"; +"lng_view_button_boost" = "Boost"; +"lng_view_button_giftcode" = "Open"; +"lng_view_button_iv" = "Instant View"; +"lng_sponsored_hide_ads" = "Hide"; "lng_sponsored_title" = "What are sponsored messages?"; -"lng_sponsored_info_description1" = "Unlike other apps, Telegram never uses your private data to target ads. Sponsored messages on Telegram are based solely on the topic of the public channels in which they are shown. This means that no user data is mined or analyzed to display ads, and every user viewing a channel on Telegram sees the same sponsored messages.\n\nUnlike other apps, Telegram doesn't track whether you tapped on a sponsored message and doesn't profile you based on your activity. We also prevent external links in sponsored messages to ensure that third parties can’t spy on our users. We believe that everyone has the right to privacy, and technological platforms should respect that.\n\nTelegram offers a free and unlimited service to hundreds of millions of users, which involves significant server and traffic costs. In order to remain independent and stay true to its values, Telegram developed a paid tool to promote messages with user privacy in mind. We welcome responsible advertisers at:"; +"lng_sponsored_info_description1" = "Unlike other apps, Telegram never uses your private data to target ads. Sponsored messages on Telegram are based solely on the topic of the public channels in which they are shown. This means that no user data is mined or analyzed to display ads, and every user viewing a channel on Telegram sees the same sponsored messages.\n\nUnlike other apps, Telegram doesn't track whether you clicked on a sponsored message and doesn't profile you based on your activity. We also prevent external links in sponsored messages to ensure that third parties can’t spy on our users. We believe that everyone has the right to privacy, and technological platforms should respect that.\n\nTelegram offers a free and unlimited service to hundreds of millions of users, which involves significant server and traffic costs. In order to remain independent and stay true to its values, Telegram developed a paid tool to promote messages with user privacy in mind. We welcome responsible advertisers at:"; "lng_sponsored_info_description2" = "Sponsored Messages are currently in test mode. Once they are fully launched and allow Telegram to cover its basic costs, we will start sharing ad revenue with the owners of public channels in which sponsored messages are displayed.\n\nOnline ads should no longer be synonymous with abuse of user privacy. Let us redefine how a tech company should operate – together."; +"lng_sponsored_info_menu" = "About this ad"; +"lng_sponsored_info_submenu" = "Advertiser: {text}"; + +"lng_telegram_features_url" = "https://t.me/TelegramTips"; + +"lng_mini_apps_disclaimer_title" = "Warning"; +"lng_mini_apps_disclaimer_text" = "You are about to use a mini app operated by an independent party **not affiliated with Telegram**. You must agree to the Terms of Use of mini apps to continue."; +"lng_mini_apps_disclaimer_button" = "I agree to the {link}"; +"lng_mini_apps_disclaimer_link" = "Terms of Use"; +"lng_mini_apps_tos_url" = "https://telegram.org/tos/mini-apps"; + +"lng_ringtones_box_title" = "Notification Sound"; +"lng_ringtones_box_cloud_subtitle" = "Choose your tone"; +"lng_ringtones_box_upload_choose" = "Choose ringtone"; +"lng_ringtones_box_upload_button" = "Upload Sound"; +"lng_ringtones_box_about" = "Click on any short voice note or mp3 file in chat and select \"Save for Notifications\". It will appear here."; +"lng_ringtones_box_default" = "Default"; +"lng_ringtones_box_no_sound" = "No sound"; +"lng_ringtones_toast_added" = "Sound added!"; +"lng_ringtones_error_max_size" = "Sorry, but your file is too big. The maximum size for ringtones is {size}."; +"lng_ringtones_error_max_duration" = "Sorry, but your file is too long. The maximum duration for ringtones is {duration}."; + +"lng_forum_topic_new" = "New Topic"; +"lng_forum_topic_edit" = "Edit Topic"; +"lng_forum_topic_title" = "Topic Title"; +"lng_forum_topic_close" = "Close Topic"; +"lng_forum_topic_reopen" = "Reopen Topic"; +"lng_forum_topic_closed" = "This topic is now closed."; +"lng_forum_topic_delete" = "Delete"; +"lng_forum_topic_delete_sure" = "Are you sure you want to delete this topic?"; +"lng_forum_topic_created_title_my" = "Almost done!"; +"lng_forum_topic_created_body_my" = "Send the first message\nto start this topic."; +"lng_forum_topic_created_title" = "Topic started!"; +"lng_forum_topic_created_body" = "Send a message to open\nthe discussion."; +"lng_forum_topics_switch" = "Topics"; +"lng_forum_topics_not_enough#one" = "Only groups with more than **{count} member** can have topics enabled."; +"lng_forum_topics_not_enough#other" = "Only groups with more than **{count} members** can have topics enabled."; +"lng_forum_topics_no_discussion" = "Topics can't be enabled in discussion groups at the moment."; +"lng_forum_choose_title_and_icon" = "Choose title and icon for your topic"; +"lng_forum_replies_only" = "You can reply to messages in topics."; +"lng_forum_message_in" = "Message in {topic}"; +"lng_forum_reply_in" = "Reply in {topic}"; +"lng_forum_no_topics" = "No topics currently created in this forum."; +"lng_forum_create_topic" = "Create topic"; +"lng_forum_discard_sure" = "Are you sure you want to discard this topic?"; +"lng_forum_view_as_messages" = "View as Messages"; +"lng_forum_view_as_topics" = "View as Topics"; +"lng_forum_no_messages" = "No messages"; +"lng_forum_messages#one" = "{count} message"; +"lng_forum_messages#other" = "{count} messages"; +"lng_forum_show_topics_list" = "Show Topics List"; + +"lng_request_peer_requirements" = "Requirements"; +"lng_request_peer_rights" = "You should have the admin rights to {rights}."; +"lng_request_peer_rights_and" = "{rights} and {last}"; +"lng_request_peer_confirm" = "Are you sure you want to send {chat} to {bot}?"; +"lng_request_peer_confirm_add" = "This will also add {bot} to {chat}."; +"lng_request_peer_confirm_rights" = "This will also add {bot} to {chat} with the following rights: {rights}."; +"lng_request_peer_confirm_send" = "Send"; +"lng_request_user_title" = "Choose User"; +"lng_request_users_title" = "Choose Users"; +"lng_request_user_premium_yes" = "The user should have a Premium subscription."; +"lng_request_user_premium_no" = "The user shouldn't have a Premium subscription."; +"lng_request_user_no" = "No such users"; +"lng_request_user_no_about" = "You don't have users that meet the requirements for this bot."; +"lng_request_bot_title" = "Choose Bot"; +"lng_request_bot_no" = "No bots"; +"lng_request_bot_no_about" = "You don't have any bots."; +"lng_request_group_title" = "Choose Group"; +"lng_request_group_no" = "No such groups"; +"lng_request_group_no_about" = "You don't have groups that meet the requirements for this bot."; +"lng_request_group_public_yes" = "The group should be public."; +"lng_request_group_public_no" = "The group should be private."; +"lng_request_group_topics_yes" = "The group should have topics turned on."; +"lng_request_group_topics_no" = "The group should have topics turned off."; +"lng_request_group_am_owner" = "You should be the owner of the group."; +"lng_request_group_change_info" = "change group info"; +"lng_request_group_delete_messages" = "delete messages"; +"lng_request_group_ban_users" = "ban users"; +"lng_request_group_invite" = "invite users via link"; +"lng_request_group_pin_messages" = "pin messages"; +"lng_request_group_manage_topics" = "manage topics"; +"lng_request_group_manage_video_chats" = "manage video chats"; +"lng_request_group_anonymous" = "remain anonymous"; +"lng_request_group_add_admins" = "add new admins"; +"lng_request_group_create" = "Create a New Group for This"; +"lng_request_channel_title" = "Choose Channel"; +"lng_request_channel_no" = "No such channels"; +"lng_request_channel_no_about" = "You don't have channels that meet the requirements for this bot."; +"lng_request_channel_public_yes" = "The channel should be public."; +"lng_request_channel_public_no" = "The channel should be private."; +"lng_request_channel_am_owner" = "You should be the owner of the channel."; +"lng_request_channel_change_info" = "change channel info"; +"lng_request_channel_post_messages" = "post messages"; +"lng_request_channel_edit_messages" = "edit messages of others"; +"lng_request_channel_delete_messages" = "delete messages"; +"lng_request_channel_add_subscribers" = "add subscribers"; +"lng_request_channel_manage_livestreams" = "manage live streams"; +"lng_request_channel_add_admins" = "add new admins"; +"lng_request_channel_create" = "Create a New Channel for This"; + +"lng_userpic_builder_color_subtitle" = "Choose background"; +"lng_userpic_builder_emoji_subtitle" = "Choose sticker or emoji"; + +"lng_stories_my_name" = "My Story"; +"lng_stories_archive" = "Hide Stories"; +"lng_stories_unarchive" = "Unhide Stories"; +"lng_stories_row_count#one" = "{count} Story"; +"lng_stories_row_count#other" = "{count} Stories"; +"lng_stories_views#one" = "{count} view"; +"lng_stories_views#other" = "{count} views"; +"lng_stories_no_views" = "No views"; +"lng_stories_view_reactions" = "View reactions"; +"lng_stories_unsupported" = "This story is not supported\nby your version of Telegram."; +"lng_stories_cant_reply" = "You can't reply to this story."; +"lng_stories_about_silent" = "This video has no sound."; +"lng_stories_about_close_friends" = "You're seeing this story because {user} added you to their list of **Close Friends**."; +"lng_stories_about_contacts" = "Only {user}'s contacts can view this story."; +"lng_stories_about_selected_contacts" = "Only some contacts {user} selected can view this story."; +"lng_stories_about_close_friends_my" = "Only your list of **Close Friends** can view this story."; +"lng_stories_about_contacts_my" = "Only your contacts can view this story."; +"lng_stories_about_selected_contacts_my" = "Only some contacts you selected can view this story."; +"lng_stories_click_to_view_mine" = "Click here to view your story."; +"lng_stories_click_to_view" = "Click here to view updates from {users}."; +"lng_stories_click_to_view_and_one" = "{accumulated}, {user}"; +"lng_stories_click_to_view_and_last" = "{accumulated} and {user}"; +"lng_stories_show_more" = "Show more"; + +"lng_stories_my_title" = "Saved Stories"; +"lng_stories_archive_button" = "Stories Archive"; +"lng_stories_recent_button" = "Recent Stories"; +"lng_stories_archive_title" = "Stories Archive"; +"lng_stories_archive_about" = "Only you can see archived stories unless you choose to save them to your profile."; +"lng_stories_channel_archive_about" = "Only admins of the channel can see archived stories unless they are saved to the channel page."; +"lng_stories_reply_sent" = "Message Sent"; +"lng_stories_hidden_to_contacts" = "Stories from {user} will now be shown in **Archived Chats**."; +"lng_stories_shown_in_chats" = "Stories from {user} will now be shown in the **Chats List**."; +"lng_stories_delete_one_sure" = "Are you sure you want to delete this story?"; +"lng_stories_delete_sure#one" = "Are you sure you want to delete {count} story?"; +"lng_stories_delete_sure#other" = "Are you sure you want to delete {count} stories?"; +"lng_stories_save_sure" = "Do you want to save this story to your profile?"; +"lng_stories_save_sure_many#one" = "Do you want to save {count} story to your profile?"; +"lng_stories_save_sure_many#other" = "Do you want to save {count} stories to your profile?"; +"lng_stories_save_done" = "This story is saved to your profile."; +"lng_stories_save_done_many#one" = "{count} story is saved to your profile."; +"lng_stories_save_done_many#other" = "{count} stories are saved to your profile."; +"lng_stories_save_done_about" = "Saved stories can be viewed by others on your profile until you remove them."; +"lng_stories_archive_sure" = "Do you want to hide this story from your profile?"; +"lng_stories_archive_sure_many#one" = "Do you want to hide {count} story from your profile?"; +"lng_stories_archive_sure_many#other" = "Do you want to hide {count} stories from your profile?"; +"lng_stories_archive_done" = "This story is hidden from your profile."; +"lng_stories_archive_done_many#one" = "{count} story is hidden from your profile."; +"lng_stories_archive_done_many#other" = "{count} stories are hidden from your profile."; +"lng_stories_channel_save_sure" = "Do you want to save this story to the channel page?"; +"lng_stories_channel_save_sure_many#one" = "Do you want to save {count} story to the channel page?"; +"lng_stories_channel_save_sure_many#other" = "Do you want to save {count} stories to the channel page?"; +"lng_stories_channel_save_done" = "This story is saved to the channel page."; +"lng_stories_channel_save_done_many#one" = "{count} story is saved to the channel page."; +"lng_stories_channel_save_done_many#other" = "{count} stories are saved to the channel page."; +"lng_stories_channel_save_done_about" = "Saved stories can be viewed by others on the channel page until they are removed."; +"lng_stories_channel_archive_sure" = "Do you want to hide this story from the channel page?"; +"lng_stories_channel_archive_sure_many#one" = "Do you want to hide {count} story from the channel page?"; +"lng_stories_channel_archive_sure_many#other" = "Do you want to hide {count} stories from the channel page?"; +"lng_stories_channel_archive_done" = "This story is hidden from the channel page."; +"lng_stories_channel_archive_done_many#one" = "{count} story is hidden from the channel page."; +"lng_stories_channel_archive_done_many#other" = "{count} stories are hidden from the channel page."; +"lng_stories_save_promo" = "Subscribe to {link} to download other people's unprotected stories to disk."; +"lng_stories_reaction_as_message" = "Send reaction as a private message"; + +"lng_stealth_mode_menu_item" = "Stealth Mode"; +"lng_stealth_mode_title" = "Stealth Mode"; +"lng_stealth_mode_unlock_about" = "Subscribe to Telegram Premium to hide the fact that you viewed peoples' stories from them."; +"lng_stealth_mode_about" = "Turn Stealth Mode on to hide the fact that you viewed peoples' stories from them."; +"lng_stealth_mode_past_title" = "Hide Recent Views"; +"lng_stealth_mode_past_about" = "Hide my views in the last 5 minutes."; +"lng_stealth_mode_next_title" = "Hide Next Views"; +"lng_stealth_mode_next_about" = "Hide my views in the next 25 minutes."; +"lng_stealth_mode_unlock" = "Unlock Stealth Mode"; +"lng_stealth_mode_enable" = "Enable Stealth Mode"; +"lng_stealth_mode_cooldown_in" = "Available in {left}"; +"lng_stealth_mode_cooldown_tip" = "Please wait until the **Stealth Mode** is ready to use again."; +"lng_stealth_mode_enabled_tip_title" = "Stealth Mode On"; +"lng_stealth_mode_enabled_tip" = "The creators of stories you viewed in the last **5 minutes** or will view in the next **25 minutes** won't see you in the viewers' lists."; +"lng_stealth_mode_countdown" = "Stealth Mode active – {left}"; +"lng_stealth_mode_already_title" = "You are in Stealth Mode"; +"lng_stealth_mode_already_about" = "The creators of stories you will view in the next **{left}** won't see you in the viewers' lists."; + +"lng_stories_link_invalid" = "This link is broken or has expired."; + +"lng_stats_title" = "Statistics"; +"lng_stats_message_title" = "Message Statistic"; +"lng_stats_story_title" = "Story Statistic"; +"lng_stats_zoom_out" = "Zoom Out"; + +"lng_stats_day_month_year" = "{days_count} {month} {year}"; +"lng_stats_day_month" = "{days_count} {month}"; +"lng_stats_weekday_day_month_year" = "{day}, {days_count} {month} {year}"; +"lng_stats_weekday_day_month_time" = "{day}, {days_count} {month} {time}"; + +"lng_stats_overview_title" = "Overview"; +"lng_stats_overview_member_count" = "Followers"; +"lng_stats_overview_mean_view_count" = "Views Per Post"; +"lng_stats_overview_mean_share_count" = "Shared Per Post"; +"lng_stats_overview_mean_reactions_count" = "Reactions Per Post"; +"lng_stats_overview_mean_story_view_count" = "Views Per Story"; +"lng_stats_overview_mean_story_share_count" = "Shared Per Story"; +"lng_stats_overview_mean_story_reactions_count" = "Reactions Per Story"; +"lng_stats_overview_enabled_notifications" = "Enabled Notifications"; +"lng_stats_overview_messages" = "Messages"; +"lng_stats_overview_group_mean_view_count" = "Viewing Members"; +"lng_stats_overview_group_mean_post_count" = "Posting Members"; +"lng_stats_overview_message_private_shares" = "Private Shares"; +"lng_stats_overview_message_public_shares" = "Public Shares"; +"lng_stats_overview_message_views" = "Views"; +"lng_stats_overview_message_public_share#one" = "{count} public share"; +"lng_stats_overview_message_public_share#other" = "{count} public shares"; + +"lng_stats_members_title" = "Top members"; +"lng_stats_admins_title" = "Top admins"; +"lng_stats_inviters_title" = "Top inviters"; +"lng_stats_member_messages#one" = "{count} message"; +"lng_stats_member_messages#other" = "{count} messages"; +"lng_stats_member_characters#one" = "{count} symbol per message"; +"lng_stats_member_characters#other" = "{count} symbols per message"; +"lng_stats_member_deletions#one" = "{count} deletions"; +"lng_stats_member_deletions#other" = "{count} deletions"; +"lng_stats_member_bans#one" = "{count} ban"; +"lng_stats_member_bans#other" = "{count} bans"; +"lng_stats_member_restrictions#one" = "{count} restriction"; +"lng_stats_member_restrictions#other" = "{count} restrictions"; +"lng_stats_member_invitations#one" = "{count} invitation"; +"lng_stats_member_invitations#other" = "{count} invitations"; + +"lng_stats_recent_messages_title" = "Recent posts"; +"lng_stats_recent_messages_views#one" = "{count} view"; +"lng_stats_recent_messages_views#other" = "{count} views"; + +"lng_stats_loading" = "Loading stats..."; +"lng_stats_loading_subtext" = "Please wait a few moments while we generate your stats."; + +"lng_chart_title_member_count" = "Growth"; +"lng_chart_title_join" = "Followers"; +"lng_chart_title_mute" = "Notifications"; +"lng_chart_title_view_count_by_hour" = "Views by hours"; +"lng_chart_title_view_count_by_source" = "Views by source"; +"lng_chart_title_join_by_source" = "New followers by source"; +"lng_chart_title_language" = "Languages"; +"lng_chart_title_message_interaction" = "Interactions"; +"lng_chart_title_instant_view_interaction" = "IV Interactions"; +"lng_chart_title_reactions_by_emotion" = "Reactions"; +"lng_chart_title_story_interactions" = "Story Interactions"; +"lng_chart_title_story_reactions_by_emotion" = "Story reactions"; + +"lng_chart_title_group_join" = "Group members"; +"lng_chart_title_group_join_by_source" = "New members by source"; +"lng_chart_title_group_language" = "Members's primary language"; +"lng_chart_title_group_message_content" = "Messages"; +"lng_chart_title_group_action" = "Actions"; +"lng_chart_title_group_day" = "Views by hours"; +"lng_chart_title_group_week" = "Top days of week"; + +"lng_boosts_title" = "Boosts"; +"lng_boosts_level" = "Level"; +"lng_boosts_existing" = "Existing boosts"; +"lng_boosts_premium_audience" = "Premium subscribers"; +"lng_boosts_premium_members" = "Premium members"; +"lng_boosts_next_level" = "Boosts to level up"; +"lng_boosts_list_title#one" = "{count} Boost"; +"lng_boosts_list_title#other" = "{count} Boosts"; +"lng_boosts_list_subtext" = "Your channel is currently boosted by these users."; +"lng_boosts_list_subtext_group" = "Your group is currently boosted by these users."; +"lng_boosts_show_more_boosts#one" = "Show {count} More Boosts"; +"lng_boosts_show_more_boosts#other" = "Show {count} More Boosts"; +"lng_boosts_show_more_gifts#one" = "Show {count} More Boosts"; +"lng_boosts_show_more_gifts#other" = "Show {count} More Boosts"; +"lng_boosts_list_status" = "boost expires on {date}"; +"lng_boosts_link_title" = "Link for boosting"; +"lng_boosts_link_subtext" = "Share this link with your subscribers to get more boosts."; +"lng_boosts_link_subtext_group" = "Share this link with the members of your group to get more boosts."; +"lng_boosts_get_boosts" = "Get Boosts via Gifts"; +"lng_boosts_get_boosts_subtext" = "Get more boosts for your channel by gifting Telegram Premium to your subscribers."; +"lng_boosts_get_boosts_subtext_group" = "Get more boosts for your group by gifting Telegram Premium to the members."; +"lng_boosts_list_unclaimed" = "Unclaimed"; +"lng_boosts_list_pending" = "To be distributed"; +"lng_boosts_list_pending_about" = "The recipient will be selected when the giveaway ends."; +"lng_boosts_list_tab_gifts#one" = "{count} Gifts"; +"lng_boosts_list_tab_gifts#other" = "{count} Gifts"; + +"lng_boosts_prepaid_giveaway_title" = "Prepaid giveaways"; +"lng_boosts_prepaid_giveaway_single" = "Prepaid giveaway"; +"lng_boosts_prepaid_giveaway_quantity#one" = "{count} Telegram Premium"; +"lng_boosts_prepaid_giveaway_quantity#other" = "{count} Telegram Premium"; +"lng_boosts_prepaid_giveaway_moths#one" = "{count}-month subscriptions"; +"lng_boosts_prepaid_giveaway_moths#other" = "{count}-month subscriptions"; +"lng_boosts_prepaid_giveaway_status#one" = "{count} subscription {duration}"; +"lng_boosts_prepaid_giveaway_status#other" = "{count} subscriptions {duration}"; + +"lng_contact_add" = "Add"; +"lng_contact_send_message" = "message"; + +"lng_iv_open_in_browser" = "Open in Browser"; +"lng_iv_share" = "Share"; // Wnd specific @@ -3095,7 +4930,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_mac_menu_player_resume" = "Resume"; "lng_mac_menu_player_next" = "Next"; "lng_mac_menu_player_previous" = "Previous"; -"lng_mac_menu_player_stop" = "Stop"; "lng_mac_touchbar_favorite_stickers" = "Favorite stickers"; diff --git a/Telegram/Resources/langs/rewrites/en.json b/Telegram/Resources/langs/rewrites/en.json index 33a141362..272127303 100644 --- a/Telegram/Resources/langs/rewrites/en.json +++ b/Telegram/Resources/langs/rewrites/en.json @@ -39,9 +39,7 @@ "ktg_settings_sticker_scale_both_about": "When enabled, sticker maximum width will be changed along with sticker height.", "ktg_settings_emoji_outline": "Big emoji outline", "ktg_settings_disable_up_edit": "Disable edit by Up key", - "ktg_settings_auto_scroll_unfocused": "Unfocused auto-scroll", "ktg_settings_always_show_scheduled": "Always show scheduled", - "ktg_settings_chat_list_compact": "Compact chat list", "ktg_fonts_title": "Fonts", "ktg_settings_fonts": "Change application fonts", "ktg_fonts_reset": "Reset", @@ -62,11 +60,6 @@ "ktg_net_speed_boost_medium": "Medium", "ktg_net_speed_boost_big": "Big", "ktg_settings_system": "System", - "ktg_settings_qt_scale": "Qt scaling engine", - "ktg_settings_file_dialog_type": "File chooser dialog", - "ktg_file_dialog_type_default": "Default", - "ktg_file_dialog_disabled_on_build": "Disabled on build time", - "ktg_file_dialog_disabled_by_option": "Disabled by option", "ktg_settings_other": "Other", "ktg_profile_copy_id": "Copy ID", "ktg_profile_bot_id": "Bot ID", @@ -74,14 +67,8 @@ "ktg_profile_group_id": "Group ID", "ktg_profile_supergroup_id": "Supergroup ID", "ktg_profile_channel_id": "Channel ID", - "ktg_settings_show_phone_number": "Show phone in drawer", - "ktg_settings_call_confirm": "Confirm before calling", - "ktg_call_sure": "Are you sure you want to call this user?", - "ktg_call_button": "Call", "ktg_settings_ffmpeg_multithread": "Multithread video decoding", "ktg_settings_ffmpeg_multithread_about": "When enabled, CPU and RAM consumption is higher, video decodes faster. When disabled, CPU and RAM consumption is lower, video decodes slower. The more CPU cores you have, the more RAM consumption you have when this option is enabled. You can set exact number of threads in the JSON configuration file.", - "ktg_settings_external_video_player": "External video player", - "ktg_settings_external_video_player_about": "When this option is enabled, autoplay is force-disabled and system video player is used to play videos.", "ktg_settings_adaptive_bubbles": "Adaptive bubbles", "ktg_settings_disable_sound_from_tray": "Disable sound", "ktg_settings_enable_sound_from_tray": "Enable sound", @@ -109,12 +96,6 @@ "ktg_stickers_copy_title": "Copy name", "ktg_stickers_title_copied": "Sticker pack name copied to clipboard.", "ktg_context_show_messages_from": "User messages", - "ktg_settings_userpic_rounding": "Profile pictures rounding", - "ktg_settings_userpic_rounding_none": "Square", - "ktg_settings_userpic_rounding_small": "Small", - "ktg_settings_userpic_rounding_big": "Big", - "ktg_settings_userpic_rounding_full": "Circle", - "ktg_settings_userpic_rounding_desc": "You'll need to restart app to save changes.", "ktg_settings_tray_icon": "Tray icon", "ktg_settings_tray_icon_default": "Default", "ktg_settings_tray_icon_blue": "Blue", @@ -131,14 +112,6 @@ "ktg_settings_chat_id_telegram": "Telegram API", "ktg_settings_chat_id_bot": "Bot API", "ktg_message_id": "Message ID: {id}", - "ktg_local_storage_limit_days": { - "zero": "{count} days", - "one": "{count} day", - "two": "{count} days", - "few": "{count} days", - "many": "{count} days", - "other": "{count} days" - }, "ktg_settings_monospace_large_bubbles": "Expand bubbles with monospace", "ktg_bot_id_copied": "Bot ID copied to clipboard.", "ktg_user_id_copied": "User ID copied to clipboard.", @@ -146,7 +119,6 @@ "ktg_supergroup_id_copied": "Supergroup ID copied to clipboard.", "ktg_channel_id_copied": "Channel ID copied to clipboard.", "ktg_phone_copied": "Phone copied to clipboard.", - "ktg_mention_copied": "Username copied to clipboard.", "ktg_status_mutual_contact": "mutual contact", "ktg_status_contact": "contact", "ktg_status_non_contact": "non-contact", @@ -157,14 +129,6 @@ "ktg_group_status_admin": "is admin", "ktg_too_many_accounts_warning": "Warning! Using too many accounts at the same time is not recommended due to higher memory comsumption and possible crashes because of it.\n\nYou sure you want to add a new account?", "ktg_account_add_anyway": "Add anyway", - "ktg_rights_chat_send_stickers": "Send stickers", - "ktg_rights_chat_send_gif": "Send GIFs", - "ktg_rights_chat_send_games": "Send games", - "ktg_rights_chat_use_inline": "Use inline bots", - "ktg_admin_log_banned_send_stickers": "Send stickers", - "ktg_admin_log_banned_send_gif": "Send GIFs", - "ktg_admin_log_banned_send_games": "Send games", - "ktg_admin_log_banned_use_inline": "Use inline bots", "ktg_forward_go_to_chat": "Go to chat", "ktg_settings_forward": "Forward", "ktg_settings_forward_retain_selection": "Retain selection after forward", @@ -202,44 +166,11 @@ "ktg_filters_hide_all_chats_toast": "\"All Chats\" folder is hidden.\nYou can enable it back in Kotatogram Settings.", "ktg_filters_hide_edit_toast": "Edit button is hidden.\nYou can enable it back in Kotatogram Settings.", "ktg_settings_telegram_sites_autologin": "Auto-login on Telegram sites", - "ktg_mute_for_selected_time": "For selected time", "ktg_send_preview": "Send preview", "ktg_send_silent_preview": "Send preview silent", "ktg_reminder_preview": "Remind with preview", "ktg_schedule_preview": "Send preview scheduled", "ktg_language_reloaded": "Kotatogram-specific language strings were reloaded.", - "ktg_notifications_mute_seconds": { - "zero": "seconds", - "one": "second", - "two": "seconds", - "few": "seconds", - "many": "seconds", - "other": "seconds" - }, - "ktg_notifications_mute_minutes": { - "zero": "minutes", - "one": "minute", - "two": "minutes", - "few": "minutes", - "many": "minutes", - "other": "minutes" - }, - "ktg_notifications_mute_hours": { - "zero": "hours", - "one": "hour", - "two": "hours", - "few": "hours", - "many": "hours", - "other": "hours" - }, - "ktg_notifications_mute_days": { - "zero": "days", - "one": "day", - "two": "days", - "few": "days", - "many": "days", - "other": "days" - }, "ktg_forward_sender_names_and_captions_removed": "Sender names and captions removed", "ktg_forward_remember_mode": "Remember forward mode", "ktg_forward_mode": "Forward mode", @@ -273,5 +204,13 @@ "ktg_settings_view_profile_on_top_about": "This option also enables \"Add \"View Profile\"\" from TDesktop's experimental settings.", "ktg_settings_emoji_sidebar": "Enable emoji sidebar", "ktg_settings_emoji_sidebar_right_click": "Emoji sidebar on right click", + "ktg_premium_double_limits_about_accounts": { + "zero": "Connect {count} accounts with different mobile numbers in official apps", + "one": "Connect {count} account with different mobile numbers in official apps", + "two": "Connect {count} accounts with different mobile numbers in official apps", + "few": "Connect {count} accounts with different mobile numbers in official apps", + "many": "Connect {count} accounts with different mobile numbers in official apps", + "other": "Connect {count} accounts with different mobile numbers in official apps" + }, "dummy_last_string": "" } diff --git a/Telegram/Resources/night-custom-base.tdesktop-theme b/Telegram/Resources/night-custom-base.tdesktop-theme index 2c5f6d72b..5fc6424ae 100644 Binary files a/Telegram/Resources/night-custom-base.tdesktop-theme and b/Telegram/Resources/night-custom-base.tdesktop-theme differ diff --git a/Telegram/Resources/night-green.tdesktop-theme b/Telegram/Resources/night-green.tdesktop-theme index 4c29a2d9f..a60d844be 100644 Binary files a/Telegram/Resources/night-green.tdesktop-theme and b/Telegram/Resources/night-green.tdesktop-theme differ diff --git a/Telegram/Resources/night.tdesktop-theme b/Telegram/Resources/night.tdesktop-theme index 6a557e631..96f788d13 100644 Binary files a/Telegram/Resources/night.tdesktop-theme and b/Telegram/Resources/night.tdesktop-theme differ diff --git a/Telegram/Resources/qrc/emoji_8.qrc b/Telegram/Resources/qrc/emoji_8.qrc new file mode 100644 index 000000000..51765a39b --- /dev/null +++ b/Telegram/Resources/qrc/emoji_8.qrc @@ -0,0 +1,5 @@ + + + ../emoji/emoji_8.webp + + diff --git a/Telegram/Resources/qrc/telegram/animations.qrc b/Telegram/Resources/qrc/telegram/animations.qrc new file mode 100644 index 000000000..12666b6fd --- /dev/null +++ b/Telegram/Resources/qrc/telegram/animations.qrc @@ -0,0 +1,25 @@ + + + ../../animations/blocked_peers_empty.tgs + ../../animations/filters.tgs + ../../animations/cloud_filters.tgs + ../../animations/local_passcode_enter.tgs + ../../animations/cloud_password/intro.tgs + ../../animations/cloud_password/password_input.tgs + ../../animations/cloud_password/hint.tgs + ../../animations/cloud_password/email.tgs + ../../animations/ttl.tgs + ../../animations/discussion.tgs + ../../animations/stats.tgs + ../../animations/voice_ttl_idle.tgs + ../../animations/voice_ttl_start.tgs + ../../animations/palette.tgs + ../../animations/sleep.tgs + ../../animations/greeting.tgs + ../../animations/location.tgs + ../../animations/robot.tgs + ../../animations/writing.tgs + ../../animations/hours.tgs + ../../animations/phone.tgs + + diff --git a/Telegram/Resources/qrc/telegram/export.qrc b/Telegram/Resources/qrc/telegram/export.qrc new file mode 100644 index 000000000..290d24a30 --- /dev/null +++ b/Telegram/Resources/qrc/telegram/export.qrc @@ -0,0 +1,46 @@ + + + ../../export_html/css/style.css + ../../export_html/images/back.png + ../../export_html/images/back@2x.png + ../../export_html/images/media_call.png + ../../export_html/images/media_call@2x.png + ../../export_html/images/media_contact.png + ../../export_html/images/media_contact@2x.png + ../../export_html/images/media_file.png + ../../export_html/images/media_file@2x.png + ../../export_html/images/media_game.png + ../../export_html/images/media_game@2x.png + ../../export_html/images/media_location.png + ../../export_html/images/media_location@2x.png + ../../export_html/images/media_music.png + ../../export_html/images/media_music@2x.png + ../../export_html/images/media_photo.png + ../../export_html/images/media_photo@2x.png + ../../export_html/images/media_shop.png + ../../export_html/images/media_shop@2x.png + ../../export_html/images/media_video.png + ../../export_html/images/media_video@2x.png + ../../export_html/images/media_voice.png + ../../export_html/images/media_voice@2x.png + ../../export_html/images/section_calls.png + ../../export_html/images/section_calls@2x.png + ../../export_html/images/section_chats.png + ../../export_html/images/section_chats@2x.png + ../../export_html/images/section_contacts.png + ../../export_html/images/section_contacts@2x.png + ../../export_html/images/section_frequent.png + ../../export_html/images/section_frequent@2x.png + ../../export_html/images/section_other.png + ../../export_html/images/section_other@2x.png + ../../export_html/images/section_photos.png + ../../export_html/images/section_photos@2x.png + ../../export_html/images/section_sessions.png + ../../export_html/images/section_sessions@2x.png + ../../export_html/images/section_stories.png + ../../export_html/images/section_stories@2x.png + ../../export_html/images/section_web.png + ../../export_html/images/section_web@2x.png + ../../export_html/js/script.js + + diff --git a/Telegram/Resources/qrc/telegram/iv.qrc b/Telegram/Resources/qrc/telegram/iv.qrc new file mode 100644 index 000000000..1c9e9eb6a --- /dev/null +++ b/Telegram/Resources/qrc/telegram/iv.qrc @@ -0,0 +1,9 @@ + + + ../../iv_html/page.css + ../../iv_html/page.js + ../../iv_html/highlight.9.12.0.css + ../../iv_html/highlight.9.12.0.js + ../../iv_html/morphdom-umd.min.2.7.2.js + + diff --git a/Telegram/Resources/qrc/telegram/mac_icons.qrc b/Telegram/Resources/qrc/telegram/mac_icons.qrc new file mode 100644 index 000000000..977b0c8ed --- /dev/null +++ b/Telegram/Resources/qrc/telegram/mac_icons.qrc @@ -0,0 +1,5 @@ + + + ../../art/icon_round512@2x.png + + diff --git a/Telegram/Resources/qrc/telegram/telegram.qrc b/Telegram/Resources/qrc/telegram/telegram.qrc index a0b4d60bb..a10bb8d12 100644 --- a/Telegram/Resources/qrc/telegram/telegram.qrc +++ b/Telegram/Resources/qrc/telegram/telegram.qrc @@ -1,50 +1,9 @@ - - ../../export_html/css/style.css - ../../export_html/images/back.png - ../../export_html/images/back@2x.png - ../../export_html/images/media_call.png - ../../export_html/images/media_call@2x.png - ../../export_html/images/media_contact.png - ../../export_html/images/media_contact@2x.png - ../../export_html/images/media_file.png - ../../export_html/images/media_file@2x.png - ../../export_html/images/media_game.png - ../../export_html/images/media_game@2x.png - ../../export_html/images/media_location.png - ../../export_html/images/media_location@2x.png - ../../export_html/images/media_music.png - ../../export_html/images/media_music@2x.png - ../../export_html/images/media_photo.png - ../../export_html/images/media_photo@2x.png - ../../export_html/images/media_shop.png - ../../export_html/images/media_shop@2x.png - ../../export_html/images/media_video.png - ../../export_html/images/media_video@2x.png - ../../export_html/images/media_voice.png - ../../export_html/images/media_voice@2x.png - ../../export_html/images/section_calls.png - ../../export_html/images/section_calls@2x.png - ../../export_html/images/section_chats.png - ../../export_html/images/section_chats@2x.png - ../../export_html/images/section_contacts.png - ../../export_html/images/section_contacts@2x.png - ../../export_html/images/section_frequent.png - ../../export_html/images/section_frequent@2x.png - ../../export_html/images/section_other.png - ../../export_html/images/section_other@2x.png - ../../export_html/images/section_photos.png - ../../export_html/images/section_photos@2x.png - ../../export_html/images/section_sessions.png - ../../export_html/images/section_sessions@2x.png - ../../export_html/images/section_web.png - ../../export_html/images/section_web@2x.png - ../../export_html/js/script.js - ../../art/background.tgv ../../art/bg_thumbnail.png ../../art/bg_initial.jpg + ../../art/business_logo.png ../../art/logo_256.png ../../art/logo_256_blue.png ../../art/logo_256_green.png @@ -67,6 +26,7 @@ ../../art/slot_2_idle.tgs ../../art/slot_back.tgs ../../art/slot_pull.tgs + ../../art/winners.tgs ../../day-blue.tdesktop-theme ../../night.tdesktop-theme ../../night-green.tdesktop-theme @@ -77,6 +37,19 @@ ../../art/recording/recording_info_audio.svg ../../art/recording/recording_info_video_landscape.svg ../../art/recording/recording_info_video_portrait.svg + ../../art/ttl/video_message_icon.svg + ../../icons/settings/dino.svg + ../../icons/settings/star.svg + ../../icons/settings/starmini.svg + ../../icons/tray_monochrome.svg + ../../art/topic_icons/blue.svg + ../../art/topic_icons/yellow.svg + ../../art/topic_icons/violet.svg + ../../art/topic_icons/green.svg + ../../art/topic_icons/rose.svg + ../../art/topic_icons/red.svg + ../../art/topic_icons/gray.svg + ../../art/topic_icons/general.svg ../../icons/calls/hands.lottie @@ -96,7 +69,7 @@ ../../default_shortcuts-custom.json ../../default_kotato-settings-custom.json - ../../../../lib/xdg/kotatogramdesktop.desktop + ../../../../lib/xdg/io.github.kotatogram.desktop ../../langs/rewrites/alttg.json diff --git a/Telegram/Resources/tl/api.tl b/Telegram/Resources/tl/api.tl deleted file mode 100644 index fa80f14d6..000000000 --- a/Telegram/Resources/tl/api.tl +++ /dev/null @@ -1,1759 +0,0 @@ -/////////////////////////////// -/////////////////// Layer cons -/////////////////////////////// - -//invokeAfterMsg#cb9f372d msg_id:long query:!X = X; -//invokeAfterMsgs#3dc4b4f0 msg_ids:Vector query:!X = X; -//invokeWithLayer1#53835315 query:!X = X; -//invokeWithLayer2#289dd1f6 query:!X = X; -//invokeWithLayer3#b7475268 query:!X = X; -//invokeWithLayer4#dea0d430 query:!X = X; -//invokeWithLayer5#417a57ae query:!X = X; -//invokeWithLayer6#3a64d54d query:!X = X; -//invokeWithLayer7#a5be56d3 query:!X = X; -//invokeWithLayer8#e9abd9fd query:!X = X; -//invokeWithLayer9#76715a63 query:!X = X; -//invokeWithLayer10#39620c41 query:!X = X; -//invokeWithLayer11#a6b88fdf query:!X = X; -//invokeWithLayer12#dda60d3c query:!X = X; -//invokeWithLayer13#427c8ea2 query:!X = X; -//invokeWithLayer14#2b9b08fa query:!X = X; -//invokeWithLayer15#b4418b64 query:!X = X; -//invokeWithLayer16#cf5f0987 query:!X = X; -//invokeWithLayer17#50858a19 query:!X = X; -//invokeWithLayer18#1c900537 query:!X = X; -//invokeWithLayer#da9b0d0d layer:int query:!X = X; // after 18 layer - -/////////////////////////////// -///////// Main application API -/////////////////////////////// - -boolFalse#bc799737 = Bool; -boolTrue#997275b5 = Bool; - -true#3fedd339 = True; - -vector#1cb5c415 {t:Type} # [ t ] = Vector t; - -error#c4b9f9bb code:int text:string = Error; - -null#56730bcc = Null; - -inputPeerEmpty#7f3b18ea = InputPeer; -inputPeerSelf#7da07ec9 = InputPeer; -inputPeerChat#35a95cb9 chat_id:long = InputPeer; -inputPeerUser#dde8a54c user_id:long access_hash:long = InputPeer; -inputPeerChannel#27bcbbfc channel_id:long access_hash:long = InputPeer; -inputPeerUserFromMessage#a87b0a1c peer:InputPeer msg_id:int user_id:long = InputPeer; -inputPeerChannelFromMessage#bd2a0840 peer:InputPeer msg_id:int channel_id:long = InputPeer; - -inputUserEmpty#b98886cf = InputUser; -inputUserSelf#f7c1b13f = InputUser; -inputUser#f21158c6 user_id:long access_hash:long = InputUser; -inputUserFromMessage#1da448e2 peer:InputPeer msg_id:int user_id:long = InputUser; - -inputPhoneContact#f392b7f4 client_id:long phone:string first_name:string last_name:string = InputContact; - -inputFile#f52ff27f id:long parts:int name:string md5_checksum:string = InputFile; -inputFileBig#fa4f0bb5 id:long parts:int name:string = InputFile; - -inputMediaEmpty#9664f57f = InputMedia; -inputMediaUploadedPhoto#1e287d04 flags:# file:InputFile stickers:flags.0?Vector ttl_seconds:flags.1?int = InputMedia; -inputMediaPhoto#b3ba0635 flags:# id:InputPhoto ttl_seconds:flags.0?int = InputMedia; -inputMediaGeoPoint#f9c44144 geo_point:InputGeoPoint = InputMedia; -inputMediaContact#f8ab7dfb phone_number:string first_name:string last_name:string vcard:string = InputMedia; -inputMediaUploadedDocument#5b38c6c1 flags:# nosound_video:flags.3?true force_file:flags.4?true file:InputFile thumb:flags.2?InputFile mime_type:string attributes:Vector stickers:flags.0?Vector ttl_seconds:flags.1?int = InputMedia; -inputMediaDocument#33473058 flags:# id:InputDocument ttl_seconds:flags.0?int query:flags.1?string = InputMedia; -inputMediaVenue#c13d1c11 geo_point:InputGeoPoint title:string address:string provider:string venue_id:string venue_type:string = InputMedia; -inputMediaPhotoExternal#e5bbfe1a flags:# url:string ttl_seconds:flags.0?int = InputMedia; -inputMediaDocumentExternal#fb52dc99 flags:# url:string ttl_seconds:flags.0?int = InputMedia; -inputMediaGame#d33f43f3 id:InputGame = InputMedia; -inputMediaInvoice#d9799874 flags:# title:string description:string photo:flags.0?InputWebDocument invoice:Invoice payload:bytes provider:string provider_data:DataJSON start_param:flags.1?string = InputMedia; -inputMediaGeoLive#971fa843 flags:# stopped:flags.0?true geo_point:InputGeoPoint heading:flags.2?int period:flags.1?int proximity_notification_radius:flags.3?int = InputMedia; -inputMediaPoll#f94e5f1 flags:# poll:Poll correct_answers:flags.0?Vector solution:flags.1?string solution_entities:flags.1?Vector = InputMedia; -inputMediaDice#e66fbf7b emoticon:string = InputMedia; - -inputChatPhotoEmpty#1ca48f57 = InputChatPhoto; -inputChatUploadedPhoto#c642724e flags:# file:flags.0?InputFile video:flags.1?InputFile video_start_ts:flags.2?double = InputChatPhoto; -inputChatPhoto#8953ad37 id:InputPhoto = InputChatPhoto; - -inputGeoPointEmpty#e4c123d6 = InputGeoPoint; -inputGeoPoint#48222faf flags:# lat:double long:double accuracy_radius:flags.0?int = InputGeoPoint; - -inputPhotoEmpty#1cd7bf0d = InputPhoto; -inputPhoto#3bb3b94a id:long access_hash:long file_reference:bytes = InputPhoto; - -inputFileLocation#dfdaabe1 volume_id:long local_id:int secret:long file_reference:bytes = InputFileLocation; -inputEncryptedFileLocation#f5235d55 id:long access_hash:long = InputFileLocation; -inputDocumentFileLocation#bad07584 id:long access_hash:long file_reference:bytes thumb_size:string = InputFileLocation; -inputSecureFileLocation#cbc7ee28 id:long access_hash:long = InputFileLocation; -inputTakeoutFileLocation#29be5899 = InputFileLocation; -inputPhotoFileLocation#40181ffe id:long access_hash:long file_reference:bytes thumb_size:string = InputFileLocation; -inputPhotoLegacyFileLocation#d83466f3 id:long access_hash:long file_reference:bytes volume_id:long local_id:int secret:long = InputFileLocation; -inputPeerPhotoFileLocation#37257e99 flags:# big:flags.0?true peer:InputPeer photo_id:long = InputFileLocation; -inputStickerSetThumb#9d84f3db stickerset:InputStickerSet thumb_version:int = InputFileLocation; -inputGroupCallStream#598a92a flags:# call:InputGroupCall time_ms:long scale:int video_channel:flags.0?int video_quality:flags.0?int = InputFileLocation; - -peerUser#59511722 user_id:long = Peer; -peerChat#36c6019a chat_id:long = Peer; -peerChannel#a2a5371e channel_id:long = Peer; - -storage.fileUnknown#aa963b05 = storage.FileType; -storage.filePartial#40bc6f52 = storage.FileType; -storage.fileJpeg#7efe0e = storage.FileType; -storage.fileGif#cae1aadf = storage.FileType; -storage.filePng#a4f63c0 = storage.FileType; -storage.filePdf#ae1e508d = storage.FileType; -storage.fileMp3#528a0677 = storage.FileType; -storage.fileMov#4b09ebbc = storage.FileType; -storage.fileMp4#b3cea0e4 = storage.FileType; -storage.fileWebp#1081464c = storage.FileType; - -userEmpty#d3bc4b7a id:long = User; -user#3ff6ecb0 flags:# self:flags.10?true contact:flags.11?true mutual_contact:flags.12?true deleted:flags.13?true bot:flags.14?true bot_chat_history:flags.15?true bot_nochats:flags.16?true verified:flags.17?true restricted:flags.18?true min:flags.20?true bot_inline_geo:flags.21?true support:flags.23?true scam:flags.24?true apply_min_photo:flags.25?true fake:flags.26?true id:long access_hash:flags.0?long first_name:flags.1?string last_name:flags.2?string username:flags.3?string phone:flags.4?string photo:flags.5?UserProfilePhoto status:flags.6?UserStatus bot_info_version:flags.14?int restriction_reason:flags.18?Vector bot_inline_placeholder:flags.19?string lang_code:flags.22?string = User; - -userProfilePhotoEmpty#4f11bae1 = UserProfilePhoto; -userProfilePhoto#82d1f706 flags:# has_video:flags.0?true photo_id:long stripped_thumb:flags.1?bytes dc_id:int = UserProfilePhoto; - -userStatusEmpty#9d05049 = UserStatus; -userStatusOnline#edb93949 expires:int = UserStatus; -userStatusOffline#8c703f was_online:int = UserStatus; -userStatusRecently#e26f42f1 = UserStatus; -userStatusLastWeek#7bf09fc = UserStatus; -userStatusLastMonth#77ebc742 = UserStatus; - -chatEmpty#29562865 id:long = Chat; -chat#41cbf256 flags:# creator:flags.0?true kicked:flags.1?true left:flags.2?true deactivated:flags.5?true call_active:flags.23?true call_not_empty:flags.24?true noforwards:flags.25?true id:long title:string photo:ChatPhoto participants_count:int date:int version:int migrated_to:flags.6?InputChannel admin_rights:flags.14?ChatAdminRights default_banned_rights:flags.18?ChatBannedRights = Chat; -chatForbidden#6592a1a7 id:long title:string = Chat; -channel#8261ac61 flags:# creator:flags.0?true left:flags.2?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true signatures:flags.11?true min:flags.12?true scam:flags.19?true has_link:flags.20?true has_geo:flags.21?true slowmode_enabled:flags.22?true call_active:flags.23?true call_not_empty:flags.24?true fake:flags.25?true gigagroup:flags.26?true noforwards:flags.27?true id:long access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int restriction_reason:flags.9?Vector admin_rights:flags.14?ChatAdminRights banned_rights:flags.15?ChatBannedRights default_banned_rights:flags.18?ChatBannedRights participants_count:flags.17?int = Chat; -channelForbidden#17d493d5 flags:# broadcast:flags.5?true megagroup:flags.8?true id:long access_hash:long title:string until_date:flags.16?int = Chat; - -chatFull#d18ee226 flags:# can_set_username:flags.7?true has_scheduled:flags.8?true id:long about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:flags.13?ExportedChatInvite bot_info:flags.3?Vector pinned_msg_id:flags.6?int folder_id:flags.11?int call:flags.12?InputGroupCall ttl_period:flags.14?int groupcall_default_join_as:flags.15?Peer theme_emoticon:flags.16?string requests_pending:flags.17?int recent_requesters:flags.17?Vector available_reactions:flags.18?Vector = ChatFull; -channelFull#e13c3d20 flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true id:long about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:flags.23?ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?long migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?long location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int call:flags.21?InputGroupCall ttl_period:flags.24?int pending_suggestions:flags.25?Vector groupcall_default_join_as:flags.26?Peer theme_emoticon:flags.27?string requests_pending:flags.28?int recent_requesters:flags.28?Vector default_send_as:flags.29?Peer available_reactions:flags.30?Vector = ChatFull; - -chatParticipant#c02d4007 user_id:long inviter_id:long date:int = ChatParticipant; -chatParticipantCreator#e46bcee4 user_id:long = ChatParticipant; -chatParticipantAdmin#a0933f5b user_id:long inviter_id:long date:int = ChatParticipant; - -chatParticipantsForbidden#8763d3e1 flags:# chat_id:long self_participant:flags.0?ChatParticipant = ChatParticipants; -chatParticipants#3cbc93f8 chat_id:long participants:Vector version:int = ChatParticipants; - -chatPhotoEmpty#37c1011c = ChatPhoto; -chatPhoto#1c6e1c11 flags:# has_video:flags.0?true photo_id:long stripped_thumb:flags.1?bytes dc_id:int = ChatPhoto; - -messageEmpty#90a6ca84 flags:# id:int peer_id:flags.0?Peer = Message; -message#38116ee0 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true legacy:flags.19?true edit_hide:flags.21?true pinned:flags.24?true noforwards:flags.26?true id:int from_id:flags.8?Peer peer_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?long reply_to:flags.3?MessageReplyHeader date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector views:flags.10?int forwards:flags.10?int replies:flags.23?MessageReplies edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long reactions:flags.20?MessageReactions restriction_reason:flags.22?Vector ttl_period:flags.25?int = Message; -messageService#2b085862 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true legacy:flags.19?true id:int from_id:flags.8?Peer peer_id:Peer reply_to:flags.3?MessageReplyHeader date:int action:MessageAction ttl_period:flags.25?int = Message; - -messageMediaEmpty#3ded6320 = MessageMedia; -messageMediaPhoto#695150d7 flags:# photo:flags.0?Photo ttl_seconds:flags.2?int = MessageMedia; -messageMediaGeo#56e0d474 geo:GeoPoint = MessageMedia; -messageMediaContact#70322949 phone_number:string first_name:string last_name:string vcard:string user_id:long = MessageMedia; -messageMediaUnsupported#9f84f49e = MessageMedia; -messageMediaDocument#9cb070d7 flags:# document:flags.0?Document ttl_seconds:flags.2?int = MessageMedia; -messageMediaWebPage#a32dd600 webpage:WebPage = MessageMedia; -messageMediaVenue#2ec0533f geo:GeoPoint title:string address:string provider:string venue_id:string venue_type:string = MessageMedia; -messageMediaGame#fdb19008 game:Game = MessageMedia; -messageMediaInvoice#84551347 flags:# shipping_address_requested:flags.1?true test:flags.3?true title:string description:string photo:flags.0?WebDocument receipt_msg_id:flags.2?int currency:string total_amount:long start_param:string = MessageMedia; -messageMediaGeoLive#b940c666 flags:# geo:GeoPoint heading:flags.0?int period:int proximity_notification_radius:flags.1?int = MessageMedia; -messageMediaPoll#4bd6e798 poll:Poll results:PollResults = MessageMedia; -messageMediaDice#3f7ee58b value:int emoticon:string = MessageMedia; - -messageActionEmpty#b6aef7b0 = MessageAction; -messageActionChatCreate#bd47cbad title:string users:Vector = MessageAction; -messageActionChatEditTitle#b5a1ce5a title:string = MessageAction; -messageActionChatEditPhoto#7fcb13a8 photo:Photo = MessageAction; -messageActionChatDeletePhoto#95e3fbef = MessageAction; -messageActionChatAddUser#15cefd00 users:Vector = MessageAction; -messageActionChatDeleteUser#a43f30cc user_id:long = MessageAction; -messageActionChatJoinedByLink#31224c3 inviter_id:long = MessageAction; -messageActionChannelCreate#95d2ac92 title:string = MessageAction; -messageActionChatMigrateTo#e1037f92 channel_id:long = MessageAction; -messageActionChannelMigrateFrom#ea3948e9 title:string chat_id:long = MessageAction; -messageActionPinMessage#94bd38ed = MessageAction; -messageActionHistoryClear#9fbab604 = MessageAction; -messageActionGameScore#92a72876 game_id:long score:int = MessageAction; -messageActionPaymentSentMe#8f31b327 flags:# currency:string total_amount:long payload:bytes info:flags.0?PaymentRequestedInfo shipping_option_id:flags.1?string charge:PaymentCharge = MessageAction; -messageActionPaymentSent#40699cd0 currency:string total_amount:long = MessageAction; -messageActionPhoneCall#80e11a7f flags:# video:flags.2?true call_id:long reason:flags.0?PhoneCallDiscardReason duration:flags.1?int = MessageAction; -messageActionScreenshotTaken#4792929b = MessageAction; -messageActionCustomAction#fae69f56 message:string = MessageAction; -messageActionBotAllowed#abe9affe domain:string = MessageAction; -messageActionSecureValuesSentMe#1b287353 values:Vector credentials:SecureCredentialsEncrypted = MessageAction; -messageActionSecureValuesSent#d95c6154 types:Vector = MessageAction; -messageActionContactSignUp#f3f25f76 = MessageAction; -messageActionGeoProximityReached#98e0d697 from_id:Peer to_id:Peer distance:int = MessageAction; -messageActionGroupCall#7a0d7f42 flags:# call:InputGroupCall duration:flags.0?int = MessageAction; -messageActionInviteToGroupCall#502f92f7 call:InputGroupCall users:Vector = MessageAction; -messageActionSetMessagesTTL#aa1afbfd period:int = MessageAction; -messageActionGroupCallScheduled#b3a07661 call:InputGroupCall schedule_date:int = MessageAction; -messageActionSetChatTheme#aa786345 emoticon:string = MessageAction; -messageActionChatJoinedByRequest#ebbca3cb = MessageAction; - -dialog#a8edd0f5 flags:# pinned:flags.2?true unread_mark:flags.3?true peer:Peer top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int unread_mentions_count:int unread_reactions_count:int notify_settings:PeerNotifySettings pts:flags.0?int draft:flags.1?DraftMessage folder_id:flags.4?int = Dialog; -dialogFolder#71bd134c flags:# pinned:flags.2?true folder:Folder peer:Peer top_message:int unread_muted_peers_count:int unread_unmuted_peers_count:int unread_muted_messages_count:int unread_unmuted_messages_count:int = Dialog; - -photoEmpty#2331b22d id:long = Photo; -photo#fb197a65 flags:# has_stickers:flags.0?true id:long access_hash:long file_reference:bytes date:int sizes:Vector video_sizes:flags.1?Vector dc_id:int = Photo; - -photoSizeEmpty#e17e23c type:string = PhotoSize; -photoSize#75c78e60 type:string w:int h:int size:int = PhotoSize; -photoCachedSize#21e1ad6 type:string w:int h:int bytes:bytes = PhotoSize; -photoStrippedSize#e0b0bc2e type:string bytes:bytes = PhotoSize; -photoSizeProgressive#fa3efb95 type:string w:int h:int sizes:Vector = PhotoSize; -photoPathSize#d8214d41 type:string bytes:bytes = PhotoSize; - -geoPointEmpty#1117dd5f = GeoPoint; -geoPoint#b2a2f663 flags:# long:double lat:double access_hash:long accuracy_radius:flags.0?int = GeoPoint; - -auth.sentCode#5e002502 flags:# type:auth.SentCodeType phone_code_hash:string next_type:flags.1?auth.CodeType timeout:flags.2?int = auth.SentCode; - -auth.authorization#33fb7bb8 flags:# setup_password_required:flags.1?true otherwise_relogin_days:flags.1?int tmp_sessions:flags.0?int user:User = auth.Authorization; -auth.authorizationSignUpRequired#44747e9a flags:# terms_of_service:flags.0?help.TermsOfService = auth.Authorization; - -auth.exportedAuthorization#b434e2b8 id:long bytes:bytes = auth.ExportedAuthorization; - -inputNotifyPeer#b8bc5b0c peer:InputPeer = InputNotifyPeer; -inputNotifyUsers#193b4417 = InputNotifyPeer; -inputNotifyChats#4a95e84e = InputNotifyPeer; -inputNotifyBroadcasts#b1db7c7e = InputNotifyPeer; - -inputPeerNotifySettings#9c3d198e flags:# show_previews:flags.0?Bool silent:flags.1?Bool mute_until:flags.2?int sound:flags.3?string = InputPeerNotifySettings; - -peerNotifySettings#af509d20 flags:# show_previews:flags.0?Bool silent:flags.1?Bool mute_until:flags.2?int sound:flags.3?string = PeerNotifySettings; - -peerSettings#a518110d flags:# report_spam:flags.0?true add_contact:flags.1?true block_contact:flags.2?true share_contact:flags.3?true need_contacts_exception:flags.4?true report_geo:flags.5?true autoarchived:flags.7?true invite_members:flags.8?true request_chat_broadcast:flags.10?true geo_distance:flags.6?int request_chat_title:flags.9?string request_chat_date:flags.9?int = PeerSettings; - -wallPaper#a437c3ed id:long flags:# creator:flags.0?true default:flags.1?true pattern:flags.3?true dark:flags.4?true access_hash:long slug:string document:Document settings:flags.2?WallPaperSettings = WallPaper; -wallPaperNoFile#e0804116 id:long flags:# default:flags.1?true dark:flags.4?true settings:flags.2?WallPaperSettings = WallPaper; - -inputReportReasonSpam#58dbcab8 = ReportReason; -inputReportReasonViolence#1e22c78d = ReportReason; -inputReportReasonPornography#2e59d922 = ReportReason; -inputReportReasonChildAbuse#adf44ee3 = ReportReason; -inputReportReasonOther#c1e4a2b1 = ReportReason; -inputReportReasonCopyright#9b89f93a = ReportReason; -inputReportReasonGeoIrrelevant#dbd4feed = ReportReason; -inputReportReasonFake#f5ddd6e7 = ReportReason; - -userFull#cf366521 flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true can_pin_message:flags.7?true has_scheduled:flags.12?true video_calls_available:flags.13?true id:long about:flags.1?string settings:PeerSettings profile_photo:flags.2?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo pinned_msg_id:flags.6?int common_chats_count:int folder_id:flags.11?int ttl_period:flags.14?int theme_emoticon:flags.15?string private_forward_name:flags.16?string = UserFull; - -contact#145ade0b user_id:long mutual:Bool = Contact; - -importedContact#c13e3c50 user_id:long client_id:long = ImportedContact; - -contactStatus#16d9703b user_id:long status:UserStatus = ContactStatus; - -contacts.contactsNotModified#b74ba9d2 = contacts.Contacts; -contacts.contacts#eae87e42 contacts:Vector saved_count:int users:Vector = contacts.Contacts; - -contacts.importedContacts#77d01c3b imported:Vector popular_invites:Vector retry_contacts:Vector users:Vector = contacts.ImportedContacts; - -contacts.blocked#ade1591 blocked:Vector chats:Vector users:Vector = contacts.Blocked; -contacts.blockedSlice#e1664194 count:int blocked:Vector chats:Vector users:Vector = contacts.Blocked; - -messages.dialogs#15ba6c40 dialogs:Vector messages:Vector chats:Vector users:Vector = messages.Dialogs; -messages.dialogsSlice#71e094f3 count:int dialogs:Vector messages:Vector chats:Vector users:Vector = messages.Dialogs; -messages.dialogsNotModified#f0e3e596 count:int = messages.Dialogs; - -messages.messages#8c718e87 messages:Vector chats:Vector users:Vector = messages.Messages; -messages.messagesSlice#3a54685e flags:# inexact:flags.1?true count:int next_rate:flags.0?int offset_id_offset:flags.2?int messages:Vector chats:Vector users:Vector = messages.Messages; -messages.channelMessages#64479808 flags:# inexact:flags.1?true pts:int count:int offset_id_offset:flags.2?int messages:Vector chats:Vector users:Vector = messages.Messages; -messages.messagesNotModified#74535f21 count:int = messages.Messages; - -messages.chats#64ff9fd5 chats:Vector = messages.Chats; -messages.chatsSlice#9cd81144 count:int chats:Vector = messages.Chats; - -messages.chatFull#e5d7d19c full_chat:ChatFull chats:Vector users:Vector = messages.ChatFull; - -messages.affectedHistory#b45c69d1 pts:int pts_count:int offset:int = messages.AffectedHistory; - -inputMessagesFilterEmpty#57e2f66c = MessagesFilter; -inputMessagesFilterPhotos#9609a51c = MessagesFilter; -inputMessagesFilterVideo#9fc00e65 = MessagesFilter; -inputMessagesFilterPhotoVideo#56e9f0e4 = MessagesFilter; -inputMessagesFilterDocument#9eddf188 = MessagesFilter; -inputMessagesFilterUrl#7ef0dd87 = MessagesFilter; -inputMessagesFilterGif#ffc86587 = MessagesFilter; -inputMessagesFilterVoice#50f5c392 = MessagesFilter; -inputMessagesFilterMusic#3751b49e = MessagesFilter; -inputMessagesFilterChatPhotos#3a20ecb8 = MessagesFilter; -inputMessagesFilterPhoneCalls#80c99768 flags:# missed:flags.0?true = MessagesFilter; -inputMessagesFilterRoundVoice#7a7c17a4 = MessagesFilter; -inputMessagesFilterRoundVideo#b549da53 = MessagesFilter; -inputMessagesFilterMyMentions#c1f8e69a = MessagesFilter; -inputMessagesFilterGeo#e7026d0d = MessagesFilter; -inputMessagesFilterContacts#e062db83 = MessagesFilter; -inputMessagesFilterPinned#1bb00451 = MessagesFilter; - -updateNewMessage#1f2b0afd message:Message pts:int pts_count:int = Update; -updateMessageID#4e90bfd6 id:int random_id:long = Update; -updateDeleteMessages#a20db0e5 messages:Vector pts:int pts_count:int = Update; -updateUserTyping#c01e857f user_id:long action:SendMessageAction = Update; -updateChatUserTyping#83487af0 chat_id:long from_id:Peer action:SendMessageAction = Update; -updateChatParticipants#7761198 participants:ChatParticipants = Update; -updateUserStatus#e5bdf8de user_id:long status:UserStatus = Update; -updateUserName#c3f202e0 user_id:long first_name:string last_name:string username:string = Update; -updateUserPhoto#f227868c user_id:long date:int photo:UserProfilePhoto previous:Bool = Update; -updateNewEncryptedMessage#12bcbd9a message:EncryptedMessage qts:int = Update; -updateEncryptedChatTyping#1710f156 chat_id:int = Update; -updateEncryption#b4a2e88d chat:EncryptedChat date:int = Update; -updateEncryptedMessagesRead#38fe25b7 chat_id:int max_date:int date:int = Update; -updateChatParticipantAdd#3dda5451 chat_id:long user_id:long inviter_id:long date:int version:int = Update; -updateChatParticipantDelete#e32f3d77 chat_id:long user_id:long version:int = Update; -updateDcOptions#8e5e9873 dc_options:Vector = Update; -updateNotifySettings#bec268ef peer:NotifyPeer notify_settings:PeerNotifySettings = Update; -updateServiceNotification#ebe46819 flags:# popup:flags.0?true inbox_date:flags.1?int type:string message:string media:MessageMedia entities:Vector = Update; -updatePrivacy#ee3b272a key:PrivacyKey rules:Vector = Update; -updateUserPhone#5492a13 user_id:long phone:string = Update; -updateReadHistoryInbox#9c974fdf flags:# folder_id:flags.0?int peer:Peer max_id:int still_unread_count:int pts:int pts_count:int = Update; -updateReadHistoryOutbox#2f2f21bf peer:Peer max_id:int pts:int pts_count:int = Update; -updateWebPage#7f891213 webpage:WebPage pts:int pts_count:int = Update; -updateReadMessagesContents#68c13933 messages:Vector pts:int pts_count:int = Update; -updateChannelTooLong#108d941f flags:# channel_id:long pts:flags.0?int = Update; -updateChannel#635b4c09 channel_id:long = Update; -updateNewChannelMessage#62ba04d9 message:Message pts:int pts_count:int = Update; -updateReadChannelInbox#922e6e10 flags:# folder_id:flags.0?int channel_id:long max_id:int still_unread_count:int pts:int = Update; -updateDeleteChannelMessages#c32d5b12 channel_id:long messages:Vector pts:int pts_count:int = Update; -updateChannelMessageViews#f226ac08 channel_id:long id:int views:int = Update; -updateChatParticipantAdmin#d7ca61a2 chat_id:long user_id:long is_admin:Bool version:int = Update; -updateNewStickerSet#688a30aa stickerset:messages.StickerSet = Update; -updateStickerSetsOrder#bb2d201 flags:# masks:flags.0?true order:Vector = Update; -updateStickerSets#43ae3dec = Update; -updateSavedGifs#9375341e = Update; -updateBotInlineQuery#496f379c flags:# query_id:long user_id:long query:string geo:flags.0?GeoPoint peer_type:flags.1?InlineQueryPeerType offset:string = Update; -updateBotInlineSend#12f12a07 flags:# user_id:long query:string geo:flags.0?GeoPoint id:string msg_id:flags.1?InputBotInlineMessageID = Update; -updateEditChannelMessage#1b3f4df7 message:Message pts:int pts_count:int = Update; -updateBotCallbackQuery#b9cfc48d flags:# query_id:long user_id:long peer:Peer msg_id:int chat_instance:long data:flags.0?bytes game_short_name:flags.1?string = Update; -updateEditMessage#e40370a3 message:Message pts:int pts_count:int = Update; -updateInlineBotCallbackQuery#691e9052 flags:# query_id:long user_id:long msg_id:InputBotInlineMessageID chat_instance:long data:flags.0?bytes game_short_name:flags.1?string = Update; -updateReadChannelOutbox#b75f99a9 channel_id:long max_id:int = Update; -updateDraftMessage#ee2bb969 peer:Peer draft:DraftMessage = Update; -updateReadFeaturedStickers#571d2742 = Update; -updateRecentStickers#9a422c20 = Update; -updateConfig#a229dd06 = Update; -updatePtsChanged#3354678f = Update; -updateChannelWebPage#2f2ba99f channel_id:long webpage:WebPage pts:int pts_count:int = Update; -updateDialogPinned#6e6fe51c flags:# pinned:flags.0?true folder_id:flags.1?int peer:DialogPeer = Update; -updatePinnedDialogs#fa0f3ca2 flags:# folder_id:flags.1?int order:flags.0?Vector = Update; -updateBotWebhookJSON#8317c0c3 data:DataJSON = Update; -updateBotWebhookJSONQuery#9b9240a6 query_id:long data:DataJSON timeout:int = Update; -updateBotShippingQuery#b5aefd7d query_id:long user_id:long payload:bytes shipping_address:PostAddress = Update; -updateBotPrecheckoutQuery#8caa9a96 flags:# query_id:long user_id:long payload:bytes info:flags.0?PaymentRequestedInfo shipping_option_id:flags.1?string currency:string total_amount:long = Update; -updatePhoneCall#ab0f6b1e phone_call:PhoneCall = Update; -updateLangPackTooLong#46560264 lang_code:string = Update; -updateLangPack#56022f4d difference:LangPackDifference = Update; -updateFavedStickers#e511996d = Update; -updateChannelReadMessagesContents#44bdd535 channel_id:long messages:Vector = Update; -updateContactsReset#7084a7be = Update; -updateChannelAvailableMessages#b23fc698 channel_id:long available_min_id:int = Update; -updateDialogUnreadMark#e16459c3 flags:# unread:flags.0?true peer:DialogPeer = Update; -updateMessagePoll#aca1657b flags:# poll_id:long poll:flags.0?Poll results:PollResults = Update; -updateChatDefaultBannedRights#54c01850 peer:Peer default_banned_rights:ChatBannedRights version:int = Update; -updateFolderPeers#19360dc0 folder_peers:Vector pts:int pts_count:int = Update; -updatePeerSettings#6a7e7366 peer:Peer settings:PeerSettings = Update; -updatePeerLocated#b4afcfb0 peers:Vector = Update; -updateNewScheduledMessage#39a51dfb message:Message = Update; -updateDeleteScheduledMessages#90866cee peer:Peer messages:Vector = Update; -updateTheme#8216fba3 theme:Theme = Update; -updateGeoLiveViewed#871fb939 peer:Peer msg_id:int = Update; -updateLoginToken#564fe691 = Update; -updateMessagePollVote#106395c9 poll_id:long user_id:long options:Vector qts:int = Update; -updateDialogFilter#26ffde7d flags:# id:int filter:flags.0?DialogFilter = Update; -updateDialogFilterOrder#a5d72105 order:Vector = Update; -updateDialogFilters#3504914f = Update; -updatePhoneCallSignalingData#2661bf09 phone_call_id:long data:bytes = Update; -updateChannelMessageForwards#d29a27f4 channel_id:long id:int forwards:int = Update; -updateReadChannelDiscussionInbox#d6b19546 flags:# channel_id:long top_msg_id:int read_max_id:int broadcast_id:flags.0?long broadcast_post:flags.0?int = Update; -updateReadChannelDiscussionOutbox#695c9e7c channel_id:long top_msg_id:int read_max_id:int = Update; -updatePeerBlocked#246a4b22 peer_id:Peer blocked:Bool = Update; -updateChannelUserTyping#8c88c923 flags:# channel_id:long top_msg_id:flags.0?int from_id:Peer action:SendMessageAction = Update; -updatePinnedMessages#ed85eab5 flags:# pinned:flags.0?true peer:Peer messages:Vector pts:int pts_count:int = Update; -updatePinnedChannelMessages#5bb98608 flags:# pinned:flags.0?true channel_id:long messages:Vector pts:int pts_count:int = Update; -updateChat#f89a6a4e chat_id:long = Update; -updateGroupCallParticipants#f2ebdb4e call:InputGroupCall participants:Vector version:int = Update; -updateGroupCall#14b24500 chat_id:long call:GroupCall = Update; -updatePeerHistoryTTL#bb9bb9a5 flags:# peer:Peer ttl_period:flags.0?int = Update; -updateChatParticipant#d087663a flags:# chat_id:long date:int actor_id:long user_id:long prev_participant:flags.0?ChatParticipant new_participant:flags.1?ChatParticipant invite:flags.2?ExportedChatInvite qts:int = Update; -updateChannelParticipant#985d3abb flags:# channel_id:long date:int actor_id:long user_id:long prev_participant:flags.0?ChannelParticipant new_participant:flags.1?ChannelParticipant invite:flags.2?ExportedChatInvite qts:int = Update; -updateBotStopped#c4870a49 user_id:long date:int stopped:Bool qts:int = Update; -updateGroupCallConnection#b783982 flags:# presentation:flags.0?true params:DataJSON = Update; -updateBotCommands#4d712f2e peer:Peer bot_id:long commands:Vector = Update; -updatePendingJoinRequests#7063c3db peer:Peer requests_pending:int recent_requesters:Vector = Update; -updateBotChatInviteRequester#11dfa986 peer:Peer date:int user_id:long about:string invite:ExportedChatInvite qts:int = Update; -updateMessageReactions#154798c3 peer:Peer msg_id:int reactions:MessageReactions = Update; - -updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State; - -updates.differenceEmpty#5d75a138 date:int seq:int = updates.Difference; -updates.difference#f49ca0 new_messages:Vector new_encrypted_messages:Vector other_updates:Vector chats:Vector users:Vector state:updates.State = updates.Difference; -updates.differenceSlice#a8fb1981 new_messages:Vector new_encrypted_messages:Vector other_updates:Vector chats:Vector users:Vector intermediate_state:updates.State = updates.Difference; -updates.differenceTooLong#4afe8f6d pts:int = updates.Difference; - -updatesTooLong#e317af7e = Updates; -updateShortMessage#313bc7f8 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true id:int user_id:long message:string pts:int pts_count:int date:int fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?long reply_to:flags.3?MessageReplyHeader entities:flags.7?Vector ttl_period:flags.25?int = Updates; -updateShortChatMessage#4d6deea5 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true id:int from_id:long chat_id:long message:string pts:int pts_count:int date:int fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?long reply_to:flags.3?MessageReplyHeader entities:flags.7?Vector ttl_period:flags.25?int = Updates; -updateShort#78d4dec1 update:Update date:int = Updates; -updatesCombined#725b04c3 updates:Vector users:Vector chats:Vector date:int seq_start:int seq:int = Updates; -updates#74ae4240 updates:Vector users:Vector chats:Vector date:int seq:int = Updates; -updateShortSentMessage#9015e101 flags:# out:flags.1?true id:int pts:int pts_count:int date:int media:flags.9?MessageMedia entities:flags.7?Vector ttl_period:flags.25?int = Updates; - -photos.photos#8dca6aa5 photos:Vector users:Vector = photos.Photos; -photos.photosSlice#15051f54 count:int photos:Vector users:Vector = photos.Photos; - -photos.photo#20212ca8 photo:Photo users:Vector = photos.Photo; - -upload.file#96a18d5 type:storage.FileType mtime:int bytes:bytes = upload.File; -upload.fileCdnRedirect#f18cda44 dc_id:int file_token:bytes encryption_key:bytes encryption_iv:bytes file_hashes:Vector = upload.File; - -dcOption#18b7a10d flags:# ipv6:flags.0?true media_only:flags.1?true tcpo_only:flags.2?true cdn:flags.3?true static:flags.4?true id:int ip_address:string port:int secret:flags.10?bytes = DcOption; - -config#330b4067 flags:# phonecalls_enabled:flags.1?true default_p2p_contacts:flags.3?true preload_featured_stickers:flags.4?true ignore_phone_entities:flags.5?true revoke_pm_inbox:flags.6?true blocked_mode:flags.8?true pfs_enabled:flags.13?true date:int expires:int test_mode:Bool this_dc:int dc_options:Vector dc_txt_domain_name:string chat_size_max:int megagroup_size_max:int forwarded_count_max:int online_update_period_ms:int offline_blur_timeout_ms:int offline_idle_timeout_ms:int online_cloud_timeout_ms:int notify_cloud_delay_ms:int notify_default_delay_ms:int push_chat_period_ms:int push_chat_limit:int saved_gifs_limit:int edit_time_limit:int revoke_time_limit:int revoke_pm_time_limit:int rating_e_decay:int stickers_recent_limit:int stickers_faved_limit:int channels_read_media_period:int tmp_sessions:flags.0?int pinned_dialogs_count_max:int pinned_infolder_count_max:int call_receive_timeout_ms:int call_ring_timeout_ms:int call_connect_timeout_ms:int call_packet_timeout_ms:int me_url_prefix:string autoupdate_url_prefix:flags.7?string gif_search_username:flags.9?string venue_search_username:flags.10?string img_search_username:flags.11?string static_maps_provider:flags.12?string caption_length_max:int message_length_max:int webfile_dc_id:int suggested_lang_code:flags.2?string lang_pack_version:flags.2?int base_lang_pack_version:flags.2?int = Config; - -nearestDc#8e1a1775 country:string this_dc:int nearest_dc:int = NearestDc; - -help.appUpdate#ccbbce30 flags:# can_not_skip:flags.0?true id:int version:string text:string entities:Vector document:flags.1?Document url:flags.2?string sticker:flags.3?Document = help.AppUpdate; -help.noAppUpdate#c45a6536 = help.AppUpdate; - -help.inviteText#18cb9f78 message:string = help.InviteText; - -encryptedChatEmpty#ab7ec0a0 id:int = EncryptedChat; -encryptedChatWaiting#66b25953 id:int access_hash:long date:int admin_id:long participant_id:long = EncryptedChat; -encryptedChatRequested#48f1d94c flags:# folder_id:flags.0?int id:int access_hash:long date:int admin_id:long participant_id:long g_a:bytes = EncryptedChat; -encryptedChat#61f0d4c7 id:int access_hash:long date:int admin_id:long participant_id:long g_a_or_b:bytes key_fingerprint:long = EncryptedChat; -encryptedChatDiscarded#1e1c7c45 flags:# history_deleted:flags.0?true id:int = EncryptedChat; - -inputEncryptedChat#f141b5e1 chat_id:int access_hash:long = InputEncryptedChat; - -encryptedFileEmpty#c21f497e = EncryptedFile; -encryptedFile#4a70994c id:long access_hash:long size:int dc_id:int key_fingerprint:int = EncryptedFile; - -inputEncryptedFileEmpty#1837c364 = InputEncryptedFile; -inputEncryptedFileUploaded#64bd0306 id:long parts:int md5_checksum:string key_fingerprint:int = InputEncryptedFile; -inputEncryptedFile#5a17b5e5 id:long access_hash:long = InputEncryptedFile; -inputEncryptedFileBigUploaded#2dc173c8 id:long parts:int key_fingerprint:int = InputEncryptedFile; - -encryptedMessage#ed18c118 random_id:long chat_id:int date:int bytes:bytes file:EncryptedFile = EncryptedMessage; -encryptedMessageService#23734b06 random_id:long chat_id:int date:int bytes:bytes = EncryptedMessage; - -messages.dhConfigNotModified#c0e24635 random:bytes = messages.DhConfig; -messages.dhConfig#2c221edd g:int p:bytes version:int random:bytes = messages.DhConfig; - -messages.sentEncryptedMessage#560f8935 date:int = messages.SentEncryptedMessage; -messages.sentEncryptedFile#9493ff32 date:int file:EncryptedFile = messages.SentEncryptedMessage; - -inputDocumentEmpty#72f0eaae = InputDocument; -inputDocument#1abfb575 id:long access_hash:long file_reference:bytes = InputDocument; - -documentEmpty#36f8c871 id:long = Document; -document#1e87342b flags:# id:long access_hash:long file_reference:bytes date:int mime_type:string size:int thumbs:flags.0?Vector video_thumbs:flags.1?Vector dc_id:int attributes:Vector = Document; - -help.support#17c6b5f6 phone_number:string user:User = help.Support; - -notifyPeer#9fd40bd8 peer:Peer = NotifyPeer; -notifyUsers#b4c83b4c = NotifyPeer; -notifyChats#c007cec3 = NotifyPeer; -notifyBroadcasts#d612e8ef = NotifyPeer; - -sendMessageTypingAction#16bf744e = SendMessageAction; -sendMessageCancelAction#fd5ec8f5 = SendMessageAction; -sendMessageRecordVideoAction#a187d66f = SendMessageAction; -sendMessageUploadVideoAction#e9763aec progress:int = SendMessageAction; -sendMessageRecordAudioAction#d52f73f7 = SendMessageAction; -sendMessageUploadAudioAction#f351d7ab progress:int = SendMessageAction; -sendMessageUploadPhotoAction#d1d34a26 progress:int = SendMessageAction; -sendMessageUploadDocumentAction#aa0cd9e4 progress:int = SendMessageAction; -sendMessageGeoLocationAction#176f8ba1 = SendMessageAction; -sendMessageChooseContactAction#628cbc6f = SendMessageAction; -sendMessageGamePlayAction#dd6a8f48 = SendMessageAction; -sendMessageRecordRoundAction#88f27fbc = SendMessageAction; -sendMessageUploadRoundAction#243e1c66 progress:int = SendMessageAction; -speakingInGroupCallAction#d92c2285 = SendMessageAction; -sendMessageHistoryImportAction#dbda9246 progress:int = SendMessageAction; -sendMessageChooseStickerAction#b05ac6b1 = SendMessageAction; -sendMessageEmojiInteraction#25972bcb emoticon:string msg_id:int interaction:DataJSON = SendMessageAction; -sendMessageEmojiInteractionSeen#b665902e emoticon:string = SendMessageAction; - -contacts.found#b3134d9d my_results:Vector results:Vector chats:Vector users:Vector = contacts.Found; - -inputPrivacyKeyStatusTimestamp#4f96cb18 = InputPrivacyKey; -inputPrivacyKeyChatInvite#bdfb0426 = InputPrivacyKey; -inputPrivacyKeyPhoneCall#fabadc5f = InputPrivacyKey; -inputPrivacyKeyPhoneP2P#db9e70d2 = InputPrivacyKey; -inputPrivacyKeyForwards#a4dd4c08 = InputPrivacyKey; -inputPrivacyKeyProfilePhoto#5719bacc = InputPrivacyKey; -inputPrivacyKeyPhoneNumber#352dafa = InputPrivacyKey; -inputPrivacyKeyAddedByPhone#d1219bdd = InputPrivacyKey; - -privacyKeyStatusTimestamp#bc2eab30 = PrivacyKey; -privacyKeyChatInvite#500e6dfa = PrivacyKey; -privacyKeyPhoneCall#3d662b7b = PrivacyKey; -privacyKeyPhoneP2P#39491cc8 = PrivacyKey; -privacyKeyForwards#69ec56a3 = PrivacyKey; -privacyKeyProfilePhoto#96151fed = PrivacyKey; -privacyKeyPhoneNumber#d19ae46d = PrivacyKey; -privacyKeyAddedByPhone#42ffd42b = PrivacyKey; - -inputPrivacyValueAllowContacts#d09e07b = InputPrivacyRule; -inputPrivacyValueAllowAll#184b35ce = InputPrivacyRule; -inputPrivacyValueAllowUsers#131cc67f users:Vector = InputPrivacyRule; -inputPrivacyValueDisallowContacts#ba52007 = InputPrivacyRule; -inputPrivacyValueDisallowAll#d66b66c9 = InputPrivacyRule; -inputPrivacyValueDisallowUsers#90110467 users:Vector = InputPrivacyRule; -inputPrivacyValueAllowChatParticipants#840649cf chats:Vector = InputPrivacyRule; -inputPrivacyValueDisallowChatParticipants#e94f0f86 chats:Vector = InputPrivacyRule; - -privacyValueAllowContacts#fffe1bac = PrivacyRule; -privacyValueAllowAll#65427b82 = PrivacyRule; -privacyValueAllowUsers#b8905fb2 users:Vector = PrivacyRule; -privacyValueDisallowContacts#f888fa1a = PrivacyRule; -privacyValueDisallowAll#8b73e763 = PrivacyRule; -privacyValueDisallowUsers#e4621141 users:Vector = PrivacyRule; -privacyValueAllowChatParticipants#6b134e8e chats:Vector = PrivacyRule; -privacyValueDisallowChatParticipants#41c87565 chats:Vector = PrivacyRule; - -account.privacyRules#50a04e45 rules:Vector chats:Vector users:Vector = account.PrivacyRules; - -accountDaysTTL#b8d0afdf days:int = AccountDaysTTL; - -documentAttributeImageSize#6c37c15c w:int h:int = DocumentAttribute; -documentAttributeAnimated#11b58939 = DocumentAttribute; -documentAttributeSticker#6319d612 flags:# mask:flags.1?true alt:string stickerset:InputStickerSet mask_coords:flags.0?MaskCoords = DocumentAttribute; -documentAttributeVideo#ef02ce6 flags:# round_message:flags.0?true supports_streaming:flags.1?true duration:int w:int h:int = DocumentAttribute; -documentAttributeAudio#9852f9c6 flags:# voice:flags.10?true duration:int title:flags.0?string performer:flags.1?string waveform:flags.2?bytes = DocumentAttribute; -documentAttributeFilename#15590068 file_name:string = DocumentAttribute; -documentAttributeHasStickers#9801d2f7 = DocumentAttribute; - -messages.stickersNotModified#f1749a22 = messages.Stickers; -messages.stickers#30a6ec7e hash:long stickers:Vector = messages.Stickers; - -stickerPack#12b299d4 emoticon:string documents:Vector = StickerPack; - -messages.allStickersNotModified#e86602c3 = messages.AllStickers; -messages.allStickers#cdbbcebb hash:long sets:Vector = messages.AllStickers; - -messages.affectedMessages#84d19185 pts:int pts_count:int = messages.AffectedMessages; - -webPageEmpty#eb1477e8 id:long = WebPage; -webPagePending#c586da1c id:long date:int = WebPage; -webPage#e89c45b2 flags:# id:long url:string display_url:string hash:int type:flags.0?string site_name:flags.1?string title:flags.2?string description:flags.3?string photo:flags.4?Photo embed_url:flags.5?string embed_type:flags.5?string embed_width:flags.6?int embed_height:flags.6?int duration:flags.7?int author:flags.8?string document:flags.9?Document cached_page:flags.10?Page attributes:flags.12?Vector = WebPage; -webPageNotModified#7311ca11 flags:# cached_page_views:flags.0?int = WebPage; - -authorization#ad01d61d flags:# current:flags.0?true official_app:flags.1?true password_pending:flags.2?true encrypted_requests_disabled:flags.3?true call_requests_disabled:flags.4?true hash:long device_model:string platform:string system_version:string api_id:int app_name:string app_version:string date_created:int date_active:int ip:string country:string region:string = Authorization; - -account.authorizations#4bff8ea0 authorization_ttl_days:int authorizations:Vector = account.Authorizations; - -account.password#185b184f flags:# has_recovery:flags.0?true has_secure_values:flags.1?true has_password:flags.2?true current_algo:flags.2?PasswordKdfAlgo srp_B:flags.2?bytes srp_id:flags.2?long hint:flags.3?string email_unconfirmed_pattern:flags.4?string new_algo:PasswordKdfAlgo new_secure_algo:SecurePasswordKdfAlgo secure_random:bytes pending_reset_date:flags.5?int = account.Password; - -account.passwordSettings#9a5c33e5 flags:# email:flags.0?string secure_settings:flags.1?SecureSecretSettings = account.PasswordSettings; - -account.passwordInputSettings#c23727c9 flags:# new_algo:flags.0?PasswordKdfAlgo new_password_hash:flags.0?bytes hint:flags.0?string email:flags.1?string new_secure_settings:flags.2?SecureSecretSettings = account.PasswordInputSettings; - -auth.passwordRecovery#137948a5 email_pattern:string = auth.PasswordRecovery; - -receivedNotifyMessage#a384b779 id:int flags:int = ReceivedNotifyMessage; - -chatInviteExported#ab4a819 flags:# revoked:flags.0?true permanent:flags.5?true request_needed:flags.6?true link:string admin_id:long date:int start_date:flags.4?int expire_date:flags.1?int usage_limit:flags.2?int usage:flags.3?int requested:flags.7?int title:flags.8?string = ExportedChatInvite; - -chatInviteAlready#5a686d7c chat:Chat = ChatInvite; -chatInvite#300c44c1 flags:# channel:flags.0?true broadcast:flags.1?true public:flags.2?true megagroup:flags.3?true request_needed:flags.6?true title:string about:flags.5?string photo:Photo participants_count:int participants:flags.4?Vector = ChatInvite; -chatInvitePeek#61695cb0 chat:Chat expires:int = ChatInvite; - -inputStickerSetEmpty#ffb62b95 = InputStickerSet; -inputStickerSetID#9de7a269 id:long access_hash:long = InputStickerSet; -inputStickerSetShortName#861cc8a0 short_name:string = InputStickerSet; -inputStickerSetAnimatedEmoji#28703c8 = InputStickerSet; -inputStickerSetDice#e67f520e emoticon:string = InputStickerSet; -inputStickerSetAnimatedEmojiAnimations#cde3739 = InputStickerSet; - -stickerSet#d7df217a flags:# archived:flags.1?true official:flags.2?true masks:flags.3?true animated:flags.5?true gifs:flags.6?true installed_date:flags.0?int id:long access_hash:long title:string short_name:string thumbs:flags.4?Vector thumb_dc_id:flags.4?int thumb_version:flags.4?int count:int hash:int = StickerSet; - -messages.stickerSet#b60a24a6 set:StickerSet packs:Vector documents:Vector = messages.StickerSet; -messages.stickerSetNotModified#d3f924eb = messages.StickerSet; - -botCommand#c27ac8c7 command:string description:string = BotCommand; - -botInfo#1b74b335 user_id:long description:string commands:Vector = BotInfo; - -keyboardButton#a2fa4880 text:string = KeyboardButton; -keyboardButtonUrl#258aff05 text:string url:string = KeyboardButton; -keyboardButtonCallback#35bbdb6b flags:# requires_password:flags.0?true text:string data:bytes = KeyboardButton; -keyboardButtonRequestPhone#b16a6c29 text:string = KeyboardButton; -keyboardButtonRequestGeoLocation#fc796b3f text:string = KeyboardButton; -keyboardButtonSwitchInline#568a748 flags:# same_peer:flags.0?true text:string query:string = KeyboardButton; -keyboardButtonGame#50f41ccf text:string = KeyboardButton; -keyboardButtonBuy#afd93fbb text:string = KeyboardButton; -keyboardButtonUrlAuth#10b78d29 flags:# text:string fwd_text:flags.0?string url:string button_id:int = KeyboardButton; -inputKeyboardButtonUrlAuth#d02e7fd4 flags:# request_write_access:flags.0?true text:string fwd_text:flags.1?string url:string bot:InputUser = KeyboardButton; -keyboardButtonRequestPoll#bbc7515d flags:# quiz:flags.0?Bool text:string = KeyboardButton; -inputKeyboardButtonUserProfile#e988037b text:string user_id:InputUser = KeyboardButton; -keyboardButtonUserProfile#308660c1 text:string user_id:long = KeyboardButton; - -keyboardButtonRow#77608b83 buttons:Vector = KeyboardButtonRow; - -replyKeyboardHide#a03e5b85 flags:# selective:flags.2?true = ReplyMarkup; -replyKeyboardForceReply#86b40b08 flags:# single_use:flags.1?true selective:flags.2?true placeholder:flags.3?string = ReplyMarkup; -replyKeyboardMarkup#85dd99d1 flags:# resize:flags.0?true single_use:flags.1?true selective:flags.2?true rows:Vector placeholder:flags.3?string = ReplyMarkup; -replyInlineMarkup#48a30254 rows:Vector = ReplyMarkup; - -messageEntityUnknown#bb92ba95 offset:int length:int = MessageEntity; -messageEntityMention#fa04579d offset:int length:int = MessageEntity; -messageEntityHashtag#6f635b0d offset:int length:int = MessageEntity; -messageEntityBotCommand#6cef8ac7 offset:int length:int = MessageEntity; -messageEntityUrl#6ed02538 offset:int length:int = MessageEntity; -messageEntityEmail#64e475c2 offset:int length:int = MessageEntity; -messageEntityBold#bd610bc9 offset:int length:int = MessageEntity; -messageEntityItalic#826f8b60 offset:int length:int = MessageEntity; -messageEntityCode#28a20571 offset:int length:int = MessageEntity; -messageEntityPre#73924be0 offset:int length:int language:string = MessageEntity; -messageEntityTextUrl#76a6d327 offset:int length:int url:string = MessageEntity; -messageEntityMentionName#dc7b1140 offset:int length:int user_id:long = MessageEntity; -inputMessageEntityMentionName#208e68c9 offset:int length:int user_id:InputUser = MessageEntity; -messageEntityPhone#9b69e34b offset:int length:int = MessageEntity; -messageEntityCashtag#4c4e743f offset:int length:int = MessageEntity; -messageEntityUnderline#9c4e7e8b offset:int length:int = MessageEntity; -messageEntityStrike#bf0693d4 offset:int length:int = MessageEntity; -messageEntityBlockquote#20df5d0 offset:int length:int = MessageEntity; -messageEntityBankCard#761e6af4 offset:int length:int = MessageEntity; -messageEntitySpoiler#32ca960f offset:int length:int = MessageEntity; - -inputChannelEmpty#ee8c1e86 = InputChannel; -inputChannel#f35aec28 channel_id:long access_hash:long = InputChannel; -inputChannelFromMessage#5b934f9d peer:InputPeer msg_id:int channel_id:long = InputChannel; - -contacts.resolvedPeer#7f077ad9 peer:Peer chats:Vector users:Vector = contacts.ResolvedPeer; - -messageRange#ae30253 min_id:int max_id:int = MessageRange; - -updates.channelDifferenceEmpty#3e11affb flags:# final:flags.0?true pts:int timeout:flags.1?int = updates.ChannelDifference; -updates.channelDifferenceTooLong#a4bcc6fe flags:# final:flags.0?true timeout:flags.1?int dialog:Dialog messages:Vector chats:Vector users:Vector = updates.ChannelDifference; -updates.channelDifference#2064674e flags:# final:flags.0?true pts:int timeout:flags.1?int new_messages:Vector other_updates:Vector chats:Vector users:Vector = updates.ChannelDifference; - -channelMessagesFilterEmpty#94d42ee7 = ChannelMessagesFilter; -channelMessagesFilter#cd77d957 flags:# exclude_new_messages:flags.1?true ranges:Vector = ChannelMessagesFilter; - -channelParticipant#c00c07c0 user_id:long date:int = ChannelParticipant; -channelParticipantSelf#35a8bfa7 flags:# via_request:flags.0?true user_id:long inviter_id:long date:int = ChannelParticipant; -channelParticipantCreator#2fe601d3 flags:# user_id:long admin_rights:ChatAdminRights rank:flags.0?string = ChannelParticipant; -channelParticipantAdmin#34c3bb53 flags:# can_edit:flags.0?true self:flags.1?true user_id:long inviter_id:flags.1?long promoted_by:long date:int admin_rights:ChatAdminRights rank:flags.2?string = ChannelParticipant; -channelParticipantBanned#6df8014e flags:# left:flags.0?true peer:Peer kicked_by:long date:int banned_rights:ChatBannedRights = ChannelParticipant; -channelParticipantLeft#1b03f006 peer:Peer = ChannelParticipant; - -channelParticipantsRecent#de3f3c79 = ChannelParticipantsFilter; -channelParticipantsAdmins#b4608969 = ChannelParticipantsFilter; -channelParticipantsKicked#a3b54985 q:string = ChannelParticipantsFilter; -channelParticipantsBots#b0d1865b = ChannelParticipantsFilter; -channelParticipantsBanned#1427a5e1 q:string = ChannelParticipantsFilter; -channelParticipantsSearch#656ac4b q:string = ChannelParticipantsFilter; -channelParticipantsContacts#bb6ae88d q:string = ChannelParticipantsFilter; -channelParticipantsMentions#e04b5ceb flags:# q:flags.0?string top_msg_id:flags.1?int = ChannelParticipantsFilter; - -channels.channelParticipants#9ab0feaf count:int participants:Vector chats:Vector users:Vector = channels.ChannelParticipants; -channels.channelParticipantsNotModified#f0173fe9 = channels.ChannelParticipants; - -channels.channelParticipant#dfb80317 participant:ChannelParticipant chats:Vector users:Vector = channels.ChannelParticipant; - -help.termsOfService#780a0310 flags:# popup:flags.0?true id:DataJSON text:string entities:Vector min_age_confirm:flags.1?int = help.TermsOfService; - -messages.savedGifsNotModified#e8025ca2 = messages.SavedGifs; -messages.savedGifs#84a02a0d hash:long gifs:Vector = messages.SavedGifs; - -inputBotInlineMessageMediaAuto#3380c786 flags:# message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; -inputBotInlineMessageText#3dcd7a87 flags:# no_webpage:flags.0?true message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; -inputBotInlineMessageMediaGeo#96929a85 flags:# geo_point:InputGeoPoint heading:flags.0?int period:flags.1?int proximity_notification_radius:flags.3?int reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; -inputBotInlineMessageMediaVenue#417bbf11 flags:# geo_point:InputGeoPoint title:string address:string provider:string venue_id:string venue_type:string reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; -inputBotInlineMessageMediaContact#a6edbffd flags:# phone_number:string first_name:string last_name:string vcard:string reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; -inputBotInlineMessageGame#4b425864 flags:# reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; -inputBotInlineMessageMediaInvoice#d7e78225 flags:# title:string description:string photo:flags.0?InputWebDocument invoice:Invoice payload:bytes provider:string provider_data:DataJSON reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; - -inputBotInlineResult#88bf9319 flags:# id:string type:string title:flags.1?string description:flags.2?string url:flags.3?string thumb:flags.4?InputWebDocument content:flags.5?InputWebDocument send_message:InputBotInlineMessage = InputBotInlineResult; -inputBotInlineResultPhoto#a8d864a7 id:string type:string photo:InputPhoto send_message:InputBotInlineMessage = InputBotInlineResult; -inputBotInlineResultDocument#fff8fdc4 flags:# id:string type:string title:flags.1?string description:flags.2?string document:InputDocument send_message:InputBotInlineMessage = InputBotInlineResult; -inputBotInlineResultGame#4fa417f2 id:string short_name:string send_message:InputBotInlineMessage = InputBotInlineResult; - -botInlineMessageMediaAuto#764cf810 flags:# message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = BotInlineMessage; -botInlineMessageText#8c7f65e2 flags:# no_webpage:flags.0?true message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = BotInlineMessage; -botInlineMessageMediaGeo#51846fd flags:# geo:GeoPoint heading:flags.0?int period:flags.1?int proximity_notification_radius:flags.3?int reply_markup:flags.2?ReplyMarkup = BotInlineMessage; -botInlineMessageMediaVenue#8a86659c flags:# geo:GeoPoint title:string address:string provider:string venue_id:string venue_type:string reply_markup:flags.2?ReplyMarkup = BotInlineMessage; -botInlineMessageMediaContact#18d1cdc2 flags:# phone_number:string first_name:string last_name:string vcard:string reply_markup:flags.2?ReplyMarkup = BotInlineMessage; -botInlineMessageMediaInvoice#354a9b09 flags:# shipping_address_requested:flags.1?true test:flags.3?true title:string description:string photo:flags.0?WebDocument currency:string total_amount:long reply_markup:flags.2?ReplyMarkup = BotInlineMessage; - -botInlineResult#11965f3a flags:# id:string type:string title:flags.1?string description:flags.2?string url:flags.3?string thumb:flags.4?WebDocument content:flags.5?WebDocument send_message:BotInlineMessage = BotInlineResult; -botInlineMediaResult#17db940b flags:# id:string type:string photo:flags.0?Photo document:flags.1?Document title:flags.2?string description:flags.3?string send_message:BotInlineMessage = BotInlineResult; - -messages.botResults#947ca848 flags:# gallery:flags.0?true query_id:long next_offset:flags.1?string switch_pm:flags.2?InlineBotSwitchPM results:Vector cache_time:int users:Vector = messages.BotResults; - -exportedMessageLink#5dab1af4 link:string html:string = ExportedMessageLink; - -messageFwdHeader#5f777dce flags:# imported:flags.7?true from_id:flags.0?Peer from_name:flags.5?string date:int channel_post:flags.2?int post_author:flags.3?string saved_from_peer:flags.4?Peer saved_from_msg_id:flags.4?int psa_type:flags.6?string = MessageFwdHeader; - -auth.codeTypeSms#72a3158c = auth.CodeType; -auth.codeTypeCall#741cd3e3 = auth.CodeType; -auth.codeTypeFlashCall#226ccefb = auth.CodeType; -auth.codeTypeMissedCall#d61ad6ee = auth.CodeType; - -auth.sentCodeTypeApp#3dbb5986 length:int = auth.SentCodeType; -auth.sentCodeTypeSms#c000bba2 length:int = auth.SentCodeType; -auth.sentCodeTypeCall#5353e5a7 length:int = auth.SentCodeType; -auth.sentCodeTypeFlashCall#ab03c6d9 pattern:string = auth.SentCodeType; -auth.sentCodeTypeMissedCall#82006484 prefix:string length:int = auth.SentCodeType; - -messages.botCallbackAnswer#36585ea4 flags:# alert:flags.1?true has_url:flags.3?true native_ui:flags.4?true message:flags.0?string url:flags.2?string cache_time:int = messages.BotCallbackAnswer; - -messages.messageEditData#26b5dde6 flags:# caption:flags.0?true = messages.MessageEditData; - -inputBotInlineMessageID#890c3d89 dc_id:int id:long access_hash:long = InputBotInlineMessageID; -inputBotInlineMessageID64#b6d915d7 dc_id:int owner_id:long id:int access_hash:long = InputBotInlineMessageID; - -inlineBotSwitchPM#3c20629f text:string start_param:string = InlineBotSwitchPM; - -messages.peerDialogs#3371c354 dialogs:Vector messages:Vector chats:Vector users:Vector state:updates.State = messages.PeerDialogs; - -topPeer#edcdc05b peer:Peer rating:double = TopPeer; - -topPeerCategoryBotsPM#ab661b5b = TopPeerCategory; -topPeerCategoryBotsInline#148677e2 = TopPeerCategory; -topPeerCategoryCorrespondents#637b7ed = TopPeerCategory; -topPeerCategoryGroups#bd17a14a = TopPeerCategory; -topPeerCategoryChannels#161d9628 = TopPeerCategory; -topPeerCategoryPhoneCalls#1e76a78c = TopPeerCategory; -topPeerCategoryForwardUsers#a8406ca9 = TopPeerCategory; -topPeerCategoryForwardChats#fbeec0f0 = TopPeerCategory; - -topPeerCategoryPeers#fb834291 category:TopPeerCategory count:int peers:Vector = TopPeerCategoryPeers; - -contacts.topPeersNotModified#de266ef5 = contacts.TopPeers; -contacts.topPeers#70b772a8 categories:Vector chats:Vector users:Vector = contacts.TopPeers; -contacts.topPeersDisabled#b52c939d = contacts.TopPeers; - -draftMessageEmpty#1b0c841a flags:# date:flags.0?int = DraftMessage; -draftMessage#fd8e711f flags:# no_webpage:flags.1?true reply_to_msg_id:flags.0?int message:string entities:flags.3?Vector date:int = DraftMessage; - -messages.featuredStickersNotModified#c6dc0c66 count:int = messages.FeaturedStickers; -messages.featuredStickers#84c02310 hash:long count:int sets:Vector unread:Vector = messages.FeaturedStickers; - -messages.recentStickersNotModified#b17f890 = messages.RecentStickers; -messages.recentStickers#88d37c56 hash:long packs:Vector stickers:Vector dates:Vector = messages.RecentStickers; - -messages.archivedStickers#4fcba9c8 count:int sets:Vector = messages.ArchivedStickers; - -messages.stickerSetInstallResultSuccess#38641628 = messages.StickerSetInstallResult; -messages.stickerSetInstallResultArchive#35e410a8 sets:Vector = messages.StickerSetInstallResult; - -stickerSetCovered#6410a5d2 set:StickerSet cover:Document = StickerSetCovered; -stickerSetMultiCovered#3407e51b set:StickerSet covers:Vector = StickerSetCovered; - -maskCoords#aed6dbb2 n:int x:double y:double zoom:double = MaskCoords; - -inputStickeredMediaPhoto#4a992157 id:InputPhoto = InputStickeredMedia; -inputStickeredMediaDocument#438865b id:InputDocument = InputStickeredMedia; - -game#bdf9653b flags:# id:long access_hash:long short_name:string title:string description:string photo:Photo document:flags.0?Document = Game; - -inputGameID#32c3e77 id:long access_hash:long = InputGame; -inputGameShortName#c331e80a bot_id:InputUser short_name:string = InputGame; - -highScore#73a379eb pos:int user_id:long score:int = HighScore; - -messages.highScores#9a3bfd99 scores:Vector users:Vector = messages.HighScores; - -textEmpty#dc3d824f = RichText; -textPlain#744694e0 text:string = RichText; -textBold#6724abc4 text:RichText = RichText; -textItalic#d912a59c text:RichText = RichText; -textUnderline#c12622c4 text:RichText = RichText; -textStrike#9bf8bb95 text:RichText = RichText; -textFixed#6c3f19b9 text:RichText = RichText; -textUrl#3c2884c1 text:RichText url:string webpage_id:long = RichText; -textEmail#de5a0dd6 text:RichText email:string = RichText; -textConcat#7e6260d7 texts:Vector = RichText; -textSubscript#ed6a8504 text:RichText = RichText; -textSuperscript#c7fb5e01 text:RichText = RichText; -textMarked#34b8621 text:RichText = RichText; -textPhone#1ccb966a text:RichText phone:string = RichText; -textImage#81ccf4f document_id:long w:int h:int = RichText; -textAnchor#35553762 text:RichText name:string = RichText; - -pageBlockUnsupported#13567e8a = PageBlock; -pageBlockTitle#70abc3fd text:RichText = PageBlock; -pageBlockSubtitle#8ffa9a1f text:RichText = PageBlock; -pageBlockAuthorDate#baafe5e0 author:RichText published_date:int = PageBlock; -pageBlockHeader#bfd064ec text:RichText = PageBlock; -pageBlockSubheader#f12bb6e1 text:RichText = PageBlock; -pageBlockParagraph#467a0766 text:RichText = PageBlock; -pageBlockPreformatted#c070d93e text:RichText language:string = PageBlock; -pageBlockFooter#48870999 text:RichText = PageBlock; -pageBlockDivider#db20b188 = PageBlock; -pageBlockAnchor#ce0d37b0 name:string = PageBlock; -pageBlockList#e4e88011 items:Vector = PageBlock; -pageBlockBlockquote#263d7c26 text:RichText caption:RichText = PageBlock; -pageBlockPullquote#4f4456d3 text:RichText caption:RichText = PageBlock; -pageBlockPhoto#1759c560 flags:# photo_id:long caption:PageCaption url:flags.0?string webpage_id:flags.0?long = PageBlock; -pageBlockVideo#7c8fe7b6 flags:# autoplay:flags.0?true loop:flags.1?true video_id:long caption:PageCaption = PageBlock; -pageBlockCover#39f23300 cover:PageBlock = PageBlock; -pageBlockEmbed#a8718dc5 flags:# full_width:flags.0?true allow_scrolling:flags.3?true url:flags.1?string html:flags.2?string poster_photo_id:flags.4?long w:flags.5?int h:flags.5?int caption:PageCaption = PageBlock; -pageBlockEmbedPost#f259a80b url:string webpage_id:long author_photo_id:long author:string date:int blocks:Vector caption:PageCaption = PageBlock; -pageBlockCollage#65a0fa4d items:Vector caption:PageCaption = PageBlock; -pageBlockSlideshow#31f9590 items:Vector caption:PageCaption = PageBlock; -pageBlockChannel#ef1751b5 channel:Chat = PageBlock; -pageBlockAudio#804361ea audio_id:long caption:PageCaption = PageBlock; -pageBlockKicker#1e148390 text:RichText = PageBlock; -pageBlockTable#bf4dea82 flags:# bordered:flags.0?true striped:flags.1?true title:RichText rows:Vector = PageBlock; -pageBlockOrderedList#9a8ae1e1 items:Vector = PageBlock; -pageBlockDetails#76768bed flags:# open:flags.0?true blocks:Vector title:RichText = PageBlock; -pageBlockRelatedArticles#16115a96 title:RichText articles:Vector = PageBlock; -pageBlockMap#a44f3ef6 geo:GeoPoint zoom:int w:int h:int caption:PageCaption = PageBlock; - -phoneCallDiscardReasonMissed#85e42301 = PhoneCallDiscardReason; -phoneCallDiscardReasonDisconnect#e095c1a0 = PhoneCallDiscardReason; -phoneCallDiscardReasonHangup#57adc690 = PhoneCallDiscardReason; -phoneCallDiscardReasonBusy#faf7e8c9 = PhoneCallDiscardReason; - -dataJSON#7d748d04 data:string = DataJSON; - -labeledPrice#cb296bf8 label:string amount:long = LabeledPrice; - -invoice#cd886e0 flags:# test:flags.0?true name_requested:flags.1?true phone_requested:flags.2?true email_requested:flags.3?true shipping_address_requested:flags.4?true flexible:flags.5?true phone_to_provider:flags.6?true email_to_provider:flags.7?true currency:string prices:Vector max_tip_amount:flags.8?long suggested_tip_amounts:flags.8?Vector = Invoice; - -paymentCharge#ea02c27e id:string provider_charge_id:string = PaymentCharge; - -postAddress#1e8caaeb street_line1:string street_line2:string city:string state:string country_iso2:string post_code:string = PostAddress; - -paymentRequestedInfo#909c3f94 flags:# name:flags.0?string phone:flags.1?string email:flags.2?string shipping_address:flags.3?PostAddress = PaymentRequestedInfo; - -paymentSavedCredentialsCard#cdc27a1f id:string title:string = PaymentSavedCredentials; - -webDocument#1c570ed1 url:string access_hash:long size:int mime_type:string attributes:Vector = WebDocument; -webDocumentNoProxy#f9c8bcc6 url:string size:int mime_type:string attributes:Vector = WebDocument; - -inputWebDocument#9bed434d url:string size:int mime_type:string attributes:Vector = InputWebDocument; - -inputWebFileLocation#c239d686 url:string access_hash:long = InputWebFileLocation; -inputWebFileGeoPointLocation#9f2221c9 geo_point:InputGeoPoint access_hash:long w:int h:int zoom:int scale:int = InputWebFileLocation; - -upload.webFile#21e753bc size:int mime_type:string file_type:storage.FileType mtime:int bytes:bytes = upload.WebFile; - -payments.paymentForm#1694761b flags:# can_save_credentials:flags.2?true password_missing:flags.3?true form_id:long bot_id:long invoice:Invoice provider_id:long url:string native_provider:flags.4?string native_params:flags.4?DataJSON saved_info:flags.0?PaymentRequestedInfo saved_credentials:flags.1?PaymentSavedCredentials users:Vector = payments.PaymentForm; - -payments.validatedRequestedInfo#d1451883 flags:# id:flags.0?string shipping_options:flags.1?Vector = payments.ValidatedRequestedInfo; - -payments.paymentResult#4e5f810d updates:Updates = payments.PaymentResult; -payments.paymentVerificationNeeded#d8411139 url:string = payments.PaymentResult; - -payments.paymentReceipt#70c4fe03 flags:# date:int bot_id:long provider_id:long title:string description:string photo:flags.2?WebDocument invoice:Invoice info:flags.0?PaymentRequestedInfo shipping:flags.1?ShippingOption tip_amount:flags.3?long currency:string total_amount:long credentials_title:string users:Vector = payments.PaymentReceipt; - -payments.savedInfo#fb8fe43c flags:# has_saved_credentials:flags.1?true saved_info:flags.0?PaymentRequestedInfo = payments.SavedInfo; - -inputPaymentCredentialsSaved#c10eb2cf id:string tmp_password:bytes = InputPaymentCredentials; -inputPaymentCredentials#3417d728 flags:# save:flags.0?true data:DataJSON = InputPaymentCredentials; -inputPaymentCredentialsApplePay#aa1c39f payment_data:DataJSON = InputPaymentCredentials; -inputPaymentCredentialsGooglePay#8ac32801 payment_token:DataJSON = InputPaymentCredentials; - -account.tmpPassword#db64fd34 tmp_password:bytes valid_until:int = account.TmpPassword; - -shippingOption#b6213cdf id:string title:string prices:Vector = ShippingOption; - -inputStickerSetItem#ffa0a496 flags:# document:InputDocument emoji:string mask_coords:flags.0?MaskCoords = InputStickerSetItem; - -inputPhoneCall#1e36fded id:long access_hash:long = InputPhoneCall; - -phoneCallEmpty#5366c915 id:long = PhoneCall; -phoneCallWaiting#c5226f17 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:long participant_id:long protocol:PhoneCallProtocol receive_date:flags.0?int = PhoneCall; -phoneCallRequested#14b0ed0c flags:# video:flags.6?true id:long access_hash:long date:int admin_id:long participant_id:long g_a_hash:bytes protocol:PhoneCallProtocol = PhoneCall; -phoneCallAccepted#3660c311 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:long participant_id:long g_b:bytes protocol:PhoneCallProtocol = PhoneCall; -phoneCall#967f7c67 flags:# p2p_allowed:flags.5?true video:flags.6?true id:long access_hash:long date:int admin_id:long participant_id:long g_a_or_b:bytes key_fingerprint:long protocol:PhoneCallProtocol connections:Vector start_date:int = PhoneCall; -phoneCallDiscarded#50ca4de1 flags:# need_rating:flags.2?true need_debug:flags.3?true video:flags.6?true id:long reason:flags.0?PhoneCallDiscardReason duration:flags.1?int = PhoneCall; - -phoneConnection#9d4c17c0 id:long ip:string ipv6:string port:int peer_tag:bytes = PhoneConnection; -phoneConnectionWebrtc#635fe375 flags:# turn:flags.0?true stun:flags.1?true id:long ip:string ipv6:string port:int username:string password:string = PhoneConnection; - -phoneCallProtocol#fc878fc8 flags:# udp_p2p:flags.0?true udp_reflector:flags.1?true min_layer:int max_layer:int library_versions:Vector = PhoneCallProtocol; - -phone.phoneCall#ec82e140 phone_call:PhoneCall users:Vector = phone.PhoneCall; - -upload.cdnFileReuploadNeeded#eea8e46e request_token:bytes = upload.CdnFile; -upload.cdnFile#a99fca4f bytes:bytes = upload.CdnFile; - -cdnPublicKey#c982eaba dc_id:int public_key:string = CdnPublicKey; - -cdnConfig#5725e40a public_keys:Vector = CdnConfig; - -langPackString#cad181f6 key:string value:string = LangPackString; -langPackStringPluralized#6c47ac9f flags:# key:string zero_value:flags.0?string one_value:flags.1?string two_value:flags.2?string few_value:flags.3?string many_value:flags.4?string other_value:string = LangPackString; -langPackStringDeleted#2979eeb2 key:string = LangPackString; - -langPackDifference#f385c1f6 lang_code:string from_version:int version:int strings:Vector = LangPackDifference; - -langPackLanguage#eeca5ce3 flags:# official:flags.0?true rtl:flags.2?true beta:flags.3?true name:string native_name:string lang_code:string base_lang_code:flags.1?string plural_code:string strings_count:int translated_count:int translations_url:string = LangPackLanguage; - -channelAdminLogEventActionChangeTitle#e6dfb825 prev_value:string new_value:string = ChannelAdminLogEventAction; -channelAdminLogEventActionChangeAbout#55188a2e prev_value:string new_value:string = ChannelAdminLogEventAction; -channelAdminLogEventActionChangeUsername#6a4afc38 prev_value:string new_value:string = ChannelAdminLogEventAction; -channelAdminLogEventActionChangePhoto#434bd2af prev_photo:Photo new_photo:Photo = ChannelAdminLogEventAction; -channelAdminLogEventActionToggleInvites#1b7907ae new_value:Bool = ChannelAdminLogEventAction; -channelAdminLogEventActionToggleSignatures#26ae0971 new_value:Bool = ChannelAdminLogEventAction; -channelAdminLogEventActionUpdatePinned#e9e82c18 message:Message = ChannelAdminLogEventAction; -channelAdminLogEventActionEditMessage#709b2405 prev_message:Message new_message:Message = ChannelAdminLogEventAction; -channelAdminLogEventActionDeleteMessage#42e047bb message:Message = ChannelAdminLogEventAction; -channelAdminLogEventActionParticipantJoin#183040d3 = ChannelAdminLogEventAction; -channelAdminLogEventActionParticipantLeave#f89777f2 = ChannelAdminLogEventAction; -channelAdminLogEventActionParticipantInvite#e31c34d8 participant:ChannelParticipant = ChannelAdminLogEventAction; -channelAdminLogEventActionParticipantToggleBan#e6d83d7e prev_participant:ChannelParticipant new_participant:ChannelParticipant = ChannelAdminLogEventAction; -channelAdminLogEventActionParticipantToggleAdmin#d5676710 prev_participant:ChannelParticipant new_participant:ChannelParticipant = ChannelAdminLogEventAction; -channelAdminLogEventActionChangeStickerSet#b1c3caa7 prev_stickerset:InputStickerSet new_stickerset:InputStickerSet = ChannelAdminLogEventAction; -channelAdminLogEventActionTogglePreHistoryHidden#5f5c95f1 new_value:Bool = ChannelAdminLogEventAction; -channelAdminLogEventActionDefaultBannedRights#2df5fc0a prev_banned_rights:ChatBannedRights new_banned_rights:ChatBannedRights = ChannelAdminLogEventAction; -channelAdminLogEventActionStopPoll#8f079643 message:Message = ChannelAdminLogEventAction; -channelAdminLogEventActionChangeLinkedChat#50c7ac8 prev_value:long new_value:long = ChannelAdminLogEventAction; -channelAdminLogEventActionChangeLocation#e6b76ae prev_value:ChannelLocation new_value:ChannelLocation = ChannelAdminLogEventAction; -channelAdminLogEventActionToggleSlowMode#53909779 prev_value:int new_value:int = ChannelAdminLogEventAction; -channelAdminLogEventActionStartGroupCall#23209745 call:InputGroupCall = ChannelAdminLogEventAction; -channelAdminLogEventActionDiscardGroupCall#db9f9140 call:InputGroupCall = ChannelAdminLogEventAction; -channelAdminLogEventActionParticipantMute#f92424d2 participant:GroupCallParticipant = ChannelAdminLogEventAction; -channelAdminLogEventActionParticipantUnmute#e64429c0 participant:GroupCallParticipant = ChannelAdminLogEventAction; -channelAdminLogEventActionToggleGroupCallSetting#56d6a247 join_muted:Bool = ChannelAdminLogEventAction; -channelAdminLogEventActionParticipantJoinByInvite#5cdada77 invite:ExportedChatInvite = ChannelAdminLogEventAction; -channelAdminLogEventActionExportedInviteDelete#5a50fca4 invite:ExportedChatInvite = ChannelAdminLogEventAction; -channelAdminLogEventActionExportedInviteRevoke#410a134e invite:ExportedChatInvite = ChannelAdminLogEventAction; -channelAdminLogEventActionExportedInviteEdit#e90ebb59 prev_invite:ExportedChatInvite new_invite:ExportedChatInvite = ChannelAdminLogEventAction; -channelAdminLogEventActionParticipantVolume#3e7f6847 participant:GroupCallParticipant = ChannelAdminLogEventAction; -channelAdminLogEventActionChangeHistoryTTL#6e941a38 prev_value:int new_value:int = ChannelAdminLogEventAction; -channelAdminLogEventActionParticipantJoinByRequest#afb6144a invite:ExportedChatInvite approved_by:long = ChannelAdminLogEventAction; -channelAdminLogEventActionToggleNoForwards#cb2ac766 new_value:Bool = ChannelAdminLogEventAction; -channelAdminLogEventActionSendMessage#278f2868 message:Message = ChannelAdminLogEventAction; -channelAdminLogEventActionChangeAvailableReactions#9cf7f76a prev_value:Vector new_value:Vector = ChannelAdminLogEventAction; - -channelAdminLogEvent#1fad68cd id:long date:int user_id:long action:ChannelAdminLogEventAction = ChannelAdminLogEvent; - -channels.adminLogResults#ed8af74d events:Vector chats:Vector users:Vector = channels.AdminLogResults; - -channelAdminLogEventsFilter#ea107ae4 flags:# join:flags.0?true leave:flags.1?true invite:flags.2?true ban:flags.3?true unban:flags.4?true kick:flags.5?true unkick:flags.6?true promote:flags.7?true demote:flags.8?true info:flags.9?true settings:flags.10?true pinned:flags.11?true edit:flags.12?true delete:flags.13?true group_call:flags.14?true invites:flags.15?true send:flags.16?true = ChannelAdminLogEventsFilter; - -popularContact#5ce14175 client_id:long importers:int = PopularContact; - -messages.favedStickersNotModified#9e8fa6d3 = messages.FavedStickers; -messages.favedStickers#2cb51097 hash:long packs:Vector stickers:Vector = messages.FavedStickers; - -recentMeUrlUnknown#46e1d13d url:string = RecentMeUrl; -recentMeUrlUser#b92c09e2 url:string user_id:long = RecentMeUrl; -recentMeUrlChat#b2da71d2 url:string chat_id:long = RecentMeUrl; -recentMeUrlChatInvite#eb49081d url:string chat_invite:ChatInvite = RecentMeUrl; -recentMeUrlStickerSet#bc0a57dc url:string set:StickerSetCovered = RecentMeUrl; - -help.recentMeUrls#e0310d7 urls:Vector chats:Vector users:Vector = help.RecentMeUrls; - -inputSingleMedia#1cc6e91f flags:# media:InputMedia random_id:long message:string entities:flags.0?Vector = InputSingleMedia; - -webAuthorization#a6f8f452 hash:long bot_id:long domain:string browser:string platform:string date_created:int date_active:int ip:string region:string = WebAuthorization; - -account.webAuthorizations#ed56c9fc authorizations:Vector users:Vector = account.WebAuthorizations; - -inputMessageID#a676a322 id:int = InputMessage; -inputMessageReplyTo#bad88395 id:int = InputMessage; -inputMessagePinned#86872538 = InputMessage; -inputMessageCallbackQuery#acfa1a7e id:int query_id:long = InputMessage; - -inputDialogPeer#fcaafeb7 peer:InputPeer = InputDialogPeer; -inputDialogPeerFolder#64600527 folder_id:int = InputDialogPeer; - -dialogPeer#e56dbf05 peer:Peer = DialogPeer; -dialogPeerFolder#514519e2 folder_id:int = DialogPeer; - -messages.foundStickerSetsNotModified#d54b65d = messages.FoundStickerSets; -messages.foundStickerSets#8af09dd2 hash:long sets:Vector = messages.FoundStickerSets; - -fileHash#6242c773 offset:int limit:int hash:bytes = FileHash; - -inputClientProxy#75588b3f address:string port:int = InputClientProxy; - -help.termsOfServiceUpdateEmpty#e3309f7f expires:int = help.TermsOfServiceUpdate; -help.termsOfServiceUpdate#28ecf961 expires:int terms_of_service:help.TermsOfService = help.TermsOfServiceUpdate; - -inputSecureFileUploaded#3334b0f0 id:long parts:int md5_checksum:string file_hash:bytes secret:bytes = InputSecureFile; -inputSecureFile#5367e5be id:long access_hash:long = InputSecureFile; - -secureFileEmpty#64199744 = SecureFile; -secureFile#e0277a62 id:long access_hash:long size:int dc_id:int date:int file_hash:bytes secret:bytes = SecureFile; - -secureData#8aeabec3 data:bytes data_hash:bytes secret:bytes = SecureData; - -securePlainPhone#7d6099dd phone:string = SecurePlainData; -securePlainEmail#21ec5a5f email:string = SecurePlainData; - -secureValueTypePersonalDetails#9d2a81e3 = SecureValueType; -secureValueTypePassport#3dac6a00 = SecureValueType; -secureValueTypeDriverLicense#6e425c4 = SecureValueType; -secureValueTypeIdentityCard#a0d0744b = SecureValueType; -secureValueTypeInternalPassport#99a48f23 = SecureValueType; -secureValueTypeAddress#cbe31e26 = SecureValueType; -secureValueTypeUtilityBill#fc36954e = SecureValueType; -secureValueTypeBankStatement#89137c0d = SecureValueType; -secureValueTypeRentalAgreement#8b883488 = SecureValueType; -secureValueTypePassportRegistration#99e3806a = SecureValueType; -secureValueTypeTemporaryRegistration#ea02ec33 = SecureValueType; -secureValueTypePhone#b320aadb = SecureValueType; -secureValueTypeEmail#8e3ca7ee = SecureValueType; - -secureValue#187fa0ca flags:# type:SecureValueType data:flags.0?SecureData front_side:flags.1?SecureFile reverse_side:flags.2?SecureFile selfie:flags.3?SecureFile translation:flags.6?Vector files:flags.4?Vector plain_data:flags.5?SecurePlainData hash:bytes = SecureValue; - -inputSecureValue#db21d0a7 flags:# type:SecureValueType data:flags.0?SecureData front_side:flags.1?InputSecureFile reverse_side:flags.2?InputSecureFile selfie:flags.3?InputSecureFile translation:flags.6?Vector files:flags.4?Vector plain_data:flags.5?SecurePlainData = InputSecureValue; - -secureValueHash#ed1ecdb0 type:SecureValueType hash:bytes = SecureValueHash; - -secureValueErrorData#e8a40bd9 type:SecureValueType data_hash:bytes field:string text:string = SecureValueError; -secureValueErrorFrontSide#be3dfa type:SecureValueType file_hash:bytes text:string = SecureValueError; -secureValueErrorReverseSide#868a2aa5 type:SecureValueType file_hash:bytes text:string = SecureValueError; -secureValueErrorSelfie#e537ced6 type:SecureValueType file_hash:bytes text:string = SecureValueError; -secureValueErrorFile#7a700873 type:SecureValueType file_hash:bytes text:string = SecureValueError; -secureValueErrorFiles#666220e9 type:SecureValueType file_hash:Vector text:string = SecureValueError; -secureValueError#869d758f type:SecureValueType hash:bytes text:string = SecureValueError; -secureValueErrorTranslationFile#a1144770 type:SecureValueType file_hash:bytes text:string = SecureValueError; -secureValueErrorTranslationFiles#34636dd8 type:SecureValueType file_hash:Vector text:string = SecureValueError; - -secureCredentialsEncrypted#33f0ea47 data:bytes hash:bytes secret:bytes = SecureCredentialsEncrypted; - -account.authorizationForm#ad2e1cd8 flags:# required_types:Vector values:Vector errors:Vector users:Vector privacy_policy_url:flags.0?string = account.AuthorizationForm; - -account.sentEmailCode#811f854f email_pattern:string length:int = account.SentEmailCode; - -help.deepLinkInfoEmpty#66afa166 = help.DeepLinkInfo; -help.deepLinkInfo#6a4ee832 flags:# update_app:flags.0?true message:string entities:flags.1?Vector = help.DeepLinkInfo; - -savedPhoneContact#1142bd56 phone:string first_name:string last_name:string date:int = SavedContact; - -account.takeout#4dba4501 id:long = account.Takeout; - -passwordKdfAlgoUnknown#d45ab096 = PasswordKdfAlgo; -passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow#3a912d4a salt1:bytes salt2:bytes g:int p:bytes = PasswordKdfAlgo; - -securePasswordKdfAlgoUnknown#4a8537 = SecurePasswordKdfAlgo; -securePasswordKdfAlgoPBKDF2HMACSHA512iter100000#bbf2dda0 salt:bytes = SecurePasswordKdfAlgo; -securePasswordKdfAlgoSHA512#86471d92 salt:bytes = SecurePasswordKdfAlgo; - -secureSecretSettings#1527bcac secure_algo:SecurePasswordKdfAlgo secure_secret:bytes secure_secret_id:long = SecureSecretSettings; - -inputCheckPasswordEmpty#9880f658 = InputCheckPasswordSRP; -inputCheckPasswordSRP#d27ff082 srp_id:long A:bytes M1:bytes = InputCheckPasswordSRP; - -secureRequiredType#829d99da flags:# native_names:flags.0?true selfie_required:flags.1?true translation_required:flags.2?true type:SecureValueType = SecureRequiredType; -secureRequiredTypeOneOf#27477b4 types:Vector = SecureRequiredType; - -help.passportConfigNotModified#bfb9f457 = help.PassportConfig; -help.passportConfig#a098d6af hash:int countries_langs:DataJSON = help.PassportConfig; - -inputAppEvent#1d1b1245 time:double type:string peer:long data:JSONValue = InputAppEvent; - -jsonObjectValue#c0de1bd9 key:string value:JSONValue = JSONObjectValue; - -jsonNull#3f6d7b68 = JSONValue; -jsonBool#c7345e6a value:Bool = JSONValue; -jsonNumber#2be0dfa4 value:double = JSONValue; -jsonString#b71e767a value:string = JSONValue; -jsonArray#f7444763 value:Vector = JSONValue; -jsonObject#99c1d49d value:Vector = JSONValue; - -pageTableCell#34566b6a flags:# header:flags.0?true align_center:flags.3?true align_right:flags.4?true valign_middle:flags.5?true valign_bottom:flags.6?true text:flags.7?RichText colspan:flags.1?int rowspan:flags.2?int = PageTableCell; - -pageTableRow#e0c0c5e5 cells:Vector = PageTableRow; - -pageCaption#6f747657 text:RichText credit:RichText = PageCaption; - -pageListItemText#b92fb6cd text:RichText = PageListItem; -pageListItemBlocks#25e073fc blocks:Vector = PageListItem; - -pageListOrderedItemText#5e068047 num:string text:RichText = PageListOrderedItem; -pageListOrderedItemBlocks#98dd8936 num:string blocks:Vector = PageListOrderedItem; - -pageRelatedArticle#b390dc08 flags:# url:string webpage_id:long title:flags.0?string description:flags.1?string photo_id:flags.2?long author:flags.3?string published_date:flags.4?int = PageRelatedArticle; - -page#98657f0d flags:# part:flags.0?true rtl:flags.1?true v2:flags.2?true url:string blocks:Vector photos:Vector documents:Vector views:flags.3?int = Page; - -help.supportName#8c05f1c9 name:string = help.SupportName; - -help.userInfoEmpty#f3ae2eed = help.UserInfo; -help.userInfo#1eb3758 message:string entities:Vector author:string date:int = help.UserInfo; - -pollAnswer#6ca9c2e9 text:string option:bytes = PollAnswer; - -poll#86e18161 id:long flags:# closed:flags.0?true public_voters:flags.1?true multiple_choice:flags.2?true quiz:flags.3?true question:string answers:Vector close_period:flags.4?int close_date:flags.5?int = Poll; - -pollAnswerVoters#3b6ddad2 flags:# chosen:flags.0?true correct:flags.1?true option:bytes voters:int = PollAnswerVoters; - -pollResults#dcb82ea3 flags:# min:flags.0?true results:flags.1?Vector total_voters:flags.2?int recent_voters:flags.3?Vector solution:flags.4?string solution_entities:flags.4?Vector = PollResults; - -chatOnlines#f041e250 onlines:int = ChatOnlines; - -statsURL#47a971e0 url:string = StatsURL; - -chatAdminRights#5fb224d5 flags:# change_info:flags.0?true post_messages:flags.1?true edit_messages:flags.2?true delete_messages:flags.3?true ban_users:flags.4?true invite_users:flags.5?true pin_messages:flags.7?true add_admins:flags.9?true anonymous:flags.10?true manage_call:flags.11?true other:flags.12?true = ChatAdminRights; - -chatBannedRights#9f120418 flags:# view_messages:flags.0?true send_messages:flags.1?true send_media:flags.2?true send_stickers:flags.3?true send_gifs:flags.4?true send_games:flags.5?true send_inline:flags.6?true embed_links:flags.7?true send_polls:flags.8?true change_info:flags.10?true invite_users:flags.15?true pin_messages:flags.17?true until_date:int = ChatBannedRights; - -inputWallPaper#e630b979 id:long access_hash:long = InputWallPaper; -inputWallPaperSlug#72091c80 slug:string = InputWallPaper; -inputWallPaperNoFile#967a462e id:long = InputWallPaper; - -account.wallPapersNotModified#1c199183 = account.WallPapers; -account.wallPapers#cdc3858c hash:long wallpapers:Vector = account.WallPapers; - -codeSettings#8a6469c2 flags:# allow_flashcall:flags.0?true current_number:flags.1?true allow_app_hash:flags.4?true allow_missed_call:flags.5?true logout_tokens:flags.6?Vector = CodeSettings; - -wallPaperSettings#1dc1bca4 flags:# blur:flags.1?true motion:flags.2?true background_color:flags.0?int second_background_color:flags.4?int third_background_color:flags.5?int fourth_background_color:flags.6?int intensity:flags.3?int rotation:flags.4?int = WallPaperSettings; - -autoDownloadSettings#e04232f3 flags:# disabled:flags.0?true video_preload_large:flags.1?true audio_preload_next:flags.2?true phonecalls_less_data:flags.3?true photo_size_max:int video_size_max:int file_size_max:int video_upload_maxbitrate:int = AutoDownloadSettings; - -account.autoDownloadSettings#63cacf26 low:AutoDownloadSettings medium:AutoDownloadSettings high:AutoDownloadSettings = account.AutoDownloadSettings; - -emojiKeyword#d5b3b9f9 keyword:string emoticons:Vector = EmojiKeyword; -emojiKeywordDeleted#236df622 keyword:string emoticons:Vector = EmojiKeyword; - -emojiKeywordsDifference#5cc761bd lang_code:string from_version:int version:int keywords:Vector = EmojiKeywordsDifference; - -emojiURL#a575739d url:string = EmojiURL; - -emojiLanguage#b3fb5361 lang_code:string = EmojiLanguage; - -folder#ff544e65 flags:# autofill_new_broadcasts:flags.0?true autofill_public_groups:flags.1?true autofill_new_correspondents:flags.2?true id:int title:string photo:flags.3?ChatPhoto = Folder; - -inputFolderPeer#fbd2c296 peer:InputPeer folder_id:int = InputFolderPeer; - -folderPeer#e9baa668 peer:Peer folder_id:int = FolderPeer; - -messages.searchCounter#e844ebff flags:# inexact:flags.1?true filter:MessagesFilter count:int = messages.SearchCounter; - -urlAuthResultRequest#92d33a0e flags:# request_write_access:flags.0?true bot:User domain:string = UrlAuthResult; -urlAuthResultAccepted#8f8c0e4e url:string = UrlAuthResult; -urlAuthResultDefault#a9d6db1f = UrlAuthResult; - -channelLocationEmpty#bfb5ad8b = ChannelLocation; -channelLocation#209b82db geo_point:GeoPoint address:string = ChannelLocation; - -peerLocated#ca461b5d peer:Peer expires:int distance:int = PeerLocated; -peerSelfLocated#f8ec284b expires:int = PeerLocated; - -restrictionReason#d072acb4 platform:string reason:string text:string = RestrictionReason; - -inputTheme#3c5693e9 id:long access_hash:long = InputTheme; -inputThemeSlug#f5890df1 slug:string = InputTheme; - -theme#a00e67d6 flags:# creator:flags.0?true default:flags.1?true for_chat:flags.5?true id:long access_hash:long slug:string title:string document:flags.2?Document settings:flags.3?Vector emoticon:flags.6?string installs_count:flags.4?int = Theme; - -account.themesNotModified#f41eb622 = account.Themes; -account.themes#9a3d8c6d hash:long themes:Vector = account.Themes; - -auth.loginToken#629f1980 expires:int token:bytes = auth.LoginToken; -auth.loginTokenMigrateTo#68e9916 dc_id:int token:bytes = auth.LoginToken; -auth.loginTokenSuccess#390d5c5e authorization:auth.Authorization = auth.LoginToken; - -account.contentSettings#57e28221 flags:# sensitive_enabled:flags.0?true sensitive_can_change:flags.1?true = account.ContentSettings; - -messages.inactiveChats#a927fec5 dates:Vector chats:Vector users:Vector = messages.InactiveChats; - -baseThemeClassic#c3a12462 = BaseTheme; -baseThemeDay#fbd81688 = BaseTheme; -baseThemeNight#b7b31ea8 = BaseTheme; -baseThemeTinted#6d5f77ee = BaseTheme; -baseThemeArctic#5b11125a = BaseTheme; - -inputThemeSettings#8fde504f flags:# message_colors_animated:flags.2?true base_theme:BaseTheme accent_color:int outbox_accent_color:flags.3?int message_colors:flags.0?Vector wallpaper:flags.1?InputWallPaper wallpaper_settings:flags.1?WallPaperSettings = InputThemeSettings; - -themeSettings#fa58b6d4 flags:# message_colors_animated:flags.2?true base_theme:BaseTheme accent_color:int outbox_accent_color:flags.3?int message_colors:flags.0?Vector wallpaper:flags.1?WallPaper = ThemeSettings; - -webPageAttributeTheme#54b56617 flags:# documents:flags.0?Vector settings:flags.1?ThemeSettings = WebPageAttribute; - -messageUserVote#34d247b4 user_id:long option:bytes date:int = MessageUserVote; -messageUserVoteInputOption#3ca5b0ec user_id:long date:int = MessageUserVote; -messageUserVoteMultiple#8a65e557 user_id:long options:Vector date:int = MessageUserVote; - -messages.votesList#823f649 flags:# count:int votes:Vector users:Vector next_offset:flags.0?string = messages.VotesList; - -bankCardOpenUrl#f568028a url:string name:string = BankCardOpenUrl; - -payments.bankCardData#3e24e573 title:string open_urls:Vector = payments.BankCardData; - -dialogFilter#7438f7e8 flags:# contacts:flags.0?true non_contacts:flags.1?true groups:flags.2?true broadcasts:flags.3?true bots:flags.4?true exclude_muted:flags.11?true exclude_read:flags.12?true exclude_archived:flags.13?true id:int title:string emoticon:flags.25?string pinned_peers:Vector include_peers:Vector exclude_peers:Vector = DialogFilter; - -dialogFilterSuggested#77744d4a filter:DialogFilter description:string = DialogFilterSuggested; - -statsDateRangeDays#b637edaf min_date:int max_date:int = StatsDateRangeDays; - -statsAbsValueAndPrev#cb43acde current:double previous:double = StatsAbsValueAndPrev; - -statsPercentValue#cbce2fe0 part:double total:double = StatsPercentValue; - -statsGraphAsync#4a27eb2d token:string = StatsGraph; -statsGraphError#bedc9822 error:string = StatsGraph; -statsGraph#8ea464b6 flags:# json:DataJSON zoom_token:flags.0?string = StatsGraph; - -messageInteractionCounters#ad4fc9bd msg_id:int views:int forwards:int = MessageInteractionCounters; - -stats.broadcastStats#bdf78394 period:StatsDateRangeDays followers:StatsAbsValueAndPrev views_per_post:StatsAbsValueAndPrev shares_per_post:StatsAbsValueAndPrev enabled_notifications:StatsPercentValue growth_graph:StatsGraph followers_graph:StatsGraph mute_graph:StatsGraph top_hours_graph:StatsGraph interactions_graph:StatsGraph iv_interactions_graph:StatsGraph views_by_source_graph:StatsGraph new_followers_by_source_graph:StatsGraph languages_graph:StatsGraph recent_message_interactions:Vector = stats.BroadcastStats; - -help.promoDataEmpty#98f6ac75 expires:int = help.PromoData; -help.promoData#8c39793f flags:# proxy:flags.0?true expires:int peer:Peer chats:Vector users:Vector psa_type:flags.1?string psa_message:flags.2?string = help.PromoData; - -videoSize#de33b094 flags:# type:string w:int h:int size:int video_start_ts:flags.0?double = VideoSize; - -statsGroupTopPoster#9d04af9b user_id:long messages:int avg_chars:int = StatsGroupTopPoster; - -statsGroupTopAdmin#d7584c87 user_id:long deleted:int kicked:int banned:int = StatsGroupTopAdmin; - -statsGroupTopInviter#535f779d user_id:long invitations:int = StatsGroupTopInviter; - -stats.megagroupStats#ef7ff916 period:StatsDateRangeDays members:StatsAbsValueAndPrev messages:StatsAbsValueAndPrev viewers:StatsAbsValueAndPrev posters:StatsAbsValueAndPrev growth_graph:StatsGraph members_graph:StatsGraph new_members_by_source_graph:StatsGraph languages_graph:StatsGraph messages_graph:StatsGraph actions_graph:StatsGraph top_hours_graph:StatsGraph weekdays_graph:StatsGraph top_posters:Vector top_admins:Vector top_inviters:Vector users:Vector = stats.MegagroupStats; - -globalPrivacySettings#bea2f424 flags:# archive_and_mute_new_noncontact_peers:flags.0?Bool = GlobalPrivacySettings; - -help.countryCode#4203c5ef flags:# country_code:string prefixes:flags.0?Vector patterns:flags.1?Vector = help.CountryCode; - -help.country#c3878e23 flags:# hidden:flags.0?true iso2:string default_name:string name:flags.1?string country_codes:Vector = help.Country; - -help.countriesListNotModified#93cc1f32 = help.CountriesList; -help.countriesList#87d0759e countries:Vector hash:int = help.CountriesList; - -messageViews#455b853d flags:# views:flags.0?int forwards:flags.1?int replies:flags.2?MessageReplies = MessageViews; - -messages.messageViews#b6c4f543 views:Vector chats:Vector users:Vector = messages.MessageViews; - -messages.discussionMessage#a6341782 flags:# messages:Vector max_id:flags.0?int read_inbox_max_id:flags.1?int read_outbox_max_id:flags.2?int unread_count:int chats:Vector users:Vector = messages.DiscussionMessage; - -messageReplyHeader#a6d57763 flags:# reply_to_msg_id:int reply_to_peer_id:flags.0?Peer reply_to_top_id:flags.1?int = MessageReplyHeader; - -messageReplies#83d60fc2 flags:# comments:flags.0?true replies:int replies_pts:int recent_repliers:flags.1?Vector channel_id:flags.0?long max_id:flags.2?int read_max_id:flags.3?int = MessageReplies; - -peerBlocked#e8fd8014 peer_id:Peer date:int = PeerBlocked; - -stats.messageStats#8999f295 views_graph:StatsGraph = stats.MessageStats; - -groupCallDiscarded#7780bcb4 id:long access_hash:long duration:int = GroupCall; -groupCall#d597650c flags:# join_muted:flags.1?true can_change_join_muted:flags.2?true join_date_asc:flags.6?true schedule_start_subscribed:flags.8?true can_start_video:flags.9?true record_video_active:flags.11?true id:long access_hash:long participants_count:int title:flags.3?string stream_dc_id:flags.4?int record_start_date:flags.5?int schedule_date:flags.7?int unmuted_video_count:flags.10?int unmuted_video_limit:int version:int = GroupCall; - -inputGroupCall#d8aa840f id:long access_hash:long = InputGroupCall; - -groupCallParticipant#eba636fe flags:# muted:flags.0?true left:flags.1?true can_self_unmute:flags.2?true just_joined:flags.4?true versioned:flags.5?true min:flags.8?true muted_by_you:flags.9?true volume_by_admin:flags.10?true self:flags.12?true video_joined:flags.15?true peer:Peer date:int active_date:flags.3?int source:int volume:flags.7?int about:flags.11?string raise_hand_rating:flags.13?long video:flags.6?GroupCallParticipantVideo presentation:flags.14?GroupCallParticipantVideo = GroupCallParticipant; - -phone.groupCall#9e727aad call:GroupCall participants:Vector participants_next_offset:string chats:Vector users:Vector = phone.GroupCall; - -phone.groupParticipants#f47751b6 count:int participants:Vector next_offset:string chats:Vector users:Vector version:int = phone.GroupParticipants; - -inlineQueryPeerTypeSameBotPM#3081ed9d = InlineQueryPeerType; -inlineQueryPeerTypePM#833c0fac = InlineQueryPeerType; -inlineQueryPeerTypeChat#d766c50a = InlineQueryPeerType; -inlineQueryPeerTypeMegagroup#5ec4be43 = InlineQueryPeerType; -inlineQueryPeerTypeBroadcast#6334ee9a = InlineQueryPeerType; - -messages.historyImport#1662af0b id:long = messages.HistoryImport; - -messages.historyImportParsed#5e0fb7b9 flags:# pm:flags.0?true group:flags.1?true title:flags.2?string = messages.HistoryImportParsed; - -messages.affectedFoundMessages#ef8d3e6c pts:int pts_count:int offset:int messages:Vector = messages.AffectedFoundMessages; - -chatInviteImporter#8c5adfd9 flags:# requested:flags.0?true user_id:long date:int about:flags.2?string approved_by:flags.1?long = ChatInviteImporter; - -messages.exportedChatInvites#bdc62dcc count:int invites:Vector users:Vector = messages.ExportedChatInvites; - -messages.exportedChatInvite#1871be50 invite:ExportedChatInvite users:Vector = messages.ExportedChatInvite; -messages.exportedChatInviteReplaced#222600ef invite:ExportedChatInvite new_invite:ExportedChatInvite users:Vector = messages.ExportedChatInvite; - -messages.chatInviteImporters#81b6b00a count:int importers:Vector users:Vector = messages.ChatInviteImporters; - -chatAdminWithInvites#f2ecef23 admin_id:long invites_count:int revoked_invites_count:int = ChatAdminWithInvites; - -messages.chatAdminsWithInvites#b69b72d7 admins:Vector users:Vector = messages.ChatAdminsWithInvites; - -messages.checkedHistoryImportPeer#a24de717 confirm_text:string = messages.CheckedHistoryImportPeer; - -phone.joinAsPeers#afe5623f peers:Vector chats:Vector users:Vector = phone.JoinAsPeers; - -phone.exportedGroupCallInvite#204bd158 link:string = phone.ExportedGroupCallInvite; - -groupCallParticipantVideoSourceGroup#dcb118b7 semantics:string sources:Vector = GroupCallParticipantVideoSourceGroup; - -groupCallParticipantVideo#67753ac8 flags:# paused:flags.0?true endpoint:string source_groups:Vector audio_source:flags.1?int = GroupCallParticipantVideo; - -stickers.suggestedShortName#85fea03f short_name:string = stickers.SuggestedShortName; - -botCommandScopeDefault#2f6cb2ab = BotCommandScope; -botCommandScopeUsers#3c4f04d8 = BotCommandScope; -botCommandScopeChats#6fe1a881 = BotCommandScope; -botCommandScopeChatAdmins#b9aa606a = BotCommandScope; -botCommandScopePeer#db9d897d peer:InputPeer = BotCommandScope; -botCommandScopePeerAdmins#3fd863d1 peer:InputPeer = BotCommandScope; -botCommandScopePeerUser#a1321f3 peer:InputPeer user_id:InputUser = BotCommandScope; - -account.resetPasswordFailedWait#e3779861 retry_date:int = account.ResetPasswordResult; -account.resetPasswordRequestedWait#e9effc7d until_date:int = account.ResetPasswordResult; -account.resetPasswordOk#e926d63e = account.ResetPasswordResult; - -sponsoredMessage#3a836df8 flags:# random_id:bytes from_id:flags.3?Peer chat_invite:flags.4?ChatInvite chat_invite_hash:flags.4?string channel_post:flags.2?int start_param:flags.0?string message:string entities:flags.1?Vector = SponsoredMessage; - -messages.sponsoredMessages#65a4c7d5 messages:Vector chats:Vector users:Vector = messages.SponsoredMessages; - -searchResultsCalendarPeriod#c9b0539f date:int min_msg_id:int max_msg_id:int count:int = SearchResultsCalendarPeriod; - -messages.searchResultsCalendar#147ee23c flags:# inexact:flags.0?true count:int min_date:int min_msg_id:int offset_id_offset:flags.1?int periods:Vector messages:Vector chats:Vector users:Vector = messages.SearchResultsCalendar; - -searchResultPosition#7f648b67 msg_id:int date:int offset:int = SearchResultsPosition; - -messages.searchResultsPositions#53b22baf count:int positions:Vector = messages.SearchResultsPositions; - -channels.sendAsPeers#8356cda9 peers:Vector chats:Vector users:Vector = channels.SendAsPeers; - -users.userFull#3b6d152e full_user:UserFull chats:Vector users:Vector = users.UserFull; - -messages.peerSettings#6880b94d settings:PeerSettings chats:Vector users:Vector = messages.PeerSettings; - -auth.loggedOut#c3a2835f flags:# future_auth_token:flags.0?bytes = auth.LoggedOut; - -reactionCount#6fb250d1 flags:# chosen:flags.0?true reaction:string count:int = ReactionCount; - -messageReactions#4f2b9479 flags:# min:flags.0?true can_see_list:flags.2?true results:Vector recent_reactions:flags.1?Vector = MessageReactions; - -messages.messageReactionsList#31bd492d flags:# count:int reactions:Vector chats:Vector users:Vector next_offset:flags.0?string = messages.MessageReactionsList; - -availableReaction#c077ec01 flags:# inactive:flags.0?true reaction:string title:string static_icon:Document appear_animation:Document select_animation:Document activate_animation:Document effect_animation:Document around_animation:flags.1?Document center_icon:flags.1?Document = AvailableReaction; - -messages.availableReactionsNotModified#9f071957 = messages.AvailableReactions; -messages.availableReactions#768e3aad hash:int reactions:Vector = messages.AvailableReactions; - -messages.translateNoResult#67ca4737 = messages.TranslatedText; -messages.translateResultText#a214f7d0 text:string = messages.TranslatedText; - -messagePeerReaction#51b67eff flags:# big:flags.0?true unread:flags.1?true peer_id:Peer reaction:string = MessagePeerReaction; - ----functions--- - -invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X; -invokeAfterMsgs#3dc4b4f0 {X:Type} msg_ids:Vector query:!X = X; -initConnection#c1cd5ea9 {X:Type} flags:# api_id:int device_model:string system_version:string app_version:string system_lang_code:string lang_pack:string lang_code:string proxy:flags.0?InputClientProxy params:flags.1?JSONValue query:!X = X; -invokeWithLayer#da9b0d0d {X:Type} layer:int query:!X = X; -invokeWithoutUpdates#bf9459b7 {X:Type} query:!X = X; -invokeWithMessagesRange#365275f2 {X:Type} range:MessageRange query:!X = X; -invokeWithTakeout#aca9fd2e {X:Type} takeout_id:long query:!X = X; - -auth.sendCode#a677244f phone_number:string api_id:int api_hash:string settings:CodeSettings = auth.SentCode; -auth.signUp#80eee427 phone_number:string phone_code_hash:string first_name:string last_name:string = auth.Authorization; -auth.signIn#bcd51581 phone_number:string phone_code_hash:string phone_code:string = auth.Authorization; -auth.logOut#3e72ba19 = auth.LoggedOut; -auth.resetAuthorizations#9fab0d1a = Bool; -auth.exportAuthorization#e5bfffcd dc_id:int = auth.ExportedAuthorization; -auth.importAuthorization#a57a7dad id:long bytes:bytes = auth.Authorization; -auth.bindTempAuthKey#cdd42a05 perm_auth_key_id:long nonce:long expires_at:int encrypted_message:bytes = Bool; -auth.importBotAuthorization#67a3ff2c flags:int api_id:int api_hash:string bot_auth_token:string = auth.Authorization; -auth.checkPassword#d18b4d16 password:InputCheckPasswordSRP = auth.Authorization; -auth.requestPasswordRecovery#d897bc66 = auth.PasswordRecovery; -auth.recoverPassword#37096c70 flags:# code:string new_settings:flags.0?account.PasswordInputSettings = auth.Authorization; -auth.resendCode#3ef1a9bf phone_number:string phone_code_hash:string = auth.SentCode; -auth.cancelCode#1f040578 phone_number:string phone_code_hash:string = Bool; -auth.dropTempAuthKeys#8e48a188 except_auth_keys:Vector = Bool; -auth.exportLoginToken#b7e085fe api_id:int api_hash:string except_ids:Vector = auth.LoginToken; -auth.importLoginToken#95ac5ce4 token:bytes = auth.LoginToken; -auth.acceptLoginToken#e894ad4d token:bytes = Authorization; -auth.checkRecoveryPassword#d36bf79 code:string = Bool; - -account.registerDevice#ec86017a flags:# no_muted:flags.0?true token_type:int token:string app_sandbox:Bool secret:bytes other_uids:Vector = Bool; -account.unregisterDevice#6a0d3206 token_type:int token:string other_uids:Vector = Bool; -account.updateNotifySettings#84be5b93 peer:InputNotifyPeer settings:InputPeerNotifySettings = Bool; -account.getNotifySettings#12b3ad31 peer:InputNotifyPeer = PeerNotifySettings; -account.resetNotifySettings#db7e1747 = Bool; -account.updateProfile#78515775 flags:# first_name:flags.0?string last_name:flags.1?string about:flags.2?string = User; -account.updateStatus#6628562c offline:Bool = Bool; -account.getWallPapers#7967d36 hash:long = account.WallPapers; -account.reportPeer#c5ba3d86 peer:InputPeer reason:ReportReason message:string = Bool; -account.checkUsername#2714d86c username:string = Bool; -account.updateUsername#3e0bdd7c username:string = User; -account.getPrivacy#dadbc950 key:InputPrivacyKey = account.PrivacyRules; -account.setPrivacy#c9f81ce8 key:InputPrivacyKey rules:Vector = account.PrivacyRules; -account.deleteAccount#418d4e0b reason:string = Bool; -account.getAccountTTL#8fc711d = AccountDaysTTL; -account.setAccountTTL#2442485e ttl:AccountDaysTTL = Bool; -account.sendChangePhoneCode#82574ae5 phone_number:string settings:CodeSettings = auth.SentCode; -account.changePhone#70c32edb phone_number:string phone_code_hash:string phone_code:string = User; -account.updateDeviceLocked#38df3532 period:int = Bool; -account.getAuthorizations#e320c158 = account.Authorizations; -account.resetAuthorization#df77f3bc hash:long = Bool; -account.getPassword#548a30f5 = account.Password; -account.getPasswordSettings#9cd4eaf9 password:InputCheckPasswordSRP = account.PasswordSettings; -account.updatePasswordSettings#a59b102f password:InputCheckPasswordSRP new_settings:account.PasswordInputSettings = Bool; -account.sendConfirmPhoneCode#1b3faa88 hash:string settings:CodeSettings = auth.SentCode; -account.confirmPhone#5f2178c3 phone_code_hash:string phone_code:string = Bool; -account.getTmpPassword#449e0b51 password:InputCheckPasswordSRP period:int = account.TmpPassword; -account.getWebAuthorizations#182e6d6f = account.WebAuthorizations; -account.resetWebAuthorization#2d01b9ef hash:long = Bool; -account.resetWebAuthorizations#682d2594 = Bool; -account.getAllSecureValues#b288bc7d = Vector; -account.getSecureValue#73665bc2 types:Vector = Vector; -account.saveSecureValue#899fe31d value:InputSecureValue secure_secret_id:long = SecureValue; -account.deleteSecureValue#b880bc4b types:Vector = Bool; -account.getAuthorizationForm#a929597a bot_id:long scope:string public_key:string = account.AuthorizationForm; -account.acceptAuthorization#f3ed4c73 bot_id:long scope:string public_key:string value_hashes:Vector credentials:SecureCredentialsEncrypted = Bool; -account.sendVerifyPhoneCode#a5a356f9 phone_number:string settings:CodeSettings = auth.SentCode; -account.verifyPhone#4dd3a7f6 phone_number:string phone_code_hash:string phone_code:string = Bool; -account.sendVerifyEmailCode#7011509f email:string = account.SentEmailCode; -account.verifyEmail#ecba39db email:string code:string = Bool; -account.initTakeoutSession#f05b4804 flags:# contacts:flags.0?true message_users:flags.1?true message_chats:flags.2?true message_megagroups:flags.3?true message_channels:flags.4?true files:flags.5?true file_max_size:flags.5?int = account.Takeout; -account.finishTakeoutSession#1d2652ee flags:# success:flags.0?true = Bool; -account.confirmPasswordEmail#8fdf1920 code:string = Bool; -account.resendPasswordEmail#7a7f2a15 = Bool; -account.cancelPasswordEmail#c1cbd5b6 = Bool; -account.getContactSignUpNotification#9f07c728 = Bool; -account.setContactSignUpNotification#cff43f61 silent:Bool = Bool; -account.getNotifyExceptions#53577479 flags:# compare_sound:flags.1?true peer:flags.0?InputNotifyPeer = Updates; -account.getWallPaper#fc8ddbea wallpaper:InputWallPaper = WallPaper; -account.uploadWallPaper#dd853661 file:InputFile mime_type:string settings:WallPaperSettings = WallPaper; -account.saveWallPaper#6c5a5b37 wallpaper:InputWallPaper unsave:Bool settings:WallPaperSettings = Bool; -account.installWallPaper#feed5769 wallpaper:InputWallPaper settings:WallPaperSettings = Bool; -account.resetWallPapers#bb3b9804 = Bool; -account.getAutoDownloadSettings#56da0b3f = account.AutoDownloadSettings; -account.saveAutoDownloadSettings#76f36233 flags:# low:flags.0?true high:flags.1?true settings:AutoDownloadSettings = Bool; -account.uploadTheme#1c3db333 flags:# file:InputFile thumb:flags.0?InputFile file_name:string mime_type:string = Document; -account.createTheme#652e4400 flags:# slug:string title:string document:flags.2?InputDocument settings:flags.3?Vector = Theme; -account.updateTheme#2bf40ccc flags:# format:string theme:InputTheme slug:flags.0?string title:flags.1?string document:flags.2?InputDocument settings:flags.3?Vector = Theme; -account.saveTheme#f257106c theme:InputTheme unsave:Bool = Bool; -account.installTheme#c727bb3b flags:# dark:flags.0?true theme:flags.1?InputTheme format:flags.2?string base_theme:flags.3?BaseTheme = Bool; -account.getTheme#8d9d742b format:string theme:InputTheme document_id:long = Theme; -account.getThemes#7206e458 format:string hash:long = account.Themes; -account.setContentSettings#b574b16b flags:# sensitive_enabled:flags.0?true = Bool; -account.getContentSettings#8b9b4dae = account.ContentSettings; -account.getMultiWallPapers#65ad71dc wallpapers:Vector = Vector; -account.getGlobalPrivacySettings#eb2b4cf6 = GlobalPrivacySettings; -account.setGlobalPrivacySettings#1edaaac2 settings:GlobalPrivacySettings = GlobalPrivacySettings; -account.reportProfilePhoto#fa8cc6f5 peer:InputPeer photo_id:InputPhoto reason:ReportReason message:string = Bool; -account.resetPassword#9308ce1b = account.ResetPasswordResult; -account.declinePasswordReset#4c9409f6 = Bool; -account.getChatThemes#d638de89 hash:long = account.Themes; -account.setAuthorizationTTL#bf899aa0 authorization_ttl_days:int = Bool; -account.changeAuthorizationSettings#40f48462 flags:# hash:long encrypted_requests_disabled:flags.0?Bool call_requests_disabled:flags.1?Bool = Bool; - -users.getUsers#d91a548 id:Vector = Vector; -users.getFullUser#b60f5918 id:InputUser = users.UserFull; -users.setSecureValueErrors#90c894b5 id:InputUser errors:Vector = Bool; - -contacts.getContactIDs#7adc669d hash:long = Vector; -contacts.getStatuses#c4a353ee = Vector; -contacts.getContacts#5dd69e12 hash:long = contacts.Contacts; -contacts.importContacts#2c800be5 contacts:Vector = contacts.ImportedContacts; -contacts.deleteContacts#96a0e00 id:Vector = Updates; -contacts.deleteByPhones#1013fd9e phones:Vector = Bool; -contacts.block#68cc1411 id:InputPeer = Bool; -contacts.unblock#bea65d50 id:InputPeer = Bool; -contacts.getBlocked#f57c350f offset:int limit:int = contacts.Blocked; -contacts.search#11f812d8 q:string limit:int = contacts.Found; -contacts.resolveUsername#f93ccba3 username:string = contacts.ResolvedPeer; -contacts.getTopPeers#973478b6 flags:# correspondents:flags.0?true bots_pm:flags.1?true bots_inline:flags.2?true phone_calls:flags.3?true forward_users:flags.4?true forward_chats:flags.5?true groups:flags.10?true channels:flags.15?true offset:int limit:int hash:long = contacts.TopPeers; -contacts.resetTopPeerRating#1ae373ac category:TopPeerCategory peer:InputPeer = Bool; -contacts.resetSaved#879537f1 = Bool; -contacts.getSaved#82f1e39f = Vector; -contacts.toggleTopPeers#8514bdda enabled:Bool = Bool; -contacts.addContact#e8f463d0 flags:# add_phone_privacy_exception:flags.0?true id:InputUser first_name:string last_name:string phone:string = Updates; -contacts.acceptContact#f831a20f id:InputUser = Updates; -contacts.getLocated#d348bc44 flags:# background:flags.1?true geo_point:InputGeoPoint self_expires:flags.0?int = Updates; -contacts.blockFromReplies#29a8962c flags:# delete_message:flags.0?true delete_history:flags.1?true report_spam:flags.2?true msg_id:int = Updates; - -messages.getMessages#63c66506 id:Vector = messages.Messages; -messages.getDialogs#a0f4cb4f flags:# exclude_pinned:flags.0?true folder_id:flags.1?int offset_date:int offset_id:int offset_peer:InputPeer limit:int hash:long = messages.Dialogs; -messages.getHistory#4423e6c5 peer:InputPeer offset_id:int offset_date:int add_offset:int limit:int max_id:int min_id:int hash:long = messages.Messages; -messages.search#a0fda762 flags:# peer:InputPeer q:string from_id:flags.0?InputPeer top_msg_id:flags.1?int filter:MessagesFilter min_date:int max_date:int offset_id:int add_offset:int limit:int max_id:int min_id:int hash:long = messages.Messages; -messages.readHistory#e306d3a peer:InputPeer max_id:int = messages.AffectedMessages; -messages.deleteHistory#b08f922a flags:# just_clear:flags.0?true revoke:flags.1?true peer:InputPeer max_id:int min_date:flags.2?int max_date:flags.3?int = messages.AffectedHistory; -messages.deleteMessages#e58e95d2 flags:# revoke:flags.0?true id:Vector = messages.AffectedMessages; -messages.receivedMessages#5a954c0 max_id:int = Vector; -messages.setTyping#58943ee2 flags:# peer:InputPeer top_msg_id:flags.0?int action:SendMessageAction = Bool; -messages.sendMessage#d9d75a4 flags:# no_webpage:flags.1?true silent:flags.5?true background:flags.6?true clear_draft:flags.7?true noforwards:flags.14?true peer:InputPeer reply_to_msg_id:flags.0?int message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.10?int send_as:flags.13?InputPeer = Updates; -messages.sendMedia#e25ff8e0 flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true noforwards:flags.14?true peer:InputPeer reply_to_msg_id:flags.0?int media:InputMedia message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.10?int send_as:flags.13?InputPeer = Updates; -messages.forwardMessages#cc30290b flags:# silent:flags.5?true background:flags.6?true with_my_score:flags.8?true drop_author:flags.11?true drop_media_captions:flags.12?true noforwards:flags.14?true from_peer:InputPeer id:Vector random_id:Vector to_peer:InputPeer schedule_date:flags.10?int send_as:flags.13?InputPeer = Updates; -messages.reportSpam#cf1592db peer:InputPeer = Bool; -messages.getPeerSettings#efd9a6a2 peer:InputPeer = messages.PeerSettings; -messages.report#8953ab4e peer:InputPeer id:Vector reason:ReportReason message:string = Bool; -messages.getChats#49e9528f id:Vector = messages.Chats; -messages.getFullChat#aeb00b34 chat_id:long = messages.ChatFull; -messages.editChatTitle#73783ffd chat_id:long title:string = Updates; -messages.editChatPhoto#35ddd674 chat_id:long photo:InputChatPhoto = Updates; -messages.addChatUser#f24753e3 chat_id:long user_id:InputUser fwd_limit:int = Updates; -messages.deleteChatUser#a2185cab flags:# revoke_history:flags.0?true chat_id:long user_id:InputUser = Updates; -messages.createChat#9cb126e users:Vector title:string = Updates; -messages.getDhConfig#26cf8950 version:int random_length:int = messages.DhConfig; -messages.requestEncryption#f64daf43 user_id:InputUser random_id:int g_a:bytes = EncryptedChat; -messages.acceptEncryption#3dbc0415 peer:InputEncryptedChat g_b:bytes key_fingerprint:long = EncryptedChat; -messages.discardEncryption#f393aea0 flags:# delete_history:flags.0?true chat_id:int = Bool; -messages.setEncryptedTyping#791451ed peer:InputEncryptedChat typing:Bool = Bool; -messages.readEncryptedHistory#7f4b690a peer:InputEncryptedChat max_date:int = Bool; -messages.sendEncrypted#44fa7a15 flags:# silent:flags.0?true peer:InputEncryptedChat random_id:long data:bytes = messages.SentEncryptedMessage; -messages.sendEncryptedFile#5559481d flags:# silent:flags.0?true peer:InputEncryptedChat random_id:long data:bytes file:InputEncryptedFile = messages.SentEncryptedMessage; -messages.sendEncryptedService#32d439a4 peer:InputEncryptedChat random_id:long data:bytes = messages.SentEncryptedMessage; -messages.receivedQueue#55a5bb66 max_qts:int = Vector; -messages.reportEncryptedSpam#4b0c8c0f peer:InputEncryptedChat = Bool; -messages.readMessageContents#36a73f77 id:Vector = messages.AffectedMessages; -messages.getStickers#d5a5d3a1 emoticon:string hash:long = messages.Stickers; -messages.getAllStickers#b8a0a1a8 hash:long = messages.AllStickers; -messages.getWebPagePreview#8b68b0cc flags:# message:string entities:flags.3?Vector = MessageMedia; -messages.exportChatInvite#a02ce5d5 flags:# legacy_revoke_permanent:flags.2?true request_needed:flags.3?true peer:InputPeer expire_date:flags.0?int usage_limit:flags.1?int title:flags.4?string = ExportedChatInvite; -messages.checkChatInvite#3eadb1bb hash:string = ChatInvite; -messages.importChatInvite#6c50051c hash:string = Updates; -messages.getStickerSet#c8a0ec74 stickerset:InputStickerSet hash:int = messages.StickerSet; -messages.installStickerSet#c78fe460 stickerset:InputStickerSet archived:Bool = messages.StickerSetInstallResult; -messages.uninstallStickerSet#f96e55de stickerset:InputStickerSet = Bool; -messages.startBot#e6df7378 bot:InputUser peer:InputPeer random_id:long start_param:string = Updates; -messages.getMessagesViews#5784d3e1 peer:InputPeer id:Vector increment:Bool = messages.MessageViews; -messages.editChatAdmin#a85bd1c2 chat_id:long user_id:InputUser is_admin:Bool = Bool; -messages.migrateChat#a2875319 chat_id:long = Updates; -messages.searchGlobal#4bc6589a flags:# folder_id:flags.0?int q:string filter:MessagesFilter min_date:int max_date:int offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages; -messages.reorderStickerSets#78337739 flags:# masks:flags.0?true order:Vector = Bool; -messages.getDocumentByHash#338e2464 sha256:bytes size:int mime_type:string = Document; -messages.getSavedGifs#5cf09635 hash:long = messages.SavedGifs; -messages.saveGif#327a30cb id:InputDocument unsave:Bool = Bool; -messages.getInlineBotResults#514e999d flags:# bot:InputUser peer:InputPeer geo_point:flags.0?InputGeoPoint query:string offset:string = messages.BotResults; -messages.setInlineBotResults#eb5ea206 flags:# gallery:flags.0?true private:flags.1?true query_id:long results:Vector cache_time:int next_offset:flags.2?string switch_pm:flags.3?InlineBotSwitchPM = Bool; -messages.sendInlineBotResult#7aa11297 flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true hide_via:flags.11?true peer:InputPeer reply_to_msg_id:flags.0?int random_id:long query_id:long id:string schedule_date:flags.10?int send_as:flags.13?InputPeer = Updates; -messages.getMessageEditData#fda68d36 peer:InputPeer id:int = messages.MessageEditData; -messages.editMessage#48f71778 flags:# no_webpage:flags.1?true peer:InputPeer id:int message:flags.11?string media:flags.14?InputMedia reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.15?int = Updates; -messages.editInlineBotMessage#83557dba flags:# no_webpage:flags.1?true id:InputBotInlineMessageID message:flags.11?string media:flags.14?InputMedia reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector = Bool; -messages.getBotCallbackAnswer#9342ca07 flags:# game:flags.1?true peer:InputPeer msg_id:int data:flags.0?bytes password:flags.2?InputCheckPasswordSRP = messages.BotCallbackAnswer; -messages.setBotCallbackAnswer#d58f130a flags:# alert:flags.1?true query_id:long message:flags.0?string url:flags.2?string cache_time:int = Bool; -messages.getPeerDialogs#e470bcfd peers:Vector = messages.PeerDialogs; -messages.saveDraft#bc39e14b flags:# no_webpage:flags.1?true reply_to_msg_id:flags.0?int peer:InputPeer message:string entities:flags.3?Vector = Bool; -messages.getAllDrafts#6a3f8d65 = Updates; -messages.getFeaturedStickers#64780b14 hash:long = messages.FeaturedStickers; -messages.readFeaturedStickers#5b118126 id:Vector = Bool; -messages.getRecentStickers#9da9403b flags:# attached:flags.0?true hash:long = messages.RecentStickers; -messages.saveRecentSticker#392718f8 flags:# attached:flags.0?true id:InputDocument unsave:Bool = Bool; -messages.clearRecentStickers#8999602d flags:# attached:flags.0?true = Bool; -messages.getArchivedStickers#57f17692 flags:# masks:flags.0?true offset_id:long limit:int = messages.ArchivedStickers; -messages.getMaskStickers#640f82b8 hash:long = messages.AllStickers; -messages.getAttachedStickers#cc5b67cc media:InputStickeredMedia = Vector; -messages.setGameScore#8ef8ecc0 flags:# edit_message:flags.0?true force:flags.1?true peer:InputPeer id:int user_id:InputUser score:int = Updates; -messages.setInlineGameScore#15ad9f64 flags:# edit_message:flags.0?true force:flags.1?true id:InputBotInlineMessageID user_id:InputUser score:int = Bool; -messages.getGameHighScores#e822649d peer:InputPeer id:int user_id:InputUser = messages.HighScores; -messages.getInlineGameHighScores#f635e1b id:InputBotInlineMessageID user_id:InputUser = messages.HighScores; -messages.getCommonChats#e40ca104 user_id:InputUser max_id:long limit:int = messages.Chats; -messages.getAllChats#875f74be except_ids:Vector = messages.Chats; -messages.getWebPage#32ca8f91 url:string hash:int = WebPage; -messages.toggleDialogPin#a731e257 flags:# pinned:flags.0?true peer:InputDialogPeer = Bool; -messages.reorderPinnedDialogs#3b1adf37 flags:# force:flags.0?true folder_id:int order:Vector = Bool; -messages.getPinnedDialogs#d6b94df2 folder_id:int = messages.PeerDialogs; -messages.setBotShippingResults#e5f672fa flags:# query_id:long error:flags.0?string shipping_options:flags.1?Vector = Bool; -messages.setBotPrecheckoutResults#9c2dd95 flags:# success:flags.1?true query_id:long error:flags.0?string = Bool; -messages.uploadMedia#519bc2b1 peer:InputPeer media:InputMedia = MessageMedia; -messages.sendScreenshotNotification#c97df020 peer:InputPeer reply_to_msg_id:int random_id:long = Updates; -messages.getFavedStickers#4f1aaa9 hash:long = messages.FavedStickers; -messages.faveSticker#b9ffc55b id:InputDocument unfave:Bool = Bool; -messages.getUnreadMentions#46578472 peer:InputPeer offset_id:int add_offset:int limit:int max_id:int min_id:int = messages.Messages; -messages.readMentions#f0189d3 peer:InputPeer = messages.AffectedHistory; -messages.getRecentLocations#702a40e0 peer:InputPeer limit:int hash:long = messages.Messages; -messages.sendMultiMedia#f803138f flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true noforwards:flags.14?true peer:InputPeer reply_to_msg_id:flags.0?int multi_media:Vector schedule_date:flags.10?int send_as:flags.13?InputPeer = Updates; -messages.uploadEncryptedFile#5057c497 peer:InputEncryptedChat file:InputEncryptedFile = EncryptedFile; -messages.searchStickerSets#35705b8a flags:# exclude_featured:flags.0?true q:string hash:long = messages.FoundStickerSets; -messages.getSplitRanges#1cff7e08 = Vector; -messages.markDialogUnread#c286d98f flags:# unread:flags.0?true peer:InputDialogPeer = Bool; -messages.getDialogUnreadMarks#22e24e22 = Vector; -messages.clearAllDrafts#7e58ee9c = Bool; -messages.updatePinnedMessage#d2aaf7ec flags:# silent:flags.0?true unpin:flags.1?true pm_oneside:flags.2?true peer:InputPeer id:int = Updates; -messages.sendVote#10ea6184 peer:InputPeer msg_id:int options:Vector = Updates; -messages.getPollResults#73bb643b peer:InputPeer msg_id:int = Updates; -messages.getOnlines#6e2be050 peer:InputPeer = ChatOnlines; -messages.editChatAbout#def60797 peer:InputPeer about:string = Bool; -messages.editChatDefaultBannedRights#a5866b41 peer:InputPeer banned_rights:ChatBannedRights = Updates; -messages.getEmojiKeywords#35a0e062 lang_code:string = EmojiKeywordsDifference; -messages.getEmojiKeywordsDifference#1508b6af lang_code:string from_version:int = EmojiKeywordsDifference; -messages.getEmojiKeywordsLanguages#4e9963b2 lang_codes:Vector = Vector; -messages.getEmojiURL#d5b10c26 lang_code:string = EmojiURL; -messages.getSearchCounters#732eef00 peer:InputPeer filters:Vector = Vector; -messages.requestUrlAuth#198fb446 flags:# peer:flags.1?InputPeer msg_id:flags.1?int button_id:flags.1?int url:flags.2?string = UrlAuthResult; -messages.acceptUrlAuth#b12c7125 flags:# write_allowed:flags.0?true peer:flags.1?InputPeer msg_id:flags.1?int button_id:flags.1?int url:flags.2?string = UrlAuthResult; -messages.hidePeerSettingsBar#4facb138 peer:InputPeer = Bool; -messages.getScheduledHistory#f516760b peer:InputPeer hash:long = messages.Messages; -messages.getScheduledMessages#bdbb0464 peer:InputPeer id:Vector = messages.Messages; -messages.sendScheduledMessages#bd38850a peer:InputPeer id:Vector = Updates; -messages.deleteScheduledMessages#59ae2b16 peer:InputPeer id:Vector = Updates; -messages.getPollVotes#b86e380e flags:# peer:InputPeer id:int option:flags.0?bytes offset:flags.1?string limit:int = messages.VotesList; -messages.toggleStickerSets#b5052fea flags:# uninstall:flags.0?true archive:flags.1?true unarchive:flags.2?true stickersets:Vector = Bool; -messages.getDialogFilters#f19ed96d = Vector; -messages.getSuggestedDialogFilters#a29cd42c = Vector; -messages.updateDialogFilter#1ad4a04a flags:# id:int filter:flags.0?DialogFilter = Bool; -messages.updateDialogFiltersOrder#c563c1e4 order:Vector = Bool; -messages.getOldFeaturedStickers#7ed094a1 offset:int limit:int hash:long = messages.FeaturedStickers; -messages.getReplies#22ddd30c peer:InputPeer msg_id:int offset_id:int offset_date:int add_offset:int limit:int max_id:int min_id:int hash:long = messages.Messages; -messages.getDiscussionMessage#446972fd peer:InputPeer msg_id:int = messages.DiscussionMessage; -messages.readDiscussion#f731a9f4 peer:InputPeer msg_id:int read_max_id:int = Bool; -messages.unpinAllMessages#f025bc8b peer:InputPeer = messages.AffectedHistory; -messages.deleteChat#5bd0ee50 chat_id:long = Bool; -messages.deletePhoneCallHistory#f9cbe409 flags:# revoke:flags.0?true = messages.AffectedFoundMessages; -messages.checkHistoryImport#43fe19f3 import_head:string = messages.HistoryImportParsed; -messages.initHistoryImport#34090c3b peer:InputPeer file:InputFile media_count:int = messages.HistoryImport; -messages.uploadImportedMedia#2a862092 peer:InputPeer import_id:long file_name:string media:InputMedia = MessageMedia; -messages.startHistoryImport#b43df344 peer:InputPeer import_id:long = Bool; -messages.getExportedChatInvites#a2b5a3f6 flags:# revoked:flags.3?true peer:InputPeer admin_id:InputUser offset_date:flags.2?int offset_link:flags.2?string limit:int = messages.ExportedChatInvites; -messages.getExportedChatInvite#73746f5c peer:InputPeer link:string = messages.ExportedChatInvite; -messages.editExportedChatInvite#bdca2f75 flags:# revoked:flags.2?true peer:InputPeer link:string expire_date:flags.0?int usage_limit:flags.1?int request_needed:flags.3?Bool title:flags.4?string = messages.ExportedChatInvite; -messages.deleteRevokedExportedChatInvites#56987bd5 peer:InputPeer admin_id:InputUser = Bool; -messages.deleteExportedChatInvite#d464a42b peer:InputPeer link:string = Bool; -messages.getAdminsWithInvites#3920e6ef peer:InputPeer = messages.ChatAdminsWithInvites; -messages.getChatInviteImporters#df04dd4e flags:# requested:flags.0?true peer:InputPeer link:flags.1?string q:flags.2?string offset_date:int offset_user:InputUser limit:int = messages.ChatInviteImporters; -messages.setHistoryTTL#b80e5fe4 peer:InputPeer period:int = Updates; -messages.checkHistoryImportPeer#5dc60f03 peer:InputPeer = messages.CheckedHistoryImportPeer; -messages.setChatTheme#e63be13f peer:InputPeer emoticon:string = Updates; -messages.getMessageReadParticipants#2c6f97b7 peer:InputPeer msg_id:int = Vector; -messages.getSearchResultsCalendar#49f0bde9 peer:InputPeer filter:MessagesFilter offset_id:int offset_date:int = messages.SearchResultsCalendar; -messages.getSearchResultsPositions#6e9583a3 peer:InputPeer filter:MessagesFilter offset_id:int limit:int = messages.SearchResultsPositions; -messages.hideChatJoinRequest#7fe7e815 flags:# approved:flags.0?true peer:InputPeer user_id:InputUser = Updates; -messages.hideAllChatJoinRequests#e085f4ea flags:# approved:flags.0?true peer:InputPeer link:flags.1?string = Updates; -messages.toggleNoForwards#b11eafa2 peer:InputPeer enabled:Bool = Updates; -messages.saveDefaultSendAs#ccfddf96 peer:InputPeer send_as:InputPeer = Bool; -messages.sendReaction#25690ce4 flags:# big:flags.1?true peer:InputPeer msg_id:int reaction:flags.0?string = Updates; -messages.getMessagesReactions#8bba90e6 peer:InputPeer id:Vector = Updates; -messages.getMessageReactionsList#e0ee6b77 flags:# peer:InputPeer id:int reaction:flags.0?string offset:flags.1?string limit:int = messages.MessageReactionsList; -messages.setChatAvailableReactions#14050ea6 peer:InputPeer available_reactions:Vector = Updates; -messages.getAvailableReactions#18dea0ac hash:int = messages.AvailableReactions; -messages.setDefaultReaction#d960c4d4 reaction:string = Bool; -messages.translateText#24ce6dee flags:# peer:flags.0?InputPeer msg_id:flags.0?int text:flags.1?string from_lang:flags.2?string to_lang:string = messages.TranslatedText; -messages.getUnreadReactions#e85bae1a peer:InputPeer offset_id:int add_offset:int limit:int max_id:int min_id:int = messages.Messages; -messages.readReactions#82e251d7 peer:InputPeer = messages.AffectedHistory; - -updates.getState#edd4882a = updates.State; -updates.getDifference#25939651 flags:# pts:int pts_total_limit:flags.0?int date:int qts:int = updates.Difference; -updates.getChannelDifference#3173d78 flags:# force:flags.0?true channel:InputChannel filter:ChannelMessagesFilter pts:int limit:int = updates.ChannelDifference; - -photos.updateProfilePhoto#72d4742c id:InputPhoto = photos.Photo; -photos.uploadProfilePhoto#89f30f69 flags:# file:flags.0?InputFile video:flags.1?InputFile video_start_ts:flags.2?double = photos.Photo; -photos.deletePhotos#87cf7f2f id:Vector = Vector; -photos.getUserPhotos#91cd32a8 user_id:InputUser offset:int max_id:long limit:int = photos.Photos; - -upload.saveFilePart#b304a621 file_id:long file_part:int bytes:bytes = Bool; -upload.getFile#b15a9afc flags:# precise:flags.0?true cdn_supported:flags.1?true location:InputFileLocation offset:int limit:int = upload.File; -upload.saveBigFilePart#de7b673d file_id:long file_part:int file_total_parts:int bytes:bytes = Bool; -upload.getWebFile#24e6818d location:InputWebFileLocation offset:int limit:int = upload.WebFile; -upload.getCdnFile#2000bcc3 file_token:bytes offset:int limit:int = upload.CdnFile; -upload.reuploadCdnFile#9b2754a8 file_token:bytes request_token:bytes = Vector; -upload.getCdnFileHashes#4da54231 file_token:bytes offset:int = Vector; -upload.getFileHashes#c7025931 location:InputFileLocation offset:int = Vector; - -help.getConfig#c4f9186b = Config; -help.getNearestDc#1fb33026 = NearestDc; -help.getAppUpdate#522d5a7d source:string = help.AppUpdate; -help.getInviteText#4d392343 = help.InviteText; -help.getSupport#9cdf08cd = help.Support; -help.getAppChangelog#9010ef6f prev_app_version:string = Updates; -help.setBotUpdatesStatus#ec22cfcd pending_updates_count:int message:string = Bool; -help.getCdnConfig#52029342 = CdnConfig; -help.getRecentMeUrls#3dc0f114 referer:string = help.RecentMeUrls; -help.getTermsOfServiceUpdate#2ca51fd1 = help.TermsOfServiceUpdate; -help.acceptTermsOfService#ee72f79a id:DataJSON = Bool; -help.getDeepLinkInfo#3fedc75f path:string = help.DeepLinkInfo; -help.getAppConfig#98914110 = JSONValue; -help.saveAppLog#6f02f748 events:Vector = Bool; -help.getPassportConfig#c661ad08 hash:int = help.PassportConfig; -help.getSupportName#d360e72c = help.SupportName; -help.getUserInfo#38a08d3 user_id:InputUser = help.UserInfo; -help.editUserInfo#66b91b70 user_id:InputUser message:string entities:Vector = help.UserInfo; -help.getPromoData#c0977421 = help.PromoData; -help.hidePromoData#1e251c95 peer:InputPeer = Bool; -help.dismissSuggestion#f50dbaa1 peer:InputPeer suggestion:string = Bool; -help.getCountriesList#735787a8 lang_code:string hash:int = help.CountriesList; - -channels.readHistory#cc104937 channel:InputChannel max_id:int = Bool; -channels.deleteMessages#84c1fd4e channel:InputChannel id:Vector = messages.AffectedMessages; -channels.reportSpam#f44a8315 channel:InputChannel participant:InputPeer id:Vector = Bool; -channels.getMessages#ad8c9a23 channel:InputChannel id:Vector = messages.Messages; -channels.getParticipants#77ced9d0 channel:InputChannel filter:ChannelParticipantsFilter offset:int limit:int hash:long = channels.ChannelParticipants; -channels.getParticipant#a0ab6cc6 channel:InputChannel participant:InputPeer = channels.ChannelParticipant; -channels.getChannels#a7f6bbb id:Vector = messages.Chats; -channels.getFullChannel#8736a09 channel:InputChannel = messages.ChatFull; -channels.createChannel#3d5fb10f flags:# broadcast:flags.0?true megagroup:flags.1?true for_import:flags.3?true title:string about:string geo_point:flags.2?InputGeoPoint address:flags.2?string = Updates; -channels.editAdmin#d33c8902 channel:InputChannel user_id:InputUser admin_rights:ChatAdminRights rank:string = Updates; -channels.editTitle#566decd0 channel:InputChannel title:string = Updates; -channels.editPhoto#f12e57c9 channel:InputChannel photo:InputChatPhoto = Updates; -channels.checkUsername#10e6bd2c channel:InputChannel username:string = Bool; -channels.updateUsername#3514b3de channel:InputChannel username:string = Bool; -channels.joinChannel#24b524c5 channel:InputChannel = Updates; -channels.leaveChannel#f836aa95 channel:InputChannel = Updates; -channels.inviteToChannel#199f3a6c channel:InputChannel users:Vector = Updates; -channels.deleteChannel#c0111fe3 channel:InputChannel = Updates; -channels.exportMessageLink#e63fadeb flags:# grouped:flags.0?true thread:flags.1?true channel:InputChannel id:int = ExportedMessageLink; -channels.toggleSignatures#1f69b606 channel:InputChannel enabled:Bool = Updates; -channels.getAdminedPublicChannels#f8b036af flags:# by_location:flags.0?true check_limit:flags.1?true = messages.Chats; -channels.editBanned#96e6cd81 channel:InputChannel participant:InputPeer banned_rights:ChatBannedRights = Updates; -channels.getAdminLog#33ddf480 flags:# channel:InputChannel q:string events_filter:flags.0?ChannelAdminLogEventsFilter admins:flags.1?Vector max_id:long min_id:long limit:int = channels.AdminLogResults; -channels.setStickers#ea8ca4f9 channel:InputChannel stickerset:InputStickerSet = Bool; -channels.readMessageContents#eab5dc38 channel:InputChannel id:Vector = Bool; -channels.deleteHistory#af369d42 channel:InputChannel max_id:int = Bool; -channels.togglePreHistoryHidden#eabbb94c channel:InputChannel enabled:Bool = Updates; -channels.getLeftChannels#8341ecc0 offset:int = messages.Chats; -channels.getGroupsForDiscussion#f5dad378 = messages.Chats; -channels.setDiscussionGroup#40582bb2 broadcast:InputChannel group:InputChannel = Bool; -channels.editCreator#8f38cd1f channel:InputChannel user_id:InputUser password:InputCheckPasswordSRP = Updates; -channels.editLocation#58e63f6d channel:InputChannel geo_point:InputGeoPoint address:string = Bool; -channels.toggleSlowMode#edd49ef0 channel:InputChannel seconds:int = Updates; -channels.getInactiveChannels#11e831ee = messages.InactiveChats; -channels.convertToGigagroup#b290c69 channel:InputChannel = Updates; -channels.viewSponsoredMessage#beaedb94 channel:InputChannel random_id:bytes = Bool; -channels.getSponsoredMessages#ec210fbf channel:InputChannel = messages.SponsoredMessages; -channels.getSendAs#dc770ee peer:InputPeer = channels.SendAsPeers; -channels.deleteParticipantHistory#367544db channel:InputChannel participant:InputPeer = messages.AffectedHistory; - -bots.sendCustomRequest#aa2769ed custom_method:string params:DataJSON = DataJSON; -bots.answerWebhookJSONQuery#e6213f4d query_id:long data:DataJSON = Bool; -bots.setBotCommands#517165a scope:BotCommandScope lang_code:string commands:Vector = Bool; -bots.resetBotCommands#3d8de0f9 scope:BotCommandScope lang_code:string = Bool; -bots.getBotCommands#e34c0dd6 scope:BotCommandScope lang_code:string = Vector; - -payments.getPaymentForm#8a333c8d flags:# peer:InputPeer msg_id:int theme_params:flags.0?DataJSON = payments.PaymentForm; -payments.getPaymentReceipt#2478d1cc peer:InputPeer msg_id:int = payments.PaymentReceipt; -payments.validateRequestedInfo#db103170 flags:# save:flags.0?true peer:InputPeer msg_id:int info:PaymentRequestedInfo = payments.ValidatedRequestedInfo; -payments.sendPaymentForm#30c3bc9d flags:# form_id:long peer:InputPeer msg_id:int requested_info_id:flags.0?string shipping_option_id:flags.1?string credentials:InputPaymentCredentials tip_amount:flags.2?long = payments.PaymentResult; -payments.getSavedInfo#227d824b = payments.SavedInfo; -payments.clearSavedInfo#d83d70c1 flags:# credentials:flags.0?true info:flags.1?true = Bool; -payments.getBankCardData#2e79d779 number:string = payments.BankCardData; - -stickers.createStickerSet#9021ab67 flags:# masks:flags.0?true animated:flags.1?true user_id:InputUser title:string short_name:string thumb:flags.2?InputDocument stickers:Vector software:flags.3?string = messages.StickerSet; -stickers.removeStickerFromSet#f7760f51 sticker:InputDocument = messages.StickerSet; -stickers.changeStickerPosition#ffb6d4ca sticker:InputDocument position:int = messages.StickerSet; -stickers.addStickerToSet#8653febe stickerset:InputStickerSet sticker:InputStickerSetItem = messages.StickerSet; -stickers.setStickerSetThumb#9a364e30 stickerset:InputStickerSet thumb:InputDocument = messages.StickerSet; -stickers.checkShortName#284b3639 short_name:string = Bool; -stickers.suggestShortName#4dafc503 title:string = stickers.SuggestedShortName; - -phone.getCallConfig#55451fa9 = DataJSON; -phone.requestCall#42ff96ed flags:# video:flags.0?true user_id:InputUser random_id:int g_a_hash:bytes protocol:PhoneCallProtocol = phone.PhoneCall; -phone.acceptCall#3bd2b4a0 peer:InputPhoneCall g_b:bytes protocol:PhoneCallProtocol = phone.PhoneCall; -phone.confirmCall#2efe1722 peer:InputPhoneCall g_a:bytes key_fingerprint:long protocol:PhoneCallProtocol = phone.PhoneCall; -phone.receivedCall#17d54f61 peer:InputPhoneCall = Bool; -phone.discardCall#b2cbc1c0 flags:# video:flags.0?true peer:InputPhoneCall duration:int reason:PhoneCallDiscardReason connection_id:long = Updates; -phone.setCallRating#59ead627 flags:# user_initiative:flags.0?true peer:InputPhoneCall rating:int comment:string = Updates; -phone.saveCallDebug#277add7e peer:InputPhoneCall debug:DataJSON = Bool; -phone.sendSignalingData#ff7a9383 peer:InputPhoneCall data:bytes = Bool; -phone.createGroupCall#48cdc6d8 flags:# peer:InputPeer random_id:int title:flags.0?string schedule_date:flags.1?int = Updates; -phone.joinGroupCall#b132ff7b flags:# muted:flags.0?true video_stopped:flags.2?true call:InputGroupCall join_as:InputPeer invite_hash:flags.1?string params:DataJSON = Updates; -phone.leaveGroupCall#500377f9 call:InputGroupCall source:int = Updates; -phone.inviteToGroupCall#7b393160 call:InputGroupCall users:Vector = Updates; -phone.discardGroupCall#7a777135 call:InputGroupCall = Updates; -phone.toggleGroupCallSettings#74bbb43d flags:# reset_invite_hash:flags.1?true call:InputGroupCall join_muted:flags.0?Bool = Updates; -phone.getGroupCall#41845db call:InputGroupCall limit:int = phone.GroupCall; -phone.getGroupParticipants#c558d8ab call:InputGroupCall ids:Vector sources:Vector offset:string limit:int = phone.GroupParticipants; -phone.checkGroupCall#b59cf977 call:InputGroupCall sources:Vector = Vector; -phone.toggleGroupCallRecord#f128c708 flags:# start:flags.0?true video:flags.2?true call:InputGroupCall title:flags.1?string video_portrait:flags.2?Bool = Updates; -phone.editGroupCallParticipant#a5273abf flags:# call:InputGroupCall participant:InputPeer muted:flags.0?Bool volume:flags.1?int raise_hand:flags.2?Bool video_stopped:flags.3?Bool video_paused:flags.4?Bool presentation_paused:flags.5?Bool = Updates; -phone.editGroupCallTitle#1ca6ac0a call:InputGroupCall title:string = Updates; -phone.getGroupCallJoinAs#ef7c213a peer:InputPeer = phone.JoinAsPeers; -phone.exportGroupCallInvite#e6aa647f flags:# can_self_unmute:flags.0?true call:InputGroupCall = phone.ExportedGroupCallInvite; -phone.toggleGroupCallStartSubscription#219c34e6 call:InputGroupCall subscribed:Bool = Updates; -phone.startScheduledGroupCall#5680e342 call:InputGroupCall = Updates; -phone.saveDefaultGroupCallJoinAs#575e1f8c peer:InputPeer join_as:InputPeer = Bool; -phone.joinGroupCallPresentation#cbea6bc4 call:InputGroupCall params:DataJSON = Updates; -phone.leaveGroupCallPresentation#1c50d144 call:InputGroupCall = Updates; - -langpack.getLangPack#f2f2330a lang_pack:string lang_code:string = LangPackDifference; -langpack.getStrings#efea3803 lang_pack:string lang_code:string keys:Vector = Vector; -langpack.getDifference#cd984aa5 lang_pack:string lang_code:string from_version:int = LangPackDifference; -langpack.getLanguages#42c6978f lang_pack:string = Vector; -langpack.getLanguage#6a596502 lang_pack:string lang_code:string = LangPackLanguage; - -folders.editPeerFolders#6847d0ab folder_peers:Vector = Updates; -folders.deleteFolder#1c295881 folder_id:int = Updates; - -stats.getBroadcastStats#ab42441a flags:# dark:flags.0?true channel:InputChannel = stats.BroadcastStats; -stats.loadAsyncGraph#621d5fa0 flags:# token:string x:flags.0?long = StatsGraph; -stats.getMegagroupStats#dcdf8607 flags:# dark:flags.0?true channel:InputChannel = stats.MegagroupStats; -stats.getMessagePublicForwards#5630281b channel:InputChannel msg_id:int offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages; -stats.getMessageStats#b6e0a3f5 flags:# dark:flags.0?true channel:InputChannel msg_id:int = stats.MessageStats; - -// LAYER 138 diff --git a/Telegram/Resources/tl/mtproto.tl b/Telegram/Resources/tl/mtproto.tl deleted file mode 100644 index 4b92c3e6e..000000000 --- a/Telegram/Resources/tl/mtproto.tl +++ /dev/null @@ -1,124 +0,0 @@ -// Core types (no need to gen) - -int ? = Int; -long ? = Long; -double ? = Double; -string ? = String; - -vector {t:Type} # [ t ] = Vector t; - -int128 4*[ int ] = Int128; -int256 8*[ int ] = Int256; - -/////////////////////////////// -/// Authorization key creation -/////////////////////////////// - -resPQ#05162463 nonce:int128 server_nonce:int128 pq:string server_public_key_fingerprints:Vector = ResPQ; - -p_q_inner_data#83c95aec pq:string p:string q:string nonce:int128 server_nonce:int128 new_nonce:int256 = P_Q_inner_data; -p_q_inner_data_dc#a9f55f95 pq:string p:string q:string nonce:int128 server_nonce:int128 new_nonce:int256 dc:int = P_Q_inner_data; -p_q_inner_data_temp#3c6a84d4 pq:string p:string q:string nonce:int128 server_nonce:int128 new_nonce:int256 expires_in:int = P_Q_inner_data; -p_q_inner_data_temp_dc#56fddf88 pq:string p:string q:string nonce:int128 server_nonce:int128 new_nonce:int256 dc:int expires_in:int = P_Q_inner_data; - -bind_auth_key_inner#75a3f765 nonce:long temp_auth_key_id:long perm_auth_key_id:long temp_session_id:long expires_at:int = BindAuthKeyInner; - -server_DH_params_fail#79cb045d nonce:int128 server_nonce:int128 new_nonce_hash:int128 = Server_DH_Params; -server_DH_params_ok#d0e8075c nonce:int128 server_nonce:int128 encrypted_answer:string = Server_DH_Params; - -server_DH_inner_data#b5890dba nonce:int128 server_nonce:int128 g:int dh_prime:string g_a:string server_time:int = Server_DH_inner_data; - -client_DH_inner_data#6643b654 nonce:int128 server_nonce:int128 retry_id:long g_b:string = Client_DH_Inner_Data; - -dh_gen_ok#3bcbf734 nonce:int128 server_nonce:int128 new_nonce_hash1:int128 = Set_client_DH_params_answer; -dh_gen_retry#46dc1fb9 nonce:int128 server_nonce:int128 new_nonce_hash2:int128 = Set_client_DH_params_answer; -dh_gen_fail#a69dae02 nonce:int128 server_nonce:int128 new_nonce_hash3:int128 = Set_client_DH_params_answer; - -destroy_auth_key_ok#f660e1d4 = DestroyAuthKeyRes; -destroy_auth_key_none#0a9f2259 = DestroyAuthKeyRes; -destroy_auth_key_fail#ea109b13 = DestroyAuthKeyRes; - ----functions--- - -req_pq#60469778 nonce:int128 = ResPQ; -req_pq_multi#be7e8ef1 nonce:int128 = ResPQ; - -req_DH_params#d712e4be nonce:int128 server_nonce:int128 p:string q:string public_key_fingerprint:long encrypted_data:string = Server_DH_Params; - -set_client_DH_params#f5045f1f nonce:int128 server_nonce:int128 encrypted_data:string = Set_client_DH_params_answer; - -destroy_auth_key#d1435160 = DestroyAuthKeyRes; - -/////////////////////////////// -////////////// System messages -/////////////////////////////// - ----types--- - -msgs_ack#62d6b459 msg_ids:Vector = MsgsAck; - -bad_msg_notification#a7eff811 bad_msg_id:long bad_msg_seqno:int error_code:int = BadMsgNotification; -bad_server_salt#edab447b bad_msg_id:long bad_msg_seqno:int error_code:int new_server_salt:long = BadMsgNotification; - -msgs_state_req#da69fb52 msg_ids:Vector = MsgsStateReq; -msgs_state_info#04deb57d req_msg_id:long info:string = MsgsStateInfo; -msgs_all_info#8cc0d131 msg_ids:Vector info:string = MsgsAllInfo; - -msg_detailed_info#276d3ec6 msg_id:long answer_msg_id:long bytes:int status:int = MsgDetailedInfo; -msg_new_detailed_info#809db6df answer_msg_id:long bytes:int status:int = MsgDetailedInfo; - -msg_resend_req#7d861a08 msg_ids:Vector = MsgResendReq; - -//rpc_result#f35c6d01 req_msg_id:long result:Object = RpcResult; // parsed manually - -rpc_error#2144ca19 error_code:int error_message:string = RpcError; - -rpc_answer_unknown#5e2ad36e = RpcDropAnswer; -rpc_answer_dropped_running#cd78e586 = RpcDropAnswer; -rpc_answer_dropped#a43ad8b7 msg_id:long seq_no:int bytes:int = RpcDropAnswer; - -future_salt#0949d9dc valid_since:int valid_until:int salt:long = FutureSalt; -future_salts#ae500895 req_msg_id:long now:int salts:vector = FutureSalts; - -pong#347773c5 msg_id:long ping_id:long = Pong; - -destroy_session_ok#e22045fc session_id:long = DestroySessionRes; -destroy_session_none#62d350c9 session_id:long = DestroySessionRes; - -new_session_created#9ec20908 first_msg_id:long unique_id:long server_salt:long = NewSession; - -//message msg_id:long seqno:int bytes:int body:Object = Message; // parsed manually -//msg_container#73f1f8dc messages:vector = MessageContainer; // parsed manually -//msg_copy#e06046b2 orig_message:Message = MessageCopy; // parsed manually, not used - use msg_container -//gzip_packed#3072cfa1 packed_data:string = Object; // parsed manually - -http_wait#9299359f max_delay:int wait_after:int max_wait:int = HttpWait; - -//ipPort ipv4:int port:int = IpPort; -//help.configSimple#d997c3c5 date:int expires:int dc_id:int ip_port_list:Vector = help.ConfigSimple; - -ipPort#d433ad73 ipv4:int port:int = IpPort; -ipPortSecret#37982646 ipv4:int port:int secret:bytes = IpPort; -accessPointRule#4679b65f phone_prefix_rules:string dc_id:int ips:vector = AccessPointRule; -help.configSimple#5a592a6c date:int expires:int rules:vector = help.ConfigSimple; - -tlsClientHello blocks:vector = TlsClientHello; - -tlsBlockString data:string = TlsBlock; -tlsBlockRandom length:int = TlsBlock; -tlsBlockZero length:int = TlsBlock; -tlsBlockDomain = TlsBlock; -tlsBlockGrease seed:int = TlsBlock; -tlsBlockPublicKey = TlsBlock; -tlsBlockScope entries:Vector = TlsBlock; - ----functions--- - -rpc_drop_answer#58e4a740 req_msg_id:long = RpcDropAnswer; - -get_future_salts#b921bd04 num:int = FutureSalts; - -ping#7abe77ec ping_id:long = Pong; -ping_delay_disconnect#f3427b8c ping_id:long disconnect_delay:int = Pong; - -destroy_session#e7512126 session_id:long = DestroySessionRes; diff --git a/Telegram/Resources/uwp/AppX/AppxManifest.xml b/Telegram/Resources/uwp/AppX/AppxManifest.xml index c165b873d..466034289 100644 --- a/Telegram/Resources/uwp/AppX/AppxManifest.xml +++ b/Telegram/Resources/uwp/AppX/AppxManifest.xml @@ -10,7 +10,7 @@ + Version="4.15.3.0" /> Telegram Desktop Telegram Messenger LLP diff --git a/Telegram/Resources/winrc/Telegram.manifest b/Telegram/Resources/winrc/Telegram.manifest index 4eba5dde5..75569a75f 100644 --- a/Telegram/Resources/winrc/Telegram.manifest +++ b/Telegram/Resources/winrc/Telegram.manifest @@ -14,4 +14,9 @@ + + + UTF-8 + + \ No newline at end of file diff --git a/Telegram/Resources/winrc/Telegram.rc b/Telegram/Resources/winrc/Telegram.rc index 7df12618c..fda1d34da 100644 --- a/Telegram/Resources/winrc/Telegram.rc +++ b/Telegram/Resources/winrc/Telegram.rc @@ -44,8 +44,8 @@ IDI_ICON1 ICON "..\\art\\icon256.ico" // VS_VERSION_INFO VERSIONINFO - FILEVERSION 3,5,2,0 - PRODUCTVERSION 3,5,2,0 + FILEVERSION 4,15,3,0 + PRODUCTVERSION 4,15,3,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -62,10 +62,10 @@ BEGIN BEGIN VALUE "CompanyName", "Telegram FZ-LLC" VALUE "FileDescription", "Telegram Desktop" - VALUE "FileVersion", "3.5.2.0" - VALUE "LegalCopyright", "Copyright (C) 2014-2022" + VALUE "FileVersion", "4.15.3.0" + VALUE "LegalCopyright", "Copyright (C) 2014-2024" VALUE "ProductName", "Telegram Desktop" - VALUE "ProductVersion", "3.5.2.0" + VALUE "ProductVersion", "4.15.3.0" END END BLOCK "VarFileInfo" diff --git a/Telegram/Resources/winrc/Updater.rc b/Telegram/Resources/winrc/Updater.rc index 427933bde..8ebf2c68b 100644 --- a/Telegram/Resources/winrc/Updater.rc +++ b/Telegram/Resources/winrc/Updater.rc @@ -35,8 +35,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // VS_VERSION_INFO VERSIONINFO - FILEVERSION 3,5,2,0 - PRODUCTVERSION 3,5,2,0 + FILEVERSION 4,15,3,0 + PRODUCTVERSION 4,15,3,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -53,10 +53,10 @@ BEGIN BEGIN VALUE "CompanyName", "Telegram FZ-LLC" VALUE "FileDescription", "Telegram Desktop Updater" - VALUE "FileVersion", "3.5.2.0" - VALUE "LegalCopyright", "Copyright (C) 2014-2022" + VALUE "FileVersion", "4.15.3.0" + VALUE "LegalCopyright", "Copyright (C) 2014-2024" VALUE "ProductName", "Telegram Desktop" - VALUE "ProductVersion", "3.5.2.0" + VALUE "ProductVersion", "4.15.3.0" END END BLOCK "VarFileInfo" diff --git a/Telegram/SetupFiles/data b/Telegram/SetupFiles/data deleted file mode 100644 index e69de29bb..000000000 diff --git a/Telegram/SetupFiles/log.txt b/Telegram/SetupFiles/log.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/Telegram/SourceFiles/_other/packer.cpp b/Telegram/SourceFiles/_other/packer.cpp index 8cb48b88f..f289aec30 100644 --- a/Telegram/SourceFiles/_other/packer.cpp +++ b/Telegram/SourceFiles/_other/packer.cpp @@ -7,12 +7,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "packer.h" -#include - -#ifdef Q_OS_MAC -//Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin) -#endif - bool BetaChannel = false; quint64 AlphaVersion = 0; bool OnlyAlphaKey = false; @@ -107,9 +101,9 @@ int32 *hashSha1(const void *data, uint32 len, void *dest) { for (end = block + 64; block + 64 <= len; end = block + 64) { for (uint32 i = 0; block < end; block += 4) { temp[i++] = (uint32) buf[block + 3] - | (((uint32) buf[block + 2]) << 8) - | (((uint32) buf[block + 1]) << 16) - | (((uint32) buf[block]) << 24); + | (((uint32) buf[block + 2]) << 8) + | (((uint32) buf[block + 1]) << 16) + | (((uint32) buf[block]) << 24); } sha1PartHash(sha, temp); } @@ -275,7 +269,7 @@ int main(int argc, char *argv[]) } QByteArray inner = f.readAll(); stream << name << quint32(inner.size()) << inner; -#ifdef Q_OS_UNIX +#ifndef Q_OS_WIN stream << (QFileInfo(fullName).isExecutable() ? true : false); #endif } @@ -289,7 +283,7 @@ int main(int argc, char *argv[]) cout << "Compression start, size: " << resultSize << "\n"; QByteArray compressed, resultCheck; -#if defined Q_OS_WIN && !defined DESKTOP_APP_USE_PACKAGED // use Lzma SDK for win +#if defined Q_OS_WIN && !defined TDESKTOP_USE_PACKAGED // use Lzma SDK for win const int32 hSigLen = 128, hShaLen = 20, hPropsLen = LZMA_PROPS_SIZE, hOriginalSizeLen = sizeof(int32), hSize = hSigLen + hShaLen + hPropsLen + hOriginalSizeLen; // header compressed.resize(hSize + resultSize + 1024 * 1024); // rsa signature + sha1 + lzma props + max compressed size @@ -504,10 +498,8 @@ int main(int argc, char *argv[]) QString outName((targetwin64 ? QString("tx64upd%1") : QString("tupdate%1")).arg(AlphaVersion ? AlphaVersion : version)); #elif defined Q_OS_MAC QString outName((targetarmac ? QString("tarmacupd%1") : QString("tmacupd%1")).arg(AlphaVersion ? AlphaVersion : version)); -#elif defined Q_OS_UNIX - QString outName(QString("tlinuxupd%1").arg(AlphaVersion ? AlphaVersion : version)); #else -#error Unknown platform! + QString outName(QString("tlinuxupd%1").arg(AlphaVersion ? AlphaVersion : version)); #endif /* if (AlphaVersion) { diff --git a/Telegram/SourceFiles/_other/packer.h b/Telegram/SourceFiles/_other/packer.h index d099ef0e3..4e5fbfc7a 100644 --- a/Telegram/SourceFiles/_other/packer.h +++ b/Telegram/SourceFiles/_other/packer.h @@ -27,7 +27,7 @@ extern "C" { #include } // extern "C" -#if defined Q_OS_WIN && !defined DESKTOP_APP_USE_PACKAGED // use Lzma SDK for win +#if defined Q_OS_WIN && !defined TDESKTOP_USE_PACKAGED // use Lzma SDK for win #include #else #include diff --git a/Telegram/SourceFiles/_other/startup_task_win.cpp b/Telegram/SourceFiles/_other/startup_task_win.cpp index 8e780848d..a54b941ee 100644 --- a/Telegram/SourceFiles/_other/startup_task_win.cpp +++ b/Telegram/SourceFiles/_other/startup_task_win.cpp @@ -6,6 +6,7 @@ For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include +#include #include #include diff --git a/Telegram/SourceFiles/_other/updater_linux.cpp b/Telegram/SourceFiles/_other/updater_linux.cpp index 871a103ea..30091a497 100644 --- a/Telegram/SourceFiles/_other/updater_linux.cpp +++ b/Telegram/SourceFiles/_other/updater_linux.cpp @@ -41,11 +41,13 @@ bool do_mkdir(const char *path) { // from http://stackoverflow.com/questions/675 } bool _debug = false; +bool writeprotected = false; string updaterDir; string updaterName; string workDir; string exeName; string exePath; +string argv0; FILE *_logFile = 0; void openLog() { @@ -87,7 +89,7 @@ void writeLog(const char *format, ...) { va_end(args); } -bool copyFile(const char *from, const char *to, bool writeprotected) { +bool copyFile(const char *from, const char *to) { FILE *ffrom = fopen(from, "rb"), *fto = fopen(to, "wb"); if (!ffrom) { if (fto) fclose(fto); @@ -210,7 +212,7 @@ void delFolder() { rmdir(delFolder.c_str()); } -bool update(bool writeprotected) { +bool update() { writeLog("Update started.."); string updDir = workDir + "tupdates/temp", readyFilePath = workDir + "tupdates/temp/ready", tdataDir = workDir + "tupdates/temp/tdata"; @@ -323,7 +325,7 @@ bool update(bool writeprotected) { writeLog("Copying file '%s' to '%s'..", fname.c_str(), tofname.c_str()); int copyTries = 0, triesLimit = 30; do { - if (!copyFile(fname.c_str(), tofname.c_str(), writeprotected)) { + if (!copyFile(fname.c_str(), tofname.c_str())) { ++copyTries; usleep(100000); } else { @@ -358,10 +360,10 @@ int main(int argc, char *argv[]) { bool needupdate = true; bool autostart = false; bool debug = false; - bool writeprotected = false; bool tosettings = false; bool startintray = false; bool customWorkingDir = false; + bool justUpdate = false; bool useEnvApi = true; char *key = 0; @@ -383,6 +385,9 @@ int main(int argc, char *argv[]) { customWorkingDir = true; } else if (equal(argv[i], "-writeprotected")) { writeprotected = true; + justUpdate = true; + } else if (equal(argv[i], "-justupdate")) { + justUpdate = true; } else if (equal(argv[i], "-key") && ++i < argc) { key = argv[i]; } else if (equal(argv[i], "-workpath") && ++i < argc) { @@ -391,6 +396,8 @@ int main(int argc, char *argv[]) { exeName = argv[i]; } else if (equal(argv[i], "-exepath") && ++i < argc) { exePath = argv[i]; + } else if (equal(argv[i], "-argv0") && ++i < argc) { + argv0 = argv[i]; } else if (equal(argv[i], "-no-env-api")) { useEnvApi = false; } else if (equal(argv[i], "-api-id") && ++i < argc) { @@ -463,7 +470,7 @@ int main(int argc, char *argv[]) { } else { writeLog("Passed workpath is '%s'", workDir.c_str()); } - update(writeprotected); + update(); } } else { writeLog("Error: bad exe name!"); @@ -472,57 +479,65 @@ int main(int argc, char *argv[]) { writeLog("Error: short exe name!"); } - auto fullBinaryPath = exePath + exeName; - const auto path = fullBinaryPath.c_str(); - - auto values = vector(); - const auto push = [&](string arg) { - // Force null-terminated .data() call result. - values.push_back(arg + char(0)); - }; - push(path); - push("-noupdate"); - if (autostart) push("-autostart"); - if (debug) push("-debug"); - if (startintray) push("-startintray"); - if (tosettings) push("-tosettings"); - if (key) { - push("-key"); - push(key); - } - if (customWorkingDir && workdir) { - push("-workdir"); - push(workdir); - } - - if (!useEnvApi) push("-no-env-api"); - if (customApiId && customApiHash) { - push("-api-id"); - push(customApiId); - push("-api-hash"); - push(customApiHash); - } - - auto args = vector(); - for (auto &arg : values) { - args.push_back(arg.data()); - } - args.push_back(nullptr); - // let the parent launch instead - if (!writeprotected) { + if (justUpdate) { + writeLog("Closing log and quitting.."); + } else { + const auto fullBinaryPath = exePath + exeName; + + auto values = vector(); + const auto push = [&](string arg) { + // Force null-terminated .data() call result. + values.push_back(arg + char(0)); + }; + push(!argv0.empty() ? argv0 : fullBinaryPath); + push("-noupdate"); + if (autostart) push("-autostart"); + if (debug) push("-debug"); + if (startintray) push("-startintray"); + if (tosettings) push("-tosettings"); + if (key) { + push("-key"); + push(key); + } + if (customWorkingDir && workdir) { + push("-workdir"); + push(workdir); + } + + auto args = vector(); + for (auto &arg : values) { + args.push_back(arg.data()); + } + args.push_back(nullptr); + + if (!useEnvApi) push("-no-env-api"); + if (customApiId && customApiHash) { + push("-api-id"); + push(customApiId); + push("-api-hash"); + push(customApiHash); + } + + auto args = vector(); + for (auto &arg : values) { + args.push_back(arg.data()); + } + args.push_back(nullptr); + pid_t pid = fork(); switch (pid) { case -1: writeLog("fork() failed!"); return 1; case 0: - execv(args[0], args.data()); + execv(fullBinaryPath.c_str(), args.data()); return 1; } + + writeLog("Executed Kotatogram, closing log and quitting.."); } - writeLog("Executed Kotatogram, closing log and quitting.."); closeLog(); return 0; diff --git a/Telegram/SourceFiles/_other/updater_osx.m b/Telegram/SourceFiles/_other/updater_osx.m index a103e2f4a..dce3f4b7a 100644 --- a/Telegram/SourceFiles/_other/updater_osx.m +++ b/Telegram/SourceFiles/_other/updater_osx.m @@ -26,7 +26,9 @@ void openLog() { return; } - NSDateFormatter *fmt = [[NSDateFormatter alloc] initWithDateFormat:@"DebugLogs/%Y%m%d_%H%M%S_upd.txt" allowNaturalLanguage:NO]; + NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; + [fmt setLocale:[NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]]; + [fmt setDateFormat:@"'DebugLogs/'yyyyMMdd'_'HHmmss'_update.txt'"]; NSString *logPath = [workDir stringByAppendingString:[fmt stringFromDate:[NSDate date]]]; [[NSFileManager defaultManager] createFileAtPath:logPath contents:nil attributes:nil]; _logFile = [NSFileHandle fileHandleForWritingAtPath:logPath]; @@ -90,7 +92,7 @@ int main(int argc, const char * argv[]) { openLog(); pid_t procId = 0; - BOOL update = YES, toSettings = NO, autoStart = NO, startInTray = NO, freeType = NO; + BOOL update = YES, toSettings = NO, autoStart = NO, startInTray = NO; BOOL customWorkingDir = NO, useEnvApi = YES; NSString *key = nil; NSString *customApiId = nil; @@ -116,8 +118,6 @@ int main(int argc, const char * argv[]) { _debug = YES; } else if ([@"-startintray" isEqualToString:[NSString stringWithUTF8String:argv[i]]]) { startInTray = YES; - } else if ([@"-freetype" isEqualToString:[NSString stringWithUTF8String:argv[i]]]) { - freeType = YES; } else if ([@"-workdir_custom" isEqualToString:[NSString stringWithUTF8String:argv[i]]]) { customWorkingDir = YES; } else if ([@"-key" isEqualToString:[NSString stringWithUTF8String:argv[i]]]) { @@ -260,7 +260,6 @@ int main(int argc, const char * argv[]) { if (toSettings) [args addObject:@"-tosettings"]; if (_debug) [args addObject:@"-debug"]; if (startInTray) [args addObject:@"-startintray"]; - if (freeType) [args addObject:@"-freetype"]; if (autoStart) [args addObject:@"-autostart"]; if (key) { [args addObject:@"-key"]; diff --git a/Telegram/SourceFiles/_other/updater_win.cpp b/Telegram/SourceFiles/_other/updater_win.cpp index 79533d0d0..bfc17b183 100644 --- a/Telegram/SourceFiles/_other/updater_win.cpp +++ b/Telegram/SourceFiles/_other/updater_win.cpp @@ -308,7 +308,7 @@ void updateRegistry() { SYSTEMTIME stLocalTime; GetLocalTime(&stLocalTime); RegSetValueEx(rkey, L"DisplayVersion", 0, REG_SZ, (const BYTE*)versionStr, ((versionLen / 2) + 1) * sizeof(WCHAR)); - wsprintf(nameStr, L"Kotatogram Desktop version %s", versionStr); + wsprintf(nameStr, L"Kotatogram Desktop"); RegSetValueEx(rkey, L"DisplayName", 0, REG_SZ, (const BYTE*)nameStr, (wcslen(nameStr) + 1) * sizeof(WCHAR)); wsprintf(publisherStr, L"Kotatogram"); RegSetValueEx(rkey, L"Publisher", 0, REG_SZ, (const BYTE*)publisherStr, (wcslen(publisherStr) + 1) * sizeof(WCHAR)); @@ -344,7 +344,7 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE prevInstance, LPWSTR cmdPara LPWSTR *args; int argsCount; - bool needupdate = false, autostart = false, debug = false, writeprotected = false, startintray = false, freetype = false; + bool needupdate = false, autostart = false, debug = false, writeprotected = false, startintray = false; bool useEnvApi = true; args = CommandLineToArgvW(GetCommandLine(), &argsCount); if (args) { @@ -359,8 +359,6 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE prevInstance, LPWSTR cmdPara openLog(); } else if (equal(args[i], L"-startintray")) { startintray = true; - } else if (equal(args[i], L"-freetype")) { - freetype = true; } else if (equal(args[i], L"-writeprotected") && ++i < argsCount) { writeLog(std::wstring(L"Argument: ") + args[i]); writeprotected = true; @@ -438,7 +436,6 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE prevInstance, LPWSTR cmdPara if (autostart) targs += L" -autostart"; if (debug) targs += L" -debug"; if (startintray) targs += L" -startintray"; - if (freetype) targs += L" -freetype"; if (!customWorkingDir.empty()) { targs += L" -workdir \"" + customWorkingDir + L"\""; } @@ -555,11 +552,12 @@ HANDLE _generateDumpFileAtPath(const WCHAR *path) { GetLocalTime(&stLocalTime); - wsprintf(szFileName, L"%s%s-%s-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp", - szPath, szExeName, updaterVersionStr, - stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay, - stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond, - GetCurrentProcessId(), GetCurrentThreadId()); + wsprintf( + szFileName, L"%s%s-%s-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp", + szPath, szExeName, updaterVersionStr, + stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay, + stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond, + GetCurrentProcessId(), GetCurrentThreadId()); return CreateFile(szFileName, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0); } @@ -580,7 +578,7 @@ void _generateDump(EXCEPTION_POINTERS* pExceptionPointers) { DWORD len = GetModuleFileName(GetModuleHandle(0), szPath, maxFileLen); if (!len) return; - WCHAR *pathEnd = szPath + len; + WCHAR *pathEnd = szPath + len; if (!_wcsicmp(pathEnd - wcslen(_exeName), _exeName)) { wsprintf(pathEnd - wcslen(_exeName), L""); diff --git a/Telegram/SourceFiles/api/api_attached_stickers.cpp b/Telegram/SourceFiles/api/api_attached_stickers.cpp index 1aa455963..0f18e7648 100644 --- a/Telegram/SourceFiles/api/api_attached_stickers.cpp +++ b/Telegram/SourceFiles/api/api_attached_stickers.cpp @@ -25,7 +25,7 @@ AttachedStickers::AttachedStickers(not_null api) void AttachedStickers::request( not_null controller, MTPmessages_GetAttachedStickers &&mtpRequest) { - const auto weak = base::make_weak(controller.get()); + const auto weak = base::make_weak(controller); _api.request(_requestId).cancel(); _requestId = _api.request( std::move(mtpRequest) @@ -37,33 +37,36 @@ void AttachedStickers::request( } if (result.v.isEmpty()) { strongController->show( - Box(tr::lng_stickers_not_found(tr::now))); + Ui::MakeInformBox(tr::lng_stickers_not_found())); return; } else if (result.v.size() > 1) { strongController->show( - Box(strongController, result)); + Box(strongController->uiShow(), result.v)); return; } // Single attached sticker pack. - const auto setData = result.v.front().match([&](const auto &data) { - return data.vset().match([&](const MTPDstickerSet &data) { - return &data; - }); + const auto data = result.v.front().match([&](const auto &data) { + return &data.vset().data(); }); - const auto setId = (setData->vid().v && setData->vaccess_hash().v) + const auto setId = (data->vid().v && data->vaccess_hash().v) ? StickerSetIdentifier{ - .id = setData->vid().v, - .accessHash = setData->vaccess_hash().v } - : StickerSetIdentifier{ .shortName = qs(setData->vshort_name()) }; - strongController->show( - Box(strongController, setId), - Ui::LayerOption::KeepOther); + .id = data->vid().v, + .accessHash = data->vaccess_hash().v } + : StickerSetIdentifier{ .shortName = qs(data->vshort_name()) }; + strongController->show(Box( + strongController->uiShow(), + setId, + (data->is_emojis() + ? Data::StickersType::Emoji + : data->is_masks() + ? Data::StickersType::Masks + : Data::StickersType::Stickers))); }).fail([=] { _requestId = 0; if (const auto strongController = weak.get()) { strongController->show( - Box(tr::lng_stickers_not_found(tr::now))); + Ui::MakeInformBox(tr::lng_stickers_not_found())); } }).send(); } diff --git a/Telegram/SourceFiles/api/api_authorizations.cpp b/Telegram/SourceFiles/api/api_authorizations.cpp index 143166b78..78e463c11 100644 --- a/Telegram/SourceFiles/api/api_authorizations.cpp +++ b/Telegram/SourceFiles/api/api_authorizations.cpp @@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/unixtime.h" #include "core/changelogs.h" #include "core/application.h" +#include "core/core_settings.h" #include "lang/lang_keys.h" namespace Api { @@ -25,6 +26,7 @@ Authorizations::Entry ParseEntry(const MTPDauthorization &data) { result.hash = data.is_current() ? 0 : data.vhash().v; result.incomplete = data.is_password_pending(); + result.callsDisabled = data.is_call_requests_disabled(); const auto apiId = result.apiId = data.vapi_id().v; const auto isTest = (apiId == TestApiId); @@ -33,8 +35,8 @@ Authorizations::Entry ParseEntry(const MTPDauthorization &data) { || isTest; const auto appName = isDesktop - ? QString("Telegram Desktop%1").arg(isTest ? " (GitHub)" : QString()) - : qs(data.vapp_name());// +qsl(" for ") + qs(d.vplatform()); + ? u"Telegram Desktop%1"_q.arg(isTest ? " (GitHub)" : QString()) + : qs(data.vapp_name());// + u" for "_q + qs(d.vplatform()); const auto appVer = [&] { const auto version = qs(data.vapp_version()); if (isDesktop) { @@ -70,22 +72,9 @@ Authorizations::Entry ParseEntry(const MTPDauthorization &data) { appName, appVer.isEmpty() ? QString() : (' ' + appVer)); result.ip = qs(data.vip()); - if (!result.hash) { - result.active = tr::lng_status_online(tr::now); - } else { - const auto now = QDateTime::currentDateTime(); - const auto lastTime = base::unixtime::parse(result.activeTime); - const auto nowDate = now.date(); - const auto lastDate = lastTime.date(); - if (lastDate == nowDate) { - result.active = lastTime.toString(cTimeFormat()); - } else if (lastDate.year() == nowDate.year() - && lastDate.weekNumber() == nowDate.weekNumber()) { - result.active = langDayOfWeek(lastDate); - } else { - result.active = lastDate.toString(cDateFormat()); - } - } + result.active = result.hash + ? Authorizations::ActiveDateString(result.activeTime) + : tr::lng_status_online(tr::now); result.location = country; return result; @@ -123,15 +112,15 @@ void Authorizations::reload() { )).done([=](const MTPaccount_Authorizations &result) { _requestId = 0; _lastReceived = crl::now(); - result.match([&](const MTPDaccount_authorizations &auths) { - _ttlDays = auths.vauthorization_ttl_days().v; - _list = ( - auths.vauthorizations().v - ) | ranges::views::transform([](const MTPAuthorization &d) { - return ParseEntry(d.c_authorization()); - }) | ranges::to; - _listChanges.fire({}); - }); + const auto &data = result.data(); + _ttlDays = data.vauthorization_ttl_days().v; + _list = ranges::views::all( + data.vauthorizations().v + ) | ranges::views::transform([](const MTPAuthorization &auth) { + return ParseEntry(auth.data()); + }) | ranges::to; + refreshCallsDisabledHereFromCloud(); + _listChanges.fire({}); }).fail([=] { _requestId = 0; }).send(); @@ -141,6 +130,14 @@ void Authorizations::cancelCurrentRequest() { _api.request(base::take(_requestId)).cancel(); } +void Authorizations::refreshCallsDisabledHereFromCloud() { + const auto that = ranges::find(_list, 0, &Entry::hash); + if (that != end(_list) + && !_toggleCallsDisabledRequests.contains(0)) { + _callsDisabledHere = that->callsDisabled; + } +} + void Authorizations::requestTerminate( Fn &&done, Fn &&fail, @@ -175,19 +172,21 @@ Authorizations::List Authorizations::list() const { return _list; } -auto Authorizations::listChanges() const +auto Authorizations::listValue() const -> rpl::producer { return rpl::single( list() ) | rpl::then( - _listChanges.events() | rpl::map([=] { return list(); })); + _listChanges.events() | rpl::map([=] { return list(); }) + ); } -rpl::producer Authorizations::totalChanges() const { +rpl::producer Authorizations::totalValue() const { return rpl::single( total() ) | rpl::then( - _listChanges.events() | rpl::map([=] { return total(); })); + _listChanges.events() | rpl::map([=] { return total(); }) + ); } void Authorizations::updateTTL(int days) { @@ -239,6 +238,19 @@ rpl::producer Authorizations::callsDisabledHereChanges() const { return _callsDisabledHere.changes(); } +QString Authorizations::ActiveDateString(TimeId active) { + const auto now = QDateTime::currentDateTime(); + const auto lastTime = base::unixtime::parse(active); + const auto nowDate = now.date(); + const auto lastDate = lastTime.date(); + return (lastDate == nowDate) + ? QLocale().toString(lastTime.time(), QLocale::ShortFormat) + : (lastDate.year() == nowDate.year() + && lastDate.weekNumber() == nowDate.weekNumber()) + ? langDayOfWeek(lastDate) + : QLocale().toString(lastDate, QLocale::ShortFormat); +} + int Authorizations::total() const { return ranges::count_if( _list, diff --git a/Telegram/SourceFiles/api/api_authorizations.h b/Telegram/SourceFiles/api/api_authorizations.h index f789740fc..5e2a41c9f 100644 --- a/Telegram/SourceFiles/api/api_authorizations.h +++ b/Telegram/SourceFiles/api/api_authorizations.h @@ -21,6 +21,7 @@ public: uint64 hash = 0; bool incomplete = false; + bool callsDisabled = false; int apiId = 0; TimeId activeTime = 0; QString name, active, info, ip, location, system, platform; @@ -37,9 +38,9 @@ public: [[nodiscard]] crl::time lastReceivedTime(); [[nodiscard]] List list() const; - [[nodiscard]] rpl::producer listChanges() const; + [[nodiscard]] rpl::producer listValue() const; [[nodiscard]] int total() const; - [[nodiscard]] rpl::producer totalChanges() const; + [[nodiscard]] rpl::producer totalValue() const; void updateTTL(int days); [[nodiscard]] rpl::producer ttlDays() const; @@ -52,7 +53,11 @@ public: [[nodiscard]] rpl::producer callsDisabledHereValue() const; [[nodiscard]] rpl::producer callsDisabledHereChanges() const; + [[nodiscard]] static QString ActiveDateString(TimeId active); + private: + void refreshCallsDisabledHereFromCloud(); + MTP::Sender _api; mtpRequestId _requestId = 0; diff --git a/Telegram/SourceFiles/api/api_blocked_peers.cpp b/Telegram/SourceFiles/api/api_blocked_peers.cpp index c28b9c37f..0a79eb733 100644 --- a/Telegram/SourceFiles/api/api_blocked_peers.cpp +++ b/Telegram/SourceFiles/api/api_blocked_peers.cpp @@ -77,40 +77,59 @@ void BlockedPeers::block(not_null peer) { _session->changes().peerUpdated( peer, Data::PeerUpdate::Flag::IsBlocked); - } else if (_blockRequests.find(peer) == end(_blockRequests)) { - const auto requestId = _api.request(MTPcontacts_Block( - peer->input - )).done([=] { - _blockRequests.erase(peer); - peer->setIsBlocked(true); - if (_slice) { - _slice->list.insert( - _slice->list.begin(), - { peer->id, base::unixtime::now() }); - ++_slice->total; - _changes.fire_copy(*_slice); - } - }).fail([=] { - _blockRequests.erase(peer); - }).send(); - - _blockRequests.emplace(peer, requestId); + return; + } else if (blockAlreadySent(peer, true)) { + return; } + const auto requestId = _api.request(MTPcontacts_Block( + MTP_flags(0), + peer->input + )).done([=] { + const auto data = _blockRequests.take(peer); + peer->setIsBlocked(true); + if (_slice) { + _slice->list.insert( + _slice->list.begin(), + { peer->id, base::unixtime::now() }); + ++_slice->total; + _changes.fire_copy(*_slice); + } + if (data) { + for (const auto &callback : data->callbacks) { + callback(false); + } + } + }).fail([=] { + if (const auto data = _blockRequests.take(peer)) { + for (const auto &callback : data->callbacks) { + callback(false); + } + } + }).send(); + + _blockRequests.emplace(peer, Request{ + .requestId = requestId, + .blocking = true, + }); } -void BlockedPeers::unblock(not_null peer, Fn onDone) { - if (!peer->isBlocked()) { +void BlockedPeers::unblock( + not_null peer, + Fn done, + bool force) { + if (!force && !peer->isBlocked()) { _session->changes().peerUpdated( peer, Data::PeerUpdate::Flag::IsBlocked); return; - } else if (_blockRequests.find(peer) != end(_blockRequests)) { + } else if (blockAlreadySent(peer, false, done)) { return; } const auto requestId = _api.request(MTPcontacts_Unblock( + MTP_flags(0), peer->input )).done([=] { - _blockRequests.erase(peer); + const auto data = _blockRequests.take(peer); peer->setIsBlocked(false); if (_slice) { auto &list = _slice->list; @@ -125,13 +144,46 @@ void BlockedPeers::unblock(not_null peer, Fn onDone) { } _changes.fire_copy(*_slice); } - if (onDone) { - onDone(); + if (data) { + for (const auto &callback : data->callbacks) { + callback(true); + } } }).fail([=] { - _blockRequests.erase(peer); + if (const auto data = _blockRequests.take(peer)) { + for (const auto &callback : data->callbacks) { + callback(false); + } + } }).send(); - _blockRequests.emplace(peer, requestId); + const auto i = _blockRequests.emplace(peer, Request{ + .requestId = requestId, + .blocking = false, + }).first; + if (done) { + i->second.callbacks.push_back(std::move(done)); + } +} + +bool BlockedPeers::blockAlreadySent( + not_null peer, + bool blocking, + Fn done) { + const auto i = _blockRequests.find(peer); + if (i == end(_blockRequests)) { + return false; + } else if (i->second.blocking == blocking) { + if (done) { + i->second.callbacks.push_back(std::move(done)); + } + return true; + } + const auto callbacks = base::take(i->second.callbacks); + _blockRequests.erase(i); + for (const auto &callback : callbacks) { + callback(false); + } + return false; } void BlockedPeers::reload() { @@ -155,16 +207,17 @@ auto BlockedPeers::slice() -> rpl::producer { : (_changes.events() | rpl::type_erased()); } -void BlockedPeers::request(int offset, Fn onDone) { +void BlockedPeers::request(int offset, Fn done) { if (_requestId) { return; } _requestId = _api.request(MTPcontacts_GetBlocked( + MTP_flags(0), MTP_int(offset), MTP_int(offset ? kBlockedPerPage : kBlockedFirstSlice) )).done([=](const MTPcontacts_Blocked &result) { _requestId = 0; - onDone(TLToSlice(result, _session->data())); + done(TLToSlice(result, _session->data())); }).fail([=] { _requestId = 0; }).send(); diff --git a/Telegram/SourceFiles/api/api_blocked_peers.h b/Telegram/SourceFiles/api/api_blocked_peers.h index ae506bbc9..ca2000f67 100644 --- a/Telegram/SourceFiles/api/api_blocked_peers.h +++ b/Telegram/SourceFiles/api/api_blocked_peers.h @@ -39,17 +39,31 @@ public: void reload(); rpl::producer slice(); - void request(int offset, Fn onDone); + void request(int offset, Fn done); void block(not_null peer); - void unblock(not_null peer, Fn onDone = nullptr); + void unblock( + not_null peer, + Fn done = nullptr, + bool force = false); private: + struct Request { + std::vector> callbacks; + mtpRequestId requestId = 0; + bool blocking = false; + }; + + [[nodiscard]] bool blockAlreadySent( + not_null peer, + bool blocking, + Fn done = nullptr); + const not_null _session; MTP::Sender _api; - base::flat_map, mtpRequestId> _blockRequests; + base::flat_map, Request> _blockRequests; mtpRequestId _requestId = 0; std::optional _slice; rpl::event_stream _changes; diff --git a/Telegram/SourceFiles/api/api_bot.cpp b/Telegram/SourceFiles/api/api_bot.cpp index f51941396..e5071007c 100644 --- a/Telegram/SourceFiles/api/api_bot.cpp +++ b/Telegram/SourceFiles/api/api_bot.cpp @@ -7,23 +7,34 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "api/api_bot.h" +#include "kotato/kotato_lang.h" #include "apiwrap.h" #include "api/api_cloud_password.h" -#include "core/core_cloud_password.h" #include "api/api_send_progress.h" -#include "ui/boxes/confirm_box.h" #include "boxes/share_box.h" #include "boxes/passcode_box.h" +#include "boxes/url_auth_box.h" +#include "boxes/peers/choose_peer_box.h" #include "lang/lang_keys.h" +#include "core/core_cloud_password.h" #include "kotato/boxes/kotato_confirm_box.h" #include "core/click_handler_types.h" #include "data/data_changes.h" #include "data/data_peer.h" +#include "data/data_poll.h" +#include "data/data_user.h" #include "data/data_session.h" #include "history/history.h" #include "history/history_item.h" #include "history/history_item_components.h" +#include "inline_bots/bot_attach_web_view.h" +#include "payments/payments_checkout_process.h" #include "main/main_session.h" +#include "mainwidget.h" +#include "mainwindow.h" +#include "window/window_session_controller.h" +#include "window/window_peer_menu.h" +#include "ui/boxes/confirm_box.h" #include "ui/toast/toast.h" #include "ui/layers/generic_box.h" #include "ui/text/text_utilities.h" @@ -32,10 +43,12 @@ namespace Api { namespace { void SendBotCallbackData( + not_null controller, not_null item, int row, int column, - std::optional password = std::nullopt, + std::optional password, + Fn done = nullptr, Fn handleError = nullptr) { if (!item->isRegular()) { return; @@ -47,11 +60,7 @@ void SendBotCallbackData( const auto bot = item->getMessageBot(); const auto fullId = item->fullId(); const auto getButton = [=] { - return HistoryMessageMarkupButton::Get( - owner, - fullId, - row, - column); + return HistoryMessageMarkupButton::Get(owner, fullId, row, column); }; const auto button = getButton(); if (!button || button->requestId) { @@ -74,6 +83,8 @@ void SendBotCallbackData( if (withPassword) { flags |= MTPmessages_GetBotCallbackAnswer::Flag::f_password; } + const auto weak = base::make_weak(controller); + const auto show = controller->uiShow(); button->requestId = api->request(MTPmessages_GetBotCallbackAnswer( MTP_flags(flags), history->peer->input, @@ -81,6 +92,11 @@ void SendBotCallbackData( MTP_bytes(sendData), password ? password->result : MTP_inputCheckPasswordEmpty() )).done([=](const MTPmessages_BotCallbackAnswer &result) { + const auto guard = gsl::finally([&] { + if (done) { + done(); + } + }); const auto item = owner->message(fullId); if (!item) { return; @@ -89,10 +105,7 @@ void SendBotCallbackData( button->requestId = 0; owner->requestItemRepaint(item); } - const auto &data = result.match([]( - const auto &data) -> const MTPDmessages_botCallbackAnswer& { - return data; - }); + const auto &data = result.data(); const auto message = data.vmessage() ? qs(*data.vmessage()) : QString(); @@ -100,13 +113,15 @@ void SendBotCallbackData( const auto showAlert = data.is_alert(); if (!message.isEmpty()) { - if (showAlert) { - Ui::show(Box(message)); + if (!show->valid()) { + return; + } else if (showAlert) { + show->showBox(Box(message)); } else { if (withPassword) { - Ui::hideLayer(); + show->hideLayer(); } - Ui::Toast::Show(message); + show->showToast(message); } } else if (!link.isEmpty()) { if (!isGame) { @@ -117,14 +132,25 @@ void SendBotCallbackData( session, link, item->fullId()); - BotGameUrlClickHandler(bot, scoreLink).onClick({}); + BotGameUrlClickHandler(bot, scoreLink).onClick({ + Qt::LeftButton, + QVariant::fromValue(ClickHandlerContext{ + .itemId = item->fullId(), + .sessionWindow = weak, + }), + }); session->sendProgressManager().update( history, Api::SendProgressType::PlayGame); } else if (withPassword) { - Ui::hideLayer(); + show->hideLayer(); } }).fail([=](const MTP::Error &error) { + const auto guard = gsl::finally([&] { + if (handleError) { + handleError(error.type()); + } + }); const auto item = owner->message(fullId); if (!item) { return; @@ -134,9 +160,6 @@ void SendBotCallbackData( button->requestId = 0; owner->requestItemRepaint(item); } - if (handleError) { - handleError(error.type()); - } }).send(); session->changes().messageUpdated( @@ -145,16 +168,24 @@ void SendBotCallbackData( ); } +void HideSingleUseKeyboard( + not_null controller, + not_null item) { + controller->content()->hideSingleUseKeyboard(item->fullId()); +} + } // namespace void SendBotCallbackData( + not_null controller, not_null item, int row, int column) { - SendBotCallbackData(item, row, column, std::nullopt); + SendBotCallbackData(controller, item, row, column, std::nullopt); } void SendBotCallbackDataWithPassword( + not_null controller, not_null item, int row, int column) { @@ -178,7 +209,10 @@ void SendBotCallbackDataWithPassword( return; } api->cloudPassword().reload(); - SendBotCallbackData(item, row, column, std::nullopt, [=](const QString &error) { + const auto weak = base::make_weak(controller); + const auto show = controller->uiShow(); + SendBotCallbackData(controller, item, row, column, {}, {}, [=]( + const QString &error) { auto box = PrePasswordErrorBox( error, session, @@ -186,7 +220,7 @@ void SendBotCallbackDataWithPassword( tr::now, Ui::Text::WithEntities)); if (box) { - Ui::show(std::move(box)); + show->showBox(std::move(box), Ui::LayerOption::CloseOther); } else { auto lifetime = std::make_shared(); button->requestId = -1; @@ -220,17 +254,262 @@ void SendBotCallbackDataWithPassword( return; } if (const auto item = owner->message(fullId)) { - SendBotCallbackData(item, row, column, result, [=](const QString &error) { + const auto strongController = weak.get(); + if (!strongController) { + return; + } + SendBotCallbackData(strongController, item, row, column, result, [=] { + if (*box) { + (*box)->closeBox(); + } + }, [=](const QString &error) { if (*box) { (*box)->handleCustomCheckError(error); } }); } }; - *box = Ui::show(Box(session, fields)); + auto object = Box(session, fields); + *box = Ui::MakeWeak(object.data()); + show->showBox(std::move(object), Ui::LayerOption::CloseOther); }, *lifetime); } }); } +bool SwitchInlineBotButtonReceived( + not_null controller, + const QByteArray &queryWithPeerTypes, + UserData *samePeerBot, + MsgId samePeerReplyTo) { + return controller->content()->notify_switchInlineBotButtonReceived( + QString::fromUtf8(queryWithPeerTypes), + samePeerBot, + samePeerReplyTo); +} + +void ActivateBotCommand(ClickHandlerContext context, int row, int column) { + const auto strong = context.sessionWindow.get(); + if (!strong) { + return; + } + const auto controller = not_null{ strong }; + const auto item = controller->session().data().message(context.itemId); + if (!item) { + return; + } + const auto button = HistoryMessageMarkupButton::Get( + &item->history()->owner(), + item->fullId(), + row, + column); + if (!button) { + return; + } + + using ButtonType = HistoryMessageMarkupButton::Type; + switch (button->type) { + case ButtonType::Default: { + // Copy string before passing it to the sending method + // because the original button can be destroyed inside. + const auto replyTo = item->isRegular() + ? item->fullId() + : FullMsgId(); + controller->content()->sendBotCommand({ + .peer = item->history()->peer, + .command = QString(button->text), + .context = item->fullId(), + .replyTo = { replyTo }, + }); + } break; + + case ButtonType::Callback: + case ButtonType::Game: { + SendBotCallbackData(controller, item, row, column); + } break; + + case ButtonType::CallbackWithPassword: { + SendBotCallbackDataWithPassword(controller, item, row, column); + } break; + + case ButtonType::Buy: { + Payments::CheckoutProcess::Start( + item, + Payments::Mode::Payment, + crl::guard(controller, [=](auto) { + controller->widget()->activate(); + })); + } break; + + case ButtonType::Url: { + auto url = QString::fromUtf8(button->data); + auto skipConfirmation = false; + if (const auto bot = item->getMessageBot()) { + if (bot->isVerified()) { + skipConfirmation = true; + } + } + const auto variant = QVariant::fromValue(context); + if (skipConfirmation) { + UrlClickHandler::Open(url, variant); + } else { + HiddenUrlClickHandler::Open(url, variant); + } + } break; + + case ButtonType::RequestLocation: { + HideSingleUseKeyboard(controller, item); + controller->show( + Ui::MakeInformBox(rktr("ktg_bot_share_location_unavailable"))); + } break; + + case ButtonType::RequestPhone: { + HideSingleUseKeyboard(controller, item); + const auto itemId = item->fullId(); + const auto topicRootId = item->topicRootId(); + const auto history = item->history(); + controller->show(Ui::MakeConfirmBox({ + .text = tr::lng_bot_share_phone(), + .confirmed = [=] { + controller->showPeerHistory( + history, + Window::SectionShow::Way::Forward, + ShowAtTheEndMsgId); + auto action = Api::SendAction(history); + action.clearDraft = false; + action.replyTo = { + .messageId = itemId, + .topicRootId = topicRootId, + }; + history->session().api().shareContact( + history->session().user(), + action); + }, + .confirmText = tr::lng_bot_share_phone_confirm(), + })); + } break; + + case ButtonType::RequestPoll: { + HideSingleUseKeyboard(controller, item); + auto chosen = PollData::Flags(); + auto disabled = PollData::Flags(); + if (!button->data.isEmpty()) { + disabled |= PollData::Flag::Quiz; + if (button->data[0]) { + chosen |= PollData::Flag::Quiz; + } + } + const auto replyTo = FullReplyTo(); + Window::PeerMenuCreatePoll( + controller, + item->history()->peer, + replyTo, + chosen, + disabled); + } break; + + case ButtonType::RequestPeer: { + HideSingleUseKeyboard(controller, item); + + auto query = RequestPeerQuery(); + Assert(button->data.size() == sizeof(query)); + memcpy(&query, button->data.data(), sizeof(query)); + const auto peer = item->history()->peer; + const auto itemId = item->id; + const auto id = int32(button->buttonId); + const auto chosen = [=](std::vector> result) { + peer->session().api().request(MTPmessages_SendBotRequestedPeer( + peer->input, + MTP_int(itemId), + MTP_int(id), + MTP_vector_from_range( + result + | ranges::views::transform([]( + not_null peer) { + return MTPInputPeer(peer->input); })) + )).done([=](const MTPUpdates &result) { + peer->session().api().applyUpdates(result); + }).send(); + }; + if (const auto bot = item->getMessageBot()) { + ShowChoosePeerBox(controller, bot, query, chosen); + } else { + LOG(("API Error: Bot not found for RequestPeer button.")); + } + } break; + + case ButtonType::SwitchInlineSame: + case ButtonType::SwitchInline: { + if (const auto bot = item->getMessageBot()) { + const auto fastSwitchDone = [&] { + const auto samePeer = (button->type + == ButtonType::SwitchInlineSame); + if (samePeer) { + SwitchInlineBotButtonReceived( + controller, + button->data, + bot, + item->id); + return true; + } else if (bot->isBot() && bot->botInfo->inlineReturnTo.key) { + const auto switched = SwitchInlineBotButtonReceived( + controller, + button->data); + if (switched) { + return true; + } + } + return false; + }(); + if (!fastSwitchDone) { + const auto query = QString::fromUtf8(button->data); + const auto chosen = [=](not_null thread) { + return controller->switchInlineQuery( + thread, + bot, + query); + }; + Window::ShowChooseRecipientBox( + controller, + chosen, + tr::lng_inline_switch_choose(), + nullptr, + button->peerTypes); + } + } + } break; + + case ButtonType::Auth: + UrlAuthBox::Activate(item, row, column); + break; + + case ButtonType::UserProfile: { + const auto session = &item->history()->session(); + const auto userId = UserId(button->data.toULongLong()); + if (const auto user = session->data().userLoaded(userId)) { + controller->showPeerInfo(user); + } + } break; + + case ButtonType::WebView: { + if (const auto bot = item->getMessageBot()) { + bot->session().attachWebView().request( + controller, + Api::SendAction(bot->owner().history(bot)), + bot, + { .text = button->text, .url = button->data }); + } + } break; + + case ButtonType::SimpleWebView: { + if (const auto bot = item->getMessageBot()) { + bot->session().attachWebView().requestSimple( + controller, + bot, + { .text = button->text, .url = button->data }); + } + } break; + } +} + } // namespace Api diff --git a/Telegram/SourceFiles/api/api_bot.h b/Telegram/SourceFiles/api/api_bot.h index 06a420a41..7e26dd103 100644 --- a/Telegram/SourceFiles/api/api_bot.h +++ b/Telegram/SourceFiles/api/api_bot.h @@ -7,18 +7,33 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once +struct ClickHandlerContext; class HistoryItem; +namespace Window { +class SessionController; +} // namespace Window + namespace Api { void SendBotCallbackData( + not_null controller, not_null item, int row, int column); void SendBotCallbackDataWithPassword( + not_null controller, not_null item, int row, int column); +bool SwitchInlineBotButtonReceived( + not_null controller, + const QByteArray &queryWithPeerTypes, + UserData *samePeerBot = nullptr, + MsgId samePeerReplyTo = 0); + +void ActivateBotCommand(ClickHandlerContext context, int row, int column); + } // namespace Api diff --git a/Telegram/SourceFiles/api/api_chat_filters.cpp b/Telegram/SourceFiles/api/api_chat_filters.cpp index d33004623..cf136f832 100644 --- a/Telegram/SourceFiles/api/api_chat_filters.cpp +++ b/Telegram/SourceFiles/api/api_chat_filters.cpp @@ -8,23 +8,670 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_chat_filters.h" #include "kotato/kotato_settings.h" -#include "data/data_session.h" -#include "data/data_chat_filters.h" -#include "main/main_session.h" #include "apiwrap.h" +#include "boxes/peer_list_box.h" +#include "boxes/premium_limits_box.h" +#include "boxes/filters/edit_filter_links.h" // FilterChatStatusText +#include "core/application.h" +#include "data/data_channel.h" +#include "data/data_chat.h" +#include "data/data_chat_filters.h" +#include "data/data_peer.h" +#include "data/data_session.h" +#include "history/history.h" +#include "lang/lang_keys.h" +#include "main/main_session.h" +#include "ui/boxes/confirm_box.h" +#include "ui/controls/filter_link_header.h" +#include "ui/text/text_utilities.h" +#include "ui/widgets/buttons.h" +#include "ui/filter_icons.h" +#include "ui/vertical_list.h" +#include "window/window_session_controller.h" +#include "styles/style_filter_icons.h" +#include "styles/style_layers.h" +#include "styles/style_settings.h" namespace Api { +namespace { + +enum class ToggleAction { + Adding, + Removing, +}; + +class ToggleChatsController final + : public PeerListController + , public base::has_weak_ptr { +public: + ToggleChatsController( + not_null window, + ToggleAction action, + const QString &title, + std::vector> chats, + std::vector> additional); + + void prepare() override; + void rowClicked(not_null row) override; + Main::Session &session() const override; + + [[nodiscard]] auto selectedValue() const + -> rpl::producer>>; + + void adjust(int minHeight, int maxHeight, int addedTopHeight); + void setRealContentHeight(rpl::producer value); + rpl::producer boxHeightValue() const override; + +private: + void setupAboveWidget(); + void setupBelowWidget(); + void initDesiredHeightValue(); + void toggleAllSelected(bool select); + + const not_null _window; + Ui::RpWidget *_addedTopWidget = nullptr; + Ui::RpWidget *_addedBottomWidget = nullptr; + + ToggleAction _action = ToggleAction::Adding; + QString _filterTitle; + base::flat_set> _checkable; + std::vector> _chats; + std::vector> _additional; + rpl::variable>> _selected; + + int _minTopHeight = 0; + rpl::variable _maxTopHeight; + rpl::variable _aboveHeight; + rpl::variable _belowHeight; + rpl::variable _desiredHeight; + + base::unique_qptr _menu; + + rpl::lifetime _lifetime; + +}; + +[[nodiscard]] tr::phrase<> TitleText(Ui::FilterLinkHeaderType type) { + using Type = Ui::FilterLinkHeaderType; + switch (type) { + case Type::AddingFilter: return tr::lng_filters_by_link_title; + case Type::AddingChats: return tr::lng_filters_by_link_more; + case Type::AllAdded: return tr::lng_filters_by_link_already; + case Type::Removing: return tr::lng_filters_by_link_remove; + } + Unexpected("Ui::FilterLinkHeaderType in TitleText."); +} + +[[nodiscard]] TextWithEntities AboutText( + Ui::FilterLinkHeaderType type, + const QString &title) { + using Type = Ui::FilterLinkHeaderType; + auto boldTitle = Ui::Text::Bold(title); + return (type == Type::AddingFilter) + ? tr::lng_filters_by_link_sure( + tr::now, + lt_folder, + std::move(boldTitle), + Ui::Text::WithEntities) + : (type == Type::AddingChats) + ? tr::lng_filters_by_link_more_sure( + tr::now, + lt_folder, + std::move(boldTitle), + Ui::Text::WithEntities) + : (type == Type::AllAdded) + ? tr::lng_filters_by_link_already_about( + tr::now, + lt_folder, + std::move(boldTitle), + Ui::Text::WithEntities) + : tr::lng_filters_by_link_remove_sure( + tr::now, + lt_folder, + std::move(boldTitle), + Ui::Text::WithEntities); +} + +void InitFilterLinkHeader( + not_null box, + Fn adjust, + Ui::FilterLinkHeaderType type, + const QString &title, + const QString &iconEmoji, + rpl::producer count) { + const auto icon = Ui::LookupFilterIcon( + Ui::LookupFilterIconByEmoji( + iconEmoji + ).value_or(Ui::FilterIcon::Custom)).active; + auto header = Ui::MakeFilterLinkHeader(box, { + .type = type, + .title = TitleText(type)(tr::now), + .about = AboutText(type, title), + .folderTitle = title, + .folderIcon = icon, + .badge = (type == Ui::FilterLinkHeaderType::AddingChats + ? std::move(count) + : rpl::single(0)), + }); + const auto widget = header.widget; + widget->resizeToWidth(st::boxWideWidth); + Ui::SendPendingMoveResizeEvents(widget); + + const auto min = widget->minimumHeight(), max = widget->maximumHeight(); + widget->resize(st::boxWideWidth, max); + + box->setAddedTopScrollSkip(max); + std::move( + header.wheelEvents + ) | rpl::start_with_next([=](not_null e) { + box->sendScrollViewportEvent(e); + }, widget->lifetime()); + + std::move( + header.closeRequests + ) | rpl::start_with_next([=] { + box->closeBox(); + }, widget->lifetime()); + + struct State { + bool processing = false; + int addedTopHeight = 0; + }; + const auto state = widget->lifetime().make_state(); + + box->scrolls( + ) | rpl::filter([=] { + return !state->processing; + }) | rpl::start_with_next([=] { + state->processing = true; + const auto guard = gsl::finally([&] { state->processing = false; }); + + const auto top = box->scrollTop(); + const auto headerHeight = std::max(max - top, min); + const auto addedTopHeight = max - headerHeight; + widget->resize(widget->width(), headerHeight); + if (state->addedTopHeight < addedTopHeight) { + adjust(min, max, addedTopHeight); + box->setAddedTopScrollSkip(headerHeight); + } else { + box->setAddedTopScrollSkip(headerHeight); + adjust(min, max, addedTopHeight); + } + state->addedTopHeight = addedTopHeight; + box->peerListRefreshRows(); + }, widget->lifetime()); + + box->setNoContentMargin(true); + adjust(min, max, 0); +} + +void ImportInvite( + const QString &slug, + FilterId filterId, + const base::flat_set> &peers, + Fn done, + Fn fail) { + Expects(!peers.empty()); + + const auto peer = peers.front(); + const auto api = &peer->session().api(); + const auto callback = [=](const MTPUpdates &result) { + api->applyUpdates(result); + if (slug.isEmpty()) { + peer->owner().chatsFilters().moreChatsHide(filterId, true); + } + done(); + }; + const auto error = [=](const MTP::Error &error) { + fail(error.type()); + }; + auto inputs = peers | ranges::views::transform([](auto peer) { + return MTPInputPeer(peer->input); + }) | ranges::to>(); + if (!slug.isEmpty()) { + api->request(MTPchatlists_JoinChatlistInvite( + MTP_string(slug), + MTP_vector(std::move(inputs)) + )).done(callback).fail(error).send(); + } else { + api->request(MTPchatlists_JoinChatlistUpdates( + MTP_inputChatlistDialogFilter(MTP_int(filterId)), + MTP_vector(std::move(inputs)) + )).done(callback).fail(error).send(); + } +} + +ToggleChatsController::ToggleChatsController( + not_null window, + ToggleAction action, + const QString &title, + std::vector> chats, + std::vector> additional) +: _window(window) +, _action(action) +, _filterTitle(title) +, _chats(std::move(chats)) +, _additional(std::move(additional)) { + setStyleOverrides(&st::filterLinkChatsList); +} + +void ToggleChatsController::prepare() { + auto selected = base::flat_set>(); + const auto disabled = [](not_null peer) { + return peer->isChat() + ? peer->asChat()->isForbidden() + : peer->isChannel() + ? peer->asChannel()->isForbidden() + : false; + }; + const auto add = [&](not_null peer, bool additional = false) { + const auto disable = disabled(peer); + auto row = (additional || !disable) + ? std::make_unique(peer) + : MakeFilterChatRow( + peer, + tr::lng_filters_link_inaccessible(tr::now), + true); + if (delegate()->peerListFindRow(peer->id.value)) { + return; + } + const auto raw = row.get(); + delegate()->peerListAppendRow(std::move(row)); + if (!disable + && (!additional || _action == ToggleAction::Removing)) { + _checkable.emplace(peer); + if (const auto status = FilterChatStatusText(peer) + ; !status.isEmpty()) { + raw->setCustomStatus(status); + } + } + if (disable) { + } else if (!additional) { + delegate()->peerListSetRowChecked(raw, true); + raw->finishCheckedAnimation(); + selected.emplace(peer); + } else if (_action == ToggleAction::Adding) { + raw->setDisabledState(PeerListRow::State::DisabledChecked); + raw->setCustomStatus(peer->isBroadcast() + ? tr::lng_filters_link_already_channel(tr::now) + : tr::lng_filters_link_already_group(tr::now)); + } + }; + for (const auto &peer : _chats) { + if (!disabled(peer)) { + add(peer); + } + } + for (const auto &peer : _additional) { + add(peer, true); + } + for (const auto &peer : _chats) { + if (disabled(peer)) { + add(peer); + } + } + setupAboveWidget(); + setupBelowWidget(); + initDesiredHeightValue(); + delegate()->peerListRefreshRows(); + _selected = std::move(selected); +} + +void ToggleChatsController::rowClicked(not_null row) { + const auto peer = row->peer(); + if (!_checkable.contains(peer)) { + return; + } + const auto checked = row->checked(); + auto selected = _selected.current(); + delegate()->peerListSetRowChecked(row, !checked); + if (checked) { + selected.remove(peer); + } else { + selected.emplace(peer); + } + _selected = std::move(selected); +} + +void ToggleChatsController::setupAboveWidget() { + using namespace Settings; + + auto wrap = object_ptr((QWidget*)nullptr); + const auto container = wrap.data(); + + _addedTopWidget = container->add(object_ptr(container)); + const auto realAbove = container->add( + object_ptr(container)); + Ui::AddDivider(realAbove); + const auto totalCount = [&] { + if (_chats.empty()) { + return _additional.size(); + } else if (_additional.empty()) { + return _chats.size(); + } + auto result = _chats.size(); + for (const auto &peer : _additional) { + if (!ranges::contains(_chats, peer)) { + ++result; + } + } + return result; + }; + const auto count = (_action == ToggleAction::Removing) + ? totalCount() + : _chats.empty() + ? _additional.size() + : _chats.size(); + const auto selectableCount = int(_checkable.size()); + auto selectedCount = _selected.value( + ) | rpl::map([](const base::flat_set> &selected) { + return int(selected.size()); + }); + AddFilterSubtitleWithToggles( + realAbove, + (_action == ToggleAction::Removing + ? tr::lng_filters_by_link_quit + : _chats.empty() + ? tr::lng_filters_by_link_in + : tr::lng_filters_by_link_join)( + lt_count, + rpl::single(float64(count))), + selectableCount, + std::move(selectedCount), + [=](bool select) { toggleAllSelected(select); }); + + _aboveHeight = realAbove->heightValue(); + delegate()->peerListSetAboveWidget(std::move(wrap)); +} + +void ToggleChatsController::toggleAllSelected(bool select) { + auto selected = _selected.current(); + if (!select) { + if (selected.empty()) { + return; + } + for (const auto &peer : selected) { + const auto row = delegate()->peerListFindRow(peer->id.value); + Assert(row != nullptr); + delegate()->peerListSetRowChecked(row, false); + } + selected = {}; + } else { + const auto count = delegate()->peerListFullRowsCount(); + for (auto i = 0; i != count; ++i) { + const auto row = delegate()->peerListRowAt(i); + const auto peer = row->peer(); + if (_action != ToggleAction::Adding || + !ranges::contains(_additional, peer)) { + delegate()->peerListSetRowChecked(row, true); + selected.emplace(peer); + } + } + } + _selected = std::move(selected); +} + +void ToggleChatsController::setupBelowWidget() { + if (_chats.empty()) { + auto widget = object_ptr((QWidget*)nullptr); + _addedBottomWidget = widget.data(); + delegate()->peerListSetBelowWidget(std::move(widget)); + return; + } + auto layout = object_ptr((QWidget*)nullptr); + const auto raw = layout.data(); + auto widget = object_ptr( + (QWidget*)nullptr, + std::move(layout), + st::defaultBoxDividerLabelPadding); + raw->add(object_ptr( + raw, + (_action == ToggleAction::Removing + ? tr::lng_filters_by_link_about_quit + : tr::lng_filters_by_link_about)(tr::now), + st::boxDividerLabel)); + _addedBottomWidget = raw->add(object_ptr(raw)); + _belowHeight = widget->heightValue() | rpl::map([=](int value) { + return value - _addedBottomWidget->height(); + }); + delegate()->peerListSetBelowWidget(std::move(widget)); +} + +Main::Session &ToggleChatsController::session() const { + return _window->session(); +} + +auto ToggleChatsController::selectedValue() const +-> rpl::producer>> { + return _selected.value(); +} + +void ToggleChatsController::adjust( + int minHeight, + int maxHeight, + int addedTopHeight) { + Expects(addedTopHeight >= 0); + + _addedTopWidget->resize(_addedTopWidget->width(), addedTopHeight); + _minTopHeight = minHeight; + _maxTopHeight = maxHeight; +} + +void ToggleChatsController::setRealContentHeight(rpl::producer value) { + std::move( + value + ) | rpl::start_with_next([=](int height) { + const auto desired = _desiredHeight.current(); + if (height <= computeListSt().item.height) { + return; + } else if (height >= desired) { + _addedBottomWidget->resize(_addedBottomWidget->width(), 0); + } else { + const auto available = desired - height; + const auto required = _maxTopHeight.current() - _minTopHeight; + const auto added = required - available; + _addedBottomWidget->resize( + _addedBottomWidget->width(), + std::max(added, 0)); + } + }, _lifetime); +} + +void ToggleChatsController::initDesiredHeightValue() { + using namespace rpl::mappers; + + const auto &st = computeListSt(); + const auto count = int(delegate()->peerListFullRowsCount()); + const auto middle = st.padding.top() + + (count * st.item.height) + + st.padding.bottom(); + _desiredHeight = rpl::combine( + _maxTopHeight.value(), + _aboveHeight.value(), + _belowHeight.value(), + _1 + _2 + middle + _3); +} + +rpl::producer ToggleChatsController::boxHeightValue() const { + return _desiredHeight.value() | rpl::map([=](int value) { + return std::min(value, st::boxMaxListHeight); + }); +} + +void ShowImportError( + not_null window, + FilterId id, + int added, + const QString &error) { + const auto session = &window->session(); + const auto &list = session->data().chatsFilters().list(); + const auto i = ranges::find(list, id, &Data::ChatFilter::id); + const auto count = added + + ((i != end(list)) ? int(i->always().size()) : 0); + if (error == u"CHANNELS_TOO_MUCH"_q) { + window->show(Box(ChannelsLimitBox, session)); + } else if (error == u"FILTER_INCLUDE_TOO_MUCH"_q) { + window->show(Box(FilterChatsLimitBox, session, count, true)); + } else if (error == u"CHATLISTS_TOO_MUCH"_q) { + window->show(Box(ShareableFiltersLimitBox, session)); + } else { + window->showToast((error == u"INVITE_SLUG_EXPIRED"_q) + ? tr::lng_group_invite_bad_link(tr::now) + : error); + } +} + +void ShowImportToast( + base::weak_ptr weak, + const QString &title, + Ui::FilterLinkHeaderType type, + int added) { + const auto strong = weak.get(); + if (!strong) { + return; + } + const auto created = (type == Ui::FilterLinkHeaderType::AddingFilter); + const auto phrase = created + ? tr::lng_filters_added_title + : tr::lng_filters_updated_title; + auto text = Ui::Text::Bold(phrase(tr::now, lt_folder, title)); + if (added > 0) { + const auto phrase = created + ? tr::lng_filters_added_also + : tr::lng_filters_updated_also; + text.append('\n').append(phrase(tr::now, lt_count, added)); + } + strong->showToast(std::move(text)); +} + +void ProcessFilterInvite( + base::weak_ptr weak, + const QString &slug, + FilterId filterId, + const QString &title, + const QString &iconEmoji, + std::vector> peers, + std::vector> already) { + const auto strong = weak.get(); + if (!strong) { + return; + } + Core::App().hideMediaView(); + if (peers.empty() && !filterId) { + strong->showToast(tr::lng_group_invite_bad_link(tr::now)); + return; + } + const auto fullyAdded = (peers.empty() && filterId); + auto controller = std::make_unique( + strong, + ToggleAction::Adding, + title, + std::move(peers), + std::move(already)); + const auto raw = controller.get(); + auto initBox = [=](not_null box) { + box->setStyle(st::filterInviteBox); + + using Type = Ui::FilterLinkHeaderType; + const auto type = fullyAdded + ? Type::AllAdded + : !filterId + ? Type::AddingFilter + : Type::AddingChats; + auto badge = raw->selectedValue( + ) | rpl::map([=](const base::flat_set> &peers) { + return int(peers.size()); + }); + InitFilterLinkHeader(box, [=](int min, int max, int addedTop) { + raw->adjust(min, max, addedTop); + }, type, title, iconEmoji, rpl::duplicate(badge)); + + raw->setRealContentHeight(box->heightValue()); + + auto owned = Ui::FilterLinkProcessButton( + box, + type, + title, + std::move(badge)); + + const auto button = owned.data(); + box->widthValue( + ) | rpl::start_with_next([=](int width) { + const auto &padding = st::filterInviteBox.buttonPadding; + button->resizeToWidth(width + - padding.left() + - padding.right()); + button->moveToLeft(padding.left(), padding.top()); + }, button->lifetime()); + + box->addButton(std::move(owned)); + + struct State { + bool importing = false; + }; + const auto state = box->lifetime().make_state(); + + raw->selectedValue( + ) | rpl::start_with_next([=]( + base::flat_set> &&peers) { + button->setClickedCallback([=] { + if (peers.empty()) { + box->closeBox(); + } else if (!state->importing) { + state->importing = true; + const auto added = int(peers.size()); + ImportInvite(slug, filterId, peers, crl::guard(box, [=] { + ShowImportToast(weak, title, type, peers.size()); + box->closeBox(); + }), crl::guard(box, [=](QString text) { + if (const auto strong = weak.get()) { + ShowImportError(strong, filterId, added, text); + } + state->importing = false; + })); + } + }); + }, box->lifetime()); + }; + strong->show( + Box(std::move(controller), std::move(initBox))); +} + +void ProcessFilterInvite( + base::weak_ptr weak, + const QString &slug, + FilterId filterId, + std::vector> peers, + std::vector> already) { + const auto strong = weak.get(); + if (!strong) { + return; + } + Core::App().hideMediaView(); + const auto &list = strong->session().data().chatsFilters().list(); + const auto it = ranges::find(list, filterId, &Data::ChatFilter::id); + if (it == end(list)) { + strong->showToast(u"Filter not found :shrug:"_q); + return; + } + ProcessFilterInvite( + weak, + slug, + filterId, + it->title(), + it->iconEmoji(), + std::move(peers), + std::move(already)); +} + +} // namespace void SaveNewFilterPinned( not_null session, FilterId filterId) { - const auto &order = session->data().pinnedChatsOrder( - nullptr, - filterId); + const auto &order = session->data().pinnedChatsOrder(filterId); auto &filters = session->data().chatsFilters(); - const auto &filter = filters.applyUpdatedPinned( - filterId, - order); + const auto &filter = filters.applyUpdatedPinned(filterId, order); if (filter.isLocal()) { filters.saveLocal(); Kotato::JsonSettings::Write(); @@ -35,7 +682,176 @@ void SaveNewFilterPinned( filter.tl() )).send(); } +} +void CheckFilterInvite( + not_null controller, + const QString &slug) { + const auto session = &controller->session(); + const auto weak = base::make_weak(controller); + session->api().checkFilterInvite(slug, [=]( + const MTPchatlists_ChatlistInvite &result) { + const auto strong = weak.get(); + if (!strong) { + return; + } + auto title = QString(); + auto iconEmoji = QString(); + auto filterId = FilterId(); + auto peers = std::vector>(); + auto already = std::vector>(); + auto &owner = strong->session().data(); + result.match([&](const auto &data) { + owner.processUsers(data.vusers()); + owner.processChats(data.vchats()); + }); + const auto parseList = [&](const MTPVector &list) { + auto result = std::vector>(); + result.reserve(list.v.size()); + for (const auto &peer : list.v) { + result.push_back(owner.peer(peerFromMTP(peer))); + } + return result; + }; + result.match([&](const MTPDchatlists_chatlistInvite &data) { + title = qs(data.vtitle()); + iconEmoji = data.vemoticon().value_or_empty(); + peers = parseList(data.vpeers()); + }, [&](const MTPDchatlists_chatlistInviteAlready &data) { + filterId = data.vfilter_id().v; + peers = parseList(data.vmissing_peers()); + already = parseList(data.valready_peers()); + }); + + const auto notLoaded = filterId + && !ranges::contains( + owner.chatsFilters().list(), + filterId, + &Data::ChatFilter::id); + if (notLoaded) { + const auto lifetime = std::make_shared(); + owner.chatsFilters().changed( + ) | rpl::start_with_next([=] { + lifetime->destroy(); + ProcessFilterInvite( + weak, + slug, + filterId, + std::move(peers), + std::move(already)); + }, *lifetime); + owner.chatsFilters().reload(); + } else if (filterId) { + ProcessFilterInvite( + weak, + slug, + filterId, + std::move(peers), + std::move(already)); + } else { + ProcessFilterInvite( + weak, + slug, + filterId, + title, + iconEmoji, + std::move(peers), + std::move(already)); + } + }, [=](const MTP::Error &error) { + if (error.code() != 400) { + return; + } + ProcessFilterInvite(weak, slug, {}, {}, {}, {}, {}); + }); +} + +void ProcessFilterUpdate( + base::weak_ptr weak, + FilterId filterId, + std::vector> missing) { + if (const auto strong = missing.empty() ? weak.get() : nullptr) { + strong->session().data().chatsFilters().moreChatsHide(filterId); + return; + } + ProcessFilterInvite(weak, QString(), filterId, std::move(missing), {}); +} + +void ProcessFilterRemove( + base::weak_ptr weak, + const QString &title, + const QString &iconEmoji, + std::vector> all, + std::vector> suggest, + Fn>)> done) { + const auto strong = weak.get(); + if (!strong) { + return; + } + Core::App().hideMediaView(); + if (all.empty() && suggest.empty()) { + done({}); + return; + } + auto controller = std::make_unique( + strong, + ToggleAction::Removing, + title, + std::move(suggest), + std::move(all)); + const auto raw = controller.get(); + auto initBox = [=](not_null box) { + box->setStyle(st::filterInviteBox); + + const auto type = Ui::FilterLinkHeaderType::Removing; + auto badge = raw->selectedValue( + ) | rpl::map([=](const base::flat_set> &peers) { + return int(peers.size()); + }); + InitFilterLinkHeader(box, [=](int min, int max, int addedTop) { + raw->adjust(min, max, addedTop); + }, type, title, iconEmoji, rpl::single(0)); + + auto owned = Ui::FilterLinkProcessButton( + box, + type, + title, + std::move(badge)); + + const auto button = owned.data(); + box->widthValue( + ) | rpl::start_with_next([=](int width) { + const auto &padding = st::filterInviteBox.buttonPadding; + button->resizeToWidth(width + - padding.left() + - padding.right()); + button->moveToLeft(padding.left(), padding.top()); + }, button->lifetime()); + + box->addButton(std::move(owned)); + + raw->selectedValue( + ) | rpl::start_with_next([=]( + base::flat_set> &&peers) { + button->setClickedCallback([=] { + done(peers | ranges::to_vector); + box->closeBox(); + }); + }, box->lifetime()); + }; + strong->show( + Box(std::move(controller), std::move(initBox))); +} + +[[nodiscard]] std::vector> ExtractSuggestRemoving( + const Data::ChatFilter &filter) { + if (!filter.chatlist()) { + return {}; + } + return filter.always() | ranges::views::filter([]( + not_null history) { + return history->peer->isChannel(); + }) | ranges::views::transform(&History::peer) | ranges::to_vector; } } // namespace Api diff --git a/Telegram/SourceFiles/api/api_chat_filters.h b/Telegram/SourceFiles/api/api_chat_filters.h index 59c29f72b..9167a41db 100644 --- a/Telegram/SourceFiles/api/api_chat_filters.h +++ b/Telegram/SourceFiles/api/api_chat_filters.h @@ -11,10 +11,38 @@ namespace Main { class Session; } // namespace Main +namespace Window { +class SessionController; +} // namespace Window + +namespace Data { +class ChatFilter; +} // namespace Data + namespace Api { void SaveNewFilterPinned( not_null session, FilterId filterId); +void CheckFilterInvite( + not_null controller, + const QString &slug); + +void ProcessFilterUpdate( + base::weak_ptr weak, + FilterId filterId, + std::vector> missing); + +void ProcessFilterRemove( + base::weak_ptr weak, + const QString &title, + const QString &iconEmoji, + std::vector> all, + std::vector> suggest, + Fn>)> done); + +[[nodiscard]] std::vector> ExtractSuggestRemoving( + const Data::ChatFilter &filter); + } // namespace Api diff --git a/Telegram/SourceFiles/api/api_chat_invite.cpp b/Telegram/SourceFiles/api/api_chat_invite.cpp index 26839c1bc..dd06d2abc 100644 --- a/Telegram/SourceFiles/api/api_chat_invite.cpp +++ b/Telegram/SourceFiles/api/api_chat_invite.cpp @@ -9,41 +9,127 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "apiwrap.h" #include "window/window_session_controller.h" +#include "info/profile/info_profile_badge.h" +#include "lang/lang_keys.h" #include "main/main_session.h" #include "ui/empty_userpic.h" +#include "ui/painter.h" #include "core/application.h" #include "data/data_session.h" #include "data/data_photo.h" #include "data/data_photo_media.h" #include "data/data_channel.h" +#include "data/data_forum.h" #include "data/data_user.h" #include "data/data_file_origin.h" #include "ui/boxes/confirm_box.h" -#include "boxes/abstract_box.h" +#include "ui/toast/toast.h" +#include "boxes/premium_limits_box.h" #include "styles/style_boxes.h" +#include "styles/style_info.h" #include "styles/style_layers.h" namespace Api { +namespace { + +void SubmitChatInvite( + base::weak_ptr weak, + not_null session, + const QString &hash, + bool isGroup) { + session->api().request(MTPmessages_ImportChatInvite( + MTP_string(hash) + )).done([=](const MTPUpdates &result) { + session->api().applyUpdates(result); + const auto strongController = weak.get(); + if (!strongController) { + return; + } + + strongController->hideLayer(); + const auto handleChats = [&](const MTPVector &chats) { + if (chats.v.isEmpty()) { + return; + } + const auto peerId = chats.v[0].match([](const MTPDchat &data) { + return peerFromChat(data.vid().v); + }, [](const MTPDchannel &data) { + return peerFromChannel(data.vid().v); + }, [](auto&&) { + return PeerId(0); + }); + if (const auto peer = session->data().peerLoaded(peerId)) { + // Shows in the primary window anyway. + strongController->showPeerHistory( + peer, + Window::SectionShow::Way::Forward); + } + }; + result.match([&](const MTPDupdates &data) { + handleChats(data.vchats()); + }, [&](const MTPDupdatesCombined &data) { + handleChats(data.vchats()); + }, [&](auto &&) { + LOG(("API Error: unexpected update cons %1 " + "(ApiWrap::importChatInvite)").arg(result.type())); + }); + }).fail([=](const MTP::Error &error) { + const auto &type = error.type(); + + const auto strongController = weak.get(); + if (!strongController) { + return; + } else if (type == u"CHANNELS_TOO_MUCH"_q) { + strongController->show( + Box(ChannelsLimitBox, &strongController->session())); + return; + } + + strongController->hideLayer(); + strongController->showToast([&] { + if (type == u"INVITE_REQUEST_SENT"_q) { + return isGroup + ? tr::lng_group_request_sent(tr::now) + : tr::lng_group_request_sent_channel(tr::now); + } else if (type == u"USERS_TOO_MUCH"_q) { + return tr::lng_group_invite_no_room(tr::now); + } else { + return tr::lng_group_invite_bad_link(tr::now); + } + }(), ApiWrap::kJoinErrorDuration); + }).send(); +} + +} // namespace + void CheckChatInvite( not_null controller, const QString &hash, ChannelData *invitePeekChannel) { const auto session = &controller->session(); - const auto weak = base::make_weak(controller.get()); + const auto weak = base::make_weak(controller); session->api().checkChatInvite(hash, [=](const MTPChatInvite &result) { + const auto strong = weak.get(); + if (!strong) { + return; + } Core::App().hideMediaView(); - result.match([=](const MTPDchatInvite &data) { - const auto strongController = weak.get(); - if (!strongController) { - return; + const auto show = [&](not_null chat) { + const auto way = Window::SectionShow::Way::Forward; + if (const auto forum = chat->forum()) { + strong->showForum(forum, way); + } else { + strong->showPeerHistory(chat, way); } + }; + result.match([=](const MTPDchatInvite &data) { const auto isGroup = !data.is_broadcast(); - const auto box = strongController->show(Box( + const auto box = strong->show(Box( session, data, invitePeekChannel, - [=] { session->api().importChatInvite(hash, isGroup); })); + [=] { SubmitChatInvite(weak, session, hash, isGroup); })); if (invitePeekChannel) { box->boxClosing( ) | rpl::filter([=] { @@ -62,21 +148,13 @@ void CheckChatInvite( if (const auto channel = chat->asChannel()) { channel->clearInvitePeek(); } - if (const auto strong = weak.get()) { - strong->showPeerHistory( - chat, - Window::SectionShow::Way::Forward); - } + show(chat); } }, [=](const MTPDchatInvitePeek &data) { if (const auto chat = session->data().processChat(data.vchat())) { if (const auto channel = chat->asChannel()) { channel->setInvitePeek(hash, data.vexpires().v); - if (const auto strong = weak.get()) { - strong->showPeerHistory( - chat, - Window::SectionShow::Way::Forward); - } + show(chat); } } }); @@ -86,31 +164,53 @@ void CheckChatInvite( } Core::App().hideMediaView(); if (const auto strong = weak.get()) { - strong->show( - Box(tr::lng_group_invite_bad_link(tr::now))); + strong->show(Ui::MakeInformBox(tr::lng_group_invite_bad_link())); } }); } } // namespace Api +struct ConfirmInviteBox::Participant { + not_null user; + Ui::PeerUserpicView userpic; +}; + ConfirmInviteBox::ConfirmInviteBox( QWidget*, not_null session, const MTPDchatInvite &data, ChannelData *invitePeekChannel, Fn submit) +: ConfirmInviteBox( + session, + Parse(session, data), + invitePeekChannel, + std::move(submit)) { +} + +ConfirmInviteBox::ConfirmInviteBox( + not_null session, + ChatInvite &&invite, + ChannelData *invitePeekChannel, + Fn submit) : _session(session) , _submit(std::move(submit)) , _title(this, st::confirmInviteTitle) +, _badge(std::make_unique( + this, + st::infoPeerBadge, + _session, + rpl::single(Info::Profile::Badge::Content{ BadgeForInvite(invite) }), + nullptr, + [=] { return false; })) , _status(this, st::confirmInviteStatus) , _about(this, st::confirmInviteAbout) , _aboutRequests(this, st::confirmInviteStatus) -, _participants(GetParticipants(_session, data)) -, _isChannel(data.is_channel() && !data.is_megagroup()) -, _requestApprove(data.is_request_needed()) { - const auto title = qs(data.vtitle()); - const auto count = data.vparticipants_count().v; +, _participants(std::move(invite.participants)) +, _isChannel(invite.isChannel && !invite.isMegagroup) +, _requestApprove(invite.isRequestNeeded) { + const auto count = invite.participantsCount; const auto status = [&] { return invitePeekChannel ? tr::lng_channel_invite_private(tr::now) @@ -127,10 +227,10 @@ ConfirmInviteBox::ConfirmInviteBox( ? tr::lng_channel_status(tr::now) : tr::lng_group_status(tr::now); }(); - _title->setText(title); + _title->setText(invite.title); _status->setText(status); - if (const auto v = qs(data.vabout().value_or_empty()); !v.isEmpty()) { - _about->setText(v); + if (!invite.about.isEmpty()) { + _about->setText(invite.about); } else { _about.destroy(); } @@ -142,9 +242,8 @@ ConfirmInviteBox::ConfirmInviteBox( _aboutRequests.destroy(); } - const auto photo = _session->data().processPhoto(data.vphoto()); - if (!photo->isNull()) { - _photo = photo->createMediaView(); + if (invite.photo) { + _photo = invite.photo->createMediaView(); _photo->wanted(Data::PhotoSize::Small, Data::FileOrigin()); if (!_photo->image(Data::PhotoSize::Small)) { _session->downloaderTaskFinished( @@ -154,30 +253,53 @@ ConfirmInviteBox::ConfirmInviteBox( } } else { _photoEmpty = std::make_unique( - Data::PeerUserpicColor(0), - title); + Ui::EmptyUserpic::UserpicColor(0), + invite.title); } } ConfirmInviteBox::~ConfirmInviteBox() = default; -auto ConfirmInviteBox::GetParticipants( - not_null session, - const MTPDchatInvite &data) --> std::vector { - const auto participants = data.vparticipants(); - if (!participants) { - return {}; - } - const auto &v = participants->v; - auto result = std::vector(); - result.reserve(v.size()); - for (const auto &participant : v) { - if (const auto user = session->data().processUser(participant)) { - result.push_back(Participant{ user }); +ConfirmInviteBox::ChatInvite ConfirmInviteBox::Parse( + not_null session, + const MTPDchatInvite &data) { + auto participants = std::vector(); + if (const auto list = data.vparticipants()) { + participants.reserve(list->v.size()); + for (const auto &participant : list->v) { + if (const auto user = session->data().processUser(participant)) { + participants.push_back(Participant{ user }); + } } } - return result; + const auto photo = session->data().processPhoto(data.vphoto()); + return { + .title = qs(data.vtitle()), + .about = data.vabout().value_or_empty(), + .photo = (photo->isNull() ? nullptr : photo.get()), + .participantsCount = data.vparticipants_count().v, + .participants = std::move(participants), + .isPublic = data.is_public(), + .isChannel = data.is_channel(), + .isMegagroup = data.is_megagroup(), + .isBroadcast = data.is_broadcast(), + .isRequestNeeded = data.is_request_needed(), + .isFake = data.is_fake(), + .isScam = data.is_scam(), + .isVerified = data.is_verified(), + }; +} + +[[nodiscard]] Info::Profile::BadgeType ConfirmInviteBox::BadgeForInvite( + const ChatInvite &invite) { + using Type = Info::Profile::BadgeType; + return invite.isVerified + ? Type::Verified + : invite.isScam + ? Type::Scam + : invite.isFake + ? Type::Fake + : Type::None; } void ConfirmInviteBox::prepare() { @@ -205,7 +327,7 @@ void ConfirmInviteBox::prepare() { auto name = new Ui::FlatLabel(this, st::confirmInviteUserName); name->resizeToWidth(st::confirmInviteUserPhotoSize + padding); name->setText(participant.user->firstName.isEmpty() - ? participant.user->name + ? participant.user->name() : participant.user->firstName); name->moveToLeft(left + (padding / 2), st::confirmInviteUserNameTop); left += _userWidth; @@ -228,8 +350,26 @@ void ConfirmInviteBox::prepare() { void ConfirmInviteBox::resizeEvent(QResizeEvent *e) { BoxContent::resizeEvent(e); - _title->move((width() - _title->width()) / 2, st::confirmInviteTitleTop); - _status->move((width() - _status->width()) / 2, st::confirmInviteStatusTop); + + const auto padding = st::boxRowPadding; + auto nameWidth = width() - padding.left() - padding.right(); + auto badgeWidth = 0; + if (const auto widget = _badge->widget()) { + badgeWidth = st::infoVerifiedCheckPosition.x() + widget->width(); + nameWidth -= badgeWidth; + } + _title->resizeToWidth(std::min(nameWidth, _title->textMaxWidth())); + _title->moveToLeft( + (width() - _title->width() - badgeWidth) / 2, + st::confirmInviteTitleTop); + const auto badgeLeft = _title->x() + _title->width(); + const auto badgeTop = _title->y(); + const auto badgeBottom = _title->y() + _title->height(); + _badge->move(badgeLeft, badgeTop, badgeBottom); + + _status->move( + (width() - _status->width()) / 2, + st::confirmInviteStatusTop); auto bottom = _status->y() + _status->height() + st::boxPadding.bottom() @@ -252,18 +392,16 @@ void ConfirmInviteBox::paintEvent(QPaintEvent *e) { if (_photo) { if (const auto image = _photo->image(Data::PhotoSize::Small)) { - auto source = [=] { - const auto size = st::confirmInvitePhotoSize; - const auto roundOption = KotatoImageRoundOption(); - return image->pix(size, size, { .options = roundOption }); - }(); + const auto size = st::confirmInvitePhotoSize; p.drawPixmap( - (width() - st::confirmInvitePhotoSize) / 2, + (width() - size) / 2, st::confirmInvitePhotoTop, - source); + image->pix( + { size, size }, + { .options = Images::Option::RoundCircle })); } } else if (_photoEmpty) { - _photoEmpty->paint( + _photoEmpty->paintCircle( p, (width() - st::confirmInvitePhotoSize) / 2, st::confirmInvitePhotoTop, diff --git a/Telegram/SourceFiles/api/api_chat_invite.h b/Telegram/SourceFiles/api/api_chat_invite.h index fc64471e4..c8d99548c 100644 --- a/Telegram/SourceFiles/api/api_chat_invite.h +++ b/Telegram/SourceFiles/api/api_chat_invite.h @@ -12,6 +12,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL class UserData; class ChannelData; +namespace Info::Profile { +class Badge; +enum class BadgeType; +} // namespace Info::Profile + namespace Main { class Session; } // namespace Main @@ -21,7 +26,6 @@ class SessionController; } // namespace Window namespace Data { -class CloudImageView; class PhotoMedia; } // namespace Data @@ -55,24 +59,46 @@ protected: void paintEvent(QPaintEvent *e) override; private: - struct Participant { - not_null user; - std::shared_ptr userpic; + struct Participant; + struct ChatInvite { + QString title; + QString about; + PhotoData *photo = nullptr; + int participantsCount = 0; + std::vector participants; + bool isPublic = false; + bool isChannel = false; + bool isMegagroup = false; + bool isBroadcast = false; + bool isRequestNeeded = false; + bool isFake = false; + bool isScam = false; + bool isVerified = false; }; - static std::vector GetParticipants( + [[nodiscard]] static ChatInvite Parse( not_null session, const MTPDchatInvite &data); + [[nodiscard]] Info::Profile::BadgeType BadgeForInvite( + const ChatInvite &invite); + + ConfirmInviteBox( + not_null session, + ChatInvite &&invite, + ChannelData *invitePeekChannel, + Fn submit); const not_null _session; Fn _submit; object_ptr _title; + std::unique_ptr _badge; object_ptr _status; object_ptr _about; object_ptr _aboutRequests; std::shared_ptr _photo; std::unique_ptr _photoEmpty; std::vector _participants; + bool _isChannel = false; bool _requestApprove = false; diff --git a/Telegram/SourceFiles/api/api_chat_participants.cpp b/Telegram/SourceFiles/api/api_chat_participants.cpp index c1fbc1797..1714d9e2b 100644 --- a/Telegram/SourceFiles/api/api_chat_participants.cpp +++ b/Telegram/SourceFiles/api/api_chat_participants.cpp @@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "apiwrap.h" #include "boxes/add_contact_box.h" // ShowAddParticipantsError +#include "boxes/peers/add_participants_box.h" // ChatInviteForbidden #include "data/data_changes.h" #include "data/data_channel.h" #include "data/data_channel_admins.h" @@ -210,6 +211,29 @@ void ApplyBotsList( Data::PeerUpdate::Flag::FullInfo); } +[[nodiscard]] ChatParticipants::Channels ParseSimilar( + not_null channel, + const MTPmessages_Chats &chats) { + auto result = ChatParticipants::Channels(); + std::vector>(); + chats.match([&](const auto &data) { + const auto &list = data.vchats().v; + result.list.reserve(list.size()); + for (const auto &chat : list) { + const auto peer = channel->owner().processChat(chat); + if (const auto channel = peer->asChannel()) { + result.list.push_back(channel); + } + } + if constexpr (MTPDmessages_chatsSlice::Is()) { + if (channel->session().premiumPossible()) { + result.more = data.vcount().v - data.vchats().v.size(); + } + } + }); + return result; +} + } // namespace ChatParticipant::ChatParticipant( @@ -365,6 +389,7 @@ void ChatParticipants::requestForAdd( void ChatParticipants::requestLast(not_null channel) { if (!channel->isMegagroup() + || !channel->canViewMembers() || _participantsRequests.contains(channel)) { return; } @@ -437,6 +462,7 @@ void ChatParticipants::requestAdmins(not_null channel) { MTP_int(channel->session().serverConfig().chatSizeMax), MTP_long(participantsHash) )).done([=](const MTPchannels_ChannelParticipants &result) { + channel->mgInfo->adminsLoaded = true; _adminsRequests.remove(channel); result.match([&](const MTPDchannels_channelParticipants &data) { channel->owner().processUsers(data.vusers()); @@ -446,6 +472,7 @@ void ChatParticipants::requestAdmins(not_null channel) { "channels.channelParticipantsNotModified received!")); }); }).fail([=] { + channel->mgInfo->adminsLoaded = true; _adminsRequests.remove(channel); }).send(); @@ -462,25 +489,28 @@ void ChatParticipants::requestCountDelayed( void ChatParticipants::add( not_null peer, const std::vector> &users, + std::shared_ptr show, + bool passGroupHistory, Fn done) { if (const auto chat = peer->asChat()) { for (const auto &user : users) { _api.request(MTPmessages_AddChatUser( chat->inputChat, user->inputUser, - MTP_int(kForwardMessagesOnAdd) + MTP_int(passGroupHistory ? kForwardMessagesOnAdd : 0) )).done([=](const MTPUpdates &result) { chat->session().api().applyUpdates(result); if (done) done(true); }).fail([=](const MTP::Error &error) { - ShowAddParticipantsError(error.type(), peer, { 1, user }); + const auto type = error.type(); + ShowAddParticipantsError(type, peer, { 1, user }, show); if (done) done(false); }).afterDelay(kSmallDelayMs).send(); } } else if (const auto channel = peer->asChannel()) { const auto hasBot = ranges::any_of(users, &UserData::isBot); if (!peer->isMegagroup() && hasBot) { - ShowAddParticipantsError("USER_BOT", peer, users); + ShowAddParticipantsError("USER_BOT", peer, users, show); return; } auto list = QVector(); @@ -494,8 +524,12 @@ void ChatParticipants::add( channel->session().api().applyUpdates(result); requestCountDelayed(channel); if (callback) callback(true); + ChatInviteForbidden( + show, + channel, + CollectForbiddenUsers(&channel->session(), result)); }).fail([=](const MTP::Error &error) { - ShowAddParticipantsError(error.type(), peer, users); + ShowAddParticipantsError(error.type(), peer, users, show); if (callback) callback(false); }).afterDelay(kSmallDelayMs).send(); }; @@ -531,6 +565,7 @@ ChatParticipants::Parsed ChatParticipants::ParseRecent( const TLMembers &data) { const auto result = Parse(channel, data); const auto applyLast = channel->isMegagroup() + && channel->canViewMembers() && (channel->mgInfo->lastParticipants.size() <= result.list.size()); if (applyLast) { ApplyLastList(channel, result.availableCount, result.list); @@ -597,7 +632,7 @@ void ChatParticipants::requestSelf(not_null channel) { }); }).fail([=](const MTP::Error &error) { _selfParticipantRequests.erase(channel); - if (error.type() == qstr("CHANNEL_PRIVATE")) { + if (error.type() == u"CHANNEL_PRIVATE"_q) { channel->privateErrorReceived(); } finalize(); @@ -673,4 +708,50 @@ void ChatParticipants::unblock( _kickRequests.emplace(kick, requestId); } +void ChatParticipants::loadSimilarChannels(not_null channel) { + if (!channel->isBroadcast()) { + return; + } else if (const auto i = _similar.find(channel); i != end(_similar)) { + if (i->second.requestId + || !i->second.channels.more + || !channel->session().premium()) { + return; + } + } + _similar[channel].requestId = _api.request( + MTPchannels_GetChannelRecommendations(channel->inputChannel) + ).done([=](const MTPmessages_Chats &result) { + auto &similar = _similar[channel]; + similar.requestId = 0; + auto parsed = ParseSimilar(channel, result); + if (similar.channels == parsed) { + return; + } + similar.channels = std::move(parsed); + if (const auto history = channel->owner().historyLoaded(channel)) { + if (const auto item = history->joinedMessageInstance()) { + history->owner().requestItemResize(item); + } + } + _similarLoaded.fire_copy(channel); + }).send(); +} + +auto ChatParticipants::similar(not_null channel) +-> const Channels & { + const auto i = channel->isBroadcast() + ? _similar.find(channel) + : end(_similar); + if (i != end(_similar)) { + return i->second.channels; + } + static const auto empty = Channels(); + return empty; +} + +auto ChatParticipants::similarLoaded() const +-> rpl::producer> { + return _similarLoaded.events(); +} + } // namespace Api diff --git a/Telegram/SourceFiles/api/api_chat_participants.h b/Telegram/SourceFiles/api/api_chat_participants.h index 70e5eafa5..816cc6526 100644 --- a/Telegram/SourceFiles/api/api_chat_participants.h +++ b/Telegram/SourceFiles/api/api_chat_participants.h @@ -14,6 +14,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL class ApiWrap; class ChannelData; +namespace Ui { +class Show; +} // namespace Ui + namespace Api { class ChatParticipant final { @@ -95,6 +99,8 @@ public: void add( not_null peer, const std::vector> &users, + std::shared_ptr show = nullptr, + bool passGroupHistory = true, Fn done = nullptr); void requestSelf(not_null channel); @@ -114,7 +120,26 @@ public: not_null channel, not_null participant); + void loadSimilarChannels(not_null channel); + + struct Channels { + std::vector> list; + int more = 0; + + friend inline bool operator==( + const Channels &, + const Channels &) = default; + }; + [[nodiscard]] const Channels &similar(not_null channel); + [[nodiscard]] auto similarLoaded() const + -> rpl::producer>; + private: + struct SimilarChannels { + Channels channels; + mtpRequestId requestId = 0; + }; + MTP::Sender _api; using PeerRequests = base::flat_map; @@ -137,6 +162,9 @@ private: not_null>; base::flat_map _kickRequests; + base::flat_map, SimilarChannels> _similar; + rpl::event_stream> _similarLoaded; + }; } // namespace Api diff --git a/Telegram/SourceFiles/api/api_cloud_password.cpp b/Telegram/SourceFiles/api/api_cloud_password.cpp index 03ca032ad..c5ab29daa 100644 --- a/Telegram/SourceFiles/api/api_cloud_password.cpp +++ b/Telegram/SourceFiles/api/api_cloud_password.cpp @@ -7,18 +7,37 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "api/api_cloud_password.h" +#include "apiwrap.h" #include "base/random.h" #include "core/core_cloud_password.h" -#include "apiwrap.h" +#include "passport/passport_encryption.h" namespace Api { +namespace { -// #TODO Add ability to set recovery email separately. +[[nodiscard]] Core::CloudPasswordState ProcessMtpState( + const MTPaccount_password &state) { + return state.match([&](const MTPDaccount_password &data) { + base::RandomAddSeed(bytes::make_span(data.vsecure_random().v)); + return Core::ParseCloudPasswordState(data); + }); +} + +} // namespace CloudPassword::CloudPassword(not_null api) : _api(&api->instance()) { } +void CloudPassword::apply(Core::CloudPasswordState state) { + if (_state) { + *_state = std::move(state); + } else { + _state = std::make_unique(std::move(state)); + } + _stateChanges.fire_copy(*_state); +} + void CloudPassword::reload() { if (_requestId) { return; @@ -26,16 +45,7 @@ void CloudPassword::reload() { _requestId = _api.request(MTPaccount_GetPassword( )).done([=](const MTPaccount_Password &result) { _requestId = 0; - result.match([&](const MTPDaccount_password &data) { - base::RandomAddSeed(bytes::make_span(data.vsecure_random().v)); - if (_state) { - *_state = Core::ParseCloudPasswordState(data); - } else { - _state = std::make_unique( - Core::ParseCloudPasswordState(data)); - } - _stateChanges.fire_copy(*_state); - }); + apply(ProcessMtpState(result)); }).fail([=] { _requestId = 0; }).send(); @@ -109,4 +119,426 @@ auto CloudPassword::cancelResetPassword() }; } +rpl::producer CloudPassword::set( + const QString &oldPassword, + const QString &newPassword, + const QString &hint, + bool hasRecoveryEmail, + const QString &recoveryEmail) { + + const auto generatePasswordCheck = [=]( + const Core::CloudPasswordState &latestState) { + if (oldPassword.isEmpty() || !latestState.hasPassword) { + return Core::CloudPasswordResult{ + MTP_inputCheckPasswordEmpty() + }; + } + const auto hash = Core::ComputeCloudPasswordHash( + latestState.mtp.request.algo, + bytes::make_span(oldPassword.toUtf8())); + return Core::ComputeCloudPasswordCheck( + latestState.mtp.request, + hash); + }; + + const auto finish = [=](auto consumer, int unconfirmedEmailLengthCode) { + _api.request(MTPaccount_GetPassword( + )).done([=](const MTPaccount_Password &result) { + apply(ProcessMtpState(result)); + if (unconfirmedEmailLengthCode) { + consumer.put_next(SetOk{ unconfirmedEmailLengthCode }); + } else { + consumer.put_done(); + } + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).handleFloodErrors().send(); + }; + + const auto sendMTPaccountUpdatePasswordSettings = [=]( + const Core::CloudPasswordState &latestState, + const QByteArray &secureSecret, + auto consumer) { + const auto newPasswordBytes = newPassword.toUtf8(); + const auto newPasswordHash = Core::ComputeCloudPasswordDigest( + latestState.mtp.newPassword, + bytes::make_span(newPasswordBytes)); + if (!newPassword.isEmpty() && newPasswordHash.modpow.empty()) { + consumer.put_error("INTERNAL_SERVER_ERROR"); + return; + } + using Flag = MTPDaccount_passwordInputSettings::Flag; + const auto flags = Flag::f_new_algo + | Flag::f_new_password_hash + | Flag::f_hint + | (secureSecret.isEmpty() ? Flag(0) : Flag::f_new_secure_settings) + | ((!hasRecoveryEmail) ? Flag(0) : Flag::f_email); + + auto newSecureSecret = bytes::vector(); + auto newSecureSecretId = 0ULL; + if (!secureSecret.isEmpty()) { + newSecureSecretId = Passport::CountSecureSecretId( + bytes::make_span(secureSecret)); + newSecureSecret = Passport::EncryptSecureSecret( + bytes::make_span(secureSecret), + Core::ComputeSecureSecretHash( + latestState.mtp.newSecureSecret, + bytes::make_span(newPasswordBytes))); + } + const auto settings = MTP_account_passwordInputSettings( + MTP_flags(flags), + Core::PrepareCloudPasswordAlgo(newPassword.isEmpty() + ? v::null + : latestState.mtp.newPassword), + newPassword.isEmpty() + ? MTP_bytes() + : MTP_bytes(newPasswordHash.modpow), + MTP_string(hint), + MTP_string(recoveryEmail), + MTP_secureSecretSettings( + Core::PrepareSecureSecretAlgo( + latestState.mtp.newSecureSecret), + MTP_bytes(newSecureSecret), + MTP_long(newSecureSecretId))); + _api.request(MTPaccount_UpdatePasswordSettings( + generatePasswordCheck(latestState).result, + settings + )).done([=] { + finish(consumer, 0); + }).fail([=](const MTP::Error &error) { + const auto &type = error.type(); + const auto prefix = u"EMAIL_UNCONFIRMED_"_q; + if (type.startsWith(prefix)) { + const auto codeLength = base::StringViewMid( + type, + prefix.size()).toInt(); + + finish(consumer, codeLength); + } else { + consumer.put_error_copy(type); + } + }).handleFloodErrors().send(); + }; + + return [=](auto consumer) { + _api.request(MTPaccount_GetPassword( + )).done([=](const MTPaccount_Password &result) { + const auto latestState = ProcessMtpState(result); + + if (latestState.hasPassword + && !oldPassword.isEmpty() + && !newPassword.isEmpty()) { + + _api.request(MTPaccount_GetPasswordSettings( + generatePasswordCheck(latestState).result + )).done([=](const MTPaccount_PasswordSettings &result) { + using Settings = MTPDaccount_passwordSettings; + const auto &data = result.match([&]( + const Settings &data) -> const Settings & { + return data; + }); + auto secureSecret = QByteArray(); + if (const auto wrapped = data.vsecure_settings()) { + using Secure = MTPDsecureSecretSettings; + const auto &settings = wrapped->match([]( + const Secure &data) -> const Secure & { + return data; + }); + const auto passwordUtf = oldPassword.toUtf8(); + const auto secret = Passport::DecryptSecureSecret( + bytes::make_span(settings.vsecure_secret().v), + Core::ComputeSecureSecretHash( + Core::ParseSecureSecretAlgo( + settings.vsecure_algo()), + bytes::make_span(passwordUtf))); + if (secret.empty()) { + LOG(("API Error: " + "Failed to decrypt secure secret.")); + consumer.put_error("SUGGEST_SECRET_RESET"); + return; + } else if (Passport::CountSecureSecretId(secret) + != settings.vsecure_secret_id().v) { + LOG(("API Error: Wrong secure secret id.")); + consumer.put_error("SUGGEST_SECRET_RESET"); + return; + } else { + secureSecret = QByteArray( + reinterpret_cast(secret.data()), + secret.size()); + } + } + _api.request(MTPaccount_GetPassword( + )).done([=](const MTPaccount_Password &result) { + const auto latestState = ProcessMtpState(result); + sendMTPaccountUpdatePasswordSettings( + latestState, + secureSecret, + consumer); + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).send(); + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).send(); + } else { + sendMTPaccountUpdatePasswordSettings( + latestState, + QByteArray(), + consumer); + } + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).send(); + return rpl::lifetime(); + }; +} + +rpl::producer CloudPassword::check( + const QString &password) { + return [=](auto consumer) { + _api.request(MTPaccount_GetPassword( + )).done([=](const MTPaccount_Password &result) { + const auto latestState = ProcessMtpState(result); + const auto input = [&] { + if (password.isEmpty()) { + return Core::CloudPasswordResult{ + MTP_inputCheckPasswordEmpty() + }; + } + const auto hash = Core::ComputeCloudPasswordHash( + latestState.mtp.request.algo, + bytes::make_span(password.toUtf8())); + return Core::ComputeCloudPasswordCheck( + latestState.mtp.request, + hash); + }(); + + _api.request(MTPaccount_GetPasswordSettings( + input.result + )).done([=](const MTPaccount_PasswordSettings &result) { + consumer.put_done(); + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).send(); + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).send(); + + return rpl::lifetime(); + }; +} + +rpl::producer CloudPassword::confirmEmail( + const QString &code) { + return [=](auto consumer) { + _api.request(MTPaccount_ConfirmPasswordEmail( + MTP_string(code) + )).done([=] { + _api.request(MTPaccount_GetPassword( + )).done([=](const MTPaccount_Password &result) { + apply(ProcessMtpState(result)); + consumer.put_done(); + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).send(); + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).handleFloodErrors().send(); + + return rpl::lifetime(); + }; +} + +rpl::producer CloudPassword::resendEmailCode() { + return [=](auto consumer) { + _api.request(MTPaccount_ResendPasswordEmail( + )).done([=] { + _api.request(MTPaccount_GetPassword( + )).done([=](const MTPaccount_Password &result) { + apply(ProcessMtpState(result)); + consumer.put_done(); + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).send(); + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).handleFloodErrors().send(); + + return rpl::lifetime(); + }; +} + +rpl::producer CloudPassword::setEmail( + const QString &oldPassword, + const QString &recoveryEmail) { + const auto generatePasswordCheck = [=]( + const Core::CloudPasswordState &latestState) { + if (oldPassword.isEmpty() || !latestState.hasPassword) { + return Core::CloudPasswordResult{ + MTP_inputCheckPasswordEmpty() + }; + } + const auto hash = Core::ComputeCloudPasswordHash( + latestState.mtp.request.algo, + bytes::make_span(oldPassword.toUtf8())); + return Core::ComputeCloudPasswordCheck( + latestState.mtp.request, + hash); + }; + + const auto finish = [=](auto consumer, int unconfirmedEmailLengthCode) { + _api.request(MTPaccount_GetPassword( + )).done([=](const MTPaccount_Password &result) { + apply(ProcessMtpState(result)); + if (unconfirmedEmailLengthCode) { + consumer.put_next(SetOk{ unconfirmedEmailLengthCode }); + } else { + consumer.put_done(); + } + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).handleFloodErrors().send(); + }; + + const auto sendMTPaccountUpdatePasswordSettings = [=]( + const Core::CloudPasswordState &latestState, + auto consumer) { + const auto settings = MTP_account_passwordInputSettings( + MTP_flags(MTPDaccount_passwordInputSettings::Flag::f_email), + MTP_passwordKdfAlgoUnknown(), + MTP_bytes(), + MTP_string(), + MTP_string(recoveryEmail), + MTPSecureSecretSettings()); + _api.request(MTPaccount_UpdatePasswordSettings( + generatePasswordCheck(latestState).result, + settings + )).done([=] { + finish(consumer, 0); + }).fail([=](const MTP::Error &error) { + const auto &type = error.type(); + const auto prefix = u"EMAIL_UNCONFIRMED_"_q; + if (type.startsWith(prefix)) { + const auto codeLength = base::StringViewMid( + type, + prefix.size()).toInt(); + + finish(consumer, codeLength); + } else { + consumer.put_error_copy(type); + } + }).handleFloodErrors().send(); + }; + + return [=](auto consumer) { + _api.request(MTPaccount_GetPassword( + )).done([=](const MTPaccount_Password &result) { + const auto latestState = ProcessMtpState(result); + sendMTPaccountUpdatePasswordSettings(latestState, consumer); + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).send(); + return rpl::lifetime(); + }; +} + +rpl::producer CloudPassword::recoverPassword( + const QString &code, + const QString &newPassword, + const QString &newHint) { + + const auto finish = [=](auto consumer) { + _api.request(MTPaccount_GetPassword( + )).done([=](const MTPaccount_Password &result) { + apply(ProcessMtpState(result)); + consumer.put_done(); + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).handleFloodErrors().send(); + }; + + const auto sendMTPaccountUpdatePasswordSettings = [=]( + const Core::CloudPasswordState &latestState, + auto consumer) { + const auto newPasswordBytes = newPassword.toUtf8(); + const auto newPasswordHash = Core::ComputeCloudPasswordDigest( + latestState.mtp.newPassword, + bytes::make_span(newPasswordBytes)); + if (!newPassword.isEmpty() && newPasswordHash.modpow.empty()) { + consumer.put_error("INTERNAL_SERVER_ERROR"); + return; + } + using Flag = MTPDaccount_passwordInputSettings::Flag; + const auto flags = Flag::f_new_algo + | Flag::f_new_password_hash + | Flag::f_hint; + + const auto settings = MTP_account_passwordInputSettings( + MTP_flags(flags), + Core::PrepareCloudPasswordAlgo(newPassword.isEmpty() + ? v::null + : latestState.mtp.newPassword), + newPassword.isEmpty() + ? MTP_bytes() + : MTP_bytes(newPasswordHash.modpow), + MTP_string(newHint), + MTP_string(), + MTPSecureSecretSettings()); + + _api.request(MTPauth_RecoverPassword( + MTP_flags(newPassword.isEmpty() + ? MTPauth_RecoverPassword::Flags(0) + : MTPauth_RecoverPassword::Flag::f_new_settings), + MTP_string(code), + settings + )).done([=](const MTPauth_Authorization &result) { + finish(consumer); + }).fail([=](const MTP::Error &error) { + const auto &type = error.type(); + consumer.put_error_copy(type); + }).handleFloodErrors().send(); + }; + + return [=](auto consumer) { + _api.request(MTPaccount_GetPassword( + )).done([=](const MTPaccount_Password &result) { + const auto latestState = ProcessMtpState(result); + sendMTPaccountUpdatePasswordSettings(latestState, consumer); + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).send(); + return rpl::lifetime(); + }; +} + +rpl::producer CloudPassword::requestPasswordRecovery() { + return [=](auto consumer) { + _api.request(MTPauth_RequestPasswordRecovery( + )).done([=](const MTPauth_PasswordRecovery &result) { + result.match([&](const MTPDauth_passwordRecovery &data) { + consumer.put_next(qs(data.vemail_pattern().v)); + }); + consumer.put_done(); + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).send(); + return rpl::lifetime(); + }; +} + +auto CloudPassword::checkRecoveryEmailAddressCode(const QString &code) +-> rpl::producer { + return [=](auto consumer) { + _api.request(MTPauth_CheckRecoveryPassword( + MTP_string(code) + )).done([=] { + consumer.put_done(); + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).handleFloodErrors().send(); + + return rpl::lifetime(); + }; +} + } // namespace Api diff --git a/Telegram/SourceFiles/api/api_cloud_password.h b/Telegram/SourceFiles/api/api_cloud_password.h index 00adf3ddb..30bc37938 100644 --- a/Telegram/SourceFiles/api/api_cloud_password.h +++ b/Telegram/SourceFiles/api/api_cloud_password.h @@ -23,6 +23,10 @@ namespace Api { class CloudPassword final { public: + struct SetOk { + int unconfirmedEmailLengthCode = 0; + }; + using ResetRetryDate = int; explicit CloudPassword(not_null api); @@ -34,7 +38,31 @@ public: rpl::producer resetPassword(); rpl::producer cancelResetPassword(); + rpl::producer set( + const QString &oldPassword, + const QString &newPassword, + const QString &hint, + bool hasRecoveryEmail, + const QString &recoveryEmail); + rpl::producer check(const QString &password); + + rpl::producer confirmEmail(const QString &code); + rpl::producer resendEmailCode(); + rpl::producer setEmail( + const QString &oldPassword, + const QString &recoveryEmail); + + rpl::producer recoverPassword( + const QString &code, + const QString &newPassword, + const QString &newHint); + rpl::producer requestPasswordRecovery(); + rpl::producer checkRecoveryEmailAddressCode( + const QString &code); + private: + void apply(Core::CloudPasswordState state); + MTP::Sender _api; mtpRequestId _requestId = 0; std::unique_ptr _state; diff --git a/Telegram/SourceFiles/api/api_common.cpp b/Telegram/SourceFiles/api/api_common.cpp new file mode 100644 index 000000000..cfb1e7220 --- /dev/null +++ b/Telegram/SourceFiles/api/api_common.cpp @@ -0,0 +1,37 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "api/api_common.h" + +#include "base/qt/qt_key_modifiers.h" +#include "data/data_histories.h" +#include "data/data_thread.h" +#include "history/history.h" + +namespace Api { + +SendAction::SendAction( + not_null thread, + SendOptions options) +: history(thread->owningHistory()) +, options(options) +, replyTo({ .messageId = { history->peer->id, thread->topicRootId() } }) { + replyTo.topicRootId = replyTo.messageId.msg; +} + +SendOptions DefaultSendWhenOnlineOptions() { + return { + .scheduled = kScheduledUntilOnlineTimestamp, + .silent = base::IsCtrlPressed(), + }; +} + +MTPInputReplyTo SendAction::mtpReplyTo() const { + return Data::ReplyToForMTP(history, replyTo); +} + +} // namespace Api diff --git a/Telegram/SourceFiles/api/api_common.h b/Telegram/SourceFiles/api/api_common.h index e8cab1fdb..fe0d489b0 100644 --- a/Telegram/SourceFiles/api/api_common.h +++ b/Telegram/SourceFiles/api/api_common.h @@ -7,18 +7,28 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once +#include "data/data_drafts.h" + class History; +namespace Data { +class Thread; +} // namespace Data + namespace Api { +inline constexpr auto kScheduledUntilOnlineTimestamp = TimeId(0x7FFFFFFE); + struct SendOptions { PeerData *sendAs = nullptr; TimeId scheduled = 0; + BusinessShortcutId shortcutId = 0; bool silent = false; bool handleSupportSwitch = false; - bool removeWebPageId = false; - bool hideVia = false; + bool hideViaBot = false; + crl::time ttlSeconds = 0; }; +[[nodiscard]] SendOptions DefaultSendWhenOnlineOptions(); enum class SendType { Normal, @@ -28,18 +38,17 @@ enum class SendType { struct SendAction { explicit SendAction( - not_null history, - SendOptions options = SendOptions()) - : history(history) - , options(options) { - } + not_null thread, + SendOptions options = SendOptions()); not_null history; SendOptions options; - MsgId replyTo = 0; + FullReplyTo replyTo; bool clearDraft = true; bool generateLocal = true; MsgId replaceMediaOf = 0; + + [[nodiscard]] MTPInputReplyTo mtpReplyTo() const; }; struct MessageToSend { @@ -48,7 +57,7 @@ struct MessageToSend { SendAction action; TextWithTags textWithTags; - WebPageId webPageId = 0; + Data::WebPageDraft webPage; }; struct RemoteFileInfo { diff --git a/Telegram/SourceFiles/api/api_confirm_phone.cpp b/Telegram/SourceFiles/api/api_confirm_phone.cpp index 0db192021..0dd1ae9a7 100644 --- a/Telegram/SourceFiles/api/api_confirm_phone.cpp +++ b/Telegram/SourceFiles/api/api_confirm_phone.cpp @@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "apiwrap.h" #include "lang/lang_keys.h" +#include "main/main_account.h" #include "main/main_session.h" #include "ui/boxes/confirm_box.h" #include "ui/boxes/confirm_phone_box.h" @@ -30,26 +31,44 @@ void ConfirmPhone::resolve( } _sendRequestId = _api.request(MTPaccount_SendConfirmPhoneCode( MTP_string(hash), - MTP_codeSettings(MTP_flags(0), MTP_vector()) + MTP_codeSettings( + MTP_flags(0), + MTPVector(), + MTPstring(), + MTPBool()) )).done([=](const MTPauth_SentCode &result) { _sendRequestId = 0; result.match([&](const MTPDauth_sentCode &data) { + const auto bad = [](const char *type) { + LOG(("API Error: Should not be '%1'.").arg(type)); + return 0; + }; const auto sentCodeLength = data.vtype().match([&]( const MTPDauth_sentCodeTypeApp &data) { LOG(("Error: should not be in-app code!")); return 0; }, [&](const MTPDauth_sentCodeTypeSms &data) { return data.vlength().v; + }, [&](const MTPDauth_sentCodeTypeFragmentSms &data) { + return data.vlength().v; }, [&](const MTPDauth_sentCodeTypeCall &data) { return data.vlength().v; - }, [&](const MTPDauth_sentCodeTypeFlashCall &data) { - LOG(("Error: should not be flashcall!")); - return 0; - }, [&](const MTPDauth_sentCodeTypeMissedCall &data) { - LOG(("Error: should not be missedcall!")); - return 0; + }, [&](const MTPDauth_sentCodeTypeFlashCall &) { + return bad("FlashCall"); + }, [&](const MTPDauth_sentCodeTypeMissedCall &) { + return bad("MissedCall"); + }, [&](const MTPDauth_sentCodeTypeFirebaseSms &) { + return bad("FirebaseSms"); + }, [&](const MTPDauth_sentCodeTypeEmailCode &) { + return bad("EmailCode"); + }, [&](const MTPDauth_sentCodeTypeSetUpEmailRequired &) { + return bad("SetUpEmailRequired"); }); + const auto fragmentUrl = data.vtype().match([]( + const MTPDauth_sentCodeTypeFragmentSms &data) { + return qs(data.vurl()); + }, [](const auto &) { return QString(); }); const auto phoneHash = qs(data.vphone_code_hash()); const auto timeout = [&]() -> std::optional { if (const auto nextType = data.vnext_type()) { @@ -62,20 +81,29 @@ void ConfirmPhone::resolve( auto box = Box( phone, sentCodeLength, + fragmentUrl, timeout); const auto boxWeak = Ui::MakeWeak(box.data()); + using LoginCode = rpl::event_stream; + const auto codeHandles = box->lifetime().make_state(); + controller->session().account().setHandleLoginCode([=]( + const QString &code) { + codeHandles->fire_copy(code); + }); box->resendRequests( ) | rpl::start_with_next([=] { _api.request(MTPauth_ResendCode( MTP_string(phone), MTP_string(phoneHash) - )).done([=](const MTPauth_SentCode &result) { + )).done([=] { if (boxWeak) { boxWeak->callDone(); } }).send(); }, box->lifetime()); - box->checkRequests( + rpl::merge( + codeHandles->events(), + box->checkRequests() ) | rpl::start_with_next([=](const QString &code) { if (_checkRequestId) { return; @@ -86,7 +114,7 @@ void ConfirmPhone::resolve( )).done([=] { _checkRequestId = 0; controller->show( - Box( + Ui::MakeInformBox( tr::lng_confirm_phone_success( tr::now, lt_phone, @@ -107,8 +135,15 @@ void ConfirmPhone::resolve( boxWeak->showServerError(errorText); }).handleFloodErrors().send(); }, box->lifetime()); + box->boxClosing( + ) | rpl::start_with_next([=] { + controller->session().account().setHandleLoginCode(nullptr); + }, box->lifetime()); controller->show(std::move(box), Ui::LayerOption::CloseOther); + }, [](const MTPDauth_sentCodeSuccess &) { + LOG(("API Error: Unexpected auth.sentCodeSuccess " + "(Api::ConfirmPhone).")); }); }).fail([=](const MTP::Error &error) { _sendRequestId = 0; @@ -120,7 +155,7 @@ void ConfirmPhone::resolve( ? tr::lng_confirm_phone_link_invalid(tr::now) : Lang::Hard::ServerError(); controller->show( - Box(errorText), + Ui::MakeInformBox(errorText), Ui::LayerOption::CloseOther); }).handleFloodErrors().send(); } diff --git a/Telegram/SourceFiles/api/api_editing.cpp b/Telegram/SourceFiles/api/api_editing.cpp index 46a120c54..84f0cbfff 100644 --- a/Telegram/SourceFiles/api/api_editing.cpp +++ b/Telegram/SourceFiles/api/api_editing.cpp @@ -11,13 +11,17 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_media.h" #include "api/api_text_entities.h" #include "ui/boxes/confirm_box.h" +#include "data/business/data_shortcut_messages.h" +#include "data/data_histories.h" #include "data/data_scheduled_messages.h" #include "data/data_session.h" +#include "data/data_web_page.h" #include "history/history.h" #include "history/history_item.h" #include "lang/lang_keys.h" #include "main/main_session.h" #include "mtproto/mtproto_response.h" +#include "boxes/abstract_box.h" // Ui::show(). namespace Api { namespace { @@ -26,18 +30,25 @@ using namespace rpl::details; template constexpr auto WithId = - is_callable_plain_v, mtpRequestId>; + is_callable_plain_v, mtpRequestId>; template constexpr auto WithoutId = - is_callable_plain_v>; + is_callable_plain_v>; template constexpr auto WithoutCallback = - is_callable_plain_v; + is_callable_plain_v; +template +constexpr auto ErrorWithId = + is_callable_plain_v; +template +constexpr auto ErrorWithoutId = + is_callable_plain_v; template mtpRequestId EditMessage( not_null item, const TextWithEntities &textWithEntities, + Data::WebPageDraft webpage, SendOptions options, DoneCallback &&done, FailCallback &&fail, @@ -58,56 +69,76 @@ mtpRequestId EditMessage( const auto emptyFlag = MTPmessages_EditMessage::Flag(0); const auto flags = emptyFlag - | (!text.isEmpty() || media + | ((!text.isEmpty() || media) ? MTPmessages_EditMessage::Flag::f_message : emptyFlag) | ((media && inputMedia.has_value()) ? MTPmessages_EditMessage::Flag::f_media : emptyFlag) - | (options.removeWebPageId + | (webpage.removed ? MTPmessages_EditMessage::Flag::f_no_webpage : emptyFlag) + | ((!webpage.removed && !webpage.url.isEmpty()) + ? MTPmessages_EditMessage::Flag::f_media + : emptyFlag) + | ((!webpage.removed && !webpage.url.isEmpty() && webpage.invert) + ? MTPmessages_EditMessage::Flag::f_invert_media + : emptyFlag) | (!sentEntities.v.isEmpty() ? MTPmessages_EditMessage::Flag::f_entities : emptyFlag) | (options.scheduled ? MTPmessages_EditMessage::Flag::f_schedule_date + : emptyFlag) + | (item->isBusinessShortcut() + ? MTPmessages_EditMessage::Flag::f_quick_reply_shortcut_id : emptyFlag); const auto id = item->isScheduled() ? session->data().scheduledMessages().lookupId(item) + : item->isBusinessShortcut() + ? session->data().shortcutMessages().lookupId(item) : item->id; return api->request(MTPmessages_EditMessage( MTP_flags(flags), item->history()->peer->input, MTP_int(id), MTP_string(text), - inputMedia.value_or(MTPInputMedia()), + inputMedia.value_or(Data::WebPageForMTP(webpage, text.isEmpty())), MTPReplyMarkup(), sentEntities, - MTP_int(options.scheduled) + MTP_int(options.scheduled), + MTP_int(item->shortcutId()) )).done([=]( const MTPUpdates &result, [[maybe_unused]] mtpRequestId requestId) { const auto apply = [=] { api->applyUpdates(result); }; if constexpr (WithId) { - done(result, apply, requestId); + done(apply, requestId); } else if constexpr (WithoutId) { - done(result, apply); + done(apply); } else if constexpr (WithoutCallback) { - done(result); + done(); apply(); } else { - apply(); + t_bad_callback(done); } if (updateRecentStickers) { api->requestRecentStickersForce(true); } - }).fail( - fail - ).send(); + }).fail([=](const MTP::Error &error, mtpRequestId requestId) { + if constexpr (ErrorWithId) { + fail(error.type(), requestId); + } else if constexpr (ErrorWithoutId) { + fail(error.type()); + } else if constexpr (WithoutCallback) { + fail(); + } else { + t_bad_callback(fail); + } + }).send(); } template @@ -118,9 +149,15 @@ mtpRequestId EditMessage( FailCallback &&fail, std::optional inputMedia = std::nullopt) { const auto &text = item->originalText(); + const auto webpage = (!item->media() || !item->media()->webpage()) + ? Data::WebPageDraft{ .removed = true } + : Data::WebPageDraft{ + .id = item->media()->webpage()->id, + }; return EditMessage( item, text, + webpage, options, std::forward(done), std::forward(fail), @@ -131,26 +168,25 @@ void EditMessageWithUploadedMedia( not_null item, SendOptions options, MTPInputMedia media) { - const auto done = [=](const auto &result, Fn applyUpdates) { + const auto done = [=](Fn applyUpdates) { if (item) { + item->removeFromSharedMediaIndex(); item->clearSavedMedia(); item->setIsLocalUpdateMedia(true); applyUpdates(); item->setIsLocalUpdateMedia(false); } }; - const auto fail = [=](const MTP::Error &error) { - const auto err = error.type(); + const auto fail = [=](const QString &error) { const auto session = &item->history()->session(); - const auto notModified = (err == u"MESSAGE_NOT_MODIFIED"_q); - const auto mediaInvalid = (err == u"MEDIA_NEW_INVALID"_q); + const auto notModified = (error == u"MESSAGE_NOT_MODIFIED"_q); + const auto mediaInvalid = (error == u"MEDIA_NEW_INVALID"_q); if (notModified || mediaInvalid) { item->returnSavedMedia(); session->data().sendHistoryChangeNotifications(); if (mediaInvalid) { Ui::show( - Box( - tr::lng_edit_media_invalid_file(tr::now)), + Ui::MakeInformBox(tr::lng_edit_media_invalid_file()), Ui::LayerOption::KeepOther); } } else { @@ -193,33 +229,36 @@ void EditMessageWithUploadedPhoto( EditMessageWithUploadedMedia( item, options, - PrepareUploadedPhoto(std::move(info))); + PrepareUploadedPhoto(item, std::move(info))); } mtpRequestId EditCaption( not_null item, const TextWithEntities &caption, SendOptions options, - Fn done, - Fn fail) { - return EditMessage(item, caption, options, done, fail); + Fn done, + Fn fail) { + return EditMessage( + item, + caption, + Data::WebPageDraft(), + options, + done, + fail); } mtpRequestId EditTextMessage( not_null item, const TextWithEntities &caption, + Data::WebPageDraft webpage, SendOptions options, - Fn done, - Fn fail) { - const auto callback = [=]( - const auto &result, - Fn applyUpdates, - auto id) { + Fn done, + Fn fail) { + const auto callback = [=](Fn applyUpdates, mtpRequestId id) { applyUpdates(); - done(result, id); + done(id); }; - return EditMessage(item, caption, options, callback, fail); + return EditMessage(item, caption, webpage, options, callback, fail); } - } // namespace Api diff --git a/Telegram/SourceFiles/api/api_editing.h b/Telegram/SourceFiles/api/api_editing.h index 4a80e9dae..86f106f45 100644 --- a/Telegram/SourceFiles/api/api_editing.h +++ b/Telegram/SourceFiles/api/api_editing.h @@ -9,6 +9,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL class HistoryItem; +namespace Data { +struct WebPageDraft; +} // namespace Data + namespace MTP { class Error; } // namespace MTP @@ -42,14 +46,15 @@ mtpRequestId EditCaption( not_null item, const TextWithEntities &caption, SendOptions options, - Fn done, - Fn fail); + Fn done, + Fn fail); mtpRequestId EditTextMessage( not_null item, const TextWithEntities &caption, + Data::WebPageDraft webpage, SendOptions options, - Fn done, - Fn fail); + Fn done, + Fn fail); } // namespace Api diff --git a/Telegram/SourceFiles/api/api_global_privacy.cpp b/Telegram/SourceFiles/api/api_global_privacy.cpp index c940dbe86..f958bdfe8 100644 --- a/Telegram/SourceFiles/api/api_global_privacy.cpp +++ b/Telegram/SourceFiles/api/api_global_privacy.cpp @@ -56,6 +56,15 @@ rpl::producer GlobalPrivacy::archiveAndMute() const { return _archiveAndMute.value(); } +UnarchiveOnNewMessage GlobalPrivacy::unarchiveOnNewMessageCurrent() const { + return _unarchiveOnNewMessage.current(); +} + +auto GlobalPrivacy::unarchiveOnNewMessage() const +-> rpl::producer { + return _unarchiveOnNewMessage.value(); +} + rpl::producer GlobalPrivacy::showArchiveAndMute() const { using namespace rpl::mappers; @@ -75,28 +84,105 @@ void GlobalPrivacy::dismissArchiveAndMuteSuggestion() { u"AUTOARCHIVE_POPULAR"_q); } -void GlobalPrivacy::update(bool archiveAndMute) { +void GlobalPrivacy::updateHideReadTime(bool hide) { + update( + archiveAndMuteCurrent(), + unarchiveOnNewMessageCurrent(), + hide, + newRequirePremiumCurrent()); +} + +bool GlobalPrivacy::hideReadTimeCurrent() const { + return _hideReadTime.current(); +} + +rpl::producer GlobalPrivacy::hideReadTime() const { + return _hideReadTime.value(); +} + +void GlobalPrivacy::updateNewRequirePremium(bool value) { + update( + archiveAndMuteCurrent(), + unarchiveOnNewMessageCurrent(), + hideReadTimeCurrent(), + value); +} + +bool GlobalPrivacy::newRequirePremiumCurrent() const { + return _newRequirePremium.current(); +} + +rpl::producer GlobalPrivacy::newRequirePremium() const { + return _newRequirePremium.value(); +} + + +void GlobalPrivacy::updateArchiveAndMute(bool value) { + update( + value, + unarchiveOnNewMessageCurrent(), + hideReadTimeCurrent(), + newRequirePremiumCurrent()); +} + +void GlobalPrivacy::updateUnarchiveOnNewMessage( + UnarchiveOnNewMessage value) { + update( + archiveAndMuteCurrent(), + value, + hideReadTimeCurrent(), + newRequirePremiumCurrent()); +} + +void GlobalPrivacy::update( + bool archiveAndMute, + UnarchiveOnNewMessage unarchiveOnNewMessage, + bool hideReadTime, + bool newRequirePremium) { using Flag = MTPDglobalPrivacySettings::Flag; _api.request(_requestId).cancel(); + const auto flags = Flag() + | (archiveAndMute + ? Flag::f_archive_and_mute_new_noncontact_peers + : Flag()) + | (unarchiveOnNewMessage == UnarchiveOnNewMessage::None + ? Flag::f_keep_archived_unmuted + : Flag()) + | (unarchiveOnNewMessage != UnarchiveOnNewMessage::AnyUnmuted + ? Flag::f_keep_archived_folders + : Flag()) + | (hideReadTime ? Flag::f_hide_read_marks : Flag()) + | ((newRequirePremium && _session->premium()) + ? Flag::f_new_noncontact_peers_require_premium + : Flag()); _requestId = _api.request(MTPaccount_SetGlobalPrivacySettings( - MTP_globalPrivacySettings( - MTP_flags(Flag::f_archive_and_mute_new_noncontact_peers), - MTP_bool(archiveAndMute)) + MTP_globalPrivacySettings(MTP_flags(flags)) )).done([=](const MTPGlobalPrivacySettings &result) { _requestId = 0; apply(result); - }).fail([=] { + }).fail([=](const MTP::Error &error) { _requestId = 0; + if (error.type() == u"PREMIUM_ACCOUNT_REQUIRED"_q) { + update(archiveAndMute, unarchiveOnNewMessage, hideReadTime, {}); + } }).send(); _archiveAndMute = archiveAndMute; + _unarchiveOnNewMessage = unarchiveOnNewMessage; + _hideReadTime = hideReadTime; + _newRequirePremium = newRequirePremium; } void GlobalPrivacy::apply(const MTPGlobalPrivacySettings &data) { data.match([&](const MTPDglobalPrivacySettings &data) { - _archiveAndMute = data.varchive_and_mute_new_noncontact_peers() - ? mtpIsTrue(*data.varchive_and_mute_new_noncontact_peers()) - : false; + _archiveAndMute = data.is_archive_and_mute_new_noncontact_peers(); + _unarchiveOnNewMessage = data.is_keep_archived_unmuted() + ? UnarchiveOnNewMessage::None + : data.is_keep_archived_folders() + ? UnarchiveOnNewMessage::NotInFoldersUnmuted + : UnarchiveOnNewMessage::AnyUnmuted; + _hideReadTime = data.is_hide_read_marks(); + _newRequirePremium = data.is_new_noncontact_peers_require_premium(); }); } diff --git a/Telegram/SourceFiles/api/api_global_privacy.h b/Telegram/SourceFiles/api/api_global_privacy.h index a1a693499..de70ba9b9 100644 --- a/Telegram/SourceFiles/api/api_global_privacy.h +++ b/Telegram/SourceFiles/api/api_global_privacy.h @@ -17,27 +17,56 @@ class Session; namespace Api { +enum class UnarchiveOnNewMessage { + None, + NotInFoldersUnmuted, + AnyUnmuted, +}; + class GlobalPrivacy final { public: explicit GlobalPrivacy(not_null api); void reload(Fn callback = nullptr); - void update(bool archiveAndMute); + void updateArchiveAndMute(bool value); + void updateUnarchiveOnNewMessage(UnarchiveOnNewMessage value); [[nodiscard]] bool archiveAndMuteCurrent() const; [[nodiscard]] rpl::producer archiveAndMute() const; + [[nodiscard]] auto unarchiveOnNewMessageCurrent() const + -> UnarchiveOnNewMessage; + [[nodiscard]] auto unarchiveOnNewMessage() const + -> rpl::producer; [[nodiscard]] rpl::producer showArchiveAndMute() const; [[nodiscard]] rpl::producer<> suggestArchiveAndMute() const; void dismissArchiveAndMuteSuggestion(); + void updateHideReadTime(bool hide); + [[nodiscard]] bool hideReadTimeCurrent() const; + [[nodiscard]] rpl::producer hideReadTime() const; + + void updateNewRequirePremium(bool value); + [[nodiscard]] bool newRequirePremiumCurrent() const; + [[nodiscard]] rpl::producer newRequirePremium() const; + private: void apply(const MTPGlobalPrivacySettings &data); + void update( + bool archiveAndMute, + UnarchiveOnNewMessage unarchiveOnNewMessage, + bool hideReadTime, + bool newRequirePremium); + const not_null _session; MTP::Sender _api; mtpRequestId _requestId = 0; rpl::variable _archiveAndMute = false; + rpl::variable _unarchiveOnNewMessage + = UnarchiveOnNewMessage::None; rpl::variable _showArchiveAndMute = false; + rpl::variable _hideReadTime = false; + rpl::variable _newRequirePremium = false; std::vector> _callbacks; }; diff --git a/Telegram/SourceFiles/api/api_hash.cpp b/Telegram/SourceFiles/api/api_hash.cpp index be5f9277c..15aca8e29 100644 --- a/Telegram/SourceFiles/api/api_hash.cpp +++ b/Telegram/SourceFiles/api/api_hash.cpp @@ -60,6 +60,23 @@ namespace { : 0; } +[[nodiscard]] uint64 CountFeaturedHash( + not_null session, + const Data::StickersSetsOrder &order) { + auto result = HashInit(); + const auto &sets = session->data().stickers().sets(); + for (const auto setId : order) { + HashUpdate(result, setId); + + const auto it = sets.find(setId); + if (it != sets.cend() + && (it->second->flags & Data::StickersSetFlag::Unread)) { + HashUpdate(result, 1); + } + } + return HashFinalize(result); +} + } // namespace uint64 CountStickersHash( @@ -80,6 +97,15 @@ uint64 CountMasksHash( checkOutdatedInfo); } +uint64 CountCustomEmojiHash( + not_null session, + bool checkOutdatedInfo) { + return CountStickersOrderHash( + session, + session->data().stickers().emojiSetsOrder(), + checkOutdatedInfo); +} + uint64 CountRecentStickersHash( not_null session, bool attached) { @@ -95,19 +121,15 @@ uint64 CountFavedStickersHash(not_null session) { } uint64 CountFeaturedStickersHash(not_null session) { - auto result = HashInit(); - const auto &sets = session->data().stickers().sets(); - const auto &featured = session->data().stickers().featuredSetsOrder(); - for (const auto setId : featured) { - HashUpdate(result, setId); + return CountFeaturedHash( + session, + session->data().stickers().featuredSetsOrder()); +} - const auto it = sets.find(setId); - if (it != sets.cend() - && (it->second->flags & Data::StickersSetFlag::Unread)) { - HashUpdate(result, 1); - } - } - return HashFinalize(result); +uint64 CountFeaturedEmojiHash(not_null session) { + return CountFeaturedHash( + session, + session->data().stickers().featuredEmojiSetsOrder()); } uint64 CountSavedGifsHash(not_null session) { diff --git a/Telegram/SourceFiles/api/api_hash.h b/Telegram/SourceFiles/api/api_hash.h index 81c9902a2..3b459beb9 100644 --- a/Telegram/SourceFiles/api/api_hash.h +++ b/Telegram/SourceFiles/api/api_hash.h @@ -19,12 +19,18 @@ namespace Api { [[nodiscard]] uint64 CountMasksHash( not_null session, bool checkOutdatedInfo = false); +[[nodiscard]] uint64 CountCustomEmojiHash( + not_null session, + bool checkOutdatedInfo = false); [[nodiscard]] uint64 CountRecentStickersHash( not_null session, bool attached = false); -[[nodiscard]] uint64 CountFavedStickersHash(not_null session); +[[nodiscard]] uint64 CountFavedStickersHash( + not_null session); [[nodiscard]] uint64 CountFeaturedStickersHash( not_null session); +[[nodiscard]] uint64 CountFeaturedEmojiHash( + not_null session); [[nodiscard]] uint64 CountSavedGifsHash(not_null session); [[nodiscard]] inline uint64 HashInit() { diff --git a/Telegram/SourceFiles/api/api_invite_links.cpp b/Telegram/SourceFiles/api/api_invite_links.cpp index 3aad8c14e..1f02b78c1 100644 --- a/Telegram/SourceFiles/api/api_invite_links.cpp +++ b/Telegram/SourceFiles/api/api_invite_links.cpp @@ -58,6 +58,7 @@ JoinedByLinkSlice ParseJoinedByLinkSlice( result.users.push_back({ .user = owner.user(data.vuser_id()), .date = data.vdate().v, + .viaFilterLink = data.is_via_chatlist(), }); }); } @@ -123,9 +124,9 @@ void InviteLinks::performCreate( )).done([=](const MTPExportedChatInvite &result) { const auto callbacks = _createCallbacks.take(peer); const auto link = prepend(peer, peer->session().user(), result); - if (callbacks) { + if (link && callbacks) { for (const auto &callback : *callbacks) { - callback(link); + callback(*link); } } }).fail([=] { @@ -155,15 +156,18 @@ auto InviteLinks::lookupMyPermanent(const Links &links) const -> const Link* { auto InviteLinks::prepend( not_null peer, not_null admin, - const MTPExportedChatInvite &invite) -> Link { + const MTPExportedChatInvite &invite) -> std::optional { const auto link = parse(peer, invite); + if (!link) { + return link; + } if (admin->isSelf()) { - prependMyToFirstSlice(peer, admin, link); + prependMyToFirstSlice(peer, admin, *link); } _updates.fire(Update{ .peer = peer, .admin = admin, - .now = link + .now = *link }); return link; } @@ -281,6 +285,9 @@ void InviteLinks::performEdit( result.match([&](const auto &data) { _api->session().data().processUsers(data.vusers()); const auto link = parse(peer, data.vinvite()); + if (!link) { + return; + } auto i = _firstSlices.find(peer); if (i != end(_firstSlices)) { const auto j = ranges::find( @@ -288,18 +295,18 @@ void InviteLinks::performEdit( key.link, &Link::link); if (j != end(i->second.links)) { - if (link.revoked && !j->revoked) { + if (link->revoked && !j->revoked) { i->second.links.erase(j); if (i->second.count > 0) { --i->second.count; } } else { - *j = link; + *j = *link; } } } for (const auto &callback : *callbacks) { - callback(link); + callback(*link); } _updates.fire(Update{ .peer = peer, @@ -617,7 +624,11 @@ void InviteLinks::setMyPermanent( not_null peer, const MTPExportedChatInvite &invite) { auto link = parse(peer, invite); - if (!link.permanent) { + if (!link) { + LOG(("API Error: " + "InviteLinks::setPermanent called with non-link.")); + return; + } else if (!link->permanent) { LOG(("API Error: " "InviteLinks::setPermanent called with non-permanent link.")); return; @@ -632,13 +643,13 @@ void InviteLinks::setMyPermanent( .admin = peer->session().user(), }; if (const auto permanent = lookupMyPermanent(links)) { - if (permanent->link == link.link) { - if (permanent->usage != link.usage) { - permanent->usage = link.usage; + if (permanent->link == link->link) { + if (permanent->usage != link->usage) { + permanent->usage = link->usage; _updates.fire(Update{ .peer = peer, .admin = peer->session().user(), - .was = link.link, + .was = link->link, .now = *permanent }); } @@ -652,9 +663,9 @@ void InviteLinks::setMyPermanent( --links.count; } } - links.links.insert(begin(links.links), link); + links.links.insert(begin(links.links), *link); - editPermanentLink(peer, link.link); + editPermanentLink(peer, link->link); notify(peer); if (updateOldPermanent.now) { @@ -722,9 +733,10 @@ auto InviteLinks::parseSlice( peer->session().data().processUsers(data.vusers()); result.count = data.vcount().v; for (const auto &invite : data.vinvites().v) { - const auto link = parse(peer, invite); - if (!permanent || link.link != permanent->link) { - result.links.push_back(link); + if (const auto link = parse(peer, invite)) { + if (!permanent || link->link != permanent->link) { + result.links.push_back(*link); + } } } }); @@ -733,9 +745,9 @@ auto InviteLinks::parseSlice( auto InviteLinks::parse( not_null peer, - const MTPExportedChatInvite &invite) const -> Link { + const MTPExportedChatInvite &invite) const -> std::optional { return invite.match([&](const MTPDchatInviteExported &data) { - return Link{ + return std::optional(Link{ .link = qs(data.vlink()), .label = qs(data.vtitle().value_or_empty()), .admin = peer->session().data().user(data.vadmin_id()), @@ -748,7 +760,9 @@ auto InviteLinks::parse( .requestApproval = data.is_request_needed(), .permanent = data.is_permanent(), .revoked = data.is_revoked(), - }; + }); + }, [&](const MTPDchatInvitePublicJoinRequests &data) { + return std::optional(); }); } diff --git a/Telegram/SourceFiles/api/api_invite_links.h b/Telegram/SourceFiles/api/api_invite_links.h index 586a38a1e..09b43c086 100644 --- a/Telegram/SourceFiles/api/api_invite_links.h +++ b/Telegram/SourceFiles/api/api_invite_links.h @@ -34,6 +34,7 @@ struct PeerInviteLinks { struct JoinedByLinkUser { not_null user; TimeId date = 0; + bool viaFilterLink = false; }; struct JoinedByLinkSlice { @@ -157,13 +158,13 @@ private: [[nodiscard]] Links parseSlice( not_null peer, const MTPmessages_ExportedChatInvites &slice) const; - [[nodiscard]] Link parse( + [[nodiscard]] std::optional parse( not_null peer, const MTPExportedChatInvite &invite) const; [[nodiscard]] Link *lookupMyPermanent(not_null peer); [[nodiscard]] Link *lookupMyPermanent(Links &links); [[nodiscard]] const Link *lookupMyPermanent(const Links &links) const; - Link prepend( + std::optional prepend( not_null peer, not_null admin, const MTPExportedChatInvite &invite); diff --git a/Telegram/SourceFiles/api/api_media.cpp b/Telegram/SourceFiles/api/api_media.cpp index 6038060f7..a76cb4b67 100644 --- a/Telegram/SourceFiles/api/api_media.cpp +++ b/Telegram/SourceFiles/api/api_media.cpp @@ -22,8 +22,7 @@ MTPVector ComposeSendingDocumentAttributes( const auto dimensions = document->dimensions; auto attributes = QVector(1, filenameAttribute); if (dimensions.width() > 0 && dimensions.height() > 0) { - const auto duration = document->getDuration(); - if (duration >= 0 && !document->hasMimeType(qstr("image/gif"))) { + if (document->hasDuration() && !document->hasMimeType(u"image/gif"_q)) { auto flags = MTPDdocumentAttributeVideo::Flags(0); using VideoFlag = MTPDdocumentAttributeVideo::Flag; if (document->isVideoMessage()) { @@ -34,9 +33,10 @@ MTPVector ComposeSendingDocumentAttributes( } attributes.push_back(MTP_documentAttributeVideo( MTP_flags(flags), - MTP_int(duration), + MTP_double(document->duration() / 1000.), MTP_int(dimensions.width()), - MTP_int(dimensions.height()))); + MTP_int(dimensions.height()), + MTPint())); // preload_prefix_size } else { attributes.push_back(MTP_documentAttributeImageSize( MTP_int(dimensions.width()), @@ -56,7 +56,7 @@ MTPVector ComposeSendingDocumentAttributes( | MTPDdocumentAttributeAudio::Flag::f_performer; attributes.push_back(MTP_documentAttributeAudio( MTP_flags(flags), - MTP_int(song->duration), + MTP_int(document->duration() / 1000), MTP_string(song->title), MTP_string(song->performer), MTPstring())); @@ -65,7 +65,7 @@ MTPVector ComposeSendingDocumentAttributes( | MTPDdocumentAttributeAudio::Flag::f_waveform; attributes.push_back(MTP_documentAttributeAudio( MTP_flags(flags), - MTP_int(voice->duration), + MTP_int(document->duration() / 1000), MTPstring(), MTPstring(), MTP_bytes(documentWaveformEncode5bit(voice->waveform)))); @@ -75,16 +75,23 @@ MTPVector ComposeSendingDocumentAttributes( } // namespace -MTPInputMedia PrepareUploadedPhoto(RemoteFileInfo info) { - const auto flags = info.attachedStickers.empty() - ? MTPDinputMediaUploadedPhoto::Flags(0) - : MTPDinputMediaUploadedPhoto::Flag::f_stickers; +MTPInputMedia PrepareUploadedPhoto( + not_null item, + RemoteFileInfo info) { + using Flag = MTPDinputMediaUploadedPhoto::Flag; + const auto spoiler = item->media() && item->media()->hasSpoiler(); + const auto ttlSeconds = item->media() + ? item->media()->ttlSeconds() + : 0; + const auto flags = (spoiler ? Flag::f_spoiler : Flag()) + | (info.attachedStickers.empty() ? Flag() : Flag::f_stickers) + | (ttlSeconds ? Flag::f_ttl_seconds : Flag()); return MTP_inputMediaUploadedPhoto( MTP_flags(flags), info.file, MTP_vector( - ranges::to(info.attachedStickers)), - MTP_int(0)); + ranges::to>(info.attachedStickers)), + MTP_int(ttlSeconds)); } MTPInputMedia PrepareUploadedDocument( @@ -93,12 +100,16 @@ MTPInputMedia PrepareUploadedDocument( if (!item || !item->media() || !item->media()->document()) { return MTP_inputMediaEmpty(); } - const auto emptyFlag = MTPDinputMediaUploadedDocument::Flags(0); - using DocFlags = MTPDinputMediaUploadedDocument::Flag; - const auto flags = emptyFlag - | (info.thumb ? DocFlags::f_thumb : emptyFlag) - | (item->groupId() ? DocFlags::f_nosound_video : emptyFlag) - | (info.attachedStickers.empty() ? DocFlags::f_stickers : emptyFlag); + using Flag = MTPDinputMediaUploadedDocument::Flag; + const auto spoiler = item->media() && item->media()->hasSpoiler(); + const auto ttlSeconds = item->media() + ? item->media()->ttlSeconds() + : 0; + const auto flags = (spoiler ? Flag::f_spoiler : Flag()) + | (info.thumb ? Flag::f_thumb : Flag()) + | (item->groupId() ? Flag::f_nosound_video : Flag()) + | (info.attachedStickers.empty() ? Flag::f_stickers : Flag()) + | (ttlSeconds ? Flag::f_ttl_seconds : Flag()); const auto document = item->media()->document(); return MTP_inputMediaUploadedDocument( MTP_flags(flags), @@ -107,8 +118,8 @@ MTPInputMedia PrepareUploadedDocument( MTP_string(document->mimeString()), ComposeSendingDocumentAttributes(document), MTP_vector( - ranges::to(info.attachedStickers)), - MTP_int(0)); + ranges::to>(info.attachedStickers)), + MTP_int(ttlSeconds)); } bool HasAttachedStickers(MTPInputMedia media) { diff --git a/Telegram/SourceFiles/api/api_media.h b/Telegram/SourceFiles/api/api_media.h index b9f744856..87912e9b7 100644 --- a/Telegram/SourceFiles/api/api_media.h +++ b/Telegram/SourceFiles/api/api_media.h @@ -13,7 +13,9 @@ namespace Api { struct RemoteFileInfo; -MTPInputMedia PrepareUploadedPhoto(RemoteFileInfo info); +MTPInputMedia PrepareUploadedPhoto( + not_null item, + RemoteFileInfo info); MTPInputMedia PrepareUploadedDocument( not_null item, diff --git a/Telegram/SourceFiles/api/api_messages_search.cpp b/Telegram/SourceFiles/api/api_messages_search.cpp new file mode 100644 index 000000000..4fbcaebf0 --- /dev/null +++ b/Telegram/SourceFiles/api/api_messages_search.cpp @@ -0,0 +1,212 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "api/api_messages_search.h" + +#include "apiwrap.h" +#include "data/data_channel.h" +#include "data/data_histories.h" +#include "data/data_message_reaction_id.h" +#include "data/data_peer.h" +#include "data/data_session.h" +#include "history/history.h" +#include "history/history_item.h" +#include "main/main_session.h" + +namespace Api { +namespace { + +constexpr auto kSearchPerPage = 50; + +[[nodiscard]] MessageIdsList HistoryItemsFromTL( + not_null data, + const QVector &messages) { + auto result = MessageIdsList(); + for (const auto &message : messages) { + const auto peerId = PeerFromMessage(message); + if (const auto peer = data->peerLoaded(peerId)) { + if (const auto lastDate = DateFromMessage(message)) { + const auto item = data->addNewMessage( + message, + MessageFlags(), + NewMessageType::Existing); + result.push_back(item->fullId()); + } + } else { + LOG(("API Error: a search results with not loaded peer %1" + ).arg(peerId.value)); + } + } + return result; +} + +[[nodiscard]] QString RequestToToken( + const MessagesSearch::Request &request) { + auto result = request.query; + if (request.from) { + result += '\n' + QString::number(request.from->id.value); + } + for (const auto &tag : request.tags) { + result += '\n'; + if (const auto customId = tag.custom()) { + result += u"custom"_q + QString::number(customId); + } else { + result += u"emoji"_q + tag.emoji(); + } + } + return result; +} + +} // namespace + +MessagesSearch::MessagesSearch(not_null history) +: _history(history) { +} + +MessagesSearch::~MessagesSearch() { + _history->owner().histories().cancelRequest( + base::take(_searchInHistoryRequest)); +} + +void MessagesSearch::searchMessages(Request request) { + _request = std::move(request); + _offsetId = {}; + searchRequest(); +} + +void MessagesSearch::searchMore() { + if (_searchInHistoryRequest || _requestId) { + return; + } + searchRequest(); +} + +void MessagesSearch::searchRequest() { + const auto nextToken = RequestToToken(_request); + if (!_offsetId) { + const auto it = _cacheOfStartByToken.find(nextToken); + if (it != end(_cacheOfStartByToken)) { + _requestId = 0; + searchReceived(it->second, _requestId, nextToken); + return; + } + } + auto callback = [=](Fn finish) { + using Flag = MTPmessages_Search::Flag; + const auto from = _request.from; + const auto fromPeer = _history->peer->isUser() ? nullptr : from; + const auto savedPeer = _history->peer->isSelf() ? from : nullptr; + _requestId = _history->session().api().request(MTPmessages_Search( + MTP_flags((fromPeer ? Flag::f_from_id : Flag()) + | (savedPeer ? Flag::f_saved_peer_id : Flag()) + | (_request.tags.empty() ? Flag() : Flag::f_saved_reaction)), + _history->peer->input, + MTP_string(_request.query), + (fromPeer ? fromPeer->input : MTP_inputPeerEmpty()), + (savedPeer ? savedPeer->input : MTP_inputPeerEmpty()), + MTP_vector_from_range(_request.tags | ranges::views::transform( + Data::ReactionToMTP + )), + MTPint(), // top_msg_id + MTP_inputMessagesFilterEmpty(), + MTP_int(0), // min_date + MTP_int(0), // max_date + MTP_int(_offsetId), // offset_id + MTP_int(0), // add_offset + MTP_int(kSearchPerPage), + MTP_int(0), // max_id + MTP_int(0), // min_id + MTP_long(0) // hash + )).done([=](const TLMessages &result, mtpRequestId id) { + _searchInHistoryRequest = 0; + searchReceived(result, id, nextToken); + finish(); + }).fail([=](const MTP::Error &error, mtpRequestId id) { + _searchInHistoryRequest = 0; + + if (_requestId == id) { + _requestId = 0; + } + if (error.type() == u"SEARCH_QUERY_EMPTY"_q) { + _messagesFounds.fire({ 0, MessageIdsList(), nextToken }); + } + + finish(); + }).send(); + return _requestId; + }; + _searchInHistoryRequest = _history->owner().histories().sendRequest( + _history, + Data::Histories::RequestType::History, + std::move(callback)); +} + +void MessagesSearch::searchReceived( + const TLMessages &result, + mtpRequestId requestId, + const QString &nextToken) { + if (requestId != _requestId) { + return; + } + auto &owner = _history->owner(); + auto found = result.match([&](const MTPDmessages_messages &data) { + if (_requestId != 0) { + // Don't apply cached data! + owner.processUsers(data.vusers()); + owner.processChats(data.vchats()); + } + auto items = HistoryItemsFromTL(&owner, data.vmessages().v); + const auto total = int(data.vmessages().v.size()); + return FoundMessages{ total, std::move(items), nextToken }; + }, [&](const MTPDmessages_messagesSlice &data) { + if (_requestId != 0) { + // Don't apply cached data! + owner.processUsers(data.vusers()); + owner.processChats(data.vchats()); + } + auto items = HistoryItemsFromTL(&owner, data.vmessages().v); + // data.vnext_rate() is used only in global search. + const auto total = int(data.vcount().v); + return FoundMessages{ total, std::move(items), nextToken }; + }, [&](const MTPDmessages_channelMessages &data) { + if (_requestId != 0) { + // Don't apply cached data! + owner.processUsers(data.vusers()); + owner.processChats(data.vchats()); + } + if (const auto channel = _history->peer->asChannel()) { + channel->ptsReceived(data.vpts().v); + if (_requestId != 0) { + // Don't apply cached data! + channel->processTopics(data.vtopics()); + } + } else { + LOG(("API Error: " + "received messages.channelMessages when no channel " + "was passed!")); + } + auto items = HistoryItemsFromTL(&owner, data.vmessages().v); + const auto total = int(data.vcount().v); + return FoundMessages{ total, std::move(items), nextToken }; + }, [](const MTPDmessages_messagesNotModified &data) { + return FoundMessages{}; + }); + if (!_offsetId) { + _cacheOfStartByToken.emplace(nextToken, result); + } + _requestId = 0; + _offsetId = found.messages.empty() + ? MsgId() + : found.messages.back().msg; + _messagesFounds.fire(std::move(found)); +} + +rpl::producer MessagesSearch::messagesFounds() const { + return _messagesFounds.events(); +} + +} // namespace Api diff --git a/Telegram/SourceFiles/api/api_messages_search.h b/Telegram/SourceFiles/api/api_messages_search.h new file mode 100644 index 000000000..76046aaa9 --- /dev/null +++ b/Telegram/SourceFiles/api/api_messages_search.h @@ -0,0 +1,74 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +#include "base/qt/qt_compare.h" +#include "data/data_message_reaction_id.h" + +class HistoryItem; +class History; +class PeerData; + +namespace Data { +struct ReactionId; +} // namespace Data + +namespace Api { + +struct FoundMessages { + int total = -1; + MessageIdsList messages; + QString nextToken; +}; + +class MessagesSearch final { +public: + struct Request { + QString query; + PeerData *from = nullptr; + std::vector tags; + + friend inline bool operator==( + const Request &, + const Request &) = default; + friend inline auto operator<=>( + const Request &, + const Request &) = default; + }; + + explicit MessagesSearch(not_null history); + ~MessagesSearch(); + + void searchMessages(Request request); + void searchMore(); + + [[nodiscard]] rpl::producer messagesFounds() const; + +private: + using TLMessages = MTPmessages_Messages; + void searchRequest(); + void searchReceived( + const TLMessages &result, + mtpRequestId requestId, + const QString &nextToken); + + const not_null _history; + + base::flat_map _cacheOfStartByToken; + + Request _request; + MsgId _offsetId; + + int _searchInHistoryRequest = 0; // Not real mtpRequestId. + mtpRequestId _requestId = 0; + + rpl::event_stream _messagesFounds; + +}; + +} // namespace Api diff --git a/Telegram/SourceFiles/api/api_messages_search_merged.cpp b/Telegram/SourceFiles/api/api_messages_search_merged.cpp new file mode 100644 index 000000000..8451232f6 --- /dev/null +++ b/Telegram/SourceFiles/api/api_messages_search_merged.cpp @@ -0,0 +1,106 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "api/api_messages_search_merged.h" + +#include "history/history.h" + +namespace Api { + +MessagesSearchMerged::MessagesSearchMerged(not_null history) +: _apiSearch(history) { + if (const auto migrated = history->migrateFrom()) { + _migratedSearch.emplace(migrated); + } + const auto checkWaitingForTotal = [=] { + if (_waitingForTotal) { + if (_concatedFound.total >= 0 && _migratedFirstFound.total >= 0) { + _waitingForTotal = false; + _concatedFound.total += _migratedFirstFound.total; + _newFounds.fire({}); + } + } else { + _newFounds.fire({}); + } + }; + + const auto checkFull = [=](const FoundMessages &data) { + if (data.total == int(_concatedFound.messages.size())) { + _isFull = true; + addFound(_migratedFirstFound); + } + }; + + _apiSearch.messagesFounds( + ) | rpl::start_with_next([=](const FoundMessages &data) { + if (data.nextToken == _concatedFound.nextToken) { + addFound(data); + checkFull(data); + _nextFounds.fire({}); + } else { + _concatedFound = data; + checkFull(data); + checkWaitingForTotal(); + } + }, _lifetime); + + if (_migratedSearch) { + _migratedSearch->messagesFounds( + ) | rpl::start_with_next([=](const FoundMessages &data) { + if (_isFull) { + addFound(data); + } + if (data.nextToken == _migratedFirstFound.nextToken) { + _nextFounds.fire({}); + } else { + _migratedFirstFound = data; + checkWaitingForTotal(); + } + }, _lifetime); + } +} + +void MessagesSearchMerged::addFound(const FoundMessages &data) { + for (const auto &message : data.messages) { + _concatedFound.messages.push_back(message); + } +} + +const FoundMessages &MessagesSearchMerged::messages() const { + return _concatedFound; +} + +void MessagesSearchMerged::clear() { + _concatedFound = {}; + _migratedFirstFound = {}; +} + +void MessagesSearchMerged::search(const Request &search) { + if (_migratedSearch) { + _waitingForTotal = true; + _migratedSearch->searchMessages(search); + } + _apiSearch.searchMessages(search); +} + +void MessagesSearchMerged::searchMore() { + if (_migratedSearch && _isFull) { + _migratedSearch->searchMore(); + } else { + _apiSearch.searchMore(); + } +} + +rpl::producer<> MessagesSearchMerged::newFounds() const { + return _newFounds.events(); +} + +rpl::producer<> MessagesSearchMerged::nextFounds() const { + return _nextFounds.events(); +} + +} // namespace Api diff --git a/Telegram/SourceFiles/api/api_messages_search_merged.h b/Telegram/SourceFiles/api/api_messages_search_merged.h new file mode 100644 index 000000000..d4c6fbc1c --- /dev/null +++ b/Telegram/SourceFiles/api/api_messages_search_merged.h @@ -0,0 +1,58 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +#include "api/api_messages_search.h" + +class History; +class PeerData; + +namespace Data { +struct ReactionId; +} // namespace Data + +namespace Api { + +// Search in both of history and migrated history, if it exists. +class MessagesSearchMerged final { +public: + using Request = MessagesSearch::Request; + using CachedRequests = base::flat_set; + + MessagesSearchMerged(not_null history); + + void clear(); + void search(const Request &search); + void searchMore(); + + [[nodiscard]] const FoundMessages &messages() const; + + [[nodiscard]] rpl::producer<> newFounds() const; + [[nodiscard]] rpl::producer<> nextFounds() const; + +private: + void addFound(const FoundMessages &data); + + MessagesSearch _apiSearch; + + std::optional _migratedSearch; + FoundMessages _migratedFirstFound; + + FoundMessages _concatedFound; + + bool _waitingForTotal = false; + bool _isFull = false; + + rpl::event_stream<> _newFounds; + rpl::event_stream<> _nextFounds; + + rpl::lifetime _lifetime; + +}; + +} // namespace Api diff --git a/Telegram/SourceFiles/api/api_peer_colors.cpp b/Telegram/SourceFiles/api/api_peer_colors.cpp new file mode 100644 index 000000000..5f3fe12d2 --- /dev/null +++ b/Telegram/SourceFiles/api/api_peer_colors.cpp @@ -0,0 +1,168 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "api/api_peer_colors.h" + +#include "apiwrap.h" +#include "data/data_peer.h" +#include "ui/chat/chat_style.h" + +namespace Api { +namespace { + +constexpr auto kRequestEach = 3600 * crl::time(1000); + +} // namespace + +PeerColors::PeerColors(not_null api) +: _api(&api->instance()) +, _timer([=] { request(); }) { + request(); + _timer.callEach(kRequestEach); +} + +PeerColors::~PeerColors() = default; + +void PeerColors::request() { + if (_requestId) { + return; + } + _requestId = _api.request(MTPhelp_GetPeerColors( + MTP_int(_hash) + )).done([=](const MTPhelp_PeerColors &result) { + _requestId = 0; + result.match([&](const MTPDhelp_peerColors &data) { + _hash = data.vhash().v; + apply(data); + }, [](const MTPDhelp_peerColorsNotModified &) { + }); + }).fail([=] { + _requestId = 0; + }).send(); +} + +std::vector PeerColors::suggested() const { + return _suggested.current(); +} + +rpl::producer> PeerColors::suggestedValue() const { + return _suggested.value(); +} + +auto PeerColors::indicesValue() const +-> rpl::producer { + return rpl::single( + indicesCurrent() + ) | rpl::then(_colorIndicesChanged.events() | rpl::map([=] { + return indicesCurrent(); + })); +} + +Ui::ColorIndicesCompressed PeerColors::indicesCurrent() const { + return _colorIndicesCurrent + ? *_colorIndicesCurrent + : Ui::ColorIndicesCompressed(); +} + +const base::flat_map &PeerColors::requiredLevelsGroup() const { + return _requiredLevelsGroup; +} + +const base::flat_map &PeerColors::requiredLevelsChannel() const { + return _requiredLevelsChannel; +} + +int PeerColors::requiredGroupLevelFor(PeerId channel, uint8 index) const { + if (Data::DecideColorIndex(channel) == index) { + return 0; + } else if (const auto i = _requiredLevelsGroup.find(index) + ; i != end(_requiredLevelsGroup)) { + return i->second; + } + return 1; +} + +int PeerColors::requiredChannelLevelFor(PeerId channel, uint8 index) const { + if (Data::DecideColorIndex(channel) == index) { + return 0; + } else if (const auto i = _requiredLevelsChannel.find(index) + ; i != end(_requiredLevelsChannel)) { + return i->second; + } + return 1; +} + +void PeerColors::apply(const MTPDhelp_peerColors &data) { + auto suggested = std::vector(); + auto colors = std::make_shared< + std::array>(); + + using ParsedColor = std::array; + const auto parseColors = [](const MTPhelp_PeerColorSet &set) { + return set.match([&](const MTPDhelp_peerColorSet &data) { + auto result = ParsedColor(); + const auto &list = data.vcolors().v; + if (list.empty() || list.size() > Ui::kColorPatternsCount) { + LOG(("API Error: Bad count for PeerColorSet.colors: %1" + ).arg(list.size())); + return ParsedColor(); + } + auto fill = result.data(); + for (const auto &color : list) { + *fill++ = (uint32(1) << 24) | uint32(color.v); + } + return result; + }, [](const MTPDhelp_peerColorProfileSet &) { + LOG(("API Error: peerColorProfileSet in colors result!")); + return ParsedColor(); + }); + }; + + const auto &list = data.vcolors().v; + _requiredLevelsGroup.clear(); + _requiredLevelsChannel.clear(); + suggested.reserve(list.size()); + for (const auto &color : list) { + const auto &data = color.data(); + const auto colorIndexBare = data.vcolor_id().v; + if (colorIndexBare < 0 || colorIndexBare >= Ui::kColorIndexCount) { + LOG(("API Error: Bad color index: %1").arg(colorIndexBare)); + continue; + } + const auto colorIndex = uint8(colorIndexBare); + if (const auto min = data.vgroup_min_level()) { + _requiredLevelsGroup[colorIndex] = min->v; + } + if (const auto min = data.vchannel_min_level()) { + _requiredLevelsChannel[colorIndex] = min->v; + } + if (!data.is_hidden()) { + suggested.push_back(colorIndex); + } + if (const auto light = data.vcolors()) { + auto &fields = (*colors)[colorIndex]; + fields.light = parseColors(*light); + if (const auto dark = data.vdark_colors()) { + fields.dark = parseColors(*dark); + } else { + fields.dark = fields.light; + } + } + } + + if (!_colorIndicesCurrent) { + _colorIndicesCurrent = std::make_unique( + Ui::ColorIndicesCompressed{ std::move(colors) }); + _colorIndicesChanged.fire({}); + } else if (*_colorIndicesCurrent->colors != *colors) { + _colorIndicesCurrent->colors = std::move(colors); + _colorIndicesChanged.fire({}); + } + _suggested = std::move(suggested); +} + +} // namespace Api diff --git a/Telegram/SourceFiles/api/api_peer_colors.h b/Telegram/SourceFiles/api/api_peer_colors.h new file mode 100644 index 000000000..f8d379020 --- /dev/null +++ b/Telegram/SourceFiles/api/api_peer_colors.h @@ -0,0 +1,61 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +#include "base/timer.h" +#include "mtproto/sender.h" + +class ApiWrap; + +namespace Ui { +struct ColorIndicesCompressed; +} // namespace Ui + +namespace Api { + +class PeerColors final { +public: + explicit PeerColors(not_null api); + ~PeerColors(); + + [[nodiscard]] std::vector suggested() const; + [[nodiscard]] rpl::producer> suggestedValue() const; + [[nodiscard]] Ui::ColorIndicesCompressed indicesCurrent() const; + [[nodiscard]] auto indicesValue() const + -> rpl::producer; + + [[nodiscard]] auto requiredLevelsGroup() const + -> const base::flat_map &; + [[nodiscard]] auto requiredLevelsChannel() const + -> const base::flat_map &; + + [[nodiscard]] int requiredGroupLevelFor( + PeerId channel, + uint8 index) const; + [[nodiscard]] int requiredChannelLevelFor( + PeerId channel, + uint8 index) const; + +private: + void request(); + void apply(const MTPDhelp_peerColors &data); + + MTP::Sender _api; + int32 _hash = 0; + + mtpRequestId _requestId = 0; + base::Timer _timer; + rpl::variable> _suggested; + base::flat_map _requiredLevelsGroup; + base::flat_map _requiredLevelsChannel; + rpl::event_stream<> _colorIndicesChanged; + std::unique_ptr _colorIndicesCurrent; + +}; + +} // namespace Api diff --git a/Telegram/SourceFiles/api/api_peer_photo.cpp b/Telegram/SourceFiles/api/api_peer_photo.cpp index 97456fdd6..c70ef4491 100644 --- a/Telegram/SourceFiles/api/api_peer_photo.cpp +++ b/Telegram/SourceFiles/api/api_peer_photo.cpp @@ -11,12 +11,16 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "apiwrap.h" #include "base/random.h" #include "base/unixtime.h" +#include "data/stickers/data_stickers.h" #include "data/data_channel.h" #include "data/data_chat.h" +#include "data/data_document.h" +#include "data/data_file_origin.h" #include "data/data_peer.h" #include "data/data_photo.h" #include "data/data_session.h" #include "data/data_user.h" +#include "data/data_user_photos.h" #include "history/history.h" #include "main/main_session.h" #include "storage/file_upload.h" @@ -28,7 +32,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace Api { namespace { -SendMediaReady PreparePeerPhoto( +constexpr auto kSharedMediaLimit = 100; + +[[nodiscard]] SendMediaReady PreparePeerPhoto( MTP::DcId dcId, PeerId peerId, QImage &&image) { @@ -75,7 +81,7 @@ SendMediaReady PreparePeerPhoto( MTP_int(dcId)); QString file, filename; - int32 filesize = 0; + int64 filesize = 0; QByteArray data; return SendMediaReady( @@ -91,8 +97,58 @@ SendMediaReady PreparePeerPhoto( photo, photoThumbs, MTP_documentEmpty(MTP_long(0)), - jpeg, - 0); + jpeg); +} + +[[nodiscard]] std::optional PrepareMtpMarkup( + not_null session, + const PeerPhoto::UserPhoto &d) { + const auto &documentId = d.markupDocumentId; + const auto &colors = d.markupColors; + if (!documentId || colors.empty()) { + return std::nullopt; + } + const auto document = session->data().document(documentId); + if (const auto sticker = document->sticker()) { + if (sticker->isStatic()) { + return std::nullopt; + } + const auto serializeColor = [](const QColor &color) { + return (quint32(std::clamp(color.red(), 0, 255)) << 16) + | (quint32(std::clamp(color.green(), 0, 255)) << 8) + | quint32(std::clamp(color.blue(), 0, 255)); + }; + + auto mtpColors = QVector(); + mtpColors.reserve(colors.size()); + ranges::transform( + colors, + ranges::back_inserter(mtpColors), + [&](const QColor &c) { return MTP_int(serializeColor(c)); }); + if (sticker->setType == Data::StickersType::Emoji) { + return MTP_videoSizeEmojiMarkup( + MTP_long(document->id), + MTP_vector(mtpColors)); + } else if (sticker->set.id && sticker->set.accessHash) { + return MTP_videoSizeStickerMarkup( + MTP_inputStickerSetID( + MTP_long(sticker->set.id), + MTP_long(sticker->set.accessHash)), + MTP_long(document->id), + MTP_vector(mtpColors)); + } else if (!sticker->set.shortName.isEmpty()) { + return MTP_videoSizeStickerMarkup( + MTP_inputStickerSetShortName( + MTP_string(sticker->set.shortName)), + MTP_long(document->id), + MTP_vector(mtpColors)); + } else { + return MTP_videoSizeEmojiMarkup( + MTP_long(document->id), + MTP_vector(mtpColors)); + } + } + return std::nullopt; } } // namespace @@ -105,17 +161,62 @@ PeerPhoto::PeerPhoto(not_null api) // only queued, because it is not constructed yet. _session->uploader().photoReady( ) | rpl::start_with_next([=](const Storage::UploadedMedia &data) { - ready(data.fullId, data.info.file); + ready(data.fullId, data.info.file, std::nullopt); }, _session->lifetime()); }); } -void PeerPhoto::upload(not_null peer, QImage &&image) { +void PeerPhoto::upload( + not_null peer, + UserPhoto &&photo, + Fn done) { + upload(peer, std::move(photo), UploadType::Default, std::move(done)); +} + +void PeerPhoto::uploadFallback(not_null peer, UserPhoto &&photo) { + upload(peer, std::move(photo), UploadType::Fallback, nullptr); +} + +void PeerPhoto::updateSelf( + not_null photo, + Data::FileOrigin origin, + Fn done) { + const auto send = [=](auto resend) -> void { + const auto usedFileReference = photo->fileReference(); + _api.request(MTPphotos_UpdateProfilePhoto( + MTP_flags(0), + MTPInputUser(), // bot + photo->mtpInput() + )).done([=](const MTPphotos_Photo &result) { + result.match([&](const MTPDphotos_photo &data) { + _session->data().processPhoto(data.vphoto()); + _session->data().processUsers(data.vusers()); + }); + if (done) { + done(); + } + }).fail([=](const MTP::Error &error) { + if (error.code() == 400 + && error.type().startsWith(u"FILE_REFERENCE_"_q)) { + photo->session().api().refreshFileReference(origin, [=]( + const auto &) { + if (photo->fileReference() != usedFileReference) { + resend(resend); + } + }); + } + }).send(); + }; + send(send); +} + +void PeerPhoto::upload( + not_null peer, + UserPhoto &&photo, + UploadType type, + Fn done) { peer = peer->migrateToOrMe(); - const auto ready = PreparePeerPhoto( - _api.instance().mainDcId(), - peer->id, - std::move(image)); + const auto mtpMarkup = PrepareMtpMarkup(_session, photo); const auto fakeId = FullMsgId( peer->id, @@ -123,19 +224,35 @@ void PeerPhoto::upload(not_null peer, QImage &&image) { const auto already = ranges::find( _uploads, peer, - [](const auto &pair) { return pair.second; }); + [](const auto &pair) { return pair.second.peer; }); if (already != end(_uploads)) { _session->uploader().cancel(already->first); _uploads.erase(already); } - _uploads.emplace(fakeId, peer); - _session->uploader().uploadMedia(fakeId, ready); + _uploads.emplace( + fakeId, + UploadValue{ peer, type, std::move(done) }); + if (mtpMarkup) { + ready(fakeId, std::nullopt, mtpMarkup); + } else { + const auto ready = PreparePeerPhoto( + _api.instance().mainDcId(), + peer->id, + base::take(photo.image)); + _session->uploader().uploadMedia(fakeId, ready); + } +} + +void PeerPhoto::suggest(not_null peer, UserPhoto &&photo) { + upload(peer, std::move(photo), UploadType::Suggestion, nullptr); } void PeerPhoto::clear(not_null photo) { const auto self = _session->user(); if (self->userpicPhotoId() == photo->id) { _api.request(MTPphotos_UpdateProfilePhoto( + MTP_flags(0), + MTPInputUser(), // bot MTP_inputPhotoEmpty() )).done([=](const MTPphotos_Photo &result) { self->setPhoto(MTP_userProfilePhotoEmpty()); @@ -156,57 +273,314 @@ void PeerPhoto::clear(not_null photo) { )).done(applier).send(); } } else { - _api.request(MTPphotos_DeletePhotos( - MTP_vector(1, photo->mtpInput()) - )).send(); - _session->storage().remove(Storage::UserPhotosRemoveOne( - peerToUser(self->id), - photo->id)); + const auto fallbackPhotoId = SyncUserFallbackPhotoViewer(self); + if (fallbackPhotoId && (*fallbackPhotoId) == photo->id) { + _api.request(MTPphotos_UpdateProfilePhoto( + MTP_flags(MTPphotos_UpdateProfilePhoto::Flag::f_fallback), + MTPInputUser(), // bot + MTP_inputPhotoEmpty() + )).send(); + _session->storage().add(Storage::UserPhotosSetBack( + peerToUser(self->id), + PhotoId())); + } else { + _api.request(MTPphotos_DeletePhotos( + MTP_vector(1, photo->mtpInput()) + )).send(); + _session->storage().remove(Storage::UserPhotosRemoveOne( + peerToUser(self->id), + photo->id)); + } } } -void PeerPhoto::ready(const FullMsgId &msgId, const MTPInputFile &file) { - const auto maybePeer = _uploads.take(msgId); - if (!maybePeer) { +void PeerPhoto::clearPersonal(not_null user) { + _api.request(MTPphotos_UploadContactProfilePhoto( + MTP_flags(MTPphotos_UploadContactProfilePhoto::Flag::f_save), + user->inputUser, + MTPInputFile(), + MTPInputFile(), // video + MTPdouble(), // video_start_ts + MTPVideoSize() // video_emoji_markup + )).done([=](const MTPphotos_Photo &result) { + result.match([&](const MTPDphotos_photo &data) { + _session->data().processPhoto(data.vphoto()); + _session->data().processUsers(data.vusers()); + }); + }).send(); + + if (!user->userpicPhotoUnknown() && user->hasPersonalPhoto()) { + _session->storage().remove(Storage::UserPhotosRemoveOne( + peerToUser(user->id), + user->userpicPhotoId())); + } +} + +void PeerPhoto::set(not_null peer, not_null photo) { + if (peer->userpicPhotoId() == photo->id) { return; } - const auto peer = *maybePeer; - const auto applier = [=](const MTPUpdates &result) { - _session->updates().applyUpdates(result); - }; - if (peer->isSelf()) { - _api.request(MTPphotos_UploadProfilePhoto( - MTP_flags(MTPphotos_UploadProfilePhoto::Flag::f_file), - file, - MTPInputFile(), // video - MTPdouble() // video_start_ts + if (peer == _session->user()) { + _api.request(MTPphotos_UpdateProfilePhoto( + MTP_flags(0), + MTPInputUser(), // bot + photo->mtpInput() )).done([=](const MTPphotos_Photo &result) { result.match([&](const MTPDphotos_photo &data) { _session->data().processPhoto(data.vphoto()); _session->data().processUsers(data.vusers()); }); }).send(); + } else { + const auto applier = [=](const MTPUpdates &result) { + _session->updates().applyUpdates(result); + }; + if (const auto chat = peer->asChat()) { + _api.request(MTPmessages_EditChatPhoto( + chat->inputChat, + MTP_inputChatPhoto(photo->mtpInput()) + )).done(applier).send(); + } else if (const auto channel = peer->asChannel()) { + _api.request(MTPchannels_EditPhoto( + channel->inputChannel, + MTP_inputChatPhoto(photo->mtpInput()) + )).done(applier).send(); + } + } +} + +void PeerPhoto::ready( + const FullMsgId &msgId, + std::optional file, + std::optional videoSize) { + const auto maybeUploadValue = _uploads.take(msgId); + if (!maybeUploadValue) { + return; + } + const auto peer = maybeUploadValue->peer; + const auto type = maybeUploadValue->type; + const auto done = maybeUploadValue->done; + const auto applier = [=](const MTPUpdates &result) { + _session->updates().applyUpdates(result); + if (done) { + done(); + } + }; + const auto botUserInput = [&] { + const auto user = peer->asUser(); + return (user && user->botInfo && user->botInfo->canEditInformation) + ? std::make_optional(user->inputUser) + : std::nullopt; + }(); + if (peer->isSelf() || botUserInput) { + using Flag = MTPphotos_UploadProfilePhoto::Flag; + const auto none = MTPphotos_UploadProfilePhoto::Flags(0); + _api.request(MTPphotos_UploadProfilePhoto( + MTP_flags((file ? Flag::f_file : none) + | (botUserInput ? Flag::f_bot : none) + | (videoSize ? Flag::f_video_emoji_markup : none) + | ((type == UploadType::Fallback) ? Flag::f_fallback : none)), + botUserInput ? (*botUserInput) : MTPInputUser(), // bot + file ? (*file) : MTPInputFile(), + MTPInputFile(), // video + MTPdouble(), // video_start_ts + videoSize ? (*videoSize) : MTPVideoSize() // video_emoji_markup + )).done([=](const MTPphotos_Photo &result) { + const auto photoId = _session->data().processPhoto( + result.data().vphoto())->id; + _session->data().processUsers(result.data().vusers()); + if (type == UploadType::Fallback) { + _session->storage().add(Storage::UserPhotosSetBack( + peerToUser(peer->id), + photoId)); + } + if (done) { + done(); + } + }).send(); } else if (const auto chat = peer->asChat()) { const auto history = _session->data().history(chat); + using Flag = MTPDinputChatUploadedPhoto::Flag; + const auto none = MTPDinputChatUploadedPhoto::Flags(0); history->sendRequestId = _api.request(MTPmessages_EditChatPhoto( chat->inputChat, MTP_inputChatUploadedPhoto( - MTP_flags(MTPDinputChatUploadedPhoto::Flag::f_file), - file, + MTP_flags((file ? Flag::f_file : none) + | (videoSize ? Flag::f_video_emoji_markup : none)), + file ? (*file) : MTPInputFile(), MTPInputFile(), // video - MTPdouble()) // video_start_ts + MTPdouble(), // video_start_ts + videoSize ? (*videoSize) : MTPVideoSize()) // video_emoji_markup )).done(applier).afterRequest(history->sendRequestId).send(); } else if (const auto channel = peer->asChannel()) { + using Flag = MTPDinputChatUploadedPhoto::Flag; + const auto none = MTPDinputChatUploadedPhoto::Flags(0); const auto history = _session->data().history(channel); history->sendRequestId = _api.request(MTPchannels_EditPhoto( channel->inputChannel, MTP_inputChatUploadedPhoto( - MTP_flags(MTPDinputChatUploadedPhoto::Flag::f_file), - file, + MTP_flags((file ? Flag::f_file : none) + | (videoSize ? Flag::f_video_emoji_markup : none)), + file ? (*file) : MTPInputFile(), MTPInputFile(), // video - MTPdouble()) // video_start_ts + MTPdouble(), // video_start_ts + videoSize ? (*videoSize) : MTPVideoSize()) // video_emoji_markup )).done(applier).afterRequest(history->sendRequestId).send(); + } else if (const auto user = peer->asUser()) { + using Flag = MTPphotos_UploadContactProfilePhoto::Flag; + const auto none = MTPphotos_UploadContactProfilePhoto::Flags(0); + _api.request(MTPphotos_UploadContactProfilePhoto( + MTP_flags((file ? Flag::f_file : none) + | (videoSize ? Flag::f_video_emoji_markup : none) + | ((type == UploadType::Suggestion) + ? Flag::f_suggest + : Flag::f_save)), + user->inputUser, + file ? (*file) : MTPInputFile(), + MTPInputFile(), // video + MTPdouble(), // video_start_ts + videoSize ? (*videoSize) : MTPVideoSize() // video_emoji_markup + )).done([=](const MTPphotos_Photo &result) { + result.match([&](const MTPDphotos_photo &data) { + _session->data().processPhoto(data.vphoto()); + _session->data().processUsers(data.vusers()); + }); + if (type != UploadType::Suggestion) { + user->updateFullForced(); + } + if (done) { + done(); + } + }).send(); } } +void PeerPhoto::requestUserPhotos( + not_null user, + UserPhotoId afterId) { + if (_userPhotosRequests.contains(user)) { + return; + } + + const auto requestId = _api.request(MTPphotos_GetUserPhotos( + user->inputUser, + MTP_int(0), + MTP_long(afterId), + MTP_int(kSharedMediaLimit) + )).done([this, user](const MTPphotos_Photos &result) { + _userPhotosRequests.remove(user); + + auto fullCount = result.match([](const MTPDphotos_photos &d) { + return int(d.vphotos().v.size()); + }, [](const MTPDphotos_photosSlice &d) { + return d.vcount().v; + }); + + auto &owner = _session->data(); + auto photoIds = result.match([&](const auto &data) { + owner.processUsers(data.vusers()); + + auto photoIds = std::vector(); + photoIds.reserve(data.vphotos().v.size()); + + for (const auto &single : data.vphotos().v) { + const auto photo = owner.processPhoto(single); + if (!photo->isNull()) { + photoIds.push_back(photo->id); + } + } + return photoIds; + }); + if (!user->userpicPhotoUnknown() && user->hasPersonalPhoto()) { + const auto photo = owner.photo(user->userpicPhotoId()); + if (!photo->isNull()) { + ++fullCount; + photoIds.insert(begin(photoIds), photo->id); + } + } + + _session->storage().add(Storage::UserPhotosAddSlice( + peerToUser(user->id), + std::move(photoIds), + fullCount + )); + }).fail([this, user] { + _userPhotosRequests.remove(user); + }).send(); + _userPhotosRequests.emplace(user, requestId); +} + +auto PeerPhoto::emojiList(EmojiListType type) -> EmojiListData & { + switch (type) { + case EmojiListType::Profile: return _profileEmojiList; + case EmojiListType::Group: return _groupEmojiList; + case EmojiListType::Background: return _backgroundEmojiList; + case EmojiListType::NoChannelStatus: return _noChannelStatusEmojiList; + } + Unexpected("Type in PeerPhoto::emojiList."); +} + +auto PeerPhoto::emojiList(EmojiListType type) const +-> const EmojiListData & { + return const_cast(this)->emojiList(type); +} + +void PeerPhoto::requestEmojiList(EmojiListType type) { + auto &list = emojiList(type); + if (list.requestId) { + return; + } + const auto send = [&](auto &&request) { + return _api.request( + std::move(request) + ).done([=](const MTPEmojiList &result) { + auto &list = emojiList(type); + list.requestId = 0; + result.match([](const MTPDemojiListNotModified &data) { + }, [&](const MTPDemojiList &data) { + list.list = ranges::views::all( + data.vdocument_id().v + ) | ranges::views::transform( + &MTPlong::v + ) | ranges::to_vector; + }); + }).fail([=] { + emojiList(type).requestId = 0; + }).send(); + }; + list.requestId = (type == EmojiListType::Profile) + ? send(MTPaccount_GetDefaultProfilePhotoEmojis()) + : (type == EmojiListType::Group) + ? send(MTPaccount_GetDefaultGroupPhotoEmojis()) + : (type == EmojiListType::NoChannelStatus) + ? send(MTPaccount_GetChannelRestrictedStatusEmojis()) + : send(MTPaccount_GetDefaultBackgroundEmojis()); +} + +rpl::producer PeerPhoto::emojiListValue( + EmojiListType type) { + auto &list = emojiList(type); + if (list.list.current().empty() && !list.requestId) { + requestEmojiList(type); + } + return list.list.value(); +} + +// Non-personal photo in case a personal photo is set. +void PeerPhoto::registerNonPersonalPhoto( + not_null user, + not_null photo) { + _nonPersonalPhotos.emplace_or_assign(user, photo); +} + +void PeerPhoto::unregisterNonPersonalPhoto(not_null user) { + _nonPersonalPhotos.erase(user); +} + +PhotoData *PeerPhoto::nonPersonalPhoto( + not_null user) const { + const auto i = _nonPersonalPhotos.find(user); + return (i != end(_nonPersonalPhotos)) ? i->second.get() : nullptr; +} + } // namespace Api diff --git a/Telegram/SourceFiles/api/api_peer_photo.h b/Telegram/SourceFiles/api/api_peer_photo.h index 795b498b8..71d340a03 100644 --- a/Telegram/SourceFiles/api/api_peer_photo.h +++ b/Telegram/SourceFiles/api/api_peer_photo.h @@ -11,6 +11,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL class ApiWrap; class PeerData; +class UserData; + +namespace Data { +struct FileOrigin; +} // namespace Data namespace Main { class Session; @@ -20,18 +25,95 @@ namespace Api { class PeerPhoto final { public: + using UserPhotoId = PhotoId; explicit PeerPhoto(not_null api); - void upload(not_null peer, QImage &&image); + enum class EmojiListType { + Profile, + Group, + Background, + NoChannelStatus, + }; + + struct UserPhoto { + QImage image; + DocumentId markupDocumentId = 0; + std::vector markupColors; + }; + + void upload( + not_null peer, + UserPhoto &&photo, + Fn done = nullptr); + void uploadFallback(not_null peer, UserPhoto &&photo); + void updateSelf( + not_null photo, + Data::FileOrigin origin, + Fn done = nullptr); + void suggest(not_null peer, UserPhoto &&photo); void clear(not_null photo); + void clearPersonal(not_null user); + void set(not_null peer, not_null photo); + + void requestUserPhotos(not_null user, UserPhotoId afterId); + + void requestEmojiList(EmojiListType type); + using EmojiList = std::vector; + [[nodiscard]] rpl::producer emojiListValue(EmojiListType type); + + // Non-personal photo in case a personal photo is set. + void registerNonPersonalPhoto( + not_null user, + not_null photo); + void unregisterNonPersonalPhoto(not_null user); + [[nodiscard]] PhotoData *nonPersonalPhoto( + not_null user) const; private: - void ready(const FullMsgId &msgId, const MTPInputFile &file); + enum class UploadType { + Default, + Suggestion, + Fallback, + }; + struct EmojiListData { + rpl::variable list; + mtpRequestId requestId = 0; + }; + + void ready( + const FullMsgId &msgId, + std::optional file, + std::optional videoSize); + void upload( + not_null peer, + UserPhoto &&photo, + UploadType type, + Fn done); + + [[nodiscard]] EmojiListData &emojiList(EmojiListType type); + [[nodiscard]] const EmojiListData &emojiList(EmojiListType type) const; const not_null _session; MTP::Sender _api; - base::flat_map> _uploads; + struct UploadValue { + not_null peer; + UploadType type = UploadType::Default; + Fn done; + }; + + base::flat_map _uploads; + + base::flat_map, mtpRequestId> _userPhotosRequests; + + base::flat_map< + not_null, + not_null> _nonPersonalPhotos; + + EmojiListData _profileEmojiList; + EmojiListData _groupEmojiList; + EmojiListData _backgroundEmojiList; + EmojiListData _noChannelStatusEmojiList; }; diff --git a/Telegram/SourceFiles/api/api_polls.cpp b/Telegram/SourceFiles/api/api_polls.cpp index 7f4924a41..3532e2c79 100644 --- a/Telegram/SourceFiles/api/api_polls.cpp +++ b/Telegram/SourceFiles/api/api_polls.cpp @@ -11,12 +11,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_updates.h" #include "apiwrap.h" #include "base/random.h" +#include "data/business/data_shortcut_messages.h" #include "data/data_changes.h" #include "data/data_histories.h" #include "data/data_poll.h" #include "data/data_session.h" #include "history/history.h" -#include "history/history_message.h" // ShouldSendSilent +#include "history/history_item.h" +#include "history/history_item_helpers.h" // ShouldSendSilent #include "main/main_session.h" namespace Api { @@ -37,21 +39,24 @@ void Polls::create( const PollData &data, const SendAction &action, Fn done, - Fn fail) { + Fn fail) { _session->api().sendAction(action); const auto history = action.history; const auto peer = history->peer; + const auto topicRootId = action.replyTo.messageId + ? action.replyTo.topicRootId + : 0; auto sendFlags = MTPmessages_SendMedia::Flags(0); if (action.replyTo) { - sendFlags |= MTPmessages_SendMedia::Flag::f_reply_to_msg_id; + sendFlags |= MTPmessages_SendMedia::Flag::f_reply_to; } const auto clearCloudDraft = action.clearDraft; if (clearCloudDraft) { sendFlags |= MTPmessages_SendMedia::Flag::f_clear_draft; - history->clearLocalDraft(); - history->clearCloudDraft(); - history->startSavingCloudDraft(); + history->clearLocalDraft(topicRootId); + history->clearCloudDraft(topicRootId); + history->startSavingCloudDraft(topicRootId); } const auto silentPost = ShouldSendSilent(peer, action.options); if (silentPost) { @@ -60,52 +65,50 @@ void Polls::create( if (action.options.scheduled) { sendFlags |= MTPmessages_SendMedia::Flag::f_schedule_date; } + if (action.options.shortcutId) { + sendFlags |= MTPmessages_SendMedia::Flag::f_quick_reply_shortcut; + } const auto sendAs = action.options.sendAs; if (sendAs) { sendFlags |= MTPmessages_SendMedia::Flag::f_send_as; } auto &histories = history->owner().histories(); - const auto requestType = Data::Histories::RequestType::Send; - histories.sendRequest(history, requestType, [=](Fn finish) { - const auto replyTo = action.replyTo; - history->sendRequestId = _api.request(MTPmessages_SendMedia( + const auto randomId = base::RandomValue(); + histories.sendPreparedMessage( + history, + action.replyTo, + randomId, + Data::Histories::PrepareMessage( MTP_flags(sendFlags), peer->input, - MTP_int(replyTo), + Data::Histories::ReplyToPlaceholder(), PollDataToInputMedia(&data), MTP_string(), - MTP_long(base::RandomValue()), + MTP_long(randomId), MTPReplyMarkup(), MTPVector(), MTP_int(action.options.scheduled), - (sendAs ? sendAs->input : MTP_inputPeerEmpty()) - )).done([=]( - const MTPUpdates &result, - const MTP::Response &response) mutable { - _session->updates().applyUpdates(result); - if (clearCloudDraft) { - history->finishSavingCloudDraft( - UnixtimeFromMsgId(response.outerMsgId)); - } - _session->changes().historyUpdated( - history, - (action.options.scheduled - ? Data::HistoryUpdate::Flag::ScheduledSent - : Data::HistoryUpdate::Flag::MessageSent)); - done(); - finish(); - }).fail([=]( - const MTP::Error &error, - const MTP::Response &response) mutable { - if (clearCloudDraft) { - history->finishSavingCloudDraft( - UnixtimeFromMsgId(response.outerMsgId)); - } - fail(error); - finish(); - }).afterRequest(history->sendRequestId - ).send(); - return history->sendRequestId; + (sendAs ? sendAs->input : MTP_inputPeerEmpty()), + Data::ShortcutIdToMTP(_session, action.options.shortcutId) + ), [=](const MTPUpdates &result, const MTP::Response &response) { + if (clearCloudDraft) { + history->finishSavingCloudDraft( + topicRootId, + UnixtimeFromMsgId(response.outerMsgId)); + } + _session->changes().historyUpdated( + history, + (action.options.scheduled + ? Data::HistoryUpdate::Flag::ScheduledSent + : Data::HistoryUpdate::Flag::MessageSent)); + done(); + }, [=](const MTP::Error &error, const MTP::Response &response) { + if (clearCloudDraft) { + history->finishSavingCloudDraft( + topicRootId, + UnixtimeFromMsgId(response.outerMsgId)); + } + fail(); }); } @@ -175,7 +178,8 @@ void Polls::close(not_null item) { PollDataToInputMedia(poll, true), MTPReplyMarkup(), MTPVector(), - MTP_int(0) // schedule_date + MTP_int(0), // schedule_date + MTPint() // quick_reply_shortcut_id )).done([=](const MTPUpdates &result) { _pollCloseRequestIds.erase(itemId); _session->updates().applyUpdates(result); diff --git a/Telegram/SourceFiles/api/api_polls.h b/Telegram/SourceFiles/api/api_polls.h index 29ffe3142..2ff08a1ac 100644 --- a/Telegram/SourceFiles/api/api_polls.h +++ b/Telegram/SourceFiles/api/api_polls.h @@ -29,7 +29,7 @@ public: const PollData &data, const SendAction &action, Fn done, - Fn fail); + Fn fail); void sendVotes( FullMsgId itemId, const std::vector &options); diff --git a/Telegram/SourceFiles/api/api_premium.cpp b/Telegram/SourceFiles/api/api_premium.cpp new file mode 100644 index 000000000..72da2a489 --- /dev/null +++ b/Telegram/SourceFiles/api/api_premium.cpp @@ -0,0 +1,612 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "api/api_premium.h" + +#include "api/api_premium_option.h" +#include "api/api_text_entities.h" +#include "apiwrap.h" +#include "base/random.h" +#include "data/data_document.h" +#include "data/data_peer.h" +#include "data/data_peer_values.h" +#include "data/data_session.h" +#include "data/data_user.h" +#include "history/view/history_view_element.h" +#include "history/history.h" +#include "history/history_item.h" +#include "main/main_account.h" +#include "main/main_app_config.h" +#include "main/main_session.h" +#include "payments/payments_form.h" +#include "ui/text/format_values.h" + +namespace Api { +namespace { + +[[nodiscard]] GiftCode Parse(const MTPDpayments_checkedGiftCode &data) { + return { + .from = data.vfrom_id() ? peerFromMTP(*data.vfrom_id()) : PeerId(), + .to = data.vto_id() ? peerFromUser(*data.vto_id()) : PeerId(), + .giveawayId = data.vgiveaway_msg_id().value_or_empty(), + .date = data.vdate().v, + .used = data.vused_date().value_or_empty(), + .months = data.vmonths().v, + .giveaway = data.is_via_giveaway(), + }; +} + +[[nodiscard]] Data::SubscriptionOptions GiftCodesFromTL( + const QVector &tlOptions) { + auto options = SubscriptionOptionsFromTL(tlOptions); + for (auto i = 0; i < options.size(); i++) { + const auto &tlOption = tlOptions[i].data(); + const auto perUserText = Ui::FillAmountAndCurrency( + tlOption.vamount().v / float64(tlOption.vusers().v), + qs(tlOption.vcurrency()), + false); + options[i].costPerMonth = perUserText + + ' ' + + QChar(0x00D7) + + ' ' + + QString::number(tlOption.vusers().v); + } + return options; +} + +} // namespace + +Premium::Premium(not_null api) +: _session(&api->session()) +, _api(&api->instance()) { + crl::on_main(_session, [=] { + // You can't use _session->user() in the constructor, + // only queued, because it is not constructed yet. + Data::AmPremiumValue( + _session + ) | rpl::start_with_next([=] { + reload(); + if (_session->premium()) { + reloadCloudSet(); + } + }, _session->lifetime()); + }); +} + +rpl::producer Premium::statusTextValue() const { + return _statusTextUpdates.events_starting_with_copy( + _statusText.value_or(TextWithEntities())); +} + +auto Premium::videos() const +-> const base::flat_map> & { + return _videos; +} + +rpl::producer<> Premium::videosUpdated() const { + return _videosUpdated.events(); +} + +auto Premium::stickers() const +-> const std::vector> & { + return _stickers; +} + +rpl::producer<> Premium::stickersUpdated() const { + return _stickersUpdated.events(); +} + +auto Premium::cloudSet() const +-> const std::vector> & { + return _cloudSet; +} + +rpl::producer<> Premium::cloudSetUpdated() const { + return _cloudSetUpdated.events(); +} + +int64 Premium::monthlyAmount() const { + return _monthlyAmount; +} + +QString Premium::monthlyCurrency() const { + return _monthlyCurrency; +} + +void Premium::reload() { + reloadPromo(); + reloadStickers(); +} + +void Premium::reloadPromo() { + if (_promoRequestId) { + return; + } + _promoRequestId = _api.request(MTPhelp_GetPremiumPromo( + )).done([=](const MTPhelp_PremiumPromo &result) { + _promoRequestId = 0; + const auto &data = result.data(); + _session->data().processUsers(data.vusers()); + + _subscriptionOptions = SubscriptionOptionsFromTL( + data.vperiod_options().v); + for (const auto &option : data.vperiod_options().v) { + if (option.data().vmonths().v == 1) { + _monthlyAmount = option.data().vamount().v; + _monthlyCurrency = qs(option.data().vcurrency()); + } + } + auto text = TextWithEntities{ + qs(data.vstatus_text()), + EntitiesFromMTP(_session, data.vstatus_entities().v), + }; + _statusText = text; + _statusTextUpdates.fire(std::move(text)); + auto videos = base::flat_map>(); + const auto count = int(std::min( + data.vvideo_sections().v.size(), + data.vvideos().v.size())); + videos.reserve(count); + for (auto i = 0; i != count; ++i) { + const auto document = _session->data().processDocument( + data.vvideos().v[i]); + if ((!document->isVideoFile() && !document->isGifv()) + || !document->supportsStreaming()) { + document->forceIsStreamedAnimation(); + } + videos.emplace( + qs(data.vvideo_sections().v[i]), + document); + } + if (_videos != videos) { + _videos = std::move(videos); + _videosUpdated.fire({}); + } + }).fail([=] { + _promoRequestId = 0; + }).send(); +} + +void Premium::reloadStickers() { + if (_stickersRequestId) { + return; + } + _stickersRequestId = _api.request(MTPmessages_GetStickers( + MTP_string("\xe2\xad\x90\xef\xb8\x8f\xe2\xad\x90\xef\xb8\x8f"), + MTP_long(_stickersHash) + )).done([=](const MTPmessages_Stickers &result) { + _stickersRequestId = 0; + result.match([&](const MTPDmessages_stickersNotModified &) { + }, [&](const MTPDmessages_stickers &data) { + _stickersHash = data.vhash().v; + const auto owner = &_session->data(); + _stickers.clear(); + for (const auto &sticker : data.vstickers().v) { + const auto document = owner->processDocument(sticker); + if (document->isPremiumSticker()) { + _stickers.push_back(document); + } + } + _stickersUpdated.fire({}); + }); + }).fail([=] { + _stickersRequestId = 0; + }).send(); +} + +void Premium::reloadCloudSet() { + if (_cloudSetRequestId) { + return; + } + _cloudSetRequestId = _api.request(MTPmessages_GetStickers( + MTP_string("\xf0\x9f\x93\x82\xe2\xad\x90\xef\xb8\x8f"), + MTP_long(_cloudSetHash) + )).done([=](const MTPmessages_Stickers &result) { + _cloudSetRequestId = 0; + result.match([&](const MTPDmessages_stickersNotModified &) { + }, [&](const MTPDmessages_stickers &data) { + _cloudSetHash = data.vhash().v; + const auto owner = &_session->data(); + _cloudSet.clear(); + for (const auto &sticker : data.vstickers().v) { + const auto document = owner->processDocument(sticker); + if (document->isPremiumSticker()) { + _cloudSet.push_back(document); + } + } + _cloudSetUpdated.fire({}); + }); + }).fail([=] { + _cloudSetRequestId = 0; + }).send(); +} + +void Premium::checkGiftCode( + const QString &slug, + Fn done) { + if (_giftCodeRequestId) { + if (_giftCodeSlug == slug) { + return; + } + _api.request(_giftCodeRequestId).cancel(); + } + _giftCodeSlug = slug; + _giftCodeRequestId = _api.request(MTPpayments_CheckGiftCode( + MTP_string(slug) + )).done([=](const MTPpayments_CheckedGiftCode &result) { + _giftCodeRequestId = 0; + + const auto &data = result.data(); + _session->data().processUsers(data.vusers()); + _session->data().processChats(data.vchats()); + done(updateGiftCode(slug, Parse(data))); + }).fail([=](const MTP::Error &error) { + _giftCodeRequestId = 0; + + done(updateGiftCode(slug, {})); + }).send(); +} + +GiftCode Premium::updateGiftCode( + const QString &slug, + const GiftCode &code) { + auto &now = _giftCodes[slug]; + if (now != code) { + now = code; + _giftCodeUpdated.fire_copy(slug); + } + return code; +} + +rpl::producer Premium::giftCodeValue(const QString &slug) const { + return _giftCodeUpdated.events_starting_with_copy( + slug + ) | rpl::filter(rpl::mappers::_1 == slug) | rpl::map([=] { + const auto i = _giftCodes.find(slug); + return (i != end(_giftCodes)) ? i->second : GiftCode(); + }); +} + +void Premium::applyGiftCode(const QString &slug, Fn done) { + _api.request(MTPpayments_ApplyGiftCode( + MTP_string(slug) + )).done([=](const MTPUpdates &result) { + _session->api().applyUpdates(result); + done({}); + }).fail([=](const MTP::Error &error) { + done(error.type()); + }).send(); +} + +void Premium::resolveGiveawayInfo( + not_null peer, + MsgId messageId, + Fn done) { + Expects(done != nullptr); + + _giveawayInfoDone = std::move(done); + if (_giveawayInfoRequestId) { + if (_giveawayInfoPeer == peer + && _giveawayInfoMessageId == messageId) { + return; + } + _api.request(_giveawayInfoRequestId).cancel(); + } + _giveawayInfoPeer = peer; + _giveawayInfoMessageId = messageId; + _giveawayInfoRequestId = _api.request(MTPpayments_GetGiveawayInfo( + _giveawayInfoPeer->input, + MTP_int(_giveawayInfoMessageId.bare) + )).done([=](const MTPpayments_GiveawayInfo &result) { + _giveawayInfoRequestId = 0; + + auto info = GiveawayInfo(); + result.match([&](const MTPDpayments_giveawayInfo &data) { + info.participating = data.is_participating(); + info.state = data.is_preparing_results() + ? GiveawayState::Preparing + : GiveawayState::Running; + info.adminChannelId = data.vadmin_disallowed_chat_id() + ? ChannelId(*data.vadmin_disallowed_chat_id()) + : ChannelId(); + info.disallowedCountry = qs( + data.vdisallowed_country().value_or_empty()); + info.tooEarlyDate + = data.vjoined_too_early_date().value_or_empty(); + info.startDate = data.vstart_date().v; + }, [&](const MTPDpayments_giveawayInfoResults &data) { + info.state = data.is_refunded() + ? GiveawayState::Refunded + : GiveawayState::Finished; + info.giftCode = qs(data.vgift_code_slug().value_or_empty()); + info.activatedCount = data.vactivated_count().v; + info.finishDate = data.vfinish_date().v; + info.startDate = data.vstart_date().v; + }); + _giveawayInfoDone(std::move(info)); + }).fail([=] { + _giveawayInfoRequestId = 0; + _giveawayInfoDone({}); + }).send(); +} + +const Data::SubscriptionOptions &Premium::subscriptionOptions() const { + return _subscriptionOptions; +} + +rpl::producer<> Premium::somePremiumRequiredResolved() const { + return _somePremiumRequiredResolved.events(); +} + +void Premium::resolvePremiumRequired(not_null user) { + _resolvePremiumRequiredUsers.emplace(user); + if (!_premiumRequiredRequestScheduled + && _resolvePremiumRequestedUsers.empty()) { + _premiumRequiredRequestScheduled = true; + crl::on_main(_session, [=] { + requestPremiumRequiredSlice(); + }); + } +} + +void Premium::requestPremiumRequiredSlice() { + _premiumRequiredRequestScheduled = false; + if (!_resolvePremiumRequestedUsers.empty() + || _resolvePremiumRequiredUsers.empty()) { + return; + } + constexpr auto kPerRequest = 100; + auto users = MTP_vector_from_range(_resolvePremiumRequiredUsers + | ranges::views::transform(&UserData::inputUser)); + if (users.v.size() > kPerRequest) { + auto shortened = users.v; + shortened.resize(kPerRequest); + users = MTP_vector(std::move(shortened)); + const auto from = begin(_resolvePremiumRequiredUsers); + _resolvePremiumRequestedUsers = { from, from + kPerRequest }; + _resolvePremiumRequiredUsers.erase(from, from + kPerRequest); + } else { + _resolvePremiumRequestedUsers + = base::take(_resolvePremiumRequiredUsers); + } + const auto finish = [=](const QVector &list) { + constexpr auto me = UserDataFlag::MeRequiresPremiumToWrite; + constexpr auto known = UserDataFlag::RequirePremiumToWriteKnown; + constexpr auto mask = me | known; + + auto index = 0; + for (const auto &user : base::take(_resolvePremiumRequestedUsers)) { + const auto require = (index < list.size()) + && mtpIsTrue(list[index++]); + user->setFlags((user->flags() & ~mask) + | known + | (require ? me : UserDataFlag())); + } + if (!_premiumRequiredRequestScheduled + && !_resolvePremiumRequiredUsers.empty()) { + _premiumRequiredRequestScheduled = true; + crl::on_main(_session, [=] { + requestPremiumRequiredSlice(); + }); + } + _somePremiumRequiredResolved.fire({}); + }; + _session->api().request( + MTPusers_GetIsPremiumRequiredToContact(std::move(users)) + ).done([=](const MTPVector &result) { + finish(result.v); + }).fail([=] { + finish({}); + }).send(); +} + +PremiumGiftCodeOptions::PremiumGiftCodeOptions(not_null peer) +: _peer(peer) +, _api(&peer->session().api().instance()) { +} + +rpl::producer PremiumGiftCodeOptions::request() { + return [=](auto consumer) { + auto lifetime = rpl::lifetime(); + + using TLOption = MTPPremiumGiftCodeOption; + _api.request(MTPpayments_GetPremiumGiftCodeOptions( + MTP_flags(_peer->isChannel() + ? MTPpayments_GetPremiumGiftCodeOptions::Flag::f_boost_peer + : MTPpayments_GetPremiumGiftCodeOptions::Flag(0)), + _peer->input + )).done([=](const MTPVector &result) { + auto tlMapOptions = base::flat_map>(); + for (const auto &tlOption : result.v) { + const auto &data = tlOption.data(); + tlMapOptions[data.vusers().v].push_back(tlOption); + + const auto token = Token{ data.vusers().v, data.vmonths().v }; + _stores[token] = Store{ + .amount = data.vamount().v, + .product = qs(data.vstore_product().value_or_empty()), + .quantity = data.vstore_quantity().value_or_empty(), + }; + if (!ranges::contains(_availablePresets, data.vusers().v)) { + _availablePresets.push_back(data.vusers().v); + } + } + for (const auto &[amount, tlOptions] : tlMapOptions) { + if (amount == 1 && _optionsForOnePerson.currency.isEmpty()) { + _optionsForOnePerson.currency = qs( + tlOptions.front().data().vcurrency()); + for (const auto &option : tlOptions) { + _optionsForOnePerson.months.push_back( + option.data().vmonths().v); + _optionsForOnePerson.totalCosts.push_back( + option.data().vamount().v); + } + } + _subscriptionOptions[amount] = GiftCodesFromTL(tlOptions); + } + consumer.put_done(); + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).send(); + + return lifetime; + }; +} + +rpl::producer PremiumGiftCodeOptions::applyPrepaid( + const Payments::InvoicePremiumGiftCode &invoice, + uint64 prepaidId) { + return [=](auto consumer) { + auto lifetime = rpl::lifetime(); + const auto channel = _peer->asChannel(); + if (!channel) { + return lifetime; + } + + _api.request(MTPpayments_LaunchPrepaidGiveaway( + _peer->input, + MTP_long(prepaidId), + Payments::InvoicePremiumGiftCodeGiveawayToTL(invoice) + )).done([=](const MTPUpdates &result) { + _peer->session().api().applyUpdates(result); + consumer.put_done(); + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).send(); + + return lifetime; + }; +} + +const std::vector &PremiumGiftCodeOptions::availablePresets() const { + return _availablePresets; +} + +[[nodiscard]] int PremiumGiftCodeOptions::monthsFromPreset(int monthsIndex) { + Expects(monthsIndex >= 0 && monthsIndex < _availablePresets.size()); + + return _optionsForOnePerson.months[monthsIndex]; +} + +Payments::InvoicePremiumGiftCode PremiumGiftCodeOptions::invoice( + int users, + int months) { + const auto randomId = base::RandomValue(); + const auto token = Token{ users, months }; + const auto &store = _stores[token]; + return Payments::InvoicePremiumGiftCode{ + .randomId = randomId, + .currency = _optionsForOnePerson.currency, + .amount = store.amount, + .storeProduct = store.product, + .storeQuantity = store.quantity, + .users = token.users, + .months = token.months, + }; +} + +Data::SubscriptionOptions PremiumGiftCodeOptions::options(int amount) { + const auto it = _subscriptionOptions.find(amount); + if (it != end(_subscriptionOptions)) { + return it->second; + } else { + auto tlOptions = QVector(); + for (auto i = 0; i < _optionsForOnePerson.months.size(); i++) { + tlOptions.push_back(MTP_premiumGiftCodeOption( + MTP_flags(MTPDpremiumGiftCodeOption::Flags(0)), + MTP_int(amount), + MTP_int(_optionsForOnePerson.months[i]), + MTPstring(), + MTPint(), + MTP_string(_optionsForOnePerson.currency), + MTP_long(_optionsForOnePerson.totalCosts[i] * amount))); + } + _subscriptionOptions[amount] = GiftCodesFromTL(tlOptions); + return _subscriptionOptions[amount]; + } +} + +int PremiumGiftCodeOptions::giveawayBoostsPerPremium() const { + constexpr auto kFallbackCount = 4; + return _peer->session().account().appConfig().get( + u"giveaway_boosts_per_premium"_q, + kFallbackCount); +} + +int PremiumGiftCodeOptions::giveawayCountriesMax() const { + constexpr auto kFallbackCount = 10; + return _peer->session().account().appConfig().get( + u"giveaway_countries_max"_q, + kFallbackCount); +} + +int PremiumGiftCodeOptions::giveawayAddPeersMax() const { + constexpr auto kFallbackCount = 10; + return _peer->session().account().appConfig().get( + u"giveaway_add_peers_max"_q, + kFallbackCount); +} + +int PremiumGiftCodeOptions::giveawayPeriodMax() const { + constexpr auto kFallbackCount = 3600 * 24 * 7; + return _peer->session().account().appConfig().get( + u"giveaway_period_max"_q, + kFallbackCount); +} + +bool PremiumGiftCodeOptions::giveawayGiftsPurchaseAvailable() const { + return _peer->session().account().appConfig().get( + u"giveaway_gifts_purchase_available"_q, + false); +} + +RequirePremiumState ResolveRequiresPremiumToWrite( + not_null peer, + History *maybeHistory) { + const auto user = peer->asUser(); + if (!user + || !user->someRequirePremiumToWrite() + || user->session().premium()) { + return RequirePremiumState::No; + } else if (user->requirePremiumToWriteKnown()) { + return user->meRequiresPremiumToWrite() + ? RequirePremiumState::Yes + : RequirePremiumState::No; + } else if (user->flags() & UserDataFlag::MutualContact) { + return RequirePremiumState::No; + } else if (!maybeHistory) { + return RequirePremiumState::Unknown; + } + + const auto update = [&](bool require) { + using Flag = UserDataFlag; + constexpr auto known = Flag::RequirePremiumToWriteKnown; + constexpr auto me = Flag::MeRequiresPremiumToWrite; + user->setFlags((user->flags() & ~me) + | known + | (require ? me : Flag())); + }; + // We allow this potentially-heavy loop because in case we've opened + // the chat and have a lot of messages `requires_premium` will be known. + for (const auto &block : maybeHistory->blocks) { + for (const auto &view : block->messages) { + const auto item = view->data(); + if (!item->out() && !item->isService()) { + update(false); + return RequirePremiumState::No; + } + } + } + if (user->isContact() // Here we know, that we're not in his contacts. + && maybeHistory->loadedAtTop() // And no incoming messages. + && maybeHistory->loadedAtBottom()) { + update(true); + } + return RequirePremiumState::Unknown; +} + +} // namespace Api diff --git a/Telegram/SourceFiles/api/api_premium.h b/Telegram/SourceFiles/api/api_premium.h new file mode 100644 index 000000000..e1c3a7b41 --- /dev/null +++ b/Telegram/SourceFiles/api/api_premium.h @@ -0,0 +1,218 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +#include "data/data_subscription_option.h" +#include "mtproto/sender.h" + +class History; +class ApiWrap; + +namespace Main { +class Session; +} // namespace Main + +namespace Payments { +struct InvoicePremiumGiftCode; +} // namespace Payments + +namespace Api { + +struct GiftCode { + PeerId from = 0; + PeerId to = 0; + MsgId giveawayId = 0; + TimeId date = 0; + TimeId used = 0; // 0 if not used. + int months = 0; + bool giveaway = false; + + explicit operator bool() const { + return months != 0; + } + + friend inline bool operator==( + const GiftCode&, + const GiftCode&) = default; +}; + +enum class GiveawayState { + Invalid, + Running, + Preparing, + Finished, + Refunded, +}; + +struct GiveawayInfo { + QString giftCode; + QString disallowedCountry; + ChannelId adminChannelId = 0; + GiveawayState state = GiveawayState::Invalid; + TimeId tooEarlyDate = 0; + TimeId finishDate = 0; + TimeId startDate = 0; + int winnersCount = 0; + int activatedCount = 0; + bool participating = false; + + explicit operator bool() const { + return state != GiveawayState::Invalid; + } +}; + +class Premium final { +public: + explicit Premium(not_null api); + + void reload(); + [[nodiscard]] rpl::producer statusTextValue() const; + + [[nodiscard]] auto videos() const + -> const base::flat_map> &; + [[nodiscard]] rpl::producer<> videosUpdated() const; + + [[nodiscard]] auto stickers() const + -> const std::vector> &; + [[nodiscard]] rpl::producer<> stickersUpdated() const; + + [[nodiscard]] auto cloudSet() const + -> const std::vector> &; + [[nodiscard]] rpl::producer<> cloudSetUpdated() const; + + [[nodiscard]] int64 monthlyAmount() const; + [[nodiscard]] QString monthlyCurrency() const; + + void checkGiftCode( + const QString &slug, + Fn done); + GiftCode updateGiftCode(const QString &slug, const GiftCode &code); + [[nodiscard]] rpl::producer giftCodeValue( + const QString &slug) const; + void applyGiftCode(const QString &slug, Fn done); + + void resolveGiveawayInfo( + not_null peer, + MsgId messageId, + Fn done); + + [[nodiscard]] auto subscriptionOptions() const + -> const Data::SubscriptionOptions &; + + [[nodiscard]] rpl::producer<> somePremiumRequiredResolved() const; + void resolvePremiumRequired(not_null user); + +private: + void reloadPromo(); + void reloadStickers(); + void reloadCloudSet(); + void requestPremiumRequiredSlice(); + + const not_null _session; + MTP::Sender _api; + + mtpRequestId _promoRequestId = 0; + std::optional _statusText; + rpl::event_stream _statusTextUpdates; + + base::flat_map> _videos; + rpl::event_stream<> _videosUpdated; + + mtpRequestId _stickersRequestId = 0; + uint64 _stickersHash = 0; + std::vector> _stickers; + rpl::event_stream<> _stickersUpdated; + + mtpRequestId _cloudSetRequestId = 0; + uint64 _cloudSetHash = 0; + std::vector> _cloudSet; + rpl::event_stream<> _cloudSetUpdated; + + int64 _monthlyAmount = 0; + QString _monthlyCurrency; + + mtpRequestId _giftCodeRequestId = 0; + QString _giftCodeSlug; + base::flat_map _giftCodes; + rpl::event_stream _giftCodeUpdated; + + mtpRequestId _giveawayInfoRequestId = 0; + PeerData *_giveawayInfoPeer = nullptr; + MsgId _giveawayInfoMessageId = 0; + Fn _giveawayInfoDone; + + Data::SubscriptionOptions _subscriptionOptions; + + rpl::event_stream<> _somePremiumRequiredResolved; + base::flat_set> _resolvePremiumRequiredUsers; + base::flat_set> _resolvePremiumRequestedUsers; + bool _premiumRequiredRequestScheduled = false; + +}; + +class PremiumGiftCodeOptions final { +public: + PremiumGiftCodeOptions(not_null peer); + + [[nodiscard]] rpl::producer request(); + [[nodiscard]] Data::SubscriptionOptions options(int amount); + [[nodiscard]] const std::vector &availablePresets() const; + [[nodiscard]] int monthsFromPreset(int monthsIndex); + [[nodiscard]] Payments::InvoicePremiumGiftCode invoice( + int users, + int months); + [[nodiscard]] rpl::producer applyPrepaid( + const Payments::InvoicePremiumGiftCode &invoice, + uint64 prepaidId); + + [[nodiscard]] int giveawayBoostsPerPremium() const; + [[nodiscard]] int giveawayCountriesMax() const; + [[nodiscard]] int giveawayAddPeersMax() const; + [[nodiscard]] int giveawayPeriodMax() const; + [[nodiscard]] bool giveawayGiftsPurchaseAvailable() const; + +private: + struct Token final { + int users = 0; + int months = 0; + + friend inline constexpr auto operator<=>(Token, Token) = default; + + }; + struct Store final { + uint64 amount = 0; + QString product; + int quantity = 0; + }; + using Amount = int; + const not_null _peer; + base::flat_map _subscriptionOptions; + struct { + std::vector months; + std::vector totalCosts; + QString currency; + } _optionsForOnePerson; + + std::vector _availablePresets; + + base::flat_map _stores; + + MTP::Sender _api; + +}; + +enum class RequirePremiumState { + Unknown, + Yes, + No, +}; +[[nodiscard]] RequirePremiumState ResolveRequiresPremiumToWrite( + not_null peer, + History *maybeHistory); + +} // namespace Api diff --git a/Telegram/SourceFiles/api/api_premium_option.cpp b/Telegram/SourceFiles/api/api_premium_option.cpp new file mode 100644 index 000000000..135082e94 --- /dev/null +++ b/Telegram/SourceFiles/api/api_premium_option.cpp @@ -0,0 +1,40 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "api/api_premium_option.h" + +#include "ui/text/format_values.h" + +namespace Api { + +constexpr auto kDiscountDivider = 1.; + +Data::SubscriptionOption CreateSubscriptionOption( + int months, + int monthlyAmount, + int64 amount, + const QString ¤cy, + const QString &botUrl) { + const auto discount = [&] { + const auto percent = 1. - float64(amount) / (monthlyAmount * months); + return std::round(percent * 100. / kDiscountDivider) + * kDiscountDivider; + }(); + return { + .duration = Ui::FormatTTL(months * 86400 * 31), + .discount = discount + ? QString::fromUtf8("\xe2\x88\x92%1%").arg(discount) + : QString(), + .costPerMonth = Ui::FillAmountAndCurrency( + amount / float64(months), + currency), + .costTotal = Ui::FillAmountAndCurrency(amount, currency), + .botUrl = botUrl, + }; +} + +} // namespace Api diff --git a/Telegram/SourceFiles/api/api_premium_option.h b/Telegram/SourceFiles/api/api_premium_option.h new file mode 100644 index 000000000..5758a8cb8 --- /dev/null +++ b/Telegram/SourceFiles/api/api_premium_option.h @@ -0,0 +1,56 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +#include "data/data_subscription_option.h" + +namespace Api { + +[[nodiscard]] Data::SubscriptionOption CreateSubscriptionOption( + int months, + int monthlyAmount, + int64 amount, + const QString ¤cy, + const QString &botUrl); + +template +[[nodiscard]] Data::SubscriptionOptions SubscriptionOptionsFromTL( + const QVector