From 1ec2c16d279df7684a4e47661b5157bd3c1cde72 Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Sat, 11 Dec 2021 07:12:43 +0400 Subject: [PATCH 001/173] Fix path to result binary in Linux action --- .github/workflows/linux.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index aa4c93bac..8295bf83a 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -107,7 +107,7 @@ jobs: - name: Check. run: | - filePath="$REPO_NAME/out/Debug/bin/Telegram" + filePath="$REPO_NAME/out/Debug/Telegram" if test -f "$filePath"; then echo "Build successfully done! :)" @@ -121,7 +121,7 @@ jobs: - name: Move artifact. if: env.UPLOAD_ARTIFACT == 'true' run: | - cd $REPO_NAME/out/Debug/bin + cd $REPO_NAME/out/Debug mkdir artifact mv Telegram artifact/ - uses: actions/upload-artifact@master @@ -129,4 +129,4 @@ jobs: name: Upload artifact. with: name: ${{ env.ARTIFACT_NAME }} - path: ${{ env.REPO_NAME }}/out/Debug/bin/artifact/ + path: ${{ env.REPO_NAME }}/out/Debug/artifact/ From 4a0ffdc9f549710f78e2c9b60197376f626eecad Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Sat, 11 Dec 2021 07:13:11 +0400 Subject: [PATCH 002/173] Result binary shouldn't be in bin subfolder with any generator on macOS Since MACOSX_BUNDLE is used --- Telegram/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index 2cfb5eca1..48953d6e7 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -1407,7 +1407,7 @@ PRIVATE G_LOG_DOMAIN="Telegram" ) -if ("${CMAKE_GENERATOR}" STREQUAL "Xcode" +if (APPLE OR "${CMAKE_GENERATOR}" STREQUAL "Ninja Multi-Config" OR NOT CMAKE_EXECUTABLE_SUFFIX STREQUAL "" OR NOT "${output_name}" STREQUAL "Telegram") From 33b7ac209e4bdd6b20b4aad6a201a353aab98b14 Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Wed, 8 Dec 2021 05:31:30 +0400 Subject: [PATCH 003/173] Don't use QPlatformNativeInterface-based XCB::GetRootWindowFromQt --- Telegram/SourceFiles/platform/linux/main_window_linux.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Telegram/SourceFiles/platform/linux/main_window_linux.cpp b/Telegram/SourceFiles/platform/linux/main_window_linux.cpp index 88066f224..75127c629 100644 --- a/Telegram/SourceFiles/platform/linux/main_window_linux.cpp +++ b/Telegram/SourceFiles/platform/linux/main_window_linux.cpp @@ -94,7 +94,7 @@ void XCBSkipTaskbar(QWindow *window, bool skip) { return; } - const auto root = base::Platform::XCB::GetRootWindowFromQt(); + const auto root = base::Platform::XCB::GetRootWindow(connection); if (!root.has_value()) { return; } From 48ab88a9ca78fd13cfc4b1e684af2c17729c7514 Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Wed, 8 Dec 2021 05:31:53 +0400 Subject: [PATCH 004/173] Don't use QPlatformNativeInterface for native window handle on Windows --- Telegram/SourceFiles/platform/win/main_window_win.cpp | 7 +------ Telegram/SourceFiles/platform/win/specific_win.cpp | 1 - 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/Telegram/SourceFiles/platform/win/main_window_win.cpp b/Telegram/SourceFiles/platform/win/main_window_win.cpp index a2116dd21..31e81a5cc 100644 --- a/Telegram/SourceFiles/platform/win/main_window_win.cpp +++ b/Telegram/SourceFiles/platform/win/main_window_win.cpp @@ -32,7 +32,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include #include #include -#include #include #include @@ -429,11 +428,7 @@ void MainWindow::updateIconCounters() { } void MainWindow::initHook() { - if (const auto native = QGuiApplication::platformNativeInterface()) { - ps_hWnd = static_cast(native->nativeResourceForWindow( - QByteArrayLiteral("handle"), - windowHandle())); - } + ps_hWnd = static_cast(winId()); if (!ps_hWnd) { return; } diff --git a/Telegram/SourceFiles/platform/win/specific_win.cpp b/Telegram/SourceFiles/platform/win/specific_win.cpp index f036ff077..492542d32 100644 --- a/Telegram/SourceFiles/platform/win/specific_win.cpp +++ b/Telegram/SourceFiles/platform/win/specific_win.cpp @@ -31,7 +31,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include #include #include -#include #include #include From 2cb1d2c0bc4ef0e59de427451af8264889e32b4f Mon Sep 17 00:00:00 2001 From: RadRussianRus Date: Wed, 8 Dec 2021 16:09:42 +0300 Subject: [PATCH 005/173] Removed explicit definition of cmake generator Even though TDesktop build migrated to VS 2022, dependencies script still had "Visual Studio 16 2019" for mozjpeg and openal-soft as a generator. Removing these lines allows to use latest Visual Studio without changing the script. --- Telegram/build/prepare/prepare.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/Telegram/build/prepare/prepare.py b/Telegram/build/prepare/prepare.py index e368456fb..f1ae1f5d5 100644 --- a/Telegram/build/prepare/prepare.py +++ b/Telegram/build/prepare/prepare.py @@ -474,7 +474,6 @@ stage('mozjpeg', """ cd mozjpeg win: cmake . ^ - -G "Visual Studio 16 2019" ^ -A %WIN32X64% ^ -DWITH_JPEG8=ON ^ -DPNG_SUPPORTED=OFF @@ -870,7 +869,6 @@ version: 2 cd build win: cmake .. ^ - -G "Visual Studio 16 2019" ^ -A %WIN32X64% ^ -D LIBTYPE:STRING=STATIC ^ -D FORCE_STATIC_VCRT=ON From 107a87c7ce8e828b0aaa90217021149643776c4d Mon Sep 17 00:00:00 2001 From: k1ee Date: Wed, 1 Dec 2021 14:52:48 +0800 Subject: [PATCH 006/173] Add support to build on M1 Mac On M1 mac, some dependencies build two `arm64` builds and makes `lipo` fail. --- Telegram/build/prepare/prepare.py | 44 ++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/Telegram/build/prepare/prepare.py b/Telegram/build/prepare/prepare.py index f1ae1f5d5..b693e3a38 100644 --- a/Telegram/build/prepare/prepare.py +++ b/Telegram/build/prepare/prepare.py @@ -491,16 +491,18 @@ mac: -D ENABLE_SHARED=OFF \\ -D PNG_SUPPORTED=OFF cmake --build build.arm64 $MAKE_THREADS_CNT - cmake -B build . \\ + CFLAGS="-arch x86_64" cmake -B build.x86_64 . \\ + -D CMAKE_SYSTEM_NAME=Darwin \\ + -D CMAKE_SYSTEM_PROCESSOR=x86_64 \\ -D CMAKE_BUILD_TYPE=Release \\ -D CMAKE_INSTALL_PREFIX=$USED_PREFIX \\ -D CMAKE_OSX_DEPLOYMENT_TARGET:STRING=$MACOSX_DEPLOYMENT_TARGET \\ -D WITH_JPEG8=ON \\ -D ENABLE_SHARED=OFF \\ -D PNG_SUPPORTED=OFF - cmake --build build $MAKE_THREADS_CNT - lipo -create build.arm64/libjpeg.a build/libjpeg.a -output build/libjpeg.a - lipo -create build.arm64/libturbojpeg.a build/libturbojpeg.a -output build/libturbojpeg.a + cmake --build build.x86_64 $MAKE_THREADS_CNT + lipo -create build.arm64/libjpeg.a build.x86_64/libjpeg.a -output build/libjpeg.a + lipo -create build.arm64/libturbojpeg.a build.x86_64/libturbojpeg.a -output build/libturbojpeg.a cmake --install build """) @@ -612,9 +614,11 @@ mac: mkdir out.arm64 mv lib/.libs/libiconv.a out.arm64 make clean - CFLAGS="$MIN_VER $UNGUARDED" CPPFLAGS="$MIN_VER $UNGUARDED" LDFLAGS="$MIN_VER" ./configure --enable-static --prefix=$USED_PREFIX + CFLAGS="$MIN_VER $UNGUARDED -arch x86_64" CPPFLAGS="$MIN_VER $UNGUARDED -arch x86_64" LDFLAGS="$MIN_VER" ./configure --enable-static --host=x86_64 --prefix=$USED_PREFIX make $MAKE_THREADS_CNT - lipo -create out.arm64/libiconv.a lib/.libs/libiconv.a -output lib/.libs/libiconv.a + mkdir out.x86_64 + mv lib/.libs/libiconv.a out.x86_64 + lipo -create out.arm64/libiconv.a out.x86_64/libiconv.a -output lib/.libs/libiconv.a make install """) @@ -751,9 +755,12 @@ depends:yasm/yasm make clean ./configure --prefix=$USED_PREFIX \ - --extra-cflags="$MIN_VER $UNGUARDED -DCONFIG_SAFE_BITSTREAM_READER=1 -I$USED_PREFIX/include" \ - --extra-cxxflags="$MIN_VER $UNGUARDED -DCONFIG_SAFE_BITSTREAM_READER=1 -I$USED_PREFIX/include" \ - --extra-ldflags="$MIN_VER $USED_PREFIX/lib/libopus.a" \ + --enable-cross-compile \ + --target-os=darwin \ + --arch="x86_64" \ + --extra-cflags="$MIN_VER -arch x86_64 $UNGUARDED -DCONFIG_SAFE_BITSTREAM_READER=1 -I$USED_PREFIX/include" \ + --extra-cxxflags="$MIN_VER -arch x86_64 $UNGUARDED -DCONFIG_SAFE_BITSTREAM_READER=1 -I$USED_PREFIX/include" \ + --extra-ldflags="$MIN_VER -arch x86_64 $USED_PREFIX/lib/libopus.a" \ --enable-protocol=file \ --enable-libopus \ --disable-programs \ @@ -852,12 +859,19 @@ depends:yasm/yasm --enable-muxer=opus make $MAKE_THREADS_CNT - - lipo -create out.arm64/libavformat.a libavformat/libavformat.a -output libavformat/libavformat.a - lipo -create out.arm64/libavcodec.a libavcodec/libavcodec.a -output libavcodec/libavcodec.a - lipo -create out.arm64/libswresample.a libswresample/libswresample.a -output libswresample/libswresample.a - lipo -create out.arm64/libswscale.a libswscale/libswscale.a -output libswscale/libswscale.a - lipo -create out.arm64/libavutil.a libavutil/libavutil.a -output libavutil/libavutil.a + + mkdir out.x86_64 + mv libavformat/libavformat.a out.x86_64 + mv libavcodec/libavcodec.a out.x86_64 + mv libswresample/libswresample.a out.x86_64 + mv libswscale/libswscale.a out.x86_64 + mv libavutil/libavutil.a out.x86_64 + + lipo -create out.arm64/libavformat.a out.x86_64/libavformat.a -output libavformat/libavformat.a + lipo -create out.arm64/libavcodec.a out.x86_64/libavcodec.a -output libavcodec/libavcodec.a + lipo -create out.arm64/libswresample.a out.x86_64/libswresample.a -output libswresample/libswresample.a + lipo -create out.arm64/libswscale.a out.x86_64/libswscale.a -output libswscale/libswscale.a + lipo -create out.arm64/libavutil.a out.x86_64/libavutil.a -output libavutil/libavutil.a make install """) From 19320cc5d8f0374bc5131ebe73926cdb0ef15ce0 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 14 Dec 2021 11:33:59 +0400 Subject: [PATCH 007/173] Fix dependencies build on M1. --- Telegram/build/prepare/prepare.py | 9 +++++---- docs/building-mac.md | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Telegram/build/prepare/prepare.py b/Telegram/build/prepare/prepare.py index b693e3a38..991444d1b 100644 --- a/Telegram/build/prepare/prepare.py +++ b/Telegram/build/prepare/prepare.py @@ -491,7 +491,7 @@ mac: -D ENABLE_SHARED=OFF \\ -D PNG_SUPPORTED=OFF cmake --build build.arm64 $MAKE_THREADS_CNT - CFLAGS="-arch x86_64" cmake -B build.x86_64 . \\ + CFLAGS="-arch x86_64" cmake -B build . \\ -D CMAKE_SYSTEM_NAME=Darwin \\ -D CMAKE_SYSTEM_PROCESSOR=x86_64 \\ -D CMAKE_BUILD_TYPE=Release \\ @@ -500,9 +500,9 @@ mac: -D WITH_JPEG8=ON \\ -D ENABLE_SHARED=OFF \\ -D PNG_SUPPORTED=OFF - cmake --build build.x86_64 $MAKE_THREADS_CNT - lipo -create build.arm64/libjpeg.a build.x86_64/libjpeg.a -output build/libjpeg.a - lipo -create build.arm64/libturbojpeg.a build.x86_64/libturbojpeg.a -output build/libturbojpeg.a + cmake --build build $MAKE_THREADS_CNT + lipo -create build.arm64/libjpeg.a build/libjpeg.a -output build/libjpeg.a + lipo -create build.arm64/libturbojpeg.a build/libturbojpeg.a -output build/libturbojpeg.a cmake --install build """) @@ -638,6 +638,7 @@ depends:patches/build_ffmpeg_win.sh SET PATH=%PATH_BACKUP_% mac: + export PKG_CONFIG_PATH=$USED_PREFIX/lib/pkgconfig depends:yasm/yasm ./configure --prefix=$USED_PREFIX \ --enable-cross-compile \ diff --git a/docs/building-mac.md b/docs/building-mac.md index d2d0ab408..4d1b5888c 100644 --- a/docs/building-mac.md +++ b/docs/building-mac.md @@ -13,7 +13,7 @@ You will require **api_id** and **api_hash** to access the Telegram API servers. Go to ***BuildPath*** and run ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" - brew install automake cmake fdk-aac git lame libass libtool libvorbis libvpx ninja opus sdl shtool texi2html theora wget x264 xvid yasm pkg-config gnu-tar + brew install git automake cmake wget pkg-config gnu-tar sudo xcode-select -s /Applications/Xcode.app/Contents/Developer From e7e34d50ba1a73c14962cdc4c3dd5ad7a3da74a7 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 14 Dec 2021 16:27:57 +0400 Subject: [PATCH 008/173] Fix building on Windows. --- Telegram/SourceFiles/platform/win/main_window_win.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Telegram/SourceFiles/platform/win/main_window_win.cpp b/Telegram/SourceFiles/platform/win/main_window_win.cpp index 31e81a5cc..7a0a9ebd4 100644 --- a/Telegram/SourceFiles/platform/win/main_window_win.cpp +++ b/Telegram/SourceFiles/platform/win/main_window_win.cpp @@ -428,7 +428,7 @@ void MainWindow::updateIconCounters() { } void MainWindow::initHook() { - ps_hWnd = static_cast(winId()); + ps_hWnd = reinterpret_cast(winId()); if (!ps_hWnd) { return; } From b2fb5424ed4dbd3a19bc497aa5af07b329f91951 Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Thu, 16 Dec 2021 12:40:33 +0400 Subject: [PATCH 009/173] Get rid of deprecated OpenSSL <1.1 functions --- Telegram/SourceFiles/core/utils.cpp | 45 ------------------- .../details/mtproto_rsa_public_key.cpp | 42 ++--------------- 2 files changed, 3 insertions(+), 84 deletions(-) diff --git a/Telegram/SourceFiles/core/utils.cpp b/Telegram/SourceFiles/core/utils.cpp index 160af3f77..241b12360 100644 --- a/Telegram/SourceFiles/core/utils.cpp +++ b/Telegram/SourceFiles/core/utils.cpp @@ -30,8 +30,6 @@ extern "C" { #include #endif -#include - uint64 _SharedMemoryLocation[4] = { 0x00, 0x01, 0x02, 0x03 }; // Base types compile-time check @@ -56,15 +54,6 @@ static_assert(sizeof(int) >= 4, "Basic types size check failed"); // Precise timing functions / rand init -struct CRYPTO_dynlock_value { - QMutex mutex; -}; - -namespace { - bool _sslInited = false; - QMutex *_sslLocks = nullptr; -} - namespace ThirdParty { void start() { @@ -94,45 +83,11 @@ namespace ThirdParty { LOG(("MTP Error: Could not init OpenSSL rand, RAND_status() is 0...")); } } - - // Force OpenSSL loading if it is linked in Qt, - // so that we won't mess with our OpenSSL locking with Qt OpenSSL locking. - auto sslSupported = QSslSocket::supportsSsl(); - if (!sslSupported) { - LOG(("Error: current Qt build doesn't support SSL requests.")); - } - if (!CRYPTO_get_locking_callback()) { - // Qt didn't initialize OpenSSL, so we will. - auto numLocks = CRYPTO_num_locks(); - if (numLocks) { - _sslLocks = new QMutex[numLocks]; - CRYPTO_set_locking_callback(_sslLockingCallback); - } else { - LOG(("MTP Error: Could not init OpenSSL threads, CRYPTO_num_locks() returned zero!")); - } - } - if (!CRYPTO_get_dynlock_create_callback()) { - CRYPTO_set_dynlock_create_callback(_sslCreateFunction); - CRYPTO_set_dynlock_lock_callback(_sslLockFunction); - CRYPTO_set_dynlock_destroy_callback(_sslDestroyFunction); - } else if (!CRYPTO_get_dynlock_lock_callback()) { - LOG(("MTP Error: dynlock_create callback is set without dynlock_lock callback!")); - } - - _sslInited = true; } void finish() { - CRYPTO_cleanup_all_ex_data(); -#ifndef LIBRESSL_VERSION_NUMBER FIPS_mode_set(0); -#endif - ENGINE_cleanup(); CONF_modules_unload(1); - ERR_free_strings(); - EVP_cleanup(); - - delete[] base::take(_sslLocks); Platform::ThirdParty::finish(); } diff --git a/Telegram/SourceFiles/mtproto/details/mtproto_rsa_public_key.cpp b/Telegram/SourceFiles/mtproto/details/mtproto_rsa_public_key.cpp index a053a18ac..312c8b1dd 100644 --- a/Telegram/SourceFiles/mtproto/details/mtproto_rsa_public_key.cpp +++ b/Telegram/SourceFiles/mtproto/details/mtproto_rsa_public_key.cpp @@ -11,42 +11,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace MTP::details { namespace { -#if OPENSSL_VERSION_NUMBER < 0x10100000L || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x2070000fL) - -// This is a key setter for compatibility with OpenSSL 1.0 -int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d) { - if ((r->n == nullptr && n == nullptr) || (r->e == nullptr && e == nullptr)) { - return 0; - } - if (n != nullptr) { - BN_free(r->n); - r->n = n; - } - if (e != nullptr) { - BN_free(r->e); - r->e = e; - } - if (d != nullptr) { - BN_free(r->d); - r->d = d; - } - return 1; -} - -// This is a key getter for compatibility with OpenSSL 1.0 -void RSA_get0_key(const RSA *r, const BIGNUM **n, const BIGNUM **e, const BIGNUM **d) { - if (n != nullptr) { - *n = r->n; - } - if (e != nullptr) { - *e = r->e; - } - if (d != nullptr) { - *d = r->d; - } -} - -#endif enum class Format { RSAPublicKey, @@ -168,7 +132,7 @@ bytes::vector RSAPublicKey::Private::encrypt(bytes::const_span data) const { auto result = bytes::vector(kEncryptSize, gsl::byte{}); auto res = RSA_public_encrypt(kEncryptSize, reinterpret_cast(data.data()), reinterpret_cast(result.data()), _rsa, RSA_NO_PADDING); if (res < 0 || res > kEncryptSize) { - ERR_load_crypto_strings(); + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, nullptr); LOG(("RSA Error: RSA_public_encrypt failed, key fp: %1, result: %2, error: %3").arg(fingerprint()).arg(res).arg(ERR_error_string(ERR_get_error(), 0))); return {}; } else if (auto zeroBytes = kEncryptSize - res) { @@ -186,7 +150,7 @@ bytes::vector RSAPublicKey::Private::decrypt(bytes::const_span data) const { auto result = bytes::vector(kDecryptSize, gsl::byte{}); auto res = RSA_public_decrypt(kDecryptSize, reinterpret_cast(data.data()), reinterpret_cast(result.data()), _rsa, RSA_NO_PADDING); if (res < 0 || res > kDecryptSize) { - ERR_load_crypto_strings(); + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, nullptr); LOG(("RSA Error: RSA_public_encrypt failed, key fp: %1, result: %2, error: %3").arg(fingerprint()).arg(res).arg(ERR_error_string(ERR_get_error(), 0))); return {}; } else if (auto zeroBytes = kDecryptSize - res) { @@ -209,7 +173,7 @@ bytes::vector RSAPublicKey::Private::encryptOAEPpadding(bytes::const_span data) _rsa, RSA_PKCS1_OAEP_PADDING); if (encryptedSize != resultSize) { - ERR_load_crypto_strings(); + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, nullptr); LOG(("RSA Error: RSA_public_encrypt failed, " "key fp: %1, result: %2, error: %3" ).arg(fingerprint() From d89aab08bf4134da97214a63f20ed5cb2e5e4fa6 Mon Sep 17 00:00:00 2001 From: Vitaly Zaitsev Date: Thu, 9 Dec 2021 12:41:17 +0100 Subject: [PATCH 010/173] Fixed build against OpenSSL 3.0. Deprecated function FIPS_mode_set() was removed in OpenSSL 3.0. Switched to EVP_default_properties_enable_fips() as described in OpenSSL 3.0 migration guide. Signed-off-by: Vitaly Zaitsev --- Telegram/SourceFiles/core/utils.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Telegram/SourceFiles/core/utils.cpp b/Telegram/SourceFiles/core/utils.cpp index 241b12360..00d07d25b 100644 --- a/Telegram/SourceFiles/core/utils.cpp +++ b/Telegram/SourceFiles/core/utils.cpp @@ -86,7 +86,11 @@ namespace ThirdParty { } void finish() { +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + EVP_default_properties_enable_fips(nullptr, 0); +#else FIPS_mode_set(0); +#endif CONF_modules_unload(1); Platform::ThirdParty::finish(); From 7ff7473db6ac640114f743b01a5cdba679a4d0e8 Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Thu, 25 Nov 2021 05:32:31 +0400 Subject: [PATCH 011/173] Auto-check for many instance This option was invented when single instance check wasn't adapted for -workdir. Now, -workdir can work without -many and this option is redudant, but auto-update prevention is helpful. Let's autodetect whether the binary is already running with a lock file. --- Telegram/SourceFiles/core/launcher.cpp | 2 -- Telegram/SourceFiles/core/sandbox.cpp | 47 +++++++++++++++++++------- Telegram/SourceFiles/core/sandbox.h | 3 ++ 3 files changed, 37 insertions(+), 15 deletions(-) diff --git a/Telegram/SourceFiles/core/launcher.cpp b/Telegram/SourceFiles/core/launcher.cpp index eda856e5b..b9b927c44 100644 --- a/Telegram/SourceFiles/core/launcher.cpp +++ b/Telegram/SourceFiles/core/launcher.cpp @@ -460,7 +460,6 @@ void Launcher::processArguments() { auto parseMap = std::map { { "-debug" , KeyFormat::NoValues }, { "-freetype" , KeyFormat::NoValues }, - { "-many" , KeyFormat::NoValues }, { "-key" , KeyFormat::OneValue }, { "-autostart" , KeyFormat::NoValues }, { "-fixprevious" , KeyFormat::NoValues }, @@ -499,7 +498,6 @@ void Launcher::processArguments() { gUseFreeType = parseResult.contains("-freetype"); gDebugMode = parseResult.contains("-debug"); - gManyInstance = parseResult.contains("-many"); gKeyFile = parseResult.value("-key", {}).join(QString()).toLower(); gKeyFile = gKeyFile.replace(QRegularExpression("[^a-z0-9\\-_]"), {}); gLaunchMode = parseResult.contains("-autostart") ? LaunchModeAutoStart diff --git a/Telegram/SourceFiles/core/sandbox.cpp b/Telegram/SourceFiles/core/sandbox.cpp index a113e88aa..b8d481454 100644 --- a/Telegram/SourceFiles/core/sandbox.cpp +++ b/Telegram/SourceFiles/core/sandbox.cpp @@ -29,6 +29,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/effects/animations.h" #include "app.h" +#include #include #include #include @@ -99,10 +100,35 @@ int Sandbox::start() { if (!Core::UpdaterDisabled()) { _updateChecker = std::make_unique(); } - const auto d = QFile::encodeName(QDir(cWorkingDir()).absolutePath()); - char h[33] = { 0 }; - hashMd5Hex(d.constData(), d.size(), h); - _localServerName = Platform::SingleInstanceLocalServerName(h); + + { + const auto d = QFile::encodeName(QDir(cWorkingDir()).absolutePath()); + char h[33] = { 0 }; + hashMd5Hex(d.constData(), d.size(), h); + _localServerName = Platform::SingleInstanceLocalServerName(h); + } + + { + const auto d = QFile::encodeName(cExeDir() + cExeName()); + QByteArray h; + h.resize(32); + hashMd5Hex(d.constData(), d.size(), h.data()); + _lockFile = std::make_unique(QDir::tempPath() + '/' + h + '-' + cGUIDStr()); + _lockFile->setStaleLockTime(0); + if (!_lockFile->tryLock() && _launcher->customWorkingDir()) { + // On Windows, QLockFile has problems detecting a stale lock + // if the machine's hostname contains characters outside the US-ASCII character set. + if constexpr (Platform::IsWindows()) { + // QLockFile::removeStaleLockFile returns false on Windows, + // when the application owning the lock is still running. + if (!_lockFile->removeStaleLockFile()) { + gManyInstance = true; + } + } else { + gManyInstance = true; + } + } + } connect( &_localSocket, @@ -149,13 +175,8 @@ int Sandbox::start() { restartHint, Qt::DirectConnection); - if (cManyInstance()) { - LOG(("Many instance allowed, starting...")); - singleInstanceChecked(); - } else { - LOG(("Connecting local socket to %1...").arg(_localServerName)); - _localSocket.connectToServer(_localServerName); - } + LOG(("Connecting local socket to %1...").arg(_localServerName)); + _localSocket.connectToServer(_localServerName); if (QuitOnStartRequested) { closeApplication(); @@ -339,12 +360,12 @@ void Sandbox::socketError(QLocalSocket::LocalSocketError e) { void Sandbox::singleInstanceChecked() { if (cManyInstance()) { - Logs::multipleInstances(); + LOG(("App Info: Detected another instance")); } Ui::DisableCustomScaling(); refreshGlobalProxy(); - if (!Logs::started() || (!cManyInstance() && !Logs::instanceChecked())) { + if (!Logs::started() || !Logs::instanceChecked()) { new NotStartedWindow(); return; } diff --git a/Telegram/SourceFiles/core/sandbox.h b/Telegram/SourceFiles/core/sandbox.h index 7362f5554..944dee65e 100644 --- a/Telegram/SourceFiles/core/sandbox.h +++ b/Telegram/SourceFiles/core/sandbox.h @@ -15,6 +15,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include #include +class QLockFile; + namespace Core { class Launcher; @@ -119,6 +121,7 @@ private: QLocalServer _localServer; QLocalSocket _localSocket; LocalClients _localClients; + std::unique_ptr _lockFile; bool _secondInstance = false; bool _started = false; static bool QuitOnStartRequested; From fedd21b0a66cbe08c4ed0982a892d38e46c7d80e Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Tue, 7 Dec 2021 17:20:04 +0400 Subject: [PATCH 012/173] Use QFontMetrics::height in PreLaunchWindow --- Telegram/SourceFiles/core/crash_report_window.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Telegram/SourceFiles/core/crash_report_window.cpp b/Telegram/SourceFiles/core/crash_report_window.cpp index b50b43e90..d72d81afa 100644 --- a/Telegram/SourceFiles/core/crash_report_window.cpp +++ b/Telegram/SourceFiles/core/crash_report_window.cpp @@ -43,9 +43,7 @@ PreLaunchWindow::PreLaunchWindow(QString title) { p.setColor(QPalette::Window, QColor(255, 255, 255)); setPalette(p); - QLabel tmp(this); - tmp.setText(qsl("Tmp")); - _size = tmp.sizeHint().height(); + _size = QFontMetrics(QGuiApplication::font()).height(); int paddingVertical = (_size / 2); int paddingHorizontal = _size; From a8f05a01ed2631cd587aafc58c30cc75b73d094d Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Sat, 11 Dec 2021 20:58:29 +0400 Subject: [PATCH 013/173] Build kwayland as external project This will simplify packaged Qt 6 build --- .gitmodules | 3 ++ Telegram/ThirdParty/kwayland | 1 + Telegram/build/docker/centos_env/Dockerfile | 37 ++------------------- cmake | 2 +- snap/snapcraft.yaml | 36 +++----------------- 5 files changed, 12 insertions(+), 67 deletions(-) create mode 160000 Telegram/ThirdParty/kwayland diff --git a/.gitmodules b/.gitmodules index 38c5797e8..20bf11a83 100644 --- a/.gitmodules +++ b/.gitmodules @@ -94,3 +94,6 @@ [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 diff --git a/Telegram/ThirdParty/kwayland b/Telegram/ThirdParty/kwayland new file mode 160000 index 000000000..31e2e6cb5 --- /dev/null +++ b/Telegram/ThirdParty/kwayland @@ -0,0 +1 @@ +Subproject commit 31e2e6cb59eb4b72392caa703909ef22cf06bcb7 diff --git a/Telegram/build/docker/centos_env/Dockerfile b/Telegram/build/docker/centos_env/Dockerfile index 559a61a5e..9265f6f0d 100644 --- a/Telegram/build/docker/centos_env/Dockerfile +++ b/Telegram/build/docker/centos_env/Dockerfile @@ -24,7 +24,7 @@ RUN yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.n RUN yum -y install https://packages.endpoint.com/rhel/7/os/x86_64/endpoint-repo-1.7-1.x86_64.rpm && yum clean all RUN yum -y install centos-release-scl && yum clean all -RUN yum -y install git meson ninja-build autoconf automake libtool \ +RUN yum -y install git meson ninja-build autoconf automake libtool patch \ fontconfig-devel freetype-devel libX11-devel at-spi2-core-devel alsa-lib-devel \ pulseaudio-libs-devel mesa-libGL-devel mesa-libEGL-devel gtk3-devel \ perl-XML-Parser pkgconfig bison yasm file which xorg-x11-util-macros \ @@ -766,38 +766,6 @@ RUN [ -z "${QT6}" ] || DESTDIR="$LibrariesPath/qt-cache" cmake --install . WORKDIR .. RUN [ -z "${QT6}" ] || rm -rf qt_${QT6_VER} -FROM patches AS kwayland -ARG QT6 - -COPY --from=extra-cmake-modules ${LibrariesPath}/extra-cmake-modules-cache / -COPY --from=libffi ${LibrariesPath}/libffi-cache / -COPY --from=zlib ${LibrariesPath}/zlib-cache / -COPY --from=libproxy ${LibrariesPath}/libproxy-cache / -COPY --from=mozjpeg ${LibrariesPath}/mozjpeg-cache / -COPY --from=xcb ${LibrariesPath}/xcb-cache / -COPY --from=xcb-wm ${LibrariesPath}/xcb-wm-cache / -COPY --from=xcb-util ${LibrariesPath}/xcb-util-cache / -COPY --from=xcb-image ${LibrariesPath}/xcb-image-cache / -COPY --from=xcb-keysyms ${LibrariesPath}/xcb-keysyms-cache / -COPY --from=xcb-render-util ${LibrariesPath}/xcb-render-util-cache / -COPY --from=wayland ${LibrariesPath}/wayland-cache / -COPY --from=wayland-protocols ${LibrariesPath}/wayland-protocols-cache / -COPY --from=plasma-wayland-protocols ${LibrariesPath}/plasma-wayland-protocols-cache / -COPY --from=openssl ${LibrariesPath}/openssl-cache / -COPY --from=xkbcommon ${LibrariesPath}/xkbcommon-cache / -COPY --from=qt ${LibrariesPath}/qt-cache / - -RUN git clone -b v5.87.0 --depth=1 $GIT/KDE/kwayland.git - -WORKDIR kwayland -RUN [ -z "${QT6}" ] || git apply ../patches/kwayland-qt6.patch -RUN cmake -GNinja -B build . -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -RUN cmake --build build --target KF5WaylandClient --parallel -RUN DESTDIR="$LibrariesPath/kwayland-cache" cmake --install build/src/client - -WORKDIR .. -RUN rm -rf kwayland - FROM patches AS breakpad RUN git clone https://chromium.googlesource.com/breakpad/breakpad.git @@ -880,6 +848,8 @@ COPY --from=libXrender ${LibrariesPath}/libXrender-cache / COPY --from=libXdamage ${LibrariesPath}/libXdamage-cache / COPY --from=libXcomposite ${LibrariesPath}/libXcomposite-cache / COPY --from=wayland ${LibrariesPath}/wayland-cache / +COPY --from=wayland-protocols ${LibrariesPath}/wayland-protocols-cache / +COPY --from=plasma-wayland-protocols ${LibrariesPath}/plasma-wayland-protocols-cache / COPY --from=libpciaccess ${LibrariesPath}/libpciaccess-cache / COPY --from=drm ${LibrariesPath}/drm-cache / COPY --from=libva ${LibrariesPath}/libva-cache / @@ -892,7 +862,6 @@ COPY --from=xkbcommon ${LibrariesPath}/xkbcommon-cache / COPY --from=libsigcplusplus ${LibrariesPath}/libsigcplusplus-cache / COPY --from=glibmm ${LibrariesPath}/glibmm-cache / COPY --from=qt ${LibrariesPath}/qt-cache / -COPY --from=kwayland ${LibrariesPath}/kwayland-cache / COPY --from=breakpad ${LibrariesPath}/breakpad breakpad COPY --from=breakpad ${LibrariesPath}/breakpad-cache / COPY --from=webrtc ${LibrariesPath}/tg_owt tg_owt diff --git a/cmake b/cmake index c2b070275..857a31aec 160000 --- a/cmake +++ b/cmake @@ -1 +1 @@ -Subproject commit c2b070275eecb546b9899495090d27ce55384917 +Subproject commit 857a31aec6e18541939a82ad70e243b9eb04636b diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index dd7414550..babaa3b36 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -100,10 +100,12 @@ parts: - libopus-dev - libpulse-dev - libssl-dev + - libwayland-dev - libxcb1-dev - libxcb-keysyms1-dev - libxcb-record0-dev - libxcb-screensaver0-dev + - wayland-protocols - zlib1g-dev stage-packages: - libasound2 @@ -112,6 +114,7 @@ parts: - libopus0 - libpulse0 - libssl1.1 + - libwayland-client0 - libwebkit2gtk-4.0-37 - libxcb1 - libxcb-keysyms1 @@ -153,9 +156,9 @@ parts: - desktop-qt - extra-cmake-modules - ffmpeg - - kwayland - mozjpeg - openal + - plasma-wayland-protocols - rnnoise - webrtc @@ -239,37 +242,6 @@ parts: after: - mozjpeg - kwayland: - source: https://github.com/KDE/kwayland.git - source-depth: 1 - source-tag: v5.87.0 - plugin: cmake - build-packages: - - libwayland-dev - - wayland-protocols - stage-packages: - - libwayland-client0 - - libwayland-server0 - cmake-parameters: - - -DCMAKE_BUILD_TYPE=Release - - -DCMAKE_INSTALL_PREFIX=/usr - - -DBUILD_TESTING=OFF - override-pull: | - snapcraftctl pull - patch -p1 < $SNAPCRAFT_STAGE/patches/kwayland-qt6.patch - prime: - - -./usr/include - - -./usr/lib/$SNAPCRAFT_ARCH_TRIPLET/libexec - - -./usr/lib/$SNAPCRAFT_ARCH_TRIPLET/pkgconfig - - -./usr/lib/$SNAPCRAFT_ARCH_TRIPLET/*.so - - -./usr/mkspecs - - -./usr/share - after: - - extra-cmake-modules - - desktop-qt - - patches - - plasma-wayland-protocols - mozjpeg: source: https://github.com/mozilla/mozjpeg.git source-depth: 1 From 5e7e7eaa83a7c211285cee163802466af6ed4505 Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 9 Dec 2021 11:32:54 +0400 Subject: [PATCH 014/173] FullMsgId rely on PeerId instead of ChannelId. --- Telegram/SourceFiles/api/api_peer_photo.cpp | 2 +- Telegram/SourceFiles/api/api_sending.cpp | 8 +- .../api/api_single_message_search.cpp | 4 +- Telegram/SourceFiles/api/api_updates.cpp | 44 +++--- Telegram/SourceFiles/api/api_views.cpp | 3 +- Telegram/SourceFiles/apiwrap.cpp | 106 +++++++------- Telegram/SourceFiles/apiwrap.h | 10 +- .../SourceFiles/boxes/pin_messages_box.cpp | 4 +- Telegram/SourceFiles/boxes/share_box.cpp | 53 +++---- .../SourceFiles/chat_helpers/bot_keyboard.cpp | 5 +- .../chat_helpers/emoji_interactions.cpp | 2 +- .../SourceFiles/core/local_url_handlers.cpp | 4 +- Telegram/SourceFiles/data/data_folder.cpp | 4 +- Telegram/SourceFiles/data/data_histories.cpp | 2 +- Telegram/SourceFiles/data/data_messages.cpp | 36 ----- Telegram/SourceFiles/data/data_messages.h | 8 +- Telegram/SourceFiles/data/data_msg_id.h | 13 +- Telegram/SourceFiles/data/data_peer.cpp | 8 +- Telegram/SourceFiles/data/data_peer_id.h | 2 - .../SourceFiles/data/data_replies_list.cpp | 12 +- .../data/data_scheduled_messages.cpp | 2 +- Telegram/SourceFiles/data/data_session.cpp | 99 +++++++++---- Telegram/SourceFiles/data/data_session.h | 20 +-- .../SourceFiles/data/data_shared_media.cpp | 2 +- Telegram/SourceFiles/data/data_shared_media.h | 2 +- Telegram/SourceFiles/data/data_sparse_ids.h | 6 +- .../data/data_sponsored_messages.cpp | 9 +- .../dialogs/dialogs_inner_widget.cpp | 36 ++--- .../admin_log/history_admin_log_section.cpp | 2 +- Telegram/SourceFiles/history/history.cpp | 32 ++--- Telegram/SourceFiles/history/history.h | 6 +- .../history/history_inner_widget.cpp | 4 +- Telegram/SourceFiles/history/history_item.cpp | 6 +- Telegram/SourceFiles/history/history_item.h | 5 +- .../history/history_item_components.cpp | 4 +- .../SourceFiles/history/history_message.cpp | 42 +++--- .../SourceFiles/history/history_service.cpp | 8 +- .../SourceFiles/history/history_widget.cpp | 134 ++++++++++-------- Telegram/SourceFiles/history/history_widget.h | 3 +- .../history_view_compose_controls.cpp | 20 ++- .../view/history_view_context_menu.cpp | 2 +- .../history/view/history_view_message.cpp | 14 +- .../history/view/history_view_pinned_bar.cpp | 10 +- .../view/history_view_pinned_section.cpp | 10 +- .../view/history_view_pinned_tracker.cpp | 2 +- .../view/history_view_replies_section.cpp | 31 ++-- .../view/history_view_scheduled_section.cpp | 2 +- .../history/view/media/history_view_media.cpp | 2 +- Telegram/SourceFiles/info/info_controller.cpp | 4 +- .../info/media/info_media_list_widget.cpp | 12 +- Telegram/SourceFiles/mainwidget.cpp | 2 +- .../media/player/media_player_instance.cpp | 12 +- .../media/view/media_view_overlay_widget.cpp | 2 +- .../passport/passport_form_controller.cpp | 2 +- .../payments/payments_checkout_process.cpp | 2 +- .../SourceFiles/payments/payments_form.cpp | 6 +- .../window/notifications_manager.cpp | 12 +- .../window/themes/window_theme.cpp | 4 +- .../window/themes/window_theme_editor_box.cpp | 2 +- .../SourceFiles/window/window_peer_menu.cpp | 4 +- .../window/window_session_controller.cpp | 12 +- 61 files changed, 446 insertions(+), 475 deletions(-) diff --git a/Telegram/SourceFiles/api/api_peer_photo.cpp b/Telegram/SourceFiles/api/api_peer_photo.cpp index 28f47583f..97456fdd6 100644 --- a/Telegram/SourceFiles/api/api_peer_photo.cpp +++ b/Telegram/SourceFiles/api/api_peer_photo.cpp @@ -118,7 +118,7 @@ void PeerPhoto::upload(not_null peer, QImage &&image) { std::move(image)); const auto fakeId = FullMsgId( - peerToChannel(peer->id), + peer->id, _session->data().nextLocalMessageId()); const auto already = ranges::find( _uploads, diff --git a/Telegram/SourceFiles/api/api_sending.cpp b/Telegram/SourceFiles/api/api_sending.cpp index 19f0cf03a..fea8defac 100644 --- a/Telegram/SourceFiles/api/api_sending.cpp +++ b/Telegram/SourceFiles/api/api_sending.cpp @@ -74,7 +74,7 @@ void SendExistingMedia( api->sendAction(message.action); const auto newId = FullMsgId( - peerToChannel(peer->id), + peer->id, session->data().nextLocalMessageId()); const auto randomId = base::RandomValue(); @@ -255,7 +255,7 @@ bool SendDice(MessageToSend &message) { api->sendAction(message.action); const auto newId = FullMsgId( - peerToChannel(peer->id), + peer->id, session->data().nextLocalMessageId()); const auto randomId = base::RandomValue(); @@ -346,10 +346,8 @@ void SendConfirmedFile( const std::shared_ptr &file) { const auto isEditing = (file->type != SendMediaType::Audio) && (file->to.replaceMediaOf != 0); - const auto channelId = peerToChannel(file->to.peer); - const auto newId = FullMsgId( - channelId, + file->to.peer, isEditing ? file->to.replaceMediaOf : session->data().nextLocalMessageId()); diff --git a/Telegram/SourceFiles/api/api_single_message_search.cpp b/Telegram/SourceFiles/api/api_single_message_search.cpp index 4b374f3bb..6f810eb86 100644 --- a/Telegram/SourceFiles/api/api_single_message_search.cpp +++ b/Telegram/SourceFiles/api/api_single_message_search.cpp @@ -87,7 +87,7 @@ std::optional SingleMessageSearch::performLookupByChannel( Expects(!_requestKey.empty()); const auto postId = _requestKey.postId; - if (const auto item = _session->data().message(channel, postId)) { + if (const auto item = _session->data().message(channel->id, postId)) { _cache.emplace(_requestKey, item->fullId()); return item; } else if (!ready) { @@ -112,7 +112,7 @@ std::optional SingleMessageSearch::performLookupByChannel( && received.messageIds.front() == postId) { _cache.emplace( _requestKey, - FullMsgId(peerToChannel(channel->id), postId)); + FullMsgId(channel->id, postId)); ready(); } else { fail(); diff --git a/Telegram/SourceFiles/api/api_updates.cpp b/Telegram/SourceFiles/api/api_updates.cpp index fb97541c2..9321ea3be 100644 --- a/Telegram/SourceFiles/api/api_updates.cpp +++ b/Telegram/SourceFiles/api/api_updates.cpp @@ -730,7 +730,7 @@ void Updates::addActiveChat(rpl::producer chat) { } void Updates::requestChannelRangeDifference(not_null history) { - Expects(history->isChannel()); + Expects(history->peer->isChannel()); const auto channel = history->peer->asChannel(); if (const auto requestId = _rangeDifferenceRequests.take(channel)) { @@ -1181,7 +1181,7 @@ void Updates::applyUpdateNoPtsCheck(const MTPUpdate &update) { const auto &d = update.c_updateReadMessagesContents(); auto possiblyReadMentions = base::flat_set(); for (const auto &msgId : d.vmessages().v) { - if (const auto item = _session->data().message(NoChannel, msgId.v)) { + if (const auto item = _session->data().nonChannelMessage(msgId.v)) { if (item->isUnreadMedia() || item->isUnreadMention()) { item->markMediaRead(); _session->data().requestItemRepaint(item); @@ -1249,7 +1249,7 @@ void Updates::applyUpdateNoPtsCheck(const MTPUpdate &update) { case mtpc_updateDeleteMessages: { auto &d = update.c_updateDeleteMessages(); - _session->data().processMessagesDeleted(NoChannel, d.vmessages().v); + _session->data().processNonChannelMessagesDeleted(d.vmessages().v); } break; case mtpc_updateNewChannelMessage: { @@ -1278,9 +1278,9 @@ void Updates::applyUpdateNoPtsCheck(const MTPUpdate &update) { case mtpc_updatePinnedChannelMessages: { const auto &d = update.c_updatePinnedChannelMessages(); - const auto channelId = d.vchannel_id().v; + const auto peerId = peerFromChannel(d.vchannel_id()); for (const auto &msgId : d.vmessages().v) { - const auto item = session().data().message(channelId, msgId.v); + const auto item = session().data().message(peerId, msgId.v); if (item) { item->setIsPinned(d.is_pinned()); } @@ -1299,13 +1299,16 @@ void Updates::applyUpdateNoPtsCheck(const MTPUpdate &update) { case mtpc_updateDeleteChannelMessages: { auto &d = update.c_updateDeleteChannelMessages(); - _session->data().processMessagesDeleted(d.vchannel_id().v, d.vmessages().v); + _session->data().processMessagesDeleted( + peerFromChannel(d.vchannel_id().v), + d.vmessages().v); } break; case mtpc_updatePinnedMessages: { const auto &d = update.c_updatePinnedMessages(); + const auto peerId = peerFromMTP(d.vpeer()); for (const auto &msgId : d.vmessages().v) { - const auto item = session().data().message(0, msgId.v); + const auto item = session().data().message(peerId, msgId.v); if (item) { item->setIsPinned(d.is_pinned()); } @@ -1424,7 +1427,7 @@ void Updates::applyUpdates( const auto sent = owner.messageSentData(randomId); const auto lookupMessage = [&] { return sent.peerId - ? owner.message(peerToChannel(sent.peerId), d.vid().v) + ? owner.message(sent.peerId, d.vid().v) : nullptr; }; if (const auto id = owner.messageIdByRandomId(randomId)) { @@ -1439,9 +1442,9 @@ void Updates::applyUpdates( const auto list = d.ventities(); if (list && !MentionUsersLoaded(&session(), *list)) { session().api().requestMessageData( - item->history()->peer->asChannel(), + item->history()->peer, item->id, - ApiWrap::RequestMessageDataCallback()); + nullptr); } item->applySentMessage(sent.text, d, wasAlready); } @@ -1527,9 +1530,8 @@ void Updates::feedUpdate(const MTPUpdate &update) { if (local->isScheduled()) { session().data().scheduledMessages().apply(d, local); } else { - const auto channel = id.channel; const auto existing = session().data().message( - channel, + id.peer, newId); if (existing && !local->mainView()) { const auto history = local->history(); @@ -1566,7 +1568,7 @@ void Updates::feedUpdate(const MTPUpdate &update) { } auto possiblyReadMentions = base::flat_set(); for (const auto &msgId : d.vmessages().v) { - if (auto item = session().data().message(channel, msgId.v)) { + if (auto item = session().data().message(channel->id, msgId.v)) { if (item->isUnreadMedia() || item->isUnreadMention()) { item->markMediaRead(); session().data().requestItemRepaint(item); @@ -2146,24 +2148,26 @@ void Updates::feedUpdate(const MTPUpdate &update) { case mtpc_updateChannelMessageViews: { const auto &d = update.c_updateChannelMessageViews(); - if (const auto item = session().data().message(d.vchannel_id().v, d.vid().v)) { + const auto peerId = peerFromChannel(d.vchannel_id()); + if (const auto item = session().data().message(peerId, d.vid().v)) { item->setViewsCount(d.vviews().v); } } break; case mtpc_updateChannelMessageForwards: { const auto &d = update.c_updateChannelMessageForwards(); - if (const auto item = session().data().message(d.vchannel_id().v, d.vid().v)) { + const auto peerId = peerFromChannel(d.vchannel_id()); + if (const auto item = session().data().message(peerId, d.vid().v)) { item->setForwardsCount(d.vforwards().v); } } break; case mtpc_updateReadChannelDiscussionInbox: { const auto &d = update.c_updateReadChannelDiscussionInbox(); - const auto channelId = d.vchannel_id().v; + const auto peerId = peerFromChannel(d.vchannel_id()); const auto msgId = d.vtop_msg_id().v; const auto readTillId = d.vread_max_id().v; - const auto item = session().data().message(channelId, msgId); + const auto item = session().data().message(peerId, msgId); const auto unreadCount = item ? session().data().countUnreadRepliesLocally(item, readTillId) : std::nullopt; @@ -2175,7 +2179,7 @@ void Updates::feedUpdate(const MTPUpdate &update) { } if (const auto broadcastId = d.vbroadcast_id()) { if (const auto post = session().data().message( - broadcastId->v, + peerFromChannel(*broadcastId), d.vbroadcast_post()->v)) { post->setRepliesInboxReadTill(readTillId, unreadCount); } @@ -2184,10 +2188,10 @@ void Updates::feedUpdate(const MTPUpdate &update) { case mtpc_updateReadChannelDiscussionOutbox: { const auto &d = update.c_updateReadChannelDiscussionOutbox(); - const auto channelId = d.vchannel_id().v; + const auto peerId = peerFromChannel(d.vchannel_id()); const auto msgId = d.vtop_msg_id().v; const auto readTillId = d.vread_max_id().v; - const auto item = session().data().message(channelId, msgId); + const auto item = session().data().message(peerId, msgId); if (item) { item->setRepliesOutboxReadTill(readTillId); if (const auto post = item->lookupDiscussionPostOriginal()) { diff --git a/Telegram/SourceFiles/api/api_views.cpp b/Telegram/SourceFiles/api/api_views.cpp index 426b2d02a..462c5deea 100644 --- a/Telegram/SourceFiles/api/api_views.cpp +++ b/Telegram/SourceFiles/api/api_views.cpp @@ -95,9 +95,8 @@ void ViewsManager::done( if (id != requestId) { continue; } - const auto channel = peerToChannel(peer->id); for (auto j = 0, l = int(ids.size()); j < l; ++j) { - if (const auto item = owner.message(channel, ids[j].v)) { + if (const auto item = owner.message(peer->id, ids[j].v)) { v[j].match([&](const MTPDmessageViews &data) { if (const auto views = data.vviews()) { item->setViewsCount(views->v); diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index 388deb764..778d1e8a1 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -510,14 +510,14 @@ void ApiWrap::sendMessageFail( } void ApiWrap::requestMessageData( - ChannelData *channel, + PeerData *peer, MsgId msgId, - RequestMessageDataCallback callback) { - auto &requests = channel - ? _channelMessageDataRequests[channel][msgId] + Fn done) { + auto &requests = (peer && peer->isChannel()) + ? _channelMessageDataRequests[peer->asChannel()][msgId] : _messageDataRequests[msgId]; - if (callback) { - requests.callbacks.push_back(callback); + if (done) { + requests.callbacks.push_back(std::move(done)); } if (!requests.requestId) { _messageDataResolveDelayed.call(); @@ -539,19 +539,19 @@ QVector ApiWrap::collectMessageIds( auto ApiWrap::messageDataRequests(ChannelData *channel, bool onlyExisting) -> MessageDataRequests* { - if (channel) { - auto i = _channelMessageDataRequests.find(channel); - if (i == end(_channelMessageDataRequests)) { - if (onlyExisting) { - return nullptr; - } - i = _channelMessageDataRequests.emplace( - channel, - MessageDataRequests()).first; - } - return &i->second; + if (!channel) { + return &_messageDataRequests; } - return &_messageDataRequests; + const auto i = _channelMessageDataRequests.find(channel); + if (i != end(_channelMessageDataRequests)) { + return &i->second; + } else if (onlyExisting) { + return nullptr; + } + return &_channelMessageDataRequests.emplace( + channel, + MessageDataRequests() + ).first->second; } void ApiWrap::resolveMessageDatas() { @@ -614,20 +614,31 @@ void ApiWrap::finalizeMessageDataRequest( ChannelData *channel, mtpRequestId requestId) { auto requests = messageDataRequests(channel, true); - if (requests) { - for (auto i = requests->begin(); i != requests->cend();) { - if (i->second.requestId == requestId) { - for (const auto &callback : i->second.callbacks) { - callback(channel, i->first); - } - i = requests->erase(i); + if (!requests) { + return; + } + auto callbacks = std::vector>(); + for (auto i = requests->begin(); i != requests->cend();) { + if (i->second.requestId == requestId) { + auto &list = i->second.callbacks; + if (callbacks.empty()) { + callbacks = std::move(list); } else { - ++i; + callbacks.insert( + end(callbacks), + std::make_move_iterator(begin(list)), + std::make_move_iterator(end(list))); } + i = requests->erase(i); + } else { + ++i; } - if (channel && requests->empty()) { - _channelMessageDataRequests.remove(channel); - } + } + if (channel && requests->empty()) { + _channelMessageDataRequests.remove(channel); + } + for (const auto &callback : callbacks) { + callback(); } } @@ -646,7 +657,7 @@ QString ApiWrap::exportDirectMessageLink( if (inRepliesContext) { if (const auto rootId = item->replyToTop()) { const auto root = item->history()->owner().message( - peerToChannel(channel->id), + channel->id, rootId); const auto sender = root ? root->discussionPostOriginalSender() @@ -1388,9 +1399,8 @@ void ApiWrap::deleteAllFromParticipant( const auto ids = history ? history->collectMessagesFromParticipantToDelete(from) : std::vector(); - const auto channelId = peerToChannel(channel->id); for (const auto &msgId : ids) { - if (const auto item = _session->data().message(channelId, msgId)) { + if (const auto item = _session->data().message(channel->id, msgId)) { item->destroy(); } } @@ -2225,11 +2235,7 @@ void ApiWrap::resolveWebPages() { if (i.key()->pendingTill <= t) { const auto item = _session->data().findWebPageItem(i.key()); if (item) { - if (item->channelId() == NoChannel) { - ids.push_back(MTP_inputMessageID(MTP_int(item->id))); - i.value() = -1; - } else { - auto channel = item->history()->peer->asChannel(); + if (const auto channel = item->history()->peer->asChannel()) { auto channelMap = idsByChannel.find(channel); if (channelMap == idsByChannel.cend()) { channelMap = idsByChannel.emplace( @@ -2244,6 +2250,9 @@ void ApiWrap::resolveWebPages() { MTP_inputMessageID(MTP_int(item->id))); } i.value() = -channelMap->second.first - 2; + } else { + ids.push_back(MTP_inputMessageID(MTP_int(item->id))); + i.value() = -1; } } } else { @@ -2927,14 +2936,13 @@ void ApiWrap::preloadEnoughUnreadMentions(not_null history) { void ApiWrap::checkForUnreadMentions( const base::flat_set &possiblyReadMentions, ChannelData *channel) { - for (auto msgId : possiblyReadMentions) { - requestMessageData(channel, msgId, [=]( - ChannelData *channel, - MsgId msgId) { - if (const auto item = _session->data().message(channel, msgId)) { - if (item->mentionsMe()) { - item->markMediaRead(); - } + for (const auto msgId : possiblyReadMentions) { + requestMessageData(channel, msgId, [=] { + const auto item = channel + ? _session->data().message(channel->id, msgId) + : _session->data().nonChannelMessage(msgId); + if (item && item->mentionsMe()) { + item->markMediaRead(); } }); } @@ -3206,7 +3214,7 @@ void ApiWrap::forwardMessages( const auto randomId = base::RandomValue(); if (genClientSideMessage) { const auto newId = FullMsgId( - peerToChannel(peer->id), + peer->id, _session->data().nextLocalMessageId()); const auto self = _session->user(); const auto messageFromId = sendAs @@ -3279,7 +3287,7 @@ void ApiWrap::sendSharedContact( const auto peer = history->peer; const auto newId = FullMsgId( - history->channelId(), + peer->id, _session->data().nextLocalMessageId()); const auto anonymousPost = peer->amAnonymous(); @@ -3505,7 +3513,7 @@ void ApiWrap::sendMessage(MessageToSend &&message) { while (TextUtilities::CutPart(sending, left, MaxMessageSize)) { auto newId = FullMsgId( - peerToChannel(peer->id), + peer->id, _session->data().nextLocalMessageId()); auto randomId = base::RandomValue(); @@ -3663,7 +3671,7 @@ void ApiWrap::sendInlineResult( const auto history = action.history; const auto peer = history->peer; const auto newId = FullMsgId( - peerToChannel(peer->id), + peer->id, _session->data().nextLocalMessageId()); const auto randomId = base::RandomValue(); diff --git a/Telegram/SourceFiles/apiwrap.h b/Telegram/SourceFiles/apiwrap.h index 52a325766..737672918 100644 --- a/Telegram/SourceFiles/apiwrap.h +++ b/Telegram/SourceFiles/apiwrap.h @@ -147,11 +147,7 @@ public: bool archived, Fn callback); - using RequestMessageDataCallback = Fn; - void requestMessageData( - ChannelData *channel, - MsgId msgId, - RequestMessageDataCallback callback); + void requestMessageData(PeerData *peer, MsgId msgId, Fn done); QString exportDirectMessageLink( not_null item, bool inRepliesContext); @@ -365,7 +361,7 @@ public: private: struct MessageDataRequest { - using Callbacks = std::vector; + using Callbacks = std::vector>; mtpRequestId requestId = 0; Callbacks callbacks; @@ -520,7 +516,7 @@ private: MessageDataRequests _messageDataRequests; base::flat_map< - ChannelData*, + not_null, MessageDataRequests> _channelMessageDataRequests; SingleQueuedInvokation _messageDataResolveDelayed; diff --git a/Telegram/SourceFiles/boxes/pin_messages_box.cpp b/Telegram/SourceFiles/boxes/pin_messages_box.cpp index f5c4c69a0..00c2d01d8 100644 --- a/Telegram/SourceFiles/boxes/pin_messages_box.cpp +++ b/Telegram/SourceFiles/boxes/pin_messages_box.cpp @@ -26,9 +26,9 @@ namespace { if (!top) { return false; } else if (peer == migrated) { - return top.channel || (id < top.msg); + return peerIsChannel(top.peer) || (id < top.msg); } else if (migrated) { - return top.channel && (id < top.msg); + return peerIsChannel(top.peer) && (id < top.msg); } else { return (id < top.msg); } diff --git a/Telegram/SourceFiles/boxes/share_box.cpp b/Telegram/SourceFiles/boxes/share_box.cpp index 802a943c0..4ea2bffe7 100644 --- a/Telegram/SourceFiles/boxes/share_box.cpp +++ b/Telegram/SourceFiles/boxes/share_box.cpp @@ -1105,12 +1105,14 @@ QString AppendShareGameScoreUrl( const FullMsgId &fullId) { auto shareHashData = QByteArray(0x20, Qt::Uninitialized); auto shareHashDataInts = reinterpret_cast(shareHashData.data()); - auto channel = fullId.channel - ? session->data().channelLoaded(fullId.channel) - : static_cast(nullptr); - auto channelAccessHash = uint64(channel ? channel->access : 0); + const auto peer = fullId.peer + ? session->data().peerLoaded(fullId.peer) + : static_cast(nullptr); + const auto channelAccessHash = uint64((peer && peer->isChannel()) + ? peer->asChannel()->access + : 0); shareHashDataInts[0] = session->userId().bare; - shareHashDataInts[1] = fullId.channel.bare; + shareHashDataInts[1] = fullId.peer.value; shareHashDataInts[2] = uint64(fullId.msg.bare); shareHashDataInts[3] = channelAccessHash; @@ -1190,31 +1192,22 @@ void ShareGameScoreByHash( return; } - // Check first 32 bits of channel access hash. - auto channelAccessHash = hashDataInts[3]; - //auto channelAccessHashInts = reinterpret_cast(&channelAccessHash); - //if (channelAccessHashInts[0] != hashDataInts[3]) { - // Ui::show(Box(tr::lng_share_wrong_user(tr::now))); - // return; - //} - - if (((hashDataInts[1] >> 40) != 0) - || (!hashDataInts[1] && channelAccessHash)) { + const auto peerId = PeerId(hashDataInts[1]); + const auto channelAccessHash = hashDataInts[3]; + if (!peerIsChannel(peerId) && channelAccessHash) { // If there is no channel id, there should be no channel access_hash. Ui::show(Box(tr::lng_share_wrong_user(tr::now))); return; } - auto channelId = ChannelId(hashDataInts[1]); - auto msgId = MsgId(int64(hashDataInts[2])); - if (const auto item = session->data().message(channelId, msgId)) { + const auto msgId = MsgId(int64(hashDataInts[2])); + if (const auto item = session->data().message(peerId, msgId)) { FastShareMessage(item); } else { - auto resolveMessageAndShareScore = [=](ChannelData *channel) { - session->api().requestMessageData(channel, msgId, [=]( - ChannelData *channel, - MsgId msgId) { - if (const auto item = session->data().message(channel, msgId)) { + auto resolveMessageAndShareScore = [=](PeerData *peer) { + session->api().requestMessageData(peer, msgId, [=] { + const auto item = session->data().message(peerId, msgId); + if (item) { FastShareMessage(item); } else { Ui::show(Box( @@ -1223,24 +1216,24 @@ void ShareGameScoreByHash( }); }; - const auto channel = channelId - ? session->data().channelLoaded(channelId) + const auto peer = peerIsChannel(peerId) + ? session->data().peerLoaded(peerId) : nullptr; - if (channel || !channelId) { - resolveMessageAndShareScore(channel); + if (peer || !peerIsChannel(peerId)) { + resolveMessageAndShareScore(peer); } else { session->api().request(MTPchannels_GetChannels( MTP_vector( 1, MTP_inputChannel( - MTP_long(channelId.bare), + MTP_long(peerToChannel(peerId).bare), MTP_long(channelAccessHash))) )).done([=](const MTPmessages_Chats &result) { result.match([&](const auto &data) { session->data().processChats(data.vchats()); }); - if (const auto channel = session->data().channelLoaded(channelId)) { - resolveMessageAndShareScore(channel); + if (const auto peer = session->data().peerLoaded(peerId)) { + resolveMessageAndShareScore(peer); } }).send(); } diff --git a/Telegram/SourceFiles/chat_helpers/bot_keyboard.cpp b/Telegram/SourceFiles/chat_helpers/bot_keyboard.cpp index d1d6b75f9..13e1e571d 100644 --- a/Telegram/SourceFiles/chat_helpers/bot_keyboard.cpp +++ b/Telegram/SourceFiles/chat_helpers/bot_keyboard.cpp @@ -245,11 +245,12 @@ bool BotKeyboard::updateMarkup(HistoryItem *to, bool force) { return false; } - if (_wasForMsgId == FullMsgId(to->channelId(), to->id) && !force) { + const auto peerId = to->history()->peer->id; + if (_wasForMsgId == FullMsgId(peerId, to->id) && !force) { return false; } - _wasForMsgId = FullMsgId(to->channelId(), to->id); + _wasForMsgId = FullMsgId(peerId, to->id); auto markupFlags = to->replyKeyboardFlags(); _forceReply = markupFlags & ReplyMarkupFlag::ForceReply; diff --git a/Telegram/SourceFiles/chat_helpers/emoji_interactions.cpp b/Telegram/SourceFiles/chat_helpers/emoji_interactions.cpp index 455bee476..d88e4d57e 100644 --- a/Telegram/SourceFiles/chat_helpers/emoji_interactions.cpp +++ b/Telegram/SourceFiles/chat_helpers/emoji_interactions.cpp @@ -164,7 +164,7 @@ void EmojiInteractions::startIncoming( if (!peer->isUser() || bunch.interactions.empty()) { return; } - const auto item = _session->data().message(nullptr, messageId); + const auto item = _session->data().message(peer->id, messageId); if (!item || !item->isRegular()) { return; } diff --git a/Telegram/SourceFiles/core/local_url_handlers.cpp b/Telegram/SourceFiles/core/local_url_handlers.cpp index 0a3671611..ef96744dd 100644 --- a/Telegram/SourceFiles/core/local_url_handlers.cpp +++ b/Telegram/SourceFiles/core/local_url_handlers.cpp @@ -439,8 +439,8 @@ bool OpenMediaTimestamp( const auto parts = base.mid(3).split('_'); const auto documentId = parts.value(0).toULongLong(); const auto itemId = FullMsgId( - parts.value(1).toInt(), - parts.value(2).toInt()); + PeerId(parts.value(1).toULongLong()), + MsgId(parts.value(2).toLongLong())); const auto session = &controller->session(); const auto document = session->data().document(documentId); session->settings().setMediaLastPlaybackPosition( diff --git a/Telegram/SourceFiles/data/data_folder.cpp b/Telegram/SourceFiles/data/data_folder.cpp index cbab84508..2714b446d 100644 --- a/Telegram/SourceFiles/data/data_folder.cpp +++ b/Telegram/SourceFiles/data/data_folder.cpp @@ -300,9 +300,7 @@ void Folder::applyDialog(const MTPDdialogFolder &data) { _chatsList.updateCloudUnread(data); if (const auto peerId = peerFromMTP(data.vpeer())) { const auto history = owner().history(peerId); - const auto fullId = FullMsgId( - peerToChannel(peerId), - data.vtop_message().v); + const auto fullId = FullMsgId(peerId, data.vtop_message().v); history->setFolder(this, owner().message(fullId)); } else { _chatsList.clear(); diff --git a/Telegram/SourceFiles/data/data_histories.cpp b/Telegram/SourceFiles/data/data_histories.cpp index b6c1f2a26..95ce6d0a6 100644 --- a/Telegram/SourceFiles/data/data_histories.cpp +++ b/Telegram/SourceFiles/data/data_histories.cpp @@ -469,7 +469,7 @@ void Histories::requestGroupAround(not_null item) { result); _chatListGroupRequests.remove(history); history->migrateToOrMe()->applyChatListGroup( - history->channelId(), + history->peer->id, result); finish(); }).fail([=] { diff --git a/Telegram/SourceFiles/data/data_messages.cpp b/Telegram/SourceFiles/data/data_messages.cpp index 9d01a067d..fabee6fbf 100644 --- a/Telegram/SourceFiles/data/data_messages.cpp +++ b/Telegram/SourceFiles/data/data_messages.cpp @@ -157,26 +157,6 @@ void MessagesList::removeOne(MessagePosition messageId) { } } -void MessagesList::removeAll(ChannelId channelId) { - auto removed = 0; - for (auto i = begin(_slices); i != end(_slices); ++i) { - _slices.modify(i, [&](Slice &slice) { - auto &messages = slice.messages; - for (auto j = begin(messages); j != end(messages);) { - if (j->fullId.channel == channelId) { - j = messages.erase(j); - ++removed; - } else { - ++j; - } - } - }); - } - if (removed && _count) { - *_count -= removed; - } -} - void MessagesList::removeLessThan(MessagePosition messageId) { auto removed = 0; for (auto i = begin(_slices); i != end(_slices);) { @@ -390,22 +370,6 @@ bool MessagesSliceBuilder::removeAll() { return true; } -bool MessagesSliceBuilder::removeFromChannel(ChannelId channelId) { - for (auto i = _ids.begin(); i != _ids.end();) { - if ((*i).fullId.channel == channelId) { - i = _ids.erase(i); - if (_fullCount) { - --*_fullCount; - } - } else { - ++i; - } - } - _skippedBefore = _skippedAfter = std::nullopt; - checkInsufficient(); - return true; -} - bool MessagesSliceBuilder::invalidated() { _fullCount = _skippedBefore = _skippedAfter = std::nullopt; _ids.clear(); diff --git a/Telegram/SourceFiles/data/data_messages.h b/Telegram/SourceFiles/data/data_messages.h index baf73af75..b5919e53b 100644 --- a/Telegram/SourceFiles/data/data_messages.h +++ b/Telegram/SourceFiles/data/data_messages.h @@ -65,11 +65,11 @@ struct MessagesRange { constexpr auto MinDate = TimeId(0); constexpr auto MaxDate = std::numeric_limits::max(); constexpr auto MinMessagePosition = MessagePosition{ - .fullId = FullMsgId(NoChannel, 1), + .fullId = FullMsgId(PeerId(), 1), .date = MinDate, }; constexpr auto MaxMessagePosition = MessagePosition{ - .fullId = FullMsgId(NoChannel, ServerMaxMsgId - 1), + .fullId = FullMsgId(PeerId(), ServerMaxMsgId - 1), .date = MaxDate, }; constexpr auto FullMessagesRange = MessagesRange{ @@ -77,7 +77,7 @@ constexpr auto FullMessagesRange = MessagesRange{ .till = MaxMessagePosition, }; constexpr auto UnreadMessagePosition = MessagePosition{ - .fullId = FullMsgId(NoChannel, ShowAtUnreadMsgId), + .fullId = FullMsgId(PeerId(), ShowAtUnreadMsgId), .date = MinDate, }; @@ -117,7 +117,6 @@ public: MessagesRange noSkipRange, std::optional count); void removeOne(MessagePosition messageId); - void removeAll(ChannelId channelId); void removeLessThan(MessagePosition messageId); void invalidate(); void invalidateBottom(); @@ -191,7 +190,6 @@ public: bool applyInitial(const MessagesResult &result); bool applyUpdate(const MessagesSliceUpdate &update); bool removeOne(MessagePosition messageId); - bool removeFromChannel(ChannelId channelId); bool removeAll(); bool invalidated(); bool bottomInvalidated(); diff --git a/Telegram/SourceFiles/data/data_msg_id.h b/Telegram/SourceFiles/data/data_msg_id.h index 45d43644b..675e12572 100644 --- a/Telegram/SourceFiles/data/data_msg_id.h +++ b/Telegram/SourceFiles/data/data_msg_id.h @@ -122,9 +122,10 @@ struct MsgRange { struct FullMsgId { constexpr FullMsgId() noexcept = default; - constexpr FullMsgId(ChannelId channel, MsgId msg) noexcept - : channel(channel), msg(msg) { + constexpr FullMsgId(PeerId peer, MsgId msg) noexcept + : peer(peer), msg(msg) { } + FullMsgId(ChannelId channelId, MsgId msgId) = delete; constexpr explicit operator bool() const noexcept { return msg != 0; @@ -133,16 +134,16 @@ struct FullMsgId { return msg == 0; } - ChannelId channel = NoChannel; + PeerId peer = 0; MsgId msg = 0; }; [[nodiscard]] inline constexpr bool operator<( const FullMsgId &a, const FullMsgId &b) noexcept { - if (a.channel < b.channel) { + if (a.peer < b.peer) { return true; - } else if (a.channel > b.channel) { + } else if (a.peer > b.peer) { return false; } return a.msg < b.msg; @@ -169,7 +170,7 @@ struct FullMsgId { [[nodiscard]] inline constexpr bool operator==( const FullMsgId &a, const FullMsgId &b) noexcept { - return (a.channel == b.channel) && (a.msg == b.msg); + return (a.peer == b.peer) && (a.msg == b.msg); } [[nodiscard]] inline constexpr bool operator!=( diff --git a/Telegram/SourceFiles/data/data_peer.cpp b/Telegram/SourceFiles/data/data_peer.cpp index 5fa677a5b..a6c462183 100644 --- a/Telegram/SourceFiles/data/data_peer.cpp +++ b/Telegram/SourceFiles/data/data_peer.cpp @@ -1193,11 +1193,11 @@ FullMsgId ResolveTopPinnedId( .skippedAfter = 0, }; if (!slice.messageIds.empty()) { - return FullMsgId(peerToChannel(peer->id), slice.messageIds.back()); + return FullMsgId(peer->id, slice.messageIds.back()); } else if (!migrated || slice.count != 0 || old.messageIds.empty()) { return FullMsgId(); } else { - return FullMsgId(0, old.messageIds.back()); + return FullMsgId(migrated->id, old.messageIds.back()); } } @@ -1227,9 +1227,9 @@ FullMsgId ResolveMinPinnedId( .skippedAfter = 0, }; if (!old.messageIds.empty()) { - return FullMsgId(0, old.messageIds.front()); + return FullMsgId(migrated->id, old.messageIds.front()); } else if (old.count == 0 && !slice.messageIds.empty()) { - return FullMsgId(peerToChannel(peer->id), slice.messageIds.front()); + return FullMsgId(peer->id, slice.messageIds.front()); } else { return FullMsgId(); } diff --git a/Telegram/SourceFiles/data/data_peer_id.h b/Telegram/SourceFiles/data/data_peer_id.h index 5944173d5..c59d1f635 100644 --- a/Telegram/SourceFiles/data/data_peer_id.h +++ b/Telegram/SourceFiles/data/data_peer_id.h @@ -136,8 +136,6 @@ using ChatId = ChatIdType<1>; using ChannelId = ChatIdType<2>; using FakeChatId = ChatIdType<0x7F>; -inline constexpr auto NoChannel = ChannelId(0); - struct PeerIdHelper { BareId value = 0; constexpr PeerIdHelper(BareId value) noexcept : value(value) { diff --git a/Telegram/SourceFiles/data/data_replies_list.cpp b/Telegram/SourceFiles/data/data_replies_list.cpp index f02ad8f29..b1e3e9467 100644 --- a/Telegram/SourceFiles/data/data_replies_list.cpp +++ b/Telegram/SourceFiles/data/data_replies_list.cpp @@ -193,10 +193,10 @@ std::optional RepliesList::fullUnreadCountAfter( || (fullLoaded && _list.empty()); const auto countIncoming = [&](auto from, auto till) { auto &owner = _history->owner(); - const auto channelId = _history->channelId(); + const auto peerId = _history->peer->id; auto count = 0; for (auto i = from; i != till; ++i) { - if (!owner.message(channelId, *i)->out()) { + if (!owner.message(peerId, *i)->out()) { ++count; } } @@ -336,7 +336,7 @@ bool RepliesList::buildFromData(not_null viewer) { = (*_skippedAfter + (availableAfter - useAfter)); } - const auto channelId = _history->channelId(); + const auto peerId = _history->peer->id; slice->ids.clear(); auto nearestToAround = std::optional(); slice->ids.reserve(useAfter + useBefore); @@ -346,10 +346,10 @@ bool RepliesList::buildFromData(not_null viewer) { ? *j : *(j - 1); } - slice->ids.emplace_back(channelId, *j); + slice->ids.emplace_back(peerId, *j); } slice->nearestToAround = FullMsgId( - channelId, + peerId, nearestToAround.value_or( slice->ids.empty() ? 0 : slice->ids.back().msg)); slice->fullCount = _fullCount.current(); @@ -418,7 +418,7 @@ Histories &RepliesList::histories() { } HistoryItem *RepliesList::lookupRoot() { - return _history->owner().message(_history->channelId(), _rootId); + return _history->owner().message(_history->peer->id, _rootId); } void RepliesList::loadAround(MsgId id) { diff --git a/Telegram/SourceFiles/data/data_scheduled_messages.cpp b/Telegram/SourceFiles/data/data_scheduled_messages.cpp index 292a332d6..006358b13 100644 --- a/Telegram/SourceFiles/data/data_scheduled_messages.cpp +++ b/Telegram/SourceFiles/data/data_scheduled_messages.cpp @@ -145,7 +145,7 @@ HistoryItem *ScheduledMessages::lookupItem(PeerId peer, MsgId msg) const { } HistoryItem *ScheduledMessages::lookupItem(FullMsgId itemId) const { - return lookupItem(peerFromChannel(itemId.channel), itemId.msg); + return lookupItem(itemId.peer, itemId.msg); } int ScheduledMessages::count(not_null history) const { diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index ed4ccbd47..77d35fb52 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -285,7 +285,7 @@ void Session::clear() { _sponsoredMessages = nullptr; _dependentMessages.clear(); base::take(_messages); - base::take(_channelMessages); + base::take(_nonChannelMessages); _messageByRandomId.clear(); _sentMessagesData.clear(); cSetRecentInlineBots(RecentInlineBots()); @@ -1334,20 +1334,31 @@ rpl::producer> Session::newItemAdded() const { return _newItemAdded.events(); } -void Session::changeMessageId(ChannelId channel, MsgId wasId, MsgId nowId) { - const auto list = messagesListForInsert(channel); +void Session::changeMessageId(PeerId peerId, MsgId wasId, MsgId nowId) { + const auto list = messagesListForInsert(peerId); auto i = list->find(wasId); Assert(i != list->end()); - auto owned = std::move(i->second); + const auto item = i->second; list->erase(i); - const auto [j, ok] = list->emplace(nowId, std::move(owned)); + const auto [j, ok] = list->emplace(nowId, item); + + if (!peerIsChannel(peerId)) { + if (IsServerMsgId(wasId)) { + const auto k = _nonChannelMessages.find(wasId); + Assert(k != end(_nonChannelMessages)); + _nonChannelMessages.erase(k); + } + if (IsServerMsgId(nowId)) { + _nonChannelMessages.emplace(nowId, item); + } + } Ensures(ok); } void Session::notifyItemIdChange(IdChange event) { const auto item = event.item; - changeMessageId(item->history()->channelId(), event.oldId, item->id); + changeMessageId(item->history()->peer->id, event.oldId, item->id); _itemIdChanges.fire_copy(event); @@ -1797,7 +1808,7 @@ void Session::reorderTwoPinnedChats( bool Session::checkEntitiesAndViewsUpdate(const MTPDmessage &data) { const auto peer = peerFromMTP(data.vpeer_id()); - const auto existing = message(peerToChannel(peer), data.vid().v); + const auto existing = message(peer, data.vid().v); if (!existing) { return false; } @@ -1817,8 +1828,7 @@ void Session::updateEditedMessage(const MTPMessage &data) { -> HistoryItem* { return nullptr; }, [&](const auto &data) { - const auto peer = peerFromMTP(data.vpeer_id()); - return message(peerToChannel(peer), data.vid().v); + return message(peerFromMTP(data.vpeer_id()), data.vid().v); }); if (!existing) { return; @@ -1885,23 +1895,19 @@ void Session::processExistingMessages( }); } -const Session::Messages *Session::messagesList(ChannelId channelId) const { - if (channelId == NoChannel) { - return &_messages; - } - const auto i = _channelMessages.find(channelId); - return (i != end(_channelMessages)) ? &i->second : nullptr; +const Session::Messages *Session::messagesList(PeerId peerId) const { + const auto i = _messages.find(peerId); + return (i != end(_messages)) ? &i->second : nullptr; } -auto Session::messagesListForInsert(ChannelId channelId) +auto Session::messagesListForInsert(PeerId peerId) -> not_null { - return (channelId == NoChannel) - ? &_messages - : &_channelMessages[channelId]; + return &_messages[peerId]; } void Session::registerMessage(not_null item) { - const auto list = messagesListForInsert(item->channelId()); + const auto peerId = item->history()->peer->id; + const auto list = messagesListForInsert(peerId); const auto itemId = item->id; const auto i = list->find(itemId); if (i != list->end()) { @@ -1909,6 +1915,10 @@ void Session::registerMessage(not_null item) { i->second->destroy(); } list->emplace(itemId, item); + + if (!peerIsChannel(peerId) && IsServerMsgId(itemId)) { + _nonChannelMessages.emplace(itemId, item); + } } void Session::registerMessageTTL(TimeId when, not_null item) { @@ -1963,12 +1973,10 @@ void Session::checkTTLs() { } void Session::processMessagesDeleted( - ChannelId channelId, + PeerId peerId, const QVector &data) { - const auto list = messagesList(channelId); - const auto affected = (channelId != NoChannel) - ? historyLoaded(peerFromChannel(channelId)) - : nullptr; + const auto list = messagesList(peerId); + const auto affected = historyLoaded(peerId); if (!list && !affected) { return; } @@ -1991,6 +1999,22 @@ void Session::processMessagesDeleted( } } +void Session::processNonChannelMessagesDeleted(const QVector &data) { + auto historiesToCheck = base::flat_set>(); + for (const auto &messageId : data) { + if (const auto item = nonChannelMessage(messageId.v)) { + const auto history = item->history(); + item->destroy(); + if (!history->chatListMessageKnown()) { + historiesToCheck.emplace(history); + } + } + } + for (const auto &history : historiesToCheck) { + history->requestChatListMessage(); + } +} + void Session::removeDependencyMessage(not_null item) { const auto i = _dependentMessages.find(item); if (i == end(_dependentMessages)) { @@ -2006,13 +2030,18 @@ void Session::removeDependencyMessage(not_null item) { void Session::unregisterMessage(not_null item) { const auto peerId = item->history()->peer->id; + const auto itemId = item->id; _itemRemoved.fire_copy(item); session().changes().messageUpdated( item, Data::MessageUpdate::Flag::Destroyed); groups().unregisterMessage(item); removeDependencyMessage(item); - messagesListForInsert(peerToChannel(peerId))->erase(item->id); + messagesListForInsert(peerId)->erase(itemId); + + if (!peerIsChannel(peerId) && IsServerMsgId(itemId)) { + _nonChannelMessages.erase(itemId); + } } MsgId Session::nextLocalMessageId() { @@ -2035,12 +2064,12 @@ bool Session::suggestToGigagroup(not_null group) const { return _suggestToGigagroup.contains(group); } -HistoryItem *Session::message(ChannelId channelId, MsgId itemId) const { +HistoryItem *Session::message(PeerId peerId, MsgId itemId) const { if (!itemId) { return nullptr; } - const auto data = messagesList(channelId); + const auto data = messagesList(peerId); if (!data) { return nullptr; } @@ -2050,13 +2079,21 @@ HistoryItem *Session::message(ChannelId channelId, MsgId itemId) const { } HistoryItem *Session::message( - const ChannelData *channel, + not_null peer, MsgId itemId) const { - return message(channel ? peerToChannel(channel->id) : 0, itemId); + return message(peer->id, itemId); } HistoryItem *Session::message(FullMsgId itemId) const { - return message(itemId.channel, itemId.msg); + return message(itemId.peer, itemId.msg); +} + +HistoryItem *Session::nonChannelMessage(MsgId itemId) const { + if (!IsServerMsgId(itemId)) { + return nullptr; + } + const auto i = _nonChannelMessages.find(itemId); + return (i != end(_nonChannelMessages)) ? i->second.get() : nullptr; } void Session::updateDependentMessages(not_null item) { diff --git a/Telegram/SourceFiles/data/data_session.h b/Telegram/SourceFiles/data/data_session.h index 27bd7cb9f..c3d5a859f 100644 --- a/Telegram/SourceFiles/data/data_session.h +++ b/Telegram/SourceFiles/data/data_session.h @@ -348,19 +348,22 @@ public: void processExistingMessages( ChannelData *channel, const MTPmessages_Messages &data); + void processNonChannelMessagesDeleted(const QVector &data); void processMessagesDeleted( - ChannelId channelId, + PeerId peerId, const QVector &data); [[nodiscard]] MsgId nextLocalMessageId(); [[nodiscard]] HistoryItem *message( - ChannelId channelId, + PeerId peerId, MsgId itemId) const; [[nodiscard]] HistoryItem *message( - const ChannelData *channel, + not_null peer, MsgId itemId) const; [[nodiscard]] HistoryItem *message(FullMsgId itemId) const; + [[nodiscard]] HistoryItem *nonChannelMessage(MsgId itemId) const; + void updateDependentMessages(not_null item); void registerDependentMessage( not_null dependent, @@ -698,11 +701,11 @@ private: Data::Folder *requestFolder, const MTPDdialogFolder &data); - const Messages *messagesList(ChannelId channelId) const; - not_null messagesListForInsert(ChannelId channelId); + const Messages *messagesList(PeerId peerId) const; + not_null messagesListForInsert(PeerId peerId); not_null registerMessage( std::unique_ptr item); - void changeMessageId(ChannelId channel, MsgId wasId, MsgId nowId); + void changeMessageId(PeerId peerId, MsgId wasId, MsgId nowId); void removeDependencyMessage(not_null item); void photoApplyFields( @@ -848,14 +851,15 @@ private: Dialogs::IndexedList _contactsNoChatsList; MsgId _localMessageIdCounter = StartClientMsgId; - Messages _messages; - std::map _channelMessages; + std::unordered_map _messages; std::map< not_null, base::flat_set>> _dependentMessages; std::map>> _ttlMessages; base::Timer _ttlCheckTimer; + std::unordered_map> _nonChannelMessages; + base::flat_map _messageByRandomId; base::flat_map _sentMessagesData; diff --git a/Telegram/SourceFiles/data/data_shared_media.cpp b/Telegram/SourceFiles/data/data_shared_media.cpp index 6f584ecbb..87851c62f 100644 --- a/Telegram/SourceFiles/data/data_shared_media.cpp +++ b/Telegram/SourceFiles/data/data_shared_media.cpp @@ -365,7 +365,7 @@ std::optional SharedMediaWithLastSlice::indexOf(Value value) const { ? QString::number(*_ending->skippedAfter()) : QString("-")); if (const auto msgId = std::get_if(&value)) { - info.push_back("value:" + QString::number(msgId->channel.bare)); + info.push_back("value:" + QString::number(msgId->peer.value)); info.push_back(QString::number(msgId->msg.bare)); const auto index = _slice.indexOf(*std::get_if(&value)); info.push_back("index:" + (index diff --git a/Telegram/SourceFiles/data/data_shared_media.h b/Telegram/SourceFiles/data/data_shared_media.h index 393aab5ff..445dc2e2e 100644 --- a/Telegram/SourceFiles/data/data_shared_media.h +++ b/Telegram/SourceFiles/data/data_shared_media.h @@ -164,7 +164,7 @@ private: return (a && b) ? base::make_optional(*a + *b) : std::nullopt; } static Value ComputeId(PeerId peerId, MsgId msgId) { - return FullMsgId(peerToChannel(peerId), msgId); + return FullMsgId(peerId, msgId); } static Value ComputeId(const Key &key) { if (const auto messageId = std::get_if(&key.universalId)) { diff --git a/Telegram/SourceFiles/data/data_sparse_ids.h b/Telegram/SourceFiles/data/data_sparse_ids.h index 1fb2b5fad..e949b80c1 100644 --- a/Telegram/SourceFiles/data/data_sparse_ids.h +++ b/Telegram/SourceFiles/data/data_sparse_ids.h @@ -100,12 +100,10 @@ private: } static bool IsFromSlice(PeerId peerId, FullMsgId fullId) { - return peerIsChannel(peerId) - ? (peerId == peerFromChannel(fullId.channel)) - : !fullId.channel; + return (peerId == fullId.peer); } static FullMsgId ComputeId(PeerId peerId, MsgId msgId) { - return FullMsgId(peerToChannel(peerId), msgId); + return FullMsgId(peerId, msgId); } static FullMsgId ComputeId(const Key &key) { return (key.universalId >= 0) diff --git a/Telegram/SourceFiles/data/data_sponsored_messages.cpp b/Telegram/SourceFiles/data/data_sponsored_messages.cpp index 155dc5f90..ff8617e9b 100644 --- a/Telegram/SourceFiles/data/data_sponsored_messages.cpp +++ b/Telegram/SourceFiles/data/data_sponsored_messages.cpp @@ -72,7 +72,7 @@ bool SponsoredMessages::append(not_null history) { } const auto flags = MessageFlags(0) - | (history->isChannel() ? MessageFlag::Post : MessageFlags(0)) + | (history->peer->isChannel() ? MessageFlag::Post : MessageFlags(0)) | MessageFlag::HasFromId | MessageFlag::IsSponsored | MessageFlag::Local; @@ -93,7 +93,7 @@ bool SponsoredMessages::append(not_null history) { } bool SponsoredMessages::canHaveFor(not_null history) const { - return history->isChannel(); + return history->peer->isChannel(); } void SponsoredMessages::request(not_null history) { @@ -189,11 +189,10 @@ void SponsoredMessages::clearItems(not_null history) { const SponsoredMessages::Entry *SponsoredMessages::find( const FullMsgId &fullId) const { - if (!fullId.channel) { + if (!peerIsChannel(fullId.peer)) { return nullptr; } - const auto history = _session->data().history( - peerFromChannel(fullId.channel)); + const auto history = _session->data().history(fullId.peer); const auto it = _data.find(history); if (it == end(_data)) { return nullptr; diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index 5c575dddf..0df9533cd 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -695,7 +695,7 @@ bool InnerWidget::isSearchResultActive( const auto peer = item->history()->peer; return (item->fullId() == entry.fullId) || (peer->migrateTo() - && (peerToChannel(peer->migrateTo()->id) == entry.fullId.channel) + && (peer->migrateTo()->id == entry.fullId.peer) && (item->id == -entry.fullId.msg)) || (uniqueSearchResults() && peer == entry.key.peer()); } @@ -1552,7 +1552,7 @@ void InnerWidget::updateDialogRow( if (const auto migrated = from->owner().historyLoaded(from)) { row = RowDescriptor( migrated, - FullMsgId(0, -row.fullId.msg)); + FullMsgId(from->id, -row.fullId.msg)); } } } @@ -2712,7 +2712,7 @@ RowDescriptor InnerWidget::chatListEntryBefore( if (i != list->cbegin()) { return RowDescriptor( (*(i - 1))->key(), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } } return RowDescriptor(); @@ -2738,11 +2738,11 @@ RowDescriptor InnerWidget::chatListEntryBefore( } return RowDescriptor( _filterResults.back()->key(), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } return RowDescriptor( session().data().history(_peerSearchResults.back()->peer), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } } if (!_peerSearchResults.empty() @@ -2752,14 +2752,14 @@ RowDescriptor InnerWidget::chatListEntryBefore( } return RowDescriptor( _filterResults.back()->key(), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } if (!_peerSearchResults.empty()) { for (auto b = _peerSearchResults.cbegin(), i = b + 1, e = _peerSearchResults.cend(); i != e; ++i) { if ((*i)->peer == whichHistory->peer) { return RowDescriptor( session().data().history((*(i - 1))->peer), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } } } @@ -2771,7 +2771,7 @@ RowDescriptor InnerWidget::chatListEntryBefore( if ((*i)->key() == which.key) { return RowDescriptor( (*(i - 1))->key(), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } } return RowDescriptor(); @@ -2789,7 +2789,7 @@ RowDescriptor InnerWidget::chatListEntryAfter( if (i != list->cend()) { return RowDescriptor( (*i)->key(), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } } return RowDescriptor(); @@ -2815,7 +2815,7 @@ RowDescriptor InnerWidget::chatListEntryAfter( if (i != e) { return RowDescriptor( session().data().history((*i)->peer), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } else if (!_searchResults.empty()) { return RowDescriptor( _searchResults.front()->item()->history(), @@ -2830,11 +2830,11 @@ RowDescriptor InnerWidget::chatListEntryAfter( if (i != e) { return RowDescriptor( (*i)->key(), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } else if (!_peerSearchResults.empty()) { return RowDescriptor( session().data().history(_peerSearchResults.front()->peer), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } else if (!_searchResults.empty()) { return RowDescriptor( _searchResults.front()->item()->history(), @@ -2853,17 +2853,17 @@ RowDescriptor InnerWidget::chatListEntryFirst() const { if (i != list->cend()) { return RowDescriptor( (*i)->key(), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } return RowDescriptor(); } else if (!_filterResults.empty()) { return RowDescriptor( _filterResults.front()->key(), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } else if (!_peerSearchResults.empty()) { return RowDescriptor( session().data().history(_peerSearchResults.front()->peer), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } else if (!_searchResults.empty()) { return RowDescriptor( _searchResults.front()->item()->history(), @@ -2879,7 +2879,7 @@ RowDescriptor InnerWidget::chatListEntryLast() const { if (i != list->cbegin()) { return RowDescriptor( (*(i - 1))->key(), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } return RowDescriptor(); } else if (!_searchResults.empty()) { @@ -2889,11 +2889,11 @@ RowDescriptor InnerWidget::chatListEntryLast() const { } else if (!_peerSearchResults.empty()) { return RowDescriptor( session().data().history(_peerSearchResults.back()->peer), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } else if (!_filterResults.empty()) { return RowDescriptor( _filterResults.back()->key(), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } return RowDescriptor(); } diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_section.cpp b/Telegram/SourceFiles/history/admin_log/history_admin_log_section.cpp index 961da5fd6..56adbaff2 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_section.cpp +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_section.cpp @@ -358,7 +358,7 @@ not_null Widget::channel() const { Dialogs::RowDescriptor Widget::activeChat() const { return { channel()->owner().history(channel()), - FullMsgId(peerToChannel(channel()->id), ShowAtUnreadMsgId) + FullMsgId(channel()->id, ShowAtUnreadMsgId) }; } diff --git a/Telegram/SourceFiles/history/history.cpp b/Telegram/SourceFiles/history/history.cpp index 81fbd49de..3651a796d 100644 --- a/Telegram/SourceFiles/history/history.cpp +++ b/Telegram/SourceFiles/history/history.cpp @@ -366,7 +366,7 @@ not_null History::createItem( const MTPMessage &message, MessageFlags localFlags, bool detachExistingItem) { - if (const auto result = owner().message(channelId(), id)) { + if (const auto result = owner().message(peer, id)) { if (detachExistingItem) { result->removeMainView(); } @@ -2174,7 +2174,7 @@ bool History::isReadyFor(MsgId msgId) { } return loadedAtBottom(); } - const auto item = owner().message(channelId(), msgId); + const auto item = owner().message(peer, msgId); return item && (item->history() == this) && item->mainView(); } @@ -2446,15 +2446,15 @@ void History::setFakeChatListMessageFrom(const MTPmessages_Messages &data) { } void History::applyChatListGroup( - ChannelId channelId, + PeerId dataPeerId, const MTPmessages_Messages &data) { if (!isEmpty() || !_chatListMessage || !*_chatListMessage - || (*_chatListMessage)->history()->channelId() != channelId || (*_chatListMessage)->history() != this || !_lastMessage - || !*_lastMessage) { + || !*_lastMessage + || dataPeerId != peer->id) { return; } // Apply loaded album as a last slice. @@ -2463,7 +2463,7 @@ void History::applyChatListGroup( items.reserve(messages.v.size()); for (const auto &message : messages.v) { const auto id = IdFromMessage(message); - if (const auto message = owner().message(channelId, id)) { + if (const auto message = owner().message(dataPeerId, id)) { items.push_back(message); } } @@ -2584,7 +2584,7 @@ void History::applyDialog( } if (!channel->amCreator()) { const auto topMessageId = FullMsgId( - peerToChannel(channel->id), + channel->id, data.vtop_message().v); if (const auto item = owner().message(topMessageId)) { if (item->date() <= channel->date) { @@ -2719,9 +2719,7 @@ void History::applyDialogFields( void History::applyDialogTopMessage(MsgId topMessageId) { if (topMessageId) { - const auto itemId = FullMsgId( - channelId(), - topMessageId); + const auto itemId = FullMsgId(peer->id, topMessageId); if (const auto item = owner().message(itemId)) { setLastServerMessage(item); } else { @@ -2826,18 +2824,6 @@ void History::forceFullResize() { _flags |= Flag::f_has_pending_resized_items; } -ChannelId History::channelId() const { - return peerToChannel(peer->id); -} - -bool History::isChannel() const { - return peerIsChannel(peer->id); -} - -bool History::isMegagroup() const { - return peer->isMegagroup(); -} - not_null History::migrateToOrMe() const { if (const auto to = peer->migrateTo()) { return owner().history(to); @@ -2964,7 +2950,7 @@ void History::checkLocalMessages() { insertMessageToBlocks(item); } } - if (isChannel() + if (peer->isChannel() && !_joinedMessage && peer->asChannel()->inviter && goodDate(peer->asChannel()->inviteDate)) { diff --git a/Telegram/SourceFiles/history/history.h b/Telegram/SourceFiles/history/history.h index 0b26a1d0a..a5580159b 100644 --- a/Telegram/SourceFiles/history/history.h +++ b/Telegram/SourceFiles/history/history.h @@ -83,16 +83,12 @@ public: History &operator=(const History &) = delete; ~History(); - ChannelId channelId() const; - bool isChannel() const; - bool isMegagroup() const; not_null migrateToOrMe() const; History *migrateFrom() const; MsgRange rangeForDifferenceRequest() const; void checkLocalMessages(); void removeJoinedMessage(); - bool isEmpty() const; bool isDisplayedEmpty() const; Element *findFirstNonEmpty() const; @@ -411,7 +407,7 @@ public: void checkChatListMessageRemoved(not_null item); void applyChatListGroup( - ChannelId channelId, + PeerId dataPeerId, const MTPmessages_Messages &data); void forgetScrollState() { diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index 658bbac75..23f2a3923 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -2892,7 +2892,9 @@ MessageIdsList HistoryInner::getSelectedItems() const { }) | to_vector; result |= actions::sort(less{}, [](const FullMsgId &msgId) { - return msgId.channel ? msgId.msg : (msgId.msg - ServerMaxMsgId); + return peerIsChannel(msgId.peer) + ? msgId.msg + : (msgId.msg - ServerMaxMsgId); }); return result; } diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index 613ba2b99..3bc223104 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -285,7 +285,7 @@ HistoryItem *HistoryItem::lookupDiscussionPostOriginal() const { return nullptr; } return _history->owner().message( - forwarded->savedFromPeer->asChannel(), + forwarded->savedFromPeer->id, forwarded->savedFromMsgId); } @@ -745,8 +745,8 @@ bool HistoryItem::hasDirectLink() const { return isRegular() && _history->peer->isChannel(); } -ChannelId HistoryItem::channelId() const { - return _history->channelId(); +FullMsgId HistoryItem::fullId() const { + return FullMsgId(_history->peer->id, id); } Data::MessagePosition HistoryItem::position() const { diff --git a/Telegram/SourceFiles/history/history_item.h b/Telegram/SourceFiles/history/history_item.h index 82c1c996c..8f96c9ad7 100644 --- a/Telegram/SourceFiles/history/history_item.h +++ b/Telegram/SourceFiles/history/history_item.h @@ -391,10 +391,7 @@ public: [[nodiscard]] bool hasDirectLink() const; - [[nodiscard]] ChannelId channelId() const; - [[nodiscard]] FullMsgId fullId() const { - return FullMsgId(channelId(), id); - } + [[nodiscard]] FullMsgId fullId() const; [[nodiscard]] Data::MessagePosition position() const; [[nodiscard]] TimeId date() const; diff --git a/Telegram/SourceFiles/history/history_item_components.cpp b/Telegram/SourceFiles/history/history_item_components.cpp index 86aff74bf..62bf2c695 100644 --- a/Telegram/SourceFiles/history/history_item_components.cpp +++ b/Telegram/SourceFiles/history/history_item_components.cpp @@ -236,8 +236,8 @@ bool HistoryMessageReply::updateData( if (!replyToMsg) { replyToMsg = holder->history()->owner().message( (replyToPeerId - ? peerToChannel(replyToPeerId) - : holder->channelId()), + ? replyToPeerId + : holder->history()->peer->id), replyToMsgId); if (replyToMsg) { if (replyToMsg->isEmpty()) { diff --git a/Telegram/SourceFiles/history/history_message.cpp b/Telegram/SourceFiles/history/history_message.cpp index aeb8c2ab7..7e08d4d25 100644 --- a/Telegram/SourceFiles/history/history_message.cpp +++ b/Telegram/SourceFiles/history/history_message.cpp @@ -356,16 +356,15 @@ void RequestDependentMessageData( const auto fullId = item->fullId(); const auto history = item->history(); const auto session = &history->session(); + const auto done = [=] { + if (const auto item = session->data().message(fullId)) { + item->updateDependencyItem(); + } + }; history->session().api().requestMessageData( - (peerIsChannel(peerId) - ? history->owner().channel(peerToChannel(peerId)).get() - : history->peer->asChannel()), + (peerId ? history->owner().peer(peerId) : history->peer), msgId, - [=](ChannelData *channel, MsgId msgId) { - if (const auto item = session->data().message(fullId)) { - item->updateDependencyItem(); - } - }); + done); } MessageFlags NewMessageFlags(not_null peer) { @@ -384,7 +383,7 @@ bool ShouldSendSilent( MsgId LookupReplyToTop(not_null history, MsgId replyToId) { const auto &owner = history->owner(); - if (const auto item = owner.message(history->channelId(), replyToId)) { + if (const auto item = owner.message(history->peer, replyToId)) { return item->replyToTop(); } return 0; @@ -977,25 +976,28 @@ bool HistoryMessage::areRepliesUnread() const { FullMsgId HistoryMessage::commentsItemId() const { if (const auto views = Get()) { - return FullMsgId(views->commentsMegagroupId, views->commentsRootId); + return FullMsgId( + PeerId(views->commentsMegagroupId), + views->commentsRootId); } return FullMsgId(); } void HistoryMessage::setCommentsItemId(FullMsgId id) { - if (id.channel == _history->channelId()) { + if (id.peer == _history->peer->id) { if (id.msg != this->id) { if (const auto reply = Get()) { reply->replyToMsgTop = id.msg; } } - return; } else if (const auto views = Get()) { - if (views->commentsMegagroupId != id.channel) { - views->commentsMegagroupId = id.channel; - history()->owner().requestItemResize(this); + if (const auto channelId = peerToChannel(id.peer)) { + if (views->commentsMegagroupId != channelId) { + views->commentsMegagroupId = channelId; + history()->owner().requestItemResize(this); + } + views->commentsRootId = id.msg; } - views->commentsRootId = id.msg; } } @@ -1966,13 +1968,11 @@ void HistoryMessage::changeReplyToTopCounter( if (!isRegular() || !reply->replyToTop()) { return; } - const auto channelId = history()->channelId(); - if (!channelId) { + const auto peerId = _history->peer->id; + if (!peerIsChannel(peerId)) { return; } - const auto top = history()->owner().message( - channelId, - reply->replyToTop()); + const auto top = _history->owner().message(peerId, reply->replyToTop()); if (!top) { return; } diff --git a/Telegram/SourceFiles/history/history_service.cpp b/Telegram/SourceFiles/history/history_service.cpp index 0268b5d9e..b4e6ca364 100644 --- a/Telegram/SourceFiles/history/history_service.cpp +++ b/Telegram/SourceFiles/history/history_service.cpp @@ -605,8 +605,8 @@ bool HistoryService::updateDependent(bool force) { if (!dependent->msg) { dependent->msg = history()->owner().message( (dependent->peerId - ? peerToChannel(dependent->peerId) - : channelId()), + ? dependent->peerId + : _history->peer->id), dependent->msgId); if (dependent->msg) { if (dependent->msg->isEmpty()) { @@ -1245,14 +1245,14 @@ HistoryService::PreparedText GenerateJoinedText( if (inviter->id != history->session().userPeerId()) { auto result = HistoryService::PreparedText{}; result.links.push_back(inviter->createOpenLink()); - result.text = (history->isMegagroup() + result.text = (history->peer->isMegagroup() ? tr::lng_action_add_you_group : tr::lng_action_add_you)( tr::now, lt_from, textcmdLink(1, inviter->name)); return result; - } else if (history->isMegagroup()) { + } else if (history->peer->isMegagroup()) { if (viaRequest) { return { tr::lng_action_you_joined_by_request(tr::now) }; } diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 863f8da9e..1b459cafb 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -777,7 +777,7 @@ HistoryWidget::HistoryWidget( return (action.history == _history); }) | rpl::start_with_next([=](const Api::SendAction &action) { const auto lastKeyboardUsed = lastForceReplyReplied(FullMsgId( - action.history->channelId(), + action.history->peer->id, action.replyTo)); if (action.options.scheduled) { cancelReply(lastKeyboardUsed); @@ -1088,7 +1088,7 @@ void HistoryWidget::animatedScrollToItem(MsgId msgId) { updateListSize(); } - auto to = session().data().message(_channel, msgId); + auto to = session().data().message(_history->peer, msgId); if (_list->itemTop(to) < 0) { return; } @@ -1767,18 +1767,22 @@ void HistoryWidget::setReplyReturns(PeerId peer, const QList &replyReturn if (_replyReturns.isEmpty()) { _replyReturn = nullptr; } else if (_replyReturns.back() < 0 && -_replyReturns.back() < ServerMaxMsgId) { - _replyReturn = session().data().message(0, -_replyReturns.back()); + _replyReturn = _migrated + ? session().data().message(_migrated->peer, -_replyReturns.back()) + : nullptr; } else { - _replyReturn = session().data().message(_channel, _replyReturns.back()); + _replyReturn = session().data().message(peer, _replyReturns.back()); } while (!_replyReturns.isEmpty() && !_replyReturn) { _replyReturns.pop_back(); if (_replyReturns.isEmpty()) { _replyReturn = nullptr; } else if (_replyReturns.back() < 0 && -_replyReturns.back() < ServerMaxMsgId) { - _replyReturn = session().data().message(0, -_replyReturns.back()); + _replyReturn = _migrated + ? session().data().message(_migrated->peer, -_replyReturns.back()) + : nullptr; } else { - _replyReturn = session().data().message(_channel, _replyReturns.back()); + _replyReturn = session().data().message(peer, _replyReturns.back()); } } } @@ -1790,9 +1794,13 @@ void HistoryWidget::calcNextReplyReturn() { if (_replyReturns.isEmpty()) { _replyReturn = nullptr; } else if (_replyReturns.back() < 0 && -_replyReturns.back() < ServerMaxMsgId) { - _replyReturn = session().data().message(0, -_replyReturns.back()); + _replyReturn = _migrated + ? session().data().message(_migrated->peer, -_replyReturns.back()) + : nullptr; } else { - _replyReturn = session().data().message(_channel, _replyReturns.back()); + _replyReturn = _peer + ? session().data().message(_peer, _replyReturns.back()) + : nullptr; } } if (!_replyReturn) { @@ -2026,7 +2034,6 @@ void HistoryWidget::showHistory( setHistory(nullptr); _list = nullptr; _peer = nullptr; - _channel = NoChannel; _canSendMessages = false; _silent.destroy(); updateBotKeyboard(); @@ -2057,7 +2064,6 @@ void HistoryWidget::showHistory( if (peerId) { _peer = session().data().peer(peerId); - _channel = peerToChannel(_peer->id); _canSendMessages = _peer->canWrite(); _contactStatus = std::make_unique( controller(), @@ -2110,7 +2116,7 @@ void HistoryWidget::showHistory( refreshTopBarActiveChat(); updateTopBarSelection(); - if (_channel) { + if (_peer->isChannel()) { updateNotifyControls(); session().data().requestNotifySettings(_peer); refreshSilentToggle(); @@ -2215,7 +2221,7 @@ void HistoryWidget::showHistory( if (_history) { controller()->setActiveChatEntry({ _history, - FullMsgId(_history->channelId(), _showAtMsgId) }); + FullMsgId(_history->peer->id, _showAtMsgId) }); } update(); controller()->floatPlayerAreaUpdated(); @@ -2949,7 +2955,7 @@ void HistoryWidget::firstLoadMessages() { _history->getReadyFor(_showAtMsgId); offset = -loadCount / 2; offsetId = _showAtMsgId; - } else if (_showAtMsgId < 0 && _history->isChannel()) { + } else if (_showAtMsgId < 0 && _history->peer->isChannel()) { if (_showAtMsgId < 0 && -_showAtMsgId < ServerMaxMsgId && _migrated) { _history->getReadyFor(_showAtMsgId); from = _migrated; @@ -3120,7 +3126,7 @@ void HistoryWidget::delayedShowAt(MsgId showAtMsgId) { } else if (_delayedShowAtMsgId > 0) { offset = -loadCount / 2; offsetId = _delayedShowAtMsgId; - } else if (_delayedShowAtMsgId < 0 && _history->isChannel()) { + } else if (_delayedShowAtMsgId < 0 && _history->peer->isChannel()) { if (_delayedShowAtMsgId < 0 && -_delayedShowAtMsgId < ServerMaxMsgId && _migrated) { from = _migrated; offset = -loadCount / 2; @@ -3307,7 +3313,7 @@ void HistoryWidget::showNextUnreadMention() { // See https://github.com/telegramdesktop/tdesktop/issues/5623 if (msgId && already) { const auto item = _history->owner().message( - _history->channelId(), + _history->peer->id, msgId); if (const auto media = item ? item->media() : nullptr) { if (const auto document = media->document()) { @@ -3329,7 +3335,7 @@ void HistoryWidget::saveEditMsg() { return; } - const auto item = session().data().message(_channel, _editMsgId); + const auto item = session().data().message(_history->peer, _editMsgId); if (!item) { cancelEdit(); return; @@ -3643,7 +3649,7 @@ void HistoryWidget::setMsgId(MsgId showAtMsgId) { if (_history) { controller()->setActiveChatEntry({ _history, - FullMsgId(_history->channelId(), _showAtMsgId) }); + FullMsgId(_history->peer->id, _showAtMsgId) }); } } } @@ -3894,8 +3900,8 @@ void HistoryWidget::sendBotCommand(const Bot::SendCommandRequest &request) { } const auto lastKeyboardUsed = (_keyboard->forMsgId() - == FullMsgId(_channel, _history->lastKeyboardId)) - && (_keyboard->forMsgId() == FullMsgId(_channel, request.replyTo)); + == FullMsgId(_peer->id, _history->lastKeyboardId)) + && (_keyboard->forMsgId() == FullMsgId(_peer->id, request.replyTo)); // 'bot' may be nullptr in case of sending from FieldAutocomplete. const auto toSend = (request.replyTo/* || !bot*/) @@ -3927,7 +3933,8 @@ void HistoryWidget::sendBotCommand(const Bot::SendCommandRequest &request) { void HistoryWidget::hideSingleUseKeyboard(PeerData *peer, MsgId replyTo) { if (!_peer || _peer != peer) return; - bool lastKeyboardUsed = (_keyboard->forMsgId() == FullMsgId(_channel, _history->lastKeyboardId)) && (_keyboard->forMsgId() == FullMsgId(_channel, replyTo)); + bool lastKeyboardUsed = (_keyboard->forMsgId() == FullMsgId(_peer->id, _history->lastKeyboardId)) + && (_keyboard->forMsgId() == FullMsgId(_peer->id, replyTo)); if (replyTo) { if (_replyToId == replyTo) { cancelReply(); @@ -4181,7 +4188,11 @@ bool HistoryWidget::updateCmdStartShown() { } bool HistoryWidget::kbWasHidden() const { - return _history && (_keyboard->forMsgId() == FullMsgId(_history->channelId(), _history->lastKeyboardHiddenId)); + return _history + && (_keyboard->forMsgId() + == FullMsgId( + _history->peer->id, + _history->lastKeyboardHiddenId)); } void HistoryWidget::toggleKeyboard(bool manual) { @@ -5308,7 +5319,9 @@ void HistoryWidget::updateBotKeyboard(History *h, bool force) { changed = _keyboard->updateMarkup(_replyEditMsg, force); } else { const auto keyboardItem = _history->lastKeyboardId - ? session().data().message(_channel, _history->lastKeyboardId) + ? session().data().message( + _history->peer, + _history->lastKeyboardId) : nullptr; changed = _keyboard->updateMarkup(keyboardItem, force); } @@ -5319,7 +5332,11 @@ void HistoryWidget::updateBotKeyboard(History *h, bool force) { bool hasMarkup = _keyboard->hasMarkup(), forceReply = _keyboard->forceReply() && (!_replyToId || !_replyEditMsg); if (hasMarkup || forceReply) { - if (_keyboard->singleUse() && _keyboard->hasMarkup() && _keyboard->forMsgId() == FullMsgId(_channel, _history->lastKeyboardId) && _history->lastKeyboardUsed) { + if (_keyboard->singleUse() + && _keyboard->hasMarkup() + && (_keyboard->forMsgId() + == FullMsgId(_history->peer->id, _history->lastKeyboardId)) + && _history->lastKeyboardUsed) { _history->lastKeyboardHiddenId = _history->lastKeyboardId; } if (!isBotStart() && !isBlocked() && _canSendMessages && (wasVisible || (_replyToId && _replyEditMsg) || (!HasSendText(_field) && !kbWasHidden()))) { @@ -5391,8 +5408,8 @@ void HistoryWidget::botCallbackSent(not_null item) { } const auto keyId = _keyboard->forMsgId(); - const auto lastKeyboardUsed = (keyId == FullMsgId(_channel, item->id)) - && (keyId == FullMsgId(_channel, _history->lastKeyboardId)); + const auto lastKeyboardUsed = (keyId == FullMsgId(_peer->id, item->id)) + && (keyId == FullMsgId(_peer->id, _history->lastKeyboardId)); session().data().requestItemRepaint(item); @@ -5706,9 +5723,7 @@ bool HistoryWidget::replyToPreviousMessage() { if (!_history || _editMsgId) { return false; } - const auto fullId = FullMsgId( - _history->channelId(), - _replyToId); + const auto fullId = FullMsgId(_history->peer->id, _replyToId); if (const auto item = session().data().message(fullId)) { if (const auto view = item->mainView()) { if (const auto previousView = view->previousDisplayedInBlocks()) { @@ -5731,9 +5746,7 @@ bool HistoryWidget::replyToNextMessage() { if (!_history || _editMsgId) { return false; } - const auto fullId = FullMsgId( - _history->channelId(), - _replyToId); + const auto fullId = FullMsgId(_history->peer->id, _replyToId); if (const auto item = session().data().message(fullId)) { if (const auto view = item->mainView()) { if (const auto nextView = view->nextDisplayedInBlocks()) { @@ -5841,7 +5854,7 @@ void HistoryWidget::updatePinnedViewer() { : (view->data()->id + (offset > 0 ? 1 : 0)); const auto lastClickedId = !_pinnedClickedId ? (ServerMaxMsgId - 1) - : (!_migrated || _pinnedClickedId.channel) + : (!_migrated || peerIsChannel(_pinnedClickedId.peer)) ? _pinnedClickedId.msg : (_pinnedClickedId.msg - ServerMaxMsgId); if (_pinnedClickedId @@ -5899,7 +5912,7 @@ void HistoryWidget::checkPinnedBarState() { _migrated ? _migrated->peer.get() : nullptr); const auto universalPinnedId = !currentPinnedId ? int32(0) - : (_migrated && !currentPinnedId.channel) + : (_migrated && !peerIsChannel(currentPinnedId.peer)) ? (currentPinnedId.msg - ServerMaxMsgId) : currentPinnedId.msg; if (universalPinnedId == hiddenId) { @@ -6046,7 +6059,7 @@ void HistoryWidget::refreshPinnedBarButton(bool many) { controller()->showSection( std::make_shared( _history, - ((!_migrated || id.message.channel) + ((!_migrated || peerIsChannel(id.message.peer)) ? id.message.msg : (id.message.msg - ServerMaxMsgId)))); } @@ -6154,13 +6167,14 @@ void HistoryWidget::setupRequestsBar() { } void HistoryWidget::requestMessageData(MsgId msgId) { - const auto callback = [=](ChannelData *channel, MsgId msgId) { - messageDataReceived(channel, msgId); - }; - session().api().requestMessageData( - _peer->asChannel(), - msgId, - crl::guard(this, callback)); + if (!_peer) { + return; + } + const auto peer = _peer; + const auto callback = crl::guard(this, [=] { + messageDataReceived(peer, msgId); + }); + session().api().requestMessageData(_peer, msgId, callback); } bool HistoryWidget::sendExistingDocument( @@ -6437,17 +6451,17 @@ void HistoryWidget::hidePinnedMessage() { } bool HistoryWidget::lastForceReplyReplied(const FullMsgId &replyTo) const { - if (replyTo.channel != _channel) { - return false; - } - return _keyboard->forceReply() - && _keyboard->forMsgId() == FullMsgId(_channel, _history->lastKeyboardId) + return _peer + && (replyTo.peer == _peer->id) + && _keyboard->forceReply() + && _keyboard->forMsgId() == FullMsgId(_peer->id, _history->lastKeyboardId) && _keyboard->forMsgId().msg == replyTo.msg; } bool HistoryWidget::lastForceReplyReplied() const { - return _keyboard->forceReply() - && _keyboard->forMsgId() == FullMsgId(_channel, _history->lastKeyboardId) + return _peer + && _keyboard->forceReply() + && _keyboard->forMsgId() == FullMsgId(_peer->id, _history->lastKeyboardId) && _keyboard->forMsgId().msg == replyToId(); } @@ -6840,10 +6854,11 @@ void HistoryWidget::clearSelected() { } HistoryItem *HistoryWidget::getItemFromHistoryOrMigrated(MsgId genericMsgId) const { - if (genericMsgId < 0 && -genericMsgId < ServerMaxMsgId && _migrated) { - return session().data().message(_migrated->channelId(), -genericMsgId); - } - return session().data().message(_channel, genericMsgId); + return (genericMsgId < 0 && -genericMsgId < ServerMaxMsgId && _migrated) + ? session().data().message(_migrated->peer, -genericMsgId) + : _peer + ? session().data().message(_peer, genericMsgId) + : nullptr; } MessageIdsList HistoryWidget::getSelectedItems() const { @@ -6906,11 +6921,12 @@ void HistoryWidget::updateTopBarSelection() { update(); } -void HistoryWidget::messageDataReceived(ChannelData *channel, MsgId msgId) { - if (!_peer || _peer->asChannel() != channel || !msgId) { +void HistoryWidget::messageDataReceived( + not_null peer, + MsgId msgId) { + if (!_peer || _peer != peer || !msgId) { return; - } - if (_editMsgId == msgId || _replyToId == msgId) { + } else if (_editMsgId == msgId || _replyToId == msgId) { updateReplyEditTexts(true); } } @@ -6932,8 +6948,10 @@ void HistoryWidget::updateReplyEditTexts(bool force) { return; } } - if (!_replyEditMsg) { - _replyEditMsg = session().data().message(_channel, _editMsgId ? _editMsgId : _replyToId); + if (!_replyEditMsg && _peer) { + _replyEditMsg = session().data().message( + _peer->id, + _editMsgId ? _editMsgId : _replyToId); } if (_replyEditMsg) { updateReplyEditText(_replyEditMsg); diff --git a/Telegram/SourceFiles/history/history_widget.h b/Telegram/SourceFiles/history/history_widget.h index e546696be..d5da88bbc 100644 --- a/Telegram/SourceFiles/history/history_widget.h +++ b/Telegram/SourceFiles/history/history_widget.h @@ -369,7 +369,7 @@ private: void refreshTopBarActiveChat(); void requestMessageData(MsgId msgId); - void messageDataReceived(ChannelData *channel, MsgId msgId); + void messageDataReceived(not_null peer, MsgId msgId); [[nodiscard]] Api::SendAction prepareSendAction( Api::SendOptions options) const; @@ -666,7 +666,6 @@ private: PeerData *_peer = nullptr; - ChannelId _channel = NoChannel; bool _canSendMessages = false; MsgId _showAtMsgId = ShowAtUnreadMsgId; diff --git a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp index fa34f92a8..8624f9aa1 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp @@ -368,15 +368,14 @@ void FieldHeader::resolveMessageData() { if (!id) { return; } - const auto channel = id.channel - ? _data->channel(id.channel).get() - : nullptr; - const auto callback = [=](ChannelData *channel, MsgId msgId) { + const auto peer = _data->peer(id.peer); + const auto itemId = id.msg; + const auto callback = crl::guard(this, [=] { const auto now = (isEditingMessage() ? _editMsgId : _replyToId).current(); if (now == id && !_shownMessage) { - if (const auto message = _data->message(channel, msgId)) { + if (const auto message = _data->message(peer, itemId)) { setShownMessage(message); } else if (isEditingMessage()) { _editCancelled.fire({}); @@ -384,11 +383,8 @@ void FieldHeader::resolveMessageData() { _replyCancelled.fire({}); } } - }; - _data->session().api().requestMessageData( - channel, - id.msg, - crl::guard(this, callback)); + }); + _data->session().api().requestMessageData(peer, itemId, callback); } void FieldHeader::previewRequested( @@ -1537,10 +1533,10 @@ void ComposeControls::applyDraft(FieldHistoryAction fieldHistoryAction) { _previewSetState(draft->previewState); if (draft == editDraft) { - _header->editMessage({ _history->channelId(), draft->msgId }); + _header->editMessage({ _history->peer->id, draft->msgId }); _header->replyToMessage({}); } else { - _header->replyToMessage({ _history->channelId(), draft->msgId }); + _header->replyToMessage({ _history->peer->id, draft->msgId }); _header->editMessage({}); } } diff --git a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp index 94656658d..c674eb413 100644 --- a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp +++ b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp @@ -986,7 +986,7 @@ void CopyPostLink( Assert(channel != nullptr); if (const auto rootId = item->replyToTop()) { const auto root = item->history()->owner().message( - peerToChannel(channel->id), + channel->id, rootId); const auto sender = root ? root->discussionPostOriginalSender() diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index bf73a6ea2..71a52f6b0 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -2318,7 +2318,9 @@ ClickHandlerPtr Message::rightActionLink() const { const auto owner = &data()->history()->owner(); const auto itemId = data()->fullId(); const auto forwarded = data()->Get(); - const auto savedFromPeer = forwarded ? forwarded->savedFromPeer : nullptr; + const auto savedFromPeer = forwarded + ? forwarded->savedFromPeer + : nullptr; const auto savedFromMsgId = forwarded ? forwarded->savedFromMsgId : 0; using Callback = FnMut)>; @@ -2328,7 +2330,7 @@ ClickHandlerPtr Message::rightActionLink() const { *showByThread = [=, requested = 0]( not_null controller) mutable { const auto original = savedFromPeer->owner().message( - savedFromPeer->asChannel(), + savedFromPeer, savedFromMsgId); if (original && original->replyToTop()) { controller->showRepliesForMessage( @@ -2337,14 +2339,12 @@ ClickHandlerPtr Message::rightActionLink() const { original->id, Window::SectionShow::Way::Forward); } else if (!requested) { - const auto channel = savedFromPeer->asChannel(); const auto prequested = &requested; requested = 1; - channel->session().api().requestMessageData( - channel, + savedFromPeer->session().api().requestMessageData( + savedFromPeer, savedFromMsgId, - [=, weak = base::make_weak(controller.get())]( - ChannelData *gotChannel, MsgId gotId) { + [=, weak = base::make_weak(controller.get())] { if (const auto strong = showByThreadWeak.lock()) { if (const auto strongController = weak.get()) { *prequested = 2; diff --git a/Telegram/SourceFiles/history/view/history_view_pinned_bar.cpp b/Telegram/SourceFiles/history/view/history_view_pinned_bar.cpp index 2c1d0ec2e..916555066 100644 --- a/Telegram/SourceFiles/history/view/history_view_pinned_bar.cpp +++ b/Telegram/SourceFiles/history/view/history_view_pinned_bar.cpp @@ -101,13 +101,9 @@ namespace { consumer.put_next(Ui::MessageBarContent{ .text = { tr::lng_contacts_loading(tr::now) }, }); - const auto channel = id.channel - ? session->data().channel(id.channel).get() - : nullptr; - const auto callback = [=](ChannelData *channel, MsgId id) { - consumer.put_done(); - }; - session->api().requestMessageData(channel, id.msg, callback); + const auto peer = session->data().peer(id.peer); + const auto callback = [=] { consumer.put_done(); }; + session->api().requestMessageData(peer, id.msg, callback); return rpl::lifetime(); }); return std::move( diff --git a/Telegram/SourceFiles/history/view/history_view_pinned_section.cpp b/Telegram/SourceFiles/history/view/history_view_pinned_section.cpp index 3115e0e1f..40893f1b4 100644 --- a/Telegram/SourceFiles/history/view/history_view_pinned_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_pinned_section.cpp @@ -64,9 +64,7 @@ PinnedMemento::PinnedMemento( : _history(history) , _highlightId(highlightId) { _list.setAroundPosition({ - .fullId = FullMsgId( - history->channelId(), - highlightId), + .fullId = FullMsgId(history->peer->id, highlightId), .date = TimeId(0), }); } @@ -332,7 +330,7 @@ not_null PinnedWidget::history() const { Dialogs::RowDescriptor PinnedWidget::activeChat() const { return { _history, - FullMsgId(_history->channelId(), ShowAtUnreadMsgId) + FullMsgId(_history->peer->id, ShowAtUnreadMsgId) }; } @@ -391,8 +389,8 @@ void PinnedWidget::restoreState(not_null memento) { if (const auto highlight = memento->getHighlightId()) { const auto position = Data::MessagePosition{ .fullId = ((highlight > 0 || !_migratedPeer) - ? FullMsgId(_history->channelId(), highlight) - : FullMsgId(0, -highlight)), + ? FullMsgId(_history->peer->id, highlight) + : FullMsgId(_migratedPeer->id, -highlight)), .date = TimeId(0), }; _inner->showAroundPosition(position, [=] { diff --git a/Telegram/SourceFiles/history/view/history_view_pinned_tracker.cpp b/Telegram/SourceFiles/history/view/history_view_pinned_tracker.cpp index ef26258d8..1f9cbe724 100644 --- a/Telegram/SourceFiles/history/view/history_view_pinned_tracker.cpp +++ b/Telegram/SourceFiles/history/view/history_view_pinned_tracker.cpp @@ -110,7 +110,7 @@ void PinnedTracker::refreshViewer() { void PinnedTracker::refreshCurrentFromSlice() { const auto proj1 = [](FullMsgId id) { - return id.channel ? id.msg : (id.msg - ServerMaxMsgId); + return peerIsChannel(id.peer) ? id.msg : (id.msg - ServerMaxMsgId); }; const auto proj2 = [](FullMsgId id) { return id.msg; diff --git a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp index 454403c41..249f03b20 100644 --- a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp @@ -90,11 +90,9 @@ rpl::producer RootViewContent( MsgId rootId) { return MessageBarContentByItemId( &history->session(), - FullMsgId{ history->channelId(), rootId } + FullMsgId(history->peer->id, rootId) ) | rpl::map([=](Ui::MessageBarContent &&content) { - const auto item = history->owner().message( - history->channelId(), - rootId); + const auto item = history->owner().message(history->peer, rootId); if (!item) { content.text = Ui::Text::Link(tr::lng_deleted_message(tr::now)); } @@ -115,7 +113,7 @@ RepliesMemento::RepliesMemento( if (commentId) { _list.setAroundPosition({ .fullId = FullMsgId( - commentsItem->history()->channelId(), + commentsItem->history()->peer->id, commentId), .date = TimeId(0), }); @@ -361,8 +359,7 @@ void RepliesWidget::sendReadTillRequest() { void RepliesWidget::setupRoot() { if (!_root) { - const auto channel = _history->peer->asChannel(); - const auto done = crl::guard(this, [=](ChannelData*, MsgId) { + const auto done = crl::guard(this, [=] { _root = lookupRoot(); if (_root) { _areComments = computeAreComments(); @@ -374,7 +371,10 @@ void RepliesWidget::setupRoot() { } updatePinnedVisibility(); }); - _history->session().api().requestMessageData(channel, _rootId, done); + _history->session().api().requestMessageData( + _history->peer, + _rootId, + done); } } @@ -413,7 +413,7 @@ void RepliesWidget::setupRootView() { } HistoryItem *RepliesWidget::lookupRoot() const { - return _history->owner().message(_history->channelId(), _rootId); + return _history->owner().message(_history->peer, _rootId); } bool RepliesWidget::computeAreComments() const { @@ -831,9 +831,7 @@ void RepliesWidget::restoreReplyReturns(const std::vector &list) { void RepliesWidget::computeCurrentReplyReturn() { _replyReturn = _replyReturns.empty() ? nullptr - : _history->owner().message( - _history->channelId(), - _replyReturns.back()); + : _history->owner().message(_history->peer, _replyReturns.back()); } void RepliesWidget::calculateNextReplyReturn() { @@ -1408,7 +1406,7 @@ not_null RepliesWidget::history() const { Dialogs::RowDescriptor RepliesWidget::activeChat() const { return { _history, - FullMsgId(_history->channelId(), ShowAtUnreadMsgId) + FullMsgId(_history->peer->id, ShowAtUnreadMsgId) }; } @@ -1478,10 +1476,7 @@ bool RepliesWidget::showMessage( if (peerId != _history->peer->id) { return false; } - const auto id = FullMsgId{ - _history->channelId(), - messageId - }; + const auto id = FullMsgId(_history->peer->id, messageId); const auto message = _history->owner().message(id); if (!message || message->replyToTop() != _rootId) { return false; @@ -1558,7 +1553,7 @@ void RepliesWidget::restoreState(not_null memento) { _inner->restoreState(memento->list()); if (const auto highlight = memento->getHighlightId()) { const auto position = Data::MessagePosition{ - .fullId = FullMsgId(_history->channelId(), highlight), + .fullId = FullMsgId(_history->peer->id, highlight), .date = TimeId(0), }; _inner->showAroundPosition(position, [=] { diff --git a/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp b/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp index f7907e391..7e9ca4800 100644 --- a/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp @@ -905,7 +905,7 @@ not_null ScheduledWidget::history() const { Dialogs::RowDescriptor ScheduledWidget::activeChat() const { return { _history, - FullMsgId(_history->channelId(), ShowAtUnreadMsgId) + FullMsgId(_history->peer->id, ShowAtUnreadMsgId) }; } diff --git a/Telegram/SourceFiles/history/view/media/history_view_media.cpp b/Telegram/SourceFiles/history/view/media/history_view_media.cpp index e97caa050..4a2e317c0 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_media.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_media.cpp @@ -59,7 +59,7 @@ QString TimestampLinkBase( FullMsgId context) { return QString( "media_timestamp?base=doc%1_%2_%3&t=" - ).arg(document->id).arg(context.channel.bare).arg(context.msg.bare); + ).arg(document->id).arg(context.peer.value).arg(context.msg.bare); } TimeId DurationForTimestampLinks(not_null webpage) { diff --git a/Telegram/SourceFiles/info/info_controller.cpp b/Telegram/SourceFiles/info/info_controller.cpp index e4a981775..d8c32ec9f 100644 --- a/Telegram/SourceFiles/info/info_controller.cpp +++ b/Telegram/SourceFiles/info/info_controller.cpp @@ -71,8 +71,8 @@ rpl::producer AbstractController::mediaSource( Expects(peer() != nullptr); const auto isScheduled = [&] { - const auto channelId = peerToChannel(peer()->id); - if (const auto item = session().data().message(channelId, aroundId)) { + const auto peerId = peer()->id; + if (const auto item = session().data().message(peerId, aroundId)) { return item->isScheduled(); } return false; diff --git a/Telegram/SourceFiles/info/media/info_media_list_widget.cpp b/Telegram/SourceFiles/info/media/info_media_list_widget.cpp index d47c4ea00..a6541aca4 100644 --- a/Telegram/SourceFiles/info/media/info_media_list_widget.cpp +++ b/Telegram/SourceFiles/info/media/info_media_list_widget.cpp @@ -61,7 +61,7 @@ constexpr auto kPreloadedScreensCountFull constexpr auto kMediaCountForSearch = 10; UniversalMsgId GetUniversalId(FullMsgId itemId) { - return (itemId.channel != 0) + return peerIsChannel(itemId.peer) ? UniversalMsgId(itemId.msg) : UniversalMsgId(itemId.msg - ServerMaxMsgId); } @@ -853,10 +853,11 @@ void ListWidget::itemRemoved(not_null item) { FullMsgId ListWidget::computeFullId( UniversalMsgId universalId) const { Expects(universalId != 0); + Expects(universalId > 0 || _migrated != nullptr); return (universalId > 0) - ? FullMsgId(peerToChannel(_peer->id), universalId) - : FullMsgId(NoChannel, ServerMaxMsgId + universalId); + ? FullMsgId(_peer->id, universalId) + : FullMsgId(_migrated->id, ServerMaxMsgId + universalId); } auto ListWidget::collectSelectedItems() const -> SelectedItems { @@ -964,9 +965,8 @@ bool ListWidget::isMyItem(not_null item) const { } bool ListWidget::isPossiblyMyId(FullMsgId fullId) const { - return fullId.channel - ? (_peer->isChannel() && peerToChannel(_peer->id) == fullId.channel) - : (!_peer->isChannel() || _migrated); + return (fullId.peer == _peer->id) + || (_migrated && fullId.peer == _migrated->id); } bool ListWidget::isItemLayout( diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 79e97caaa..5e4962458 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -1429,7 +1429,7 @@ void MainWidget::ui_showPeerHistory( if (const auto history = _history->history()) { _dialogs->scrollToEntry(Dialogs::RowDescriptor( history, - FullMsgId(history->channelId(), showAtMsgId))); + FullMsgId(history->peer->id, showAtMsgId))); } } _dialogs->update(); diff --git a/Telegram/SourceFiles/media/player/media_player_instance.cpp b/Telegram/SourceFiles/media/player/media_player_instance.cpp index 35f042f6d..bafd1c258 100644 --- a/Telegram/SourceFiles/media/player/media_player_instance.cpp +++ b/Telegram/SourceFiles/media/player/media_player_instance.cpp @@ -386,7 +386,7 @@ auto Instance::playlistKey(not_null data) const return {}; } - const auto universalId = (contextId.channel == history->channelId()) + const auto universalId = (contextId.peer == history->peer->id) ? contextId.msg : (contextId.msg - ServerMaxMsgId); return SliceKey( @@ -506,9 +506,9 @@ bool Instance::moveInPlaylist( } const auto universal = computeCurrentUniversalId(data); const auto byUniversal = [&](ShuffleData::UniversalMsgId id) { - return (id < 0) - ? jumpById({ ChannelId(), id + ServerMaxMsgId }) - : jumpById({ raw->history->channelId(), id }); + return (id < 0 && raw->migrated) + ? jumpById({ raw->migrated->peer->id, id + ServerMaxMsgId }) + : jumpById({ raw->history->peer->id, id }); }; if (universal && raw->indexInPlayedIds == raw->playedIds.size()) { raw->playedIds.push_back(universal); @@ -906,12 +906,12 @@ void Instance::validateShuffleData(not_null data) { raw->nextSliceLifetime.destroy(); const auto size = update.size(); - const auto channel = raw->history->channelId(); + const auto peer = raw->history->peer->id; raw->playlist.reserve(raw->playlist.size() + size); raw->nonPlayedIds.reserve(raw->nonPlayedIds.size() + size); for (auto i = size; i != 0;) { const auto fullId = update[--i]; - const auto universal = (fullId.channel == channel) + const auto universal = (fullId.peer == peer) ? fullId.msg : (fullId.msg - ServerMaxMsgId); if (raw->playlist.empty() || raw->playlist.back() > universal) { diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 8cc5cfa2b..8c1fb901d 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -4742,7 +4742,7 @@ void OverlayWidget::updateHeader() { _headerText = tr::lng_mediaview_single_photo(tr::now); } else if (_user) { _headerText = tr::lng_mediaview_profile_photo(tr::now); - } else if ((_history && _history->channelId() && !_history->isMegagroup()) + } else if ((_history && _history->peer->isBroadcast()) || (_peer && _peer->isChannel() && !_peer->isMegagroup())) { _headerText = tr::lng_mediaview_channel_photo(tr::now); } else if (_peer) { diff --git a/Telegram/SourceFiles/passport/passport_form_controller.cpp b/Telegram/SourceFiles/passport/passport_form_controller.cpp index 9df983fa9..c5d99e0a9 100644 --- a/Telegram/SourceFiles/passport/passport_form_controller.cpp +++ b/Telegram/SourceFiles/passport/passport_form_controller.cpp @@ -1592,7 +1592,7 @@ void FormController::uploadEncryptedFile( prepared->filemd5 = file.uploadData->md5checksum; file.uploadData->fullId = FullMsgId( - 0, + session().userPeerId(), session().data().nextLocalMessageId()); file.uploadData->status.set(LoadStatus::Status::InProgress, 0); session().uploader().upload( diff --git a/Telegram/SourceFiles/payments/payments_checkout_process.cpp b/Telegram/SourceFiles/payments/payments_checkout_process.cpp index 2e8dbc239..861bf2d5d 100644 --- a/Telegram/SourceFiles/payments/payments_checkout_process.cpp +++ b/Telegram/SourceFiles/payments/payments_checkout_process.cpp @@ -69,7 +69,7 @@ void CheckoutProcess::Start( return; } const auto id = (invoice && invoice->receiptMsgId) - ? FullMsgId(item->history()->channelId(), invoice->receiptMsgId) + ? FullMsgId(item->history()->peer->id, invoice->receiptMsgId) : item->fullId(); if (invoice) { mode = invoice->receiptMsgId ? Mode::Receipt : Mode::Payment; diff --git a/Telegram/SourceFiles/payments/payments_form.cpp b/Telegram/SourceFiles/payments/payments_form.cpp index b13417fc9..d3669f296 100644 --- a/Telegram/SourceFiles/payments/payments_form.cpp +++ b/Telegram/SourceFiles/payments/payments_form.cpp @@ -147,7 +147,7 @@ Form::Form(not_null peer, MsgId itemId, bool receipt) Form::~Form() = default; void Form::fillInvoiceFromMessage() { - const auto id = FullMsgId(peerToChannel(_peer->id), _msgId); + const auto id = FullMsgId(_peer->id, _msgId); if (const auto item = _session->data().message(id)) { const auto media = [&] { if (const auto payment = item->Get()) { @@ -194,9 +194,7 @@ void Form::loadThumbnail(not_null photo) { _invoice.cover.thumbnail = prepareEmptyThumbnail(); } _thumbnailLoadProcess->view = std::move(view); - photo->load( - Data::PhotoSize::Thumbnail, - FullMsgId(peerToChannel(_peer->id), _msgId)); + photo->load(Data::PhotoSize::Thumbnail, FullMsgId(_peer->id, _msgId)); _session->downloaderTaskFinished( ) | rpl::start_with_next([=] { const auto &view = _thumbnailLoadProcess->view; diff --git a/Telegram/SourceFiles/window/notifications_manager.cpp b/Telegram/SourceFiles/window/notifications_manager.cpp index fcb8876ab..0639c8d60 100644 --- a/Telegram/SourceFiles/window/notifications_manager.cpp +++ b/Telegram/SourceFiles/window/notifications_manager.cpp @@ -296,9 +296,7 @@ void System::checkDelayed() { } } if (loaded) { - const auto fullId = FullMsgId( - history->channelId(), - i->second.msg); + const auto fullId = FullMsgId(history->peer->id, i->second.msg); if (const auto item = peer->owner().message(fullId)) { if (!item->notificationReady()) { loaded = false; @@ -677,9 +675,7 @@ void Manager::openNotificationMessage( if (history->peer->isUser() || history->peer->isChannel()) { return false; } - const auto item = history->owner().message( - history->channelId(), - messageId); + const auto item = history->owner().message(history->peer, messageId); if (!item || !item->isRegular() || !item->mentionsMe()) { return false; } @@ -714,9 +710,7 @@ void Manager::notificationReplied( message.action.clearDraft = false; history->session().api().sendMessage(std::move(message)); - const auto item = history->owner().message( - history->channelId(), - id.msgId); + const auto item = history->owner().message(history->peer, id.msgId); if (item && item->isUnreadMention() && !item->isUnreadMedia()) { history->session().api().markMediaRead(item); } diff --git a/Telegram/SourceFiles/window/themes/window_theme.cpp b/Telegram/SourceFiles/window/themes/window_theme.cpp index 24f9aca68..ca75be161 100644 --- a/Telegram/SourceFiles/window/themes/window_theme.cpp +++ b/Telegram/SourceFiles/window/themes/window_theme.cpp @@ -602,7 +602,9 @@ void ChatBackground::checkUploadWallPaper() { const auto ready = PrepareWallPaper(_session->mainDcId(), _original); const auto documentId = ready.id; - _wallPaperUploadId = FullMsgId(0, _session->data().nextLocalMessageId()); + _wallPaperUploadId = FullMsgId( + _session->userPeerId(), + _session->data().nextLocalMessageId()); _session->uploader().uploadMedia(_wallPaperUploadId, ready); if (_wallPaperUploadLifetime) { return; diff --git a/Telegram/SourceFiles/window/themes/window_theme_editor_box.cpp b/Telegram/SourceFiles/window/themes/window_theme_editor_box.cpp index c6a7b88bf..d50173f00 100644 --- a/Telegram/SourceFiles/window/themes/window_theme_editor_box.cpp +++ b/Telegram/SourceFiles/window/themes/window_theme_editor_box.cpp @@ -479,7 +479,7 @@ Fn SavePreparedTheme( const auto api = &session->api(); const auto state = std::make_shared(); state->id = FullMsgId( - 0, + session->userPeerId(), session->data().nextLocalMessageId()); const auto creating = !fields.id diff --git a/Telegram/SourceFiles/window/window_peer_menu.cpp b/Telegram/SourceFiles/window/window_peer_menu.cpp index 13fa45686..559af5834 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.cpp +++ b/Telegram/SourceFiles/window/window_peer_menu.cpp @@ -1153,8 +1153,8 @@ void HidePinnedBar( const auto migrated = peer->migrateFrom(); const auto top = Data::ResolveTopPinnedId(peer, migrated); const auto universal = !top - ? int32(0) - : (migrated && !top.channel) + ? MsgId(0) + : (migrated && !peerIsChannel(top.peer)) ? (top.msg - ServerMaxMsgId) : top.msg; if (universal) { diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index cf84f7124..9be829b3a 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -376,8 +376,8 @@ void SessionNavigation::showRepliesForMessage( } _session->api().request(base::take(_showingRepliesRequestId)).cancel(); - const auto channelId = history->channelId(); - //const auto item = _session->data().message(channelId, rootId); + const auto postPeer = history->peer; + //const auto item = _session->data().message(postPeer, rootId); //if (!commentId && (!item || !item->repliesAreComments())) { // showSection(std::make_shared(history, rootId)); // return; @@ -411,9 +411,7 @@ void SessionNavigation::showRepliesForMessage( if (!peer || !id) { return; } - auto item = _session->data().message( - peerToChannel(peer), - id); + auto item = _session->data().message(peer, id); if (const auto group = _session->data().groups().find(item)) { item = group->items.front(); } @@ -426,8 +424,8 @@ void SessionNavigation::showRepliesForMessage( data.vunread_count().v); item->setRepliesOutboxReadTill( data.vread_outbox_max_id().value_or_empty()); - const auto post = _session->data().message(channelId, rootId); - if (post && item->history()->channelId() != channelId) { + const auto post = _session->data().message(postPeer, rootId); + if (post && item->history()->peer != postPeer) { post->setCommentsItemId(item->fullId()); if (const auto maxId = data.vmax_id()) { post->setRepliesMaxId(maxId->v); From a34b2a5472c0e48b9a136b4a08593c836822f86c Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 10 Dec 2021 19:49:51 +0400 Subject: [PATCH 015/173] Fix build with DESKTOP_APP_USE_PACKAGED_RLOTTIE. --- Telegram/lib_lottie | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Telegram/lib_lottie b/Telegram/lib_lottie index ad7fce76f..e1b707d12 160000 --- a/Telegram/lib_lottie +++ b/Telegram/lib_lottie @@ -1 +1 @@ -Subproject commit ad7fce76f3b403471a296c928bae67cd36b8b2cf +Subproject commit e1b707d128df046894753b99da44ac462ad52b96 From 651cfe5b7ed2ff6aa1375e20d1cc2d0596b49529 Mon Sep 17 00:00:00 2001 From: John Preston Date: Sat, 18 Dec 2021 14:10:30 +0000 Subject: [PATCH 016/173] Fix about box text labels layout. --- Telegram/SourceFiles/boxes/about_box.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Telegram/SourceFiles/boxes/about_box.cpp b/Telegram/SourceFiles/boxes/about_box.cpp index db7f745d9..7e97faa85 100644 --- a/Telegram/SourceFiles/boxes/about_box.cpp +++ b/Telegram/SourceFiles/boxes/about_box.cpp @@ -80,9 +80,15 @@ void AboutBox::prepare() { void AboutBox::resizeEvent(QResizeEvent *e) { BoxContent::resizeEvent(e); + const auto available = width() + - st::boxPadding.left() + - st::boxPadding.right(); _version->moveToLeft(st::boxPadding.left(), st::aboutVersionTop); + _text1->resizeToWidth(available); _text1->moveToLeft(st::boxPadding.left(), st::aboutTextTop); + _text2->resizeToWidth(available); _text2->moveToLeft(st::boxPadding.left(), _text1->y() + _text1->height() + st::aboutSkip); + _text3->resizeToWidth(available); _text3->moveToLeft(st::boxPadding.left(), _text2->y() + _text2->height() + st::aboutSkip); } From aee11469c41cd24cf258b5cdc54ca4b97a154365 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 21 Dec 2021 10:07:31 +0000 Subject: [PATCH 017/173] Fix crash in video capture on macOS. Fixes #17420. --- Telegram/ThirdParty/tgcalls | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Telegram/ThirdParty/tgcalls b/Telegram/ThirdParty/tgcalls index 6dbefa5bf..c2c83dc44 160000 --- a/Telegram/ThirdParty/tgcalls +++ b/Telegram/ThirdParty/tgcalls @@ -1 +1 @@ -Subproject commit 6dbefa5bfc0fdf07eb42af103d8af0f481511c2a +Subproject commit c2c83dc44ecbfa892d267cde5906a219df9199d2 From 999e4264c59599387012a3c9bf4bd78c9f659e63 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 21 Dec 2021 15:46:27 +0000 Subject: [PATCH 018/173] Move macOS and Linux builds to Qt 6.2.2. --- Telegram/build/prepare/prepare.py | 18 +++++++++--------- snap/snapcraft.yaml | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Telegram/build/prepare/prepare.py b/Telegram/build/prepare/prepare.py index 991444d1b..c37f50152 100644 --- a/Telegram/build/prepare/prepare.py +++ b/Telegram/build/prepare/prepare.py @@ -401,7 +401,7 @@ if customRunCommand: stage('patches', """ git clone https://github.com/desktop-app/patches.git cd patches - git checkout 4c21dfa0db + git checkout 5368789dc7 """) stage('depot_tools', """ @@ -1124,28 +1124,28 @@ mac: """) if buildQt6: - stage('qt_6_2_0', """ + stage('qt_6_2_2', """ mac: - git clone -b v6.2.0 git://code.qt.io/qt/qt5.git qt_6_2_0 - cd qt_6_2_0 + git clone -b v6.2.2 git://code.qt.io/qt/qt5.git qt_6_2_2 + cd qt_6_2_2 perl init-repository --module-subset=qtbase,qtimageformats,qtsvg,qt5compat -depends:patches/qtbase_6_2_0/*.patch +depends:patches/qtbase_6_2_2/*.patch cd qtbase - find ../../patches/qtbase_6_2_0 -type f -print0 | sort -z | xargs -0 git apply + find ../../patches/qtbase_6_2_2 -type f -print0 | sort -z | xargs -0 git apply cd .. -depends:patches/qt5compat_6_2_0/*.patch +depends:patches/qt5compat_6_2_2/*.patch cd qt5compat - find ../../patches/qt5compat_6_2_0 -type f -print0 | sort -z | xargs -0 git apply + find ../../patches/qt5compat_6_2_2 -type f -print0 | sort -z | xargs -0 git apply cd .. CONFIGURATIONS=-debug release: CONFIGURATIONS=-debug-and-release mac: - ./configure -prefix "$USED_PREFIX/Qt-6.2.0" \ + ./configure -prefix "$USED_PREFIX/Qt-6.2.2" \ $CONFIGURATIONS \ -force-debug-info \ -opensource \ diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index babaa3b36..e1c64b7a7 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -377,9 +377,9 @@ parts: - libxkbcommon-x11-0 - zlib1g override-pull: | - QT=6_2_0 + QT=6_2_2 - git clone -b v6.2.0 --depth=1 git://code.qt.io/qt/qt5.git . + git clone -b v6.2.2 --depth=1 git://code.qt.io/qt/qt5.git . perl init-repository --module-subset=qtbase,qtwayland,qtimageformats,qtsvg,qt5compat cd qtbase From b341dddbb97a4e0b9c021e603a7a40ffe7054fb4 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 21 Dec 2021 15:46:27 +0000 Subject: [PATCH 019/173] Move macOS and Linux builds to Qt 6.2.2. --- Telegram/ThirdParty/tgcalls | 2 +- Telegram/build/docker/centos_env/Dockerfile | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Telegram/ThirdParty/tgcalls b/Telegram/ThirdParty/tgcalls index c2c83dc44..6dbefa5bf 160000 --- a/Telegram/ThirdParty/tgcalls +++ b/Telegram/ThirdParty/tgcalls @@ -1 +1 @@ -Subproject commit c2c83dc44ecbfa892d267cde5906a219df9199d2 +Subproject commit 6dbefa5bfc0fdf07eb42af103d8af0f481511c2a diff --git a/Telegram/build/docker/centos_env/Dockerfile b/Telegram/build/docker/centos_env/Dockerfile index 9265f6f0d..f28cd1313 100644 --- a/Telegram/build/docker/centos_env/Dockerfile +++ b/Telegram/build/docker/centos_env/Dockerfile @@ -9,9 +9,9 @@ ENV QT5_VER 5_15_2 ENV QT5_TAG v5.15.2 ENV QT5_PREFIX /usr/local/desktop-app/Qt-5.15.2 ENV Qt5_DIR ${QT5_PREFIX} -ENV QT6_VER 6_2_0 -ENV QT6_TAG v6.2.0 -ENV QT6_PREFIX /usr/local/desktop-app/Qt-6.2.0 +ENV QT6_VER 6_2_2 +ENV QT6_TAG v6.2.2 +ENV QT6_PREFIX /usr/local/desktop-app/Qt-6.2.2 ENV Qt6_DIR ${QT6_PREFIX} ENV OPENSSL_VER 1_1_1 ENV OPENSSL_PREFIX /usr/local/desktop-app/openssl-1.1.1 @@ -46,7 +46,7 @@ RUN ln -s /opt/cmake/bin/cmake /usr/local/bin/cmake RUN rm $CMAKE_FILE FROM builder AS patches -RUN git clone $GIT/desktop-app/patches.git && cd patches && git checkout b6c29e99da +RUN git clone $GIT/desktop-app/patches.git && cd patches && git checkout 5368789dc7 FROM builder AS extra-cmake-modules From c2b2d0a92ab1ae39428891886488848a32ef0bcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20Gro=C3=9F?= Date: Wed, 8 Dec 2021 00:40:44 +0100 Subject: [PATCH 020/173] Do not destroy drag after launchDrag() On X11 we need to keep the QDrag around a little longer. Right now, drag is scoped local to launchDrag() and will be destroyed immediately when launchDrag() finishes. However for X11 we must keep the drag object alive a little longer. It may only be destroyed once the drag operation has been accepted by another window, otherwise drag and drop is broken on Linux and no action happens when something is dragged from Telegram into another window. This is because there is still communication happening in the XDND protocol once QDrag::exec() finishes. See the documentation for reference: https://freedesktop.org/wiki/Specifications/XDND/ Fixes #17291 --- Telegram/SourceFiles/window/main_window.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Telegram/SourceFiles/window/main_window.cpp b/Telegram/SourceFiles/window/main_window.cpp index ec152fc16..73c49355b 100644 --- a/Telegram/SourceFiles/window/main_window.cpp +++ b/Telegram/SourceFiles/window/main_window.cpp @@ -964,7 +964,9 @@ int MainWindow::tryToExtendWidthBy(int addToWidth) { void MainWindow::launchDrag( std::unique_ptr data, Fn &&callback) { - auto drag = std::make_unique(this); + // Qt destroys this QDrag automatically after the drag is finished + // We must not delete this at the end of this function, as this breaks DnD on Linux + auto drag = new QDrag(this); drag->setMimeData(data.release()); drag->exec(Qt::CopyAction); From d89597bf64859eaf1bdad57a86c40b810a4923c1 Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Fri, 10 Dec 2021 16:14:55 +0400 Subject: [PATCH 021/173] Activate crl dispatch backend on Linux Linux is the only platform where slow QThreadPool is used, let's use dispatch here as well --- .gitmodules | 3 +++ Telegram/ThirdParty/dispatch | 1 + Telegram/build/docker/centos_env/Dockerfile | 3 +++ Telegram/lib_crl | 2 +- 4 files changed, 8 insertions(+), 1 deletion(-) create mode 160000 Telegram/ThirdParty/dispatch diff --git a/.gitmodules b/.gitmodules index 20bf11a83..26294499d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -97,3 +97,6 @@ [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 diff --git a/Telegram/ThirdParty/dispatch b/Telegram/ThirdParty/dispatch new file mode 160000 index 000000000..851fbd3cb --- /dev/null +++ b/Telegram/ThirdParty/dispatch @@ -0,0 +1 @@ +Subproject commit 851fbd3cb89385ba733bc37d6149280996715898 diff --git a/Telegram/build/docker/centos_env/Dockerfile b/Telegram/build/docker/centos_env/Dockerfile index f28cd1313..7bbc6164b 100644 --- a/Telegram/build/docker/centos_env/Dockerfile +++ b/Telegram/build/docker/centos_env/Dockerfile @@ -32,6 +32,9 @@ RUN yum -y install git meson ninja-build autoconf automake libtool patch \ devtoolset-10-binutils llvm-toolset-7.0 llvm-toolset-7.0-clang-devel \ llvm-toolset-7.0-llvm-devel && yum clean all +# Fix a bug with argument naming in CentOS 7 glibc +RUN sed -i 's/char \*__block/char */' /usr/include/unistd.h + SHELL [ "bash", "-c", ". /opt/rh/devtoolset-10/enable; exec bash -c \"$@\"", "-s"] ENV LibrariesPath /usr/src/Libraries diff --git a/Telegram/lib_crl b/Telegram/lib_crl index ec103d6bc..3fde21b40 160000 --- a/Telegram/lib_crl +++ b/Telegram/lib_crl @@ -1 +1 @@ -Subproject commit ec103d6bccaa59b56537c8658c9e41415bb9ccaf +Subproject commit 3fde21b40897faf84764597fe1b335ff4c2962ac From dc7aef3f86163fe3cf91bb5e63e56ee0d5666db9 Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Sat, 11 Dec 2021 21:06:45 +0400 Subject: [PATCH 022/173] Move HFLAGS to other variables in Dockerfile --- Telegram/build/docker/centos_env/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Telegram/build/docker/centos_env/Dockerfile b/Telegram/build/docker/centos_env/Dockerfile index 7bbc6164b..76a163b26 100644 --- a/Telegram/build/docker/centos_env/Dockerfile +++ b/Telegram/build/docker/centos_env/Dockerfile @@ -19,6 +19,8 @@ ENV OPENSSL_ROOT_DIR ${OPENSSL_PREFIX} ENV CMAKE_VER 3.21.3 ENV CMAKE_FILE cmake-$CMAKE_VER-Linux-x86_64.sh ENV PATH ${PATH}:${QT5_PREFIX}/bin:${QT6_PREFIX}/bin +ENV HFLAGS_DEBUG "-fstack-protector-all -fstack-clash-protection -fPIC" +ENV HFLAGS "$HFLAGS_DEBUG -D_FORTIFY_SOURCE=2" RUN yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm && yum clean all RUN yum -y install https://packages.endpoint.com/rhel/7/os/x86_64/endpoint-repo-1.7-1.x86_64.rpm && yum clean all @@ -38,8 +40,6 @@ RUN sed -i 's/char \*__block/char */' /usr/include/unistd.h SHELL [ "bash", "-c", ". /opt/rh/devtoolset-10/enable; exec bash -c \"$@\"", "-s"] ENV LibrariesPath /usr/src/Libraries -ENV HFLAGS_DEBUG "-fstack-protector-all -fstack-clash-protection -fPIC" -ENV HFLAGS "$HFLAGS_DEBUG -D_FORTIFY_SOURCE=2" WORKDIR $LibrariesPath RUN mkdir /opt/cmake From 73917e8a4b17513e5c63e3944d59b01c945a7b44 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 22 Dec 2021 10:17:50 +0000 Subject: [PATCH 023/173] Re-apply crash fix on macOS video capture. --- Telegram/ThirdParty/tgcalls | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Telegram/ThirdParty/tgcalls b/Telegram/ThirdParty/tgcalls index 6dbefa5bf..c2c83dc44 160000 --- a/Telegram/ThirdParty/tgcalls +++ b/Telegram/ThirdParty/tgcalls @@ -1 +1 @@ -Subproject commit 6dbefa5bfc0fdf07eb42af103d8af0f481511c2a +Subproject commit c2c83dc44ecbfa892d267cde5906a219df9199d2 From 7ad08b3ef8e3b5020c666c52b1b15d6ae17fe94b Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 22 Dec 2021 10:23:54 +0000 Subject: [PATCH 024/173] Update submodules. --- Telegram/lib_base | 2 +- Telegram/lib_ui | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Telegram/lib_base b/Telegram/lib_base index 3b0decd74..9b62a55c5 160000 --- a/Telegram/lib_base +++ b/Telegram/lib_base @@ -1 +1 @@ -Subproject commit 3b0decd74b8aa63756e1e51b1d9ad32e8737e3f2 +Subproject commit 9b62a55c59162b1c0c906c3311a49ea88abec73b diff --git a/Telegram/lib_ui b/Telegram/lib_ui index e3c4d4991..eaea768ca 160000 --- a/Telegram/lib_ui +++ b/Telegram/lib_ui @@ -1 +1 @@ -Subproject commit e3c4d49912277379ed9ba6f300a5155b39337cb1 +Subproject commit eaea768ca03cc3c12e880c3f3f3aa15736925d56 From dd92f7fb9d00808e5c558f832d0dc2b308ee9312 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 9 Dec 2021 08:24:47 +0300 Subject: [PATCH 025/173] Slightly refactored AddContactBox. --- .../SourceFiles/boxes/add_contact_box.cpp | 52 ++++++++++--------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/Telegram/SourceFiles/boxes/add_contact_box.cpp b/Telegram/SourceFiles/boxes/add_contact_box.cpp index 43fa0abb4..da5444c8c 100644 --- a/Telegram/SourceFiles/boxes/add_contact_box.cpp +++ b/Telegram/SourceFiles/boxes/add_contact_box.cpp @@ -418,32 +418,34 @@ void AddContactBox::save() { MTP_string(lastName))) )).done(crl::guard(this, [=]( const MTPcontacts_ImportedContacts &result) { - result.match([&](const MTPDcontacts_importedContacts &data) { - _session->data().processUsers(data.vusers()); - - const auto extractUser = [&](const MTPImportedContact &data) { - return data.match([&](const MTPDimportedContact &data) { - return (data.vclient_id().v == _contactId) - ? _session->data().userLoaded(data.vuser_id()) - : nullptr; - }); - }; - const auto &list = data.vimported().v; - const auto user = list.isEmpty() - ? nullptr - : extractUser(list.front()); - if (user) { - if (user->isContact() || user->session().supportMode()) { - Ui::showPeerHistory(user, ShowAtTheEndMsgId); - } - Ui::hideLayer(); - } else if (isBoxShown()) { - hideChildren(); - _retrying = true; - updateButtons(); - update(); - } + const auto &data = result.match([]( + const auto &data) -> const MTPDcontacts_importedContacts& { + return data; }); + _session->data().processUsers(data.vusers()); + + const auto extractUser = [&](const MTPImportedContact &data) { + return data.match([&](const MTPDimportedContact &data) { + return (data.vclient_id().v == _contactId) + ? _session->data().userLoaded(data.vuser_id()) + : nullptr; + }); + }; + const auto &list = data.vimported().v; + const auto user = list.isEmpty() + ? nullptr + : extractUser(list.front()); + if (user) { + if (user->isContact() || user->session().supportMode()) { + Ui::showPeerHistory(user, ShowAtTheEndMsgId); + } + Ui::hideLayer(); + } else if (isBoxShown()) { + hideChildren(); + _retrying = true; + updateButtons(); + update(); + } })).send(); } From 2a0babe5ab3c6dfd6d73bed682c179309e0bfe3a Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 15 Dec 2021 19:38:33 +0400 Subject: [PATCH 026/173] Fix file upload cancelling. Fixes #17408. --- Telegram/SourceFiles/data/data_document.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Telegram/SourceFiles/data/data_document.cpp b/Telegram/SourceFiles/data/data_document.cpp index 34d3a7304..5f9482466 100644 --- a/Telegram/SourceFiles/data/data_document.cpp +++ b/Telegram/SourceFiles/data/data_document.cpp @@ -1221,7 +1221,10 @@ bool DocumentData::hasWebLocation() const { } bool DocumentData::isNull() const { - return !hasRemoteLocation() && !hasWebLocation() && _url.isEmpty(); + return !hasRemoteLocation() + && !hasWebLocation() + && _url.isEmpty() + && !uploading(); } MTPInputDocument DocumentData::mtpInput() const { From a0dcade9d8502bc81fcd7ffd8cafac4134f4bee7 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 22 Dec 2021 10:42:32 +0000 Subject: [PATCH 027/173] Remove redundant freedesktop.org.xml. --- .../Resources/qrc/qmime/freedesktop.org.xml | 34056 ---------------- Telegram/Resources/qrc/telegram/telegram.qrc | 3 - 2 files changed, 34059 deletions(-) delete mode 100644 Telegram/Resources/qrc/qmime/freedesktop.org.xml diff --git a/Telegram/Resources/qrc/qmime/freedesktop.org.xml b/Telegram/Resources/qrc/qmime/freedesktop.org.xml deleted file mode 100644 index 1f4742875..000000000 --- a/Telegram/Resources/qrc/qmime/freedesktop.org.xml +++ /dev/null @@ -1,34056 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -]> - - - ATK inset - شكل ATK - Ustaŭka ATK - Сбор — ATK - inset ATK - Vložka ATK - ATK-indsættelse - ATK-Inset - ATK inset - inserción ATK - ATK sartzapena - ATK-osio - ATK innskot - encart ATK - intlis ATK - conxunto ATK - תוספת ATK - ATK betét - Inset ATK - Inset ATK - ATK インセット - ATK беті - ATK inset - ATK inset - ATK ielaidums - ATK-innsats - ATK-invoegsel - ATK-innskot - Wstawka ATK - Conjunto de entrada do ATK - Inset ATK - вкладка ATK - Vložka ATK - Vložka ATK - Inset ATK - ATK-inlägg - вкладка ATK - Bộ dát ATK - ATK 嵌入对象 - ATK - Andrew Toolkit - - - - - electronic book document - مستند كتاب إلكتروني - elektronnaja kniha - Документ — електронна книга - document de llibre electrònic - Dokument elektronické knihy - elektronisk bogdokument - Elektronisches Buch - έγγραφο ηλεκτρονικού βιβλίου - electronic book document - documento de libro electrónico - liburu elektronikoaren dokumentua - elektroninen kirja - elektroniskbóka skjal - document livre électronique - leabhar leictreonach - documento de libro electrónico - מסמך מסוג ספר אלקטרוני - dokument elektroničke knjige - elektronikus könyvdokumentum - dokumen buku elektronik - Documento libro elettronico - 電子ブックドキュメント - электронды кітабы - 전자책 문서 - elektroninės knygos dokumentas - elektroniskās grāmatas dokuments - elektronisch boek - elektronisk bok-dokument - Dokument książki elektronicznej - Documento de livro eletrônico - document carte electronică - электронная книга - Dokument elektronickej knihy - dokument elektronske knjige - Dokument libri elektronik - elektroniskt bokdokument - elektronik kitap belgesi - документ електронної книги - tài liệu cuốn sách điện tử - 电子书文档 - 電子書文件 - - - - - - - - - - - - - - Adobe Illustrator document - مستند أدوبي المصور - Dakument Adobe Illustrator - Документ — Adobe Illustrator - document d'Adobe Illustrator - Dokument Adobe Illustrator - Adobe Illustrator-dokument - Adobe-Illustrator-Dokument - έγγραφο Adobe Illustrator - Adobe Illustrator document - dokumento de Adobe Illustrator - documento de Adobe Illustrator - Adobe Illustrator dokumentua - Adobe Illustrator -asiakirja - Adobe Illustrator skjal - document Adobe Illustrator - cáipéis Adobe Illustrator - documento de Adobe Ilustrator - מסמך Adobe Ill - Adobe Illustrator dokument - Adobe Illustrator-dokumentum - Dokumen Adobe Illustrator - Documento Adobe Illustrator - Adobe Illustrator ドキュメント - Adobe Illustrator-ის დოკუმენტი - Adobe Illustrator құжаты - 어도비 일러스트레이터 문서 - Adobe Illustrator dokumentas - Adobe Illustrator dokuments - Dokumen Adobe Illustrator - Adobe Illustrator-dokument - Adobe Illustrator-document - Adobe Illustrator-dokument - Dokument Adobe Illustrator - documento Adobe Illustrator - Documento do Adobe Illustrator - Document Adobe Illustrator - документ Adobe Illustrator - Dokument Adobe Illustrator - Dokument Adobe Illustrator - Dokument Adobe Illustrator - Адоуби Илустратор документ - Adobe Illustrator-dokument - документ Adobe Illustrator - Tài liệu Adobe Illustrator - Adobe Illustrator 文档 - Adobe Illustrator 文件 - - - - - Macintosh BinHex-encoded file - ملف Macintosh BinHex مشفر - Macintosh BinHex-kodlanmış fayl - Fajł Macintosh, BinHex-zakadavany - Файл — кодиран във формат BinHex за Macintosh - fitxer codificat BinHex de Macintosh - Soubor kódovaný pomocí Macintosh BinHex - Ffeil BinHex-amgodwyd Macintosh - Macintosh BinHex-kodet fil - Macintosh-Datei (BinHex-kodiert) - αρχείο Macintosh κωδικοποίησης BinHex - Macintosh BinHex-encoded file - dosiero kodigita laŭ Macintosh BinHex - archivo Macintosh codificado con BinHex - Macintosh BinHex-ekin kodetutako fitxategia - Macintosh BinHex -koodattu tiedosto - Macintosh BinHex-bronglað fíla - fichier codé Macintosh BinHex - comhad ionchódaithe le Macintosh BinHex - ficheiro de Macintosh codificado con BinHex - קובץ מסוג Macintosh BinHex-encoded - Macintosh BinHex-kodirana datoteka - Macintosh BinHex kódolású fájl - Berkas tersandi Macintosh BinHex - File Macintosh codificato BinHex - Macintosh BinHex エンコードファイル - Macintosh BinHex кодталған файлы - 매킨토시 BinHex 인코딩된 압축 파일 - Macintosh BinHex-encoded failas - Macintosh BinHex-kodēts datne - Fail terenkod-BinHex Macintosh - Macintosh BinHe-kodet arkiv - Macintosh BinHex-gecodeerd bestand - Macintosh BinHex-koda fil - Zakodowany w BinHex plik Macintosh - ficheiro codificado em BinHex de Macintosh - Arquivo do Macintosh codificado com BinHex - Fișier codat Macintosh BinHex - файл (закодированный Macintosh BinHex) - Súbor kódovaný pomocou Macintosh BinHex - Kodirana datoteka Macintosh (BinHex) - File Macintosh i kodifikuar BinHex - Мекинтош BinHex-encoded датотека - Macintosh BinHex-kodad fil - файл закодований Macintosh BinHex - Tập tin đã mã hoá BinHex của Macintosh - Macintosh BinHex 编码的文件 - Macintosh BinHex 編碼檔 - - - - - - - Mathematica Notebook - مذكرة رياضيات - Natatnik Mathematica - Тетрадка — Mathematica - llibreta de notes de Mathematica - Sešit Mathematica - Mathematica Notebook - Mathematica-Dokument - σημειωματάριο Mathematica - Mathematica Notebook - notebook de Mathematica - Mathematica Notebook - Mathematica-muistilehtiö - Mathematica skriviblokkur - carnet de notes Mathematica - leabhar nótaí Mathematica - notebook de Mathematica - מחברת מתמטיקה - Mathematica notesz - Mathematica Notebook - Notebook Mathematica - Mathematica ノートブック - Mathematica Notebook - Mathematica 노트북 - Mathematica užrašinė - Mathematica bloknots - Mathematica notisblokk - Mathematica-notitieboek - Mathematica-notatbok - Notatnik Mathematica - Caderno do Mathematica - Carnețel Mathematica - Mathematica Notebook - Zošit Mathematica - Datoteka dokumenta Mathematica - Notebook matematike - Mathematica Notebook-dokument - математичний записник - Cuốn vở Mathematica - Mathematica 记事 - Mathematica Notebook - - - - - - - - - - - - MathML document - مستند MathML - MathML sənədi - Dakument MathML - Документ — MathML - document de MathML - Dokument MathML - Dogfen MathML - MathML-dokument - MathML-Dokument - έγγραφο MathML - MathML document - MathML-dokumento - documento MathML - MathML dokumentua - MathML-asiakirja - MathML skjal - document MathML - cáipéis MathML - documento de MathML - מסמך MathML - MathML dokument - MathML-dokumentum - Dokumen MathML - Documento MathML - MathML ドキュメント - MathML-ის დოკუმენტი - MathML құжаты - MathML 문서 - MathML dokumentas - MathML dokuments - Dokumen MathML - MathML-dokument - MathML-document - MathML-dokument - Dokument MathML - documento MathML - Documento do MathML - Document MathML - документ MathML - Dokument MathML - Dokument MathML - Dokument MathML - MathML документ - MathML-dokument - MathML belgesi - документ MathML - Tài liệu MathML - MathML 文档 - MathML 文件 - MathML - Mathematical Markup Language - - - - - - - mailbox file - ملف صندوق البريد - fajł paštovaj skryni - Файл — Mailbox - fitxer mailbox - Soubor mailbox - postkassefil - Mailbox-Datei - αρχείο mailbox - mailbox file - archivo de buzón de correo - mailbox fitxategia - mailbox-tiedosto - postkassafíla - fichier boîte aux lettres - comhad bhosca poist - ficheiro de caixa de correo - קובץ תיבת-דואר - datoteka poštanskog sandučića - mailbox fájl - berkas kotak surat - File mailbox - メールボックスファイル - пошта жәшігінің файлы - 메일함 파일 - pašto dėžutės failas - pastkastītes datne - postboksfil - mailbox-bestand - mailbox-fil - Plik poczty (Mailbox) - Arquivo de caixa de correio - fișier căsuță poștală - файл почтового ящика - Súbor mailbox - datoteka poštnega predala - File mailbox - brevlådefil - файл поштової скриньки - tập tin hộp thư - mailbox 文件 - 郵箱檔 - - - - - - - - - Metalink file - ملف ميتالنك - Изтегляне — Metalink - fitxer Metalink - Soubor metalink - Metahenvisningsfil - Metalink-Datei - αρχείο Metalink - Metalink file - Metalink-dosiero - archivo de metaenlace - Metaestekaren fitxategia - Metalink-tiedosto - Metalink fíla - fichier metalink - comhad Metalink - ficheiro Metalink - קובץ Metalink - Metalink fájl - Berkas Metalink - File Metalink - Metalink ファイル - Metalink файлы - Metalink 파일 - Metalink failas - Metalink datne - Metalink bestand - Plik Metalink - Arquivo Metalink - Fișier Metalink - файл Metalink - Súbor Metalink - Datoteka povezave Metalink - Metalink-fil - Metalink dosyası - файл метапосилання - 元链接文件 - Metalink 檔案 - - - - - - - - - Metalink file - ملف ميتالنك - Изтегляне — Metalink - fitxer Metalink - Soubor metalink - Metahenvisningsfil - Metalink-Datei - αρχείο Metalink - Metalink file - Metalink-dosiero - archivo de metaenlace - Metaestekaren fitxategia - Metalink-tiedosto - Metalink fíla - fichier metalink - comhad Metalink - ficheiro Metalink - קובץ Metalink - Metalink fájl - Berkas Metalink - File Metalink - Metalink ファイル - Metalink файлы - Metalink 파일 - Metalink failas - Metalink datne - Metalink bestand - Plik Metalink - Arquivo Metalink - Fișier Metalink - файл Metalink - Súbor Metalink - Datoteka povezave Metalink - Metalink-fil - Metalink dosyası - файл метапосилання - 元链接文件 - Metalink 檔案 - - - - - - - - - unknown - مجهول - nieviadomy - Неизвестен тип - desconegut - Neznámý - ukendt - Unbekannt - άγνωστο - unknown - nekonate - desconocido - ezezaguna - tuntematon - ókent - inconnu - anaithnid - descoñecido - לא ידוע - nepoznato - ismeretlen - tak diketahui - Sconosciuto - 不明 - უცნობი - белгісіз - 알 수 없음 - nežinoma - nezināms - Entah - ukjent - onbekend - ukjend - Nieznany typ - desconhecido - Desconhecido - necunoscut - неизвестно - Neznámy - neznano - Nuk njihet - непознато - okänd - невідомо - không rõ - 未知 - 不明 - - - - ODA document - مستند ODA - ODA sənədi - Dakument ODA - Документ — ODA - document ODA - Dokument ODA - Dogfen ODA - ODA-dokument - ODA-Dokument - έγγραφο ODA - ODA document - ODA-dokumento - documento ODA - ODA dokumentua - ODA-asiakirja - ODA skjal - document ODA - cáipéis ODA - documento ODA - מסמך ODA - ODA dokument - ODA-dokumentum - Dokumen ODA - Documento ODA - ODA ドキュメント - ODA დოკუმენტი - ODA құжаты - ODA 문서 - ODA dokumentas - ODA dokuments - Dokumen ODA - ODA-dokument - ODA-document - ODA-dokument - Dokument ODA - documento ODA - Documento ODA - Document ODA - документ ODA - Dokument ODA - Dokument ODA - Dokument ODA - ODA документ - ODA-dokument - ODA belgesi - документ ODA - Tài liệu ODA - ODA 文档 - ODA 文件 - ODA - Office Document Architecture - - - - - WWF document - Документ — WWF - document WWF - Dokument WWF - WWF-dokument - WWF-Dokument - έγγραφο WWF - WWF document - WWF-dokumento - Documento de WWF - WWF-asiakirja - document WWF - documento de WWF - מסמך WWF - WWF dokument - WWF dokumentum - Dokumen WWF - Documento WWF - WWF 文書 - WWF დოკუმენტი - WWF құжаты - WWF 문서 - WWF dokuments - WWF document - Dokument WWF - Documento WWF - документ WWF - Dokument WWF - WWF-dokument - документ WWF - WWF - WWF 文件 - - - - - - - PDF document - مستند PDF - Dakument PDF - Документ — PDF - document PDF - Dokument PDF - Dogfen PDF - PDF-dokument - PDF-Dokument - έγγραφο PDF - PDF document - PDF-dokumento - documento PDF - PDF dokumentua - PDF-asiakirja - PDF skjal - document PDF - cáipéis PDF - documento PDF - מסמך PDF - PDF-dokumentum - Dokumen PDF - Documento PDF - PDF ドキュメント - PDF құжаты - PDF 문서 - PDF dokumentas - PDF dokuments - Dokumen PDF - PDF-dokument - PDF-document - PDF-dokument - Dokument PDF - documento PDF - Documento PDF - Document PDF - документ PDF - Dokument PDF - Dokument PDF - Dokument PDF - PDF документ - PDF-dokument - PDF belgesi - документ PDF - Tài liệu PDF - PDF 文档 - PDF 文件 - PDF - Portable Document Format - - - - - - - - - - - XSPF playlist - قائمة تشغيل XSPF - Śpis piesień XSPF - Списък за изпълнение — XSPF - llista de reproducció XSPF - Seznam skladeb XSPF - XSPF-afspilningsliste - XSPF-Wiedergabeliste - λίστα αναπαραγωγής XSPF - XSPF playlist - XSPF-ludlisto - lista de reproducción XSPF - XSPF erreprodukzio-zerrenda - XSPF-soittolista - XSPF avspælingarlisti - liste de lecture XSPF - seinmliosta XSPF - lista de reprodución XSPF - רשימת השמעה XSPF - XSPF popis za reprodukciju - XSPF-lejátszólista - Senarai pular XSPF - Scaletta XSPF - XSPF 再生リスト - XSPF ойнау тізімі - XSPF 재생 목록 - XSPF grojaraštis - XSPF repertuārs - XSPF-spilleliste - XSPF-afspeellijst - XSPF-speleliste - Lista odtwarzania XSPF - Lista de reprodução XSPF - Listă XSPF - список воспроизведения XSPF - Zoznam skladieb XSPF - Seznam predvajanja XSPF - Listë titujsh XSPF - XSPF-spellista - список програвання XSPF - Danh mục nhạc XSPF - XSPF 播放列表 - XSPF 播放清單 - XSPF - XML Shareable Playlist Format - - - - - - - - - - - - Microsoft Windows theme pack - حزمة سمات Microsoft Works - Пакет с тема — Microsoft Windows - paquet de temes Windows de Microsoft - Balík motivů Microsoft Windows - Microsoft Windows-temapakke - Themenpaket für Microsoft Windows - θεματικό πάρκο Microsoft Windows - Microsoft Windows theme pack - paquete de tema para Microsoft Windows - Microsoft Windows-en gaiaren paketea - Microsoft Windows -teemapaketti - Microsoft Windows tema pakki - paquet de thèmes Microsoft Windows - paca téamaí Microsoft Windows - paquete de tema de Microsoft Windows - חבילת ערכות נושא של Microsoft Windows - Microsoft Windows paket tema - Microsoft Windows témacsomag - Pak tema Microsoft Windows - Pacchetto temi Microsoft Windows - Microsoft Windows テーマパック - Microsoft Windows-ის თემის შეკვრა - Microsoft Windows тема дестесі - 마이크로소프트 Windows 테마 패키지 - Microsoft Windows temų paketas - Microsoft Windows motīvu paka - Microsoft Windows thema pack - Pakiet motywu Microsoft Windows - Pacote de temas do Microsoft Windows - Pachet de teme Microsoft Windows - пакет темы Microsoft Windows - Balík tém Microsoft Windows - Datoteka teme Microsoft Windows - Microsoft Windows-temapaket - пакунок з темою Microsoft Windows - Microsoft Windows 主题包 - 微軟視窗佈景主題包 - - - - - - AmazonMP3 download file - - - - GSM 06.10 audio - GSM 06.10 سمعي - Аудио — GSM 06.10 - àudio GSM 06.10 - Zvuk GSM 06.10 - GSM 06.10-lyd - GSM-06.10-Audio - ήχος GSM 06.10 - GSM 06.10 audio - sonido GSM 06.10 - GSM 06.10 audioa - GSM 06.10 -ääni - GSM 06.10 ljóður - audio GSM 06.10 - fuaim GSM 06.10 - son de GSM 06.10 - שמע GSM 06.10 - GSM 06.10 audio - GSM 06.10 hang - Audio GSM 06.10 - Audio GSM 06.10 - GSM 06.10 オーディオ - GSM 06.10 აუდიო - GSM 06.10 аудиосы - GSM 06.10 오디오 - GSM 06.10 garso įrašas - GSM 06.10 audio - GSM 06.10 audio - Plik dźwiękowy GSM 06.10 - Áudio GSM 06.10 - GSM 06.10 audio - аудио GSM 06.10 - Zvuk GSM 06.10 - Zvočna datoteka GSM 06.10 - GSM 06.10-ljud - звук GSM 06.10 - Âm thanh GSM 06.10 - GSM 06.10 音频 - GSM 06.10 音訊 - GSM - Global System for Mobile communications - - - - iRiver Playlist - قائمة تشغيل iRiver - Śpis piesień iRiver - Списък за изпълнение — iRiver - llista de reproducció iRiver - Seznam skladeb iRiver - iRiver-afspilningsliste - iRiver-Wiedergabeliste - λίστα αναπαραγωγής iRiver - iRiver Playlist - iRiver-ludlisto - lista de reproducción de iRiver - iRiver erreprodukzio-zerrenda - iRiver-soittolista - iRiver avspælingarlisti - liste de lecture iRiver - seinmliosta iRiver - lista de reprodución de iRiver - רשימת השמעה של iRiver - iRiver popis za reprodukciju - iRiver lejátszólista - iRiver Playlist - Scaletta iRiver - iRiver 再生リスト - iRiver ойнау тізімі - iRiver 재생 목록 - iRiver grojaraštis - iRiver repertuārs - iRiver-spilleliste - iRiver-afspeellijst - iRiver speleliste - Lista odtwarzania iRiver - Lista de reprodução do iRiver - Listă iRiver - список воспроизведения iRiver - Zoznam skladieb iRiver - Seznam predvajanja iRiver - Listë titujsh iRiver - iRiver-spellista - список програвання iRiver - danh mục nhạc iRiver - iRiver 播放列表 - iRiver 播放清單 - - - - - - - PGP/MIME-encrypted message header - ترويسة رسالة PGP/MIME-مشفرة - Zahałovak paviedamleńnia, zašyfravany ŭ PGP/MIME - Заглавна част на шифрирано съобщение — PGP/MIME - capçalera de missatge xifrat amb PGP/MIME - Záhlaví zprávy zašifrované pomocí PGP/MIME - PGP-/MIME-krypteret meddelelseshoved - PGP/MIME-verschlüsselter Nachrichtenkopf - κεφαλίδα μηνύματος κρυπτογραφημένου κατά PGP/MIME - PGP/MIME-encrypted message header - PGP/MIME-ĉifrita ĉapo de mesaĝo - cabecera de mensaje cifrado PGP/MIME - PGP/MIME enkriptatutako mezu-goiburua - PGP/MIME-salattu viestiotsikko - PGP/MIME-encrypted boð tekshøvd - en-tête de message codé PGP/MIME - ceanntásc teachtaireachta ionchódaithe le PGP/MIME - cabeceira de mensaxe cifrado PGP/MIME - כותר של קובץ מוצפן מסוג PGP/MIME - PGP/MIME titkosított üzenetfejléc - Tajuk pesan terenkripsi PGP/MIME - Intestazione messaggio PGP/MIME-encrypted - PGP/MIME 暗号化メッセージヘッダー - PGP/MIME-шифрленген мәлімдеме тақырыптамасы - PGP/MIME으로 암호화된 메시지 헤더 - PGP/MIME užšifruota žinutės antraštė - PGP/MIME-šifrēta ziņas galvene - Pengepala mesej terenkripsi PGP/MIME - PGP/MIME-kryptert meldingshode - PGP/MIME-versleutelde berichtkopregels - PGP/MIME-kryptert meldingshovud - Nagłówek listu zaszyfrowanego PGP/MIME - cabeçalho de mensagem cifrada com PGP/MIME - Cabeçalho de mensagem criptografada PGP/MIME - Antet de mesaj encriptat PGP/MIME - заголовок сообщения, зашифрованный PGP/MIME - Hlavičke správy zašifrovaná pomocou PGP/MIME - Datoteka glave šifriranega sporočila PGP/MIME - Header mesazhi të kriptuar PGP/MIME - ПГП/МИМЕ шифровано заглавље поруке - PGP/MIME-krypterat meddelandehuvud - заголовок шифрованого PGP/MIME повідомлення - Phần đầu thông điệp đã mật mã bằng PGP/MIME - PGP/MIME 加密的信件头 - PGP/MIME 加密訊息標頭 - - - - - - - - - - - PGP keys - مفاتيح PGP - PGP açarları - Klučy PGP - Ключове — PGP - claus PGP - Klíče PGP - Allweddi PGP - PGP-nøgler - PGP-Schlüssel - κλειδιά PGP - PGP keys - PGP-ŝlosiloj - claves PGP - PGP giltzak - PGP-avainrengas - PGP lyklar - clés PGP - eochracha PGP - Chaves PGP - מפתח PGP - PGP-kulcs - Kunci PGP - Chiavi PGP - PGP 鍵 - PGP кілттері - PGP 키 - PGP raktai - PGP atslēgas - Kekunci PGP - PGP-nøkler - PGP-sleutels - PGP-nøkler - Klucze PGP - chaves PGP - Chaves PGP - Chei PGP - ключи PGP - Kľúče PGP - Datoteka ključa PGP - Kyçe PGP - PGP кључ - PGP-nycklar - PGP anahtarları - ключі PGP - Khoá PGP - PGP 密钥 - PGP 鑰匙 - PGP - Pretty Good Privacy - - - - - - - - - - - - - - - - - - detached OpenPGP signature - إمضاء OpenPGP مفصول - adłučany podpis OpenPGP - Отделен подпис — OpenPGP - signatura OpenPGP separada - Oddělený podpis OpenPGP - frigjort OpenPGP-signatur - Isolierte OpenPGP-Signatur - αποκομμένη υπογραφή OpenPGP - detached OpenPGP signature - dekroĉa OpenPGP-subskribo - firma OpenPGP separada - desuzturtako OpenPGP sinadura - erillinen OpenPGP-allekirjoitus - skild OpenPGP undirskrift - signature OpenPGP détachée - síniú OpenPGP scartha - sinatura de OpenPGP independente - חתימת OpenPGP מנותקת - odvojen OpenPGP potpis - leválasztott OpenPGP-aláírás - tanda tangan OpenPGP yang terlepas - Firma staccata OpenPGP - 分離 OpenPGP 署名 - бөлінген OpenPGP қолтаңбасы - 분리된 OpenPGP 서명 - neprisegtas OpenPGP parašas - atvienots OpenPGP paraksts - Tandatangan OpenPGP terlerai - frakoblet OpenPGP-signatur - losse OpenPGP-ondertekening - fråkopla OpenPGP-signatur - Oddzielony podpis OpenPGP - assinatura OpenPGP solta - Assinatura OpenPGP destacada - semnătură OpenPGP detașată - отсоединённая подпись OpenPGP - Oddelený podpis OpenPGP - odpet podpis OpenPGP - Firmë e shkëputur OpenPGP - одвојени ОпенПГП потпис - frikopplad OpenPGP-signatur - відокремлений OpenPGP підпис - chữ ký OpenPGP tách rời - 分离的 OpenPGP 签名 - 分離的 OpenPGP 簽章 - - - - - - - - - - - - - PKCS#7 Message or Certificate - PKCS - Public-Key Cryptography Standards - - - - - - detached S/MIME signature - إمضاء S/MIME مفصول - adłučany podpis S/MIME - Отделен подпис — S/MIME - signatura S/MIME separada - Oddělený podpis S/MIME - frigjort S/MIME-signatur - Isolierte S/MIME-Signatur - αποκομμένη υπογραφή S/MIME - detached S/MIME signature - dekroĉa S/MIME-subskribo - firma S/MIME separada - desuzturtako S/MIME sinadura - erillinen S/MIME-allekirjoitus - skild S/MIME undirskrift - signature S/MIME détachée - síniú S/MIME scartha - sinatura S/MIME independente - חתימת S/MIME מנותקת - odvojen S/MIME potpis - leválasztott S/MIME-aláírás - tanda tangan S/MIME yang terlepas - Firma staccata S/MIME - 分離 S/MIME 署名 - бөлінген S/MIME қолтаңбасы - 분리된 S/MIME 서명 - neprisegtas S/MIME parašas - atvienots S/MIME paraksts - Tandatangan S/MIME terlerai - frakoblet S/MIME-signatur - losse S/MIME-ondertekening - fråkopla S/MIME-signatur - Oddzielony podpis S/MIME - assinatura S/MIME solta - Assinatura S/MIME destacada - semnătură S/MIME detașată - отсоединённая подпись S/MIME - Oddelený podpis S/MIME - odpet podpis S/MIME - Firmë e shkëputur S/MIME - одвојени S/MIME потпис - frikopplad S/MIME-signatur - відокремлений S/MIME підпис - chữ ký S/MIME tách rời - 分离的 S/MIME 签名 - 分離的 S/MIME 簽章 - S/MIME - Secure/Multipurpose Internet Mail Extensions - - - - - - PKCS#8 private key - رزمة الشهادة PKCS#8 - Ключ, частен — PKCS#8 - clau privada PKCS#8 - Soukromý klíč PKCS#8 - PKCS#8-privat nøgle - PKCS#8 Geheimer Schlüssel - ιδιωτικό κλειδί PKCS#8 - PKCS#8 private key - clave privada PCKS#8 - PKCS#8 yksityinen avain - PKCS#8 privatur lykil - clé privée PKCS#8 - eochair phríobháideach PKCS#8 - Chave privada PKCS#8 - מפתח פרטי של PKCS#8 - PKCS#8 személyes kulcs - Kunci privat PKCS#8 - Chiave privata PKCS#8 - PKCS#8 秘密鍵 - PKCS#8 меншік кілті - PKCS#8 개인 키 - PKCS#8 asmeninis raktas - PKCS#8 privātā atslēga - PKCS#8 private sleutel - Klucz prywatny PKCS#8 - Chave privada PKCS#8 - Cheie privată PKCS#8 - личный ключ PKCS#8 - Súkromný kľúč PKCS#8 - Datoteka osebnega ključa PKCS#8 - Privat PKCS#8-nyckel - закритий ключ PKCS#8 - PKCS#8 私钥 - PKCS#8 私人金鑰 - PKCS - Public-Key Cryptography Standards - - - - PKCS#10 certification request - طلب شهادة PKCS#10 - Zapyt sertyfikacyi PKCS#10 - Заявка за сертификат — PKCS#10 - sol·licitud de certificació PKCS#10 - Požadavek na certifikát PKCS#10 - PKCS#10-certifikatanmodning - PKCS#10-Zertifikatanfrage - αίτηση πιστοποίησης PKCS#10 - PKCS#10 certification request - petición de certificados PKCS#10 - PKCS#10 ziurtagirien eskaera - PKCS#10-varmennepyyntö - PKCS#10 váttanarumbøn - requête de certification PKCS#10 - iarratas dheimhniúchán PKCS#10 - Solicitude de certificado PKCS#10 - בקשה מוסמכת PLCS#10 - PKCS#10-tanúsítványkérés - Permintaan sertifikasi PKCS#10 - Richiesta certificazione PKCS#10 - PKCS#10 証明書署名要求 - PKCS#10 сертификацияға сұранымы - PKCS#10 인증서 요청 - PKCS#10 liudijimų užklausa - PKCS#10 sertifikācijas pieprasījums - PKCS#10-sertifikatforespørsel - PKCS#10-certificatieverzoek - PKCS#10-sertifiseringsførespurnad - Żądanie certyfikatu PKCS#10 - Pedido de certificação PKCS#12 - Cerere de certificat PKCS#10 - запрос сертификации PKCS#10 - Požiadavka na certifikát PKCS#10 - Datoteka potrdila PKCS#10 - Kërkesë çertifikimi PKCS#10 - PKCS#10-certifikatbegäran - комплект сертифікатів PKCS#10 - Yêu cầu chứng nhận PKCS#10 - PKCS#10 认证请求 - PKCS#10 憑證請求 - PKCS - Public-Key Cryptography Standards - - - - - X.509 certificate - شهادة X.509 - Сертификат — X.509 - certificat X.509 - Certifikát X.509 - X.509-certifikat - X.509-Zertifikat - πιστοποιητικό X.509 - X.509 certificate - certificado X.509 - X.509 ziurtagiria - X.509-varmenne - X.509 prógv - certificat X.509 - teastas X.509 - Certificado X.509 - אישור X.509 - X.509 certifikat - X.509 tanúsítvány - Sertifikat X.509 - Certificato X.509 - X.509 証明書 - X.509 сертификаты - X.509 인증서 - X.509 liudijimas - X.509 sertifikāts - X.509 certificaat - Certyfikat X.509 - Certificado X.509 - Certificat X.509 - сертификат X.509 - Certifikát X.509 - Datoteka potrdila X.509 - X.509-certifikat - сертифікат X.509 - X.509 证书 - X.509 憑證 - - - - Certificate revocation list - قائمة إبطال الشهادات - Списък с отхвърлени сертификати - llista de revocació de certificats - Seznam odvolaných certifikátů - Certifikattilbagekaldelsesliste - Liste widerrufener Zertifikate - κατάλογος ανάκλησης πιστοποιητικού - Certificate revocation list - lista de revocación de certificados - Ziurtagiri-errebokatzeen zerrenda - Varmenteiden sulkulista - Prógv afturtøkulisti - liste de révocation de certificat - liosta teastas cúlghairmthe - lista de certificados de revogación - רשימת אישורים מבוטלים - popis povučenih certifikata - Tanúsítvány-visszavonási lista - Daftar pencabutan sertificat (CRL) - Elenco certificati di revoca - 証明書失効リスト - Сертификатты қайта шақыру тізімі - 인증서 철회 목록 - Panaikintų liudijimų sąrašas - Sertifikātu atsaukšanu saraksts - Certificaat revocation lijst - Lista unieważnień certyfikatów - Lista de revogação de certificado - Listă de revocare a certificatelor - Список аннулирования сертификатов - Zoznam zrušených certifikátov - Datoteka seznama preklica potrdil - Spärrlista för certifikat - список відкликання сертифікатів - 证书吊销列表 - 憑證撤銷清單 - - - - PkiPath certification path - مسار شهادة PkiPath - Сертификационна верига — PkiPath - ruta de certificació PkiPath - Cesta k certifikátu PkiPath - PkiPath-certifikationssti - PkiPath-Zertifikatspfad - διαδρομή πιστοποιητικού PkiPath - PkiPath certification path - ruta de certificación PkiPath - PkiPath ziurtagirien bide-izena - PkiPath-varmennepolku - PkiPath váttanleið - chemin de certification PkiPath - conair dheimhniúcháin PkiPath - Ruta de certificación PkiPath - נתיב מאושר של PkiPath - PkiPath tanúsítványútvonal - Alamat sertifikasi PkiPath - Percorso certificazione PkiPath - PkiPath 証明書パス - PkiPath сертификаттау жолы - PkiPath 인증서 요청 - PkiPath liudijimų maršrutas - PkiPath sertifikāta ceļš - PkiPath-certificatiepad - Ścieżka certyfikacji PkiPath - Pedido de certificação PkiPath - Cale certificare PkiPath - путь сертификации PkiPath - Cesta k certifikátu PkiPath - Datoteka poti potrdila PkiPath - PkiPath-certifikatsekvens - шлях сертифікації PkiPath - Đường dẫn cấp chứng nhận PkiPath - PkiPath 证书目录 - PkiPath 憑證路徑 - - - - PS document - مستند PS - Dakument PS - Документ — PS - document PS - Dokument PS - PS-dokument - PS-Dokument - έγγραφο PS - PS document - PS-dokumento - documento PS - PS dokumentua - PS-asiakirja - PS skjal - document PS - cáipéis PS - documento PS - מסמך PS - PS dokumentum - Dokumen PS - Documento PS - PS ドキュメント - PS құжаты - PS 문서 - PS dokumentas - PS dokuments - PS-dokument - PS-document - PS-dokument - Dokument PS - Documento PS - Document PS - документ PS - Dokument PS - Dokument PS - Dokument PS - PS-dokument - PS belgesi - документ PS - Tài liệu PS - PS 文档 - Ps 文件 - PS - PostScript - - - - - - - - - - Plucker document - مستند Plucker - Dakument Plucker - Документ — Plucker - document Plucker - Dokument Plucker - Pluckerdokument - Plucker-Dokument - έγγραφο Plucker - Plucker document - Plucker-dokumento - documento de Plucker - Plucker dokumentua - Plucker-asiakirja - Plucker skjal - document Plucker - cáipéis Plucker - documento de Plucker - מסמך של Plucker - Plucker dokumentum - Dokumen Plucker - Documento Plucker - Plucker ドキュメント - Plucker құжаты - Plucker 문서 - Plucker dokumentas - Plucker dokuments - Plucker-dokument - Plucker-document - Plucker-dokument - Dokument Plucker - Documento do Plucker - Document Plucker - документ Plucker - Dokument Plucker - Dokument Plucker - Dokument Plucker - Plucker-dokument - Plucker belgesi - документ Plucker - Tài liệu Plucker - Plucker 文档 - Plucker 文件 - - - - - - - RELAX NG XML schema - مخطط RELAX NG XML - Схема за XML — RELAX NG - esquema XML RELAX NG - Schéma RELAX NG XML - RELAX NG XML-skema - RELAX NG XML-Schema - σχήμα RELAX NG XML - RELAX NG XML schema - Esquema XML RELAX NG - RELAX NG XML-skeema - schéma XML RELAX NG - scéimre XML RELAX NG - Esquema XML RELAX NG - סכנת RELAX NG XML - RELAX NG XML shema - RELAX NG XML-séma - Skema XML RELAX NG - Schema XML RELAX NG - RELAX NG XML スキーマ - RELAX NG XML сұлбасы - RELAX NG XML 스키마 - RELAX NG XML schema - RELAX NG XML shēma - RELAX NG XML schema - Schemat XML RELAX NG - Esquema XML de RELAX NG - Schemă RELAX NG XML - XML-схема RELAX NG - XML schéma RELAX NG - Datoteka shema RELAX NG XML - RELAX NG XML-schema - XML-схема RELAX NG - RELAX NG XML 模式 - RELAX NG XML schema - RELAX NG - REgular LAnguage for XML Next Generation - - - - - - - RTF document - مستند RTF - Dakument RTF - Документ — RTF - document RTF - Dokument RTF - RTF-dokument - RTF-Dokument - έγγραφο RTF - RTF document - RTF-dokumento - documento RTF - RTF dokumentua - RTF-asiakirja - RTF skjal - document RTF - cáipéis RTF - documento RTF - מסמך RTF - RTF dokument - RTF dokumentum - Dokumen RTF - Documento RTF - RTF ドキュメント - RTF құжаты - RTF 문서 - RTF dokumentas - RTF dokuments - RTF-dokument - RTF-document - TRF-dokument - Dokument RTF - Documento RTF - Document RTF - документ RTF - Dokument RTF - Dokument RTF - Dokument RTF - RTF-dokument - документ RTF - Tài liệu RTF - RTF 文档 - RTF 文件 - RTF - Rich Text Format - - - - - - - - - - Sieve mail filter script - سكربت مرشح بريد Sieve - Skrypt filtravańnia pošty Sieve - Скрипт-филтър за пресяване на поща - script de filtre de correu Sieve - Skript poštovního filtru Sieve - Sieve e-post-filterprogram - Sieve-E-Mail-Filterskript - σενάριο φιλτραρίσματος αλληλογραφίας Sieve - Sieve mail filter script - script de filtro de correo Sieve - Sieve posta-iragazki script-a - Sieve-postinsuodatuskomentotiedosto - script de filtrage de courriel Sieve - script scagaire phost Sieve - Script de filtro de correo Sieve - תסריט סינון דואר של Sieve - Sieve levélszűrő parancsfájl - Skrip filter surat Sieve - Script filtro posta Sieve - Sieve メールフィルタスクリプト - Sieve пошталық фильтр сценарийі - Sieve 메일 필터 스크립트 - Sieve pašto filtro scenarijus - Sieve pasta filtra skripts - Sieve e-postfilter skript - Sieve mailfilter-script - Sieve e-postfilterskript - Skrypt filtra poczty Sieve - Script de filtro de mensagens do Sieve - Script filtrare email Sieve - сценарий почтового фильтра Sieve - Skript poštového filtra Sieve - Skriptna datoteka Sieve poštnega filtra - Script filtrim poste Sieve - Sieve-epostfilterskript - скрипт поштового фільтру Sieve - Văn lệnh lọc thư Sieve - Sieve 邮件过滤脚本 - Sieve 郵件過濾指令稿 - - - - - - SMIL document - مستند SMIL - Dakument SMIL - Документ — SMIL - document SMIL - Dokument SMIL - SMIL-dokument - SMIL-Dokument - έγγραφο SMIL - SMIL document - SMIL-dokumento - documento SMIL - SMIL dokumentua - SMIL-asiakirja - SMIL skjal - document SMIL - cáipéis SMIL - documento SMIL - מסמך SMIL - SMIL dokument - SMIL dokumentum - Dokumen SMIL - Documento SMIL - SMIL ドキュメント - SMIL құжаты - SMIL 문서 - SMIL dokumentas - SMIL dokuments - SMIL-dokument - SMIL-document - SMIL-dokument - Dokument SMIL - Documento SMIL - Document SMIL - документ SMIL - Dokument SMIL - Dokument SMIL - Dokument SMIL - SMIL-dokument - SMIL belgesi - документ SMIL - Tài liệu SMIL - SMIL 文档 - SMIL 文件 - SMIL - Synchronized Multimedia Integration Language - - - - - - - - - - - - - - - - WPL playlist - قائمة تشغيل WPL - Списък за изпълнение — WPL - llista de reproducció WPL - Seznam skladeb WPL - WPL-afspilningsliste - WPL-Wiedergabeliste - λίστα αναπαραγωγής WPL - WPL playlist - WPL-ludlisto - lista de reproducción WPL - WPL erreprodukzio-zerrenda - WPL-soittolista - WPL avspælingarlisti - liste de lecture WPL - seinmliosta WPL - lista de reprodución WPL - רשימת השמעה WPL - WPL popis za reprodukciju - WPL-lejátszólista - Senarai putar WPL - Scaletta WPL - WPL 再生リスト - WPL ойнау тізімі - WPL 재생 목록 - WPL grojaraštis - WPL repertuārs - WPL-afspeellijst - Lista odtwarzania WPL - Lista de reprodução do WPL - Listă redare WPL - список воспроизведения WPL - Zoznam skladieb WPL - Seznam predvajanja WPL - WPL-spellista - список відтворення WPL - Danh mục nhạc WPL - WPL 播放列表 - WPL 播放清單 - WPL - Windows Media Player Playlist - - - - - - - - SQLite2 database - قاعدة بيانات SQLite2 - Baza źviestak SQLite2 - База от данни — SQLite2 - base de dades SQLite2 - Databáze SQLite2 - SQLite2-database - SQLite2-Datenbank - βάση δεδομένων SQLite2 - SQLite2 database - SQLite2-datumbazo - base de datos SQLite2 - SQLite2 datu-basea - SQLite2-tietokanta - SQLite2 dátustovnur - base de données SQLite2 - bunachar sonraí SQLite2 - base de datos SQLite2 - בסיס מידע של SQLite2 - SQLite2 baza podataka - SQLite2 adatbázis - Basis data SQLite2 - Database SQLite2 - SQLite2 データベース - SQLite2 дерекқоры - SQLite2 데이터베이스 - SQLite2 duomenų bazė - SQLite2 datubāze - SQLite2-database - SQLite2-gegevensbank - SQLite2-database - Baza danych SQLite2 - Banco de dados do SQLite2 - Bază de date SQLite2 - база данных SQLite2 - Databáza SQLite2 - Podatkovna zbirka SQLite2 - Bazë me të dhëna SQLite2 - SQLite2-databas - SQLite2 veritabanı - База даних SQLite2 - Cơ sở dữ liệu SQLite2 - SQLite2 数据库 - SQLite2 資料庫 - - - - - - SQLite3 database - قاعدة بيانات SQLite3 - Baza źviestak SQLite3 - База от данни — SQLite3 - base de dades SQLite3 - Databáze SQLite3 - SQLite3-database - SQLite3-Datenbank - βάση δεδομένων SQLite3 - SQLite3 database - SQLite3-datumbazo - base de datos SQLite3 - SQLite3 datu-basea - SQLite3-tietokanta - SQLite3 dátustovnur - base de données SQLite3 - bunachar sonraí SQLite3 - base de datos SQLite3 - בסיס מידע של SQLite3 - SQLite3 baza podataka - SQLite3 adatbázis - Basis data SQLite3 - Database SQLite3 - SQLite3 データベース - SQLite3 дерекқоры - SQLite3 데이터베이스 - SQLite3 duomenų bazė - SQLite3 datubāze - SQLite3-database - SQLite3-gegevensbank - SQLite3-database - Baza danych SQLite3 - Banco de dados do SQLite3 - Bază de date SQLite3 - база данных SQLite3 - Databáza SQLite3 - Podatkovna zbirka SQLite3 - Bazë me të dhëna SQLite3 - SQLite3-databas - SQLite3 veritabanı - база даних SQLite3 - Cơ sở dữ liệu SQLite3 - SQLite3 数据库 - SQLite3 資料庫 - - - - - - GEDCOM family history - تاريخ عائلة GEDCOM - Siamiejnaja historyja GEDCOM - Родословно дърво — GEDCOM - història familiar GEDCOM - Rodokmen GEDCOM - GEDCOM-familiehistorie - GEDCOM-Stammbaum - οικογενειακό ιστορικό GEDCOM - GEDCOM family history - historia familiar GEDCOM - GEDCOM famili historia - GEDCOM-sukuhistoria - GEDCOM familjusøga - généalogie GEDCOM - stair theaghlach GEDCOM - historial de familia GEDCOM - היסטוריה משפחתית של GEDCOM - GEDCOM obiteljska povijest - GEDCOM családtörténet - Sejarah keluarga GEDCOM - Cronologia famiglia GEDCOM - GEDCOM 家系図データ - GEDCOM ოჯახის ისტორია - GEDCOM отбасы тарихы - GEDCOM 가족 내력 - GEDCOM šeimos istorija - GEDCOM ģimenes vēsture - GEDCOM-familiehistorikk - GEDCOM-stamboom - GEDCOM-familehistorie - Plik historii rodziny GEDCOM - Histórico familiar do GEDCOM - Tablou genealogic GEDCOM - история семьи GEDCOM - Rodokmeň GEDCOM - Datoteka družinske zgodovine GEDCOM - Kronollogji familje GEDCOM - GEDCOM-släktträd - історія родини GEDCOM - Lịch sử gia đình GEDCOM - GEDCOM 家谱 - GEDCOM 家族史 - GEDCOM - GEnealogical Data COMmunication - - - - - - - - - - Flash video - Flash مرئي - Videa Flash - Видео — Flash - vídeo de Flash - Video Flash - Flashvideo - Flash-Video - βίντεο Flash - Flash video - Flash-video - vídeo Flash - Flash bideoa - Flash-video - Flash video - vidéo Flash - físeán Flash - vídeo Flash - וידאו של פלאש - Flash video - Flash videó - Video Flash - Video Flash - Flash 動画 - Flash-ის ვიდეო - Flash видеосы - Flash 비디오 - Flash vaizdo įrašas - Flash video - Flash-film - Flash-video - Flash-video - Plik wideo Flash - Vídeo Flash - Video Flash - видео Flash - Video Flash - Video datoteka Flash - Video Flash - Flash-video - відеокліп Flash - Ảnh động Flash - Flash 影片 - Flash 視訊 - - - - - - - - - - - JavaFX video - Видео — JavaFX - vídeo JavaFX - Video JavaFX - JavaFX-video - JavaFX-Video - βίντεο JavaFX - JavaFX video - JavaFX-video - vídeo JavaFX - JavaFX-video - JavaFX video - vidéo JavaFX - físeán JavaFX - vídeo JavaFX - וידאו JavaFX - JavaFX video - JavaFX videó - Video JavaFX - Video JavaFX - JavaFX 動画 - JavaFX аудиосы - JavaFX 비디오 - JavaFX video - JavaFX video - Plik wideo JavaFX - Vídeo JavaFX - Video JavaFX - видео JavaFX - Video JavaFX - Video JavaFX - JavaFX-video - відеокліп JavaFX - JavaFX 视频 - JavaFX 視訊 - - - - - - - - - - SGF record - تسجيلة SGF - Zapisanaja hulnia SGF - Запис — SGF - registre SGF - Záznam SGF - SGF-optagelse - SGF-Aufzeichnung - εγγραφή SGF - SGF record - grabación SGF - SGF erregistroa - SGF-nauhoitus - SGF met - partie SGF - taifead SGF - Grabación SGF - הקלטת SGF - SGF zapis - SGF pontszám - Catatan SGF - Registrazione SGF - SGF レコード - SGF жазбасы - SGF 기록파일 - SGF įrašas - SGF ieraksts - SGF-oppføring - SGF-record - SGF-logg - Zapis gry SGF - Gravação SGF - Înregistrare SGF - запись SGF - Záznam SGF - Datoteka shranjene igre SGF - Regjistrim SGF - SGF-protokoll - SGF kaydı - запис SGF - Mục ghi SGF - SGF 记录 - SGF 紀錄 - SGF - Smart Game Format - - - - - - - - - - XLIFF translation file - ملف ترجمة XLIFF - Fajł pierakładu XLIFF - Превод — XLIFF - fitxer traducció XLIFF - Soubor překladu XLIFF - XLIFF-oversættelsesfil - XLIFF-Übersetzung - αρχείο προς μετάφραση XLIFF - XLIFF translation file - archivo de traducción XLIFF - XLIFF itzulpen-fitxategia - XLIFF-käännöstiedosto - XLIFF týðingarfíla - fichier de traduction XLIFF - comhad aistrithe XLIFF - ficheiro de tradución XLIFF - קובץ תרגום CLIFF - XLIFF datoteka prijevoda - XLIFF fordítási fájl - Berkas terjemahan XLIFF - File traduzione XLIFF - XLIFF 翻訳ファイル - XLIFF аударма файлы - XLIFF 번역 파일 - XLIFF vertimo failas - XLIFF tulkošanas datne - XLIFF-oversettelsesfil - XLIFF-vertalingsbestand - XLIFF-omsetjingsfil - Plik tłumaczenia XLIFF - Arquivo de tradução XLIFF - Fișier de traducere XLIFF - файл перевода XLIFF - Súbor prekladu XLIFF - Datoteka prevoda XLIFF - File përkthimesh XLIFF - XLIFF-översättningsfil - файл перекладу XLIFF - Tập tin dịch XLIFF - XLIFF 消息翻译文件 - XLIFF 翻譯檔 - XLIFF - XML Localization Interchange File Format - - - - - - - - - - - YAML document - مستند YAML - Документ — YAML - document YAML - Dokument YAML - YAML-dokument - YAML-Dokument - έγγραφο YAML - YAML document - YAML-dokumento - documento YAML - YAML-asiakirja - YAML skjal - document YAML - cáipéis YAML - documento YAML - מסמך YAML - YAML-dokumentum - Dokumen YAML - Documento YAML - YAML ドキュメント - YAML құжаты - YAML 문서 - YAML dokumentas - YAML dokuments - YAML document - Dokument YAML - Documento YAML - Document YAML - документ YAML - Dokument YAML - Dokument YAML - YAML-dokument - YAML belgesi - документ YAML - YAML 文档 - YAML 文件 - YAML - YAML Ain't Markup Language - - - - - - - - - - - - Corel Draw drawing - تصميم Corel Draw - Corel Draw çəkimi - Rysunak Corel Draw - Чертеж — Corel Draw - dibuix de Corel Draw - Kresba Corel Draw - Darlun Corel Draw - Corel Draw-tegning - Corel-Draw-Zeichnung - σχέδιο Corel Draw - Corel Draw drawing - grafikaĵo de Corel Draw - dibujo de Corel Draw - Corel Draw-eko marrazkia - Corel Draw -piirros - Corel Draw tekning - dessin Corel Draw - líníocht Corel Draw - debuxo de Corel Draw - ציור של Corel Draw - Corel Draw crtež - Corel Draw-rajz - Gambar Corel Draw - Disegno Corel Draw - Corel Draw ドロー - Corel Draw-ის ნახაზი - Corel Draw суреті - 코렐 드로우 드로잉 - Corel Draw piešinys - Corel Draw zīmējums - Lukisan Corel Draw - Corel Draw-tegning - Corel Draw-tekening - Corel Draw-teikning - Rysunek Corel Draw - desenho Corel Draw - Desenho do Corel Draw - Desen Corel Draw - изображение Corel Draw - Kresba Corel Draw - Datoteka risbe Corel Draw - Vizatim Corel Draw - Corel Draw цртеж - Corel Draw-teckning - малюнок Corel Draw - Bản vẽ Corel Draw - Corel Draw 图形 - Corel Draw 繪圖 - - - - - - - - - - - - - - - HPGL file - ملف HPGL - Fajł HPGL - Файл — HPGL - fitxer HPGL - Soubor HPGL - HPGL-fil - HPGL-Datei - αρχείο HPGL - HPGL file - HPGL-dosiero - archivo HPGL - HPGL fitxategia - HPGL-tiedosto - HPGL fíla - fichier HPGL - comhad HPGL - ficheiro HPGL - קובץ HGPL - HPGL datoteka - HPGL fájl - Berkas HPGL - File HPGL - HPGL ファイル - HPGL файлы - HPGL 파일 - HPGL failas - HPGL datne - HPGL-fil - HPGL-bestand - HPGL-fil - Plik HPGL - Arquivo HPGL - Fișier HPGL - файл HPGL - Súbor HPGL - Datoteka HPGL - File HPGL - HPGL-fil - файл HPGL - Tập tin HPGL - HPGL 文件 - HPGL 檔案 - HPGL - HP Graphics Language - - - - - PCL file - ملف PCL - Fajł PCL - Файл — PCL - fitxer PCL - Soubor PCL - PCL-fil - PCL-Datei - αρχείο PCL - PCL file - PCL-dosiero - archivo PCL - PCL fitxategia - PCL-tiedosto - PCL fíla - fichier PCL - comhad PCL - ficheiro PCL - קובץ PCL - PCL fájl - Berkas PCL - File PCL - PCL ファイル - PCL файлы - PCL 파일 - PCL failas - PCL datne - PCL-fil - PCL-bestand - PCL-fil - Plik PCL - Arquivo PCL - Fișier PCL - файл PCL - Súbor PCL - Datoteka PCL - File PCL - PCL-fil - PCL dosyası - файл PCL - Tập tin PCL - PCL 文件 - PCL 檔 - PCL - HP Printer Control Language - - - - - Lotus 1-2-3 spreadsheet - جدول Lotus 1-2-3 - Lotus 1-2-3 hesab cədvəli - Raźlikovy arkuš Lotus 1-2-3 - Таблица — Lotus 1-2-3 - full de càlcul de Lotus 1-2-3 - Sešit Lotus 1-2-3 - Taenlen Lotus 1-2-3 - Lotus 1-2-3-regneark - Lotus-1-2-3-Tabelle - λογιστικό φύλλο Lotus 1-2-3 - Lotus 1-2-3 spreadsheet - Kalkultabelo de Lotus 1-2-3 - hoja de cálculo de Lotus 1-2-3 - Lotus 1-2-3 kalkulu-orria - Lotus 1-2-3 -taulukko - Lotus 1-2-3 rokniark - feuille de calcul Lotus 1-2-3 - scarbhileog Lotus 1-2-3 - folla de cálculo de Lotus 1-2-3 - גליון נתונים של Lotus 1-2-3 - Lotus 1-2-3 proračunska tablica - Lotus 1-2-3-munkafüzet - Lembar sebar Lotus 1-2-3 - Foglio di calcolo Lotus 1-2-3 - Lotus 1-2-3 スプレッドシート - Lotus 1-2-3 электрондық кестесі - Lotus 1-2-3 스프레드시트 - Lotus 1-2-3 skaičialentė - Lotus 1-2-3 izklājlapa - Hamparan Lotus 1-2-3 - Lotus 1-2-3 regneark - Lotus 1-2-3-rekenblad - Lotus 1-2-3 rekneark - Arkusz Lotus 1-2-3 - folha de cálculo Lotus 1-2-3 - Planilha do Lotus 1-2-3 - Foaie de calcul Lotus 1-2-3 - электронная таблица Lotus 1-2-3 - Zošit Lotus 1-2-3 - Preglednica Lotus 1-2-3 - Fletë llogaritjesh Lotus 1-2-3 - Lotus 1-2-3 табеларни прорачун - Lotus 1-2-3-kalkylblad - ел. таблиця Lotus 1-2-3 - Bảng tính Lotus 1-2-3 - Lotus 1-2-3 工作簿 - Lotus 1-2-3 試算表 - - - - - - - - - - - - - - - - - Lotus Word Pro - - - - - - - - JET database - قاعدة بيانات JET - Baza źviestak JET - База от данни — JET - base de dades JET - Databáze JET - JET-database - JET-Datenbank - βάση δεδομένων JET - JET database - JET-datumbazo - base de datos JET - JET datu-basea - JET-tietokanta - JET dátustovnur - base de données JET - bunachar sonraí JET - base de datos JET - מסד נתונים JET - JET baza podataka - JET adatbázis - Basis data JET - Database JET - JET データベース - JET дерекқоры - JET 데이터베이스 - JET duomenų bazė - JET datubāze - JET-database - JET-gegevensbank - JET-database - Baza Danych JET - Banco de dados JET - Bază de date JET - база данных JET - Databáza JET - Podatkovna zbirka JET - Bazë me të dhëna JET - JET-databas - JET veritabanı - База даних JET - Cơ sở dữ liệu JET - JET 数据库 - JET 資料庫 - JET - Joint Engine Technology - - - - - - - - - - - - - - - Microsoft Cabinet archive - أرشيف Microsoft Cabinet - Архив — Microsoft Cabinet - arxiu Cabinet de Microsoft - Archiv Microsoft Cabinet - Microsoft Cabinet-arkiv - Microsoft-Cabinet-Archiv - συμπιεσμένο αρχείο Microsoft Cabinet - Microsoft Cabinet archive - archivador Microsoft Cabinet - Microsoft Cabinet artxiboa - Microsoft Cabinet -arkisto - Microsoft Cabinet skjalasavn - archive Cab Microsoft - cartlann Microsoft Cabinet - arquivo de Microsoft Cabinet - ארכיון CAB (מיקרוסופט) - Microsoft Cabinet arhiva - Microsoft Cabinet archívum - Arsip Microsoft Cabinet - Archivio Microsoft Cabinet - Microsoft Cabinet アーカイブ - Microsoft-ის Cabinet არქივი - Microsoft Cabinet архиві - 마이크로소프트 캐비닛 묶음 - Microsoft Cabinet archyvas - Microsoft kabineta arhīvs - Microsoft Cabinet-archief - Archiwum Microsoft Cabinet - Pacote do Microsoft Cabinet - Arhivă Microsoft Cabinet - архив Microsoft Cabinet - Archív Microsoft Cabinet - Datoteka arhiva Microsoft Cabinet - Microsoft Cabinet-arkiv - Microsoft Cabinet arşivi - архів Cabinet Microsoft - Kho lưu Cabinet Microsoft - Microsoft CAB 归档文件 - 微軟 Cabinet 封存檔 - - - - - - - - - Excel spreadsheet - جدول Excel - Raźlikovy akruš Excel - Таблица — Excel - full de càlcul d'Excel - Sešit Excel - Excelregneark - Excel-Tabelle - φύλλο εργασίας Excel - Excel spreadsheet - Excel-kalkultabelo - hoja de cálculo de Excel - Excel kalkulu-orria - Excel-taulukko - Excel rokniark - feuille de calcul Excel - scarbhileog Excel - folla de cálculo de Excel - גליון נתונים של אקסל - Excel proračunska tablica - Excel táblázat - Lembar sebar Excel - Foglio di calcolo Excel - Excel スプレッドシート - Excel-ის ცხრილი - Excel электрондық кестесі - 엑셀 스프레드시트 - Excel skaičialentė - Excel izklājlapa - Excel regneark - Excel-rekenblad - Excel-rekneark - Arkusz Excel - Planilha do Excel - Foaie de calcul Excel - электронная таблица Excel - Zošit Excel - Razpredelnica Microsoft Excel - Fletë llogaritje Excel - Excel-kalkylblad - ел. таблиця Excel - Bảng tính Excel - Microsoft Excel 工作簿 - Excel 試算表 - - - - - - - - - - - - - - - - - - Excel add-in - Приставка — Excel - complement d'Excel - Doplněk aplikace Excel - Excel-tilføjelse - Excel Add-in - πρόσθετο Excel - Excel add-in - Complemento de Excel - Excel-lisäosa - complément Excel - complemento de Excel - תוסף של Excel - Excel priključak - Excel bővítmény - Add-in Excel - Add-in Excel - Excel アドイン - Excel-ის დამატება - Excel қосымшасы - 엑셀 추가 기능 - Excel pievienojumprogramma - Excel add-in - Dodatek Excel - Suplemento do Excel - дополнение Excel - Vstavek Excel - додаток Excel - Excel 附加组件 - Excel 增益集 - - - - - - Excel 2007 binary spreadsheet - Таблица — Excel 2007, двоична - full de càlcul binari d'Excel 2007 - Binární formát sešitu Excel 2007 - Binært Excel 2007-regneark - Excel 2007-Tabelle (binär) - Excel 2007 binary spreadsheet - Hoja de cálculo de Excel 2007 - feuille de calcul binaire Excel 2007 - ficheiro binario de folla de cálculo Excel 2007 - גיליון נתונים בינרי של Excel 2007 - Excel 2007 binarna proračunska tablica - Excel 2007 bináris táblázat - Lembar kerja biner Excel 2007 - Foglio di calcolo binario Excel 2007 - Excel 2007 バイナリスプレッドシート - Excel 2007-ის ბინარული ცხრილი - Excel 2007 бинарды кестесі - 엑셀 2007 바이너리 스프레드시트 - Excel 2007 binārā izklājlapa - Excel 2007 binary spreadsheet - Binarny arkusz Excel 2007 - Planilha binária do Excel 2007 - двоичная электронная таблица Excel 2007 - Binarna preglednica Excel 2007 - бінарна електронна таблиця Excel 2007 - Excel 2007 二进制工作表 - Excel 2007 二進位試算表 - - - - - - Excel macro-enabled spreadsheet - Таблица — Excel, с макроси - full de càlcul amb macros d'Excel - Sešit Excel s podporou maker - Makro-aktiveret Excel-regneark - Excel-Tabelle mit aktivierten Makros - φύλο εργασίας Excel με ενεργοποιημένες μακροεντολές - Excel macro-enabled spreadsheet - Hoja de cálculo con macros activados de Excel - feuille de calcul Excel avec macros - folla de cálculo de Excel con macros activadas - גיליון נתונים עם תכונות מקרו פעילות של Excel - Excel proračunska tablica s omogućenim makro naredbama - Excel makrókat tartalmazó táblázat - Lembar kerja Excel dengan makro - Foglio di calcolo Excel con macro abilitate - Excel マクロ有効スプレッドシート - Excel-ის მაკროსიანი ცხრილი - макростары іске қосылған Excel кестесі - 엑셀 매크로 사용 스프레드시트 - Excel izklājlapa ar makrosiem - Excel macro-enabled spreadsheet - Arkusz z włączonymi makrami Excel - Planilha do Excel com macro ativada - электронная таблица Excel с включёнными макросами - Preglednica Excel z omogočenimi makri - електронна таблиця Excel з увімкненими макросами - Excel 启用宏的工作表 - Excel 巨集啟用試算表 - - - - - - Excel macro-enabled spreadsheet template - Шаблон за таблици — Excel, с макроси - plantilla de full de càlcul amb macros d'Excel - Šablona sešitu Excel s podporou maker - Makro-aktiveret Excel-regnearksskabelon - Excel-Tabellenvorlage mit aktivierten Makros - πρότυπο φύλλο εργασίας Excel με ενεργοποιημένες μακροεντολές - Excel macro-enabled spreadsheet template - Plantilla de hoja de cálculo con macros activados de Excel - modèle de feuille de calcul Excel avec macros - modelo de folla de cálculo de Excel con macros activadas - תבנית של גיליון נתונים עם תכונות מקרו פעילות של Excel - Excel predložak proračunske tablice s omogućenim makro naredbama - Excel makrókat tartalmazó táblázatsablon - Templat lembar kerja Excel dengan makro - Modello foglio di calcolo Excel con macro abilitate - Excel マクロ有効スプレッドシートテンプレート - Excel-ის მაკროსიანი ცხრილის შაბლონი - макростары іске қосылған Excel кестесінің үлгісі - 엑셀 매크로 사용 스프레드시트 서식 - Excel izklājlapas ar makrosiem veidne - Excel macro-enabled spreadsheet sjabloon - Szablon arkusza z włączonymi makrami Excel - Módulo de planilha do Excel com macro ativada - шаблон электронной таблицы Excel с включёнными макросами - Predloga preglednice Excel z omogočenimi makri - шаблон електронної таблиці Excel з увімкненими макросами - Excel 启用宏的工作表模板 - Excel 巨集啟用試算表範本 - - - - - - PowerPoint presentation - عرض تقديمي PowerPoint - Prezentacyja PowerPoint - Презентация — PowerPoint - presentació de PowerPoint - Prezentace PowerPoint - PowerPoint-præsentation - PowerPoint-Präsentation - παρουσίαση PowerPoint - PowerPoint presentation - PowerPoint-prezentaĵo - presentación de PowerPoint - PowerPoint aurkezpena - PowerPoint-esitys - PowerPoint framløga - présentation PowerPoint - láithreoireacht PowerPoint - presentación de PowerPoint - מצגת PowerPoint - PowerPoint prezentacija - PowerPoint prezentáció - Presentasi PowerPoint - Presentazione PowerPoint - PowerPoint プレゼンテーション - PowerPoint презентациясы - 파워포인트 프리젠테이션 - PowerPoint pateiktis - PowerPoint prezentācija - PowerPoint-presentasjon - PowerPoint-presentatie - PowerPoint-presentasjon - Prezentacja PowerPoint - Apresentação do PowerPoint - Prezentare PowerPoint - презентация PowerPoint - Prezentácia PowerPoint - Predstavitev Microsoft PowerPoint - Prezantim PowerPoint - PowerPoint-presentation - презентація PowerPoint - Trình diễn PowerPoint - Microsoft PowerPoint 演示文稿 - PowerPoint 簡報 - - - - - - - - - - - PowerPoint add-in - Приставка — PowerPoint - complement de - Doplněk PowerPoint - PowerPoint-tilføjelse - PowerPoint Add-in - πρόσθετο PowerPoint - PowerPoint add-in - Complemento de PowerPoint - PowerPoint-lisäosa - complément PowerPoint - complemento de PowerPoint - תוסף של PowerPoint - PowerPoint priključak - PowerPoint bővítmény - Add-in PowerPoint - Add-in PowerPoint - PowerPoint アドイン - PowerPoint-ის დამატება - PowerPoint қосымшасы - 파워포인트 추가 기능 - PowerPoint pievienojumprogramma - PowerPoint add-in - Dodatek PowerPoint - Suplemento do PowerPoint - дополнение PowerPoint - Vstavek PowerPoint - додаток PowerPoint - PowerPoint 附加组件 - PowerPoint 增益集 - - - - - PowerPoint macro-enabled presentation - Презентация — PowerPoint, с макроси - presentació amb macros - Prezentace PowerPoint s podporou maker - Makro-aktiveret PowerPoint-præsentation - PowerPoint-Präsentation mit aktivierten Makros - παρουσίαση PowerPoint με ενεργοποιημένες μακροεντολές - PowerPoint macro-enabled presentation - Presentación con macros activadas de PowerPoint - présentation PowerPoint avec macros - presentación con macros activadas de PowerPoint - מצגת של PowerPoint בעלת תכונות מקרו פעילות - PowerPoint prezentacija s omogućenim makro naredbama - PowerPoint makrókat tartalmazó bemutató - Presentasi PowerPoint dengan makro - Presentazione PowerPoint con macro abilitate - PowerPoint マクロ有効プレゼンテーション - PowerPoint-ის მაკროსიანი პრეზენტაცია - макростары іске қосылған PowerPoint презентациясы - 파워포인트 매크로 사용 프리젠테이션 - PowerPoint prezentācija ar makrosiem - PowerPoint macro-enabled presentatie - Prezentacja z włączonymi makrami PowerPoint - Apresentação do PowerPoint com macro ativada - презентация PowerPoint с включёнными макросами - Predstavitev PowerPoint z omogočenimi makri - презентація PowerPoint з увімкненими макросами - PowerPoint 启用宏的演示文稿 - PowerPoint 巨集啟用簡報 - - - - - - PowerPoint macro-enabled slide - Кадър — PowerPoint, с макроси - dispositiva amb macros - Snímek PowerPoint s podporou maker - Makro-aktiveret PowerPoint-slide - PowerPoint-Folie mit aktivierten Makros - σλάιντ PowerPoint με ενεργοποιημένες μακροεντολές - PowerPoint macro-enabled slide - Diapositiva con macros activadas de PowerPoint - diapositive PowerPoint avec macros - Diapositiva con macros activadas de Powerpoint - שקופית של PowerPoint בעלת תכונות מקרו פעילות - PowerPoint slajd s omogućenim makro naredbama - PowerPoint makrókat tartalmazó dia - Slide PowerPoint dengan makro - Diapositiva PowerPoint con macro abilitate - PowerPoint マクロ有効スライド - PowerPoint-ის მაკროსიანი სლაიდი - макростары іске қосылған PowerPoint слайды - 파워포인트 매크로 사용 슬라이드 - PowerPoint slaids ar makrosiem - PowerPoint macro-enabled dia - Slajd z włączonymi makrami PowerPoint - Slide do PowerPoint com macro ativada - слайд PowerPoint с включёнными макросами - Prosojnica PowerPoint z omogočenimi makri - слайд PowerPoint з увімкненими макросами - PowerPoint 启用宏的幻灯片 - PowerPoint 巨集啟用投影片 - - - - - - PowerPoint macro-enabled presentation - Презентация — PowerPoint, с макроси - presentació amb macros - Prezentace PowerPoint s podporou maker - Makro-aktiveret PowerPoint-præsentation - PowerPoint-Präsentation mit aktivierten Makros - παρουσίαση PowerPoint με ενεργοποιημένες μακροεντολές - PowerPoint macro-enabled presentation - Presentación con macros activadas de PowerPoint - présentation PowerPoint avec macros - presentación con macros activadas de PowerPoint - מצגת של PowerPoint בעלת תכונות מקרו פעילות - PowerPoint prezentacija s omogućenim makro naredbama - PowerPoint makrókat tartalmazó bemutató - Presentasi PowerPoint dengan makro - Presentazione PowerPoint con macro abilitate - PowerPoint マクロ有効プレゼンテーション - PowerPoint-ის მაკროსიანი პრეზენტაცია - макростары іске қосылған PowerPoint презентациясы - 파워포인트 매크로 사용 프리젠테이션 - PowerPoint prezentācija ar makrosiem - PowerPoint macro-enabled presentatie - Prezentacja z włączonymi makrami PowerPoint - Apresentação do PowerPoint com macro ativada - презентация PowerPoint с включёнными макросами - Predstavitev PowerPoint z omogočenimi makri - презентація PowerPoint з увімкненими макросами - PowerPoint 启用宏的演示文稿 - PowerPoint 巨集啟用簡報 - - - - - - PowerPoint macro-enabled presentation template - Шаблон за презентации — PowerPoint, с макроси - plantilla de presentació amb macros - Šablona prezentace PowerPoint s podporou maker - Makro-aktiveret PowerPoint-præsentationsskabelon - PowerPoint-Präsentationsvorlage mit aktivierten Makros - πρότυπη παρουσίαση PowerPoint με ενεργοποιημένες μακροεντολές - PowerPoint macro-enabled presentation template - Plantilla de presentación con macros activadas de PowerPoint - modèle de présentation PowerPoint avec macros - modelo de presentación con macros activadas de PowerPoint - תבנית של מצגת של PowerPoint בעלת תכונות מקרו פעילות - PowerPoint predložak prezentacije s omogućenim makro naredbama - PowerPoint makrókat tartalmazó bemutatósablon - Templat presentasi PowerPoint dengan makro - Modello presentazione PowerPoint con macro abilitate - PowerPoint マクロ有効プレゼンテーションテンプレート - PowerPoint-ის მაკროსიანი პრეზენტაციის შაბლონი - макростары іске қосылған PowerPoint презентациясының үлгісі - 파워포인트 매크로 사용 프리젠테이션 서식 - PowerPoint prezentācijas ar makrosiem veidne - PowerPoint macro-enabled presentatie-sjabloon - Szablon prezentacji z włączonymi makrami PowerPoint - Modelo de apresentação do PowerPoint com macro ativada - шаблон презентации PowerPoint с включёнными макросами - Predloga predstavitve PowerPoint z omogočenimi makri - шаблон презентації PowerPoint з увімкненими макросами - PowerPoint 启用宏的演示文稿模板 - PowerPoint 巨集啟用簡報範本 - - - - - - Word macro-enabled document - Документ — Word, с макроси - document amb macros de Word - Dokument Word s podporou maker - Makro-aktiveret Word-dokument - Word-Dokument mit aktivierten Makros - έγγραφο Word με ενεργοποιημένες μακροεντολές - Word macro-enabled document - Documento con macros activadas de Word - document Word avec macros - documento con macros activadas de Word - מסמך של Word בעל תכונות מקרו פעילות - Word dokument s omogućenim makro naredbama - Word makrókat tartalmazó dokumentum - Dokumen Word dengan makro - Documento Word con macro abilitate - Word マクロ有効文書 - Word-ის მაკროსიანი დოკუმენტი - макростары іске қосылған Word құжаты - 워드 매크로 사용 문서 - Word dokuments ar makrosiem - Word macro-enabled document - Dokument z włączonymi makrami Word - Documento do Word com macro ativada - документ Word с включёнными макросами - Dokument Word z omogočenimi makri - документ Word з увімкненими макросами - Word 启用宏的文档 - Word 巨集啟用文件 - - - - - - Word macro-enabled document template - Шаблон за документи — Word, с макроси - plantilla de document amb macros de Word - Šablona dokumentu Word s podporou maker - Makro-aktiveret Word-dokumentskabelon - Word-Dokumentvorlage mit aktivierten Makros - πρότυπο έγγραφο Word με ενεργοποιημένες μακροεντολές - Word macro-enabled document template - Plantilla de documento con macros activadas de Word - modèle de document Word avec macros - Plantilla de documento con macros activadas de Word - תבנית של מסמך של Word בעל תכונות מקרו פעילות - Word predložak dokumenta s omogućenim makro naredbama - Word makrókat tartalmazó dokumentumsablon - Templat dokumen Word dengan makro - Modello documento Word con macro abilitate - Word マクロ有効文書テンプレート - Word-ის მაკროსიანი დოკუმენტის შაბლონი - макростары іске қосылған Word құжатының үлгісі - 워드 매크로 사용 문서 서식 - Word dokumenta ar makrosiem veidne - Word macro-enabled document sjabloon - Szablon dokumentu z włączonymi makrami Word - Modelo de documento do Word com macro ativada - шаблон документа Word с включёнными макросами - Predloga dokumenta Word z omogočenimi makri - шаблон документа Word з увімкненими макросами - Word 启用宏的文档模板 - Word 巨集啟用文件範本 - - - - - - XPS document - مستند XPS - Dakument XPS - Документ — XPS - document XPS - Dokument XPS - XPS-dokument - XPS-Dokument - έγγραφο XPS - XPS document - XPS-dokumento - documento XPS - XPS dokumentua - XPS-asiakirja - XPS skjal - document XPS - cáipéis XPS - documento XPS - מסמך XPS - XPS dokument - XPS dokumentum - Dokumen XPS - Documento XPS - XPS ドキュメント - XPS құжаты - XPS 문서 - XPS dokumentas - XPS dokuments - XPS-dokument - XPS-document - XPS-dokument - Dokument XPS - Documento XPS - Document XPS - документ XPS - Dokument XPS - Dokument XPS - Dokument XPS - XPS-dokument - документ XPS - Tài liệu XPS - XPS 文档 - XPS 文件 - XPS - Open XML Paper Specification - - - - - - - - Microsoft Works document - مستند Microsoft Works - Dakument Microsoft Works - Документ — Microsoft Works - document Works de Microsoft - Dokument Microsoft Works - Microsoft Works-dokument - Microsoft-Works-Dokument - έγγραφο Microsoft Works - Microsoft Works document - documento de Microsoft Works - Microsoft Works dokumentua - Microsoft Works -asiakirja - Microsoft Works skjal - document Microsoft Works - cáipéis Microsoft Works - documento de Microsoft Works - מסמך Microsoft Works - Microsoft Works dokument - Microsoft Works dokumentum - Dokumen Microsoft Works - Documento Microsoft Works - Microsoft Works ドキュメント - Microsoft Works-ის დოკუმენტი - Microsoft Works құжаты - 마이크로소프트 Works 문서 - Microsoft Works dokumentas - Microsoft Works dokuments - Microsoft Works-dokument - Microsoft Works-document - Microsoft Works-dokument - Dokument Microsoft Works - Documento do Microsoft Works - Document Microsoft Works - документ Microsoft Works - Dokument Microsoft Works - Dokument Microsoft Works - Dokument Microsoft Works - Microsoft Works-dokument - Microsoft Works belgesi - документ Microsoft Works - Tài liệu Microsoft Works - Microsoft Works 文档 - 微軟 Works 文件 - - - - - - - - - - Microsoft Visio document - Документ — Microsoft Visio - document Visio de Microsoft - Microsoft Visio-dokument - Microsoft Visio-Dokument - έγγραφο Microsoft Visio - Microsoft Visio document - documento de Microsoft Visio - Microsoft Visio -asiakirja - document Microsoft Visio - Documento de Microsoft Visio - מסמך - Microsoft Visio dokument - Microsoft Visio dokumentum - Dokumen Microsoft Visio - Documento Microsoft Visio - Microsoft Visio ドキュメント - Microsoft Visio-ის დოკუმენტი - Microsoft Visio құжаты - 마이크로소프트 Visio 문서 - Microsoft Visio dokuments - Microsoft Visio document - Dokument Microsoft Visio - Documento do Microsoft Visio - документ Microsoft Visio - Dokument Microsoft Visio - документ Microsoft Visio - Microsoft Visio 文档 - Microsoft Visio文件 - - - - - - - - - Word document - مستند Word - Dakument Word - Документ — Word - document de Word - Dokument Word - Worddokument - Word-Dokument - έγγραφο Word - Word document - Word-dokumento - documento de Word - Word dokumentua - Word-asiakirja - Word skjal - document Word - cáipéis Word - documento de Word - מסמך Word - Word dokument - Word dokumentum - Dokumen Word - Documento Word - Word ドキュメント - Word құжаты - 워드 문서 - Word dokumentas - Word dokuments - Word-dokument - Word-document - Word-dokument - Dokument Word - Documento do Word - Document Word - документ Word - Dokument Word - Dokument Word - Dokument Word - Word-dokument - документ Word - Tài liệu Word - Microsoft Word 文档 - Word 文件 - - - - - - - - - - - - - - - - - - - - Word template - قالب Word - Šablon Word - Шаблон за документи — Word - plantilla de Word - Šablona Word - Wordskabelon - Word-Vorlage - πρότυπο έγγραφο Word - Word template - Word-ŝablono - plantilla de Word - Word txantiloia - Word-malli - Word formur - modèle Word - teimpléad Word - Plantilla de Word - תבנית Word - Word predložak - Word sablon - Templat Word - Modello Word - Word テンプレート - Word үлгісі - 워드 서식 - Word šablonas - Word veidne - Word-mal - Word-sjabloon - Word-mal - Szablon Word - Modelo do Word - Șablon Word - шаблон Word - Šablóna Word - Predloga dokumenta Microsoft Word - Model Word - Word-mall - шаблон Word - Mẫu Word - Word 模板 - Word 範本 - - - - - - GML document - GML - Geography Markup Language - - - - - - GNUnet search file - ملف بحث GNUnet - fajł pošuku GNUnet - Указател за търсене — GNUnet - fitxer de cerca GNUnet - Vyhledávací soubor GNUnet - GNunet-søgefil - GNUnet-Suchdatei - αρχείο αναζήτησης GNUnet - GNUnet search file - archivo de búsqueda GNUnet - GNUnet bilaketako fitxategia - GNUnet-hakutiedosto - GNUnet leitifíla - fichier de recherche GNUnet - comhad cuardaigh GNUnet - ficheiro de busca de GNUnet - קובץ חיפוש של GNUnet - GNUnet datoteka pretrage - GNUnet keresési fájl - Berkas telusur GNUnet - File ricerca GNUnet - GNUnet 検索ファイル - GNUnet ძებნის ფაილი - GNUnet іздеу файлы - GNUnet 검색 파일 - GNUnet paieškos failas - GNUnet meklēšanas datne - GNUnet søkefil - GNUnet-zoekbestand - GNUnet-søkjefil - Plik wyszukiwania GNUnet - Arquivo de pesquisa do GNUnet - Fișier căutare GNUnet - файл поиска GNUnet - Vyhľadávací súbor GNUnet - Iskalna datoteka GNUnet - File kërkimi GNUnet - GNUnet-sökfil - файл пошуку GNUnet - Tập tin tìm kiếm GNUnet - GNUnet 搜索文件 - GNUnet 搜尋檔案 - - - - - - - TNEF message - رسالة TNEF - List TNEF - Съобщение — TNEF - missatge TNEF - Zpráva TNEF - TNEF-meddelelse - TNEF-Nachricht - μήνυμα TNEF - TNEF message - mensaje TNEF - TNEF mezua - TNEF-viesti - TNEF boð - message TNEF - teachtaireacht TNEF - mensaxe TNEF - הודעת TNEF - TNEF poruka - TNEF üzenet - Pesan TNEF - Messaggio TNEF - TNEF メッセージ - TNEF мәлімдемесі - TNEF 메시지 - TNEF žinutė - TNEF ziņojums - TNEF-melding - TNEF-bericht - TNEF-melding - Wiadomość TNEF - Mensagem TNEF - Mesaj TNEF - сообщение TNEF - Správa TNEF - Datoteka sporočila TNEF - Mesazh TNEF - TNEF-meddelande - повідомлення TNEF - Thông điệp TNEF - TNEF 信件 - TNEF 訊息 - TNEF - Transport Neutral Encapsulation Format - - - - - - - - - - StarCalc spreadsheet - جدول StarCalc - StarCalc hesab cədvəli - Raźlikovy arkuš StarCalc - Таблица — StarCalc - full de càlcul de StarCalc - Sešit StarCalc - Taenlen StarCalc - StarCalc-regneark - StarCalc-Tabelle - λογιστικό φύλλο StarCalc - StarCalc spreadsheet - StarCalc-kalkultabelo - hoja de cálculo de StarCalc - StarCalc kalkulu-orria - StarCalc-taulukko - StarCalc rokniark - feuille de calcul StarCalc - scarbhileog StarCalc - folla de cálculo de StarCalc - גליון נתונים של StarCalc - StarCalc proračunska tablica - StarCalc-munkafüzet - Lembar sebar StarCalc - Foglio di calcolo StarCalc - StarCalc スプレッドシート - StarCalc электрондық кестесі - StarCalc 스프레드시트 - StarCalc skaičialentė - StarCalc izklājlapa - Hamparan StarCalc - StarCalc-regneark - StarCalc-rekenblad - StarCalc-rekneark - Arkusz StarCalc - folha de cálculo do StarCalc - Planilha do StarCalc - Foaie de calcul StarCalc - электронная таблица StarCalc - Zošit StarCalc - Preglednica StarCalc - Fletë llogaritjesh StarCalc - StarCalc табеларни прорачун - StarCalc-kalkylblad - ел. таблиця StarCalc - Bảng tính StarCalc - STarCalc 工作簿 - StarCalc 試算表 - - - - - StarChart chart - مخطط StarChart - StarChart cədvəli - Dyjahrama StarChart - Диаграма — StarChart - diagrama de StarChart - Graf StarChart - Siart StarChart - StarChart-diagram - StarChart-Diagramm - γράφημα StarChart - StarChart chart - StarChart-diagramo - gráfica de StarChart - StarChart diagrama - StarChart-kaavio - StarChart strikumynd - graphique StarChart - cairt StarChart - gráfica de StarChart - טבלה של StarChart - StarChart grafikon - StarChart-grafikon - Bagan StarChart - Grafico StarChart - StarChart チャート - StarChart диаграммасы - StarCalc 표 - StarChart diagrama - StarChart diagramma - Carta StarChart - StarChart graf - StarChart-kaart - StarChart-graf - Wykres StarChart - gráfico do StarChart - Gráfico do StarChart - Diagramă StarChart - диаграмма StarChart - Graf StarChart - Datoteka grafikona StarChart - Grafik StarChart - StarChart графикон - StarChart-diagram - діаграма StarChart - Đồ thị StarChart - STarChart 图表 - StarChart 圖表 - - - - - StarDraw drawing - تصميم StarDraw - StarDraw çəkimi - Rysunak StarDraw - Чертеж — StarDraw - dibuix de StarDraw - Kresba StarDraw - Darlun StarDraw - StarDraw-tegning - StarDraw-Zeichnung - σχέδιο StarDraw - StarDraw drawing - StarDraw-grafikaĵo - dibujo de StarDraw - StarDraw marrazkia - StarDraw-piirros - StarDraw tekning - dessin StarDraw - líníocht StarDraw - debuxo de StarDraw - ציור של StarDrawing - StarDraw crtež - StarDraw-rajz - Gambar StarDraw - Disegno StarDraw - StarDraw ドロー - StarDraw суреті - StarCalc 드로잉 - StarDraw piešinys - StarDraw zīmējums - Lukisan StarDraw - StarDraw tegning - StarDraw-tekening - StarDraw-teikning - Rysunek StarDraw - desenho do StarDraw - Desenho do StarDraw - Desen StarDraw - изображение StarDraw - Kresba StarDraw - Datoteka risbe StarDraw - Vizatim StarDraw - StarDraw drawing - StarDraw-teckning - малюнок StarDraw - Bản vẽ StarDraw - STarDraw 绘图 - StarDraw 繪圖 - - - - - StarImpress presentation - عرض تقديمي StarImpress - StarImpress təqdimatı - Prezentacyja StarImpress - Презентация — StarImpress - presentació de StarImpress - Prezentace StarImpress - Cyflwyniad StarImpress - StarImpress-præsentation - StarImpress-Präsentation - παρουσίαση StarImpress - StarImpress presentation - StarImpress-prezentaĵo - presentación de StarImpress - StarImpress aurkezpena - StarImpress-esitys - StarImpress framløga - présentation StarImpress - láithreoireacht StarImpress - presentación de StarImpress - מצגת של StarImpress - StarImpress prezentacija - StarImpress-bemutató - Presentasi StarImpress - Presentazione StarImpress - StarImpress プレゼンテーション - StarImpress презентациясы - StarImpress 프리젠테이션 - StarImpress pateiktis - StarImpress prezentācija - Persembahan StarImpress - StarImpress-presentasjon - StarImpress-presentatie - StarImpress-presentasjon - Prezentacja StarImpress - apresentação do StarImpress - Apresentação do StarImpress - Prezentare StarImpress - презентация StarImpress - Prezentácia StarImpress - Predstavitev StarImpress - Prezantim StarImpress - StarImpress презентација - StarImpress-presentation - презентація StarImpress - Trình diễn StarImpress - STarImpress 演示文稿 - StarImpress 簡報檔 - - - - - - StarMail email - بريد StarMail الإلكتروني - Email StarMail - Електронно писмо — StarMail - correu electrònic de StarMail - E-mail StarMail - StarMail-e-brev - StarMail-E-Mail - ηλ. μήνυμα StarMail - StarMail email - StarMail-retpoŝto - correo electrónico de StarMail - StarMail helb.el. - StarMail-sähköposti - StarMail t-postur - courriel StarMail - ríomhphost StarMail - Correo electrónico de StarMail - דוא"ל של StarMail - StarMail e-pošta - StarMail e-mail - Email StarMail - Email StarMail - StarMail メール - StarMail электрондық хаты - StarMail 전자우편 - StarMail el. laiškas - StarMail epasts - Emel StarMail - StarMail-melding - StarMail-e-mail - StarMail-fil - E-Mail StarMail - e-mail do StarMail - E-mail do StarMail - Email StarEmail - электронное письмо StarMail - E-mail StarMail - Datoteka pošte StarMail - Mesazh StarMail - StarMail пошта - StarMail-e-post - поштове повідомлення StarMail - Thư điện tử StarMail - STarMail 电子邮件 - StarMail 郵件 - - - - StarMath formula - صيغة StarMath - Formuła StarMath - Формула — StarMath - fórmula de StarMath - Vzorec StarMath - StarMath-formel - StarMath-Formel - μαθηματικός τύπος StarMath - StarMath formula - StarMath-formulo - fórmula de StarMath - StarMath formula - StarMath-kaava - StarMath frymil - formule StarMath - foirmle StarMath - fórmula de StarMath - נוסחה של StarMath - StarMath formula - StarMath-képlet - Formula StarMath - Formula StarMath - StarMath 計算式 - StarMath формуласы - StarMath 수식 - StarMath formulė - StarMath formula - Formula StarMath - StarMath-formel - StarMath-formule - StarMath-formel - Formuła StarMath - fórmula do StarMath - Fórmula do StarMath - Formulă StarMath - формула StarMath - Vzorec StarMath - Datoteka formule StarMath - Formulë StarMath - StarMath формула - StarMath-formel - формула StarMath - Công thức StarMath - STarMath 公式 - StarMath 公式 - - - - - StarWriter document - مستند StarWriter - StarWriter sənədi - Dakument StarWriter - Документ — StarWriter - document de StarWriter - Dokument StarWriter - Dogfen StarWriter - StarWriter-dokument - StarWriter-Dokument - έγγραφο StarWriter - StarWriter document - StarWriter-dokumento - documento de StarWriter - StarWriter dokumentua - StarWriter-asiakirja - StarWriter skjal - document StarWriter - cáipéis StarWriter - documento de StarWriter - מסמך של StarWriter - StarWriter dokument - StarWriter-dokumentum - Dokumen StarWriter - Documento StrarWriter - StarWriter ドキュメント - StarWriter құжаты - StarWriter 문서 - StarWriter dokumentas - StarWriter dokuments - Dokumen StarWriter - StarWriter-dokument - StarWriter-document - StarWriter document - Dokument StarWriter - documento do StarWriter - Documento do StarWriter - Document StarWriter - документ StarWriter - Dokument StarWriter - Dokument StarWriter - Dokument StarWriter - StarWriter документ - StarWriter-dokument - StarWriter belgesi - документ StarWriter - Tài liệu StarWriter - STarWriter 文档 - StarWriter 文件 - - - - - - - - - - OpenOffice Calc spreadsheet - جدول Calc المكتب المفتوح - Raźlikovy arkuš OpenOffice Calc - Таблица — OpenOffice Calc - full de càlcul d'OpenOffice Calc - Sešit OpenOffice Calc - OpenOffice Calc-regneark - OpenOffice-Calc-Tabelle - φύλλο εργασίας OpenOffice Calc - OpenOffice Calc spreadsheet - hoja de cálculo de OpenOffice Calc - OpenOffice.org Calc kalkulu-orria - OpenOffice Calc -taulukko - OpenOffice Calc rokniark - feuille de calcul OpenOffice Calc - scarbhileog OpenOffice Calc - folla de cálculo de OpenOffice Calc - גליון נתונים של OpenOffice Calc - OpenOffice Calc táblázat - Lembar sebar OpenOffice Calc - Foglio di calcolo OpenOffice Calc - OpenOffice Calc スプレッドシート - OpenOffice Calc-ის ცხრილი - OpenOffice Calc электрондық кестесі - OpenOffice Calc 스프레드시트 - OpenOffice Calc skaičialentė - OpenOffice Calc izklājlapa - OpenOffice Calc-regneark - OpenOffice.org Calc-rekenblad - OpenOffice Calc-rekneark - Arkusz kalkulacyjny OpenOffice.org Calc - Planilha do OpenOffice Calc - Foaie de calcul OpenOffice Calc - электронная таблица OpenOffice Calc - Zošit OpenOffice Calc - Razpredelnica OpenOffice.org Calc - Fletë llogaritjesh OpenOffice Calc - OpenOffice Calc-kalkylblad - ел. таблиця OpenOffice Calc - Bảng tính Calc của OpenOffice.org - OpenOffice.org Calc 工作簿 - OpenOffice Calc 試算表 - - - - - - - - - - - - - OpenOffice Calc template - قالب Calc المكتب المفتوح - Šablon OpenOffice Calc - Шаблон за таблици — OpenOffice Calc - plantilla d'OpenOffice Calc - Šablona OpenOffice Calc - OpenOffice Calc-skabelon - OpenOffice-Calc-Vorlage - πρότυπο OpenOffice Calc - OpenOffice Calc template - plantilla de OpenOffice Calc - OpenOffice Calc txantiloia - OpenOffice Calc -malli - OpenOffice Calc formur - modèle OpenOffice Calc - teimpléad OpenOffice Calc - modelo de OpenOffice Calc - תבנית של OpenOffice Calc - OpenOffice Calc sablon - Templat OpenOffice Calc - Modello OpenOffice Calc - OpenOffice Calc テンプレート - OpenOffice Calc-ის შაბლონი - OpenOffice Calc үлгісі - OpenOffice Calc 스프레드시트 문서 서식 - OpenOffice Calc šablonas - OpenOffice Calc veidne - OpenOffice Calc-mal - OpenOffice.org Calc-sjabloon - OpenOffice Calc-mal - Szablon arkusza OpenOffice.org Calc - Modelo do OpenOffice Calc - Șablon OpenOffice Calc - шаблон OpenOffice Calc - Šablóna OpenOffice Calc - Predloga OpenOffice.org Calc - Model OpenOffice Calc - OpenOffice Calc-mall - шаблон ел.таблиці OpenOffice Calc - Mẫu bảng tính Calc của OpenOffice.org - OpenOffice.org Calc 工作簿模板 - OpenOffice Calc 範本 - - - - - - - - - - - - - OpenOffice Draw drawing - تصميم Draw المكتب المفتوح - Rysunak OpenOffice Draw - Чертеж — OpenOffice Draw - dibuix d'OpenOffice Draw - Kresba OpenOffice Draw - OpenOffice Draw-tegning - OpenOffice-Draw-Zeichnung - σχέδιο OpenOffice Draw - OpenOffice Draw drawing - dibujo de OpenOffice Draw - OpenOffice.org Draw marrazkia - OpenOffice Draw -piirros - OpenOffice Draw tekning - dessin OpenOffice Draw - líníocht OpenOffice Draw - debuxo de OpenOffice Draw - ציור של OpenOffice Draw - OpenOffice Draw rajz - Gambar OpenOffice Draw - Disegno OpenOffice Draw - OpenOffice Draw ドロー - OpenOffice Draw-ის ნახაზი - OpenOffice Draw суреті - OpenOffice Draw 그림 - OpenOffice Draw piešinys - OpenOffice Draw zīmējums - OpenOffice Draw-tegning - OpenOffice.org Draw-tekening - OpenOffice Draw-teikning - Rysunek OpenOffice.org Draw - Desenho do OpenOffice Draw - Desen OpenOffice Draw - изображение OpenOffice Draw - Kresba OpenOffice Draw - Datoteka risbe OpenOffice.org Draw - Vizatim OpenOffice Draw - OpenOffice Draw-teckning - малюнок OpenOffice Draw - Bản vẽ Draw của OpenOffice.org - OpenOffice.org Draw 绘图 - OpenOffice Draw 繪圖 - - - - - - - - - - - - - OpenOffice Draw template - قالب Draw المكتب المفتوح - Šablon OpenOffice Draw - Шаблон за чертежи — OpenOffice Draw - plantilla d'OpenOffice Draw - Šablona OpenOffice Draw - OpenOffice Draw-skabelon - OpenOffice-Draw-Vorlage - πρότυπο OpenOffice Draw - OpenOffice Draw template - plantilla de OpenOffice.org Draw - OpenOffice Draw txantiloia - OpenOffice Draw -malli - OpenOffice Draw formur - modèle OpenOffice Draw - teimpléad OpenOffice Draw - modelo de OpenOffice Draw - תבנית של OpenOffice Draw - OpenOffice Draw sablon - Templat OpenOffice Draw - Modello OpenOffice Draw - OpenOffice Draw テンプレート - OpenOffice Draw-ის შაბლონი - OpenOffice Draw үлгісі - OpenOffice Draw 그림 문서 서식 - OpenOffice Draw šablonas - OpenOffice Draw veidne - OpenOffice Draw-mal - OpenOffice.org Draw-sjabloon - OpenOffice Draw-mal - Szablon rysunku OpenOffice.org Draw - Modelo do OpenOffice Draw - Șablon OpenOffice Draw - шаблон OpenOffice Draw - Šablóna OpenOffice Draw - Predloga OpenOffice.org Draw - Model OpenOffice Draw - OpenOffice Draw-mall - шаблон малюнку OpenOffice Draw - Mẫu bản vẽ Draw của OpenOffice.org - OpenOffice.org Draw 绘图模板 - OpenOffice Draw 範本 - - - - - - - - - - - - - OpenOffice Impress presentation - عرض تقديمي Impress المكتب المفتوح - OpenOffice Impress sənədi - Prezentacyja OpenOffice Impress - Презентация — OpenOffice Impress - presentació d'OpenOffice Impress - Prezentace OpenOffice Impress - Cyflwyniad OpenOffice (Impress) - OpenOffice Impress-præsentation - OpenOffice-Impress-Vorlage - παρουσίαση OpenOffice Impress - OpenOffice Impress presentation - presentación de OpenOffice Impress - OpenOffice.org Impress aurkezpena - OpenOffice Impress -esitys - OpenOffice Impress framløga - présentation OpenOffice Impress - láithreoireacht OpenOffice Impress - presentación de de OpenOffice Impress - מצגת של OpenOffice Impress - OpenOffice Impress bemutató - Presentasi OpenOffice Impress - Presentazione OpenOffice Impress - OpenOffice Impress プレゼンテーション - OpenOffice Impress-ის პრეზენტაცია - OpenOffice Impress презентациясы - OpenOffice Impress 프리젠테이션 - OpenOffice Impress pateiktis - OpenOffice Impress prezentācija - OpenOffice Impress-presentasjon - OpenOffice.org Impress-presentatie - OpenOffice Impress-presentasjon - Prezentacja OpenOffice.org Impress - Apresentação do OpenOffice Impress - Prezentare OpenOffice Impress - презентация OpenOffice Impress - Prezentácia OpenOffice Impress - Predstavitev OpenOffice.org Impress - Prezantim OpenOffice Impress - OpenOffice Impress-presentation - презентація OpenOffice Impress - Trình diễn Impress của OpenOffice.org - OpenOffice.org Impress 演示文稿 - OpenOffice Impress 簡報 - - - - - - - - - - - - - OpenOffice Impress template - قالب Impress المكتب المفتوح - Šablon OpenOffice Impress - Шаблон за презентации — OpenOffice Impress - plantilla d'OpenOffice Impress - Šablona OpenOffice Impress - OpenOffice Impress-skabelon - OpenOffice-Impress-Vorlage - πρότυπο OpenOffice Impress - OpenOffice Impress template - plantilla de OpenOffice Impress - OpenOffice Impress txantiloia - OpenOffice Impress -malli - OpenOffice Impress formur - modèle OpenOffice Impress - teimpléad OpenOffice Impress - modelo de OpenOffice Impress - תבנית של OpenOffice Impress - OpenOffice Impress sablon - Templat OpenOffice Impress - Modello OpenOffice Impress - OpenOffice Impress テンプレート - OpenOffice Impress-ის შაბლონი - OpenOffice Impress үлгісі - OpenOffice Impress 프리젠테이션 문서 서식 - OpenOffice Impress šablonas - OpenOffice Impress veidne - OpenOffice Impress-mal - OpenOffice.org Impress-sjabloon - OpenOffice Impress-mal - Szablon prezentacji OpenOffice.org Impress - Modelo do OpenOffice Impress - Șablon OpenOffice Impress - шаблон OpenOffice Impress - Šablóna OpenOffice Impress - Predloga OpenOffice.org Impress - Model OpenOffice Impress - OpenOffice Impress-mall - шаблон презентації OpenOffice Impress - Mẫu trình diễn Impress của OpenOffice.org - OpenOffice.org Impress 演示文稿模板 - OpenOffice Impress 範本 - - - - - - - - - - - - - OpenOffice Math formula - صيغة Math المكتب المفتوح - Formuła OpenOffice Math - Формула — OpenOffice Math - fórmula d'OpenOffice Math - Vzorec OpenOffice Math - OpenOffice Math-formel - OpenOffice-Math-Formel - μαθηματικός τύπος OpenOffice Math - OpenOffice Math formula - fórmula de OpenOffice Math - OpenOffice.org Math formula - OpenOffice Math -kaava - OpenOffice Math frymil - formule OpenOffice Math - foirmle OpenOffice Math - fórmula de OpenOffice Math - נוסחה של OpenOffice Math - OpenOffice Math képlet - Formula OpenOffice Math - Formula OpenOffice Math - OpenOffice Math 計算式 - OpenOffice Math-ის ფორმულა - OpenOffice Math формуласы - OpenOffice Math 수식 - OpenOffice Math formulė - OpenOffice Math formula - OpenOffice Math-formel - OpenOffice.org Math-formule - OpenOffice Math-formel - Formuła OpenOffice.org Math - Fórmula do OpenOffice Math - Formulă OpenOffice Math - формула OpenOffice Math - Vzorec OpenOffice Math - Dokument formule OpenOffice.org Math - Formulë OpenOffice Math - OpenOffice Math-formel - OpenOffice Math formülü - формула OpenOffice Math - Công thức Math của OpenOffice.org - OpenOffice.org Math 公式 - OpenOffice Math 公式 - - - - - - - - - - - - - OpenOffice Writer document - مستند Writer المكتب المفتوح - OpenOffice Writer sənədi - Dakument OpenOffice Writer - Документ — OpenOffice Writer - document d'OpenOffice Writer - Dokument OpenOffice Writer - Dogfen OpenOffice (Writer) - OpenOffice Writer-dokument - OpenOffice-Writer-Dokument - έγγραφο OpenOffice Writer - OpenOffice Writer document - documento de OpenOffice Writer - OpenOffice.org Writer dokumentua - OpenOffice Writer -asiakirja - OpenOffice Writer skjal - document OpenOffice Writer - cáipéis OpenOffice Writer - documento de OpenOffice Writer - מסמך של OpenOffice Writer - OpenOffice Writer dokumentum - Dokumen OpenOffice Writer - Documento OpenOffice Writer - OpenOffice Writer ドキュメント - OpenOffice Writer-ის დოკუმენტი - OpenOffice Writer құжаты - OpenOffice Writer 문서 - OpenOffice Writer dokumentas - OpenOffice Writer dokuments - OpenOffice Writer-dokument - OpenOffice.org Writer-document - OpenOffice Writer-dokument - Dokument OpenOffice.org Writer - Documento do OpenOffice Writer - Document OpenOffice Writer - документ OpenOffice Writer - Dokument OpenOffice Writer - Dokument OpenOffice.org Writer - Dokument OpenOffice Writer - OpenOffice Writer-dokument - OpenOffice Writer belgesi - документ OpenOffice Writer - Tài liệu Writer của OpenOffice.org - OpenOffice.org Writer 文档 - OpenOffice Writer 文件 - - - - - - - - - - - - - OpenOffice Writer global document - مستند المكتب المفتوح Writer العالمي - OpenOffice Writer qlobal sənədi - Hlabalny dakument OpenOffice Writer - Документ - глобален — OpenOffice Writer - document global d'OpenOffice Writer - Globální dokument OpenOffice Writer - Dogfen eang OpenOffice (Writer) - OpenOffice Writer-globalt dokument - OpenOffice-Writer-Globaldokument - παγκόσμιο έγγραφο OpenOffice Writer - OpenOffice Writer global document - documento global de OpenOffice Writer - OpenOffice.org Writer dokumentu globala - OpenOffice Writer - yleinen asiakirja - OpenOffice Writer heiltøkt skjal - document global OpenOffice Writer - cáipéis chomhchoiteann OpenOffice Writer - documento global de OpenOffice Writer - מסמך גלובלי של OpenOffice Writer - OpenOffice Writer globális dokumentum - Dokumen global OpenOffice Writer - Documento globale OpenOffice Writer - OpenOffice Writer グローバルドキュメント - OpenOffice Writer-ის გლობალური დოკუმენტი - OpenOffice Writer негізгі құжаты - OpenOffice Writer 글로벌 문서 - OpenOffice Writer bendrinis dokumentas - OpenOffice Writer globālais dokuments - Global OpenOffice Writer globalt dokument - OpenOffice.org Writer-globaal-document - OpenOffice Writer globalt dokument - Globalny dokument OpenOffice.org Writer - Documento global do OpenOffice Writer - Document global OpenOffice Writer - основной документ OpenOffice Writer - Globálny dokument OpenOffice Writer - Splošni dokument OpenOffice.org Writer - Dokument i përgjithshëm OpenOffice Writer - OpenOffice Writer-globaldokument - загальний документ OpenOffice Writer - Tài liệu toàn cục Writer của OpenOffice.org - OpenOffice.org Writer 全局文档 - OpenOffice Writer 主控文件 - - - - - - - - - - - - - OpenOffice Writer template - قالب Writer المكتب المفتوح - OpenOffice Writer şablonu - Šablon OpenOffice Writer - Шаблон за документи — OpenOffice Writer - plantilla d'OpenOffice Writer - Šablona OpenOffice Writer - Templed OpenOffice (Writer) - OpenOffice Writer-skabelon - OpenOffice-Writer-Vorlage - πρότυπο OpenOffice Writer - OpenOffice Writer template - plantilla de OpenOffice Writer - OpenOffice Writer txantiloia - OpenOffice Writer -malli - OpenOffice Writer formur - modèle OpenOffice Writer - teimpléad OpenOffice Writer - modelo de OpenOffice Writer - תסנית של OpenOffice Writer - OpenOffice Writer sablon - Templat OpenOffice Writer - Modello OpenOffice Writer - OpenOffice Writer ドキュメントテンプレート - OpenOffice Writer-ის შაბლონი - OpenOffice Writer үлгісі - OpenOffice Writer 문서 서식 - OpenOffice Writer šablonas - OpenOffice Writer veidne - Templat OpenOffice Writer - OpenOffice Writer-mal - OpenOffice.org Writer-sjabloon - OpenOffice Writer-mal - Szablon dokumentu OpenOffice.org Writer - Modelo do OpenOffice Writer - Șablon OpenOffice Writer - шаблон OpenOffice Writer - Šablóna OpenOffice Writer - Predloga OpenOffice.org Writer - Model OpenOffice Writer - OpenOffice Writer-mall - шаблон документа OpenOffice Writer - Mẫu tài liệu Writer của OpenOffice.org - OpenOffice.org Writer 文档模板 - OpenOffice Writer 範本 - - - - - - - - - - - - - ODT document - مستند ODT - Dakument ODT - Документ — ODT - document ODT - Dokument ODT - ODT-dokument - ODT-Dokument - έγγραφο ODT - ODT document - ODT-dokumento - documento ODT - ODT dokumentua - ODT-asiakirja - ODT skjal - document ODT - cáipéis ODT - documento ODT - מסמך ODT - ODT dokument - ODT-dokumentum - Dokumen ODT - Documento ODT - ODT ドキュメント - ODT დოკუმენტი - ODT құжаты - ODT 문서 - ODT dokumentas - ODT dokuments - ODT-dokument - ODT-document - ODT-dokument - Dokument ODT - Documento ODT - Document ODT - документ ODT - Dokument ODT - Dokument ODT - Dokument ODT - ODT-dokument - документ ODT - Tài liệu ODT - ODT 文档 - ODT 文件 - ODT - OpenDocument Text - - - - - - - - - - - - - ODT document (Flat XML) - مستند ODT (Flat XML) - Документ — ODT (само XML) - document ODT (XML pla) - Dokument ODT (Flat XML) - ODT-dokument (flad XML) - ODT-Dokument (Unkomprimiertes XML) - έγγραφο ODT (Flat XML) - ODT document (Flat XML) - documento ODT (XML plano) - ODT dokumentua (XML soila) - ODT skjal (Flat XML) - document ODT (XML plat) - cáipéis ODT (XML cothrom) - documento ODT (XML plano) - מסמך ODT‏ (Flat XML) - ODT-dokumentum (egyszerű XML) - Dokumen ODT (Flat XML) - Documento ODT (XML semplice) - ODT ドキュメント (Flat XML) - ODT დოკუმენტი (Flat XML) - ODT құжаты (Тек XML) - ODT 문서 (단일 XML) - ODT dokumentas (Flat XML) - ODT dokuments (plakans XML) - ODT document (Flat XML) - Dokument ODT (prosty XML) - Documento ODT (Flat XML) - Document ODT (XML simplu) - документ ODT (простой XML) - Dokument ODT (čisté XML) - Datoteka dokumenta ODT (nepovezan XML) - ODT-dokument (platt XML) - документ ODT (Flat XML) - ODT 文档(Flat XML) - ODT 文件 (Flat XML) - FODT - OpenDocument Text (Flat XML) - - - - - - ODT template - قالب ODT - Šablon ODT - Шаблон за документи — ODT - plantilla ODT - Šablona ODT - ODT-skabelon - ODT-Vorlage - πρότυπο ODT - ODT template - ODT-ŝablono - plantilla ODT - ODT txantiloia - ODT-malli - ODT formur - modèle ODT - teimpléad ODT - modelo ODT - תבנית ODT - ODT predložak - ODT-sablon - Templat ODT - Modello ODT - ODT テンプレート - ODT დოკუმენტი - ODT үлгісі - ODT 문서 서식 - ODT šablonas - ODT veidne - ODT-mal - ODT-sjabloon - ODT-mal - Szablon ODT - Modelo ODT - Șablon ODT - шаблон ODT - Šablóna ODT - Predloga dokumenta ODT - Model ODT - ODT-mall - шаблон ODT - Mẫu ODT - ODT 模板 - ODT 範本 - ODT - OpenDocument Text - - - - - - - - - - - - - OTH template - قالب OTH - Šablon OTH - Шаблон за страници — OTH - plantilla OTH - Šablona OTH - OTH-skabelon - OTH-Vorlage - πρότυπο OTH - OTH template - OTH-ŝablono - plantilla OTH - OTH txantiloia - OTH-malli - OTH formur - modèle OTH - teimpléad OTH - modelo OTH - תבנית OTH - OTH predložak - OTH-sablon - Templat OTH - Modello OTH - OTH テンプレート - OTH შაბლონი - OTH үлгісі - OTH 문서 서식 - OTH šablonas - OTH veidne - OTH-mal - OTH-sjabloon - OTH-mal - Szablon OTH - Modelo OTH - Șablon OTH - шаблон OTH - Šablóna OTH - Predloga OTH - Model OTH - OTH-mall - шаблон OTH - Mẫu ODH - OTH 模板 - OTH 範本 - OTH - OpenDocument HTML - - - - - - - - - - - - - ODM document - مستند ODM - Dakument ODM - Документ — ODM - document ODM - Dokument ODM - ODM-dokument - ODM-Dokument - έγγραφο ODM - ODM document - ODM-dokumento - documento ODM - ODM dokumentua - ODM-asiakirja - ODM skjal - document ODM - cáipéis ODM - documento ODM - מסמך ODM - ODM dokument - ODM-dokumentum - Dokumen ODM - Documento ODM - ODM ドキュメント - ODM დოკუმენტი - ODM құжаты - ODM 문서 - ODM dokumentas - ODM dokuments - ODM-dokument - ODM-document - ODM-dokument - Dokument ODM - Documento ODM - Document ODM - документ ODM - Dokument ODM - Dokument ODM - Dokument ODM - ODM-dokument - ODM belgesi - документ ODM - Tài liệu ODM - ODM 文档 - ODM 文件 - ODM - OpenDocument Master - - - - - - - - - - - - - ODG drawing - تصميم ODG - Rysunak ODG - Чертеж — ODG - dibuix ODG - Kresba ODG - ODG-tegning - ODG-Zeichnung - σχέδιο ODG - ODG drawing - ODG-desegnaĵo - dibujo ODG - ODG marrazkia - ODG-piirros - ODG tekning - dessin ODG - líníocht ODG - debuxo ODG - ציור ODG - ODG crtež - ODG-rajz - Gambar ODG - Disegno ODG - ODG ドロー - ODG-ის ნახაზი - ODG суреті - ODG 드로잉 - ODG piešinys - ODG zīmējums - ODG-tegning - ODG-tekening - ODG-teikning - Rysunek ODG - Desenho ODG - Desen ODG - изображение ODG - Kresba ODG - Datoteka risbe ODG - Vizatim ODG - ODG-teckning - малюнок ODG - Bản vẽ ODG - ODG 绘图 - ODG 繪圖 - ODG - OpenDocument Drawing - - - - - - - - - - - - - ODG drawing (Flat XML) - رسمة ODG (Flat XML) - Чертеж — ODG (само XML) - dibuix ODG (XML pla) - Kresba ODG (Flat XML) - ODG-tegning (flad XML) - ODG-Zeichnung (Unkomprimiertes XML) - ODG drawing (Flat XML) - dibujo ODG (XML plano) - ODG marrazkia (XML soila) - ODG tekning (Flat XML) - dessin ODG (XML plat) - líníocht ODG (XML cothrom) - debuxo ODB (XML plano) - ציור ODG (Flat XML( - ODG-rajz (egyszerű XML) - Gambar ODG (FLAT XML) - Disegno ODG (XML semplice) - ODG ドロー (Flat XML) - ODG-ის ნახაზი (Flat XML) - ODG сызбасы (Тек XML) - ODG 드로잉 (단일 XML) - ODG piešinys (Flat XML) - ODG zīmējums (plakans XML) - ODG-tekening (Flat XML) - Rysunek ODG (prosty XML) - Desenho ODG (Flat XML) - Desen ODG (XML simplu) - изображение ODG (простой XML) - Kresba ODG (čisté XML) - Datoteka risbe ODG (nepovezan XML) - ODG-teckning (platt XML) - малюнок ODG (Flat XML) - ODG 绘图(Flat XML) - ODG 繪圖 (Flat XML) - FODG - OpenDocument Drawing (Flat XML) - - - - - - ODG template - قالب ODG - Šablon ODG - Шаблон за чертежи — ODG - plantilla ODG - Šablona ODG - ODG-skabelon - ODG-Vorlage - πρότυπο ODG - ODG template - ODG-ŝablono - plantilla ODG - ODG txantiloia - ODG-malli - ODG formur - modèle ODG - teimpléad ODG - modelo ODG - תבנית ODG - ODG predložak - ODG-sablon - Templat ODG - Modello ODG - ODG テンプレート - ODG-ის შაბლონი - ODG үлгісі - ODG 문서 서식 - ODG šablonas - ODG veidne - ODG-mal - ODG-sjabloon - ODG-mal - Szablon ODG - Modelo ODG - Șablon ODG - шаблон ODG - Šablóna ODG - Predloga dokumenta ODG - Model ODG - ODG-mall - шаблон ODG - Mẫu ODG - ODG 模板 - ODG 範本 - ODG - OpenDocument Drawing - - - - - - - - - - - - - ODP presentation - عرض تقديمي ODP - Prezentacyja ODP - Презентация — ODP - presentació ODP - Prezentace ODP - ODP-præsentation - ODP-Präsentation - παρουσίαση ODP - ODP presentation - ODP-prezentaĵo - presentación ODP - ODP aurkezpena - ODP-esitys - ODP framløga - présentation ODP - láithreoireacht ODP - presentación ODP - מצגת ODP - ODP prezentacija - ODP-prezentáció - Presentasi ODP - Presentazione ODP - ODP プレゼンテーション - ODP პრეზენტაცია - ODP презентациясы - ODP 프리젠테이션 - ODP pateiktis - ODP prezentācija - ODP-presentasjon - ODP-presentatie - ODP-presentasjon - Prezentacja ODP - Apresentação ODP - Prezentare ODP - презентация ODP - Prezentácia ODP - Predstavitev ODP - Prezantim ODP - ODP-presentation - ODP sunumu - презентація ODP - Trình diễn ODM - ODP 演示文稿 - ODP 簡報 - ODP - OpenDocument Presentation - - - - - - - - - - - - - ODP presentation (Flat XML) - عرض ODP (Flat XML) - Презентация — ODP (само XML) - presentació ODP (XML pla) - Prezentace ODP (Flat XML) - ODP-præsentation (flad XML) - ODP-Präsentation (Unkomprimiertes XML) - παρουσίαση ODP (Flat XML) - ODP presentation (Flat XML) - presentación ODP (XML plano) - ODP aurkezpena (XML soila) - ODP framløga (Flat XML) - présentation ODP (XML plat) - láithreoireacht ODP (XML cothrom) - presentación ODP (XML plano) - מצגת ODP‏ (Flat XML) - ODP-prezentáció (egyszerű XML) - Presentasi ODP (Flat XML) - Presentazione ODP (XML semplice) - ODP プレゼンテーション (Flat XML) - ODP პრეზენტაცია (Flat XML) - ODP презентациясы (Тек XML) - ODP 프리젠테이션 (단일 XML) - ODP pateiktis (Flat XML) - ODP prezentācija (plakans XML) - ODP presentatie (Flat XML) - Prezentacja ODP (prosty XML) - Apresentação ODP (Flat XML) - Prezentare ODP (XML simplu) - презентация ODP (простой XML) - Prezentácia ODP (čisté XML) - Predstavitev ODP (nepovezan XML) - ODP-presentation (platt XML) - презентація ODP (Flat XML) - ODP 演示文稿(Flat XML) - ODP 範本 (Flat XML) - FODP - OpenDocument Presentation (Flat XML) - - - - - - ODP template - قالب ODP - Šablon ODP - Шаблон за презентации — ODP - plantilla ODP - Šablona ODP - ODP-skabelon - ODP-Vorlage - πρότυπο ODP - ODP template - ODP-ŝablono - plantilla ODP - ODP txantiloia - ODP-malli - ODP formur - modèle ODP - teimpléad ODP - modelo ODP - תבנית ODP - ODP predložak - ODP-sablon - Templat ODP - Modello ODP - ODP テンプレート - ODP შაბლონი - ODP үлгісі - ODP 문서 서식 - ODP šablonas - ODP veidne - ODP-mal - ODP-sjabloon - ODP-mal - Szablon ODP - Modelo ODP - Șablon ODP - шаблон ODP - Šablóna ODP - Predloga dokumenta ODP - Model ODP - ODP-mall - шаблон ODP - Mẫu ODP - ODP 模板 - ODP 範本 - ODP - OpenDocument Presentation - - - - - - - - - - - - - ODS spreadsheet - جدول ODS - Raźlikovy arkuš ODS - Таблица — ODS - full de càlcul ODS - Sešit ODS - ODS-regneark - ODS-Tabelle - φύλλο εργασίας ODS - ODS spreadsheet - ODS-kalkultabelo - hoja de cálculo ODS - ODS kalkulu-orria - ODS-taulukko - ODS rokniark - feuille de calcul ODS - scarbhileog ODS - folla de cálculo ODS - גליון נתונים ODS - ODS proračunska tablica - ODS-táblázat - Lembar sebar ODS - Foglio di calcolo ODS - ODS スプレッドシート - ODS ცხრილი - ODS электрондық кестесі - ODS 스프레드시트 - ODS skaičialentė - ODS izklājlapa - ODS-regneark - ODS-rekenblad - ODS-rekneark - Arkusz ODS - Planilha ODS - Foaie de calcul ODS - электронная таблица ODS - Zošit ODS - Preglednica ODS - Fletë llogaritjesh ODS - ODS-kalkylblad - ел. таблиця ODS - Bảng tính ODS - ODS 工作簿 - ODS 試算表 - ODS - OpenDocument Spreadsheet - - - - - - - - - - - - - ODS spreadsheet (Flat XML) - جدول ODS (Flat XML) - Таблица — ODS (само XML) - full de càlcul ODS (XML pla) - Sešit ODS (Flat XML) - ODS-regneark (flad XML) - ODS-Tabelle (Unkomprimiertes XML) - φύλλο εργασίας ODS (Flat XML) - ODS spreadsheet (Flat XML) - hoja de cálculo ODS (XML plano) - ODS kalkulu-orria (XML soila) - ODS rokniark (Flat XML) - feuille de calcul ODS (XML plat) - scarbhileog ODS (XML cothrom) - folla de cálculo ODS (XML plano) - גליון נתונים ODS‏ (XML פשוט) - ODS-táblázat (egyszerű XML) - Lembar sebar ODS (Flat XML) - Foglio di calcolo ODS (XML semplice) - ODS スプレッドシート (Flat XML) - ODS ცხრილი (Flat XML) - ODS электрондық кестесі (Тек XML) - ODS 스프레드시트 (단일 XML) - ODS skaičialentė (Flat XML) - ODS izklājlapa (plakans XML) - ODS spreadsheet (Flat XML) - Arkusz ODS (prosty XML) - Planilha ODS (Flat XML) - Foaie de calcul ODS (XML simplu) - электронная таблица ODS (простой XML) - Zošit ODS (čisté XML) - Preglednica ODS (nepovezan XML) - ODS-kalkylblad (platt XML) - ел. таблиця ODS (Flat XML) - ODS 工作簿(Flat XML) - ODS 試算表 (Flat XML) - FODS - OpenDocument Spreadsheet (Flat XML) - - - - - - ODS template - قالب ODS - Šablon ODS - Шаблон за таблици — ODS - plantilla ODS - Šablona ODS - ODS-skabelon - ODS-Vorlage - πρότυπο ODS - ODS template - ODS-ŝablono - plantilla ODS - ODS txantiloia - ODS-malli - ODS formur - modèle ODS - teimpléad ODS - modelo ODS - תבנית ODS - ODS predložak - ODS-sablon - Templat ODS - Modello ODS - ODS テンプレート - ODS-ის შაბლონი - ODS үлгісі - ODS 문서 서식 - ODS šablonas - ODS veidne - ODS-mal - ODS-sjabloon - ODS-mal - Szablon ODS - Modelo ODS - Șablon ODS - шаблон ODS - Šablóna ODS - Predloga dokumenta ODS - Model ODS - ODS-mall - шаблон ODS - Mẫu ODS - ODS 模板 - ODS 範本 - ODS - OpenDocument Spreadsheet - - - - - - - - - - - - - ODC chart - مخطط ODC - Dyjahrama ODC - Диаграма — ODC - diagrama ODC - Graf ODC - ODC-diagram - ODC-Diagramm - διάγραμμα ODC - ODC chart - ODC-diagramo - gráfica ODC - ODC diagrama - ODC-kaavio - ODC strikumynd - graphique ODC - cairt ODC - gráfica ODC - תו ODC - ODC grafikon - ODC-táblázat - Bagan ODC - Grafico ODC - ODC チャート - ODC диаграммасы - ODC 차트 - ODC diagrama - ODC diagramma - ODC-graf - ODC-grafiek - ODC-diagram - Wykres ODC - Gráfico ODC - Diagramă ODC - диаграмма ODC - Graf ODC - Datoteka grafikona ODC - Grafik ODC - ODC-diagram - діаграма ODC - Sơ đồ ODC - ODC 图表 - ODC 圖表 - ODC - OpenDocument Chart - - - - - - - - - - - - - ODC template - قالب ODC - Шаблон за диаграми — ODC - plantilla ODC - Šablona ODC - ODC-skabelon - ODC-Vorlage - πρότυπο ODC - ODC template - ODC-ŝablono - plantilla ODC - ODC txantiloia - ODC-malli - ODC formur - modèle ODC - teimpléad ODC - modelo ODC - תבנית ODC - ODC predložak - ODC-sablon - Templat ODC - Modello ODC - ODC テンプレート - ODC შაბლონი - ODC үлгісі - ODC 문서 서식 - ODC šablonas - ODC veidne - ODC-sjabloon - Szablon ODC - Modelo ODC - Șablon ODC - шаблон ODC - Šablóna ODC - Predloga ODC - ODC-mall - шаблон ODC - Mẫu ODC - ODC 模板 - ODC 範本 - ODC - OpenDocument Chart - - - - - - - - - - - - - ODF formula - صيغة ODF - Formuła ODF - Формула — ODF - fórmula ODF - Vzorec ODF - ODF-formel - ODF-Formel - μαθηματικός τύπος ODF - ODF formula - ODF-formulo - fórmula ODF - ODF formula - ODF-kaava - ODF frymil - formule ODF - foirmle ODF - Fórula ODF - נוסחת ODF - ODF formula - ODF-képlet - Formula ODF - Formula ODF - ODF 計算式 - ODF-ის ფორმულა - ODF формуласы - ODF 수식 - ODF formulė - ODF formula - ODF-formel - ODF-formule - ODF-formel - Formuła ODF - Fórmula ODF - Formulă ODF - формула ODF - Vzorec ODF - Dokument formule ODF - Formulë ODF - ODF-formel - формула ODF - Công thức ODF - ODF 公式 - ODF 公式 - ODF - OpenDocument Formula - - - - - - - - - - - - - ODF template - قالب ODF - Шаблон за формули — ODF - plantilla ODF - Šablona ODF - ODF-skabelon - ODF-Vorlage - πρότυπο ODF - ODF template - ODF-ŝablono - plantilla ODF - ODF txantiloia - ODF-malli - ODF formur - modèle ODF - teimpléad ODF - modelo ODF - תבנית ODF - ODF predložak - ODG-sablon - Templat ODF - Modello ODF - ODF テンプレート - ODF-ის შაბლონი - ODF үлгісі - ODF 문서 서식 - ODF šablonas - ODF veidne - ODF-sjabloon - Szablon ODF - Modelo ODF - Șablon ODF - шаблон ODF - Šablóna ODF - Predloga dokumenta ODF - ODF-mall - шаблон ODF - Mẫu ODF - ODF 模板 - ODF 範本 - ODF - OpenDocument Formula - - - - - - - - - - - - - ODB database - قاعدة بيانات ODB - Baza źviestak ODB - База от данни — ODB - base de dades ODB - Databáze ODB - ODB-database - ODB-Datenbank - Βάση δεδομένων ODB - ODB database - ODB-datumbazo - base de datos ODB - ODB datu-basea - ODB-tietokanta - ODB dátustovnur - base de données ODB - bunachar sonraí ODB - base de datos ODB - בסיס נתונים ODB - ODB baza podataka - ODB-adatbázis - Basis data ODB - Database ODB - ODB データベース - ODB-ის მონაცემთა ბაზა - ODB дерекқоры - ODB 데이터베이스 - ODB duomenų bazė - ODB datubāze - ODB-database - ODB-gegevensbank - ODB-database - Baza danych ODB - Banco de dados ODB - Bază de date ODB - база данных ODB - Databáza ODB - Podatkovna zbirka ODB - Bazë me të dhëna ODB - ODB-databas - ODB veritabanı - база даних ODB - Cơ sở dữ liệu ODB - ODB 数据库 - ODB 資料庫 - ODB - OpenDocument Database - - - - - - ODI image - صورة ODI - Vyjava ODI - Изображение — ODI - imatge ODI - Obrázek ODI - ODI-billede - ODI-Bild - εικόνα ODI - ODI image - ODI-bildo - imagen ODI - ODI irudia - ODI-kuva - ODI mynd - image ODI - íomhá ODI - imaxe ODI - תמונת ODI - ODI slika - ODI-kép - Citra ODI - Immagine ODI - ODI 画像 - ODI გამოსახულება - ODI суреті - ODI 그림 - ODI paveikslėlis - ODI attēls - ODI-bilde - ODI-afbeelding - ODI-bilete - Obraz ODI - Imagem ODI - Imagine ODI - изображение ODI - Obrázok ODI - Slikovna datoteka ODI - Figurë ODI - ODI-bild - ODI görüntüsü - зображення ODI - Ảnh ODI - ODI 图像 - ODI 影像 - ODI - OpenDocument Image - - - - - - - - - - - - - OpenOffice.org extension - امتداد OpenOffice.org - Pašyreńnie OpenOffice.org - Разширение — OpenOffice - extensió d'OpenOffice.org - Rozšíření OpenOffice.org - OpenOffice.org-udvidelse - OpenOffice.org-Erweiterung - επέκταση OpenOffice.org - OpenOffice.org extension - extensión de OpenOffice - OpenOffice.org luzapena - OpenOffice.org-laajennus - OpenOffice.org víðkan - extension OpenOffice.org - eisínteacht OpenOffice.org - Extensión de OpenOffice.org - הרחבה של OpenOffice.org - OpenOffice.org kiterjesztés - Ekstensi OpenOffice.org - Estensione OpenOffice.org - OpenOffice.org 拡張機能 - OpenOffice.org-ის გაფართოება - OpenOffice.org кеңейтуі - OpenOffice.org 확장 - OpenOffice.org plėtinys - OpenOffice.org paplašinājums - OpenOffice.org-uitbreiding - OpenOffice Writer-utviding - Rozszerzenie OpenOffice.org - Extensão do OpenOffice - Extensie OpenOffice.org - расширение OpenOffice.org - Rozšírenie OpenOffice.org - Razširitev OpenOffice.org - Shtojcë për OpenOffice.org - OpenOffice.org-tillägg - OpenOffice.org eklentisi - розширення OpenOffice.org - Phần mở rộng của OpenOffice.org - OpenOffice.org 扩展 - OpenOffice.org 擴充套件 - - - - - - Android package - Пакет — Android - paquet d'Android - Balíčky systému Android - Android-pakke - Android-Paket - πακέτο Android - Android package - Android-pakaĵo - Paquete de Android - Android-paketti - paquet Android - paquete de Android - חבילת אנדרויד - Android paket - Android csomag - Paket Android - Pacchetto Android - Android パッケージ - Android-ის პაკეტი - Android дестесі - 안드로이드 패키지 - Android pakotne - Android pakket - Pakiet Androida - Pacote do Android - пакет Android - Paket Android - Android-paket - пакунок Android - Android - Android 套件 - - - - - SIS package - حزمة SIS - Pakunak SIS - Пакет — SIS - paquet SIS - Balíček SIS - SIS-pakke - SIS-Paket - πακέτο SIS - SIS package - SIS-pakaĵo - paquete SIS - SIS paketea - SIS-paketti - SIS pakki - paquet SIS - pacáiste SIS - paquete SIS - חבילת SIS - SIS paket - SIS csomag - Paket SIS - Pacchetto SIS - SIS パッケージ - SIS дестесі - SIS 패키지 - SIS paketas - SIS pakotne - SIS-pakke - SIS-pakket - SIS-pakke - Pakiet SIS - Pacote SIS - Pachet SIS - пакет SIS - Balíček SIS - Datoteka paketa SIS - Paketë SIS - SIS-paket - SIS paketi - пакунок SIS - Gói SIS - SIS 软件包 - SIS 套件 - SIS - Symbian Installation File - - - - - - - - SISX package - حزمة SISX - Pakunak SISX - Пакет — SISX - paquet SISX - Balíček SISX - SISX-pakke - SISX-Paket - πακέτο SISX - SISX package - SISX-pakaĵo - paquete SISX - SISX paketea - SISX-paketti - SISX pakki - paquet SISX - pacáiste SISX - paquete SISX - חבילת SISX - SISX paket - SISX csomag - Paket SISX - Pacchetto SISX - SISX パッケージ - SISX дестесі - SISX 패키지 - SISX paketas - SISX pakotne - SISX-pakke - SISX-pakket - SISX-pakke - Pakiet SISX - Pacote SISX - Pachet SISX - пакет SISX - Balíček SISX - Datoteka paketa SISX - Paketë SISX - SISX-paket - SISX paketi - пакунок SISX - Gói SISX - SISX 软件包 - SISX 套件 - SIS - Symbian Installation File - - - - - - - - Network Packet Capture - Прихванати пакети по мрежата - captura de paquets de xarxa - Network Packet Capture - Netværkspakkeoptegnelse - Netzwerk-Paketmitschnitt - Σύλληψη Πακέτων Δικτύου - Network Packet Capture - Caputra de paquete de red - capture de paquet réseau - Captura de Network Packet - לכידה של מנות נתונים ברשת - Hálózati csomagelfogás - Tangkapan Paket Jaringan - Cattura pacchetti rete - ネットワークパケットキャプチャー - ქსელური პაკეტის ანაბეჭდი - ұсталған желілік пакеттер - 네트워크 패킷 캡처 - Network Packet Capture - Network Packet Capture - Przechwycenie pakietu sieciowego - Pacote de captura de rede - захваченные сетевые пакеты - Zajem omrežnih paketov - перехоплені дані мережевих пакетів - 网络包抓取 - 網路封包捕捉 - - - - - - - - - - - - WordPerfect document - مستند WordPerfect - WordPerfect sənədi - Dakument WordPerfect - Документ — WordPerfect - document de WordPerfect - Dokument WordPerfect - Dogfen WordPerfect - WordPerfect-dokument - WordPerfect-Dokument - έγγραφο WordPerfect - WordPerfect document - WordPerfect-dokumento - documento de WordPerfect - WordPerfect dokumentua - WordPerfect-asiakirja - WordPerfect skjal - document WordPerfect - cáipéis WordPerfect - documento de WordPerfect - מסמך WordPerfect - WordPerfect dokument - WordPerfect-dokumentum - Dokumen WordPerfect - Documento WordPerfect - WordPerfect ドキュメント - WordPerfect құжаты - 워드퍼펙트 문서 - WordPerfect dokumentas - WordPerfect dokuments - Dokumen WordPerfect - WordPerfect-dokument - WordPerfect-document - WordPerfect-dokument - Dokument WordPerfect - documento do WordPerfect - Documento do WordPerfect - Document WordPerfect - документ WordPerfect - Dokument WordPerfect - Dokument WordPerfect - Dokument WordPerfect - WordPerfect документ - WordPerfect-dokument - документ WordPerfect - Tài liệu WordPerfect - WordPerfect 文档 - WordPerfect 文件 - - - - - - - - - - - - - - - - SPSS Portable Data File - ملف بيانات SPSS متنقلة - Данни — SPSS, преносими - fitxer de dades portables SPSS - Soubor přenositelných dat SPSS - Portabel SPSS-datafil - SPSS portable Datendatei - φορητό αρχείο δεδομένων SPSS - SPSS Portable Data File - archivo de datos portable SPSS - SPSS datuen fitxategi eramangarria - SPSS flytifør dátufíla - fichier portable de données SPSS - comhad iniompartha sonraí SPSS - ficheiro de datos portábel SPSS - קובץ מידע נייד SPSS - SPSS prenosiva podatkovna datoteka - SPSS hordozható adatfájl - Berkas Data Portabel SPSS - File dati SPSS Portable - SPSS ポータブルデータファイル - SPSS тасымалы ақпарат файлы - SPSS 이동식 데이터 파일 - SPSS perkeliamų duomenų failas - SPSS pārvietojamu datu datne - SPSS Portable Databestand - Plik przenośnych danych SPSS - Arquivo de Dados Portáteis SPSS - Fișier portabil de date SPSS - файл переносимых данных SPSS - Súbor prenosných dát SPSS - Prenosna podatkovna datoteka SPSS - Portabel SPSS-datafil - файл даних SPSS Portable - SPSS 便携式数据文件 - SPSS 可攜式資料檔 - - - - - - - SPSS Data File - ملف بيانات SPSS - Данни — SPSS - fitxer de dades SPSS - Datový soubor SPSS - SPSS-datafil - SPSS-Datendatei - αρχείο δεδομένων SPSS - SPSS Data File - archivo de datos SPSS - SPSS datuen fitxategia - SPSS dátufíla - fichier de données SPSS - comhad sonraí SPSS - ficheiro de datos SPSS - קובץ מידע SPSS - SPSS podatkovna datoteka - SPSS adatfájl - Berkas Data SPSS - File dati SPSS - SPSS データファイル - SPSS ақпарат файлы - SPSS 데이터 파일 - SPSS duomenų failas - SPSS datu datne - SPSS Databstand - Plik danych SPSS - Arquivo de dados SPSS - Fișier date SPSS - файл данных SPSS - Dátový súbor SPSS - Podatkovna datoteka SPSS - SPSS-datafil - файл даних SPSS - SPSS 数据文件 - SPSS 資料檔 - - - - - - - - XBEL bookmarks - علامات XBEL - Zakładki XBEL - Отметки — XBEL - llista d'adreces d'interès XBEL - Záložky XBEL - XBEL-bogmærker - XBEL-Lesezeichen - σελιδοδείκτες XBEL - XBEL bookmarks - XBEL-legosignoj - marcadores XBEL - XBEL laster-markak - XBEL-kirjanmerkit - XBEL bókamerki - marque-pages XBEL - leabharmharcanna XBEL - Marcadores XBEL - סמניית XBEL - XBEL knjižne oznake - XBEL-könyvjelzők - Bookmark XBEL - Segnalibri XBEL - XBEL ブックマーク - XBEL бетбелгілері - XBEL 책갈피 - XBEL žymelės - XBEL grāmatzīmes - Tandabuku XBEL - XBEL-bokmerker - XBEL-bladwijzers - XBEL-bokmerker - Zakładki XBEL - marcadores XBEL - Marcadores do XBEL - Semne de carte XBEL - закладки XBEL - Záložky XBEL - Datoteka zaznamkov XBEL - Libërshënues XBEL - XBEL обележивачи - XBEL-bokmärken - закладки XBEL - Liên kết đã lưu XBEL - XBEL 书签 - XBEL 格式書籤 - XBEL - XML Bookmark Exchange Language - - - - - - - - - 7-zip archive - أرشيف 7-zip - Archiŭ 7-zip - Архив — 7-zip - arxiu 7-zip - Archiv 7-zip - 7-zip-arkiv - 7zip-Archiv - αρχείο 7-zip - 7-zip archive - 7z-arkivo - archivador 7-zip - 7-zip artxiboa - 7-zip-arkisto - 7-zip skjalasavn - archive 7-zip - cartlann 7-zip - arquivo 7-zip - ארכיון 7-zip - 7-zip arhiva - 7-zip archívum - Arsip 7-zip - Archivio 7-zip - 7-zip アーカイブ - 7-zip არქივი - 7-zip архиві - 7-ZIP 압축 파일 - 7-zip archyvas - 7-zip arhīvs - 7-zip-arkiv - 7-zip-archief - 7-zip-arkiv - Archiwum 7-zip - Pacote 7-zip - Arhivă 7-zip - архив 7-zip - Archív 7-zip - Datoteka arhiva 7-zip - Arkiv 7-zip - 7-zip-arkiv - 7-Zip arşivi - архів 7-zip - Kho nén 7-zip - 7-zip 归档文件 - 7-zip 封存檔 - - - - - - - - AbiWord document - مستند آبي وورد - Dakument AbiWord - Документ — AbiWord - document d'AbiWord - Dokument AbiWord - AbiWord-dokument - AbiWord-Dokument - έγγραφο AbiWord - AbiWord document - AbiWord-dokumento - documento de Abiword - AbiWord dokumentua - AbiWord-asiakirja - AbiWord skjal - document AbiWord - cáipéis AbiWord - documento de AbiWord - מסמך AbiWord - AbiWord dokument - AbiWord-dokumentum - Dokumen AbiWord - Documento AbiWord - AbiWord ドキュメント - AbiWord-ის დოკუმენტი - AbiWord құжаты - AbiWord 문서 - AbiWord dokumentas - AbiWord dokuments - Dokumen AbiWord - AbiWord-dokument - AbiWord-document - AbiWord-dokument - Dokument AbiWord - documento AbiWord - Documento do AbiWord - Document AbiWord - документ AbiWord - Dokument AbiWord - Dokument AbiWord - Dokument AbiWord - Абиворд документ - AbiWord-dokument - AbiWord belgesi - документ AbiWord - Tài liệu AbiWord - AbiWord 文档 - AbiWord 文件 - - - - - - - - - - - - - - CD image cuesheet - صفيحة صورة الـCD جديلة - Infarmacyjny arkuš vyjavy CD - Описание на изображение на CD - «cuesheet» d'imatge de CD - Rozvržení stop obrazu CD - Cd-aftrykscuesheet - CD-Abbild-Cuesheet - CD image cuesheet - cue sheet de una imagen de CD - CD irudiaren CUE orria - CD-vedos cuesheet - index de pistes de CD - bileog chiúáil íomhá CD - cue sheet dunha imaxe de CD - גליון נתונים לתמונת דיסק - CD kép cuesheet - Citra cuesheet CD - Cuesheet immagine CD - CD イメージキューシート - CD бейнесінің құрама кестесі - CD 이미지 큐시트 - CD atvaizdžio aprašas - CD attēla rindulapa - Filliste for CD-avtrykk - CD-inhoudsopgave - CD-bilete-indeksfil - Obraz cuesheet płyty CD - Índice de Imagem de CD - Imagine CD cuesheet - таблица содержания образа CD - Rozvrhnutie stôp obrazu CD - Datoteka razpredelnice odtisa CD cue - Cuesheet imazhi CD - Indexblad för cd-avbild - таблиця CUE образу CD - Tờ tín hiệu báo ảnh CD - CD 映像标记文件 - CD 映像指示表 - - - - - - Lotus AmiPro document - مستند Lotus AmiPro - Lotus AmiPro sənədi - Dakument Lotus AmiPro - Документ — Lotus AmiPro - document de Lotus AmiPro - Dokument Lotus AmiPro - Dogfen Lotus AmiPro - Lotus AmiPro-dokument - Lotus-AmiPro-Dokument - έγγραφο Lotus AmiPro - Lotus AmiPro document - dokumento de Lotus AmiPro - documento de Lotus AmiPro - Lotus AmiPro dokumentua - Lotus AmiPro -asiakirja - Lotus AmiPro skjal - document Lotus AmiPro - cáipéis Lotus AmiPro - documento de Lotus AmiPro - מסמך של Lotus AmiPro - Lotus AmiPro dokument - Lotus AmiPro-dokumentum - Dokumen Lotus AmiPro - Documento Lotus AmiPro - Lotus AmiPro ドキュメント - Lotus AmiPro құжаты - Lotus AmiPro 문서 - Lotus AmiPro dokumentas - Lotus AmiPro dokuments - Dokumen Lotus AmiPro - Lotus AmiPro-dokument - Lotus AmiPro-document - Lotus AmiPro-dokument - Dokument Lotus AmiPro - documento Lotus AmiPro - Documento do Lotus AmiPro - Document Lotus AmiPro - документ Lotus AmiPro - Dokument Lotus AmiPro - Dokument Lotus AmiPro - Dokument Lotus AmiPro - Лотус АмиПро документ - Lotus AmiPro-dokument - документ Lotus AmiPro - Tài liệu Lotus AmiPro - Lotus AmiPro 文档 - Lotus AmiPro 文件 - - - - - AportisDoc document - مستند AportisDoc - Документ — AportisDoc - document AportisDoc - Dokument AportisDoc - AportisDoc-dokument - AportisDoc-Dokument - έγγραφο AportisDoc - AportisDoc document - AportisDoc-dokumento - documento AportisDoc - AportisDoc dokumentua - AportisDoc-asiakirja - AportisDoc skjal - document AportisDoc - cáipéis AportisDoc - documento de AportiDoc - מסמך AportisDoc - AportisDoc dokument - AportisDoc-dokumentum - Dokumen AportisDoc - Documento AportisDoc - AportisDoc ドキュメント - AportisDoc-ის დოკუმენტი - AportisDoc құжаты - AportisDoc 문서 - AportisDoc dokumentas - AportisDoc dokuments - AportisDoc-document - Dokument AportisDoc - Documento do AportisDoc - Document AportisDoc - документ AportisDoc - Dokument AportisDoc - Dokument AportisDoc - AportisDoc-dokument - AportisDoc belgesi - документ AportisDoc - Tài liệu AportisDoc - AportisDoc 文档 - AportisDoc 文件 - - - - - - - - - - - Applix Spreadsheets spreadsheet - جداول بيانات Applix - Raźlikovy arkuš Applix Spreadsheets - Таблица — Applix Spreadsheets - full de càlcul d'Applix Spreadsheets - Sešit Applix Spreadsheets - Applix Spreadsheets-regneark - Applix-Spreadsheets-Tabelle - λογιστικό φύλλο Applix Spreadsheets - Applix Spreadsheets spreadsheet - sterntabelo de Applix Spreadsheets - hoja de cálculo de Applix Spreadsheets - Applix Spreadsheets kalkulu-orria - Applix Spreadsheets -taulukko - Applix Spreadsheets rokniark - feuille de calcul Applix - scarbhileog Applix Spreadsheets - folla de cálculo de Applix - גליון נתונים של Applix Spreadsheets - Applix Spreadsheets proračunska tablica - Applix Spreadsheets-munkafüzet - Lembar sebar Applix Spreadsheets - Foglio di calcolo Applix Spreadsheets - Applix Spreadsheets スプレッドシート - Applix Spreadsheets-ის ცხრილი - Applix Spreadsheets электрондық кестесі - Applix 스프레드시트 - Applix Spreadsheets skaičialentė - Applix Spreadsheets izklājlapa - Hamparan Applix Spreadsheets - Applix Spreadsheets-regneark - Applix Spreadsheets-rekenblad - Applix Spreadsheets-dokument - Arkusz Applix Spreadsheets - folha de cálculo Applix Spreadsheets - Planilha do Applix Spreadsheets - Foaie de calcul Applix - электронная таблица Applix Spreadsheets - Zošit Applix Spreadsheets - Razpredelnica Applix Spreadsheets - Fletë llogaritjesh Applix Spreadsheets - Applix табеларни документ - Applix Spreadsheets-kalkylblad - ел. таблиця Applix Spreadsheets - Bảng tính Applix Spreadsheets - Applix Spreadsheets 工作簿 - Applix Spreadsheets 試算表 - - - - - - - - - - - Applix Words document - مستند كلمات Applix - Applix Words sənədi - Dakument Applix Words - Документ — Applix Words - document d'Applix Words - Dokument Applix Words - Dogfen Applix Words - Applix Words-dokument - Applix-Words-Dokument - έγγραφο Applix Words - Applix Words document - dokumento de Applix Words - documento de Applix Words - Applix Words dokumentua - Applix Words -asiakirja - Applix Words skjal - document Applix Words - cáipéis Applix Words - documento de Applix Words - מסמך של Applix Words - Applix Words dokument - Applix Words-dokumentum - Dokumen Applix Words - Documento Applix Words - Applix Words ドキュメント - Applix Words-ის დოკუმენტი - Applix Words құжаты - Applix Words 문서 - Applix Words dokumentas - Applix Words dokuments - Dokumen Perkataan Applix - Applix Words-dokument - Applix Words-document - Applix Words dokument - Dokument Applix Words - documento Applix Words - Documento do Applix Words - Document Applix Words - документ Applix Words - Dokument Applix Words - Dokument Applix Words - Dokument Applix Words - Applix Words документ - Applix Words-dokument - документ Applix Words - Tài liệu Applix Words - Applix Words 文档 - Applix Words 文件 - - - - - - - - - - ARC archive - أرشيف ARC - Archiŭ ARC - Архив — ARC - arxiu ARC - Archiv ARC - ARC-arkiv - ARC-Archiv - αρχείο ARC - ARC archive - ARC-arkivo - archivador ARC - ARC artxiboa - ARC-arkisto - ARC skjalasavn - archive ARC - cartlann ARC - arquivo ARC - ארכיון ARC - ARC arhiva - ARC-archívum - Arsip ARC - Archivio ARC - ARC アーカイブ - ARC არქივი - ARC архиві - ARC 압축 파일 - ARC archyvas - ARC arhīvs - ARC-arkiv - ARC-archief - ARC-arkiv - Archiwum ARC - Pacote ARC - Arhivă ARC - архив ARC - Archív ARC - Datoteka arhiva ARC - Arkiv ARC - ARC-arkiv - ARC arşivi - архів ARC - Kho nén ARC - ARC 归档文件 - ARC 封存檔 - - - - - - - - - - - - AR archive - أرشيف AR - Archiŭ AR - Архив — AR - arxiu AR - Archiv AR - AR-arkiv - AR-Archiv - σρχείο AR - AR archive - AR-arkivo - archivador AR - AR artxiboa - AR-arkisto - AR skjalasavn - archive AR - cartlann AR - arquivo AR - ארכיון AR - AR arhiva - AR-archívum - Arsip AR - Archivio AR - AR アーカイブ - AR არქივი - AR архиві - AR 묶음 파일 - AR archyvas - AR arhīvs - Arkib AR - AR-arkiv - AR-archief - AR-arkiv - Archiwum AR - arquivo AR - Pacote AR - Arhivă AR - архив AR - Archív AR - Datoteka arhiva AR - Arkiv AR - АР архива - AR-arkiv - AR arşivi - архів AR - Kho nén AR - AR 归档文件 - AR 封存檔 - - - - - - - - - - ARJ archive - أرشيف ARJ - ARJ arxivi - Archiŭ ARJ - Архив — ARJ - arxiu ARJ - Archiv ARJ - Archif ARJ - ARJ-arkiv - ARJ-Archiv - αρχείο ARJ - ARJ archive - ARJ-arkivo - archivador ARJ - ARJ artxiboa - ARJ-arkisto - ARJ skjalasavn - archive ARJ - cartlann ARJ - arquivo ARJ - ארכיון ARJ - ARJ arhiva - ARJ-archívum - Arsip ARJ - Archivio ARJ - ARJ アーカイブ - ARJ არქივი - ARJ архиві - ARJ 압축 파일 - ARJ archyvas - ARJ arhīvs - Arkib ARJ - ARJ-arkiv - ARJ-archief - ARJ-arkiv - Archiwum ARJ - arquivo ARJ - Pacote ARJ - Arhivă ARJ - архив ARJ - Archív ARJ - Datoteka arhiva ARJ - Arkiv ARJ - ARJ архива - ARJ-arkiv - ARJ arşivi - архів ARJ - Kho nén ARJ - ARJ 归档文件 - ARJ 封存檔 - ARJ - Archived by Robert Jung - - - - - - - - ASP page - صفحة ASP - Staronka ASP - Страница — ASP - pàgina ASP - Stránka ASP - ASP-side - ASP-Seite - σελίδα ASP - ASP page - ASP-paĝo - página ASP - ASP orria - ASP-sivu - ASP síða - page ASP - leathanach ASP - páxina ASP - עמוד ASP - ASP stranica - ASP oldal - Halaman ASP - Pagina ASP - ASP ページ - ASP გვერდი - ASP парағы - ASP 페이지 - ASP puslapis - ASP lapa - ASP-side - ASP-pagina - ASP-side - Strona ASP - Página ASP - Pagină ASP - страница ASP - Stránka ASP - Datoteka spletne strani ASP - Faqe ASP - ASP-sida - сторінка ASP - Trang ASP - ASP 页面 - ASP 頁面 - ASP - Active Server Page - - - - - - AWK script - سكربت AWK - AWK skripti - Skrypt AWK - Скрипт — AWK - script AWK - Skript AWK - Sgript AWK - AWK-program - AWK-Skript - πρόγραμμα εντολών AWK - AWK script - AWK-skripto - script en AWK - AWK script-a - AWK-komentotiedosto - AWK boðrøð - script AWK - script AWK - script de AWK - תסריט AWK - AWK skripta - AWK-parancsfájl - Skrip AWK - Script AWK - AWK スクリプト - AWK სცენარი - AWK сценарийі - AWK 스크립트 - AWK scenarijus - AWK skripts - Skrip AWK - AWK-skript - AWK-script - WAK-skript - Skrypt AWK - 'script' AWK - Script AWK - Script AWK - сценарий AWK - Skript AWK - Skriptna datoteka AWK - Script AWK - AWK скрипта - AWK-skript - AWK betiği - скрипт AWK - Văn lệnh AWK - AWK 脚本 - AWK 指令稿 - - - - - - - - - - - - - - - - - - - BCPIO document - مستند BCPIO - BCPIO sənədi - Dakument BCPIO - Документ — BCPIO - document BCPIO - Dokument BCPIO - Dogfen BCPIO - BCPIO-dokument - BCPIO-Dokument - έγγραφο BCPIO - BCPIO document - BCPIO-dokumento - documento BCPIO - BCPIO dokumentua - BCPIO-asiakirja - BCPIO skjal - document BCPIO - cáipéis BCPIO - documento BCPIO - מסמך של BCPO - BCPIO dokument - BCPIO-dokumentum - Dokumen BCPIO - Documento BCPIO - BCPIO ドキュメント - BCPIO-ის დოკუმენტი - BCPIO құжаты - BCPIO 문서 - BCPIO dokumentas - BCPIO dokuments - Dokumen BCPIO - BCPIO-dokument - BCPIO-document - BCPIO-dokument - Dokument BCPIO - documento BCPIO - Documento BCPIO - Document BCPIO - документ BCPIO - Dokument BCPIO - Dokument BCPIO - Dokument BCPIO - BCPIO документ - BCPIO-dokument - BCPIO belgesi - документ BCPIO - Tài liệu BCPIO - BCPIO 文档 - BCPIO 文件 - BCPIO - Binary CPIO - - - - - BitTorrent seed file - ملف باذر البت تورنت - BitTorrent seed faylı - Fajł krynicy BitTorrent - Файл-източник — BitTorrent - fitxer llavor de BitTorrent - Soubor BitTorrent - Ffeil hadu BitTorrent - BitTorrent-frøfil - BitTorrent-Seed-Datei - αρχείο BitTorrent seed - BitTorrent seed file - BitTorrent-semdosiero - archivo semilla de BitTorrent - BitTorrent hazi-fitxategia - BitTorrent-siementiedosto - BitTorrent seed fíla - fichier graine BitTorrent - comhad síl BitTorrent - ficheiro de orixe BitTorrent - קובץ זריעה של BitTorrent - BitTorrent-magfájl - Berkas benih BitTorrent - File seed BitTorrent - BitTorrent シードファイル - BitTorrent көз файлы - 비트토렌트 시드 파일 - BitTorrent šaltinio failas - BitTorrent avota datne - Fail seed BitTorrent - Fil med utgangsverdi for BitTorrent - BitTorrent-bestand - Nedlastingsfil for BitTorrent - Plik ziarna BitTorrent - ficheiro de origem BitTorrent - Arquivo semente BitTorrent - Fișier sursă-completă BitTorrent - файл источника BitTorrent - Súbor BitTorrent - Datoteka sejanja BitTorrent - File bazë BitTorrent - Датотека са БитТорентовим полазиштима - BitTorrent-distributionsfil - файл поширення BitTorrent - Tải tập hạt BitTorrent - BitTorrent 种子文件 - BitTorrent 種子檔 - - - - - - - Blender scene - مشهد بلندر - Scena Blender - Сцена — Blender - escena Blender - Scéna Blender - Blenderscene - Blender-Szene - σκηνή Blender - Blender scene - Blender-sceno - escena de Blender - Blender-eko fitxategia - Blender-näkymä - Blender leikmynd - scène Blender - radharc Blender - escena de Blender - סצנת Blender - Blender scena - Blender-jelenet - Scene Blender - Scena Blender - Blender シーン - Blender-ის სცენა - Blender сахнасы - Blender 장면 - Blender scena - Blender aina - Babak Blender - Blender-scene - Blender-scène - Blender-scene - Scena programu Blender - cenário Blender - Cena do Blender - Scenă Blender - сцена Blender - Scéna Blender - Datoteka scene Blender - Skenë Blender - Блендер сцена - Blender-scen - сцена Blender - Cảnh Blender - Blender 场景 - Blender 場景 - - - - - - - - - - TeX DVI document (bzip-compressed) - مستند TeX DVI (مضغوط-bzip) - Dakument TeX DVI (bzip-skampresavany) - Документ — TeX DVI, компресиран с bzip - document TeX DVI (comprimit amb bzip) - Dokument TeX DVI (komprimovaný pomocí bzip) - TeX DVI-dokument (bzip-komprimeret) - TeX-DVI-Dokument (bzip-komprimiert) - αρχείο TeX DVI (συμπιεσμένο με bzip) - TeX DVI document (bzip-compressed) - documento DVI de TeX (comprimido con bzip) - TeX DVI dokumentua (bzip-ekin konprimitua) - TeX DVI -asiakirja (bzip-pakattu) - TeX DVI skjal (bzip-stappað) - document DVI TeX (compressé bzip) - cáipéis DVI TeX (comhbhrúite le bzip) - documento DVI de TeX (comprimido con bzip) - מסמך מסוג TeX DVI (מכווץ ע"י bzip) - TeX DVI dokument (komprimiran bzip-om) - TeX DVI dokumentum (bzip-pel tömörítve) - Dokumen TeX DVI (terkompresi bzip) - Documento TeX DVI (compresso con bzip) - Tex DVI ドキュメント (bzip 圧縮) - TeX DVI құжаты (bzip-пен сығылған) - TeX DVI 문서 (BZIP 압축) - TeX DVI dokumentas (suglaudintas su bzip) - TeX DVI dokuments (saspiests ar bzip) - TeX DVI-dokument (bzip-komprimert) - TeX DVI-document (ingepakt met bzip) - TeX DVI-dokument (pakka med bzip) - Dokument TeX DVI (kompresja bzip) - Documento DVI TeX (compactado com bzip) - Document TeX DVI (comprimat bzip) - документ TeX DVI (сжатый bzip) - Dokument TeX DVI (komprimovaný pomocou bzip) - Dokument TeX DVI (stisnjen z bzip) - Dokument Tex DVI (i kompresuar me bzip) - TeX DVI-dokument (bzip-komprimerat) - документ TeX DVI (стиснений bzip) - Tài liệu DVI TeX (đã nén bzip) - TeX DVI 文档(gzip 压缩) - TeX DVI 文件 (bzip 格式壓縮) - - - - - - Bzip archive - أرشيف Bzip - Archiŭ bzip - Архив — bzip - arxiu bzip - Archiv bzip - Bzip-arkiv - Bzip-Archiv - συμπιεσμένο αρχείο Bzip - Bzip archive - Bzip-arkivo - archivador Bzip - Bzip artxiboa - Bzip-arkisto - Bzip skjalasavn - archive bzip - cartlann Bzip - arquivo Bzip - ארכיון Bzip - Bzip arhiva - Bzip archívum - Arsip Bzip - Archivio bzip - Bzip アーカイブ - Bzip არქივი - Bzip архиві - BZIP 압축 파일 - Bzip archyvas - Bzip arhīvs - Bzip-arkiv - Bzip-archief - Bzip-arkiv - Archiwum bzip - Pacote Bzip - Arhivă Bzip - архив BZIP - Archív bzip - Datoteka arhiva Bzip - Arkiv bzip - Bzip-arkiv - Bzip arşivi - архів bzip - Kho nén bzip - bzip 归档文件 - Bzip 封存檔 - - - - - - - - - - Tar archive (bzip-compressed) - أرشيف Tar (مضغوط-bzip) - Archiŭ tar (bzip-skampresavany) - Архив — tar, компресиран с bzip - arxiu tar (comprimit amb bzip) - Archiv tar (komprimovaný pomocí bzip) - Tar-arkiv (bzip-komprimeret) - Tar-Archiv (bzip-komprimiert) - αρχείο Tar (συμπιεσμένο με bzip) - Tar archive (bzip-compressed) - archivador Tar (comprimido con bzip) - Tar artxiboa (bzip-ekin konprimitua) - Tar-arkisto (bzip-pakattu) - Tar skjalasavn (bzip-stappað) - archive tar (compressée bzip) - cartlann Tar (comhbhrúite le bzip) - arquivo Tar (comprimido con bzip) - ארכיון Tar (מכווץ ע"י bzip) - Tar arhiva (komprimirana bzip-om) - Tar archívum (bzip-pel tömörítve) - Arsip Tar (terkompresi bzip) - Archivio tar (compresso con bzip) - Tar アーカイブ (bzip 圧縮) - Tar архиві (bzip-пен сығылған) - TAR 묶음 파일 (BZIP 압축) - Tar archyvas (suglaudintas su bzip) - Tar arhīvs (saspiests ar bzip) - Tar-arkiv (bzip-komprimert) - Tar-archief (ingepakt met bzip) - Tar-arkiv (pakka med bzip) - Archiwum tar (kompresja bzip) - Pacote tar (compactado com bzip) - Arhivă Tar (comprimată bzip) - архив TAR (сжатый BZIP) - Archív tar (komprimovaný pomocou bzip) - Datoteka arhiva Tar (stisnjen z bzip) - Arkiv tar (i kompresuar me bzip) - Tar-arkiv (bzip-komprimerat) - архів tar (стиснений bzip) - Kho nén tar (đã nén bzip) - Tar 归档文件(bzip 压缩) - Tar 封存檔 (bzip 格式壓縮) - - - - - - - - - - PDF document (bzip-compressed) - مستند PDF (مضغوط-bzip) - Dakument PDF (bzip-skampresavany) - Документ — PDF, компресиран с bzip - document PDF (comprimit amb bzip) - Dokument PDF (komprimovaný pomocí bzip) - PDF-dokument (bzip-komprimeret) - PDF-Dokument (bzip-komprimiert) - έγγραφο PDF (συμπιεσμένο με bzip) - PDF document (bzip-compressed) - documento PDF (comprimido con bzip) - PostScript dokumentua (bzip-ekin konprimitua) - PDF-asiakirja (bzip-pakattu) - PDF skjal (bzip-stappað) - document PDF (compressé bzip) - cáipéis PDF (comhbhrúite le bzip) - documento PDF (comprimido en bzip) - מסמך PDF (מכווץ ע"י bzip) - PDF dokumentum (bzip-tömörítésű) - Dokumen PDF (terkompresi bzip) - Documento PDF (compresso con bzip) - PDF ドキュメント (bzip 圧縮) - PDF құжаты (bzip-пен сығылған) - PDF 문서 (BZIP 압축) - PDF dokumentas (suglaudintas su bzip) - PDF dokuments (saspiests ar bzip) - PDF-dokument (bzip-komprimert) - PDF-document (ingepakt met bzip) - PDF-dokument (pakka med bzip) - Dokument PDF (kompresja bzip) - Documento PDF (compactado com bzip) - Document PDF (comprimat bzip) - документ PDF (сжатый bzip) - Dokument PDF (komprimovaný pomocou bzip) - Dokument PDF (stisnjen z bzip) - Dokument PDF (i kompresuar me bzip) - PDF-dokument (bzip-komprimerat) - PDF belgesi (bzip ile sıkıştırılmış) - документ PDF (стиснений bzip) - Tài liệu PDF (đã nén bzip) - PDF 文档(bzip 压缩) - PDF 文件 (bzip 格式壓縮) - - - - - - PostScript document (bzip-compressed) - مستند PostScript (مضغوط-bzip) - Dakument PostScript (bzip-skampresavany) - Документ — PostScript, компресиран с bzip - document PostScript (comprimit amb bzip) - Dokument PostScript (komprimovaný pomocí bzip) - PostScript-dokument (bzip-komprimeret) - PostScript-Dokument (bzip-komprimiert) - έγγραφο PostScript (συμπιεσμένο με bzip) - PostScript document (bzip-compressed) - documento PostScript (comprimido con bzip) - PostScript dokumentua (bzip-ekin konprimitua) - PostScript-asiakirja (bzip-pakattu) - PostScript skjal (bzip-stappað) - document PostScript (compressé bzip) - cáipéis PostScript (comhbhrúite le bzip) - documento PostScript (comprimido con bzip) - מסמך PostDcript (מכווץ ע"י bzip) - PostScript dokumentum (bzip-tömörítésű) - Dokumen PostScript (terkompresi bzip) - Documento PostScript (compresso con bzip) - PostScript ドキュメント (bzip 圧縮) - PostScript құжаты (bzip-пен сығылған) - 포스트스크립트 문서 (BZIP 압축) - PostScript dokumentas (suglaudintas su bzip) - PostScript dokuments (saspiests ar bzip) - PostScript-dokument (bzip-komprimert) - PostScript-document (ingepakt met bzip) - PostScript-dokument (pakka med bzip) - Dokument Postscript (kompresja bzip) - Documento PostScript (compactado com bzip) - Document PostScript (comprimat bzip) - документ PostScript (сжатый bzip) - Dokument PostScript (komprimovaný pomocou bzip) - Dokument PostScript (stisnjen z bzip) - Dokument PostScript (i kompresuar me bzip) - Postscript-dokument (bzip-komprimerat) - документ PostScript (стиснене bzip) - Tài liệu PostScript (đã nén bzip) - PostScript 文档(bzip 压缩) - PostScript 文件 (bzip 格式壓縮) - - - - - - comic book archive - أرشيف comic book - archiŭ komiksaŭ - Архив — комикси - arxiu comic book - Archiv knihy komiksů - comic book-arkiv - Comic-Book-Archiv - συμπιεσμένο αρχείο κόμικ - comic book archive - archivador de libro de cómic - komiki artxiboa - sarjakuva-arkisto - teknisøgubóka skjalasavn - archive Comic Book - cartlann chartúin - ficheiro de libro de banda deseñada - ארכיון ספר קומי - képregényarchívum - arsip buku komik - Archivio comic book - コミックブックアーカイブ - комикстар архиві - 만화책 압축 파일 - komiksų knygos archyvas - komiksu grāmatas arhīvs - Tegneseriearkiv - stripboek-archief - teikneseriearkiv - Archiwum komiksu - Pacote de livro de revista em quadrinhos - arhivă benzi desenate - архив комиксов - Archív knihy komiksov - Datoteka arhiva stripov - Arkiv comic book - serietidningsarkiv - архів коміксів - Kho nén sách tranh chuyện vui - Comic Book 归档文件 - 漫畫書封存檔 - - - - - - comic book archive - أرشيف comic book - archiŭ komiksaŭ - Архив — комикси - arxiu comic book - Archiv knihy komiksů - comic book-arkiv - Comic-Book-Archiv - συμπιεσμένο αρχείο κόμικ - comic book archive - archivador de libro de cómic - komiki artxiboa - sarjakuva-arkisto - teknisøgubóka skjalasavn - archive Comic Book - cartlann chartúin - ficheiro de libro de banda deseñada - ארכיון ספר קומי - képregényarchívum - arsip buku komik - Archivio comic book - コミックブックアーカイブ - комикстар архиві - 만화책 압축 파일 - komiksų knygos archyvas - komiksu grāmatas arhīvs - Tegneseriearkiv - stripboek-archief - teikneseriearkiv - Archiwum komiksu - Pacote de livro de revista em quadrinhos - arhivă benzi desenate - архив комиксов - Archív knihy komiksov - Datoteka arhiva stripov - Arkiv comic book - serietidningsarkiv - архів коміксів - Kho nén sách tranh chuyện vui - Comic Book 归档文件 - 漫畫書封存檔 - - - - - - comic book archive - أرشيف comic book - archiŭ komiksaŭ - Архив — комикси - arxiu comic book - Archiv knihy komiksů - comic book-arkiv - Comic-Book-Archiv - συμπιεσμένο αρχείο κόμικ - comic book archive - archivador de libro de cómic - komiki artxiboa - sarjakuva-arkisto - teknisøgubóka skjalasavn - archive Comic Book - cartlann chartúin - ficheiro de libro de banda deseñada - ארכיון ספר קומי - képregényarchívum - arsip buku komik - Archivio comic book - コミックブックアーカイブ - комикстар архиві - 만화책 압축 파일 - komiksų knygos archyvas - komiksu grāmatas arhīvs - Tegneseriearkiv - stripboek-archief - teikneseriearkiv - Archiwum komiksu - Pacote de livro de revista em quadrinhos - arhivă benzi desenate - архив комиксов - Archív knihy komiksov - Datoteka arhiva stripov - Arkiv comic book - serietidningsarkiv - архів коміксів - Kho nén sách tranh chuyện vui - Comic Book 归档文件 - 漫畫書封存檔 - - - - - - comic book archive - أرشيف comic book - archiŭ komiksaŭ - Архив — комикси - arxiu comic book - Archiv knihy komiksů - comic book-arkiv - Comic-Book-Archiv - συμπιεσμένο αρχείο κόμικ - comic book archive - archivador de libro de cómic - komiki artxiboa - sarjakuva-arkisto - teknisøgubóka skjalasavn - archive Comic Book - cartlann chartúin - ficheiro de libro de banda deseñada - ארכיון ספר קומי - képregényarchívum - arsip buku komik - Archivio comic book - コミックブックアーカイブ - комикстар архиві - 만화책 압축 파일 - komiksų knygos archyvas - komiksu grāmatas arhīvs - Tegneseriearkiv - stripboek-archief - teikneseriearkiv - Archiwum komiksu - Pacote de livro de revista em quadrinhos - arhivă benzi desenate - архив комиксов - Archív knihy komiksov - Datoteka arhiva stripov - Arkiv comic book - serietidningsarkiv - архів коміксів - Kho nén sách tranh chuyện vui - Comic Book 归档文件 - 漫畫書封存檔 - - - - - - Lrzip archive - أرشيف Lrzip - Архив — lrzip - arxiu lrzip - Archiv Lrzip - Lrzip-arkiv - Lrzip-Archiv - συμπιεσμένο αρχείο Lrzip - Lrzip archive - Lrzip-arkivo - archivador Lrzip - Lrzip-arkisto - Lrzip skjalasavn - archive lrzip - cartlann Lrzip - arquivo Lrzip - ארכיון Lrzip - Lrzip arhiva - Lrzip archívum - Arsip Lrzip - Archivio Lrzip - Lrzip アーカイブ - Lrzip архиві - LRZIP 압축 파일 - Lrzip archyvas - Lrzip arhīvs - Lrzip archief - Archiwum lrzip - Pacote Lrzip - Arhivă Lrzip - архив LRZIP - Archív Lrzip - Datoteka arhiva Lrzip - Lrzip-arkiv - архів lrzip - Lrzip 归档文件 - Lrzip 封存檔 - - - - - - - - Tar archive (lrzip-compressed) - أرشيف Tar (مضغوط-lrzip) - Архив — tar, компресиран с lrzip - arxiu tar (comprimit amb lrzip) - Archiv tar (komprimovaný pomocí lrzip) - Tar-arkiv (lrzip-komprimeret) - Tar-Archiv (lrzip-komprimiert) - αρχείο Tar (συμπιεσμένο με lrzip) - Tar archive (lrzip-compressed) - archivador Tar (comprimido con lrzip) - Tar-arkisto (lrzip-pakattu) - Tar skjalasavn (lrzip-stappað) - archive tar (compressée lrzip) - cartlann Tar (comhbhrúite le lrzip) - arquivo Tar (comprimido con lrzip) - ארכיון Tar (מכווץ ע"י lrzip) - Tar arhiva (komprimirana lrzip-om) - Tar archívum (lrzip-pel tömörítve) - Arsip Tar (terkompresi lrzip) - Archivio tar (compresso con lrzip) - Tar アーカイブ (lrzip 圧縮) - Tar архиві (lrzip-пен сығылған) - TAR 묶음 파일 (LRZIP 압축) - Tar archyvas (suglaudintas su lrzip) - Tar arhīvs (saspiests ar lrzip) - Tar archief (lrzip-compressed) - Archiwum tar (kompresja lrzip) - Pacote tar (compactado com lrzip) - Arhivă Tar (comprimată lrzip) - архив TAR (сжатый LRZIP) - Archív tar (komprimovaný pomocou lrzip) - Datoteka arhiva Tar (stisnjen z lrzip) - Tar-arkiv (lrzip-komprimerat) - архів tar (стиснений lrzip) - Tar 归档文件 (lrzip 压缩) - Tar 封存檔 (lrzip 格式壓縮) - - - - - - - Apple disk image - Диск — Apple - imatge de disc d'Apple - Obraz disku Apple - Apple-diskaftryk - Apple-Datenträgerabbild - εικόνα δίσκου Apple - Apple disk image - imagen de disco de Apple - Apple-levytiedosto - image disque Apple - imaxe de disco de Appl - תמונת כונן Apple - Apple snimka diska - Apple lemezkép - Image disk Apple - Immagine disco Apple - Apple ディスクイメージ - Apple-ის სადისკო გამოსახულება - Apple диск бейнесі - 애플 디스크 이미지 - Apple diska attēls - Apple disk image - Obraz dysku Apple - Imagem de disco Apple - образ диска Apple Mac OS X - Obraz disku Apple - Odtis diska Apple - Apple-skivavbild - Apple disk görüntüsü - образ диска Apple - Apple 磁盘镜像 - Apple 磁碟映像 - - - - Raw disk image - - - - - Raw disk image (XZ-compressed) - - - - - - raw CD image - صورة CD خامة - suvoraja vyjava CD - Изображение — raw CD - imatge de CD en cru - Surový obraz CD - rå cd-aftryk - CD-Roh-Abbild - εικόνα περιεχομένου ψηφιακού δίσκου - raw CD image - kruda lumdiskbildo - imagen de CD en bruto - CD gordinaren irudia - raaka CD-vedos - rá CD mynd - image CD brute - amhíomhá dhlúthdhiosca - imaxe de CD en bruto - תמונת דיסק גולמית - nyers CD-lemezkép - citra CD mentah - Immagine raw CD - 生 CD イメージ - өңделмеген CD бейнесі - CD 이미지 - raw CD atvaizdis - CD jēlattēls - Imej CD mentah - rått CD-bilde - ruw CD-beeldbestand - rått CD-bilete - Surowy obraz CD - imagem em bruto de CD - Imagem bruta de CD - imagine de CD brută - образ компакт-диска - Surový obraz CD - surovi CD odtis - Imazh raw CD - сирови отисак ЦД-а - rå cd-avbild - образ raw CD - ảnh đĩa CD thô - 原始 CD 映像 - 原生 CD 映像 - - - - - - - CD Table Of Contents - جدول محتويات الـ CD - Źmieściva CD - Съдържание на CD - taula de continguts de CD - Obsah CD - Cd-indholdsfotegnelse - CD-Inhaltsverzeichnis - Πίνακας Περιεχομένων CD - CD Table Of Contents - Índice de contenidos de CD - CDaren edukien aurkibidea - CD-sisällysluettelo - CD innihaldsyvurlit - table des matières de CD - clár ábhar dlúthdhiosca - táboa de contidos de CD - תוכן עניינים של דיסק - CD sadržaj - CD tartalomjegyzék - Tabel Isi CD - Indice CD - CD Table Of Contents - CD құрама кестесі - CD 내용 목록 - CD turinys - CD satura rādītājs - Innholdsfortegnelse for CD - CD-inhoudsopgave - CD innhaldsliste - Plik zawartości płyty CD - Sumário de CD - Tabel conținut CD - таблица содержания CD - Obsah CD - Kazalo vsebine CD nosilca - Tregues CD - Cd-innehållsförteckning - зміст CD - Mục Lục của đĩa CD - CD 索引 - CD 內容目錄 - - - - - - - - - - - - - - - PGN chess game notation - تدوينة لعبة الشطرنج PGN - Zaciem ab šachmatnaj partyi PGN - Игра шах — PGN - notació de joc d'escacs PGN - Šachová notace PGN - PGN-skakspilsnotation - PGN-Schachspielnotation - σημειογραφία παιχνιδιού σκακιού PGN - PGN chess game notation - notación para juegos de ajedrez PGN - PGN xake jokoaren notazioa - PGN-šakkipelinotaatio - PGN talv teknskipan - notation de jeu d'échecs PGN - nodaireacht chluiche ficheall PGN - Notación de xogo de xadrez PGN - סימון משחק שח PGN - PGN sakkfeljegyzés - Notasi permainan catur PGN - Notazione partita a scacchi PGN - PGN チェスゲーム記録 - PGN шахмат ойыны - PGN 체스게임 기보 - PGN šachmatų žaidimo žymėjimas - PGN šaha spēles notācija - PGN sjakkspillnotasjon - PGN-schaakspelnotatie - PGN-sjakkspelnotasjon - Plik PGN notacji gry w szachy - Notação de jogo de xadrez PGN - Notație joc șah PGN - шахматная партия PGN - Šachová notácia PGN - Datoteka opomb šahovske igre PGN - Njoftim loje shahu PGN - PGN-schackpartinotation - запис гри у шахи PGN - Cách ghi lượt chơi cờ PGN - PGN 象棋游戏注记 - PGN 國際象棋棋譜 - - - - - - - - - CHM document - مستند CHM - Dakument CHM - Документ — CHM - document CHM - Dokument CHM - CHM-dokument - CHM-Dokument - έγγραφο CHM - CHM document - CHM-dokumento - documento CHM - CHM dokumentua - CHM-asiakirja - CHM skjal - document CHM - cáipéis CHM - documento CHM - מסמך CHM - CHM dokument - CHM dokumentum - Dokumen CHM - Documento CHM - CHM ドキュメント - CHM დოკუმენტი - CHM құжаты - CHM 문서 - CHM dokumentas - CHM dokuments - CHM-dokument - CHM-document - CHM-dokument - Dokument CHM - Documento CHM - Document CHM - документ CHM - Dokument CHM - Dokument CHM - Dokument CHM - CHM-dokument - документ CHM - Tài liệu CHM - CHM 文档 - CHM 文件 - CHM - Compiled Help Modules - - - - - - Java byte code - رمز بايت الـJava - Java bayt kodu - Bajtavy kod Java - Байт код за Java - codi byte de Java - Bajtový kód Java - Côd beit Java - Javabytekode - Java-Bytecode - συμβολοκώδικας Java - Java byte code - Java-bajtkodo - bytecode Java - Java byte-kodea - Java-tavukoodi - Java býtkota - code Java binaire - beartchód Java - byte code de Java - קוד Java byte - Java-bájtkód - Kode bita Java - Bytecode Java - Java バイトコード - Java байт коды - 자바 바이트코드 - Java baitinis kodas - Java bitu kods - Kod bait Java - Java-bytekode - Java-bytecode - Jave byte-kode - Kod bajtowy Java - 'byte-code' Java - Código compilado Java - Bytecode Java - байт-код Java - Bajtový kód Java - Datoteka bitne kode Java - Byte code Java - Јава бајтни ко̂д - Java-bytekod - Байт-код Java - Mã byte Java - Java 字节码 - Java 位元組碼 - - - UNIX-compressed file - ملف يونكس-مضغوط - Skampresavany UNIX-fajł - Файл — компресиран за UNIX - fitxer comprimit UNIX - Soubor komprimovaný v Unixu - UNIX-komprimeret fil - UNIX-komprimierte Datei - αρχείο συμπιεσμένο με compress - UNIX-compressed file - UNIX-kunpremita dosiero - archivo comprimido de Unix - UNIX-en konprimitutako fitxategia - UNIX-pakattu tiedosto - UNIX-stappað fíla - fichier compressé UNIX - comhad UNIX-comhbhrúite - ficheiro comprimido de UNIX - קובץ מכווץ של UNIX - UNIX-komprimirana datoteka - Tömörített UNIX-fájl - Berkas terkompresi UNIX - File compresso-UNIX - UNIX-compress ファイル - файл (UNIX-сығылған) - UNIX 압축 파일 - UNIX suglaudintas failas - UNIX saspiesta datne - Fail termampat-UNIX - UNIX-komprimert fil - UNIX-ingepakt bestand - UNIX-komprimert fil - Skompresowany plik systemu UNIX - ficheiro comprimido UNIX - Arquivo compactado do UNIX - Fișier comprimat UNIX - файл (UNIX-сжатый) - Súbor komprimovaný v Unixe - Skrčena Unix datoteka - File i kompresuar UNIX - UNIX-компресована датотека - UNIX-komprimerad fil - UNIX-sıkıştırılmış dosyası - стиснений файл UNIX - Tập tin đã nén UNIX - UNIX 压缩文件 - UNIX 格式壓縮檔 - - - - - - - - Tar archive (gzip-compressed) - أرشيف Tar (مضغوط-gzip) - Archiŭ tar (gzip-skampresavany) - Архив — tar, компресиран с gzip - arxiu tar (comprimit amb gzip) - Archiv tar (komprimovaný pomocí gzip) - Tar-arkiv (gzip-komprimeret) - Tar-Archiv (gzip-komprimiert) - αρχείο Tar (συμπιεσμένο με gzip) - Tar archive (gzip-compressed) - archivador Tar (comprimido con gzip) - Tar artxiboa (gzip-ekin konprimitua) - Tar-arkisto (gzip-pakattu) - Tar skjalasavn (gzip-stappað) - archive tar (compressée gzip) - cartlann Tar (comhbhrúite le gzip) - arquivo Tar (comprimido con gzip) - ארכיון Tar (מכווץ ע"י gzip) - Tar arhiva (komprimirana gzip-om) - Tar archívum (gzip-pel tömörítve) - Arsip Tar (terkompresi gzip) - Archivio tar (compresso con gzip) - Tar アーカイブ (gzip 圧縮) - Tar архиві (gzip-пен сығылған) - TAR 묶음 파일 (GZIP 압축) - Tar archyvas (suglaudintas su gzip) - Tar arhīvs (saspiests ar gzip) - Tar-arkiv (gzip-komprimert) - Tar-archief (ingepakt met gzip) - Tar-arkiv (pakka med gzip) - Archiwum tar (kompresja gzip) - Pacote tar (compactado com gzip) - Arhivă Tar (comprimată gzip) - архив TAR (сжатый GZIP) - Archív tar (komprimovaný pomocou gzip) - Datoteka arhiva Tar (stisnjen z gzip) - Arkiv tar (i kompresuar me gzip) - Tar-arkiv (gzip-komprimerat) - архів tar (стиснений gzip) - Kho nén tar (đã nén gzip) - Tar 归档文件(gzip 压缩) - Tar 封存檔 (gzip 格式壓縮) - - - - - - - program crash data - معلومات انهيار البرنامج - źviestki złamanaj prahramy - Данни от забиване на програма - dades de fallada de programa - Data o pádu programu - programnedbrudsdata - Daten zu Programmabsturz - δεδομένα από την κατάρρευση προγράμματος - program crash data - datumo pri kraŝo de programo - datos de cuelgue de programa - programaren kraskaduraren datuak - ohjelman kaatumistiedot - forrits sordáta - données de plantage de programme - sonraí thuairt ríomhchláir - datos de colgue do programa - מידע מקריסת תוכנה - podaci o rušenju programa - összeomlott program adatai - data program macet - Dati crash di applicazione - プログラムクラッシュデータ - апатты аяқтаудың мәліметтері - 프로그램 비정상 종료 데이터 - programos nulūžimo duomenys - programmas avārijas dati - Data program musnah - krasjdata fra program - programma-crashgegevens - data om programkrasj - Dane awarii programu - dados de estoiro de aplicação - Dados de travamento de programa - date eroare program - данные аварийного завершения - Údaje o páde programu - podatki sesutja programa - Të dhëna nga programi i bllokuar - подаци о кркљавини програма - programkraschdata - аварійні дані про програму - dữ liệu sụp đổ chương trình - 程序崩溃数据 - 程式當掉資料 - - - - - - - - - - - - - - - - - - - CPIO archive - أرشيف CPIO - CPIO arxivi - Archiŭ CPIO - Архив — CPIO - arxiu CPIO - Archiv CPIO - Archif CPIO - CPIO-arkiv - CPIO-Archiv - αρχείο CPIO - CPIO archive - CPIO-arkivo - archivador CPIO - CPIO artxiboa - CPIO-arkisto - CPIO skjalasavn - archive CPIO - cartlann CPIO - arquivo CPIO - ארכיון CPIO - CPIO arhiva - CPIO-archívum - Arsip CPIO - Archivio CPIO - CPIO アーカイブ - CPIO არქივი - CPIO архиві - CPIO 묶음 파일 - CPIO archyvas - CPIO arhīvs - Arkib CPIO - CPIO-arkiv - CPIO-archief - CPIO-arkiv - Archiwum CPIO - arquivo CPIO - Pacote CPIO - Arhivă CPIO - архив CPIO - Archív CPIO - Datoteka arhiva CPIO - Arkiv CPIO - CPIO архива - CPIO-arkiv - архів CPIO - Kho nén CPIO - CPIO 归档文件 - CPIO 封存檔 - - - - - - - - - - - CPIO archive (gzip-compressed) - أرشيف CPIO (مضغوط-gzip) - CPIO arxivi (gzip ilə sıxışdırılmış) - Archiŭ CPIO (gzip-skampresavany) - Архив — CPIO, компресиран с gzip - arxiu CPIO (comprimit amb gzip) - Archiv CPIO (komprimovaný pomocí gzip) - Archif CPIO (gywasgwyd drwy gzip) - CPIO-arkiv (gzip-komprimeret) - CPIO-Archiv (gzip-komprimiert) - αρχείο CPIO (συμπιεσμένο με gzip) - CPIO archive (gzip-compressed) - CPIO-arkivo (kunpremita per gzip) - archivador CPIO (comprimido con gzip) - CPIO artxiboa (gzip-ekin konprimitua) - CPIO-arkisto (gzip-pakattu) - CPIO skjalasavn (gzip-stappað) - archive CPIO (compressé gzip) - cartlann CPIO (comhbhrúite le gzip) - arquivo CPIO (comprimido con gzip) - ארכיון CPIO (מכווץ ע"י gzip) - CPIO arhiva (komprimirana gzip-om) - CPIO-archívum (gzip-pel tömörítve) - Arsip CPIO (terkompresi gzip) - Archivio CPIO (compresso con gzip) - CPIO (gzip 圧縮) アーカイブ - CPIO არქივი (gzip-ით შეკუმშული) - CPIO архиві (gzip-пен сығылған) - CPIO 묶음 파일 (GZIP 압축) - CPIO archyvas (suglaudintas su gzip) - CPIO arhīvs (saspiests ar gzip) - Arkib CPIO (dimampatkan-gzip) - CPIO-arkiv (gzip-komprimert) - CPIO-archief (ingepakt met gzip) - CPIO-arkiv (gzip-pakka) - Archiwum CPIO (kompresja gzip) - arquivo CPIO (comprimido com gzip) - Pacote CPIO (compactado com gzip) - Arhivă CPIO (compresie gzip) - архив CPIO (сжатый GZIP) - Archív CPIO (komprimovaný pomocou gzip) - Datoteka arhiva CPIO (skrčena z gzip) - Arkiv CPIO (kompresuar me gzip) - CPIO архива (компресована gzip-ом) - CPIO-arkiv (gzip-komprimerat) - архів CPIO (стиснений gzip) - Kho nén CPIO (đã nén gzip) - CPIO 归档文件(gzip 压缩) - CPIO 封存檔 (gzip 格式壓縮) - - - - - - C shell script - سكربت شِل سي - C qabıq skripti - Skrypt abałonki C - Скрипт — обвивка C - script en C - Skript shellu C - Sgript plisgyn C - C-skalprogram - C-Shell-Skript - πρόγραμμα εντολών φλοιού C - C shell script - skripto de C-ŝelo - script en C shell - C shell script-a - Csh-komentotiedosto - C skel boðrøð - script C shell - script bhlaosc C - script de C shell - תסריט מעטפת C - C skripta - C héj-parancsfájl - Skrip shell C - Script C shell - C シェルスクリプト - C shell сценарийі - C 셸 스크립트 - C shell scenarijus - C čaulas skripts - Skrip shell C - C-skallskript - C-shellscript - C-skalskript - Skrypt powłoki C - 'script' de consola C - Script de shell C - Script C shell - сценарий C shell - Skript shellu C - Skriptna datoteka lupine C - Script shell C - C скрипта окружења - Skalskript (csh) - C kabuk betiği - скрипт оболонки C - Văn lệnh trình bao C - C shell 脚本 - C shell 指令稿 - - - - - - - - - - - - - Xbase document - مستند Xbase - Dakument Xbase - Документ — Xbase - document Xbase - Dokument Xbase - Xbasedokument - Xbase-Dokument - έγγραφο Xbase - Xbase document - Xbase-dokumento - documento Xbase - Xbase dokumentua - Xbase-asiakirja - Xbase skjal - document Xbase - cáipéis Xbase - documento Xbase - מסמך Xbase - Xbase dokumentum - Dokumen Xbase - Documento Xbase - Xbase ドキュメント - Xbase құжаты - Xbase 문서 - Xbase dokumentas - Xbase dokuments - Xbase-dokument - Xbase-document - Xbase-dokument - Dokument Xbase - Documento do Xbase - Document Xbase - документ Xbase - Dokument Xbase - Dokument Xbase - Dokument Xbase - Xbase-dokument - Xbase belgesi - документ Xbase - Tài liệu Xbase - Xbase 文档 - Xbase 文件 - - - - - - - - ECMAScript program - برنامج ECMAScript - Prahrama ECMAScript - Програма — ECMAScript - programa ECMAScript - Program ECMAScript - ECMA-program - ECMAScript-Programm - πρόγραμμα ECMAScript - ECMAScript program - programa en ECMAScript - ECMAScript programa - ECMAScript-ohjelma - ECMAScript forrit - programme ECMAScript - ríomhchlár ECMAScript - programa en ECMAScript - תכנית EMCAScript - ECMAScript program - ECMAScript program - Program ECMAScript - Programma ECMAScript - ECMAScript プログラム - ECMAScript პროგრამა - ECMAScript программасы - ECMA스크립트 프로그램 - ECMAScript programa - ECMAScript programma - ECMAScript-program - ECMAScript-programma - ECMAScript-program - Pogram ECMAScript - Programa ECMAScript - Program ECMAScript - программа ECMAScript - Program ECMAScript - Programska datoteka ECMAScript - Program ECMAScript - ECMAScript-program - ECMAScript programı - програма мовою ECMAScript - Chương trình ECMAScript - ECMAScript 程序 - ECMAScript 程式 - - - - - - - Dreamcast ROM - Dreamcast ROM - Dreamcast ROM - ROM — Dreamcast - ROM de Dreamcast - ROM pro Dreamcast - Dreamcast-rom - Dreamcast-ROM - εικόνα μνήμης ROM Dreamcast - Dreamcast ROM - Dreamcast-NLM - ROM de Dreamcast - Dreamcast-en ROM - Dreamcast-ROM - Dreamcast ROM - ROM Dreamcast - ROM Dreamcast - ROM de Dreamcast - ROM של Dreamcast - Dreamcast ROM - Dreamcast ROM - Memori baca-saja Dreamcast - ROM Dreamcast - Dreamcast ROM - Dreamcast-ის ROM - Dreamcast ROM - 드림캐스트 롬 - Dreamcast ROM - Dreamcast ROM - ROM Dreamcast - Dreamcast-ROM - Dreamcast-ROM - Dreamcast-ROM - Plik ROM konsoli Dreamcast - ROM Dreamcast - ROM do Dreamcast - ROM Dreamcast - Dreamcast ROM - ROM pre Dreamcast - Bralni pomnilnik Dreamcast - ROM Dreamcast - Dreamcast ROM - Dreamcast-rom - ППП Dreamcast - ROM Dreamcast - Dreamcast ROM - Dreamcast ROM - - - - - Nintendo DS ROM - Nintendo DS ROM - Nintendo DS ROM - ROM — Nintendo DS - ROM de Nintendo DS - ROM pro Nintendo DS - Nintendo DS-rom - Nintendo-DS-ROM - εικόνα μνήημης ROM Nintendo DS - Nintendo DS ROM - ROM de Nintendo DS - Nintendo DS-ko ROMa - Nintendo DS-ROM - Nintendo DS ROM - ROM Nintendo DS - ROM Nintendo DS - ROM de Nintendo DS - ROM של Nintendo - Nintendo DS ROM - Nintendo DS ROM - Memori baca-saja Nintendo DS - ROM Nintendo DS - Nintendo DS ROM - Nintendo DS ROM - 닌텐도 DS 롬 - Nintendo DS ROM - Nintendo DS ROM - Nintendo DS-ROM - Nintendo-DS-ROM - Nintendo DS-ROM - Plik ROM konsoli Nintendo DS - ROM do Nintendo DS - ROM Nintendo DS - Nintendo DS ROM - ROM pre Nintendo DS - Bralni pomnilnik Nintendo DS - ROM Nintendo DS - Nintendo DS-rom - Nintendo DS ROM - ППП Nintendo - ROM DS Nintendo - Nintendo DS ROM - 任天堂 DS ROM - - - - - Debian package - حزمة ديبيان - Debian paketi - Pakunak Debian - Пакет — Debian - paquet Debian - Balíček Debianu - Pecyn Debian - Debianpakke - Debian-Paket - πακέτο Debian - Debian package - Debian-pakaĵo - paquete Debian - Debian paketea - Debian-paketti - Debian pakki - paquet Debian - pacáiste Debian - paquete de Debian - חבילת דביאן - Debian paket - Debian-csomag - Paket Debian - Pacchetto Debian - Debian パッケージ - Debian-ის პაკეტი - Debian дестесі - 데비안 패키지 - Debian paketas - Debian pakotne - Pakej Debian - Debian pakke - Debian-pakket - Debian pakke - Pakiet Debiana - pacote Debian - Pacote Debian - Pachet Debian - пакет Debian - Balíček Debianu - Datoteka paketa Debian - Paketë Debian - Debian пакет - Debianpaket - Debian paketi - пакунок Debian - Gói Debian - Debian 软件包 - Debian 套件 - - - - - - - - - - - Qt Designer file - ملف Qt Designer - Fajł Qt Designer - Файл — Qt Designer - fitxer de Qt Designer - Soubor Qt Designer - Qt Designer-fil - Qt-Designer-Datei - αρχείο Qt Designer - Qt Designer file - dosiero de Qt Designer - archivo de Qt Designer - Qt Designer Fitxategia - Qt Designer -tiedosto - Qt Designer fíla - fichier Qt Designer - comhad Qt Designer - ficheiro de Qt Designer - קובץ של Qt Designer - Qt Designer-fájl - Berkas Qt Designer - File Qt Designer - Qt Designer ファイル - Qt Designer файлы - Qt 디자이너 파일 - Qt Designer failas - Qt Designer datne - Fail Qt Designer - Qt Designer-fil - Qt Designer-bestand - Qt Designer-fil - Plik Qt Designer - ficheiro do Qt Designer - Arquivo do Qt Designer - Fișier Qt Designer - файл Qt Designer - Súbor Qt Designer - Datoteka Qt Designer - File Qt Designer - Qt Designer датотека - Qt Designer-fil - файл програми Qt-дизайнер - Tập tin thiết kế Qt Designer - Qt Designer 文件 - Qt Designer 檔案 - - - - - - - - - - Qt Markup Language file - Файл — Qt Markup - fitxer de llenguatge de marcadors Qt - Soubor Qt Markup Language - Qt Markup Language-fil - Qt-Auszeichnungssprachendatei - αρχείο Qt Markup Language - Qt Markup Language file - Archivo de lenguaje de marcado Qt - fichier Qt Markup Language - ficheiro de linguaxe de marcado Qt - קובץ שפת סימון של Qt - Qt jelölőnyelvű fájl - Berkas Bahasa Markup Qt - File Qt Markup Language - Qt マークアップ言語ファイル - Qt Markup Language файлы - Qt 마크업 언어 파일 - Qt marķēšanas valodas datne - Qt Markup Tallbestand - Plik języka znaczników Qt - Arquivo de Qt Markup Language - файл Qt Markup Language - Datoteka označevalnega jezika Qt - файл мови розмітки Qt - Qt - Qt 標記語言檔 - - - - - - - desktop configuration file - ملف تضبيط سطح المكتب - kanfihuracyjny fajł asiarodździa - Файл с информация за работния плот - fitxer de configuració d'escriptori - Soubor nastavení pracovní plochy - skrivebordskonfigurationsfil - Desktop-Konfigurationsdatei - ρυθμίσεις επιφάνειας εργασίας - desktop configuration file - dosiero de agordoj de labortablo - archivo de configuración del escritorio - Mahaigainaren konfigurazio-fitxategia - työpöydän asetustiedosto - skriviborðssamansetingarfíla - fichier de configuration desktop - comhad chumraíocht deisce - ficheiro de configuración de escritorio - קובץ הגדרות של שולחן העבודה - datoteka postavki radne površine - asztalbeállító fájl - berkas konfigurasi destop - File configurazione desktop - デスクトップ設定ファイル - жұмыс үстел баптаулар файлы - 데스크톱 설정 파일 - darbastalio konfigūracijos failas - darbvirsmas konfigurācijas datne - Fail konfigurasi desktop - konfigurasjonsfil for skrivebordet - bureaublad-configuratiebestand - skrivebordsoppsettfil - Plik konfiguracji środowiska - ficheiro de configuração de área de trabalho - Arquivo de configuração de área de trabalho - fișier de configurare al desktopului - файл настроек рабочего стола - Súbor nastavení pracovnej plochy - nastavitvena datoteka namizja - File konfigurimi desktop - датотека за подешавања радне површи - skrivbordskonfigurationsfil - файл конфігурації стільниці - tập tin cấu hình môi trường - 桌面配置文件 - 桌面組態檔 - - - - - - - - - - - - - - - FictionBook document - مستند FictionBook - Документ — FictionBook - document FictionBook - Dokument FictionBook - FictionBook-dokument - FictionBook-Dokument - έγγραφο FictionBook - FictionBook document - FictionBook-dokumento - documento FictionBook - FictionBook dokumentua - FictionBook-asiakirja - FictionBook skjal - document FictionBook - cáipéis FictionBook - documento de FictionBook - מסמך FictionBook - FictionBook dokument - FictionBook-dokumentum - Dokumen FictionBook - Documento FictionBook - FictionBook ドキュメント - FictionBook-ის დოკუმენტი - FictionBook құжаты - FictionBook 문서 - FictionBook dokumentas - FictionBook dokuments - FictionBook-document - Dokument FictionBook - Documento FictionBook - Document FictionBook - документ FictionBook - Dokument FictionBook - Dokument FictionBook - FictionBook-dokument - FictionBook belgesi - документ FictionBook - Tài liệu FictionBook - FictionBook 文档 - FictionBook 文件 - - - - - - - - - - Dia diagram - خطاطة Dia - Dia diaqramı - Dyjahrama Dia - Диаграма — Dia - diagrama de Dia - Diagram Dia - Diagram Dia - Dia-diagram - Dia-Diagramm - διάγραμμα Dia - Dia diagram - Dia-diagramo - diagrama de Dia - Dia diagrama - Dia-kaavio - Dia ritmynd - diagramme Dia - léaráid Dia - diagrama de Dia - גרף של Dia - Dia dijagram - Dia-diagram - Diagram Dia - Diagramma Dia - Dia ダイアグラム - Dia-ის დიაგრამა - Dia диаграммасы - Dia 도표 - Dia diagrama - Dia diagramma - Diagram Dia - Dia-diagram - Dia-diagram - Dia diagram - Diagram Dia - diagrama Dia - Diagrama do Dia - Diagramă Dia - диаграмма Dia - Diagram Dia - Datoteka diagrama Dia - Diagramë Dia - Диа дијаграм - Dia-diagram - діаграма Dia - Biểu đồ Dia - Dia 图表 - Dia 圖表 - - - - - - - - - - Dia shape - شكل Dia - Фигура — Dia - forma del Dia - Tvary Dia - Dia-figur - Dia-Form - σχήμα Dia - Dia shape - forma de Dia - Dia-ren forma - Dia skapur - forme Dia - cruth Dia - forma de Dia - צורה של Dia - Dia oblik - Dia alakzat - Shape Dia - Sagoma Dia - Dia 図形 - Dia сызбасы - Dia 그림 - Dia forma - Dia forma - Diavorm - Kształt Dia - Formato Dia - Figură Dia - фигура Dia - Datoteka oblik Dia - Dia-figur - форма Dia - Dia 形状 - Dia 形狀 - - - - - - - - - - TeX DVI document - مستند TeX DVI - Dakument TeX DVI - Документ — TeX DVI - document TeX DVI - Dokument TeX DVI - TeX DVI-dokument - TeX-DVI-Dokument - έγγραφο TeX DVI - TeX DVI document - DVI-dokumento de TeX - documento TeX DVI - TeX DVI dokumentua - TeX DVI -asiakirja - TeX DVI skjal - document TeX DVI - cáipéis DVI TeX - documento TeX DVI - מסמך מסוג TeX DVI - TeX DVI dokument - TeX DVI-dokumentum - Dokumen TeX DVI - Documento TeX DVI - TeX DVI ドキュメント - TeX DVI құжаты - TeX DVI 문서 - TeX DVI dokumentas - TeX DVI dokuments - Dokumen TeX DVI - TeX DVI-dokument - TeX DVI-document - TeX DVI-dokument - Dokument TeX DVI - documento TeX DVI - Documento DVI TeX - Document Tex DVI - документ TeX DVI - Dokument TeX DVI - Dokument TeX DVI - Dokument TeX DVI - ТеХ ДВИ документ - TeX DVI-dokument - документ TeX DVI - Tài liệu DVI Tex - TeX DVI 文档 - TeX DVI 文件 - DVI - Device independent file format - - - - - - - - Enlightenment theme - سمة Enlightenment - Enlightenment örtüyü - Matyŭ Enlightenment - Тема — Enlightenment - tema d'Enlightenment - Motiv Enlightenment - Thema Enlightenment - Enlightenmenttema - Enlightenment-Thema - Θέμα Enlightenment - Enlightenment theme - etoso de Enlightenment - tema de Enlightenment - Enlightenment gaia - Enlightenment-teema - Enlightenment tema - thème Enlightenment - téama Enlightenment - tema de Enlightenment - ערכת נושא של Enlightenment - Enlightenment tema - Enlightenment-téma - Tema Enlightenment - Tema Enlightenment - Enlightenment テーマ - Enlightenment-ის თემა - Enlightenment темасы - 인라이튼먼트 테마 - Enlightenment tema - Enlightenment motīvs - Tema Enlightenment - Enlightenment tema - Enlightenment-thema - Enlightenment-tema - Motyw Enlightenment - tema Enlightenment - Tema do Enlightenment - Temă Enlightenment - тема Enlightenment - Motív Enlightenment - Datoteka teme Enlightenment - Tema Enlightenment - Enlightenment тема - Enlightenment-tema - Enlightenment teması - тема Enlightenment - Sắc thái Enlightenment - Enlightenment 主题 - Enlightenment 佈景主題 - - - - Egon Animator animation - تحريكة محرك Egon - Animacyja Egon Animator - Анимация — Egon Animator - animació d'Egon Animator - Animace Egon Animator - Egon Animator-animation - Egon-Animator-Animation - κινούμενα σχέδια Egon Animator - Egon Animator animation - animacio de Egon Animator - animación de Egon Animator - Egon Animator-eko animazioa - Egon Animator -animaatio - Egon Animator teknimyndagerð - animation Egon Animator - beochan Egon Animator - animación de Egon Animator - אנימצייה של Egon Animator - Egon Animator animacija - Egon Animator-animáció - Animasi Egon Animator - Animazione Egon Animator - Egon Animator アニメーション - Egon Animator-ის ანიმაცია - Egon Animator анимациясы - Egon 애니메이터 애니메이션 - Egon Animator animacija - Egon Animator animācija - Animasi Egon Animator - Egon animator-animasjon - Egon Animator-animatie - Egon Animator-animasjon - Animacja Egon Animator - animação Egon Animator - Animação do Egon Animator - Animație Egon Animator - анимация Egon Animator - Animácia Egon Animator - Datoteka animacije Egon Animator - Animim Egon Animator - Егон аниматор анимација - Egon Animator-animering - анімація Egon Animator - Hoạt ảnh Egon Animator - Egon Animator 动画 - Egon Animator 動畫 - - - - - executable - تنفيذي - vykonvalny fajł - Изпълним файл - executable - Spustitelný soubor - kørbar - Programm - εκτελέσιμο - executable - plenumebla - ejecutable - exekutagarria - suoritettava ohjelma - inningarfør - exécutable - comhad inrite - executábel - קובץ הרצה - izvršna datoteka - futtatható - dapat dieksekusi - Eseguibile - 実行ファイル - орындалатын - 실행 파일 - vykdomasis failas - izpildāmais - Bolehlaksana - kjørbar - uitvoerbaar bestand - køyrbar - Program - executável - Executável - executabil - исполняемый - Spustiteľný súbor - izvedljiva datoteka - I ekzekutueshëm - извршна - körbar fil - çalıştırılabilir - виконуваний файл - thực hiện được - 可执行文件 - 可執行檔 - - - - - - - - - - - - - - - - - - - - - FLTK Fluid file - ملف FLTK Fluid - Fajł FLTK Fluid - Интерфейс — FLTK Fluid - fitxer Fluid FLTK - Soubor FLTK Fluid - FLTK Fluid-fil - FLTK-Fluid-Datei - FLTK Fluid file - archivo FLTK Fluid - FLTK Fluid fitxategia - FLTK Fluid -tiedosto - FLTK Fluid fíla - fichier Fluid FLTK - comhad FLTK Fluid - ficheiro FLTK Fluid - קובץ FLTK Fluid - FLTK Fluid datoteka - FLTK Fluid fájl - Berkas FLTK Fluid - File FLTK Fluid - FLTK Fluid ファイル - FLTK Fluid-ის ფაილი - FLTK Fluid файлы - FLTK Fluid 파일 - FLTK Fluid failas - FLTK Fluid datne - FLTK Fluid-fil - FLTK FLUID-bestand - FLTK Fluid-fil - Plik Fluid FLTK - Arquivo Fluid do FLTK - Fișier FLTK Fluid - файл FLTK Fluid - Súbor FLTK Fluid - Datoteka FLTK Fluid - File FLTK Fluid - FLTK Fluid-fil - FLTK Fluid dosyası - файл FLTK Fluid - Tập tin Fluid FLTK - FLTK 流体文档 - FLTK Fluid 檔 - FLTK - Fast Light Toolkit - - - - - - - - - WOFF font - WOFF - Web Open Font Format - - - - - - - - Postscript type-1 font - خط Postscript type-1 - Šryft Postscript type-1 - Шрифт — Postscript Type 1 - tipus de lletra Postscript type-1 - Písmo Postscript type-1 - PostScript type-1-skrifttype - Postscript-Typ-1-Schrift - Postscript type-1 font - tipografía PostScript tipo-1 - PostScript type-1 letra-tipoa - PostScript tyyppi-1 -asiakirja - Postscript type-1 stavasnið - police Postscript Type 1 - cló Postscript type-1 - tipo de letra PostScript tipo-1 - גופן של Postscript type-1 - Postscript type-1 betűkészlet - Fonta tipe-1 Postscript - Tipo carattere Postscript type-1 - PostScript type-1 フォント - Postscript type-1 қарібі - 포스트스크립트 Type-1 글꼴 - Postscript type-1 šriftas - Postscript 1-tipa fonts - Postscript type-1 skrift - PostScript type-1-lettertype - PostScript type 1-skrifttype - Czcionka PostScript Type-1 - Fonte PostScript tipo-1 - Font Postscript type-1 - шрифт PostScript Type-1 - Písmo Postscript type-1 - Datoteka pisave Postscript vrste-1 - Lloj gërmash Postscript type-1 - Postscript type-1-typsnitt - шрифт Postscript type-1 - Phông kiểu 1 PostScript - Postscript type-1 字体 - Postscript type-1 字型 - - - - - - - - - - - - - - - - Adobe font metrics - مقاييس خط أدوبي - Adobe yazı növü metrikləri - Metryka šryftu Adobe - Шрифтова метрика — Adobe - mètrica de tipus de lletra Adobe - Metrika písma Adobe - Metrigau Ffont Adobe - Adobe skrifttypefil - Adobe-Schriftmetriken - μετρικά γραμματοσειράς Adobe - Adobe font metrics - metrikoj de Adobe-tiparo - métricas de tipografía Adobe - Adobe letra-tipoen neurriak - Adobe-kirjasinmitat - métriques de police Adobe - meadarachtaí cló Adobe - métricas de fonte de Adobe - מדדי גופן של Adobe - Adobe mjere fonta - Adobe-betűmetrika - Metrik fonta Adobe - Metriche tipo carattere Adobe - Adobe フォントメトリック - Adobe қаріп метрикалары - 어도비 글꼴 메트릭 - Adobe šriftų metrika - Adobe fonta metrika - Metrik font Adobe - Adobe skrifttypefil - Adobe-lettertype-metrieken - Adobe skrifttypemetrikk - Metryka czcionki Adobe - métrica de tipos de letra Adobe - Métricas de fonte Adobe - Dimensiuni font Adobe - метрика шрифта Adobe - Metrika písma Adobe - Matrika pisave Adobe - Metrik lloj gërmash Adobe - Adobe метрика фонта - Adobe-typsnittsmetrik - метрики шрифту Adobe - Cách đo phông chữ Adobe - Adobe 字体参数 - Adobe 字型描述檔 - - - - - BDF font - خط BDF - BDF yazı növü - Šryft BDF - Шрифт — BDF - tipus de lletra BDF - Písmo BDF - Ffont BDF - BDF-skrifttype - BDF-Schrift - γραμματοσειρά BDF - BDF font - BDF-tiparo - tipografía BDF - BDF letra-tipoa - BDF-kirjasin - BDF stavasnið - police BDF - cló BDF - tipo de fonte BDF - גופן BDF - BDF font - BDF-betűkészlet - Fonta BDF - Tipo carattere BDF - BDF フォント - BDF қарібі - BDF 글꼴 - BDF šriftas - BDF fonts - Font BDF - BDF-skrifttype - BDF-lettertype - BDF-skrifttype - Czcionka BDF - tipo de letra BDF - Fonte BDF - Font BDF - шрифт BDF - Písmo BDF - Datoteka pisave BDF - Lloj gërme BDF - BDF фонт - BDF-typsnitt - BDF fontu - шрифт BDF - Phông chữ BDF - BDF 字体 - BDF 字型 - - - - - - - - DOS font - خط DOS - DOS yazı növü - Šryft DOS - Шрифт — DOS - tipus de lletra DOS - Písmo pro DOS - Ffont DOS - DOS-skrifttype - DOS-Schrift - γραμματοσειρά DOS - DOS font - DOS-tiparo - tipografía DOS - DOS letra-tipoa - DOS-kirjasin - DOS stavasnið - police DOS - cló DOS - tipo de fonte de DOS - גופן DOS - DOS font - DOS-betűkészlet - Fonta DOS - Tipo carattere DOS - DOS フォント - DOS қарібі - DOS 글꼴 - DOS šriftas - DOS fonts - Font DOS - DOS-skrifttype - DOS-lettertype - DOS-skrifttype - Czcionka DOS - tipo de letra DOS - Fonte do DOS - Font DOS - шрифт DOS - Písmo pre DOS - Datoteka pisave DOS - Gërmë DOS - DOS фонт - DOS-typsnitt - DOS fontu - шрифт DOS - Phông chữ DOS - DOS 字体 - DOS 字型 - - - - - - - - - Adobe FrameMaker font - خط أدوبي الصانع للإطارات - Adobe FrameMaker yazı növü - Šryft Adobe FrameMaker - Шрифт — Adobe FrameMaker - tipus de lletra d'Adobe FrameMaker - Písmo Adobe FrameMaker - Ffont Adobe FrameMaker - Adobe FrameMaker-skrifttype - Adobe-FrameMaker-Schrift - γραμματοσειρά Adobe FrameMaker - Adobe FrameMaker font - Tiparo de Adobe FrameMaker - tipografía de Adobe FrameMaker - Adobe FrameMaker-en letra-tipoa - Adobe FrameMaker -kirjasin - Adobe FrameMaker stavasnið - police Adobe FrameMaker - cló Adobe FrameMaker - tipo de fonte de Adobe FrameMaker - גופן של Adobe FrameMaker - Adobe FrameMaker font - Adobe FrameMaker-betűkészlet - Fonta Adobe FrameMaker - Tipo carattere Adobe FrameMaker - Adobe FrameMaker フォント - Adobe FrameMaker қарібі - 어도비 프레임메이커 글꼴 - Adobe FrameMaker šriftas - Adobe FrameMaker fonts - Font Adobe FrameMaker - Adobe FrameMaker skrifttype - Adobe FrameMaker-lettertype - Adobe FrameMaker-skrifttype - Czcionka Adobe FrameMaker - tipo de letra Adobe FrameMaker - Fonte do Adobe FrameMaker - Font Adobe FrameMaker - шрифт Adobe FrameMaker - Písmo Adobe FrameMaker - Datoteka pisave Adobe FrameMaker - Gërma Adobe FrameMaker - Adobe FrameMaker фонт - Adobe FrameMaker-typsnitt - шрифт Adobe FrameMaker - Phông chữ Adobe FrameMaker - Adobe FrameMaker 字体 - Adobe FrameMaker 字型 - - - - - - - LIBGRX font - خط LIBGRX - LIBGRX yazı növü - Šryft LIBGRX - Шрифт — LIBGRX - tipus de lletra LIBGRX - Písmo LIBGRX - Ffont LIBGRX - LIBGRX-skrifttype - LIBGRX-Schrift - γραμματοσειρά LIBGRX - LIBGRX font - LIBGRX-tiparo - tipografía LIBGRX - LIBGRX letra-tipoa - LIBGRX-kirjasin - LIBGRX stavasnið - police LIBGRX - cló LIBGRX - tipo de fonte en LIBGRX - גופן LIBGRX - LIBGRX font - LIBGRX-betűkészlet - Fonta LIBGRX - Tipo carattere LIBGRX - LIBGRX フォーマット - LIBGRX қарібі - LIBGRX 글꼴 - LIBGRX šriftas - LIBGRX fonts - Font LIBGRX - LIBGRX-skrifttype - LIBGRX-lettertype - LIBGRX skrifttype - Czcionka LIBGRX - tipo de letra LIBGRX - Fonte LIBGRX - Font LIBGRX - шрифт LIBGRX - Písmo LIBGRX - Datoteka pisave LIBGRX - Lloj gërme LIBGRX - LIBGRX фонт - LIBGRX-typsnitt - LIBGRX fontu - шрифт LIBGRX - Phông chữ LIBGRX - LIBGRX 字体 - LIBGRX 字型 - - - - - - - Linux PSF console font - خط كونسول PSF لينكس - Linux PSF konsol yazı növü - Kansolny šryft PSF dla Linuksa - Шрифт — PSF, за конзолата на Линукс - tipus de lletra de consola Linux PSF - Písmo PSF pro konzolu Linuxu - Ffont Linux PSF - Linux PSF-konsolskrifttype - Linux-PSF-Konsolenschrift - γραμματοσειρά κονσόλας PSF Linux - Linux PSF console font - PSF-tiparo de Linux-konzolo - tipografía de consola Linux PSF - Linux PSF kontsolako letra-tipoa - Linux PSF -konsolikirjasin - Linux PSF stýristøðs stavasnið - police console Linux PSF - cló chonsól Linux PSF - tipo de fonte de consola Linux PSF - גופן לקונסול מסוג Linux PSF - Linux PSF konzolni font - Linux PSF konzolos betűkészlet - Fonta konsol Linux PSF - Tipo carattere console Linux PSF - Linux PSF コンソールフォント - Linux PSF консольдік қарібі - 리눅스 PSF 콘솔 글꼴 - Linux PSF konsolės šriftas - Linux PSF konsoles fonts - Font konsol PSF Linux - Linux PSF konsollskrifttype - Linux PSF-console-lettertype - Linux PSF konsoll-skrifttype - Czcionka konsoli PSF Linux - tipo de letra de consola Linux PSF - Fonte de console Linux PSF - Font consolă Linux PSF - консольный шрифт Linux PSF - Písmo PSF pre konzolu Linuxu - Datoteka pisave konzole Linux PSF - Lloj gërme për konsolë Linux PSF - Линукс PSF конзолни фонт - Linux PSF-konsolltypsnitt - Linux PSF konsol fontu - консольний шрифт Linux PSF - Phông chữ bàn giao tiếp PSF Linux - Linux PSF 控制台字体 - Linux PSF console 字型 - - - - - - - - Linux PSF console font (gzip-compressed) - خط كونسول PSF لينكس (مضغوط-gzip) - Kansolny šryft PSF dla Linuksa (gzip-skampresavany) - Шрифт — Linux PSF, компресиран с gzip - tipus de lletra de consola Linux PSF (comprimida amb gzip) - Písmo PSF pro konzolu Linuxu (komprimované pomocí gzip) - Linux PSF-konsolskrifttype (gzip-komprimeret) - Linux-PSF-Konsolenschrift (gzip-komprimiert) - γραμματοσειρά κονσόλας PSF Linux (συμπιεσμένη με gzip) - Linux PSF console font (gzip-compressed) - tipografía de consola Linux PSF (comprimida con gzip) - Linux PSF kontsolako letra-tipoa (gzip-ekin konprimitua) - Linux PSF -konsolikirjasin (gzip-pakattu) - Linux PSF stýristøðs stavasnið (gzip-stappað) - police console Linux PSF (compressée gzip) - cló chonsól Linux PSF (comhbhrúite le gzip) - tipo de fonte de consola Linux PSF (comprimida con gzip) - גופן לקונסול מסוג Linux PSF (מכווץ ע"י gzip) - Linux PSF konzolni font (komprimiran gzip-om) - Linux PSF konzolos betűkészlet (gzip-tömörítésű) - Fonta konsol Linux PSF (terkompresi gzip) - Tipo carattere console Linux PSF (compresso con gzip) - Linux PSF コンソールフォント (gzip 圧縮) - Linux PSF консольдік қарібі (gzip-пен сығылған) - 리눅스 PSF 콘솔 글꼴 (GZIP 압축) - Linux PSF konsolės šriftas (suglaudintas su gzip) - Linux PSF konsoles fonts (saspiests ar gzip) - Linux PSF konsollskrifttype (gzip-komprimert) - Linux PSF-console-lettertype (ingepakt met gzip) - Linux PSF konsoll-skrifttype (gzip-pakka) - Czcionka konsoli PSF Linux (kompresja gzip) - Fonte de console Linux PSF (compactada com gzip) - Font consolă Linux PSF (compresie gzip) - консольный шрифт Linux PSF (сжатый gzip) - Písmo PSF pre konzolu Linuxu (komprimované pomocou gzip) - Datoteka pisave konzole Linux PSF (skrčena z gzip) - Lloj gërme për konsolë Linux PSF (komresuar me gzip) - Linux PSF-konsolltypsnitt (gzip-komprimerat) - Linux PSF konsol fontu (gzip ile sıkıştırılmış) - консольний шрифт Linux PSF (стиснений gzip) - Phông chữ bàn giao tiếp PSF Linux (đã nén gzip) - Linux PSF 控制台字体(gzip 压缩) - Linux PSF console 字型 (gzip 格式壓縮) - - - - - - PCF font - خط PCF - PCF yazı növü - Šryft PCF - Шрифт — PCF - tipus de lletra PCF - Písmo PCF - Ffont PCF - PCF-skrifttype - PCF-Schrift - γραμματοσειρά PCF - PCF font - PCF-tiparo - tipografía PCF - PCF letra-tipoa - PCF-kirjasin - PCF stavasnið - police PCF - cló PCF - tipo de letra PCF - פונט PCF - PCF-betűkészlet - Fonta PCF - Tipo carattere PCF - PCF フォント - PCF қарібі - PCF 글꼴 - PCF šriftas - PCF fonts - Font PCF - PCF-skrifttype - PCF-lettertype - PCF-skrifttype - Czcionka PCF - tipo de letra PCF - Fonte PCF - Font PCF - шрифт PCF - Písmo PCF - Datoteka pisave PCF - Gërma PCF - PCF фонт - PCF-typsnitt - PCF fontu - шрифт PCF - Phông chữ PCF - PCF 字体 - PCF 字型 - - - - - - - - - - OpenType font - خط OpenType - OpenType yazı növü - Šryft OpenType - Шрифт — OpenType - tipus de lletra OpenType - Písmo OpenType - Ffont OpenType - OpenType-skrifttype - OpenType-Schrift - γραμματοσειρά OpenType - OpenType font - OpenType-tiparo - tipografía de OpenType - OpenType letra-tipoa - OpenType-kirjasin - OpenType stavasnið - police OpenType - cló OpenType - tipo de fonte OpenType - גופן של OpenType - OpenType-betűkészlet - Fonta OpenType - Tipo carattere OpenType - OpenType フォント - OpenType қарібі - 오픈타입 글꼴 - OpenType šriftas - OpenType fonts - Font OpenType - OpenType-skrifttype - OpenType-lettertype - OpenType-skrifttype - Czcionka OpenType - tipo de letra OpenType - Fonte OpenType - Font OpenType - шрифт OpenType - Písmo OpenType - Datoteka pisave OpenType - Gërma OpenType - OpenType фонт - OpenType-typsnitt - OpenType fontu - шрифт OpenType - Phông chữ OpenType - OpenType 字体 - OpenType 字型 - - - - - - - - Speedo font - خط Speedo - Speedo yazı növü - Šryft Speedo - Шрифт — Speedo - tipus de lletra Speedo - Písmo Speedo - Ffont Speedo - Speedoskrifttype - Speedo-Schrift - γραμματοσειρά Speedo - Speedo font - Speedo-tiparo - tipografía Speedo - Speedo letra-tipoa - Speedo-kirjasin - Speedo stavasnið - police Speedo - cló Speedo - tipo de letra Speedo - גופן של Speedo - Speedo font - Speedo-betűkészlet - Fonta Speedo - Tipo carattere Speedo - Speedo フォント - Speedo қарібі - Speedo 글꼴 - Speedo šriftas - Speedo fonts - Font Speedo - Speedo-skrifttype - Speedo-lettertype - Speedo-skrifttype - Czcionka Speedo - tipo de letra Speedo - Fonte Speedo - Font Speedo - шрифт Speedo - Písmo Speedo - Datoteka pisave Speedo - Gërma Speedo - Speedo фонт - Speedo-typsnitt - Speedo fontu - шрифт Speedo - Phông chữ Speedo - Speedo 字体 - Speedo 字型 - - - - - - - - SunOS News font - خط SunOS News - SunOS News yazı növü - Šryft SunOS News - Шрифт — SunOS News - tipus de lletra SunOS News - Písmo SunOS News - Ffont SunOS News - SunOS News-skrifttype - SunOS-News-Schrift - γραμματοσειρά SunOS News - SunOS News font - tiparo de SunOS News - tipografía SunOS News - SunOs News letra-tipoa - SunOS News -kirjasin - SunOS News stavasnið - police SunOS News - cló SunOS News - tipo de letra SunOS News - גופן של SunOS News - SunOS News font - SunOS News-betűkészlet - Fonta SunOS News - Tipo carattere SunOS News - SunOS News フォント - SunOS News қарібі - SunOS News 글꼴 - SunOS News šriftas - SunOS News fonts - Font News SunOS - SunOS News-skrifttype - SunOS News-lettertype - SunOS NEWS-skrifttype - Czcionka SunOS News - tipo de letra SunOS News - Fonte SunOS News - Font SunOS News - шрифт SunOS News - Písmo SunOS News - Datoteka pisave SunOS News - Gërma SunOS News - SunOS News фонт - SunOS News-typsnitt - шрифт SunOS News - Phông chữ SunOS News - SunOS News 字体 - SunOS News 字型 - - - - - - - - - TeX font - خط TeX - TeX yazı növü - Šryft TeX - Шрифт — TeX - tipus de lletra TeX - Písmo TeX - Ffont TeX - TeX-skrifttype - TeX-Schrift - γραμματοσειρά TeX - TeX font - TeX-tiparo - tipografía de TeX - TeX letra-tipoa - TeX-kirjasin - TeX stavasnið - police TeX - cló TeX - tipo de letra de TeX - גופן TeX - TeX font - TeX-betűkészlet - Fonta TeX - Tipo carattere TeX - TeX フォント - TeX қарібі - TeX 글꼴 - TeX šriftas - TeX fonts - Font TeX - TeX-skrift - TeX-lettertype - TeX-skrifttype - Czcionka TeX - tipo de letra TeX - Fonte TeX - Font TeX - шрифт TeX - Písmo TeX - Datoteka pisave TeX - Gërma TeX - ТеХ фонт - TeX-typsnitt - TeX fontu - шрифт TeX - Phông chữ TeX - TeX 字体 - TeX 字型 - - - - - - - - - TeX font metrics - مقاييس خط TeX - TeX yazı növü metrikləri - Metryka šryftu TeX - Шрифтова метрика — TeX - mètrica de tipus de lletra TeX - Metrika písma TeX - Metrigau Ffont TeX - TeX-skrifttypeinformation - TeX-Schriftmetriken - μετρικά γραμματοσειράς TeX - TeX font metrics - metrikoj de TeX-tiparo - métricas de tipografía de TeX - TeX letra-tipoen neurriak - TeX-kirjasinmitat - métriques de police TeX - meadarachtaí cló TeX - Métricas de tipo de letra de TeX - גופן מטריקס של TeX - TeX mjere fonta - TeX-betűmetrika - Fonta metrik TeX - Metriche tipo carattere TeX - TeX フォントメトリック - TeX қаріп метрикалары - Tex 글꼴 메트릭 - TeX šriftų metrika - TeX fonta metrikas - Metrik font TeX - TeX skrifttypemetrikk - TeX-lettertype-metrieken - TeX skrifttypemetrikk - Metryki czcionki TeX - métricas de tipo de letra TeX - Métrica de fonte TeX - Dimensiuni font TeX - метрика шрифта TeX - Metrika písma TeX - Matrika pisave Tex - Gërma TeX metrics - ТеХ метрика фонта - TeX-typsnittsmetrik - метрики шрифту TeX - Cách đo phông chữ TeX - TeX 字体参数 - TeX 字型描述檔 - - - - - - - - TrueType font - خط TrueType - Šryft TrueType - Шрифт — TrueType - tipus de lletra TrueType - Písmo TrueType - TrueType-skrifttype - TrueType-Schrift - γραμματοσειρά TrueType - TrueType font - TrueType-tiparo - tipografía TrueType - TrueType letra-tipoa - TrueType-kirjasin - TrueType stavasnið - police Truetype - cló TrueType - tipo de letra TrueType - גופן מסוג TrueType - TrueType font - TrueType-betűkészlet - Fonta TrueType - Tipo carattere TrueType - TrueType フォント - TrueType қарібі - 트루타입 글꼴 - TrueType šriftas - TrueType fonts - Font TrueType - TrueType-skrift - TrueType-lettertype - TrueType-skrifttype - Czcionka TrueType - tipo de letra TrueType - Fonte TrueType - Font TrueType - шрифт TrueType - Písmo TrueType - Datoteka pisave TrueType - Lloj gërme TrueType - Трутајп фонт - Truetype-typsnitt - TrueType fontu - шрифт TrueType - Phông chữ TrueType - TrueType 字体 - TrueType 字型 - - - - - - - - - - - TrueType XML font - خط TrueType XML - Šryft TrueType XML - Шрифт — TrueType XML - tipus de lletra TrueType XML - Písmo TrueType XML - TrueType XML-skrifttype - TrueType-XML-Schrift - γραμματοσειρά XML TrueType - TrueType XML font - tipografía TrueType XML - TrueType XML letra-tipoa - TrueType-XML-kirjasin - TrueType XML stavasnið - police Truetype XML - cló XML TrueType - tipo de letra TrueType XML - גופן XML מסוג TrueType - TrueType XML font - TrueType XML betűkészlet - Fonta TrueType XML - Tipo carattere TrueType XML - TrueType XML フォント - TrueType XML қарібі - 트루타입 XML 글꼴 - TrueType XML šriftas - TrueType XML fonts - TrueType XML-skrift - TrueType XML-lettertype - TrueType XML-skrifttype - Czcionka TrueType XML - Fonte TrueType XML - Font XML TrueType - шрифт TrueType XML - Písmo TrueType XML - Datoteka pisave TrueType XML - Lloj gërme TrueType XML - Truetype XML-typsnitt - TrueType XML fontu - шрифт TrueType XML - Phông chữ XML TrueType - TrueType XML 字体 - TrueType XML 字型 - - - - - - - - - V font - خط V - V yazı növü - Šryft V - Шрифт — V - tipus de lletra V - Písmo V - Ffont V - V-skrifttype - V-Schrift - γραμματοσειρά V - V font - V-tiparo - tipografía V - V letra-tipoa - V-kirjasin - V stavasnið - police V - cló V - tipo de letra V - גופן של V - V font - V-betűkészlet - Fonta V - Tipo carattere V - V フォント - V font қарібі - V 글꼴 - V šriftas - V fonts - Font V - V-skrift - V-lettertype - V-skrifttype - Czcionka V - tipo de letra V - Fonte V - Font V - шрифт V font - Písmo V - Datoteka pisave V - Gërmë V - V фонт - V-typsnitt - V fontu - V-шрифт - Phông chữ V - V 字体 - V 字型 - - - - - - - Adobe FrameMaker document - مستند أدوبي الصانع للإطارات - Dakument Adobe FrameMaker - Документ — Adobe FrameMaker - document FrameMaker d'Adobe - Dokument Adobe FrameMaker - Adobe FrameMaker-dokument - Adobe-FrameMaker-Dokument - αρχείο Adobe FrameMaker - Adobe FrameMaker document - Dokumento de Adobe FrameMaker - documento de Adobe FrameMaker - Adobe FrameMaker-en dokumentua - Adobe FrameMaker -asiakirja - Adobe FrameMaker skjal - document Adobe FrameMaker - cáipéis Adobe FrameMaker - documento de Adobe FrameMaker - מסמך Adobe FrameMaker - Adobe FrameMaker dokument - Adobe FrameMaker-dokumentum - Dokumen Adobe FrameMaker - Documento Adobe FrameMaker - Adobe FrameMaker ドキュメント - Adobe FrameMaker-ის დოკუმენტი - Adobe FrameMaker құжаты - 어도비 프레임메이커 문서 - Adobe FrameMaker dokumentas - Adobe FrameMaker dokuments - Adobe FrameMaker-dokument - Adobe FrameMaker-document - Adobe FrameMaker-dokument - Dokument Adobe FrameMaker - Documento do Adobe FrameMaker - Document Adobe FrameMaker - документ Adobe FrameMaker - Dokument Adobe FrameMaker - Dokument Adobe FrameMaker - Dokument Adobe FrameMaker - Adobe FrameMaker-dokument - документ Adobe FrameMaker - Tài liệu Adobe FrameMaker - Adobe FrameMaker 文档 - Adobe FrameMaker 文件 - - - - - - - - - - - - - Game Boy ROM - Game Boy ROM - Game Boy ROM - ROM — Game Boy - ROM de Game Boy - ROM pro Game Boy - Game Boy-rom - Game-Boy-ROM - εικόνα μνήμης ROM GameBoy - Game Boy ROM - NLM de Game Boy - ROM de Game Boy - Game Boy-eko ROMa - Game Boy -ROM - Game Boy ROM - ROM Game Boy - ROM Game Boy - ROM de Game Boy - ROM של Game Boy - Game Boy ROM - Game Boy ROM - Memori baca-saja Game Boy - ROM Game Boy - ゲームボーイ ROM - Game Boy-ის ROM - Game Boy ROM - 게임보이 롬 - Game Boy ROM - Game Boy ROM - ROM Game Boy - Game Boy-ROM - Game Boy-ROM - Game Boy-ROM - Plik ROM konsoli Game Boy - ROM Game Boy - ROM do Game Boy - ROM Game Boy - Game Boy ROM - ROM pre Game Boy - Bralni pomnilnik Game Boy - ROM Game Boy - Гејмбој РОМ - Game Boy-rom - ППП Game Boy - ROM Game Boy - Game Boy ROM - Game Boy ROM - - - - - Game Boy Advance ROM - Game Boy Advance ROM - Game Boy Advance ROM - ROM — Game Boy Advance - ROM de Game Boy Advance - ROM pro Game Boy Advance - Game Boy Advance-rom - Game-Boy-Advance-ROM - εικόνα μνήμης Game Boy Advance - Game Boy Advance ROM - ROM de Game Boy Advance - Game Boy Advance-ko ROMa - Game Boy Advance -ROM - Game Boy Advance ROM - ROM Game Boy Advance - ROM Game Boy Advance - ROM de Game Boy Advance - ROM של Game Boy Advance - Game Boy Advance ROM - Game Boy Advance ROM - Memori baca-saja Game Boy Advance - ROM Game Boy Advance - ゲームボーイアドバンス ROM - Game Boy Advance-ის ROM - Game Boy Advance ROM - 게임보이 어드밴스 롬 - Game Boy Advance ROM - Game Boy Advance ROM - Game Boy Advance-ROM - Game Boy Advance-ROM - Game Boy Advance-ROM - Plik ROM konsoli Game Boy Advance - ROM do Game Boy Advance - ROM Game Boy Advance - Game Boy Advance ROM - ROM pre Game Boy Advance - Bralni pomnilnik Game Boy Advance - ROM Game Boy Advance - Game Boy Advance-rom - розширений ППП Game Boy - ROM Game Boy Advance - Game Boy Advance ROM - Game Boy Advance ROM - - - - - GDBM database - قاعدة بيانات GDBM - Baza źviestak GDBM - База от данни — GDBM - base de dades GDBM - Databáze GDBM - GDBM-database - GDBM-Datenbank - βάση δεδομένων GDBM - GDBM database - GDBM-datumbazo - base de datos GDBM - GDBM datu-basea - GDBM-tietokanta - GDBM dátustovnur - base de données GDBM - bunachar sonraí GDBM - base de datos GDBM - בסיס נתונים GDBM - GDBM baza podataka - GDBM adatbázis - Basis data GDBM - Database GDBM - GDBM データベース - GDBM მონაცემთა ბაზა - GDBM дерекқоры - GDBM 데이터베이스 - GDBM duomenų bazė - GDBM datubāze - GDBM-database - GDBM-gegevensbank - GDBM-database - Baza danych GDBM - Banco de dados GDBM - Bază de date GDBM - база данных GDBM - Databáza GDBM - Podatkovna zbirka GDBM - Bazë me të dhëna GDBM - GDBM-databas - GDBM veritabanı - база даних GDBM - Cơ sở dữ liệu GDBM - GDBM 数据库 - GDBM 資料庫 - GDBM - GNU Database Manager - - - - - - - - - Genesis ROM - Genesis ROM - Genesis ROM - ROM — Genesis - ROM de Genesis - ROM pro Genesis - Genesis-rom - Genesis-ROM - εικόνα μνήμης ROM Genesis - Genesis ROM - Genesis-NLM - ROM de Genesis (Mega Drive) - Genesis-eko ROMa - Genesis-ROM - Genesis ROM - ROM Mega Drive/Genesis - ROM Genesis - ROM xenérica - ROM של Genesis - Genesis ROM - Genesis ROM - Memori baca-saja Genesis - ROM Megadrive - メガドライブ ROM - Genesis ROM - 제네시스 롬 - Genesis ROM - Genesis ROM - ROM Genesis - Genesis-ROM - Mega Drive - Genesis-ROM - Plik ROM konsoli Mega Drive - ROM Genesis - ROM do Gênesis (Mega Drive) - ROM Genesis - Genesis ROM - ROM pre Megadrive - Bralni pomnilnik Genesis - ROM Genesis - Genesis РОМ - Genesis-rom - ППП Genesis - ROM Genesis - Genesis ROM - Genesis ROM - - - - - - - - - - translated messages (machine-readable) - رسائل مترجمة (مقروءة آليا) - pierakładzienyja paviedamleńni (dla čytańnia kamputaram) - Преведени съобщения — машинен формат - missatges traduïts (llegible per màquina) - Přeložené zprávy (strojově čitelné) - oversatte meddelelser (maskinlæsbare) - Übersetzte Meldungen (maschinenlesbar) - μεταφρασμένα μηνύματα (για μηχανική ανάγνωση) - translated messages (machine-readable) - tradukitaj mesaĝoj (maŝinlegebla) - mensajes traducidos (legibles por máquinas) - itzulitako mezuak (ordenagailuek irakurtzeko) - käännetyt viestit (koneluettava) - týdd boð (maskin-lesifør) - messages traduits (lisibles par machine) - teachtaireachtaí aistrithe (inléite ag meaisín) - mensaxes traducidos (lexíbeis por máquinas) - מסר מתורגם (מובן ע"י מכונה) - prevedene poruke (strojno čitljive) - lefordított üzenetek (gépi kód) - pesan diterjemahkan (dapat dibaca mesin) - Messaggi tradotti (leggibili da macchina) - 翻訳メッセージ (マシン用) - ნათარგმნი შეტყობინებები (მანქანისთვის განკუთვნილი) - аударылған хабарламалар (машиналық түрде) - 번역 메시지 (컴퓨터 사용 형식) - išversti užrašai (kompiuteriniu formatu) - pārtulkotie ziņojumi (mašīnlasāms) - Mesej diterjemah (bolehdibaca-mesin) - oversatte meldinger (maskinlesbar) - vertaalde berichten (machine-leesbaar) - oversette meldingar (maskinlesbare) - Przetłumaczone komunikaty (czytelne dla komputera) - mensagens traduzidas (leitura pelo computador) - Mensagens traduzidas (legível pelo computador) - mesaje traduse (citite de calculator) - переводы сообщений (откомпилированые) - Preložené správy (strojovo čitateľné) - prevedena sporočila (strojni zapis) - Mesazhe të përkthyer (të lexueshëm nga makina) - преведене поруке (машинама читљиво) - översatta meddelanden (maskinläsbara) - перекладені повідомлення (у машинній формі) - thông điệp đã dịch (máy đọc được) - 消息翻译(机读) - 翻譯訊息 (程式讀取格式) - - - - - - - - - GTK+ Builder - - - - - - - - - Glade project - مشروع Glade - Glade layihəsi - Prajekt Glade - Проект — Glade - projecte de Glade - Projekt Glade - Prosiect Glade - Gladeprojekt - Glade-Projekt - έργο Glade - Glade project - Glade-projekto - proyecto de Glade - Glade proiektua - Glade-projekti - Glade verkætlan - projet Glade - tionscadal Glade - proxecto de Glade - מיזם Glade - Glade projekt - Glade-projekt - Proyek Glade - Progetto Glade - Glade プロジェクト - Glade жобасы - Glade 프로젝트 - Glade projektas - Glade projekts - Projek Glade - Glade prosjekt - Glade-project - Glade prosjekt - Projekt Glade - projecto Glade - Projeto do Glade - Proiect Glade - проект Glade - Projekt Glade - Datoteka projekta Glade - Projekt Glade - Глејд пројекат - Glade-projekt - проект Glade - Dự án Glade - Glade 工程 - Glade 專案 - - - - - - - - - GMC link - وصلة GMC - GMC körpüsü - Spasyłka GMC - Връзка — GMC - enllaç GMC - Odkaz GMC - Cyswllt GMC - GMC-henvisning - GMC-Verweis - σύνδεσμος GMC - GMC link - GMC-ligilo - enlace GMC - GMC esteka - GMC-linkki - GMC leinkja - lien GMC - nasc GMC - ligazón GMC - קישור GMC - GMC veza - GMC-link - Taut GMC - Collegamento GMC - GMC リンク - GMC ბმული - GMC сілтемесі - GMC 연결 - GMC nuoroda - GMC saite - Pautan GMC - GMC-lenke - GMC-verwijzing - GMC-lenkje - Odnośnik GMC - 'link' GMC - Link GMC - Legătură GMC - ссылка GMC - Odkaz GMC - Datoteka povezave GMC - Lidhje GMC - GMC веза - GMC-länk - GMC bağlantısı - посилання GMC - Liên kết GMC - GMC 链接 - GMC 鏈結 - - - - - - - GnuCash financial data - معلومات GnuCash المالية - Финансови данни — GnuCash - dades financeres del GnuCash - Finanční data GnuCash - Finansielle data til GnuCash - GnuCash-Finanzdaten - οικονομικά στοιχεία GnuCash - GnuCash financial data - datos financieros GnuCash - GnuCash finantzako datuak - GnuCash-taloustiedot - GnuCash fíggjarligar dátur - données financières GnuCash - sonraí airgeadúla GnuCash - datos financeiros de GNUCash - מידע כלכלי של GnuCash - GnuCash financijski podaci - GnuCash pénzügyi adatok - Data keuangan GnuCash - Dati finanziari GnuCash - GnuCash 会計データ - GnuCash қаржы ақпараты - GnuCash 재정 자료 - GnuCash finansiniai duomenys - GnuCash finanšu dati - GnuCash financiële gegevens - Dane finansowe GnuCash - Dados financeiros do GnuCash - Date financiare GnuCash - финансовые данные GnuCash - Finančné údaje GnuCash - Datoteka finančnih podatkov GnuCash - GnuCash-finansdata - фінансові дані GnuCash - Dữ liệu tài chính GnuCash - GnuCash 财务数据 - GnuCash 財務資料 - - - - - - - Gnumeric spreadsheet - جدول Gnumeric - Raźlikovy arkuš Gnumeric - Таблица — Gnumeric - full de càlcul de Gnumeric - Sešit Gnumeric - Gnumeric-regneark - Gnumeric-Tabelle - Λογιστικό φύλλο Gnumeric - Gnumeric spreadsheet - Gnumeric-kalkultabelo - hoja de cálculo de Gnumeric - Gnumeric kalkulu-orria - Gnumeric-taulukko - Gnumeric rokniark - feuille de calcul Gnumeric - scarbhileog Gnumeric - folla de cálculo de Gnumeric - גליון עבודה Gnumeric - Gnumeric proračunska tablica - Gnumeric-munkafüzet - Lembar sebar Gnumeric - Foglio di calcolo Gnumeric - Gnumeric スプレッドシート - Gnumeric электрондық кестесі - Gnumeric 스프레드시트 - Gnumeric skaičialentė - Gnumeric izklājlapa - Hamparan Gnumeric - Gnumeric-regneark - Gnumeric-rekenblad - Gnumeric-rekneark - Arkusz Gnumeric - folha de cálculo Gnumeric - Planilha do Gnumeric - Foaie de calcul Gnumeric - электронная таблица Gnumeric - Zošit Gnumeric - Razpredelnica Gnumeric - Fletë llogaritjesh Gnumeric - Гнумерик табеларни рачун - Gnumeric-kalkylblad - ел. таблиця Gnumeric - Bảng tính Gnumeric. - Gnumeric 工作簿 - Gnumeric 試算表 - - - - - - - - - Gnuplot document - مستند Gnuplot - Dakument Gnuplot - Документ — Gnuplot - document gnuplot - Dokument Gnuplot - Gnuplotdokument - Gnuplot-Dokument - έγγραφο Gnuplot - Gnuplot document - Gnuplot-dokumento - documento de Gnuplot - Gnuplot dokumentua - Gnuplot-asiakirja - Gnuplot skjal - document Gnuplot - cáipéis Gnuplot - documento de Gnuplot - מסמך Gnuplot - Gnuplot dokument - Gnuplot dokumentum - Dokumen Gnuplot - Documento Gnuplot - Gnuplot ドキュメント - Gnuplot құжаты - Gnuplot 문서 - Gnuplot dokumentas - Gnuplot dokuments - Gnuplot-dokument - Gnuplot-document - Gnuplot-dokument - Dokument Gnuplot - Documento do Gnuplot - Document Gnuplot - документ Gnuplot - Dokument Gnuplot - Dokument Gnuplot - Dokument Gnuplot - Gnuplot-dokument - документ Gnuplot - Tài liệu Gnuplot - Gnuplot 文档 - Gnuplot 文件 - - - - - - - - Graphite scientific graph - مبيان الجرافيت العلمي - Navukovy hrafik Graphite - Графика — Graphite - gràfic científic Graphite - Vědecký graf Graphite - Graphite videnskabelig graf - Wissenschaftlicher Graphite-Graph - επιστημονικό γράφημα Graphite - Graphite scientific graph - scienca grafikaĵo de Graphite - gráfica científica de Graphite - Graphite - grafiko zientifikoak - Graphite- tieteellinen graafi - Grapite vísindarlig ritmynd - graphe Graphite scientific - graf eolaíoch Graphite - gráfica científica de Graphite - גרך מדעי של Graphite - Graphite znanstveni grafikon - Graphite tudományos grafikon - Grafik sains Graphite - Grafico scientifico Graphite - Graphite scientific グラフ - Graphite ғылыми кескіні - Graphite 과학 그래프 - Graphite mokslinė diagrama - Graphite zinātniskais grafiks - Graf saintifik Graphite - Vitenskapelig graf fra Graphite - Graphite wetenschappelijke grafiek - Graphite vitskaplege graf - Wykres naukowy Graphite - gráfico científico Graphite - Gráfico científico do Graphite - Grafic științific Graphite - научная диаграмма Graphite - Vedecký graf Graphite - Datoteka znanstvenega grafa Graphite - Grafik shkencor Graphite - Graphite научни графикони - Vetenskaplig Graphite-grafer - наукова графіка Graphite - Biểu đồ khoa học Graphite - Graphite 科学图形 - Graphite 科學圖表 - - - - - GTKtalog catalog - كتالوج GTKtalog - Kataloh GTKtalog - Каталог — Gtktalog - catàleg de GTKtalog - Katalog GTKtalog - GTKtalog-katalog - GTKtalog-Katalog - Κατάλογος GTKtalog - GTKtalog catalogue - katalogo de GTKtalog - catálogo de GTKtalog - Gtktalog katalogoa - GTKtalog-luettelo - GTKtalog skrá - catalogue Gtktalog - catalóg GTKtalog - catálogo de GTKtalog - קטלוג GTKtalog - GTKtalog katalog - GTKtalog-katalógus - Katalog GTKtalog - Catalogo GTKtalog - GTKtalog カタログ - GTKtalog-ის კატალოგი - GTKtalog каталогы - GTKtalog 카탈로그 - GTKtalog katalogas - GTKtalog katalogs - Katalog GTKtalog - GTKtalog-katalog - GTKtalog-catalogus - GTKtalog-katalog - Katalog programu GTKtalog - catálogo GTKtalog - Catálogo GTKtalog - Catalog GTKalog - каталог GTKtalog - Katalóg GTKtalog - Datoteka kataloga GTKtalog - Katallog GTKtalog - Гткталог каталог - GTKtalog-katalog - каталог GTKtalog - Phân loại GTKtalog - GTKtalog 目录 - GTKtalog 光碟目錄 - - - - - - - TeX DVI document (gzip-compressed) - مستند TeX DVI (مضغوط-gzip) - Dakument TeX DVI (gzip-skampresavany) - Документ — TeX DVI, компресиран с gzip - document TeX DVI (comprimit amb gzip) - Dokument TeX DVI (komprimovaný pomocí gzip) - TeX DVI-dokument (gzip-komprimeret) - TeX-DVI-Dokument (gzip-komprimiert) - αρχείο TeX DVI (συμπιεσμένο με gzip) - TeX DVI document (gzip-compressed) - documento DVI de TeX (comprimido con gzip) - TeX DVI dokumentua (gzip-ekin konprimitua) - TeX DVI -asiakirja (gzip-pakattu) - TeX DVI skjal (gzip-stappað) - document DVI TeX (compressé gzip) - cáipéis DVI TeX (comhbhrúite le gzip) - documento DVI de TeX (comprimido con gzip) - מסמך מסוג TeX DVI (מכווץ ע"י gzip) - TeX DVI dokument (komprimiran gzip-om) - TeX DVI dokumentum (gzip-pel tömörítve) - Dokumen TeX DVI (terkompresi gzip) - Documento Tex DVI (compresso con gzip) - Tex DVI ドキュメント (gzip 圧縮) - TeX DVI құжаты (gzip-пен сығылған) - TeX DVI 문서 (GZIP 압축) - TeX DVI dokumentas (suglaudintas su gzip) - TeX DVI dokuments (saspiests ar gzip) - TeX DVI-dokument (gzip-komprimert) - TeX DVI-document (ingepakt met gzip) - TeX DVI-dokument (pakka med gzip) - Dokument TeX DVI (kompresja gzip) - Documento DVI TeX (compactado com gzip) - Document TeX DVI (comprimat gzip) - документ TeX DVI (сжатый gzip) - Dokument TeX DVI (komprimovaný pomocou gzip) - Dokument TeX DVI (stisnjen z gzip) - Dokument TeX DVI (i kompresuar me gzip) - TeX DVI-dokument (gzip-komprimerat) - TeX DVI belgesi (gzip ile sıkıştırılmış) - документ TeX DVI (стиснений gzip) - Tài liệu DVI TeX (đã nén gzip) - TeX DVI 文档(gzip 压缩) - TeX DVI 文件 (gzip 格式壓縮) - - - - - - Gzip archive - أرشيف Gzip - Archiŭ gzip - Архив — gzip - arxiu gzip - Archiv gzip - Gzip-arkiv - Gzip-Archiv - συμπιεσμένο αρχείο Gzip - Gzip archive - Gzip-arkivo - archivador Gzip - Gzip artxiboa - Gzip-arkisto - Gzip skjalasavn - archive gzip - cartlann Gzip - arquivo Gzip - ארכיון Gzip - Gzip arhiva - Gzip archívum - Arsip Gzip - Archivio gzip - Gzip アーカイブ - Gzip архиві - GZIP 압축 파일 - Gzip archyvas - Gzip arhīvs - Gzip-arkiv - Gzip-archief - Gzip-arkiv - Archiwum gzip - Pacote Gzip - Arhivă Gzip - архив GZIP - Archív gzip - Datoteka arhiva Gzip - Arkiv gzip - Gzip-arkiv - архів gzip - Kho nén gzip - Gzip 归档文件 - Gzip 封存檔 - - - - - - - - - PDF document (gzip-compressed) - مستند PDF (مضغوط-gzip) - Dakument PDF (gzip-skampresavany) - Документ — PDF, компресиран с gzip - document PDF (comprimit amb gzip) - Dokument PDF (komprimovaný pomocí gzip) - PDF-dokument (gzip-komprimeret) - PDF-Dokument (gzip-komprimiert) - έγγραφο PDF (συμπιεσμένο με gzip) - PDF document (gzip-compressed) - documento PDF (comprimido con gzip) - PDF dokumentua (gzip-ekin konprimitua) - PDF-asiakirja (gzip-pakattu) - PDF skjal (gzip-stappað) - document PDF (compressé gzip) - cáipéis PDF (comhbhrúite le gzip) - documento PDF (comprimido en gzip) - מסמך PDF (מכווץ ע"י gzip) - PDF dokumentum (gzip-tömörítésű) - Dokumen PDF (terkompresi gzip) - Documento PDF (compresso con gzip) - PDF ドキュメント (gzip 圧縮) - PDF құжаты (gzip-пен сығылған) - PDF 문서 (GZIP 압축) - PDF dokumentas (suglaudintas su gzip) - PDF dokuments (saspiests ar gzip) - PDF-dokument (gzip-komprimert) - PDF-document (ingepakt met gzip) - PDF-dokument (pakka med gzip) - Dokument PDF (kompresja gzip) - Documento PDF (compactado com gzip) - Document PDF (comprimat gzip) - документ PDF (сжатый gzip) - Dokument PDF (komprimovaný pomocou gzip) - Dokument PDF (stisnjen z gzip) - Dokument PDF (i kompresuar me gzip) - PDF-dokument (gzip-komprimerat) - PDF belgesi (gzip ile sıkıştırılmış) - документ PDF (стиснений gzip) - Tài liệu PDF (đã nén gzip) - PDF 文档(gzip 压缩) - PDF 文件 (gzip 格式壓縮) - - - - - - PostScript document (gzip-compressed) - مستند PostScript (مضغوط-gzip) - Dakument PostScript (gzip-skampresavany) - Документ — PostScript, компресиран с gzip - document PostScript (comprimit amb gzip) - Dokument PostScript (komprimovaný pomocí gzip) - PostScript-dokument (gzip-komprimeret) - PostScript-Dokument (gzip-komprimiert) - έγγραφο PostScript (συμπιεσμένο με gzip) - PostScript document (gzip-compressed) - PostScript-dokumento (kunpremita per gzip) - documento PostScript (comprimido con gzip) - PostScript dokumentua (gzip-konprimitua) - PostScript-asiakirja (gzip-pakattu) - PostScript skjal (gzip-stappað) - document PostScript (compressé gzip) - cáipéis PostScript (comhbhrúite le gzip) - documento PostScript (comprimido con gzip) - מסמך PostScript (מכוות ע"י gzip) - PostScript-dokumentum (gzip-pel tömörítve) - Dokumen PostScript (terkompresi gzip) - Documento PostScript (compresso con gzip) - PostScript ドキュメント (gzip 圧縮) - PostScript құжаты (gzip-пен сығылған) - 포스트스크립트 문서 (GZIP 압축) - PostScript dokumentas (suglaudintas su gzip) - PostScript dokuments (saspiests ar gzip) - Dokumen PostScript (dimampatkan-gzip) - PostScript-dokument (gzip-komprimert) - PostScript-document (ingepakt met gzip) - PostScript-dokument (pakka med gzip) - Dokument Postscript (kompresja gzip) - documento PostScript (comprimido com gzip) - Documento PostScript (compactado com gzip) - Document PostScript (comprimat gzip) - документ PostScript (сжатый gzip) - Dokument PostScript (komprimovaný pomocou gzip) - Dokument PostScript (stisnjen z gzip) - Dokument PostScript (i kompresuar me gzip) - Постскрипт документ (компресована gzip-ом) - Postscript-dokument (gzip-komprimerat) - документ PostScript (стиснене gzip) - Tài liệu PostScript (đã nén gzip) - PostScript 文档(gzip 压缩) - PostScript 文件 (gzip 格式壓縮) - - - - - - HDF document - مستند HDF - HDF sənədi - Dakument HDF - Документ — HDF - document HDF - Dokument HDF - Dogfen HDF - HDF-dokument - HDF-Dokument - έγγραφο HDF - HDF document - HDF-dokumento - documento HDF - HDF dokumentua - HDF-asiakirja - HDF skjal - document HDF - cáipéis HDF - documento HDF - מסמך HDF - HDF dokument - HDF-dokumentum - Dokumen HDF - Documento HDF - HDF ドキュメント - HDF құжаты - HDF 문서 - HDF dokumentas - HDF dokuments - Dokumen HDF - HDF-dokument - HDF-document - HDF-dokument - Dokument HDF - documento HDF - Documento HDF - Document HDF - документ HDF - Dokument HDF - Dokument HDF - Dokument HDF - HDF документ - HDF-dokument - документ HDF - Tài liệu HDF - HDF 文档 - HDF 文件 - HDF - Hierarchical Data Format - - - - - - - - - - - - - IFF file - IFF - Interchange File Format - - - - - - iPod firmware - برنامج عتاد الـiPod - Firmware iPod - Фърмуер за iPod - microprogramari d'iPod - Firmware iPod - iPod-styreprogram - iPod-Firmware - εικόνα μνήμης firmware iPod - iPod firmware - iPod-mikroprogramaro - firmware de iPod - iPod firmwarea - iPod-laiteohjelmisto - iPod fastbúnaður - firmware iPod - dochtearraí iPod - firmware de iPod - קושחת ipod - iPod-firmware - peranti tegar iPod - Firmware iPod - iPod ファームウェア - iPod микробағдарламасы - iPod 펌웨어 - iPod programinė įranga - iPod aparātprogrammatūra - Firmware iPod - iPod-firmware - iPod-firmware - iPod-firmvare - Oprogramowanie wewnętrzne iPod - 'firmware' iPod - Firmware do iPod - Firmware iPod - микропрограмма iPod - Firmware iPod - Programska strojna oprema iPod - Firmware iPod - iPod програм - fast iPod-program - мікропрограма iPod - phần vững iPod - iPod 固件 - iPod 韌體 - - - - - - Java archive - أرشيف Java - Archiŭ Java - Архив — Java - arxiu Java - Archiv Java - Javaarkiv - Java-Archiv - αρχείο Java - Java archive - Java-arkivo - archivador Java - Java artxiboa - Java-arkisto - Java skjalasavn - archive Java - cartlann Java - arquivo Java - ארכיון Java - Java arhiva - Java-archívum - Arsip Java - Archivio Java - Java アーカイブ - Java архиві - 자바 묶음 파일 - Java archyvas - Java arhīvs - Arkib Java - Java-arkiv - Java-archief - Java-arkiv - Archiwum Java - arquivo Java - Pacote Java - Arhivă Java - архив Java - Archív Java - Datoteka arhiva Java - Arkiv Java - Јава архива - Java-arkiv - Java arşivi - архів Java - Kho nén Java - Java 归档文件 - Java 封存檔 - - - - - - - - Java class - صنف java - Klasa Java - Клас на Java - classe Java - Třída Java - Javaklasse - Java-Klasse - κλάση Java - Java class - Java-klaso - clase Java - Java-ko klasea - Java-luokka - Java flokkur - classe Java - aicme Java - clase de Java - מחלקת Java - Java klasa - Java-osztály - Kelas Java - Classe Java - Java クラス - Java класы - 자바 클래스 - Java klasė - Java klase - Kelas Java - Java-klasse - Java-klasse - Java-klasse - Klasa Java - classe Java - Classe Java - Clasă Java - класс Java - Trieda Java - Datoteka razreda Java - Klasë Java - Јава класа - Java-klass - Java sınıfı - клас Java - Hạng Java - Java 类 - Java class - - - - - - - - - - - - JNLP file - ملف JNLP - Fajł JNLP - Файл — JNLP - fitxer JNLP - Soubor JNLP - JNPL-fil - JNLP-Datei - αρχείο JNLP - JNLP file - JNLP-dosiero - archivo JNPL - JNLP fitxategia - JNLP-tiedosto - JNLP fíla - fichier JNLP - comhad JNLP - ficheiro JNLP - קובץ JNLP - JNLP datoteka - JNLP fájl - Berkas JNLP - File JNPL - JNLP ファイル - JNLP файлы - JNLP 파일 - JNLP failas - JNLP datne - JNLP-fil - JNLP-bestand - JNLP-fil - Plik JNLP - Arquivo JNLP - Fișier JNLP - файл JNLP - Súbor JNLP - Datoteka JNLP - File JNLP - JNLP-fil - JNLP dosyası - файл JNLP - Tập tin JNLP - JNLP 文件 - JNLP 檔案 - JNLP - Java Network Launching Protocol - - - - - - - - - Java keystore - مخزن مفاتيح جافا - Ключодържател — Java - magatzem de claus Java - Java keystore - Javanøglelager - Java-Schlüsselbund - χώρος αποθήκευσης κλειδιών Java - Java keystore - almacén de claves de Java - Java-ren gako-biltegia - Java-avainvarasto - Java lyklagoymsla - stockage de clés Java - eochairstór Java - almacén de chaves de Java - הקשת מקלדת של Java - Java kulcstároló - Penyimpanan kunci Java - Keystore Java - Java キーストア - Java сақталымы - 자바 키 저장소 - Java raktų saugykla - Java keystore - Java keystore - Baza kluczy Java - Keystore de Java - Stocare chei Java - хранилище ключей Java - Úložisko kľúčov Java - Datoteka tipkovne razporeditve Java - Java-nyckellager - сховище ключів Java - Java 密钥库 - Java 金鑰儲存 - - - - - - - - - Java JCE keystore - مخزن مفاتيح Java JCE - Ключодържател — Java JCE - magatzem de claus JCE Java - Java JCE keystore - Java JCE-nøglelager - Java JCE-Schlüsselbund - Java JCE keystore - almacén de claves JCE de Java - Java JCE-ren gako-biltegia - Java JCE -avainvarasto - Java JCE lyklagoymsla - stockage de clés Java JCE - eochairstór Java JCE - almacén de chves JCE de Java - הקשה מסוג Java JCE - Java JCE kulcstároló - Penyimpanan kunci Java JCE - Keystore Java JCE - Java JCE キーストア - Java JCE сақталымы - 자바 JCE 키 저장소 - Java JCE raktų saugykla - Java JCE keystore - Java JCE keystore - Baza kluczy Java JCE - Keystore JCE do Java - Stocare chei Java JCE - хранилище ключей Java JCE - Úložisko kľúčov Java JCE - Datoteka tipkovne razporeditve Java JCE - Java JCE-nyckellager - сховище ключів JCE Java - Java JCE 密钥库 - Java JCE 金鑰儲存 - JCE - Java Cryptography Extension - - - - - - - Pack200 Java archive - أرشيف Pack200 Java - Archiŭ Pack200 Java - Архив — Java Pack200 - arxiu Java Pack200 - Archiv Java Pack200 - Pack200 Java-arkiv - Pack200-Java-Archiv - αρχείο Java Pack200 - Pack200 Java archive - archivador Pack200 Java - Pack2000 Java artxiboa - Pack200-Java-arkisto - Pack200 Java skjalasavn - archive Java Pack200 - cartlann Java Pack200 - arquivo Pack200 Java - ארכיון מסוג Pack200 Java - Pack200 Java-archívum - Arsip Pack200 Java - Archivio Pack200 Java - Pack200 Java アーカイブ - Pack200 Java архиві - Pack200 자바 압축 파일 - Pack200 Java archyvas - Pack200 Java arhīvs - Pack200 Java-arkiv - Pack200 Java-archief - Pack200 Java-arkiv - Archiwum Java Pack200 - Pacote Java Pack200 - Arhivă Java Pack2000 - архив Java Pack200 - Archív Java Pack200 - Datoteka arhiva Pack200 Java - Arkiv Java Pack200 - Pack200 Java-arkiv - Pack200 Java arşivi - архів Java Pack200 - Kho nén Java Pack200 - Pack200 Java 归档文件 - Pack200 Java 封存檔 - - - - - - - - JavaScript program - برنامج جافاسكربت - Prahrama JavaScript - Програма на JavaScript - programa JavaScript - Program v JavaScriptu - JavaScript-program - JavaScript-Programm - πρόγραμμα JavaScript - JavaScript program - JavaScript-programo - programa en JavaScript - JavaScript programa - JavaScript-ohjelma - JavaScript forrit - programme JavaScript - ríomhchlár JavaScript - programa JavaScript - תכנית JavaScript - JavaScript program - JavaScript-program - Program JavaScript - Programma JavaScript - JavaScript プログラム - JavaScript бағдарламасы - 자바스크립트 프로그램 - JavaScript programa - JavaScript programma - Program JavaScript - JavaScript-program - JavaScript-programma - JavaScript-program - Pogram JavaScript - Programa JavaScript - Program JavaScript - сценарий JavaScript - Program jazyka JavaScript - Programska datoteka JavaScript - Program JavaScript - JavaScript-program - JavaScript programı - програма мовою JavaScript - Chương trình JavaScript - Javascript 程序 - JavaScript 程式 - - - - - - - - JBuilder project - مشروع JBuilder - Prajekt JBuilder - Проект — JBuilder - projecte de JBuilder - Projekt JBuilder - JBuilder-projekt - JBuilder-Projekt - έργο JBuilder - JBuilder project - JBuilder-projekto - proyecto JBuilder - JBuilder proiektua - JBuilder-projekti - JBuilder verkætlan - projet JBuilder - tionscadal JBuilder - proxecto de JBuilder - מיזם JBuilder - JBuilder projekt - JBuilder-projekt - Proyek JBuilder - Progetto JBuilder - JBuilder プロジェクト - JBuilder жобасы - JBuilder 프로젝트 - JBuilder projektas - JBuilder projekts - Projek JBuilder - JBuilder-prosjekt - JBuilder-project - JBuilder-prosjekt - Projekt JBuilder - projecto JBuilder - Projeto do JBuilder - Proiect JBuilder - проект JBuilder - Projekt JBuilder - Datoteka projekta JBuilder - Projekt JBuilder - JBuilder пројекат - JBuilder-projekt - JBuilder projesi - проект JBuilder - Dự án JBuilder - JBuilder 工程 - JBuilder 專案 - - - - - - Karbon14 drawing - تصميم Karbon14 - Rysunak Karbon14 - Чертеж — Karbon14 - dibuix de Karbon14 - Kresba Karbon14 - Karbon14-tegning - Karbon14-Zeichnung - σχέδιο Karbon14 - Karbon14 drawing - Karbon14-grafikaĵo - dibujo de Karbon14 - Karbon14 marrazkia - Karbon14-piirros - Karbon14 tekning - dessin Karbon14 - líníocht Karbon14 - debuxo de Karbon14 - ציור Karbon14 - Karbon14 crtež - Karbon14-rajz - Gambar Karbon14 - Disegno Karbon14 - Karbon14 ドロー - Karbon14 суреті - Karbon14 그림 - Karbon14 piešinys - Karbon14 zīmējums - Lukisan Karbon14 - Karbon14-tegning - Karbon14-tekening - Karbon14-teikning - Rysunek Karbon14 - desenho Karbon14 - Desenho do Karbon14 - Desen Karbon14 - изображение Karbon14 - Kresba Karbon14 - Datoteka risbe Karbon14 - Vizatim Karbon14 - Karbon14 цртеж - Karbon14-teckning - Karbon14 çizimi - малюнок Karbon14 - Bản vẽ Karbon14 - Karbon14 绘图 - Karbon14 繪圖 - - - - - - - - - - - - - - - - - KChart chart - رسم بياني KChart - Hrafik KChart - Диаграма — KChart - diagrama de KChart - Graf Chart - KChart-diagram - KChart-Diagramm - γράφημα KChart - KChart chart - KChart-diagramo - gráfica de KChart - KChart diagrama - KChart-kaavio - KChart strikumynd - graphique KChart - cairt KChart - gráfica de KChart - תרשים KChart - KChart grafikon - KChart-grafikon - Bagan KChart - Grafico KChart - KChart チャート - KChart диаграммасы - KChart 차트 - KChart diagrama - KChart diagramma - Carta KChart - KChart-graf - KChart-grafiek - KChart-diagram - Wykres KChart - gráfico KChart - Gráfico do KChart - Diagramă KChart - диаграмма KChart - Graf KChart - Datoteka grafikona KChart - Grafik KChart - KChart графикон - KChart-diagram - діаграма KChart - Sơ đồ KChart - KChart 图表 - KChart 圖表 - - - - - - - - - - - - - - - - - Kexi settings for database server connection - إعدادات Kexi للإتصال بخادم قاعدة البيانات - Връзка към база от данни — Kexi - configuració del Kexi per a la connexió al servidor de bases de dades - Nastavení Kexi ke spojení s databázovým serverem - Kexiopsætning til forbindelsen for databaseserveren - Kexi-Einstellungen für Verbindung zum Datenbankserver - ρυθμίσεις Kexi για σύνδεση με εξυπηρετητή βάσεων δεδομένων - Kexi settings for database server connection - configuración de Kexi para la conexión con el servidor de bases de datos - Kexi-ren ezarpenak datu-basearen zerbitzariarekin konektatzeko - Kexi-tietokantayhteysasetukset - Kexi stillingar fyri dátustovnsambætara sambinding - paramètres Kexi pour connexion au serveur de base de données - socruithe Kexi do cheangal le freastalaí bunachair sonraí - configuración de Kexi para conexión con servidor de base de datos - הגדרות של Kexi עבור חיבור שרת לבסיס נתונים - Kexi beállítások adatbáziskiszolgáló-kapcsolathoz - Tatanan Kexi bagi koneksi server basis data - Impostazioni Kexi per connessione a server di database - データベースサーバ接続用の Kexi 設定 - Дерекқор серверге байланыс Kexi баптаулары - Kexi 데이터베이스 서버 연결 설정 - Kexi duomenų bazės ryšio su serveriu parametrai - Kexi iestatījumi datubāzes servera savienojumam - Kexi instellingen voor database server connectie - Ustawienia Kexi dla połączenia serwera bazy danych - Configurações do Kexi para conexão a servidor de banco de dados - Configurări Kexi pentru conexiunea la serverul de baze de date - параметры Kexi для подключения к серверу БД - Nastavenia Kexi pre pripojenie k databázovému serveru - Strežniška povezava do nastavitvene datoteke Kexi. - Kexi-inställningar för anslutning till databasserver - параметри Kexi для встановлення з’єднання з сервером бази даних - Kexi 数据库服务器连接设置 - Kexi 設定值 (資料庫伺服器連線用) - - - - shortcut to Kexi project on database server - اختصار لمشروع Kexi على خادم قاعدة بيانات - Връзка към проект — Kexi - drecera a projecte del Kexi en un servidor de base de dades - Zástupce projektu Kexi na databázovém serveru - genvej til Kexiprojekt på databaseserver - Schnellzugriff zum Kexi-Projekt auf dem Datenbankserver - συντόμευση σε έργο Kexi στον εξυπηρετητή βάσης δεδομένων - shortcut to Kexi project on database server - acceso directo a proyecto Kexi en el servidor de bases de datos - lasterbidea datu-basearen zerbitzariko Kexi proiekturako - snarvegur til Kexi verkætlan á dátustovnsambætara - raccourci vers projet Kexi sur serveur de base de données - aicearra go tionscadal Kexi ar fhreastalaí bunachair sonraí - acceso directo a proxecto Kexi no servidor de bases de datos - קיצור דרך לפרוירט Kexi בשרת נתונים - prečac za Kexi projekt na poslužitelju baze podataka - indítóikon adatbázis-kiszolgálón lévő Kexi projektre - pintasan ke projek Kexi pada server basis data - Scorciatoia a progetto Kexi su server di database - データベースサーバの Kexi プロジェクトへのショートカット - дерекқор серверіндегі Kexi жобасына сілтеме - 데이터베이스 서버의 Kexi 프로젝트 바로 가기 - nuoroda į Kexi projektą duomenų bazės serveryje - īsceļš uz Kexi projektu datubāzes serverī - shortcut naar Kexi project op database server - Skrót do projektu Kexi na serwerze bazy danych - Atalho para projeto Kexi no servidor de banco de dados - scurtătură către un proiect Kexi pe un server de baze de date - ссылка на проект Kexi на сервере БД - bližnjica do Kexi projekta na podatkovnem strežniku - genväg till Kexi-projekt på databasserver - скорочення для проекту Kexi на сервері бази даних - 数据库服务器上 Kexi 项目的快捷方式 - 資料庫伺服器上 Kexi 專案的捷徑 - - - - Kexi database file-based project - مشروع قاعدة بيانات Kexi يعتمد على ملفات - Проект с база от данни — Kexi - projecte basat en fitxer de base de dades del Kexi - Projekt založený na souboru databáze Kexi - Filbaseret projekt for Kexidatabase - Dateibasiertes Kexi-Datenbankprojekt - Kexi database file-based project - proyecto basado en el archivo-base de datos Kexi - Kexi datu-baseko fitxategian oinarritutako proiektua - Kexi dátustovns fílugrundað verkætlan - projet de base de données Kexi en mode fichier - tionscadal bunachair sonraí Kexi bunaithe ar chomhaid - proxecto baseado no ficheiro-base de datos Kexi - פרויקט בסיס נתונים מבוסס-קובץ של Kexi - Kexi adatbázisfájl-alapú projekt - Projek berbasis berkas basis data Kexi - Progetto su file di database Kexi - Kexi データベース ファイルベースプロジェクト - Файл негізінде жоба үшін Kexi дерекқоры - Kexi 데이터베이스 파일 기반 프로젝트 - Kexi duomenų bazės failo tipo projektas - Kexi datubāzes datnes balstīts projekts - Kexi database bestandgebaseerd project - Projekt bazy danych Kexi oparty na pliku - Projeto de banco de dados baseado em arquivo do Kexi - Proiect bazat pe fișiere al bazei de date Kexi - файловый проект базы данных Kexi - Datoteka projekta podatkovne zbirke Kexi - Kexi-databas för filbaserat projekt - проект файлової бази даних Kexi - Kexi 基于文件的数据库项目 - Kexi 資料庫檔案基礎專案 - - - - - Kexi database file-based project - مشروع قاعدة بيانات Kexi يعتمد على ملفات - Проект с база от данни — Kexi - projecte basat en fitxer de base de dades del Kexi - Projekt založený na souboru databáze Kexi - Filbaseret projekt for Kexidatabase - Dateibasiertes Kexi-Datenbankprojekt - Kexi database file-based project - proyecto basado en el archivo-base de datos Kexi - Kexi datu-baseko fitxategian oinarritutako proiektua - Kexi dátustovns fílugrundað verkætlan - projet de base de données Kexi en mode fichier - tionscadal bunachair sonraí Kexi bunaithe ar chomhaid - proxecto baseado no ficheiro-base de datos Kexi - פרויקט בסיס נתונים מבוסס-קובץ של Kexi - Kexi adatbázisfájl-alapú projekt - Projek berbasis berkas basis data Kexi - Progetto su file di database Kexi - Kexi データベース ファイルベースプロジェクト - Файл негізінде жоба үшін Kexi дерекқоры - Kexi 데이터베이스 파일 기반 프로젝트 - Kexi duomenų bazės failo tipo projektas - Kexi datubāzes datnes balstīts projekts - Kexi database bestandgebaseerd project - Projekt bazy danych Kexi oparty na pliku - Projeto de banco de dados baseado em arquivo do Kexi - Proiect bazat pe fișiere al bazei de date Kexi - файловый проект базы данных Kexi - Datoteka projekta podatkovne zbirke Kexi - Kexi-databas för filbaserat projekt - проект файлової бази даних Kexi - Kexi 基于文件的数据库项目 - Kexi 資料庫檔案基礎專案 - - - - - - - KFormula formula - صيغة KFormula - Formuła KFormula - Формула — KFormula - fórmula de KFormula - Vzorec KFormula - KFormula-formel - KFormula-Formel - μαθηματικός τύπος KFormula - KFormula formula - KFormula-formulo - fórmula de KFormula - KFormula formula - KFormula-kaava - KFormula frymil - formule KFormula - foirmle KFormula - fórmula de KFormula - נוסחת KFormula - KFormula formula - KFormula-képlet - Formula KFormula - Formula KFormula - KFormula 計算式 - KFormula формуласы - KFormula 수식 - KFormula formulė - KFormula formula - Formula KFormula - KFormula-formel - KFormula-formule - KFormula-formel - Formuła KFormula - fórmula KFormula - Fórmula do KFormula - Formulă KFormula - формула KFormula - Vzorec KFormula - Datoteka formule KFormula - Formulë KFormula - KFormula формула - KFormula-formel - KFormula formülü - формула KFormula - Công thức KFormula - KFormula 公式 - KFormula 公式 - - - - - - - - - - - - - - - - - KIllustrator drawing - تصميم KIllustrator - Rysunak KIllustrator - Чертеж — KIllustrator - dibuix de KIllustrator - Kresba KIllustrator - KIllustrator-tegning - KIllustrator-Zeichnung - σχέδιο KIllustrator - KIllustrator drawing - KIllustrator-grafikaĵo - dibujo de KIllustrator - KIllustrator marrazkia - KIllustrator-piirros - KIllustrator tekning - dessin KIllustrator - líníocht KIllustrator - debuxo de KIllustrator - ציור KIllustrator - KIllustrator crtež - KIllustrator-rajz - Gambar KIllustrator - Disegno KIllustrator - KIllustrator ドロー - KIllustrator суреті - KIllustrator 그림 - KIllustrator piešinys - KIllustrator zīmējums - Lukisan KIllustrator - KIllustrator-tegning - KIllustrator-tekening - KIllustrator-teikning - Rysunek KIllustrator - desenho KIllustrator - Desenho do KIllustrator - Desen KIllustrator - изображение KIllustrator - Kresba KIllustrator - Datoteka risbe KIllustrator - Vizatim KIllustrator - KIllustrator цртеж - KIllustrator-teckning - KIllustrator çizimi - малюнок KIllustrator - Bản vẽ KIllustrator - KIllustrator 绘图 - KIllustrator 繪圖 - - - - - - - - - - - - Kivio flowchart - قائمة تدفق Kivio - Blok-schiema Kivio - Диаграма — Kivio - diagrama de flux de Kivio - Vývojový diagram Kivio - Kiviorutediagram - Kivio-Flussdiagramm - διάγραμμα ροής Kivio - Kivio flowchart - Kivo-fluskemo - diagrama de flujo de Kivio - Kivio diagrama - Kivio-vuokaavio - Kivio leiðarit - diagramme de flux Kivio - sreabhchairt Kivio - gráfica de fluxo de Kivio - תרשים זרימה של Kivio - Kivio dijagram toka - Kivio-folyamatábra - Bagan Kivio - Diagramma di flusso Kivio - Kivio フローチャート - Kivio диаграммасы - Kivio 흐름도 - Kivio eigos diagrama - Kivio blokshēma - Cartalir Kivio - Kivio-flytdiagram - Kivio-stroomschema - Kivio-flytdiagram - Diagram przepływów Kivio - gráfico de fluxo Kivio - Fluxograma do Kivio - Diagramă Kivio - диаграмма Kivio - Vývojový diagram Kivio - Datoteka grafikona Kivio - Diagramë fluksi Kivio - Kivio дијаграм - Kivio-flödesschema - блок-схема Kivio - Lược đồ Kivio - Kivio 流程图 - Kivio 圖表 - - - - - - - - - - - - - - - - - Kontour drawing - تصميم Kontour - Rysunak Kontour - Чертеж — Kontour - dibuix de Kontour - Kresba Kontour - Kontourtegning - Kontour-Zeichnung - σχέδιο Kontour - Kontour drawing - Kontour-grafikaĵo - dibujo de Kontour - Kontour marrazkia - Kontour-piirros - Kontour tekning - dessin Kontour - líníocht Kontour - debuxo de Kontour - ציור Kontour - Kontour crtež - Kontour-rajz - Gambar Kontour - Disegno Kontour - Kontour ドロー - Kontour суреті - Kontour 그림 - Kontour piešinys - Kontour zīmējums - Lukisan Kontour - Kontour-tegning - Kontour-tekening - Kontour-teikning - Rysunek Kontour - desenho Kontour - Desenho do Kontour - Desen Kontour - изображение Kontour - Kresba Kontour - Datoteka risbe Kontour - Vizatim Kontour - Kontour цртеж - Kontour-teckning - Kontour çizimi - малюнок Kontour - Bản vẽ Kontour - Kontour 绘图 - Kontour 繪圖 - - - - - - - - - - - - - - - - - KPovModeler scene - مشهد KPovModeler - Scena KPovModeler - Сцена — KPovModeler - escena de KPovModeler - Scéna KPovModeler - KPovModeler-scene - KPovModeler-Szene - σκηνή KPovModeler - KPovModeler scene - KPovModeler-sceno - escena de KPovModeler - KPovModeler eszena - KPovModeler-näkymä - KPovModeler leikmynd - scène KPovModeler - radharc KPovModeler - escena de KPovModeler - סצנת KPovModeler - KPovModeler scena - KPovModeler-jelenet - Scene KPovModeler - Scena KPovModeler - KPovModeler シーン - KPovModeler сахнасы - KPovModeler 장면 - KPovModeler scena - KPovModeler aina - Babak KPovModeler - KPovModeler-scene - KPovModeler-scène - KPovModeler-scene - Scena KPovModeler - cenário KPovModeler - Cena do KPovModeler - Scenă KPovModeler - сцена KPovModeler - Scéna KPovModeler - Datoteka scene KPovModeler - Skenë KPovModeler - KPovModeler сцена - KPovModeler-scen - сцена KPovModeler - Cảnh KPovModeler - KPovModeler 场景 - KPovModeler 場景 - - - - - KPresenter presentation - عرض تقديمي KPresenter - Prezentacyja KPresenter - Презентация — KPresenter - presentació de KPresenter - Prezentace KPresenter - KPresenter-præsentation - KPresenter-Präsentation - παρουσίαση KPresenter - KPresenter presentation - KPresenter-prezentaĵo - presentación de KPresenter - Kpresenter aurkezpena - KPresenter-esitys - KPresenter framløga - présentation KPresenter - láithreoireacht KPresenter - presentación de KPresenter - מצגת KPresenter - KPresenter prezentacija - KPresenter-bemutató - Presentasi KPresenter - Presentazione KPresenter - KPresenter プレゼンテーション - KPresenter презентациясы - KPresenter 프리젠테이션 - KPresenter pateiktis - KPresenter prezentācija - Persembahan Kpresenter - KPresenter-presentasjon - KPresenter-presentatie - KPresenter-presentasjon - Prezentacja KPresenter - apresentação KPresenter - Apresentação do KPresenter - Prezentare KPresenter - презентация KPresenter - Prezentácia KPresenter - Predstavitev KPresenter - Prezantim i KPresenter - KPresenter презентација - KPresenter-presentation - KPresenter sunum dosyası - презентація KPresenter - Trình diễn KPresenter - KPresenter 演示文稿 - KPresenter 簡報檔 - - - - - - - - - - - - - - - - - - Krita document - مستند Krita - Dakument Krita - Документ — Krita - document de Krita - Dokument Krita - Kritadokument - Krita-Dokument - έγγραφο Krita - Krita document - Krita-dokumento - documento de Krita - Krita dokumentua - Krita-asiakirja - Krita skjal - document Krita - cáipéis Krita - documento de Krita - מסמך Krita - Krita dokument - Krita-dokumentum - Dokumen Krita - Documento Krita - Krita ドキュメント - Krita құжаты - Krita 문서 - Krita dokumentas - Krita dokuments - Dokumen Krita - Krita-dokument - Krita-document - Krita-dokument - Dokument Krita - documento Krita - Documento do Krita - Document Krita - документ Krita - Dokument Krita - Dokument Krita - Dokument Krita - Krita документ - Krita-dokument - Krita belgesi - документ Krita - Tài liệu Krita - Krita 文档 - Krita 文件 - - - - - - - - - - - - - - - - - KSpread spreadsheet - جدول KSpread - Raźlikovy arkuš KSpread - Таблица — KSpread - full de càlcul de KSpread - Sešit KSpread - KSpread-regneark - KSpread-Tabelle - λογιστικό φύλλο KSpread - KSpread spreadsheet - KSpread-kalkultabelo - hoja de cálculo de KSpread - KSpread kalkulu-orria - KSpread-taulukko - KSpread rokniark - feuille de calcul KSpread - scarbhileog KSpread - folla de cálculo de KSpread - גליון נתונים של Kspread - KSpread proračunska tablica - KSpread-munkafüzet - Lembar sebar KSpread - Foglio di calcolo KSpread - KSpread スプレッドシート - KSpread электрондық кестесі - KSpread 스프레드시트 - KSpread skaičialentė - KSpread izklājlapa - Hamparan KSpread - KSpread-regneark - KSpread-rekenblad - KSpread-rekneark - Arkusz KSpread - folha de cálculo KSpread - Planilha do KSpread - Foaie de calcul KSpread - электронная таблица KSpread - Zošit KSpread - Preglednica KSpread - Fletë llogaritjesh KSpread - KSpread табеларни прорачун - KSpread-kalkylblad - ел. таблиця KSpread - Bảng tính KSpread - KSpread 工作簿 - KSpread 試算表 - - - - - - - - - - - - - - - - - KSpread spreadsheet (encrypted) - جدول KSpread (مشفر) - Raźlikovy arkuš KSpread (zašyfravany) - Таблица — KSpread, шифрирана - full de càlcul de KSpread (xifrat) - Sešit KSpread (šifrovaný) - KSpread-regneark (krypteret) - KSpread-Tabelle (verschlüsselt) - λογιστικό φύλλο KSpread (κρυπτογραφημένο) - KSpread spreadsheet (encrypted) - KSpread-kalkultabelo (ĉifrita) - hoja de cálculo de KSpread (cifrada) - KSpread kalkulu-orria (enkriptatua) - KSpread-taulukko (salattu) - KSpread rokniark (bronglað) - feuille de calcul KSpread (chiffrée) - scarbhileog KSpread (criptithe) - folla de cálculo de KSpread (cifrada) - גליון נתונים של KSpread (מוצפן) - KSpread proračunska tablica (šifrirana) - KSpread-munkafüzet (titkosított) - Lembar sebar KSpread (terenkripsi) - Foglio di calcolo KSpread (cifrato) - KSpread (暗号化) スプレッドシート - KSpread электрондық кестесі (шифрленген) - 암호화된 KSpread 스프레드시트 - KSpread skaičialentė (užšifruota) - KSpread izklājlapa (šifrēta) - Hampatan KSpread (terenkripsi) - KSpread-regneark (kryptert) - KSpread-rekenblad (versleuteld) - Kryptert KSpread-rekneark - Arkusz KSpread (zaszyfrowany) - folha de cálculo KSpread (cifrada) - Planilha do KSpread (criptografada) - Foaie de calcul KSpread (criptat) - электронная таблица KSpread (зашифрованная) - Zošit KSpread (šifrovaný) - Preglednica KSpread (šifrirana) - Fletë llogaritjesh KSpread (e kriptuar) - KSpread табеларни прорачун (шифровани) - KSpread-kalkylblad (krypterat) - ел. таблиця KSpread (зашифрована) - Bảng tính KSpread (đã mật mã) - KSpread 加密工作簿 - KSpread 試算表 (已加密) - - - - - - - KSysV init package - حزمة KSysV init - Inicyjalny pakunak KSysV - Пакет — KSysV init - paquet d'inici KSysV - Balíček init KSysV - KSsV init-pakke - KSysV-Init-Paket - KSysV init package - paquete de configuración de init para KSysV - KSysV hasieratzeko paketea - KSysV init -paketti - KSysV init pakki - paquet d'initialisation KSysV - pacáiste thosú KSysV - paquete de KsysV init - חבילת KSysV init - KSysV init paket - KSysV init csomag - Paket init KSysV - Pacchetto init KSysV - KSysV init パッケージ - KSysV инициализация дестесі - KSysV init 패키지 - KSysV init paketas - KSysV inicializācijas pakotne - KSysV init-pakke - KSysV-init-pakket - KSysV init-pakke - Pakiet KSysV init - Pacote init do KSysV - Pachet KSysV init - пакет инициализации KSysV - Balíček KSysV init - Datoteka paketa KSysV init - Paketë init KSysV - KSysV init-paket - пакунок KSysV init - Gói sở khởi KSysV - KSysV init 软件包 - KSysV init 套件 - - - - - - - - - Kugar document - مستند Kugar - Dakument Kugar - Документ — Kugar - document de Kugar - Dokument Kugar - Kugardokument - Kugar-Dokument - έγγραφο Kugar - Kugar document - Kugar-dokumento - documento de Kugar - Kugar dokumentua - Kugar-asiakirja - Kugar skjal - document Kugar - cáipéis Kugar - documento de Kugar - מסמך Kugar - Kugar dokument - Kugar-dokumentum - Dokumen Kugar - Documento Kugar - KuKrita ドキュメント - Kugar құжаты - Kugar 문서 - Kugar dokumentas - Kugar dokuments - Dokumen Kugar - Kugar-dokument - Kugar-document - Kugar-dokument - Dokument Kuguar - documento Kugar - Documento do Kugar - Document Kugar - документ Kugar - Dokument Kugar - Dokument Kugar - Dokument Kugar - Kugar документ - Kugar-dokument - Kugar belgesi - документ Kugar - Tài liệu Kugar - Kugar 文档 - Kugar 文件 - - - - - KWord document - مستند KWord - Dakument KWord - Документ — KWord - document de KWord - Dokument KWord - Dogfen KWord - KWord-dokument - KWord-Dokument - έγγραφο KWord - KWord document - KWord-dokumento - documento de KWord - KWord dokumentua - KWord-asiakirja - KWord skjal - document KWord - cáipéis KWord - documento de KWord - מסמך KWord - KWord dokument - KWord-dokumentum - Dokumen KWord - Documento KWord - KWord ドキュメント - KWord құжаты - KWord 문서 - KWord dokumentas - KWord dokuments - Dokumen KWord - KWord-dokument - KWord-document - KWord-dokument - Dokument KWord - documento KWord - Documento do KWord - Document KWord - документ KWord - Dokument KWord - Dokument KWord - Dokument KWord - KWord документ - KWord-dokument - KWord belgesi - документ KWord - Tài liệu KWord - KWord 文档 - KWord 文件 - - - - - - - - - - - - - - - - - - KWord document (encrypted) - مستند KWord (مشفر) - Dakument KWord (zašyfravany) - Документ — KWord, шифриран - document de KWord (xifrat) - Dokument KWord (šifrovaný) - KWord-dokument (krypteret) - KWord-Dokument (verschlüsselt) - έγγραφο KWord (κρυπτογραφημένο) - KWord document (encrypted) - KWord-dokumento (ĉifrita) - documento de KWord (cifrado) - KWord dokumentua (enkriptatua) - KWord-asiakirja (salattu) - KWord skjal (bronglað) - document KWord (chiffré) - cáipéis KWord (criptithe) - documento de KWord (cifrado) - מסמך KWord (מוצפן) - KWord dokument (šifriran) - KWord-dokumentum (titkosított) - Dokumen KWord (terenkripsi) - Documento KWord (cifrato) - KWord (暗号化) ドキュメント - KWord құжаты (шифрленген) - 암호화된 KWord 문서 - KWord dokumentas (užšifruotas) - KWord dokuments (šifrēts) - Dokumen Kword (terenkripsi) - KWord-dokument (kryptert) - KWord-document (versleuteld) - Kryptert KWord-dokument - Dokument KWord (zaszyfrowany) - documento KWord (cifrado) - Documento do KWord (criptografado) - Document KWord (criptat) - документ KWord (зашифрованный) - Dokument KWord (šifrovaný) - Dokument KWord (šifriran) - Dokument KWord (i kriptuar) - KWord документ (шифровани) - KWord-dokument (krypterat) - KWord belgesi (şifreli) - документ KWord (зашифрований) - Tài liệu KWord (đã mật mã) - KWord 加密文档 - KWord 文件 (已加密) - - - - - - - LHA archive - أرشيف LHA - LHA arxivi - Archiŭ LHA - Архив — LHA - arxiu LHA - Archiv LHA - Archif LHA - LHA-arkiv - LHA-Archiv - αρχείο LHA - LHA archive - LHA-arkivo - archivador LHA - LHA artxiboa - LHA-arkisto - LHA skjalasavn - archive LHA - cartlann LHA - arquivo LHA - ארכיון LHA - LHA arhiva - LHA-archívum - Arsip LHA - Archivio LHA - LHA アーカイブ - LHA архиві - LHA 압축 파일 - LHA archyvas - LHA arhīvs - Arkib LHA - LHA-arkiv - LHA-archief - LHA-arkiv - Archiwum LHA - arquivo LHA - Pacote LHA - Arhivă LHA - архив LHA - Archív LHA - Datoteka arhiva LHA - Arkiv LHA - LHA архива - LHA-arkiv - LHA arşivi - архів LHA - Kho nén LHA - LHA 归档文件 - LHA 封存檔 - - - - - - - - - - - - - - - - - - - - - LHZ archive - أرشيف LHZ - Archiŭ LHZ - Архив — LHZ - arxiu LHZ - Archiv LHZ - LHZ-arkiv - LHZ-Archiv - αρχείο LHZ - LHZ archive - LHZ-arkivo - archivador LHZ - LHZ artxiboa - LHZ-arkisto - LHZ skjalasavn - archive LHZ - cartlann LHZ - arquivo LHZ - ארכיון LHZ - LHZ arhiva - LHZ-archívum - Arsip LHZ - Archivio LHZ - LHZ アーカイブ - LHZ архиві - LHZ 압축 파일 - LHZ archyvas - LHZ arhīvs - Arkib LHZ - LHZ-arkiv - LHZ-archief - LHZ-arkiv - Archiwum LHZ - arquivo LHZ - Pacote LHZ - Arhivă LHZ - архив LHZ - Archív LHZ - Datoteka arhiva LHZ - Arkiv LHZ - LHZ архива - LHZ-arkiv - LHZ arşivi - архів LHZ - Kho nén LHZ (LHA đã nén) - LHZ 归档文件 - LHZ 封存檔 - - - - - message catalog - كتالوج الرسالة - kataloh paviedamleńniaŭ - Каталог със съобщения - catàleg de missatges - Katalog zpráv - meddelelseskatalog - Nachrichtenkatalog - κατάλογος μηνυμάτων - message catalogue - katalogo de mesaĝoj - catálogo de mensajes - mezuen katalogoa - viestiluettelo - boðskrá - catalogue de messages - catalóg theachtaireachtaí - catálogo de mensaxes - קטלוג הודעות - katalog poruka - üzenetkatalógus - katalog pesan - Catalogo di messaggi - メッセージカタログ - мәлімдемелер каталогы - 메시지 카탈로그 - laiškų katalogas - ziņojumu katalogs - Katalog mesej - meldingskatalog - berichtencatalogus - meldingskatalog - Katalog wiadomości - catálogo de mensagens - Catálogo de mensagens - catalog de mesaje - каталог сообщений - Katalóg správ - katalogov sporočil - Katallog mesazhesh - каталог порука - meddelandekatalog - каталог повідомлень - phân loại thông điệp - 消息库 - 訊息目錄 - - - - - - - - - LyX document - مستند LyX - Dakument LyX - Документ — LyX - document de LyX - Dokument LyX - LyX-dokument - LyX-Dokument - έγγραφο LyX - LyX document - LyX-dokumento - documento de LyX - LyX dokumentua - LyX-asiakirja - LyX skjal - document LyX - cáipéis LyX - documento LyX - מסמך Lyx - LyX dokument - LyX-dokumentum - Dokumen LyX - Documento LyX - LyX ドキュメント - LyX құжаты - LyX 문서 - LyX dokumentas - LyX dokuments - Dokumen LyX - LyX-dokument - LyX-document - LyX-dokument - Dokument LyX - documento LyX - Documento LyX - Document LyX - документ LyX - Dokument LyX - Dokument LyX - Dokument LyX - LyX документ - LyX-dokument - документ LyX - Tài liệu LyX - LyX 文档 - LyX 文件 - - - - - - - - - - Lzip archive - أرشيف Lzip - Архив — lzip - arxiu lzip - Archiv Lzip - Lzip-arkiv - Lzip-Archiv - συμπιεσμένο αρχείο Lzip - Lzip archive - Lzip-arkivo - archivador Lzip - Lzip artxiboa - Lzip-arkisto - Lzip skjalasavn - archive lzip - cartlann Lzip - arquivo Lzip - ארכיון Lzip - Lzip arhiva - Lzip archívum - Arsip Lzip - Archivio Lzip - Lzip アーカイブ - Lzip архиві - LZIP 압축 파일 - Lzip archyvas - Lzip arhīvs - Lzip archief - Archiwum lzip - Pacote Lzip - Arhivă Lzip - архив LZIP - Archív Lzip - Datoteka arhiva Lzip - Lzip-arkiv - архів lzip - Lzip 归档文件 - Lzip 封存檔 - - - - - - - - LZMA archive - أرشيف LZMA - Archiŭ LZMA - Архив — LZMA - arxiu LZMA - Archiv LZMA - LZHA-arkiv - LZMA-Archiv - συμπιεσμένο αρχείο LZMA - LZMA archive - LZMA-arkivo - archivador LZMA - LZMA artxiboa - LZMA-arkisto - LZMA skjalasavn - archive LZMA - cartlann LZMA - arquivo LZMA - ארכיון LZMA - LZMA arhiva - LZMA-archívum - Arsip LZMA - Archivio LZMA - LZMA アーカイブ - LZMA архиві - LZMA 압축 파일 - LZMA archyvas - LZMA arhīvs - LZMA-arkiv - LZMA-archief - LZMA-arkiv - Archiwum LZMA - Pacote LZMA - Arhivă LZMA - архив LZMA - Archív LZMA - Datoteka arhiva LZMA - Arkiv LZMA - LZMA-arkiv - LZMA arşivi - архів LZMA - Kho nén LZMA - LZMA 归档文件 - LZMA 封存檔 - LZMA - Lempel-Ziv-Markov chain-Algorithm - - - - - Tar archive (LZMA-compressed) - أرشيف Tar (مضغوط-LZMA) - Archiŭ tar (LZMA-skampresavany) - Архив — tar, компресиран с LZMA - arxiu tar (comprimit amb LZMA) - Archiv tar (komprimovaný pomocí LZMA) - Tar-arkiv (LZMA-komprimeret) - Tar-Archiv (LZMA-komprimiert) - αρχείο Tar (συμπιεσμένο με LZMA) - Tar archive (LZMA-compressed) - archivador Tar (comprimido con LZMA) - Tar artxiboa (LZMA-rekin konprimitua) - Tar-arkisto (LZMA-pakattu) - Tar skjalasavn (LZMA-stappað) - archive tar (compression LZMA) - cartlann Tar (comhbhrúite le LZMA) - arquivo Tar (comprimido con LZMA) - ארכיון Tar (מכווץ ע"י LZMA) - Tar arhiva (komprimirana LZMA-om) - Tar archívum (LZMA-val tömörítve) - Arsip Tar (terkompresi LZMA) - Archivio tar (compresso con LZMA) - Tar アーカイブ (LZMA 圧縮) - Tar архиві (LZMA-мен сығылған) - TAR 묶음 파일 (LZMA 압축) - Tar archyvas (suglaudintas su LZMA) - Tar arhīvs (saspiests ar LZMA) - Tar-arkiv (LZMA-komprimert) - Tar-archief (ingepakt met LZMA) - Tar-arkiv (pakka med LZMA) - Archiwum tar (kompresja LZMA) - Pacote tar (compactado com LZMA) - Arhivă Tar (comprimată LZMA) - архив TAR (сжатый LZMA) - Archív tar (komprimovaný pomocou LZMA) - Datoteka arhiva Tar (stisnjen z LZMA) - Arkiv tar (i kompresuar me LZMA) - Tar-arkiv (LZMA-komprimerat) - архів tar (стиснений LZMA) - Kho nén tar (đã nén LZMA) - Tar 归档文件 (LZMA 压缩) - Tar 封存檔 (LZMA 格式壓縮) - - - - - - - LZO archive - أرشيف LZO - Archiŭ LZO - Архив — LZO - arxiu LZO - Archiv LZO - LZO-arkiv - LZO-Archiv - αρχείο LZO - LZO archive - LZO-arkivo - archivador LZO - LZO artxiboa - LZO-arkisto - LZO skjalasavn - archive LZO - cartlann LZO - arquivo LZO - ארכיון LZO - LZO arhiva - LZO-archívum - Arsip LZO - Archivio LZO - LZO アーカイブ - LZO архиві - LZO 압축 파일 - LZO archyvas - LZO arhīvs - Arkib LZO - LZO-arkiv - LZO-archief - LZO-arkiv - Archiwum LZO - arquivo LZO - Pacote LZO - Arhivă LZO - архив LZO - Archív LZO - Datoteka arhiva LZO - Arkiv LZO - LZO архива - LZO-arkiv - LZO arşivi - архів LZO - Kho nén LZO - LZO 归档文件 - LZO 封存檔 - LZO - Lempel-Ziv-Oberhumer - - - - - - - - MagicPoint presentation - عرض تقديمي MagicPoint - Prezentacyja MagicPoint - Презентация — MagicPoint - presentació de MagicPoint - Prezentace MagicPoint - Cyflwyniad MagicPoint - MagicPoint-præsentation - MagicPoint-Präsentation - παρουσίαση MagicPoint - MagicPoint presentation - MagicPoint-prezentaĵo - presentación de MagicPoint - MagicPoint aurkezpena - MagicPoint-esitys - MagicPoint framløga - présentation MagicPoint - láithreoireacht MagicPoint - presentación de MagicPoint - מצגת MagicPoint - MagicPoint prezentacija - MagicPoint-bemutató - Presentasi MagicPoint - Presentazione MagicPoint - MagicPoint プレゼンテーション - MagicPoint-ის პრეზენტაცია - MagicPoint презентациясы - MagicPoint 프리젠테이션 - MagicPoint pateiktis - MagicPoint prezentācija - Persembahan MagicPoint - MagicPoint-presentasjon - MagicPoint-presentatie - MagicPoint-presentasjon - Prezentacja programu MagicPoint - apresentação MagicPoint - Apresentação do MagicPoint - Prezentare MagicPoint - презентация MagicPoint - Prezentácia MagicPoint - Predstavitev MagicPoint - Prezantim MagicPoint - MagicPoint презентација - MagicPoint-presentation - презентація MagicPoint - Trình diễn MagicPoint - MagicPoint 演示文稿 - MagicPoint 簡報檔 - - - - - - Macintosh MacBinary file - ملف Macintosh MacBinary - Fajł Macintosh MacBinary - Файл — MacBinary - fitxer MacBinary de Macintosh - Soubor MacBinary pro Macintosh - Macintosh MacBinary-fil - Macintosh-MacBinary-Datei - εκτελέσιμο Macintosh MacBinary - Macintosh MacBinary file - MacBinary-dosiero de Macintosh - archivo de Macintosh MacBinary - Macintosh MacBinary fitxategia - Macintosh MacBinary -tiedosto - Macintosh MacBinary fíla - fichier Macintosh MacBinary - comhad Macintosh MacBinary - ficheiro MacBinary de Macintosh - קובץ בינארי של מקינטוש - Macintosh MacBinary datoteka - Macintosh MacBinary-fájl - Berkas Macintosh MacBinary - File Macintosh MacBinary - MacBinary MacBinary ファイル - Macintosh MacBinary файлы - MacBinary 파일 - Macintosh MacBinary failas - Macintosh MacBinary datne - Fail MacBinary Macintosh - Macintosh MacBinary-fil - Macintosh MacBinary-bestand - Macintosh MacBinary-fil - Plik MacBinary Macintosh - ficheiro MacBinary de Macintosh - Arquivo do Macintosh MacBinary - Fișier Macintosh MacBinary - файл Macintosh MacBinary - Súbor pre Macintosh MacBinary - Izvedljiva dvojiška datoteka Macintosh MacBinary - File MacBinary Macintosh - Мекинтош MacBinary датотека - Macintosh MacBinary-fil - файл Macintosh MacBinary - Tập tin nhị phân MacBinary của Macintosh - Macintosh MacBinary 文件 - Macintosh MacBinary 檔 - - - - - - - Matroska stream - دفق Matroska - Płyń Matroska - Поток — Matroska - flux Matroska - Proud Matroska - Matroskastrøm - Matroska-Datenstrom - ροή Matroska - Matroska stream - flujo Matroska - Matroska korrontea - Matroska-virta - Matroska streymur - flux Matroska - sruth Matroska - fluxo de Matroska - זרימת Matroska - Matroska adatfolyam - Stream Matroska - Stream Matroska - Matroska ストリーム - Matroska-ის ნაკადი - Matroska ағымы - Matroska 스트림 - Matroska srautas - Matroska straume - Matroska-stream - Matroska-straum - Strumień Matroska - Transmissão do Matroska - Flux Matroska - поток Matroska - Stream Matroska - Pretočni vir Matroska - Stream Matroska - Matroska-ström - потік даних Matroska - Luồng Matroska - Matroska 流 - Matroska 串流 - - - - - - - - - - - - - - Matroska video - Matroska مرئي - Videa Matroska - Видео — Matroska - vídeo Matroska - Video Matroska - Matroskavideo - Matroska-Video - βίντεο Matroska - Matroska video - Matroska-video - vídeo Matroska - Matroska bideoa - Matroska-video - Matroska video - vidéo Matroska - físeán Matroska - vídeo de Matroska - וידאו Matroska - Matroska video - Matroska-videó - Video Matroska - Video Matroska - Matroska 動画 - Matroska-ის ვიდეო - Matroska видеосы - Matroska 비디오 - Matroska vaizdo įrašas - Matroska video - Video Matroska - Matroska-film - Matroska-video - Matroska-video - Plik wideo Matroska - vídeo Matroska - Vídeo Matroska - Video Matroska - видео Matroska - Video Matroska - Video datoteka Matroska - Video Matroska - Матрошка видео - Matroska-video - відеокліп Matroska - Ảnh động Matroska - Matroska 视频 - Matroska 視訊 - - - - - Matroska 3D video - - - - - Matroska audio - سمعي Matroska - Aŭdyjo Matroska - Аудио — Matroska - àudio Matroska - Zvuk Matroska - Matroskalyd - Matroska-Audio - ήχος Matroska - Matroska audio - Matroska-sondosiero - sonido Matroska - Matroska audioa - Matroska-ääni - Matroska ljóður - audio Matroska - fuaim Matroska - son de Matroska - שמע Matroska - Matroska audio - Matroska hang - Audio Matroska - Audio Matroska - Matroska オーディオ - Matroska-ის აუდიო - Matroska аудиосы - Matroska 오디오 - Matroska garso įrašas - Matroska audio - Matroska-lyd - Matroska-audio - Matroska-lyd - Plik dźwiękowy Matroska - Áudio Matroska - Audio Matroska - аудио Matroska - Zvuk Matroska - Zvočna datoteka Matroska - Audio Matroska - Matroska-ljud - звук Matroska - Âm thanh Matroska - Matroska 音频 - Matroska 音訊 - - - - - WebM video - WebM مرئي - Видео — WebM - vídeo WebM - Video WebM - WebM-video - WebM-Video - βίντεο WebM - WebM video - WebM-video - vídeo WebM - WebM-video - WebM video - vidéo WebM - físeán WebM - vídeo WebM - וידאו WebM - WebM video - WebM videó - Video WebM - Video WebM - WebM 動画 - WebM видеосы - WebM 비디오 - WebM vaizdo įrašas - WebM video - WebM video - Plik wideo WebM - Vídeo WebM - Video WebM - видео WebM - Video WebM - Video datoteka WebM - WebM-video - відео WebM - WebM 视频 - WebM 視訊 - - - - - - - - - - - - - - WebM audio - WebM سمعي - Аудио — WebM - àudio WebM - Zvuk WebM - WebM-lyd - WebM-Audio - ήχος WebM - WebM audio - WebM-sondosiero - sonido WebM - WebM-ääni - WebM ljóður - audio WebM - fuaim WebM - son WebM - שמע WebM - WebM audio - WebM hang - Audio WebM - Audio WebM - WebM オーディオ - WebM аудиосы - WebM 오디오 - WebM garso įrašas - WebM audio - WebM audio - Plik dźwiękowy WebM - Áudio WebM - Audio WebM - аудио WebM - Zvuk WebM - Zvočna datoteka WebM - WebM-ljud - звук WebM - WebM 音频 - WebM 音訊 - - - - MHTML web archive - MHTML - MIME HTML - - - - - - MXF video - MXF مرئي - Видео — MXF - vídeo MXF - Video MXF - MXF-video - MXF-Video - βίντεο MXF - MXF video - MXF-video - vídeo MXF - MXF bideoa - MXF-video - MXF video - vidéo MXF - físeán MXF - vídeo MXF - וידאו MXF - MXF video - MXF videó - Video MXF - Video MXF - MXF 動画 - MXF ვიდეო - MXF видеосы - MXF 비디오 - MXF vaizdo įrašas - MXF video - MXF video - Plik wideo MXF - Vídeo MXF - Video MXF - видео MXF - Video MXF - Video datoteka MXF - MXF-video - відеокліп MXF - MXF 视频 - MXF 視訊 - MXF - Material Exchange Format - - - - - - - - OCL file - ملف OCL - Fajł OCL - Файл — OCL - fitxer OCL - Soubor OCL - OCL-fil - OCL-Datei - αρχείο OCL - OCL file - OCL-dosiero - archivo OCL - OCL fitxategia - OCL-tiedosto - OCL fíla - fichier OCL - comhad OCL - ficheiro OCL - קובץ OCL - OCL datoteka - OCL fájl - Berkas OCL - File OCL - OCL ファイル - OCL файлы - OCL 파일 - OCL failas - OCL datne - OCL-fil - OCL-bestand - OCL-fil - Plik OCL - Arquivo OCL - Fișier OCL - файл OCL - Súbor OCL - Datoteka OCL - File OCL - OCL-fil - OCL dosyası - файл OCL - Tập tin OCL - OCL 文件 - OCL 檔 - OCL - Object Constraint Language - - - - - COBOL source file - Изходен код — COBOL - codi font en COBOL - Zdrojový soubor COBOL - COBOL-kildefil - COBOL-Quelldatei - πηγαίο αρχείο COBOL - COBOL source file - COBOL-fontdosiero - Archivo fuente de COBOL - COBOL-lähdekoodi - fichier source COBOL - ficheiro fonte de COBOL - קובץ מקור של COBOL - COBOL izvorna datoteka - COBOL forrásfájl - Berkas sumber COBOL - File sorgente COBOL - COBOL ソースファイル - COBOL-ის საწყისი ფაილი - COBOL бастапқы коды - COBOL 소스 파일 - COBOL pirmkods - COBOL bronbestand - Plik źródłowy COBOL - Arquivo de código-fonte em COBOL - файл исходного кода на COBOL - Izvorna koda COBOL - COBOL-källkodsfil - вихідний код мовою COBOL - COBOL 源 - COBOL 源檔 - COBOL - COmmon Business Oriented Language - - - - - - Mobipocket e-book - Е-книга — Mobipocket - llibre electrònic Mobipocket - Elektronická kniha Mobipocket - Mobipocket e-bog - Mobipocket E-Book - ηλεκτρονικό βιβλίο Mobipocket - Mobipocket e-book - Libro electrónico Mobipocket - Mobipocket e-kirja - livre numérique Mobipocket - E-book Mobipocket - ספר אלקטרוני של Mobipocket - Mobipocket e-knjiga - Mobipocket e-könyv - e-book Mobipocket - E-book Mobipocket - Mobipocket 電子書籍 - Mobipocket-ის ელწიგნი - Mobipocket эл. кітабы - Mobipocket 전자책 - Mobipocket e-grāmata - Mobipocket e-book - E-book Mobipocket - E-book Mobipocket - электронная книга Mobipocket - e-knjiga Mobipocket - електронна книга Mobipocket - Mobipocket 电子书 - Mobipocket e-book - - - - - - - - - - - - - - Adobe FrameMaker MIF document - مستند أدوبي الصانع للإطارات MIF - Dakument Adobe FrameMaker MIF - Документ — Adobe FrameMaker MIF - document de FrameMaker MIF d'Adobe - Dokument Adobe FrameMaker MIF - Adobe FrameMaker MIF-dokument - Adobe-FrameMaker-MIF-Dokument - αρχείο MIF του Adobe FrameMaker - Adobe FrameMaker MIF document - MIF-dokumento de Adobe FrameMaker - documento MIF de Adobe FrameMaker - Adobe FrameMaker-en MIF dokumentua - Adobe FrameMaker MIF -asiakirja - Adobe FrameMaker MIF skjal - document MIF Adobe FrameMaker - cáipéis MIF Adobe FrameMaker - documento MIF de Adobe FrameMaker - מסמך MIF של Adobe FrameMaker - Adobe FrameMaker MIF dokument - Adobe FrameMaker MIF-dokumentum - Dokumen Adobe FrameMaker MIF - Documento MIF Adobe FrameMaker - Adobe FrameMaker MIF ドキュメント - Adobe FrameMaker-ის MIF დოკუმენტი - Adobe FrameMaker MIF құжаты - 어도비 프레임메이커 MIF 문서 - Adobe FrameMaker MIF dokumentas - Adobe FrameMaker MIF dokuments - Adobe FrameMaker MIF-dokument - Adobe FrameMaker MIF-document - Adobe FrameMaker MIF-dokument - Dokument MIF Adobe FrameMaker - Documento MIF do Adobe FrameMaker - Document Adobe FrameMaker MIF - документ Adobe FrameMaker MIF - Dokument Adobe FrameMaker MIF - Dokument Adobe FrameMaker MIF - Dokument MIF Adobe FrameMaker - Adobe FrameMaker MIF-dokument - документ Adobe FrameMaker MIF - Tài liệu Adobe FrameMaker MIF - Adobe FrameMaker MIF 文档 - Adobe FrameMaker MIF 文件 - - - - Mozilla bookmarks - علامات موزيلا - Zakładki Mozilla - Отметки — Mozilla - llista d'adreces d'interès de Mozilla - Záložky Mozilla - Mozillabogmærker - Mozilla-Lesezeichen - σελιδοδείκτες Mozilla - Mozilla bookmarks - Mozilla-legosignoj - marcadores de Mozilla - Mozillako laster-markak - Mozilla-kirjanmerkit - Mozilla bókamerki - marque-pages Mozilla - leabharmharcanna Mozilla - Marcadores de Mozilla - סמניה של Mozilla - Mozilla knjižne oznake - Mozilla-könyvjelzők - Bookmark Mozilla - Segnalibri Mozilla - Mozilla ブックマーク - Mozilla бетбелгілері - 모질라 책갈피 - Mozilla žymelės - Mozilla grāmatzīmes - Tandabuku Mozilla - Mozilla-bokmerker - Mozilla-bladwijzers - Mozilla-bokmerker - Zakładki Mozilla - marcadores do Mozilla - Marcadores do Mozilla - Semne de carte Mozilla - закладки Mozilla - Záložky Mozilla - Datoteka zaznamkov Mozilla - Libërshënues Mozilla - Mozilla обележивачи - Mozilla-bokmärken - закладки Mozilla - Liên kết đã lưu Mozilla - Mozilla 书签 - Mozilla 書籤 - - - - - - - - - DOS/Windows executable - تنفيذي DOS/Windows - Vykonvalny fajł DOS/Windows - Изпълним файл — DOS/Windows - executable de DOS/Windows - Spustitelný soubor pro DOS/Windows - DOS-/Windowskørbar - DOS/Windows-Programm - εκτελέσιμο DOS/Windows - DOS/Windows executable - DOS/Windows-plenumebla - ejecutable de DOS/Windows - DOS/Windows-eko exekutagarria - DOS/Windows-ohjelma - DOS/Windows inningarfør - exécutable DOS/Windows - comhad inrite DOS/Windows - executábel de DOS/Windows - קובץ בר־הרצה של DOS/חלונות - DOS/Windows izvršna datoteka - DOS/Windows futtatható - DOS/Windows dapat dieksekusi - Eseguibile DOS/Windows - DOS/Windows 実行ファイル - DOS/Windows გაშვებადი ფაილი - DOS/Windows орындалатын файлы - DOS/Windows 실행 파일 - DOS/Windows vykdomasis failas - DOS/Windows izpildāmais - Bolehlaksana DOS/Windows - Kjørbar fil for DOS/Windows - DOS/Windows-uitvoerbaar bestand - DOS/Windows køyrbar fil - Program DOS/Windows - executável DOS/Windows - Executável do DOS/Windows - Executabil DOS/Windows - исполняемый файл DOS/Windows - Spustiteľný súbor pre DOS/Windows - Izvedljiva datoteka DOS/Windows - I ekzekutueshëm DOS/Windows - ДОС/Виндоуз извршна датотека - Körbar DOS/Windows-fil - DOS/Windows çalıştırılabilir - виконуваний файл DOS/Windows - Tập tin có thực hiện được DOS/Windows - DOS/Windows 可执行文件 - DOS/Windows 可執行檔 - - - - - - - - Internet shortcut - اختصار الإنترنت - Sieciŭnaja spasyłka - Адрес в Интернет - drecera d'Internet - Odkaz do Internetu - Internetgenvej - Internet-Verweis - συντόμευση διαδικτύου - Internet shortcut - acceso directo a Internet - Interneteko lasterbidea - Internet-pikakuvake - Alnetssnarvegur - raccourci Internet - aicearra Idirlín - atallo de Internet - קיצור דרך של האינטרנט - Internetski prečac - Internetes indítóikon - Jalan pintas Internet - Scorciatoia Internet - インターネットショートカット - Интернет сілтемесі - 인터넷 바로 가기 - Interneto nuoroda - Interneta īsceļš - Internettsnarvei - internetkoppeling - Internett-snarveg - Skrót internetowy - Atalho da internet - Scurtătură Internet - Интернет-ссылка - Internetový odkaz - Internetna bližnjica - Shkurtim internet - Internetgenväg - інтернет-посилання - Lối tắt Internet - Internet 快捷方式 - 網際網路捷徑 - - - - - - - - - - WRI document - مستند WRI - Dakument WRI - Документ — WRI - document WRI - Dokument WRI - WRI-dokument - WRI-Dokument - έγγραφο WRI - WRI document - WRI-dokumento - documento WRI - WRI dokumentua - WRI-asiakirja - WRI skjal - document WRI - cáipéis WRI - documento WRI - מסמך WRI - WRI dokument - WRI dokumentum - Dokumen WRI - Documento WRI - WRI ドキュメント - WRI құжаты - WRI 문서 - WRI dokumentas - WRI dokuments - WRI-dokument - WRI-document - WRI-dokument - Dokument WRI - Documento WRI - Document WRI - документ WRI - Dokument WRI - Dokument WRI - Dokument WRI - WRI-dokument - WRI belgesi - документ WRI - Tài liệu WRI - WRI 文档 - WRI 文件 - - - - - MSX ROM - MSX ROM - MSX ROM - ROM — MSX - ROM de MSX - ROM pro MSX - ROM MSX - MSX-rom - MSX-ROM - εικόνα μνήμης ROM MSX - MSX ROM - MSX-NLM - ROM de MSX - MSX-ko ROMa - MSX-ROM - MSX ROM - ROM MSX - ROM MSX - ROM de MSX - MSX ROM - MSX ROM - MSX ROM - Memori baca-saja MSX - ROM MSX - MSX ROM - MSX-ის ROM - MSX ROM - MSX 롬 - MSX ROM - MSX ROM - ROM MSX - MSX-ROM - MSX-ROM - MSX-ROM - Plik ROM konsoli MSX - ROM MSX - ROM do MSX - ROM MSX - MSX ROM - ROM pre MSX - Bralni pomnilnik MSX - ROM MSX - MSX ром - MSX-rom - ППП MSX - ROM MSX - MSX ROM - MSX ROM - - - - - M4 macro - M4 macro - Makras M4 - Макроси — M4 - macro M4 - Makro M4 - M4-makro - M4-Makro - μακροεντολή m4 - M4 macro - macro M4 - M4 makroa - M4-makro - M4 fjølvi - macro M4 - macra M4 - macro M4 - מאקרו M4 - M4 makro - M4 makró - Makro M4 - Macro M4 - M4 マクロ - M4 макросы - M4 매크로 - M4 macro - M4 makross - M4-makro - M4-macro - M4-makro - Makro M4 - Macro M4 - Macro M4 - макрос M4 - Makro M4 - Makro datoteka M4 - Macro M4 - M4-makro - макрос M4 - Vĩ lệnh M4 - M4 宏 - M4 巨集 - - - - - - Nintendo64 ROM - Nintendo64 ROM - Nintendo64 ROM - ROM — Nintendo64 - ROM de Nintendo64 - ROM pro Nintendo64 - Nintendo64-rom - Nintendo64-ROM - εικόνα μνήμης ROM Nintendo64 - Nintendo64 ROM - Nintendo64-NLM - ROM de Nintendo64 - Nintendo64-ko ROMa - Nintendo64-ROM - Nintendo64 ROM - ROM Nintendo64 - ROM Nintendo64 - ROM de Nintendo64 - ROM של Nןמאקמגם64 - Nintendo64 ROM - Nintendo64 ROM - Memori baca-saja Nintendo64 - ROM Nintendo64 - Nintendo64 ROM - Nintendo64 ROM - 닌텐도 64 롬 - Nintendo64 ROM - Nintendo64 ROM - ROM Nintendo64 - Nintendo64-ROM - Nintendo64-ROM - Nintendo64-ROM - Plik ROM konsoli Nintendo64 - ROM Nintendo64 - ROM do Nintendo64 - ROM Nintendo64 - Nintendo64 ROM - ROM pre Nintendo64 - Bralni pomnilnik Nintendo64 - ROM Nintendo64 - Нинтендо64 РОМ - Nintendo64-rom - Nintendo64 ROM - ППП Nintendo64 - ROM Nintendo64 - Nintendo64 ROM - Nintendo64 ROM - - - - - Nautilus link - وصلة Nautilus - Nautilus körpüsü - Spasyłka Nautilus - Връзка — Nautilus - enllaç de Nautilus - Odkaz Nautilus - Cyswllt Nautilus - Nautilus-henvisning - Nautilus-Verknüpfung - σύνδεσμος Nautilus - Nautilus link - Nautilus-ligilo - enlace de Nautilus - Nautilus esteka - Nautilus-linkki - Nautilus leinkja - lien Nautilus - nasc Nautilus - ligazón de nautilus - קישור של Nautilus - Nautilus veza - Nautilus-link - Taut Nautilus - Collegamento Nautilus - Nautilus リンク - Nautilus сілтемесі - 노틸러스 바로 가기 - Nautilus nuoroda - Nautilus saite - Pautan Nautilus - Nautilus-lenke - Nautilus-verwijzing - Nautilus-lenke - Odnośnik Nautilus - atalho Nautilus - Link do Nautilus - Legătură Nautilus - ссылка Nautilus - Odkaz Nautilus - Datoteka povezave Nautilus - Lidhje Nautilus - Наутилус веза - Nautiluslänk - Nautilus bağlantısı - посилання Nautilus - Liên kết Nautilus - Nautilus 链接 - Nautilus 鏈結 - - - - - - - - - NES ROM - NES ROM - NES ROM - ROM — NES - ROM de NES - ROM pro NES - ROM NES - NES-rom - NES-ROM - εικόνα μνήμης ROM NES - NES ROM - NES-NLM - ROM de NES - NES-eko ROMa - NES-ROM - NES ROM - ROM NES - ROM NES - ROM de NES - ROM של NES - NES ROM - NES ROM - Memori baca-saja NES - ROM NES - ファミコン ROM - NES ROM - NES 롬 - NES ROM - NES ROM - ROM NES - NES ROM - Nintendo - NES-ROM - Plik ROM konsoli NES - ROM NES - ROM do NES - ROM NES - NES ROM - ROM pre NES - Bralni pomnilnik NES - ROM NES - NES ром - NES-rom - NES ROM - ППП NES - ROM NES - NES ROM - 任天堂 ROM - - - - - Unidata NetCDF document - مستند Unidata NetCDF - Dakument Unidata NetCDF - Документ — Unidata NetCDF - document Unidata NetCDF - Dokument Unidata NetCDF - Unidata NetCDF-dokument - Unidata-NetCDF-Dokument - έγγραφο Unidata NetCDF - Unidata NetCDF document - dokumento en NetCDF-formato de Unidata - documento de Unidata NetCDF - Unidata NetCDF dokumentua - Unidata NetCDF -asiakirja - Unidata NetCDF skjal - document Unidata NetCDF - cáipéis Unidata NetCDF - Documentno de Unixdata NetCDF - מסמך של Unidata NetCDF - Unidata NetCDF dokument - Unidata NetCDF-dokumentum - Dokumen Unidata NetCDF - Documento Unidata NetCDF - Unidata NetCDF ドキュメント - Unidata NetCDF құжаты - Unidata NetCDF 문서 - Unidata NetCDF dokumentas - Unidata NetCDF dokuments - Dokumen Unidata NetCDF - Unidata NetCDF-dokument - Unidata NetCDF-document - Unidata netCDF-dokument - Dokument Unidata NetCDF - documento Unidata NetCDF - Documento do Unidata NetCDF - Document Unidata NetCDF - документ Unidata NetCDF - Dokument Unidata NetCDF - Dokument Unidata NetCDF - Dokument Unidata NetCDF - Unidata NetCDF документ - Unidata NetCDF-dokument - Unidata NetCDF belgesi - документ Unidata NetCDF - Tài liệu NetCDF Unidata - Unidata NetCDF 文档 - Unidata NetCDF 文件 - NetCDF - Network Common Data Form - - - - - - NewzBin usenet index - Индекс — Usenet, NewzBin - índex d'Usenet NewzBin - Index NewzBin diskuzních skupin Usenet - NewzBin-brugernetindex - NewzBin-Usenet-Index - ευρετήριο usenet NewzBin - NewzBin usenet index - Índice NewzBin de usenet - index usenet - Índice de usenet NEwzBin - אינדקס שרתי חדשות NewzBin - NewzBin usenet index - Indeks usenet NewzBin - Indice Usenet NewzBiz - NewzBin Usenet インデックス - NewzBin usenet индексі - NewzBin 유즈넷 인덱스 - NewzBin usenet rādītājs - NewzBin usenet index - Indeks grup dyskusyjnych NewzBin - Índice de usenet NewzBin - индекс usenet NewzBin - Kazalo usenet NewzBin - покажчик usenet NewzBin - NewzBin usenet 索引 - NewzBin usenet 索引 - - - - - - - - object code - رمز الكائن - abjektny kod - Обектен код - codi objecte - Objektový kód - objektkode - Objekt-Code - μεταφρασμένος κώδικας - object code - celkodo - código objeto - objektu kodea - objektikoodi - code objet - cód réada - código obxecto - קוד אובייקט - kod objekta - tárgykód - kode object - Codice oggetto - オブジェクトコード - объектті коды - 개체 코드 - objektinis kodas - objekta kods - Kod objek - objektkode - objectcode - objektkode - Kod obiektowy - código de objecto - Código-objeto - cod sursă obiect - объектный код - Objektový kód - predmetna koda - Kod objekti - објектни ко̂д - objektkod - об'єктний код - mã đối tượng - 目标代码 - 目的碼 - - - - - - - - - - - - - - - - - Annodex exchange format - صيغة Annodex البديلة - Формат за обмяна — Annodex - format d'intercanvi Annodex - Výměnný formát Annodex - Udvekslingsformat for Annodex - Annodex-Wechselformat - μορφή ανταλλαγής Annodex - Annodex exchange format - formato de intercambio Annodex - Annodex trukatze-formatua - Annodex-siirtomuoto - Annodex umbýtingarsnið - format d'échange Annodex - formáid mhalairte Annodex - formato intercambiábel de Annodex - פורמט החלפת Annodex - Annodex oblik za razmjenu - Annodex csereformátum - Format pertukaran Annodex - Formato di scambio Annodex - Annodex 交換フォーマット - Annodex-ის გაცვლითი ფორმატი - Annodex алмасу пішімі - Annodex 교환 형식 - Annodex mainų formatas - Annodex apmaiņas formāts - Annodex-exchange - Format wymiany Annodex - Formato de troca Annodex - Format schimb Annodex - формат обмена Annodex - Formát pre výmenu Annodex - Izmenjalna datoteka Annodex - Annodex-utväxlingsformat - формат обміну даними Annodex - Định dạng trao đổi Annodex - Annodex 交换格式 - Annodex 交換格式 - - - - - - - - - - - - - Annodex Video - Annodex مرئي - Видео — Annodex - Annodex Video - Annodex Video - Annodexvideo - Annodex-Video - βίντεο Annodex - Annodex Video - Annodex-video - vídeo Annodex - Annodex bideoa - Annodex-video - Annodex video - vidéo Annodex - físeán Annodex - vídeo de Annodex - וידאו Annodex - Annodex Video - Annodex videó - Video Annodex - Video Annodex - Annodex 動画 - Annodex-ის ვიდეო - Annodex видеосы - Annodex 비디오 - Annodex vaizdo įrašas - Annodex video - Annodex Video - Plik wideo Annodex - Vídeo Annodex - Video Annodex - видео Annodex - Video Annodex - Video datoteka Annodex - Annodex-video - відеокліп Annodex - Ảnh động Annodex - Annodex 视频 - Annodex 視訊 - - - - - - - - - - - - - Annodex Audio - Annodex سمعي - Аудио — Annodex - Annodex Audio - Annodex Audio - Annodexlyd - Annodex-Audio - ήχος Annodex - Annodex Audio - Annodex-sondosiero - sonido Annodex - Annodex audioa - Annodex-ääni - Annodex ljóður - audio Annodex - fuaim Annodex - son de Annodex - שמע Annodex - Annodex Audio - Annodex hang - Audio Annodex - Audio Annodex - Annodex オーディオ - Annodex-ის აუდიო - Annodex аудиосы - Annodex 오디오 - Annodex garso įrašas - Annodex audio - Annodex Audio - Plik dźwiękowy Annodex - Áudio Annodex - Audio Annodex - аудио Annodex - Zvuk Annodex - Zvočna datoteka Annodex - Annodex-ljud - звук Annodex - Âm thanh Annodex - Annodex 音频 - Annodex 音訊 - - - - - - - - - - - - - Ogg multimedia file - ملف وسائط متعددة Ogg - Multymedyjny fajł Ogg - Мултимедия — Ogg - fitxer Ogg multimèdia - Soubor multimédií Ogg - Ogg multimedie-fil - Ogg-Multimediadatei - Αρχείο πολυμέσων Ogg - Ogg multimedia file - archivo multimedia Ogg - Ogg multimediako fitxategia - Ogg-multimediatiedosto - Ogg margmiðlafíla - fichier multimédia Ogg - comhad ilmheán Ogg - ficheiro multimedia Ogg - קובץ מולטימדיה Ogg - Ogg multimédiafájl - Berkas multimedia Ogg - File multimediale Ogg - Ogg マルチメディアファイル - Ogg-ის მულტიმედია ფაილი - Ogg мультимедиа файлы - Ogg 멀티미디어 파일 - Ogg multimedijos failas - Ogg multimediju datne - Ogg-multimediafil - Ogg-multimediabestand - Ogg multimediafil - Plik multimedialny Ogg - Arquivo multimídia Ogg - Fișier multimedia Ogg - мультимедийный файл Ogg - Súbor multimédií Ogg - Večpredstavnostna datoteka Ogg - File multimedial Ogg - Ogg-multimediafil - мультимедійний файл Ogg - Tập tin đa phương tiện Ogg - Ogg 多媒体文件 - Ogg 多媒體檔案 - - - - - - - - - Ogg Audio - Ogg سمعي - Aŭdyjo Ogg - Аудио — Ogg - àudio Ogg - Zvuk Ogg - Ogg-lyd - Ogg-Audio - ήχος Ogg - Ogg Audio - sonido Ogg - Ogg audioa - Ogg-ääni - Ogg ljóður - audio Ogg - fuaim Ogg - son Ogg - שמע Ogg - Ogg hang - Audio Ogg - Audio Ogg - Ogg オーディオ - Ogg-ის აუდიო - Ogg аудиосы - Ogg 오디오 - Ogg garso įrašas - Ogg audio - Ogg lyd - Ogg-audio - Ogg-lyd - Plik dźwiękowy Ogg - Áudio Ogg - Audio Ogg - аудио Ogg - Zvuk Ogg - Zvočna datoteka Ogg - Audio Ogg - Ogg-ljud - звук ogg - Âm thanh Ogg - Ogg 音频 - Ogg 音訊 - - - - - - - - - - Ogg Video - Ogg مرئي - Videa Ogg - Видео — Ogg - vídeo Ogg - Video Ogg - Ogg-video - Ogg-Video - βίντεο Ogg - Ogg Video - vídeo Ogg - Ogg bideoa - Ogg-video - Ogg Video - vidéo Ogg - físeán Ogg - vídeo Ogg - וידאו Ogg - Ogg videó - Video Ogg - Video Ogg - Ogg 動画 - Ogg ვიდეო - Ogg видеосы - Ogg 비디오 - Ogg vaizdo įrašas - Ogg video - Ogg video - Ogg-video - Ogg-video - Plik wideo Ogg - Vídeo Ogg - Video Ogg - видео Ogg - Video Ogg - Video datoteka Ogg - Video Ogg - Ogg-video - відеокліп ogg - Ảnh động Ogg - Ogg 视频 - Ogg 視訊 - - - - - - - - - - Ogg Vorbis audio - Ogg Vorbis سمعي - Ogg Vorbis audio faylı - Aŭdyjo Ogg Vorbis - Аудио — Ogg Vorbis - àudio Ogg Vorbis - Zvuk Ogg Vorbis - Sain Ogg Vorbis - Ogg Vorbis-lyd - Ogg-Vorbis-Audio - ήχος Ogg Vobris - Ogg Vorbis audio - Ogg-Vorbis-sondosiero - sonido Ogg Vorbis - Ogg Vorbis audioa - Ogg Vorbis -ääni - Ogg Vorbis ljóður - audio Ogg Vorbis - fuaim Ogg Vorbis - son Ogg Vorbis - שמע Ogg Vorbis - Ogg Vorbis hang - Audio Ogg Vorbis - Audio Ogg Vorbis - Ogg Vorbis オーディオ - Ogg Vorbis აუდიო - Ogg Vorbis аудиосы - Ogg Vorbis 오디오 - Ogg Vorbis garso įrašas - Ogg Vorbis audio - Audio Ogg Vorbis - Ogg Vorbis lyd - Ogg Vorbis-audio - Ogg Vorbis-lyd - Plik dźwiękowy Ogg Vorbis - áudio Ogg Vorbis - Áudio do Ogg Vorbis - Audio Ogg Vorbis - аудио Ogg Vorbis - Zvuk Ogg Vorbis - Zvočna datoteka Ogg Vorbis - Audio Ogg Vorbis - Ог-ворбис звучни запис - Ogg Vorbis-ljud - звук ogg Vorbis - Âm thanh Vorbis Ogg - Ogg Vorbis 音频 - Ogg Vorbis 音訊 - - - - - - - - - - - - - Ogg FLAC audio - Ogg FLAC سمعي - Aŭdyjo Ogg FLAC - Аудио — Ogg FLAC - àudio Ogg FLAC - Zvuk Ogg FLAC - Ogg FLAC-lyd - Ogg-FLAC-Audio - ήχος Ogg FLAC - Ogg FLAC audio - sonido Ogg FLAC - Ogg FLAC audioa - Ogg FLAC -ääni - Ogg FLAC ljóður - audio Ogg FLAC - fuaim Ogg FLAC - son Ogg FLAC - שמע Ogg FLAC - Ogg FLAC hang - Audio Ogg FLAC - Audio Ogg FLAC - Ogg FLAC オーディオ - Ogg FLAC აუდიო - Ogg FLAC аудиосы - Ogg FLAC 오디오 - Ogg FLAC garso įrašas - Ogg FLAC audio - Ogg FLAC-lyd - Ogg FLAC-audio - Ogg FLAC-lyd - Plik dźwiękowy Ogg FLAC - Áudio FLAC Ogg - Audio Ogg FLAC - аудио Ogg FLAC - Zvuk Ogg FLAC - Zvočna datoteka Ogg FLAC - Audio Ogg FLAC - Ogg FLAC-ljud - звук ogg FLAC - Âm thanh FLAC Ogg - Ogg FLAC 音频 - Ogg FLAC 音訊 - - - - - - - - - - - - - - - Ogg Speex audio - Ogg Speex سمعي - Aŭdyjo Ogg Speex - Аудио — Ogg Speex - àudio Ogg Speex - Zvuk Ogg Speex - Ogg Speex-lyd - Ogg-Speex-Audio - ήχος Ogg Speex - Ogg Speex audio - sonido Ogg Speex - Ogg Speex audioa - Ogg Speex -ääni - Ogg Speex ljóður - audio Ogg Speex - fuaim Ogg Speex - son Ogg Speex - שמע Ogg Speex - Ogg Speex hang - Audio Ogg Speex - Audio Ogg Speex - Ogg Speex オーディオ - Ogg Speex აუდიო - Ogg Speex аудиосы - Ogg Speex 오디오 - Ogg Speex garso įrašas - Ogg Speex audio - Ogg Speex lyd - Ogg Speex-audio - Ogg Speex-lyd - Plik dźwiękowy Ogg Speex - Áudio Speex Ogg - Audio Ogg Speex - аудио Ogg Speex - Zvuk Ogg Speex - Zvočna datoteka Ogg Speex - Audio Ogg Speex - Ogg Speex-ljud - звук ogg Speex - Âm thanh Speex Ogg - Ogg Speex 音频 - Ogg Speex 音訊 - - - - - - - - - - - Speex audio - Speex سمعي - Aŭdyjo Speex - Аудио — Speex - àudio Speex - Zvuk Speex - Speexlyd - Speex-Audio - ήχος Speex - Speex audio - sonido Speex - Speex audioa - Speex-ääni - Speex ljóður - audio Speex - fuaim Speex - son Speex - שמע של Speex - Speex audio - Speex hang - Audio Speex - Audio Speex - Speex オーディオ - Speex аудиосы - Speex 오디오 - Speex garso įrašas - Speex audio - Speex lyd - Speex-audio - Speex-lyd - Plik dźwiękowy Speex - Áudio Speex - Audio Speex - аудио Speex - Zvuk Speex - Zvočna datoteka Speex - Audio Speex - Speex-ljud - звук Speex - Âm thanh Speex - Speex 音频 - Speex 音訊 - - - - - - - Ogg Theora video - Ogg Theora مرئي - Videa Ogg Theora - Видео — Ogg Theora - vídeo Ogg Theora - Video Ogg Theora - Ogg Theora-video - Ogg-Theora-Video - βίντεο Ogg Theora - Ogg Theora video - vídeo Ogg Theora - Ogg Theora bideoa - Ogg Theora -video - Ogg Theora video - vidéo Ogg Theora - físeán Ogg Theora - vídeo Ogg Theora - שמע Ogg Theora - Ogg Theora videó - Video Ogg Theora - Video Ogg Theora - Ogg Theora 動画 - Ogg Theora ვიდეო - Ogg Theora видеосы - Ogg Theora 비디오 - Ogg Theora vaizdo įrašas - Ogg Theora video - Ogg Theora video - Ogg Theora-video - Ogg Theora-video - Plik wideo Ogg Theora - Vídeo do Ogg Theora - Video Ogg Theora - видео Ogg Theora - Video Ogg Theora - Video datoteka Ogg Theora - Video Ogg Theora - Ogg Theora-video - відеокліп ogg Theora - Ảnh động Theora Ogg - Ogg Theora 视频 - Ogg Theora 視訊 - - - - - - - - - - - OGM video - OGM مرئي - Videa OGM - Видео — OGM - vídeo OGM - Video OGM - OGM-video - OGM-Video - βίντεο OGM - OGM video - OGM-video - vídeo OGM - OGM bideoa - OGM-video - OGM video - vidéo OGM - físeán OGM - vídeo OGM - וידאו OGM - OGM video - OGM-videó - Video OGM - Video OGM - OGM 動画 - OGM ვიდეო - OGM видеосы - OGM 비디오 - OGM vaizdo įrašas - OGM video - OGM-film - OGM-video - OGM-video - Plik wideo OGM - Vídeo OGM - Video OGM - видео OGM - Video OGM - Video datoteka OGM - Video OGM - OGM-video - відеокліп OGM - Ảnh động OGM - OGM 视频 - OGM 視訊 - - - - - - - - - - - - OLE2 compound document storage - تخزين مجمع مستند OLE2 - Schovišča dla kampanentaŭ dakumentu OLE2 - Съставен документ-хранилище — OLE2 - emmagatzematge de documents composats OLE2 - Úložiště složeného dokumentu OLE2 - OLE2-sammensat dokumentlager - OLE2-Verbunddokumentenspeicher - αρχείο συμπαγούς αποθήκευσης εγγράφων OLE2 - OLE2 compound document storage - OLE2-deponejo de parentezaj dokumentoj - almacenamiento de documentos compuestos OLE2 - OLE2 konposatutako dokumentu-bilduma - OLE2-yhdisteasiakirjatallenne - OLE2 samansett skjalagoymsla - document de stockage composé OLE2 - stóras cháipéisí comhshuite OLE2 - almacenamento de documento composto OLE2 - אחסון מסמך משותף OLE2 - OLE2 összetett dokumentumtároló - penyimpan dokumen kompon OLE2 - Memorizzazione documento composto OLE2 - OLE2 複合ドキュメントストレージ - OLE2 құрама құжаттар қоймасы - OLE2 복합 문서 - OLE2 sudėtinių dokumentų laikmena - OLE2 savienoto dokumentu glabātuve - Storan dokumen halaman OLE2 - OLE-lager for sammensatte dokumenter - OLE2-samengestelde documentopslag - OLE2 lager for samansett dokument - Magazyn dokumentu złożonego OLE2 - armazenamento de documento composto OLE2 - Armazenamento de documento composto OLE2 - Document de stocare compus OLE2 - хранилище составных документов OLE2 - Úložisko zloženého dokumentu OLE2 - Združeni dokument OLE2 - Arkiv dokumenti i përbërë OLE2 - ОЛЕ2 сједињени документ - Sammansatt OLE2-dokumentlager - сховище складних документів OLE2 - Kho lưu tài liệu ghép OLE2 - OLE2 组合文档存储 - OLE2 複合文件儲存 - - - - - - - - Microsoft Publisher document - - - - - Windows Installer package - حزمة مثبّت ويندوز - Pakunak Windows Installer - Пакет — инсталация за Windows - paquet de Windows Installer - Balíček Windows Installer - Windows Installer-pakke - Windows Installationspaket - πακέτο Windows Installer - Windows Installer package - paquete de instalación de Windows - Windows-eko pakete instalatzailea - Windows-asennuspaketti - Windows innleggingarpakki - paquet d'installation Windows - pacáiste Windows Installer - paquete de instalación de Windows - חבילה של Windows Installer - Windows Installer paket - Windows Installer csomag - Paket Windows Installer - Pacchetto Windows Installer - Windodws インストーラパッケージ - Windows Installer дестесі - Windows 설치 패키지 - Windows Installer paketas - Windows Installer pakotne - Windows-installatiepakket - Windows Installer-pakke - Pakiet instalatora Windows - Pacote do instalador do Windows - Pachet instalator Windows - пакет Windows Installer - Balík Windows Installer - Datoteka paketa Windows namestilnika - Paketë Windows Installer - Windows Installer-paket - Windows Installer paketi - пакунок Windows Installer - Gói cài đặt Windows - Windows 程序安装包 - Windows Installer 套件 - - - - - GNU Oleo spreadsheet - جدول جنو Oleo - Raźlikovy arkuš GNU Oleo - Таблица — GNU Oleo - full de càlcul de GNU Oleo - Sešit GNU Oleo - GNU Oleo-regneark - GNU-Oleo-Tabelle - λογιστικό φύλλο GNU Oleo - GNU Oleo spreadsheet - Kalkultabelo de GNU Oleo - hoja de cálculo de GNU Oleo - GNU Oleo kalkulu-orria - GNU Oleo -taulukko - GNU Oleo rokniark - feuille de calcul GNU Oleo - scarbhileog GNU Oleo - folla de cálculo de Oleo GNU - גליון נתונים של GNU Oleo - GNU Oleo proračunska tablica - GNU Oleo-munkafüzet - Lembar sebar GNU Oleo - Foglio di calcolo GNU Oleo - GNU Oleo スプレッドシート - GNU Oleo ცხრილი - GNU Oleo электрондық кестесі - GNU Oleo 스프레드시트 - GNU Oleo skaičialentė - GNU Oleo izklājlapa - Hamparan GNU Oleo - GNU Oleo regneark - GNU Oleo-rekenblad - GNU Oleo-rekneark - Arkusz GNU Oleo - folha de cálculo GNU Oleo - Planilha do GNU Oleo - Foaie de calcul GNU Oleo - электронная таблица GNU Oleo - Zošit GNU Oleo - Preglednica GNU Oleo - Fletë llogaritje GNU Oleo - ГНУ Oleo табеларни прорачун - GNU Oleo-kalkylblad - ел. таблиця GNU Oleo - Bảng tính Oleo của GNU - GNU Oleo 工作簿 - GNU Oleo 試算表 - - - - - - - - PAK archive - أرشيف PAK - Archiŭ PAK - Архив — PAK - arxiu PAK - Archiv PAK - PAK-arkiv - PAK-Archiv - συμπιεσμένο αρχείο PAK - PAK archive - PAK-arkivo - archivador PAK - PAK artxiboa - PAK-arkisto - PAK skjalasavn - archive PAK - cartlann PAK - arquivo PAK - ארכיון PAK - PAK-archívum - Arsip PAK - Archivio PAK - PAK アーカイブ - PAK არქივი - PAK архиві - PAK 압축 파일 - PAK archyvas - PAK arhīvs - PAK-arkiv - PAK-archief - PAK-arkiv - Archiwum PAK - Pacote PAK - Arhivă PAK - архив PAK - Archív PAK - Datoteka arhiva PAK - Arkiv PAK - PAK-arkiv - PAK arşivi - архів PAK - Kho nén PAK - AR 归档文件 - PAK 封存檔 - - - - - - - - Palm OS database - قاعدة بيانات Palm OS - Palm OS mə'lumat bazası - Baza źviestak Palm OS - База от данни — Palm OS - base de dades Palm OS - Databáze Palm OS - Cronfa Ddata Palm OS - Palm OS-database - Palm-OS-Datenbank - βάση δεδομένων Palm OS - Palm OS database - datumbazo de Palm OS - base de datos de Palm OS - Palm OS datu-basea - Palm OS -tietokanta - Palm OS dátustovnur - base de données Palm OS - bunachar sonraí Palm OS - base de datos de Palm OS - מסד נתונים של Palm OS - Palm OS-adatbázis - Basis data Palm OS - Database Palm OS - Palm OS データベース - Palm OS дерекқоры - Palm OS 데이터베이스 - Palm OS duomenų bazė - Palm OS datubāze - Pangkalandata PalmOS - Palm OS-database - Palm OS-gegevensbank - Palm OS-database - Baza danych Palm OS - base de dados do Palm OS - Banco de dados do Palm OS - Bază de date Palm OS - база данных Palm OS - Databáza Palm OS - Podatkovna zbirka Palm OS - Bankë me të dhëna Palm OS - Palm OS база података - Palm OS-databas - Palm OS veritabanı - база даних Palm OS - Cơ sở dữ liệu PalmOS - Palm OS 数据库 - Palm OS 資料庫 - - - - - - - - Parchive archive - أرشيف Parchive - Archiŭ Parchive - Архив — parchive - arxiu Parchive - Archiv Parchive - Parchive-arkiv - Parchive-Archiv - συμπιεσμένο αρχείο Parchive - Parchive archive - archivador Parchive - Parchive artxiboa - Parchive-arkisto - Parchive skjalasavn - archive Parchive - cartlann Parchive - arquivo Parchive - ארכיון של Parchive - Parchive archívum - Arsip Parchive - Archivio Parchive - Parchive アーカイブ - Parchive архиві - Parchive 압축 파일 - Parchive archyvas - Parchive arhīvs - Parchive-arkiv - Parchive-archief - Parchive-arkiv - Archiwum parchive - Pacote Parchive - Arhivă Parchive - архив Parchive - Archív Parchive - Datoteka arhiva Parchive - Arkiv Parchive - Parchive-arkiv - Parchive arşivi - архів Parchive - Kho nén Parchive - Parchive 归档文件 - Parchive 封存檔 - Parchive - Parity Volume Set Archive - - - - - - - - - PEF executable - PEF تنفيذي - Vykonvalny fajł PEF - Изпълним файл — PEF - executable PEF - Spustitelný soubor PEF - PEF-kørbar - PEF-Programm - εκτελέσιμο PEF - PEF executable - PEF-plenumebla - ejecutable PEF - PEF exekutagarria - PEF-ohjelma - PEF inningarfør - exécutable PEF - comhad inrite PEF - Executábel PEF - קובץ הרצה PEF - PEF futtatható - PEF dapat dieksekusi - Eseguibile PEF - PEF 実行ファイル - PEF орындалатын файлы - PEF 실행 파일 - PEF vykdomasis failas - PEF izpildāmais - Bolehlaksana PEF - PEF-kjørbar - PEF-uitvoerbaar bestand - Køyrbar PEF-fil - Program PEF - executável PEF - Executável PEF - Executabil PEF - исполняемый файл PEF - Spustiteľný súbor PEF - Izvedljiva datoteka PEF - E ekzekutueshme PEF - PEF извршна - Körbar PEF-fil - PEF çalıştırılabilir - виконуваний файл PEF - Tập tin thực hiện được PEF - PEF 可执行文件 - PEF 可執行檔 - - - - - - - Perl script - سكربت بيرل - Skrypt Perl - Скрипт — Perl - script Perl - Skript v Perlu - Sgript Perl - Perlprogram - Perl-Skript - πρόγραμμα εντολών Perl - Perl script - Perl-skripto - script en Perl - Perl script-a - Perl-komentotiedosto - Perl boðrøð - script Perl - script Perl - Script de Perl - תסריט מעטפת של Perl - Perl-parancsfájl - Skrip Perl - Script Perl - Perl スクリプト - Perl сценарийі - 펄 스크립트 - Perl scenarijus - Perl skripts - Skrip Perl - Perl skript - Perl-script - Perl-skript - Skrypt Perl - 'script' Perl - Script Perl - Script Perl - сценарий Perl - Skript jazyka Perl - Skriptna datoteka Perl - Script Perl - Перл скрипта - Perlskript - Perl betiği - скрипт на Perl - Văn lệnh Perl - Perl 脚本 - Perl 指令稿 - - - - - - - - - - - - - - - - - - - - - - - - - - - - PHP script - سكربت PHP - PHP skripti - Skrypt PHP - Скрипт — PHP - script PHP - Skript PHP - Sgript PHP - PHP-program - PHP-Skript - πρόγραμμα εντολών PHP - PHP script - PHP-skripto - script en PHP - PHP script-a - PHP-komentotiedosto - PHP boðrøð - script PHP - script PHP - Script de PHP - תסריט מעטפת של PHP - PHP-parancsfájl - Skrip PHP - Script PHP - PHP スクリプト - PHP сценарийі - PHP 스크립트 - PHP scenarijus - PHP skripts - Skrip PHP - PHP-skript - PHP-script - PHP-skript - Skrypt PHP - 'script' PHP - Script PHP - Script PHP - сценарий PHP - Skript PHP - Skriptna datoteka PHP - Script PHP - PHP скрипта - PHP-skript - PHP betiği - скрипт PHP - Văn lệnh PHP - PHP 脚本 - PHP 指令稿 - - - - - - - - - - - - - PKCS#7 certificate bundle - رزمة الشهادة PKCS#7 - Сбор със сертификати — PKCS#7 - conjunt de certificats PKCS#7 - Svazek certifikátů PKCS#7 - PKCS#7-certifikatbundt - PKCS#7-Zertifikatspaket - πακέτο ψηφιακών πιστοποιητικών PKCS#7 - PKCS#7 certificate bundle - lote de certificados PCKS#7 - PKCS#7 zertifikazio sorta - PKCS#7-varmennenippu - PKCS#7 váttanar bundi - lot de certificats PKCS#7 - cuach theastas PKCS#7 - paquete de certificado PKCS#7 - בקשה מוסמכת PKCS#7 - PKCS#7-tanúsítványcsomag - Bundel sertifikat PKCS#7 - Bundle certificato PKCS#7 - PKCS#7 証明書 - PKCS#7 сертификаттар дестесі - PKCS#7 인증서 묶음 - PKCS#7 liudijimų ryšulys - PKCS#7 sertifikātu saišķis - PKCS#7-certificaatbundel - Pakiet certyfikatu PKCS#7 - Pacote de certificados PKCS#7 - Pachet certificat PKCS#7 - пакет сертификатов PKCS#7 - Zväzok certifikátov PKCS#7 - Datoteka potrdila PKCS#7 - PKCS#7-certifikatsamling - комплект сертифікатів PKCS#7 - Bó chứng nhận PKCS#7 - PKCS#7 证书束 - PKCS#7 憑證綁包 - PKCS - Public-Key Cryptography Standards - - - - - PKCS#12 certificate bundle - رزمة الشهادة PKCS#12 - Viazka sertyfikataŭ PKCS#12 - Сбор със сертификати — PKCS#12 - conjunt de certificats PKCS#12 - Svazek certifikátů PKCS#12 - PKCS#12-certifikatbundt - PKCS#12-Zertifikatspaket - πακέτο ψηφιακών πιστοποιητικών PKCS#12 - PKCS#12 certificate bundle - ligaĵo de PKCS#12-atestiloj - lote de certificados PCKS#12 - PKCS#12 zertifikazio sorta - PKCS#12-varmennenippu - PKCS#12 váttanar bundi - lot de certificats PKCS#12 - cuach theastas PKCS#12 - paquete de certificado PKCS#12 - בקשה מוסמכת PKCS#12 - PKCS#12-tanúsítványcsomag - Bundel sertifikat PKCS#12 - Bundle certificato PKCS#12 - PKCS#12 証明書 - PKCS#12 сертификаттар дестесі - PKCS#12 인증서 묶음 - PKCS#12 liudijimų ryšulys - PKCS#12 sertifikātu saišķis - Sijil PKCS#12 - PKCS#12 sertifikathaug - PKCS#12-certificaatbundel - PKCS#12-sertifikatbunt - Pakiet certyfikatu PKCS#12 - conjunto de certificados PKCS#12 - Pacote de certificados PKCS#12 - Certificat împachetat PKCS#12 - пакет сертификатов PKCS#12 - Zväzok certifikátov PKCS#12 - Datoteka potrdila PKCS#12 - Bundle çertifikate PKCS#12 - PKCS#12 пакет сертификата - PKCS#12-certifikatsamling - комплект сертифікатів PKCS#12 - Bó chứng nhận PKCS#12 - PKCS#12 证书束 - PKCS#12 憑證檔 - PKCS - Public-Key Cryptography Standards - - - - - PlanPerfect spreadsheet - جدول PlanPerfect - Raźlikovy arkuš PlanPerfect - Таблица — PlanPerfect - full de càlcul de PlanPerfect - Sešit PlanPerfect - PlanPerfect-regneark - PlanPerfect-Tabelle - φύλλο εργασίας PlanPerfect - PlanPerfect spreadsheet - hoja de cálculo de PlanPerfect - PlanPerfect kalkulu-orria - PlanPerfect-taulukko - PlanPerfect rokniark - feuille de calcul PlanPerfect - scarbhileog PlanPerfect - folla de cálculo de PlanPerfect - גליון נתונים של PlanPerfect - PlanPerfect táblázat - Lembar sebar PlanPerfect - Foglio di calcolo PlanPerfect - PlanPerfect スプレッドシート - PlanPerfect электрондық кестесі - PlanPerfect 스프레드시트 - PlanPerfect skaičialentė - PlanPerfect izklājlapa - PlanPerfect-regneark - PlanPerfect-rekenblad - PlanPerfect-rekneark - Arkusz PlanPerfect - Planilha do PlanPerfect - Foaie de calcul PlanPerfect - электронная таблица PlanPerfect - Zošit PlanPerfect - Preglednica PlanPerfect - Fletë llogaritjesh PlanPerfect - PlanPerfect-kalkylblad - ел. таблиця PlanPerfect - Bảng tính PlanPerfect - PlanPerfect 工作簿 - PlanPerfect 試算表 - - - - - Pocket Word document - مستند Pocket Word - Документ — Pocket Word - document Pocket Word - Dokument Pocket Word - Pocket Word-dokument - Pocket-Word-Dokument - έγγραφο Pocket Word - Pocket Word document - documento de Pocket Word - Pocket Word dokumentua - Pocket Word -asiakirja - Pocket Word skjal - document Pocket Word - cáipéis Pocket Word - documento de Pocket Word - מסמך של Pocket Word - Pocket Word dokumentum - Dokumen Pocket Word - Documento Pocket Word - Pocket Word ドキュメント - Pocket Word құжаты - Pocket Word 문서 - Pocket Word dokumentas - Pocket Word dokuments - Pocket Word-document - Dokument Pocket Word - Documento do Pocket Word - Document Pocket Word - документ Pocket Word - Dokument Pocket Word - Dokument Pocket Word - Pocket Word-dokument - Pocket Word belgesi - документ Pocket Word - Tài liệu Pocket Word - Pocket Word 文档 - Pocket Word 文件 - - - - - - - - profiler results - نتائج المحلل - profiler nəticələri - vyniki profilera - Резултати от анализатора - resultats del perfilador - Výsledky profiler - canlyniadau proffeilio - profileringsresultater - Profiler-Ergebnisse - αποτελέσματα μετρήσεων για την εκτέλεση προγράμματος - profiler results - resultoj de profililo - resultados del perfilador - profiler-aren emaitzak - profilointitulokset - résultats de profileur - torthaí próifíleora - resultados do perfilador - תוצאות מאבחן - profilírozó-eredmények - hasil profiler - Risultati profiler - プロファイラー結果 - прифильдеу нәтижелері - 프로파일러 결과 - profiliklio rezultatai - profilētāja rezultāti - Hasil pemprofil - profileingsresultat - profiler-resultaten - profileringsresultat - Wyniki profilowania - resultados do 'profiler' - Resultados do profiler - rezultate profiler - результаты профилирования - Výsledky profilera - rezultati profilirnika - Rezultate të profiluesit - резултати профилатора - profilerarresultat - результати профілювання - kết quả nét hiện trạng - profiler 结果 - 硬體資訊產生器成果 - - - - - - Pathetic Writer document - مستند Pathetic Writer - Dakument Pathetic Writer - Документ — Pathetic Writer - document de Pathetic Writer - Dokument Pathetic Writer - Pathetic Writer-dokument - Pathetic-Writer-Dokument - έγγραφο Pathetic Writer - Pathetic Writer document - dokumento de Pathetic Writer - documento de Pathetic Writer - Pathetic Writer dokumentua - Pathetic Writer -asiakirja - Pathetic Writer skjal - document Pathetic Writer - cáipéis Pathetic Writer - documento de Pathetic Writer - מסמך של Pathetic Writer - Pathetic Writer-dokumentum - Dokumen Pathetic Writer - Documento Pathetic Writer - Pathetic Writer ドキュメント - Pathetic Writer құжаты - Pathetic Writer 문서 - Pathetic Writer dokumentas - Pathetic Writer dokuments - Dokumen Pathetic Writer - Pathetic Writer-dokument - Pathetic Writer-document - Pathetic Writer-dokument - Dokument Pathetic Writer - documento do Pathetic Writer - Documento do Pathetic Writer - Document Pathetic Writer - документ Pathetic Writer - Dokument Pathetic Writer - Dokument Pathetic Writer - Dokument Pathetic Writer - Документ Патетичног писца - Pathetic Writer-dokument - Pathetic Writer belgesi - документ Pathetic Writer - Tài liệu Pathetic Writer - Pathetic Writer 文档 - Pathetic Writer 文件 - - - - - Python bytecode - Python bytecode - Python bayt kodu - Bajtavy kod Python - Байт код — Python - bytecode de Python - Bajtový kód Python - Côd beit Python - Pythonbytekode - Python-Bytecode - συμβολοκώδικας Python - Python bytecode - Python-bajtkodo - bytecode Python - Python byte-kodea - Python-tavukoodi - Python býtkota - bytecode Python - beartchód Python - bytecode de Python - Bytecode של Python - Python-bájtkód - Kode bita Python - Bytecode Python - Python バイトコード - Python байткоды - 파이썬 바이트코드 - Python baitinis kodas - Python bitkods - Kodbait Python - Python-bytekode - Python-bytecode - Python-bytekode - Kod bajtowy Python - código binário Python - Código compilado Python - Bytecode Python - байт-код Python - Bajtový kód Python - Datoteka bitne kode Python - Bytecode Python - Питонов бајт ко̂д - Python-bytekod - байт-код Python - Mã byte Python - Python 字节码 - Python 位元組碼 - - - - - - - - QtiPlot document - - - - - - - - - - Quattro Pro spreadsheet - جدول Quattro Pro - Raźlikovy arkuš Quattro Pro - Таблица — Quattro Pro - full de càlcul de Quattro Pro - Sešit Quattro Pro - Quattro Pro-regneark - Quattro-Pro-Tabelle - λογιστικό φύλλο Quattro Pro - Quattro Pro spreadsheet - sterntabelo de Quattro Pro - hoja de cálculo Quattro Pro - Quattro Pro kalkulu-orria - Quattro Pro -taulukko - Quattro Pro rokniark - feuille de calcul Quattro Pro - scarbhileog Quattro Pro - folla de cálculo Quattro Pro - גליון נתונים של Quattro Pro - Quattro Pro proračunska tablica - Quattro Pro-munkafüzet - Lembar sebar Quattro Pro - Foglio di calcolo Quattro Pro - Quattro Pro スプレッドシート - Quattro Pro электрондық кестесі - Quattro Pro 스프레드시트 - Quattro Pro skaičialentė - Quattro Pro izklājlapa - Hamparan Quatro Pro - Quattro Pro-regneark - Quattro Pro-rekenblad - Quattro Pro-rekneark - Arkusz Quattro Pro - folha de cálculo Quattro Pro - Planilha do Quattro Pro - Foaie de calcul Quattro Pro - электронная таблица Quattro Pro - Zošit Quattro Pro - Preglednica Quattro Pro - Fletë llogaritjesh Quattro Pro - Quattro Pro табеларни рачун - Quattro Pro-kalkylblad - ел. таблиця Quattro Pro - Bảng tính Quattro Pro - Quattro Pro 工作簿 - Quattro Pro 試算表 - - - - - - - QuickTime metalink playlist - قائمة تشغيل QuickTime metalink - śpis metaspasyłak na pieśni QuickTime - Списък за изпълнение — QuickTime - llista de reproducció de metaenllaços QuickTime - Seznam skladeb metalink QuickTime - QuickTime metalink-afspilningsliste - QuickTime-Metalink-Wiedergabeliste - λίστα αναπαραγωγής metalinks QuickTime - QuickTime metalink playlist - lista de reproducción de metaenlaces QuickTime - QuickTime meta-esteken erreprodukzio-zerrenda - QuickTime metalink -soittolista - QuickTime metaleinkju avspælingarlisti - liste de lecture metalink QuickTime - seinmliosta meiteanasc QuickTime - lista de reprodución de metaligazóns QuickTime - רשימת השמעה מקושרת של QuickTime - QuickTime metalink lejátszólista - Senarai berkas taut meta QuickTime - Scaletta metalink QuickTime - QuickTime メタリンク再生リスト - QuickTime метасілтемелер ойнау тізімі - 퀵타임 메타링크 재생 목록 - QuickTime metanuorodos grojaraštis - QuickTime metasaites repertuārs - QuickTime metalink-spilleliste - QuickTime metalink-afspeellijst - QuickTime metalink-speleliste - Lista odtwarzania metaodnośników QuickTime - Lista de reprodução metalink do QuickTime - Listă cu metalegături QuickTime - список воспроизведения мета-ссылок QuickTime - Zoznam skladieb metalink QuickTime - Seznam predvajanja QuickTime - Listë titujsh metalink QuickTime - QuickTime-metalänkspellista - список відтворення QuickTime metalink - Danh mục nhạc siêu liên kết Quicktime - QuickTime 元链接播放列表 - QuickTime metalink 播放清單 - - - - - - - - - - - - - - - Quicken document - مستند Quicken - Quicken sənədi - Dakument Quicken - Документ — Quicken - document de Quicken - Dokument Quicken - Dogfen Quicken - Quickendokument - Quicken-Dokument - έγγραφο Quicken - Quicken document - Quicken-dokumento - documento de Quicken - Quicken dokumentua - Quicken-asiakirja - Quicken skjal - document Quicken - cáipéis Quicken - documento de Quicken - מסמך של Quicken - Quicken dokument - Quicken-dokumentum - Dokumen Quicken - Documento Quicken - Quicken ドキュメント - Quicken құжаты - Quicken 문서 - Quicken dokumentas - Quicken dokuments - Dokumen Quicken - Quicken-dokument - Quicken-document - Quicken-dokument - Dokument Quicken - documento Quicken - Documento do Quicken - Document Quicken - документ Quicken - Dokument Quicken - Dokument Quicken - Dokument Quicken - Quicken документ - Quicken-dokument - документ Quicken - Tài liệu Quicken - Quicken 文档 - Quicken 文件 - - - - - RAR archive - أرشيف RAR - Archiŭ RAR - Архив — RAR - arxiu RAR - Archiv RAR - Archif RAR - RAR-arkiv - RAR-Archiv - αρχείο RAR - RAR archive - RAR-arkivo - archivador RAR - RAR artxiboa - RAR-arkisto - RAR skjalasavn - archive RAR - cartlann RAR - ficheiro RAR - ארכיון RAR - RAR arhiva - RAR-archívum - Arsip RAR - Archivio RAR - RAR アーカイブ - RAR архиві - RAR 압축 파일 - RAR archyvas - RAR arhīvs - Arkib RAR - RAR-arkiv - RAR-archief - RAR-arkiv - Archiwum RAR - arquivo RAR - Pacote RAR - Arhivă RAR - архив RAR - Archív RAR - Datoteka arhiva RAR - Arkiv RAR - РАР архива - RAR-arkiv - архів RAR - Kho nén RAR - RAR 归档文件 - RAR 封存檔 - RAR - Roshal ARchive - - - - - - - - - DAR archive - أرشيف DAR - Archiŭ DAR - Архив — DAR - arxiu DAR - Archiv DAR - DAR-arkiv - DAR-Archiv - συμπιεσμένο αρχείο DAR - DAR archive - DAR-arkivo - archivador DAR - DAR artxiboa - DAR-arkisto - DAR skjalasavn - archive DAR - cartlann DAR - arquivo DAR - ארכיון DAR - DAR arhiva - DAR archívum - Arsip DAR - Archivio DAR - DAR アーカイブ - DAR არქივი - DAR архиві - DAR 묶음 파일 - DAR archyvas - DAR arhīvs - DAR-arkiv - DAR-archief - DAR-arkiv - Archiwum DAR - Pacote DAR - Arhivă DAR - архив DAR - Archív DAR - Datoteka arhiva DAR - Arkiv DAR - DAR-arkiv - архів DAR - Kho nén DAR - DAR 归档文件 - DAR 封存檔 - - - - - - - - Alzip archive - أرشيف Alzip - Archiŭ Alzip - Архив — alzip - arxiu Alzip - Archiv Alzip - Alziparkiv - Alzip-Archiv - Alzip archive - Alzip-arkivo - archivador Alzip - Alzip artxiboa - Alzip-arkisto - Alsip skjalasavn - archive alzip - cartlann Alzip - arquivo Alzip - ארכיון Alzip - Alzip arhiva - Alzip archívum - Arsip Alzip - Archivio Alzip - Alzip アーカイブ - Alzip არქივი - Alzip архиві - 알집 압축 파일 - Alzip archyvas - Alzip arhīvs - Alzip-arkiv - Alzip-archief - Alzip-arkiv - Archiwum alzip - Pacote Alzip - Arhivă Alzip - архив ALZIP - Archív Alzip - Datoteka arhiva Alzip - Arkiv Alzip - Alzip-arkiv - Alzip arşivi - архів Alzip - Kho nén Alzip - Alzip 归档文件 - Alzip 封存檔 - - - - - - - - rejected patch - رقعة مرفوضة - niepryniaty patch - Отхвърлен файл с кръпка - pedaç rebutjat - Odmítnutá záplata - afvist tekstlap - Abgelehnter Patch - μπάλωμα που απορρίφθηκε - rejected patch - reĵeta flikaĵo - parche rechazado - baztertutako bide-izena - hylättyjen muutosten tiedosto - vrakað rætting - correctif rejeté - paiste diúltaithe - parche rexeitado - תלאי שנדחה - odbijena zakrpa - visszautasított folt - patch ditolak - Patch rifiutata - 拒否されたパッチ - алынбаған патч - 거부된 패치 파일 - atmestas lopas - noraidītais ceļš - Tampungan ditolak - avvist patchfil - verworpen patch - avvist programfiks - Odrzucona łata - ficheiro de patch rejeitado - Arquivo de patch rejeitado - petec respsins - отвергнутый патч - Odmietnutá záplata - zavrnjen popravek - Patch i kthyer mbrapsht - одбијена закрпа - avvisad programfix - відхилена латка - đắp vá bị từ chối - 拒绝的补丁 - 回絕的修補 - - - - - - - RPM package - حزمة RPM - Pakunak RPM - Пакет — RPM - paquet RPM - Balíček RPM - RPM-pakke - RPM-Paket - πακέτο RPM - RPM package - RPM-pakaĵo - paquete RPM - RPM paketea - RPM-paketti - RPM pakki - paquet RPM - pacáiste RPM - paquete RFM - חבילת RPM - RPM paket - RPM-csomag - Paket RPM - Pacchetto RPM - RPM パッケージ - RPM дестесі - RPM 패키지 - RPM paketas - RPM pakotne - Pakej RPM - RPM-pakke - RPM-pakket - RPM-pakke - Pakiet RPM - pacote RPM - Pacote RPM - Pachet RPM - пакет RPM - Balík RPM - Datoteka paketa RPM - Paketë RPM - RPM пакет - RPM-paket - пакунок RPM - Gói RPM - RPM 软件包 - RPM 套件 - - - - - - - - - Source RPM package - - - - - - - Ruby script - سكربت روبي - Skrypt Ruby - Скрипт — Ruby - script Ruby - Skript v Ruby - Rubyprogram - Ruby-Skript - πρόγραμμα εντολών Ruby - Ruby script - Ruby-skripto - script en Ruby - Ruby script-a - Ruby-komentotiedosto - Ruby boðrøð - script Ruby - script Ruby - Script de Ruby - תסריט Ruby - Ruby skripta - Ruby-parancsfájl - Skrip Ruby - Script Ruby - Ruby スクリプト - Ruby сценарийі - 루비 스크립트 - Ruby scenarijus - Ruby skripts - Skrip Ruby - Ruby-skript - Ruby-script - Ruby-skript - Skrypt Ruby - 'script' Ruby - Script Ruby - Script Ruby - сценарий Ruby - Skript Ruby - Skriptna datoteka Ruby - Script Ruby - Руби скрипта - Ruby-skript - Ruby betiği - скрипт Ruby - Văn lệnh Ruby - Ruby 脚本 - Ruby 指令稿 - - - - - - - - - - - Markaby script - سكربت Markaby - Skrypt Markaby - Скрипт — Markaby - script Markaby - Skript Markaby - Markabyprogram - Markaby-Skript - δέσμη εντολών Markaby - Markaby script - Markaby-skripto - script en Markaby - Markaby script-a - Markaby-komentotiedosto - Markaby boðrøð - script Markaby - script Markaby - Script de Markaby - תסריט Markby - Markaby skripta - Markaby parancsfájl - Skrip Markaby - Script Markaby - Markaby スクリプト - Markaby-ის სცენარი - Markaby сценарийі - Markaby 스크립트 - Markaby scenarijus - Markaby skripts - Markaby-skript - Markaby-script - Markaby-skript - Skrypt Markaby - Script Markaby - Script Markaby - сценарий Markaby - Skript Markaby - Skriptna datoteka Markaby - Script Markaby - Markaby-skript - Markaby betiği - скрипт Markaby - Văn lệnh Markaby - RMarkaby 脚本 - Markaby 指令稿 - - - - - - SC/Xspread spreadsheet - جدول SC/Xspread - Raźlikovy arkuš SC/Xspread - Таблица — SC/Xspread - full de càlcul de SC/Xspread - Sešit SC/Xspread - SC/Xspread-regneark - SX/Xspread-Tabelle - φύλλο εργασίας SC/Xspread - SC/Xspread spreadsheet - SC/Xspread-kalkultabelo - hoja de cálculo SC/Xspread - SC/Xspread kalkulu-orria - SC/Xspread-taulukko - SC/Xspread rokniark - feuille de calcul SC/Xspread - scarbhileog SC/Xspread - folla de cálculo SC/Xspread - גליון נתונית של SC/Xspread - SC/Xspread proračunska tablica - SC/Xspread táblázat - Lembar sebar SC/Xspread - Foglio di calcolo SC/Xspread - SC/Xspread スプレッドシート - SC/Xspread электрондық кестесі - SC/Xspread 스프레드시트 - SC/Xspread skaičialentė - SC/Xspread izklājlapa - SC/Xspread-regneark - SC/Xspread-rekenblad - SC/Xspread-rekneark - Arkusz SC/Xspread - Planilha do SC/Xspread - Foaie de calcul SC/Xspread - электронная таблица SC/Xspread - Zošit SC/Xspread - Preglednica SC/Xspread - Fletë llogaritjesh SC/Xspread - SC/Xspread-kalkylblad - ел. таблиця SC/Xspread - Bảng tính SC/Xspread - SC/Xspread 工作簿 - SC/Xspread 試算表 - - - - - - - shell archive - أرشيف شِل - qabıq arxivi - archiŭ abałonki - Архив на обвивката - arxiu d'intèrpret d'ordres - Archiv shellu - archif plisgyn - skalarkiv - Shell-Archiv - αρχείο φλοιού (SHAR) - shell archive - ŝel-arkivo - archivador shell - shell artxiboa - komentotulkkiarkisto - skel savn - archive shell - cartlann bhlaoisce - ficheiro shell - ארכיון מעטפת - arhiva ljuske - héjarchívum - arsip shell - Archivio shell - シェルアーカイブ - қоршам архиві - 셸 압축 파일 - shell archyvas - čaulas arhīvs - Arkib shell - skallarkiv - shell-archief - skal-arkiv - Archiwum powłoki - arquivo de consola - Pacote shell - arhivă shell - архив оболочки UNIX - Archív shellu - lupinski arhiv - Arkiv shell - Архива љуске (SHAR) - skalarkiv - архів оболонки - kho trình bao - shell 归档文件 - shell 封存檔 - - - - - libtool shared library - مكتبة libtool المشتركة - supolnaja biblijateka libtool - Споделена библиотека — libtool - biblioteca compartida libtool - Sdílená knihovna libtool - libtool delt bibliotek - Gemeinsame libtool-Bibliothek - κοινόχρηστη βιβλιοθήκη libtool - libtool shared library - biblioteca compartida de libtool - libtool partekatutako liburutegia - jaettu libtool-kirjasto - libtool felagssavn - bibliothèque partagée libtool - comhleabharlann libtool - biblioteca compartida de libtool - ספריה משותפת של libtool - libtool dijeljena biblioteka - libtool osztott programkönyvtár - pustaka bersama libtool - Libreria condivisa libtool - libtool 共有ライブラリ - libtool ортақ жинағы - libtool 공유 라이브러리 - libtool bendroji biblioteka - libtool koplietotā bibliotēka - libtool delt bibliotek - gedeelde libtool-bibliotheek - libtool delt bibliotek - Biblioteka współdzielona libtool - Biblioteca compartilhada libtool - bibliotecă partajată libtool - разделяемая библиотека libtool - Zdieľaná knižnica libtool - Souporabna knjižnica libtool - Librari e përbashkët libtool - delat libtool-bibliotek - спільна бібліотека libtool - thư viện dùng chung libtool - libtool 共享库 - libtool 共享函式庫 - - - - - - shared library - مكتبة مشتركة - bölüşülmüş kitabxana - supolnaja biblijateka - Споделена библиотека - biblioteca compartida - Sdílená knihovna - llyfrgell wedi ei rhannu - delt bibliotek - Gemeinsame Bibliothek - αρχείο κοινόχρηστης βιβλιοθήκης - shared library - dinamike bindebla biblioteko - biblioteca compartida - partekatutako liburutegia - jaettu kirjasto - felagssavn - bibliothèque partagée - comhleabharlann - biblioteca compartida - ספרייה משותפת - dijeljena biblioteka - osztott programkönyvtár - pustaka bersama - Libreria condivisa - 共有ライブラリ - бөлісетін библиотека - 공유 라이브러리 - bendroji biblioteka - koplietotā bibliotēka - Pustaka terkongsi - delt bibliotek - gedeelde bibliotheek - delt bibliotek - Biblioteka współdzielona - biblioteca partilhada - Biblioteca compartilhada - bibliotecă partajată - разделяемая библиотека - Zdieľaná knižnica - souporabljena knjižnica - Librari e përbashkët - дељена библиотека - delat bibliotek - спільна бібліотека - thư viện dùng chung - 共享库 - 共享函式庫 - - - - - - - - - - - - - - - - - - - - shell script - سكربت شِل - qabıq skripti - skrypt abałonki - Скрипт на обвивката - script d'intèrpret d'ordres - Skript shellu - sgript plisgyn - skalprogram - Shell-Skript - αρχείο εντολών φλοιού - shell script - ŝelskripto - script en shell - shell script-a - komentotulkin komentotiedosto - skel boðrøð - script shell - script bhlaoisce - script de shell - תסריט מעטפת - skripta ljuske - héj-parancsfájl - skrip shell - Script shell - シェルスクリプト - қоршам сценарийі - 셸 스크립트 - shell scenarijus - čaulas skripts - Skrip shell - skallskript - shellscript - skalskript - Skrypt powłoki - 'script' de consola - Script shell - script shell - сценарий оболочки UNIX - Skript shellu - lupinski skript - Script shell - скрипта љуске - skalskript - скрипт оболонки - văn lệnh trình bao - shell 脚本 - shell 指令稿 - - - - - - - - - - - - - - - - - - - - - Shockwave Flash file - ملف Shockwave Flash - Fajł Shockwave Flash - Файл — Shockwave Flash - fitxer Shockwave Flash - Soubor Shockwave Flash - Shockwave Flash-fil - Shockwave-Flash-Datei - αρχείο Shockwave Flash - Shockwave Flash file - dosiero de Shockwave Flash - archivo Shockwave Flash - Shockwave Flash fitxategia - Shockwave Flash -tiedosto - Shockwave Flash fíla - fichier Shockwave Flash - comhad Shockwave Flash - ficheiro sockwave Flash - קובץ של Shockwave Flash - Shockwave Flash datoteka - Shockwave Flash-fájl - Berkas Shockwave Flash - File Shockwave Flash - Shockwave Flash ファイル - Shockwave Flash файлы - Shockwave 플래시 파일 - Shockwave Flash failas - Shockwave Flash datne - Fail Shockwave Flash - Shockwave Flash-fil - Shockwave Flash-bestand - Shockwave Flash-fil - Plik Shockwave Flash - ficheiro Shockwave Flash - Arquivo Shockwave Flash - Fișier Shockwave Flash - файл Shockwave Flash - Súbor Shockwave Flash - Datoteka Shockwave Flash - File Flash Shockwave - Шоквејв Флеш датотека - Shockwave Flash-fil - файл Shockwave Flash - Tập tin Flash Shockwave - Shockwave Flash 文件 - Shockwave Flash 檔 - - - - - - - - - - - - - Shorten audio - Shorten سمعي - Aŭdyjo Shorten - Аудио — Shorten - àudio Shorten - Zvuk Shorten - Shortenlyd - Shorten-Audio - ήχος Shorten - Shorten audio - Shorten-sondosiero - sonido Shorten - Shorten audioa - Shorten-ääni - Shorten ljóður - audio Shorten - fuaim Shorten - son Shorten - שמע של Shorten - Shorten audio - Shorten hang - Audio Shorten - Audio Shorten - Shorten オーディオ - Shorten аудиосы - Shorten 오디오 - Shorten garso įrašas - Shorten audio - Shorten lyd - Shorten-audio - Shorten-lyd - Plik dźwiękowy Shorten - Áudio Shorten - Audio Shorten - аудио Shorten - Zvuk Shorten - Zvočna datoteka Shorten - Audio Shorten - Shorten-ljud - звук Shorten - Âm thanh Shorten - Shorten 音频 - Shorten 音訊 - - - - - - - - Siag spreadsheet - جدول Siag - Raźlikovy arkuš Siag - Таблица — Siag - full de càlcul Siag - Sešit Siag - Siagregneark - Siag-Tabelle - λογιστικό φύλλο Siag - Siag spreadsheet - Siag-kalkultabelo - hoja de cálculo de Siag - Siag kalkulu-orria - Siag-taulukko - Siag rokniark - feuille de calcul Siag - scarbhileog Siag - folla de cálculo de Siag - גליון נתונים של Siag - Siag proračunska tablica - Siag-munkafüzet - Lembar sebar Siag - Foglio di calcolo Siag - Siag スプレッドシート - Siag электрондық кестесі - Siag 스프레드시트 - Siag skaičialentė - Siag izklājlapa - Hamparan Siag - Siag-regneark - Siag-rekenblad - Siag-rekneark - Arkusz Siag - folha de cálculo Siag - Planilha do Siag - Foaie de calcul Siag - электронная таблица Siag - Zošit Siag - Preglednica Siag - Fletë llogaritjesh Siag - Siag табеларни прорачун - Siag-kalkylblad - ел. таблиця Siag - Bảng tính Slag - Siag 工作簿 - Siag 試算表 - - - - - Skencil document - مستند Skencil - Dakument Skencil - Документ — Skencil - document Skencil - Dokument Skencil - Skencildokument - Skencil-Dokument - έγγραφο Skencil - Skencil document - Skencil-dokumento - documento Skencil - Skencil dokumentua - Skencil-asiakirja - Skencil skjal - document Skencil - cáipéis Skencil - documento Skencil - מסמך Skencil - Skencil dokument - Skencil-dokumentum - Dokumen Skencil - Documento Skencil - Skencil ドキュメント - Skencil құжаты - Skencil 문서 - Skencil dokumentas - Skencil dokuments - Skencil-document - Skencil-dokument - Dokument Skencil - Documento do Skencil - Document Skencil - документ Skencil - Dokument Skencil - Dokument Skencil - Dokument Skencil - Skencil-dokument - Skencil belgesi - документ Skencil - Tài liệu Skencil - Skencil 文档 - Skencil 文件 - - - - - - - - Stampede package - حزمة Stampede - Stampede paketi - Pakunak Stampede - Пакет — Stampede - paquet Stampede - Balíček Stampede - Pecyn Stampede - Stampedepakke - Stampede-Paket - πακέτο Stampede - Stampede package - Stampede-pakaĵo - paquete Stampede - Stampede paketea - Stampede-paketti - Stampede pakki - paquet Stampede - pacáiste Stampede - paquete Stampede - חבילה של Stampede - Stampede paket - Stampede-csomag - Paket Stampede - Pacchetto Stampede - Stampede パッケージ - Stampede дестесі - Stampete 패키지 - Stampede paketas - Stampede pakotne - Pakej Stampede - Stampede-pakke - Stampede-pakket - Stampede-pakke - Pakiet Stampede - pacote Stampede - Pacote Stampede - Pachet Stampede - пакет Stampede - Balíček Stampede - Datoteka paketa Stampede - Paketë Stampede - Stampede пакет - Stampede-paket - Stampede paketi - пакунок Stampede - Gói Stampede - Stampede 软件包 - Stampede 套件 - - - - Sega Master System/Game Gear ROM - ROM الخاص بدولاب لعبة/نظام سيجا ماستر - Sega Master System/Game Gear ROM - ROM — Sega Master System/Game Gear - ROM de Sega Master System/Game Gear - ROM pro Sega Master System/Game Gear - Sega Master System/Game Gear-rom - Sega-Master-System/Game-Gear-ROM - Εικόνα μνήμης ROM Sega Master System/Game Gear - Sega Master System/Game Gear ROM - ROM de Sega Master System/Game Gear - Sega Master System/Game Gear-eko ROMa - Sega Master System/Game Gear -ROM - Sega Master System/Game Gear ROM - ROM Sega Master System/Game Gear - ROM Sega Master System/Game Gear - ROM de Sega Master System/Game Gear - Sega Master System/Game Gear של ROM - Sega Master System/Game Gear ROM - Sega Master System/Game Gear ROM - Memori baca-saja Sega Master System/Game Gear - ROM Sega Master System/Game Gear - セガ マスターシステム/ゲームギア ROM - Sega Master System/Game Gear ROM - 세가 마스터 시스템/게임 기어 롬 - Sega Master System/Game Gear ROM - Sega Master System/Game Gear ROM - Sega Master System/Game Gear-ROM - Sega Master System/Game Gear-ROM - Sega Master System/Game Gear-ROM - Plik ROM konsoli SMS/Game Gear - ROM do Sega Master System/Game Gear - ROM Sega Master System/Game Gear - Sega Master System/Game Gear ROM - ROM pre Sega Master System/Game Gear - Bralni pomnilnik Sega Master System/Game Gear - ROM Sega Master System/Game Gear - Sega Master System/Game Gear-rom - ППП Sega Master System/Game Gear - ROM Sega Master System/Game Gear - Sega Master System/Game Gear ROM - Sega Master System/Game Gear ROM - - - - - - - Super NES ROM - Super NES ROM - Super Nintendo ROM - ROM — Super NES - ROM de Super NES - ROM pro Super Nintendo - Super NES-rom - Super-NES-ROM - εικόνα μνήημης ROM Super NES - Super NES ROM - ROM de Super NES - Super Nintendo-ko ROMa - Super Nintendo -ROM - Super NES ROM - ROM Super Nintendo - ROM Super NES - ROM de Super NES - ROM של Super NES - Super NES ROM - Super NES ROM - Memori baca-saja Super Nintendo - ROM Super Nintendo - スーパーファミコン ROM - Super NES ROM - 수퍼 NES 롬 - Super NES ROM - Super NES ROM - Super Nintendo ROM - Super Nintendo - Super NES-ROM - Plik ROM konsoli SNES - ROM do Super Nintendo - ROM Super Nintendo - Super NES ROM - ROM pre Super Nintendo - Bralni pomnilnik Super NES - ROM Super NES - Super NES-rom - ППП Super NES - ROM Super Nintendo - Super NES ROM - 超級任天堂 ROM - - - - - - - StuffIt archive - أرشيف StuffIt - Archiŭ StuffIt - Архив — StuffIt - arxiu StuffIt - Archiv StuffIt - StuffIt-arkiv - StuffIt-Archiv - συμπιεσμένο αρχείο StuffIt - StuffIt archive - StuffIt-arkivo - archivador StuffIt - StuffIt artxiboa - StuffIt-arkisto - StuffIt skjalasavn - archive StuffIt - cartlann StuffIt - arquivo StuffIt - ארכיון של Sאוככןא - StuffIt arhiva - StuffIt-archívum - Arsip StuffIt - Archivio StuffIt - StuffIt アーカイブ - StuffIt архиві - StuffIt 압축 파일 - StuffIt archyvas - StuffIt arhīvs - StuffIt arkiv - StuffIt-archief - StuffIt-arkiv - Archiwum StuffIt - Pacote StuffIt - Arhivă StuffIt - архив StuffIt - Archív StuffIt - Datoteka arhiva StuffIt - Arkiv StuffIt - StuffIt архива - StuffIt-arkiv - StuffIt arşivi - архів StuffIt - Kho nén Stuffit - Macintosh StuffIt 归档文件 - StuffIt 封存檔 - - - - - - - - - - - SubRip subtitles - ترجمات SubRip - Subtytry SubRip - Субтитри — SubRip - subtítols SubRip - Titulky SubRip - SubRip-undertekster - SubRip-Untertitel - υπότιτλοι SubRip - SubRip subtitles - SubRip-subtekstoj - subtítulos SubRip - SubRip azpitituluak - SubRip-tekstitykset - SubRip undirtekstir - sous-titres SubRip - fotheidil SubRip - subtítulos SubRip - כתוביות של SubRip - SubRip titlovi - SubRip feliratok - Subjudul SubRip - Sottotitoli SubRip - SubRip 字幕 - SubRip субтитрлары - SubRip 자막 파일 - SubRip subtitrai - SubRip subtitri - SubRip undertekst - SubRip-ondertitels - SubRip-teksting - Napisy SubRip - Legendas SubRip - Subtitrare SubRip - субтитры SubRip - Titulky SubRip - Datoteka podnapisov SubRip - Nëntituj SubRip - SubRip-undertexter - SubRip altyazıları - субтитри SubRip - Phụ đề SubRip - SubRip 字幕 - SubRip 字幕 - - - - - - - - - - - - WebVTT subtitles - Субтитри — WebVTT - subtítols WebVTT - Titulky WebVTT - WebVTT-undertekster - WebVTT-Untertitel - υπότιτλοι WebVTT - WebVTT subtitles - Subtítulos WebVTT - WebVTT-tekstitykset - sous-titres WebVTT - subtítulos WebVTT - כתוביות WebVTT - WebVTT titlovi - WebVTT feliratok - Subtitel WebVTT - Sottotitoli WebVTT - WebVTT サブタイトル - WebVTT ქვეტიტრები - WebVTT субтитрлары - WebVTT 자막 - WebVTT subtitri - WebVTT ondertitels - Napisy WebVTT - Legendas WebVTT - субтитры WebVTT - Podnapisi WebVTT - WebVTT-undertexter - субтитри WebVTT - WebVTT 字幕 - WebVTT 字幕 - VTT - Video Text Tracks - - - - - - - - - SAMI subtitles - ترجمات SAMI - Subtytry SAMI - Субтитри — SAMI - subtítols SAMI - Titulky SAMI - SAMI-undertekster - SAMI-Untertitel - υπότιτλοι SAMI - SAMI subtitles - SAMI-subtekstoj - subtítulos SAMI - SAMI azpitituluak - SAMI-tekstitykset - SAMI undirtekstir - sous-titres SAMI - fotheidil SAMI - subtítulos SAMI - כתוביות SAMI - SAMI titlovi - SAMI feliratok - Subjudul SAMI - Sottotitoli SAMI - SAMI 字幕 - SAMI субтитрлары - SAMI 자막 파일 - SAMI subtitrai - SAMI subtitri - SAMI undertekst - SAMI-ondertitels - SAMI teksting - Napisy SAMI - Legendas SAMI - Subtitrări SAMI - субтитры SAMI - Titulky SAMI - Datoteka podnapisov SAMI - Nëntituj SAMI - SAMI-undertexter - SAMI altyazıları - субтитри SAMI - Phụ đề SAMI - SAMI 字幕 - SAMI 字幕 - SAMI - Synchronized Accessible Media Interchange - - - - - - - - - - MicroDVD subtitles - ترجمات MicroDVD - Subtytry MicroDVD - Субтитри — MicroDVD - subtítols MicroDVD - Titulky MicroDVD - MicroDVD-undertekster - MicroDVD-Untertitel - υπότιτλοι MicroDVD - MicroDVD subtitles - MicroDVD-subtekstoj - subtítulos MicroDVD - MicroDVD azpitituluak - MicroDVD-tekstitykset - MicroDVD undirtekstir - sous-titres MicroDVD - fotheidil MicroDVD - subtítulos de MicroDVD - כתוביות של MicroDVD - MicroDVD titlovi - MicroDVD feliratok - Subjudul MicroDVD - Sottotitoli MicroDVD - MicroDVD 字幕 - MicroDVD-ის ქვეტიტრები - MicroDVD субтитрлары - MicroDVD 자막 파일 - MicroDVD subtitrai - MicroDVD subtitri - MicroDVD undertekst - MicroDVD-ondertitels - MicroDVD-teksting - Napisy MicroDVD - Legendas MicroDVD - Subtitrări MicroDVD - субтитры MicroDVD - Titulky MicroDVD - Datoteka podnapisov MicroDVD - Nëntituj MicroDVD - MicroDVD-undertexter - MicroDVD altyazısı - субтитри MicroDVD - Phụ đề MicroDVD - MicroDVD 字幕 - MicroDVD 字幕 - - - - - - - - - - MPSub subtitles - ترجمات MPSub - Subtytry MPSub - Субтитри — MPSub - subtítols MPSub - Titulky MPSub - MPSub-undertekster - MPSub-Untertitel - υπότιτλοι MPSub - MPSub subtitles - MPSub-subtekstoj - subtítulos MPSub - MPSub azpitituluak - MPSub-tekstitykset - MPSub undirtekstir - sous-titres MPSub - fotheidil MPSub - subtítulos MPSub - כתוביות MPSub - MPSub titlovi - MPSub feliratok - Subjudul MPSub - Sottotitoli MPSub - MPSub サブタイトル - MPSub ქვეტიტრები - MPSub субтитрлары - MPSub 자막 파일 - MPSub subtitrai - MPSub subtitri - MPSub undertekst - MPSub-ondertitels - MPSub-undertekstar - Napisy MPSub - Legendas MPSub - Subtitrări MPSub - субтитры MPSub - Titulky MPSub - Datoteka podnapisov MPSub - Nëntituj MPSub - MPSub-undertexter - субтитри MPSub - Phụ đề MPSub - MPSub 字幕 - MPSub 字幕 - MPSub - MPlayer Subtitle - - - - - - - - SSA subtitles - ترجمات SSA - Subtytry SSA - Субтитри — SSA - subtítols SSA - Titulky SSA - SSA-undertekster - SSA-Untertitel - υπότιτλοι SSA - SSA subtitles - SSA-subtekstoj - subtítulos SSA - SSA azpitituluak - SSA-tekstitykset - SSA undirtekstir - sous-titres SSA - fotheidil SSA - Subtitulos SSA - כתובית SSA - SSA titlovi - SSA feliratok - Subjudul SSA - Sottotitoli SSA - SSA 字幕 - SSA субтитрлары - SSA 자막 파일 - SSA subtitrai - SSA subtitri - SSA undertekst - SSA-ondertitels - SSA-teksting - Napisy SSA - Legendas SSA - Subtitrări SSA - субтитры SSA - Titulky SSA - Datoteka podnapisov SSA - Nëntituj SSA - SSA-undertexter - SSA altyazıları - субтитри SSA - Phụ đề SSA - SSA 字幕 - SSA 字幕 - SSA - SubStation Alpha - - - - - - - - - - SubViewer subtitles - ترجمات SubViewer - Subtytry SubViewer - Субтитри — SubViewer - subtítols SubViewer - Titulky SubViewer - SubViewer-undertekster - SubViewer-Untertitel - υπότιτλοι SubViewer - SubViewer subtitles - SubViewer-subtekstoj - subtítulos SubViewer - SubViewer azpitituluak - SubViewer-tekstitykset - SubViewer undirtekstir - sous-titres SubViewer - fotheidil SubViewer - subtítulos SubViewer - כתוביות של SubViewe - SubViewer titlovi - SubViewer feliratok - Subjudul SubViewer - Sottotitoli SubViewer - SubViewer 字幕 - SubViewer субтитрлары - SubViewer 자막 파일 - SubViewer subtitrai - SubViewer subtitri - SubViewer undertekst - SubViewer-ondertitels - SubViewer-teksting - Napisy SubViewer - Legendas SubViewer - Subtitrare SubViewer - субтитры SubViewer - Titulky SubViewer - Datoteka podnapisov SubViewer - Nëntituj SubViewer - SubViewer-undertexter - субтитри SubViewer - Phụ đề SubViewer - SubViewer 字幕 - SubViewer 字幕 - - - - - - - - iMelody ringtone - نغمة iMelody - Rington iMelody - Аудио — iMelody - to de trucada iMelody - Vyzváněcí melodie iMelody - iMelody-ringetone - iMelody-Klingelton - ringtone iMelody - iMelody ringtone - tono de llamada iMelody - iMelody doinua - iMelody-soittoääni - iMelody ringitóni - sonnerie iMelody - ton buailte iMelody - Melodía de iMelody - רינגטון של iMelody - iMelody ton zvonjenja - iMelody csengőhang - nada dering iMelody - Suoneria iMelody - iMelody リングトーン - iMelody әуені - iMelody 벨소리 - iMelody skambučio melodija - iMelody melodija - iMelody ringetone - iMelody-beltoon - iMelody-ringetone - Dzwonek iMelody - Toque de celular do iMelody - Sonerie iMelody - мелодия iMelody - Vyzváňacie melódie iMelody - Zvonjenje iMelody - Zile iMelody - iMelody-ringsignal - рінгтон iMelody - tiếng réo iMelody - iMelody 铃声 - iMelody 鈴聲 - - - - - - - - - - SMAF audio - SMAF سمعي - Aŭdyjo SMAF - Аудио — SMAF - àudio SMAF - Zvuk SMAF - SMAF-lyd - SMAF-Audio - ήχος SMAF - SMAF audio - SMAF-sondosiero - sonido SMAF - SMAF audioa - SMAF-ääni - SMAF ljóður - audio SMAF - fuaim SMAF - son SMAF - שמע SMAF - SMAF audio - SMAF hang - Audio SMAF - Audio SMAF - SMAF オーディオ - SMAF аудиосы - SMAF 오디오 - SMAF garso įrašas - SMAF audio - SMAF-lyd - SMAF-audio - SMAF-lyd - Plik dźwiękowy SMAF - Áudio SMAF - Audio SMAF - аудио SMAF - Zvuk SMAF - Zvočna datoteka SMAF - Audio SMAF - SMAF-ljud - звук SMAF - Âm thanh SMAF - SMAF 音频 - SMAF 音訊 - SMAF - Synthetic music Mobile Application Format - - - - - - - - - - MRML playlist - قائمة تشغيل MRML - Śpis piesień MRML - Списък за изпълнение — MRML - llista de reproducció MRML - Seznam skladeb MRML - MRML-afspilningsliste - MRML-Wiedergabeliste - λίστα αναπαραγωγής MRML - MRML playlist - MRML-ludlisto - lista de reproducción MRML - MRML erreprodukzio-zerrenda - MRML-soittolista - MRML avspælingarlisti - liste de lecture MRML - seinmliosta MRML - lista de reprodución MRML - רשימת השמעה MRML - MRML popis za reprodukciju - MRML-lejátszólista - Senarai putar MRML - Scaletta MRML - MPML 再生リスト - MRML რეპერტუარი - MRML ойнау тізімі - MRML 재생 목록 - MRML grojaraštis - MRML repertuārs - MRML-spilleliste - MRML-afspeellijst - MRML-speleliste - Lista odtwarzania MRML - Lista de reprodução do MRML - Listă redare MRML - список воспроизведения MRML - Zoznam skladieb MRML - Seznam predvajanja MRML - Listë titujsh MRML - MRML-spellista - список відтворення MRML - Danh mục nhạc MRML - MRML 播放列表 - MRML 播放清單 - MRML - Multimedia Retrieval Markup Language - - - - - - - - XMF audio - XMF سمعي - Aŭdyjo XMF - Аудио — XMF - àudio XMF - Zvuk XMF - XMF-lyd - XMF-Audio - ήχος XMF - XMF audio - XMF-sondosiero - sonido XMF - XMF audioa - XMF-ääni - XMF ljóður - audio XMF - fuaim XMF - son XMF - שמע XMF - XMF audio - XMF hang - Audio XMF - Audio XMF - XMF オーディオ - XMF аудиосы - XMF 오디오 - XMF garso įrašas - XMF audio - XMF-lyd - XMF-audio - XMF-lyd - Plik dźwiękowy XMF - Áudio XMF - Audio XMF - аудио XMF - Zvuk XMF - Zvočna datoteka XMF - Audio XMF - XMF-ljud - звук XMF - Âm thanh XMF - XMF 音频 - XMF 音訊 - XMF - eXtensible Music Format - - - - - - - - - - SV4 CPIO archive - أرشيف SV4 CPIO - SV4 CPIO arxivi - Archiŭ SV4 CPIO - Архив — SV4 CPIO - arxiu CPIO SV4 - Archiv SV4 CPIO - Archif CPIO SV4 - SV4 CPIO-arkiv - SV4-CPIO-Archiv - αρχείο SV4 CPIO - SV4 CPIO archive - SV4-CPIO-arkivo - archivador SV4 CPIO - SV4 CPIO artxiboa - SV4 CPIO -arkisto - SV4 CPIO skjalasavn - archive SV4 CPIO - cartlann SV4 CPIO - arquivo SV4 CPIO - ארכיון של SV4 SPIO - SV4 CPIO arhiva - SV4 CPIO-archívum - Arsip SV4 CPIO - Archivio SV4 CPIO - SV4 CPIO アーカイブ - SV4 CPIO архиві - SV4 CPIO 묶음 파일 - SV4 CPIO archyvas - SV4 CPIO arhīvs - Arkib CPIO SV4 - SV4 CPIO-arkiv - SV4 CPIO-archief - SV4 CPIO-arkiv - Archiwum SV4 CPIO - ficheiro SV4 CPIO - Pacote SV4 CPIO - Arhivă SV4 CPIO - архив SV4 CPIO - Archív SV4 CPIO - Datoteka arhiva SV4 CPIO - Arkiv SV4 CPIO - SV4 CPIO архива - SV4 CPIO-arkiv - SV4 CPIO arşivi - архів SV4 CPIO - Kho nén CPIO SV4 - SV4 CPIO 归档文件 - SV4 CPIO 封存檔 - - - - - SV4 CPIO archive (with CRC) - أرشيف SV4 CPIO (مع CRC) - Archiŭ SV4 CPIO (z CRC) - Архив — SV4 CPIO, проверка за грешки CRC - arxiu CPIO SV4 (amb CRC) - Archiv SV4 CPIO (s CRC) - SV4 CPIO-arkiv (med CRC) - SV4-CPIO-Archiv (mit CRC) - αρχείο SV4 CPIO (με CRC) - SV4 CPIO archive (with CRC) - SV4-CPIO-arkivo (kun CRC) - archivador SV4 CPIO (con CRC) - SV4 CPIO artxiboa (CRC-rekin) - SV4 CPIO -arkisto (CRC:llä) - SV4 CPIO skjalasavn (við CRC) - archive SV4 CPIO (avec CRC) - cartlann SV4 CPIO (le CRC) - Arquivador SV4 CPIO (con CRC) - ארכיון של SV4 SPIO (עם CRC) - SV4 CPIO arhiva (s CRC-om) - SV4 CPIO-archívum (CRC-vel) - Arsip SV4 CPIO (dengan CRC) - Archivio SV4 CPIO (con CRC) - SV4 CPIO アーカイブ (CRC 有り) - SV4 CPIO архиві (CRC бар) - SV4 CPIO 묶음 파일 (CRC 포함) - SV4 CPII archyvas (su CRC) - SV4 CPIO arhīvs (ar CRC) - Arkib CPIO SV4 (dengan CRC) - SV4 CPIO-arkiv (med CRC) - SV4 CPIO-archief (met CRC) - SV4 CPIO arkiv (med CRC) - Archiwum SV4 CPIO (z sumą kontrolną) - Pacote SV4 CPIO (com CRC) - Arhivă SV4 CPIO (cu CRC) - архив SV4 CPIP (с CRC) - Archív SV4 CPIO (s CRC) - Datoteka arhiva SV4 CPIO (z razpršilom CRC) - Arkiv SV4 CPIO (me CRC) - SV4 CPIO-arkiv (med CRC) - SV4 CPIO arşivi (CRC ile) - архів SV4 CPIO (з CRC) - Kho nén CPIO SV4 (với CRC) - SV4 CPIP 归档文件(带有 CRC) - SV4 CPIO 封存檔 (具有 CRC) - - - - - Tar archive - أرشيف Tar - Tar arxivi - Archiŭ tar - Архив — tar - arxiu tar - Archiv tar - Archif tar - Tar-arkiv - Tar-Archiv - συμπιεσμένο αρχείο Tar - Tar archive - archivador Tar - Tar artxiboa - Tar-arkisto - Tar skjalasavn - archive tar - cartlann Tar - arquivo Tar - ארכיון Tar - Tar arhiva - Tar archívum - Arsip Tar - Archivio tar - Tar アーカイブ - Tar архиві - TAR 묶음 파일 - Tar archyvas - Tar arhīvs - Arkib Tar - Tar-arkiv - Tar-archief - Tar-arkiv - Archiwum tar - Pacote tar - Arhivă Tar - архив TAR - Archív tar - Datoteka arhiva Tar - Arkiv tar - Тар архива - Tar-arkiv - архів tar - Kho nén tar - Tar 归档文件 - Tar 封存檔 - - - - - - - - - - - - Tar archive (compressed) - أرشيف Tar (مضغوط) - Archiŭ tar (skampresavany) - Архив — tar, компресиран - arxiu tar (comprimit) - Archiv tar (komprimovaný) - Tar-arkiv (komprimeret) - Tar-Archiv (komprimiert) - αρχείο Tar (συμπιεσμένο) - Tar archive (compressed) - archivador Tar (comprimido) - Tar artxiboa (konprimitua) - Tar-arkisto (pakattu) - Tar skjalasavn (stappað) - archive tar (compressée) - cartlann Tar (comhbhrúite) - arquivo Tar (comprimido) - ארכיון Tar (מכווץ) - Tar arhiva (komprimirana) - Tar archívum (tömörített) - Arsip Tar (terkompresi) - Archivio tar (compresso) - Tar アーカイブ (compress 圧縮) - Tar архиві (сығылған) - TAR 묶음 파일 (압축) - Tar archyvas (suglaudintas) - Tar arhīvs (saspiests) - Tar-arkiv (komprimert) - Tar-archief (ingepakt) - Tar-arkiv (pakka) - Archiwum tar (skompresowane) - Pacote tar (compactado) - Arhivă Tar (comprimată) - архив TAR (сжатый) - Archív tar (komprimovaný) - Datoteka arhiva Tar (stisnjen) - Arkiv tar (i kompresuar) - Tar-arkiv (komprimerat) - архів tar (стиснений) - Kho nén tar (đã nén) - Tar 归档文件(压缩) - Tar 封存檔 (UNIX 格式壓縮) - - - - - - - generic font file - ملف الخط العام - zvyčajny fajł šryftu - Шрифт - fitxer genèric de tipus de lletra - Obecný soubor písma - general skrifttypefil - Allgemeine Schriftdatei - γενικό αρχείο γραμματοσειράς - generic font file - genera tipara dosiero - tipografía genérico - letra-tipo orokorra - yleinen kirjasintiedosto - felagsstavasniðsfíla - fichier de polices générique - comhad cló ginearálta - ficheiro de tipo de fonte xenérica - קובץ גופן גנרי - općenita datoteka fonta - általános betűkészletfájl - berkas fonta generik - File tipo carattere generico - 一般フォントファイル - қаріп файлы - 일반 글꼴 파일 - bendras šrifto failas - vispārēja fonta datne - Fail font generik - vanlig skriftfil - algemeen lettertypebestand - vanleg skrifttypefil - Zwykły plik czcionki - ficheiro genérico de tipo de letra - Arquivo de fonte genérico - fișier de font generic - файл шрифта - Obyčajný súbor písma - izvorna datoteka pisave - File lloj gërme i përgjithshëm - општа датотека фонта - allmän typsnittsfil - загальний файл шрифту - tập tin phông giống loài - 通用字体文件 - 通用字型檔 - - - - - packed font file - ملف الخط المرزم - zapakavany fajł šryftu - Шрифт — компресиран - fitxer empaquetat de tipus de lletra - Komprimovaný soubor písma - pakket skrifttypefil - Gepackte Schriftdatei - αρχείο συμπιεσμένης γραμματοσειράς - packed font file - pakigita tipara dosiero - archivo de tipografía empaquetada - Letra-tipo fitxategi paketatua - pakattu kirjasintiedosto - pakkað stavasniðsfíla - fichier de polices empaquetées - comhad cló pacáilte - ficheiro de fonte empaquetada - קובץ גופן ארוז - pakirana datoteka fonta - packed font-fájl - berkas fonta terkemas - File tipo carattere condensato - パックされたフォントファイル - қаріп файлы (дестеленген) - 글꼴 묶음 파일 - supakuotas šrifto failas - sapakota fonta datne - Fail font dipek - pakket skriftfil - ingepakt lettertypebestand - pakka skrifttypefil - Plik ze spakowaną czcionką - ficheiro de fontes empacotadas - Arquivo de fonte empacotado - fișier font împachetat - сжатый файл шрифта - Komprimovaný súbor písma - pakirana datoteka pisave - File lloj gërmash i kondensuar - пакована датотека са фонтом - packad typsnittsfil - запакований файл шрифту - tập tin phông chữ đã đóng gói - 打包的字体文件 - 包裝字型檔 - - - - - TGIF document - مستند TGIF - Dakument TGIF - Документ — TGIF - document TGIF - Dokument TGIF - TGIF-dokument - TGIF-Dokument - Σχέδιο TGIF - TGIF document - TGIF-dokumento - documento TGIF - TGIF dokumentua - TGIF-asiakirja - TGIF skjal - document TGIF - cáipéis TGIF - documento TGIF - מסמך TGIF - TGIF dokument - TGIF-dokumentum - Dokumen TGIF - Documento TGIF - TGIF ドキュメント - TGIF құжаты - TGIF 문서 - TGIF dokumentas - TGIF dokuments - Dokumen TGIF - TGIF-dokument - TGIF-document - TGIF-dokument - Dokument TGIF - documento TGIF - Documento TGIF - Document TGIF - документ TGIF - Dokument TGIF - Dokument TGIF - Dokument TGIF - TGIF документ - TGIF-dokument - документ TGIF - Tài liệu TGIF - TGIF 文档 - TGIF 文件 - - - - - - - - theme - سمة - örtük - matyŭ - Тема - tema - Motiv - thema - tema - Thema - Θέμα - theme - etoso - tema - gaia - teema - tema - thème - téama - tema - ערכת נושא - tema - téma - tema - Tema - テーマ - თემა - тема - 테마 - tema - motīvs - Tema - tema - thema - drakt - Motyw - tema - Tema - temă - тема - Motív - tema - Temë - тема - tema - тема - sắc thái - 主题 - 佈景主題 - - - - - - ToutDoux document - مستند ToutDoux - ToutDoux sənədi - Dakument ToutDoux - Документ — ToutDoux - document ToutDoux - Dokument ToutDoux - Dogfen ToutDoux - ToutDoux-dokument - ToutDoux-Dokument - έγγραφο ToutDoux - ToutDoux document - ToutDoux-dokumento - documento de ToutDoux - ToutDoux dokumentua - ToutDoux-asiakirja - ToutDoux skjal - document ToutDoux - cáipéis ToutDoux - documento de ToutDoux - משמך של ToutDoux - ToutDoux dokument - ToutDoux-dokumentum - Dokumen ToutDoux - Documento ToutDoux - ToutDoux ドキュメント - ToutDoux құжаты - ToutDoux 문서 - ToutDoux dokumentas - ToutDoux dokuments - Dokumen ToutDoux - ToutDoux-dokument - ToutDoux-document - ToutDoux-dokument - Dokument ToutDoux - documento ToutDoux - Documento do ToutDoux - Document ToutDoux - документ ToutDoux - Dokument ToutDoux - Dokument ToutDoux - Dokument ToutDoux - ToutDoux документ - ToutDoux-dokument - ToutDoux belgesi - документ ToutDoux - Tài liệu ToutDoux - ToutDoux 文档 - ToutDoux 文件 - - - - backup file - ملف النسخ الاحتياطي - zapasny fajł - Резервно копие - fitxer de còpia de seguretat - Záložní soubor - sikkerhedskopi - Sicherungsdatei - αντίγραφο ασφαλείας - backup file - restaŭrkopio - archivo de respaldo - babes-kopiako fitxategia - varmuuskopio - trygdarritsfíla - fichier de sauvegarde - comhad cúltaca - ficheiro de copia de seguridade - קובץ גיבוי - biztonsági mentés - berkas cadangan - File di backup - バックアップファイル - резервті көшірмесі - 백업 파일 - atsarginis failas - dublējuma datne - Fail backup - sikkerhetskopi - reservekopiebestand - tryggleikskopi - Plik zapasowy - cópia de segurança - Arquivo de backup - fișier de backup - резервная копия - Záložný súbor - varnostna kopija datoteke - File backup - резервна копија - säkerhetskopia - yedek dosyası - резервна копія - tập tin sao lưu - 备份文件 - 備份檔 - - - - - - - - Troff document - مستند Troff - Troff sənədi - Dakument Troff - Документ — Troff - document Troff - Dokument troff - Dogfen troff - Troffdokument - Troff-Dokument - έγγραφο troff - Troff document - Troff-dokumento - documento troff - Troff dokumentua - Troff-asiakirja - Troff skjal - document Troff - cáipéis Troff - documento Troff - מסמך Troff - Troff dokument - Troff-dokumentum - Dokumen Troff - Documento Troff - Troff 入力ドキュメント - Troff құжаты - Troff 문서 - Troff dokumentas - Troff dokuments - Dokumen Troff - Troff-dokument - Troff-document - Troff-dokument - Dokument Troff - documento Troff - Documento troff - Document Troff - документ Troff - Dokument troff - Dokument Troff - Dokument Troff - Troff документ - Troff-dokument - Troff belgesi - документ Troff - Tài liệu Troff - Troff 文档 - Troff 文件 - - - - - - - - - - - - - - - Troff document (with manpage macros) - مستند Troff (مع اختصارات صفحة المساعدة) - Dakument Troff (z makrasam man-staronak) - Документ — Troff, с макроси за справочни страници - document Troff (amb macros de pàgines de manual) - Dokument troff (s makry pro manuálové stránky) - Troffdokument (med manualsidemakroer) - Troff-Dokument (mit man-Seitenmakros) - έγγραφο troff (με μακροεντολές manpage) - Troff document (with manpage macros) - Troff-dokumento (kun manpaĝaj makrooj) - documento troff (con macros de páginas de manual) - Troff dokumentua (manpage makroekin) - Troff-asiakirja (man-sivu-makroilla) - Troff skjal (við manpage fjølvi) - document Troff (avec macros manpage) - cáipéis Troff (le macraí manpage) - documento Troff (con macros de páxinas de manual) - מסמך של Troff (עם מאקרו בmanpage) - Troff dokument (s makro naredbama priručnika) - Troff-dokumentum (manpage-makrókkal) - Dokumen Troff (dengan makro halaman manual) - Documento Troff (con macro per manpage) - Troff 入力ドキュメント (man ページマクロ有り) - Troff құжаты (әдістемелік парақтар макростарымен) - Troff 문서 (man 페이지 매크로 포함) - Troff dokumentas (su žin. puslapių makrokomandomis) - Troff dokuments (ar manpage makrosiem) - Dokumen Troff (dengan macros halaman man) - Troff-dokument (med manualsidemakroer) - Troff-document (met man-macro's) - Troff-dokument med manualside-makroar - Dokument Troff (z makrami stron pomocy) - documento Troff (com macros manpage) - Documento troff (com macros de páginas de manual) - Document Troff (cu macro-uri manpage) - документ Troff (с макросами страниц руководства) - Dokument troff (s makrami pre manuálové stránky) - Dokument Troff (z makroji manpage) - Dokumet Troff (me makro për manpage) - Troff документ (са макроима за ман странице) - Troff-dokument (med manualsidemakron) - документ Troff (з макросами manpage) - Tài liệu Troff (có vĩ lệnh trang hướng dẫn) - Troff 文档(带 Man 手册宏) - Troff 文件 (含有手冊頁面巨集) - - - - - - manual page (compressed) - صفحة المساعدة (مضغوطة) - man səhifəsi (sıxışdırılmış) - staronka dapamohi (skampresavanaja) - Страница от справочника, компресирана - pàgina de manual (comprimida) - Manuálová stránka (komprimovaná) - tudalen llawlyfr (wedi ei gywasgu) - manualside (komprimeret) - Handbuchseite (komprimiert) - σελίδα οδηγιών (συμπιεσμένη) - manual page (compressed) - manpaĝo (kunpremita) - página de manual (comprimida) - eskuliburu orria (konprimitua) - manuaalisivu (pakattu) - handbókasíða (stappað) - page de manuel (compressée) - leathanach lámhleabhair (comhbhrúite) - páxina de manual (comprimida) - דף עזר (מכווץ) - stranica priručnika (komprimirana) - kézikönyvoldal (tömörített) - halaman manual (terkompresi) - Pagina di manuale (compressa) - (圧縮) man ページ - әдістемелік парағы (сығылған) - man 페이지 (압축) - žinyno puslapis (suglaudintas) - rokasgrāmatas lapa (saspiesta) - Halaman manual (termampat) - manualside (komprimert) - handleidingspagina (ingepakt) - manualside (pakka) - Strona podręcznika (skompresowana) - página de manual (comprimida) - Página de manual (compactada) - pagină de manual (comprimată) - страница руководства (сжатая) - Manuálová stránka (komprimovaná) - stran priročnika (stisnjena) - Faqe manuali (e kompresuar) - страна упутства (компресована) - manualsida (komprimerad) - сторінка посібника (стиснена) - trang hướng dẫn (đã nén) - 手册页 (压缩) - 手冊頁面 (壓縮版) - - - - Tar archive (LZO-compressed) - أرشيف Tar (مضغوط-LZO) - Archiŭ tar (LZO-skampresavany) - Архив — tar, компресиран с LZO - arxiu tar (comprimit amb LZO) - Archiv tar (komprimovaný pomocí LZO) - Tar-arkiv (LZO-komprimeret) - Tar-Archiv (LZO-komprimiert) - αρχείο Tar (συμπιεσμένο με LZO) - Tar archive (LZO-compressed) - archivador Tar (comprimido con LZO) - Tar artxiboa (LZO-rekin konprimitua) - Tar-arkisto (LZO-pakattu) - Tar skjalasavn (LZO-stappað) - archive tar (compression LZO) - cartlann Tar (comhbhrúite le LZO) - arquivo Tar (comprimido con LZO) - ארכיון Tar (מכווץ ע"י LZO) - Tar arhiva (komprimirana LZO-om) - Tar archívum (LZO-val tömörítve) - Arsip Tar (terkompresi LZO) - Archivio tar (compresso con LZO) - Tar アーカイブ (LZO 圧縮) - Tar архиві (LZO-мен сығылған) - TAR 묶음 파일 (LZO 압축) - Tar archyvas (suglaudintas su LZO) - Tar arhīvs (saspiests ar LZO) - Tar-arkiv (LZO-komprimert) - Tar-archief (ingepakt met LZO) - Tar-arkiv (pakka med LZO) - Archiwum tar (kompresja LZO) - Pacote tar (compactado com LZO) - Arhivă Tar (comprimată LZO) - архив TAR (сжатый LZO) - Archív tar (komprimovaný pomocou LZO) - Datoteka arhiva Tar (stisnjen z LZO) - Arkiv tar (i kompresuar me LZO) - Tar-arkiv (LZO-komprimerat) - архів tar (стиснений LZO) - Kho nén tar (đã nén LZO) - Tar 归档文件(LZO 压缩) - Tar 封存檔 (LZO 格式壓縮) - - - - - - - XZ archive - أرشيف XZ - Архив — XZ - arxiu XZ - Archiv XZ - XZ-arkiv - XZ-Archiv - συμπιεσμένο αρχείο XZ - XZ archive - XZ-arkivo - archivador XZ - XZ artxiboa - XZ-arkisto - XZ skjalasavn - archive XZ - cartlann XZ - ficheiro XZ - ארכיון XZ - XZ-archívum - Arsip XZ - Archivio XZ - XZ アーカイブ - XZ архиві - XZ 압축 파일 - XZ archyvas - XZ arhīvs - XZ archief - Archiwum XZ - Pacote XZ - Arhivă XZ - архив XZ - Archív XZ - Datoteka arhiva XZ - XZ-arkiv - XZ arşivi - архів XZ - XZ 归档文件 - XZ 封存檔 - - - - - - - - Tar archive (XZ-compressed) - أرشيف Tar (مضغوط-XZ) - Архив — tar, компресиран с XZ - arxiu tar (comprimit amb XZ) - Archiv tar (komprimovaný pomocí XZ) - Tar-arkiv (XZ-komprimeret) - Tar-Archiv (XZ-komprimiert) - αρχείο Tar (συμπιεσμένο με XZ) - Tar archive (XZ-compressed) - archivador Tar (comprimido con XZ) - Tar artxiboa (XZ-rekin konprimitua) - Tar-arkisto (XZ-pakattu) - Tar skjalasavn(XZ-stappað) - archive tar (compression XZ) - cartlann Tar (comhbhrúite le XZ) - arquivo Tar (comprimido con XZ) - ארכיון Tar (מכווץ ע"י XZ) - Tar arhiva (komprimirana XZ-om) - Tar archívum (XZ-vel tömörítve) - Arsip Tar (terkompresi XZ) - Archivio tar (compresso con XZ) - Tar アーカイブ (XZ 圧縮) - Tar архиві (XZ-мен сығылған) - TAR 묶음 파일 (XZ 압축) - Tar archyvas (suglaudintas su XZ) - Tar arhīvs (saspiests ar XZ) - Tar archief (XZ-compressed) - Archiwum tar (kompresja XZ) - Pacote tar (compactado com XZ) - Arhivă Tar (comprimată XZ) - архив TAR (сжатый XZ) - Archív tar (komprimovaný pomocou XZ) - Datoteka arhiva Tar (stisnjen z XZ) - Tar-arkiv (XZ-komprimerat) - архів tar (стиснений XZ) - Tar 归档文件(XZ 压缩) - Tar 封存檔 (XZ 格式壓縮) - - - - - - - PDF document (XZ-compressed) - Документ — PDF, компресиран с XZ - document PDF (comprimit amb XZ) - Dokument PDF (komprimovaný pomocí XZ) - PDF-dokument (XZ-komprimeret) - PDF-Dokument (XZ-komprimiert) - έγγραφο PDF (συμπιεσμένο με XZ) - PDF document (XZ-compressed) - Documento PDF (comprimido en XZ) - PDF-asiakirja (XZ-pakattu) - document PDF (compressé XZ) - documento PDF (comprimido en XZ) - מסמך PDF (בדחיסת XZ) - PDF dokument (komprimiran XZ-om) - PDF dokumentum (XZ-vel tömörített) - Dokumen PDF (terkompresi XZ) - Documento PDF (compresso con XZ) - PDF 文書(XZ 圧縮) - PDF დოკუმენტი (XZ-ით შეკუმშული) - PDF құжаты (XZ-мен сығылған) - PDF 문서 (XZ 압축) - PDF dokuments (saspiests ar XZ) - PDF document (XZ-compressed) - Dokument PDF (kompresja XZ) - Documento PDF (compactado com XZ) - документ PDF (сжатый XZ) - Dokument PDF (XZ-stisnjen) - PDF-dokument (XZ-komprimerad) - документ PDF (стиснений xz) - PDF 文档(XZ) - PDF 文件 (XZ 格式壓縮) - - - - - - Ustar archive - أرشيف Ustar - Archiŭ ustar - Архив — ustar - arxiu ustar - Archiv ustar - Ustararkiv - Ustar-Archiv - συμπιεσμένο αρχείο Ustar - Ustar archive - Ustar-arkivo - archivador Ustar - Ustar artxiboa - Ustar-arkisto - Ustar skjalasavn - archive Ustar - cartlann Ustar - arquivo Ustar - ארכיון Ustar - Ustar arhiva - Ustar archívum - Arsip Ustar - Archivio ustar - Ustar アーカイブ - Ustar архиві - Ustar 압축 파일 - Ustar archyvas - Ustar arhīvs - Ustar-arkiv - Ustar-archief - Ustar-arkiv - Archiwum ustar - Pacote Ustar - Arhivă Ustar - архив Ustar - Archív ustar - Datoteka arhiva Ustar - Arkiv Ustar - Ustar-arkiv - Ustar arşivi - архів ustar - Kho nén ustar - Ustar 归档文件 - Ustar 封存檔 - - - - - WAIS source code - شفرة مصدر WAIS - WAIS mənbə faylı - Kryničny kod WAIS - Изходен код — WAIS - codi font en WAIS - Zdrojový kód WAIS - Ffynhonnell Rhaglen WAIS - WAIS-kildekode - WAIS-Quelltext - πηγαίος κώδικας WAIS - WAIS source code - WAIS-fontkodo - código fuente WAIS - WAIS iturburu-kodea - WAIS-lähdekoodi - WAIS keldukota - code source WAIS - cód foinseach WAIS - código fonte WAIS - קוד מקור של WAIS - WAIS izvorni kod - WAIS-forráskód - Kode program WAIS - Codice sorgente WAIS - WAIS ソースコード - WAIS бастапқы коды - WAIS 소스 코드 - WAIS pradinis kodas - WAIS pirmkods - Kod sumber WAIS - WAIS-kildekode - WAIS-broncode - WAIS-kjeldekode - Plik źródłowy WAIS - código fonte WAIS - Código-fonte WAIS - Cod sursă WAIS - исходный код WAIS - Zdrojový kód WAIS - Datoteka izvorne kode WAIS - Kod burues WAIS - WAIS изворни ко̂д - WAIS-källkod - WAIS kaynak kodu - вихідний код мовою WAIS - Mã nguồn WAIS - WAIS 源代码 - WAIS 源碼 - - - - - WordPerfect/Drawperfect image - صورة WordPerfect/Drawperfect - Vyjava WordPerfect/Drawperfect - Изображение — WordPerfect/Drawperfect - imatge de WordPerfect/Drawperfect - Obrázek WordPerfect/Drawperfect - WordPerfect/Drawperfect-billede - WordPerfect/DrawPerfect-Bild - εικόνα WordPerfect/Drawperfect - WordPerfect/Drawperfect image - WordPerfect/Drawperfect-bildo - imagen de WordPerfect/Drawperfect - WordPerfect/Drawperfect irudia - WordPerfect/Drawperfect-kuva - WordPerfect/Drawperfect mynd - image WordPerfect/DrawPerfect - íomhá WordPerfect/Drawperfect - imaxe de WordPerfect/DrawPerfect - תמונה של WordPerfect/Drawperfect - WordPerfect/Drawperfect slika - WordPerfect/Drawperfect-kép - Gambar WordPerfect/Drawperfect - Immagine WordPerfect/Drawperfect - WordPerfect/Drawperfect 画像 - WordPerfect/Drawperfect суреті - 워드퍼펙트/드로퍼펙트 그림 - WordPerfect/Drawperfect paveikslėlis - WordPerfect/Drawperfect attēls - Imej WordPerfect/Drawperfect - WordPerfect-/Drawperfect-bilde - WordPerfect/Drawperfect-afbeelding - WordPerfect/DrawPerfect-bilete - Obraz WordPerfect/DrawPerfect - imagem do WordPerfect/Drawperfect - Imagem do WordPerfect/Drawperfect - Imagine WordPerfect/Drawperfect - изображение WordPerfect/Drawperfect - Obrázok WordPerfect/Drawperfect - Slikovna datoteka Drawperfect - Figurë WordPerfect/Drawperfect - WordPerfect/Drawperfect слика - WordPerfect/Drawperfect-bild - зображення WordPerfect/Drawperfect - Ảnh WordPerfect/Drawperfect - WordPerfect/Drawperfect 图像 - WordPerfect/Drawperfect 影像 - - - - - DER/PEM/Netscape-encoded X.509 certificate - شهادة DER/PEM/Netscape-encoded X.509 - Sertyfikat X.509, zakadavany ŭ DER/PEM/Netscape - Сертификат — DER/PEM/Netscape X.509 - certificat X.509 codificat com DER/PEM/Netscape - Certifikát X.509 kódovaný jako DER/PEM/Netscape - DER-/PEM-/Netscapekodet X.509-certifikat - DER/PEM/Netscape-kodiertes X.509-Zertifikat - ψηφιακό πιστοποιητικό X.509 κωδικοποιημένο κατά DER/PEM/Netscape - DER/PEM/Netscape-encoded X.509 certificate - DER/PEM/Netscape-kodigita X.509-atestilo - certificado X.509 codificado con DER/PEM/Netscape - X.509rekin kodetutako DER, PEM edo Netscape zertifikatua - DER/PEM/Netscape-koodattu X.509-varmenne - DER/PEM/Netscape-encoded X.509 váttan - certificat X.509 codé DER/PEM/Netscape - teastas X.509 ionchódaithe le DER/PEM/Netscape - certificado X.509 codificado con DER/PEM/Netscape - אישור מסוג X.509 של DER/PEM/Netscape-encoded - DER/PEM/Netscape-kodiran X.509 certifikat - DER/PEM/Netscape formátumú X.509-tanúsítvány - Sertifikat DER/PEM/Netscape-tersandi X.509 - Certificato DER/PEM/Netscape-encoded X.509 - DER/PEM/Netscape エンコード X.509 証明書 - DER/PEM/Netscape კოდირებული X.509 სერტიფიკატი - X.509 сертификаты (DER/PEM/Netscape кодталған) - DER/PEM/넷스케이프로 인코딩된 X.509 인증서 - DER/PEM/Netscape-encoded X.509 liudijimas - DER/PEM/Netscape-encoded X.509 sertifikāts - Sijil X.509 dienkod /DER/PEM/Netscape - DER/PEM/Netscape-kodet X.509-sertifikat - DER/PEM/Netscape-gecodeerd X.509-certificaat - DER/PEM/Netscape-koda X.509-sertifikat - Zakodowany w DER/PEM/Netscape certyfikat X.509 - certificado X.509 codificado com DER/PEM/Netscape - Certificado X.509 codificado com DER/PEM/Netscape - Certificat DER/PEM/Netscape-codat X.509 - сертификат X.509 (DER/PEM/Netscape-закодированный) - Certifikát X.509 kódovaný ako DER/PEM/Netscape - Datoteka potrdila DER/PEM/Netscape X.509 - Çertifikatë DER/PEM/Netscape-encoded X.509 - DER, PEM или Нетскејп кодирани сертификат X.509 - DER/PEM/Netscape-kodat X.509-certifikat - сертифікат X.509 у форматі DER/PEM/Netscape - Chứng nhận X.509 mã hoá bằng Netscape/PEM/DER - DER/PEM/Netscape-encoded X.509 证书 - DER/PEM/Netscape 編碼的 X.509 憑證 - - - - - - - - empty document - مستند فارغ - pusty dakument - Празен документ - document buit - Prázdný dokument - tomt dokument - Leeres Dokument - κενό έγγραφο - empty document - malplena dokumento - documento vacío - dokumentu hutsa - tyhjä asiakirja - tómt skjal - document vide - cáipéis fholamh - documeto baleiro - מסמך ריק - prazan dokument - üres dokumentum - dokumen kosong - Documento vuoto - 空のドキュメント - бос құжат - 빈 문서 - tuščias dokumentas - tukšs dokuments - Dokumen kosong - tomt dokument - leeg document - tomt dokument - Pusty dokument - documento vazio - Documento vazio - document gol - пустой документ - Prázdny dokument - prazen dokument - Dokument bosh - празан документ - tomt dokument - boş belge - порожній документ - tài liệu rỗng - 空文档 - 空白文件 - - - Zoo archive - أرشيف Zoo - Zoo arxivi - Archiŭ zoo - Архив — zoo - arxiu zoo - Archiv zoo - Archif zoo - Zooarkiv - Zoo-Archiv - συμπιεσμένο αρχείο Zoo - Zoo archive - Zoo-arkivo - archivador Zoo - Zoo artxiboa - Zoo-arkisto - Zoo skjalasavn - archive zoo - cartlann Zoo - ficheiro Zoo - ארכיון Zoo - Zoo archívum - Arsip Zoo - Archivio zoo - Zoo アーカイブ - Zoo архиві - ZOO 압축 파일 - Zoo archyvas - Zoo arhīvs - Zoo-arkiv - Zoo-archief - Zoo-arkiv - Archiwum zoo - Pacote Zoo - Arhivă Zoo - архив ZOO - Archív zoo - Datoteka arhiva ZOO - Arkiv zoo - Zoo-arkiv - Zoo arşivi - архів zoo - Kho nén zoo - Zoo 归档文件 - Zoo 封存檔 - - - - - - - - XHTML page - صفحة XHTML - Staronka XHTML - Страница — XHTML - pàgina XHTML - Stránka XHTML - XHTML-side - XHTML-Seite - σελίδα XHTML - XHTML page - XHTML-paĝo - página XHTML - XHTML orria - XHTML-sivu - XHTML síða - page XHTML - leathanach XHTML - Páxina XHTML - דף XHTML - XHTML stranica - XHTML-oldal - Halaman XHTML - Pagina XHTML - XHTML ページ - XHTML парағы - XHTML 페이지 - XHTML puslapis - XHTML lapa - Laman XHTML - XHTML-side - XHTML-pagina - XHTML-side - Strona XHTML - página XHTML - Página XHTML - Pagină XHTML - страница XHTML - Stránka XHTML - Datoteka spletne strani XHTML - Faqe XHTML - XHTML страна - XHTML-sida - сторінка XHTML - Trang XHTML - XHTML 页面 - XHTML 網頁 - XHTML - Extensible HyperText Markup Language - - - - - - - Zip archive - أرشيف Zip - Zip arxivi - Archiŭ zip - Архив — zip - arxiu zip - Archiv ZIP - Archif ZIP - Ziparkiv - Zip-Archiv - συμπιεσμένο αρχείο Zip - Zip archive - Zip-arkivo - archivador Zip - Zip artxiboa - Zip-arkisto - Zip skjalasavn - archive zip - cartlann Zip - ficheiro Zip - ארכיון Zip - Zip archívum - Arsip Zip - Archivio zip - Zip アーカイブ - Zip архиві - ZIP 압축 파일 - Zip archyvas - Zip arhīvs - Zip-arkiv - Zip-archief - Zip-arkiv - Archiwum ZIP - Pacote Zip - Arhivă zip - архив ZIP - Archív ZIP - Datoteka arhiva ZIP - Arkiv zip - Zip-arkiv - Zip arşivi - архів zip - Kho nén zip - Zip 归档文件 - Zip 封存檔 - - - - - - - - - - Windows Imaging Format Disk Image - Диск — Windows Imaging - imatge de disc «Windows Imaging Format» - Windows Imaging Format Disk Image - Windows Imaging Format-diskaftryk - Windows-Imaging-Format-Datenträgerabbild - εικόνα δίσκου Windows Image Format - Windows Imaging Format Disk Image - imagen de disco de Windows Imaging Format - image disque Windows Imaging Format - imaxe de disco de Windows Imaging Format - מבנה תמונת כונן של Windows Imaging - Windows Imaging Format lemezkép - Image Disk Windows Imaging Format - Immagine disco formato Windows Imaging - Windows イメージング形式 ディスクイメージ - Windows Imaging Format Disk бейнесі - Windows 이미지 포맷 디스크 이미지 - Windows Imaging Format diska attēls - Windows Imaging Format Disk Image - Obraz dysku Windows Imaging Format - Imagem de Disco de Formato Windows Imaging - Imagine de disc „Windows Imaging Format” - образ диска Windows - Odtis slike Windows Imaging - Windows Imaging Format Disk-avbild - формат образів дисків Windows Imaging - Windows Imaging 格式磁盘镜像 - Windows Imaging Format Disk 映像 - - - - - - - - Dolby Digital audio - Dolby Digital سمعي - Dolby Digital audio - Aŭdyjo Dolby Digital - Аудио — Dolby Digital - àudio Dolby Digital - Zvuk Dolby Digital - Sain Dolby Digital - Dolby Ditital-lyd - Dolby-Digital-Audio - ψηφιακός Ήχος Dolby - Dolby Digital audio - Sondosiero en Dolby Digital - sonido Dolby Digital - Dolby audio digitala - Dolby Digital -ääni - Dolby Digital ljóður - audio Dolby Digital - fuaim Dolby Digital - son Dolby Digital - שמע Dolby Digital - Dolby Digital audio - Dolby Digital hang - Audio Dolby Digital - Audio Dolby Digital - ドルビーデジタルオーディオ - Dolby Digital-ის აუდიო - Dolby Digital аудиосы - 돌비 디지털 오디오 - Dolby Digital garso įrašas - Dolby Digital audio - Audio Digital Dolby - Dolby digital lyd - Dolby Digital-audio - Dolby Digital lyd - Plik dźwiękowy Dolby Digital - áudio Dolby Digital - Áudio Dolby Digital - Audio Dolby Digital - аудио Dolby Digital - Zvuk Dolby Digital - Zvočna datoteka Dolby Digital - Audio Dolby Digital - Дигитални Dolby звучни запис - Dolby Digital-ljud - звук Dolby Digital - Âm thanh Dolby Digital - 杜比数字音频 - 杜比數位音訊 - - - - - - - DTS audio - - - - - - - - - - - DTSHD audio - - - - - - - - - AMR audio - AMR سمعي - Aŭdyjo AMR - Аудио — AMR - àudio AMR - Zvuk AMR - AMR-lyd - AMR-Audio - ήχος AMR - AMR audio - AMR-sondosiero - sonido AMR - AMR audioa - AMR-ääni - AMR ljóður - audio AMR - fuaim AMR - son AMR - שמע AMR - AMR audio - AMR hang - Audio AMR - Audio AMR - AMR オーディオ - AMR აუდიო - AMR аудиосы - AMR 오디오 - AMR garso įrašas - AMR audio - AMR-lyd - AMR-audio - AMR-lyd - Plik dźwiękowy AMR - Áudio AMR - Audio AMR - аудио AMR - Zvuk AMR - Zvočna datoteka AMR - Audio AMR - AMR-ljud - звук AMR - Âm thanh AMR - AMR 音频 - AMR 音訊 - AMR - Adaptive Multi-Rate - - - - - - - - AMR-WB audio - AMR-WB سمعي - Aŭdyjo AMR-WB - Аудио — AMR-WB - àudio AMR-WB - Zvuk AMR-WB - AMR-WB-lyd - AMR-WB-Audio - ήχος AMR-WB - AMR-WB audio - AMR-WB-sondosiero - sonido AMR-WB - AMR-WB audioa - AMR-WB-ääni - AMR-WB ljóður - audio AMR-WB - fuaim AMR-WB - son AMR-WB - שמע AMR-WN - AMR-WB audio - AMR-WB hang - Audio AMR-WB - Audio AMR-WB - AMR-WB オーディオ - AMR-WB აუდიო - AMR-WB аудиосы - AMR-WB 오디오 - AMR-WB garso įrašas - AMR-WB audio - AMR-WB-lyd - AMR-WB-audio - AMR-WB-lyd - Plik dźwiękowy AMR-WB - Áudio AMR-WB - Audio AMR-WB - аудио AMR-WB - Zvuk AMR-WB - Zvočna datoteka AMR-WB - Audio AMR-WB - AMR-WB-ljud - звук AMR-WB - Âm thanh AMR-WB - AMR-WB 音频 - AMR-WB 音訊 - AMR-WB - Adaptive Multi-Rate Wideband - - - - - - - - ULAW (Sun) audio - ULAW (صن) سمعي - ULAW (Sun) audio faylı - Aŭdyjo ULAW (Sun) - Аудио — ULAW, Sun - àudio ULAW (Sun) - Zvuk ULAW (Sun) - Sain ULAW (Sun) - ULAW-lyd (Sun) - ULAW-Audio (Sun) - ήχος ULAW (Sun) - ULAW (Sun) audio - ULAW-sondosiero (Sun) - sonido ULAW (Sun) - ULAW (sun) audioa - ULAW (Sun) -ääni - ULAW (Sun) ljóður - audio ULAW (Sun) - fuaim ULAW (Sun) - son ULAW (Sun) - שמע ULAW (של Sun) - ULAW (Sun) hang - Audio ULAW (Sun) - Audio ULAW (Sun) - ULAW (Sun) オーディオ - ULAW (Sun) аудиосы - ULAW (Sun) 오디오 - ULAW (Sun) garso įrašas - ULAW (Sun) audio - Audio ULAW (Sun) - ULAW-lyd (Sun) - (Sun) ULAW-audio - ULAW (Sun)-lyd - Plik dźwiękowy ULAW (Sun) - áudio ULAW (Sun) - Áudio ULAW (Sun) - Fișier audio ULAW (Sun) - аудио ULAW (Sun) - Zvuk ULAW (Sun) - Zvočna datoteka ULAW (Sun) - Audio ULAW (Sun) - ULAW (Sun) звучни запис - ULAW-ljud (Sun) - звук ULAW (Sun) - Âm thanh ULAW (Sun) - ULAW (Sun) 音频 - ULAW (Sun) 音訊 - - - - - - - - Commodore 64 audio - Commodore 64 سمعي - Aŭdyjo Commodore 64 - Аудио — Commodore 64 - àudio Commodore 64 - Zvuk Commodore 64 - Commodore 64-lyd - Commodore-64-Audio - ήχος Commodore 64 - Commodore 64 audio - Sondosiero de Commodore 64 - sonido de Commodore 64 - Commodore 64 Audioa - Commodore 64 -ääni - Commodore 64 ljóð - audio Commodore 64 - fuaim Commodore 64 - son de Commodore 64 - שמע של Commodore 64 - Commodore 64 audio - Commodore 64 hang - Audio Commodore 64 - Audio Commodore 64 - Commodore 64 オーディオ - Commodore 64-ის აუდიო - Commodore 64 аудиосы - Commodore 64 오디오 - Commodore 64 garso įrašas - Commodore 64 audio - Audio Commodore 64 - Commodore 64-lyd - Commodore 64-audio - Commodore 64-lyd - Plik dźwiękowy Commodore 64 - áudio Commodore 64 - Áudio Commodore 64 - Audio Commodore 64 - аудио Commodore 64 - Zvuk Commodore 64 - Zvočna datoteka Commodore 64 - Audio Commodore 64 - Комодор 64 звучни запис - Commodore 64-ljud - звук Commodore 64 - Âm thanh Commodore 64 - Commodore 64 音频 - Commodore 64 音訊 - - - - - - - - PCM audio - سمعي PCM - PCM audio faylı - Aŭdyjo PCM - Аудио — PCM - àudio PCM - Zvuk PCM - Sain PCM - PCM-lyd - PCM-Audio - ήχος PCM - PCM audio - PCM-sondosiero - sonido PCM - PCM audioa - PCM-ääni - PCM ljóður - audio PCM - fuaim PCM - son PCM - שמע PCM - PCM hang - Audio PCM - Audio PCM - PCM オーディオ - PCM аудиосы - PCM 오디오 - PCM garso įrašas - PCM audio - Audio PCM - PCM-lyd - PCM-audio - PCM-lyd - Plik dźwiękowy PCM - áudio PCM - Áudio PCM - Audio PCM - аудио PCM - Zvuk PCM - Zvočna datoteka PCM - Audio PCM - PCM звучни запис - PCM-ljud - звук PCM - Âm thanh PCM - PCM 音频 - PCM 音訊 - - - - - - - - - - - - - - - - - - AIFC audio - AIFC سمعي - AIFC audio faylı - Aŭdyjo AIFC - Аудио — AIFC - àudio AIFC - Zvuk AIFC - Sain AIFC - AIFC-lyd - AIFC-Audio - ήχος AIFC - AIFC audio - AIFC-sondosiero - sonido AIFC - AIFC audioa - AIFC-ääni - AIFC ljóður - audio AIFC - fuaim AIFC - son AIFC - שמע AIFC - AIFC audio - AIFC hang - Audio AIFC - Audio AIFC - AIFC オーディオ - AIFC აუდიო - AIFC аудиосы - AIFC 오디오 - AIFC garso įrašas - AIFC audio - Audio AIFC - AIFC-lyd - AIFC-audio - AIFC-lyd - Plik dźwiękowy AIFC - áudio AIFC - Áudio AIFC - Fișier audio AIFC - аудио AIFC - Zvuk AIFC - Zvočna datoteka AIFC - Audio AIFC - AIFC звучни запис - AIFC-ljud - звук AIFC - Âm thanh AIFC - AIFC 音频 - AIFC 音訊 - AIFC - Audio Interchange File format Compressed - - - - - - - - - - AIFF/Amiga/Mac audio - AIFF/Amiga/Mac سمعي - AIFF/Amiga/Mac audio faylı - Aŭdyjo AIFF/Amiga/Mac - Аудио — AIFF/Amiga/Mac - àudio AIFF/Amiga/Mac - Zvuk AIFF/Amiga/Mac - Sain AIFF/Amiga/Mac - AIFF-/Amiga-/Maclyd - AIFF/Amiga/Mac-Audio - ήχος AIFF/Amiga/Mac - AIFF/Amiga/Mac audio - AIFF/Amiga/Mac-sondosiero - sonido AIFF/Amiga/Mac - AIFF/Amiga/Mac audioa - AIFF/Amiga/Mac-ääni - AIFF/Amiga/Mac ljóður - audio AIFF/Amiga/Mac - fuaim AIFF/Amiga/Mac - son AIFF/Amiga/Mac - שמע AIFF/Amiga/Mac - AIFF/Amiga/Mac audio - AIFF/Amiga/Mac hang - Audio AIFF/Amiga/Mac - Audio AIFF/Amiga/Mac - AIFF/Amiga/Mac オーディオ - AIFF/Amiga/Mac აუდიო - AIFF/Amiga/Mac аудиосы - AIFF/Amiga/Mac 오디오 - AIFF/Amiga/Mac garso įrašas - AIFF/Amiga/Mac audio - Audio AIFF/Amiga/Mac - AIFF/Amiga/Mac-lyd - AIFF/Amiga/Mac-audio - AIFF/Amiga/Mac-lyd - Plik dźwiękowy AIFF/Amiga/Mac - áudio AIFF/Amiga/Mac - Áudio AIFF/Amiga/Mac - Audio AIFF/Amiga/Mac - аудио AIFF/Amiga/Mac - Zvuk AIFF/Amiga/Mac - Zvočna datoteka AIFF/Amiga/Mac - Audio AIFF/Amiga/Mac - AIFF/Амига/Мекинтош звучни запис - AIFF/Amiga/Mac-ljud - звук AIFF/Amiga/Mac - Âm thanh AIFF/Amiga/Mac - AIFF/Amiga/Mac 音频 - AIFF/Amiga/Mac 音訊 - AIFF - Audio Interchange File Format - - - - - - - - - - Monkey's audio - Monkey سمعي - Aŭdyjo Monkey's - Аудио — Monkey - àudio Monkey - Zvuk Monkey's - Monkeys lyd - Monkey's-Audio - ήχος Monkey's - Monkey's audio - sonido Monkey - Monkey audioa - Monkey's Audio -ääni - Monkey's ljóður - audio Monkey - fuaim Monkey's - son de Monkey - שמע של Monkey's - Monkey hang - Audio Monkey - Audio Monkey's - Monkey's オーディオ - Monkey аудиосы - Monkey's 오디오 - Monkey garso įrašas - Monkey's audio - Monkey's-lyd - Monkey's-audio - Monkey's Audio-lyd - Plik dźwiękowy Monkey's Audio - Áudio Monkey's - Audio Monkey's - аудио Monkey's - Zvuk Monkey's - Zvočna datoteka Monkey - Audio Monkey's - Monkey's audio - звук Monkey's - Âm thanh cua Monkey - Monkey's audio 音频 - Monkey's 音訊 - - - - - - - Impulse Tracker audio - Impulse Tracker سمعي - Impulse Tracker audio faylı - Aŭdyjo Impulse Tracker - Аудио — Impulse Tracker - àudio d'Impulse Tracker - Zvuk Impulse Tracker - Sain Impulse Tracker - Impulse Tracker-lyd - Impulse-Tracker-Audio - ήχος Impulse Tracker - Impulse Tracker audio - Sondosiero de Impulse Tracker - sonido Impulse Tracker - Impulse Tracker audioa - Impulse Tracker -ääni - Impulse Tracker ljóður - audio Impulse Tracker - fuaim Impulse Tracker - son de Impulse Tracker - שמע של Impulse Tracker - Impulse Tracker audio - Impulse Tracker hang - Audio Impulse Tracker - Audio Impulse Tracker - Impulse Tracker オーディオ - Impulse Tracker аудиосы - Impulse Tracker 오디오 - Impulse Tracker garso įrašas - Impulse Tracker audio - Audio Impulse Tracker - Impulse Tracker-lyd - Impulse Tracker-audio - Impulse Tracker lyd - Plik dźwiękowy Impulse Tracker - áudio Impulse Tracker - Áudio Impulse Tracker - Audio Impulse Tracker - аудио Impulse Tracker - Zvuk Impulse Tracker - Zvočna datoteka Impulse Tracker - Audio Impulse Tracker - Impulse Tracker звучни запис - Impulse Tracker-ljud - звук Impulse Tracker - Âm thanh Impulse Tracker - Impulse Tracker 音频 - Impulse Tracker 音訊 - - - - - - - FLAC audio - FLAC سمعي - Aŭdyjo FLAC - Аудио — FLAC - àudio FLAC - Zvuk FLAC - FLAC-lyd - FLAC-Audio - Ήχος FLAC - FLAC audio - FLAC-sondosiero - sonido FLAC - FLAC audioa - FLAC-ääni - FLAC ljóður - audio FLAC - fuaim FLAC - son FLAC - קובץ שמע מסוג FLAC - FLAC audio - FLAC hang - Audio FLAC - Audio FLAC - FLAC オーディオ - FLAC აუდიო - FLAC аудиосы - FLAC 오디오 - FLAC garso įrašas - FLAC audio - Audio FLAC - FLAC-lyd - FLAC-audio - FLAC-lyd - Plik dźwiękowy FLAC - áudio FLAC - Áudio FLAC - Audio FLAC - аудио FLAC - Zvuk FLAC - Zvočna datoteka Flac - Audio FLAC - FLAC звучни запис - FLAC-ljud - звук FLAC - Âm thanh FLAC - FLAC 音频 - FLAC 音訊 - - - - - - - - WavPack audio - WavPack سمعي - Aŭdyjo WavPack - Аудио — WavPack - àudio WavPack - Zvuk WavPack - WavPack-lyd - WavPack-Audio - ήχος WavePack - WavPack audio - WavPack-sondosiero - sonido WavPack - WavPack audioa - WavPack-ääni - WavPack ljóður - audio WavPack - fuaim WavPack - son WavPack - שמע WavPack - WavPack audio - WavPack hang - Audio WavPack - Audio WavPack - WavPack オーディオ - WavPack аудиосы - WavPack 오디오 - WavPack garso įrašas - WavPack audio - WavPack-lyd - WavPack-audio - WavPack-lyd - Plik dźwiękowy WavPack - Áudio WavPack - Audio WavPack - аудио WavPack - Zvuk WavPack - Zvočna datoteka WavPack - Audio WavPack - WavPack-ljud - звук WavPack - Âm thanh WavPack - WavPack 音频 - WavPack 音訊 - - - - - - - - WavPack audio correction file - ملف تصحيح WavPack السمعي - Fajł aŭdyjokarekcyi WavPack - Файл за корекции на аудио — WavPack - fitxer de correcció d'àudio WavPack - Opravný zvukový soubor WavPack - WavPack-lydkorrektionsfil - WavPack-Audiokorrekturdatei - αρχείο διόρθωσης ήχου WavePack - WavPack audio correction file - archivo de corrección de sonido WavPack - WavPack audio-zuzenketaren fitxategia - WavPack-äänikorjaustiedosto - WavPack ljóðrættingarfíla - fichier de correction audio WavPack - comhad cheartú fhuaim WavPack - ficheiro de corrección de son WavPack - קובץ תיקון שמע של WavPack - WavPack hangjavítási fájl - Berkas koreksi audio WavPack - File correzione audio WavPack - WavPack オーディオコレクションファイル - WavPack аудио түзету файлы - WavPack 오디오 교정 파일 - WavPack garso korekcijos failas - WavPack audio korekciju datne - WavPack lydkorrigeringsfil - WavPack-audio-correctiebestand - WawPack lydopprettingsfil - Plik korekcji dźwięku WavPack - Arquivo de correção de áudio WavPack - Fișier audio de corecție WavPack - файл коррекции аудио WavPack - Opravný zvukový súbor WavPack - popravljalna zvočna datoteka WavPack - File korrigjgimi audio WavPack - WavPack-ljudkorrigeringsfil - файл корекції звуку WavPack - Tập tin sửa chữa âm thanh WavPack - WavPack 音频校正文档 - WavPack 音訊校正檔 - - - - - - - MIDI audio - MIDI سمعي - MIDI audio faylı - Aŭdyjo MIDI - Аудио — MIDI - àudio MIDI - Zvuk MIDI - Sain MIDI - MIDI-lyd - MIDI-Audio - ήχος MIDI - MIDI audio - MIDI-sondosiero - sonido MIDI - MIDI audioa - MIDI-ääni - MIDI ljóður - audio MIDI - fuaim MIDI - son MIDI - שמע MIDI - MIDI audio - MIDI hang - Audio MIDI - Audio MIDI - MIDI オーディオ - MIDI аудиосы - 미디 오디오 - MIDI garso įrašas - MIDI audio - Audio MIDI - MIDI-lyd - MIDI-audio - MIDI-lyd - Plik dźwiękowy MIDI - áudio MIDI - Áudio MIDI - Audio MIDI - аудио MIDI - Zvuk MIDI - Zvočna datoteka MIDI - Audio MIDI - MIDI звучни запис - MIDI-ljud - звук MIDI - Âm thanh MIDI - MIDI 音频 - MIDI 音訊 - - - - - - - - - - compressed Tracker audio - Tracker سمعي مضغوط - aŭdyjo skampresavanaha Trackera - Аудио — Tracker, компресирано - àudio Tracker comprimit - Komprimovaný zvuk Tracker - Trackerkomprimeret lyd - Komprimiertes Tracker-Audio - συμπιεσμένος ήχος Tracker - compressed Tracker audio - tracker de sonido comprimido - konprimitutako Tracker audioa - pakattu Tracker-ääni - stappað Tracker ljóður - audio Tracker compressé - fuaim chomhbhrúite Tracker - son comprimido de Tracker - שמע גשש מכווץ - komprimirani Tracker audio - tömörített Tracker hang - audio Tracker terkompresi - Audio compresso Tracker - 圧縮 Tracker オーディオ - сығылған Tracker аудиосы - 압축된 Tracker 오디오 - suglaudintas Tracker garso įrašas - saspiests Tracker audio - ingepakte Tracker-audio - komprimert Tracker-lyd - Skompresowany plik dźwiękowy Tracker - Áudio Tracker compactado - Tracker audio comprimat - аудио Tracker (сжатое) - Komprimovaný zvuk Tracker - Skrčena zvočna datoteka Tracker - Audio Tracker e kompresuar - komprimerat Tracker-ljud - стиснутий звук Tracker - âm thanh Tracker đã nén - 压缩的 Tracker 音频 - 壓縮版 Tracker 音訊 - - - - - - - AAC audio - AAC - Advanced Audio Coding - - - - - - - - MPEG-4 audio - MPEG-4 سمعي - Aŭdyjo MPEG-4 - Аудио — MPEG-4 - àudio MPEG-4 - Zvuk MPEG-4 - MPEG4-lyd - MPEG-4-Audio - ήχος MPEG-4 - MPEG-4 audio - MPEG4-sondosiero - sonido MPEG-4 - MPEG-4 audioa - MPEG-4-ääni - MPEG-4 ljóður - audio MPEG-4 - fuaim MPEG-4 - son MPEG-4 - שמע MPEG-4 - MPEG-4 audio - MPEG-4 hang - Audio MPEG-4 - Audio MPEG-4 - MPEG-4 オーディオ - MPEG-4 აუდიო - MPEG-4 аудиосы - MPEG-4 오디오 - MPEG-4 garso įrašas - MPEG-4 audio - MPEG-4-lyd - MPEG4-audio - MPEG-4-lyd - Plik dźwiękowy MPEG-4 - Áudio MPEG-4 - Audio MPEG-4 - аудио MPEG-4 - Zvuk MPEG-4 - Zvočna datoteka MPEG-4 - Audio MPEG-4 - MPEG-4-ljud - звук MPEG-4 - Âm thanh MPEG-4 - MPEG-4 音频 - MPEG-4 音訊 - - - - - - - - - MPEG-4 video - MPEG-4 مرئي - Videa MPEG-4 - Видео — MPEG-4 - vídeo MPEG-4 - Video MPEG-4 - MPEG4-video - MPEG-4-Video - βίντεο MPEG-4 - MPEG-4 video - MPEG-4-video - vídeo MPEG-4 - MPEG-4 bideoa - MPEG-4-video - MPEG-4 video - vidéo MPEG-4 - físeán MPEG-4 - vídeo MPEG-4 - וידאו MPEG-4 - MPEG-4 video - MPEG-4 videó - Video MPEG-4 - Video MPEG-4 - MPEG-4 動画 - MPEG-4 ვიდეო - MPEG-4 видеосы - MPEG-4 비디오 - MPEG-4 vaizdo įrašas - MPEG-4 video - MPEG-4-film - MPEG4-video - MPEG-4-video - Plik wideo MPEG-4 - Vídeo MPEG-4 - Video MPEG-4 - видео MPEG-4 - Video MPEG-4 - Video datoteka MPEG-4 - Video MPEG-4 - MPEG-4-video - відеокліп MPEG-4 - Ảnh động MPEG-4 - MPEG-4 视频 - MPEG-4 視訊 - - - - - - - - - - - - - - - MPEG-4 audio book - كتاب MPEG-4 السمعي - Aŭdyjokniha MPEG-4 - Аудио книга — MPEG-4 - llibre d'àudio MPEG-4 - Zvuková kniha MPEG-4 - MPEG4-lydbog - MPEG-4-Hörbuch - ηχητικό βιβλίο MPEG-4 - MPEG-4 audio book - MPEG-4-sonlibro - audiolibro en MPEG-4 - MPEG-4 audio-liburua - MPEG-4-äänikirja - MPEG-4 ljóðbók - livre audio MPEG-4 - leabhar fhuaim MPEG-4 - sonlibro de MPEG-4 - ספר דיגיטלי MPEG-4 - MPEG-4 audio knjiga - MPEG-4 hangoskönyv - Buku audio MPEG-4 - Audiolibro MPEG-4 - MPEG-4 オーディオブック - MPEG-4 აუდიოწიგნი - MPEG-4 аудио кітабы - MPEG-4 오디오북 - MPEG-4 garso knyga - MPEG-4 audio grāmata - MPEG-4-lydbok - MPEG4-audioboek - MPEG-4-lydbok - Książka dźwiękowa MPEG-4 - Áudio livro MPEG-4 - Carte audio MPEG-4 - аудиокнига MPEG-4 - Zvuková kniha MPEG-4 - Zvočna knjiga MPEG-4 - Audiolibër MPEG-4 - MPEG-4-ljudbok - аудіокнига MPEG-4 - Sách âm thanh MPEG-4 - MPEG-4 有声书 - MPEG-4 音訊書 - - - - - - - - - 3GPP multimedia file - ملف وسائط متعددة 3GPP - Multymedyjny fajł 3GPP - Мултимедия — 3GPP - fitxer multimèdia 3GPP - Soubor multimédií 3GPP - 3GPP multimedie-fil - 3GPP-Multimediadatei - αρχείο πολυμέσων 3GPP - 3GPP multimedia file - archivo multimedia 3GPP - 3GPP multimediako fitxategia - 3GPP-multimediatiedosto - 3GGP margmiðlafíla - fichier multimédia 3GPP - comhad ilmheán 3GPP - ficheiro multimedia 3GPP - קובץ מולטימדיה מסוג 3GPP - 3GPP multimedijska datoteka - 3GPP multimédiafájl - Berkas multimedia 3GPP - File multimediale 3GPP - 3GPP マルチメディアファイル - 3GPP მულტიმედიური ფაილი - 3GPP мультимедиялық файлы - 3GPP 멀티미디어 파일 - 3GPP multimedijos failas - 3GPP multimediju datne - 3GPP-multimediafil - 3GPP-multimediabestand - 3GPP-multimediafil - Plik multimedialny 3GPP - Arquivo multimídia 3GPP - Fișier multimedia 3GPP - мультимедийный файл 3GPP - Súbor multimédií 3GPP - Večpredstavnostna datoteka 3GPP - File multimedial 3GPP - 3GPP-multimediafil - 3GPP multimedya dosyası - файл мультимедійних даних 3GPP - Tập tin đa phương tiện 3GPP - 3GPP 多媒体文件 - 3GPP 多媒體檔案 - 3GPP - 3rd Generation Partnership Project - - - - - - - - - - - - - - - - - - - - - - - - - 3GPP2 multimedia file - Мултимедия — 3GPP2 - fitxer multimèdia 3GPP2 - Soubor multimédií 3GPP2 - 3GPP2 multimedie-fil - 3GPP2-Multimediadatei - αρχείο πολυμέσων 3GPP2 - 3GPP2 multimedia file - archivo multimedia 3GPP2 - 3GPP2-multimediatiedosto - 3GGP2 margmiðlafíla - fichier multimédia 3GPP2 - comhad ilmheán 3GPP2 - ficheiro multimedia 3GPP2 - קובץ מולטימדיה 3GPP2 - 3GPP2 multimedijska datoteka - 3GPP2 multimédiafájl - Berkas multimedia 3GPP2 - File multimediale 3GPP2 - 3GPP2 マルチメディアファイル - 3GPP2 მულტიმედიური ფაილი - 3GPP2 мультимедиялық файлы - 3GPP2 멀티미디어 파일 - 3GPP2 multimediju datne - 3GPP2 multimedia bestand - Plik multimedialny 3GPP2 - Arquivo multimídia 3GPP2 - Fișier multimedia 3GPP2 - мультимедийный файл 3GPP2 - Súbor multimédií 3GPP2 - Večpredstavnostna datoteka 3GPP2 - 3GPP2-multimediafil - 3GPP2 multimedya dosyası - файл мультимедійних даних 3GPP2 - 3GPP2 多媒体文件 - 3GPP2 多媒體檔案 - 3GPP2 - 3rd Generation Partnership Project 2 - - - - - - - - - - - Amiga SoundTracker audio - مقتفي صوت Amiga السمعي - Aŭdyjo Amiga SoundTracker - Аудио — Amiga SoundTracker - àudio Amiga SoundTracker - Zvuk Amiga SoundTracker - Amiga SoundTracker-lyd - Amiga-SoundTracker-Audio - ήχος Amiga SoundTracker - Amiga SoundTracker audio - Sondosiero de Amiga SoundTracker - sonido de Amiga SoundTracker - Amiga soundtracker audioa - Amiga SoundTracker -ääni - Amiga SoundTracker ljóður - audio SoundTracker Amiga - fuaim Amiga SoundTracker - son de Amiga SoundTracker - קובץ שמע של Amiga SoundTracker - Amiga SoundTracker audio - Amiga SoundTracker hang - Audio Amida SoundTracker - Audio Amiga SoundTracker - Amiga SoundTracker オーディオ - Amiga SoundTracker-ის აუდიო - Amiga SoundTracker аудиосы - Amiga SoundTracker 오디오 - Amiga SoundTracker garso įrašas - Amiga SoundTracker audio - Audio Amiga Soundtracker - Amiga SoundTracker-lyd - Amiga SoundTracker-audio - Amiga soundtracker-lyd - Plik dźwiękowy Amiga SoundTracker - áudio SoundTracker do Amiga - Áudio Amiga SoundTracker - Audio Amiga SoundTracker - аудио Amiga SoundTracker - Zvuk Amiga SoundTracker - Zvočna datoteka Amiga SoundTracker - Audio Amiga SoundTracker - Амига soundtracker звук - Amiga SoundTracker-ljud - звук Amiga SoundTracker - Âm thanh Amiga SoundTracker - Amiga SoundTracker 音频 - Amiga SoundTracker 音訊 - - - - - - - - - - MP2 audio - MP2 سمعي - Aŭdyjo MP2 - Аудио — MP2 - àudio MP2 - Zvuk MP2 - MP2-lyd - MP2-Audio - ήχος MP2 - MP2 audio - MP2-sondosiero - sonido MP2 - MP2 audioa - MP2-ääni - MP2 ljóður - audio MP2 - fuaim MP2 - son MP2 - שמע MP2 - MP2 audio - MP2 hang - Audio MP2 - Audio MP2 - MP2 オーディオ - MP2 аудиосы - MP2 오디오 - MP2 garso įrašas - MP2 audio - MP2-lyd - MP2-audio - MP2-lyd - Plik dźwiękowy MP2 - Áudio MP2 - Audio MP2 - аудио MP2 - Zvuk MP2 - Zvočna datoteka MP2 - Audio MP2 - MP2-ljud - звук MP2 - Âm thanh MP2 - MP2 音频 - MP2 音訊 - - - - - MP3 audio - MP3 سمعي - MP3 audio faylı - Aŭdyjo MP3 - Аудио — MP3 - àudio MP3 - Zvuk MP3 - Sain MP3 - MP3-lyd - MP3-Audio - ήχος MP3 - MP3 audio - MP3-sondosiero - sonido MP3 - MP3 audioa - MP3-ääni - MP3 ljóður - audio MP3 - fuaim MP3 - son MP3 - שמע MP3 - MP3 audio - MP3 hang - Audio MP3 - Audio MP3 - MP3 オーディオ - MP3 აუდიო - MP3 аудиосы - MP3 오디오 - MP3 garso įrašas - MP3 audio - Audio MP3 - MP3-lyd - MP3-audio - MP3-lyd - Plik dźwiękowy MP3 - áudio MP3 - Áudio MP3 - Audio MP3 - аудио MP3 - Zvuk MP3 - Zvočna datoteka MP3 - Audio MP3 - MP3 звучни запис - MP3-ljud - звук MP3 - Âm thanh MP3 - MP3 音频 - MP3 音訊 - - - - - - - - - - - - MP3 audio (streamed) - MP3 سمعي (تدفق) - Aŭdyjo MP3 (płyń) - Аудио — MP3, поточно - àudio MP3 (flux) - Zvuk MP3 (proud) - MP3-lyd (strøm) - MP3-Audio (Stream) - ήχος MP3 (εκπεμπόμενος) - MP3 audio (streamed) - MP3-sondosiero (fluigate) - sonido MP3 (en flujo) - MP3 audioa (korrontea) - MP3-ääni (virtaus) - MP3 ljóður (streymað) - audio MP3 (flux) - fuaim MP3 (sruthaithe) - son MP3 (en stream) - שמע MP3 (מוזרם) - MP3 hang (sugárzott) - Audio MP3 (stream) - Audio MP3 (in streaming) - MP3 オーディオ (ストリーム) - MP3 აუდიო (ნაკადი) - MP3 аудиосы (ағымдық) - MP3 오디오 (스트림) - MP3 garso įrašas (transliuojamas) - MP3 audio (straumēts) - Audio MP3 (aliran) - MP3-lyd (streaming) - MP3-audio (gestreamd) - Strauma MP3-lyd - Dźwięk MP3 (strumień) - áudio MP3 (em fluxo) - Áudio MP3 (em fluxo) - Audio MP3 (flux) - аудио MP3 (потоковое) - Zvuk MP3 (streamovaný) - Zvočna datoteka MP3 (pretočna) - Audio MP3 (streamed) - MP3 звучни запис (непрекидан) - MP3-ljud (flöde) - звук MP3 (потоковий) - Âm thanh MP3 (chạy luồng) - MP3 流音频 - MP3 音訊 (串流) - - - - - - - - - - - - - - - HTTP Live Streaming playlist - قائمة بث HTTP حية - Списък за изпълнение — поток по HTTP - llista de reproducció en temps real HTTP - Seznam skladeb HTTP Live Streaming - Afspilningsliste til HTTP-livestrøm - HTTP Live-Streaming-Wiedergabeliste - HTTP Live Streaming playlist - lista de reproducción de flujo en directo HTTP - HTTP zuzeneko korrontearen erreprodukzio-zerrenda - HTTP beinleiðis streymaður avspælingarlisti - liste de lecture de flux HTTP Live - seinmliosta sruthaithe bheo HTTP - lista de reprodución de fluxo HTTP - רשימת השמעה הזרימה של HTTP - HTTP élő lejátszólista - Daftar putar HTTP Live Streaming - Scaletta Live Steaming HTTP - HTTP ライブストリーミング再生リスト - HTTP тірі ағым ойнау тізімі - HTTP 라이브 스트리밍 재생 목록 - HTTP tiesioginio transliavimo grojaraštis - HTTP dzīvās straumēšanas repertuārs - HTTP Live Streaming afspeellijst - Lista odtwarzania strumieniowego na żywo HTTP - Lista de Reprodução Streaming ao Vivo de HTTP - Listă de redare difuzată ca flux HTTP - список воспроизведения HTTP-потока - Seznam predvajanja živega pretoka HTTP - HTTP Live Streaming-spellista - список відтворення HTTP Live Streaming - HTTP 直播流播放列表 - HTTP 即時串流播放清單 - - - - - - - - - - - Microsoft ASX playlist - قائمة تشغيل مايكروسوفت ASX - Śpis Microsoft ASX - Списък за изпълнение — Microsoft ASX - llista de reproducció ASX de Microsoft - Seznam skladeb Microsoft ASX - Microsoft ASX-afspilningsliste - Microsoft-ASX-Wiedergabeliste - λίστα αναπαραγωγής Microsoft ASX - Microsoft ASX playlist - lista de reproducción ASX de Microsoft - Microsoft ASX erreprodukzio-zerrenda - Microsoft ASX -soittolista - Microsoft ASX avspælingarlisti - liste de lecture Microsoft ASX - seinmliosta Microsoft ASX - lista de reprodución Microsoft ASX - רשימת השמעה ASX (מיקרוסופט) - Microsoft ASX popis za reprodukciju - Microsoft ASX lejátszólista - Senarai putar Microsoft ASX - Scaletta Microsoft ASX - Microsoft ASX 再生リスト - Microsoft-ის ASX რეპერტუარი - Microsoft ASX ойнау тізімі - 마이크로소프트 ASX 재생 목록 - Microsoft ASX grojaraštis - Microsoft ASX repertuārs - Microsoft ASX-spilleliste - Microsoft ASX-afspeellijst - Microsoft ASX-speleliste - Lista odtwarzania Microsoft ASX - Lista de reprodução do Microsoft ASX - Listă redare Microsoft ASX - список воспроизведения Microsoft ASX - Zoznam skladieb Microsoft ASX - Seznam predvajanja Microsoft ASX - Listë titujsh Microsoft ASF - Microsoft ASX-spellista - список відтворення ASX Microsoft - Danh mục nhạc Microsoft ASX - Microsoft ASX 播放列表 - 微軟 ASX 播放清單 - - - - - - - - - - - - - - - - - PSF audio - PSF سمعي - Aŭdyjo PSF - Аудио — PSF - àudio PSF - Zvuk PSF - PSF-lyd - PSF-Audio - ήχος PSF - PSF audio - PSF-sondosiero - sonido PSF - PSF audioa - PSF-ääni - PSF ljóður - audio PSF - fuaim PSF - son PSF - שמע PSF - PSF hang - Audio PSF - Audio PSF - PSF オーディオ - PSF аудиосы - PSF 오디오 - PSF garso įrašas - PSF audio - PSF-lyd - PSF-audio - PSF-lyd - Plik dźwiękowy PSF - Áudio PSF - Audio PSF - аудио PSF - Zvuk PSF - Zvočna datoteka PSF - Audio PSF - PSF-ljud - звук PSF - Âm thanh PSF - PSF 音频 - PSF 音訊 - PSF - Portable Sound Format - - - - - - - MiniPSF audio - MiniPSF سمعي - Aŭdyjo MiniPSF - Аудио — MiniPSF - àudio MiniPSF - Zvuk MiniPSF - MiniPSF-lyd - MiniPSF-Audio - ήχος MiniPSF - MiniPSF audio - MiniPSF-sondosiero - sonido MiniPSF - MiniPSF audioa - MiniPSF-ääni - MiniPSF ljóður - audio MiniPSF - fuaim MiniPSF - son MiniPSF - שמע של MiniPSP - MiniPSF audio - MiniPSF hang - Audio MiniPSF - Audio MiniPSF - MiniPSF オーディオ - MiniPSF-ის აუდიო - MiniPSF аудиосы - MiniPSF 오디오 - MiniPSF garso įrašas - MiniPSF audio - MiniPSF-lyd - MiniPSF-audio - MiniPSF-lyd - Plik dźwiękowy MiniPSF - Áudio MiniPSF - Audio MiniPSF - аудио MiniPSF - Zvuk MiniPSF - Zvočna datoteka MiniPSF - Audio MiniPSF - MiniPSF-ljud - звук MiniPSF - Âm thanh MiniPSF - MiniPSF 音频 - MiniPSF 音訊 - MiniPSF - Miniature Portable Sound Format - - - - - PSFlib audio library - مكتبة PSFlib السمعية - Aŭdyjobiblijateka PSFlib - Аудио библиотека — PSFlib - biblioteca d'àudio PSFlib - Zvuková knihovna PSFlib - PSFlib-lydbibliotek - PSFlib-Audiobibliothek - βιβλιοθήκη ήχου PSFlib - PSFlib audio library - biblioteca de sonido PSFlib - PSFlib audioaren liburutegia - PSFlib-äänikirjasto - PSFlib ljóðsavn - bibliothèque audio PSFlib - leabharlann fhuaim PSFlib - Biblioteca de son PSFlib - ספריית שמע PSFlib - PSFlib hanggyűjtemény - Pustaka audio PSFlib - Libreria audio PSFlib - PSFlib オーディオライブラリ - PSFlib аудио жинағы - PSFlib 오디오 라이브러리 - PSFlib garso biblioteka - PSFlib fonotēka - PSFlib-lydbibliotek - PSFlib-audiobibliotheek - PSFlib lydbibliotek - Biblioteka dźwiękowa PSFlib - Biblioteca de áudio PSFlib - Bibliotecă audio PSFlib - фонотека PSFlib - Zvuková knižnica PSFlib - Zvočna knjižnica PSFlib - Librari audio PSFlib - PSFlib-ljudbibliotek - аудіобібліотека PSFlib - Thư viện âm thanh PSFlib - PSFlib 音频库文件 - PSFlib 音訊庫 - PSFlib - Portable Sound Format Library - - - - - Windows Media audio - Windows Media سمعي - Aŭdyjo Windows Media - Аудио — Windows Media - àudio Windows Media - Zvuk Windows Media - Windows Media-lyd - Windows-Media-Audio - ήχος Windows Media - Windows Media audio - sonido de Windows Media - Windows Media audioa - Windows Media -ääni - Windows Media ljóður - audio Windows Media - fuaim Windows Media - son de Windows Media - שמע של Windows Media - Windows Media audio - Windows Media hang - Audio Windows Media - Audio Windows Media - Windows Media オーディオ - Windows Media аудиосы - Windows 미디어 오디오 - Windows Media garso įrašas - Windows Media audio - Windows Media lyd - Windows Media-audio - Windows Media-lyd - Plik dźwiękowy Windows Media - Áudio do Windows Media - Audio Windows Media - аудио Windows Media - Zvuk Windows Media - Zvočna datoteka Windows Media - Audio Windows Media - Windows Media-ljud - звук Windows Media - Âm thanh Windows Media - Windows Media 音频 - Windows Media 音訊 - - - - - - Musepack audio - Musepack سمعي - Aŭdyjo Musepack - Аудио — Musepack - àudio Musepack - Zvuk Musepack - Musepacklyd - Musepack-Audio - ήχος Musepack - Musepack audio - sonido Musepack - Musepack audioa - Musepack-ääni - Musepack ljóður - audio Musepack - fuaim Musepack - son de Musepack - שמע של Musepack - Musepack audio - Musepack hang - Audio Musepack - Audio Musepack - Musepack オーディオ - Musepack аудиосы - Musepack 오디오 - Musepack garso įrašas - Musepack audio - Musepack-lyd - Musepack-audio - Musepack-lyd - Plik dźwiękowy Musepack - Áudio Musepack - Audio Musepack - аудио Musepack - Zvuk Musepack - Zvočna datoteka Musepack - Audio Musepack - Musepack-ljud - звук Musepack - Âm thanh Musepack - Musepack 音频 - Musepack 音訊 - - - - - - - - - RealAudio document - مستند RealAudio - Dakument RealAudio - Документ — RealAudio - document RealAudio - Dokument RealAudio - RealAudio-dokument - RealAudio-Dokument - έγγραφο RealAudio - RealAudio document - RealAudio-dokumento - documento RealAudio - RealAudio dokumentua - RealAudio-asiakirja - RealAudio skjal - document RealAudio - cáipéis RealAudio - documento Realson - מסמך של RealAudio - RealAudio dokument - RealAudio dokumentum - Dokumen RealAudio - Documento RealAudio - RealAudio ドキュメント - RealAudio құжаты - RealAudio 문서 - RealAudio dokumentas - RealAudio dokuments - RealAudio-dokument - RealAudio-document - RealAudio-dokument - Dokument RealAudio - Documento RealAudio - Document RealAudio - документ RealAudio - Dokument RealAudio - Dokument RealAudio - Dokument RealAudio - RealAudio-dokument - документ RealAudio - Tài liệu âm thanh RealAudio - RealAudio 文档 - RealAudio 文件 - - - - - - - RealMedia Metafile - ملف تعريف RealMedia - Metafajł RealMedia - Метафайл — RealMedia - metafitxer RealMedia - RealMedia Metafile - RealMedia-metafil - RealMedia-Metadatei - Metafile RealMedia - RealMedia Metafile - metarchivo RealMedia - RealMedia metafitxategia - RealMedia-metatiedosto - RealMedia metafíla - métafichier RealMedia - meiteachomhad RealMedia - Metaficheiro RealMedia - קובץ מטא של RealMedia - RealMedia metafájl - RealMedia Metafile - Metafile RealMedia - RealMedia メタファイル - RealMedia метафайлы - RealMedia 메타파일 - RealMedia metafailas - RealMedia metadatne - RealMedia-metafil - RealMedia-metabestand - RealMedia-metafil - Metaplik RealMedia - Meta arquivo do RealMedia - Metafișier RealMedia - мета-файл RealMedia - RealMedia Metafile - Metadatoteka RealMedia - Metafile RealMedia - RealMedia-metafil - метафайл RealMedia - Siêu tập tin RealMedia - RealMedia 元文件 - RealMedia 中介檔 - - - - RealVideo document - مستند RealVideo - Dakument RealVideo - Документ — RealVideo - document RealVideo - Dokument RealVideo - RealAudio-dokument - RealVideo-Dokument - έγγραφο RealVideo - RealVideo document - RealVideo-dokumento - documento RealVideo - RealVideo dokumentua - RealVideo-asiakirja - RealVideo skjal - document RealVideo - cáipéis RealVideo - documento RealVideo - מסמך של RealVideo - RealVideo dokument - RealVideo dokumentum - Dokumen RealVideo - Documento RealVideo - RealVideo ドキュメント - RealVideo құжаты - RealVideo 문서 - RealVideo dokumentas - RealVideo dokuments - RealAudio-dokument - RealVideo-document - RealVideo-dokument - Dokument RealVideo - Documento RealVideo - Document RealVideo - документ RealVideo - Dokument RealVideo - Video datoteka RealVideo - Dokument RealVideo - RealVideo-dokument - документ RealVideo - Tài liệu ảnh động RealVideo - RealAudio 文档 - RealVideo 文件 - - - - - - RealMedia document - مستند RealMedia - Dakument RealMedia - Документ — RealMedia - document RealMedia - Dokument RealMedia - RealMedia-dokument - RealMedia-Dokument - έγγραφο RealMedia - RealMedia document - RealMedia-dokumento - documento RealMedia - RealMedia dokumentua - RealMedia-asiakirja - RealMedia skjal - document RealMedia - cáipéis RealMedia - documento RealMedia - מסמך של RealMedia - RealMedia dokument - RealMedia dokumentum - Dokumen RealMedia - Documento RealMedia - RealMedia ドキュメント - RealMedia құжаты - RealMedia 문서 - RealMedia dokumentas - RealMedia dokuments - RealMedia-dokument - RealMedia-document - RealMedia-dokument - Dokument RealMedia - Documento RealMedia - Document RealMedia - документ RealMedia - Dokument RealMedia - Dokument RealMedia - Dokument RealMedia - RealMedia-dokument - документ RealMedia - Tài liệu RealMedia - RealMedia 文档 - RealMedia 文件 - - - - - - - - - - - - - RealPix document - مستند RealPix - Dakument RealPix - Документ — RealPix - document RealPix - Dokument RealPix - RealPix-dokument - RealPix-Dokument - έγγραφο RealPix - RealPix document - RealPix-dokumento - documento RealPix - RealPix dokumentua - RealPix-asiakirja - RealPix skjal - document RealPix - cáipéis RealPix - documento RealPix - מסמך של RealPix - RealPix dokument - RealPix dokumentum - Dokumen RealPix - Documento RealPix - RealPix ドキュメント - RealPix құжаты - RealPix 문서 - RealPix dokumentas - RealPix dokuments - RealPix-dokument - RealPix-document - RealPix-dokument - Dokument RealPix - Documento RealPix - Document RealPix - документ RealPix - Dokument RealPix - Dokument RealPix - Dokument RealPix - RealPix-dokument - документ RealPix - Tài liệu ảnh RealPix - RealPix 文档 - RealPix 文件 - - - - RealText document - مستند RealText - Dakument RealText - Документ — RealText - document RealText - Dokument RealText - RealText-dokument - RealText-Dokument - έγγραφο RealText - RealText document - RealText-dokumento - documento RealText - RealText dokumentua - RealText-asiakirja - RealText skjal - document RealText - cáipéis RealText - documento RealText - מסמך של RealText - RealText dokument - RealText dokumentum - Dokumen RealText - Documento RealText - RealText ドキュメント - RealText құжаты - RealText 문서 - RealText dokumentas - RealText dokuments - RealText-dokument - RealText-document - RealText-dokument - Dokument RealText - Documento RealText - Document RealText - документ RealText - Dokument RealText - Dokument RealText - Dokument RealText - RealText-dokument - документ RealText - Tài liệu văn bản RealText - RealText 文档 - RealText 文件 - - - - RIFF audio - RIFF سمعي - RIFF audio faylı - Aŭdyjo RIFF - Аудио — RIFF - àudio RIFF - Zvuk RIFF - Sain RIFF - RIFF-lyd - RIFF-Audio - ήχος RIFF - RIFF audio - RIFF-sondosiero - sonido RIFF - RIFF audioa - RIFF-ääni - RIFF ljóð - audio RIFF - fuaim RIFF - son RIFF - שמע RIFF - RIFF audio - RIFF-kép - Audio RIFF - Audio RIFF - RIFF オーディオ - RIFF аудиосы - RIFF 오디오 - RIFF garso įrašas - RIFF audio - Audio RIFF - RIFF-lyd - RIFF-audio - RIFF-lyd - Plik dźwiękowy RIFF - áudio RIFF - Áudio RIFF - Audio RIFF - аудио RIFF - Zvuk RIFF - Zvočna datoteka RIFF - Audio RIFF - RIFF звучни запис - RIFF-ljud - звук RIFF - Âm thanh RIFF - RIFF 音频 - RIFF 音訊 - - - - - - - Scream Tracker 3 audio - Scream Tracker 3 سمعي - Scream Tracker 3 audio faylı - Aŭdyjo Scream Tracker 3 - Аудио — Scream Tracker 3 - àudio de Scream Tracker 3 - Skladba Scream Tracker 3 - Sain Scream Tracker 3 - Scream Tracker 3-lyd - Scream-Tracker-3-Audio - ήχος Scream Tracker 3 - Scream Tracker 3 audio - Sondosiero de Scream Tracker 3 - sonido Scream Tracker 3 - Scream Tracker 3 audioa - Scream Tracker 3 -ääni - Scream Tracker 3 ljóður - audio Scream Tracker 3 - fuaim Scream Tracker 3 - son Scream Tracker 3 - שמע של Scream Tracker 3 - Scream Tracker 3 audio - Scream Tracker 3 hang - Audio Scream Tracker 3 - Audio Scream Tracker 3 - Scream Tracker 3 オーディオ - Scream Tracker 3 аудиосы - Scream Tracker 3 오디오 - Scream Tracker 3 garso įrašas - Scream Tracker 3 audio - Audio Scream Tracker 3 - Scream Tracker 3-lyd - Scream Tracker 3-audio - Sream Tracker 3 lyd - Plik dźwiękowy Scream Tracker 3 - áudio Scream Tracker 3 - Áudio Scream Tracker 3 - Audio Scream Tracker 3 - аудио Scream Tracker 3 - Skladba Scream Tracker 3 - Zvočna datoteka Scream Tracker 3 - Audio Scream Tracker 3 - Scream Tracker 3 звучни запис - Scream Tracker 3-ljud - звук Scream Tracker 3 - Âm thanh Scream Tracker 3 - Scheme Tracker 3 音频 - Scream Tracker 3 音訊 - - - - - - - MP3 ShoutCast playlist - قائمة تشغيل MP3 ShoutCast - Śpis piesień dla tranślacyi MP3 - Списък за изпълнение — MP3 ShoutCast - llista de reproducció MP3 ShoutCast - Seznam skladeb MP3 ShoutCast - MP3 ShoutCast-afspilningsliste - MP3-ShoutCast-Wiedergabeliste - Λίστα αναπαραγωγής MP3 ShoutCast - MP3 ShoutCast playlist - MP3-ludlisto de ShoutCast - lista de reproducción MP3 ShoutCast - MP3 ShoutCast erreprodukzio-zerrenda - MP3 ShoutCast -soittolista - MP3 ShoutCast avspælingarlisti - liste de lecture MP3 ShoutCast - seinmliosta MP3 ShoutCast - lista de reprodución MP3 de ShoutCast - רשימת השמעה MP3 של ShoutCast - MP3 ShoutCast popis za reprodukciju - MP3 ShoutCast-lejátszólista - Senarai putar MP3 ShoutCast - Scaletta MP3 ShoutCast - MP3 ShoutCast 再生リスト - MP3 ShoutCast ойнау тізімі - MP3 ShoutCast 재생 목록 - MP3 ShoutCast grojaraštis - MP3 ShoutCast repertuārs - Senaraimain ShoutCast MP3 - MP3 ShoutCast-spilleliste - MP3 ShoutCast-afspeellijst - MP3 ShoutCast-speleliste - Lista odtwarzania MP3 ShoutCast - lista de reprodução MP3 ShoutCast - Lista de reprodução MP3 ShoutCast - Listă MP3 ShoutCast - список воспроизведения MP3 ShoutCast - Zoznam skladieb MP3 ShoutCast - Seznam predvajanja MP3 ShoutCast - Listë titujsh MP3 ShoutCast - MP3 ShoutCast списак песама - MP3 ShoutCast-spellista - список програвання MP3 ShoutCast - Danh mục nhạc MP3 ShoutCast - MP3 ShoutCast 播放列表 - MP3 ShoutCast 播放清單 - - - - - - - - - - Scream Tracker audio - Scream Tracker سمعي - Scream Tracker audio faylı - Aŭdyjo Scream Tracker - Аудио — Scream Tracker - àudio de Scream Tracker - Skladba Scream Tracker - Sain Scream Tracker - Scream Tracker-lyd - Scream-Tracker-Audio - ήχος Scream Tracker - Scream Tracker audio - Sondosiero de Scream Tracker - sonido Scream Tracker - Scream Tracker audioa - Scream Tracker -ääni - Scream Tracker ljóður - audio Scream Tracker - fuaim Scream Tracker - son Scream Tracker - שמע של Scream Tracker - Scream Tracker audio - Scream Tracker hang - Audio Scream Tracker - Audio Scream Tracker - Scream Tracker オーディオ - Scream Tracker аудиосы - Scream Tracker 오디오 - Scream Tracker garso įrašas - Scream Tracker audio - Audio Scream Tracker - Scream Tracker-lyd - Scream Tracker-audio - Scream Tracker lyd - Plik dźwiękowy Scream Tracker - áudio Scream Tracker - Áudio Scream Tracker - Audio Scream Tracker - аудио Scream Tracker - Skladba Scream Tracker - Zvočna datoteka Scream Tracker - Audio Scream Tracker - Scream Tracker звучни запис - Scream Tracker-ljud - звук Scream Tracker - Âm thanh Scream Tracker - Scream Tracker 音频 - Scream Tracker 音訊 - - - - - - - - - VOC audio - VOC سمعي - VOC audio faylı - Aŭdyjo VOC - Аудио — VOC - àudio VOC - Zvuk VOC - Sain VOC - VOC-lyd - VOC-Audio - ήχος VOC - VOC audio - VOC-sondosiero - sonido VOC - VOC audioa - VOC-ääni - VOC ljóður - audio VOC - fuaim VOC - son VOC - שמע VOC - VOC audio - VOC hang - Audio VOC - Audio VOC - VOC オーディオ - VOC аудиосы - VOC 오디오 - VOC garso įrašas - VOC audio - Audio VOC - VOC-lyd - VOC-audio - VOC-lyd - Plik dźwiękowy VOC - áudio VOC - Áudio VOC - Audio VOC - аудио VOC - Zvuk VOC - Zvočna datoteka VOC - Audio VOC - VOC звучни запис - VOC-ljud - звук VOC - Âm thanh VOC - VOC 音频 - VOC 音訊 - - - - WAV audio - WAV سمعي - WAV audio faylı - Aŭdyjo WAV - Аудио — WAV - àudio WAV - Zvuk WAV - Sain WAV - WAV-lyd - WAV-Audio - ήχος WAV - WAV audio - WAV-sonkodo - sonido WAV - WAV audioa - WAV-ääni - WAV ljóður - audio WAV - fuaim WAV - son WAV - שמע WAV - WAV audio - WAV hang - Audio WAV - Audio WAV - WAV オーディオ - WAV аудиосы - WAV 오디오 - WAV garso įrašas - WAV audio - Audio VOC - WAV-lyd - WAV-audio - WAV-lyd - Plik dźwiękowy WAV - áudio WAV - Áudio WAV - Audio WAV - аудио WAV - Zvuk WAV - Zvočna datoteka WAV - Audio WAV - WAV звучни запис - WAV-ljud - звук WAV - Âm thanh WAV - WAV 音频 - WAV 音訊 - - - - - - - - - - Scream Tracker instrument - آلة Scream Tracker - Scream Tracker instrumenti - Instrument Scream Tracker - Инструмент — Scream Tracker - instrument de Scream Tracker - Nástroj pro Scream Tracker - Offeryn Scream Tracker - Scream Tracker-instrument - Scream-Tracker-Instrument - μουσικό όργανο Scream Tracker - Scream Tracker instrument - instrumento de Scream Tracker - instrumento Scream Tracker - Scream Tracker instrumentua - Scream Tracker -soitin - Scream Tracker ljóðføri - instrument Scream Tracker - ionstraim Scream Tracker - Instrumento Scream Tracker - כלי של Scream Tracker - Scream Tracker instrument - Scream Tracker hangszer - Instrumen Scream Tracker - Strumento Scream Tracker - Scream Tracker インストゥルメント - Scream Tracker сайманы - Scream Tracker 악기 - Scream Tracker instrumentas - Scream Tracker instrumenti - Instrumen Scream Tracker - Scream Tracker-instrument - Scream Tracker-instrument - Scream Tracker instrument - Instrument Scream Tracker - instrumento Scream Tracker - Instrumento Scream Tracker - Instrument Scream Tracker - инструмент Scream Tracker - Nástroj pre Scream Tracker - Datoteka zvoka glasbila Scream Tracker - Instrument Scream Tracker - Scream Tracker инструмент - Scream Tracker-instrument - інструмент Scream Tracker - Nhạc khí Scream Tracker - Scream Tracker 乐器 - Scream Tracker 樂器檔 - - - - - - - FastTracker II audio - FastTracker II سمعي - FastTracker II audio faylı - Aŭdyjo FastTracker II - Аудио — FastTracker II - àudio de FastTracker II - Zvuk FastTracker II - Sain FastTracker II - FastTracker II-lyd - FastTracker-II-Audio - ήχος FastTracker II - FastTracker II audio - Sondosiero de FastTracker II - sonido FastTracker II - FastTracker II.ren audioa - FastTracker II -ääni - FastTracker II ljóður - audio FastTracker II - fuaim FastTracker II - son de FastTracker II - שמע FastTracker II - FastTracker II audio - FastTracker II hang - Audio FastTracker II - Audio FastTracker II - FastTracker II オーディオ - FastTracker II-ის აუდიო - FastTracker II аудиосы - FastTracker II 오디오 - FastTracker II garso įrašas - FastTracker II audio - Audio FastTracker II - FastTracker II-lyd - FastTracker II-audio - FastTracker II lyd - Plik dźwiękowy FastTracker II - áudio FastTracker II - Áudio FastTracker II - Audio FastTracker II - аудио FastTracker II - Zvuk FastTracker II - Zvočna datoteka FastTracker II - Audio FastTracker II - FastTracker II аудио запис - FastTracker II-ljud - звук FastTracker II - Âm thanh FastTracker II - FastTracker II 音频 - FastTracker II 音訊 - - - - - - - TrueAudio audio - TrueAudio سمعي - Aŭdyjo TrueAudio - Аудио — TrueAudio - àudio TrueAudio - Zvuk TrueAudio - TrueAudio-lyd - TrueAudio-Audio - ήχος TrueAudio - TrueAudio audio - TrueAudio-sondosiero - sonido TrueAudio - TrueAudio audioa - TrueAudio-ääni - TrueAudio ljóður - audio TrueAudio - fuaim TrueAudio - son Trueson - שמע TrueAudio - TrueAudio audio - TrueAudio hang - Audio TrueAudio - Audio TrueAudio - TrueAudio オーディオ - TrueAudio аудиосы - TrueAudio 오디오 - TrueAudio garso įrašas - TrueAudio audio - TrueAudio-lyd - TrueAudio-audio - TrueAudio-lyd - Plik dźwiękowy TrueAudio - Áudio TrueAudio - Audio TrueAudio - аудио TrueAudio - Zvuk TrueAudio - Zvočna datoteka TrueAudio - Audio TrueAudio - TrueAudio-ljud - звук TrueAudio - Âm thanh TrueAudio - TrueAudio 音频 - TrueAudio 音訊 - - - - - - - - Windows BMP image - صورة Windows BMP - Windows BMP rəsmi - Vyjava Windows BMP - Изображение — Windows BMP - imatge BMP de Windows - Obrázek Windows BMP - Delwedd BMP Windows - Windows BMP-billede - Windows-BMP-Bild - εικόνα Windows BMP - Windows BMP image - BMP-bildo de Vindozo - imagen BMP de Windows - Windows BMP irudia - Windows BMP -kuva - Windows BMP mynd - image Windows BMP - íomhá BMP Windows - imaxe BMP de Windows - תמונת BMP של Windows - Windows BMP slika - Windows BMP-kép - Citra Windows BMP - Immagine Windows BMP - Windows BMP 画像 - Windows BMP суреті - Windows BMP 그림 - Windows BMP paveikslėlis - Windows BMP attēls - Imej BMP Windows - Windows BMP-bilde - Windows BMP-afbeelding - Windows BMP-bilete - Obraz BMP Windows - imagem BMP Windows - Imagem BMP do Windows - Imagine Windows BMP - изображение Windows BMP - Obrázok Windows BMP - Slikovna datoteka Windows BMP - Figurë Windows BMP - Windows BMP слика - Windows BMP-bild - Windows BMP görüntüsü - зображення Windows BMP - Ảnh BMP Windows - Windows BMP 图像 - Windows BMP 影像 - - - - - - - - - - - - - - WBMP image - صورة WBMP - Vyjava WBMP - Изображение — WBMP - imatge WBMP - Obrázek WBMP - WBMP-billede - WBMP-Bild - εικόνα WBMP - WBMP image - WBMP-bildo - imagen WBMP - WBMP irudia - WBMP-kuva - WBMP mynd - image WBMP - íomhá WBMP - imaxe WBMP - תמונת WBMP - WBMP slika - WBMP kép - Citra WBMP - Immagine WBMP - WBMP 画像 - WBMP суреті - WBMP 그림 - WBMP paveikslėlis - WBMP attēls - WBMP-bilde - WBMP-afbeelding - WBMP-bilete - Obraz WBMP - Imagem WBMP - Imagine WBMP - изображение WBMP - Obrázok WBMP - Slikovna datoteka WBMP - Figurë WBMP - WBMP-bild - зображення WBMP - Ảnh WBMP - WBMP 图像 - WBMP 影像 - WBMP - WAP bitmap - - - - Computer Graphics Metafile - ملف تعريف رسوميات الحاسوب - Kompüter Qrafikası Meta Faylı - Metafajł Computer Graphics - Метафайл — Computer Graphics - metafitxer de Computer Graphics - Computer Graphics Metafile - Delwedd ffurf CGM - Computer Graphics-metafil - CGM-Datei - αρχείο Computer Graphics Metafile - Computer Graphics Metafile - metaarchivo de Computer Graphics - Ordenagailuko grafikoen meta-fitxategia - Computer Graphics -metatiedosto - Teldugrafikk metafíla - métafichier Computer Graphics - meiteachomhad Grafaicí Ríomhaire - metaficheiro de Computer Graphics - קובץ-מטה מסוג Computer Graphics - Computer Graphics-metafájl - Computer Graphics Metafile - Computer Graphics Metafile - コンピューターグラフィックメタファイル - компьютерлік графика метафайлы - 컴퓨터 그래픽스 메타파일 - Computer Graphics metafailas - Datorgrafikas metadatne - Failmeta Grafik Komputer - Computer Graphics Metafile - Computer Graphics-metabestand - Computer Graphics Metafile - Metaplik grafiki komputerowej (CGM) - Computer Graphics Metafile - Meta-arquivo do Computer Graphics - Metafișier Computer Graphics - метафайл компьютерной графики - Computer Graphics Metafile - Metadatoteka računalniške grafike (CGM) - Metafile Computer Graphics - Метадатотека са рачунарском графиком (CGM) - Computer Graphics Metafil - метафайл комп'ютерної графіки - Siêu tập tin đồ họa máy tính (CMF) - CGM 计算机图像元文件 - CGM 影像 - - - - CCITT G3 fax - فاكس CCITT G3 - Faks CCITT G3 - Факс — CCITT G3 - fax CCITT G3 - Fax CCITT G3 - CCITT G3-fax - CCITT-G3-Fax - φαξ σε μορφή CCITT G3 - CCITT G3 fax - G3-fakso de CCITT - fax de CCITT G3 - CCITT G3 faxa - CCITT G3 -faksi - CCITT G3 telefaks - télécopie G3 CCITT - facs CCITT G3 - fax de CCITT G3 - פקס של CCITT G3 - CCITT G3 faks - CCITT G3-fax - Faks CCITT G3 - Fax CCITT G3 - CCITT G3 FAX - CCITT G3 ფაქსი - CCITT G3 факсі - CCITT G3 팩스 - CCITT G3 faksas - CCITT G3 fakss - Faks g3 CCITT - CCITT G3-faks - CCITT G3-fax - CCITT G3-fax - Faks CCITT G3 - fax CCITT G3 - Fax do CCITT G3 - Fax CCITT G3 - факс CCITT G3 - Fax CCITT G3 - Datoteka faksimila CCITT G3 - Fax CCITT G3 - CCITT g3 факс - CCITT G3-fax - факс CCITT G3 - Điện thư G3 CCITT - CCITT G3 传真 - CCITT G3 傳真檔 - - - - G3 fax image - صورة فاكس G3 - G3 faks rəsmi - Faksavaja vyjava G3 - Изображение — факс G3 - imatge de fax G3 - Obrázek fax G3 - Delwedd Ffacs G3 - G3-faxbillede - G3-Faxbild - εικόνα φαξ G3 - G3 fax image - G3-faksbildo - imagen de fax G3 - G3 fax-irudia - G3-faksikuva - G3 fax mynd - image de télécopie G3 - íomhá fhacs G3 - imaxe de fax G3 - תמונת פקס של G3 - G3-faxkép - Citra faks G3 - Immagine fax G3 - G3 FAX 画像 - G3 fax გამოსახულება - G3 факс суреті - G3 팩스 그림 - G3 fax paveikslėlis - G3 faksa attēls - Imej fax G3 - G3-faksbilde - G3 faxafbeelding - G3 faksbilete - Obraz faksowy G3 - imagem de fax G3 - Imagem de fax G3 - Imagine fax G3 - факсовое изображение G3 - Obrázok fax G3 - Slikovna datoteka G3 fax - Figurë Fax G3 - G3 факс слика - G3-faxbild - G3 fax görüntüsü - факс G3 - Ảnh điện thư G3 - G3 传真文档 - G3 傳真圖 - - - GIF image - صورة GIF - GIF rəsmi - Vyjava GIF - Изображение — GIF - imatge GIF - Obrázek GIF - Delwedd GIF - GIF-billede - GIF-Bild - εικόνα GIF - GIF image - GIF-bildo - imagen GIF - GIF irudia - GIF-kuva - GIF mynd - image GIF - íomhá GIF - imaxe GIF - תמונת GIF - GIF slika - GIF-kép - Citra GIF - Immagine GIF - GIF 画像 - GIF გამოსახულება - GIF суреті - GIF 그림 - GIF paveikslėlis - GIF attēls - Imej GIF - GIF-bilde - GIF-afbeelding - GIF-bilete - Obraz GIF - imagem GIF - Imagem GIF - Imagine GIF - изображение GIF - Obrázok GIF - Slikovna datoteka GIF - Figurë GIF - GIF слика - GIF-bild - GIF görüntüsü - зображення GIF - Ảnh GIF - GIF 图像 - GIF 影像 - - - - - - - IEF image - صورة IEF - IEF rəsmi - Vyjava IEF - Изображение — IEF - imatge IEF - Obrázek IEF - Delwedd IEF - IEF-billede - IEF-Bild - εικόνα IEF - IEF image - IEF-bildo - imagen IEF - IEF irudia - IEF-kuva - IEF mynd - image IEF - íomhá IEF - imaxe IEF - תמונת IEF - IEF slika - IEF-kép - Citra IEF - Immagine IEF - IEF 画像 - IEF суреті - IEF 그림 - IEF paveikslėlis - IEF attēls - Imej IEF - IEF-bilde - IEF-afbeelding - IEF-bilete - Obraz IEF - imagem IEF - Imagem IEF - Imagine IEF - изображение IEF - Obrázok IEF - Slikovna datoteka IEF - Figurë IEF - IEF слика - IEF-bild - зображення IEF - Ảnh IEF - IEF 图像 - IEF 影像 - - - - JPEG image - صورة JPEG - JPEG rəsmi - Vyjava JPEG - Изображение — JPEG - imatge JPEG - Obrázek JPEG - Delwedd JPEG - JPEG-billede - JPEG-Bild - εικόνα JPEG - JPEG image - JPEG-bildo - imagen JPEG - JPEG irudia - JPEG-kuva - JPEG mynd - image JPEG - íomhá JPEG - imaxe JPEG - תמונת JPEG - JPEG slika - JPEG-kép - Citra JPEG - Immagine JPEG - JPEG 画像 - JPEG суреті - JPEG 그림 - JPEG paveikslėlis - JPEG attēls - Imej JPEG - JPEG-bilde - JPEG-afbeelding - JPEG-bilete - Obraz JPEG - imagem JPEG - Imagem JPEG - Imagine JPEG - изображение JPEG - Obrázok JPEG - Slikovna datoteka JPEG - Figurë JPEG - JPEG слика - JPEG-bild - JPEG görüntüsü - зображення JPEG - Ảnh JPEG - JPEG 图像 - JPEG 影像 - - - - - - - - - - - JPEG-2000 image - صورة JPEG-2000 - Vyjava JPEG-2000 - Изображение — JPEG-2000 - imatge JPEG-2000 - Obrázek JPEG-2000 - JPEG2000-billede - JPEG-2000-Bild - εικόνα JPEG-2000 - JPEG-2000 image - JPEG-2000-bildo - imagen JPEG-2000 - JPEG-2000 irudia - JPEG-2000-kuva - JPEG-2000 mynd - image JPEG-2000 - íomhá JPEG-2000 - imaxe JPEG-2000 - תמונת JPEG-2000 - JPEG-2000 slika - JPEG-2000 kép - Citra JPEG-2000 - Immagine JPEG-2000 - JPEG-2000 画像 - JPEG-2000 суреті - JPEG-2000 그림 - JPEG-2000 paveikslėlis - JPEG-2000 attēls - Imej JPEG-2000 - JPEG-2000-bilde - JPEG-2000-afbeelding - JPEG-2000-bilete - Obraz JPEG-2000 - imagem JPEG-2000 - Imagem JPEG-2000 - Imagine JPEG-2000 - изображение JPEG-2000 - Obrázok JPEG-2000 - Slikovna datoteka JPEG-2000 - Figurë JPEG-2000 - JPEG-2000 слика - JPEG-2000-bild - JPEG-2000 görüntüsü - зображення JPEG-2000 - Ảnh JPEG-2000 - JPEG-2000 图像 - JPEG-2000 影像 - - - - - - - - - - - - - - - - OpenRaster archiving image - صورة أرشيف OpenRaster - Изображение — OpenRaster - imatge d'arxivat OpenRaster - Archivační obraz OpenRaster - OpenRaster-arkivaftryk - OpenRaster-Archivierungsbild - εικόνα αρχειοθέτησης OpenRaster - OpenRaster archiving image - imagen de archivado de OpenRaster - OpenRaster artxiboaren irudia - OpenRaster goymslumynd - image d'archive OpenRaster - íomhá chartlannaithe OpenRaster - imaxe arquivada de OpenRaster - תמונת ארכיון של OpenRaster - OpenRaster archiválási kép - Gambar pengarsipan OpenRaster - Immagine archiviazione OpenRaster - OpenRaster アーカイブイメージ - OpenRaster-ის საარქივო გამოსახულება - OpenRaster архивтеу суреті - OpenRaster 압축 이미지 - OpenRaster archyvavimo paveikslėlis - OpenRaster arhivēšanas attēls - OpenRaster archiverings-image - Archiwalny obraz OpenRaster - Imagem de arquivamento OpenRaster - Arhivă imagine OpenRaster - архивное изображение OpenRaster - Odtis arhiva OpenRaster - OpenRaster-arkivbild - архівоване зображення OpenRaster - OpenRaster 归档映像 - OpenRaster 封存影像 - - - - - - - - - - - WebP image - صورة WebP - WebP rəsmi - Vyjava WebP - Изображение — WebP - imatge WebP - Obrázek WebP - Delwedd WebP - WebP-billede - WebP-Bild - εικόνα WebP - WebP image - WebP-bildo - imagen WebP - WebP irudia - WebP-kuva - WebP mynd - image WebP - íomhá WebP - imaxe WebP - תמונת WebP - WebP slika - WebP-kép - Citra WebP - Immagine WebP - WebP 画像 - WebP суреті - WebP 그림 - WebP paveikslėlis - WebP attēls - Imej WebP - WebP-bilde - WebP-afbeelding - WebP-bilete - Obraz WebP - imagem WebP - Imagem WebP - Imagine WebP - изображение WebP - Obrázok WebP - Slikovna datoteka WebP - Figurë WebP - WebP слика - WebP-bild - WebP görüntüsü - зображення WebP - Ảnh WebP - WebP 图像 - WebP 影像 - - - - - - - - - DirectDraw surface - مساحة DirectDraw - Pavierchnia DirectDraw - Изображение — повърхност на DirectDraw - superfície DirectDraw - Plocha DirectDraw - DirectDraw-overflade - DirectDraw-Oberfläche - επιφάνεια DirectDraw - DirectDraw surface - superficie DirectDraw - DirectDraw gainazala - DirectDraw-piirtoalue - DirectDraw yvirflata - surface DirectDraw - dromchla DirectDraw - superficie de DirectDraw - משטח של DirectDraw - DirectDraw ploha - DirectDraw felület - Permukaan DirectDraw - Superficie DirectDraw - DirectDraw サーフェイス - DirectDraw-ის ზედაპირი - DirectDraw жазықтығы - DirectDraw 서피스 - DirectDraw paviršius - DirectDraw virsma - DirectDraw-overflate - DirectDraw-oppervlak - DirectDraw-overflate - Powierzchnia DirectDraw - Superfície do DirectDraw - Suprafață DirectDraw - плоскость DirectDraw - Plocha DirectDraw - Datoteka predmeta DirectDraw - Superfaqe DirectDraw - DirectDraw-yta - поверхня DirectDraw - Mặt DirectDraw - DirectDraw 表面 - DirectDraw 表面 - - - - - - - X11 cursor - مؤشر X11 - Kursor X11 - Курсор — X11 - cursor X11 - Kurzor X11 - X11-markør - X11-Zeiger - δείκτης X11 - X11 cursor - cursor X11 - X11 kurtsorea - X11-osoitin - X11 vísi - curseur X11 - cúrsóir X11 - Cursor X11 - סמן של X11 - X11 kursor - X11 kurzor - Kursor X11 - Cursore X11 - X11 カーソル - X11 курсоры - X11 커서 - X11 žymiklis - X11 kursors - X11-markør - X11-muisaanwijzer - X11-peikar - Kursor X11 - Cursor do X11 - Cursor X11 - курсор X11 - Kurzor X11 - Datoteka kazalke X11 - Kursor X11 - X11-muspekare - курсор X11 - Con chạy X11 - X11 指针 - X11 滑鼠游標 - - - - - - EXR image - صورة EXR - Vyjava EXR - Изображение — EXR - imatge EXR - Obrázek EXR - EXR-billede - EXR-Bild - εικόνα EXR - EXR image - EXR-bildo - imagen EXR - EXR irudia - EXR-kuva - EXR mynd - image EXR - íomhá EXR - imaxe EXR - תמונת EXR - EXR slika - EXR kép - Citra EXR - Immagine EXR - EXR 画像 - EXR გამოსახულება - EXR суреті - EXR 그림 - EXR paveikslėlis - EXR attēls - EXR-bilde - EXR-afbeelding - EXR-bilete - Obraz EXR - Imagem EXR - Imagine EXR - изображение EXR - Obrázok EXR - Slikovna datoteka EXR - Figurë EXR - EXR-bild - EXR görüntüsü - зображення EXR - Ảnh EXR - EXR 图像 - EXR 影像 - - - - - - - Macintosh Quickdraw/PICT drawing - رسمة ماكنتوش Quickdraw/PICT - Rysunak Macintosh Quickdraw/PICT - Чертеж — Macintosh Quickdraw/PICT - dibuix Quickdraw/PICT de Macintosh - Kresba Macintosh Quickdraw/PICT - Macintosh Quickdraw/PICT-tegning - Macintosh-Quickdraw/PICT-Zeichnung - σχέδιο Macintosh Quickdraw/PICT - Macintosh Quickdraw/PICT drawing - Quickdraw/PICT-grafikaĵo de Macintosh - dibujo de Macintosh Quickdraw/PICT - Macintosh Quickdraw/PICT marrazkia - Macintosh Quickdraw/PICT -piirros - Macintosh Quickdraw/PICT tekning - dessin Macintosh Quickdraw/PICT - líníocht Macintosh Quickdraw/PICT - debuxo de Macintosh Quickdraw/PICT - ציור של Macintosh Quickdraw/PICT - Macintosh Quickdraw/PICT crtež - Macintosh Quickdraw/PICT-rajz - Gambar Macintosh Quickdraw/PICT - Disegno Macintosh Quickdraw/PICT - Macintosh Quickdraw/PICT ドロー - Macintosh Quickdraw/PICT суреті - 매킨토시 Quickdraw/PICT 그림 - Macintosh Quickdraw/PICT piešinys - Macintosh Quickdraw/PICT zīmējums - Lukisan Macintosh Quickdraw/PICT - Macintosh Quickdraw/PICT-tegning - Macintosh Quickdraw/PICT-tekening - Macintosh Quickdraw/PICT-teikning - Rysunek Quickdraw/PICT Macintosh - desenho Quickdraw/PICT de Macintosh - Desenho do Macintosh Quickdraw/PICT - Desen Macintosh Quickdraw/PICT - рисунок Macintosh Quickdraw/PICT - Kresba Macintosh QuickDraw/PICT - Datoteka risbe Macintosh Quickdraw/PICT - Vizatim Macintosh Quickdraw/PICT - Мекинтош Quickdraw/PICT цртеж - Macintosh Quickdraw/PICT-teckning - малюнок Macintosh Quickdraw/PICT - Bản vẽ Quickdraw/PICT của Macintosh - Macintosh Quickdraw/PICT 绘图 - Macintosh Quickdraw/PICT 繪圖 - - - - - - - - - - - - - - - - - - - - - - - - - UFRaw ID image - صورة UFRaw ID - Vyjava UFRaw ID - Изображение — UFRaw ID - imatge ID UFRaw - Obrázek ID UFRaw - UFRaw ID-billede - UFRaw-Bildbeschreibungsdatei - ταυτότητα UFRaw - UFRaw ID image - imagen de identificación UFRaw - UFRaw ID irudia - UFRaw ID -kuva - UFRaw ID mynd - image ID UFRaw - íomhá aitheantais UFRaw - imaxe de identificación UFRaw - תמונה של UFRaw ID - UFRaw azonosítófájl - Citra UFRaw ID - Immagine UFRaw ID - UFRaw ID イメージ - UFRaw ID суреті - UFRaw ID 그림 - UFRaw ID paveikslėlis - UFRaw ID attēls - UFRaw ID-bilde - UFRaw ID-afbeelding - UFRaw ID-bilete - Obraz UFRaw ID - Imagem ID do UFRaw - ID imagine UFRaw - изображение UFRaw ID - Obrázok ID UFRaw - Slikovna datoteka UFRaw ID - Figurë UFRaw ID - UFRaw ID-bild - зображення UFRaw ID - Ảnh ID UFRaw - UFRaw ID 图像 - UFRaw ID 影像 - UFRaw - Unidentified Flying Raw - - - - - - digital raw image - صورة رقمية خامة - suvoraja ličbavaja vyjava - Изображение — digital raw - imatge digital en cru - Digitální surový obrázek - digitalt råbillede - Digitales Rohbild - ανεπεξέργαστη ψηφιακή εικόνα - digital raw image - imagen digital en bruto - irudi gordin digitala - digitaalinen raakakuva - talgild rámynd - image brute numérique - amhíomhá digiteach - imaxe en bruto dixital - תמונה דיגטלית גולמית - digitális nyers kép - citra mentah digital - Immagine raw digitale - デジタル raw 画像 - өңделмеген сандық суреттер - 디지털 원본 이미지 - skaitmeninis neapdorotas paveikslėlis - digitāls jēlattēls - digitalt raw-bilde - onbewerkt digitaal beeld - digitalt råbilete - Surowy obraz cyfrowy - Imagem digital bruta - imagine digitală brută - необработанные цифровые изображения - Digitálny surový obrázok - surova digitalna slika - Figurë raw dixhitale - digital råbild - зображення цифрового негатива - ảnh thô số - 数字化原始图像 - 數位原生影像 - - - Adobe DNG negative - Adobe DNG negative - Adobe DNG Negative - Изображение — Adobe DNG negative - negatiu DNG d'Adobe - Adobe Digital Negative (DNG) - Adobe DNG-negativ - Adobe Digitales Negativ - αρνητικό Adobe DNG - Adobe DNG negative - negativo digital de Adobe (ADN) - Adobe DNG negatiboa - Adobe-DNG-negatiivi - Adobe DNG negativ - négatif DNG Adobe - claonchló DNG Adobe - negativo DNG de Adobe - תשליל Adobe DNG - Adobe DNG negativ - Adobe DNG negatív - Negatif Adobe DNG - Negativo Adobe DNG - Adobe DNG ネガ - Adobe DNG-ის ნეგატივი - Adobe DNG негативі - 어도비 DNG 네거티브 - Adobe DNG negatyvas - Adobe DNG negatīvs - Adobe DNG-negativ - Adobe DNG-negatief - Adobe DNG-negativ - Negatyw DNG Adobe - Negativo DNG da Adobe - Negativ Adobe DNG - негатив Adobe DNG - Adobe Digital Negative (DNG) - Datoteka negativa Adobe DNG - Negativ Adobe DNG - Adobe DNG-negativ - цифровий негатив DNG Adobe - Âm bản Adobe DNG - Adobe DNG 负片 - Adobe DNG 負片 - DNG - Digital Negative - - - - - - - - Canon CRW raw image - صورة Canon CRW خامة - Suvoraja vyjava Canon CRW - Изображение — Canon CRW raw - imatge en cru de Canon CRW - Surový obrázek Canon CRW - Canon CRW-råbillede - Canon-CRW-Rohbild - ανεπεξέργαστη εικόνα Canon CRW - Canon CRW raw image - imagen en bruto CRW de Canon - Canon CRW irudi gordina - Canon-CRW-raakakuva - Canon CRW rámynd - image brute CRW Canon - amhíomhá Canon CRW - imaxe en bruto de Canon CRW - תמונה גולמית של Canon CRW - Canon CRW nyers kép - Citra mentah Canon CRW - Immagine raw Canon CRW - Canon CRW raw 画像 - Canon CRW raw გამოსახულება - Canon CRW өңделмеген суреті - 캐논 CRW 원본 이미지 - Canon CRW neapdorotas paveikslėlis - Canon CRW jēlattēls - Canon CRW raw-bilde - onbewerkt Canon CRW-beeld - Canon CRW råbilete - Surowy obraz CRW Canon - Imagem bruta CRW da Canon - Imagine brută Canon CRW - необработанное изображение Canon CRW - Surový obrázok Canon CRW - Surova slikovna datoteka Canon CRW - Figurë raw Canon CRW - Canon CRW-råbild - цифровий негатив CRW Canon - Ảnh thô Canon CRW - Canon CRW 原始图像 - Canon CRW 原生影像 - CRW - Canon RaW - - - - - - - - - Canon CR2 raw image - صورة Canon CR2 خامة - Suvoraja vyjava Canon CR2 - Изображение — Canon CR2 raw - imatge en cru de Canon CR2 - Surový obrázek Canon CR2 - Canon CR2-råbillede - Canon-CR2-Rohbild - ανεπεξέργαστη εικόνα Canon CR2 - Canon CR2 raw image - imagen en bruto CR2 de Canon - Canon CR2 irudi gordina - Canon-CR2-raakakuva - Canon CR2 rámynd - image brute CR2 Canon - amhíomhá Canon CR2 - imaxe en bruto de Canon CR2 - תמונה גולמית של Canon CR2 - Canon CR2 nyers kép - Citra mentah Canon CR2 - Immagine raw Canon CR2 - Canon CR2 raw 画像 - Canon CR2 raw გამოსახულება - Canon CR2 өңделмеген суреті - 캐논 CR2 원본 이미지 - Canon CR2 neapdorotas paveikslėlis - Canon CR2 jēlattēls - Canon CR2 raw-bilde - onbewerkt Canon CR2-beeld - Canon CR2 råbilete - Surowy obraz CR2 Canon - Imagem bruta CR2 da Canon - Imagine brută Canon CR2 - необработанное изображение Canon CR2 - Surový obrázok Canon CR2 - Surova slikovna datoteka Canon CR2 - Figurë raw Canon CR2 - Canon CR2-råbild - цифровий негатив CR2 Canon - Ảnh thô Canon CR2 - Canon CR2 原始图像 - Canon CR2 原生影像 - CR2 - Canon Raw 2 - - - - - - Fuji RAF raw image - صورة Fuji RAF خامة - Suvoraja vyjava Fuji RAF - Изображение — Fuji RAF raw - imatge en cru de Fuji RAF - Surový obrázek Fuji RAF - Fuji RAF-råbillede - Fuji-RAF-Rohbild - ανεπεξέργαστη εικόνα Fuji RAF - Fuji RAF raw image - imagen en bruto RAF de Fuji - Fuji RAF irudi gordina - Fuji-RAF-raakakuva - Fuji RAF raw mynd - image brute RAF Fuji - amhíomhá Fuji RAF - imaxe en bruto de Fuji RAF - תמונה גולמית של Fuji RAF - Fuji RAF nyers kép - Citra mentah Fuji RAF - Immagine raw Fuji RAF - Fuji RAF raw 画像 - Fuji RAF-ის raw გამოსახულება - Fuji RAF өңделмеген суреті - 후지 RAF 원본 이미지 - Fuji RAF neapdorotas paveikslėlis - Fuji RAF jēlattēls - Fuji RAF raw-bilde - onbewerkt Fuji RAF-beeld - Fuji RAF rått bilete - Surowy obraz RAF Fuji - Imagem bruta RAF da Fuji - Imagine brută Fuji RAF - необработанное изображение Fuji RAF - Surový obrázok Fuji RAF - Surova slikovna datoteka Fuji RAF - Figurë raw Fuji RAF - Fuji RAF-råbild - Цифровий негатив RAF Fuji - Ảnh thô Fuji RAF - 富士RAF 原始图像 - Fuji RAF 原生影像 - RAF - RAw Format - - - - - - - - Kodak DCR raw image - صورة Kodak DCR خامة - Suvoraja vyjava Kodak DCR - Изображение — Kodak DCR raw - imatge en cru de Kodak DCR - Surový obrázek Kodak DCR - Kodak DCR-råbillede - Kodak-DCR-Rohbild - ανεπεξέργαστη εικόνα Kodak DCR - Kodak DCR raw image - imagen en bruto DCR de Kodak - Kodak DCR irudi gordina - Kodak-DCR-raakakuva - Kodak DCR rámynd - image brute DCR Kodak - amhíomhá Kodak DCR - imaxe en bruto de Kodad DCR - תמונה גולמית של Kodak DCR - Kodak DCR nyers kép - Citra mentah Kodak DCR - Immagine raw Kodak DCR - Kodak DCR raw 画像 - Kodak DCR өңделмеген суреті - 코닥 DCR 원본 이미지 - Kodak DCR neapdorotas paveikslėlis - Kodak DCR jēlattēls - Kodak DCR raw-bilde - onbewerkt Kodak DCR-beeld - Kodak DCR råbilete - Surowy obraz DCR Kodak - Imagem bruta DCR da Kodak - Imagine brută Kodak DCR - необработанное изображение Kodak DCR - Surový obrázok Kodak DCR - Surova slikovna datoteka Kodak DCR - Figurë raw Kodak DCR - Kodak DCR-råbild - цифровий негатив DCR Kodak - Ảnh thô Kodak DCR - Kodak DCR 原始图像 - Kodak DCR 原生影像 - DCR - Digital Camera Raw - - - - - - Kodak K25 raw image - صورة Kodak K25 خامة - Suvoraja vyjava Kodak K25 - Изображение — Kodak K25 raw - imatge en cru de Kodak K25 - Surový obrázek Kodak K25 - Kodak K25-råbillede - Kodak-K25-Rohbild - ανεπεξέργαστη εικόνα Kodak K25 - Kodak K25 raw image - imagen en bruto K25 de Kodak - Kodak K25 raw image - Kodak-K25-raakakuva - Kodak K25 rámynd - image brute K25 Kodak - amhíomhá Kodak K25 - imaxe en bruto de Kodad K25 - תמונה גולמית של Kodak K25 - Kodak K25 nyers kép - Citra mentah Kodak K25 - Immagine raw Kodak K25 - Kodak K25 raw 画像 - Kodak K25 өңделмеген суреті - 코닥 K25 원본 이미지 - Kodak K25 neapdorotas paveikslėlis - Kodak K25 jēlattēls - Kodak K25 raw-bilde - onbewerkt Kodak K25-beeld - Kodak K25 råbilete - Surowy obraz K25 Kodak - Imagem bruta K25 da Kodak - Imagine brută Kodak K25 - необработанное изображение Kodak K25 - Surový obrázok Kodak K25 - Surova slikovna datoteka Kodak K25 - Figurë raw Kodak K25 - Kodak K25-råbild - цифровий негатив K25 Kodak - Ảnh thô Kodak K25 - Kodak K25 原始图像 - Kodak K25 原生影像 - K25 - Kodak DC25 - - - - - - Kodak KDC raw image - صورة Kodak KDC خامة - Suvoraja vyjava Kodak KDC - Изображение — Kodak KDC raw - imatge en cru de Kodak KDC - Surový obrázek Kodak KDC - Kodak KDC-råbillede - Kodak-KDC-Rohbild - ανεπεξέργαστη εικόνα Kodak KDC - Kodak KDC raw image - imagen en bruto KDC de Kodak - Kodak KDC irudi gordina - Kodak-KDC-raakakuva - Kodak KDC rámynd - image brute KDC Kodak - amhíomhá Kodak KDC - imaxe en bruto de Kodad KDC - תמונה גולמית של Kodak KDC - Kodak KDC nyers kép - Citra mentah Kodak KDC - Immagine raw Kodak KDC - Kodak KDC raw 画像 - Kodak KDC өңделмеген суреті - 코닥 KDC 원본 이미지 - Kodak KDC neapdorotas paveikslėlis - Kodak KDC jēlattēls - Kodak KDC raw-bilde - onbewerkt Kodak KDC-beeld - Kodak KDC råbilete - Surowy obraz KDC Kodak - Imagem bruta KDC da Kodak - Imagine brută Kodak KDC - необработанное изображение Kodak KDC - Surový obrázok Kodak KDC - Surova slikovna datoteka Kodak KDC - Figurë raw Kodak KDC - Kodak KDC-råbild - цифровий негатив KDC Kodak - Ảnh thô Kodak KDC - Kodak KDC 原始图像 - Kodak KDC 原生影像 - KDC - Kodak Digital Camera - - - - - - - - - Minolta MRW raw image - صورة Minolta MRW خامة - Suvoraja vyjava Minolta MRW - Изображение — Minolta MRW raw - imatge en cru de Minolta MRW - Surový obrázek Minolta MRW - Minolta MRW-råbillede - Minolta-MRW-Rohbild - ανεπεξέργαστη εικόνα Minolta MRW - Minolta MRW raw image - imagen en bruto MRW de Minolta - Minolta MRW irudi gordina - Minolta-MRW-raakakuva - Minolta MRW rámynd - image brute MRW Minolta - amhíomhá Minolta MRW - imaxe RAW de Minolta MRW - תמונה גולמית של Minolta MRW - Minolta MRW nyers kép - Citra mentah Minolta MRW - Immagine raw Minolta MRW - Minolta MRW raw 画像 - Minolta MRW өңделмеген суреті - 미놀타 MRW 원본 이미지 - Minolta MRW neapdorotas paveikslėlis - Minolta MRW jēlattēls - Minolta MRW raw-bilde - onbewerkt Minolta MRW-beeld - Minolta MRW råbilete - Surowy obraz MRW Minolta - Imagem bruta MRW do Minolta - Imagine brută Minolta MRW - необработанное изображение Minolta MRW - Surový obrázok Minolta MRW - Surova slikovna datoteka Minolta MRW - Figurë raw Minolta MRW - Minolta MRW-råbild - цифровий негатив MRW Minolta - Ảnh thô Minolta MRW - Minolta MRW 原始图像 - Minolta MRW 原生影像 - MRW - Minolta RaW - - - - - - - - Nikon NEF raw image - صورة Nikon NEF خامة - Suvoraja vyjava Nikon NEF - Изображение — Nikon NEF raw - imatge en cru de Nikon NEF - Surový obrázek Nikon NEF - Nikon NEF-råbillede - Nikon-NEF-Rohbild - ανεπεξέργαστη εικόνα Nikon NEF - Nikon NEF raw image - imagen en bruto NEF de Nikon - Nikon NEF irudi gordina - Nikon-NEF-raakakuva - Nikon NEF rámynd - image brute NEF Nikon - amhíomhá Nikon NEF - imaxe RAW NEF Nikon - תמונה גולמית של Nikon NEF - Nikon NEF nyers kép - Citra mentah Nikon NEF - Immagine raw Nikon NEF - Nikon NEF raw イメージ - Nikon NEF өңделмеген суреті - 니콘 NEF 원본 이미지 - Nikon NEF neapdorotas paveikslėlis - Nikon NEF jēlattēls - Nikon NEF raw-bilde - onbewerkt Nikon NEF-beeld - Nikon NEF råbilete - Surowy obraz NEF Nikon - Imagem bruta NEF da Nikon - Imagine brută Nikon NEF - необработанное изображение Nikon NEF - Surový obrázok Nikon NEF - Surova slikovna datoteka Nikon NEF - Figurë raw Nikon NEF - Nikon NEF-råbild - цифровий негатив NEF Nikon - Ảnh thô Nikon NEF - Nikon NEF 原始图像 - Nikon NEF 原生影像 - NEF - Nikon Electronic Format - - - - - - Olympus ORF raw image - صورة Olympus ORF خامة - Suvoraja vyjava Olympus ORF - Изображение — Olympus ORF raw - imatge en cru d'Olympus ORF - Surový obrázek Olympus ORF - Olympus ORF-råbillede - Olympus-ORF-Rohbild - ανεπεξέργαστη εικόνα Olympus ORF - Olympus ORF raw image - imagen en bruto ORF de Olympus - Olympus ORF irudi gordina - Olympus-ORF-raakakuva - Olympus ORF rámynd - image brute ORF Olympus - amhíomhá Olympus ORF - imaxe en bruto de Olympus ORF - תמונה גולמית של Olympus ORF - Olympus ORF nyers kép - Citra mentah Olympus ORF - Immagine raw Olympus ORF - Olympus ORF raw 画像 - Olympus ORF-ის raw გამოსახულება - Olympus ORF өңделмеген суреті - 올림푸스 ORF 원본 이미지 - Olympus ORF neapdorotas paveikslėlis - Olympus ORF jēlattēls - Olympus ORF raw-bilde - onbewerkt Olympus ORF-beeld - Olympus ORF råbilete - Surowy obraz Olympus ORF - Imagem bruta ORF da Olympus - Imagine brută Olympus ORF - необработанное изображение Olympus ORF - Surový obrázok Olympus ORF - Surova slikovna datoteka Olympus ORF - Figurë raw Olympus ORF - Olympus ORF-råbild - цифровий негатив ORF Olympus - Ảnh thô Olympus ORF - Olympus ORF 原始图像 - Olympus ORF 原生影像 - ORF - Olympus Raw Format - - - - - - - - - - - - - Panasonic raw image - صورة Panasonic خامة - Suvoraja vyjava Panasonic - Изображение — Panasonic raw - imatge en cru de Panasonic - Surový obrázek Panasonic - Panasonicråbillede (raw) - Panasonic-Rohbild - Panasonic raw image - imagen en bruto de Panasonic - Panasonic irudi gordina - Panasonic-raakakuva - Panasonic rámynd - image brute Panasonic - amhíomhá Panasonic - imaxe en bruto de Panasonic - תמונה גולמית של Panasonic - Panasonic nyers kép - Citra mentah Panasonic - Immagine raw Panasonic - Panasonic raw 画像 - Panasonic өңделмеген суреті - 파나소닉 원본 이미지 - Panasonic neapdorotas paveikslėlis - Panasonic jēlattēls - Panasonic raw-bilde - onbewerkt Panasonic-beeld - Panasonic råbilete - Obraz raw Panasonic - Imagem bruta da Panasonic - Imagine brută Panasonic - необработанное изображение Panasonic - Surový obrázok Panasonic - Surova slikovna datoteka Panasonic - Figurë raw Panasonic - Panasonic-råbild - цифровий негатив Panasonic - Ảnh thô Panasonic - Panasonic 原始图像 - Panasonic 原生影像 - - - - - - - - - Panasonic raw2 image - Изображение — Panasonic raw2 - imatge «RAW2» de Panasonic - Surový obrázek Panasonic raw2 - Panasonic-rå2-billede (raw) - Panasonic raw2-Bild - Panasonic raw2 image - imagen en bruto raw2 de Panasonic - Panasonic raw2 -kuva - image raw2 Panasonic - imaxe en bruto raw2 de Panasonic - תמונת raw2 של Panasonic - Panasonic raw2 kép - Image Panasonic raw2 - Immagine raw2 Panasonic - Panasonic raw2 画像 - Panasonic raw2 суреті - 파나소닉 원본 이미지 2 - Panasonic raw2 jēlattēls - Panasonic raw2 image - Obraz raw2 Panasonic - Imagem raw2 da Panasonic - необработанное изображение Panasonic RAW 2 - Surový obrázok Panasonic raw2 - Slikovna datoteka Panasonic raw2 - Panasonic raw2-bild - Panasonic raw2 görüntüsü - зображення формату raw2 Panasonic - Panasonic raw2 图像 - Panasonic raw2 影像 - - - - - - - - - Pentax PEF raw image - صورة Pentax PEF خامة - Suvoraja vyjava Pentax PEF - Изображение — Pentax PEF raw - imatge en cru de Pentax PEF - Surový obrázek Pentax PEF - Pentax PEF-råbillede - Pentax-PEF-Rohbild - ανεπεξέργαστη εικόνα Pentax PEF - Pentax PEF raw image - imagen en bruto PEF de Pentax - Pentax PEF irudi gordina - Pentax-PEF-raakakuva - Pentax PEF rámynd - image brute PEF Pentax - amhíomhá Pentax PEF - imaxe en bruto PEF de Pentax - תמונה גולמית של Pentax PEF - Pentax PEF nyers kép - Citra mentah Pentax PEF - Immagine raw Pentax PEF - Pentax PEF raw 画像 - Pentax PEF өңделмеген суреті - 펜탁스 PEF 원본 이미지 - Pentax PEF neapdorotas paveikslėlis - Pentax PEF jēlattēls - Pentax PEF raw-bilde - onbewerkt Pentax PEF-beeld - Pentax PEF råbilete - Surowy obraz Pentax PEF - Imagem bruta PEF da Pentax - Imagine brută Pentax PEF - необработанное изображение Pentax PEF - Surový obrázok Pentax PEF - Surova slikovna datoteka Pentax PEF - Figurë raw Pentax PEF - Pentax PEF-råbild - цифровий негатив PEF Pentax - Ảnh thô Pentax PEF - Pentax PEF 原始图像 - Pentax PEF 原生影像 - PEF - Pentax Electronic Format - - - - - - Sigma X3F raw image - صورة Sigma X3F خامة - Suvoraja vyjava Sigma X3F - Изображение — Sigma X3F raw - imatge en cru de Sigma X3F - Surový obrázek Sigma X3F - Sigma X3F-råbillede - Sigma-X3F-Rohbild - ανεπεξέργαστη εικόνα Sigma X3F - Sigma X3F raw image - imagen en bruto X3F de Sigma - Sigma X3F irudi gordina - Sigma-X3F-raakakuva - Sigma X3F rámynd - image brute X3F Sigma - amhíomhá Sigma X3F - imaxe en bruto X3F de Sigma - תמונה גולמית של Sigma X3F - Sigma XF3 nyers kép - Citra mentah Sigma X3F - Immagine raw Sigma X3F - Sigma X3F raw 画像 - Sigma X3F өңделмеген суреті - 시그마 X3F 원본 이미지 - Sigma X3F neapdorotas paveikslėlis - Sigma X3F jēlattēls - Sigma X3F raw-bilde - onbewerkt Sigma X3F-beeld - Sigma X3F råbilete - Surowy obraz X3F Sigma - Imagem bruta X3F da Sigma - Imagine brută Sigma X3F - необработанное изображение Sigma X3F - Surový obrázok Sigma X3F - Surova slikovna datoteka Sigma X3F - Fifurë raw Sigma X3F - Sigma X3F-råbild - цифровий негатив X3F Sigma - Ảnh thô Sigma X3F - Sigma X3F 原始图像 - Sigma X3F 原生影像 - X3F - X3 Foveon - - - - - - - - - - - - Sony SRF raw image - صورة Sony SRF خامة - Suvoraja vyjava Sony SRF - Изображение — Sony SRF raw - imatge en cru de Sony SRF - Surový obrázek Sony SRF - Sony SRF-råbillede - Sony-SRF-Rohbild - ανεπεξέργαστη εικόνα Sony SRF - Sony SRF raw image - imagen en bruto SRF de Sony - Sony SRF irudi gordina - Sony-SRF-raakakuva - Sony SRF rámynd - image brute SRF Sony - amhíomhá Sony SRF - imaxe en bruto SRF de sony - תמונה גולמית של Sony SRF - Sony SRF nyers kép - Citra mentah Sony SRF - Immagine raw Sony SRF - Sony SRF raw 画像 - Sony SRF өңделмеген суреті - 소니 SRF 원본 이미지 - Sony SRF neapdorotas paveikslėlis - Sony SRF jēlattēls - Sony SRF raw-bilde - onbewerkt Sony SRF-beeld - Sony SRF råbilete - Surowy obraz SRF Sony - Imagem bruta SRF da Sony - Imagine brută Sony SRF - необработанное изображение Sony SRF - Surový obrázok Sony SRF - Surova slikovna datoteka Sony SRF - Figurë raw Sony SRF - Sony SRF-råbild - цифровий негатив SRF Sony - Ảnh thô Sony SRF - Sony SRF 原始映像 - Sony SRF 原生影像 - SRF - Sony Raw Format - - - - - - Sony SR2 raw image - صورة Sony SR2 خامة - Suvoraja vyjava Sony SR2 - Изображение — Sony SR2 raw - imatge en cru de Sony SR2 - Surový obrázek Sony SR2 - Sony SR2-råbillede - Sony-SR2-Rohbild - ανεπεξέργαστη εικόνα Sony SR2 - Sony SR2 raw image - imagen en bruto SR2 de Sony - Sony SR2 irudi gordina - Sony-SR2-raakakuva - Sony SR2 rámynd - image brute SR2 Sony - amhíomhá Sony SR2 - imaxe en bruto SR2 de sony - תמונה גולמית של Sony SR2 - Sony SR2 nyers kép - Citra mentah Sony SR2 - Immagine raw Sony SR2 - Sony SR2 raw 画像 - Sony SR2 өңделмеген суреті - 소니 SR2 원본 이미지 - Sony SR2 neapdorotas paveikslėlis - Sony SR2 jēlattēls - Sony SR2 raw-bilde - onbewerkt Sony SR2-beeld - Sony SR2 råbilete - Surowy obraz SR2 Sony - Imagem bruta SR2 da Sony - Imagine brută Sony SR2 - необработанное изображение Sony SR2 - Surový obrázok Sony SR2 - Surova slikovna datoteka Sony SR2 - Figurë raw Sony SR2 - Sony SR2-råbild - цифровий негатив SR2 Sony - Ảnh thô Sony SR2 - Sony SR2 原始映像 - Sony SR2 原生影像 - SR2 - Sony Raw format 2 - - - - - - Sony ARW raw image - صورة Sony ARW خامة - Suvoraja vyjava Sony ARW - Изображение — Sony ARW raw - imatge en cru de Sony ARW - Surový obrázek Sony ARW - Sony ARW-råbillede - Sony-ARW-Rohbild - ανεπεξέργαστη εικόνα Sony ARW - Sony ARW raw image - imagen en bruto ARW de Sony - Sony ARW irudi gordina - Sony-ARW-raakakuva - Sony ARW rámynd - image brute ARW Sony - amhíomhá Sony ARW - imaxe en bruto ARW de sony - תמונה גולמית של Sony ARW - Sony ARW nyers kép - Citra mentah Sony ARW - Immagine raw Sony ARW - Sony ARW raw 画像 - Sony ARW өңделмеген суреті - 소니 ARW 원본 이미지 - Sony ARW neapdorotas paveikslėlis - Sony ARW jēlattēls - Sony ARW raw-bilde - onbewerkt Sony ARW-beeld - Sony ARW råbilete - Surowy obraz ARW Sony - Imagem bruta ARW da Sony - Imagine brută Sony ARW - необработанное изображение Sony ARW - Surový obrázok Sony ARW - Surova slikovna datoteka Sony ARW - Figurë raw Sony ARW - Sony ARW-råbild - цифровий негатив ARW Sony - Ảnh thô Sony ARW - Sony ARW 原始映像 - Sony ARW 原生影像 - ARW - Alpha Raw format - - - - - - PNG image - صورة PNG - PNG rəsmi - Vyjava PNG - Изображение — PNG - imatge PNG - Obrázek PNG - Delwedd PNG - PNG-billede - PNG-Bild - εικόνα PNG - PNG image - PNG-bildo - imagen PNG - PNG irudia - PNG-kuva - PNG mynd - image PNG - íomhá PNG - imaxe PNG - תמונת PNG - PNG-kép - Citra PNG - Immagine PNG - PNG 画像 - PNG суреті - PNG 그림 - PNG paveikslėlis - PNG attēls - Imej PNG - PNG-bilde - PNG-afbeelding - PNG-bilete - Obraz PNG - imagem PNG - Imagem PNG - Imagine PNG - изображение PNG - Obrázok PNG - Slikovna datoteka PNG - Figurë PNG - PNG слика - PNG-bild - зображення PNG - Ảnh PNG - PNG 图像 - PNG 影像 - - - - - - - Apple optimised PNG image - - - - - - - - - Run Length Encoded bitmap image - تشغيل صورة نقطية طولية الترميز - Bitmapnaja vyjava, zakadavanaja ŭ Run Length - Изображение — RLE Bitmap - imatge de mapa de bits «Run Lenght Encoded» - Obrázek bitové mapy Run Length Encoded - Run Length Encoded-bitmapbillede - Lauflängenkodiertes Bitmap-Bild - Run Length Encoded bitmap image - mapa de bits con codificación del tamaño durante la ejecución - 'Run Lenght Encoded' bitmap irudia - RLE-koodattu bittikartta - image matricielle Run Length Encoded - íomhá mhapa giotáin Run Length Encoded - mapa de bits con codificación do tamaño durante a execución - מקודד מפת סיביות של Run Length - Run Length Encoded bitkép - Citra peta bit Run Length Encoded - Immagine bitmap RLE (Run Length Encoded) - ランレングス符号化ビットマップ画像 - RLE сығылған растрлік суреті - RLE 인코딩된 비트맵 그림 - Run Length Encoded rastrinis paveikslėlis - Secīgo atkārtojumu kodēts bitkartes attēls - Run Length Encoded bitmap bilde - RLE-gecodeerde bitmap-afbeelding - Run Length Encoded punktgrafikk - Obraz bitmapy RLE - Classe de comprimento imagem bitmap codificada - Imagine bitmap codată RLE - растровое изображение (сжатое RLE) - Bitmapový obrázok Run Length Encoded - Zaporedno kodirana bitna slika (RLE) - Figurë bitmap RLE (Run Length Encoded) - Körlängdskodad bitmappbild - растрове зображення RLE - Ảnh mảng mã hóa chiều dài chạy (RLE) - 游程编码位图 - Run Length Encoded 點陣影像 - - - - SVG image - صورة SVG - Vyjava SVG - Изображение — SVG - imatge SVG - Obrázek SVG - SVG-billede - SVG-Bild - εικόνα SVG - SVG image - SVG-bildo - imagen SVG - SVG irudia - SVG-kuva - SVG mynd - image SVG - íomhá SVG - imaxe SVG - תמונת SVG - SVG slika - SVG kép - Citra SVG - Immagine SVG - SVG 画像 - SVG суреті - SVG 그림 - SVG paveikslėlis - SVG attēls - SVG-bilde - SVG-afbeelding - SVG-bilete - Obraz SVG - Imagem SVG - Imagine SVG - изображение SVG - Obrázok SVG - Slikovna vektorska datoteka SVG - Figurë SVG - SVG-bild - SVG görüntüsü - зображення SVG - Ảnh SVG - SVG 图像 - SVG 影像 - SVG - Scalable Vector Graphics - - - - - - - - - - compressed SVG image - صورة SVG مضغوطة - skampresavanaja vyjava SVG - Изображение — SVG, компресирано - imatge SVG comprimida - Komprimovaný obrázek SVG - SVG-komprimeret billede - Komprimiertes SVG-Bild - συμπιεσμένη εικόνα SVG - compressed SVG image - imagen SVG comprimida - konprimitutako SVG irudia - pakattu SVG-kuva - stappað SVG mynd - image SVG compressée - íomhá SVG comhbhrúite - imaxe SVG comprimida - תמונת SVG מכוצת - komprimirana SVG slika - tömörített SVG kép - Citra SVG terkompresi - Immagine SVG compressa - 圧縮 SVG 画像 - сығылған SVG суреті - 압축된 SVG 그림 - suglaudintas SVG paveikslėlis - saspiests SVG attēls - komprimert SVG-bilde - ingepakte SVG-afbeelding - komprimert SVG-bilete - Skompresowany obraz SVG - Imagem compactada SVG - imagine comprimată SVG - сжатое изображение SVG - Komprimovaný obrázok SVG - Slikovna datoteka SVG (stisnjena) - Figurë SVG e kompresuar - komprimerad SVG-bild - стиснене зображення SVG - ảnh SVG đã nén - 压缩的 SVG 图像 - 壓縮版 SVG 影像 - SVG - Scalable Vector Graphics - - - - - TIFF image - صورة TIFF - Vyjava TIFF - Изображение — TIFF - imatge TIFF - Obrázek TIFF - TIFF-billede - TIFF-Bild - εικόνα TIFF - TIFF image - TIFF-bildo - imagen TIFF - TIFF irudia - TIFF-kuva - TIFF mynd - image TIFF - íomhá TIFF - imaxe TIFF - תמונת TIFF - TIFF slika - TIFF-kép - Citra TIFF - Immagine TIFF - TIFF 画像 - TIFF суреті - TIFF 그림 - TIFF paveikslėlis - TIFF attēls - Imej TIFF - TIFF-bilde - TIFF-afbeelding - TIFF-bilete - Obraz TIFF - imagem TIFF - Imagem TIFF - Imagine TIFF - изображение TIFF - Obrázok TIFF - Slikovna datoteka TIFF - Figurë TIFF - TIFF слика - TIFF-bild - зображення TIFF - Ảnh TIFF - TIFF 图像 - TIFF 影像 - TIFF - Tagged Image File Format - - - - - - - - - AutoCAD image - صورة AutoCAD - AutoCAD rəsmi - Vyjava AutoCAD - Изображение — AutoCAD - imatge d'AutoCAD - Obrázek AutoCAD - Delwedd AutoCAD - AutoCAD-billede - AutoCAD-Bild - εικόνα AutoCAD - AutoCAD image - AutoCAD-bildo - imagen de AutoCAD - AutoCAD-eko irudia - AutoCAD-kuva - AutoCAD mynd - image AutoCAD - íomhá AutoCAD - imaxe de AutoCAD - תמונה של AutoCAD - AutoCAD slika - AutoCAD-kép - Citra AutoCAD - Immagine AutoCAD - AutoCAD 画像 - AutoCAD-ის გამოსახულება - AutoCAD суреті - AutoCAD 그림 - AutoCAD paveikslėlis - AutoCAD attēls - Imej AutoCAD - AutoCAD-bilde - AutoCAD-afbeelding - AutoCAD-bilete - Obraz AutoCAD - imagem AutoCAD - Imagem do AutoCAD - Imagine AutoCAD - изображение AutoCAD - Obrázok AutoCAD - Slikovna datoteka AutoCAD - Figurë AutoCAD - AutoCAD слика - AutoCAD-bild - AutoCAD görüntüsü - зображення AutoCAD - Ảnh AutoCAD - AutoCAD 图像 - AutoCAD 影像 - - - - DXF vector image - صورة DXF نقطية - Vektarnaja vyjava DXF - Изображение — DXF - imatge vectorial DXF - Vektorový obrázek DXF - DXF-vektorbillede - DXF-Vektorbild - ανυσματική εικόνα DXF - DXF vector image - vektora DXF-bildo - imagen vectorial DXF - DXF bektore-grafikoa - DXF-vektorikuva - DXF vektormynd - image vectorielle DXF - íomhá veicteoir DXF - imaxe de vector DXF - תמונת DXF וקטורית - DXF vektorska slika - DXF-vektorkép - Citra vektor DXF - Immagine vettoriale DXF - DXF ベクター画像 - DXF ვექტორული გამოსახულება - DXF векторлық суреті - DXF 벡터 그림 - DXF vektorinis paveikslėlis - DXF vektora attēls - Imej vektor DXF - DXF-vektorgrafikk - DXF-vectorafbeelding - DXF-vektorgrafikk - Obraz wektorowy DXF - imagem de vectores DXF - Imagem vetorial DXF - Imagine vectorială DXF - векторное изображение DXF - Vektorový obrázok DXF - Slikovna vektorska datoteka DXF - Figurë vektoriale DFX - DXF векторска графика - DXF-vektorbild - векторне зображення DXF - Ảnh véc-tơ DXF - DXF 矢量图像 - DXF 向量圖 - - - - - - - - Microsoft Document Imaging format - صيغة مستند تصوير مايكروسوفت - Изображение — Microsoft Document Imaging - format Microsoft Document Imaging - Formát Microsoft Document Imaging - Microsofts dokumentbilledformat - Microsoft-Document-Imaging-Bildformat - μορφή Microsoft Document Imaging - Microsoft Document Imaging format - formato de imagen de Microsoft Document - Microsoft Document Imaging formatua - Microsoft Document Imaging -muoto - Microsoft Document Imaging snið - format Document Imaging Microsoft - formáid Microsoft Document Imaging - formato de Microsoft Document Imaging - פורמט של Microsoft Document Imaging - Microsoft Document Imaging formátum - Format Microsoft Document Imaging - Formato MDI (Microsoft Document Imaging) - Microsoft ドキュメントイメージフォーマット - Microsoft Document Imaging пішімі - 마이크로소프트 문서 이미지 형식 - Microsoft Document Imaging formatas - Microsoft dokumentu attēlošanas formāts - Microsoft Document Imaging - Format Microsoft Document Imaging - Formato do Microsoft Document Imaging - Format Microsoft Document Imaging - формат Microsoft Document Imaging - Formát Microsoft Document Imaging - Zapis Microsoft Document Imaging - Microsoft Document Imaging-format - формат Microsoft Document Imaging - Định dạng tạo ảnh tài liệu Microsoft - Microsoft Document Imaging 扫描图像 - 微軟文件影像格式 - MDI - Microsoft Document Imaging - - - - - - - 3D Studio image - صورة استديو ثلاثية الأبعاد - 3D Studio rəsmi - Vyjava 3D Studio - Изображение — 3D Studio - imatge de 3D Studio - Obrázek 3D Studio - Delwedd "3D Studio" - 3D Studio-billede - 3D-Studio-Bild - εικόνα 3D Studio - 3D Studio image - bildo de 3D Studio - imagen de 3D Studio - 3D Studio-ko irudia - 3D Studio -kuva - 3D Studio mynd - image 3D Studio - íomhá 3D Studio - imaxe de 3D Studio - תמונת 3D Studio - 3D Studio slika - 3D Studio-kép - Citra 3D Studio - Immagine 3D Studio - 3D Studio 画像 - 3D Studio-ის გამოსახულება - 3D Studio суреті - 3D Studio 그림 - 3D Studio paveikslėlis - 3D Studio attēls - Imej 3D Studio - 3D Studio-bilde - 3D-Studio-afbeelding - 3D Studio-bilete - Obraz 3D Studio - imagem 3D Studio - Imagem do 3D Studio - Imagine 3D Studio - сцена 3D Studio - Obrázok 3D Studio - Slikovna datoteka 3D Studio - Figurë 3D Studio - 3D Studio слика - 3D Studio-bild - 3D Studio görüntüsü - зображення 3D Studio - Ảnh xuởng vẽ 3D - 3D Studio 图像 - 3D Studio 影像 - - - - Applix Graphics image - صورة رسوميات Applix - Vyjava Applix Graphics - Изображение — Applix Graphics - imatge d'Applix Graphics - Obrázek Applix Graphics - Applix Graphics-billede - Applix-Graphics-Bild - εικόνα Applix Graphics - Applix Graphics image - bildo de Applix Graphics - imagen de Applix Graphics - Applix Graphics irudia - Applix Graphics -kuva - Applix Graphics mynd - image Applix Graphics - íomhá Applix Graphics - imaxe de Applix Graphics - תמונה של Applix Graphics - Applix Graphics slika - Applix Graphics-kép - Citra Applix Graphics - Immagine Applix Graphics - Applix Graphics 画像 - Applix Graphics-ის გამოსახულება - Applix Graphics суреті - Applix Graphics 그림 - Applix Graphics paveikslėlis - Applix Graphics attēls - Imej Applix Graphics - Applix Graphics-dokument - Applix Graphics-afbeelding - Applix Graphics-dokument - Obraz Applix Graphics - imagem Applix Graphics - Imagem do Applix Graphics - Imagine Applix Graphics - изображение Applix Graphics - Obrázok Applix Graphics - Slikovna datoteka Applix Graphics - Figurë Applix Graphics - Applix графички документ - Applix Graphics-bild - зображення Applix Graphics - Ảnh Applix Graphics - Applix Graphics 图像 - Applix Graphics 影像 - - - - - - - - - EPS image (bzip-compressed) - صورة EPS (مضغوط-bzip) - Vyjava EPS (bzip-skampresavanaja) - Изображение — EPS, компресирано с bzip - imatge EPS (comprimida amb bzip) - Obrázek EPS (komprimovaný pomocí bzip) - EPS-billede (bzip-komprimeret) - EPS-Bild (bzip-komprimiert) - EPS image (bzip-compressed) - imagen EPS (comprimida con bzip) - EPS irudia (bzip-ekin konprimitua) - EPS-kuva (bzip-pakattu) - EPS mynd (bzip-stappað) - image EPS (compressée bzip) - íomhá EPS (comhbhrúite le bzip) - imaxe EPS (comprimida con bzip) - תמונת EPS (מכווץ בbzip) - EPS slika (komprimirana bzip-om) - EPS kép (bzip-tömörítésű) - Citra EPS (terkompresi bzip) - Immagine EPS (compressa con bzip) - EPS 画像 (bzip 圧縮) - EPS გამოსახულება (bzip-ით შეკუმშული) - EPS суреті (bzip-пен сығылған) - EPS 그림 (BZIP 압축) - EPS paveikslėlis (suglaudintas su bzip) - EPS attēls (saspiests ar bzip) - EPS-bilde (bzip-komprimert) - EPS-afbeelding (ingepakt met bzip) - EPS-bilete (pakka med bzip) - Obraz EPS (kompresja bzip) - Imagem EPS (compactada com bzip) - Imagine EPS (compresie bzip) - изображение EPS (сжатое bzip) - Obrázok EPS (komprimovaný pomocou bzip) - Slikovna datoteka EPS (stisnjena z bzip) - Figurë EPS (e kompresuar me bzip) - EPS-bild (bzip-komprimerad) - EPS görüntüsü (bzip ile sıkıştırılmış) - зображення EPS (стиснене bzip) - Ảnh EPS (đã nén bzip) - EPS 图像(bzip 压缩) - EPS 影像 (bzip 格式壓縮) - - - - - - - CMU raster image - صورة CMU نقطية - CMU raster rəsmi - Rastravaja vyjava CMU - Изображение — CMU raster - imatge ràster CMU - Rastrový obrázek CMU - Delwedd raster CMU - CMU-rasterbillede - CMU-Rasterbild - εικόνα ράστερ CMU - CMU raster image - rastruma bildo de CMU - imagen ráster CMU - CMU bilbe-irudia - CMU-rasterikuva - CMU raster mynd - image raster CMU - íomhá rastar CMU - imaxe raster CMU - תמונת סריקה CMU - CMU-raszterkép - Citra raster CMU - Immagine raster CMU - CMU ラスター画像 - CMU-ის რასტრული გამოსახულება - CMU растрлық суреті - CMU 래스터 그림 - CMU rastrinis paveikslėlis - CMU rastra attēls - Imej raster CMU - CMU-rasterbilde - CMU-rasterafbeelding - CMU rasterbilete - Obraz rastrowy CMU - imagem rasterizada CMU - Imagem raster CMU - Imagine raster CMU - растровое изображение CMU - Rastrový obrázok CMU - Slikovna rastrska datoteka CMU - Figurë raster CMU - CMU растерска слика - CMU-rasterbild - растрове зображення CMU - Ảnh mành CMU - CMU 矢量图像 - CMU raster 影像 - - - - compressed GIMP image - صورة GIMP مضغوطة - skampresavanaja vyjava GIMP - Изображение — GIMP, компресирано - imatge GIMP comprimida - Komprimovaný obrázek GIMP - komprimeret GIMP-billede - Komprimiertes GIMP-Bild - συμπιεσμένη εικόνα GIMP - compressed GIMP image - imagen GIMP comprimida - konprimitutako GIMP irudia - pakattu GIMP-kuva - stappað GIMP mynd - image GIMP compressée - íomhá GIMP comhbhrúite - imaxe de GIMP comprimida - תמונת GIMP מכווצת - tömörített GIMP kép - Citra GIMP terkompresi - Immagine GIMP compressa - 圧縮 GIMP 画像 - сығылған GIMP суреті - 압축된 GIMP 그림 - suglaudintas GIMP paveikslėlis - saspiests GIMP attēls - komprimert GIMP-bilde - ingepakte GIMP-afbeelding - komprimert GIMP-bilete - Skompresowany obraz GIMP - Imagem compactada do GIMP - imagine comprimată GIMP - сжатое изображение GIMP - Komprimovaný obrázok GIMP - Slikovna datoteka GIMP (stisnjena) - Figurë GIMP e kompresuar - komprimerad GIMP-bild - стиснене зображення GIMP - ảnh GIMP đã nén - 压缩的 GIMP 图像 - 壓縮版 GIMP 影像 - - - - - DICOM image - صورة DICOM - Vyjava DICOM - Изображение — DICOM - imatge DICOM - Obrázek DICOM - DICOM-billede - DICOM-Bild - εικόνα DICOM - DICOM image - DICOM-bildo - imagen DICOM - DICOM irudia - DICOM-kuva - DICOM mynd - image DICOM - íomhá DICOM - imaxe DICOM - תמונת DICOM - DICOM slika - DICOM kép - Citra DICOM - Immagine DICOM - DICOM 画像 - DICOM გამოსახულება - DICOM суреті - DICOM 그림 - DICOM paveikslėlis - DICOM attēls - DICOM-bilde - DICOM-afbeelding - DICOM-bilete - Obraz DICOM - Imagem DICOM - Imagine DICOM - изображение DICOM - Obrázok DICOM - Slikovna datoteka DICOM - Figurë DICOM - DICOM-bild - DICOM görüntüsü - зображення DICOM - Ảnh DICOM - DICOM 图像 - DICOM 影像 - DICOM - Digital Imaging and Communications in Medicine - - - - - - - - - DocBook document - مستند DocBook - Dakument DocBook - Документ — DocBook - document DocBook - Dokument DocBook - DocBook-dokument - DocBook-Dokument - έγγραφο DocBook - DocBook document - DocBook-dokumento - documento DocBook - DocBook dokumentua - DocBook-asiakirja - DocBook skjal - document DocBook - cáipéis DocBook - documento de DocBook - מסמך DocBook - DocBook dokument - DocBook dokumentum - Dokumen DocBook - Documento DocBook - DocBook ドキュメント - DocBook-ის დოკუმენტი - DocBook құжаты - DocBook 문서 - DocBook dokumentas - DocBook dokuments - DocBook-dokument - DocBook-document - DocBook-dokument - Dokument DocBook - Documento DocBook - Document DocBook - документ DocBook - Dokument DocBook - Dokument DocBook - Dokument DocBook - DocBook-dokument - DocBook belgesi - документ DocBook - Tài liệu DocBook - DocBook 文档 - DocBook 文件 - - - - - - - - - - - - - - DIB image - صورة DIB - Vyjava DIB - Изображение — DIB - imatge DIB - Obrázek DIB - DIB-billede - DIB-Bild - εικόνα DIB - DIB image - DIB-bildo - imagen DIB - DIB irudia - DIB-kuva - DIB mynd - image DIB - íomhá DIB - imaxe DIB - תמונת DIB - DIB slika - DIB kép - Citra DIB - Immagine DIB - DIB 画像 - DIB გამოსახულება - DIB суреті - DIB 그림 - DIB paveikslėlis - DIB attēls - DIB-bilde - DIB-afbeelding - DIB-bilete - Obraz DIB - Imagem DIB - Imagine DIB - изображение DIB - Obrázok DIB - Slikovna datoteka DIB - Figurë DIB - DIB-bild - DIB görüntüsü - зображення DIB - Ảnh DIB - DIB 图像 - DIB 影像 - DIB - Device Independent Bitmap - - - - - - DjVu image - صورة DjVu - Vyjava DjVu - Изображение — DjVu - imatge DjVu - Obrázek DjVu - DjVu-billede - DjVu-Bild - εικόνα DjVu - DjVu image - DjVu-bildo - imagen DjVu - DjVU-ko irudia - DjVu-kuva - DjVu mynd - image DjVu - íomhá DjVu - imaxe de DjVu - תמונת DjVu - DjVu slika - DjVu-kép - Citra DjVu - Immagine DjVu - DjVu 画像 - DjVu გამოსახულება - DjVu суреті - DjVu 그림 - DjVu paveikslėlis - DjVu attēls - Imej DjVu - DjVu-bilde - DjVu-afbeelding - DjVu-bilete - Obraz DjVu - imagem DjVu - Imagem DjVu - Imagine DjVu - изображение DjVu - Obrázok DjVu - Slikovna datoteka DjVu - Figurë DjVu - DjVu слика - DjVu-bild - DjVu görüntüsü - зображення DjVu - Ảnh DjVu - DjVu 图像 - DjVu 影像 - - - - - - - - - - - - - - - - - DPX image - صورة DPX - Vyjava DPX - Изображение — DPX - imatge DPX - Obrázek DPX - DPX-billede - DPX-Bild - εικόνα DPX - DPX image - DPX-bildo - imagen DPX - DPX irudia - DPX-kuva - DPX mynd - image DPX - íomhá DPX - imaxe DPX - תמונת DPX - DPX slika - DPX kép - Citra DPX - Immagine DPX - DPX 画像 - DPX გამოსახულება - DPX суреті - DPX 그림 - DPX paveikslėlis - DPX attēls - DPX-bilde - DPX-afbeelding - DPX-bilete - Obraz DPX - Imagem DPX - Imagine DPX - изображение DPX - Obrázok DPX - Slikovna datoteka DPX - Figurë DPX - DPX-bild - DPX görüntüsü - зображення DPX - Ảnh DPX - DPX 图像 - DPX 影像 - DPX - Digital Moving Picture Exchange - - - - - - EPS image - صورة EPS - Vyjava EPS - Изображение — EPS - imatge EPS - Obrázek EPS - EPS-billede - EPS-Bild - εικόνα EPS - EPS image - EPS-bildo - imagen EPS - EPS irudia - EPS-kuva - EPS mynd - image EPS - íomhá EPS - imaxe EPS - תמונת EPS - EPS slika - EPS kép - Citra EPS - Immagine EPS - EPS 画像 - EPS გამოსახულება - EPS суреті - EPS 그림 - EPS paveikslėlis - EPS attēls - EPS-bilde - EPS-afbeelding - EPS-bilete - Obraz EPS - Imagem EPS - Imagine EPS - изображение EPS - Obrázok EPS - Slikovna datoteka EPS - Figurë EPS - EPS-bild - EPS görüntüsü - зображення EPS - Ảnh EPS - EPS 图像 - EPS 影像 - EPS - Encapsulated PostScript - - - - - - - - - - - - - - - - FITS document - مستند FITS - Dakument FITS - Документ — FITS - document FITS - Dokument FITS - FITS-dokument - FITS-Dokument - έγγραφο FITS - FITS document - FITS-dokumento - documento FITS - FITS dokumentua - FITS-asiakirja - FITS skjal - document FITS - cáipéis FITS - documento FICT - מסמך FITS - FITS dokument - FITS dokumentum - Dokumen FITS - Documento FITS - FITS ドキュメント - FITS დოკუმენტი - FITS құжаты - FITS 문서 - FITS dokumentas - FITS dokuments - FITS-dokument - FITS-document - FITS-dokument - Dokument FITS - Documento FITS - Document FITS - документ FITS - Dokument FITS - Dokument FITS - Dokument FITS - FITS-dokument - документ FITS - Tài liệu FITS - FITS 文档 - FITS 文件 - FITS - Flexible Image Transport System - - - - - - - - FPX image - صورة FPX - Vyjava FPX - Изображение — FPX - imatge FPX - Obrázek FPX - FPX-billede - FPX-Bild - εικόνα FPX - FPX image - FPX-bildo - imagen FPX - FPX irudia - FPX-kuva - FPX mynd - image FPX - íomhá FPX - imaxe FPX - תמונת FPX - FPX slika - FPX kép - Citra FPX - Immagine FPX - FPX 画像 - FPX გამოსახულება - FPX суреті - FPX 그림 - FPX paveikslėlis - FPX attēls - FPX-bilde - FPX-afbeelding - FPX-bilete - Obraz FPX - Imagem FPX - Imagine FPX - изображение FPX - Obrázok FPX - Slikovna datoteka FPX - Figurë FPX - FPX-bild - FPX görüntüsü - зображення FPX - Ảnh FPX - FPX 图像 - FPX 影像 - FPX - FlashPiX - - - - - - EPS image (gzip-compressed) - صورة EPS (مضغوط-gzip) - Vyjava EPS (gzip-skampresavanaja) - Изображение — EPS, компресирано с gzip - imatge EPS (comprimida amb gzip) - Obrázek EPS (komprimovaný pomocí gzip) - EPS-billede (gzip-komprimeret) - EPS-Bild (gzip-komprimiert) - EPS image (gzip-compressed) - imagen EPS (comprimida con gzip) - EPS irudia (gzip-ekin konprimitua) - EPS-kuva (gzip-pakattu) - EPS mynd (gzip-stappað) - image EPS (compressée gzip) - íomhá EPS (comhbhrúite le gzip) - imaxe EPS (comprimida con gzip) - תמונת EPS (מכווץ בgzip) - EPS slika (komprimirana gzip-om) - EPS kép (gzip-tömörítésű) - Citra EPS (terkompresi gzip) - Immagine EPS (compressa con gzip) - EPS 画像 (gzip 圧縮) - EPS გამოსახულება (gzip-ით შეკუმშული) - EPS суреті (gzip-пен сығылған) - EPS 그림 (GZIP 압축) - EPS paveikslėlis (suglaudintas su gzip) - EPS attēls (saspiests ar gzip) - EPS-bilde (gzip-komprimert) - EPS-afbeelding (ingepakt met gzip) - EPS-bilete (pakka med gzip) - Obraz EPS (kompresja gzip) - Imagem EPS (compactada com gzip) - Imagine EPS (compresie gzip) - изображение EPS (сжатое gzip) - Obrázok EPS (komprimovaný pomocou gzip) - Slikovna datoteka EPS (stisnjena z gzip) - Figurë EPS (e kompresuar me gzip) - EPS-bild (gzip-komprimerad) - EPS görüntüsü (gzip ile sıkıştırılmış) - зображення EPS (стиснене gzip) - Ảnh EPS (đã nén gzip) - EPS 图像(gzip 压缩) - EPS 影像 (gzip 格式壓縮) - - - - - - - Microsoft icon - أيقونة مايكروسوفت - Икона — Microsoft - icona de Microsoft - Ikona Microsoft - Microsoftikon - Microsoft-Symbol - εικονίδιο Microsoft - Microsoft icon - Microsoft-piktogramo - icono de Microsoft - Microsoft ikonoa - Microsoft-kuvake - Microsoft ímynd - icône Microsoft - deilbhín Microsoft - Icona de microsoft - אייקון של Microsofr - Microsoft ikona - Microsoft ikon - Ikon Microsoft - Icona Microsoft - Microsoft アイコン - Microsoft-ის ხატულა - Microsoft таңбашасы - 마이크로소프트 아이콘 - Microsoft piktograma - Microsoft ikona - Microsoft pictogram - Ikona Microsoft - Ícone da Microsoft - Iconiță Microsoft - значок Microsoft - Ikona Microsoft - Datoteka ikone Microsoft Windows - Microsoft-ikon - піктограма Microsoft - Biểu tượng Microsoft - Microsoft 图标 - 微軟圖示 - - - - - - - - - - - - - - - MacOS X icon - أيقونة MacOS X - Ikona MacOS X - Икона — MacOS X - icona MacOS X - Ikona MacOS X - MacOS X-ikon - MacOS-X-Symbol - εικονίδιο MacOS X - MacOS X icon - MacOS-X-piktogramo - icono de MacOS X - MacOS X ikonoa - MacOS X -kuvake - MacOS X ímynd - icône MacOS X - deilbhín MacOS X - Icona de MacOS X - אייקון של MacOS X - MacOS X ikona - MacOS X ikon - Ikon MacOS X - Icona MacOS X - MacOS X アイコン - MacOS X-ის ხატულა - MacOS X таңбашасы - MacOS X 아이콘 - MacOS X piktograma - MacOS X ikona - MacOS X-ikon - MacOS-X-pictogram - MacOS X-ikon - Ikona Mac OS X - Ícone do MacOS X - Iconiță MacOS X - значок MacOS X - Ikona MacOS X - Datoteka ikone MacOS X - Ikonë MacOS X - MacOS X-ikon - піктограма MacOS X - Biểu tượng MacOS X - MacOS X 图标 - MacOS X 圖示 - - - - - - - ILBM image - صورة ILBM - ILBM rəsmi - Vyjava ILBM - Изображение — ILBM - imatge ILBM - Obrázek ILMB - Delwedd ILBM - ILBM-billede - ILBM-Bild - εικόνα ILBM - ILBM image - ILBM-bildo - imagen ILBM - ILBM irudia - ILBM-kuva - ILBM mynd - image ILBM - íomhá ILBM - imaxe ILBM - תמונת ILBM - ILBM slika - ILBM-kép - Citra ILBM - Immagine ILBM - ILBM 画像 - ILBM суреті - ILBM 그림 - ILBM paveikslėlis - ILBM attēls - Imej ILBM - ILBM-bilde - ILBM-afbeelding - ILMB-bilete - Obraz ILBM - imagem ILBM - Imagem ILBM - Imagine ILBM - изображение ILBM - Obrázok ILMB - Slikovna datoteka ILBM - Figurë ILBM - ILBM слика - ILBM-bild - зображення ILBM - Ảnh ILBM - ILBM 图像 - ILBM 影像 - ILBM - InterLeaved BitMap - - - - - - - - - - - - JNG image - صورة JNG - JNG rəsmi - Vyjava JNG - Изображение — JNG - imatge JNG - Obrázek JNG - Delwedd JNG - JNG-billede - JNG-Bild - εικόνα JNG - JNG image - JNG-bildo - imagen JNG - JNG irudia - JNG-kuva - JNG mynd - image JNG - íomhá JNG - imaxe JNG - תמונת JNG - JNG slika - JNG-kép - Citra JNG - Immagine JNG - JNG 画像 - JNG суреті - JNG 그림 - JNG paveikslėlis - JNG attēls - Imej PNG - JNG-bilde - JNG-afbeelding - JNG-bilete - Obraz JNG - imagem JNG - Imagem JNG - Imagine JNG - изображение JNG - Obrázok JNG - Slikovna datoteka JNG - Figurë JNG - JNG слика - JNG-bild - JNG görüntüsü - зображення JNG - Ảnh JNG - JNG 图像 - JNG 影像 - JNG - JPEG Network Graphics - - - - LightWave object - كائن LightWave - LightWave cismi - Abjekt LightWave - Обект — LightWave - objecte de LightWave - Objekt LightWave - Gwrthrych LightWave - LightWave-objekt - LightWave-Objekt - αντικείμενο LightWave - LightWave object - LightWave-objekto - objeto LightWave - LightWave objektua - LightWave-esine - LightWave lutur - objet LightWave - réad LightWave - obxecto de LightWave - עצם LightWave - LightWave objekt - LightWave-objektum - Proyek LightWave - Oggetto LightWave - LightWave オブジェクト - LightWave объекті - LightWave 개체 - LightWave objektas - LightWave objekts - Objek LightWave - LightWave-objekt - LightWave-object - LightWave-objekt - Obiekt LightWave - Objecto LightWave - Objeto LightWave - Obiect LightWave - объект LightWave - Objekt LightWave - Datoteka predmeta LightWave - Objekt LightWave - LightWave објекат - LightWave-objekt - LightWave nesnesi - об'єкт LightWave - Đối tượng LightWave - LightWave 对象 - LightWave 物件 - - - - - LightWave scene - مشهد LightWave - LightWave səhnəsi - Scena LightWave - Сцена — LightWave - escena de LightWave - Scéna LightWave - Golygfa LightWave - LightWave-scene - LightWave-Szene - σκηνή LightWave - LightWave scene - LightWave-sceno - escena LightWave - LightWave eszena - LightWave-maisema - LightWave leikmynd - scène LightWave - radharc LightWave - escena de LightWave - סצנה של LightWave - LightWave scena - LightWave-jelenet - Scene LightWave - Scena LightWave - LightWave シーン - LightWave сахнасы - LightWave 장면 - LightWave scena - LightWave aina - Babak LightWave - LightWave-scene - LightWave-scène - LightWave-scene - Scena Lightwave - cenário LightWave - Cena LightWave - Scenă LightWave - сцена LightWave - Scéna LightWave - Datoteka scene LightWave - Skenë LightWave - LightWave сцена - LightWave-scen - сцена LightWave - Cảnh LightWave - LightWave 场景 - LightWave 場景 - - - - MacPaint Bitmap image - صورة MacPaint Bitmap - Bitmapnaja vyjava MacPaint - Изображение — MacPaint Bitmap - imatge de mapa de bits MacPaint - Obrázek MacPaint Bitmap - MacPaint BitMap-billede - MacPaint-Bitmap-Datei - εικόνα Bitmap MacPaint - MacPaint Bitmap image - imagen en mapa de bits de MacPaint - MacPaint Bitmap irudia - MacPaint-bittikartta - MacPaint Bitmap mynd - image matricielle MacPaint - íomhá MacPaint Bitmap - imaxe de mapa de bits MacPaint - תמונת מפת-סיביות של MacPaint - MacPaint bitkép - Citra MacPaint Bitmap - Immagine Bitmap MacPaint - MacPaint ビットマップ画像 - MacPaint растрлық суреті - MacPaint 비트맵 그림 - MacPaint rastrinis paveikslėlis - MacPaint bitkartes attēls - MacPaint Bitmap-bilde - MacPaint-bitmap-afbeelding - MacPaint punktbilete - Obraz bitmapowy MacPaint - Imagem de bitmap do MacPaint - Imagine MacPaint Bitmap - растровое изображение MacPaint - Obrázok MacPaint Bitmap - Slikovna bitna datoteka MacPaint - Figurë BitMap MacPaint - MacPaint Bitmap-bild - растрове зображення MacPaint - Ảnh mảng MacPaint - MacPaint 位图 - MacPaint 點陣影像 - - - - Office drawing - تصميم أوفيس - Ofisny rysunak - Чертеж — Office - dibuix d'Office - Kresba Office - Officetegning - Office-Zeichnung - σχέδιο Office - Office drawing - dibujo de Office - Office marrazkia - Office-piirros - Office tekning - dessin Office - líníocht Office - debuxo de Office - ציור של Office - Office rajz - Gambar Office - Disegno Office - Office ドロー - Office суреті - 오피스 드로잉 - Office piešinys - Office zīmējums - Office-tegning - Office-tekening - Office-teikning - Rysunek Office - Desenho do Office - Desen Office - изображение Office - Kresba Office - Datoteka risbe Office - Vizatim Office - Office-teckning - малюнок Office - Bản vẽ Office - Microsoft Office 绘图 - Office 繪圖 - - - - NIFF image - صورة NIFF - Vyjava NIFF - Изображение — NIFF - imatge NIFF - Obrázek NIFF - NIFF-billede - NIFF-Bild - εικόνα NIFF - NIFF image - NIFF-bildo - imagen NIFF - NIFF irudia - NIFF-kuva - NIFF mynd - image NIFF - íomhá NIFF - imaxe NIFF - תמונת NIFF - NIFF slika - NIFF kép - Citra NIFF - Immagine NIFF - NIFF 画像 - NIFF суреті - NIFF 그림 - NIFF paveikslėlis - NIFF attēls - NIFF-bilde - NIFF-afbeelding - NIFF-bilete - Obraz NIFF - Imagem NIFF - Imagine NIF - изображение NIFF - Obrázok NIFF - Slikovna datoteka NIFF - Figurë NIFF - NIFF-bild - NIFF görüntüsü - зображення NIFF - Ảnh NIFF - NIFF 图像 - NIFF 影像 - - - - - - PCX image - صورة PCX - Vyjava PCX - Изображение — PCX - imatge PCX - Obrázek PCX - PCX-billede - PCX-Bild - εικόνα PCX - PCX image - PCX-bildo - imagen PCX - PCX irudia - PCX-kuva - PCX mynd - image PCX - íomhá PCX - imaxe PCX - תמונת PCX - PCX kép - Citra PCX - Immagine PCX - PCX 画像 - PCX суреті - PCX 그림 - PCX paveikslėlis - PCX attēls - PCX-bilde - PCX-afbeelding - PCX-bilete - Obraz PCX - Imagem PCX - Imagine PCX - изображение PCX - Obrázok PCX - Slikovna datoteka PCX - Figurë PCX - PCX-bild - PCX görüntüsü - зображення PCX - Ảnh PCX - PCX 图像 - PCX 影像 - PCX - PiCture eXchange - - - - - - - - - - - - PCD image - صورة PCD - Vyjava PCD - Изображение — PCD - imatge PCD - Obrázek PCD - PCD-billede - PCD-Bild - εικόνα PCD - PCD image - PCD-bildo - imagen PCD - PCD irudia - PCD-kuva - PCD mynd - image PCD - íomhá PCD - imaxe PCD - תמונת PCD - PCD kép - Citra PCD - Immagine PCD - PCD 画像 - PCD გამოსახულება - PCD суреті - PCD 그림 - PCD paveikslėlis - PCD attēls - PCD-bilde - PCD-afbeelding - PCD-bilete - Obraz PCD - Imagem PCD - Imagine PCD - изображение PCD - Obrázok PCD - Slikovna datoteka PCD - Figurë PCD - PCD-bild - PCD görüntüsü - зображення PCD - Ảnh PCD - PCD 图像 - PCD 影像 - PCD - PhotoCD - - - - PNM image - صورة PNM - PNM rəsmi - Vyjava PNM - Изображение — PNM - imatge PNM - Obrázek PNM - Delwedd PNM - PNM-billede - PNM-Bild - εικόνα PNM - PNM image - PNM-bildo - imagen PNM - PNM irudia - PNM-kuva - PNM mynd - image PNM - íomhá PNM - imaxe PNM - תמונת PNM - PNM-kép - Citra PNM - Immagine PNM - PNM 画像 - PNM суреті - PNM 그림 - PNM paveikslėlis - PNM attēls - Imej PNM - PNM-bilde - PNM-afbeelding - PNM-bilete - Obraz PNM - imagem PNM - Imagem PNM - Imagine PNM - изображение PNM - Obrázok PNM - Slikovna datoteka PNM - Figurë PNM - PNM слика - PNM-bild - PNM görüntüsü - зображення PNM - Ảnh PNM - PNM 图像 - PNM 影像 - - - - PBM image - صورة PBM - Vyjava PBM - Изображение — PBM - imatge PBM - Obrázek PBM - Delwedd PBM - PBM-billede - PBM-Bild - εικόνα PBM - PBM image - PBM-bildo - imagen PBM - PBM irudia - PBM-kuva - PBM mynd - image PBM - íomhá PBM - imaxe PBM - תמונת PBM - PBM kép - Citra PBM - Immagine PBM - PBM 画像 - PBM გამოსახულება - PBM суреті - PBM 그림 - PBM paveikslėlis - PBM attēls - PBM-bilde - PBM-afbeelding - PBM-bilete - Obraz PBM - Imagem PBM - Imagine PBM - изображение PBM - Obrázok PBM - Slikovna datoteka PBM - Figurë PBM - PBM слика - PBM-bild - PBM görüntüsü - зображення PBM - Ảnh PBM - PBM 图像 - PBM 影像 - PBM - Portable BitMap - - - - - - - - - - - - - - - - - - - PGM image - صورة PGM - Vyjava PGM - Изображение — PGM - imatge PGM - Obrázek PGM - Delwedd PGM - PGM-billede - PGM-Bild - εικόνα PGM - PGM image - PGM-bildo - imagen PGM - PGM irudia - PGM-kuva - PGM mynd - image PGM - íomhá PGM - imaxe PGM - תמונת PGM - PGM kép - Citra PGM - Immagine PGM - PGM 画像 - PGM суреті - PGM 그림 - PGM paveikslėlis - PGM attēls - PGM-bilde - PGM-afbeelding - PGM-bilete - Obraz PGM - Imagem PGM - Imagine PGM - изображение PGM - Obrázok PGM - Slikovna datoteka PGM - Figurë PGM - PGM-bild - PGM görüntüsü - зображення PGM - Ảnh PGM - PGM 图像 - PGM 影像 - PGM - Portable GrayMap - - - - - - - - - - - - - - - - - - - PPM image - صورة PPM - Vyjava PPM - Изображение — PPM - imatge PPM - Obrázek PPM - Delwedd PPM - PPM-billede - PPM-Bild - εικόνα PPM - PPM image - PPM-bildo - imagen PPM - PPM irudia - PPM-kuva - PPM mynd - image PPM - íomhá PPM - imaxe PPM - תמונת PPM - PPM kép - Citra PPM - Immagine PPM - PPM 画像 - PPM суреті - PPM 그림 - PPM paveikslėlis - PPM attēls - PPM-bilde - PPM-afbeelding - PPM-bilete - Obraz PPM - Imagem PPM - Imagine PPM - изображение PPM - Obrázok PPM - Slikovna datoteka PPM - Figurë PPM - PPM слика - PPM-bild - PPM görüntüsü - зображення PPM - Ảnh PPM - PPM 图像 - PPM 影像 - PPM - Portable PixMap - - - - - - - - - - - - - - - - - - - Photoshop image - صورة فوتوشوب - Изображение — Photoshop - imatge de Photoshop - Obrázek Photoshop - Photoshop-billede - Photoshop-Bild - εικόνα Photoshop - Photoshop image - Photoshop-bildo - imagen de Photoshop - Photoshop irudia - Photoshop-kuva - Photoshop mynd - image Photoshop - íomhá Photoshop - imaxe de Photoshop - תמונת Photoshop - Photoshop-kép - Citra Photoshop - Immagine Photoshop - Photoshop 画像 - изображение Photoshop - 포토샵 이미지 - Photoshop paveikslėlis - Photoshop attēls - Imej Photoshop - Photoshop-afbeelding - Obraz Photoshop - imagem do Photoshop - Imagem do Photoshop - Imagine Photoshop - изображение Photoshop - Obrázok Photoshop - Slikovna datoteka Photoshop - Фотошоп слика - Photoshop-bild - Photoshop görüntüsü - зображення Photoshop - Ảnh Photoshop - Photoshop 图像 - Photoshop 影像 - - - - - - - - - - - - - RGB image - صورة RGB - RGB rəsmi - Vyjava RGB - Изображение — RGB - imatge RGB - Obrázek RGB - Delwedd RGB - RGB-billede - RGB-Bild - εικόνα RGB - RGB image - RGB-bildo - imagen RGB - RGB irudia - RGB-kuva - RGB mynd - image RGB - íomhá RGB - imaxe RGB - תמונת RGB - RGB slika - RGB-kép - Citra RGB - Immagine RGB - RGB 画像 - RGB суреті - RGB 그림 - RGB paveikslėlis - RGB attēls - Imej RGB - RGB-bilde - RGB-afbeelding - RGB-bilete - Obraz RGB - imagem RGB - Imagem RGB - Imagine RGB - изображение RGB - Obrázok RGB - Slikovna datoteka RGB - Figurë RGB - RGB слика - RGB-bild - зображення RGB - Ảnh kiểu RGB - RGB 图像 - RGB 影像 - - - - SGI image - صورة SGI - Vyjava SGI - Изображение — SGI - imatge SGI - Obrázek SGI - SGI-billede - SGI-Bild - εικόνα SGI - SGI image - SGI-bildo - imagen SGI - SGI irudia - SGI-kuva - SGI mynd - image SGI - íomhá SGI - imaxe SGI - תמונת SGI - SGI slika - SGI kép - Citra SGI - Immagine SGI - SGI 画像 - SGI суреті - SGI 그림 - SGI paveikslėlis - SGI attēls - SGI-bilde - SGI-afbeelding - SGI-bilete - Obraz SGI - Imagem SGI - Imagine SGI - изображение SGI - Obrázok SGI - Slikovna datoteka SGI - Figurë SGI - SGI-bild - SGI görüntüsü - зображення SGI - Ảnh SGI - SGI 图像 - SGI 影像 - - - - Sun raster image - صورة Sun raster - Rastravaja vyjava Sun - Изображение — Sun raster - imatge ràster Sun - Rastrový obrázek Sun - Sun rasterbillede - Sun-Rasterbild - εικόνα Sun raster - Sun raster image - imagen ráster de Sun - Sun raster irudia - Sun-rasterikuva - Sun raster mynd - image raster Sun - íomhá rastar Sun - imaxe ráster de Sun - תמונה סרוקה של Sun - SUN raszterkép - Citra raster Sun - Immagine raster Sun - Sun ラスタ画像 - Sun растрлық суреті - Sun 래스터 그림 - Sun rastrinis paveikslėlis - Sun rastra attēls - Sun rasterbilde - Sun-rasterafbeelding - Sun rasterbilete - Obraz rastrowy Sun - Imagem raster da Sun - Imagine rasterizată Sun - растровое изображение Sun - Rastrový obrázok Sun - Slikovna rastrska datoteka Sun - Figurë raster Sun - Sun-rasterbild - растрове зображення Sun - Ảnh mành Sun - Sun 光栅图像 - Sun raster 影像 - - - - - - - TGA image - صورة TGA - Vyjava TGA - Изображение — TGA - imatge TGA - Obrázek TGA - TGA-billede - TGA-Bild - εικόνα TGA - TGA image - TGA-bildo - imagen TGA - TGA irudia - TGA-kuva - TGA mynd - image TGA - íomhá TGA - imaxe TGA - תמונת TGA - TGA slika - TGA kép - Citra TGA - Immagine TGA - TGA 画像 - TGA суреті - TGA 그림 - TGA paveikslėlis - TGA attēls - TGA-bilde - TGA-afbeelding - TGA-bilete - Obraz TGA - Imagem TGA - Imagine TGA - изображение TGA - Obrázok TGA - Slikovna datoteka TGA - Figurë TGA - TGA-bild - зображення TGA - Ảnh TGA - TGA 图像 - TGA 影像 - TGA - Truevision Graphics Adapter - - - - - - - - - - - - - - - - - - - - - - - - Windows cursor - مؤشر ويندوز - Kursor Windows - Курсор — Windows - cursor de Windows - Kurzor Windows - Windowsmarkør - Windows-Cursor - δείκτης παραθυρικού περιβάλλοντος - Windows cursor - Windows-kursoro - cursor de Windows - Windows kurtsorea - Windows-osoitin - Windows vísi - curseur Windows - cúrsóir Windows - Cursor de Windows - סמן של Windows - Windows kursor - Windows-kurzor - Kursor Windows - Cursore Windows - Windows カーソル - Windows курсоры - Windows 커서 - Windows žymiklis - Windows kursors - Kursor Windows - Windows-markør - Windows-muisaanwijzer - Windows-peikar - Kursor Windows - cursor Windows - Cursor do Windows - Cursor Windows - курсор Windows - Kurzor Windows - Datoteka kazalke Windows - Kursor Windows - Виндуз курзор - Windows-muspekare - курсор Windows - Con chạy Windows - Windows 光标 - Windows 滑鼠指標 - - - - - - - - - Windows animated cursor - مؤشر ويندوز المتحرك - Animavany kursor Windows - Курсор — Windows, анимиран - cursor animat de Windows - Animovaný kurzor Windows - Windowsanimeret markør - Animierter Windows-Cursor - κινούμενος δρομέας Windows - Windows animated cursor - cursor animado de Windows - Windows-eko kurtsore animatua - animoitu Windows-osoitin - Windows livindaigjørdur vísi - curseur animé Windows - cúrsóir beo Windows - Cursor animado de Windows - סמן מונפש של Windows - Windows animirani kursor - Windows animált kurzor - Kursor animasi Windows - Cursore animato Windows - Windows アニメーションカーソル - Windows анимациясы бар курсор - Windows 움직이는 커서 - Animuotas Windows žymiklis - Windows animēts kursors - geanimeerde Windows-muisaanwijzer - Windows animert peikar - Animowany kursor Windows - Cursor animado do Windows - Cursor animat Windows - анимированный курсор Windows - Animovaný kurzor Windows - Datoteka animirane kazalke Windows - Kursor i animuar Windows - Animerad Windows-muspekare - анімований курсор Windows - Con chạy hoạt họa Windows - Windows 动画光标 - Windows 滑鼠動畫游標 - - - - - - - - - EMF image - صورة EMF - Vyjava EMF - Изображение — EMF - imatge EMF - Obrázek EMF - EMF-billede - EMF-Bild - εικόνα EMF - EMF image - EMF-bildo - imagen EMF - EMF irudia - EMF-kuva - EMF mynd - image EMF - íomhá EMF - imaxe EMF - תמונת EMF - EMF slika - EMF kép - Citra EMF - Immagine EMF - EMF 画像 - EMF გამოსახულება - EMF суреті - EMF 그림 - EMF paveikslėlis - EMF attēls - EMF-bilde - EMF-afbeelding - EMF-bilete - Obraz EMF - Imagem EMF - Imagine EMF - изображение EMF - Obrázok EMF - Slikovna datoteka EMF - Figurë EMF - EMF-bild - EMF görüntüsü - зображення EMF - Ảnh EMF - EMF 图像 - EMF 影像 - EMF - Enhanced MetaFile - - - - - - - - - - - - - - - - WMF image - صورة WMF - Vyjava WMF - Изображение — WMF - imatge WMF - Obrázek WMF - WMF-billede - WMF-Bild - εικόνα WML - WMF image - WMF-bildo - imagen WMF - WMF irudia - WMF-kuva - WMF mynd - image WMF - íomhá WMF - imaxe WMF - תמונת WMF - WMF slika - WMF kép - Citra WMF - Immagine WMF - WMF 画像 - WMF суреті - WMF 그림 - WMF paveikslėlis - WMF attēls - WMF-bilde - WMF-afbeelding - WMF-bilete - Obraz WMF - Imagem WMF - Imagine WMF - изображение WMF - Obrázok WMF - Slikovna datoteka WMF - Figurë WMF - WMF-bild - WMF görüntüsü - зображення WMF - Ảnh WMF - WMF 图像 - WMF 影像 - WMF - Windows Metafile - - - - - - - - - - - - - - - - - - - - - - XBM image - صورة XBM - Vyjava XBM - Изображение — XBM - imatge XBM - Obrázek XBM - XBM-billede - XBM-Bild - εικόνα XBM - XBM image - XBM-bildo - imagen XBM - XBM irudia - XBM-kuva - XBM mynd - image XBM - íomhá XBM - imaxe XBM - תמונת XBM - XBM slika - XBM-kép - Citra XBM - Immagine XBM - XBM 画像 - XBM суреті - XBM 그림 - XBM paveikslėlis - XBM attēls - XBM-bilde - XBM-afbeelding - XBM-bilete - Obraz XBM - Imagem XBM - Imagine XBM - изображение XBM - Obrázok XBM - Slikovna datoteka XBM - Figurë XBM - XBM-bild - зображення XBM - Ảnh XBM - XBM 图像 - XBM 影像 - XBM - X BitMap - - - - GIMP image - صورة GIMP - Vyjava GIMP - Изображение — GIMP - imatge del GIMP - Obrázek GIMP - GIMP-billede - GIMP-Bild - εικόνα GIMP - GIMP image - GIMP-bildo - imagen del GIMP - GIMP irudia - GIMP-kuva - GIMP mynd - image GIMP - íomhá GIMP - imaxe de GIMP - תמונת GIMP - GIMP slika - GIMP-kép - Citra GIMP - Immagine GIMP - GIMP 画像 - GIMP გამოსახულება - GIMP суреті - GIMP 그림 - GIMP paveikslėlis - GIMP attēls - Imej GIMP - GIMP-bilde - GIMP-afbeelding - GIMP-bilete - Obraz GIMP - imagem do GIMP - Imagem do GIMP - Imagine GIMP - изображение GIMP - Obrázok GIMP - Slikovna datoteka GIMP - Figurë GIMP - Гимп слика - GIMP-bild - GIMP görüntüsü - зображення GIMP - Ảnh GIMP - GIMP 图像 - GIMP 影像 - - - - - - - - - XFig image - صورة XFig - Vyjava XFig - Изображение — XFig - imatge de XFig - Obrázek XFig - XFig-billede - XFig-Bild - εικόνα XFig - XFig image - XFig-bildo - imagen de XFig - XFig irudia - XFig-kuva - XFig mynd - image XFig - íomhá XFig - imaxe de XFig - תמונת XFig - XFig slika - XFig-kép - Citra XFig - Immagine XFig - XFig 画像 - XFig суреті - XFig 그림 - XFig paveikslėlis - XFig attēls - Imej XFig - XFig-bilde - XFig-afbeelding - XFig-bilete - Obraz XFig - imagem XFig - Imagem do XFig - Imagine XFig - изображение XFig - Obrázok XFig - Slikovna datoteka XFig - Figurë XFig - XFig слика - XFig-bild - зображення XFig - Ảnh XFig - XFig 图像 - XFig 影像 - - - - - - - XPM image - صورة XPM - Vyjava XPM - Изображение — XPM - imatge XPM - Obrázek XPM - Delwedd XPM - XPM-billede - XPM-Bild - εικόνα XPM - XPM image - XPM-bildo - imagen XPM - XPM irudia - XPM-kuva - XPM mynd - image XPM - íomhá XPM - imaxe XPM - תמונת XPM - XPM slika - XPM kép - Citra XPM - Immagine XPM - XPM 画像 - XPM суреті - XPM 그림 - XPM paveikslėlis - XPM attēls - XPM-bilde - XPM-afbeelding - XPM-bilete - Obraz XPM - Imagem XPM - Imagine XPM - изображение XPM - Obrázok XPM - Slikovna datoteka XPM - Figurë XPM - XPM-bild - зображення XPM - Ảnh XPM - XPM 图像 - XPM 影像 - XPM - X PixMap - - - - - - - - X window image - صورة X window - X window rəsmi - Vyjava vakna X - Изображение — X Window - imatge de X window - Obrázek X window - Delwedd ffenest X - X-billede - X-Window-Bild - εικόνα περιβάλλοντος X - X window image - bildo de X window - imagen de X window - X window irudia - X-ikkunakuva - X vindeyga mynd - image X window - íomhá fhuinneog X - imaxe de X Window - תמונת חלון של X - X window slika - X window-kép - Citra X window - Immagine X window - X window 画像 - X window суреті - X 윈도 그림 - X window paveikslėlis - X window attēls - Imej tetingkap X - X-Windows skjermbilde - X-window-afbeelding - X window bilete - Obraz X Window - imagem de janela X - Imagem de janela do X - Imagine X window - изображение X window - Obrázok X window - slika X oken - Figurë X window - X прозор слика - X-fönsterbild - зображення X window - Ảnh cửa sổ X - X window 图像 - X window 影像 - - - - block device - جهاز كتلي - blokavaja pryłada - Блоково устройство - dispositiu de blocs - Blokové zařízení - blokenhed - Blockorientiertes Gerät - συσκευή block - block device - bloka disponaĵo - dispositivo de bloques - bloke-gailua - laitetiedosto - blokka tóleind - périphérique de blocs - gléas bloc - dispositivo de bloque - התקן בלוק - blokkos eszköz - blok divais - Device a blocchi - ブロックデバイス - блоктық құрылғысы - 블록 장치 - blokinis įrenginys - bloka ierīce - Peranti blok - blokkenhet - blok-apparaat - blokk-eining - Urządzenie blokowe - dispositivo de bloco - Dispositivo de bloco - dispozitiv bloc - блочное устройство - Blokové zariadenie - bločna naprava - device me blloqe - блок уређај - blockenhet - blok aygıtı - блоковий пристрій - thiết bị khối - 块设备 - 區塊裝置 - - - character device - جهاز حرفي - znakavaja pryłada - Символно устройство - dispositiu de caràcters - Znakové zařízení - tegnenhed - Zeichenorientiertes Gerät - συσκευή χαρακτήρων - character device - signa disponaĵo - dispositivo de caracteres - karaktereen gailua - merkkilaite - stavatóleind - périphérique de caractères - gléas carachtar - dispositivo de caracter - התקן תכונה - karakteres eszköz - karakter divais - Device a caratteri - キャラクタデバイス - символдық құрылғысы - 문자 장치 - simbolinis įrenginys - rakstzīmju ierīce - Peranti aksara - tegnenhet - byte-apparaat - teikneining - Urządzenie znakowe - dispositivo de caracteres - Dispositivo de caractere - dispozitiv caracter - символьное устройство - Znakové zariadenie - znakovna naprava - device me karaktere - знаковни уређај - teckenenhet - karakter aygıtı - символьний пристрій - thiết bị ký tự - 字符设备 - 字元裝置 - - - folder - مجلّد - kataloh - Папка - carpeta - Složka - mappe - Ordner - φάκελος - folder - dosierujo - carpeta - karpeta - kansio - mappa - dossier - fillteán - cartafol - תיקייה - direktorij - mappa - folder - Cartella - フォルダー - бума - 폴더 - aplankas - mape - Folder - mappe - map - mappe - Katalog - pasta - Pasta - dosar - папка - Priečinok - mapa - Kartelë - директоријум - mapp - dizin - тека - thư mục - 文件夹 - 資料夾 - - - - pipe - إنبوب - kanvejer - Конвейер - conducte - Roura - datakanal - Pipe - σωλήνωση - pipe - dukto - tubería - kanalizazioa - putki - rør - tube - píopa - tubería - צינור - adatcsatorna - pipa - Pipe - パイプ - арна - 파이프 - konvejeris - programmkanāls - Paip - rør - pijp - røyr - Potok - canal - Pipe - canal pipe - канал - Rúra - cev - Pipe - цев - rör - канал - ống dẫn - 管道 - 管線 - - - mount point - نقطة الوصْل - punkt mantavańnia - Точка на монтиране - punt de muntatge - Místo připojení - monteringspunkt - Einhängepunkt - σημείο προσάρτησης - mount point - surmetingo - punto de montaje - muntatze-puntua - liitospiste - ísetingarpunkt - point d'accès - pointe feistithe - punto de montaxe - נקודת עיגון - točka montiranja - csatolási pont - titik mount - Punto di mount - マウントポイント - тіркеу нүктесі - 마운트 위치 - prijungimo taškas - montēšanas punkts - Titik lekapan - monteringspunkt - aankoppelingspunt - monteringspunkt - Punkt montowania - ponto de montagem - Ponto de montagem - loc montare - точка монтирования - Miesto pripojenia - priklopna točka - Pikë montimi - тачка прикључења - monteringspunkt - точка монтування - điểm lắp - 挂载点 - 掛載點 - - - - socket - مقبس - sokiet - Гнездо - sòcol - Socket - sokkel - Socket - υποδοχή - socket - kontaktoskatolo - socket - socketa - pistoke - sokkul - connecteur réseau - soicéad - socket - נקודת חיבור - utičnica - illesztőpont - soket - Socket - ソケット - сокет - 소켓 - lizdas - sokets - Soket - plugg - socket - sokkel - Gniazdo - 'socket' - Socket - socket - сокет - Soket - vtič - Socket - сокет - uttag - сокет - ổ cắm - 套接字 - socket - - - symbolic link - وصلة رمزية - simvolik körpü - symbalnaja spasyłka - Символна връзка - enllaç simbòlic - Symbolický odkaz - cyswllt symbolaidd - symbolsk henvisning - Symbolische Verknüpfung - συμβολικός σύνδεσμος - symbolic link - simbola ligilo - enlace simbólico - esteka sinbolikoa - symbolinen linkki - tykislig leinkja - lien symbolique - nasc siombalach - ligazón simbólica - קישור סימבולי - simbolička veza - szimbolikus link - taut simbolik - Collegamento simbolico - シンボリックリンク - სიმბოლური ბმული - символдық сілтеме - 심볼릭 링크 - simbolinė nuoroda - simboliskā saite - Pautan simbolik - symbolsk lenke - symbolische koppeling - symbolsk lenkje - Dowiązanie symboliczne - ligação simbólica - Ligação simbólica - legătură simbolică - символьная ссылка - Symbolický odkaz - simbolna povezava - Lidhje simbolike - симболичка веза - symbolisk länk - символічне посилання - liên kết tượng trưng - 符号链接 - 符號鏈結 - - - mail delivery report - تقرير تسليم البريد - poçt yollama raportu - rapart ab dastaŭcy pošty - Отчет за пристигналата поща - informe de lliurament de correu - Zpráva o doručení pošty - Adroddiad trosgludo post - postleveringsrapport - E-Mail-Zustellungsbericht - αναφορά παράδοσης μηνύματος - mail delivery report - raporto pri transdono de retpoŝto - informe de entrega de correo - posta banaketako txostena - viestin jakeluilmoitus - post útberingarfrásøgn - rapport de livraison de courriels - tuairisc sheachadadh poist - informe de entrega de correo - דוח העברת דואר - izvještaj dostave pošte - jelentés levélkézbesítésről - laporan pengantaran surat - Rapporto di consegna posta - メール配送ポート - пошта жеткізілгені туралы отчет - 메일 배달 보고서 - pašto pristatymo ataskaita - pasta piegādes atskaite - Laporan penghantaran mel - e-postleveranserapport - e-mail-bezorgingsbericht - e-post-leveringsrapport - Raport z dostarczenia poczty - relatório de entrega de e-mail - Relatório de entrega de correspondência - raport de trimitere email - отчёт о доставке сообщения - Správa o doručení pošty - poročilo dostave pošte - Raport mbi dorëzimin e mesazhit - извештај доставе поруке - e-postleveransrapport - звіт про доставку пошти - thông báo phát thư - 邮件投递报告 - 郵件寄送回報 - - - - - mail disposition report - تقرير ترتيب البريد - poçt qayıtma raportu - rapart ab raźmiaščeńni pošty - Отчет за състоянието на пощата - informe de disposició de correu - Zpráva o předání pošty - adroddiad ffurf post - postdisponeringsrapport - E-Mail-Übertragungsbericht - αναφορά διάθεσης μηνύματος - mail disposition report - raporto pri dispono de retpoŝto - informe de disposición de correo - posta joerako txostena - viestin kuittausilmoitus - post avhendingarfrásøgn - rapport de disposition de courriels - tuairisc chóiriú poist - informe de disposición de correo - דוח אספקת דואר - jelentés levélkidobásról - laporan disposisi surat - Rapporto di disposizione posta - メール停止レポート - пошта жылжытылғаны туралы отчет - 메일 처리 보고서 - pašto charakteristikos ataskaita - pasta izvietojuma atskaite - Laporan pelupusan mel - e-postdispositionsrapport - e-mail-plaatsingsbericht - e-post-disposisjonsrapport - Raport z wysyłania poczty - relatório de disposição de e-mail - Relatório de disposição de correspondência - confirmare primire email - отчёт о перемещении почты - Správa o odovzdaní pošty - poročilo razporeditve pošte - Raport mbi njoftimin e mesazhit - извештај слања поруке - e-postdispositionsrapport - звіт про розташування пошти - thông báo chuyển nhượng thư - 邮件接收报告 - 郵件處置回報 - - - - - reference to remote file - مرجع إلى ملف بعيد - uzaq fayla göstəriş - spasyłka da addalenaha fajłu - Препратка към отдалечен файл - referència a fitxer remot - Odkaz na vzdálený soubor - cyfeiriad at ffeil bell - reference til fjern fil - Verweis auf entfernte Datei - αναφορά σε απόμακρο αρχείο - reference to remote file - referenco al fora dosiero - referencia a un archivo remoto - erreferentzia urruneko fitxategiari - viittaus etätiedostoon - tilvísing til fjarfílu - référence au fichier distant - tagairt do chomhad cianda - referencia a un ficheiro remoto - התיחסות לקובץ מרוחק - referenca na udaljenu datoteku - hivatkozás távoli fájlra - referensi ke berkas jarak jauh - Riferimento a file remoto - リモートファイルへの参照 - қашықтағы файлға сілтеме - 원격 파일 참조 - nuoroda į nutolusį failą - norāde uz attālinātu datni - Rujukan ke fail jauh - referanse til ekstern fil - verwijzing naar bestand op afstand - referanse til fil over nettverk - Odwołanie do pliku zdalnego - referência a um ficheiro remoto - Referência a um arquivo remoto - referință fișier la distanță - ссылка на удалённый файл - Odkaz na vzdialený súbor - sklic do oddaljene datoteke - Referim për tek file në distancë - референца на удаљену датотеку - referens till fjärrfil - посилання на віддалений файл - tham chiếu đến tập tin ở xa - 到远程文件的引用 - 遠端檔案的參照 - - - - Usenet news message - رسالة أخبار Usenet - Usenet xəbərlər ismarışı - Navina Usenet - Съобщение — Usenet - missatge de notícies Usenet - Příspěvek do diskusních skupin Usenet - Neges newyddion Usenet - Usenetnyhedsmeddelelse - Usenet-News-Nachricht - μήνυμα ομάδων συζητήσεων Usenet - Usenet news message - novaĵmesaĝo de Usenet - mensaje de noticias de Usenet - Usenet berrien mezua - nyyssiviesti - Usenet news boð - message de groupe d'échange Usenet - teachtaireacht nuacht Usenet - mensaxes de noticias de Usenet - הודעת חדשות של Usenet - Usenet poruka novosti - USENET-hírcsoportüzenet - Pesan berita Usenet - Messaggio news Usenet - Usenet news メッセージ - Usenet жаңалық мәлімдемесі - 유즈넷 뉴스 메시지 - Usenet naujienų žinutė - Usenet jaunumu ziņojums - Mesej berita USENET - Usenet nyhetsmelding - Usenet-nieuwsbericht - USENET diskusjonsmelding - Wiadomość grupy dyskusyjnej - mensagem de notícias Usenet - Mensagem de notícias da Usenet - Mesaj Usenet de știri - новостное сообщение Usenet - Príspevok do diskusných skupín Usenet - novičarsko sporočilo Usenet - Mesazh lajmesh Usenet - Порука са дискусионе групе - Usenet-diskussionsgruppsmeddelande - повідомлення новин Usenet - Thông điệp tin tức USENET - Usenet 新闻信 - Usenet 新聞訊息 - - - - - - - - - - partial email message - رسالة البريد الإلكتروني الجزئية - qismi poçt ismarışı - niapoŭny list email - Част от електронно писмо - missatge de correu electrònic parcial - Částečná e-mailová zpráva - darn o neges e-bost - delvis postmeddelelse - E-Mail-Nachrichtenfragment - τμηματικό ηλ. μήνυμα - partial email message - parta retpoŝta mesaĝo - mensaje de correo electrónico parcial - posta mezu partziala - osittainen sähköpostiviesti - message partiel de courriel - teachtaireacht ríomhphoist neamhiomlán - mensaxe de correo electrónico parcial - מסר דוא"ל חלקי - djelomična poruka e-pošte - részleges elektronikus levél - pesan email sebagian - Messaggio email parziale - 部分メールメッセージ - электронды поштаның үзінді мәлімдемесі - 부분적 전자 우편 메시지 - nepilnas el. laiškas - daļēja e-pasta vēstule - Bahagian mesej emel - del av e-postmelding - gedeeltelijk e-mailbericht - del av e-post-melding - Częściowa wiadomość e-mail - mensagem parcial de e-mail - Mensagem de e-mail parcial - mesaj de email parțial - фрагмент сообщения электронной почты - Čiastočná e-mailová správa - delno elektronsko sporočilo - Mesazh poste i pjesëshëm - делимична е-порука - del av e-postmeddelande - часткове поштове повідомлення - thư điện tử riêng phần - 部分电子邮件 - 部份電子郵件訊息 - - - - - email message - رسالة البريد الإلكتروني - list email - Съобщение по електронната поща - missatge de correu electrònic - E-mailová zpráva - postmeddelelse - E-Mail-Nachricht - ηλ. μήνυμα - email message - retpoŝta mesaĝo - mensaje de correo electrónico - helbide elektronikoen mezua - sähköpostiviesti - t-post boð - message de courriel - teachtaireacht ríomhphoist - mensaxe de correo electrónico - הודעת דואר אלקטרוני - poruka e-pošte - elektronikus levél - pesan email - Messaggio email - メール本文 - пошталық мәлімдеме - 전자 우편 본문 - el. laiškas - e-pasta vēstule - Mesej emel - e-postmelding - e-mailbericht - e-postmelding - Wiadomość e-mail - mensagem de e-mail - Mensagem de e-mail - mesaj email - почтовое сообщение - E-mailová správa - sporočilo elektronske pošte - Mesazh poste - е-порука - e-postmeddelande - повідомлення email - thư điện tử - 电子邮件 - 電子郵件內容 - - - - - - - - - - - - - - - - - - GNU mail message - رسالة بريد جنو - GNU poçt ismarışı - List GNU - Съобщение — GNU mail - missatge de GNU mail - Zpráva GNU mail - Neges E-Bost GNU - GNU-postmeddelelse - GNU-Mail-Nachricht - μήνυμα αλληλογραφίας GNU - GNU mail message - mesaĝo de GNU mail - mensaje de GNU mail - GNU posta mezua - GNU-postiviesti - GNU mail boð - message de courriel GNU - teachtaireacht phost GNU - mensaxe de correo electrónico de GNU - הודעת דואר של GNU - GNU poruka pošte - GNU elektronikus levél - Pesan surat GNU - Messaggio GNU mail - GNU メールメッセージ - GNU mail შეტყობინება - GNU пошта хабарламасы - GNU 메일 메시지 - GNU pašto žinutė - GNU pasta vēstule - Mesej emel GNU - GNU e-postmelding - GNU-mailbericht - GNU e-postmelding - Wiadomość pocztowa GNU - mensagem de e-mail GNU - Mensagem de correio GNU - Mesaj GNU mail - почтовое сообщение GNU - Správa GNU mail - Sporočilo pošte GNU - Mesazh GNU mail - ГНУ е-писмо - GNU-epostmeddelande - поштове повідомлення GNU - Thư điện tử của GNU - GNU mail 信件 - GNU 郵件訊息 - - - - - VRML document - مستند VRML - VRML sənədi - Dakument VRML - Документ — VRML - document VRML - Dokument VRML - Dogfen VRML - VRML-dokument - VRML-Dokument - έγγραφο VRML - VRML document - VRML-dokumento - documento VRML - VRML dokumentua - VRML-asiakirja - VRML skjal - document VRML - cáipéis VRML - documento VRML - מסמך VRML - VRML dokument - VRML-dokumentum - Dokumen VRML - Documento VRML - VRML ドキュメント - VRML құжаты - VRML 문서 - VRML dokumentas - VRML dokuments - Dokumen VRML - VRML-dokument - VRML-document - VRML-dokument - Dokument VRML - documento VRML - Documento VRML - Document VRML - документ VRML - Dokument VRML - Dokument VRML - Dokument VRML - VRML документ - VRML-dokument - VRML belgesi - документ VRML - Tài liệu VRML - VRML 文档 - VRML 文件 - VRML - Virtual Reality Modeling Language - - - - - - - - message in several formats - رسالة في عدة صيغ - verici formatlarında ismarış - paviedamleńnie ŭ niekalkich farmatach - Съобщение в няколко формата - missatge en varis formats - Zpráva v několika formátech - neges mewn sawl fformat - meddelelse i flere formater - Nachricht in mehreren Formaten - μήνυμα σε διάφορες μορφές - message in several formats - mesaĝo en pluraj formatoj - mensaje en varios formatos - hainbat formatuko mezua - viesti useissa muodoissa - boð í fleiri sniðum - message en formats divers - teachtaireacht i roinnt fhormáidí - mensaxe en varios formatos - הודעה במספר פורמטים - poruka u nekoliko oblika - többféle formátumú üzenet - pesan dalam beberapa format - Messaggio in diversi formati - いくつかの形式でのメッセージ - бірнеше пішімдегі мәлімдеме - 여러가지 형식의 메시지 - laiškas keletu formatų - ziņojums dažādos formātos - Mesej dalam beberapa format - melding i flere formater - bericht in meerdere opmaken - melding i fleire format - Wiadomość w wielu formatach - mensagem em vários formatos - Mensagem em vários formatos - mesaj în diferite formate - сообщение в нескольких форматах - Správa v niekoľkých formátoch - sporočilo v več zapisih - Mesazh në formate të ndryshëm - поруке у више записа - meddelande i flera format - повідомлення у кількох форматах - thông điệp có vài định dạng - 各种格式的消息 - 多種格式的訊息 - - - Macintosh AppleDouble-encoded file - ملف Macintosh AppleDouble مشفر - Macintosh AppleDouble-kodlanmış fayl - Fajł Macintosh, AppleDouble-zakadavany - Файл — кодиран с Macintosh AppleDouble - fitxer codificat AppleDouble de Macintosh - Soubor kódovaný pomocí Macintosh AppleDouble - Ffeil AppleDouble-amgodedig Macintosh - Macintosh AppleDouble-kodet fil - Macintosh-Datei (AppleDouble-kodiert) - αρχείο Macintosh κωδικοποίησης AppleDouble - Macintosh AppleDouble-encoded file - dosiero kodigita laŭ Macintosh AppleDouble - archivo Macintosh codificado con AppleDouble - Macintosh AppleDouble-rekin kodetutako fitxategia - Macintosh AppleDouble -koodattu tiedosto - Macintosh AppleDouble-bronglað fíla - fichier codé Macintosh AppleDouble - comhad ionchódaithe le Macintosh AppleDouble - ficheiro de Macintosh codificado con AppleDouble - קובץ מסוג Macintosh AppleDouble-encoded - Macintosh AppleDouble-kodirana datoteka - Macintosh AppleDouble kódolású fájl - Berkas tersandi Macintosh AppleDouble - File Macintosh codificato AppleDouble - Macintosh AppleDouble エンコードファイル - Macintosh AppleDouble кодталған файлы - 매킨토시 AppleDouble 인코딩된 파일 - Macintosh AppleDouble-encoded failas - Macintosh AppleDouble-kodēts datne - Fail terenkod-AppleDouble Macintosh - dokument kodet med Macintosh AppleDouble - Macintosh AppleDouble-gecodeerd bestand - Macintosh AppleDouble-koda fil - Zakodowany w AppleDouble plik Macintosh - ficheiro codificado em AppleDouble de Macintosh - Arquivo do Macintosh codificado com AppleDouble - Fișier codat Macintosh AppleDouble - файл (закодированный Macintosh AppleDouble) - Súbor kódovaný pomocou Macintosh AppleDouble - Kodirana datoteka Macintosh (AppleDouble) - File Macintosh i kodifikuar AppleDouble - Мекинтош AppleDouble-encoded датотека - Macintosh AppleDouble-kodad fil - файл закодований Macintosh AppleDouble - Tập tin đã mã hoá Apple-Double của Macintosh - Macintosh AppleDouble 编码的文件 - Macintosh AppleDouble 編碼檔 - - - message digest - خلاصة الرسالة - ismarış daycesti - digest paviedamleńniaŭ - Извадка от съобщение - recopilació de missatges - Přehled zpráv - crynodeb negeseuon - meddelelsessammendrag - Nachrichtensammlung - περίληψη μηνύματος - message digest - mesaĝaro - recopilación de mensajes - mezu laburra - viestikokoelma - boð samandráttur - condensé de message - achoimre theachtaireachtaí - recompilación de mensaxe - תקציר ההודעה - ömlesztett üzenet - pesan digest - Digest di messaggi - メッセージダイジェスト - мәлімдеме профилі - 메시지 묶음 - laiškų santrauka - ziņojumu apkopojums - Jilid mesej - medldingssamling - berichtenbundel - meldingsamandrag - Wiadomość przetwarzania - 'digest' de mensagens - Resumo de mensagem - colecție mesaje email - профиль сообщения - Prehľad správ - povzetek sporočila - Shpërndarje mesazhesh - гомила порука - meddelandesamling - збірка повідомлень - bản tóm tắt thông điệp - 消息摘要 - 訊息摘要 - - - encrypted message - رسالة مشفرة - şifrələnmiş ismarış - zašyfravanaje paviedamleńnie - Шифрирано съобщение - missatge xifrat - Zašifrovaná zpráva - Neges wedi ei hamgryptio - krypteret meddelelse - Verschlüsselte Nachricht - κρυπτογραφημένο μήνυμα - encrypted message - ĉifrita mesaĝo - mensaje cifrado - mezu enkriptatua - salattu viesti - bronglað boð - message chiffré - teachtaireacht chriptithe - mensaxe cifrado - הודעה מוצפנת - šifrirana poruka - titkosított üzenet - pesan terenkripsi - Messaggio cifrato - 暗号化メッセージ - шифрленген мәлімдеме - 암호화된 메시지 - užšifruotas laiškas - šifrēta vēstule - Mesej terenkripsi - kryptert melding - versleuteld bericht - kryptert melding - Wiadomość zaszyfrowana - mensagem cifrada - Mensagem criptografada - mesaj criptat - зашифрованное сообщение - Zašifrovaná správa - šifrirano sporočilo - Mesazh i kriptuar - шифрована порука - krypterat meddelande - şifrelenmiş mesaj - шифроване повідомлення - thông điệp đã mật mã - 加密信件 - 加密訊息 - - - compound documents - مستندات مركبة - składanyja dakumenty - Съставни документи - documents composats - Složené dokumenty - sammensatte dokumenter - Verbunddokumente - σύνθετα έγγραφα - compound documents - parentezaj dokumentoj - documentos compuestos - konposatutako dokumentuak - yhdisteasiakirjat - samansett skjøl - documents composés - cáipéisí comhshuite - documentos compostos - מסמכים מורכבים - összetett dokumentumok - dokumen kompon - Documenti composti - 複合ドキュメント - құрама құжаттары - 복합 문서 - sudurtiniai dokumentai - salikti dokumenti - Dokumen halaman - sammensatte dokumenter - samengestelde documenten - samansette dokument - Dokumenty złożone - documentos compostos - Documentos compostos - documente compuse - составные документы - Zložené dokumenty - združeni dokumenti - dokumente të përbërë - сједињени документи - sammansatta dokument - складні документи - tài liệu ghép - 组合文档 - 複合文件 - - - compound document - مستند مركب - birləşik sənəd - składany dakument - Съставен документ - document composat - Složený dokument - dogfen gyfansawdd - sammensat dokument - Verbunddokument - σύνθετο έγγραφο - compound document - parenteza dokumento - documento compuesto - konposatutako dokumentua - yhdisteasiakirja - samansett skjal - document composé - cáipéis comhshuite - documento composto - מסמך מורכב - összetett dokumentum - dokumen kompon - Documento composto - 複合ドキュメント - құрама құжаты - 복합 문서 - sudurtinis dokumentas - salikts dokuments - Dokumen halaman - sammensatt dokument - samengesteld document - samansett dokument - Dokument złożony - documento composto - Documento composto - document compus - составной документ - Zložený dokument - združeni dokument - dokumet i përbërë - сједињени документ - sammansatt dokument - складний документ - tài liệu ghép - 组合文档 - 複合文件 - - - mail system report - تقرير نظام البريد - poçt sistemi raportu - rapart paštovaj systemy - Отчет за пощенската система - informe de sistema de correu - Zpráva poštovního systému - adroddiad system bost - postsystemrapport - E-Mail-Systembericht - αναφορά συστήματος ηλ. ταχυδρομείου - mail system report - raporto de retpoŝta sistemo - informe del sistema de correo - posta sistemako txostena - viestijärjestelmän ilmoitus - postkervisfrásøgn - rapport système de courriels - tuairisc chóras poist - informe do sistema de correo - דו"ח של מערכת הדואר - levelezőrendszer jelentése - laporan sistem surat - Rapporto di sistema posta - メールシステムレポート - пошта жүйесінің мәлімдемесі - 메일 시스템 보고서 - pašto sistemos ataskaita - pasta sistēmas atskaite - Laporan sistem mel - e-postsystemrapport - e-mail-systeembericht - e-post-systemrapport - Raport systemu pocztowego - relatório de sistema de e-mail - Relatório do sistema de correspondência - raport sistem email - отчёт почтовой системы - Správa poštového systému - poročilo poštnega sistema - Raport i sistemit të postës - извештај поштанског система - e-postsystemrapport - звіт поштової системи - thông báo hệ thống thư - 邮件系统报告 - 郵件系統回報 - - - signed message - رسالة موقّعة - imzalanmış ismarış - padpisanaje paviedamleńnie - Подписано съобщение - missatge signat - Podepsaná zpráva - neges lofnodwyd - signeret meddelelse - Signierte Nachricht - υπογεγραμμένο μήνυμα - signed message - pruvita mesaĝo - mensaje firmado - sinatutako mezua - allekirjoitettu viesti - undirskrivað boð - message signé - teachtaireacht sínithe - mensaxe firmado - הודעה חתומה - potpisana poruka - aláírt üzenet - pesan ditandatangani - Messaggio firmato - 署名付きメッセージ - қолтаңбасы бар мәлімдеме - 서명된 메시지 - pasirašytas laiškas - parakstīta ziņa - Mesej ditandatangani - signert melding - ondertekend bericht - signert melding - Podpisana wiadomość - mensagem assinada - Mensagem assinada - mesaj semnat - подписанное сообщение - Podpísaná správa - podpisano sporočilo - Mesazh i firmosur - потписана порука - signerat meddelande - підписане повідомлення - thông điệp đã ký - 签名信件 - 簽署的訊息 - - - stream of data (server push) - دفق بيانات (دفع خادم) - płyń źviestak (ad servera) - Поток от данни, от страна на сървър - flux de dades (enviat pel servidor) - Proud dat (posílaný serverem) - datastrøm (serverskubbet) - Datenstrom (Server-Push) - χείμαρρος δεδομένων (στελλόμενα από τον εξυπηρετητή) - stream of data (server push) - datumstrio (puŝata per servilo) - flujo de datos (por iniciativa del servidor) - datu-korrontea (zerbitzari igortzailea) - tietovirta (palvelin työntää) - streymur av dáta (ambætara skump) - flux de données (émis par le serveur) - sruth sonraí (brú freastalaí) - fluxo de datos (por iniciativa do servidor) - מידע בזרימה (דחיפה ע"י השרת) - sugárzott adatfolyam (kiszolgálóról) - arus data (dorongan server) - Flusso di dati (server push) - データストリーム (サーバープッシュ型) - мәліметтер ағымы (server push) - 데이터 스트림 (서버 푸시) - duomenų srautas (iš serverio) - datu straume (servera grūsta) - Aliran dara (paksaan pelayan) - datastrøm (server push) - gegevensstroom (server duwt) - datastraum (dytta av tenaren) - Strumień danych (wymuszenie serwera) - fluxo de dados (empurrados pelo servidor) - Fluxo de dados (por iniciativa do servidor) - flux de date (de la server) - поток данных (server push) - Prúd dát (posielaný serverom) - pretok podatkov (strežniški) - Fluks me të dhëna (server push) - проток података (гурање са сервера) - dataflöde (serverutsändning) - потік даних (від сервера) - luồng dữ liệu (trình phục vụ đẩy) - 数据流(服务器推送) - 資料串流 (server push) - - - VCS/ICS calendar - سجل VCS/ICS - Kalandar VCS/ICS - Календар — VCS/ICS - calendari VCS/ICS - Kalendář VCS/ICS - VCS/ICS-kalender - VCS/ICS-Kalender - ημερολόγιο VCS/ICS - VCS/ICS calendar - VCS/ICS-kalendaro - calendario VCS/ICS - VCS/ICS egutegia - VCS/ICS-kalenteri - VCS/ICS kalendari - calendrier VCS/ICS - féilire VCS/ICS - Calendario VCS/ICS - לוח שנה VCS/ICS - VCS/ICS kalendar - VCS/ICS naptár - Kalender VCS/ICS - Calendario VCS/ICS - VCS/ICS カレンダー - VCS/ICS күнтізбесі - VCS/ICS 달력 - VCS/ICS kalendorius - VCS/ICS kalendārs - VCS/ICS-kalender - VCS/ICS-kalender - VCS/ICS-kalender - Kalendarz VCS/ICS - Calendário VCS/ICS - Calendar VCS/ICS - календарь VCS/ICS - Kalendár VCS/ICS - Datoteka koledarja VCS/ICS - Kalendar VCS/ICS - VCS/ICS-kalender - VCS/ICS takvimi - календар VCS/ICS - Lịch VCS/ICS - VCS/ICS 日历 - VCS/ICS 行事曆 - VCS/ICS - vCalendar/iCalendar - - - - - - - - - - - - CSS stylesheet - نمط CSS - Arkuš stylaŭ CSS - Стилове — CSS - llista d'estil CSS - Styl CSS - CSS-stilark - CSS-Stilvorlage - φύλο στυλ CSS - CSS stylesheet - CSS-stilfolio - hoja de estilo CSS - CSS estilo-orria - CSS-tyylitiedosto - CSS sniðark - feuille de style CSS - stílbhileog CSS - folla de estilos CSS - גליון עיצוב CSS - CSS stilska tablica - CSS stíluslap - Lembar gaya CSS - Foglio di stile CSS - CSS スタイルシート - CSS სტილი - CSS стильдер кестесі - CSS 스타일시트 - CSS stiliaus aprašas - CSS stilu saraksts - CSS-stilark - CSS-stijlblad - CSS-stilark - Arkusz stylów CSS - Folha de estilo CSS - Pagină de stil CSS - таблица стилей CSS - Štýly CSS - Slogovna predloga CSS - Fletë stili CSS - CSS-stilmall - таблиця стилів CSS - Tờ kiểu dáng CSS - CSS 样式表 - CSS 樣式表 - CSS - Cascading Style Sheets - - - - - - electronic business card - بطاقة أعمال إلكترونية - elektronnaja biznes-kartka - Електронна визитна картичка - targeta de visita electrònica - Elektronická navštívenka - elektronisk visitkort - Elektronische Visitenkarte - ηλεκτρονική επαγγελματική κάρτα - electronic business card - elektronika vizitkarto - tarjeta de visita electrónica - enpresako txartel elektronikoa - sähköinen käyntikortti - elektroniskt handilskort - carte de visite électronique - cárta gnó leictreonach - tarxeta de negocio electrónica - כרטיס ביקור אלקטרוני - elektronička posjetnica - elektronikus névjegykártya - kartu bisnis elektronik - Biglietto da visita elettronico - 電子名刺 - электронда визит карточкасы - 전자 명함 - elektroninė vizitinė kortelė - elektroniskā biznesa kartiņa - elektronisch visitekaartje - elektronisk visittkort - Wizytówka elektroniczna - cartão de visita electrónico - Cartão de visitas eletrônico - carte de vizită electronică - электронная визитная карточка - Elektronická vizitka - elektronska poslovna vizitka - Skedë elektronike biznesi - elektroniskt visitkort - електронна бізнес-картка - danh thiếp điện tử - 电子商务卡 - 電子商務名片 - - - - - - - - - - - - - - txt2tags document - مستند txt2tags - dakument txt2tags - Документ — txt2tags - document txt2tags - Dokument txt2tags - txt2tags-dokument - txt2tags-Dokument - αρχείο txt2tags - txt2tags document - txt2tags-dokumento - documento txt2tags - txt2tags dokumentua - txt2tags-asiakirja - txt2tags skjal - document txt2tags - cáipéis txt2tags - documento txt2tags - מסמך txt2tags - txt2tags dokument - txt2tags dokumentum - dokumen txt2tags - Documento txt2tags - txt2tags ドキュメント - txt2tags დოკუმენტი - txt2tags құжаты - txt2tags 문서 - txt2tags dokumentas - txt2tags dokuments - txt2tags-dokument - txt2tags-document - txt2tags-dokument - Dokument txt2tags - Documento do txt2tags - document txt2tags - документ txt2tags - Dokument txt2tags - Dokument txt2tags - Dokument txt2tags - txt2tags-dokument - документ txt2tags - tài liệu txt2tags - txt2tags 文档 - txt2tags 文件 - - - - - - - - - Verilog source code - Изходен код — Verilog - codi font en Verilog - Zdrojový kód Verilog - Verilog-kildekode - Verilog-Quellcode - πηγαίος κώδικας Verilog - Verilog source code - Verilog-fontkodo - código fuente en Verilog - Verilog-lähdekoodi - code source Verilog - código fonte en Verilog - קוד מקור של - Verilog izvorni kod - Verilog-forráskód - Kode sumber Verilog - Codice sorgente Verilog - Verilog ソースコード - Verilog бастапқы коды - Verilog 소스 코드 - Verilog pirmkods - Verilog broncode - Kod źródłowy Verilog - Código-fonte Verilog - исходный код Verilog - Zdrojový kód Verilog - Datoteka izvorne kode Verilog - Verilog-källkod - Verilog kaynak kodu - вихідний код мовою Verilog - Verilog 源代码 - Verilog 源碼 - - - - - SystemVerilog header - Заглавен файл — SystemVerilog - capçalera de SystemVerilog - Záhlaví SystemVerilog - SystemVerilog-teksthoved - SystemVerilog-Header - κεφαλίδα SystemVerilog - SystemVerilog header - cabeceras de SystemVerilog - SystemVerilog-otsake - en-tête - Cabeceiras de SystemVerilog - כותרת SystemVerilog - SystemVerilog zaglavlje - SystemVerilog fejléc - Header SystemVerilog - Header SystemVerilog - SystemVerilog ヘッダー - SystemVerilog тақырыптамасы - SystemVerilog 헤더 - SystemVerilog galvene - SystemVerilog header - Nagłówek SystemVerilog - Cabeçalho de SystemVerilog - заголовочный файл SystemVerilog - Hlavičky SystemVerilog - Datoteka glave SystemVerilog - SystemVerilog-headerfil - заголовки SystemVerilog - SystemVerilog 头 - SystemVerilog 標頭 - - - - - SystemVerilog source code - Изходен код — SystemVerilog - codi font en SystemVerilog - Zdrojový kód SystemVerilog - SystemVerilog-kildekode - SystemVerilog-Quellcode - πηγαίος κώδικας SystemVerilog - SystemVerilog source code - código fuente en SystemVerilog - SystemVerilog-lähdekoodi - code source - código fonte en SystemVerilog - קוד מקור של SystemVerilog - SystemVerilog izvorni kod - SystemVerilog-forráskód - Kode sumber SystemVerilog - Codice sorgente - SystemVerilog ソースコード - SystemVerilog бастапқы коды - SystemVerilog 소스 코드 - SystemVerilog pirmkods - SystemVerilog broncode - Kod źródłowy SystemVerilog - Código-fonte de SystemVerilog - исходный код SystemVerilog - Zdrojový kód SystemVerilog - Datoteka izvorne kode SystemVerilog - SystemVerilog-källkod - вихідний файл мовою SystemVerilog - SystemVerilog 源代码 - SystemVerilog 源碼 - - - - - VHDL source code - Изходен код — VHDL - codi font en VHDL - Zdrojový kód VHDL - VHDL-kildekode - VHDL-Quellcode - πηγαίος κώδικας VHDL - VHDL source code - VHDL-fontkodo - código fuente en VHDL - VHDL-lähdekoodi - code source VHDL - código fonte en VHDL - קוד מקור של VHDL - VHDL izvorni kod - VHDL-forráskód - Kode sumber VHDL - Codice sorgente VHDL - VHDL ソースコード - VHDL бастапқы коды - VHDL 소스 코드 - VHDL pirmkods - VHDL broncode - Kod źródłowy VHDL - Código-fonte VHDL - исходный код VHDL - Zdrojový kód VHDL - Datoteka izvorne kode VHDL - VHDL-källkod - VHDL kaynak kodu - вихідний код мовою VHDL - VHDL 源代码 - VHDL 源碼 - VHDL - Very-High-Speed Integrated Circuit Hardware Description Language - - - - - - enriched text document - مستند نصي مغنى - zəngin mətn sənədi - azdobleny tekstavy dakument - Документ с обогатен текст - document de text enriquit - Rozšířený textový dokument - Dogfen testun wedi ei gyfoethogi - beriget tekstdokument - Angereichertes Textdokument - εγγραφο εμπλουτισμένου κειμένου - enriched text document - riĉigita teksta dokumento - documento de texto enriquecido - aberastutako testu dokumentua - rikastettu tekstiasiakirja - ríkað tekstskjal - document texte enrichi - cáipéis téacs saibhrithe - documento de texto enriquecido - מסמך טקסט מועשר - obogaćeni tekstualni dokument - enriched text dokumentum - dokumen teks diperkaya - Documento testo arricchito - リッチテキストドキュメント - пішімделген мәтіндік құжаты - 확장된 텍스트 문서 - praturtinto teksto dokumentas - bagātināta teksta formāts - Dokumen teks diperkaya - riktekst-dokument - verrijkt tekstdocument - rik tekst tekstdokument - Wzbogacony dokument tekstowy - documento de texto rico - Documento de texto enriquecido - document text îmbogățit - форматированный текстовый документ - Rozšírený textový dokument - dokument z obogatenim besedilom - Dokument teksti i pasuruar - обогаћени текстуални документ - berikat textdokument - форматований текстовий документ - tài liệu văn bản có kiểu dáng - 富文本文档 - 豐富化文字文件 - - - - help page - صفحة المساعدة - yardım səhifəsi - staronka dapamohi - Страница от помощта - pàgina d'ajuda - Stránka nápovědy - tudalen gymorth - hjælpeside - Hilfeseite - σελίδα βοήθειας - help page - help-paĝo - página de ayuda - laguntzako orria - ohjesivu - hjálparsíða - page d'aide - leathanach cabhrach - páxina de axuda - דף עזרה - stranica pomoći - súgóoldal - halaman bantuan - Pagina di aiuto - ヘルプページ - анықтама парағы - 도움말 페이지 - žinyno puslapis - palīdzības lapa - Halaman bantuan - hjelpside - hulppagina - hjelpeside - Strona pomocy - página de ajuda - Página de ajuda - pagină de ajutor - страница справки - Stránka Pomocníka - stran pomoči - Faqe ndihme - страна помоћи - hjälpsida - yardım sayfası - сторінка довідки - trang trợ giúp - 帮助页面 - 幫助頁面 - - - - plain text document - مستند نصي مجرد - prosty tekstavy dakument - Документ с неформатиран текст - document de text pla - Prostý textový dokument - rent tekstdokument - Einfaches Textdokument - έγγραφο απλού κειμένου - plain text document - plata teksta dokumento - documento de texto sencillo - testu soileko dokumentua - perustekstiasiakirja - document texte brut - cáipéis ghnáth-théacs - documento de texto sinxelo - מסמך טקסט פשוט - običan tekstualni dokument - egyszerű szöveg - dokumen teks biasa - Documento in testo semplice - 平文テキストドキュメント - мәтіндік құжаты - 일반 텍스트 문서 - paprastas tekstinis dokumentas - vienkāršs teksta dokuments - Dokumen teks jernih - vanlig tekstdokument - plattetekst-document - vanleg tekstdokument - Zwykły dokument tekstowy - documento em texto simples - Documento somente texto - document text simplu - текстовый документ - Obyčajný textový dokument - običajna besedilna datoteka - Dokument në tekst të thjeshtë - обичан текстуални документ - vanligt textdokument - звичайний текстовий документ - tài liệu nhập thô - 纯文本文档 - 純文字文件 - - - - - - - - - - RDF file - ملف RDF - Fajł RDF - Файл — RDF - fitxer RDF - Soubor RDF - RDF-fil - RDF-Datei - αρχείο RDF - RDF file - RDF-dosiero - archivo RDF - RDF fitxategia - RDF-tiedosto - RDF fíla - fichier RDF - comhad RDF - ficheiro RDF - קובץ RDF - RDF datoteka - RDF fájl - Arsip RDF - File RDF - RDF ファイル - RDF файлы - RDF 파일 - RDF failas - RDF datne - RDF-fil - RDF-bestand - RDF-fil - Plik RDF - Arquivo RDF - Fișier RDF - файл RDF - Súbor RDF - Datoteka RDF - File RDF - RDF-fil - файл RDF - Tập tin RDF - RDF 文件 - RDF 檔 - RDF - Resource Description Framework - - - - - - - - - email headers - ترويسة البريد الإلكتروني - epoçt başlıqları - paštovyja zahałoŭki - Заглавни части на електронни писма - capçaleres de correu electrònic - Záhlaví e-mailu - penawdau e-bost - posthoveder - E-Mail-Kopfzeilen - κεφαλίδες ηλ. μηνυμάτων - email headers - retpoŝtaj ĉapoj - cabeceras de correo electrónico - helbide elektronikoen goiburuak - sähköpostiotsakkeet - t-post tekshøvd - en-têtes de courriel - ceanntásca ríomhphoist - cabeceiras de correo electrónico - כותרת דוא"ל - zaglavlja e-pošte - levélfejléc - tajuk email - Intestazioni email - メールヘッダー - пошталық тақырыптамалары - 전자 우편 헤더 - el. laiško antraštės - e-pasta galvene - Pengepala emel - e-posthode - e-mail-kopregels - e-post-hovud - Nagłówki wiadomości e-mail - cabeçalhos de e-mail - Cabeçalhos de e-mail - antete email - почтовые заголовки - Hlavičky e-mailu - glava elektronske pošte - Header email - заглавља е-порука - e-posthuvuden - eposta başlığı - заголовки email - dòng đầu thư điện tử - 电子邮件头 - 電子郵件標頭 - - - - rich text document - مستند نصي غني - zəngin mətn sənədi - azdobleny tekstavy dakument - Документ — rich text - document de text enriquit - Textový dokument RTF - dogfen testun gyfoethog (rtf) - richtekstdokument - RTF-Textdokument - έγγραφο εμπλουτισμένου κειμένου (RTF) - rich text document - riĉteksta dokumento - documento de texto enriquecido - aberastutako testu formatua - RTF-asiakirja - document « rich text » - cáipéis mhéith-théacs - documento do texto enriquecido - מסמך טקסט עשיר - obogaćeni tekstualni dokument - rich text-dokumentum - dokumen teks kaya - Documento rich text - リッチテキストドキュメント - пішімделген мәтіні бар құжаты - 서식있는 텍스트 문서 - praturtinto teksto dokumentas - bagātā teksta dokuments - Dokumen teks diperkaya - rik tekst-dokument - opgemaakt tekstdocument - rik tekst-dokument - Dokument Rich Text - documento em texto rico - Documento rich text - document text îmbogățit - документ с форматированным текстом - Textový dokument RTF - dokument z oblikovanim besedilom - Dokument rich text - обогаћени текстуални документ - RTF-textdokument - форматований текстовий документ - tài liệu văn bản có kiểu dáng (RTF) - RTF 丰富文本文档 - 豐富文字文件 - - - - - RSS summary - ملخص RSS - Karotki ahlad RSS - Обобщение за сайтове — RSS - resum RSS - Souhrn RSS - RSS-sammendrag - RSS-Zusammenfassung - σύνοψη RSS - RSS summary - resumen RSS - RSS laburpena - RSS-tiivistelmä - RSS samandráttur - résumé RSS - achoimre RSS - Resumo RSS - תקציר RSS - RSS sažetak - RSS összefoglaló - Ringkasan RSS - Sommario RSS - RSS サマリ - RSS жинақталғаны - RSS 요약 - RSS santrauka - RSS kopsavilkums - RSS-sammendrag - RSS-samenvatting - RSS-samandrag - Podsumowanie RSS - Resumo RSS - Rezumat RSS - сводка RSS - Súhrn RSS - Datoteka povzetek RSS - Përmbledhje RSS - RSS-sammanfattning - зведення сайту RSS - Bản tóm tắt RSS - RSS 摘要 - RSS 摘要 - RSS - RDF Site Summary - - - - - - - - - - - Atom syndication feed - مروج تغذية Atom - Syndykacyjny kanał navinaŭ Atom - Емисия — Atom - canal de sindicació Atom - Kanál Atom - Atom syndication-feed - Atom-Nachrichtenquelle - Atom syndication feed - proveedor de noticias Atom - Atom harpidetze-iturria - Atom-yhdistevirta - fil de syndication Atom - fotha sindeacáitithe Atom - fonte de sindicación Atom - הזנה דרך הרשת של Atom - Atom egyesítőfolyam - Umpan sindikasi Atom - Feed di distribuzione Atom - Atom 配信フィード - Atom жаңалықтар таспасы - Atom 동기화 피드 - Atom sindikacijos kanalas - Atom sindikāta barotne - Atom syndikeringsstrøm - Atom-syndicatie-feed - Atom-kjelde - Kanał Atom - Fonte de notícias Atom - Flux agregare Atom - лента новостей Atom - Kanál Atom - Sindikalni vir Atom - Feed për përhapje Atom - Atom-syndikeringskanal - трансляція подач Atom - Nguồn tin tức Atom - Atom 更新种子 - Atom 聯合供稿饋流 - - - - - - - - - - OPML syndication feed - مروج تغذية OPML - Syndykacyjny kanał OPML - Емисия — OPML - canal de sindicació OPML - Kanál OPML - OPML-syndikeringsfeed - OPML-Nachrichtenquelle - ροή φορέα OPML - OPML syndication feed - proveedor de noticias OPML - OPML harpidetze-iturria - OPML-yhdistevirta - fil de syndication OPML - fotha sindeacáitithe OPML - fonte de sindicación OPML - הזנה דרך הרשת OPML - OPML egyesítőfolyam - Umpan sindikasi OPML - Feed di distribuzione OPML - OPML 配信フィード - OPML жаңалықтар таспасы - OPML 묶음 feed - OPML sindikacijos kanalas - OPML sindikāta barotne - OPML syndikeringsstrøm - OPML-syndicatie-feed - OPML-kjelde - Kanał OPML - Fonte de notícias OPML - Flux OPML syndication - лента новостей OPML - Kanál OPML - Sindikalni vir OPML - Feed për përhapje OPML - OPML-syndikeringskanal - трансляція подач OPML - Nguồn tin tức OPML - OPML 聚合种子 - OPML 聯合供稿饋流 - - - - - - - - - - SGML document - مستند SGML - Dakument SGML - Документ — SGML - document SGML - Dokument SGML - Dogfen SGML - SGML-dokument - SGML-Dokument - έγγραφο SGML - SGML document - SGML-dokumento - documento SGML - SGML dokumentua - SGML-asiakirja - SGML skjal - document SGML - cáipéis SGML - documento SGML - מסמך SGML - SGML dokument - SGML-dokumentum - Dokumen SGML - Documento SGML - SGML ドキュメント - SGML құжаты - SGML 문서 - SGML dokumentas - SGML dokuments - Dokumen SGML - SGML-dokument - SGML-document - SGML-dokument - Dokument SGML - documento SGML - Documento SGML - Document SGML - документ SGML - Dokument SGML - Dokument SGML - Dokument SGML - SGML документ - SGML-dokument - SGML belgesi - документ SGML - Tài liệu SGML - SGML 文档 - SGML 文件 - SGML - Standard Generalized Markup Language - - - - - - spreadsheet interchange document - مستند تبادل الجدول - dakument dla abmienu raźlikovymi arkušami - Документ за обмяна между програми за електронни таблици - document d'intercanvi de full de càlcul - Sešitový přenosový dokument - regnearksudvekslingsdokument - Tabellenkalkulations-Austauschdokument - έγγραφο ανταλλαγής λογιστικού φύλλου - spreadsheet interchange document - documento de intercambio de hojas de cálculo - kalkulu-orriak trukatzeko dokumentua - taulukkovälitysasiakirja - rokniarks umbýtisskjal - document d'échange de feuilles de calcul - cáipéis idirmhalartaithe scarbhileog - documento de intercambio de follas de cálculo - מסמך גליון נתונים מתחלף - spreadsheet-cserélhetődokumentum - dokumen lembar sebar saling tukar - Documento di scambio per foglio di calcolo - スプレッドシート交換ドキュメント - spreadsheet interchange құжаты - 스프레드시트 교환 문서 - skaičialenčių apsikeitimo dokumentas - izklājlapu apmaiņas dokuments - dokument for regnearkutveksling - rekenblad-uitwisselingsdocument - Utvekslingsdokument for rekneark - Dokument wymiany arkuszy kalkulacyjnych - Documento de intercâmbio de planilhas - document schimb filă de calcul - документ Spreadsheet Interchange - Zošitový prenosový dokument - dokument izmenjeve preglednic - Dokument shkëmbimi për fletë llogaritje - spreadsheet interchange-dokument - документ обміну ел. таблицями - tài liệu hoán đổi bảng tính - 电子表格交换文档 - 試算表交換文件 - - - - - - - - - TSV document - مستند TSV - Dakument TSV - Документ — TSV - document TSV - Dokument TSV - TSV-dokument - TSV-Dokument - έγγραφο TSV - TSV document - documento TSV - TSV dokumentua - TSV-asiakirja - TSV skjal - document TSV - cáipéis TSV - documento TSV - מסמך TSV - TSV dokument - TSV dokumentum - Dokumen TSV - Documento TSV - TSV ドキュメント - TSV құжаты - TSV 문서 - TSV dokumentas - TSV dokuments - TSV-dokument - TSV-document - TSV-dokument - Dokument TSV - Documento TSV - Document TSV - документ TSV - Dokument TSV - Dokument TSV - Dokument TSV - TSV-dokument - документ TSV - Tài liệu TSV - TSV 文档 - TSV 文件 - TSV - Tab Separated Values - - - - - Graphviz DOT graph - مبيان Graphviz DOT - Граф — Graphviz DOT - gràfic Graphviz DOT - Graf Graphviz DOT - Graphviz DOT-graf - Graphviz-DOT-Graph - Γράφημα Graphviz DOT - Graphviz DOT graph - gráfico Graphviz DOT - Graphviz DOT grafikoa - Graphviz DOT -graafi - Graphviz DOT ritmynd - graphe Graphviz DOT - graf DOT Graphviz - gráfica DOT de Graphviz - גרף של Graphviz DOT - Graphviz DOT grafikon - Graphviz DOT-grafikon - Grafik Graphviz DOT - Grafico Graphviz DOT - Graphviz DOT グラフ - Graphviz DOT сызбасы - Graphviz DOT 그래프 - Graphviz DOT diagrama - Graphviz DOT grafiks - Graphviz wetenschappelijke grafiek - Wykres DOT Graphviz - Gráfico do Graphviz DOT - Grafic Graphviz DOT - Диаграмма Graphviz DOT - Graf Graphviz DOT - Datoteka grafikona Graphviz DOT - Graphviz DOT-graf - граф DOT Graphviz - Biểu đồ DOT Graphviz - Graphviz DOT 科学图形 - Graphviz DOT 圖 - - - - - - - - - - - - JAD document - مستند JAD - Dakument JAD - Документ — JAD - document JAD - Dokument JAD - JAD-dokument - JAD-Dokument - έγγραφο JAD - JAD document - JAD-dokumento - documento JAD - JAD dokumentua - JAD-asiakirja - JAD skjal - document JAD - cáipéis JAD - documento JAD - מסמך JAD - JAD dokument - JAD dokumentum - Dokumen JAD - Documento JAD - JAD ドキュメント - JAD құжаты - JAD 문서 - JAD dokumentas - JAD dokuments - JAD-dokument - JAD-document - JAD-dokument - Dokument JAD - Documento JAD - Document JAD - документ JAD - Dokument JAD - Dokument JAD - Dokument JAD - JAD-dokument - JAD belgesi - документ JAD - Tài liệu JAD - JAD 文档 - JAD 文件 - JAD - Java Application Descriptor - - - - - - - WML document - مستند WML - WML sənədi - Dakument WML - Документ — WML - document WML - Dokument WML - Dogfen WML - WML-dokument - WML-Dokument - έγγραφο WML - WML document - WML-dokumento - documento WML - WML dokumentua - WML-asiakirja - WML skjal - document WML - cáipéis WML - documento WML - מסמך WML - WML dokument - WML-dokumentum - Dokumen WML - Documento WML - WML ドキュメント - WML құжаты - WML 문서 - WML dokumentas - WML dokuments - Dokumen XML - WML-dokument - WML-document - WML-dokument - Dokument WML - documento WML - Documento WML - Document WML - документ WML - Dokument WML - Dokument WML - Dokument WML - WML документ - WML-dokument - WML belgesi - документ WML - Tài liệu WML - WML 文档 - WML 文件 - WML - Wireless Markup Language - - - - - WMLScript program - برنامج WMLScript - Prahrama WMLScript - Програма — WMLScript - programa WMLScript - Program WMLScript - WMLScript-program - WMLScript-Programm - πρόγραμμα WMLScript - WMLScript program - programa en WMLScript - WMLScript programa - WMLScript-ohjelma - WMLScript forrit - programme WMLScript - ríomhchlár WMLScript - programa en WMLScript - תוכנית של WMLScript - WMLScript program - WMLScript program - Program WMLScript - Programma WMLScript - WMLScript プログラム - WMLScript бағдарламасы - WMLScript 프로그램 - WMLScript programa - WMLScript programma - WMLScript-program - WMLScript-programma - WMLScript-program - Pogram WMLScript - Programa WMLScript - Program WMLScript - сценарий WMLScript - Program WMLScript - Programska datoteka WMLScript - Program WMLScript - WMLScript-program - WMLScript programı - програма мовою WMLScript - Chương trình WMLScript - WMLScript 程序 - WMLScript 程式 - - - - ACE archive - أرشيف ACE - Archiŭ ACE - Архив — ACE - arxiu ACE - Archiv ACE - ACE-arkiv - ACE-Archiv - αρχείο ACE - ACE archive - ACE-arkivo - archivador ACE - ACE artxiboa - ACE-arkisto - ACE skjalasavn - archive ACE - cartlann ACE - arquivo ACE - ארכיון ACE - ACE arhiva - ACE archívum - Arsip ACE - Archivio ACE - ACE アーカイブ - ACE არქივი - ACE архиві - ACE 압축 파일 - ACE archyvas - ACE arhīvs - ACE-arkiv - ACE-archief - ACE-arkiv - Archiwum ACE - Pacote ACE - Arhivă ACE - архив ACE - Archív ACE - Datoteka arhiva ACE - Arkiv ACE - ACE-arkiv - ACE arşivi - архів ACE - Kho nén ACE - ACE 归档文件 - ACE 封存檔 - - - - - - - - Ada source code - شفرة مصدر Ada - Kryničny kod Ada - Изходен код — Ada - codi font en Ada - Zdrojový kód v Adě - Ada-kildekode - Ada-Quelltext - πηγαίος κώδικας Ada - Ada source code - Ada-fontkodo - código fuente en Ada - Ada iturburu-kodea - Ada-lähdekoodi - Ada keldukota - code source Ada - cód foinseach Ada - código fonte en Ada - קוד מקור Ada - Ada izvorni kod - Ada-forráskód - Kode program Ada - Codice sorgente Ada - Ada ソースコード - Ada-ის საწყისი კოდი - Ada бастапқы коды - Ada 소스 코드 - Ada pradinis kodas - Ada pirmkods - Kod sumber Ada - Ada-kildekode - Ada-broncode - Ada-kjeldekode - Kod źródłowy Ada - código fonte Ada - Código-fonte Ada - Cod sursă Ada - исходный код Ada - Zdrojový kód jazyka Ada - Datoteka izvorne kode Ada - Kod burues Ada - Ада изворни ко̂д - Ada-källkod - Ada kaynak kodu - вихідний код мовою Ada - Mã nguồn Ada - Ada 源代码 - Ada 源碼 - - - - - - author list - لائحة المؤلف - śpis aŭtaraŭ - Списък на авторите - llista d'autors - Seznam autorů - forfatterliste - Autorenliste - κατάλογος συγγραφέων - author list - listo de aŭtoroj - lista de autores - egile-zerrenda - tekijäluettelo - høvundalisti - liste d'auteurs - liosta údar - lista de autores - רשימת יוצרים - szerzőlista - senarai penulis - Elenco autori - 著者リスト - авторлар тізімі - 저자 목록 - autorių sąrašas - autoru saraksts - Senarai penulis - forfatterliste - auteurslijst - forfattarliste - Lista autorów - lista de autores - Lista de autores - listă autori - список авторов - Zoznam autorov - seznam avtorjev - Lista e autorëve - списак аутора - författarlista - yazar listesi - перелік авторів - danh sách tác giả - 作者列表 - 作者清單 - - - - - BibTeX document - مستند BibTeX - Dakument BibTeX - Документ — BibTeX - document BibTeX - Dokument BibTeX - BibTeX-dokument - BibTeX-Dokument - έγγραφο BibTeX - BibTeX document - BibTeX-dokumento - documento BibTeX - BibTeX dokumentua - BibTeX-asiakirja - BibTeX skjal - document BibTeX - cáipéis BibTeX - documento BibTex - מסמך BibTeX - BibTeX dokument - BibTeX dokumentum - Dokumen BibTeX - Documento BibTeX - BibTeX ドキュメント - BibTeX-ის დოკუმენტი - BibTeX құжаты - BibTeX 문서 - BibTeX dokumentas - BibTeX dokuments - BibTeX-dokument - BibTeX-document - BibTeX-dokument - Dokument BibTeX - Documento BibTeX - Document BibTeX - документ BibTeX - Dokument BibTeX - Dokument BibTeX - Dokument BibTeX - BibTeX-dokument - BibTeX belgesi - документ BibTeX - Tài liệu BibTeX - BibTeX 文档 - BibTeX 文件 - - - - - - - - C++ header - ترويسة سي++ - Zahałoŭny fajł C++ - Заглавен файл — C++ - capçalera en C++ - Záhlaví v C++ - C++-posthoved - C++-Header - κεφαλίδα C++ - C++ header - cabecera de código fuente en C++ - C++ goiburua - C++-otsake - C++ tekshøvd - en-tête C++ - ceanntásc C++ - cabeceira de código fonte en C++ - כותר ++C - C++ zaglavlje - C++ fejléc - Tajuk C++ - Header C++ - C++ ヘッダー - C++-ის თავსართი - C++ тақырыптама файлы - C++ 헤더 - C++ antraštė - C++ galvene - C++-kildekodeheader - C++-header - C++-kjeldekode-hovud - Plik nagłówkowy C++ - Cabeçalho C++ - Antet C++ - заголовочный файл C++ - Hlavičky jazyka C++ - Datoteka glave C++ - Header C++ - C++-huvud - файл заголовків мовою C++ - Phần đầu mã nguồn C++ - C++ 源代码头文件 - C++ 標頭檔 - - - - - - - - - C++ source code - شفرة مصدر سي++ - Kryničny kod C++ - Изходен код — C++ - codi font en C++ - Zdrojový kód v C++ - C++-kildekode - C++-Quelltext - πηγαίος κώδικας C++ - C++ source code - C++-fontkodo - código fuente en C++ - C++ iturburu-kodea - C++-lähdekoodi - C++ keldukota - code source C++ - cód foinseach C++ - código fonte de C++ - קוד מקור של C++ - C++ izvorni kod - C++-forráskód - Kode program C++ - Codice sorgente C++ - C++ ソースコード - C++-ის საწყისი კოდი - C++ бастапқы коды - C++ 소스 코드 - C++ pradinis kodas - C++ pirmkods - Kod sumber C++ - C++-kildekode - C++-broncode - C++-kjeldekode - Kod źródłowy C++ - código fonte C++ - Código-fonte C++ - Cod sursă C++ - исходный код C++ - Zdrojový kód jazyka C++ - Datoteka izvorne kode C++ - Kod burues C++ - C++ изворни ко̂д - C++-källkod - вихідний код мовою C++ - Mã nguồn C++ - C++ 源代码 - C++ 源碼 - - - - - - - - - ChangeLog document - مستند ChangeLog - Dakument zafiksavanych źmienaŭ ChangeLog - Дневник за промени — ChangeLog - document de registre de canvis - Dokument ChangeLog - ChangeLot-dokument - Änderungsprotokoll - έγγραφο ChangeLog - ChangeLog document - documento de cambios - ChangeLog dokumentua - Muutoslokiasiakirja - ChangeLog skjal - document ChangeLog - cáipéis ChangeLog - documento Changelog - מסמך של ChangeLog - ChangeLog dokumentum - Dokumen ChangeLog - Documento ChangeLog - ChangeLog ドキュメント - ChangeLog დოკუმენტი - ChangeLog құжаты - ChangeLog 문서 - ChangeLog dokumentas - ChangeLog dokuments - ChangeLog-dokument - ChangeLog-document - ChangeLog-dokument - Dokument zmian (ChangeLog) - Documento ChangeLog - Document ChangeLog - протокол изменений - Dokument ChangeLog - Dokument ChangeLog - Dokument ChangeLog - Ändringsloggsdokument - документ ChangeLog - Tài liệu ChangeLog (ghi lưu thay đổi) - 变更日志文档 - ChangeLog 文件 - - - - - C header - ترويسة C - Zahałoŭny fajł C - Заглавен файл — C - capçalera en C - Záhlaví v C - C-posthoved - C-Header - κεφαλίδα C - C header - cabecera de código fuente en C - C goiburua - C-otsake - C tekshøvd - en-tête C - ceanntásc C - cabeceira de códifo fonte de C - כותר C - C zaglavlje - C fejléc - Tajuk C - Header C - C ヘッダー - C-ის თავსართი - C тақырыптама файлы - C 헤더 - C antraštė - C galvene - C-kildekodeheader - C-header - C-kjeldekode-hovud - Plik nagłówkowy C - Cabeçalho C - Antet C - заголовочный файл C - Hlavičky jazyka C - Datoteka glave C - Header C - C-huvud - C başlığı - файл заголовків мовою C - Phần đầu mã nguồn C - C 程序头文件 - C 標頭檔 - - - - - CMake source code - شفرة مصدر CMake - Kryničny kod CMake - Изходен код — CMake - codi font en CMake - Zdrojový kód CMake - CMake-kildekode - CMake-Quelltext - πηγαίος κώδικας CMake - CMake source code - CMake-fontkodo - código fuente en CMake - CMake iturburu-kodea - CMake-lähdekoodi - CMake keldukota - code source CMake - cód foinseach CMake - código fonte de CMake - קוד מקור של CMake - CMake izvorni kod - CMake-forráskód - Kode program CMake - Codice sorgente CMake - CMake ソースコード - CMake-ის საწყისი კოდი - CMake бастапқы коды - CMake 소스 코드 - CMake pirminis tekstas - CMake pirmkods - CMake-kildekode - CMake-broncode - CMake-kjeldekode - Kod źródłowy CMake - Código-fonte CMake - Cod sursă CMake - исходный код CMake - Zdrojový kód CMake - Datoteka izvorne kode CMake - Kod burues CMake - CMake-källkod - вихідний код CMake - Mã nguồn CMake - CMake 源代码 - CMake 源碼 - - - - - - CSV document - مستند CSV - Dakument CSV - Документ — CSV - document CSV - Dokument CSV - CSV-dokument - CSV-Dokument - αρχείο CSV - CSV document - CSV-dokumento - documento CSV - CSV dokumentua - CSV-asiakirja - CSV skjal - document CSV - cáipéis CSV - documento CSV - מסמך CSV - CSV dokument - CSV dokumentum - Dokumen CSV - Documento CSV - CSV ドキュメント - CSV დოკუმენტი - CSV құжаты - CSV 문서 - CSV dokumentas - CSV dokuments - CSV-dokument - CSV-document - CSV-dokument - Dokument CSV - Documento CSV - Document CSV - документ CSV - Dokument CSV - Dokument CSV - Dokument CSV - CSV-dokument - документ CSV - Tài liệu CSV - CSV 文档 - CSV 文件 - CSV - Comma Separated Values - - - - - - - license terms - شروط الترخيص - licenzijnyja ŭmovy - Лицензни условия - condicions de llicència - Licenční podmínky - licensbetingelser - Lizenzbedingungen - όροι άδειας - licence terms - términos de licencia - lizentzia baldintzak - lisenssiehdot - loyvistreytir - termes de licence - téarmaí ceadúnais - termos de licenza - תנאי רישיון - uvjeti licence - licencfeltételek - persyaratan lisensi - Termini di licenza - ソフトウェアライセンス条項 - лицензиялық келісімі - 라이선스 조항 - licencijos sąlygos - licences nosacījumi - lisensbestemmelser - licentievoorwaarden - lisensvilkår - Warunki licencji - Termos de licença - termeni de licență - лицензионное соглашение - Licenčné podmienky - pogoji in dovoljenja uporabe - Kushte liçence - licensvillkor - ліцензійні умови - điều kiện giấy phép - 软件许可条款 - 授權條款 - - - - - author credits - شكر وتقدير المؤلف - zasłuhi aŭtara - Благодарности към авторите - atribucions d'autor - Autorské zásluhy - bidragydere - Autorendanksagung - author credits - reconocimiento de autoría - tekijöiden kiitokset - høvundaheiður - remerciements - admhálacha údar - créditos de autor - קרדיטים של היוצר - szerzők listája - kredit penulis - Riconoscimenti autori - ソフトウェア作者クレジット - бағдарлама авторлары - 저작자 크레딧 - padėkos autoriams - veidotāji - liste med bidragsytere - auteursinformatie - forfattarliste - Podziękowania autorów programu - Créditos do autor - mulțumiri autori - авторы программы - Autorské zásluhy - avtorske zasluge - Kreditë e autorëve - författarlista - подяки авторам програми - công trạng tác giả - 软件作者致谢 - 作者致謝名單 - - - - - C source code - شفرة مصدر سي - Kryničny kod C - Изходен код — C - codi font en C - Zdrojový kód v C - C-kildekode - C-Quelltext - πηγαίος κώδικας C - C source code - C-fontkodo - código fuente en C - C iturburu-kodea - C-lähdekoodi - C keldukota - code source C - cód foinseach C - código fonte en C - קוד מקור של C - C izvorni kod - C-forráskód - Kode program C - Codice sorgente C - C ソースコード - C-ის საწყისი კოდი - C бастапқы коды - C 소스 코드 - C pradinis kodas - C pirmkods - Kod sumber C - C-kildekode - C-broncode - C-kjeldekode - Kod źródłowy C - código fonte C - Código-fonte C - Cod sursă C - исходный код C - Zdrojový kód jazyka C - Datoteka izvorne kode C - Kod burues C - C изворни ко̂д - C-källkod - C kaynak kodu - вихідний код мовою C - Mã nguồn C - C 源代码 - C 源碼 - - - - - - - - - - - C# source code - شفرة مصدر سي# - Kryničny kod C# - Изходен код — C# - codi font en C# - Zdrojový kód v C# - C#-kildekode - C#-Quelltext - πηγαίος κώδικας C# - C# source code - C#-fontkodo - código fuente en C# - C# iturburu-kodea - C#-lähdekoodi - C# keldukota - code source C# - cód foinseach C# - código fonte en C# - קוד מקור של C# - C# izvorni kod - C#-forráskód - Kode program C# - Codice sorgente C# - C# ソースコード - C#-ის საწყისი კოდი - C# бастапқы коды - C# 소스 코드 - C# pradinis kodas - C# pirmkods - Kod sumber C# - C#-kildekode - C#-broncode - C#-kjeldekode - Kod źródłowy C# - código fonte C# - Código-fonte C# - Cod sursă C# - исходный код C# - Zdrojový kód jazyka C# - Datoteka izvorne kode C# - Kod burues C# - C# изворни ко̂д - C#-källkod - C# kaynak kodu - вихідний код мовою C# - Mã nguồn C# - C# 源代码 - C# 源碼 - - - - - Vala source code - شفرة مصدر Vala - Kryničny kod Vala - Изходен код — Vala - codi font en Vala - Zdrojový kód Vala - Valakildekode - Vala-Quelltext - πηγαίος κώδικας Vala - Vala source code - Vala-fontkodo - código fuente en Vala - Vala iturburu-kodea - Vala-lähdekoodi - Vala keldukota - code source Vala - cód foinseach Vala - código fonte en Vala - קוד מקור של Vala - Vala izvorni kod - Vala forráskód - Kode program Vala - Codice sorgente Vala - Vala ソースコード - Vala бастапқы коды - Vala 소스 코드 - Vala pradinis kodas - Vala pirmkods - Vala-kildekode - Vala-broncode - Vala-kjeldekode - Kod źródłowy Vala - Código-fonte Vala - Cod sursă Vala - исходный код Vala - Zdrojový kód Vala - Datoteka izvorne kode Vala - Kod burues Vala - Vala-källkod - Vala kaynak kodu - вихідний код мовою Vala - Mã nguồn Vala - Vala 源代码 - Vala 源碼 - - - - - - OOC source code - Изходен код — OOC - codi font en OOC - Zdrojový kód OOC - OOC-kildekode - OOC-Quellcode - πηγαίος κώδικας OOC - OOC source code - OOC-fontkodo - Código fuente en OOC - OOC-lähdekoodi - source code OOC - código fonte de OOC - קוד מקור של OOC - OOC izvorni kod - OOC forráskód - Kode sumber OOC - Codice sorgente OOC - OOC ソースコード - OOC-ის საწყისი კოდი - OOC бастапқы коды - OOC 소스 코드 - OOC pirmkods - OOC broncode - Kod źródłowy OOC - Código-fonte OOC - исходный код OOC - Izvorna koda OOC - OOC-källkod - вихідний код мовою OOC - OOC - OOC 源碼 - OOC - Out Of Class - - - - - DCL script - سكربت DCL - DCL skripti - Skrypt DCL - Скрипт — DCL - script DCL - Skript DCL - Sgript DCL - DCL-program - DCL-Skript - πρόγραμμα εντολών DCL - DCL script - DCL-skripto - script en DCL - DCL script-a - DCL-komentotiedosto - DCL boðrøð - script DCL - script DCL - script de DCL - תסריט DCL - DCL skripta - DCL-parancsfájl - Skrip DCL - Script DCL - DCL スクリプト - DCL სცენარი - DCL сценарийі - DCL 스크립트 - DCL scenarijus - DCL skripts - Skrip DCL - DCL-skript - DCL-script - DCL-skript - Skrypt DCL - 'script' DCL - Script DCL - Script DCL - сценарий DCL - Skript DCL - Skriptna datoteka DCL - Script DCL - DCL скрипта - DCL-skript - DCL betiği - скрипт DCL - Văn lệnh DCL - DCL 脚本 - DCL 指令稿 - DCL - Data Conversion Laboratory - - - - - DSSSL document - مستند DSSSL - DSSSL sənədi - Dakument DSSSL - Документ — DSSSL - document DSSSL - Dokument DSSSL - Dogfen DSSSL - DSSSL-dokument - DSSSL-Dokument - έγγραφο DSSSL - DSSSL document - DSSSL-dokumento - documento DSSSL - DSSSL dokumentua - DSSSL-asiakirja - DSSSL skjal - document DSSSL - cáipéis DSSSL - documento DSSSL - מסמך DSSSL - DSSSL dokument - DSSSL-dokumentum - Dokumen DSSSL - Documento DSSSL - DSSSL ドキュメント - DSSSL დოკუმენტი - DSSSL құжаты - DSSSL 문서 - DSSSL dokumentas - DSSSL dokuments - Dokumen DSSSL - DSSSL-dokument - DSSSL-document - DSSSL-dokument - Dokument DSSSL - documento DSSSL - Documento DSSSL - Document DSSSL - документ DSSSL - Dokument DSSSL - Dokument DSSSL - Dokument DSSSL - DSSSL документ - DSSSL-dokument - DSSSL belgesi - документ DSSSL - Tài liệu DSSSL - DSSSL 文档 - DSSSL 文件 - DSSSL - Document Style Semantics and Specification Language - - - - - D source code - شفرة مصدر D - Kryničny kod D - Изходен код — D - codi font en D - Zdrojový kód v D - D-kildekode - D-Quelltext - πηγαίος κώδικας D - D source code - D-fontkodo - código fuente en D - D iturburu-kodea - D-lähdekoodi - D keldukota - code source D - cód foinseach D - código fonte de D - קוד מקור לשפת D - D izvorni kod - D-forráskód - Kode program D - Codice sorgente D - D ソースコード - D-ის საწყისი კოდი - D бастапқы коды - D 소스 코드 - D pradinis kodas - D pirmkods - D-kildekode - D-broncode - D-kjeldekode - Kod źródłowy D - Código-fonte D - Cod sursă D - исходный код D - Zdrojový kód jazyka D - Datoteka izvorne kode D - Kod burues D - D изворни ко̂д - D-källkod - вихідний код мовою D - Mã nguồn D - D 源代码 - D 源碼 - - - - - - DTD file - ملف DTD - Fajł DTD - Документ — DTD - fitxer DTD - Soubor DTD - DTD-fil - DTD-Datei - αρχείο DTD - DTD file - DTD-dosiero - archivo DTD - DTD fitxategia - DTD-tiedosto - DTD fíla - fichier DTD - comhad DTD - ficheiro DTD - מסמך DTD - DTD datoteka - DTD fájl - Berkas DTD - File DTD - DTD ファイル - DTD ფაილი - DTD файлы - DTD 파일 - DTD failas - DTD datne - DTD-fil - DTD-bestand - DTD-fil - Plik DTD - Arquivo DTD - Fișier DTD - файл DTD - Súbor DTD - Datoteka DTD - File DTD - DTD-fil - DTD dosyası - файл DTD - Tập tin DTD - DTD 文件 - DTD 檔 - DTD - Document Type Definition - - - - - - - Eiffel source code - شفرة مصدر Eiffel - Kryničny kod Eiffel - Изходен код — Eiffel - codi font en Eiffel - Zdrojový kód Eiffel - Eiffelkildekode - Eiffel-Quelltext - πηγαίος κώδικας Eiffel - Eiffel source code - Eiffel-fontkodo - código fuente en Eiffel - Eiffel iturburu-kodea - Eiffel-lähdekoodi - Eiffel keldukota - code source Eiffel - cód foinseach Eiffel - código fone de Eiffel - קוד מקור של Eiffel - Eiffel izvorni kod - Eiffel forráskód - Kode program Eiffel - Codice sorgente Eiffel - Eiffel ソースコード - Eiffel-ის საწყისი კოდი - Eiffel бастапқы коды - Eiffel 소스 코드 - Eiffel pirminis programos tekstas - Eiffel pirmkods - Eiffel-kildekode - Eiffel-broncode - Eiffel-kjeldekode - Kod źródłowy Eiffel - Código-fonte Eiffel - Cod sursă Eiffel - исходный код Eiffel - Zdrojový kód Eiffel - Datoteka izvorne kode Eiffel - Kod burues Eiffel - Eiffel-källkod - Eiffel kaynak kodu - вихідний код мовою Eiffel - Mã nguồn Eiffel - Eiffel 源代码 - Eiffel 源碼 - - - - - - Emacs Lisp source code - شفرة مصدر Emacs Lisp - Emacs Lisp mənbə kodu - Kryničny kod Emacs Lisp - Изходен код — Emacs Lisp - codi font en Emacs Lisp - Zdrojový kód Emacs Lisp - Ffynhonnell rhaglen EMACS LISP - Emacs Lisp-kildekode - Emacs-Lisp-Quelltext - πηγαίος κώδικας Emacs Lisp - Emacs Lisp source code - fontkodo en Emacs Lisp - código fuente en Lisp de Emacs - Emacs Lisp iturburu-kodea - Emacs Lisp -lähdekoodi - Emacs Lisp keldukota - code source Emacs Lisp - cód foinseach Emacs Lisp - código fonte de Emacs Lisp - קוד מקור של Emcas Lisp - Emacs Lisp izvorni kod - Emacs Lisp-forráskód - Kode sumber Emacs Lisp - Codice sorgente Emacs Lisp - Emacs Lisp ソースコード - Emacs-ის Lisp საწყისი კოდი - Emacs Lisp бастапқы коды - Emacs Lisp 소스 코드 - Emacs Lisp pradinis kodas - Emacs Lisp pirmkods - Kod sumber Emacs Lisp - Emacs Lisp-kildekode - Emacs Lisp-broncode - Emacs Lisp kjeldekode - Plik źródłowy Emacs Lisp - código fonte Emacs Lisp - Código-fonte Lisp do Emacs - Cod sursă Emacs Lisp - исходный код Emacs Lisp - Zdrojový kód Emacs Lisp - Datoteka izvorne kode Emacs Lisp - Kod burues Emacs Lisp - Емакс Лисп изворни ко̂д - Emacs Lisp-källkod - Emacs Lisp kaynak kodu - вихідний код мовою Emacs Lisp - Mã nguồn Lisp Emacs - Emacs Lisp 源代码 - Emacs Lisp 源碼 - - - - - - - - - Erlang source code - شفرة مصدر Erlang - Kryničny kod Erlang - Изходен код — Erlang - codi font en Erlang - Zdrojový kód Erlang - Erlangkildekode - Erlang-Quelltext - πηγαίος κώδικας Erlang - Erlang source code - Erlang-fontkodo - código fuente en Erlang - Erlang iturburu-kodea - Erlang-lähdekoodi - Erlang keldukota - code source Erlang - cód foinseach Erlang - código fonte de Erlang - קוד מקור של Erlang - Erlang izvorni kod - Erlang forráskód - Kode program Erlang - Codice sorgente Erlang - Erlang ソースコード - Erlang-ის საწყისი კოდი - Erlang бастапқы коды - Erlang 소스 코드 - Erlang pradinis kodas - Erlang pirmkods - Erlang-kildekode - Erlang-broncode - Erlang-kjeldekode - Kod źródłowy Erlang - Código-fonte Erlang - Cod sursă Erlang - исходный код Erlang - Zdrojový kód Erlang - Datoteka izvorne kode Erlang - Kod burues Erlang - Erlang-källkod - Erlang kaynak kodu - вихідний код мовою Erlang - Mã nguồn Erlang - Erlang 源代码 - Erlang 源碼 - - - - - Fortran source code - شفرة مصدر Fortran - Fortran mənbə kodu - Kryničny kod Fortran - Изходен код — Fortran - codi font en Fortran - Zdrojový kód Fortran - Ffynhonnell rhaglen FORTRAN - Fortrankildekode - Fortran-Quelltext - πηγαίος κώδικας Fortran - Fortran source code - Fotran-fontkodo - código fuente en Fortran - Fortran-en iturburu-kodea - Fortran-lähdekoodi - Fortran keldukota - code source Fortran - cód foinseach Fortran - código fonte de Fortran - קוד מקור של Fortran - Fortran izvorni kod - Fortran-forráskód - Kode program Fortran - Codice sorgente Fortran - Fortran ソースコード - Fortran-ის საწყისი კოდი - Fortran бастапқы коды - 포트란 소스 코드 - Fortran pradinis kodas - Fortran pirmkods - kod sumber Fortran - Fortran-kildekode - Fortran-broncode - Fortran-kjeldekode - Kod źródłowy Fortran - código fonte Fortran - Código-fonte Fortran - Cod sursă Fortran - исходный код Fortran - Zdrojový kód Fortran - Datoteka izvorne kode Fortran - Kod burues Fortran - Фортран изворни ко̂д - Fortran-källkod - Fortran kaynak kodu - вихідний код мовою Fortran - Mã nguồn Fortran - Fortran 源代码 - Fortran 源碼 - - - - - - - - translation file - ملف الترجمة - fajł pierakładu - Превод - fitxer traducció - Soubor překladu - oversættelsesfil - Übersetzungsdatei - αρχείο μετάφρασης - translation file - tradukad-dosiero - archivo de traducción - itzulpen-fitxategia - käännöstiedosto - týðingarfíla - fichier de traduction - comhad aistrithe - ficheiro de tradución - קובץ תרגום - datoteka prijevoda - fordítási fájl - berkas terjemahan - File traduzione - 翻訳ファイル - თარგმნის ფაილი - аудармалар файлы - 번역 파일 - vertimo failas - tulkošanas datne - oversettelsesfil - vertalingsbestand - omsetjingsfil - Plik tłumaczenia - Arquivo de tradução - fișier traducere - файл переводов - Súbor prekladu - datoteka prevoda programa - File përkthimesh - översättningsfil - файл перекладу - tập tin dịch - 消息翻译文件 - 翻譯檔 - - - - - - - translation template - قالب الترجمة - šablon dla pierakładu - Шаблон за преводи - plantilla de traducció - Šablona překladu - oversættelsesskabelon - Übersetzungsvorlage - πρότυπο μετάφρασης - translation template - tradukad-ŝablono - plantilla de traducción - itzulpenen txantiloia - käännösmalli - týðingarformur - modèle de traduction - teimpléad aistrithe - plantilla de tradución - תבנית תרגום - predložak prijevoda - fordítási sablon - templat terjemahan - Modello di traduzione - 翻訳テンプレート - თარგმნის შაბლონი - аудармалар үлгісі - 메시지 번역 서식 - vertimo šablonas - tulkošanas veidne - mal for oversetting - vertalingssjabloon - omsetjingsmal - Szablon tłumaczenia - Modelo de tradução - șablon de traducere - шаблон переводов - Šablóna prekladu - predloga datoteke prevoda programa - Model përkthimesh - översättningsmall - шаблон перекладу - mẫu dịch - 消息翻译模板 - 翻譯模版 - - - - - - - - - HTML document - مستند HTML - Dakument HTML - Документ — HTML - document HTML - Dokument HTML - HTML-dokument - HTML-Dokument - έγγραφο HTML - HTML document - HTML-dokumento - documento HTML - HTML dokumentua - HTML-asiakirja - HTML skjal - document HTML - cáipéis HTML - documento HTML - מסמך HTML - HTML dokument - HTML dokumentum - Dokumen HTML - Documento HTML - HTML ドキュメント - HTML құжаты - HTML 문서 - HTML dokumentas - HTML dokuments - HTML-dokument - HTML-document - HTML-dokument - Dokument HTML - Documento HTML - Document HTML - документ HTML - Dokument HTML - Dokument HTML - Dokument HTML - HTML-dokument - документ HTML - Tài liệu HTML - HTML 文档 - HTML 文件 - HTML - HyperText Markup Language - - - - - - - - - - - - - - - - - - - - - - - - - Web application cache manifest - قائمة التخزين الموقت لتطبيق الويب - Манифест за кеша на уеб приложение - manifest de memòria cau d'aplicació Web - Manifest mezipaměti webové aplikace - Manifest for internetprogrammellemlager - Webanwendungscache-Manifest - Web application cache manifest - manifiesto de caché de aplicación web - Web aplikazioaren cache-aren agiria - Net nýtsluskipanarkova manifest - manifeste de cache d'application Web - lastliosta taisce d'fheidhmchlár Gréasáin - manifesto de caché de aplicativo web - הצהרה של מטמון של תוכנית ברשת - Webalkalmazás gyorsítótár-összefoglalója - Manifes singgahan aplikasi web - Manifesto cache applicazione Web - Web アプリケーションキャッシュ manifest - Веб қолданбасының кэш манифесті - 웹 애플리케이션 캐시 정의 - Žiniatinklio programos podėlio manifestas - Tīmekļa lietotņu keša manifests - Webapplicatie cache manifest - Manifest pamięci podręcznej aplikacji WWW - Manifest de cache de aplicação web - Manifest de cache pentru aplicații web - манифест кэша веб-приложения - Predpomnilnik spletnega programa - Cachemanifest för webbapplikation - маніфест кешу веб-програми - 网络应用程序缓存清单 - 網頁應用程式快取聲明 - - - - - - - - - - - - - Google Video Pointer - مؤشر فيديو جوجل - Pakazalnik Google Video - Документ-указател към видео на Google - apuntador a vídeo de Google - Google Video Pointer - Google Video-peger - Google Video Pointer - Google Video Pointer - lista de reproducción de Google Video (GVP) - Google Video-ren erreprodukzio-zerrenda - Google-video-osoitin - Google Video Pointer - pointeur vidéo Google - pointeoir Google Video - punteiro de vídeo de Google - מצביע וידאו של Google - Google Video Pointer - Google Video Pointer - Puntatore Google Video - Google ビデオポインター - Google Video Pointer - 구글 비디오 포인터 - Google Video Pointer - Google Video Pointer - Peker til Google Video - Google-videoverwijzing - Google Video-peikar - Lista odtwarzania Google Video - Ponteiro do Google Vídeo - Indicator Google Video - Google Video Pointer - Google Video Pointer - Kazalec Google Video - Puntues Google Video - Google Video-pekare - вказівник відео Google - Con trỏ ảnh động Google - Google 视频指向 - Google Video Pointer - - - - - - - - - Haskell source code - شفرة مصدر Haskell - Haskell mənbə kodu - Kryničny kod Haskell - Изходен код на Haskell - codi font en Haskell - Zdrojový kód Haskell - Ffynhonnell rhaglen Haskell - Haskellkildekode - Haskell-Quelltext - πηγαίος κώδικας Haskell - Haskell source code - Haskell-fontkodo - código fuente en Haskell - Haskell iturburu-kodea - Haskell-lähdekoodi - Haskell keldukota - code source Haskell - cód foinseach Haskell - código fonte de Haskell - קוד מקור של Haskell - Haskell izvorni kod - Haskell-forráskód - Kode program Haskell - Codice sorgente Haskell - Haskell ソースコード - Haskell бастапқы коды - Haskell 소스 코드 - Haskell pradinis kodas - Haskell pirmkods - Kod sumber Haskell - Haskell-kildekode - Haskell-broncode - Haskell-kjeldekode - Kod źródłowy Haskell - código fonte Haskell - Código-fonte Haskell - Cod sursă Haskell - исходный код Haskell - Zdrojový kód Haskell - Datoteka izvorne kode Haskell - Kod burues Haskell - Haskell изворни ко̂д - Haskell-källkod - вихідний код мовою Haskell - Mã nguồn Haskell - Haskell 源代码 - Haskell 源碼 - - - - - IDL document - مستند IDL - IDL sənədi - Dakument IDL - Документ — IDL - document IDL - Dokument IDL - Dogfen IDL - IDL-dokument - IDL-Dokument - έγγραφο IDL - IDL document - IDL-dokumento - documento IDL - IDL dokumentua - IDL-asiakirja - IDL skjal - document IDL - cáipéis IDL - documento IDL - מסמך IDL - IDL dokument - IDL-dokumentum - Dokumen IDL - Documento IDL - IDL ドキュメント - IDL құжаты - IDL 문서 - IDL dokumentas - IDL dokuments - Dokumen IDL - IDL-dokument - IDL-document - IDL-dokument - Dokument IDL - documento IDL - Documento IDL - Document IDL - документ IDL - Dokument IDL - Dokument IDL - Dokument IDL - IDL документ - IDL-dokument - документ IDL - Tài liệu IDL - IDL 文档 - IDL 文件 - IDL - Interface Definition Language - - - - - installation instructions - تعليمات التثبيت - instrukcyja dla instalavańnia - Инструкции за инсталация - instruccions d'instal·lació - Návod k instalaci - installationsinstruktioner - Installationsanleitung - οδηγίες εγκατάστασης - installation instructions - instrucciones de instalación - instalazioaren instrukzioak - asennusohjeet - innleggingar vegleiðing - instructions d'installation - treoracha suiteála - instrucións de instalación - הוראות התקנה - upute za instalaciju - telepítési utasítások - instruksi instalasi - Istruzioni di installazione - ソフトウェアインストール説明 - бағдарламаны орнату нұсқаулары - 설치 방법 - diegimo instrukcijos - instalācijas instrukcijas - installationsinstruksjoner - installatie-instructies - installasjonsinstruksjonar - Instrukcje instalacji - Instruções de instalação - instrucțiuni de instalare - инструкции по установке программы - Návod na inštaláciu - navodila namestitve - Udhëzime instalimi - installationsinstruktioner - інструкції з встановлення - hướng dẫn cài đặt - 软件安装指南 - 安裝指引 - - - - - Java source code - شفرة مصدر Java - Kryničny kod Java - Изходен код на Java - codi font en Java - Zdrojový kód v Javě - Javakildekode - Java-Quelltext - πηγαίος κώδικας Java - Java source code - Java-fontkodo - código fuente en Java - Java iturburu-kodea - Java-lähdekoodi - Java keldukota - code source Java - cód foinseach Java - código fonte de Java - קוד מקור ב־Java - Java izvorni kod - Java-forráskód - Kode program Java - Codice sorgente Java - Java ソースコード - Java бастапқы коды - 자바 소스 코드 - Java pradinis kodas - Java pirmkods - Kod sumber Java - Java-kildekode - Java-broncode - Java-kjeldekode - Kod źródłowy Java - código fonte Java - Código-fonte Java - Cod sursă Java - исходный код Java - Zdrojový kód Java - Datoteka izvorne kode Java - Kod burues Java - Јава изворни ко̂д - Java-källkod - Java kaynak kodu - вихідний код мовою Java - Mã nguồn Java - Java 源代码 - Java 源碼 - - - - - LDIF address book - دفتر عناوين LDIF - Adrasnaja kniha LDIF - Адресна книга — LDIF - llibreta d'adreces LDIF - Adresář LDIF - LDIF-adressebog - LDIF-Adressbuch - διευθυνσιολόγιο LDIF - LDIF address book - LDIF-adresaro - libreta de direcciones LDIF - LDIF helbide-liburua - LDIF-osoitekirja - LDIF adressubók - carnet d'adresses LDIF - leabhar sheoltaí LDIF - lista de enderezos LDIF - ספר כתובות של LDIF - LDIF adresar - LDIF címjegyzék - Buku alamat LDIF - Rubrica LDIF - LDIF アドレス帳 - LDIF адрестер кітабы - LDIF 주소록 - LDIF adresų knygelė - LDIF adrešu grāmata - LDIF-adressebok - LDIF-adresboek - LDIF-adressebok - Książka adresowa LDIF - Livro de endereços LDIF - Agendă LDIF - адресная книга LDIF - Adresár LDIF - Datoteka imenika naslovov LDIF - Rubrikë LDIF - LDIF-adressbok - LDIF adres defteri - адресна книга LDIF - Sổ địa chỉ LDIF - LDIF 地址簿 - LDIF 通訊錄 - LDIF - LDAP Data Interchange Format - - - - - - - - - Lilypond music sheet - صفحة موسيقى Lilypond - Muzyčny arkuš Lilypond - Нотация на Lilypond - full de música Lilypond - Notový papír Lilypond - Lilypondmusikkort - Lilypond-Notenblatt - παρτιτούρα Lilypond - Lilypond music sheet - partitura de LilyPond - Lilypond musika-orria - Lilypond-nuotit - Lilypond tónleika ark - partition musicale Lilypond - bileog cheoil Lilypond - folla de música de Lilypond - דף מוזיקה של Lilypond - Lilypond kotta - Lembar musik Lilypond - Partitura Lilypond - Lilypond 楽譜データ - Lilypond музыка тізімі - Lilypond 악보 - Lilypond muzikos lapas - Lilypond mūzikas lapa - Lilypond-muziekblad - Lilypond noteark - Plik partytury Lilypond - Partitura do Lilypond - Fișă muzică Lilypond - список музыки Lilypond - Notový papier Lilypond - Glasbena predloga Lilypond - Partiturë Lilypond - Lilypond-notblad - нотний запис Lilypond - Bản nhạc Lilypond - Lilypond 乐谱 - Lilypond 樂譜 - - - - - LHS source code - شفرة مصدر LHS - Kryničny kod LHS - Изходен код на LHS - codi font en LHS - Zdrojový kód v LHS - LHS-kildekode - LHS-Quelltext - πηγαίος κώδικας LHS - LHS source code - LHS-fontkodo - código fuente en LHS - LHS iturburu-kodea - LHS-lähdekoodi - LHS keld - code source LHS - cód foinseach LHS - código fonte en LHS - קוד מקור של LHS - LHS izvorni kod - LHS forráskód - Kode program LHS - Codice sorgente LHS - LHS ソースコード - LHS бастапқы коды - LHS 소스 코드 - LHS pradinis kodas - LHS pirmkods - LHS-kildekode - LHS-broncode - LHS-kjeldekode - Kod źródłowy LHS - Código-fonte LHS - Cod sursă LHS - исходный код LHS - Zdrojový kód LHS - Datoteka izvorne kode LHS - Kod burues LHS - LHS-källkod - LHS kaynak kodu - вихідний код LHS - Mã nguồn LHS - LHS 源代码 - LHS 源碼 - LHS - Literate Haskell source code - - - - - application log - سجل التطبيق - časopis aplikacyi - Файл-дневник на приложение - registre d'aplicació - Záznam aplikace - programlog - Anwendungsprotokoll - ημερολόγιο συμβάντων εφαρμογής - application log - protokolo de aplikaĵo - registro de aplicación - aplikazio egunkaria - sovelluksen lokitiedosto - nýtsluskipan logg - journal d'application - logchomhad feidhmchláir - rexistro de aplicativo - יומן התוכנה - alkalmazás naplója - log aplikasi - Log applicazione - アプリケーションログ - мәлімдемелер журналы - 프로그램 기록 - programos žurnalas - lietotnes žurnāls - Log aplikasi - applikasjonslogg - programma-logbestand - programlogg - Dziennik programu - registo de aplicação - Registro de aplicativo - înregistrare aplicație - журнал сообщений - Záznam aplikácie - dnevnik programa - log i mesazheve të programit - дневник програма - programlogg - uygulama günlüğü - журнал програми - bản ghi ứng dụng - 应用程序日志 - 程式紀錄檔 - - - - - Makefile - ملف Makefile - İnşa faylı - Makefile - Файл — make - Makefile - Makefile - Ffeil "make" - Bygningsfil - Makefile - Makefile - Makefile - Muntodosiero - Makefile - Makefile - Makefile - Makefile - makefile - Makefile - Makefile - Makefile - Makefile - Makefile - Makefile - Makefile - Makefile - Makefile (жинау файлы) - Makefile - Makefile - Makefile - Makefile - Makefile - Makefile - Makefile - Plik make - Makefile - Makefile (arquivo do make) - Makefile - Makefile (файл сборки) - Makefile - Datoteka Makefile - Makefile - Производна датотека - Makefil - файл проекту make - Tập tin tạo ứng dụng (Makefile) - Makefile - Makefile - - - - - - - - - - - - - Markdown document - Документ — Markdown - document Markdown - Dokument Markdown - Markdown-dokument - Markdown-Dokument - Markdown document - Documento de Markdown - Markdown-asiakirja - document Markdown - documento de Markdown - מסמך Markdown - Markdown dokument - Markdown dokumentum - Dokumen markdown - Documento Markdown - Markdown - Markdown құжаты - 마크다운 문서 - Markdown dokuments - Markdown document - Dokument Markdown - Documento Markdown - документ Markdown - Dokument Markdown - документ Markdown - Markdown 文档 - Markdown 文件 - - - - - - - Qt MOC file - ملف Qt MOC - Fajł Qt MOC - Файл — Qt MOC - fitxer MOC de Qt - Soubor Qt MOC - Qt MOC-fil - Qt-MOC-Datei - αρχείο Qt MOC - Qt MOC file - archivo MOC Qt - Qt MOC fitxategia - Qt MOC -tiedosto - Qt MOC fíla - fichier Qt MOC - comhad MOC Qt - ficheiro MOC Qt - קובץ Qt MOC - Qt MOC datoteka - Qt MOC fájl - Berkas Qt MOC - File MOC Qt - Qt MOC ファイル - Qt MOC файлы - Qt MOC 파일 - Qt MOC failas - Qt MOC datne - Qt MOC-fil - Qt MOC-bestand - Qt MOC-fil - Plik Qt MOC - Arquivo Qt MOC - Fișier Qt MOC - файл Qt MOC - Súbor Qt MOC - Datoteka Qt MOC - File Qt MOC - Qt MOC-fil - файл-метаоб'єкт Qt - Tập tin MOC của Qt - Qt 元对象编译文件 - Qt MOC 檔 - Qt MOC - Qt Meta Object Compiler - - - - - Windows Registry extract - استخراج مسجل ويندوز - Element rehistru Windows - Извадка от регистъра на Windows - extracte del registre de Windows - Část registrů Windows - Windows Registy-udtrækning - Windows-Registry-Auszug - αποσυμπίεση Windows Registry - Windows Registry extract - extracto del registro de Windows - Windows-eko erregistro erauzlea - Windows-rekisteritietue - Windows Registry úrdráttur - extrait de registre Windows - sliocht as Clárlann Windows - Extracto do rexistro de Windows - קובץ Registry של Windows - Windows Registry kivonat - Ekstrak Windows Registry - Estratto Windows Registry - WIndows レジストリ抽出ファイル - Windows Registry бөлігі - Windows 레지스트리 파일 - Windows registro ištrauka - Windows Registry izvilkums - Utdrag av Windows Registry - Windows Registry-extract - Windows Registry-utdrag - Wycinek rejestru Windows - Extrator de registro do Windows - Extras al registrului Windows - фрагмент Windows Registry - Časť registrov Windows - izvleček vpisnika Windows - Pjesë Windows Registry - Windows Registry-utdrag - частина реєстру Windows - Bản trích Registry Windows - Windows 注册表文件 - Windows Registry 抽出 - - - - - - - - - - Managed Object Format - صيغة كائن مدار - Farmat Managed Object - Управлявани обекти — MOF - format d'objecte gestionat - Managed Object Format - Håndteret objektformat - Managed Object Format - Μορφή Διαχειριζόμενου Αντικειμένου - Managed Object Format - formato de objeto manejado - Kudeatutako objektu formatua - Managed Object Format - format Managed Object - formáid réada bainistithe - formato de obxecto xestionado - פורמט ניהול אובייקט - Felügyelt objektum (MO) formátum - Managed Object Format - Managed Object Format - 管理オブジェクトフォーマット - Басқарылатын объект пішімі - 관리되는 오브젝트 형식 - Sutvarkytų objektų formatas - Pārvaldītu objektu formāts - Managed Object Format - Managed Object Format - Managed Object Format - Plik Managed Object Format - Formato de objeto gerenciado - Managed Object Format - формат управляемого объекта - Formát Managed Object - Datoteka Managed Object - Managed Object Format - Managed Object Format - формат керування об’єктами - Định dạng Đối tượng đã Quản lý - 托管对象格式 - Managed Object Format - - - - - Mup publication - منشور Mup - Publikacyja Mup - Издание — Mup - publicació Mup - Publikace Mup - Mupudgivelse - Mup-Veröffentlichung - δημοσίευση Mup - Mup publication - publicación Mup - Mup publikazioa - Mup-julkaisu - Mup útgáva - publication Mup - foilseachán Mup - publicación Mup - פרסום של Mup - Mup publikáció - Publikasi Mup - Pubblicazione Mup - Mup 出版ファイル - Mup жариялымы - Mup 출판물 - Mup leidinys - Mup publikācija - Mup publikasjon - Mup-publicatie - Mup-publikasjon - Publikacja Mup - Publicação do Mup - Publicație Mup - публикация Mup - Publikácie Mup - Datoteka objave Mup - Publikim Mup - Mup-publicering - публікація Mup - Bản xuất Mup - Mup 应用程序 - Mup 出版品 - - - - - - - - - Objective-C source code - شفرة مصدر الهدف-C - Kryničny kod Objective-C - Изходен код — Objective C - codi font en Objective-C - Zdrojový kód v Objective-C - Objektiv C-kildekode - Objective-C-Quelltext - πηγαίος κώδικας Objective-C - Objective-C source code - fontkodo en Objective-C - código fuente en Objective-C - Objective-C iturburu-kodea - Objective-C-lähdekoodi - Objective-C keldukota - code source Objective-C - cód foinseach Objective-C - código fonte de Objective-C - קוד מקור של Objective-C - Objective-C forráskód - Kode program Objective-C - Codice sorgente Objective-C - Objective-C ソースコード - Objective-C-ის საწყისი კოდი - Objective-C бастапқы коды - Objective-C 소스 코드 - Objective-C pradinis kodas - Objective-C pirmkods - Kod sumber Objective-C - Objective-C-kildekode - Objective-C-broncode - Objective-C-kjeldekode - Kod źródłowy Objective-C - código fonte Objective-C - Código-fonte Objective-C - Cod sursă Objective-C - исходный код Objective-C - Zdrojový kód Objective-C - Datoteka izvorne kode Objective-C - Kod burues C objekt - Објектни-C изворни ко̂д - Objective-C-källkod - вихідний код мовою Objective-C - Mã nguồn Objective-C - Objective-C 源代码 - Objective-C 源碼 - - - - - - - - OCaml source code - شفرة مصدر OCaml - Kryničny kod OCaml - Изходен код — OCaml - codi font en OCaml - Zdrojový kód OCaml - OCaml-kildekode - OCaml-Quelltext - πηγαίος κώδικας OCaml - OCaml source code - OCaml-fontkodo - código fuente en OCaml - OCaml iturburu-kodea - OCaml-lähdekoodi - OCaml keldukota - code source OCaml - cód foinseach OCaml - código fonte de OCaml - קוד מקור של OCaml - OCaml izvorni kod - OCaml forráskód - Kode program OCaml - Codice sorgente OCaml - OCaml ソースコード - OCaml бастапқы коды - OCaml 소스 코드 - OCaml pradinis kodas - OCaml pirmkods - OCaml-kildekode - OCaml-broncode - OCaml-kjeldekode - Kod źródłowy OCaml - Código-fonte OCaml - Cod sursă OCaml - исходный код OCaml - Zdrojový kód OCaml - Datoteka izvorne kode OCaml - Kod burues OCaml - OCaml-källkod - OCaml kaynak kodu - первинний код мовою OCaml - Mã nguồn OCaml - OCaml 源代码 - OCaml 源碼 - - - - - MATLAB script/function - سكربت/وظيفة MATLAB - Skrypt/funkcyja MATLAB - Скрипт/функция — MATLAB - script/funció MATLAB - Skript/funkce MATLAB - MATLAB-program/-funktion - MATLAB-Skript/-Funktion - δέσμη εντολών / συνάρτηση MATLAB - MATLAB script/function - script/función de MATLAB - MATLAB script/funtzioa - MATLAB-komentotiedosto/funktio - MATLAB boðrøð/funka - script/fonction MATLAB - script/feidhm MATLAB - función/script de MATLAB - תסריט/פונקציית MATLAB - MATLAB skripta/funkcija - MATLAB parancsfájl/funkció - Skrip/fungsi MATLAB - Script/Funzione MATLAB - MATLAB スクリプト/関数 - MATLAB сценарий/функциясы - MATLAB 스크립트/함수 - MATLAB scenarijus / funkcija - MATLAB skripts/funkcija - Skript/funksjon for MATLAB - MATLAB-script/functie - MATLAB-skript/funksjon - Skrypt/funkcja MATLAB - Script/função do MATLAB - Funcție/script MATLAB - сценарий/функция MATLAB - Skript/funkcia MATLAB - Skriptna datoteka MATLAB - Script/Funksion MATLAB - MATLAB-skript/funktion - скрипт/функція MATLAB - Văn lệnh/chức năng MATLAB - MATLAB 脚本/函数 - MATLAB 指令稿/函式 - - - - - - - - - - - - - - - Modelica model - - - - - - - - - - - - - - - - - - - - Pascal source code - شفرة مصدر باسكال - Kryničny kod Pascal - Изходен код — Pascal - codi font en Pascal - Zdrojový kód v Pascalu - Pascalkildekode - Pascal-Quelltext - πηγαίος κώδικας Pascal - Pascal source code - Pascal-fontkodo - código fuente en Pascal - Pascal iturburu-kodea - Pascal-lähdekoodi - Pascal keldukota - code source Pascal - cód foinseach Pascal - código fonte en Pascal - קוד מקור של Pascal - Pascal-forráskód - Kode program Pascal - Codice sorgente Pascal - Pascal ソースコード - Pascal бастапқы коды - 파스칼 소스 코드 - Pascal pradinis kodas - Pascal pirmkods - Kod sumber Pascal - Pascal-kildekode - Pascal-broncode - Pascal-kjeldekode - Kod źródłowy Pascal - código fonte Pascal - Código-fonte Pascal - Cod sursă Pascal - исходный код Pascal - Zdrojový kód Pascal - Datoteka izvorne kode Pascal - Kod burues Pascal - Паскал изворни ко̂д - Pascal-källkod - Pascal kaynak kodu - вихідний код мовою Pascal - Mã nguồn Pascal - Pascal 源代码 - Pascal 源碼 - - - - - - differences between files - الاختلافات بين الملفات - adroźnieńni pamiž fajłami - Разлики между файлове - diferències entre fitxers - Rozdíly mezi soubory - forskel mellem filer - Unterschiede zwischen Dateien - διαφορές μεταξύ αρχείων - differences between files - diferencoj inter dosieroj - diferencias entre archivos - fitxategien arteko ezberdintasunak - tiedostojen väliset erot - munur millum fílur - différences entre fichiers - difríochtaí idir chomhaid - diferenzas entre ficheiros - ההבדל בין קבצים - razlike između datoteka - diff-különbségfájl - perbedaan diantara berkas - Differenze tra file - ファイル間差分 - файлдар арасындағы айырмашылықтары - 파일 사이의 차이점 - skirtumai tarp failų - divu datņu atšķirība - Perbezaan antara fail - forskjeller mellom filer - verschillen tussen bestanden - skilnader mellom filer - Różnica pomiędzy plikami - diferenças entre ficheiros - Diferenças entre arquivos - diferențe între fișiere - различия между файлами - Rozdiely medzi súbormi - razlike med datotekami - Diferencë midis file - разлике међу датотекама - skillnader mellan filer - різниця між файлами - khác biệt giữa các tập tin - 文件的区别 - 檔案內容差異 - - - - - - - - - - - - - - - - - - - Go source code - Изходен код — Go - codi font en Go - Zdrojový kód Go - Go-kildekode - Go-Quellcode - πηγαίος κώδικας Go - Go source code - Go-fontkodo - Ir al código fuente - Go-lähdekoodi - code source Go - código fonte de Go - קוד מקור של Go - Go izvorni kod - Go forráskód - Kode sumber Go - Codice sorgente Go - Go ソースコード - Go-ის საწყისი კოდი - Go бастапқы коды - Go 소스 코드 - Go pirmkods - Go broncode - Kod źródłowy Go - Código-fonte Go - исходный код Go - Izvorna koda Go - вихідний код мовою Go - Go - Go 源碼 - - - - - Python script - سكربت بايثون - Skrypt Python - Скрипт — Python - script Python - Skript v Pythonu - Pythonprogram - Python-Skript - πρόγραμμα εντολών Python - Python script - Python-skripto - script en Python - Python script-a - Python-komentotiedosto - Python boðrøð - script Python - script Python - Script en Python - תסריט Python - Python skripta - Python-parancsfájl - Skrip Python - Script Python - Python スクリプト - Python сценарийі - 파이썬 스크립트 - Python scenarijus - Python skripts - Skrip Python - Python-skript - Python-script - Python-skript - Skrypt Python - 'script' Python - Script Python - Script Python - сценарий Python - Skript Python - Skriptna datoteka Python - Script Python - Питон скрипта - Pythonskript - скрипт мовою Python - Văn lệnh Python - Python 脚本 - Python 指令稿 - - - - - - - - - - - - - - - - - - - - Lua script - سكربت Lua - Skrypt Lua - Скрипт на Lua - script Lua - Skript Lua - Luaprogram - Lua-Skript - δέσμη εντολών Lua - Lua script - Lua-skripto - script en Lua - Lua script-a - Lua-komentotiedosto - Lua boðrøð - script Lua - script Lua - script de Lua - תסריט Lua - Lua skripta - Lua parancsfájl - Skrip Lua - Script Lua - Lua スクリプト - Lua сценарийі - Lua 스크립트 - Lua scenarijus - Lua skripts - Lua-skript - Lua-script - Lua-skript - Skrypt Lua - Script Lua - Script Lua - сценарий Lua - Skript Lua - Skriptna datoteka Lua - Script Lua - Lua-skript - скрипт Lua - Văn lệnh Lua - Lua 脚本 - Lua 指令稿 - - - - - - - - - - - - README document - مستند README - README sənədi - Dakument README - Документ — „Да се прочете“ - document README - Dokument README - Dogfen README - README-dokument - README-Dokument - έγγραφο README - README document - README-dokumento - documento README - README dokumentua - LUEMINUT-asiakirja - README skjal - document LISEZ-MOI - cáipéis README - documento README - מסמך README - README dokument - README-dokumentum - Dokumen README - Documento README - README ドキュメント - README құжаты - README 문서 - README dokumentas - README dokuments - Dokumen README - README-dokument - LEESMIJ-document - README-dokument - Dokument README - documento LEIA-ME - Documento README - Document README - документ README - Dokument README - Dokument README - Dokument README - ПРОЧИТАЈМЕ документ - README-dokument - документ README - Tài liệu Đọc Đi (README) - README 文档 - README 說明文件 - - - - - NFO document - مستند NFO - Dakument NFO - Документ — NFO - document NFO - Dokument NFO - NFO-dokument - NFO-Dokument - έγγραφο NFO - NFO document - NFO-dokumento - documento NFO - NFO dokumentua - NFO-asiakirja - NFO skjal - document NFO - cáipéis NFO - documento NFO - מסמך NFO - NFO dokument - NFO-dokumentum - Dokumen NFO - Documento NFO - NFO ドキュメント - NFO құжаты - NFO 문서 - NFO dokumentas - NFO dokuments - NFO-dokument - NFO-document - NFO-dokument - Dokument NFO - Documento NFO - Document NFO - документ NFO - Dokument NFO - Dokument NFO - Dokument NFO - NFO-dokument - NFO belgesi - документ NFO - Tài liệu NFO - NFO 文档 - NFO 文件 - - - - - RPM spec file - ملف مواصفات RPM - Specyfikacyjny fajł RPM - Файл — спецификация за RPM - fitxer spec RPM - Soubor spec RPM - RPM spec-fil - RPM-Spezifikationsdatei - αρχείο spec RPM - RPM spec file - archivo de especificaciones RPM - RPM espezifikazio fitxategia - RPM spec -tiedosto - RPM tøknilýsingarfíla - fichier de spécification RPM - comhad spec RPM - ficheiro de especificacións RPM - קובץ מפרט RPM - RPM spec fájl - Berkas spesifikasi RPM - File specifica RPM - RPM spec ファイル - RPM анықтама файлы - RPM spec 파일 - RPM spec failas - RPM specifikācijas datne - RPM-spesifikasjonsfil - RPM-spec-bestand - RPM spec-fil - Plik spec RPM - Arquivo de especificação RPM - Fișier RPM spec - файл описания RPM - Súbor RPM spec - Določilna datoteka RPM - File specifikimi RPM - RPM spec-fil - spec-файл RPM - Tập tin đặc tả RPM - RPM spec 文件 - RPM spec 規格檔 - RPM - Red Hat Package Manager - - - - - - - - - Scala source code - Изходен код — Scala - codi font en Scala - Zdrojový kód Scala - Scala-kildekode - Scala-Quellcode - πηγαίος κώδικας Scala - Scala source code - Código fuente en Scala - Scala-lähdekoodi - code source Scala - código fnote en Scala - קוד מקור של Scala - Scala izvorni kod - Scala forráskód - Kode sumber Scala - Codice sorgente Scala - Scala ソースコード - Scala-ის საწყისი კოდი - Scala бастапқы коды - Scala 소스 코드 - Scala pirmkods - Scala broncode - Kod źródłowy Scala - Código-fonte Scala - исходный код Scala - Izvorna koda Scala - Scala-källkod - вихідний код мовою Scala - Scala 源代码 - Scala 源碼 - - - - - Scheme source code - شفرة مصدر Scheme - Sxem mənbə kodu - Kryničny kod Scheme - Изходен код — Scheme - codi font en Scheme - Zdrojový kód Scheme - Ffynhonnell Rhaglen Scheme - Schemekildekode - Scheme-Quelltext - πηγαίος κώδικας Scheme - Scheme source code - Scheme-fontkodo - código fuente en Scheme - Scheme iturburu-kodea - Scheme-lähdekoodi - Scheme keldukota - code source Scheme - cód foinseach Scheme - código fonte en Scheme - קוד מקור של Scheme - Scheme izvorni kod - Scheme-forráskód - Kode program Scheme - Codice sorgente Scheme - Scheme ソースコード - Scheme бастапқы коды - Scheme 소스 코드 - Scheme pradinis kodas - Scheme pirmkods - Kod sumber Scheme - Scheme-kildekode - Scheme-broncode - Scheme-kjeldekode - Kod źródłowy Scheme - código fonte Scheme - Código-fonte Scheme - Cod sursă Scheme - исходный код Scheme - Zdrojový kód Scheme - Datoteka izvorne kode Scheme - Kod burues Scheme - Scheme изворни ко̂д - Scheme-källkod - Scheme kaynak kodu - вихідний файл мовою Scheme - Mã nguồn Scheme - Scheme 源代码 - Scheme 源碼 - - - - - - Setext document - مستند Setext - Setext sənədi - Dakument Setext - Документ — Setext - document Setext - Dokument Setext - Dogfen Setext - Setextdokument - Setext-Dokument - έγγραφο Setext - Setext document - Setext-dokumento - documento Setext - Setext dokumentua - Setext-asiakirja - Setext skjal - document Setext - cáipéis Setext - documento Settext - מסמך של Setext - Setext dokument - Setext-dokumentum - Dokumen Setext - Documento Setext - Setext ドキュメント - Setext құжаты - Setext 문서 - Setext dokumentas - Setext dokuments - Dokumen Setext - Setext-dokument - Setext-document - Setext-dokument - Dokument Setext - documento Setext - Documento Setext - Document Setext - документ Setext - Dokument Setext - Dokument Setext - Dokument Setext - Setext документ - Setext-dokument - Setext belgesi - документ Setext - Tài liệu Setext - Setext 文档 - Setext 文件 - - - - - SQL code - شفرة SQL - SQL kodu - Kod SQL - Код — SQL - codi en SQL - Kód SQL - Côd SQL - SQL-kode - SQL-Befehle - κώδικας SQL - SQL code - SQL-kodo - código SQL - SQL kodea - SQL-koodi - SQL kota - code SQL - cód SQL - código SQL - קוד SQL - SQL kod - SQL-kód - Kode SQL - Codice SQL - SQL コード - SQL коды - SQL 코드 - SQL kodas - SQL kods - Kod SQL - SQL-kildekode - SQL-code - SQL-kode - Kod SQL - código SQL - Código SQL - Cod SQL - код SQL - Kód SQL - Datoteka kode SQL - Kod SQL - SQL ко̂д - SQL-kod - SQL kodu - код SQL - Mã SQL - SQL 代码 - SQL 代碼 - - - - - - Tcl script - سكربت Tcl - Skrypt Tcl - Скрипт — Tcl - script Tcl - Skript v Tcl - Tcl-program - Tcl-Skript - πρόγραμμα εντολών Tcl - Tcl script - Tcl-skripto - script en Tcl - Tcl script-a - Tcl-komentotiedosto - Tcl boðrøð - script Tcl - script Tcl - Script en Tcl - תסריט Tcl - Tcl skripta - Tcl-parancsfájl - Skrip Tcl - Script Tcl - Tcl スクリプト - Tcl сценарийі - Tcl 스크립트 - Tcl scenarijus - Tcl skripts - Skrip Tcl - Tcl-skript - Tcl-script - Tcl-skript - Skrypt Tcl - 'script' Tcl - Script Tcl - Script Tcl - сценарий Tcl - Skript Tcl - Skriptna datoteka Tcl - Script Tcl - Tcl скрипта - Tcl-skript - скрипт Tcl - Văn lệnh Tcl - Tcl 脚本 - Tcl 描述語言檔 - - - - - - TeX document - مستند TeX - Dakument TeX - Документ — TeX - document TeX - Dokument TeX - Dogfen TeX - TeX-dokument - TeX-Dokument - έγγραφο TeX - TeX document - TeX-dokumento - documento TeX - TeX dokumentua - TeX-asiakirja - TeX skjal - document TeX - cáipéis TeX - documenton TeX - מסמך TeX - TeX dokument - TeX-dokumentum - Dokumen TeX - Documento TeX - TeX ドキュメント - TeX құжаты - TeX 문서 - TeX dokumentas - TeX dokuments - Dokumen TeX - TeX-dokument - TeX-document - TeX-dokument - Dokument TeX - documento TeX - Documento TeX - Document TeX - документ TeX - Dokument TeX - Dokument TeX - Dokument TeX - ТеХ документ - TeX-dokument - TeX belgesi - документ TeX - Tài liệu TeX - TeX 文档 - TeX 文件 - - - - - - - - - - - - - - - - - - TeXInfo document - مستند TeXInfo - TeXInfo sənədi - Dakument TeXInfo - Документ — TeXInfo - document TeXInfo - Dokument TeXInfo - Dogfen TeXInfo - TeXInfo-dokument - TeXInfo-Dokument - έγγραφο TeXInfo - TeXInfo document - TeXInfo-dokumento - documento TeXInfo - TeXInfo dokumentua - TeXInfo-asiakirja - TeXInfo skjal - document TeXInfo - cáipéis TeXInfo - documento TeXInfo - מסמך של TeXInfo - TeXInfo dokument - TeXInfo-dokumentum - Dokumen TeXInfo - Documento TeXInfo - TeXInfo ドキュメント - TeXInfo құжаты - TeXInfo 문서 - TeXInfo dokumentas - TeXInfo dokuments - Dokumen TeXInfo - TeXInfo-dokument - TeXInfo-document - TeXInfo-dokument - Dokument TeXInfo - documento TeXInfo - Documento TeXInfo - Document TexInfo - документ TeXInfo - Dokument TeXInfo - Dokument TeXInfo - Dokument TeXInfo - ТеХинфо документ - TeXInfo-dokument - TeXInfo belgesi - документ TeXInfo - Tài liệu TeXInfo - TeXInfo 文档 - TeXInfo 文件 - - - - - - Troff ME input document - مستند Troff ME input - Uvodny dakument Troff ME - Изходен документ — Troff ME - document d'entrada Troff ME - Vstupní dokument Troff ME - Troff ME inddata-dokument - Troff-ME-Eingabedokument - έγγραφο/πρόγραμμα εντολών troff ME - Troff ME input document - eniga dokumento de Troff ME - documento de entrada Troff ME - Troff ME sarrerako dokumentua - Troff ME -syöteasiakirja - Troff ME inntaksskjal - document d'entrée Troff ME - cáipéis ionchur Troff ME - documento de entrada Troff ME - מסמך קלט של Troff ME - Troff ME ulazni dokument - Troff ME bemeneti dokumentum - Dokumen masukan Troff ME - Documento di input Troff ME - Troff ME 入力ドキュメント - Troff ME кіріс құжаты - Troff ME 입력 문서 - Troff ME įvesties dokumentas - Troff ME ievades dokuments - Dokumen input Troff ME - Troff ME-inndatadokument - Troff ME-invoerdocument - Troff ME inndata-dokument - Dokument wejściowy Troff ME - documento origem Troff ME - Documento de entrada Troff ME - Document intrare Troff ME - входной документ Troff ME - Vstupný dokument Troff ME - Vnosni dokument Troff ME - Dokument i input Troff ME - Troff ME улазни документ - Troff ME-indatadokument - Troff ME girdi belgesi - вхідний документ Troff ME - Tài liệu nhập ME Troff - Troff ME 输入文档 - Troff ME 輸入文件 - - - - - Troff MM input document - مستند Troff MM input - Uvodny dakument Troff MM - Изходен документ — Troff MM - document d'entrada Troff MM - Vstupní dokument Troff MM - Troff MM inddata-dokument - Troff-MM-Eingabedokument - έγγραφο/πρόγραμμα εντολών troff MM - Troff MM input document - eniga dokumento de Troff MM - documento de entrada Troff MM - Troff MM sarrerako dokumentua - Troff MM -syöteasiakirja - Troff MM inntaksskjal - document d'entrée Troff MM - cáipéis ionchur Troff MM - documento de entrada Troff MM - מסמך קלט של Troff MM - Troff MM ulazni dokument - Troff MM bemeneti dokumentum - Dokumen masukan Troff MM - Documento di input Troff MM - Troff MM 入力ドキュメント - Troff MM кіріс құжаты - Troff MM 입력 문서 - Troff MM įvesties dokumentas - Troff MM ievades dokuments - Dokumen input Troff MM - Troff MM-inndatadokument - Troff MM-invoerdocument - Troff MM inndata-dokument - Dokument wejściowy Troff MM - documento origem Troff MM - Documento de entrada Troff MM - Document intrare Troff MM - входной документ Troff MM - Vstupný dokument Troff MM - Vnosni dokument Troff MM - Dokument i input Troff MM - Troff MM улазни документ - Troff MM-indatadokument - Troff MM girdi belgesi - вхідний документ Troff MM - Tài liệu nhập MM Troff - Troff MM 输入文档 - Troff MM 輸入文件 - - - - - Troff MS input document - مستند Troff MS input - Uvodny dakument Troff MS - Изходен документ — Troff MS - document d'entrada Troff MS - Vstupní dokument Troff MS - Troff MS inddata-dokument - Troff-MS-Eingabedokument - έγγραφο/πρόγραμμα εντολών troff MS - Troff MS input document - eniga dokumento de Troff MS - documento de entrada Troff MS - Troff MS sarrerako dokumentua - Troff MS -syöteasiakirja - Troff MS inntaksskjal - document d'entrée Troff MS - cáipéis ionchur Troff MS - documento de entrada Troff MS - מסמך קלט של Troff MS - Troff MS ulazni dokument - Troff MS bemeneti dokumentum - Dokumen masukan Troff MS - Documento di input Troff MS - Troff MS 入力ドキュメント - Troff MS кіріс құжаты - Troff MS 입력 문서 - Troff MS įvesties dokumentas - Troff MS ievades dokuments - Dokumen input Troff MS - Troff MS-inndatadokument - Troff MS-invoerdocument - Troff MS inndata-dokument - Dokument wejściowy Troff MS - documento origem Troff MS - Documento de entrada Troff MS - Document intrare Troff MS - входной документ Troff MS - Vstupný dokument Troff MS - Vnosni dokument Troff MS - Dokument i input Troff MS - Troff MS улазни документ - Troff MS-indatadokument - Troff MS girdi belgesi - вхідний документ Troff MS - Tài liệu nhập MS Troff - Troff MS 输入文档 - Troff MS 輸入文件 - - - - - X-Motif UIL table - جدول X-Motif UIL - Tablica X-Motif UIL - Таблица — X-Motif UIL - taula UIL de X-Motif - Tabulka X-Motif UIL - X-Motif UIL-tabel - X-Motif-UIL-Tabelle - πίνακας X-Motif UIL - X-Motif UIL table - tabla de X-Motif UIL - X-Motif UIL taula - X-Motif UIL -taulukko - X-Motif UIL talva - table X-Motif UIL - tábla X-Motif UIL - Táboa de X-Motif UIL - טבלה של X-Motif UIL - X-Motif UIL tablica - X-Motif UIL-táblázat - Tabel X-Motif UIL - Tabella UIL X-Motif - X-Motif UIL 表 - X-Motif UIL кестесі - X-Motif UIL 테이블 - X-Motif UIL lentelė - X-Motif UIL tabula - Jadual X-Motif UIL - X-Motif UIL-tabell - X-Motif UIL-tabel - X-Motif UIL-tabell - Tabela UIL X-Motif - tabela UIL do X-Motif - Tabela UIL do X-Motif - Tabel X-Motif UIL - таблица UIL X-Motif - Tabuľka X-Motif UIL - Preglednica X-Motif UIL - Tabelë X-Motif UIL - X-Motif UIL табела - X-Motif UIL-tabell - таблиця X-Motif UIL - Bảng UIL X-Motif - X-Motif UIL 表 - X-Motif UIL 表格 - - - - - resource location - موقع المورد - pałažeńnie resursu - Местоположение на ресурс - localització de recurs - Umístění zdroje - resurseplacering - Ressourcenort - τοποθεσία πόρου - resource location - loko de risurco - ubicación del recurso - baliabidearen kokalekua - resurssisijainti - tilfeingisstaður - localisation de ressource - suíomh acmhainne - localización do recurso - מיקומו של המקור - položaj resursa - erőforrás-hely - lokasi sumber daya - Posizione risorsa - リソースの場所 - ресурс орналасуы - 자원 위치 - resurso vieta - resursa atrašanās vieta - Lokasi sumber - ressurslokasjon - bronlocatie - ressursplassering - Położenie zasobu - localização de recurso - Localização de recurso - locație de resursă - расположение ресурса - Umiestnenie zdroja - mesto vira - Pozicion rezerve - путања ресурса - resursplats - розташування ресурсу - địa điểm tài nguyên - 资源位置 - 資源位置 - - - - - uuencoded file - - - - - - - - - XMI file - ملف XMI - Fajł XMI - Файл — XMI - fitxer XMI - Soubor XMI - XMI-fil - XMI-Datei - αρχείο XML - XMI file - XMI-dosiero - archivo XMI - XMI fitxategia - XMI-tiedosto - XMI fíla - fichier XMI - comhad XMI - ficheiro XMI - קובץ XMI - XMI datoteka - XMI fájl - Berkas XMI - File XMI - XMI ファイル - XMI файлы - XMI 파일 - XMI failas - XMI datne - XMI-fil - XMI-bestand - XMI-fil - Plik XMI - Arquivo XMI - Fișier XMI - файл XMI - Súbor XMI - Datoteka XMI - File XMI - XMI-fil - файл XMI - Tập tin XMI - XMI 文件 - XMI 檔 - XMI - XML Metadata Interchange - - - - - - - XSL FO file - ملف XSL FO - Fajł XSL FO - Форматиращ файл — XSL FO - fitxer FO XSL - Soubor XSL FO - XML FO-fil - XSL-FO-Datei - αρχείο XSL FO - XSL FO file - XSL-FO-dosiero - archivo XSL FO - XSL FO fitxategia - XSL FO -tiedosto - XSL FO fíla - fichier XSL FO - comhad XSL FO - ficheiro XSL FO - קובץ XSL FO - XSL FO datoteka - XSL FO fájl - Berkas XSL FO - File XSL FO - XSL FO ファイル - XSL FO файлы - XSL 포매팅 개체 파일 - XSL FO failas - XSL FO datne - FO-fil for XSL - XSL FO-bestand - XSL FO-fil - Plik XSL FO - Arquivo XSL FO - Fișier XSL FO - файл XSL FO - Súbor XSL FO - Datoteka XSL FO - File XSL FO - XSL FO-fil - файл XSL FO - Tập tin FO của XSL (XFO) - XSL 格式化对象文件 - XSL FO 檔 - XSL FO - XSL Formatting Objects - - - - - - - iptables configuration file - ملف تضبيط iptables - kanfihuracyjny fajł iptables - Настройки за iptables - fitxer de configuració d'iptables - Soubor nastavení iptables - iptableskonfigurationsfil - iptables-Konfigurationsdatei - αρχείο ρυθμίσεων iptables - iptables configuration file - archivo de configuración de iptables - iptables konfigurazio-fitxategia - iptables-asetustiedosto - iptables samansetingarfíla - fichier de configuration iptables - comhad cumraíochta iptables - ficheiro de configuración de iptables - קובץ הגדרה של iptables - iptables datoteka s postavkama - iptables beállítófájl - berkas konfigurasi iptables - File configurazione iptables - iptables 設定ファイル - iptables баптаулар файлы - iptables 설정 파일 - iptables konfigūracijos failas - iptables konfigurācijas datne - konfigurasjonsfil for iptables - iptables-configuratiebestand - iptables oppsettfil - Plik konfiguracji iptables - Arquivo de configuração do iptables - fișier configurare iptables - конфигурационный файл iptables - Súbor nastavení iptables - nastavitvena datoteka iptables - File konfigurimi iptables - iptables-konfigurationsfil - файл налаштувань iptables - tập tin cấu hình iptables - iptables 防火墙配置文件 - iptables 組態檔 - - - - - - - - - - - - - - - - - - - - - - - - - XSLT stylesheet - نمط XSLT - Arkuš stylaŭ XSLT - Стилове — XSLT - full d'estil XSLT - Styl XSLT - XSLT-stilark - XSLT-Stylesheet - φύλλο στυλ XSLT - XSLT stylesheet - XSLT-stilfolio - hoja de estilo XSLT - XSLT estilo-orria - XSLT-tyylitiedosto - XSLT sniðark - feuille de style XSLT - stílbhileog XSLT - folla de estilo XSLT - סגנון גליון XSLT - XSLT stilska tablica - XSLT-stíluslap - Lembar gaya XSLT - Foglio di stile XSLT - XSLT スタイルシート - XSLT стильдер кестесі - XSLT 스타일시트 - XSLT stiliaus aprašas - XSLT izklājlapa - Helaian Gaya XSLT - XSLT-stilark - XSLT-stijlblad - XSLT-stilark - Arkusz stylów XSLT - folha de estilos XSLT - Folha de estilo XSLT - Fișă de stil XSLT - таблица стилей XSLT - Štýl XSLT - Slogovna predloga XSLT - Fletë stili XSLT - Датотека са XSLT стилом - XSLT-stilmall - таблиця стилів XSLT - Tờ kiểu dáng XSLT - XSLT 样式表 - XSLT 樣式表 - XSLT - eXtensible Stylesheet Language Transformation - - - - - - - - - - - XMCD CD database - قاعدة بيانات XMCD CD - Baza źviestak ab dyskach XMCD - База от данни за CD-та — XMCD - base de dades de CD XMCD - Databáze XMCD CD - XMCD-cd-database - XMCD-CD-Datenbank - βάση δεδομένων CD XMCD - XMCD CD database - base de datos de CD XMCD - XMCD CD datu-basea - XMCD CD -tietokanta - XMCD fløgu dátustovnur - base de données de CD XMCD - bunachar sonraí XMCD CD - base de datos de CD XMCD - בסיס נתונים XMCD CD - XMCD CD baza podataka - XMCD CD-adatbázis - Basis data XMCD CD - Database XMCD CD - XMCD CD データベース - XMCD CD дерекқоры - XMCD CD 데이터베이스 - XMCD CD duomenų bazė - XMCD CD datubāze - XMCD CD-database - XMCD CD-gegevensbank - XMCD CD-database - Baza danych CD XMCD - Banco de dados de CD XMCD - Bază de date XMCD CD - база данных компакт-дисков XMCD - Databáza XMCD CD - Podatkovna zbirka XMCD CD - Bazë me të dhëna XMCD CD - XMCD cd-databas - база даних XMCD CD - Cơ sở dữ liệu CD XMCD - XMCD CD 数据库 - XMCD CD 資料庫 - - - - - - - XML document - مستند XML - Dakument XML - Документ — XML - document XML - Dokument XML - XML-dokument - XML-Dokument - έγγραφο XML - XML document - XML-dokumento - documento XML - XML dokumentua - XML-asiakirja - XML skjal - document XML - cáipéis XML - documento XML - מסמך XML - XML dokument - XML dokumentum - Dokumen XML - Documento XML - XML ドキュメント - XML құжаты - XML 문서 - XML dokumentas - XML dokuments - XML-dokument - XML-document - XML-dokument - Dokument XML - Documento XML - Document XML - документ XML - Dokument XML - Dokument XML - Dokument XML - XML-dokument - документ XML - Tài liệu XML - XML 文档 - XML 文件 - XML - eXtensible Markup Language - - - - - - - - - - - - - - XML entities document - مستند كيانات XML - Dakument elementaŭ XML - Документ — заместващи последователности в XML - document d'entitats XML - Dokument entit XML - XML-enhedsdokument - XML-Dokument-Entitäten - έγγραφο οντοτήτων XML - XML entities document - documento de entidades XML - XML entitateen dokumentua - XML-entiteettiasiakirja - XML einindisskjal - document d'entités XML - cáipéis aonán XML - documento de entidades XML - מסמך ישיות XML - XML egyeddokumentum - Dokumen entitas XML - Documento entità XML - XML エントリドキュメント - XML мәндер құжаты - XML 엔티티 문서 - XML esybių dokumentas - XML vienību dokuments - XML-entitetsdokument - XML entiteiten-document - XML-entitet-dokument - Dokument jednostek XML - Documento de entidades XML - Document entități XML - файл сущностей XML - Dokument entít XML - Dokument XML določil - Dokument njësish XML - XML-entitetsdokument - документ об’єктів XML - Tài liệu thực thể XML - XML 特征文档 - XML 實體文件 - XML - eXtensible Markup Language - - - - - - - DV video - DV مرئي - Videa DV - Видео — DV - vídeo DV - Video DV - DV-video - DV-Video - βίντεο DV - DV video - DV-video - vídeo DV - DV bideoa - DV-video - DV video - vidéo DV - físeán DV - vídeo DV - וידאו DV - DV video - DV videó - Video DV - Video DV - DV 動画 - DV ვიდეო - DV видеосы - DV 비디오 - DV vaizdo įrašas - DV video - DV-film - DV-video - DV-video - Plik wideo DV - Vídeo DV - Video DV - видео DV - Video DV - Video datoteka DV - Video DV - DV-video - відеокліп DV - Ảnh động DV - DV 视频 - DV 視訊 - DV - Digital Video - - - - - - - ISI video - مرئي ISI - ISI video faylı - Videa ISI - Видео — ISI - vídeo ISI - Video ISI - Fideo ISI - ISI-video - ISI-Video - βίντεο ISI - ISI video - ISI-video - vídeo ISI - ISI bideoa - ISI-video - ISI video - vidéo ISI - físeán ISI - vídeo ISI - וידאו ISI - ISI video - ISI-videó - Video ISI - Video ISI - ISI 動画 - ISI видеосы - ISI 비디오 - ISI vaizdo įrašas - ISI video - Video ISI - ISI-film - ISI-video - ISI video - Plik wideo ISI - vídeoISI - Vídeo ISI - Video ISI - видео ISI - Video ISI - Video datoteka ISI - Video ISI - ISI видео - ISI-video - відеокліп ISI - Ảnh động ISI - ISI 视频 - ISI 視訊 - - - MPEG-2 transport stream - بث نقل MPEG-2 - Поток — транспорт по MPEG-2 - flux de transport MPEG-2 - Přenosový proud MPEG-2 - MPEG-2-transportstrøm - MPEG-2-Transportstrom - ροή μεταφορών MPEG-2 - MPEG-2 transport stream - flujo de transporte MPEG-2 - MPEG-2 -siirtobittivirta - MPEG-2 flutningsstreymur - flux de transport MPEG-2 - Sruth aistrithe MPEG-2 - fluxo de transporte MPEG-2 - העברת זרימה של MPEG-2 - MPEG-2 átviteli adatfolyam - Stream transport MPEG-2 - Stream di trasporto MPEG-2 - MPEG-2 トランスポートストリーム - MPEG-2-ის ტრანსპორტული ნაკადი - MPEG-2 көліктік ағыны - MPEG-2 전송 스트림 - MPEG-2 transportavimo srautas - MPEG-2 transporta straume - MPEG-2 transport stream - Strumień przesyłania MPEG-2 - Fluxo de transporte de MPEG-2 - Flux transport MPEG-2 - транспортный поток MPEG-2 - Pretočni vir prenosega MPEG - MPEG-2 transportström - потік передавання даних MPEG-2 - MPEG-2 传输流 - MPEG-2 傳輸串流 - MPEG-2 TS - Moving Picture Experts Group 2 Transport Stream - - - - - - - - - - - - - - - - MPEG video - MPEG مرئي - Videa MPEG - Видео — MPEG - vídeo MPEG - Video MPEG - MPEG-video - MPEG-Video - βίντεο MPEG - MPEG video - MPEG-video - vídeo MPEG - MPEG bideoa - MPEG-video - MPEG video - vidéo MPEG - físeán MPEG - vídeo MPEG - וידאו MPEG - MPEG video - MPEG-videó - Video MPEG - Video MPEG - MPEG 動画 - MPEG ვიდეო - MPEG видеосы - MPEG 비디오 - MPEG vaizdo įrašas - MPEG video - Video MPEG - MPEG-film - MPEG-video - MPEG-video - Plik wideo MPEG - vídeo MPEG - Vídeo MPEG - Video MPEG - видео MPEG - Video MPEG - Video datoteka MPEG - Video MPEG - MPEG видео - MPEG-video - відеокліп MPEG - Ảnh động MPEG - MPEG 视频 - MPEG 視訊 - MPEG - Moving Picture Experts Group - - - - - - - - - - - - - - - - MPEG video (streamed) - Видео — MPEG, поточно - vídeo MPEG (flux) - Video MPEG (proud) - MPEG-video (streamet) - MPEG-Video (Datenstrom) - βίντεο MPEG (εκπεμπόμενο) - MPEG video (streamed) - Vídeo MPEG (flujo) - MPEG-video (virtaus) - vidéo MPEG (flux) - vídeo MPEG (en stream) - קובץ MPEG (בהזרמה) - MPEG videó (szórt) - Video MPEG (di-stream-kan) - Video MPEG (streamed) - MPEG ビデオ(ストリーム) - MPEG ვიდეო (ნაკადი) - MPEG видео (ағымдық) - MPEG 비디오 (스트리밍) - MPEG video (straumēts) - MPEG video (streamed) - Plik wideo MPEG (strumień) - Vídeo MPEG (fluxo) - видео MPEG (потоковое) - MPEG-video (pretočni) - MPEG-video (strömmad) - відеокліп MPEG (потоковий) - MPEG 视频流媒体 - MPEG 視訊 (串流) - - - - - - - - - - - QuickTime video - QuickTime مرئي - Videa QuickTime - Видео — QuickTime - vídeo QuickTime - Video QuickTime - QuickTime-video - QuickTime-Video - βίντεο QuickTime - QuickTime video - QuickTime-video - vídeo QuickTime - QuickTime bideoa - QuickTime-video - QuickTime video - vidéo QuickTime - físeán QuickTime - vídeo QuickTime - וידאו של QuickTime - QuickTime video - QuickTime videó - Video QuickTime - Video QuickTime - QuickTime 動画 - QuickTime видеосы - 퀵타임 비디오 - QuickTime vaizdo įrašas - QuickTime video - Video QuickTime - Quicktime film - QuickTime-video - QuickTime-video - Plik wideo QuickTime - vídeo QuickTime - Vídeo do QuickTime - Video QuickTime - видео QuickTime - Video QuickTime - Video datoteka QuickTime - Video QuickTime - QuickTime видео - QuickTime-video - відеокліп QuickTime - Ảnh động QuickTime - QuickTime 视频 - QuickTime 視訊 - - - - - - - - - - - - - QuickTime image - صورة QuickTime - Vyjava QuickTime - Изображение — QuickTime - imatge QuickTime - Obrázek QuickTime - QuickTime-billede - QuickTime-Bild - εικόνα QuickTime - QuickTime image - QuickTime-bildo - imagen QuickTime - QuickTime irudia - QuickTime-kuva - QuickTime mynd - image QuickTime - íomhá QuickTime - imaxe QuickTime - תמונה של QuickTime - QuickTime slika - QuickTime kép - Citra QuickTime - Immagine QuickTime - QuickTime 画像 - QuickTime суреті - 퀵타임 그림 - QuickTime paveikslėlis - QuickTime attēls - Quicktime bilde - QuickTime-afbeelding - QuickTime-bilete - Obraz QuickTime - Imagem do QuickTime - Imagine QuickTime - изображение QuickTime - Obrázok QuickTime - Slikovna datoteka QuickTime - Figurë QuickTime - QuickTime-bild - зображення QuickTime - Ảnh QuickTime - QuickTime 图像 - QuickTime 影像 - - - - - - - - Vivo video - Vivo مرئي - Vivo video faylı - Videa Vivo - Видео — Vivo - vídeo Vivo - Video Vivo - Fideo Vivo - Vivo-video - Vivo-Video - βίντεο Vivo - Vivo video - Vivo-video - vídeo Vivo - Vivo bideoa - Vivo-video - Vivo video - vidéo Vivo - físeán Vivo - vídeo Vivo - וידאו של Vivo - Vivo video - Vivo-videó - Video Vivo - Video Vivo - Vivo 動画 - Vivo видеосы - Vivo 비디오 - Vivo vaizdo įrašas - Vivo video - Video Vivo - Vivo-film - Vivo-video - Vivo-film - Plik wideo Vivo - vídeo Vivo - Vídeo Vivo - Video Vivo - видео Vivo - Video Vivo - Video datoteka Vivo - Video Vivo - Vivo видео - Vivo-video - відео Vivo - Ảnh động Vivo - Vivo 视频 - Vivo 視訊 - - - - - - Wavelet video - Wavelet مرئي - Wavelet video faylı - Videa Wavelet - Видео — Wavelet - vídeo Wavelet - Video Wavelet - Fideo Wavelet - Waveletvideo - Wavelet-Video - βίντεο Wavelet - Wavelet video - Wavelet-video - vídeo Wavelet - Wavelet bideoa - Wavelet-video - Wavelet video - vidéo Wavelet - físeán Wavelet - vídeo Wavelet - וידאו של Wavelet - Wavelet video - Wavelet-videó - Video Wavelet - Video Wavelet - Wavelet 動画 - Wavelet видеосы - Wavelet 비디오 - Wavelet vaizdo įrašas - Wavelet video - Video Wavelet - Wavelet-film - Wavelet-video - Wavelet video - Plik wideo Wavelet - vídeo Wavelet - Vídeo Wavelet - Video Wavelet - видео Wavelet - Video Wavelet - Video datoteka Wavelet - Video Wavelet - Wavelet видео - Wavelet-video - відеокліп Wavelet - Ảnh động Wavelet - Wavelet 视频 - Wavelet 視訊 - - - ANIM animation - تحريكة ANIM - ANIM animasiyası - Animacyja ANIM - Анимация — ANIM - animació ANIM - Animace ANIM - Animeiddiad ANIM - ANIM-animation - ANIM-Animation - κινούμενο σχέδιο ANIM - ANIM animation - ANIM-animacio - animación ANIM - ANIM animazioa - ANIM-animaatio - ANIM teknmyndagerð - animation ANIM - beochan ANIM - animación ANIM - הנפשת ANIM - ANIM animacija - ANIM-animáció - Animasi ANIM - Animazione ANIM - ANIM アニメーション - ANIM ანიმაცია - ANIM анимациясы - ANIM 동화상 - ANIM animacija - ANIM animācija - Animasi ANIM - ANIM-animasjon - ANIM-animatie - ANIM-animasjon - Plik animacji ANIM - animação ANIM - Animação ANIM - Animație ANIM - анимация ANIM - Animácia ANIM - Datoteka animacije ANIM - Animim ANIM - ANIM анимација - ANIM-animering - анімація ANIM - Hoạt ảnh ANIM - ANIM 动画 - ANIM 動畫 - - - - FLIC animation - تحريكة FLIC - Animacyja FLIC - Анимация — FLIC - animació FLIC - Animace FLIC - FLIC-animation - FLIC-Animation - κινούμενες εικόνες FLIC - FLIC animation - animación FLIC - FLIC animazioa - FLIC-animaatio - FLIC teknimyndagerð - animation FLIC - beochan FLIC - animación FLIC - הנפשת FLIC - FLIC animacija - FLIC animáció - Animasi FLIC - Animazione FLIC - FLIC アニメーション - FLIC ანიმაცია - FLIC анимациясы - FLIC 동화상 - FLIC animacija - FLIC animācija - FLIC-animasjon - FLIC-animatie - FLIC-animasjon - Plik animacji FLIC - Animação FLIC - Animație FLIC - анимация FLIC - Animácia FLIC - Datoteka animacije FLIC - Animim FLIC - FLIC-animering - FLIC animasyonu - анімація FLIC - Hoạt ảnh FLIC - FLIC 动画 - FLIC 動畫 - - - - - - - - - - - Haansoft Hangul document - مستند Haansoft Hangul - Dakument Haansoft Hangul - Документ — Haansoft Hangul - document Haansoft Hangul - Dokument Haansoft Hangul - Haansoft Hangul-dokument - Haansoft-Hangul-Dokument - έγγραφο Haansoft Hangul - Haansoft Hangul document - documento de Haansoft Hangul - Haansoft Hangul dokumentua - Haansoft Hangul -asiakirja - Haansoft Hangul skjal - document Haansoft Hangul - cáipéis Haansoft Hangul - documento de Haansoft Hangul - מסמך Haansoft Hangul - Haansoft Hangul dokument - Haansoft hangul dokumentum - Dokumen Haansoft Hangul - Documento Haansoft Hangul - Haansoft Hangul ドキュメント - Haansoft Hangul құжаты - 한소프트 한글 문서 - Haansoft Hangul dokumentas - Haansoft Hangul dokuments - Haansoft Hangul-dokument - Haansoft Hangul-document - Haansoft Hangul-dokument - Dokument Haansoft Hangul - Documento do Haansoft Hangul - Document Haansoft Hangul - документ Haansoft Hangul - Dokument Haansoft Hangul - Dokument Haansoft Hangul - Dokument Haansoft Hangul - Haansoft Hangul-dokument - документ Haansoft Hangul - Tài liệu Hangul Haansoft - Haansoft Hangul 文档 - Haansoft 韓文文件 - - - - - - - - - Haansoft Hangul document template - قالب مستند Haansoft Hangul - Šablon dakumentu Haansoft Hangul - Шаблон за документи — Haansoft Hangul - plantilla de document Haansoft Hangul - Šablona dokumentu Haansoft Hangul - Haansoft Hangul-dokumentskabelon - Haansoft-Hangul-Dokumentvorlage - πρότυπο εγγράφου Haansoft Hangul - Haansoft Hangul document template - plantilla de documento de Haansoft Hangul - Haansoft Hangul dokumentuaren txantiloia - Haansoft Hangul -asiakirjamalli - Haansoft Hangul skjalaformur - modèle de document Haansoft Hangul - teimpléad cháipéis Haansoft Hangul - modelo de documento de Haansoft Hangul - תבנית מסמך של Haansoft Hangul - Haansoft Hangul predložak dokumenta - Haansoft hangul dokumentumsablon - Templat dokumen Haansoft Hangul - Modello documento Haansoft Hangul - Haansoft Hangul ドキュメントテンプレート - Haansoft Hangul құжат үлгісі - 한소프트 한글 문서 서식 - Haansoft Hangul dokumento šablonas - Haansoft Hangul dokumentu veidne - Haansoft Hangul-dokumentmal - Haansoft Hangul-documentsjabloon - Haansoft Hangul-dokumentmal - Szablon dokumentu Haansoft Hangul - Modelo de documento do Haansoft Hangul - Document șablon Haansoft Hangul - шаблон документа Haansoft Hangul - Šablóna dokumentu Haansoft Hangul - Predloga dokumenta Haansoft Hangul - Model dokumenti Haansoft Hangul - Haansoft Hangul-dokumentmall - шаблон документа Haansoft Hangul - Mẫu tài liệu Hangul Haansoft - Haansoft Hangul 文档模板 - Haansoft 韓文文件範本 - - - - - - MNG animation - تحريكة MNG - Animacyja MNG - Анимация — MNG - animació MNG - Animace MNG - MNG-animation - MNG-Animation - κινούμενα σχέδια MNG - MNG animation - MNG-animacio - animación MNG - MNG animazioa - MNG-animaatio - MNG teknimyndagerð - animation MNG - beochan MNG - animación MNG - הנפשת MNG - MNG animacija - MNG-animáció - Animasi MNG - Animazione MNG - MNG アニメーション - MNG анимациясы - MNG 동화상 - MNG animacija - MNG animācija - Animasi MNG - MNG-animasjon - MNG-animatie - MNG-animasjon - Animacja MNG - animação MNG - Animação MNG - Animație MNG - анимация MNG - Animácia MNG - Datoteka animacije MNG - Animim MNG - MNG анимација - MNG-animering - анімація MNG - Hoạt ảnh MNG - MNG 动画 - MNG 動畫 - MNG - Multiple-Image Network Graphics - - - - - - - ASF video - ASF مرئي - Videa ASF - Видео — ASF - vídeo ASF - Video ASF - ASF-video - ASF-Video - βίντεο ASF - ASF video - ASF-video - vídeo ASF - ASF bideoa - ASF-video - ASF video - vidéo ASF - físeán ASF - vídeo ASF - וידאו ASF - ASF video - ASF videó - Video ASF - Video ASF - ASF 動画 - ASF ვიდეო - ASF видеосы - ASF 비디오 - ASF vaizdo įrašas - ASF video - ASF-film - ASF-video - ASF-video - Plik wideo ASF - Vídeo ASF - Video ASF - видео ASF - Video ASF - Video datoteka ASF - Video ASF - ASF-video - відеокліп ASF - Ảnh động ASF - ASF 视频 - ASF 視訊 - ASF - Advanced Streaming Format - - - - - - - - - - Windows Media Station file - ملف محطة Windows Media - Fajł Windows Media Station - Файл — Windows Media Station - fitxer Windows Media Station - Soubor Windows Media Station - Windows Media Station-fil - Windows-Media-Streamingbeschreibung - αρχείο Windows Media Station - Windows Media Station file - archivo de emisora de Windows Media - Windows Media Station fitxategia - Windows Media Station-tiedosto - Windows Media Station fíla - fichier Windows Media Station - comhad Windows Media Station - ficheiro de emisora de Windows Media - קובץ תחנה של Windows Media - Windows Media Station fájl - Berkas Windows Media Station - File Windows Media Station - Windows Media Station ファイル - Windows Media Station файлы - Windows 미디어 방송국 파일 - Windows Media Station failas - Windows Media Station datne - Windows Media Station-fil - Windows Media Station-bestand - Windows Media Station-fil - Plik Windows Media Station - Arquivo de estação do Windows Media - Fișier Windows Media Station - файл Windows Media Station - Súbor Windows Media Station - Datoteka Windows Media Station - File Windows Media Station - Windows Media Station-fil - Windows Media Station dosyası - файл Windows Media Station - Tập tin Windows Media Station - Windows 媒体工作站文件 - Windows Media Station 檔 - - - - - - - - - Windows Media video - Windows Media مرئي - Videa Windows Media - Видео — Windows Media - vídeo Windows Media - Video Windows Media - Windows Medie-video - Windows-Media-Video - βίντεο Windows Media - Windows Media video - vídeo de Windows Media - Windows Media bideoa - Windows Media -video - Windows Media video - vidéo Windows Media - físeán Windows Media - vídeo de Windows Media - וידאו של Windows Media - Windows Media video - Windows Media videó - Video Windows Media - Video Windows Media - Windows Media 動画 - Windows Media видеосы - Windows 미디어 오디오 - Windows Media vaizdo įrašas - Windows Media video - Windows Media film - Windows Media-video - Windows Media-video - Plik wideo Windows Media - Vídeo do Windows Media - Video Windows Media - видео Windows Media - Video Windows Media - Video datoteka Windows Media - Video Windows Media - Windows Media-video - відеокліп Windows Media - Ảnh động Windows Media - Windows Media 视频 - Windows Media 視訊 - - - - - AVI video - AVI مرئي - AVI video faylı - Videa AVI - Видео — AVI - vídeo AVI - Video AVI - Fideo AVI - AVI-video - AVI-Video - βίντεο AVI - AVI video - AVI-video - vídeo AVI - AVI bideoa - AVI-video - AVI video - vidéo AVI - físeán AVI - vídeo AVI - וידאו AVI - AVI video - AVI-videó - Video AVI - Video AVI - AVI 動画 - AVI ვიდეო - AVI видеосы - AVI 비디오 - AVI vaizdo įrašas - AVI video - Video AVI - AVI-film - AVI-video - AVI-video - Plik wideo AVI - vídeo AVI - Vídeo AVI - Video AVI - видео AVI - Video AVI - Video datoteka AVI - Video AVI - AVI видео - AVI-video - відеокліп AVI - Ảnh động AVI - AVI 视频 - AVI 視訊 - AVI - Audio Video Interleave - - - - - - - - - - - - - - - - - - - NullSoft video - NullSoft مرئي - Videa NullSoft - Видео — NullSoft - vídeo NullSoft - Video NullSoft - NullSoft-video - NullSoft-Video - βίντεο Nullsoft - NullSoft video - NullSoft-video - vídeo NullSoft - NullSoft bideoa - NullSoft-video - NullSoft video - vidéo NullSoft - físeán NullSoft - vídeo de NullSoft - וידאו של NullSot - NullSoft video - NullSoft videó - Video NullSoft - Video NullSoft - NullSoft 動画 - NullSoft видеосы - 널소프트 비디오 - NullSoft vaizdo įrašas - NullSoft video - Nullsoft-film - NullSoft-video - NullSoft-video - Plik wideo NullSoft - Vídeo do NullSoft - Video NullSoft - видео Nullsoft - Video NullSoft - Video datoteka NullSoft - Video NullSoft - NullSoft-video - відеокліп NullSoft - Ảnh động NullSoft - Nullsoft 视频 - NullSoft 視訊 - - - - - - - SDP multicast stream file - ملف دفق متعدد البث SDP - Šmatadrasny płynievy fajł SDP - Файл за поток — SDP multicast - fitxer de flux de multidifusió SDP - Soubor vícesměrového vysílání proudu SDP - SDP multicast-strømfil - SDP-Multicast-Datenstromdatei - SDP multicast stream file - archivo de flujo multicast SDP - SDP multicast korrontearen fitxategia - SDP-monilähetysvirran tiedosto - SDP margvarpað streymafíla - fichier de flux multidiffusion SDP - comhad shruth ilchraolacháin SDP - ficheiro de fluxo multicast SDP - קובץ שידור בזרימה SDP - SDP multicast műsorfájl - Berkas SDP multicast stream - File stream multicast SDP - SDP マルチキャストストリームファイル - SDP мультикаст ағым файлы - SDP 멀티캐스트 스트림 파일 - SDP daugiaadresio srauto failas - SDP multiraides straumes datne - SDP-multicaststrøm - SDP-multicast-streambestand - SDP multicast straumfil - Plik strumienia multicast SDP - Arquivo de canal multicast SDP - Fișier flux multicast SDP - файл мультикаст-потока SDP - Súbor viacsmerového vysielania prúdu SDP - Pretočni vir večsmernega oddajanja - File stream multicast SDP - SDP multicast stream-fil - файл потокової трансляції SDP - Tập tin luồng truyền một-nhiều SDP - SDP 多播流文件 - SDP multicast 串流檔 - SDP - Session Description Protocol - - - - - - - - - - - - SGI video - SGI مرئي - SGI video faylı - Videa SGI - Видео — SGI - vídeo SGI - Video SGI - Video SGI - SGI-video - SGI-Video - βίντεο SGI - SGI video - SGI-video - vídeo SGI - SGI bideoa - SGI-video - SGI video - vidéo SGI - físeán SGI - vídeo SGI - וידאו SGI - SGI video - SGI-videó - Video SGI - Video SGI - SGI 動画 - SGI видеосы - SGI 비디오 - SGI vaizdo įrašas - SGI video - Video SGI - SGI-film - SGI-video - SGI-video - Plik wideo SGI - vídeo SGI - Vídeo SGI - Video SGI - видео SGI - Video SGI - Video datoteka SGI - Video SGI - SGI видео - SGI-video - відеокліп SGI - Ảnh động SGI - SGI 视频 - SGI 視訊 - - - - - - - eMusic download package - حزمة تنزيل eMusic - pakunak zahruzki eMusic - Пакет за сваляне — eMusic - paquet de descàrrega eMusic - Balíček stahování eMusic - eMusic-hentpakke - eMusic-Download-Paket - πακέτο eMusic - eMusic download package - paquete de descarga eMusic - eMusic deskargaren paketea - eMusic-imurointipaketti - eMusic niðurtøkupakki - paquet de téléchargement eMusic - pacáiste íosluchtú eMusic - paquete de descarga de eMusic - חבילת הורדה של eMusic - eMusic letöltési csomag - paket unduh eMusic - Pacchetto scaricamento eMusic - eMusic ダウンロードパッケージ - eMusic жүктемелер дестесі - eMusic 다운로드 패키지 - eMusic atsiuntimo paketas - eMusic lejupielādes paciņa - eMusic nedlastingspakke - eMusic-downloadpakket - eMusic nedlastingspakke - Pobieralny pakiet eMusic - Pacote de download do eMusic - pachet descărcare eMusic - пакет загрузок eMusic - Balíček sťahovania eMusic - Datoteka paketa eMusic - Paketë shkarkimi eMusic - eMusic-hämtningspaket - пакунок завантаження eMusic - gói nhạc tải xuống eMusic - eMusic 下载包 - eMusic 下載套件 - - - - - - - - KML geographic data - بيانات جغرافية KML - Географски данни — KML - dades geogràfiques KML - Geografická data KML - Geografiske data i KML-format - KML geographische Daten - γεωγραφικά δεδομένα KML - KML geographic data - datos geográficos KML - KML datu geografikoak - KML landafrøðilig dáta - données géographiques KML - sonraí geografacha KML - datos xeográficos KML - מידע גאוגרפי KML - KML geografski podaci - KML földrajzi adatok - Data geografis KML - Dati geografici KML - KML 地理データ - KML географилық ақпараты - KML 지리 정보 데이터 - KML geografiniai duomenys - KML ģeogrāfiskie dati - KML geographic data - Dane geograficzne KML - Dados geográficos KML - Date geografice KML - географические данные KML - Zemepisné údaje KML - Datoteka geografskih podatkov KML - KML geografisk data - географічні дані KML - KML 地理数据 - KML 地理資料 - KML - Keyhole Markup Language - - - - - - KML geographic compressed data - بيانات جغرافية مضغوطة KML - Географски данни — KML, компресирани - dades geogràfiques comprimides KML - Komprimovaná geografická data KML - KML-geografiske komprimerede data - KML geographische komprimierte Daten - γεωγραφικά συμπιεσμένα δεδομένα KML - KML geographic compressed data - datos geográficos comprimidos KML - KML datu geografiko konprimituak - KML landafrøðilig stappað dáta - données géographiques KML compressées - sonraí comhbhrúite geografacha KML - datos xeográficos KML comprimidos - מידע גאוגרפי דחוס KML - KML geografski komprimirani podaci - KML tömörített földrajzi adatok - Data geografis KML terkompresi - Dati geografici KML compressi - KML 地理圧縮データ - KML географиялық сығылған ақпарат - KML 지리 정보 압축 데이터 - KML geografiniai suglaudinti duomenys - KML saspiesti ģeogrāfiskie dati - KML geographic compressed data - Skompresowane dane geograficzne KML - Dados comprimidos geográficos KML - Date geografice comprimate KML - сжатые географические данные KML - Komprimované zemepisné údaje KML - Skrčeni geografski podatki KML - KML geografiskt komprimerat data - стиснуті географічні дані KML - KML 压缩地理数据 - KML 地理壓縮資料 - KML - Keyhole Markup Language - - - - - Citrix ICA settings file - ملف إعدادات Citrix ICA - Fajł naładaŭ Citrix ICA - Настройки — Citrix ICA - fitxer de paràmetres de Citrix ICA - Soubor nastavení Citrix ICA - Citrix ICA-opsætningsfil - Citrix-ICA-Einstellungsdatei - αρχείο ρυθμίσεων Citrix ICA - Citrix ICA settings file - archivo de opciones de Citrix ICA - Citrix ICA ezarpenen fitxategia - Citrix ICA -asetustiedosto - Citrix ICA stillingarfíla - fichier de paramètres ICA Citrix - comhad socruithe Citrix ICA - ficheiro de configuracións de Citrix ICA - קובץ הגדרות של Citrix ICA - Citrix ICA datoteka postavki - Citrix ICA beállításfájl - Berkas penataan Citrix ICA - File impostazioni Citrix ICA - Citrix ICA 設定ファイル - Citrix ICA-ის პარამეტრების ფაილი - Citrix ICA баптаулар файлы - 시트릭스 ICA 설정 파일 - Citrix ICA parametrų failas - Citrix ICA iestatījumu datne - Innstillingsfil for Citrix ICA - Citrix ICA-instellingen - Citrix ICA-innstillingsfil - Plik ustawień Citrix ICA - Arquivo de configurações do Citrix ICA - Fișier de configurări Citrix ICA - файл настроек Citrix ICA - Súbor nastavení Citrix ICA - Nastavitvena datoteka Citrix ICA - File rregullimesh Citrix ICA - Citrix ICA-inställningsfil - файл параметрів ICA Citrix - Tập tin thiết lập ICA Citrix - Citrix ICA 设置文件 - Citrix ICA 設定值檔案 - ICA - Independent Computing Architecture - - - - - - XUL interface document - مستند واجهة XUL - Interfejsny dakument XUL - Документ — интерфейс за XUL - document d'interfície XUL - Dokument rozhraní XUL - XUL-grænsefladedokument - XUL-Oberflächendokument - έγγραφο διεπαφής XUL - XUL interface document - documento de interfaz XUL - XUL interfazearen dokumentua - XUL-käyttöliittymäasiakirja - XUL markamótsskjal - document d'interface XUL - cáipéis chomhéadan XUL - documento de interface XUL - מסמך ממשק XUL - XUL-felületdokumentum - Dokumen antarmuka XUL - Documento interfaccia XUL - XUL インターフェイスドキュメント - XUL интерфейс құжаты - XUL 인터페이스 문서 - XUL sąsajos dokumentas - XUL saskarnes dokuments - XUL-grensesnittdokument - XUL-interface-document - XUL-grensesnitt-dokument - Dokument interfejsu XUL - Documento de interface XUL - Document interfață XUL - документ интерфейса XUL - Dokument rozhrania XUL - Dokument vmesnika XUL - Dokument interfaqe XUL - XUL-gränssnittsdokument - XUL arayüz belgesi - документ інтерфейсу XUL - Tài liệu giao diện XUL - XUL 界面文档 - XUL 介面文件 - XUL - XML User interface markup Language - - - - - - - XPInstall installer module - وحدة مثبت XPInstall - Пакет — инсталация XPInstall - mòdul instal·lador d'XPinstall - Modul instalátoru XPInstall - XPInstall-installationsmodul - XPInstall-Installermodul - XPInstall installer module - módulo del instalador XPInstall - XPInstall instalatzailearen modulua - XPInstall-asennuspaketti - XPInstall innleggjaramótul - module d'installation XPInstall - modúl suiteála XPInstall - Módulo do instalador XPInstall - מודול התקנה של XPInstall - XPInstall telepítőmodul - Modul installer XPInstall - Modulo installatore XPInstall - XPInstall インストーラモジュール - XPInstall орнату модулі - XPInstall 설치 프로그램 모듈 - XPInstall įdiegiklio modulis - XPInstall instalatora modulis - XPInstall installeer module - Moduł instalatora XPInstall - Módulo de instalador XPInstall - Modul de instalare XPInstall - модуль установщика XPInstall - Modul inštalátora XPInstall - modul namestilnika XPInstall - XPInstall-installeringsmodul - модуль засобу встановлення XPInstall - XPInstall 安装工具模块 - XPInstall 安裝程式模組 - - - - - Word 2007 document - مستند Word 2007 - Документ — Word 2007 - document de Word 2007 - Dokument Word 2007 - Word 2007-dokument - Word-2007-Dokument - έγγραφο Word 2007 - Word 2007 document - documento de Word 2007 - Word 2007 dokumentua - Word 2007 -asiakirja - Word 2007 skjal - document Word 2007 - cáipéis Word 2007 - documento de Word 2007 - מסמך Word 2007 - Word 2007 dokument - Word 2007 dokumentum - Dokumen Word 2007 - Documento Word 2007 - Word 2007 ドキュメント - Word 2007 құжаты - 워드 2007 문서 - Word 2007 dokumentas - Word 2007 dokuments - Word 2007-document - Dokument Word 2007 - Documento do Word 2007 - Document Word 2007 - документ Word 2007 - Dokument Word 2007 - Dokument Word 2007 - Word 2007-dokument - документ Word 2007 - Tài liệu Word 2007 - Microsoft Word 2007 文档 - Word 2007 文件 - - - - - - Word 2007 document template - Шаблон за документи — Word 2007 - plantilla de document de Word 2007 - Šablona dokumentu Word 2007 - Word 2007-dokumentskabelon - Word 2007-Dokumentvorlage - πρότυπο έγγραφο Word 2007 - Word 2007 document template - Plantilla de documento de Word 2007 - Word 2007 -asiakirjamalli - modèle de document Word 2007 - Plantilla de documento de Word 2007 - תבנית מסמך של Word 2007 - Word 2007 predložak dokumenta - Word 2007 dokumentumsablon - Templat dokumen Word 2007 - Modello documento Word 2007 - Word 2007 文書テンプレート - Word 2007-ის დოკუმენტის შაბლონი - Word 2007 құжатының үлгісі - 워드 2007 문서 서식 - Word 2007 dokumenta veidne - Word 2007 document sjabloon - Szablon dokumentu Word 2007 - Modelo de documento do Word 2007 - шаблон документа Word 2007 - Predloga dokumenta Word 2007 - Word 2007-dokumentmall - шаблон документа Word 2007 - Word 2007 文档模板 - Word 2007 文件範本 - - - - - - PowerPoint 2007 presentation - عرض تقديمي PowerPoint 2007 - Презентация — PowerPoint 2007 - presentació de PowerPoint 2007 - Prezentace PowerPoint 2007 - PowerPoint 2007-præsentation - PowerPoint-2007-Präsentation - παρουσίαση PowerPoint 2007 - PowerPoint 2007 presentation - presentación de PowerPoint 2007 - PowerPoint 2007 aurkezpena - PowerPoint 2007 -esitys - PowerPoint 2007 framløga - présentation PowerPoint 2007 - láithreoireacht PowerPoint 2007 - presentación de PowerPoint 2007 - מצגת של PowerPoint 2007 - PowerPoint 2007 prezentacija - PowerPoint 2007 prezentáció - Presentasi PowerPoint 2007 - Presentazione standard PowerPoint 2007 - PowerPoint 2007 プレゼンテーション - PowerPoint 2007 презентациясы - 파워포인트 2007 프리젠테이션 - PowerPoint 2007 pateiktis - PowerPoint 2007 prezentācija - PowerPoint 2007-presentatie - Prezentacja PowerPoint 2007 - Apresentação do PowerPoint 2007 - Prezentare PowerPoint 2007 - презентация PowerPoint 2007 - Prezentácia PowerPoint 2007 - Predstavitev Microsoft PowerPoint 2007 - PowerPoint 2007-presentation - презентація PowerPoint 2007 - Trình diễn PowerPoint 2007 - Microsoft PowerPoint 2007 演示文稿 - PowerPoint 2007 簡報 - - - - - - PowerPoint 2007 slide - Кадър — PoerPoint 2007 - dispositiva de PowerPoint 2007 - Snímek PowerPoint 2007 - PowerPoint 2007-slide - PowerPoint 2007-Folie - σλάιντ PowerPoint 2007 - PowerPoint 2007 slide - Diapositiva de PowerPoint 2007 - diapositive PowerPoint 2007 - Diaporama de PowerPoint 2007 - שקופית של PowerPoint 2007 - PowerPoint 2007 slajd - PowerPoint 2007 dia - Slide PowerPoint 2007 - Diapositiva PowerPoint 2007 - PowerPoint 2007 スライド - PowerPoint 2007-ის სლაიდი - PowerPoint 2007 слайды - 파워포인트 2007 슬라이드 - PowerPoint 2007 slaids - PowerPoint 2007 dia - Slajd PowerPoint 2007 - Slide do PowerPoint 2007 - слайд PowerPoint 2007 - Prosojnica PowerPoint 2007 - слайд PowerPoint 2007 - PowerPoint 2007 文稿 - PowerPoint 2007 投影片 - - - - - - PowerPoint 2007 show - عرض PowerPoint 2007 - Презентация-шоу — PowerPoint 2007 - exposició de PowerPoint 2007 - Prezentace PowerPoint 2007 - PowerPoint 2007-dias - PowerPoint-2007-Präsentation - σόου PowerPoint 2007 - PowerPoint 2007 show - exposición de PowerPoint 2007 - PowerPoint 2007 ikuskizuna - PowerPoint 2007 -diaesitys - PowerPoint 2007 framsýning - diaporama PowerPoint 2007 - taispeántas PowerPoint 2007 - Exposición de PowerPoint 2007 - תצוגה של PowerPoint 2007 - PowerPoint 2007 prezentacija - PowerPoint 2007 bemutató - Presentasi PowerPoint 2007 - Solo presentazione PowerPoint 2007 - PowerPoint 2007 プレゼンテーション - PowerPoint 2007 көрсетілімі - 파워포인트 2007 쇼 - PowerPoint 2007 pateiktis - PowerPoint 2007 slīdrāde - PowerPoint 2007 show - Pokaz PowerPoint 2007 - Apresentação do PowerPoint 2007 - Prezentare PowerPoint 2007 - презентация PowerPoint 2007 - Ukážka PowerPoint 2007 - Zagonska predstavitev PowerPoint 2007 - PowerPoint 2007-visning - показ слайдів PowerPoint 2007 - Microsoft PowerPoint 2007 演示文稿 - PowerPoint 2007 展示 - - - - - - PowerPoint 2007 presentation template - Шаблон за презентации — PowerPoint 2007 - plantilla de presentació de PowerPoint 2007 - Šablona prezentace PowerPoint 2007 - PowerPoint 2007-præsentationsskabelon - PowerPoint 2007-Präsentationsvorlage - πρότυπο παρουσίασης PowerPoint 2007 - PowerPoint 2007 presentation template - Plantilla de presentación de PowerPoint 2007 - PowerPoint 2007 -esitysmalli - modèle de présentation PowerPoint 2007 - modelo de presentación de PowerPoint 2007 - תבנית למצגת של PowerPoint 2007 - PowerPoint 2007 predložak prezentacije - PowerPoint 2007 bemutatósablon - Templat presentasi PowerPoint 2007 - Modello presentazione PowerPoint 2007 - PowerPoint 2007 プレゼンテーションテンプレート - PowerPoint 2007-ის პრეზენტაციის შაბლონი - PowerPoint 2007 презентация шаблоны - 파워포인트 2007 프리젠테이션 서식 - PowerPoint 2007 prezentācijas veidne - PowerPoint 2007 presentation sjabloon - Szablon prezentacji PowerPoint 2007 - Modelo de apresentação do PowerPoint 2007 - шаблон презентации PowerPoint 2007 - Predloga predstavitve PowerPoint 2007 - PowerPoint 2007-presentationsmall - шаблон презентації PowerPoint 2007 - PowerPoint 2007 演示文稿模板 - PowerPoint 2007 簡報範本 - - - - - - Excel 2007 spreadsheet - جدول Excel 2007 - Таблица — Excel 2007 - full de càlcul d'Excel 2007 - Sešit Excel 2007 - Excel 2007-regneark - Excel-2007-Tabelle - φύλλο εργασίας Excel 2007 - Excel 2007 spreadsheet - hoja de cálculo de Excel 2007 - Excel 2007 kalkulu-orria - Excel 2007 -taulukko - Excel 2007 rokniark - feuille de calcul Excel 2007 - scarbhileog Excel 2007 - folla de cálculo de Excel 2007 - גליון נתונים של אקסל 2007 - Excel 2007 proračunska tablica - Excel 2007 táblázat - Lembar sebar Excel 2007 - Foglio di calcolo Excel 2007 - Excel 2007 スプレッドシート - Excel 2007-ის ცხრილი - Excel 2007 электрондық кестесі - 엑셀 2007 스프레드시트 - Excel 2007 skaičialentė - Excel 2007 izklājlapa - Excel 2007-rekenblad - Arkusz Excel 2007 - Planilha do Excel 2007 - Foaie de calcul Excel 2007 - электронная таблица Excel 2007 - Zošit Excel 2007 - Razpredelnica Microsoft Excel 2007 - Excel 2007-kalkylblad - ел. таблиця Excel 2007 - Bảng tính Excel 2007 - Microsoft Excel 2007 工作簿 - Excel 2007 試算表 - - - - - - Excel 2007 spreadsheet template - Шаблон за таблици — Excel 2007 - plantilla de full de càlcul d'Excel 2007 - Šablona sešitu Excel 2007 - Excel 2007-regnearksskabelon - Excel 2007-Datenblattvorlage - πρότυπο φύλλου εργασίας Excel 2007 - Excel 2007 spreadsheet template - Plantilla de hoja de cálculo Excel 2007 - Excel 2007 -taulukkomalli - modèle de feuille de calcul Excel 2007 - modelo de folla de cálculo Excel 2007 - תבנית של גיליון נתונים של Excel 2007 - Excel 2007 predložak proračunske tablice - Excel 2007 táblázatsablon - Templat lembar kerja Excel 2007 - Modello foglio di calcolo Excel 2007 - Excel 2007 スプレッドシートテンプレート - Excel 2007-ის ცხრილის შაბლონი - Excel 2007 кесте шаблоны - 엑셀 2007 스프레드쉬트 - Excel 2007 izklājlapas veidne - Excel 2007 spreadsheet sjabloon - Szablon arkusza Excel 2007 - Modelo de planilha do Excel 2007 - шаблон электронной таблицы Excel 2007 - Predloga razpredelnice Excel 2007 - Excel 2007-kalkylarksmall - шаблон електронної таблиці Excel 2007 - Excel 2007 工作表模板 - Excel 2007 試算表範本 - - - - - - T602 document - مستند T602 - Dakument T602 - Документ — T602 - document T602 - Dokument T602 - T602-dokument - T602-Dokument - αρχείο T602 - T602 document - T602-dokumento - documento T602 - T602 dokumentua - T602-asiakirja - T602 skjal - document T602 - cáipéis T602 - documento T602 - מסמך T602 - T602 dokument - T602 dokumentum - Dokumen T602 - Documento T602 - T602 ドキュメント - T602 құжаты - T602 문서 - T602 dokumentas - T602 dokuments - T602-dokument - T602-document - T602-dokument - Dokument T602 - Documento T602 - Document T602 - документ T602 - Dokument T602 - Dokument T602 - Dokument T602 - T602-dokument - документ T602 - Tài liệu T602 - T602 文档 - T602 文件 - - - - - - - - - - Cisco VPN Settings - إعدادات Cisco VPN - Nałady Cisco VPN - Настройки — ВЧМ на Cisco - paràmetres VPN de Cisco - Nastavení Cisco VPN - Cisco VPN-opsætning - Cisco-VPN-Einstellungen - ρυθμίσεις Cisco VPN - Cisco VPN Settings - configuración VPN de Cisco - Cisco VPN ezarpenak - Cisco VPN -asetukset - Cisco VPN stillingar - paramètres VPN Cisco - socruithe VPN Cisco - configuracións de VPN de Cisco - הגדרות של Cisco VPN - Cisco VPN postavke - Cisco VPN beállítások - Penataan Cisco VPN - Impostazioni VPN Cisco - Cisco VPN 設定 - Cisco VPN-ის პარამეტრები - Cisco VPN баптаулары - Cisco VPN 설정 - Cisco VPN parametrai - Cisco VPN iestatījumi - Cisco VPN-innstillinger - Cisco VPN-instellingen - Cisco VPN-innstillingar - Ustawienia VPN Cisco - Configurações de VPN da Cisco - Configurări VPN Cisco - файл настроек Cisco VPN - Nastavenia Cisco VPN - Datoteka nastavitev Cisco VPN - Rregullime VPN Cisco - Cisco VPN-inställningar - параметри VPN Cisco - Thiết lập VPN Cisco - Cisco VPN 设置 - Cisco VPN 設定值 - - - - - - - - - - ICC profile - تشكيلة OCL - Цветови профил — OCL - perfil ICC - Profil ICC - ICC-profil - ICC-Profil - προφίλ ICC - ICC profile - ICC-profilo - perfil ICC - ICC profila - ICC-profiili - ICC umhvarv - profil ICC - próifíl ICC - perfíl ICC - פרופיל ICC - ICC profil - ICC profil - Profil ICC - Profilo ICC - ICC プロファイル - ICC профайлы - ICC 프로필 - ICC profilis - ICC profils - ICC profiel - Profil ICC - Perfil ICC - Profil ICC - профиль ICC - Profil farieb ICC - Datoteka profila ICC - ICC-profil - профіль ICC - ICC 文件 - ICC 設定檔 - - - - - - - - IT 8.7 color calibration file - ملف ضبط ألوان IT 8.7 - Файл за цветово калибриране — IT 8.7 - fitxer de calibratge de color IT 8.7 - Soubor kalibrace barev IT 8.7 - IT 8.7 farvekalibreringsfil - IT 8.7 Farbkalibrierungsdatei - αρχείο ρύθμισης χρώματος ΙΤ 8.7 - IT 8.7 color calibration file - archivo de calibración de color IT 8.7 - IT 8.7 kolore-kalibrazioaren fitxategia - IT 8.7 -värikalibrointitiedosto - IT 8.7 litstillingarfíla - fichier de calibration couleur IT 8.7 - comhad calabraithe dathanna IT 8.7 - ficheiro de calibración de cor IT 8.7 - קובץ כיול צבע IT 8.7 - IT 8.7 datoteka kalibracije boja - IT 8.7 színkalibrációs fájl - Berkas kalibrasi warna IT 8.7 - File calibrazione colore IT 8.7 - IT 8.7 カラーキャリブレーションファイル - IT 8.7 түс баптау файлы - IT 8.7 색 조율 파일 - IT 8.7 spalvų kalibravimo failas - IT 8.7 krāsu kalibrācijas datne - IT 8.7 kleurcalibratie bestand - Plik kalibracji kolorów IT 8.7 - Arquivo de calibração de cor IT 8.7 - Fișier de calibrare a culorii IT 8.7 - файл калибровки цвета IT 8.7 - Umeritvena datoteka barve IT 8.7 - IT 8.7-färgkalibreringsfil - файл калібрування кольорів IT 8.7 - IT 8.7 色彩校准文件 - IT 8.7 色彩校正檔 - - - - - - - - - CCMX color correction file - - - - - - - - - WinHelp help file - - - - - - - - - - - digital photos - الصور الرقمية - ličbavyja zdymki - Цифрови фотографии - fotos digitals - Digitální fotografie - digitale billeder - Digitale Fotos - ψηφιακές φωτογραφίες - digital photos - fotos digitales - argazki digitalak - digivalokuvia - talgildar myndir - photos numériques - grianghraif dhigiteacha - fotos dixitais - תמונות דיגיטליות - digitalne fotografije - digitális fényképek - foto digital - Foto digitali - デジタルフォト - сандық фотосуреттер - 디지털 사진 - skaitmeninės nuotraukos - digitāla fotogrāfija - digitale foto's - digitale fotografi - Zdjęcia cyfrowe - Fotos digitais - fotografii digitale - цифровые фотографии - Digitálne fotografie - digitalne fotografije - Fotografi dixhitale - digitalbilder - цифрові фотографії - ảnh chụp số - 数字化图像 - 數位相片 - - - - - - - - Video CD - Video CD - Videa CD - CD — видео - Video CD - Video CD - Video-cd - Video-CD - Video CD - Video CD - Video-KD - Video CD - Bideo CDa - Video CD - Video CD - CD vidéo - Video CD - Video CD - תקליטור וידאו - Video CD - Video CD - Video CD - Video CD - ビデオ CD - видео CD - 비디오 CD - Vaizdo CD - Video CD - video-CD - Video-CD - Video CD - CD de vídeo - CD video - видеодиск VCD - Video CD - Video CD - CD Video - Video-cd - Video CD - Đĩa CD ảnh động - VCD - Video CD - - - - - - - - Super Video CD - Super Video CD - Super Video CD - CD — супер видео - Super Video CD - Super Video CD - Super Video-cd - Super-Video-CD - Super Video CD - Super Video CD - Super-Video-KD - Super Video CD - Super Bideo CDa - Super Video CD - Super Video CD - Super VCD - Super Video CD - Super vídeo CD - Super Video CD - Super Video CD - Super Video CD - Super Video CD - Super Video CD - スーパービデオ CD - Super Video CD - 수퍼 비디오 CD - Super vaizdo CD - Super Video CD - super-video-CD - Super Video-CD - Super Video CD - CD de Super Vídeo (SVCD) - Super Video CD - компакт-диск Super Video - Super Video CD - Super Video CD - CD Super Video - Super Video CD - Super Video CD - Đĩa CD siêu ảnh động - SVCD - Super Video CD - - - - - - - - video DVD - DVD مرئي - videa DVD - DVD — видео - vídeo DVD - DVD-Video - video-dvd - Video-DVD - βίντεο DVD - video DVD - video-DVD - DVD de vídeo - bideo DVDa - video-DVD - video DVD - DVD vidéo - DVD físe - DVD de vídeo - DVD וידאו - video DVD - video DVD - DVD video - DVD video - ビデオ DVD - ვიდეო DVD - видео DVD - 비디오 CD - vaizdo DVD - video DVD - video-DVD - Video-DVD - DVD-Video - DVD de vídeo - DVD video - видео-DVD - DVD-Video - video DVD - DVD video - video-dvd - відео-DVD - đĩa DVD ảnh động - 视频 DVD - 視訊 DVD - - - - - - - - - - - audio CD - CD سمعي - aŭdyjo CD - CD — аудио - CD d'àudio - Zvukové CD - lyd-cd - Audio-CD - CD ήχου - audio CD - Son-KD - CD de sonido - Audio CDa - ääni-CD - audio CD - CD audio - dlúthdhiosca fuaime - CD de son - תקליטור שמע - hang CD - CD audio - CD audio - オーディオ CD - аудио CD - 오디오 CD - garso CD - audio CD - audio-CD - lyd-CD - CD-Audio - CD de áudio - CD audio - звуковой CD - Zvukové CD - zvočni CD - CD audio - ljud-cd - Müzik CD'si - звуковий CD - đĩa CD âm thanh - 音频 CD - 音訊 CD - - - - - blank CD disc - قرص CD فارغ - čysty dysk CD - CD — празно - disc CD en blanc - Prázdný disk CD - tom cd-disk - Leere CD - κενό CD - blank CD disc - disco CD virgen - CD disko hutsa - tyhjä CD-levy - blonk fløga - CD vierge - dlúthdhiosca folamh - disco de CD en brancho - תקליטור ריק - üres CD-lemez - cakram CD kosong - Disco vuoto CD - ブランク CD ディスク - таза CD дискі - 빈 CD 디스크 - tuščias CD diskas - tukšs CD disks - blanco CD - tom CD-plate - Pusta płyta CD - Disco CD vazio - disc gol CD - чистый компакт-диск - Prázdny disk CD - prazen CD disk - Disk bosh CD - tom cd-skiva - boş CD diski - порожній компакт-диск - đĩa CD trống - 空 CD 光盘 - 空白 CD 光碟 - - - - - blank DVD disc - قرص DVD فارغ - čysty dysk DVD - DVD — празно - disc DVD en blanc - Prázdný disk DVD - tom dvd-disk - Leere DVD - κενό DVD - blank DVD disc - disco DVD virgen - DVD disko hutsa - tyhjä DVD-levy - blonk margfløga - DVD vierge - DVD folamh - disco de DVD en branco - תקליטור DVD ריק - üres DVD-lemez - cakram DVD kosong - Disco vuoto DVD - ブランク DVD ディスク - таза DVD дискі - 빈 DVD 디스크 - tuščias DVD diskas - tukšs DVD disks - blanco DVD - tom DVD-plate - Pusta płyta DVD - Disco DVD vazio - disc gol DVD - чистый диск DVD - Prázdny disk DVD - prazen DVD disk - Disk bosh DVD - tom dvd-skiva - boş DVD diski - порожній диск DVD - đĩa DVD trống - 空 DVD 光盘 - 空白 DVD 光碟 - - - - - blank Blu-ray disc - قرص بلو-راي فارغ - čysty dysk Blu-ray - Blu-ray — празно - disc Blu-Ray en blanc - Prázdný disk Blu-ray - tom Blu-ray-disk - Leeres Blu-Ray-Medium - κενό Blu-ray - blank Blu-ray disc - disco Blu-ray virgen - Blu-ray disko hutsa - tyhjä Blu-ray-levy - blankur Blu-ray diskur - disque Blu-Ray vierge - diosca folamh Blu-Ray - disco Blu-ray en branco - תקליטור בלו־ריי ריק - üres Blu-Ray lemez - cakram Blu-ray kosong - Disco vuoto Blu-ray - ブランク Blu-ray ディスク - таза Blu-ray дискі - 빈 블루레이 디스크 - tuščias Blu-ray diskas - tukšs Blu-ray disks - blanco Blu-ray-disk - tom Blu-Ray-plate - Pusta płyta Blu-ray - Disco Blu-ray vazio - disc gol Blu-ray - чистый диск Blu-ray - Prázdny disk Blu-ray - prazen Blu-Ray disk - Disk bosh Blu-ray - tom Blu-ray-skiva - boş Blue-ray diski - порожній диск Blu-ray - đĩa Blu-ray trống - 空蓝光 DVD - 空白 Blu-ray 光碟 - - - - - blank HD DVD disc - قرص HD DVD فارغ - čysty dysk HD DVD - HD DVD — празно - disc DVD HD en blanc - Prázdný disk HD DVD - tom HD dvd-disk - Leere HD-DVD - κενό HD DVD - blank HD DVD disc - disco HD DVD virgen - HD DVD disko hutsa - tyhjä HD DVD -levy - blankur HD DVD diskur - disque HD-DVD vierge - HD DVD folamh - disco de HD DVD en branco - דיסק HD DVD ריק - üres HD DVD-lemez - cakram HD DVD kosong - Disco vuoto DVD HD - ブランク HD DVD ディスク - таза HD DVD дискі - 빈 HD DVD 디스크 - tuščias HD DVD diskas - tukšs HD DVD disks - blanco HD-DVD - tom HD-DVD-plate - Pusta płyta HD DVD - Disco DVD HD vazio - disc gol HD DVD - чистый диск HD DVD - Prázdny disk HD DVD - prazen HD DVD disk - Disk bosh DVD HD - tom HD DVD-skiva - boş HD DVD diski - порожній диск HD DVD - đĩa DVD HD trống - 空 HD DVD 光盘 - 空白 HD DVD 光碟 - - - - - audio DVD - DVD سمعي - aŭdyjo DVD - DVD — аудио - DVD d'àudio - Zvukové DVD - lyd-dvd - Audio-DVD - DVD ήχου - audio DVD - Son-DVD - DVD de sonido - audio DVDa - ääni-DVD - Ljóð DVD - DVD audio - DVD fuaime - DVD de son - DVD שמע - hang DVD - DVD audio - DVD audio - オーディオ DVD - аудио DVD - 오디오 DVD - garso DVD - audio DVD - audio-DVD - lyd-DVD - DVD-Audio - DVD de áudio - DVD audio - звуковой DVD - Zvukové DVD - zvočni DVD - DVD audio - ljud-dvd - Müzik DVD'si - звуковий DVD - đĩa DVD âm thanh - 音频 DVD - 音訊 DVD - - - - - - - - - Blu-ray video disc - قرص بلو-راي مرئي - Videadysk Blu-ray - Blu-ray — видео - disc de vídeo Blu-Ray - Videodisk Blu-ray - Blu-ray video-disk - Blu-ray-Videoscheibe - δίσκος βίντεο Blu-ray - Blu-ray video disc - disco de vídeo Blu-ray - Blu-ray bideo-diskoa - Blu-ray-videolevy - Blu-ray diskur - disque vidéo Blu-Ray - diosca físe Blu-Ray - disco de vídeo Blu-ray - תקליטור וידאו מסוג בלו־ריי - Blu-ray video disk - Blu-ray videolemez - Cakram video Blu-ray - Disco video Blu-ray - Blu-ray ビデオディスク - Blu-ray ვიდეო დისკი - Blu-ray видео дискі - 블루레이 비디오 디스크 - Blu-ray vaizdo diskas - Blu-ray video disks - Blu-ray-videodisk - Blu-Ray videoplate - Płyta wideo Blu-ray - Disco de vídeo Blu-ray - Disc video Blu-ray - видеодиск Blu-ray - Videodisk Blu-ray - Blu-ray video disk - Disk video Blu-ray - Blu-ray-videoskiva - відеодиск Blu-ray - Đĩa ảnh động Blu-ray - 蓝光视频光盘 - Blu-ray 視訊光碟 - - - - - - - - - HD DVD video disc - قرص HD DVD مرئي - Videadysk HD DVD - HD DVD — видео - disc de vídeo DVD HD - Videodisk HD DVD - HD DVD-videodisk - HD-DVD-Videoscheibe - δίσκος βίντεο HD DVD - HD DVD video disc - disco de vídeo HD DVD - HD DVD bideo-diskoa - HD DVD -videolevy - HD DVD video diskur - disque vidéo HD DVD - diosca físe HD DVD - disco de vídeo HD DVD - תקליטור וידאו HD DVD - HD DVD video disk - HD DVD videolemez - Cakram video HD DVD - Disco video DVD HD - HD DVD ビデオディスク - HD DVD видео дискі - HD DVD 비디오 디스크 - HD DVD vaizdo diskas - HD DVD video disks - HD-DVD-videodisk - HD-DVD-videodisk - Płyta wideo HD DVD - Disco de vídeo HD DVD - Disc video HD DVD - видеодиск HD DVD - Videodisk HD DVD - HD DVD video disk - Disk video DVD HD - HD DVD-videoskiva - відеодиск HD DVD - Đĩa ảnh động DVD HD - HD DVD 视频光盘 - HD DVD 視訊光碟 - - - - - - - - - - e-book reader - Четец на е-книги - lector de llibres electrònics - Čtečka elektronických knih - e-bogslæser - E-Book-Leser - αναγνώστης ηλεκτρονικών βιβλίων - e-book reader - lector de libros electrónicos - e-kirjan lukulaite - lecteur de livre numérique - lector de libros electrónicos - קורא ספרים אלקטרוניים - čitač e-knjiga - e-könyvolvasó - Pembaca e-book - Lettore e-book - 電子書籍リーダー - электронды кітаптарды оқу құрылғысы - 전자책 리더 - e-grāmatu lasītājs - e-book reader - Czytnik e-booków - Leitor de e-book - устройство для чтения электронных книг - Bralnik elektronskih knjig - e-book-läsare - e-kitap okuyucu - пристрій для читання електронних книг - 电子书阅读器 - e-book 閱讀器 - - - - - - - - Picture CD - Picture CD - Picture CD - CD — изображения - Picture CD - Picture CD - Billedcd - Bild-CD - CD εικόνων - Picture CD - Picture CD - Picture CD - Picture CD - Picture CD - CD Picture - Picture CD - Picture CD - תקליטור תמונות - Picture CD - CD Gambar - Picture CD - ピクチャー CD - Picture CD - Picture CD - Paveikslėlių CD - Attēlu CD - foto-CD - Bilete-CD - Picture CD - CD de Fotos - CD cu fotografii - Picture CD - Picture CD - Slikovni CD - Picture CD - Picture CD - Resim CD'si - CD з зображеннями - Đĩa CD ảnh - 柯达 Picture CD - 圖片 CD - - - - - - - - portable audio player - مشغل الملفات المسموعة المحمولة - pieranosny aŭdyjoplayer - Преносим аудио плеър - reproductor d'àudio portàtil - Přenosný zvukový přehrávač - bærbar lydafspiller - Portables Audio-Wiedergabegerät - φορητός αναπαραγωγέας μουσικής - portable audio player - dispositivo de sonido portable - audio erreproduzigailu eramangarria - siirrettävä äänisoitin - leysur ljóðavspælari - lecteur audio portable - seinnteoir iniompartha fuaime - dispositivo de son portábel - נגן מוזיקה נייד - prenosivi audio svirač - hordozható zenelejátszó - pemutar audio portable - Lettore audio portabile - ポータブルオーディオプレイヤー - тасымалы аудио плеер - 휴대용 오디오 플레이어 - nešiojamasis garso leistuvas - portatīvais audio atskaņotājs - draagbare audiospeler - portable audio layer - Przenośny odtwarzacz dźwięku - Reprodutor de áudio portátil - player audio portabil - портативный аудиопроигрыватель - Prenosný hudobný prehrávač - prenosni predvajalnik zvoka - Lexues audio portativ - bärbar ljudspelare - портативний аудіопрогравач - bộ phát nhạc di động - 便携式音频播放器 - 可攜式音訊播放程式 - - - - - software - برنامج - prahrama - Софтуер - programari - Software - software - Software - λογισμικό - software - software - softwarea - ohjelmisto - ritbúnaður - logiciel - bogearraí - software - תכנה - softver - szoftver - peranti lunak - Software - ソフトウェア - პროგრამული უზრუნველყოფა - бағдарламалық қамтама - 소프트웨어 - programinė įranga - programmatūra - software - programvare - Oprogramowanie - Aplicativo - software - программное обеспечение - Softvér - programska oprema - Software - programvara - програмне забезпечення - phần mềm - 软件 - 軟體 - - - - - UNIX software - برنامج يونكس - Софтуер за UNIX - programari UNIX - Software UNIX - UNIX-programmer - UNIX Software - λογισμικό UNIX - UNIX software - software de UNIX - UNIXeko softwarea - UNIX-ohjelmisto - UNIX ritbúnaður - logiciel UNIX - bogearraí UNIX - Software de UNIX - תוכנת UNIX - UNIX softver - UNIX-szoftver - Peranti lunak UNIX - Software UNIX - UNIX ソフトウェア - UNIX бағдарламасы - UNIX 소프트웨어 - UNIX programinė įranga - UNIX programmatūra - UNIX software - Oprogramowanie systemu UNIX - Software UNIX - Software UNIX - программа UNIX - Softvér UNIX - Programska datoteka UNIX - UNIX-programvara - UNIX yazılımı - програмне забезпечення UNIX - UNIX 软件 - UNIX 軟體 - - - - - - - - - - - Windows software - برنامج ويندوز - Софтуер — Windows - programari de Windows - Software Windows - Windowsprogram - Windows-Software - λογισμικό Windows - Windows software - software de Windows - Windows-eko softwarea - Windows-ohjelmisto - Windows ritbúnaður - logiciel Windows - bogearraí Windows - Software de Windows - תוכנה לWindows - Windows softver - Windows-szoftver - Piranti lunak Windows - Software Windows - Windows ソフトウェア - Windows бағдарламасы - Windows 소프트웨어 - Windows programinė įranga - Windows programmatūra - Windows software - Oprogramowanie systemu Windows - Programa do Windows - Software Windows - программа Windows - Softvér Windows - Programska oprema za okolje Windows - Windows-program - програмне забезпечення Windows - Windows 软件 - Windows 軟體 - - - - - - - - - - TriG RDF document - TriG - TriG RDF Graph Triple Language - - - - - \ No newline at end of file diff --git a/Telegram/Resources/qrc/telegram/telegram.qrc b/Telegram/Resources/qrc/telegram/telegram.qrc index 37013d170..d8d40fbd3 100644 --- a/Telegram/Resources/qrc/telegram/telegram.qrc +++ b/Telegram/Resources/qrc/telegram/telegram.qrc @@ -83,9 +83,6 @@ ../../icons/settings/devices/device_web_firefox.lottie ../../icons/settings/devices/device_web_safari.lottie - - ../qmime/freedesktop.org.xml - ../../default_shortcuts-custom.json ../../../../lib/xdg/telegramdesktop.desktop From 633532b88d0d6186e5eba1d4f6497aef931d03f4 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 22 Dec 2021 11:47:17 +0000 Subject: [PATCH 028/173] Fix build on Windows. --- Telegram/lib_base | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Telegram/lib_base b/Telegram/lib_base index 9b62a55c5..a643b7188 160000 --- a/Telegram/lib_base +++ b/Telegram/lib_base @@ -1 +1 @@ -Subproject commit 9b62a55c59162b1c0c906c3311a49ea88abec73b +Subproject commit a643b71886ae2947b8db85dfe7b5575c748ce326 From 797433ebe9fff4bd5a5f75689c9e0a8706801af1 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 22 Dec 2021 12:32:07 +0000 Subject: [PATCH 029/173] Fix disappearing Send As Channel button. Fixes #17359. --- Telegram/SourceFiles/history/history_widget.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 1b459cafb..3e5a66f13 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -6550,9 +6550,7 @@ void HistoryWidget::cancelEdit() { fieldChanged(); _textUpdateEvents = old; - if (!canWriteMessage()) { - updateControlsVisibility(); - } + updateControlsVisibility(); updateBotKeyboard(); updateFieldPlaceholder(); From a7e552ccab964e470a792b02f6226c9b5f47497c Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 22 Dec 2021 13:05:54 +0000 Subject: [PATCH 030/173] Fix assertion violation in media overview. Regression was introduced in 5e7e7eaa83. --- Telegram/SourceFiles/info/media/info_media_list_widget.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Telegram/SourceFiles/info/media/info_media_list_widget.cpp b/Telegram/SourceFiles/info/media/info_media_list_widget.cpp index a6541aca4..a9a8621e6 100644 --- a/Telegram/SourceFiles/info/media/info_media_list_widget.cpp +++ b/Telegram/SourceFiles/info/media/info_media_list_widget.cpp @@ -853,11 +853,12 @@ void ListWidget::itemRemoved(not_null item) { FullMsgId ListWidget::computeFullId( UniversalMsgId universalId) const { Expects(universalId != 0); - Expects(universalId > 0 || _migrated != nullptr); return (universalId > 0) ? FullMsgId(_peer->id, universalId) - : FullMsgId(_migrated->id, ServerMaxMsgId + universalId); + : FullMsgId( + (_peer ? _peer.get() : _migrated)->id, + ServerMaxMsgId + universalId); } auto ListWidget::collectSelectedItems() const -> SelectedItems { From 0f15adb208b7b345f07fc0c07f6aca251ba6c5d7 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 22 Dec 2021 15:14:16 +0000 Subject: [PATCH 031/173] Sort contacts by last seen by default. Fixes #5515. --- Telegram/Resources/icons/contacts_add.png | Bin 107 -> 0 bytes Telegram/Resources/icons/contacts_add@2x.png | Bin 126 -> 0 bytes Telegram/Resources/icons/contacts_add@3x.png | Bin 174 -> 0 bytes .../Resources/icons/contacts_alphabet.png | Bin 0 -> 448 bytes .../Resources/icons/contacts_alphabet@2x.png | Bin 0 -> 784 bytes .../Resources/icons/contacts_alphabet@3x.png | Bin 0 -> 1148 bytes Telegram/Resources/icons/contacts_online.png | Bin 0 -> 385 bytes .../Resources/icons/contacts_online@2x.png | Bin 0 -> 649 bytes .../Resources/icons/contacts_online@3x.png | Bin 0 -> 1014 bytes Telegram/SourceFiles/boxes/boxes.style | 15 +++ .../boxes/peer_list_controllers.cpp | 96 ++++++++++++++++-- .../SourceFiles/boxes/peer_list_controllers.h | 13 +++ 12 files changed, 116 insertions(+), 8 deletions(-) delete mode 100644 Telegram/Resources/icons/contacts_add.png delete mode 100644 Telegram/Resources/icons/contacts_add@2x.png delete mode 100644 Telegram/Resources/icons/contacts_add@3x.png create mode 100644 Telegram/Resources/icons/contacts_alphabet.png create mode 100644 Telegram/Resources/icons/contacts_alphabet@2x.png create mode 100644 Telegram/Resources/icons/contacts_alphabet@3x.png create mode 100644 Telegram/Resources/icons/contacts_online.png create mode 100644 Telegram/Resources/icons/contacts_online@2x.png create mode 100644 Telegram/Resources/icons/contacts_online@3x.png diff --git a/Telegram/Resources/icons/contacts_add.png b/Telegram/Resources/icons/contacts_add.png deleted file mode 100644 index 3f3efebd0b11cedb540598fa10d43954c6d84ffa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MxHK?Ar`&KDG3Qb&Nnds`OiNw zDJA8|(w0Wf6nLBhKm02{ z7U`Z;@?rDkJtdjCnp%_AnBG1s(YvbD0H_)W8aB`0db)BSBZHW{AXwmstN~-~)xxSH$L4kwyK-~ZT=eJ#ta6Y>Cq9dQ_85{--9mSl{5wmZr1I=deboFyt I=akR{0J`%wxc~qF diff --git a/Telegram/Resources/icons/contacts_alphabet.png b/Telegram/Resources/icons/contacts_alphabet.png new file mode 100644 index 0000000000000000000000000000000000000000..8a8c99aa1d89313d219fc8648931bd046ca1c8d3 GIT binary patch literal 448 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgfOv}^7F~mYJ zIYEN8#i>DXg@dCKxr zU0q#MqK+LoQu6MOWx}SjXU;4+p(8FXzCe>--fmCvb3Ru#-KZ@uo}Ql0$;s*Pc+J|i zfoGVG-TM0adgH}L&UtpVQK6x%;b+gD{R>nQxjBuKgX7Pyui4Me%q-Bnl%#86A(0_= zA>PW$3g~=pe*WhV9yH8$WlBCj&vwPq!~ZvIFcA9UJjKh~`~TnH<)5FORZ3W}cJ1Hy z_w5y?r!@EU_Wu9#^YQD~+}C&3{{9xc-0$E{6@v>-Ei-4%oH}(X%ioevE(RyR<)sQY RQ!au+&(qbdZiqvcFo2t&;>j)7X4c4!E4U5~8&952KgoA7(Z+x1du8JUr6c)Y!OE(-f4K zOkwoek-zub=JPK#! zQESt--?o3x-}3I+@`!J5%cOhVUY7i-ut|FH+-+~%@ef;iebheBX>n0H+ITmw{jI#o z6N%jc8Zmm}?T0@W)+>~l*Z-f?t}lF{q{8{+si#H~ZxXpc7W`kz6r*oE(`RWAr{1yk zpIgp-UeDXj5VkVpNN!?Fo9lvuUyYnDmACDPn|A)WsZ?)=YW4cW!s?D~JXu?<1UO{) z+7Bia*v-#8yf@;0g29?F?Je%=lRKRjRv0#x?TA|Y$=}Cp_R?ODsQA@aot8FS_*&(< zMXa0k*MFB;Zu-+aR0R6n7H^EvoA~zo@A*n~$2ayLP2$*nHEZkb+?3;wKQ3=sVXZ61 zU6a|Mwfr*YI??&(+eL1@|E@K)%j%D^gWhy!o?UnKT$TpCtlH}~&qL+YjPtQQ@4p&F z%(}C!U~j-ihqZpoCwnbz;A%+-w=Meh_@|ft@95i~Dr`J>e#|qJ>gCXs;7MA3Ge=C| zk%$nBi)2#ew%fTzGhMPzJuOmTIUc7r*>&;7q>U$zKZO9!*rXP0{) zj-2hce8PqI-{-4!yl-jF-5SODdY_NNnN-DP48ad_S?d^0E>E3bHD}E%P-^sa^>bP0 Hl+XkKx?fC6 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/contacts_alphabet@3x.png b/Telegram/Resources/icons/contacts_alphabet@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..72a22f9f57d959fe13371d8db4b0fc8bd208b826 GIT binary patch literal 1148 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1SD_us|Wxo#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz1|Sip>6gA`6MbbAj}{>;)%SN;?3=-u z)*zX{2B(VI9;p^bMcq1a!Xq~~x2Wh-|8{P>{73KOPc8~8?7!uhW%{+guFlTVa^{Q~ z9IZ|t{(srJV~57k1yj3jOqw*wPFD0?WmVNBtw|XMU%!40WBT0T_pso{yLWzD{#X~q z$H$v^{)$+`?^^lkfc7dNSh>>E*SA$hKW0*w7|??KFaH1f^=s)#<_ABL5KaO+u+C6H z{h(a`^39utMN7QAymB zcR)!iqgwv$yUR*Uhy5$v?{{M$*`41XaeEa_WsAg4aD(mNO<_+uGEG#TE+)_`(#>T$dU6OzH%$b^s ziVnUvfBwXjzsRbwwY9w%C^_xZr=qWWqqfV*$OI%z*mz))m9g<+(-PJlO-)Q(%uJI$ ztzE0TNg?y!Y-VxSdc$lfY3aoVadB~*Hf>rm@#d8)BE|;WN?UfleD$h}>GsW=2NxF? z6>TW@KX&zM=VZo>{^3=g;Hg;(~bE+uQBt z_h0E}ZP&`^W-kNAxyd~R9)AArj{d&BBi9Zca@rWGY8~YmZE1b)&K;43;-aFR1?_EZ zN3MPRSO}EbEgg}Ur*}-(asQ4T6E=9gzWw#9sZi?4_A4DJH&-mEuC88rQ}5xIFD2F0 z(SJ?eJWp7sF8}9ZN^Wj%h_k~J5udWMve?+W$BwlSI5DR;F*? ze(&{-U9!P4yiTu~{_UAKZ(iQ5)APggZ^;-h-cl3!M*Q&BojY${iInSF=I19ZEG%p& z+;Q^Aix)4d<GuEYGrGbEO@Y~8pqu*8jT=Je_6KVK|5 zclK;&#Ku{g6BefJ+__Wm@9*Eg7ysS*+PF2Jlb0iU4E+e yL|9Z*R8ms%TH%6UN8DDG)_+SuB<$;wKRAQA4*Tv{AU6+`^F3YtT-G@yGywnrSPzW= literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/contacts_online.png b/Telegram/Resources/icons/contacts_online.png new file mode 100644 index 0000000000000000000000000000000000000000..8fe7e9b163c78ea3319d6605cb52bf4da2c94e7e GIT binary patch literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlfUz4ml*46zV= z8*I(hVjyreb)(=T);BEN{RycvCokP_?GX2k+f~zZFRxhJ#PRO(!3XcUyf5i+?^D`m zlcx5$Q0Mib?R+;3Iu@;1mwim)$Dc0q)cUiVd^i|e3y!BtuxX~=|Nf1wLpnC@*OMnT zbE{+{swCSILqq31pSyco?rF>85qxL!+F!+Y?t4EywUdcaAjbDnd-V0vA3tX=o4JgW zC46#(M`PHD!a0jHI-FgCPIt}m;ayfaZ}nWSNiAHG$3JdV;$RZuUH)uW-mGPXGQlx# zgQvQ=zV*J`y>!-ECP_2t^Gaf$qL%AB`nWBd{^$ML`ML`?Ozhe*r2*u9Pgg&ebxsLQ E075^CsQ>@~ literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/contacts_online@2x.png b/Telegram/Resources/icons/contacts_online@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3549bc9479f64f0285989c814f16feef5e8e3fff GIT binary patch literal 649 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@H1$0Ck2}&NuokdH8~}@dC*UJbR`$%CzcFKmGXQj-Zt>hZ~m)#9cl# z{dB6??5(%oKK|&j@Tmd^6W4mF5-ZtCp|*+3TmRPi|LA?to%FqG@8y>vYr~2k9th&7 zuYbI}lkZJgOyH)22@DI`(;R??|L|bjF>R{X(z^Zq%^$zoEVSw83iH|UuwcfzmZKbD zK2kBKljdxSc@%Z+ZCUrxq%PIVO;b}9gZoo&n?+UZjH&z2%ixpfV;k_Pt<{N9|MJh8 zeYuGe8(G?)#9sR3u;FA%(d@2_M&~liMh3%gdE00EEpI>UXu_0!rN8g7i&ko+*pBZu z`jZ6iyr>PTFff~awr1Y@e*Ohtt9n~*gw|+3xR$kbMyq_!`Ao@qU+3kRO7R+MC4RGX z2xe0`w?1QL$hHd)k}?knboZ*u_qy$SuP?@3)LeOV`njxgN@xNANxuba literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/contacts_online@3x.png b/Telegram/Resources/icons/contacts_online@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..5cf60407b67aa9ce19b758b9e81e12da9c9b6998 GIT binary patch literal 1014 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1SD_us|Wxo#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz1|Sip>6gA`6MbbAj}p5W=?7?Q#I zHfpb*mZM0RLX(Dm0!J^W>_R18^w@GxMTk@RK+K|xC04S%Zi~{YpX8XWRy}Dc^*A^% z&c?vyVup!Wx2%ke!#z>Cl^s%^n|JM4_V@Vl<5Au0O^e$R&H+2_N0Ngb%kG$UC04yW zx88rxZ(9_%zWvR%xb@Mu@4kJzR@d{?(W9-c2W;fdSJ-T0jaYu!Q2a&^Tkg8->b<&* zho>({+L+<((CT#XPTl|6M-Ru`Iw5VCFoW@@tnr-!;kJVbAO8HYnd&7gFE1}EyYTe% z>C=xNcYpJ2Yt-AHKP!bDXWV8_nBt|n=2F#ctyKvJF3h^Uwe{Y)bLZHa8|732`Hdx_ zCAvD-tzW-hyt`H6Zb3OKmoH1q zt1@2P`Oe$jX!OoQ<USz$ z3Y^(GTYN+O&b#kQf4LT0Je0GENosm2X>u<|`MUj$)}&vd3;JAPP{@*orak+~o_^3s%oi@+;OLu+5 zg=>%Y`OjIjeEIT)0UVFp6!i7={r&uos2zSNz}>Ur=QQ2FCL4YQ$sCyC%$U&Sus_5> z!?aO2Z_k#Bgv5;+&F{)~zb%{neU)gzuB%!L4?cJh820eZr7PN!zR`1b8v(N3A|iA-}mq<(jYhlgL<^Q&EH&W(PT zE{FVPGd}-Y3snD?iGA%0VcTf=#e>!DE8ju42FqUpJUO>#ZrgA@!CKh2jrZ{~pEFyE zh0^-`3?=10iocf@V@_2%{9qv$oAxB{ugmnlB`)r bot, not_null chat) { const auto history = chat->owner().history(chat); auto &histories = history->owner().histories(); @@ -110,17 +114,31 @@ void AddBotToGroup(not_null bot, not_null chat) { object_ptr PrepareContactsBox( not_null sessionController) { - const auto controller = sessionController; - auto delegate = [=](not_null box) { + using Mode = ContactsBoxController::SortMode; + auto controller = std::make_unique( + &sessionController->session()); + const auto raw = controller.get(); + auto init = [=](not_null box) { + struct State { + QPointer toggleSort; + Mode mode = ContactsBoxController::SortMode::Online; + }; + const auto state = box->lifetime().make_state(); box->addButton(tr::lng_close(), [=] { box->closeBox(); }); box->addLeftButton( tr::lng_profile_add_contact(), - [=] { controller->showAddContact(); }); + [=] { sessionController->showAddContact(); }); + state->toggleSort = box->addTopButton(st::contactsSortButton, [=] { + const auto online = (state->mode == Mode::Online); + state->mode = online ? Mode::Alphabet : Mode::Online; + raw->setSortMode(state->mode); + state->toggleSort->setIconOverride( + online ? &st::contactsSortOnlineIcon : nullptr, + online ? &st::contactsSortOnlineIconOver : nullptr); + }); + raw->setSortMode(Mode::Online); }; - return Box( - std::make_unique( - &sessionController->session()), - std::move(delegate)); + return Box(std::move(controller), std::move(init)); } void PeerListRowWithLink::setActionLink(const QString &action) { @@ -368,7 +386,8 @@ ContactsBoxController::ContactsBoxController( not_null session, std::unique_ptr searchController) : PeerListController(std::move(searchController)) -, _session(session) { +, _session(session) +, _sortByOnlineTimer([=] { sort(); }) { } Main::Session &ContactsBoxController::session() const { @@ -404,6 +423,7 @@ void ContactsBoxController::rebuildRows() { }; appendList(session().data().contactsList()); checkForEmptyRows(); + sort(); delegate()->peerListRefreshRows(); } @@ -427,6 +447,66 @@ void ContactsBoxController::rowClicked(not_null row) { Ui::showPeerHistory(row->peer(), ShowAtUnreadMsgId); } +void ContactsBoxController::setSortMode(SortMode mode) { + if (_sortMode == mode) { + return; + } + _sortMode = mode; + sort(); + if (_sortMode == SortMode::Online) { + session().changes().peerUpdates( + Data::PeerUpdate::Flag::OnlineStatus + ) | rpl::filter([=](const Data::PeerUpdate &update) { + return !_sortByOnlineTimer.isActive() + && delegate()->peerListFindRow(update.peer->id.value); + }) | rpl::start_with_next([=] { + _sortByOnlineTimer.callOnce(kSortByOnlineThrottle); + }, _sortByOnlineLifetime); + } else { + _sortByOnlineTimer.cancel(); + _sortByOnlineLifetime.destroy(); + } +} + +void ContactsBoxController::sort() { + switch (_sortMode) { + case SortMode::Alphabet: sortByName(); break; + case SortMode::Online: sortByOnline(); break; + default: Unexpected("SortMode in ContactsBoxController."); + } +} + +void ContactsBoxController::sortByName() { + auto keys = base::flat_map(); + keys.reserve(delegate()->peerListFullRowsCount()); + const auto key = [&](const PeerListRow &row) { + const auto id = row.id(); + const auto i = keys.find(id); + if (i != end(keys)) { + return i->second; + } + const auto peer = row.peer(); + const auto history = peer->owner().history(peer); + return keys.emplace(id, history->chatListNameSortKey()).first->second; + }; + const auto predicate = [&](const PeerListRow &a, const PeerListRow &b) { + return (key(a).compare(key(b)) < 0); + }; + delegate()->peerListSortRows(predicate); +} + +void ContactsBoxController::sortByOnline() { + const auto now = base::unixtime::now(); + const auto key = [&](const PeerListRow &row) { + const auto user = row.peer()->asUser(); + return user ? (std::min(user->onlineTill, now) + 1) : TimeId(); + }; + const auto predicate = [&](const PeerListRow &a, const PeerListRow &b) { + return key(a) > key(b); + }; + delegate()->peerListSortRows(predicate); +} + bool ContactsBoxController::appendRow(not_null user) { if (auto row = delegate()->peerListFindRow(user->id.value)) { updateRowHook(row); diff --git a/Telegram/SourceFiles/boxes/peer_list_controllers.h b/Telegram/SourceFiles/boxes/peer_list_controllers.h index 6250e4236..a9599d8f9 100644 --- a/Telegram/SourceFiles/boxes/peer_list_controllers.h +++ b/Telegram/SourceFiles/boxes/peer_list_controllers.h @@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "boxes/peer_list_box.h" #include "base/flat_set.h" #include "base/weak_ptr.h" +#include "base/timer.h" // Not used for now. // @@ -136,6 +137,12 @@ public: not_null peer) override final; void rowClicked(not_null row) override; + enum class SortMode { + Alphabet, + Online, + }; + void setSortMode(SortMode mode); + protected: virtual std::unique_ptr createRow(not_null user); virtual void prepareViewHook() { @@ -144,11 +151,17 @@ protected: } private: + void sort(); + void sortByName(); + void sortByOnline(); void rebuildRows(); void checkForEmptyRows(); bool appendRow(not_null user); const not_null _session; + SortMode _sortMode = SortMode::Alphabet; + base::Timer _sortByOnlineTimer; + rpl::lifetime _sortByOnlineLifetime; }; From e05b2f3b3833b1c55451f3087891c93fe0106f52 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 22 Dec 2021 16:32:15 +0000 Subject: [PATCH 032/173] Fix build on Linux. --- cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake b/cmake index 857a31aec..f96a4a2fd 160000 --- a/cmake +++ b/cmake @@ -1 +1 @@ -Subproject commit 857a31aec6e18541939a82ad70e243b9eb04636b +Subproject commit f96a4a2fdee5d9c5a65553060efa709de007eee6 From 75337ad1c283ac9e9f4fc16848d8d10926bbaa11 Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 23 Dec 2021 00:07:10 +0000 Subject: [PATCH 033/173] Fix shared media list in migrated groups. --- Telegram/SourceFiles/info/media/info_media_list_widget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Telegram/SourceFiles/info/media/info_media_list_widget.cpp b/Telegram/SourceFiles/info/media/info_media_list_widget.cpp index a9a8621e6..8d5594f6a 100644 --- a/Telegram/SourceFiles/info/media/info_media_list_widget.cpp +++ b/Telegram/SourceFiles/info/media/info_media_list_widget.cpp @@ -857,7 +857,7 @@ FullMsgId ListWidget::computeFullId( return (universalId > 0) ? FullMsgId(_peer->id, universalId) : FullMsgId( - (_peer ? _peer.get() : _migrated)->id, + (_migrated ? _migrated : _peer.get())->id, ServerMaxMsgId + universalId); } From ede4c0f7812ea9f411f76ecc674bd6ba55892af9 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 22 Dec 2021 15:25:31 +0000 Subject: [PATCH 034/173] Beta version 3.3.1. - Switch between contacts list sorting modes. - Sort contacts list by last seen time by default. - Fix disappearing Send As Channel button after message editing. - Fix file upload cancelling. - Fix crash in video capture on macOS. - Fix labels in the About box. - Use Qt 6.2.2 for macOS and Linux builds. - Allow installing x64 Windows version on Windows ARM. --- Telegram/Resources/uwp/AppX/AppxManifest.xml | 2 +- Telegram/Resources/winrc/Telegram.rc | 8 +- Telegram/Resources/winrc/Updater.rc | 8 +- Telegram/SourceFiles/core/changelogs.cpp | 121 +++---------------- Telegram/SourceFiles/core/version.h | 6 +- Telegram/build/setup.iss | 4 +- Telegram/build/version | 10 +- changelog.txt | 11 ++ 8 files changed, 48 insertions(+), 122 deletions(-) diff --git a/Telegram/Resources/uwp/AppX/AppxManifest.xml b/Telegram/Resources/uwp/AppX/AppxManifest.xml index 9e4755846..8ea2fac00 100644 --- a/Telegram/Resources/uwp/AppX/AppxManifest.xml +++ b/Telegram/Resources/uwp/AppX/AppxManifest.xml @@ -10,7 +10,7 @@ + Version="3.3.1.0" /> Telegram Desktop Telegram Messenger LLP diff --git a/Telegram/Resources/winrc/Telegram.rc b/Telegram/Resources/winrc/Telegram.rc index 3e06cabaf..b6226ef84 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,3,0,0 - PRODUCTVERSION 3,3,0,0 + FILEVERSION 3,3,1,0 + PRODUCTVERSION 3,3,1,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.3.0.0" + VALUE "FileVersion", "3.3.1.0" VALUE "LegalCopyright", "Copyright (C) 2014-2021" VALUE "ProductName", "Telegram Desktop" - VALUE "ProductVersion", "3.3.0.0" + VALUE "ProductVersion", "3.3.1.0" END END BLOCK "VarFileInfo" diff --git a/Telegram/Resources/winrc/Updater.rc b/Telegram/Resources/winrc/Updater.rc index 7e621db0b..3e5a70881 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,3,0,0 - PRODUCTVERSION 3,3,0,0 + FILEVERSION 3,3,1,0 + PRODUCTVERSION 3,3,1,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.3.0.0" + VALUE "FileVersion", "3.3.1.0" VALUE "LegalCopyright", "Copyright (C) 2014-2021" VALUE "ProductName", "Telegram Desktop" - VALUE "ProductVersion", "3.3.0.0" + VALUE "ProductVersion", "3.3.1.0" END END BLOCK "VarFileInfo" diff --git a/Telegram/SourceFiles/core/changelogs.cpp b/Telegram/SourceFiles/core/changelogs.cpp index 38e7fadc5..0db97ec3e 100644 --- a/Telegram/SourceFiles/core/changelogs.cpp +++ b/Telegram/SourceFiles/core/changelogs.cpp @@ -22,109 +22,6 @@ namespace { std::map BetaLogs() { return { - { - 2009004, - "- Choose one from dozens of new gorgeous animated backgrounds" - " in Chat Settings > Chat background.\n" - }, - { - 2009005, - "- Tile chat background patterns horizontally.\n" - - "- Fix a rare crash in spellchecker on Windows.\n" - - "- Fix animated chat backgrounds in Saved Messages.\n" - - "- Fix \"Sorry, group is inaccessible\" message " - "in scheduled voice chats.\n", - }, - { - 2009013, - "- See unread comments count when scrolling discussions in channels." - }, - { - 3000002, - "- Check who've seen your message in small groups " - "from the context menu.\n" - - "- Enable recording with video in live streams and video chats." - }, - { - 3000004, - "- Fix a crash when joining video chat or live broadcast.\n" - - "- Add a \"Close to Taskbar\" option when tray icon is disabled " - "(Windows and Linux)." - }, - { - 3000005, - "- Add support for Emoji 13.1." - }, - { - 3001002, - "- Control video in fullscreen mode using arrows and numbers.\n" - - "- Open locations in browser if default Bing Maps is not installed.\n" - - "- Reconnect without timeout when network availability changes.\n" - - "- Crash fixes." - }, - { - 3001005, - "- Choose one of 8 new preset themes for any individual private chat.\n" - - "- Click on '...' menu > 'Change Colors' to pick a theme.\n" - - "- Both chat participants will see the same theme in that chat " - "– on all their devices.\n" - - "- Each new theme features colorful gradient message bubbles, " - "beautifully animated backgrounds and unique background patterns.\n" - - "- All chat themes have day and night versions and will follow " - "your overall dark mode settings.\n" - - "- Implement main window rounded corners on Windows 11.\n" - - "- Fix audio capture from AirPods on macOS.\n" - }, - { - 3001006, - "- Show small media previews in chats list.\n" - - "- Show media album previews and caption text in chats list.\n" - - "- Add \"Quick Reply\" and \"Mark as Read\" " - "to native Windows notifications.\n" - }, - { - 3001012, - "- Create special invite links that require admins " - "to approve users before they become members.\n" - - "- Admins can view the applicants' profiles and bios " - "by tapping the Join Requests bar at the top of the chat.\n" - - "- Add internal labels to your chat's Invite Links " - "to keep them organized.\n" - - "- Run natively on Apple Silicon (macOS only).\n" - }, - { - 3001013, - "- Fix requests to groups / channels processing.\n" - - "- Fix internal link previews with View Content button layout.\n" - - "- Fix crash in messages search with imported messages results.\n" - - "- Don't use fractional system UI scaling on Linux.\n" - - "- Fix invite link icons on macOS.\n" - - "- Several crash fixes.\n" - }, { 3002006, "- Try out the new audio player with playlist shuffle and repeat.\n" @@ -141,6 +38,24 @@ std::map BetaLogs() { "- Fix a crash in archived stickers loading.\n" "- Fix a crash in calls to old Telegram versions.\n" + }, + { + 3003001, + "- Switch between contacts list sorting modes.\n" + + "- Sort contacts list by last seen time by default.\n" + + "- Fix disappearing Send As Channel button after message editing.\n" + + "- Fix file upload cancelling.\n" + + "- Fix crash in video capture on macOS.\n" + + "- Fix labels in the About box.\n" + + "- Use Qt 6.2.2 for macOS and Linux builds.\n" + + "- Allow installing x64 Windows version on Windows ARM.\n" } }; }; diff --git a/Telegram/SourceFiles/core/version.h b/Telegram/SourceFiles/core/version.h index 2f40be903..1fc2a9d9d 100644 --- a/Telegram/SourceFiles/core/version.h +++ b/Telegram/SourceFiles/core/version.h @@ -22,7 +22,7 @@ constexpr auto AppId = "{53F49750-6209-4FBF-9CA8-7A333C87D1ED}"_cs; constexpr auto AppNameOld = "Telegram Win (Unofficial)"_cs; constexpr auto AppName = "Telegram Desktop"_cs; constexpr auto AppFile = "Telegram"_cs; -constexpr auto AppVersion = 3003000; -constexpr auto AppVersionStr = "3.3"; -constexpr auto AppBetaVersion = false; +constexpr auto AppVersion = 3003001; +constexpr auto AppVersionStr = "3.3.1"; +constexpr auto AppBetaVersion = true; constexpr auto AppAlphaVersion = TDESKTOP_ALPHA_VERSION; diff --git a/Telegram/build/setup.iss b/Telegram/build/setup.iss index b0d352bf3..55e0787ca 100644 --- a/Telegram/build/setup.iss +++ b/Telegram/build/setup.iss @@ -33,8 +33,8 @@ DisableDirPage=no DisableProgramGroupPage=no #if MyBuildTarget == "win64" -ArchitecturesAllowed=x64 -ArchitecturesInstallIn64BitMode=x64 +ArchitecturesAllowed="x64 arm64" +ArchitecturesInstallIn64BitMode="x64 arm64" OutputBaseFilename=tsetup-x64.{#MyAppVersionFull} #define ArchModulesFolder "x64" #else diff --git a/Telegram/build/version b/Telegram/build/version index f8102b229..d4526843f 100644 --- a/Telegram/build/version +++ b/Telegram/build/version @@ -1,7 +1,7 @@ -AppVersion 3003000 +AppVersion 3003001 AppVersionStrMajor 3.3 -AppVersionStrSmall 3.3 -AppVersionStr 3.3.0 -BetaChannel 0 +AppVersionStrSmall 3.3.1 +AppVersionStr 3.3.1 +BetaChannel 1 AlphaVersion 0 -AppVersionOriginal 3.3 +AppVersionOriginal 3.3.1.beta diff --git a/changelog.txt b/changelog.txt index cecace3f0..3288e7d7f 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,14 @@ +3.3.1 beta (22.12.21) + +- Switch between contacts list sorting modes. +- Sort contacts list by last seen time by default. +- Fix disappearing Send As Channel button after message editing. +- Fix file upload cancelling. +- Fix crash in video capture on macOS. +- Fix labels in the About box. +- Use Qt 6.2.2 for macOS and Linux builds. +- Allow installing x64 Windows version on Windows ARM. + 3.3 (07.12.21) - Content creators can restrict the ability to save media and forward messages from their groups and channels. From 8aa2f56717406e0aa9ad8cbc8ec4db98d7faa9de Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 22 Dec 2021 10:55:29 +0000 Subject: [PATCH 035/173] Specify exact FFmpeg revision. --- Telegram/build/docker/centos_env/Dockerfile | 8 ++++++-- Telegram/build/prepare/prepare.py | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Telegram/build/docker/centos_env/Dockerfile b/Telegram/build/docker/centos_env/Dockerfile index 76a163b26..0ccf715e9 100644 --- a/Telegram/build/docker/centos_env/Dockerfile +++ b/Telegram/build/docker/centos_env/Dockerfile @@ -457,9 +457,13 @@ COPY --from=drm ${LibrariesPath}/drm-cache / COPY --from=libva ${LibrariesPath}/libva-cache / COPY --from=libvdpau ${LibrariesPath}/libvdpau-cache / -RUN git clone -b release/4.4 --depth=1 $GIT/FFmpeg/FFmpeg.git ffmpeg - +RUN mkdir ffmpeg WORKDIR ffmpeg +RUN git init +RUN git remote add origin $GIT/FFmpeg/FFmpeg.git +RUN git fetch --depth=1 origin cc33e73618a981de7fd96385ecb34719de031f16 +RUN git reset --hard FETCH_HEAD + RUN ./configure \ --extra-cflags="-DCONFIG_SAFE_BITSTREAM_READER=1 $HFLAGS" \ --extra-cxxflags="-DCONFIG_SAFE_BITSTREAM_READER=1 $HFLAGS" \ diff --git a/Telegram/build/prepare/prepare.py b/Telegram/build/prepare/prepare.py index c37f50152..343d64ab1 100644 --- a/Telegram/build/prepare/prepare.py +++ b/Telegram/build/prepare/prepare.py @@ -625,7 +625,7 @@ mac: stage('ffmpeg', """ git clone https://github.com/FFmpeg/FFmpeg.git ffmpeg cd ffmpeg - git checkout release/4.4 + git checkout cc33e73618 win: SET PATH_BACKUP_=%PATH% SET PATH=%ROOT_DIR%\\ThirdParty\\msys64\\usr\\bin;%PATH% From dad1f196bae3a24c44656a03141f6d9c2baa95c5 Mon Sep 17 00:00:00 2001 From: Nate Graham Date: Sun, 26 Dec 2021 11:15:29 -0700 Subject: [PATCH 036/173] Mark as single-instance using X-GNOME-SingleWindow key Telegram is a single-instance app; attempting to open a second instance fails and simply focuses the existing instance. However the app's .desktop file does not indicate this to Linux desktop shells like GNOME and KDE Plasma, causing them to show a "Start new instance/Open new window" action for the app that will not work when used. This commit fixes that by setting `X-GNOME-SingleWindow=true` in the desktop file. This is a GNOME-specific key, but it is honored in KDE Plasma too. --- lib/xdg/telegramdesktop.desktop | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/xdg/telegramdesktop.desktop b/lib/xdg/telegramdesktop.desktop index c34d07c80..ad5f0ee45 100644 --- a/lib/xdg/telegramdesktop.desktop +++ b/lib/xdg/telegramdesktop.desktop @@ -13,6 +13,7 @@ MimeType=x-scheme-handler/tg; Keywords=tg;chat;im;messaging;messenger;sms;tdesktop; Actions=Quit; X-GNOME-UsesNotifications=true +X-GNOME-SingleWindow=true [Desktop Action Quit] Exec=telegram-desktop -quit From 4c3835c61c8dd7f0292a4f43d487fb2627900442 Mon Sep 17 00:00:00 2001 From: k1ee Date: Sun, 26 Dec 2021 22:05:49 +0800 Subject: [PATCH 037/173] Use https:// not git:// to clone. git:// is not going through proxy. --- Telegram/build/prepare/prepare.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Telegram/build/prepare/prepare.py b/Telegram/build/prepare/prepare.py index 343d64ab1..df32c5538 100644 --- a/Telegram/build/prepare/prepare.py +++ b/Telegram/build/prepare/prepare.py @@ -1043,7 +1043,7 @@ release: if buildQt5: stage('qt_5_15_2', """ - git clone git://code.qt.io/qt/qt5.git qt_5_15_2 + git clone https://code.qt.io/qt/qt5.git qt_5_15_2 cd qt_5_15_2 perl init-repository --module-subset=qtbase,qtimageformats,qtsvg git checkout v5.15.2 @@ -1126,7 +1126,7 @@ mac: if buildQt6: stage('qt_6_2_2', """ mac: - git clone -b v6.2.2 git://code.qt.io/qt/qt5.git qt_6_2_2 + git clone -b v6.2.2 https://code.qt.io/qt/qt5.git qt_6_2_2 cd qt_6_2_2 perl init-repository --module-subset=qtbase,qtimageformats,qtsvg,qt5compat depends:patches/qtbase_6_2_2/*.patch From ffe4208595b85fd072f81ac06545942f0d6410f5 Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Sun, 26 Dec 2021 22:49:35 +0400 Subject: [PATCH 038/173] Implement loop status/shuffle for MPRIS --- .../media/system_media_controls_manager.cpp | 54 ++++++++++++++++++- .../media/system_media_controls_manager.h | 2 + Telegram/lib_base | 2 +- 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/Telegram/SourceFiles/media/system_media_controls_manager.cpp b/Telegram/SourceFiles/media/system_media_controls_manager.cpp index 5e37f2f04..c6310cdc5 100644 --- a/Telegram/SourceFiles/media/system_media_controls_manager.cpp +++ b/Telegram/SourceFiles/media/system_media_controls_manager.cpp @@ -19,13 +19,26 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_account.h" #include "main/main_session.h" #include "media/audio/media_audio.h" -#include "media/player/media_player_instance.h" #include "media/streaming/media_streaming_instance.h" #include "media/streaming/media_streaming_player.h" #include "ui/text/format_song_document_name.h" #include "window/window_controller.h" namespace Media { +namespace { + +[[nodiscard]] auto RepeatModeToLoopStatus(Media::Player::RepeatMode mode) { + using Mode = Media::Player::RepeatMode; + using Status = base::Platform::SystemMediaControls::LoopStatus; + switch (mode) { + case Mode::None: return Status::None; + case Mode::One: return Status::Track; + case Mode::All: return Status::Playlist; + } + Unexpected("RepeatModeToLoopStatus in SystemMediaControlsManager"); +} + +} // namespace bool SystemMediaControlsManager::Supported() { return base::Platform::SystemMediaControls::Supported(); @@ -185,6 +198,22 @@ SystemMediaControlsManager::SystemMediaControlsManager( _controls->setIsPreviousEnabled(mediaPlayer->previousAvailable(type)); }, _lifetime); + using Media::Player::RepeatMode; + using Media::Player::OrderMode; + + Core::App().settings().playerRepeatModeValue( + ) | rpl::start_with_next([=](RepeatMode mode) { + _controls->setLoopStatus(RepeatModeToLoopStatus(mode)); + }, _lifetime); + + Core::App().settings().playerOrderModeValue( + ) | rpl::start_with_next([=](OrderMode mode) { + if (mode != OrderMode::Shuffle) { + _lastOrderMode = mode; + } + _controls->setShuffle(mode == OrderMode::Shuffle); + }, _lifetime); + _controls->commandRequests( ) | rpl::start_with_next([=](Command command) { switch (command) { @@ -195,6 +224,29 @@ SystemMediaControlsManager::SystemMediaControlsManager( case Command::Previous: mediaPlayer->previous(type); break; case Command::Stop: mediaPlayer->stop(type); break; case Command::Raise: controller->widget()->showFromTray(); break; + case Command::LoopNone: { + Core::App().settings().setPlayerRepeatMode(RepeatMode::None); + Core::App().saveSettingsDelayed(); + break; + } + case Command::LoopTrack: { + Core::App().settings().setPlayerRepeatMode(RepeatMode::One); + Core::App().saveSettingsDelayed(); + break; + } + case Command::LoopPlaylist: { + Core::App().settings().setPlayerRepeatMode(RepeatMode::All); + Core::App().saveSettingsDelayed(); + break; + } + case Command::Shuffle: { + const auto current = Core::App().settings().playerOrderMode(); + Core::App().settings().setPlayerOrderMode((current == OrderMode::Shuffle) + ? _lastOrderMode + : OrderMode::Shuffle); + Core::App().saveSettingsDelayed(); + break; + } case Command::Quit: { if (const auto main = controller->widget()->sessionContent()) { main->closeBothPlayers(); diff --git a/Telegram/SourceFiles/media/system_media_controls_manager.h b/Telegram/SourceFiles/media/system_media_controls_manager.h index 687b0b427..5638edf33 100644 --- a/Telegram/SourceFiles/media/system_media_controls_manager.h +++ b/Telegram/SourceFiles/media/system_media_controls_manager.h @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #pragma once #include "data/data_audio_msg_id.h" +#include "media/player/media_player_instance.h" namespace base::Platform { class SystemMediaControls; @@ -40,6 +41,7 @@ private: std::vector> _cachedMediaView; std::unique_ptr _streamed; AudioMsgId _lastAudioMsgId; + Media::Player::OrderMode _lastOrderMode; rpl::lifetime _lifetimeDownload; rpl::lifetime _lifetime; diff --git a/Telegram/lib_base b/Telegram/lib_base index a643b7188..d985476a6 160000 --- a/Telegram/lib_base +++ b/Telegram/lib_base @@ -1 +1 @@ -Subproject commit a643b71886ae2947b8db85dfe7b5575c748ce326 +Subproject commit d985476a6c3aec54790b1310f590a0813d3bd790 From 9506093cbd89d1f0a44eb4d184627f07dee95052 Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Wed, 22 Dec 2021 22:30:21 +0400 Subject: [PATCH 039/173] Remove unused submodules --- .gitmodules | 6 ------ Telegram/ThirdParty/Catch | 1 - Telegram/lib_rlottie | 1 - 3 files changed, 8 deletions(-) delete mode 160000 Telegram/ThirdParty/Catch delete mode 160000 Telegram/lib_rlottie diff --git a/.gitmodules b/.gitmodules index 26294499d..7be12d230 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,9 +4,6 @@ [submodule "Telegram/ThirdParty/GSL"] path = Telegram/ThirdParty/GSL url = https://github.com/Microsoft/GSL.git -[submodule "Telegram/ThirdParty/Catch"] - path = Telegram/ThirdParty/Catch - url = https://github.com/philsquared/Catch [submodule "Telegram/ThirdParty/xxHash"] path = Telegram/ThirdParty/xxHash url = https://github.com/Cyan4973/xxHash.git @@ -31,9 +28,6 @@ [submodule "Telegram/lib_ui"] path = Telegram/lib_ui url = https://github.com/desktop-app/lib_ui.git -[submodule "Telegram/lib_rlottie"] - path = Telegram/lib_rlottie - url = https://github.com/desktop-app/lib_rlottie.git [submodule "Telegram/lib_lottie"] path = Telegram/lib_lottie url = https://github.com/desktop-app/lib_lottie.git diff --git a/Telegram/ThirdParty/Catch b/Telegram/ThirdParty/Catch deleted file mode 160000 index 5ca44b687..000000000 --- a/Telegram/ThirdParty/Catch +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5ca44b68721833ae3731802ed99af67c6f38a53a diff --git a/Telegram/lib_rlottie b/Telegram/lib_rlottie deleted file mode 160000 index 0671bf705..000000000 --- a/Telegram/lib_rlottie +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0671bf70547381effcf442ec9618e04502a8adbc From 641583b434a1f16a48fa164119e8e53d34b62a13 Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Wed, 22 Dec 2021 22:30:44 +0400 Subject: [PATCH 040/173] Update libraries in Dockerfile & snapcraft.yml --- Telegram/build/docker/centos_env/Dockerfile | 49 ++++++++++++--------- snap/snapcraft.yaml | 4 +- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/Telegram/build/docker/centos_env/Dockerfile b/Telegram/build/docker/centos_env/Dockerfile index 0ccf715e9..4f3a28702 100644 --- a/Telegram/build/docker/centos_env/Dockerfile +++ b/Telegram/build/docker/centos_env/Dockerfile @@ -53,7 +53,7 @@ RUN git clone $GIT/desktop-app/patches.git && cd patches && git checkout 5368789 FROM builder AS extra-cmake-modules -RUN git clone -b v5.87.0 --depth=1 $GIT/KDE/extra-cmake-modules.git +RUN git clone -b v5.89.0 --depth=1 $GIT/KDE/extra-cmake-modules.git WORKDIR extra-cmake-modules RUN cmake -GNinja -B build . -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF @@ -64,7 +64,7 @@ WORKDIR .. RUN rm -rf extra-cmake-modules FROM builder AS libffi -RUN git clone -b v3.3 --depth=1 $GIT/libffi/libffi.git +RUN git clone -b v3.4.2 --depth=1 $GIT/libffi/libffi.git WORKDIR libffi RUN ./autogen.sh @@ -148,7 +148,7 @@ WORKDIR .. RUN rm -rf mozjpeg FROM builder AS opus -RUN git clone -b v1.3 --depth=1 $GIT/xiph/opus.git +RUN git clone -b v1.3.1 --depth=1 $GIT/xiph/opus.git WORKDIR opus RUN ./autogen.sh @@ -176,7 +176,7 @@ WORKDIR .. RUN rm -rf rnnoise FROM builder AS xcb-proto -RUN git clone -b xcb-proto-1.14 --depth=1 https://gitlab.freedesktop.org/xorg/proto/xcbproto.git +RUN git clone -b xcb-proto-1.14.1 --depth=1 https://gitlab.freedesktop.org/xorg/proto/xcbproto.git WORKDIR xcbproto RUN ./autogen.sh @@ -338,16 +338,19 @@ RUN rm -rf libxcomposite FROM builder AS wayland COPY --from=libffi ${LibrariesPath}/libffi-cache / -RUN git clone -b 1.19.0 --depth=1 https://gitlab.freedesktop.org/wayland/wayland.git +RUN git clone -b 1.20.0 --depth=1 https://gitlab.freedesktop.org/wayland/wayland.git WORKDIR wayland -RUN ./autogen.sh \ - --enable-static \ - --disable-documentation \ - --disable-dtd-validation +RUN meson build \ + --buildtype=release \ + --default-library=both \ + -Dtests=false \ + -Ddocumentation=false \ + -Ddtd_validation=false \ + -Dicon_directory=/usr/share/icons -RUN make -j$(nproc) -RUN make DESTDIR="$LibrariesPath/wayland-cache" install +RUN meson compile -C build +RUN DESTDIR="$LibrariesPath/wayland-cache" meson install -C build WORKDIR .. RUN rm -rf wayland @@ -355,12 +358,16 @@ RUN rm -rf wayland FROM builder AS wayland-protocols COPY --from=wayland ${LibrariesPath}/wayland-cache / -RUN git clone -b 1.23 --depth=1 https://gitlab.freedesktop.org/wayland/wayland-protocols.git +RUN git clone -b 1.24 --depth=1 https://gitlab.freedesktop.org/wayland/wayland-protocols.git WORKDIR wayland-protocols -RUN ./autogen.sh -RUN make -j$(nproc) -RUN make DESTDIR="$LibrariesPath/wayland-protocols-cache" install +RUN meson build \ + --buildtype=release \ + --default-library=both \ + -Dtests=false + +RUN meson compile -C build +RUN DESTDIR="$LibrariesPath/wayland-protocols-cache" meson install -C build WORKDIR .. RUN rm -rf wayland-protocols @@ -368,7 +375,7 @@ RUN rm -rf wayland-protocols FROM builder AS plasma-wayland-protocols COPY --from=extra-cmake-modules ${LibrariesPath}/extra-cmake-modules-cache / -RUN git clone -b v1.4.0 --depth=1 $GIT/KDE/plasma-wayland-protocols.git +RUN git clone -b v1.5.0 --depth=1 $GIT/KDE/plasma-wayland-protocols.git WORKDIR plasma-wayland-protocols RUN cmake -GNinja -B build . -DCMAKE_BUILD_TYPE=Release @@ -393,7 +400,7 @@ RUN rm -rf libpciaccess FROM builder AS drm COPY --from=libpciaccess ${LibrariesPath}/libpciaccess-cache / -RUN git clone -b libdrm-2.4.107 --depth=1 https://gitlab.freedesktop.org/mesa/drm.git +RUN git clone -b libdrm-2.4.109 --depth=1 https://gitlab.freedesktop.org/mesa/drm.git WORKDIR drm RUN meson build \ @@ -414,7 +421,7 @@ COPY --from=libXfixes ${LibrariesPath}/libXfixes-cache / COPY --from=wayland ${LibrariesPath}/wayland-cache / COPY --from=drm ${LibrariesPath}/drm-cache / -RUN git clone -b 2.10.0 --depth=1 $GIT/intel/libva.git +RUN git clone -b 2.13.0 --depth=1 $GIT/intel/libva.git WORKDIR libva RUN CFLAGS="-g -O2 $HFLAGS" ./autogen.sh \ @@ -611,7 +618,7 @@ RUN rm -rf $opensslDir FROM builder AS xkbcommon COPY --from=xcb ${LibrariesPath}/xcb-cache / -RUN git clone -b xkbcommon-1.0.3 --depth=1 $GIT/xkbcommon/libxkbcommon.git +RUN git clone -b xkbcommon-1.3.1 --depth=1 $GIT/xkbcommon/libxkbcommon.git WORKDIR libxkbcommon RUN meson build \ @@ -631,7 +638,7 @@ WORKDIR .. RUN rm -rf libxkbcommon FROM builder AS mm-common -RUN git clone -b 1.0.2 --depth=1 $GIT/GNOME/mm-common.git +RUN git clone -b 1.0.3 --depth=1 $GIT/GNOME/mm-common.git WORKDIR mm-common RUN NOCONFIGURE=1 ./autogen.sh @@ -645,7 +652,7 @@ RUN rm -rf mm-common FROM builder AS libsigcplusplus COPY --from=mm-common ${LibrariesPath}/mm-common-cache / -RUN git clone -b 2.10.6 --depth=1 $GIT/libsigcplusplus/libsigcplusplus.git +RUN git clone -b 2.10.7 --depth=1 $GIT/libsigcplusplus/libsigcplusplus.git WORKDIR libsigcplusplus ENV ACLOCAL_PATH="/usr/local/share/aclocal" diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index e1c64b7a7..508810231 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -215,7 +215,7 @@ parts: extra-cmake-modules: source: https://github.com/KDE/extra-cmake-modules.git source-depth: 1 - source-tag: v5.87.0 + source-tag: v5.89.0 plugin: cmake cmake-parameters: - -DCMAKE_BUILD_TYPE=Release @@ -287,7 +287,7 @@ parts: plasma-wayland-protocols: source: https://github.com/KDE/plasma-wayland-protocols.git source-depth: 1 - source-tag: v1.4.0 + source-tag: v1.5.0 plugin: cmake cmake-parameters: - -DCMAKE_BUILD_TYPE=Release From a49feca28196b95313d3102efd293788bae45b98 Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Wed, 22 Dec 2021 22:36:28 +0400 Subject: [PATCH 041/173] Update submodule libraries --- Telegram/ThirdParty/GSL | 2 +- Telegram/ThirdParty/QR | 2 +- Telegram/ThirdParty/fcitx5-qt | 2 +- Telegram/ThirdParty/kwayland | 2 +- Telegram/ThirdParty/lz4 | 2 +- Telegram/ThirdParty/nimf | 2 +- Telegram/ThirdParty/xxHash | 2 +- Telegram/lib_qr | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Telegram/ThirdParty/GSL b/Telegram/ThirdParty/GSL index 1999b48a5..0f6dbc9e2 160000 --- a/Telegram/ThirdParty/GSL +++ b/Telegram/ThirdParty/GSL @@ -1 +1 @@ -Subproject commit 1999b48a519196711f0d03af3b7eedd49fcc6db3 +Subproject commit 0f6dbc9e2915ef5c16830f3fa3565738de2a9230 diff --git a/Telegram/ThirdParty/QR b/Telegram/ThirdParty/QR index 67c62461d..4d13c303d 160000 --- a/Telegram/ThirdParty/QR +++ b/Telegram/ThirdParty/QR @@ -1 +1 @@ -Subproject commit 67c62461d380352500fc39557fd9f046b7fe1d18 +Subproject commit 4d13c303dc878ffae8df6d0e0a7513fe860a092c diff --git a/Telegram/ThirdParty/fcitx5-qt b/Telegram/ThirdParty/fcitx5-qt index 8543204b9..fd06094f4 160000 --- a/Telegram/ThirdParty/fcitx5-qt +++ b/Telegram/ThirdParty/fcitx5-qt @@ -1 +1 @@ -Subproject commit 8543204b9a3792e0dbd4163ee9420e896f4f49d8 +Subproject commit fd06094f48e8281b6dc3fd4aaadfcd216c426a5a diff --git a/Telegram/ThirdParty/kwayland b/Telegram/ThirdParty/kwayland index 31e2e6cb5..bc0d37505 160000 --- a/Telegram/ThirdParty/kwayland +++ b/Telegram/ThirdParty/kwayland @@ -1 +1 @@ -Subproject commit 31e2e6cb59eb4b72392caa703909ef22cf06bcb7 +Subproject commit bc0d375055c20b43495a84bb5f90d530fc98be74 diff --git a/Telegram/ThirdParty/lz4 b/Telegram/ThirdParty/lz4 index 9a2a9f2d0..d44371841 160000 --- a/Telegram/ThirdParty/lz4 +++ b/Telegram/ThirdParty/lz4 @@ -1 +1 @@ -Subproject commit 9a2a9f2d0f38a39c5ec9b329042ca5f060b058e0 +Subproject commit d44371841a2f1728a3f36839fd4b7e872d0927d3 diff --git a/Telegram/ThirdParty/nimf b/Telegram/ThirdParty/nimf index 7234ac672..797cbc201 160000 --- a/Telegram/ThirdParty/nimf +++ b/Telegram/ThirdParty/nimf @@ -1 +1 @@ -Subproject commit 7234ac6724f4b7870aebed4dae95a4b9edbccd70 +Subproject commit 797cbc201d96e29f40557ddaf652f5771597813c diff --git a/Telegram/ThirdParty/xxHash b/Telegram/ThirdParty/xxHash index 7cc963969..35b0373c6 160000 --- a/Telegram/ThirdParty/xxHash +++ b/Telegram/ThirdParty/xxHash @@ -1 +1 @@ -Subproject commit 7cc9639699f64b750c0b82333dced9ea77e8436e +Subproject commit 35b0373c697b5f160d3db26b1cbb45a0d5ba788c diff --git a/Telegram/lib_qr b/Telegram/lib_qr index 2b08c71c6..f3be501ad 160000 --- a/Telegram/lib_qr +++ b/Telegram/lib_qr @@ -1 +1 @@ -Subproject commit 2b08c71c6edcfc3e31f7d7f518cc963493b6e189 +Subproject commit f3be501adc485596404de6b1ae2ce48180a2b2b2 From cbd04690424a7a988a80aaac653f04609d6d2de3 Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Wed, 22 Dec 2021 22:37:08 +0400 Subject: [PATCH 042/173] Update statusnotifieritem --- .../ThirdParty/statusnotifieritem/statusnotifieritem.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Telegram/ThirdParty/statusnotifieritem/statusnotifieritem.cpp b/Telegram/ThirdParty/statusnotifieritem/statusnotifieritem.cpp index 34ceb3c74..afbe2c36a 100644 --- a/Telegram/ThirdParty/statusnotifieritem/statusnotifieritem.cpp +++ b/Telegram/ThirdParty/statusnotifieritem/statusnotifieritem.cpp @@ -29,6 +29,7 @@ #include "statusnotifieritemadaptor.h" #include #include +#include #include int StatusNotifierItem::mServiceCounter = 0; @@ -39,7 +40,7 @@ StatusNotifierItem::StatusNotifierItem(QString id, QObject *parent) mService(QString::fromLatin1("org.freedesktop.StatusNotifierItem-%1-%2") .arg(QCoreApplication::applicationPid()) .arg(++mServiceCounter)), - mId(id), + mId(std::move(id)), mTitle(QLatin1String("Test")), mStatus(QLatin1String("Active")), mCategory(QLatin1String("ApplicationStatus")), @@ -276,7 +277,7 @@ void StatusNotifierItem::SecondaryActivate(int x, int y) void StatusNotifierItem::ContextMenu(int x, int y) { - if (mMenu) + if (mMenu != nullptr) { if (mMenu->isVisible()) mMenu->popup(QPoint(x, y)); From f90fb6c80ccc23607b6a9b192b5ba80310b4e3cb Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Wed, 22 Dec 2021 22:37:17 +0400 Subject: [PATCH 043/173] Update cmake_helpers --- cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake b/cmake index f96a4a2fd..651800993 160000 --- a/cmake +++ b/cmake @@ -1 +1 @@ -Subproject commit f96a4a2fdee5d9c5a65553060efa709de007eee6 +Subproject commit 65180099319368f92d4ca8efca6057584d480733 From b61250e101e383968a7d677e2d96bb23c2202082 Mon Sep 17 00:00:00 2001 From: Klemens Nanni Date: Fri, 24 Dec 2021 00:47:27 +0100 Subject: [PATCH 044/173] Remove unused variables Not used anymore since 29c0956d61dd0d4e621ccedd76e80cc35fc79bc4 "Always try to play video in voice chats.". --- Telegram/SourceFiles/calls/group/calls_group_members.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Telegram/SourceFiles/calls/group/calls_group_members.cpp b/Telegram/SourceFiles/calls/group/calls_group_members.cpp index 26e1ace96..be0499359 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_members.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_members.cpp @@ -44,8 +44,6 @@ namespace Calls::Group { namespace { constexpr auto kKeepRaisedHandStatusDuration = 3 * crl::time(1000); -constexpr auto kUserpicSizeForBlur = 40; -constexpr auto kUserpicBlurRadius = 8; using Row = MembersRow; From 078a2af385a95bbc874ece69982e09cf2bf2c151 Mon Sep 17 00:00:00 2001 From: Klemens Nanni Date: Fri, 24 Dec 2021 01:16:12 +0100 Subject: [PATCH 045/173] Fix -Wunused-const-variable warnings under DESKTOP_APP_DISABLE_DBUS_INTEGRATION OpenBSD builds without dbus integration (for now); this fixes the warnings. Those variables have been introduced in multiple commits. --- Telegram/SourceFiles/platform/linux/main_window_linux.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Telegram/SourceFiles/platform/linux/main_window_linux.cpp b/Telegram/SourceFiles/platform/linux/main_window_linux.cpp index 75127c629..cffa63a4f 100644 --- a/Telegram/SourceFiles/platform/linux/main_window_linux.cpp +++ b/Telegram/SourceFiles/platform/linux/main_window_linux.cpp @@ -68,6 +68,7 @@ constexpr auto kPanelTrayIconName = "telegram-panel"_cs; constexpr auto kMutePanelTrayIconName = "telegram-mute-panel"_cs; constexpr auto kAttentionPanelTrayIconName = "telegram-attention-panel"_cs; +#ifndef DESKTOP_APP_DISABLE_DBUS_INTEGRATION constexpr auto kPropertiesInterface = "org.freedesktop.DBus.Properties"_cs; constexpr auto kTrayIconFilename = "tdesktop-trayicon-XXXXXX.png"_cs; @@ -80,6 +81,7 @@ constexpr auto kAppMenuObjectPath = "/com/canonical/AppMenu/Registrar"_cs; constexpr auto kAppMenuInterface = kAppMenuService; constexpr auto kMainMenuObjectPath = "/MenuBar"_cs; +#endif // !DESKTOP_APP_DISABLE_DBUS_INTEGRATION bool TrayIconMuted = true; int32 TrayIconCount = 0; From 32473b29080bbfb5c13b3b46842813f8d8b358e7 Mon Sep 17 00:00:00 2001 From: Klemens Nanni Date: Fri, 24 Dec 2021 01:30:31 +0100 Subject: [PATCH 046/173] Remove unused variable Unused since c79cd0b692616ccf15fb88ea46a01aef17a77503 "Use Images::Read instead of App::readImage." --- Telegram/SourceFiles/app.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Telegram/SourceFiles/app.cpp b/Telegram/SourceFiles/app.cpp index b96161ef8..299c02cf4 100644 --- a/Telegram/SourceFiles/app.cpp +++ b/Telegram/SourceFiles/app.cpp @@ -18,8 +18,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace { -constexpr auto kImageAreaLimit = 12'032 * 9'024; - App::LaunchState _launchState = App::Launched; HistoryView::Element *hoveredItem = nullptr, From a1439163cef7003b87546c830c14cc31f0e940ff Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 3 Dec 2021 14:50:30 +0400 Subject: [PATCH 047/173] Update API scheme to layer136. --- Telegram/Resources/tl/api.tl | 27 ++++++++++++++++--- Telegram/SourceFiles/api/api_updates.cpp | 4 +-- .../data/data_scheduled_messages.cpp | 4 +-- Telegram/SourceFiles/data/data_session.cpp | 2 +- .../admin_log/history_admin_log_item.cpp | 2 +- .../settings/settings_privacy_controllers.cpp | 2 +- 6 files changed, 30 insertions(+), 11 deletions(-) diff --git a/Telegram/Resources/tl/api.tl b/Telegram/Resources/tl/api.tl index f113191df..5cbf2edc4 100644 --- a/Telegram/Resources/tl/api.tl +++ b/Telegram/Resources/tl/api.tl @@ -128,8 +128,8 @@ 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#46a6ffb4 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 = ChatFull; -channelFull#56662e2e 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 = ChatFull; +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; @@ -142,7 +142,7 @@ 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#85d6cbe2 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 restriction_reason:flags.22?Vector ttl_period:flags.25?int = 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; @@ -381,6 +381,7 @@ updateGroupCallConnection#b783982 flags:# presentation:flags.0?true params:DataJ 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; @@ -1302,6 +1303,19 @@ messages.peerSettings#6880b94d settings:PeerSettings chats:Vector users:Ve 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#87b6e36 flags:# min:flags.0?true results:Vector recent_reactons:flags.1?Vector = MessageReactions; + +messageUserReaction#932844fa user_id:long reaction:string = MessageUserReaction; + +messages.messageReactionsList#a366923c flags:# count:int reactions:Vector users:Vector next_offset:flags.0?string = messages.MessageReactionsList; + +availableReaction#64222f31 reaction:string title:string static_icon:Document select_animation:Document activate_animation:Document effect_animation:Document = AvailableReaction; + +messages.availableReactionsNotModified#9f071957 = messages.AvailableReactions; +messages.availableReactions#768e3aad hash:int reactions:Vector = messages.AvailableReactions; + ---functions--- invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X; @@ -1580,6 +1594,11 @@ messages.hideChatJoinRequest#7fe7e815 flags:# approved:flags.0?true peer:InputPe 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:# 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; updates.getState#edd4882a = updates.State; updates.getDifference#25939651 flags:# pts:int pts_total_limit:flags.0?int date:int qts:int = updates.Difference; @@ -1728,4 +1747,4 @@ stats.getMegagroupStats#dcdf8607 flags:# dark:flags.0?true channel:InputChannel 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 135 +// LAYER 136 diff --git a/Telegram/SourceFiles/api/api_updates.cpp b/Telegram/SourceFiles/api/api_updates.cpp index 9321ea3be..d41b08728 100644 --- a/Telegram/SourceFiles/api/api_updates.cpp +++ b/Telegram/SourceFiles/api/api_updates.cpp @@ -1109,7 +1109,7 @@ void Updates::applyUpdatesNoPtsCheck(const MTPUpdates &updates) { MTPint(), // edit_date MTPstring(), MTPlong(), - //MTPMessageReactions(), + MTPMessageReactions(), MTPVector(), MTP_int(d.vttl_period().value_or_empty())), MessageFlags(), @@ -1140,7 +1140,7 @@ void Updates::applyUpdatesNoPtsCheck(const MTPUpdates &updates) { MTPint(), // edit_date MTPstring(), MTPlong(), - //MTPMessageReactions(), + MTPMessageReactions(), MTPVector(), MTP_int(d.vttl_period().value_or_empty())), MessageFlags(), diff --git a/Telegram/SourceFiles/data/data_scheduled_messages.cpp b/Telegram/SourceFiles/data/data_scheduled_messages.cpp index 006358b13..fe68ac5ae 100644 --- a/Telegram/SourceFiles/data/data_scheduled_messages.cpp +++ b/Telegram/SourceFiles/data/data_scheduled_messages.cpp @@ -72,7 +72,7 @@ MTPMessage PrepareMessage(const MTPMessage &message) { MTP_int(data.vedit_date().value_or_empty()), MTP_bytes(data.vpost_author().value_or_empty()), MTP_long(data.vgrouped_id().value_or_empty()), - //MTPMessageReactions(), + MTPMessageReactions(), MTPVector(), MTP_int(data.vttl_period().value_or_empty())); }); @@ -213,7 +213,7 @@ void ScheduledMessages::sendNowSimpleMessage( MTPint(), // edit_date MTP_string(), MTPlong(), - //MTPMessageReactions(), + MTPMessageReactions(), MTPVector(), MTP_int(update.vttl_period().value_or_empty())), localFlags, diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index 77d35fb52..5d6154ac8 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -4046,7 +4046,7 @@ void Session::insertCheckedServiceNotification( MTPint(), // edit_date MTPstring(), MTPlong(), - //MTPMessageReactions(), + MTPMessageReactions(), MTPVector(), MTPint()), // ttl_period localFlags, diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_item.cpp b/Telegram/SourceFiles/history/admin_log/history_admin_log_item.cpp index 794719cef..e23c1cfb3 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_item.cpp +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_item.cpp @@ -118,7 +118,7 @@ MTPMessage PrepareLogMessage(const MTPMessage &message, TimeId newDate) { MTPint(), // edit_date MTP_string(), MTP_long(0), // grouped_id - //MTPMessageReactions(), + MTPMessageReactions(), MTPVector(), MTPint()); // ttl_period }); diff --git a/Telegram/SourceFiles/settings/settings_privacy_controllers.cpp b/Telegram/SourceFiles/settings/settings_privacy_controllers.cpp index 030b731d1..e3ec8bbbf 100644 --- a/Telegram/SourceFiles/settings/settings_privacy_controllers.cpp +++ b/Telegram/SourceFiles/settings/settings_privacy_controllers.cpp @@ -162,7 +162,7 @@ AdminLog::OwnedItem GenerateForwardedItem( MTPint(), // edit_date MTPstring(), // post_author MTPlong(), // grouped_id - //MTPMessageReactions(), + MTPMessageReactions(), MTPVector(), MTPint() // ttl_period ).match([&](const MTPDmessage &data) { From f5c7b206bb03583eb8ccbf10ea71f582a47428cf Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 11 Sep 2019 12:26:13 +0300 Subject: [PATCH 048/173] Track message reactions. --- Telegram/CMakeLists.txt | 2 + Telegram/SourceFiles/api/api_updates.cpp | 13 ++ .../data/data_message_reactions.cpp | 114 ++++++++++++++++++ .../SourceFiles/data/data_message_reactions.h | 34 ++++++ .../history/history_inner_widget.cpp | 12 ++ Telegram/SourceFiles/history/history_item.cpp | 33 +++++ Telegram/SourceFiles/history/history_item.h | 8 ++ Telegram/SourceFiles/ui/chat/chat.style | 6 + 8 files changed, 222 insertions(+) create mode 100644 Telegram/SourceFiles/data/data_message_reactions.cpp create mode 100644 Telegram/SourceFiles/data/data_message_reactions.h diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index 48953d6e7..f67db3492 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -445,6 +445,8 @@ PRIVATE data/data_media_types.h data/data_messages.cpp data/data_messages.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 diff --git a/Telegram/SourceFiles/api/api_updates.cpp b/Telegram/SourceFiles/api/api_updates.cpp index d41b08728..80e10391c 100644 --- a/Telegram/SourceFiles/api/api_updates.cpp +++ b/Telegram/SourceFiles/api/api_updates.cpp @@ -1617,6 +1617,19 @@ void Updates::feedUpdate(const MTPUpdate &update) { } } break; + case mtpc_updateMessageReactions: { + const auto &d = update.c_updateMessageReactions(); + const auto peer = peerFromMTP(d.vpeer()); + if (const auto history = session().data().historyLoaded(peer)) { + const auto item = session().data().message( + peer, + d.vmsg_id().v); + if (item) { + item->updateReactions(d.vreactions()); + } + } + } break; + // Messages being read. case mtpc_updateReadHistoryInbox: { auto &d = update.c_updateReadHistoryInbox(); diff --git a/Telegram/SourceFiles/data/data_message_reactions.cpp b/Telegram/SourceFiles/data/data_message_reactions.cpp new file mode 100644 index 000000000..1c259c6bd --- /dev/null +++ b/Telegram/SourceFiles/data/data_message_reactions.cpp @@ -0,0 +1,114 @@ +/* +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 "data/data_message_reactions.h" + +#include "history/history.h" +#include "history/history_item.h" +#include "main/main_session.h" +#include "apiwrap.h" + +namespace Data { + +std::vector MessageReactions::SuggestList() { + constexpr auto utf = [](const char *utf) { + return QString::fromUtf8(utf); + }; + return { + utf("\xE2\x9D\xA4\xEF\xB8\x8F"), // :heart: + utf("\xF0\x9F\x91\x8D"), // :like: + utf("\xF0\x9F\x98\x82"), // :joy: + utf("\xF0\x9F\x98\xB3"), // :flushed: + utf("\xF0\x9F\x98\x94"), // :pensive: + }; +} + +MessageReactions::MessageReactions(not_null item) +: _item(item) { +} + +void MessageReactions::add(const QString &reaction) { + if (_chosen == reaction) { + return; + } + if (!_chosen.isEmpty()) { + const auto i = _list.find(_chosen); + Assert(i != end(_list)); + --i->second; + if (!i->second) { + _list.erase(i); + } + } + _chosen = reaction; + if (!reaction.isEmpty()) { + ++_list[reaction]; + } + sendRequest(); +} + +void MessageReactions::set( + const QVector &list, + bool ignoreChosen) { + if (_requestId) { + // We'll apply non-stale data from the request response. + return; + } + auto existing = base::flat_set(); + for (const auto &count : list) { + count.match([&](const MTPDreactionCount &data) { + const auto reaction = qs(data.vreaction()); + if (data.is_chosen() && !ignoreChosen) { + _chosen = reaction; + } + _list[reaction] = data.vcount().v; + existing.emplace(reaction); + }); + } + if (_list.size() != existing.size()) { + for (auto i = begin(_list); i != end(_list);) { + if (!existing.contains(i->first)) { + i = _list.erase(i); + } else { + ++i; + } + } + if (!_chosen.isEmpty() && !_list.contains(_chosen)) { + _chosen = QString(); + } + } +} + +const base::flat_map &MessageReactions::list() const { + return _list; +} + +QString MessageReactions::chosen() const { + return _chosen; +} + +void MessageReactions::sendRequest() { + const auto api = &_item->history()->session().api(); + if (_requestId) { + api->request(_requestId).cancel(); + } + const auto flags = _chosen.isEmpty() + ? MTPmessages_SendReaction::Flag(0) + : MTPmessages_SendReaction::Flag::f_reaction; + _requestId = api->request(MTPmessages_SendReaction( + MTP_flags(flags), + _item->history()->peer->input, + MTP_int(_item->id), + MTP_string(_chosen) + )).done([=](const MTPUpdates &result) { + _requestId = 0; + api->applyUpdates(result); + }).fail([=](const MTP::Error &error) { + _requestId = 0; + }).send(); +} + +} // namespace Data diff --git a/Telegram/SourceFiles/data/data_message_reactions.h b/Telegram/SourceFiles/data/data_message_reactions.h new file mode 100644 index 000000000..e2f392c1b --- /dev/null +++ b/Telegram/SourceFiles/data/data_message_reactions.h @@ -0,0 +1,34 @@ +/* +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 + +namespace Data { + +class MessageReactions final { +public: + static std::vector SuggestList(); + + explicit MessageReactions(not_null item); + + void add(const QString &reaction); + void set(const QVector &list, bool ignoreChosen); + [[nodiscard]] const base::flat_map &list() const; + [[nodiscard]] QString chosen() const; + +private: + void sendRequest(); + + const not_null _item; + + QString _chosen; + base::flat_map _list; + mtpRequestId _requestId = 0; + +}; + +} // namespace Data diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index 23f2a3923..43c351a7e 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -61,6 +61,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "lang/lang_keys.h" #include "data/data_session.h" #include "data/data_media_types.h" +#include "data/data_message_reactions.h" #include "data/data_document.h" #include "data/data_channel.h" #include "data/data_poll.h" @@ -1683,6 +1684,17 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { return; } const auto itemId = item->fullId(); + if (item->canReact()) { + auto reactionMenu = std::make_unique( + this, + st::reactionMenu); + for (const auto &text : Data::MessageReactions::SuggestList()) { + reactionMenu->addAction(text, [=] { + item->addReaction(text); + }); + } + _menu->addAction("Reaction", std::move(reactionMenu)); + } if (canSendMessages) { _menu->addAction(tr::lng_context_reply_msg(tr::now), [=] { _widget->replyToMessage(itemId); diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index 3bc223104..b9dcc70a9 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -37,6 +37,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_scheduled_messages.h" // kScheduledUntilOnlineTimestamp #include "data/data_changes.h" #include "data/data_session.h" +#include "data/data_message_reactions.h" #include "data/data_messages.h" #include "data/data_media_types.h" #include "data/data_folder.h" @@ -741,6 +742,38 @@ bool HistoryItem::suggestDeleteAllReport() const { return !isPost() && !out(); } +bool HistoryItem::canReact() const { + return IsServerMsgId(id) && !out() && !_history->peer->isSelf(); +} + +void HistoryItem::addReaction(const QString &reaction) { + if (!_reactions) { + _reactions = std::make_unique(this); + } + _reactions->add(reaction); +} + +void HistoryItem::updateReactions(const MTPMessageReactions &reactions) { + reactions.match([&](const MTPDmessageReactions &data) { + if (data.vresults().v.isEmpty()) { + _reactions = nullptr; + return; + } else if (!_reactions) { + _reactions = std::make_unique(this); + } + _reactions->set(data.vresults().v, data.is_min()); + }); +} + +const base::flat_map &HistoryItem::reactions() const { + static const auto kEmpty = base::flat_map(); + return _reactions ? _reactions->list() : kEmpty; +} + +QString HistoryItem::chosenReaction() const { + return _reactions ? _reactions->chosen() : QString(); +} + bool HistoryItem::hasDirectLink() const { return isRegular() && _history->peer->isChannel(); } diff --git a/Telegram/SourceFiles/history/history_item.h b/Telegram/SourceFiles/history/history_item.h index 8f96c9ad7..2920d28bd 100644 --- a/Telegram/SourceFiles/history/history_item.h +++ b/Telegram/SourceFiles/history/history_item.h @@ -43,6 +43,7 @@ struct RippleAnimation; namespace Data { struct MessagePosition; class Media; +class MessageReactions; } // namespace Data namespace Window { @@ -389,6 +390,12 @@ public: [[nodiscard]] bool suggestBanReport() const; [[nodiscard]] bool suggestDeleteAllReport() const; + [[nodiscard]] bool canReact() const; + void addReaction(const QString &reaction); + void updateReactions(const MTPMessageReactions &reactions); + [[nodiscard]] const base::flat_map &reactions() const; + [[nodiscard]] QString chosenReaction() const; + [[nodiscard]] bool hasDirectLink() const; [[nodiscard]] FullMsgId fullId() const; @@ -489,6 +496,7 @@ protected: SavedMediaData _savedLocalEditMediaData; std::unique_ptr _media; + std::unique_ptr _reactions; private: diff --git a/Telegram/SourceFiles/ui/chat/chat.style b/Telegram/SourceFiles/ui/chat/chat.style index 8daef9a37..af0930954 100644 --- a/Telegram/SourceFiles/ui/chat/chat.style +++ b/Telegram/SourceFiles/ui/chat/chat.style @@ -48,6 +48,12 @@ historyThemeSize: size(272px, 176px); historyMinimalWidth: 380px; +reactionMenu: PopupMenu(defaultPopupMenu) { + menu: Menu(defaultMenu) { + widthMin: 30px; + } +} + historyScroll: ScrollArea(defaultScrollArea) { bg: historyScrollBg; bgOver: historyScrollBgOver; From 3a43217301c734ee00b3d298060e738fb988ad49 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 11 Sep 2019 13:55:39 +0300 Subject: [PATCH 049/173] Show reactions in messages. --- .../data/data_message_reactions.cpp | 3 ++ .../SourceFiles/history/history_message.cpp | 3 ++ .../SourceFiles/history/history_service.cpp | 4 ++ .../history/view/history_view_message.cpp | 43 ++++++++++++++++++- .../history/view/history_view_message.h | 6 +++ .../view/media/history_view_contact.cpp | 8 ++++ .../view/media/history_view_document.cpp | 1 + Telegram/SourceFiles/ui/chat/chat.style | 2 + 8 files changed, 68 insertions(+), 2 deletions(-) diff --git a/Telegram/SourceFiles/data/data_message_reactions.cpp b/Telegram/SourceFiles/data/data_message_reactions.cpp index 1c259c6bd..1569b555d 100644 --- a/Telegram/SourceFiles/data/data_message_reactions.cpp +++ b/Telegram/SourceFiles/data/data_message_reactions.cpp @@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/history.h" #include "history/history_item.h" #include "main/main_session.h" +#include "data/data_session.h" #include "apiwrap.h" namespace Data { @@ -48,6 +49,7 @@ void MessageReactions::add(const QString &reaction) { ++_list[reaction]; } sendRequest(); + _item->history()->owner().requestItemResize(_item); } void MessageReactions::set( @@ -80,6 +82,7 @@ void MessageReactions::set( _chosen = QString(); } } + _item->history()->owner().requestItemResize(_item); } const base::flat_map &MessageReactions::list() const { diff --git a/Telegram/SourceFiles/history/history_message.cpp b/Telegram/SourceFiles/history/history_message.cpp index 7e08d4d25..19ccda5af 100644 --- a/Telegram/SourceFiles/history/history_message.cpp +++ b/Telegram/SourceFiles/history/history_message.cpp @@ -513,6 +513,9 @@ HistoryMessage::HistoryMessage( setGroupId( MessageGroupId::FromRaw(history->peer->id, groupedId->v)); } + if (const auto reactions = data.vreactions()) { + updateReactions(*reactions); + } applyTTL(data); } diff --git a/Telegram/SourceFiles/history/history_service.cpp b/Telegram/SourceFiles/history/history_service.cpp index b4e6ca364..fb10ae3e2 100644 --- a/Telegram/SourceFiles/history/history_service.cpp +++ b/Telegram/SourceFiles/history/history_service.cpp @@ -1064,6 +1064,10 @@ void HistoryService::createFromMtp(const MTPDmessage &message) { default: Unexpected("Media type in HistoryService::createFromMtp()"); } + + if (const auto reactions = message.vreactions()) { + updateReactions(*reactions); + } } void HistoryService::createFromMtp(const MTPDmessageService &message) { diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index 71a52f6b0..288e777d5 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -30,6 +30,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "lang/lang_keys.h" #include "mainwidget.h" #include "main/main_session.h" +#include "ui/text/text_options.h" #include "window/window_session_controller.h" #include "apiwrap.h" @@ -236,6 +237,25 @@ LogEntryOriginal &LogEntryOriginal::operator=(LogEntryOriginal &&other) { LogEntryOriginal::~LogEntryOriginal() = default; +void Reactions::update(const base::flat_map &list) { + auto sorted = ranges::view::all( + list + ) | ranges::view::transform([](const auto &pair) { + return std::make_pair(pair.first, pair.second); + }) | ranges::to_vector; + ranges::sort(sorted, std::greater<>(), &std::pair::second); + + auto fullCount = 0; + auto composed = QString(); + for (const auto &[string, count] : sorted) { + composed.append(string); + fullCount += count; + } + composed += QString::number(fullCount); + + text.setText(st::msgDateTextStyle, composed, Ui::NameTextOptions()); +} + Message::Message( not_null delegate, not_null data, @@ -317,6 +337,14 @@ QSize Message::performCountOptimalSize() { refreshEditedBadge(); refreshRightBadge(); + if (const auto list = item->reactions(); !list.empty()) { + AddComponents(Reactions::Bit()); + const auto reactions = Get(); + reactions->update(list); + } else { + RemoveComponents(Reactions::Bit()); + } + if (drawBubble()) { const auto forwarded = item->Get(); const auto reply = displayedReply(); @@ -1778,7 +1806,11 @@ void Message::drawInfo( const auto viewIconTop = infoBottom + st::historyViewsTop; const auto pinIconTop = infoBottom + st::historyPinTop; auto left = infoRight - infoW; - if (auto views = item->Get()) { + if (const auto reactions = Get()) { + reactions->text.draw(p, left, dateY, reactions->text.maxWidth()); + left += reactions->text.maxWidth() + st::historyReactionsSkip; + } + if (const auto views = item->Get()) { const auto textTop = infoBottom - st::msgDateFont->descent; if (views->replies.count > 0 && !views->commentsMegagroupId @@ -1885,7 +1917,7 @@ bool Message::pointInTime( int Message::infoWidth() const { const auto item = message(); auto result = item->_timeWidth; - if (auto views = item->Get()) { + if (const auto views = item->Get()) { if (views->views.count >= 0) { result += st::historyViewsSpace + views->views.textWidth @@ -1915,6 +1947,9 @@ int Message::infoWidth() const { } else if (hasOutLayout()) { result += st::historySendStateSpace; } + if (const auto reactions = Get()) { + result += st::historyReactionsSkip + reactions->text.maxWidth(); + } return result; } @@ -1960,6 +1995,10 @@ int Message::timeLeft() const { if (displayPinIcon()) { result += st::historyPinWidth; } + + if (const auto reactions = Get()) { + result += st::historyReactionsSkip + reactions->text.maxWidth(); + } return result; } diff --git a/Telegram/SourceFiles/history/view/history_view_message.h b/Telegram/SourceFiles/history/view/history_view_message.h index 1496cb62b..fa3beaf94 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.h +++ b/Telegram/SourceFiles/history/view/history_view_message.h @@ -39,6 +39,12 @@ struct PsaTooltipState : public RuntimeComponent { mutable bool buttonVisible = true; }; +struct Reactions : public RuntimeComponent { + void update(const base::flat_map &list); + + Ui::Text::String text; +}; + class Message : public Element, public base::has_weak_ptr { public: Message( diff --git a/Telegram/SourceFiles/history/view/media/history_view_contact.cpp b/Telegram/SourceFiles/history/view/media/history_view_contact.cpp index 18d3d0017..b73cf8628 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_contact.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_contact.cpp @@ -148,6 +148,14 @@ QSize Contact::countOptimalSize() { accumulate_max(maxWidth, tleft + _name.maxWidth() + tright); accumulate_min(maxWidth, st::msgMaxWidth); auto minHeight = st.padding.top() + st.thumbSize + st.padding.bottom(); + const auto msgsigned = item->Get(); + const auto views = item->Get(); + if ((msgsigned && !msgsigned->isAnonymousRank) + || (views + && (views->views.count >= 0 || views->replies.count > 0)) + || !item->reactions().empty()) { + minHeight += st::msgDateFont->height - st::msgDateDelta.y(); + } if (!isBubbleTop()) { minHeight -= st::msgFileTopMinus; } diff --git a/Telegram/SourceFiles/history/view/media/history_view_document.cpp b/Telegram/SourceFiles/history/view/media/history_view_document.cpp index 7c94afd1e..b1467248d 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_document.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_document.cpp @@ -273,6 +273,7 @@ QSize Document::countOptimalSize() { if (!captioned && ((msgsigned && !msgsigned->isAnonymousRank) || (views && (views->views.count >= 0 || views->replies.count > 0)) + || !item->reactions().empty() || _parent->displayEditedBadge())) { minHeight += st::msgDateFont->height - st::msgDateDelta.y(); } diff --git a/Telegram/SourceFiles/ui/chat/chat.style b/Telegram/SourceFiles/ui/chat/chat.style index af0930954..7d688e711 100644 --- a/Telegram/SourceFiles/ui/chat/chat.style +++ b/Telegram/SourceFiles/ui/chat/chat.style @@ -209,6 +209,8 @@ historyPinOutIcon: icon {{ "history_pin", historyOutIconFg }}; historyPinOutSelectedIcon: icon {{ "history_pin", historyOutIconFgSelected }}; historyPinInvertedIcon: icon {{ "history_pin", historySendingInvertedIconFg }}; +historyReactionsSkip: 8px; + historyComposeField: InputField(defaultInputField) { font: msgFont; textMargins: margins(0px, 0px, 0px, 0px); From 1af2cfe1437e9770411e52d61405a6b8a93cb962 Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 12 Sep 2019 13:35:04 +0300 Subject: [PATCH 050/173] Extract BottomInfo from HistoryView::Message. --- Telegram/CMakeLists.txt | 2 + Telegram/SourceFiles/api/api_updates.cpp | 8 +- Telegram/SourceFiles/api/api_views.cpp | 4 +- Telegram/SourceFiles/data/data_session.cpp | 14 +- Telegram/SourceFiles/data/data_session.h | 5 +- .../admin_log/history_admin_log_inner.cpp | 6 + .../history/history_inner_widget.cpp | 8 + Telegram/SourceFiles/history/history_item.cpp | 5 +- Telegram/SourceFiles/history/history_item.h | 3 +- .../history/history_item_components.cpp | 32 -- .../history/history_item_components.h | 9 - .../SourceFiles/history/history_message.cpp | 33 +- .../SourceFiles/history/history_message.h | 7 +- .../SourceFiles/history/history_widget.cpp | 7 + .../history/view/history_view_bottom_info.cpp | 303 ++++++++++++++++++ .../history/view/history_view_bottom_info.h | 85 +++++ .../history/view/history_view_element.cpp | 11 +- .../history/view/history_view_element.h | 38 ++- .../history/view/history_view_list_widget.cpp | 6 + .../history/view/history_view_message.cpp | 273 +++------------- .../history/view/history_view_message.h | 23 +- .../history/view/media/history_view_gif.cpp | 10 +- .../view/media/history_view_location.cpp | 10 +- .../media/history_view_media_unwrapped.cpp | 14 +- .../history/view/media/history_view_photo.cpp | 10 +- 25 files changed, 561 insertions(+), 365 deletions(-) create mode 100644 Telegram/SourceFiles/history/view/history_view_bottom_info.cpp create mode 100644 Telegram/SourceFiles/history/view/history_view_bottom_info.h diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index f67db3492..4cdb45a56 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -621,6 +621,8 @@ PRIVATE history/view/media/history_view_theme_document.cpp history/view/media/history_view_web_page.h history/view/media/history_view_web_page.cpp + 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 diff --git a/Telegram/SourceFiles/api/api_updates.cpp b/Telegram/SourceFiles/api/api_updates.cpp index 80e10391c..11a465158 100644 --- a/Telegram/SourceFiles/api/api_updates.cpp +++ b/Telegram/SourceFiles/api/api_updates.cpp @@ -1163,7 +1163,7 @@ void Updates::applyUpdateNoPtsCheck(const MTPUpdate &update) { auto needToAdd = true; if (d.vmessage().type() == mtpc_message) { // index forwarded messages to links _overview const auto &data = d.vmessage().c_message(); - if (_session->data().checkEntitiesAndViewsUpdate(data)) { // already in blocks + if (_session->data().updateExistingMessage(data)) { // already in blocks LOG(("Skipping message, because it is already in blocks!")); needToAdd = false; } @@ -1257,7 +1257,7 @@ void Updates::applyUpdateNoPtsCheck(const MTPUpdate &update) { auto needToAdd = true; if (d.vmessage().type() == mtpc_message) { // index forwarded messages to links _overview const auto &data = d.vmessage().c_message(); - if (_session->data().checkEntitiesAndViewsUpdate(data)) { // already in blocks + if (_session->data().updateExistingMessage(data)) { // already in blocks LOG(("Skipping message, because it is already in blocks!")); needToAdd = false; } @@ -2163,7 +2163,9 @@ void Updates::feedUpdate(const MTPUpdate &update) { const auto &d = update.c_updateChannelMessageViews(); const auto peerId = peerFromChannel(d.vchannel_id()); if (const auto item = session().data().message(peerId, d.vid().v)) { - item->setViewsCount(d.vviews().v); + if (item->changeViewsCount(d.vviews().v)) { + session().data().notifyItemDataChange(item); + } } } break; diff --git a/Telegram/SourceFiles/api/api_views.cpp b/Telegram/SourceFiles/api/api_views.cpp index 462c5deea..dda9d7e69 100644 --- a/Telegram/SourceFiles/api/api_views.cpp +++ b/Telegram/SourceFiles/api/api_views.cpp @@ -99,7 +99,9 @@ void ViewsManager::done( if (const auto item = owner.message(peer->id, ids[j].v)) { v[j].match([&](const MTPDmessageViews &data) { if (const auto views = data.vviews()) { - item->setViewsCount(views->v); + if (item->changeViewsCount(views->v)) { + _session->data().notifyItemDataChange(item); + } } if (const auto forwards = data.vforwards()) { item->setForwardsCount(forwards->v); diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index 5d6154ac8..b82005903 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -1448,6 +1448,14 @@ rpl::producer> Session::itemViewRefreshRequest() const { return _itemViewRefreshRequest.events(); } +void Session::notifyItemDataChange(not_null item) { + _itemDataChanges.fire_copy(item); +} + +rpl::producer> Session::itemDataChanges() const { + return _itemDataChanges.events(); +} + void Session::requestItemTextRefresh(not_null item) { if (const auto i = _views.find(item); i != _views.end()) { for (const auto view : i->second) { @@ -1806,7 +1814,7 @@ void Session::reorderTwoPinnedChats( notifyPinnedDialogsOrderUpdated(); } -bool Session::checkEntitiesAndViewsUpdate(const MTPDmessage &data) { +bool Session::updateExistingMessage(const MTPDmessage &data) { const auto peer = peerFromMTP(data.vpeer_id()); const auto existing = message(peer, data.vid().v); if (!existing) { @@ -1834,7 +1842,7 @@ void Session::updateEditedMessage(const MTPMessage &data) { return; } if (existing->isLocalUpdateMedia() && data.type() == mtpc_message) { - checkEntitiesAndViewsUpdate(data.c_message()); + updateExistingMessage(data.c_message()); } data.match([](const MTPDmessageEmpty &) { }, [&](const MTPDmessageService &data) { @@ -1854,7 +1862,7 @@ void Session::processMessages( const auto &data = message.c_message(); // new message, index my forwarded messages to links overview if ((type == NewMessageType::Unread) - && checkEntitiesAndViewsUpdate(data)) { + && updateExistingMessage(data)) { continue; } } diff --git a/Telegram/SourceFiles/data/data_session.h b/Telegram/SourceFiles/data/data_session.h index c3d5a859f..f5f9ed779 100644 --- a/Telegram/SourceFiles/data/data_session.h +++ b/Telegram/SourceFiles/data/data_session.h @@ -251,6 +251,8 @@ public: [[nodiscard]] rpl::producer> animationPlayInlineRequest() const; void notifyHistoryUnloaded(not_null history); [[nodiscard]] rpl::producer> historyUnloaded() const; + void notifyItemDataChange(not_null item); + [[nodiscard]] rpl::producer> itemDataChanges() const; [[nodiscard]] rpl::producer> itemRemoved() const; [[nodiscard]] rpl::producer> itemRemoved( @@ -337,7 +339,7 @@ public: void unregisterMessageTTL(TimeId when, not_null item); // Returns true if item found and it is not detached. - bool checkEntitiesAndViewsUpdate(const MTPDmessage &data); + bool updateExistingMessage(const MTPDmessage &data); void updateEditedMessage(const MTPMessage &data); void processMessages( const QVector &data, @@ -832,6 +834,7 @@ private: rpl::event_stream> _viewResizeRequest; rpl::event_stream> _itemViewRefreshRequest; rpl::event_stream> _itemTextRefreshRequest; + rpl::event_stream> _itemDataChanges; rpl::event_stream> _animationPlayInlineRequest; rpl::event_stream> _itemRemoved; rpl::event_stream> _viewRemoved; diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp index 9662744ce..37d737b92 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp @@ -285,6 +285,12 @@ InnerWidget::InnerWidget( } } }, lifetime()); + session().data().itemDataChanges( + ) | rpl::start_with_next([=](not_null item) { + if (const auto view = viewForItem(item)) { + view->itemDataChanged(); + } + }, lifetime()); session().data().animationPlayInlineRequest( ) | rpl::start_with_next([=](auto item) { if (const auto view = viewForItem(item)) { diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index 43c351a7e..aa430e29f 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -245,6 +245,14 @@ HistoryInner::HistoryInner( }) | rpl::start_with_next([this](not_null view) { mouseActionUpdate(); }, lifetime()); + + session().data().itemDataChanges( + ) | rpl::filter([=](not_null item) { + return item->mainView() != nullptr; + }) | rpl::start_with_next([=](not_null item) { + item->mainView()->itemDataChanged(); + }, lifetime()); + session().changes().historyUpdates( _history, Data::HistoryUpdate::Flag::OutboxRead diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index b9dcc70a9..a332f0a48 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -524,7 +524,7 @@ void HistoryItem::applySentMessage(const MTPDmessage &data) { }, data.vmedia()); updateReplyMarkup(HistoryMessageMarkupData(data.vreply_markup())); updateForwardedInfo(data.vfwd_from()); - setViewsCount(data.vviews().value_or(-1)); + changeViewsCount(data.vviews().value_or(-1)); if (const auto replies = data.vreplies()) { setReplies(HistoryMessageRepliesData(replies)); } else { @@ -541,6 +541,7 @@ void HistoryItem::applySentMessage(const MTPDmessage &data) { setPostAuthor(data.vpost_author().value_or_empty()); contributeToSlowmode(data.vdate().v); indexAsNewItem(); + history()->owner().notifyItemDataChange(this); history()->owner().requestItemTextRefresh(this); history()->owner().updateDependentMessages(this); } @@ -596,6 +597,7 @@ void HistoryItem::setRealId(MsgId newId) { } } + _history->owner().notifyItemDataChange(this); _history->owner().requestItemRepaint(this); } @@ -914,6 +916,7 @@ void HistoryItem::sendFailed() { Expects(!(_flags & MessageFlag::SendingFailed)); _flags = (_flags | MessageFlag::SendingFailed) & ~MessageFlag::BeingSent; + _history->owner().notifyItemDataChange(this); history()->session().changes().historyUpdated( history(), Data::HistoryUpdate::Flag::ClientSideMessages); diff --git a/Telegram/SourceFiles/history/history_item.h b/Telegram/SourceFiles/history/history_item.h index 2920d28bd..0172e093d 100644 --- a/Telegram/SourceFiles/history/history_item.h +++ b/Telegram/SourceFiles/history/history_item.h @@ -352,7 +352,8 @@ public: return TextForMimeData(); } - virtual void setViewsCount(int count) { + virtual bool changeViewsCount(int count) { + return false; } virtual void setForwardsCount(int count) { } diff --git a/Telegram/SourceFiles/history/history_item_components.cpp b/Telegram/SourceFiles/history/history_item_components.cpp index 62bf2c695..7aebfa46e 100644 --- a/Telegram/SourceFiles/history/history_item_components.cpp +++ b/Telegram/SourceFiles/history/history_item_components.cpp @@ -84,38 +84,6 @@ void HistoryMessageVia::resize(int32 availw) const { } } -void HistoryMessageSigned::refresh(const QString &date) { - Expects(!isAnonymousRank); - - auto name = author; - const auto time = qsl(", ") + date; - const auto timew = st::msgDateFont->width(time); - const auto namew = st::msgDateFont->width(name); - isElided = (timew + namew > st::maxSignatureSize); - if (isElided) { - name = st::msgDateFont->elided(author, st::maxSignatureSize - timew); - } - signature.setText( - st::msgDateTextStyle, - name + time, - Ui::NameTextOptions()); -} - -int HistoryMessageSigned::maxWidth() const { - return signature.maxWidth(); -} - -void HistoryMessageEdited::refresh(const QString &date, bool displayed) { - const auto prefix = displayed - ? (tr::lng_edited(tr::now) + ' ') - : QString(); - text.setText(st::msgDateTextStyle, prefix + date, Ui::NameTextOptions()); -} - -int HistoryMessageEdited::maxWidth() const { - return text.maxWidth(); -} - HistoryMessageSponsored::HistoryMessageSponsored() { text.setText( st::msgDateTextStyle, diff --git a/Telegram/SourceFiles/history/history_item_components.h b/Telegram/SourceFiles/history/history_item_components.h index 880b10639..776134533 100644 --- a/Telegram/SourceFiles/history/history_item_components.h +++ b/Telegram/SourceFiles/history/history_item_components.h @@ -60,21 +60,12 @@ struct HistoryMessageViews : public RuntimeComponent { - void refresh(const QString &date); - int maxWidth() const; - QString author; - Ui::Text::String signature; - bool isElided = false; bool isAnonymousRank = false; }; struct HistoryMessageEdited : public RuntimeComponent { - void refresh(const QString &date, bool displayed); - int maxWidth() const; - TimeId date = 0; - Ui::Text::String text; }; struct HistoryMessageSponsored : public RuntimeComponent< diff --git a/Telegram/SourceFiles/history/history_message.cpp b/Telegram/SourceFiles/history/history_message.cpp index 19ccda5af..39c7774d9 100644 --- a/Telegram/SourceFiles/history/history_message.cpp +++ b/Telegram/SourceFiles/history/history_message.cpp @@ -1124,7 +1124,7 @@ void HistoryMessage::createComponents(CreateConfig &&config) { via->create(&history()->owner(), config.viaBotId); } if (const auto views = Get()) { - setViewsCount(config.viewsCount); + changeViewsCount(config.viewsCount); if (config.replies.isNull && isSending() && config.markup.isNull()) { @@ -1423,7 +1423,7 @@ void HistoryMessage::applyEdition(HistoryMessageEdition &&edition) { if (!isLocalUpdateMedia()) { refreshMedia(edition.mtpMedia); } - setViewsCount(edition.views); + changeViewsCount(edition.views); setForwardsCount(edition.forwards); setText(_media ? edition.textWithEntities @@ -1449,7 +1449,7 @@ void HistoryMessage::applyEdition(const MTPDmessageService &message) { setReplyMarkup({}); refreshMedia(nullptr); setEmptyText(); - setViewsCount(-1); + changeViewsCount(-1); setForwardsCount(-1); if (wasGrouped) { history()->owner().groups().unregisterMessage(this); @@ -1744,27 +1744,16 @@ bool HistoryMessage::textHasLinks() const { return emptyText() ? false : _text.hasLinks(); } -void HistoryMessage::setViewsCount(int count) { +bool HistoryMessage::changeViewsCount(int count) { const auto views = Get(); if (!views || views->views.count == count || (count >= 0 && views->views.count > count)) { - return; + return false; } views->views.count = count; - views->views.text = Lang::FormatCountToShort( - std::max(views->views.count, 1) - ).string; - const auto was = views->views.textWidth; - views->views.textWidth = views->views.text.isEmpty() - ? 0 - : st::msgDateFont->width(views->views.text); - if (was == views->views.textWidth) { - history()->owner().requestItemRepaint(this); - } else { - history()->owner().requestItemResize(this); - } + return true; } void HistoryMessage::setForwardsCount(int count) { @@ -1852,7 +1841,6 @@ void HistoryMessage::clearReplies() { void HistoryMessage::refreshRepliesText( not_null views, bool forceResize) { - const auto was = views->replies.textWidth; if (views->commentsMegagroupId) { views->replies.text = (views->replies.count > 0) ? tr::lng_comments_open_count( @@ -1867,15 +1855,8 @@ void HistoryMessage::refreshRepliesText( : QString(); views->repliesSmall.textWidth = st::semiboldFont->width( views->repliesSmall.text); - } else { - views->replies.text = (views->replies.count > 0) - ? Lang::FormatCountToShort(views->replies.count).string - : QString(); - views->replies.textWidth = views->replies.text.isEmpty() - ? 0 - : st::msgDateFont->width(views->replies.text); } - if (forceResize || views->replies.textWidth != was) { + if (forceResize) { history()->owner().requestItemResize(this); } else { history()->owner().requestItemRepaint(this); diff --git a/Telegram/SourceFiles/history/history_message.h b/Telegram/SourceFiles/history/history_message.h index 7611933e5..3f91da06d 100644 --- a/Telegram/SourceFiles/history/history_message.h +++ b/Telegram/SourceFiles/history/history_message.h @@ -129,7 +129,7 @@ public: [[nodiscard]] bool allowsSendNow() const override; [[nodiscard]] bool allowsEdit(TimeId now) const override; - void setViewsCount(int count) override; + bool changeViewsCount(int count) override; void setForwardsCount(int count) override; void setReplies(HistoryMessageRepliesData &&data) override; void clearReplies() override; @@ -263,10 +263,7 @@ private: [[nodiscard]] bool checkRepliesPts( const HistoryMessageRepliesData &data) const; - QString _timeText; - int _timeWidth = 0; - - mutable int32 _fromNameVersion = 0; + mutable int _fromNameVersion = 0; friend class HistoryView::Element; friend class HistoryView::Message; diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 3e5a66f13..71819e4ad 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -507,6 +507,13 @@ HistoryWidget::HistoryWidget( } }, lifetime()); + session().data().itemDataChanges( + ) | rpl::filter([=](not_null item) { + return !_list && (item->mainView() != nullptr); + }) | rpl::start_with_next([=](not_null item) { + item->mainView()->itemDataChanged(); + }, lifetime()); + Core::App().settings().largeEmojiChanges( ) | rpl::start_with_next([=] { crl::on_main(this, [=] { diff --git a/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp b/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp new file mode 100644 index 000000000..e94524ad1 --- /dev/null +++ b/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp @@ -0,0 +1,303 @@ +/* +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 "history/view/history_view_bottom_info.h" + +#include "ui/chat/message_bubble.h" +#include "ui/chat/chat_style.h" +#include "ui/text/text_options.h" +#include "lang/lang_keys.h" +#include "history/history_item_components.h" +#include "history/history_message.h" +#include "history/view/history_view_message.h" +#include "styles/style_chat.h" +#include "styles/style_dialogs.h" + +namespace HistoryView { + +BottomInfo::BottomInfo(Data &&data) : _data(std::move(data)) { + layout(); +} + +void BottomInfo::update(Data &&data) { + _data = std::move(data); + layout(); + if (!_size.isEmpty()) { + resizeToWidth(_size.width()); + } +} + +QSize BottomInfo::optimalSize() const { + return _optimalSize; +} + +QSize BottomInfo::size() const { + return _size; +} + +bool BottomInfo::pointInTime(QPoint position) const { + return QRect( + _size.width() - _dateWidth, + 0, + _dateWidth, + st::msgDateFont->height + ).contains(position); +} + +bool BottomInfo::isSignedAuthorElided() const { + return _authorElided; +} + +void BottomInfo::paint( + Painter &p, + QPoint position, + int outerWidth, + bool unread, + bool inverted, + const PaintContext &context) const { + const auto st = context.st; + const auto sti = context.imageStyle(); + const auto stm = context.messageStyle(); + + auto right = position.x() + _size.width(); + const auto firstLineBottom = position.y() + st::msgDateFont->height; + if (_data.flags & Data::Flag::OutLayout) { + const auto &icon = (_data.flags & Data::Flag::Sending) + ? (inverted + ? st->historySendingInvertedIcon() + : st->historySendingIcon()) + : unread + ? (inverted + ? st->historySentInvertedIcon() + : stm->historySentIcon) + : (inverted + ? st->historyReceivedInvertedIcon() + : stm->historyReceivedIcon); + icon.paint( + p, + QPoint(right, firstLineBottom) + st::historySendStatePosition, + outerWidth); + right -= st::historySendStateSpace; + } + + const auto authorEditedWidth = _authorEditedDate.maxWidth(); + right -= authorEditedWidth; + _authorEditedDate.drawLeft( + p, + right, + position.y(), + authorEditedWidth, + outerWidth); + + if (!_views.isEmpty()) { + const auto viewsWidth = _views.maxWidth(); + right -= st::historyViewsSpace + viewsWidth; + _views.drawLeft(p, right, position.y(), viewsWidth, outerWidth); + + const auto &icon = inverted + ? st->historyViewsInvertedIcon() + : stm->historyViewsIcon; + icon.paint( + p, + right - st::historyViewsWidth, + firstLineBottom + st::historyViewsTop, + outerWidth); + } + if (!_replies.isEmpty()) { + const auto repliesWidth = _replies.maxWidth(); + right -= st::historyViewsSpace + repliesWidth; + _replies.drawLeft(p, right, position.y(), repliesWidth, outerWidth); + + const auto &icon = inverted + ? st->historyRepliesInvertedIcon() + : stm->historyRepliesIcon; + icon.paint( + p, + right - st::historyViewsWidth, + firstLineBottom + st::historyViewsTop, + outerWidth); + } + if ((_data.flags & Data::Flag::Sending) + && !(_data.flags & Data::Flag::OutLayout)) { + right -= st::historySendStateSpace; + const auto &icon = inverted + ? st->historyViewsSendingInvertedIcon() + : st->historyViewsSendingIcon(); + icon.paint( + p, + right, + firstLineBottom + st::historyViewsTop, + outerWidth); + } + if (!_reactions.isEmpty()) { + if (_size.height() == _optimalSize.height()) { + _reactions.drawLeft( + p, + position.x(), + position.y(), + _reactions.maxWidth(), + outerWidth); + } else { + const auto available = _size.width(); + const auto use = std::min(available, _reactions.maxWidth()); + _reactions.drawLeftElided( + p, + position.x() + _size.width() - use, + position.y() + st::msgDateFont->height, + use, + outerWidth); + } + } +} + +int BottomInfo::resizeToWidth(int newWidth) { + if (newWidth >= _optimalSize.width()) { + _size = _optimalSize; + return _size.height(); + } + return 2 * st::msgDateFont->height; +} + +void BottomInfo::layout() { + layoutDateText(); + layoutViewsText(); + layoutReactionsText(); + countOptimalSize(); +} + +void BottomInfo::layoutDateText() { + const auto edited = (_data.flags & Data::Flag::Edited) + ? (tr::lng_edited(tr::now) + ' ') + : QString(); + const auto author = _data.author; + const auto prefix = author.isEmpty() ? qsl(", ") : QString(); + const auto date = _data.date.toString(cTimeFormat()); + _dateWidth = st::msgDateFont->width(date); + const auto afterAuthor = prefix + edited + date; + const auto afterAuthorWidth = st::msgDateFont->width(afterAuthor); + const auto authorWidth = st::msgDateFont->width(author); + const auto maxWidth = st::maxSignatureSize; + _authorElided = !author.isEmpty() + && (authorWidth + afterAuthorWidth > maxWidth); + const auto name = _authorElided + ? st::msgDateFont->elided(author, maxWidth - afterAuthorWidth) + : author; + const auto full = name + date; + _authorEditedDate.setText( + st::msgDateTextStyle, + full, + Ui::NameTextOptions()); +} + +void BottomInfo::layoutViewsText() { + if (!_data.views || (_data.flags & Data::Flag::Sending)) { + _views.clear(); + return; + } + _views.setText( + st::msgDateTextStyle, + Lang::FormatCountToShort(std::max(*_data.views, 1)).string, + Ui::NameTextOptions()); +} + +void BottomInfo::layoutRepliesText() { + if (!_data.replies + || !*_data.replies + || (_data.flags & Data::Flag::RepliesContext) + || (_data.flags & Data::Flag::Sending)) { + _replies.clear(); + return; + } + _replies.setText( + st::msgDateTextStyle, + Lang::FormatCountToShort(*_data.replies).string, + Ui::NameTextOptions()); +} + +void BottomInfo::layoutReactionsText() { + if (_data.reactions.empty()) { + _reactions.clear(); + return; + } + auto sorted = ranges::view::all( + _data.reactions + ) | ranges::view::transform([](const auto &pair) { + return std::make_pair(pair.first, pair.second); + }) | ranges::to_vector; + ranges::sort(sorted, std::greater<>(), &std::pair::second); + + auto fullCount = 0; + auto text = QString(); + for (const auto &[string, count] : sorted) { + text.append(string); + fullCount += count; + } + text += QString::number(fullCount); + + _reactions.setText(st::msgDateTextStyle, text, Ui::NameTextOptions()); +} + +void BottomInfo::countOptimalSize() { + auto width = 0; + if (_data.flags & (Data::Flag::OutLayout | Data::Flag::Sending)) { + width += st::historySendStateSpace; + } + width += _authorEditedDate.maxWidth(); + if (!_views.isEmpty()) { + width += st::historyViewsSpace + + _views.maxWidth() + + st::historyViewsWidth; + } + if (!_reactions.isEmpty()) { + width += st::historyReactionsSkip + _reactions.maxWidth(); + } + _optimalSize = QSize(width, st::msgDateFont->height); +} + +BottomInfo::Data BottomInfoDataFromMessage(not_null message) { + using Flag = BottomInfo::Data::Flag; + + auto result = BottomInfo::Data(); + + const auto item = message->message(); + result.date = message->dateTime(); + result.reactions = item->reactions(); + if (message->hasOutLayout()) { + result.flags |= Flag::OutLayout; + } + if (message->context() == Context::Replies) { + result.flags |= Flag::RepliesContext; + } + if (const auto msgsigned = item->Get()) { + if (!msgsigned->isAnonymousRank) { + result.author = msgsigned->author; + } + } + if (!item->hideEditedBadge()) { + if (const auto edited = message->displayedEditBadge()) { + result.flags |= Flag::Edited; + } + } + if (const auto views = item->Get()) { + if (views->views.count >= 0) { + result.views = views->views.count; + } + if (views->replies.count >= 0 && !views->commentsMegagroupId) { + result.replies = views->replies.count; + } + } + if (item->isSending() || item->hasFailed()) { + result.flags |= Flag::Sending; + } + // We don't want to pass and update it in Date for now. + //if (item->unread()) { + // result.flags |= Flag::Unread; + //} + return result; +} + +} // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/history_view_bottom_info.h b/Telegram/SourceFiles/history/view/history_view_bottom_info.h new file mode 100644 index 000000000..e7ffd27f0 --- /dev/null +++ b/Telegram/SourceFiles/history/view/history_view_bottom_info.h @@ -0,0 +1,85 @@ +/* +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 "ui/text/text.h" +#include "base/flags.h" + +namespace Ui { +struct ChatPaintContext; +} // namespace Ui + +namespace HistoryView { + +using PaintContext = Ui::ChatPaintContext; + +class Message; + +class BottomInfo { +public: + struct Data { + enum class Flag { + Edited = 0x01, + OutLayout = 0x02, + Sending = 0x04, + RepliesContext = 0x08, + //Unread, // We don't want to pass and update it in Date for now. + }; + friend inline constexpr bool is_flag_type(Flag) { return true; }; + using Flags = base::flags; + + QDateTime date; + QString author; + base::flat_map reactions; + std::optional views; + std::optional replies; + Flags flags; + }; + explicit BottomInfo(Data &&data); + + void update(Data &&data); + + [[nodiscard]] QSize optimalSize() const; + [[nodiscard]] QSize size() const; + [[nodiscard]] bool pointInTime(QPoint position) const; + [[nodiscard]] bool isSignedAuthorElided() const; + + void paint( + Painter &p, + QPoint position, + int outerWidth, + bool unread, + bool inverted, + const PaintContext &context) const; + + int resizeToWidth(int newWidth); + +private: + void layout(); + void layoutDateText(); + void layoutViewsText(); + void layoutRepliesText(); + void layoutReactionsText(); + void countOptimalSize(); + + Data _data; + QSize _optimalSize; + QSize _size; + Ui::Text::String _authorEditedDate; + Ui::Text::String _views; + Ui::Text::String _replies; + Ui::Text::String _reactions; + int _dateWidth = 0; + bool _authorElided = false; + +}; + +[[nodiscard]] BottomInfo::Data BottomInfoDataFromMessage( + not_null message); + +} // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/history_view_element.cpp b/Telegram/SourceFiles/history/view/history_view_element.cpp index 3fe06f426..5d0ff8f85 100644 --- a/Telegram/SourceFiles/history/view/history_view_element.cpp +++ b/Telegram/SourceFiles/history/view/history_view_element.cpp @@ -231,8 +231,8 @@ QString DateTooltipText(not_null view) { + "\n\n" + dateText; } } - if (const auto msgsigned = view->data()->Get()) { - if (msgsigned->isElided && !msgsigned->isAnonymousRank) { + if (view->isSignedAuthorElided()) { + if (const auto msgsigned = view->data()->Get()) { dateText += '\n' + tr::lng_signed_author(tr::now, lt_user, msgsigned->author); } @@ -841,6 +841,13 @@ void Element::checkHeavyPart() { } } +bool Element::isSignedAuthorElided() const { + return false; +} + +void Element::itemDataChanged() { +} + void Element::unloadHeavyPart() { history()->owner().unregisterHeavyViewPart(this); if (_media) { diff --git a/Telegram/SourceFiles/history/view/history_view_element.h b/Telegram/SourceFiles/history/view/history_view_element.h index 1522ac402..5f5d2312d 100644 --- a/Telegram/SourceFiles/history/view/history_view_element.h +++ b/Telegram/SourceFiles/history/view/history_view_element.h @@ -318,31 +318,31 @@ public: // hasFromPhoto() returns true even if we don't display the photo // but we need to skip a place at the left side for this photo - virtual bool hasFromPhoto() const; - virtual bool displayFromPhoto() const; - virtual bool hasFromName() const; - virtual bool displayFromName() const; - virtual bool displayForwardedFrom() const; - virtual bool hasOutLayout() const; - virtual bool drawBubble() const; - virtual bool hasBubble() const; - virtual int minWidthForMedia() const { + [[nodiscard]] virtual bool hasFromPhoto() const; + [[nodiscard]] virtual bool displayFromPhoto() const; + [[nodiscard]] virtual bool hasFromName() const; + [[nodiscard]] virtual bool displayFromName() const; + [[nodiscard]] virtual bool displayForwardedFrom() const; + [[nodiscard]] virtual bool hasOutLayout() const; + [[nodiscard]] virtual bool drawBubble() const; + [[nodiscard]] virtual bool hasBubble() const; + [[nodiscard]] virtual int minWidthForMedia() const { return 0; } - virtual bool hasFastReply() const; - virtual bool displayFastReply() const; - virtual std::optional rightActionSize() const; + [[nodiscard]] virtual bool hasFastReply() const; + [[nodiscard]] virtual bool displayFastReply() const; + [[nodiscard]] virtual std::optional rightActionSize() const; virtual void drawRightAction( Painter &p, const PaintContext &context, int left, int top, int outerWidth) const; - virtual ClickHandlerPtr rightActionLink() const; - virtual bool displayEditedBadge() const; - virtual TimeId displayedEditDate() const; - virtual bool hasVisibleText() const; - virtual HistoryMessageReply *displayedReply() const; + [[nodiscard]] virtual ClickHandlerPtr rightActionLink() const; + [[nodiscard]] virtual bool displayEditedBadge() const; + [[nodiscard]] virtual TimeId displayedEditDate() const; + [[nodiscard]] virtual bool hasVisibleText() const; + [[nodiscard]] virtual HistoryMessageReply *displayedReply() const; virtual void applyGroupAdminChanges( const base::flat_set &changes) { } @@ -355,6 +355,10 @@ public: }; [[nodiscard]] virtual VerticalRepaintRange verticalRepaintRange() const; + [[nodiscard]] virtual bool isSignedAuthorElided() const; + + virtual void itemDataChanged(); + virtual bool hasHeavyPart() const; virtual void unloadHeavyPart(); void checkHeavyPart(); diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp index 78ee5c917..8a969639a 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp @@ -294,6 +294,12 @@ ListWidget::ListWidget( } } }, lifetime()); + session().data().itemDataChanges( + ) | rpl::start_with_next([=](not_null item) { + if (const auto view = viewForItem(item)) { + view->itemDataChanged(); + } + }, lifetime()); session().data().animationPlayInlineRequest( ) | rpl::start_with_next([this](auto item) { if (const auto view = viewForItem(item)) { diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index 288e777d5..d947dfae8 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -237,30 +237,12 @@ LogEntryOriginal &LogEntryOriginal::operator=(LogEntryOriginal &&other) { LogEntryOriginal::~LogEntryOriginal() = default; -void Reactions::update(const base::flat_map &list) { - auto sorted = ranges::view::all( - list - ) | ranges::view::transform([](const auto &pair) { - return std::make_pair(pair.first, pair.second); - }) | ranges::to_vector; - ranges::sort(sorted, std::greater<>(), &std::pair::second); - - auto fullCount = 0; - auto composed = QString(); - for (const auto &[string, count] : sorted) { - composed.append(string); - fullCount += count; - } - composed += QString::number(fullCount); - - text.setText(st::msgDateTextStyle, composed, Ui::NameTextOptions()); -} - Message::Message( not_null delegate, not_null data, Element *replacing) -: Element(delegate, data, replacing) { +: Element(delegate, data, replacing) +, _bottomInfo(BottomInfoDataFromMessage(this)) { initLogEntryOriginal(); initPsa(); } @@ -334,16 +316,8 @@ QSize Message::performCountOptimalSize() { updateViewButtonExistence(); updateMediaInBubbleState(); - refreshEditedBadge(); refreshRightBadge(); - - if (const auto list = item->reactions(); !list.empty()) { - AddComponents(Reactions::Bit()); - const auto reactions = Get(); - reactions->update(list); - } else { - RemoveComponents(Reactions::Bit()); - } + initTime(); if (drawBubble()) { const auto forwarded = item->Get(); @@ -1776,111 +1750,25 @@ void Message::drawInfo( break; } - const auto item = message(); - auto infoW = infoWidth(); - if (rtl()) infoRight = width - infoRight + infoW; - - auto dateX = infoRight - infoW; - auto dateY = infoBottom - st::msgDateFont->height; + const auto size = _bottomInfo.size(); + const auto dateX = infoRight - size.width(); + const auto dateY = infoBottom - size.height(); if (type == InfoDisplayType::Image) { - auto dateW = infoW + 2 * st::msgDateImgPadding.x(), dateH = st::msgDateFont->height + 2 * st::msgDateImgPadding.y(); + const auto dateW = size.width() + 2 * st::msgDateImgPadding.x(); + const auto dateH = size.height() + 2 * st::msgDateImgPadding.y(); Ui::FillRoundRect(p, dateX - st::msgDateImgPadding.x(), dateY - st::msgDateImgPadding.y(), dateW, dateH, sti->msgDateImgBg, sti->msgDateImgBgCorners); } else if (type == InfoDisplayType::Background) { - auto dateW = infoW + 2 * st::msgDateImgPadding.x(), dateH = st::msgDateFont->height + 2 * st::msgDateImgPadding.y(); + const auto dateW = size.width() + 2 * st::msgDateImgPadding.x(); + const auto dateH = size.height() + 2 * st::msgDateImgPadding.y(); Ui::FillRoundRect(p, dateX - st::msgDateImgPadding.x(), dateY - st::msgDateImgPadding.y(), dateW, dateH, sti->msgServiceBg, sti->msgServiceBgCorners); } - dateX += timeLeft(); - - if (const auto msgsigned = item->Get() - ; msgsigned && !msgsigned->isAnonymousRank) { - msgsigned->signature.drawElided(p, dateX, dateY, item->_timeWidth); - } else if (const auto sponsored = displayedSponsorBadge()) { - const auto skipY = viewButtonHeight(); - sponsored->text.drawElided(p, dateX, dateY - skipY, item->_timeWidth); - } else if (const auto edited = displayedEditBadge()) { - edited->text.drawElided(p, dateX, dateY, item->_timeWidth); - } else { - p.drawText(dateX, dateY + st::msgDateFont->ascent, item->_timeText); - } - - const auto viewIconTop = infoBottom + st::historyViewsTop; - const auto pinIconTop = infoBottom + st::historyPinTop; - auto left = infoRight - infoW; - if (const auto reactions = Get()) { - reactions->text.draw(p, left, dateY, reactions->text.maxWidth()); - left += reactions->text.maxWidth() + st::historyReactionsSkip; - } - if (const auto views = item->Get()) { - const auto textTop = infoBottom - st::msgDateFont->descent; - if (views->replies.count > 0 - && !views->commentsMegagroupId - && this->context() != Context::Replies) { - const auto &icon = (!item->isSending() && !item->hasFailed()) - ? (invertedsprites - ? st->historyRepliesInvertedIcon() - : stm->historyRepliesIcon) - : (invertedsprites - ? st->historyViewsSendingInvertedIcon() - : st->historyViewsSendingIcon()); - if (!item->isSending() && !item->hasFailed()) { - icon.paint(p, left, viewIconTop, width); - p.drawText(left + st::historyViewsWidth, textTop, views->replies.text); - } else if (!context.outbg && views->views.count < 0) { // sending outbg icon will be painted below - auto iconSkip = st::historyViewsSpace + views->replies.textWidth; - icon.paint(p, left + iconSkip, viewIconTop, width); - } - left += st::historyViewsSpace - + views->replies.textWidth - + st::historyViewsWidth; - } - if (views->views.count >= 0) { - const auto &icon = (!item->isSending() && !item->hasFailed()) - ? (invertedsprites - ? st->historyViewsInvertedIcon() - : stm->historyViewsIcon) - : (invertedsprites - ? st->historyViewsSendingInvertedIcon() - : st->historyViewsSendingIcon()); - if (!item->isSending() && !item->hasFailed()) { - icon.paint(p, left, viewIconTop, width); - p.drawText(left + st::historyViewsWidth, textTop, views->views.text); - } else if (!context.outbg) { // sending outbg icon will be painted below - auto iconSkip = st::historyViewsSpace + views->views.textWidth; - icon.paint(p, left + iconSkip, viewIconTop, width); - } - left += st::historyViewsSpace - + views->views.textWidth - + st::historyViewsWidth; - } - } else if ((item->isSending() || item->hasFailed()) - && item->history()->peer->isSelf() - && !context.outbg) { - const auto &icon = invertedsprites - ? st->historyViewsSendingInvertedIcon() - : st->historyViewsSendingIcon(); - icon.paint(p, left, viewIconTop, width); - } - if (displayPinIcon()) { - const auto &icon = invertedsprites - ? st->historyPinInvertedIcon() - : stm->historyPinIcon; - icon.paint(p, left, pinIconTop, width); - left += st::historyPinWidth; - } - if (context.outbg) { - const auto &icon = (item->isSending() || item->hasFailed()) - ? (invertedsprites - ? st->historySendingInvertedIcon() - : st->historySendingIcon()) - : delegate()->elementShownUnread(this) - ? (invertedsprites - ? st->historySentInvertedIcon() - : stm->historySentIcon) - : (invertedsprites - ? st->historyReceivedInvertedIcon() - : stm->historyReceivedIcon); - icon.paint(p, QPoint(infoRight, infoBottom) + st::historySendStatePosition, width); - } + _bottomInfo.paint( + p, + { dateX, dateY }, + width, + delegate()->elementShownUnread(this), + invertedsprites, + context); } bool Message::pointInTime( @@ -1904,53 +1792,28 @@ bool Message::pointInTime( infoBottom -= st::msgDateImgPadding.y(); break; } - const auto item = message(); - auto dateX = infoRight - infoWidth() + timeLeft(); - auto dateY = infoBottom - st::msgDateFont->height; - return QRect( - dateX, - dateY, - item->_timeWidth, - st::msgDateFont->height).contains(point); + const auto size = _bottomInfo.size(); + const auto infoLeft = infoRight - size.width(); + const auto infoTop = infoBottom - size.height(); + return _bottomInfo.pointInTime({ infoLeft, infoTop }); } int Message::infoWidth() const { - const auto item = message(); - auto result = item->_timeWidth; - if (const auto views = item->Get()) { - if (views->views.count >= 0) { - result += st::historyViewsSpace - + views->views.textWidth - + st::historyViewsWidth; - } - if (views->replies.count > 0 - && !views->commentsMegagroupId - && context() != Context::Replies) { - result += st::historyViewsSpace - + views->replies.textWidth - + st::historyViewsWidth; - } - } else if ((item->isSending() || item->hasFailed()) - && item->history()->peer->isSelf()) { - if (!hasOutLayout()) { - result += st::historySendStateSpace; - } - } - if (displayPinIcon()) { - result += st::historyPinWidth; - } + return _bottomInfo.optimalSize().width(); +} - // When message is scheduled until online, time is not displayed, - // so message should have less space. - if (!item->_timeWidth) { - result += st::historyScheduledUntilOnlineStateSpace; - } else if (hasOutLayout()) { - result += st::historySendStateSpace; +bool Message::isSignedAuthorElided() const { + return _bottomInfo.isSignedAuthorElided(); +} + +void Message::itemDataChanged() { + const auto was = _bottomInfo.size(); + _bottomInfo.update(BottomInfoDataFromMessage(this)); + if (was != _bottomInfo.size()) { + history()->owner().requestViewResize(this); + } else { + history()->owner().requestViewRepaint(this); } - if (const auto reactions = Get()) { - result += st::historyReactionsSkip + reactions->text.maxWidth(); - } - return result; } auto Message::verticalRepaintRange() const -> VerticalRepaintRange { @@ -1974,34 +1837,6 @@ void Message::refreshDataIdHook() { } } -int Message::timeLeft() const { - const auto item = message(); - auto result = 0; - if (auto views = item->Get()) { - if (views->views.count >= 0) { - result += st::historyViewsSpace + views->views.textWidth + st::historyViewsWidth; - } - if (views->replies.count > 0 - && !views->commentsMegagroupId - && context() != Context::Replies) { - result += st::historyViewsSpace + views->replies.textWidth + st::historyViewsWidth; - } - } else if ((item->isSending() || item->hasFailed()) - && item->history()->peer->isSelf()) { - if (!hasOutLayout()) { - result += st::historySendStateSpace; - } - } - if (displayPinIcon()) { - result += st::historyPinWidth; - } - - if (const auto reactions = Get()) { - result += st::historyReactionsSkip + reactions->text.maxWidth(); - } - return result; -} - int Message::plainMaxWidth() const { return st::msgPadding.left() + (hasVisibleText() ? message()->_text.maxWidth() : 0) @@ -2629,6 +2464,8 @@ int Message::resizeContentGetHeight(int newWidth) { } } } + _bottomInfo.resizeToWidth( + std::min(_bottomInfo.optimalSize().width(), contentWidth)); if (bubble) { auto reply = displayedReply(); @@ -2733,46 +2570,8 @@ QSize Message::performCountCurrentSize(int newWidth) { return { newWidth, newHeight }; } -void Message::refreshEditedBadge() { - const auto item = message(); - const auto edited = displayedEditBadge(); - const auto editDate = displayedEditDate(); - const auto dateText = dateTime().toString(cTimeFormat()); - if (edited) { - edited->refresh(dateText, editDate != 0); - } - if (const auto msgsigned = item->Get()) { - if (!msgsigned->isAnonymousRank) { - const auto text = (!edited || !editDate) - ? dateText - : edited->text.toString(); - msgsigned->refresh(text); - } - } - initTime(); -} - void Message::initTime() const { const auto item = message(); - if (const auto msgsigned = item->Get() - ; msgsigned && !msgsigned->isAnonymousRank) { - item->_timeWidth = msgsigned->maxWidth(); - } else if (const auto sponsored = displayedSponsorBadge()) { - item->_timeWidth = sponsored->maxWidth(); - } else if (const auto edited = displayedEditBadge()) { - item->_timeWidth = edited->maxWidth(); - } else { - const auto forwarded = item->Get(); - if (forwarded && forwarded->imported) { - const auto date = base::unixtime::parse(forwarded->originalDate); - item->_timeText = date.toString( - cDateFormat() + u", "_q + cTimeFormat() + ' ' - ) + tr::lng_imported(tr::now); - } else { - item->_timeText = dateTime().toString(cTimeFormat()); - } - item->_timeWidth = st::msgDateFont->width(item->_timeText); - } if (item->_text.hasSkipBlock()) { if (item->_text.updateSkipBlock(skipBlockWidth(), skipBlockHeight())) { item->_textWidth = -1; diff --git a/Telegram/SourceFiles/history/view/history_view_message.h b/Telegram/SourceFiles/history/view/history_view_message.h index fa3beaf94..8e649ede3 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.h +++ b/Telegram/SourceFiles/history/view/history_view_message.h @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #pragma once #include "history/view/history_view_element.h" +#include "history/view/history_view_bottom_info.h" #include "ui/effects/animations.h" #include "base/weak_ptr.h" @@ -39,12 +40,6 @@ struct PsaTooltipState : public RuntimeComponent { mutable bool buttonVisible = true; }; -struct Reactions : public RuntimeComponent { - void update(const base::flat_map &list); - - Ui::Text::String text; -}; - class Message : public Element, public base::has_weak_ptr { public: Message( @@ -57,6 +52,11 @@ public: const ClickHandlerPtr &handler, bool pressed) override; + not_null message() const; + + const HistoryMessageEdited *displayedEditBadge() const; + HistoryMessageEdited *displayedEditBadge(); + int marginTop() const override; int marginBottom() const override; void draw(Painter &p, const PaintContext &context) const override; @@ -113,6 +113,9 @@ public: bool toggleSelectionByHandlerClick( const ClickHandlerPtr &handler) const override; int infoWidth() const override; + bool isSignedAuthorElided() const override; + + void itemDataChanged() override; VerticalRepaintRange verticalRepaintRange() const override; @@ -125,11 +128,8 @@ protected: private: struct CommentsButton; - not_null message() const; - void initLogEntryOriginal(); void initPsa(); - void refreshEditedBadge(); void fromNameUpdated(int width) const; [[nodiscard]] bool showForwardsFromSender( @@ -208,14 +208,11 @@ private: [[nodiscard]] bool displayFastShare() const; [[nodiscard]] bool displayGoToOriginal() const; [[nodiscard]] ClickHandlerPtr fastReplyLink() const; - [[nodiscard]] const HistoryMessageEdited *displayedEditBadge() const; - [[nodiscard]] HistoryMessageEdited *displayedEditBadge(); [[nodiscard]] auto displayedSponsorBadge() const -> const HistoryMessageSponsored*; [[nodiscard]] bool displayPinIcon() const; void initTime() const; - [[nodiscard]] int timeLeft() const; [[nodiscard]] int plainMaxWidth() const; [[nodiscard]] int monospaceMaxWidth() const; @@ -238,6 +235,8 @@ private: Ui::Text::String _rightBadge; int _bubbleWidthLimit = 0; + BottomInfo _bottomInfo; + }; } // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/media/history_view_gif.cpp b/Telegram/SourceFiles/history/view/media/history_view_gif.cpp index 530427fa4..9482f452f 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_gif.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_gif.cpp @@ -154,7 +154,10 @@ QSize Gif::countOptimalSize() { } _thumbw = tw; _thumbh = th; - auto maxWidth = qMax(tw, st::minPhotoSize); + auto maxWidth = std::clamp( + std::max(tw, _parent->infoWidth() + 2 * (st::msgDateImgDelta + st::msgDateImgPadding.x())), + st::minPhotoSize, + maxSize); auto minHeight = qMax(th, st::minPhotoSize); if (!activeCurrentStreamed()) { accumulate_max(maxWidth, gifMaxStatusWidth(_data) + 2 * (st::msgDateImgDelta + st::msgDateImgPadding.x())); @@ -211,7 +214,10 @@ QSize Gif::countCurrentSize(int newWidth) { _thumbw = tw; _thumbh = th; - newWidth = qMax(tw, st::minPhotoSize); + newWidth = std::clamp( + std::max(tw, _parent->infoWidth() + 2 * (st::msgDateImgDelta + st::msgDateImgPadding.x())), + st::minPhotoSize, + maxSize); auto newHeight = qMax(th, st::minPhotoSize); if (!activeCurrentStreamed()) { accumulate_max(newWidth, gifMaxStatusWidth(_data) + 2 * (st::msgDateImgDelta + st::msgDateImgPadding.x())); diff --git a/Telegram/SourceFiles/history/view/media/history_view_location.cpp b/Telegram/SourceFiles/history/view/media/history_view_location.cpp index b78703af8..affed2807 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_location.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_location.cpp @@ -82,7 +82,10 @@ QSize Location::countOptimalSize() { th = (st::maxMediaSize * th) / tw; tw = st::maxMediaSize; } - auto minWidth = qMax(st::minPhotoSize, _parent->minWidthForMedia()); + auto minWidth = std::clamp( + _parent->minWidthForMedia(), + st::minPhotoSize, + st::maxMediaSize); auto maxWidth = qMax(tw, minWidth); auto minHeight = qMax(th, st::minPhotoSize); @@ -118,7 +121,10 @@ QSize Location::countCurrentSize(int newWidth) { } else { newWidth = tw; } - auto minWidth = qMax(st::minPhotoSize, _parent->minWidthForMedia()); + auto minWidth = std::clamp( + _parent->minWidthForMedia(), + st::minPhotoSize, + st::maxMediaSize); accumulate_max(newWidth, minWidth); accumulate_max(newHeight, st::minPhotoSize); if (_parent->hasBubble()) { diff --git a/Telegram/SourceFiles/history/view/media/history_view_media_unwrapped.cpp b/Telegram/SourceFiles/history/view/media/history_view_media_unwrapped.cpp index 1ec17cbaa..7d36d2a25 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_media_unwrapped.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_media_unwrapped.cpp @@ -408,19 +408,19 @@ int UnwrappedMedia::calculateFullRight(const QRect &inner) const { + st::msgDateImgPadding.x() * 2 + st::msgReplyPadding.left(); const auto rightActionSize = _parent->rightActionSize(); + const auto rightSkip = st::msgPadding.left() + + (_parent->hasFromPhoto() + ? st::msgMargin.right() + : st::msgPadding.right()); const auto rightActionWidth = rightActionSize ? (st::historyFastShareLeft * 2 - + rightActionSize->width() - + st::msgPadding.left() - + (_parent->hasFromPhoto() - ? st::msgMargin.right() - : st::msgPadding.right())) + + rightActionSize->width()) : 0; auto fullRight = inner.x() + inner.width() + (rightAligned ? 0 : infoWidth); - if (fullRight + rightActionWidth > _parent->width()) { - fullRight = _parent->width() - rightActionWidth; + if (fullRight + rightActionWidth + rightSkip > _parent->width()) { + fullRight = _parent->width() - rightActionWidth - rightSkip; } return fullRight; } diff --git a/Telegram/SourceFiles/history/view/media/history_view_photo.cpp b/Telegram/SourceFiles/history/view/media/history_view_photo.cpp index 22221a31d..e0aedeb49 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_photo.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_photo.cpp @@ -164,9 +164,10 @@ QSize Photo::countOptimalSize() { if (_serviceWidth > 0) { return { _serviceWidth, _serviceWidth }; } - const auto minWidth = qMax( + const auto minWidth = std::clamp( + _parent->minWidthForMedia(), (_parent->hasBubble() ? st::historyPhotoBubbleMinWidth : st::minPhotoSize), - _parent->minWidthForMedia()); + st::maxMediaSize); const auto maxActualWidth = qMax(tw, minWidth); maxWidth = qMax(maxActualWidth, th); minHeight = qMax(th, st::minPhotoSize); @@ -206,9 +207,10 @@ QSize Photo::countCurrentSize(int newWidth) { if (_pixw < 1) _pixw = 1; if (_pixh < 1) _pixh = 1; - auto minWidth = qMax( + const auto minWidth = std::clamp( + _parent->minWidthForMedia(), (_parent->hasBubble() ? st::historyPhotoBubbleMinWidth : st::minPhotoSize), - _parent->minWidthForMedia()); + st::maxMediaSize); newWidth = qMax(_pixw, minWidth); auto newHeight = qMax(_pixh, st::minPhotoSize); if (_parent->hasBubble() && !_caption.isEmpty()) { From 2b0cd2a61128b6f441f1e989f42423b83344a7c4 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 3 Dec 2021 18:56:48 +0400 Subject: [PATCH 051/173] Fix refreshing bottom info. --- Telegram/SourceFiles/history/history_message.cpp | 1 + .../history/view/history_view_bottom_info.cpp | 10 ++++++++-- .../history/view/history_view_bottom_info.h | 2 +- .../SourceFiles/history/view/history_view_message.cpp | 2 +- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Telegram/SourceFiles/history/history_message.cpp b/Telegram/SourceFiles/history/history_message.cpp index 39c7774d9..6eed91676 100644 --- a/Telegram/SourceFiles/history/history_message.cpp +++ b/Telegram/SourceFiles/history/history_message.cpp @@ -1900,6 +1900,7 @@ void HistoryMessage::changeRepliesCount( } } refreshRepliesText(views); + history()->owner().notifyItemDataChange(this); } void HistoryMessage::setUnreadRepliesCount( diff --git a/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp b/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp index e94524ad1..fdcf5b5a7 100644 --- a/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp +++ b/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp @@ -23,11 +23,11 @@ BottomInfo::BottomInfo(Data &&data) : _data(std::move(data)) { layout(); } -void BottomInfo::update(Data &&data) { +void BottomInfo::update(Data &&data, int availableWidth) { _data = std::move(data); layout(); if (!_size.isEmpty()) { - resizeToWidth(_size.width()); + resizeToWidth(std::min(optimalSize().width(), availableWidth)); } } @@ -165,6 +165,7 @@ int BottomInfo::resizeToWidth(int newWidth) { void BottomInfo::layout() { layoutDateText(); layoutViewsText(); + layoutRepliesText(); layoutReactionsText(); countOptimalSize(); } @@ -252,6 +253,11 @@ void BottomInfo::countOptimalSize() { + _views.maxWidth() + st::historyViewsWidth; } + if (!_replies.isEmpty()) { + width += st::historyViewsSpace + + _replies.maxWidth() + + st::historyViewsWidth; + } if (!_reactions.isEmpty()) { width += st::historyReactionsSkip + _reactions.maxWidth(); } diff --git a/Telegram/SourceFiles/history/view/history_view_bottom_info.h b/Telegram/SourceFiles/history/view/history_view_bottom_info.h index e7ffd27f0..2731a2e32 100644 --- a/Telegram/SourceFiles/history/view/history_view_bottom_info.h +++ b/Telegram/SourceFiles/history/view/history_view_bottom_info.h @@ -42,7 +42,7 @@ public: }; explicit BottomInfo(Data &&data); - void update(Data &&data); + void update(Data &&data, int availableWidth); [[nodiscard]] QSize optimalSize() const; [[nodiscard]] QSize size() const; diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index d947dfae8..681784d46 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -1808,7 +1808,7 @@ bool Message::isSignedAuthorElided() const { void Message::itemDataChanged() { const auto was = _bottomInfo.size(); - _bottomInfo.update(BottomInfoDataFromMessage(this)); + _bottomInfo.update(BottomInfoDataFromMessage(this), width()); if (was != _bottomInfo.size()) { history()->owner().requestViewResize(this); } else { From b5d80a3c151766554fafc794f4f7bf81a638b23c Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 12 Sep 2019 15:14:12 +0300 Subject: [PATCH 052/173] Improve BottomInfo layout. --- Telegram/SourceFiles/history/history_item.cpp | 2 + .../history/view/history_view_bottom_info.cpp | 38 +++++++++++++++++-- .../history/view/history_view_bottom_info.h | 1 + .../history/view/history_view_element.cpp | 4 ++ .../history/view/history_view_element.h | 1 + .../history/view/history_view_message.cpp | 36 ++++++++++++++---- .../history/view/history_view_message.h | 18 +++++---- .../history/view/media/history_view_gif.cpp | 2 +- .../view/media/history_view_location.cpp | 2 +- .../history/view/media/history_view_photo.cpp | 2 +- .../history/view/media/history_view_poll.cpp | 2 +- 11 files changed, 85 insertions(+), 23 deletions(-) diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index a332f0a48..821066edb 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -753,6 +753,7 @@ void HistoryItem::addReaction(const QString &reaction) { _reactions = std::make_unique(this); } _reactions->add(reaction); + history()->owner().notifyItemDataChange(this); } void HistoryItem::updateReactions(const MTPMessageReactions &reactions) { @@ -764,6 +765,7 @@ void HistoryItem::updateReactions(const MTPMessageReactions &reactions) { _reactions = std::make_unique(this); } _reactions->set(data.vresults().v, data.is_min()); + history()->owner().notifyItemDataChange(this); }); } diff --git a/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp b/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp index fdcf5b5a7..3179ef7fc 100644 --- a/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp +++ b/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp @@ -14,12 +14,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/history_item_components.h" #include "history/history_message.h" #include "history/view/history_view_message.h" +#include "data/data_message_reactions.h" #include "styles/style_chat.h" #include "styles/style_dialogs.h" namespace HistoryView { -BottomInfo::BottomInfo(Data &&data) : _data(std::move(data)) { +BottomInfo::BottomInfo(Data &&data) +: _data(std::move(data)) +, _reactions(st::msgMinWidth / 2) { layout(); } @@ -39,6 +42,17 @@ QSize BottomInfo::size() const { return _size; } +int BottomInfo::firstLineWidth() const { + if (_size.height() == _optimalSize.height()) { + return _size.width(); + } + const auto reactionsWidth = _reactions.maxWidth(); + const auto noReactionsWidth = _optimalSize.width() + - st::historyReactionsSkip + - reactionsWidth; + return noReactionsWidth; +} + bool BottomInfo::pointInTime(QPoint position) const { return QRect( _size.width() - _dateWidth, @@ -144,7 +158,7 @@ void BottomInfo::paint( } else { const auto available = _size.width(); const auto use = std::min(available, _reactions.maxWidth()); - _reactions.drawLeftElided( + _reactions.drawLeft( p, position.x() + _size.width() - use, position.y() + st::msgDateFont->height, @@ -157,12 +171,25 @@ void BottomInfo::paint( int BottomInfo::resizeToWidth(int newWidth) { if (newWidth >= _optimalSize.width()) { _size = _optimalSize; - return _size.height(); + } else { + const auto reactionsWidth = _reactions.maxWidth(); + const auto noReactionsWidth = _optimalSize.width() + - st::historyReactionsSkip + - reactionsWidth; + accumulate_min(newWidth, std::max(noReactionsWidth, reactionsWidth)); + _size = QSize( + newWidth, + st::msgDateFont->height + _reactions.countHeight(newWidth)); } - return 2 * st::msgDateFont->height; + return _size.height(); } void BottomInfo::layout() { + //const auto good = ::Data::MessageReactions::SuggestList(); + //for (const auto &item : good) { + // _data.reactions.emplace(item, rand_value() + 1); + //} + layoutDateText(); layoutViewsText(); layoutRepliesText(); @@ -234,6 +261,9 @@ void BottomInfo::layoutReactionsText() { auto fullCount = 0; auto text = QString(); for (const auto &[string, count] : sorted) { + //for (auto i = 0, n = rand_value() % 8 + 1; i != n; ++i) { + // text.append(string); + //} text.append(string); fullCount += count; } diff --git a/Telegram/SourceFiles/history/view/history_view_bottom_info.h b/Telegram/SourceFiles/history/view/history_view_bottom_info.h index 2731a2e32..a61c1df48 100644 --- a/Telegram/SourceFiles/history/view/history_view_bottom_info.h +++ b/Telegram/SourceFiles/history/view/history_view_bottom_info.h @@ -46,6 +46,7 @@ public: [[nodiscard]] QSize optimalSize() const; [[nodiscard]] QSize size() const; + [[nodiscard]] int firstLineWidth() const; [[nodiscard]] bool pointInTime(QPoint position) const; [[nodiscard]] bool isSignedAuthorElided() const; diff --git a/Telegram/SourceFiles/history/view/history_view_element.cpp b/Telegram/SourceFiles/history/view/history_view_element.cpp index 5d0ff8f85..891e38876 100644 --- a/Telegram/SourceFiles/history/view/history_view_element.cpp +++ b/Telegram/SourceFiles/history/view/history_view_element.cpp @@ -466,6 +466,10 @@ int Element::infoWidth() const { return 0; } +int Element::bottomInfoFirstLineWidth() const { + return 0; +} + bool Element::isHiddenByGroup() const { return _flags & Flag::HiddenByGroup; } diff --git a/Telegram/SourceFiles/history/view/history_view_element.h b/Telegram/SourceFiles/history/view/history_view_element.h index 5f5d2312d..bb16805e7 100644 --- a/Telegram/SourceFiles/history/view/history_view_element.h +++ b/Telegram/SourceFiles/history/view/history_view_element.h @@ -261,6 +261,7 @@ public: int skipBlockHeight() const; QString skipBlock() const; virtual int infoWidth() const; + virtual int bottomInfoFirstLineWidth() const; bool isHiddenByGroup() const; virtual bool isHidden() const; diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index 681784d46..a24503697 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -634,6 +634,10 @@ void Message::draw(Painter &p, const PaintContext &context) const { if (entry) { trect.setHeight(trect.height() - entry->height()); } + const auto needDrawInfo = needInfoDisplay(); + if (needDrawInfo) { + trect.setHeight(trect.height() - (_bottomInfo.size().height() - st::msgDateFont->height)); + } paintText(p, trect, context); if (mediaDisplayed) { auto mediaHeight = media->height(); @@ -660,11 +664,6 @@ void Message::draw(Painter &p, const PaintContext &context) const { entry->draw(p, entryContext); p.translate(-entryLeft, -entryTop); } - const auto needDrawInfo = entry - ? !entry->customInfoLayout() - : (mediaDisplayed - ? !media->customInfoLayout() - : true); if (needDrawInfo) { const auto bottomSelected = context.selected() || (!mediaSelectionIntervals.empty() @@ -1802,6 +1801,10 @@ int Message::infoWidth() const { return _bottomInfo.optimalSize().width(); } +int Message::bottomInfoFirstLineWidth() const { + return _bottomInfo.firstLineWidth(); +} + bool Message::isSignedAuthorElided() const { return _bottomInfo.isSignedAuthorElided(); } @@ -2464,8 +2467,10 @@ int Message::resizeContentGetHeight(int newWidth) { } } } - _bottomInfo.resizeToWidth( - std::min(_bottomInfo.optimalSize().width(), contentWidth)); + const auto bottomInfoHeight = _bottomInfo.resizeToWidth( + std::min( + _bottomInfo.optimalSize().width(), + contentWidth - st::msgPadding.left() - st::msgPadding.right() - 2 * st::msgDateDelta.x())); if (bubble) { auto reply = displayedReply(); @@ -2536,6 +2541,9 @@ int Message::resizeContentGetHeight(int newWidth) { reply->resize(contentWidth - st::msgPadding.left() - st::msgPadding.right()); newHeight += st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom(); } + if (needInfoDisplay()) { + newHeight += (bottomInfoHeight - st::msgDateFont->height); + } if (item->repliesAreComments() || item->externalReply()) { newHeight += st::historyCommentsButtonHeight; @@ -2556,6 +2564,20 @@ int Message::resizeContentGetHeight(int newWidth) { return newHeight; } +bool Message::needInfoDisplay() const { + const auto media = this->media(); + const auto mediaDisplayed = media ? media->isDisplayed() : false; + const auto entry = logEntryOriginal(); + + // Entry page is always a bubble bottom. + const auto mediaOnBottom = (mediaDisplayed && media->isBubbleBottom()) || (entry/* && entry->isBubbleBottom()*/); + return entry + ? !entry->customInfoLayout() + : (mediaDisplayed + ? !media->customInfoLayout() + : true); +} + bool Message::hasVisibleText() const { if (message()->emptyText()) { return false; diff --git a/Telegram/SourceFiles/history/view/history_view_message.h b/Telegram/SourceFiles/history/view/history_view_message.h index 8e649ede3..ed9db5c1a 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.h +++ b/Telegram/SourceFiles/history/view/history_view_message.h @@ -106,14 +106,15 @@ public: int left, int top, int outerWidth) const override; - ClickHandlerPtr rightActionLink() const override; - bool displayEditedBadge() const override; - TimeId displayedEditDate() const override; - HistoryMessageReply *displayedReply() const override; - bool toggleSelectionByHandlerClick( + [[nodiscard]] ClickHandlerPtr rightActionLink() const override; + [[nodiscard]] bool displayEditedBadge() const override; + [[nodiscard]] TimeId displayedEditDate() const override; + [[nodiscard]] HistoryMessageReply *displayedReply() const override; + [[nodiscard]] bool toggleSelectionByHandlerClick( const ClickHandlerPtr &handler) const override; - int infoWidth() const override; - bool isSignedAuthorElided() const override; + [[nodiscard]] int infoWidth() const override; + [[nodiscard]] int bottomInfoFirstLineWidth() const override; + [[nodiscard]] bool isSignedAuthorElided() const override; void itemDataChanged() override; @@ -202,6 +203,7 @@ private: QSize performCountOptimalSize() override; QSize performCountCurrentSize(int newWidth) override; bool hasVisibleText() const override; + [[nodiscard]] bool needInfoDisplay() const; [[nodiscard]] bool isPinnedContext() const; @@ -219,7 +221,7 @@ private: void updateViewButtonExistence(); [[nodiscard]] int viewButtonHeight() const; - WebPage *logEntryOriginal() const; + [[nodiscard]] WebPage *logEntryOriginal() const; [[nodiscard]] ClickHandlerPtr createGoToCommentsLink() const; [[nodiscard]] ClickHandlerPtr psaTooltipLink() const; diff --git a/Telegram/SourceFiles/history/view/media/history_view_gif.cpp b/Telegram/SourceFiles/history/view/media/history_view_gif.cpp index 9482f452f..2be39a618 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_gif.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_gif.cpp @@ -217,7 +217,7 @@ QSize Gif::countCurrentSize(int newWidth) { newWidth = std::clamp( std::max(tw, _parent->infoWidth() + 2 * (st::msgDateImgDelta + st::msgDateImgPadding.x())), st::minPhotoSize, - maxSize); + std::min(newWidth, maxSize)); auto newHeight = qMax(th, st::minPhotoSize); if (!activeCurrentStreamed()) { accumulate_max(newWidth, gifMaxStatusWidth(_data) + 2 * (st::msgDateImgDelta + st::msgDateImgPadding.x())); diff --git a/Telegram/SourceFiles/history/view/media/history_view_location.cpp b/Telegram/SourceFiles/history/view/media/history_view_location.cpp index affed2807..e3732ae16 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_location.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_location.cpp @@ -124,7 +124,7 @@ QSize Location::countCurrentSize(int newWidth) { auto minWidth = std::clamp( _parent->minWidthForMedia(), st::minPhotoSize, - st::maxMediaSize); + std::min(newWidth, st::maxMediaSize)); accumulate_max(newWidth, minWidth); accumulate_max(newHeight, st::minPhotoSize); if (_parent->hasBubble()) { diff --git a/Telegram/SourceFiles/history/view/media/history_view_photo.cpp b/Telegram/SourceFiles/history/view/media/history_view_photo.cpp index e0aedeb49..4e0bf9dd2 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_photo.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_photo.cpp @@ -210,7 +210,7 @@ QSize Photo::countCurrentSize(int newWidth) { const auto minWidth = std::clamp( _parent->minWidthForMedia(), (_parent->hasBubble() ? st::historyPhotoBubbleMinWidth : st::minPhotoSize), - st::maxMediaSize); + std::min(newWidth, st::maxMediaSize)); newWidth = qMax(_pixw, minWidth); auto newHeight = qMax(_pixh, st::minPhotoSize); if (_parent->hasBubble() && !_caption.isEmpty()) { diff --git a/Telegram/SourceFiles/history/view/media/history_view_poll.cpp b/Telegram/SourceFiles/history/view/media/history_view_poll.cpp index e04851da1..8324b0368 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_poll.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_poll.cpp @@ -799,7 +799,7 @@ void Poll::paintInlineFooter( top, std::min( _totalVotesLabel.maxWidth(), - paintw - _parent->infoWidth()), + paintw - _parent->bottomInfoFirstLineWidth()), width()); } From b151d210bfb6e5abda93a8f40b873caf9d69f22d Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 12 Nov 2019 15:21:40 +0300 Subject: [PATCH 053/173] Add peer-list-like view for message reactions list. --- Telegram/CMakeLists.txt | 4 + Telegram/SourceFiles/boxes/peer_list_box.cpp | 18 +- Telegram/SourceFiles/boxes/peer_list_box.h | 3 + .../admin_log/history_admin_log_inner.cpp | 3 + .../admin_log/history_admin_log_inner.h | 2 + .../history/history_inner_widget.cpp | 18 +- .../history/history_inner_widget.h | 1 + .../history/view/history_view_bottom_info.cpp | 45 +++- .../history/view/history_view_bottom_info.h | 16 +- .../history/view/history_view_element.cpp | 10 +- .../history/view/history_view_element.h | 4 +- .../history/view/history_view_list_widget.cpp | 3 + .../history/view/history_view_list_widget.h | 1 + .../history/view/history_view_message.cpp | 30 ++- .../history/view/history_view_message.h | 2 +- .../history/view/media/history_view_gif.cpp | 12 +- .../view/media/history_view_location.cpp | 10 +- .../view/media/history_view_media_grouped.cpp | 10 +- .../media/history_view_media_unwrapped.cpp | 10 +- .../history/view/media/history_view_photo.cpp | 10 +- .../view/reactions/message_reactions_list.cpp | 231 ++++++++++++++++++ .../view/reactions/message_reactions_list.h | 28 +++ .../reactions/message_reactions_selector.cpp | 59 +++++ .../reactions/message_reactions_selector.h | 23 ++ .../ui/widgets/discrete_sliders.cpp | 2 +- 25 files changed, 516 insertions(+), 39 deletions(-) create mode 100644 Telegram/SourceFiles/history/view/reactions/message_reactions_list.cpp create mode 100644 Telegram/SourceFiles/history/view/reactions/message_reactions_list.h create mode 100644 Telegram/SourceFiles/history/view/reactions/message_reactions_selector.cpp create mode 100644 Telegram/SourceFiles/history/view/reactions/message_reactions_selector.h diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index 4cdb45a56..453056f6a 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -621,6 +621,10 @@ PRIVATE history/view/media/history_view_theme_document.cpp history/view/media/history_view_web_page.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/history_view_bottom_info.cpp history/view/history_view_bottom_info.h history/view/history_view_contact_status.cpp diff --git a/Telegram/SourceFiles/boxes/peer_list_box.cpp b/Telegram/SourceFiles/boxes/peer_list_box.cpp index bdf951ee4..bf1917776 100644 --- a/Telegram/SourceFiles/boxes/peer_list_box.cpp +++ b/Telegram/SourceFiles/boxes/peer_list_box.cpp @@ -97,8 +97,13 @@ void PeerListBox::createMultiSelect() { _select->moveToLeft(0, 0); } +void PeerListBox::setAddedTopScrollSkip(int skip) { + _addedTopScrollSkip = skip; + updateScrollSkips(); +} + int PeerListBox::getTopScrollSkip() const { - auto result = 0; + auto result = _addedTopScrollSkip; if (_select && !_select->isHidden()) { result += _select->height(); } @@ -109,7 +114,7 @@ void PeerListBox::updateScrollSkips() { // If we show / hide the search field scroll top is fixed. // If we resize search field by bubbles scroll bottom is fixed. setInnerTopSkip(getTopScrollSkip(), _scrollBottomFixed); - if (!_select->animating()) { + if (_select && !_select->animating()) { _scrollBottomFixed = true; } } @@ -186,8 +191,15 @@ void PeerListBox::paintEvent(QPaintEvent *e) { const auto &bg = (_controller->listSt() ? *_controller->listSt() : st::peerListBox).bg; + const auto fill = QRect( + 0, + _addedTopScrollSkip, + width(), + height() - _addedTopScrollSkip); for (const auto &rect : e->region()) { - p.fillRect(rect, bg); + if (const auto part = rect.intersected(fill); !part.isEmpty()) { + p.fillRect(part, bg); + } } } diff --git a/Telegram/SourceFiles/boxes/peer_list_box.h b/Telegram/SourceFiles/boxes/peer_list_box.h index 9591dd3ae..39260c4e3 100644 --- a/Telegram/SourceFiles/boxes/peer_list_box.h +++ b/Telegram/SourceFiles/boxes/peer_list_box.h @@ -1008,6 +1008,8 @@ public: int peerListSelectedRowsCount() override; void peerListScrollToTop() override; + void setAddedTopScrollSkip(int skip); + protected: void prepare() override; void setInnerFocus() override; @@ -1047,5 +1049,6 @@ private: std::unique_ptr _controller; Fn _init; bool _scrollBottomFixed = false; + int _addedTopScrollSkip = 0; }; diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp index 37d737b92..7b3f24f16 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp @@ -669,6 +669,9 @@ void InnerWidget::elementReplyTo(const FullMsgId &to) { void InnerWidget::elementStartInteraction(not_null view) { } +void InnerWidget::elementShowReactions(not_null view) { +} + void InnerWidget::saveState(not_null memento) { memento->setFilter(std::move(_filter)); memento->setAdmins(std::move(_admins)); diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.h b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.h index 65792b3d4..4c4e73efa 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.h +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.h @@ -139,6 +139,8 @@ public: void elementReplyTo(const FullMsgId &to) override; void elementStartInteraction( not_null view) override; + void elementShowReactions( + not_null view) override; ~InnerWidget(); diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index aa430e29f..9a664f70a 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -15,13 +15,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/media/history_view_media.h" #include "history/view/media/history_view_sticker.h" #include "history/view/media/history_view_web_page.h" -#include "history/history_item_components.h" -#include "history/history_item_text.h" +#include "history/view/reactions/message_reactions_list.h" #include "history/view/history_view_message.h" #include "history/view/history_view_service_message.h" #include "history/view/history_view_cursor_state.h" #include "history/view/history_view_context_menu.h" #include "history/view/history_view_emoji_interactions.h" +#include "history/history_item_components.h" +#include "history/history_item_text.h" #include "ui/chat/chat_style.h" #include "ui/widgets/popup_menu.h" #include "ui/image/image.h" @@ -37,6 +38,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/inactive_press.h" #include "window/window_adaptive.h" #include "window/window_session_controller.h" +#include "window/window_controller.h" #include "window/window_peer_menu.h" #include "window/window_controller.h" #include "window/notifications_manager.h" @@ -2867,6 +2869,12 @@ void HistoryInner::elementStartInteraction(not_null view) { _controller->emojiInteractions().startOutgoing(view); } +void HistoryInner::elementShowReactions(not_null view) { + _controller->window().show(HistoryView::ReactionsListBox( + _controller, + view->data())); +} + auto HistoryInner::getSelectionState() const -> HistoryView::TopBarWidget::SelectedState { auto result = HistoryView::TopBarWidget::SelectedState {}; @@ -3776,6 +3784,12 @@ not_null HistoryInner::ElementDelegate() { Instance->elementStartInteraction(view); } } + void elementShowReactions(not_null view) override { + if (Instance) { + Instance->elementShowReactions(view); + } + } + }; static Result result; diff --git a/Telegram/SourceFiles/history/history_inner_widget.h b/Telegram/SourceFiles/history/history_inner_widget.h index 8e0302223..b6324ef84 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.h +++ b/Telegram/SourceFiles/history/history_inner_widget.h @@ -116,6 +116,7 @@ public: not_null elementPathShiftGradient(); void elementReplyTo(const FullMsgId &to); void elementStartInteraction(not_null view); + void elementShowReactions(not_null view); void updateBotInfo(bool recount = true); diff --git a/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp b/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp index 3179ef7fc..128ce3724 100644 --- a/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp +++ b/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp @@ -14,20 +14,23 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/history_item_components.h" #include "history/history_message.h" #include "history/view/history_view_message.h" +#include "history/view/history_view_cursor_state.h" #include "data/data_message_reactions.h" #include "styles/style_chat.h" #include "styles/style_dialogs.h" namespace HistoryView { -BottomInfo::BottomInfo(Data &&data) +BottomInfo::BottomInfo(Data &&data, Context &&context) : _data(std::move(data)) +, _context(std::move(context)) , _reactions(st::msgMinWidth / 2) { layout(); } -void BottomInfo::update(Data &&data, int availableWidth) { +void BottomInfo::update(Data &&data, Context &&context, int availableWidth) { _data = std::move(data); + _context = std::move(context); layout(); if (!_size.isEmpty()) { resizeToWidth(std::min(optimalSize().width(), availableWidth)); @@ -53,13 +56,38 @@ int BottomInfo::firstLineWidth() const { return noReactionsWidth; } -bool BottomInfo::pointInTime(QPoint position) const { - return QRect( +TextState BottomInfo::textState( + not_null item, + QPoint position) const { + auto result = TextState(item); + if (!_reactions.isEmpty()) { + const auto reactionsPosition = [&] { + if (_size.height() == _optimalSize.height()) { + return QPoint(0, 0); + } + const auto available = _size.width(); + const auto use = std::min(available, _reactions.maxWidth()); + return QPoint(_size.width() - use, st::msgDateFont->height); + }(); + const auto state = _reactions.getStateLeft( + position - reactionsPosition, + std::min(_size.width(), _reactions.maxWidth()), + _size.width()); + if (state.uponSymbol) { + result.link = _context.reactions; + return result; + } + } + const auto inTime = QRect( _size.width() - _dateWidth, 0, _dateWidth, st::msgDateFont->height ).contains(position); + if (inTime) { + result.cursor = CursorState::Date; + } + return result; } bool BottomInfo::isSignedAuthorElided() const { @@ -336,4 +364,13 @@ BottomInfo::Data BottomInfoDataFromMessage(not_null message) { return result; } +BottomInfo::Context BottomInfoContextFromMessage( + not_null message) { + auto result = BottomInfo::Context(); + result.reactions = std::make_shared([=] { + message->delegate()->elementShowReactions(message); + }); + return result; +} + } // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/history_view_bottom_info.h b/Telegram/SourceFiles/history/view/history_view_bottom_info.h index a61c1df48..4750aec32 100644 --- a/Telegram/SourceFiles/history/view/history_view_bottom_info.h +++ b/Telegram/SourceFiles/history/view/history_view_bottom_info.h @@ -19,6 +19,7 @@ namespace HistoryView { using PaintContext = Ui::ChatPaintContext; class Message; +struct TextState; class BottomInfo { public: @@ -40,14 +41,19 @@ public: std::optional replies; Flags flags; }; - explicit BottomInfo(Data &&data); + struct Context { + ClickHandlerPtr reactions; + }; + BottomInfo(Data &&data, Context &&context); - void update(Data &&data, int availableWidth); + void update(Data &&data, Context &&context, int availableWidth); [[nodiscard]] QSize optimalSize() const; [[nodiscard]] QSize size() const; [[nodiscard]] int firstLineWidth() const; - [[nodiscard]] bool pointInTime(QPoint position) const; + [[nodiscard]] TextState textState( + not_null item, + QPoint position) const; [[nodiscard]] bool isSignedAuthorElided() const; void paint( @@ -69,6 +75,7 @@ private: void countOptimalSize(); Data _data; + Context _context; QSize _optimalSize; QSize _size; Ui::Text::String _authorEditedDate; @@ -83,4 +90,7 @@ private: [[nodiscard]] BottomInfo::Data BottomInfoDataFromMessage( not_null message); +[[nodiscard]] BottomInfo::Context BottomInfoContextFromMessage( + not_null message); + } // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/history_view_element.cpp b/Telegram/SourceFiles/history/view/history_view_element.cpp index 891e38876..144816711 100644 --- a/Telegram/SourceFiles/history/view/history_view_element.cpp +++ b/Telegram/SourceFiles/history/view/history_view_element.cpp @@ -15,6 +15,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/media/history_view_media_grouped.h" #include "history/view/media/history_view_sticker.h" #include "history/view/media/history_view_large_emoji.h" +#include "history/view/history_view_cursor_state.h" #include "history/history.h" #include "base/unixtime.h" #include "core/application.h" @@ -179,11 +180,14 @@ auto SimpleElementDelegate::elementPathShiftGradient() void SimpleElementDelegate::elementReplyTo(const FullMsgId &to) { } - void SimpleElementDelegate::elementStartInteraction( not_null view) { } +void SimpleElementDelegate::elementShowReactions( + not_null view) { +} + TextSelection UnshiftItemSelection( TextSelection selection, uint16 byLength) { @@ -956,12 +960,12 @@ void Element::drawInfo( InfoDisplayType type) const { } -bool Element::pointInTime( +TextState Element::bottomInfoTextState( int right, int bottom, QPoint point, InfoDisplayType type) const { - return false; + return TextState(); } TextSelection Element::adjustSelection( diff --git a/Telegram/SourceFiles/history/view/history_view_element.h b/Telegram/SourceFiles/history/view/history_view_element.h index bb16805e7..2141c8414 100644 --- a/Telegram/SourceFiles/history/view/history_view_element.h +++ b/Telegram/SourceFiles/history/view/history_view_element.h @@ -91,6 +91,7 @@ public: virtual not_null elementPathShiftGradient() = 0; virtual void elementReplyTo(const FullMsgId &to) = 0; virtual void elementStartInteraction(not_null view) = 0; + virtual void elementShowReactions(not_null view) = 0; virtual ~ElementDelegate() { } @@ -148,6 +149,7 @@ public: not_null elementPathShiftGradient() override; void elementReplyTo(const FullMsgId &to) override; void elementStartInteraction(not_null view) override; + void elementShowReactions(not_null view) override; protected: [[nodiscard]] not_null controller() const { @@ -298,7 +300,7 @@ public: int bottom, int width, InfoDisplayType type) const; - virtual bool pointInTime( + virtual TextState bottomInfoTextState( int right, int bottom, QPoint point, diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp index 8a969639a..a3d17e04b 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp @@ -1458,6 +1458,9 @@ void ListWidget::elementReplyTo(const FullMsgId &to) { void ListWidget::elementStartInteraction(not_null view) { } +void ListWidget::elementShowReactions(not_null view) { +} + void ListWidget::saveState(not_null memento) { memento->setAroundPosition(_aroundPosition); auto state = countScrollState(); diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.h b/Telegram/SourceFiles/history/view/history_view_list_widget.h index f12a1436c..33a781691 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.h +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.h @@ -278,6 +278,7 @@ public: not_null elementPathShiftGradient() override; void elementReplyTo(const FullMsgId &to) override; void elementStartInteraction(not_null view) override; + void elementShowReactions(not_null view) override; void setEmptyInfoWidget(base::unique_qptr &&w); diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index a24503697..2e1ef5d0a 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -242,7 +242,9 @@ Message::Message( not_null data, Element *replacing) : Element(delegate, data, replacing) -, _bottomInfo(BottomInfoDataFromMessage(this)) { +, _bottomInfo( + BottomInfoDataFromMessage(this), + BottomInfoContextFromMessage(this)) { initLogEntryOriginal(); initPsa(); } @@ -1260,17 +1262,18 @@ TextState Message::textState( } } - auto checkForPointInTime = [&] { + auto checkBottomInfoState = [&] { if (mediaOnBottom && (entry || media->customInfoLayout())) { return; } - const auto inDate = pointInTime( + const auto bottomInfoResult = bottomInfoTextState( bubble.left() + bubble.width(), bubble.top() + bubble.height(), point, InfoDisplayType::Default); - if (inDate) { - result.cursor = CursorState::Date; + if (bottomInfoResult.link + || bottomInfoResult.cursor != CursorState::None) { + result = bottomInfoResult; } }; if (inBubble) { @@ -1283,19 +1286,19 @@ TextState Message::textState( result = media->textState(point - QPoint(mediaLeft, mediaTop), request); result.symbol += item->_text.length(); } else if (getStateText(point, trect, &result, request)) { - checkForPointInTime(); + checkBottomInfoState(); return result; } else if (point.y() >= trect.y() + trect.height()) { result.symbol = item->_text.length(); } } else if (getStateText(point, trect, &result, request)) { - checkForPointInTime(); + checkBottomInfoState(); return result; } else if (point.y() >= trect.y() + trect.height()) { result.symbol = item->_text.length(); } } - checkForPointInTime(); + checkBottomInfoState(); if (const auto size = rightActionSize()) { const auto fastShareSkip = std::clamp( (g.height() - size->height()) / 2, @@ -1770,7 +1773,7 @@ void Message::drawInfo( context); } -bool Message::pointInTime( +TextState Message::bottomInfoTextState( int right, int bottom, QPoint point, @@ -1794,7 +1797,9 @@ bool Message::pointInTime( const auto size = _bottomInfo.size(); const auto infoLeft = infoRight - size.width(); const auto infoTop = infoBottom - size.height(); - return _bottomInfo.pointInTime({ infoLeft, infoTop }); + return _bottomInfo.textState( + data(), + point - QPoint{ infoLeft, infoTop }); } int Message::infoWidth() const { @@ -1811,7 +1816,10 @@ bool Message::isSignedAuthorElided() const { void Message::itemDataChanged() { const auto was = _bottomInfo.size(); - _bottomInfo.update(BottomInfoDataFromMessage(this), width()); + _bottomInfo.update( + BottomInfoDataFromMessage(this), + BottomInfoContextFromMessage(this), + width()); if (was != _bottomInfo.size()) { history()->owner().requestViewResize(this); } else { diff --git a/Telegram/SourceFiles/history/view/history_view_message.h b/Telegram/SourceFiles/history/view/history_view_message.h index ed9db5c1a..0c00cb5dd 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.h +++ b/Telegram/SourceFiles/history/view/history_view_message.h @@ -72,7 +72,7 @@ public: int bottom, int width, InfoDisplayType type) const override; - bool pointInTime( + TextState bottomInfoTextState( int right, int bottom, QPoint point, diff --git a/Telegram/SourceFiles/history/view/media/history_view_gif.cpp b/Telegram/SourceFiles/history/view/media/history_view_gif.cpp index 2be39a618..6b65422e4 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_gif.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_gif.cpp @@ -868,8 +868,16 @@ TextState Gif::textState(QPoint point, StateRequest request) const { } } if (!inWebPage) { - if (_parent->pointInTime(fullRight, fullBottom, point, isRound ? InfoDisplayType::Background : InfoDisplayType::Image)) { - result.cursor = CursorState::Date; + const auto bottomInfoResult = _parent->bottomInfoTextState( + fullRight, + fullBottom, + point, + (isRound + ? InfoDisplayType::Background + : InfoDisplayType::Image)); + if (bottomInfoResult.link + || bottomInfoResult.cursor != CursorState::None) { + return bottomInfoResult; } } if (const auto size = bubble ? std::nullopt : _parent->rightActionSize()) { diff --git a/Telegram/SourceFiles/history/view/media/history_view_location.cpp b/Telegram/SourceFiles/history/view/media/history_view_location.cpp index e3732ae16..cc80266ec 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_location.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_location.cpp @@ -287,8 +287,14 @@ TextState Location::textState(QPoint point, StateRequest request) const { if (_parent->media() == this) { auto fullRight = paintx + paintw; auto fullBottom = height(); - if (_parent->pointInTime(fullRight, fullBottom, point, InfoDisplayType::Image)) { - result.cursor = CursorState::Date; + const auto bottomInfoResult = _parent->bottomInfoTextState( + fullRight, + fullBottom, + point, + InfoDisplayType::Image); + if (bottomInfoResult.link + || bottomInfoResult.cursor != CursorState::None) { + return bottomInfoResult; } if (const auto size = bubble ? std::nullopt : _parent->rightActionSize()) { auto fastShareLeft = (fullRight + st::historyFastShareLeft); diff --git a/Telegram/SourceFiles/history/view/media/history_view_media_grouped.cpp b/Telegram/SourceFiles/history/view/media/history_view_media_grouped.cpp index 5d677bef9..f094bd6a7 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_media_grouped.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_media_grouped.cpp @@ -421,8 +421,14 @@ TextState GroupedMedia::textState(QPoint point, StateRequest request) const { } else if (_parent->media() == this) { auto fullRight = width(); auto fullBottom = height(); - if (_parent->pointInTime(fullRight, fullBottom, point, InfoDisplayType::Image)) { - result.cursor = CursorState::Date; + const auto bottomInfoResult = _parent->bottomInfoTextState( + fullRight, + fullBottom, + point, + InfoDisplayType::Image); + if (bottomInfoResult.link + || bottomInfoResult.cursor != CursorState::None) { + return bottomInfoResult; } if (const auto size = _parent->hasBubble() ? std::nullopt : _parent->rightActionSize()) { auto fastShareLeft = (fullRight + st::historyFastShareLeft); diff --git a/Telegram/SourceFiles/history/view/media/history_view_media_unwrapped.cpp b/Telegram/SourceFiles/history/view/media/history_view_media_unwrapped.cpp index 7d36d2a25..b2980977f 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_media_unwrapped.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_media_unwrapped.cpp @@ -367,8 +367,14 @@ TextState UnwrappedMedia::textState(QPoint point, StateRequest request) const { const auto fullRight = calculateFullRight(inner); const auto rightActionSize = _parent->rightActionSize(); auto fullBottom = height(); - if (_parent->pointInTime(fullRight, fullBottom, point, InfoDisplayType::Background)) { - result.cursor = CursorState::Date; + const auto bottomInfoResult = _parent->bottomInfoTextState( + fullRight, + fullBottom, + point, + InfoDisplayType::Background); + if (bottomInfoResult.link + || bottomInfoResult.cursor != CursorState::None) { + return bottomInfoResult; } if (rightActionSize) { const auto position = calculateFastActionPosition( diff --git a/Telegram/SourceFiles/history/view/media/history_view_photo.cpp b/Telegram/SourceFiles/history/view/media/history_view_photo.cpp index 4e0bf9dd2..0d0b308e5 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_photo.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_photo.cpp @@ -464,8 +464,14 @@ TextState Photo::textState(QPoint point, StateRequest request) const { if (_caption.isEmpty() && _parent->media() == this) { auto fullRight = paintx + paintw; auto fullBottom = painty + painth; - if (_parent->pointInTime(fullRight, fullBottom, point, InfoDisplayType::Image)) { - result.cursor = CursorState::Date; + const auto bottomInfoResult = _parent->bottomInfoTextState( + fullRight, + fullBottom, + point, + InfoDisplayType::Image); + if (bottomInfoResult.link + || bottomInfoResult.cursor != CursorState::None) { + return bottomInfoResult; } if (const auto size = bubble ? std::nullopt : _parent->rightActionSize()) { auto fastShareLeft = (fullRight + st::historyFastShareLeft); diff --git a/Telegram/SourceFiles/history/view/reactions/message_reactions_list.cpp b/Telegram/SourceFiles/history/view/reactions/message_reactions_list.cpp new file mode 100644 index 000000000..02019ce3a --- /dev/null +++ b/Telegram/SourceFiles/history/view/reactions/message_reactions_list.cpp @@ -0,0 +1,231 @@ +/* +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 "history/view/reactions/message_reactions_list.h" + +#include "history/view/reactions/message_reactions_selector.h" +#include "boxes/peer_list_box.h" +#include "window/window_session_controller.h" +#include "history/history_item.h" +#include "history/history.h" +#include "main/main_session.h" +#include "data/data_session.h" +#include "data/data_user.h" +#include "lang/lang_keys.h" + +namespace HistoryView { +namespace { + +constexpr auto kPerPageFirst = 20; +constexpr auto kPerPage = 200; + +class Controller final : public PeerListController { +public: + Controller( + not_null window, + not_null item, + rpl::producer switches); + + Main::Session &session() const override; + void prepare() override; + void rowClicked(not_null row) override; + void loadMoreRows() override; + +private: + using AllEntry = std::pair, QString>; + + void loadMore(const QString &offset); + bool appendRow(not_null user, QString reaction = QString()); + std::unique_ptr createRow( + not_null user, + QString reaction) const; + void showReaction(const QString &reaction); + + const not_null _window; + const not_null _item; + MTP::Sender _api; + + QString _shownReaction; + + std::vector _all; + QString _allOffset; + + std::vector> _filtered; + QString _filteredOffset; + + mtpRequestId _loadRequestId = 0; + +}; + +Controller::Controller( + not_null window, + not_null item, + rpl::producer switches) +: _window(window) +, _item(item) +, _api(&window->session().mtp()) { + std::move( + switches + ) | rpl::filter([=](const QString &reaction) { + return (_shownReaction != reaction); + }) | rpl::start_with_next([=](const QString &reaction) { + showReaction(reaction); + }, lifetime()); +} + +Main::Session &Controller::session() const { + return _window->session(); +} + +void Controller::prepare() { + setDescriptionText(tr::lng_contacts_loading(tr::now)); + delegate()->peerListRefreshRows(); + + loadMore(QString()); +} + +void Controller::showReaction(const QString &reaction) { + if (_shownReaction == reaction) { + return; + } + + _api.request(base::take(_loadRequestId)).cancel(); + while (const auto count = delegate()->peerListFullRowsCount()) { + delegate()->peerListRemoveRow(delegate()->peerListRowAt(count - 1)); + } + + _shownReaction = reaction; + if (_shownReaction.isEmpty()) { + _filtered.clear(); + for (const auto &[user, reaction] : _all) { + appendRow(user, reaction); + } + } else { + _filtered = _all | ranges::view::filter([&](const AllEntry &entry) { + return (entry.second == reaction); + }) | ranges::view::transform( + &AllEntry::first + ) | ranges::to_vector; + for (const auto user : _filtered) { + appendRow(user); + } + loadMore(QString()); + } + setDescriptionText(delegate()->peerListFullRowsCount() + ? QString() + : tr::lng_contacts_loading(tr::now)); + delegate()->peerListRefreshRows(); +} + +void Controller::loadMoreRows() { + const auto &offset = _shownReaction.isEmpty() + ? _allOffset + : _filteredOffset; + if (_loadRequestId || offset.isEmpty()) { + return; + } + loadMore(offset); +} + +void Controller::loadMore(const QString &offset) { + _api.request(_loadRequestId).cancel(); + + using Flag = MTPmessages_GetMessageReactionsList::Flag; + const auto flags = Flag(0) + | (offset.isEmpty() ? Flag(0) : Flag::f_offset) + | (_shownReaction.isEmpty() ? Flag(0) : Flag::f_reaction); + _loadRequestId = _api.request(MTPmessages_GetMessageReactionsList( + MTP_flags(flags), + _item->history()->peer->input, + MTP_int(_item->id), + MTP_string(_shownReaction), + MTP_string(offset), + MTP_int(kPerPageFirst) + )).done([=](const MTPmessages_MessageReactionsList &result) { + _loadRequestId = 0; + const auto filtered = !_shownReaction.isEmpty(); + result.match([&](const MTPDmessages_messageReactionsList &data) { + const auto sessionData = &session().data(); + sessionData->processUsers(data.vusers()); + (filtered ? _filteredOffset : _allOffset) + = data.vnext_offset().value_or_empty(); + for (const auto &reaction : data.vreactions().v) { + reaction.match([&](const MTPDmessageUserReaction &data) { + const auto user = sessionData->userLoaded( + data.vuser_id().v); + const auto reaction = filtered ? QString() : qs(data.vreaction()); + if (user && appendRow(user, reaction)) { + if (filtered) { + _filtered.emplace_back(user); + } else { + _all.emplace_back(user, reaction); + } + } + }); + } + }); + setDescriptionText(QString()); + delegate()->peerListRefreshRows(); + }).send(); +} + +void Controller::rowClicked(not_null row) { + const auto peerId = row->peer()->id; + const auto window = _window; + crl::on_main(&session(), [=] { + _window->showPeerHistory(peerId); + }); +} + +bool Controller::appendRow(not_null user, QString reaction) { + if (delegate()->peerListFindRow(user->id.value)) { + return false; + } + delegate()->peerListAppendRow(createRow(user, reaction)); + return true; +} + +std::unique_ptr Controller::createRow( + not_null user, + QString reaction) const { + auto result = std::make_unique(user); + if (!reaction.isEmpty()) { + result->setCustomStatus(reaction); + } + return result; +} + +} // namespace + +object_ptr ReactionsListBox( + not_null window, + not_null item) { + Expects(IsServerMsgId(item->id)); + + const auto tabRequests = std::make_shared>(); + const auto initBox = [=](not_null box) { + box->setNoContentMargin(true); + + const auto selector = CreateReactionSelector(box, item->reactions()); + box->widthValue( + ) | rpl::start_with_next([=](int width) { + selector->resizeToWidth(width); + selector->move(0, 0); + }, box->lifetime()); + selector->changes( + ) | rpl::start_to_stream(*tabRequests, box->lifetime()); + box->setAddedTopScrollSkip(selector->height()); + box->addButton(tr::lng_close(), [=] { + box->closeBox(); + }); + }; + return Box( + std::make_unique(window, item, tabRequests->events()), + initBox); +} + +} // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/reactions/message_reactions_list.h b/Telegram/SourceFiles/history/view/reactions/message_reactions_list.h new file mode 100644 index 000000000..ad61713ff --- /dev/null +++ b/Telegram/SourceFiles/history/view/reactions/message_reactions_list.h @@ -0,0 +1,28 @@ +/* +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/object_ptr.h" + +class HistoryItem; + +namespace Window { +class SessionController; +} // namespace Window + +namespace Ui { +class BoxContent; +} // namespace Ui + +namespace HistoryView { + +object_ptr ReactionsListBox( + not_null window, + not_null item); + +} // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/reactions/message_reactions_selector.cpp b/Telegram/SourceFiles/history/view/reactions/message_reactions_selector.cpp new file mode 100644 index 000000000..1c4bb6a63 --- /dev/null +++ b/Telegram/SourceFiles/history/view/reactions/message_reactions_selector.cpp @@ -0,0 +1,59 @@ +/* +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 "history/view/reactions/message_reactions_selector.h" + +#include "ui/widgets/discrete_sliders.h" +#include "styles/style_layers.h" + +namespace HistoryView { + +not_null CreateReactionSelector( + not_null parent, + const base::flat_map &items) { + const auto sectionsCount = int(items.size() + 1); + const auto result = Ui::CreateChild(parent.get()); + using Entry = std::pair; + auto sorted = std::vector(); + for (const auto &[reaction, count] : items) { + sorted.emplace_back(count, reaction); + } + ranges::sort(sorted, std::greater<>(), &Entry::first); + const auto count = ranges::accumulate( + sorted, + 0, + std::plus<>(), + &Entry::first); + auto labels = QStringList() << ("ALL (" + QString::number(count) + ")"); + for (const auto &[count, reaction] : sorted) { + labels.append(reaction + " (" + QString::number(count) + ")"); + } + auto tabs = Ui::CreateChild( + parent.get(), + st::defaultTabsSlider); + tabs->setSections(labels | ranges::to_vector); + tabs->setRippleTopRoundRadius(st::boxRadius); + result->move = [=](int x, int y) { + tabs->moveToLeft(x, y); + }; + result->resizeToWidth = [=](int width) { + tabs->resizeToWidth(std::min( + width, + sectionsCount * st::defaultTabsSlider.height * 2)); + }; + result->height = [=] { + return tabs->height() - st::lineWidth; + }; + result->changes = [=] { + return tabs->sectionActivated() | rpl::map([=](int section) { + return (section > 0) ? sorted[section - 1].second : QString(); + }); + }; + return result; +} + +} // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/reactions/message_reactions_selector.h b/Telegram/SourceFiles/history/view/reactions/message_reactions_selector.h new file mode 100644 index 000000000..8906962d2 --- /dev/null +++ b/Telegram/SourceFiles/history/view/reactions/message_reactions_selector.h @@ -0,0 +1,23 @@ +/* +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 + +namespace HistoryView { + +struct Selector { + Fn move; + Fn resizeToWidth; + Fn()> changes; + Fn height; +}; + +not_null CreateReactionSelector( + not_null parent, + const base::flat_map &items); + +} // namespace HistoryView diff --git a/Telegram/SourceFiles/ui/widgets/discrete_sliders.cpp b/Telegram/SourceFiles/ui/widgets/discrete_sliders.cpp index b53875dab..d8a35fdc0 100644 --- a/Telegram/SourceFiles/ui/widgets/discrete_sliders.cpp +++ b/Telegram/SourceFiles/ui/widgets/discrete_sliders.cpp @@ -164,7 +164,7 @@ DiscreteSlider::Section::Section( SettingsSlider::SettingsSlider( QWidget *parent, - const style::SettingsSlider &st) + const style::SettingsSlider &st) : DiscreteSlider(parent) , _st(st) { setSelectOnPress(_st.ripple.showDuration == 0); From be74f8f2bcfe46196d113f49ddab1493f263d75b Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 7 Dec 2021 12:15:30 +0400 Subject: [PATCH 054/173] Fix sponsored messages badge with BottomInfo. --- .../history/history_item_components.cpp | 11 ---- .../history/history_item_components.h | 9 ---- .../SourceFiles/history/history_message.cpp | 7 --- .../history/view/history_view_bottom_info.cpp | 7 ++- .../history/view/history_view_bottom_info.h | 1 + .../history/view/history_view_message.cpp | 51 ++++++++++--------- .../history/view/history_view_message.h | 7 +-- .../history/view/history_view_view_button.cpp | 11 ++-- .../history/view/history_view_view_button.h | 1 + 9 files changed, 44 insertions(+), 61 deletions(-) diff --git a/Telegram/SourceFiles/history/history_item_components.cpp b/Telegram/SourceFiles/history/history_item_components.cpp index 7aebfa46e..9382813b6 100644 --- a/Telegram/SourceFiles/history/history_item_components.cpp +++ b/Telegram/SourceFiles/history/history_item_components.cpp @@ -84,17 +84,6 @@ void HistoryMessageVia::resize(int32 availw) const { } } -HistoryMessageSponsored::HistoryMessageSponsored() { - text.setText( - st::msgDateTextStyle, - tr::lng_sponsored(tr::now), - Ui::NameTextOptions()); -} - -int HistoryMessageSponsored::maxWidth() const { - return text.maxWidth(); -} - HiddenSenderInfo::HiddenSenderInfo(const QString &name, bool external) : name(name) , colorPeerId(Data::FakePeerIdForJustName(name)) diff --git a/Telegram/SourceFiles/history/history_item_components.h b/Telegram/SourceFiles/history/history_item_components.h index 776134533..bf0ed95f6 100644 --- a/Telegram/SourceFiles/history/history_item_components.h +++ b/Telegram/SourceFiles/history/history_item_components.h @@ -68,15 +68,6 @@ struct HistoryMessageEdited : public RuntimeComponent { - HistoryMessageSponsored(); - int maxWidth() const; - - Ui::Text::String text; -}; - struct HiddenSenderInfo { HiddenSenderInfo(const QString &name, bool external); diff --git a/Telegram/SourceFiles/history/history_message.cpp b/Telegram/SourceFiles/history/history_message.cpp index 6eed91676..757bdeb87 100644 --- a/Telegram/SourceFiles/history/history_message.cpp +++ b/Telegram/SourceFiles/history/history_message.cpp @@ -433,7 +433,6 @@ struct HistoryMessage::CreateConfig { HistoryMessageMarkupData markup; HistoryMessageRepliesData replies; bool imported = false; - bool sponsored = false; // For messages created from existing messages (forwarded). const HistoryMessageReplyMarkup *inlineMarkup = nullptr; @@ -787,9 +786,6 @@ void HistoryMessage::createComponentsHelper( config.markup = std::move(markup); if (flags & MessageFlag::HasPostAuthor) config.author = postAuthor; if (flags & MessageFlag::HasViews) config.viewsCount = 1; - if (flags & MessageFlag::IsSponsored) { - config.sponsored = true; - } createComponents(std::move(config)); } @@ -1095,9 +1091,6 @@ void HistoryMessage::createComponents(CreateConfig &&config) { if (config.editDate != TimeId(0)) { mask |= HistoryMessageEdited::Bit(); } - if (config.sponsored) { - mask |= HistoryMessageSponsored::Bit(); - } if (config.originalDate != 0) { mask |= HistoryMessageForwarded::Bit(); } diff --git a/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp b/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp index 128ce3724..e8beb806b 100644 --- a/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp +++ b/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp @@ -242,7 +242,9 @@ void BottomInfo::layoutDateText() { const auto name = _authorElided ? st::msgDateFont->elided(author, maxWidth - afterAuthorWidth) : author; - const auto full = name + date; + const auto full = (_data.flags & Data::Flag::Sponsored) + ? tr::lng_sponsored(tr::now) + : name + date; _authorEditedDate.setText( st::msgDateTextStyle, full, @@ -336,6 +338,9 @@ BottomInfo::Data BottomInfoDataFromMessage(not_null message) { if (message->context() == Context::Replies) { result.flags |= Flag::RepliesContext; } + if (item->isSponsored()) { + result.flags |= Flag::Sponsored; + } if (const auto msgsigned = item->Get()) { if (!msgsigned->isAnonymousRank) { result.author = msgsigned->author; diff --git a/Telegram/SourceFiles/history/view/history_view_bottom_info.h b/Telegram/SourceFiles/history/view/history_view_bottom_info.h index 4750aec32..5c8ab24fa 100644 --- a/Telegram/SourceFiles/history/view/history_view_bottom_info.h +++ b/Telegram/SourceFiles/history/view/history_view_bottom_info.h @@ -29,6 +29,7 @@ public: OutLayout = 0x02, Sending = 0x04, RepliesContext = 0x08, + Sponsored = 0x10, //Unread, // We don't want to pass and update it in Date for now. }; friend inline constexpr bool is_flag_type(Flag) { return true; }; diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index 2e1ef5d0a..1568ee571 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -606,16 +606,21 @@ void Message::draw(Painter &p, const PaintContext &context) const { auto inner = g; paintCommentsButton(p, inner, context); + const auto needDrawInfo = needInfoDisplay(); auto trect = inner.marginsRemoved(st::msgPadding); if (_viewButton) { + const auto belowInfo = _viewButton->belowMessageInfo(); + const auto infoHeight = _bottomInfo.size().height(); + const auto heightMargins = QMargins(0, 0, 0, infoHeight); _viewButton->draw( p, - _viewButton->countRect(inner), + _viewButton->countRect(belowInfo + ? inner + : inner - heightMargins), context); - // Inner should contain _viewButton height, because info is - // painted below the _viewButton. - // - // inner.setHeight(inner.height() - _viewButton->height()); + if (belowInfo) { + inner.setHeight(inner.height() - _viewButton->height()); + } trect.setHeight(trect.height() - _viewButton->height()); if (mediaDisplayed) { trect.setHeight(trect.height() - st::mediaInBubbleSkip); @@ -636,7 +641,6 @@ void Message::draw(Painter &p, const PaintContext &context) const { if (entry) { trect.setHeight(trect.height() - entry->height()); } - const auto needDrawInfo = needInfoDisplay(); if (needDrawInfo) { trect.setHeight(trect.height() - (_bottomInfo.size().height() - st::msgDateFont->height)); } @@ -680,10 +684,10 @@ void Message::draw(Painter &p, const PaintContext &context) const { inner.top() + inner.height(), 2 * inner.left() + inner.width(), InfoDisplayType::Default); - if (g != inner) { + if (_comments) { const auto o = p.opacity(); p.setOpacity(0.3); - p.fillRect(inner.left(), inner.top() + inner.height() - st::lineWidth, inner.width(), st::lineWidth, stm->msgDateFg); + p.fillRect(g.left(), g.top() + g.height() - st::historyCommentsButtonHeight - st::lineWidth, g.width(), st::lineWidth, stm->msgDateFg); p.setOpacity(o); } } @@ -1213,12 +1217,21 @@ TextState Message::textState( if (getStateCommentsButton(point, bubble, &result)) { return result; } - if (_viewButton - && _viewButton->getState( - point, - _viewButton->countRect(bubble), - &result)) { - return result; + if (_viewButton) { + const auto belowInfo = _viewButton->belowMessageInfo(); + const auto infoHeight = _bottomInfo.size().height(); + const auto heightMargins = QMargins(0, 0, 0, infoHeight); + if (_viewButton->getState( + point, + _viewButton->countRect(belowInfo + ? bubble + : bubble - heightMargins), + &result)) { + return result; + } + if (belowInfo) { + bubble -= heightMargins; + } } auto trect = bubble.marginsRemoved(st::msgPadding); @@ -2625,16 +2638,6 @@ TimeId Message::displayedEditDate() const { return TimeId(0); } -const HistoryMessageSponsored *Message::displayedSponsorBadge() const { - // Ignore media while sponsored messages are text only. - // if (const auto media = this->media()) { - // if (media->overrideEditedDate()) { - // return media->displayedEditBadge(); - // } - // } - return message()->Get(); -} - HistoryMessageEdited *Message::displayedEditBadge() { if (const auto media = this->media()) { if (media->overrideEditedDate()) { diff --git a/Telegram/SourceFiles/history/view/history_view_message.h b/Telegram/SourceFiles/history/view/history_view_message.h index 0c00cb5dd..d538e9449 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.h +++ b/Telegram/SourceFiles/history/view/history_view_message.h @@ -14,7 +14,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL class HistoryMessage; struct HistoryMessageEdited; -struct HistoryMessageSponsored; struct HistoryMessageForwarded; namespace HistoryView { @@ -54,8 +53,8 @@ public: not_null message() const; - const HistoryMessageEdited *displayedEditBadge() const; - HistoryMessageEdited *displayedEditBadge(); + [[nodiscard]] const HistoryMessageEdited *displayedEditBadge() const; + [[nodiscard]] HistoryMessageEdited *displayedEditBadge(); int marginTop() const override; int marginBottom() const override; @@ -210,8 +209,6 @@ private: [[nodiscard]] bool displayFastShare() const; [[nodiscard]] bool displayGoToOriginal() const; [[nodiscard]] ClickHandlerPtr fastReplyLink() const; - [[nodiscard]] auto displayedSponsorBadge() const - -> const HistoryMessageSponsored*; [[nodiscard]] bool displayPinIcon() const; void initTime() const; diff --git a/Telegram/SourceFiles/history/view/history_view_view_button.cpp b/Telegram/SourceFiles/history/view/history_view_view_button.cpp index 7bfed5f54..96cb8b494 100644 --- a/Telegram/SourceFiles/history/view/history_view_view_button.cpp +++ b/Telegram/SourceFiles/history/view/history_view_view_button.cpp @@ -82,7 +82,7 @@ struct ViewButton::Inner { const style::margins &margins; const ClickHandlerPtr link; const Fn updateCallback; - bool underDate = true; + bool belowInfo = true; int lastWidth = 0; QPoint lastPoint; std::unique_ptr ripple; @@ -143,7 +143,7 @@ ViewButton::Inner::Inner( } })) , updateCallback(std::move(updateCallback)) -, underDate(false) +, belowInfo(false) , text(st::historyViewButtonTextStyle, WebPageToPhrase(media->webpage())) { } @@ -187,6 +187,10 @@ int ViewButton::height() const { return st::historyViewButtonHeight; } +bool ViewButton::belowMessageInfo() const { + return _inner->belowInfo; +} + void ViewButton::draw( Painter &p, const QRect &r, @@ -252,10 +256,9 @@ bool ViewButton::getState( } QRect ViewButton::countRect(const QRect &r) const { - const auto dateHeight = (_inner->underDate ? 0 : st::msgDateFont->height); return QRect( r.left(), - r.top() + r.height() - height() - dateHeight, + r.top() + r.height() - height(), r.width(), height()) - _inner->margins; } diff --git a/Telegram/SourceFiles/history/view/history_view_view_button.h b/Telegram/SourceFiles/history/view/history_view_view_button.h index 3c9514a8c..f49ae2ab2 100644 --- a/Telegram/SourceFiles/history/view/history_view_view_button.h +++ b/Telegram/SourceFiles/history/view/history_view_view_button.h @@ -31,6 +31,7 @@ public: not_null webpage); [[nodiscard]] int height() const; + [[nodiscard]] bool belowMessageInfo() const; void draw( Painter &p, From b1668afdf153895d35e978b35513a7dad72d5da8 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 7 Dec 2021 15:11:27 +0400 Subject: [PATCH 055/173] Use available reactions list from the server. --- Telegram/SourceFiles/data/data_channel.cpp | 11 ++ Telegram/SourceFiles/data/data_channel.h | 5 + Telegram/SourceFiles/data/data_chat.cpp | 11 ++ Telegram/SourceFiles/data/data_chat.h | 5 + .../data/data_message_reactions.cpp | 110 ++++++++++++++++++ .../SourceFiles/data/data_message_reactions.h | 47 ++++++++ Telegram/SourceFiles/data/data_session.cpp | 4 +- Telegram/SourceFiles/data/data_session.h | 21 ++-- .../history/history_inner_widget.cpp | 9 +- Telegram/SourceFiles/history/history_item.cpp | 2 +- .../history/view/history_view_bottom_info.cpp | 5 - 11 files changed, 212 insertions(+), 18 deletions(-) diff --git a/Telegram/SourceFiles/data/data_channel.cpp b/Telegram/SourceFiles/data/data_channel.cpp index 4944ebba6..360755acc 100644 --- a/Telegram/SourceFiles/data/data_channel.cpp +++ b/Telegram/SourceFiles/data/data_channel.cpp @@ -17,6 +17,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_location.h" #include "data/data_histories.h" #include "data/data_group_call.h" +#include "data/data_message_reactions.h" #include "main/main_session.h" #include "main/session/send_as_peers.h" #include "base/unixtime.h" @@ -760,6 +761,14 @@ PeerId ChannelData::groupCallDefaultJoinAs() const { return _callDefaultJoinAs; } +void ChannelData::setAllowedReactions(std::vector list) { + _allowedReactions = std::move(list); +} + +const std::vector &ChannelData::allowedReactions() const { + return _allowedReactions; +} + namespace Data { void ApplyMigration( @@ -903,6 +912,8 @@ void ApplyChannelUpdate( } } channel->setThemeEmoji(qs(update.vtheme_emoticon().value_or_empty())); + channel->setAllowedReactions( + Data::Reactions::ParseAllowed(update.vavailable_reactions())); channel->fullUpdated(); channel->setPendingRequestsCount( update.vrequests_pending().value_or_empty(), diff --git a/Telegram/SourceFiles/data/data_channel.h b/Telegram/SourceFiles/data/data_channel.h index e1444813d..9590f6b0e 100644 --- a/Telegram/SourceFiles/data/data_channel.h +++ b/Telegram/SourceFiles/data/data_channel.h @@ -410,6 +410,9 @@ public: void setGroupCallDefaultJoinAs(PeerId peerId); [[nodiscard]] PeerId groupCallDefaultJoinAs() const; + void setAllowedReactions(std::vector list); + [[nodiscard]] const std::vector &allowedReactions() const; + // Still public data members. uint64 access = 0; @@ -457,6 +460,8 @@ private: QString _inviteLink; std::optional _linkedChat; + std::vector _allowedReactions; + std::unique_ptr _call; PeerId _callDefaultJoinAs = 0; diff --git a/Telegram/SourceFiles/data/data_chat.cpp b/Telegram/SourceFiles/data/data_chat.cpp index 731b595bf..7d5d6bb61 100644 --- a/Telegram/SourceFiles/data/data_chat.cpp +++ b/Telegram/SourceFiles/data/data_chat.cpp @@ -12,6 +12,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_session.h" #include "data/data_changes.h" #include "data/data_group_call.h" +#include "data/data_message_reactions.h" #include "history/history.h" #include "main/main_session.h" #include "apiwrap.h" @@ -286,6 +287,14 @@ void ChatData::setPendingRequestsCount( } } +void ChatData::setAllowedReactions(std::vector list) { + _allowedReactions = std::move(list); +} + +const std::vector &ChatData::allowedReactions() const { + return _allowedReactions; +} + namespace Data { void ApplyChatUpdate( @@ -457,6 +466,8 @@ void ApplyChatUpdate(not_null chat, const MTPDchatFull &update) { } chat->checkFolder(update.vfolder_id().value_or_empty()); chat->setThemeEmoji(qs(update.vtheme_emoticon().value_or_empty())); + chat->setAllowedReactions( + Data::Reactions::ParseAllowed(update.vavailable_reactions())); chat->fullUpdated(); chat->setAbout(qs(update.vabout())); chat->setPendingRequestsCount( diff --git a/Telegram/SourceFiles/data/data_chat.h b/Telegram/SourceFiles/data/data_chat.h index 69cd51627..8893a5889 100644 --- a/Telegram/SourceFiles/data/data_chat.h +++ b/Telegram/SourceFiles/data/data_chat.h @@ -175,6 +175,9 @@ public: int count, std::vector recentRequesters); + void setAllowedReactions(std::vector list); + [[nodiscard]] const std::vector &allowedReactions() const; + // Still public data members. const MTPlong inputChat; @@ -199,6 +202,8 @@ private: int _pendingRequestsCount = 0; std::vector _recentRequesters; + std::vector _allowedReactions; + std::unique_ptr _call; PeerId _callDefaultJoinAs = 0; base::flat_map> _botCommands; diff --git a/Telegram/SourceFiles/data/data_message_reactions.cpp b/Telegram/SourceFiles/data/data_message_reactions.cpp index 1569b555d..75fc019c1 100644 --- a/Telegram/SourceFiles/data/data_message_reactions.cpp +++ b/Telegram/SourceFiles/data/data_message_reactions.cpp @@ -11,9 +11,119 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/history_item.h" #include "main/main_session.h" #include "data/data_session.h" +#include "data/data_channel.h" +#include "data/data_chat.h" +#include "base/timer_rpl.h" #include "apiwrap.h" namespace Data { +namespace { + +constexpr auto kRefreshEach = 60 * 60 * crl::time(1000); + +} // namespace + +Reactions::Reactions(not_null owner) : _owner(owner) { + request(); + + base::timer_each( + kRefreshEach + ) | rpl::start_with_next([=] { + request(); + }, _lifetime); +} + +const std::vector &Reactions::list() const { + return _available; +} + +std::vector Reactions::list(not_null peer) const { + if (const auto chat = peer->asChat()) { + return filtered(chat->allowedReactions()); + } else if (const auto channel = peer->asChannel()) { + return filtered(channel->allowedReactions()); + } else { + return list(); + } +} + +std::vector Reactions::Filtered( + const std::vector &reactions, + const std::vector &emoji) { + auto result = std::vector(); + result.reserve(emoji.size()); + for (const auto &single : emoji) { + const auto i = ranges::find(reactions, single, &Reaction::emoji); + if (i != end(reactions)) { + result.push_back(*i); + } + } + return result; +} + +std::vector Reactions::filtered( + const std::vector &emoji) const { + return Filtered(list(), emoji); +} + +std::vector Reactions::ParseAllowed( + const MTPVector *list) { + if (!list) { + return {}; + } + return list->v | ranges::view::transform([](const MTPstring &string) { + return qs(string); + }) | ranges::to_vector; +} + +void Reactions::request() { + auto &api = _owner->session().api(); + _requestId = api.request(MTPmessages_GetAvailableReactions( + MTP_int(_hash) + )).done([=](const MTPmessages_AvailableReactions &result) { + _requestId = 0; + result.match([&](const MTPDmessages_availableReactions &data) { + _hash = data.vhash().v; + + const auto &list = data.vreactions().v; + _available.clear(); + _available.reserve(data.vreactions().v.size()); + for (const auto &reaction : list) { + if (const auto parsed = parse(reaction)) { + _available.push_back(*parsed); + } + } + _updated.fire({}); + }, [&](const MTPDmessages_availableReactionsNotModified &) { + }); + }).fail([=] { + _requestId = 0; + _hash = 0; + }).send(); +} + +std::optional Reactions::parse(const MTPAvailableReaction &entry) { + return entry.match([&](const MTPDavailableReaction &data) { + const auto emoji = qs(data.vreaction()); + const auto known = (Ui::Emoji::Find(emoji) != nullptr); + if (!known) { + LOG(("API Error: Unknown emoji in reactions: %1").arg(emoji)); + } + return known + ? std::make_optional(Reaction{ + .emoji = emoji, + .title = qs(data.vtitle()), + .staticIcon = _owner->processDocument(data.vstatic_icon()), + .selectAnimation = _owner->processDocument( + data.vselect_animation()), + .activateAnimation = _owner->processDocument( + data.vactivate_animation()), + .activateEffects = _owner->processDocument( + data.veffect_animation()), + }) + : std::nullopt; + }); +} std::vector MessageReactions::SuggestList() { constexpr auto utf = [](const char *utf) { diff --git a/Telegram/SourceFiles/data/data_message_reactions.h b/Telegram/SourceFiles/data/data_message_reactions.h index e2f392c1b..af521df1f 100644 --- a/Telegram/SourceFiles/data/data_message_reactions.h +++ b/Telegram/SourceFiles/data/data_message_reactions.h @@ -9,6 +9,53 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace Data { +class Session; + +struct Reaction { + QString emoji; + QString title; + not_null staticIcon; + not_null selectAnimation; + not_null activateAnimation; + not_null activateEffects; +}; + +class Reactions final { +public: + explicit Reactions(not_null owner); + + [[nodiscard]] const std::vector &list() const; + [[nodiscard]] std::vector list(not_null peer) const; + + [[nodiscard]] static std::vector Filtered( + const std::vector &reactions, + const std::vector &emoji); + [[nodiscard]] std::vector filtered( + const std::vector &emoji) const; + + [[nodiscard]] static std::vector ParseAllowed( + const MTPVector *list); + + [[nodiscard]] rpl::producer<> updates() const; + +private: + void request(); + + [[nodiscard]] std::optional parse( + const MTPAvailableReaction &entry); + + const not_null _owner; + + std::vector _available; + rpl::event_stream<> _updated; + + mtpRequestId _requestId = 0; + int32 _hash = 0; + + rpl::lifetime _lifetime; + +}; + class MessageReactions final { public: static std::vector SuggestList(); diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index b82005903..b3777dee5 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -54,6 +54,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_scheduled_messages.h" #include "data/data_send_action.h" #include "data/data_sponsored_messages.h" +#include "data/data_message_reactions.h" #include "data/data_cloud_themes.h" #include "data/data_streaming.h" #include "data/data_media_rotation.h" @@ -241,7 +242,8 @@ Session::Session(not_null session) , _mediaRotation(std::make_unique()) , _histories(std::make_unique(this)) , _stickers(std::make_unique(this)) -, _sponsoredMessages(std::make_unique(this)) { +, _sponsoredMessages(std::make_unique(this)) +, _reactions(std::make_unique(this)) { _cache->open(_session->local().cacheKey()); _bigFileCache->open(_session->local().cacheBigFileKey()); diff --git a/Telegram/SourceFiles/data/data_session.h b/Telegram/SourceFiles/data/data_session.h index f5f9ed779..aa28fd30d 100644 --- a/Telegram/SourceFiles/data/data_session.h +++ b/Telegram/SourceFiles/data/data_session.h @@ -52,6 +52,7 @@ class WallPaper; class ScheduledMessages; class SendActionManager; class SponsoredMessages; +class Reactions; class ChatFilters; class CloudThemes; class Streaming; @@ -113,6 +114,10 @@ public: [[nodiscard]] SponsoredMessages &sponsoredMessages() const { return *_sponsoredMessages; } + [[nodiscard]] Reactions &reactions() const { + return *_reactions; + } + [[nodiscard]] MsgId nextNonHistoryEntryId() { return ++_nonHistoryEntryId; } @@ -962,15 +967,17 @@ private: uint64 _wallpapersHash = 0; Groups _groups; - std::unique_ptr _chatsFilters; + const std::unique_ptr _chatsFilters; std::unique_ptr _scheduledMessages; - std::unique_ptr _cloudThemes; - std::unique_ptr _sendActionManager; - std::unique_ptr _streaming; - std::unique_ptr _mediaRotation; - std::unique_ptr _histories; - std::unique_ptr _stickers; + const std::unique_ptr _cloudThemes; + const std::unique_ptr _sendActionManager; + const std::unique_ptr _streaming; + const std::unique_ptr _mediaRotation; + const std::unique_ptr _histories; + const std::unique_ptr _stickers; std::unique_ptr _sponsoredMessages; + const std::unique_ptr _reactions; + MsgId _nonHistoryEntryId = ServerMaxMsgId; rpl::lifetime _lifetime; diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index 9a664f70a..953f55ea7 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -1698,9 +1698,10 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { auto reactionMenu = std::make_unique( this, st::reactionMenu); - for (const auto &text : Data::MessageReactions::SuggestList()) { - reactionMenu->addAction(text, [=] { - item->addReaction(text); + auto &reactions = item->history()->owner().reactions(); + for (const auto &entry : reactions.list(item->history()->peer)) { + reactionMenu->addAction(entry.emoji, [=] { + item->addReaction(entry.emoji); }); } _menu->addAction("Reaction", std::move(reactionMenu)); @@ -3789,7 +3790,7 @@ not_null HistoryInner::ElementDelegate() { Instance->elementShowReactions(view); } } - + }; static Result result; diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index 821066edb..acb67cf39 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -745,7 +745,7 @@ bool HistoryItem::suggestDeleteAllReport() const { } bool HistoryItem::canReact() const { - return IsServerMsgId(id) && !out() && !_history->peer->isSelf(); + return isRegular(); } void HistoryItem::addReaction(const QString &reaction) { diff --git a/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp b/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp index e8beb806b..b75f5023a 100644 --- a/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp +++ b/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp @@ -213,11 +213,6 @@ int BottomInfo::resizeToWidth(int newWidth) { } void BottomInfo::layout() { - //const auto good = ::Data::MessageReactions::SuggestList(); - //for (const auto &item : good) { - // _data.reactions.emplace(item, rand_value() + 1); - //} - layoutDateText(); layoutViewsText(); layoutRepliesText(); From 57cb921bb99280eda831140c40bbe0329bf3400a Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 7 Dec 2021 15:24:18 +0400 Subject: [PATCH 056/173] For testing show self reaction in bold. --- .../history/view/history_view_bottom_info.cpp | 24 ++++++++++++------- .../history/view/history_view_bottom_info.h | 1 + 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp b/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp index b75f5023a..68e21cfa2 100644 --- a/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp +++ b/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp @@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/chat/message_bubble.h" #include "ui/chat/chat_style.h" #include "ui/text/text_options.h" +#include "ui/text/text_utilities.h" #include "lang/lang_keys.h" #include "history/history_item_components.h" #include "history/history_message.h" @@ -283,18 +284,24 @@ void BottomInfo::layoutReactionsText() { }) | ranges::to_vector; ranges::sort(sorted, std::greater<>(), &std::pair::second); - auto fullCount = 0; - auto text = QString(); + auto text = TextWithEntities(); for (const auto &[string, count] : sorted) { - //for (auto i = 0, n = rand_value() % 8 + 1; i != n; ++i) { - // text.append(string); - //} + if (!text.text.isEmpty()) { + text.append(" - "); + } + const auto chosen = (_data.chosenReaction == string); text.append(string); - fullCount += count; + if (_data.chosenReaction == string) { + text.append(Ui::Text::Bold(QString::number(count))); + } else { + text.append(QString::number(count)); + } } - text += QString::number(fullCount); - _reactions.setText(st::msgDateTextStyle, text, Ui::NameTextOptions()); + _reactions.setMarkedText( + st::msgDateTextStyle, + text, + Ui::NameTextOptions()); } void BottomInfo::countOptimalSize() { @@ -327,6 +334,7 @@ BottomInfo::Data BottomInfoDataFromMessage(not_null message) { const auto item = message->message(); result.date = message->dateTime(); result.reactions = item->reactions(); + result.chosenReaction = item->chosenReaction(); if (message->hasOutLayout()) { result.flags |= Flag::OutLayout; } diff --git a/Telegram/SourceFiles/history/view/history_view_bottom_info.h b/Telegram/SourceFiles/history/view/history_view_bottom_info.h index 5c8ab24fa..002bb4fdb 100644 --- a/Telegram/SourceFiles/history/view/history_view_bottom_info.h +++ b/Telegram/SourceFiles/history/view/history_view_bottom_info.h @@ -38,6 +38,7 @@ public: QDateTime date; QString author; base::flat_map reactions; + QString chosenReaction; std::optional views; std::optional replies; Flags flags; From 3aacd15ef2594f161872ebe841cdd7613bf1d44e Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 7 Dec 2021 17:44:15 +0400 Subject: [PATCH 057/173] Use HistoryView::Object in BottomInfo. --- .../history/view/history_view_bottom_info.cpp | 68 ++++++++----------- .../history/view/history_view_bottom_info.h | 13 ++-- .../history/view/history_view_message.cpp | 18 ++--- .../history/view/history_view_object.h | 15 ++-- 4 files changed, 55 insertions(+), 59 deletions(-) diff --git a/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp b/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp index 68e21cfa2..024601f31 100644 --- a/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp +++ b/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp @@ -33,25 +33,17 @@ void BottomInfo::update(Data &&data, Context &&context, int availableWidth) { _data = std::move(data); _context = std::move(context); layout(); - if (!_size.isEmpty()) { - resizeToWidth(std::min(optimalSize().width(), availableWidth)); + if (width() > 0) { + resizeGetHeight(std::min(maxWidth(), availableWidth)); } } -QSize BottomInfo::optimalSize() const { - return _optimalSize; -} - -QSize BottomInfo::size() const { - return _size; -} - int BottomInfo::firstLineWidth() const { - if (_size.height() == _optimalSize.height()) { - return _size.width(); + if (height() == minHeight()) { + return width(); } const auto reactionsWidth = _reactions.maxWidth(); - const auto noReactionsWidth = _optimalSize.width() + const auto noReactionsWidth = maxWidth() - st::historyReactionsSkip - reactionsWidth; return noReactionsWidth; @@ -63,24 +55,24 @@ TextState BottomInfo::textState( auto result = TextState(item); if (!_reactions.isEmpty()) { const auto reactionsPosition = [&] { - if (_size.height() == _optimalSize.height()) { + if (height() == minHeight()) { return QPoint(0, 0); } - const auto available = _size.width(); + const auto available = width(); const auto use = std::min(available, _reactions.maxWidth()); - return QPoint(_size.width() - use, st::msgDateFont->height); + return QPoint(width() - use, st::msgDateFont->height); }(); const auto state = _reactions.getStateLeft( position - reactionsPosition, - std::min(_size.width(), _reactions.maxWidth()), - _size.width()); + std::min(width(), _reactions.maxWidth()), + width()); if (state.uponSymbol) { result.link = _context.reactions; return result; } } const auto inTime = QRect( - _size.width() - _dateWidth, + width() - _dateWidth, 0, _dateWidth, st::msgDateFont->height @@ -106,7 +98,7 @@ void BottomInfo::paint( const auto sti = context.imageStyle(); const auto stm = context.messageStyle(); - auto right = position.x() + _size.width(); + auto right = position.x() + width(); const auto firstLineBottom = position.y() + st::msgDateFont->height; if (_data.flags & Data::Flag::OutLayout) { const auto &icon = (_data.flags & Data::Flag::Sending) @@ -177,7 +169,7 @@ void BottomInfo::paint( outerWidth); } if (!_reactions.isEmpty()) { - if (_size.height() == _optimalSize.height()) { + if (height() == minHeight()) { _reactions.drawLeft( p, position.x(), @@ -185,11 +177,11 @@ void BottomInfo::paint( _reactions.maxWidth(), outerWidth); } else { - const auto available = _size.width(); + const auto available = width(); const auto use = std::min(available, _reactions.maxWidth()); _reactions.drawLeft( p, - position.x() + _size.width() - use, + position.x() + width() - use, position.y() + st::msgDateFont->height, use, outerWidth); @@ -197,20 +189,18 @@ void BottomInfo::paint( } } -int BottomInfo::resizeToWidth(int newWidth) { - if (newWidth >= _optimalSize.width()) { - _size = _optimalSize; - } else { - const auto reactionsWidth = _reactions.maxWidth(); - const auto noReactionsWidth = _optimalSize.width() - - st::historyReactionsSkip - - reactionsWidth; - accumulate_min(newWidth, std::max(noReactionsWidth, reactionsWidth)); - _size = QSize( - newWidth, - st::msgDateFont->height + _reactions.countHeight(newWidth)); +QSize BottomInfo::countCurrentSize(int newWidth) { + if (newWidth >= maxWidth()) { + return optimalSize(); } - return _size.height(); + const auto reactionsWidth = _reactions.maxWidth(); + const auto noReactionsWidth = maxWidth() + - st::historyReactionsSkip + - reactionsWidth; + accumulate_min(newWidth, std::max(noReactionsWidth, reactionsWidth)); + return QSize( + newWidth, + st::msgDateFont->height + _reactions.countHeight(newWidth)); } void BottomInfo::layout() { @@ -218,7 +208,7 @@ void BottomInfo::layout() { layoutViewsText(); layoutRepliesText(); layoutReactionsText(); - countOptimalSize(); + initDimensions(); } void BottomInfo::layoutDateText() { @@ -304,7 +294,7 @@ void BottomInfo::layoutReactionsText() { Ui::NameTextOptions()); } -void BottomInfo::countOptimalSize() { +QSize BottomInfo::countOptimalSize() { auto width = 0; if (_data.flags & (Data::Flag::OutLayout | Data::Flag::Sending)) { width += st::historySendStateSpace; @@ -323,7 +313,7 @@ void BottomInfo::countOptimalSize() { if (!_reactions.isEmpty()) { width += st::historyReactionsSkip + _reactions.maxWidth(); } - _optimalSize = QSize(width, st::msgDateFont->height); + return QSize(width, st::msgDateFont->height); } BottomInfo::Data BottomInfoDataFromMessage(not_null message) { diff --git a/Telegram/SourceFiles/history/view/history_view_bottom_info.h b/Telegram/SourceFiles/history/view/history_view_bottom_info.h index 002bb4fdb..eabb216df 100644 --- a/Telegram/SourceFiles/history/view/history_view_bottom_info.h +++ b/Telegram/SourceFiles/history/view/history_view_bottom_info.h @@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once +#include "history/view/history_view_object.h" #include "ui/text/text.h" #include "base/flags.h" @@ -21,7 +22,7 @@ using PaintContext = Ui::ChatPaintContext; class Message; struct TextState; -class BottomInfo { +class BottomInfo final : public Object { public: struct Data { enum class Flag { @@ -50,8 +51,6 @@ public: void update(Data &&data, Context &&context, int availableWidth); - [[nodiscard]] QSize optimalSize() const; - [[nodiscard]] QSize size() const; [[nodiscard]] int firstLineWidth() const; [[nodiscard]] TextState textState( not_null item, @@ -66,20 +65,18 @@ public: bool inverted, const PaintContext &context) const; - int resizeToWidth(int newWidth); - private: void layout(); void layoutDateText(); void layoutViewsText(); void layoutRepliesText(); void layoutReactionsText(); - void countOptimalSize(); + + QSize countOptimalSize() override; + QSize countCurrentSize(int newWidth) override; Data _data; Context _context; - QSize _optimalSize; - QSize _size; Ui::Text::String _authorEditedDate; Ui::Text::String _views; Ui::Text::String _replies; diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index 1568ee571..ed23925da 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -610,7 +610,7 @@ void Message::draw(Painter &p, const PaintContext &context) const { auto trect = inner.marginsRemoved(st::msgPadding); if (_viewButton) { const auto belowInfo = _viewButton->belowMessageInfo(); - const auto infoHeight = _bottomInfo.size().height(); + const auto infoHeight = _bottomInfo.height(); const auto heightMargins = QMargins(0, 0, 0, infoHeight); _viewButton->draw( p, @@ -642,7 +642,8 @@ void Message::draw(Painter &p, const PaintContext &context) const { trect.setHeight(trect.height() - entry->height()); } if (needDrawInfo) { - trect.setHeight(trect.height() - (_bottomInfo.size().height() - st::msgDateFont->height)); + trect.setHeight(trect.height() + - (_bottomInfo.height() - st::msgDateFont->height)); } paintText(p, trect, context); if (mediaDisplayed) { @@ -1219,7 +1220,7 @@ TextState Message::textState( } if (_viewButton) { const auto belowInfo = _viewButton->belowMessageInfo(); - const auto infoHeight = _bottomInfo.size().height(); + const auto infoHeight = _bottomInfo.height(); const auto heightMargins = QMargins(0, 0, 0, infoHeight); if (_viewButton->getState( point, @@ -1765,7 +1766,7 @@ void Message::drawInfo( break; } - const auto size = _bottomInfo.size(); + const auto size = _bottomInfo.currentSize(); const auto dateX = infoRight - size.width(); const auto dateY = infoBottom - size.height(); if (type == InfoDisplayType::Image) { @@ -1807,7 +1808,7 @@ TextState Message::bottomInfoTextState( infoBottom -= st::msgDateImgPadding.y(); break; } - const auto size = _bottomInfo.size(); + const auto size = _bottomInfo.currentSize(); const auto infoLeft = infoRight - size.width(); const auto infoTop = infoBottom - size.height(); return _bottomInfo.textState( @@ -1828,12 +1829,13 @@ bool Message::isSignedAuthorElided() const { } void Message::itemDataChanged() { - const auto was = _bottomInfo.size(); + const auto wasInfo = _bottomInfo.currentSize(); _bottomInfo.update( BottomInfoDataFromMessage(this), BottomInfoContextFromMessage(this), width()); - if (was != _bottomInfo.size()) { + const auto nowInfo = _bottomInfo.currentSize(); + if (wasInfo != nowInfo) { history()->owner().requestViewResize(this); } else { history()->owner().requestViewRepaint(this); @@ -2488,7 +2490,7 @@ int Message::resizeContentGetHeight(int newWidth) { } } } - const auto bottomInfoHeight = _bottomInfo.resizeToWidth( + const auto bottomInfoHeight = _bottomInfo.resizeGetHeight( std::min( _bottomInfo.optimalSize().width(), contentWidth - st::msgPadding.left() - st::msgPadding.right() - 2 * st::msgDateDelta.x())); diff --git a/Telegram/SourceFiles/history/view/history_view_object.h b/Telegram/SourceFiles/history/view/history_view_object.h index 2e0ac67fd..9072b90be 100644 --- a/Telegram/SourceFiles/history/view/history_view_object.h +++ b/Telegram/SourceFiles/history/view/history_view_object.h @@ -23,16 +23,23 @@ public: return _height; } - int maxWidth() const { + [[nodiscard]] QSize optimalSize() const { + return { _maxWidth, _minHeight }; + } + [[nodiscard]] QSize currentSize() const { + return { _width, _height }; + } + + [[nodiscard]] int maxWidth() const { return _maxWidth; } - int minHeight() const { + [[nodiscard]] int minHeight() const { return _minHeight; } - int width() const { + [[nodiscard]] int width() const { return _width; } - int height() const { + [[nodiscard]] int height() const { return _height; } From 535fd8d52386a726f2222cd6b30588f570d018c3 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 8 Dec 2021 09:28:17 +0400 Subject: [PATCH 058/173] Display reactions outside bottom info in groups. --- Telegram/CMakeLists.txt | 2 + Telegram/SourceFiles/data/data_session.cpp | 4 +- .../history/history_inner_widget.cpp | 13 +- .../history/view/history_view_bottom_info.cpp | 6 +- .../history/view/history_view_message.cpp | 172 +++++++++++++++--- .../history/view/history_view_message.h | 9 +- .../history/view/history_view_reactions.cpp | 104 +++++++++++ .../history/view/history_view_reactions.h | 55 ++++++ .../view/media/history_view_media_grouped.cpp | 3 + 9 files changed, 328 insertions(+), 40 deletions(-) create mode 100644 Telegram/SourceFiles/history/view/history_view_reactions.cpp create mode 100644 Telegram/SourceFiles/history/view/history_view_reactions.h diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index 453056f6a..5d367d577 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -652,6 +652,8 @@ 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_reactions.cpp + history/view/history_view_reactions.h history/view/history_view_replies_section.cpp history/view/history_view_replies_section.h history/view/history_view_requests_bar.cpp diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index b3777dee5..e991581b7 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -655,7 +655,7 @@ not_null Session::processChat(const MTPChat &data) { && chat->groupCall()->fullCount() > 0)) ? Flag::CallNotEmpty : Flag()) - | (data.is_noforwards() ? Flag::NoForwards : Flag()); + | (data.is_noforwards() ? Flag() : Flag()); AssertIsDebug(); chat->setFlags((chat->flags() & ~flagsMask) | flagsSet); chat->count = data.vparticipants_count().v; @@ -765,7 +765,7 @@ not_null Session::processChat(const MTPChat &data) { ? (data.is_left() ? Flag::Left : Flag()) | (data.is_creator() ? Flag::Creator : Flag()) : Flag()) - | (data.is_noforwards() ? Flag::NoForwards : Flag()); + | (data.is_noforwards() ? Flag() : Flag()); AssertIsDebug(); channel->setFlags((channel->flags() & ~flagsMask) | flagsSet); channel->setName( diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index 953f55ea7..284b69902 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -1699,12 +1699,15 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { this, st::reactionMenu); auto &reactions = item->history()->owner().reactions(); - for (const auto &entry : reactions.list(item->history()->peer)) { - reactionMenu->addAction(entry.emoji, [=] { - item->addReaction(entry.emoji); - }); + const auto &list = reactions.list(item->history()->peer); + if (!list.empty()) { + for (const auto &entry : list) { + reactionMenu->addAction(entry.emoji, [=] { + item->addReaction(entry.emoji); + }); + } + _menu->addAction("Reaction", std::move(reactionMenu)); } - _menu->addAction("Reaction", std::move(reactionMenu)); } if (canSendMessages) { _menu->addAction(tr::lng_context_reply_msg(tr::now), [=] { diff --git a/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp b/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp index 024601f31..249468b36 100644 --- a/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp +++ b/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp @@ -323,8 +323,10 @@ BottomInfo::Data BottomInfoDataFromMessage(not_null message) { const auto item = message->message(); result.date = message->dateTime(); - result.reactions = item->reactions(); - result.chosenReaction = item->chosenReaction(); + if (message->embedReactionsInBottomInfo()) { + result.reactions = item->reactions(); + result.chosenReaction = item->chosenReaction(); + } if (message->hasOutLayout()) { result.flags |= Flag::OutLayout; } diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index ed23925da..8df8d76af 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -13,6 +13,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/history_message.h" #include "history/view/media/history_view_media.h" #include "history/view/media/history_view_web_page.h" +#include "history/view/history_view_reactions.h" #include "history/view/history_view_group_call_bar.h" // UserpicInRow. #include "history/view/history_view_view_button.h" // ViewButton. #include "history/history.h" @@ -247,6 +248,7 @@ Message::Message( BottomInfoContextFromMessage(this)) { initLogEntryOriginal(); initPsa(); + refreshReactions(); } Message::~Message() { @@ -319,8 +321,13 @@ QSize Message::performCountOptimalSize() { updateViewButtonExistence(); updateMediaInBubbleState(); refreshRightBadge(); - initTime(); + refreshInfoSkipBlock(); + const auto displayInfo = needInfoDisplay(); + const auto reactionsInBubble = _reactions && displayInfo; + if (_reactions) { + _reactions->initDimensions(); + } if (drawBubble()) { const auto forwarded = item->Get(); const auto reply = displayedReply(); @@ -345,22 +352,19 @@ QSize Message::performCountOptimalSize() { // Entry page is always a bubble bottom. auto mediaOnBottom = (mediaDisplayed && media->isBubbleBottom()) || (entry/* && entry->isBubbleBottom()*/); auto mediaOnTop = (mediaDisplayed && media->isBubbleTop()) || (entry && entry->isBubbleTop()); - - if (mediaOnBottom || (mediaDisplayed && _viewButton)) { - if (item->_text.removeSkipBlock()) { - item->_textWidth = -1; - item->_textHeight = 0; - } - } else if (item->_text.updateSkipBlock(skipBlockWidth(), skipBlockHeight())) { - item->_textWidth = -1; - item->_textHeight = 0; - } - maxWidth = plainMaxWidth(); if (context() == Context::Replies && item->isDiscussionPost()) { maxWidth = std::max(maxWidth, st::msgMaxWidth); } minHeight = hasVisibleText() ? item->_text.minHeight() : 0; + if (reactionsInBubble) { + accumulate_max(maxWidth, std::min( + st::msgMaxWidth, + (st::msgPadding.left() + + _reactions->maxWidth() + + st::msgPadding.right()))); + minHeight += st::mediaInBubbleSkip + _reactions->minHeight(); + } if (!mediaOnBottom) { minHeight += st::msgPadding.bottom(); if (mediaDisplayed) minHeight += st::mediaInBubbleSkip; @@ -374,9 +378,17 @@ QSize Message::performCountOptimalSize() { // Parts don't participate in maxWidth() in case of media message. if (media->enforceBubbleWidth()) { maxWidth = media->maxWidth(); + const auto innerWidth = maxWidth + - st::msgPadding.left() + - st::msgPadding.right(); if (hasVisibleText() && maxWidth < plainMaxWidth()) { minHeight -= item->_text.minHeight(); - minHeight += item->_text.countHeight(maxWidth - st::msgPadding.left() - st::msgPadding.right()); + minHeight += item->_text.countHeight(innerWidth); + } + if (reactionsInBubble) { + minHeight -= _reactions->minHeight(); + minHeight + += _reactions->countCurrentSize(innerWidth).height(); } } else { accumulate_max(maxWidth, media->maxWidth()); @@ -441,6 +453,13 @@ QSize Message::performCountOptimalSize() { maxWidth = st::msgMinWidth; minHeight = 0; } + if (_reactions && !reactionsInBubble) { + // if we have a text bubble we can resize it to fit the keyboard + // but if we have only media we don't do that + if (hasVisibleText()) { + accumulate_max(maxWidth, _reactions->maxWidth()); + } + } if (const auto markup = item->inlineReplyMarkup()) { if (!markup->inlineKeyboard) { markup->inlineKeyboard = std::make_unique( @@ -518,6 +537,9 @@ void Message::draw(Painter &p, const PaintContext &context) const { auto mediaOnBottom = (mediaDisplayed && media->isBubbleBottom()) || (entry/* && entry->isBubbleBottom()*/); auto mediaOnTop = (mediaDisplayed && media->isBubbleTop()) || (entry && entry->isBubbleTop()); + const auto displayInfo = needInfoDisplay(); + const auto reactionsInBubble = _reactions && displayInfo; + auto mediaSelectionIntervals = (!context.selected() && mediaDisplayed) ? media->getBubbleSelectionIntervals(context.selection) : std::vector(); @@ -531,6 +553,9 @@ void Message::draw(Painter &p, const PaintContext &context) const { if (_viewButton) { localMediaBottom -= st::mediaInBubbleSkip + _viewButton->height(); } + if (reactionsInBubble) { + localMediaBottom -= st::mediaInBubbleSkip + _reactions->height(); + } if (!mediaOnBottom) { localMediaBottom -= st::msgPadding.bottom(); } @@ -562,14 +587,23 @@ void Message::draw(Painter &p, const PaintContext &context) const { auto keyboard = item->inlineReplyKeyboard(); if (keyboard) { - auto keyboardHeight = st::msgBotKbButton.margin + keyboard->naturalHeight(); + const auto keyboardHeight = st::msgBotKbButton.margin + keyboard->naturalHeight(); g.setHeight(g.height() - keyboardHeight); - auto keyboardPosition = QPoint(g.left(), g.top() + g.height() + st::msgBotKbButton.margin); + const auto keyboardPosition = QPoint(g.left(), g.top() + g.height() + st::msgBotKbButton.margin); p.translate(keyboardPosition); keyboard->paint(p, context.st, g.width(), context.clip.translated(-keyboardPosition)); p.translate(-keyboardPosition); } + if (_reactions && !reactionsInBubble) { + const auto reactionsHeight = st::mediaInBubbleSkip + _reactions->height(); + g.setHeight(g.height() - reactionsHeight); + const auto reactionsPosition = QPoint(g.left(), g.top() + g.height() + st::mediaInBubbleSkip); + p.translate(reactionsPosition); + _reactions->paint(p, context.st, g.width(), context.clip.translated(-reactionsPosition)); + p.translate(-reactionsPosition); + } + if (bubble) { if (displayFromName() && item->displayFrom() @@ -606,7 +640,6 @@ void Message::draw(Painter &p, const PaintContext &context) const { auto inner = g; paintCommentsButton(p, inner, context); - const auto needDrawInfo = needInfoDisplay(); auto trect = inner.marginsRemoved(st::msgPadding); if (_viewButton) { const auto belowInfo = _viewButton->belowMessageInfo(); @@ -627,6 +660,15 @@ void Message::draw(Painter &p, const PaintContext &context) const { } } + if (reactionsInBubble) { + const auto reactionsHeight = st::mediaInBubbleSkip + _reactions->height(); + trect.setHeight(trect.height() - reactionsHeight); + const auto reactionsPosition = QPoint(trect.left(), trect.top() + trect.height() + st::mediaInBubbleSkip); + p.translate(reactionsPosition); + _reactions->paint(p, context.st, g.width(), context.clip.translated(-reactionsPosition)); + p.translate(-reactionsPosition); + } + if (mediaOnBottom) { trect.setHeight(trect.height() + st::msgPadding.bottom()); } @@ -641,7 +683,7 @@ void Message::draw(Painter &p, const PaintContext &context) const { if (entry) { trect.setHeight(trect.height() - entry->height()); } - if (needDrawInfo) { + if (displayInfo) { trect.setHeight(trect.height() - (_bottomInfo.height() - st::msgDateFont->height)); } @@ -671,7 +713,7 @@ void Message::draw(Painter &p, const PaintContext &context) const { entry->draw(p, entryContext); p.translate(-entryLeft, -entryTop); } - if (needDrawInfo) { + if (displayInfo) { const auto bottomSelected = context.selected() || (!mediaSelectionIntervals.empty() && (mediaSelectionIntervals.back().top @@ -1030,6 +1072,7 @@ PointState Message::pointState(QPoint point) const { const auto media = this->media(); const auto item = message(); + const auto reactionsInBubble = _reactions && needInfoDisplay(); if (drawBubble()) { if (!g.contains(point)) { return PointState::Outside; @@ -1052,6 +1095,11 @@ PointState Message::pointState(QPoint point) const { trect.setHeight(trect.height() - st::mediaInBubbleSkip); } } + if (reactionsInBubble) { + const auto reactionsHeight = st::mediaInBubbleSkip + + _reactions->height(); + trect.setHeight(trect.height() - reactionsHeight); + } if (mediaOnBottom) { trect.setHeight(trect.height() + st::msgPadding.bottom()); } @@ -1198,6 +1246,7 @@ TextState Message::textState( return result; } + const auto reactionsInBubble = _reactions && needInfoDisplay(); auto keyboard = item->inlineReplyKeyboard(); auto keyboardHeight = 0; if (keyboard) { @@ -1242,6 +1291,11 @@ TextState Message::textState( trect.setHeight(trect.height() - st::mediaInBubbleSkip); } } + if (reactionsInBubble) { + const auto reactionsHeight = _reactions->height() + + st::mediaInBubbleSkip; + trect.setHeight(trect.height() - reactionsHeight); + } if (mediaOnBottom) { trect.setHeight(trect.height() + st::msgPadding.bottom() @@ -1828,14 +1882,38 @@ bool Message::isSignedAuthorElided() const { return _bottomInfo.isSignedAuthorElided(); } +bool Message::embedReactionsInBottomInfo() const { + return data()->history()->peer->isUser(); +} + +void Message::refreshReactions() { + const auto item = data(); + const auto &list = item->reactions(); + if (list.empty() || embedReactionsInBottomInfo()) { + _reactions = nullptr; + } else if (!_reactions) { + _reactions = std::make_unique( + ReactionsDataFromMessage(this)); + } else { + _reactions->update(ReactionsDataFromMessage(this), width()); + } +} + void Message::itemDataChanged() { const auto wasInfo = _bottomInfo.currentSize(); + const auto wasReactions = _reactions + ? _reactions->currentSize() + : QSize(); + refreshReactions(); _bottomInfo.update( BottomInfoDataFromMessage(this), BottomInfoContextFromMessage(this), width()); const auto nowInfo = _bottomInfo.currentSize(); - if (wasInfo != nowInfo) { + const auto nowReactions = _reactions + ? _reactions->currentSize() + : QSize(); + if (wasInfo != nowInfo || wasReactions != nowReactions) { history()->owner().requestViewResize(this); } else { history()->owner().requestViewRepaint(this); @@ -2305,7 +2383,9 @@ void Message::updateMediaInBubbleState() { const auto item = message(); const auto media = this->media(); - auto mediaHasSomethingBelow = (_viewButton != nullptr); + const auto reactionsInBubble = (_reactions && needInfoDisplay()); + auto mediaHasSomethingBelow = (_viewButton != nullptr) + || reactionsInBubble; auto mediaHasSomethingAbove = false; auto getMediaHasSomethingAbove = [&] { return displayFromName() @@ -2490,10 +2570,13 @@ int Message::resizeContentGetHeight(int newWidth) { } } } + const auto textWidth = qMax(contentWidth - st::msgPadding.left() - st::msgPadding.right(), 1); + const auto displayInfo = needInfoDisplay(); + const auto reactionsInBubble = _reactions && displayInfo; const auto bottomInfoHeight = _bottomInfo.resizeGetHeight( std::min( _bottomInfo.optimalSize().width(), - contentWidth - st::msgPadding.left() - st::msgPadding.right() - 2 * st::msgDateDelta.x())); + textWidth - 2 * st::msgDateDelta.x())); if (bubble) { auto reply = displayedReply(); @@ -2504,6 +2587,10 @@ int Message::resizeContentGetHeight(int newWidth) { auto mediaOnBottom = (mediaDisplayed && media->isBubbleBottom()) || (entry/* && entry->isBubbleBottom()*/); auto mediaOnTop = (mediaDisplayed && media->isBubbleTop()) || (entry && entry->isBubbleTop()); + if (reactionsInBubble) { + _reactions->resizeGetHeight(textWidth); + } + if (contentWidth == maxWidth()) { if (mediaDisplayed) { if (entry) { @@ -2515,7 +2602,6 @@ int Message::resizeContentGetHeight(int newWidth) { } } else { if (hasVisibleText()) { - auto textWidth = qMax(contentWidth - st::msgPadding.left() - st::msgPadding.right(), 1); if (textWidth != item->_textWidth) { item->_textWidth = textWidth; item->_textHeight = item->_text.countHeight(textWidth); @@ -2541,6 +2627,9 @@ int Message::resizeContentGetHeight(int newWidth) { } else if (entry) { newHeight += entry->resizeGetHeight(contentWidth); } + if (reactionsInBubble) { + newHeight += st::mediaInBubbleSkip + _reactions->height(); + } } if (displayFromName()) { @@ -2564,7 +2653,7 @@ int Message::resizeContentGetHeight(int newWidth) { reply->resize(contentWidth - st::msgPadding.left() - st::msgPadding.right()); newHeight += st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom(); } - if (needInfoDisplay()) { + if (displayInfo) { newHeight += (bottomInfoHeight - st::msgDateFont->height); } @@ -2577,6 +2666,9 @@ int Message::resizeContentGetHeight(int newWidth) { } else { newHeight = 0; } + if (_reactions && !reactionsInBubble) { + newHeight += st::mediaInBubbleSkip + _reactions->resizeGetHeight(contentWidth); + } if (const auto keyboard = item->inlineReplyKeyboard()) { const auto keyboardHeight = st::msgBotKbButton.margin + keyboard->naturalHeight(); newHeight += keyboardHeight; @@ -2591,9 +2683,6 @@ bool Message::needInfoDisplay() const { const auto media = this->media(); const auto mediaDisplayed = media ? media->isDisplayed() : false; const auto entry = logEntryOriginal(); - - // Entry page is always a bubble bottom. - const auto mediaOnBottom = (mediaDisplayed && media->isBubbleBottom()) || (entry/* && entry->isBubbleBottom()*/); return entry ? !entry->customInfoLayout() : (mediaDisplayed @@ -2615,13 +2704,38 @@ QSize Message::performCountCurrentSize(int newWidth) { return { newWidth, newHeight }; } -void Message::initTime() const { +void Message::refreshInfoSkipBlock() { const auto item = message(); - if (item->_text.hasSkipBlock()) { - if (item->_text.updateSkipBlock(skipBlockWidth(), skipBlockHeight())) { + const auto media = this->media(); + const auto hasTextSkipBlock = [&] { + if (item->_text.isEmpty()) { + return false; + } else if (item->Has()) { + return false; + } else if (media && media->isDisplayed()) { + return false; + } else if (_reactions) { + return false; + } + return true; + }(); + const auto skipWidth = skipBlockWidth(); + const auto skipHeight = skipBlockHeight(); + if (_reactions) { + if (needInfoDisplay()) { + _reactions->updateSkipBlock(skipWidth, skipHeight); + } else { + _reactions->removeSkipBlock(); + } + } + if (!hasTextSkipBlock) { + if (item->_text.removeSkipBlock()) { item->_textWidth = -1; item->_textHeight = 0; } + } else if (item->_text.updateSkipBlock(skipWidth, skipHeight)) { + item->_textWidth = -1; + item->_textHeight = 0; } } diff --git a/Telegram/SourceFiles/history/view/history_view_message.h b/Telegram/SourceFiles/history/view/history_view_message.h index d538e9449..0d4803fae 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.h +++ b/Telegram/SourceFiles/history/view/history_view_message.h @@ -19,6 +19,7 @@ struct HistoryMessageForwarded; namespace HistoryView { class ViewButton; +class Reactions; class WebPage; // Special type of Component for the channel actions log. @@ -56,6 +57,8 @@ public: [[nodiscard]] const HistoryMessageEdited *displayedEditBadge() const; [[nodiscard]] HistoryMessageEdited *displayedEditBadge(); + [[nodiscard]] bool embedReactionsInBottomInfo() const; + int marginTop() const override; int marginBottom() const override; void draw(Painter &p, const PaintContext &context) const override; @@ -211,7 +214,7 @@ private: [[nodiscard]] ClickHandlerPtr fastReplyLink() const; [[nodiscard]] bool displayPinIcon() const; - void initTime() const; + void refreshInfoSkipBlock(); [[nodiscard]] int plainMaxWidth() const; [[nodiscard]] int monospaceMaxWidth() const; @@ -225,11 +228,13 @@ private: void psaTooltipToggled(bool shown) const; void refreshRightBadge(); + void refreshReactions(); mutable ClickHandlerPtr _rightActionLink; mutable ClickHandlerPtr _fastReplyLink; - mutable std::unique_ptr _comments; mutable std::unique_ptr _viewButton; + std::unique_ptr _reactions; + mutable std::unique_ptr _comments; Ui::Text::String _rightBadge; int _bubbleWidthLimit = 0; diff --git a/Telegram/SourceFiles/history/view/history_view_reactions.cpp b/Telegram/SourceFiles/history/view/history_view_reactions.cpp new file mode 100644 index 000000000..0c3aa7c71 --- /dev/null +++ b/Telegram/SourceFiles/history/view/history_view_reactions.cpp @@ -0,0 +1,104 @@ +/* +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 "history/view/history_view_reactions.h" + +#include "history/view/history_view_message.h" +#include "history/history_message.h" +#include "ui/text/text_options.h" +#include "ui/text/text_utilities.h" + +namespace HistoryView { + +Reactions::Reactions(Data &&data) +: _data(std::move(data)) +, _reactions(st::msgMinWidth / 2) { + layout(); +} + +void Reactions::update(Data &&data, int availableWidth) { + _data = std::move(data); + layout(); + if (width() > 0) { + resizeGetHeight(std::min(maxWidth(), availableWidth)); + } +} + +void Reactions::updateSkipBlock(int width, int height) { + _reactions.updateSkipBlock(width, height); +} + +void Reactions::removeSkipBlock() { + _reactions.removeSkipBlock(); +} + +void Reactions::layout() { + layoutReactionsText(); + initDimensions(); +} + +void Reactions::layoutReactionsText() { + if (_data.reactions.empty()) { + _reactions.clear(); + return; + } + auto sorted = ranges::view::all( + _data.reactions + ) | ranges::view::transform([](const auto &pair) { + return std::make_pair(pair.first, pair.second); + }) | ranges::to_vector; + ranges::sort(sorted, std::greater<>(), &std::pair::second); + + auto text = TextWithEntities(); + for (const auto &[string, count] : sorted) { + if (!text.text.isEmpty()) { + text.append(" - "); + } + const auto chosen = (_data.chosenReaction == string); + text.append(string); + if (_data.chosenReaction == string) { + text.append(Ui::Text::Bold(QString::number(count))); + } else { + text.append(QString::number(count)); + } + } + + _reactions.setMarkedText( + st::msgDateTextStyle, + text, + Ui::NameTextOptions()); +} + +QSize Reactions::countOptimalSize() { + return QSize(_reactions.maxWidth(), _reactions.minHeight()); +} + +QSize Reactions::countCurrentSize(int newWidth) { + if (newWidth >= maxWidth()) { + return optimalSize(); + } + return { newWidth, _reactions.countHeight(newWidth) }; +} + +void Reactions::paint( + Painter &p, + const Ui::ChatStyle *st, + int outerWidth, + const QRect &clip) const { + _reactions.draw(p, 0, 0, outerWidth); +} + +Reactions::Data ReactionsDataFromMessage(not_null message) { + auto result = Reactions::Data(); + + const auto item = message->message(); + result.reactions = item->reactions(); + result.chosenReaction = item->chosenReaction(); + return result; +} + +} // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/history_view_reactions.h b/Telegram/SourceFiles/history/view/history_view_reactions.h new file mode 100644 index 000000000..af9075556 --- /dev/null +++ b/Telegram/SourceFiles/history/view/history_view_reactions.h @@ -0,0 +1,55 @@ +/* +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 "history/view/history_view_object.h" + +namespace Ui { +class ChatStyle; +} // namespace Ui + +namespace HistoryView { + +class Message; + +class Reactions final : public Object { +public: + struct Data { + base::flat_map reactions; + QString chosenReaction; + }; + + explicit Reactions(Data &&data); + + void update(Data &&data, int availableWidth); + QSize countCurrentSize(int newWidth) override; + + void updateSkipBlock(int width, int height); + void removeSkipBlock(); + + void paint( + Painter &p, + const Ui::ChatStyle *st, + int outerWidth, + const QRect &clip) const; + +private: + void layout(); + void layoutReactionsText(); + + QSize countOptimalSize() override; + + Data _data; + Ui::Text::String _reactions; + +}; + +[[nodiscard]] Reactions::Data ReactionsDataFromMessage( + not_null message); + +} // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/media/history_view_media_grouped.cpp b/Telegram/SourceFiles/history/view/media/history_view_media_grouped.cpp index f094bd6a7..b8eb4a658 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_media_grouped.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_media_grouped.cpp @@ -531,6 +531,9 @@ TextForMimeData GroupedMedia::selectedText( auto GroupedMedia::getBubbleSelectionIntervals( TextSelection selection) const -> std::vector { + if (_mode != Mode::Column) { + return {}; + } auto result = std::vector(); for (auto i = 0, count = int(_parts.size()); i != count; ++i) { const auto &part = _parts[i]; From 2c36623cfb7999281ebb3e703d5f58e60fd85ea6 Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 9 Dec 2021 21:56:24 +0400 Subject: [PATCH 059/173] Add some icons to popup menus. --- Telegram/Resources/icons/menu/add_account.png | Bin 0 -> 852 bytes .../Resources/icons/menu/add_account@2x.png | Bin 0 -> 1582 bytes .../Resources/icons/menu/add_account@3x.png | Bin 0 -> 2374 bytes Telegram/Resources/icons/menu/admin.png | Bin 0 -> 897 bytes Telegram/Resources/icons/menu/admin@2x.png | Bin 0 -> 1773 bytes Telegram/Resources/icons/menu/admin@3x.png | Bin 0 -> 2610 bytes .../Resources/icons/menu/admin_promote.png | Bin 0 -> 847 bytes .../Resources/icons/menu/admin_promote@2x.png | Bin 0 -> 1646 bytes .../Resources/icons/menu/admin_promote@3x.png | Bin 0 -> 2457 bytes Telegram/Resources/icons/menu/all_media.png | Bin 0 -> 542 bytes .../Resources/icons/menu/all_media@2x.png | Bin 0 -> 802 bytes .../Resources/icons/menu/all_media@3x.png | Bin 0 -> 1191 bytes Telegram/Resources/icons/menu/archive.png | Bin 0 -> 591 bytes Telegram/Resources/icons/menu/archive@2x.png | Bin 0 -> 926 bytes Telegram/Resources/icons/menu/archive@3x.png | Bin 0 -> 1395 bytes Telegram/Resources/icons/menu/block.png | Bin 0 -> 757 bytes Telegram/Resources/icons/menu/block@2x.png | Bin 0 -> 1416 bytes Telegram/Resources/icons/menu/block@3x.png | Bin 0 -> 2200 bytes Telegram/Resources/icons/menu/calendar.png | Bin 0 -> 495 bytes Telegram/Resources/icons/menu/calendar@2x.png | Bin 0 -> 726 bytes Telegram/Resources/icons/menu/calendar@3x.png | Bin 0 -> 925 bytes Telegram/Resources/icons/menu/cancel.png | Bin 0 -> 467 bytes Telegram/Resources/icons/menu/cancel@2x.png | Bin 0 -> 1025 bytes Telegram/Resources/icons/menu/cancel@3x.png | Bin 0 -> 1558 bytes Telegram/Resources/icons/menu/clear.png | Bin 0 -> 603 bytes Telegram/Resources/icons/menu/clear@2x.png | Bin 0 -> 1122 bytes Telegram/Resources/icons/menu/clear@3x.png | Bin 0 -> 1645 bytes Telegram/Resources/icons/menu/collapse.png | Bin 0 -> 450 bytes Telegram/Resources/icons/menu/collapse@2x.png | Bin 0 -> 614 bytes Telegram/Resources/icons/menu/collapse@3x.png | Bin 0 -> 749 bytes Telegram/Resources/icons/menu/colors.png | Bin 0 -> 837 bytes Telegram/Resources/icons/menu/colors@2x.png | Bin 0 -> 1593 bytes Telegram/Resources/icons/menu/colors@3x.png | Bin 0 -> 2388 bytes Telegram/Resources/icons/menu/copy.png | Bin 0 -> 463 bytes Telegram/Resources/icons/menu/copy@2x.png | Bin 0 -> 657 bytes Telegram/Resources/icons/menu/copy@3x.png | Bin 0 -> 1025 bytes Telegram/Resources/icons/menu/create_poll.png | Bin 0 -> 390 bytes .../Resources/icons/menu/create_poll@2x.png | Bin 0 -> 630 bytes .../Resources/icons/menu/create_poll@3x.png | Bin 0 -> 875 bytes Telegram/Resources/icons/menu/delete.png | Bin 0 -> 470 bytes Telegram/Resources/icons/menu/delete@2x.png | Bin 0 -> 837 bytes Telegram/Resources/icons/menu/delete@3x.png | Bin 0 -> 1229 bytes Telegram/Resources/icons/menu/discussion.png | Bin 0 -> 774 bytes .../Resources/icons/menu/discussion@2x.png | Bin 0 -> 1379 bytes .../Resources/icons/menu/discussion@3x.png | Bin 0 -> 2148 bytes Telegram/Resources/icons/menu/download.png | Bin 0 -> 394 bytes Telegram/Resources/icons/menu/download@2x.png | Bin 0 -> 660 bytes Telegram/Resources/icons/menu/download@3x.png | Bin 0 -> 893 bytes Telegram/Resources/icons/menu/edit.png | Bin 0 -> 440 bytes Telegram/Resources/icons/menu/edit@2x.png | Bin 0 -> 743 bytes Telegram/Resources/icons/menu/edit@3x.png | Bin 0 -> 951 bytes Telegram/Resources/icons/menu/expand.png | Bin 0 -> 450 bytes Telegram/Resources/icons/menu/expand@2x.png | Bin 0 -> 628 bytes Telegram/Resources/icons/menu/expand@3x.png | Bin 0 -> 763 bytes Telegram/Resources/icons/menu/export.png | Bin 0 -> 488 bytes Telegram/Resources/icons/menu/export@2x.png | Bin 0 -> 776 bytes Telegram/Resources/icons/menu/export@3x.png | Bin 0 -> 1078 bytes Telegram/Resources/icons/menu/favorite.png | Bin 0 -> 668 bytes Telegram/Resources/icons/menu/favorite@2x.png | Bin 0 -> 1255 bytes Telegram/Resources/icons/menu/favorite@3x.png | Bin 0 -> 1975 bytes Telegram/Resources/icons/menu/forward.png | Bin 0 -> 421 bytes Telegram/Resources/icons/menu/forward@2x.png | Bin 0 -> 644 bytes Telegram/Resources/icons/menu/forward@3x.png | Bin 0 -> 750 bytes Telegram/Resources/icons/menu/gif.png | Bin 0 -> 624 bytes Telegram/Resources/icons/menu/gif@2x.png | Bin 0 -> 1199 bytes Telegram/Resources/icons/menu/gif@3x.png | Bin 0 -> 1564 bytes Telegram/Resources/icons/menu/info.png | Bin 0 -> 528 bytes Telegram/Resources/icons/menu/info@2x.png | Bin 0 -> 1078 bytes Telegram/Resources/icons/menu/info@3x.png | Bin 0 -> 1660 bytes Telegram/Resources/icons/menu/invite.png | Bin 0 -> 664 bytes Telegram/Resources/icons/menu/invite@2x.png | Bin 0 -> 1225 bytes Telegram/Resources/icons/menu/invite@3x.png | Bin 0 -> 1739 bytes Telegram/Resources/icons/menu/leave.png | Bin 0 -> 555 bytes Telegram/Resources/icons/menu/leave@2x.png | Bin 0 -> 959 bytes Telegram/Resources/icons/menu/leave@3x.png | Bin 0 -> 1183 bytes Telegram/Resources/icons/menu/link.png | Bin 0 -> 595 bytes Telegram/Resources/icons/menu/link@2x.png | Bin 0 -> 753 bytes Telegram/Resources/icons/menu/link@3x.png | Bin 0 -> 1478 bytes Telegram/Resources/icons/menu/manage.png | Bin 0 -> 517 bytes Telegram/Resources/icons/menu/manage@2x.png | Bin 0 -> 630 bytes Telegram/Resources/icons/menu/manage@3x.png | Bin 0 -> 1165 bytes .../Resources/icons/menu/move_from_menu.png | Bin 0 -> 614 bytes .../icons/menu/move_from_menu@2x.png | Bin 0 -> 999 bytes .../icons/menu/move_from_menu@3x.png | Bin 0 -> 1428 bytes .../Resources/icons/menu/move_to_menu.png | Bin 0 -> 636 bytes .../Resources/icons/menu/move_to_menu@2x.png | Bin 0 -> 947 bytes .../Resources/icons/menu/move_to_menu@3x.png | Bin 0 -> 1429 bytes Telegram/Resources/icons/menu/mute.png | Bin 0 -> 765 bytes Telegram/Resources/icons/menu/mute@2x.png | Bin 0 -> 1359 bytes Telegram/Resources/icons/menu/mute@3x.png | Bin 0 -> 2127 bytes Telegram/Resources/icons/menu/permissions.png | Bin 0 -> 740 bytes .../Resources/icons/menu/permissions@2x.png | Bin 0 -> 1392 bytes .../Resources/icons/menu/permissions@3x.png | Bin 0 -> 1943 bytes Telegram/Resources/icons/menu/pin.png | Bin 0 -> 556 bytes Telegram/Resources/icons/menu/pin@2x.png | Bin 0 -> 887 bytes Telegram/Resources/icons/menu/pin@3x.png | Bin 0 -> 1349 bytes Telegram/Resources/icons/menu/profile.png | Bin 0 -> 795 bytes Telegram/Resources/icons/menu/profile@2x.png | Bin 0 -> 1419 bytes Telegram/Resources/icons/menu/profile@3x.png | Bin 0 -> 2264 bytes Telegram/Resources/icons/menu/qr_code.png | Bin 0 -> 588 bytes Telegram/Resources/icons/menu/qr_code@2x.png | Bin 0 -> 774 bytes Telegram/Resources/icons/menu/qr_code@3x.png | Bin 0 -> 1483 bytes Telegram/Resources/icons/menu/read.png | Bin 0 -> 829 bytes Telegram/Resources/icons/menu/read@2x.png | Bin 0 -> 1552 bytes Telegram/Resources/icons/menu/read@3x.png | Bin 0 -> 2355 bytes Telegram/Resources/icons/menu/read_audio.png | Bin 0 -> 527 bytes .../Resources/icons/menu/read_audio@2x.png | Bin 0 -> 1123 bytes .../Resources/icons/menu/read_audio@3x.png | Bin 0 -> 1657 bytes .../Resources/icons/menu/read_reactions.png | Bin 0 -> 820 bytes .../icons/menu/read_reactions@2x.png | Bin 0 -> 1628 bytes .../icons/menu/read_reactions@3x.png | Bin 0 -> 2462 bytes Telegram/Resources/icons/menu/read_ticks.png | Bin 0 -> 494 bytes .../Resources/icons/menu/read_ticks@2x.png | Bin 0 -> 727 bytes .../Resources/icons/menu/read_ticks@3x.png | Bin 0 -> 1259 bytes Telegram/Resources/icons/menu/reply.png | Bin 0 -> 429 bytes Telegram/Resources/icons/menu/reply@2x.png | Bin 0 -> 603 bytes Telegram/Resources/icons/menu/reply@3x.png | Bin 0 -> 798 bytes Telegram/Resources/icons/menu/report.png | Bin 0 -> 516 bytes Telegram/Resources/icons/menu/report@2x.png | Bin 0 -> 1059 bytes Telegram/Resources/icons/menu/report@3x.png | Bin 0 -> 1663 bytes Telegram/Resources/icons/menu/reschedule.png | Bin 0 -> 653 bytes .../Resources/icons/menu/reschedule@2x.png | Bin 0 -> 1253 bytes .../Resources/icons/menu/reschedule@3x.png | Bin 0 -> 1858 bytes Telegram/Resources/icons/menu/restart_bot.png | Bin 0 -> 718 bytes .../Resources/icons/menu/restart_bot@2x.png | Bin 0 -> 1331 bytes .../Resources/icons/menu/restart_bot@3x.png | Bin 0 -> 2060 bytes .../Resources/icons/menu/retract_vote.png | Bin 0 -> 790 bytes .../Resources/icons/menu/retract_vote@2x.png | Bin 0 -> 1460 bytes .../Resources/icons/menu/retract_vote@3x.png | Bin 0 -> 2199 bytes Telegram/Resources/icons/menu/save_image.png | Bin 0 -> 710 bytes .../Resources/icons/menu/save_image@2x.png | Bin 0 -> 1213 bytes .../Resources/icons/menu/save_image@3x.png | Bin 0 -> 1774 bytes Telegram/Resources/icons/menu/search.png | Bin 0 -> 576 bytes Telegram/Resources/icons/menu/search@2x.png | Bin 0 -> 1077 bytes Telegram/Resources/icons/menu/search@3x.png | Bin 0 -> 1166 bytes Telegram/Resources/icons/menu/select.png | Bin 0 -> 560 bytes Telegram/Resources/icons/menu/select@2x.png | Bin 0 -> 1110 bytes Telegram/Resources/icons/menu/select@3x.png | Bin 0 -> 1616 bytes Telegram/Resources/icons/menu/send.png | Bin 0 -> 726 bytes Telegram/Resources/icons/menu/send@2x.png | Bin 0 -> 1381 bytes Telegram/Resources/icons/menu/send@3x.png | Bin 0 -> 1976 bytes Telegram/Resources/icons/menu/share.png | Bin 0 -> 589 bytes Telegram/Resources/icons/menu/share@2x.png | Bin 0 -> 1144 bytes Telegram/Resources/icons/menu/share@3x.png | Bin 0 -> 1676 bytes .../Resources/icons/menu/show_in_chat.png | Bin 0 -> 698 bytes .../Resources/icons/menu/show_in_chat@2x.png | Bin 0 -> 1338 bytes .../Resources/icons/menu/show_in_chat@3x.png | Bin 0 -> 2091 bytes .../Resources/icons/menu/show_in_folder.png | Bin 0 -> 446 bytes .../icons/menu/show_in_folder@2x.png | Bin 0 -> 662 bytes .../icons/menu/show_in_folder@3x.png | Bin 0 -> 967 bytes Telegram/Resources/icons/menu/stickers.png | Bin 0 -> 712 bytes Telegram/Resources/icons/menu/stickers@2x.png | Bin 0 -> 1197 bytes Telegram/Resources/icons/menu/stickers@3x.png | Bin 0 -> 1930 bytes Telegram/Resources/icons/menu/stop_poll.png | Bin 0 -> 462 bytes .../Resources/icons/menu/stop_poll@2x.png | Bin 0 -> 966 bytes .../Resources/icons/menu/stop_poll@3x.png | Bin 0 -> 1461 bytes Telegram/Resources/icons/menu/unarchive.png | Bin 0 -> 589 bytes .../Resources/icons/menu/unarchive@2x.png | Bin 0 -> 935 bytes .../Resources/icons/menu/unarchive@3x.png | Bin 0 -> 1366 bytes Telegram/Resources/icons/menu/unblock.png | Bin 0 -> 781 bytes Telegram/Resources/icons/menu/unblock@2x.png | Bin 0 -> 1396 bytes Telegram/Resources/icons/menu/unblock@3x.png | Bin 0 -> 2049 bytes Telegram/Resources/icons/menu/unfavorite.png | Bin 0 -> 815 bytes .../Resources/icons/menu/unfavorite@2x.png | Bin 0 -> 1558 bytes .../Resources/icons/menu/unfavorite@3x.png | Bin 0 -> 2386 bytes Telegram/Resources/icons/menu/unmute.png | Bin 0 -> 680 bytes Telegram/Resources/icons/menu/unmute@2x.png | Bin 0 -> 1133 bytes Telegram/Resources/icons/menu/unmute@3x.png | Bin 0 -> 1920 bytes Telegram/Resources/icons/menu/unpin.png | Bin 0 -> 549 bytes Telegram/Resources/icons/menu/unpin@2x.png | Bin 0 -> 959 bytes Telegram/Resources/icons/menu/unpin@3x.png | Bin 0 -> 1297 bytes Telegram/Resources/icons/menu/unread.png | Bin 0 -> 739 bytes Telegram/Resources/icons/menu/unread@2x.png | Bin 0 -> 1398 bytes Telegram/Resources/icons/menu/unread@3x.png | Bin 0 -> 2053 bytes .../Resources/icons/menu/view_replies.png | Bin 0 -> 602 bytes .../Resources/icons/menu/view_replies@2x.png | Bin 0 -> 1039 bytes .../Resources/icons/menu/view_replies@3x.png | Bin 0 -> 1418 bytes Telegram/SourceFiles/boxes/connection_box.cpp | 16 ++- .../boxes/dictionaries_manager.cpp | 17 +-- Telegram/SourceFiles/boxes/language_box.cpp | 19 ++- .../boxes/peers/edit_participants_box.cpp | 27 ++-- .../boxes/peers/edit_peer_invite_link.cpp | 47 ++++--- .../boxes/peers/edit_peer_invite_links.cpp | 17 +-- .../SourceFiles/boxes/sticker_set_box.cpp | 27 ++-- .../calls/calls_box_controller.cpp | 7 +- .../chat_helpers/field_autocomplete.cpp | 7 +- .../chat_helpers/gifs_list_widget.cpp | 12 +- .../chat_helpers/gifs_list_widget.h | 2 +- .../chat_helpers/send_context_menu.cpp | 19 ++- .../chat_helpers/stickers_list_widget.cpp | 11 +- .../chat_helpers/tabbed_selector.cpp | 5 +- .../dialogs/dialogs_inner_widget.cpp | 14 ++- .../admin_log/history_admin_log_inner.cpp | 37 +++--- .../history/history_inner_widget.cpp | 89 ++++++------- .../view/history_view_context_menu.cpp | 85 ++++++++----- .../view/history_view_schedule_box.cpp | 8 +- .../view/history_view_top_bar_widget.cpp | 10 +- .../SourceFiles/info/info_wrap_widget.cpp | 10 +- .../info/media/info_media_list_widget.cpp | 39 ++++-- .../inline_bot_layout_internal.cpp | 2 +- .../inline_bots/inline_results_inner.cpp | 12 +- .../SourceFiles/settings/settings_common.cpp | 12 +- .../SourceFiles/settings/settings_common.h | 3 +- Telegram/SourceFiles/ui/chat/chat.style | 9 +- .../delete_message_context_action.cpp | 8 +- Telegram/SourceFiles/ui/menu_icons.style | 81 ++++++++++++ .../themes/window_themes_cloud_list.cpp | 11 +- .../window/window_filters_menu.cpp | 19 ++- .../SourceFiles/window/window_main_menu.cpp | 40 ++++-- .../SourceFiles/window/window_peer_menu.cpp | 118 ++++++++++++------ .../SourceFiles/window/window_peer_menu.h | 3 +- Telegram/cmake/td_ui.cmake | 1 + 212 files changed, 581 insertions(+), 263 deletions(-) create mode 100644 Telegram/Resources/icons/menu/add_account.png create mode 100644 Telegram/Resources/icons/menu/add_account@2x.png create mode 100644 Telegram/Resources/icons/menu/add_account@3x.png create mode 100644 Telegram/Resources/icons/menu/admin.png create mode 100644 Telegram/Resources/icons/menu/admin@2x.png create mode 100644 Telegram/Resources/icons/menu/admin@3x.png create mode 100644 Telegram/Resources/icons/menu/admin_promote.png create mode 100644 Telegram/Resources/icons/menu/admin_promote@2x.png create mode 100644 Telegram/Resources/icons/menu/admin_promote@3x.png create mode 100644 Telegram/Resources/icons/menu/all_media.png create mode 100644 Telegram/Resources/icons/menu/all_media@2x.png create mode 100644 Telegram/Resources/icons/menu/all_media@3x.png create mode 100644 Telegram/Resources/icons/menu/archive.png create mode 100644 Telegram/Resources/icons/menu/archive@2x.png create mode 100644 Telegram/Resources/icons/menu/archive@3x.png create mode 100644 Telegram/Resources/icons/menu/block.png create mode 100644 Telegram/Resources/icons/menu/block@2x.png create mode 100644 Telegram/Resources/icons/menu/block@3x.png create mode 100644 Telegram/Resources/icons/menu/calendar.png create mode 100644 Telegram/Resources/icons/menu/calendar@2x.png create mode 100644 Telegram/Resources/icons/menu/calendar@3x.png create mode 100644 Telegram/Resources/icons/menu/cancel.png create mode 100644 Telegram/Resources/icons/menu/cancel@2x.png create mode 100644 Telegram/Resources/icons/menu/cancel@3x.png create mode 100644 Telegram/Resources/icons/menu/clear.png create mode 100644 Telegram/Resources/icons/menu/clear@2x.png create mode 100644 Telegram/Resources/icons/menu/clear@3x.png create mode 100644 Telegram/Resources/icons/menu/collapse.png create mode 100644 Telegram/Resources/icons/menu/collapse@2x.png create mode 100644 Telegram/Resources/icons/menu/collapse@3x.png create mode 100644 Telegram/Resources/icons/menu/colors.png create mode 100644 Telegram/Resources/icons/menu/colors@2x.png create mode 100644 Telegram/Resources/icons/menu/colors@3x.png create mode 100644 Telegram/Resources/icons/menu/copy.png create mode 100644 Telegram/Resources/icons/menu/copy@2x.png create mode 100644 Telegram/Resources/icons/menu/copy@3x.png create mode 100644 Telegram/Resources/icons/menu/create_poll.png create mode 100644 Telegram/Resources/icons/menu/create_poll@2x.png create mode 100644 Telegram/Resources/icons/menu/create_poll@3x.png create mode 100644 Telegram/Resources/icons/menu/delete.png create mode 100644 Telegram/Resources/icons/menu/delete@2x.png create mode 100644 Telegram/Resources/icons/menu/delete@3x.png create mode 100644 Telegram/Resources/icons/menu/discussion.png create mode 100644 Telegram/Resources/icons/menu/discussion@2x.png create mode 100644 Telegram/Resources/icons/menu/discussion@3x.png create mode 100644 Telegram/Resources/icons/menu/download.png create mode 100644 Telegram/Resources/icons/menu/download@2x.png create mode 100644 Telegram/Resources/icons/menu/download@3x.png create mode 100644 Telegram/Resources/icons/menu/edit.png create mode 100644 Telegram/Resources/icons/menu/edit@2x.png create mode 100644 Telegram/Resources/icons/menu/edit@3x.png create mode 100644 Telegram/Resources/icons/menu/expand.png create mode 100644 Telegram/Resources/icons/menu/expand@2x.png create mode 100644 Telegram/Resources/icons/menu/expand@3x.png create mode 100644 Telegram/Resources/icons/menu/export.png create mode 100644 Telegram/Resources/icons/menu/export@2x.png create mode 100644 Telegram/Resources/icons/menu/export@3x.png create mode 100644 Telegram/Resources/icons/menu/favorite.png create mode 100644 Telegram/Resources/icons/menu/favorite@2x.png create mode 100644 Telegram/Resources/icons/menu/favorite@3x.png create mode 100644 Telegram/Resources/icons/menu/forward.png create mode 100644 Telegram/Resources/icons/menu/forward@2x.png create mode 100644 Telegram/Resources/icons/menu/forward@3x.png create mode 100644 Telegram/Resources/icons/menu/gif.png create mode 100644 Telegram/Resources/icons/menu/gif@2x.png create mode 100644 Telegram/Resources/icons/menu/gif@3x.png create mode 100644 Telegram/Resources/icons/menu/info.png create mode 100644 Telegram/Resources/icons/menu/info@2x.png create mode 100644 Telegram/Resources/icons/menu/info@3x.png create mode 100644 Telegram/Resources/icons/menu/invite.png create mode 100644 Telegram/Resources/icons/menu/invite@2x.png create mode 100644 Telegram/Resources/icons/menu/invite@3x.png create mode 100644 Telegram/Resources/icons/menu/leave.png create mode 100644 Telegram/Resources/icons/menu/leave@2x.png create mode 100644 Telegram/Resources/icons/menu/leave@3x.png create mode 100644 Telegram/Resources/icons/menu/link.png create mode 100644 Telegram/Resources/icons/menu/link@2x.png create mode 100644 Telegram/Resources/icons/menu/link@3x.png create mode 100644 Telegram/Resources/icons/menu/manage.png create mode 100644 Telegram/Resources/icons/menu/manage@2x.png create mode 100644 Telegram/Resources/icons/menu/manage@3x.png create mode 100644 Telegram/Resources/icons/menu/move_from_menu.png create mode 100644 Telegram/Resources/icons/menu/move_from_menu@2x.png create mode 100644 Telegram/Resources/icons/menu/move_from_menu@3x.png create mode 100644 Telegram/Resources/icons/menu/move_to_menu.png create mode 100644 Telegram/Resources/icons/menu/move_to_menu@2x.png create mode 100644 Telegram/Resources/icons/menu/move_to_menu@3x.png create mode 100644 Telegram/Resources/icons/menu/mute.png create mode 100644 Telegram/Resources/icons/menu/mute@2x.png create mode 100644 Telegram/Resources/icons/menu/mute@3x.png create mode 100644 Telegram/Resources/icons/menu/permissions.png create mode 100644 Telegram/Resources/icons/menu/permissions@2x.png create mode 100644 Telegram/Resources/icons/menu/permissions@3x.png create mode 100644 Telegram/Resources/icons/menu/pin.png create mode 100644 Telegram/Resources/icons/menu/pin@2x.png create mode 100644 Telegram/Resources/icons/menu/pin@3x.png create mode 100644 Telegram/Resources/icons/menu/profile.png create mode 100644 Telegram/Resources/icons/menu/profile@2x.png create mode 100644 Telegram/Resources/icons/menu/profile@3x.png create mode 100644 Telegram/Resources/icons/menu/qr_code.png create mode 100644 Telegram/Resources/icons/menu/qr_code@2x.png create mode 100644 Telegram/Resources/icons/menu/qr_code@3x.png create mode 100644 Telegram/Resources/icons/menu/read.png create mode 100644 Telegram/Resources/icons/menu/read@2x.png create mode 100644 Telegram/Resources/icons/menu/read@3x.png create mode 100644 Telegram/Resources/icons/menu/read_audio.png create mode 100644 Telegram/Resources/icons/menu/read_audio@2x.png create mode 100644 Telegram/Resources/icons/menu/read_audio@3x.png create mode 100644 Telegram/Resources/icons/menu/read_reactions.png create mode 100644 Telegram/Resources/icons/menu/read_reactions@2x.png create mode 100644 Telegram/Resources/icons/menu/read_reactions@3x.png create mode 100644 Telegram/Resources/icons/menu/read_ticks.png create mode 100644 Telegram/Resources/icons/menu/read_ticks@2x.png create mode 100644 Telegram/Resources/icons/menu/read_ticks@3x.png create mode 100644 Telegram/Resources/icons/menu/reply.png create mode 100644 Telegram/Resources/icons/menu/reply@2x.png create mode 100644 Telegram/Resources/icons/menu/reply@3x.png create mode 100644 Telegram/Resources/icons/menu/report.png create mode 100644 Telegram/Resources/icons/menu/report@2x.png create mode 100644 Telegram/Resources/icons/menu/report@3x.png create mode 100644 Telegram/Resources/icons/menu/reschedule.png create mode 100644 Telegram/Resources/icons/menu/reschedule@2x.png create mode 100644 Telegram/Resources/icons/menu/reschedule@3x.png create mode 100644 Telegram/Resources/icons/menu/restart_bot.png create mode 100644 Telegram/Resources/icons/menu/restart_bot@2x.png create mode 100644 Telegram/Resources/icons/menu/restart_bot@3x.png create mode 100644 Telegram/Resources/icons/menu/retract_vote.png create mode 100644 Telegram/Resources/icons/menu/retract_vote@2x.png create mode 100644 Telegram/Resources/icons/menu/retract_vote@3x.png create mode 100644 Telegram/Resources/icons/menu/save_image.png create mode 100644 Telegram/Resources/icons/menu/save_image@2x.png create mode 100644 Telegram/Resources/icons/menu/save_image@3x.png create mode 100644 Telegram/Resources/icons/menu/search.png create mode 100644 Telegram/Resources/icons/menu/search@2x.png create mode 100644 Telegram/Resources/icons/menu/search@3x.png create mode 100644 Telegram/Resources/icons/menu/select.png create mode 100644 Telegram/Resources/icons/menu/select@2x.png create mode 100644 Telegram/Resources/icons/menu/select@3x.png create mode 100644 Telegram/Resources/icons/menu/send.png create mode 100644 Telegram/Resources/icons/menu/send@2x.png create mode 100644 Telegram/Resources/icons/menu/send@3x.png create mode 100644 Telegram/Resources/icons/menu/share.png create mode 100644 Telegram/Resources/icons/menu/share@2x.png create mode 100644 Telegram/Resources/icons/menu/share@3x.png create mode 100644 Telegram/Resources/icons/menu/show_in_chat.png create mode 100644 Telegram/Resources/icons/menu/show_in_chat@2x.png create mode 100644 Telegram/Resources/icons/menu/show_in_chat@3x.png create mode 100644 Telegram/Resources/icons/menu/show_in_folder.png create mode 100644 Telegram/Resources/icons/menu/show_in_folder@2x.png create mode 100644 Telegram/Resources/icons/menu/show_in_folder@3x.png create mode 100644 Telegram/Resources/icons/menu/stickers.png create mode 100644 Telegram/Resources/icons/menu/stickers@2x.png create mode 100644 Telegram/Resources/icons/menu/stickers@3x.png create mode 100644 Telegram/Resources/icons/menu/stop_poll.png create mode 100644 Telegram/Resources/icons/menu/stop_poll@2x.png create mode 100644 Telegram/Resources/icons/menu/stop_poll@3x.png create mode 100644 Telegram/Resources/icons/menu/unarchive.png create mode 100644 Telegram/Resources/icons/menu/unarchive@2x.png create mode 100644 Telegram/Resources/icons/menu/unarchive@3x.png create mode 100644 Telegram/Resources/icons/menu/unblock.png create mode 100644 Telegram/Resources/icons/menu/unblock@2x.png create mode 100644 Telegram/Resources/icons/menu/unblock@3x.png create mode 100644 Telegram/Resources/icons/menu/unfavorite.png create mode 100644 Telegram/Resources/icons/menu/unfavorite@2x.png create mode 100644 Telegram/Resources/icons/menu/unfavorite@3x.png create mode 100644 Telegram/Resources/icons/menu/unmute.png create mode 100644 Telegram/Resources/icons/menu/unmute@2x.png create mode 100644 Telegram/Resources/icons/menu/unmute@3x.png create mode 100644 Telegram/Resources/icons/menu/unpin.png create mode 100644 Telegram/Resources/icons/menu/unpin@2x.png create mode 100644 Telegram/Resources/icons/menu/unpin@3x.png create mode 100644 Telegram/Resources/icons/menu/unread.png create mode 100644 Telegram/Resources/icons/menu/unread@2x.png create mode 100644 Telegram/Resources/icons/menu/unread@3x.png create mode 100644 Telegram/Resources/icons/menu/view_replies.png create mode 100644 Telegram/Resources/icons/menu/view_replies@2x.png create mode 100644 Telegram/Resources/icons/menu/view_replies@3x.png create mode 100644 Telegram/SourceFiles/ui/menu_icons.style diff --git a/Telegram/Resources/icons/menu/add_account.png b/Telegram/Resources/icons/menu/add_account.png new file mode 100644 index 0000000000000000000000000000000000000000..175540e136fde16e4becc2e0bff9bd8ebbf268cb GIT binary patch literal 852 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDq2jfoY$oi(`m| z;MNdd@1#J9eWyg4rZmq;oT4!Gg1&&g!@*u|#iOAU_5N8{Fj z9KjYn=EbhFSwsbynps>;g0IXxo>#nUahkC~@q>B4?>)D9Uwwc5=b$V0QEOPsrcIls zBGl=jlC&|x-{1dfQKf~9-h=a&lTJVFbXjyY>u-WijoM_-nLcLjjf#_s=*9~{}UXU~@Ebz6P4$YM@+H}~$l_j1ghN6l&2y?gi4piCP%ccqD6 zzkZFBJH*p|SRq7f>fE_=BM-4O>TkI8wyf7pIZ?qnXl2OKptWn(2o%)U|9|?FHKozP z;Q+tlRIi8OKH3I>8X_-r6ob}Z_rAf_oM<8i)GzoXHb6rpz`^AS!_JC|iWenTcJtqV z_+T*obYsHSC{9JGUZ%#)EHgP)Tzvgn+gSgD{GP>&m1k|=v!^HG-Me=kvjQ|^c-THx z%ux{e#k%xt+GcqH*ST}%91vKftWb9?Z~IC0meZ%bHJoIPr1^LC9e=#=(u9*vF%wFy zWP1yC#<(~(w=j!pbRA7nxc_0niW?X8TNod{dc`%9kAn6g^&h8_W@<(Cv$pup^YU}E@Md$>#^!E0aSoQvubysruT457x^Q*YD zw6wZfn%DIE7xRL=O_^-JKK#Dz)HlQG^1cb1SANo->h+`NHjDqu*6My9fqil7+56@y zOioE|by9qC;{A8)x#u1~eth|I@D|Zk(W|dsIH>TYYVYsgzs=u;OV_%_=!xHY^Xyq# zZfPEk0ZUhAUYez;MKt=Vx$gLR|PU#p+LzfVtYneoTO-Gq5v z5<}7kMc*B%XAZXU+1cCYn@AnGCeJCswt4Zjw9SG~Z+_CxGB)~iGpB5CoW5B1kqh-A abxe*g`X6-s{Qnk|qCH*xT-G@yGywn-WN7sO literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/add_account@2x.png b/Telegram/Resources/icons/menu/add_account@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..81583e5c6f16d1e2c4b605f4d45f941c0b961804 GIT binary patch literal 1582 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 V`Pu1Nk(WTp-_zC4Wt~$(69A_lodo~@ literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/admin@2x.png b/Telegram/Resources/icons/menu/admin@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8baaecb1e7b70d675340ebce2b34714964646126 GIT binary patch literal 1773 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 U_#~}9k^lez07*qoM6N<$f^-bmEdT%j literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/admin_promote.png b/Telegram/Resources/icons/menu/admin_promote.png new file mode 100644 index 0000000000000000000000000000000000000000..ce7a550e62185df77f9df04ec7242a879bd80284 GIT binary patch literal 847 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDq2jfoZ3wi(`m| z;MNdZk5!2xe!5fJR6dB8equMt;$RY%DGDws*kG;tC?VT}FOOHPH9X^#s*KCSNqS8h zGc3v+3j{LF54nnzUi5i<&prP4kGdl-?-|$Jw>)q8yz>6{IiL4QOaJ#^d0olF=Byx4 zurp@!%{On~=GK1TS|7A>&z?PNu4dI|eERpVuDpEv{{8!v8d=}IdGn)Y-}C3`YxvvB zcFXo3=jZ3YnpJ8bvF7^gmTea^TAUPn-41)j&k7F@fBaEm;orLdA3t8q+y41yP1uT) zDZ6&=%-kBq@%z^=FBPHa=;)pqd-vM@h>MH6legVNCFzF+TmSLRH*v^x4xXMmOgAwa@;YtQb>cG?PJutM$m%J`cU=;#{rq z+>K0={l5SFxwEN5Kv=%h&ek^9Y_{L>&(EC}9ANP%=$QZRjZxl$a^8jELgLcbvpCuG$YBTq}zA%#KoWf`c+k|7?8lEqV5#2H0b5m zswGcUvVZD|b+6!%NL<{xG2%?p#tX_o`M*c6ExVj)G;;~NPHEAz-@kv0+VM>}n|9Ih zPI_ND>Ix z;NeckjGZypUY3;T$8mhRGSy2ptK=nPj_i4kXQEq=T$?v<-kPx07c+d825Fo+ew;nd z@0!EL&yi-=+>O$hb~iVu&h>l!wJJ;^)u?T%lcwv^pvt{*oi0s+&ObH&*lX1@9!@RU UvMky#9F&+nUHx3vIVCg!03vN`F8}}l literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/admin_promote@2x.png b/Telegram/Resources/icons/menu/admin_promote@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e91ce7890889dfb83226557a8f06c886834719d5 GIT binary patch literal 1646 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 XV^e!i;ygFl00000NkvXXu0mjfFr<`b literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/all_media.png b/Telegram/Resources/icons/menu/all_media.png new file mode 100644 index 0000000000000000000000000000000000000000..9febf576c86d62400add80348551619a5e2eebd7 GIT binary patch literal 542 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgfti#jAF~maf zZisGQvxCUHJhM_)C9MEk2FsxcBE&3k6 z{yIyAbMDE_r^-D_dfy4AnRhJ;Z?U&u$Gzu7v_#d64U2DPsmNU1v%tE@B6voIP11tS zD<6!$)V{Bj+ftL+Sox|V>>=xPv6LA-^G(hhJMDX3dE?mQn((*gyvnvmdD}Q@L2={h L>gTe~DWM4fpXAJq literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/all_media@2x.png b/Telegram/Resources/icons/menu/all_media@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b2b3b6ce158e739e42878ce3ec54dce6c23b7759 GIT binary patch literal 802 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HW6J5LIcBSM{g+=Z+9}h2{QK|N z(~ir7R+jCKT^qJo@AcOzv)Oacr$7FraXZKC`)^yPV}F-j&eWTJxgbHYXLGwuL&H_Q z{!0a)9|X02(CBPv`jD<1xBd3n$&;&3ZwTIfcU^#n!lkcObA8lqDDR!(wKPa;s>`Lf zW$udwU-&IImf>^VaW^k~_0+P1eA}YdmRRvVd|03%*6sf$cK!9qS7Y?1SM6O_=$UUO zz47Ju-%2csLMt+saXK&tbA!q0KS`1 z?}d;#>kWS`ydf})C8YVFLf4wxn$9j~WhSxnGj6e%!@M=hSHYoS>b~dyue0|l?+Kn# z;p1hNbD4?B%uqcgxi4jI!*3no?j4R!TW%=y$af!gI^5_s*Pzbgw_MDlHZf+Q8$Y;e z&Q069+A<1T-n`yZ<3i?!{LZ$ zKDh$k>gVb{xad!NcYK-5R2OEK=RV1g?P6}a&S`IJtmslzaF!@9cRKcBYL17-%3Jb5 zihgE={c)G9lE1Q~a3sH4C$NvJL-yUQLh++7-W-<*nVA3#9uCPvH+D!X?+bjet$Vde z-ad)=KjE3@>Qv?wt7R=-e~BY8$TQ*o*Nq3KixpMCo*%Q~loCIHdMRh|F< literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/all_media@3x.png b/Telegram/Resources/icons/menu/all_media@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..4fa10d48f387ea08bfe45ca05d10eb61de2bb09e GIT binary patch literal 1191 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1SD_us|Wxo#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz1|Sip>6gA`6MbbHUhz#{1B;uw;_ z`gWGDc3z;!@w=~0RhgMnQxaT^5>?_4IQZ~h37#Q2>nB^=sfNZHX3c#Kl4_rVybOaT zDXF@=Tkp5__x|5={>~9U{n%_f1~jhvG^CDDcBcjz6ci?%TMr zFexdisHi9*VZrX*vlDB6K7Rc8=+UFsu3bBJ?AYzw(Q^)J`1<-z^Wo<1jf1dbbZDH}^{rm5c2Sj*gw$?6?Vy?N=b$R*n zxHyBwJNQ3NZQ)v2`L^SSCwKpxQz_RDYhH5l+_}E9Ol9TerDAE*G@6q{7W(}> zIAe(o>&Iu$mYs6-U8TTt)&2XQKQYq{Od2{=BzxhCq8?B}&>3abj%91|8X)=$w9nevgZT*J_pr%rjT%0GMd?Ay0*w{`70Y2eVl;ozFhg*{eNvJ%&-9sQ|%%AVI%N%-#T zA3t{Zo;`Q&+?g{OvI)U#2HQ7pzT9^F`0+MIp6cpqWv-m<+qZv7JN4i}#qI`AKL3di z({C+baUeP-Cgdp3)(@wd8s?W?$qJKhi66J z@7(gy!qp)D;nSz7vr{u9K79BvVKs-Gq~t*rTjTId%Yt>nFFo|;p7{HBZ)o%M>C;!e zfA#9rvV_x@wuRUmhd;C|XcW#|GQC>J=dbI`w1)-f&Ir%-%s2VE-|dz`{M+dodv%n& zwlV`_Mhizoyu5#-YRC8a#>-Y+RhcjOQu1+LkM6S${m1cJw=EHA2(sk_M&hT-vX6f? z>cvGxT}o7177$=PM>tdV5L@vg0aYt6*~wFk+4cTfv20gfW5HB&v9#k0->=(o35q+v zRy@^sZG7^r&f4`~BUd%ms$V)9Rm7w5b5g_;+sf68vuj^g`xKw5``spPc=d3DGm8@n c{O9(7e|gvkKgAGsS5P70>FVdQ&MBb@08{E1wEzGB literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/archive.png b/Telegram/Resources/icons/menu/archive.png new file mode 100644 index 0000000000000000000000000000000000000000..432bf2f7b59549382eab1e72acae4ae077d5d43d GIT binary patch literal 591 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgfY^SG-V~B;| z*^rH0ha3bt zm>D0NJyeY3`t$u;a&LFK9J=pcX(BcEY??vl_S+vTWLBCaZH!oau_0$?4AbW6*7f`E zuMg3hd@{vuez7G-%I3(}>$~sfZH@Yx5w!Bk*Q(kie>u*mNheh#_g-EeqV=#OdTrS9 z%OBSW%(;@awQ6si-gMp5MWI`AU;eDUb9kzqz!3@lUKa~t+f|d^XP7WWYlx_rHvYQp zVYTeRg9F>=U->`7LHXs`X_K~WxT7)GPo9rGM!V2zi9(=|=dn-5xAL~nKD+Gt>y3PR z9^tD+y?nYH>@L16xn#ndoAGZC`_2Xz&o}8h=1!IS?@zvd-8P|1M5X*!Lru1dlKw9D zqe&md#b3xS{`|9tWqsxL+nwGEEvKLErFMg{vd$@?2>`rT>umr4 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/archive@2x.png b/Telegram/Resources/icons/menu/archive@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..59914bb1704d83d914e872dabb70d8dab716326e GIT binary patch literal 926 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/calendar@2x.png b/Telegram/Resources/icons/menu/calendar@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c53106f9b982da8327e03ace44a51f4e520a5fc1 GIT binary patch literal 726 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HoS4D zw0(D8e%bYI_UpeFW<1;1+E;z<`)AwtcaDFyka-m#{G(s^#M2`A?aYmxpSNp>TP&J+ z{&u6oglW2xldMy>WXqimn0fis__( z>&A#23z>Q6)3-&I?PcQ7d2p<1)%DlyhYzk(duQ2j*y+aP2TdN!FE73bw8-$_)1sSi z%bYe|blrb{{n0d|nI9{38h6}%_q6Ebxy;QsL$pNKU)R29Glz}KAwg2!ZNuah+^tNj z?dJNe4Dkxe)#BB8aE7%^=5cj=hUr9)4HagyeU}GEZ8u~PD_~Qxe)O4_wb^mn?DNk< zQmP#aHYs!OQ~Y)B@bk%CIs6=cWhn>ET{`b`#jR7k8|}U|N_YBc|5=ldKfb8^+U!f6 z^_P_M(f_TZ%_MlD)?S;eb}_@`)6YEu>vpHEzRI;db>XpJkNCr%pU$0`<+1I4mQ$9~ zCe9O|UP%QBPx5t`_I&-q#~)9q*vcYIXXu#d~>DH3PTA$=!*f7c)wXX5P5R!pPX(xsJ7W zV88ym@4t^GU3^(`>#f^NtQ(Z3JYD@<);T3K0RSqU BIR5|u literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/calendar@3x.png b/Telegram/Resources/icons/menu/calendar@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8557387366c0d56307f32880594754f2cbae3d7 GIT binary patch literal 925 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1SD_us|Wxo#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz1|Sip>6gA`6MbbAj}&hF{r7?Q#I zHfrxVLr0Nkzgv#@i)g)TWSiI#=C6HGL&b|r{Grv0yNzs}JD7SWdAVf#QF;IS$?Z3L zCf}5O|1RR%kG@0mjE$dLp0`X-@43s#^1@ki0Z#y%2J?SMwtrg3XZS6b?sc=9e?P}; z`DIT@_q2$$VXwbd*~rDOzrM-v-gfcsqkrrEe|^u)xN5sy+u?N(U{cc{m?EfXxLbOt2OY^r!FAa*+5!3Q(jZX~8G?7Z=Pc2>C z^zH`Ry9XlcT5q#_K5NKkE|9%|;Y!xl9d+_90sq_v9*S|cIq0xL+GAIl z(M+Eo2MUaLv{f`QehahFo>1~OWowjS$LF7a9#yI?=9W@8+|jrsXGw|oR1cLIyw@Do zwD^1t6c9_9x8#7A)C>bZ>#0na*QUrv8y4_1ej zp)O$8cQbGMkKzpP2g&)aTxYi3%fIs?)NFa z*F6*t+k8@qT&(E9{CIvbgWl}3T+{Zg*csDTAAEeW$PW+ZXuauwF2t=rzPj$@-Ms1L zx)Yx4Uh?Vqz8Lo-QS$8*_Dyj}kgslF-T1QliHFtk2==7k2b`1KDt4%^{oHHIP`{Kx zim(6c-Py@>IKvAK6pP=eVIN=IDBZy7e12Ro4rAE-Y$sfF{!^jHeoA^VBfEp0AQ} TM@!)xC~J7S`njxgN@xNAVm62Q literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/cancel.png b/Telegram/Resources/icons/menu/cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..f88a31e39c556bce5d177804926015a0f91214d3 GIT binary patch literal 467 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgf%+}MzF~maf z?3BH|Ed~Ouma`mEbVMDT9Jp1cG`Wb1G@cMpl$~(-pz8!dWx-FI<&DP_vD5$5k;NePv2?|pt*=EdY zJO7kPvhB;HrJ5`%9IO>n7EHM3vsKnNdh^!a`F$^bDi~h+*8O1V^W~zSk9i+9RoZiJ i_l>&Gt3*rx-u%qzEa4ZlpTkxM6ri52elF{r5}E)Mc&jD= literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/cancel@2x.png b/Telegram/Resources/icons/menu/cancel@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ae05c193ee193255539304e64ca1c842b6ffa37e GIT binary patch literal 1025 zcmV+c1pfPpP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NFYe_^wR9Fe^n7>XcK@`T9Tkt0m zN>CCW0$#w%5~ximZ-KRy4bV~9+W7`FS{ZDpXz6K5w6Q{s5)$wI$bGe&b zrhwTq-}%0?XJ*gNtmp08E(3p-fmCewLZMKtR?Fq`!NCE)@Z8NEj9~U|eu?S8etuT*=)uf(Xf*bTBTCSX0s;j>FMeG{Jh`qlR48Kv%kN;KOT?G+kbd?xV*fq z*Xy}lE=Y=zAppQkFG!#Y;-gt=wHi54-p9wsPN%cCx97qF3@|S04i$thzIF`GWLxP5 zgF&%av_r$KxZtQH5XOv&^lEP2-rl<1ZYt%p;DWK?h&v<_7POI;`8y%2Sl10ityU{2 z6V(EV#soPM5g2;Co+g=_i{QBt3YF3#u@P$wl22WUOn>Z|GAKW~Q0aO?!gb;(WpW?* z#8}0_I7|zKdbbFfL-szEO=~d^Z4i`Br+=>6hDE@TU;qahpp_d&2)Q6&&2n;bB52B* zwcem4fZ=fHtH?rxks-kVUSnTfK&v$qIUnGM@4DG+iskC+>iPNEH)>uU9UWa?U;AR> z5+g$<($|L;axto$5A$)!jzZtzlz%IT>Cgm_1~X4)Ze%EIS|OJdB8R9|=-qgDcqq7+ zmlx}MN<4$YSggh{CCHHwEkwg$-tqCVfTq)FC}=ehln+Z=7!MMng=iSYV}l`}(P$J3 z`W*1ZB#!)=llY0X{39VQh?>J|i<-@-jLH7S#0C3oh8m5=?d`2O#3e?COry205-KXN zwScUiTQ;r*q)~rguRM<_3qIl2T422;l~7SjhBz~bRnb;1jJ{}?DVl&CV^RqfwP+>o zu}@rKBx#(dATGOg!^iN^<4%nwQ?fSs1jIfjS;rt^`l|=Un1}pi9i>SUjhOU6O)299^DjR(NKB+x*OQdj z*q>uuPKHk34_M;~`d}q_;+OlQW@;UmY;FDpjEhTRR3&nUcMI=3mye#nbkpN5<1}Sf vI{hq+s_cu|YO(#JZS}LTHMpJef6l;fm3+S>+fS=i00000NkvXXu0mjf|I^Lr literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/cancel@3x.png b/Telegram/Resources/icons/menu/cancel@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..151fe55ffc1a52bba307e6b809dccf356f37adc8 GIT binary patch literal 1558 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/clear@3x.png b/Telegram/Resources/icons/menu/clear@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..1271ec8ed1fdd7f88b41f0ccd70c4c3f40b0fcf9 GIT binary patch literal 1645 zcmV-z29o)SP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*IS=*GWV{RA>e5T3aY(Ul}v zeR+9#ad9C=?7Y6d-rwK<^5qLZlNe{KtE+)Z_6KaHrlw*iqoN-QAssPh3;)-@iXSJ*B`33JSyp zfyY`sJ-y!EUW#gde%{Q?jE7ZRQwa$P6cy-?A3ur<0*|#eHa0suI}})beLWAK=%yMP z8Yn7&{1;q&cz8HP1^WB<@1lD*tif;(a1s<)PfrgV3CkzCabaO0MFn>cr!P7bticGr z2*DIsW@aYKB)YM_zW(6gAVoDbHHDN)bU;{xlarGvs;jH3pr9a@Npxd-d;33s{!n05 zRaK%x!DDc9b2CM?v9V!kY01MUuBn)q7>WvXe0;pPAn;iG^y$;p)l~|ty}g}>PuP^9 zFg9IsA;`M9xrKy;`1|`iI5;3hIyyRn-vcl^J3CI($;rvjpFg?bgC^d-eVdb$v$(iO zUyC9-Jw5$FgMo1d1_ro1U0q#@Fv!o3jg1)^-ot4Ux|J3d7HMf|0$&ja4?RO)Utgg* z?wAjkr>Lk19Wu^bMFc7lCVSf5-F=A3E?h!mVqI z`pJ_gh?w+js7oUyZ*6Tw6c%VxNl6J+5f~UKaG`o^U%!5(YSg0P(@INA5sTGQiC0Rs zynFXft>r?QJ32b38X@%h`g&bm-RIArHLD1jScju7)K&$2{CCX5!-M0;)q+;k4n{^s z$Odr64i66x4i121X=w@l7Tltdk&%^^6>f>Tgo}#{{1CSaX$JxzH`I*a2L|goai9@Z z=nVHrS43oFBo)=x)<%cAq?x=9F;|z;|CWV_GBGhhPdmPY{mr7gQAS1v)uc^bq|&IU zs3@un0S#wfSfwD6c#Dp)uEl#9AsBP(fgT|KU=jRK_gAjaC1kmMkb8{$a zZ_8Y@6O@(a;m z!*9AcHW~2{e>Q~Jjck>=DP1-<;#~Z(Wz&u0S*Zzy1Tp4 zvAhG5bg2U0#o_nSccXno`5$XXiswNOn>4cc3} r+(=25v;)!(NIM|yfV2bu><;_~UzOt9VveMt00000NkvXXu0mjf1=``U literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/collapse.png b/Telegram/Resources/icons/menu/collapse.png new file mode 100644 index 0000000000000000000000000000000000000000..330cedb208073c21809ad6da8253932b647003bc GIT binary patch literal 450 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/colors@3x.png b/Telegram/Resources/icons/menu/colors@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6329caf06e12006ad6212d3ff488f308c3719175 GIT binary patch literal 2388 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/copy@2x.png b/Telegram/Resources/icons/menu/copy@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5a2828a658fe81210a0265d13ea9d4dd348bf219 GIT binary patch literal 657 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@Htoa8F5oH={P>`ct4;F*8ApRpJWZWVat=IKYO@nB zuDCpZ=FQl$mz-7EyI<{HR~M@rJG1BS8m9j~jcfkZbsbIG8>c`0bgPr%?5T|Av(FY- z*vvow>q*+gdCyxDEB40a--=&<-8lNO;NOo1O8>V-t-YA>#KJGdWfh;R(}^^**&n-( zKQ7!FmDmzx^E2zh#J%U#=N|N2$oFE3-}2z)mrp+b?CClAL7@2@-=#sGPE(o0%DYxe z+*)#A#ssFT&YxuX+LupWbv3K|XwvrEnfG@}H!(6A)P*%4Y`8Z2{Bx!5_rKT7sdEyk z+!@0lev{|T#|j^v%P*%S-ca)J{Ved9ar$eK%C|qaN9=icH_v?fX~q3-%WmgwH!NCL zv^YeI)v-aaV1mwc@5(>Y?^BEx&OMl5e%*KT%_p9|%mPX*oh+ZW#{NBD8q0Ov9#e-ezwLor;JpN(`{W^vh`1xdG{Ku zJ>X`=z3lX%{)<^#vrh4F99E5pz9LlkPS3dY+izRJM?2Rg)qOK=@tmjp?!UX(*V`|? zR^81odEms|IC1{T{N|&cudFiIR2FGZ{L5TBv#{=OoqgGQj)XtwLMLgK{A#@yH)%p? fB6gA`6MbbAj}p6%)47?Q#I zHpn>3S@Jtxk1QQfZI^15{MnRD;n{CbdAn*QvZ<@b5Jt@~!ad_CD+M1a+WG0;Ke zN4+S=PM+GD8k>n8E{iX|eED+a%9Rr*3c5F(KY#vb&A(T#PF>X5e2$x&n`6c0mwyVs z@7cTe?D_MvdqV|l3kp8`_;I7wE7oz__U)o8d3Qa$yL<26x5u8`GYHwp=q|;>&o9o^ z`t)h)>BwHU#c}JS`M$pT^XJ&R_wTDMe_WL3YSq)%kL(^4@n16|FhaWCqu0AVbWr&ot^k;o0XP=un)6%|v`ebBmoZN9b{Ko9r z(z9;7d$(@=m$nld<{wye$M+3TYevS2N!ev(-#&cU5Tln|`R3PaNe2eL3k{hkpE^E2 zb&8Ak-Jd^qgi7-B*Wb(u^7qe4cvfWT?Y4dH$BH>^JNEDYFZ=Pui;iCvdCdQgkNa0BY%O15O+Y0Zq~{f({dR7CUvoD>=WA>;^V!ILEZBxlSq7bl-4rU=!VHl zk{G+zyXuNwo}_!gGiW2j(d&!CR!RJR*l4=7qSrsj>kTjz@8;DXV`BDwT)0y$z>6pS zNOW}c{{OZHOm;?Lr+=Q-Pd5uLSjybrd)Qw(Xw?mW?kH6`PaoH%^Peb-zK-QBlV*P& zwYOHb-@xQpD)V#4qjK`{nv8zu3%Yy0W!yfHm|oa(n(gM>T33h1n*!H{Ek5~x|K81; zGk**Frfl7{>sGH^b#rGY=bgwG-z3ca{QY0~e&Or?Eyct;Lu%`%gpUcHNxGd!lZuOr{q*gOW!Aij tU@m-r`TEr+Rz+W6nujKR0oD+aAKaf*#6_;DciabMKTlUbmvv4FO#n78z+M0V literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/create_poll.png b/Telegram/Resources/icons/menu/create_poll.png new file mode 100644 index 0000000000000000000000000000000000000000..7918de74a3afecaf90106150c064928e54590217 GIT binary patch literal 390 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlfUeeiT~46zV= z8)VJbY{1j2C32)eVv~WQ;l=0;g8^Fo_hb*QjnXZReXM)p$hvvk zf&!C$kIenhTd?Fz<)P@SMn(UNqOH$KEVk%7UYK)x+Ub8cB$j5*Qt_OY`tR(XOA?-% zif2BbNv+T6Ib`tX=!uw4*{`+np`wAVfjoyB-V~eYi5KNO;H|tHd~)Znlv+?2c)I$z JtaD0e0swvPjbQ)) literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/create_poll@2x.png b/Telegram/Resources/icons/menu/create_poll@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..17e5a7d0f3a63760089b7808586bf7791726553e GIT binary patch literal 630 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@H{-3E7YCEz{QVOyC}(b9dz$(}{mRRdw4IC^YrO0imhFx`$?MQ~ zf&Fu$Y3LP89%nNa0awA+I32N1yPP$;JmbolS80Ytep&6^AY1N)xY((jsB+AcXv&)T<^@$K7DPo zLt*58|HCggYJa=mBwAaz|KYyIi>~e`Kd99_Jyt98q&@1Lx8^(MLYd7>EIYnT5uWs0 zY1S!8rL!C{mxR7f;BLI+BkHtNplbHC3#PWMTszlEvoP+vu9PA7T$ri<{A9^zN7Pwz zXPs5M)|bEf>Lr~f6PfuFo>x9;oxiw+m%(mf)>f~by#KwQ2y5MoYCqg~LXx4zDQw~9 zFZzovWNl5FV?O(A)n2>L=L4suu1Vh+Gp+4HO^V37_tOP0PG0u%W5u1fWqafD?dDH^ z)^q$ZP~l7;w&sInyRTYAaiz`6gA`6MbbHUhz;xBq#W5s< z^=;JN^M;NB-`5H`nwUIV9HjX|#j4k3;nD>k=D)}+F`2@()=QBqaFs`h5a-f!;q%Jx zJx`i{_TJ9hPbb>W+nIFs%(-*t-kVqNp3U9ODxbn2>A*ID5k@)8W?a23GPTrd?#~*z zGm9_2sIgo9>;7ei70WKay#Ae;X~p|a=c%O&0|EjxbysMKUzW_Vk!*ERyww}{Qt$JL zm;+}f>(#4GYII$EF=!==ZvC-2^Nbp=W^H|1WGTV3U~SmyIg-V@JekwB-=2MT+2Mx` zE(>$FMkPG-nRVP(YD0m=n~xP9T?);uE6#KO=Tz=5;#zIKH^N=g^robF}{7{F{~Vrs{&@zjd+l z+eGTk_;+l6USzrBPIsMY z@7f65Xx4VRwPAm(;f+(7&m^b5t1_NxxBIJp%fW;Vx8LfCac4MQJE*zq?q~OFGeZ`0 zZ#ZZxASYn5D}UL?3Lih43HfQg@qr0{CYq{MUwZQSCx@0R!|A;Del!8&4p>-OKV`f&bS z=tjTg#fcy~hs4iBC@B-nilFwd4w+{s)YE8p^iG9dx=7rhV|5U*h&Kv58NT{=Il{jS!|waF|cmC>?G1oAJtgboyzM1e>5I7lVXg=Hh+t`P-W{g62*?$i&d2 zt+Rmjuz|;nW}AlmJK&P@tX5gm09x8hp{1#dB7x}4A;plW*9HcC`=n&_- z*pn*pDYNs_exKY~xLGu5eg0b0`)edO-!z;3b(7E!bxx7)qkhXb-^}?JvzK8J%c1wC z-+unAyxPXX@YcNQ&=u8Y;|sEuH}mJROjDkI+R=2T&#J4hs`i>$urwb`+dR`lrJ;QH z-5R@m1)HCfzWFW;c(5i=Xkz1;LW?^`MJ;RuI65x<{#|V~ciN=@A&ZGix7X7Kv! z@87XGooMCfxoY?3dfbT@XMEKrXDOFXeUftGqbaYh827>+7o|C^l5>CpE6fV z8(Wp0IGQiejXu%CEKz z>7Y+s)|s6xDXL331MUm>cB`%0FnOAXM_ACU(`GJ~!JoQ*dU~s`x5d+& zXa4jNnsLBO`{I1(4HCU>hgQVs-QUvd(B_iSet6+FX#pSGoFBh_37xm{T6*dD@#7UX zcJt3imA4;mTrRjW#LHm+{{35pHnVKMefRzMqwBx?zNgsUdGq6$4;#!UUar0CP_c9C z)x&qo)}?H|>7ypxeRP9NR(#0DHNfO!An~QjR`;e-1ZM>2pD3n!MwcDtInz92o`aIG Mr>mdKI;Vst03x($jQ{`u literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/delete@3x.png b/Telegram/Resources/icons/menu/delete@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..daaf32b811a65c30d31cdafdc81a9656f107429d GIT binary patch literal 1229 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1SD_us|Wxo#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz1|Sip>6gA`6MbbHUhz+&#{;uw;_ z`ZmheTg6eJ)HT*HAkZ<^@KVGD2i`M0qAuV3C8TF{&6N0M++!kk(81!5&ruH-@jnrc ztfG6W@5t>vn!J4Z{PdLU#$+kYHMrzc+1wK@oyX;aGLCkmoFpZZ+=K zt^Lc$AaQ`>q|su5JKWsd<>lqKili(An+^#4x>=yG^ZfbqY@O0PiW^+B4;K~9(2g`Z z#JuigU%=$;+qQ*iO;x%5`t|FxXL*CBH=oiI;Sv@WuC1-jVtJ@=^XAP!W!=OC=?QP| z-@W_x&6_LfYzzrTTq?gNs8u|bi&z^Lyn5AA4v7P+%qEy9mhN5R#dqxG%aw9Ed(+d? zjly=-yh*q|!-pyS+^0{QWG>#=yLYct{;GFom6ZHac^hJ=%`kED7SXAKKb}5ywPm_@@1E3Ai$;faEectu z6U~zorh6wVdYyOLqR&Y))O#~*C3ag+iQyQhdn>^`p$F@!@YX$7k)H zYiy=BHY|pzVmc%7RPpBBH_OgStmQp*c&&t_>s%$v&MP<8S|mGiUB0rWIQ5s;@z17x zdhbK-KYhBis+A=o}NR?z1i8>i&Ube*V@|H zOvzT`mKJgpYl_w1Q2y}ROjlb|zX_MWWlW#XUsYE2?bk1>?pqGrMf2~}B!7IfW#`V$ z`nXoD_ix|ww){I^(Knm@D|3AA+4JZ7`}=>_to`%xW25zrlP5X%c`E<=kq%3uK>EP{ bi;eaMn>0^4YzW;1DoQ+E{an^LB{Ts5uE`?1 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/discussion.png b/Telegram/Resources/icons/menu/discussion.png new file mode 100644 index 0000000000000000000000000000000000000000..2fefee8b9a1ef043073b46df1c0abad543a3b3af GIT binary patch literal 774 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDq2jfvLdL#WBP} z@M?&E$ICzwIU6o(72_mln?cH0S8*oC%%ErdV z&d$!t>el`H=^G>d*6qKU^X&7_+qZAu%yE0RwN-oSsSvHN|Nhy{Kd(O7bNAhK*I)0A zF1jt6<8d5{PFZ@Z>5O_v(J`T)gBe(YV}+G`Q=N_hh9r3IVeQT z>}b0EmhI)khm4+rx!!ZVmd3@z?Af=^Oo~@;`tBCT16d|7w*(Im!KU#qrX&=<9NnqY7sHFu-ZM2>l! z`g>dJmLEwnl$mh&VS`8Pgr`M6&)X+2%rcSMefL~~!GcLA4MMd}_64ofcHs>}%UMSw-k%iIuO~WEZ7>;;*iz7zy(3 zF1b@^Hk-BnxT1@aU>?^}#i?H9Ki3)liFnc{+~Ty*beHDOzjZT8t?sIMO!&xq(bHk~ zu3d`)Ja!34ys+lp?6mN}^CR;wz5bfC@kWBdoVj!F-np}Y>0n%*w66@AJSFieqY39MeFQ<+*<$%(lr>mdKI;Vst02zc* A)Bpeg literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/discussion@2x.png b/Telegram/Resources/icons/menu/discussion@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..495257521c723edf67b8584db045e7c21a538190 GIT binary patch literal 1379 zcmV-p1)TbcP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NG%}GQ-R9Fe^SW75&T@-#@awqrC zoe(DOloA8VKw*F)kuX{RwM|M&3Jwnb@%eaqdR|;y{PX!7 z9UZN&ufM&$nN4oM5Z-HQYR1OKuCA{BReqoa21wuyup5E~1qJo=^gKO1DTg7W0UlPc z)#*#ul)1RLbaZr}yLNVVLf(&$kHf>mv$Hcy)aB)+hldBo!_UtzBqYSz+FFQwd3ovY z?{8>mxVyU(wwoiz$H#APZwvbl-va{!rKP3b-rll|XonUUAccnD0h_Fe-p1c_`N zCOtntZ)|LIb92*a4VEUR#jESL=bv=d!3z~r63*Ou!60S3d}m}#E`ta zJgi${!ICK|DiZ4re}RD)CYZr*fFdCw;o;$dqQQR<8yjoDSQ#1@7sr1U_~AtvE6`Y3 zSuHIsQ8X}1Pfr&pEfvAWU4<9;(q^oztmOGFD=X7BFo*yr^TU^hwUd(*HWf0MnVHc* zo2v#hxqvT6M@Kc9;^Jb0Vk?V@iBW@EpaV1b$q_uNF^!In5^iE*LJeoJ4*cW@9u>)4 zU0rz_#8#__`w9j4DIj=+UwO*R%uE8|L^N*?l;@Re1wWtD@XHX<5s2i56bAW`NOlHsm}hH#e6XMM8LZ zIR7OnDJde|SAT$?eMLq_GQDWZ_V)I+wzf!DSXjuQzaf;Aln^aE?(Xg?x@c)>p};Y( z4h{~AILj0$7BKbX2sy4AS#)&t`}?~ts2YuiuBoYsT%c}=h=|ZYqh292c7cF^01dQp zby!#!=V*h2gW3crtPl#tw7R;A3`yHYHv-wu;^HEaUteGAt!wM+>&XW1@$qp<)u-FL z6o~79si`SuuC1+=B2>PIhlkm+t*uQ3sZ)jBpOY;xkBp2M>!-cF{r>(w#nj&3uG6a$ zEHN>0XJ?0dh~rOEl`9$kZpUOJLm-O${QTbvgA)Fd&dyFweL%RpysVg!sgUzAg5=lT z-Ccr|J$;23)Hm3Rag6hVqP}%^cdL($t&l}1mzS5*=luLUDo$1*6zn2(b#*w2(btug z6FcY=oAnN zmIcB!5P<~R+S*Faz=hy4GBR-K#D}xaH~`z++-z=c{&U79?u4H*l`MW|WV=2-KEUA^ zv9Ylc8c<_jU*E>YMp{}L>T^tumzNikcGT_2TX27cb82pGZhCqe!zr;f=QBGyTWJh% zYcV-FDSP*zt4cQ~9Fr+3D(dz1RTvZESX*1ekBn2rJWl;qGE)ZQtgI~TJ(z-@pAYu5 l=jUhrq~FNz5%@nx;6HFqaFXkPP%r=h002ovPDHLkV1g={Y-9ic literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/discussion@3x.png b/Telegram/Resources/icons/menu/discussion@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..3f6029d1e70aae1c27c4aae645cec8064c957f66 GIT binary patch literal 2148 zcmV-q2%GnbP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*IS?&PhZ;RA>e5n|EjwO%%Xm@4Z*V zUQiKR@I%F3P_Te#5Jg2)6cq~^jYtr|h80DyAc_@51wm0mtVryNBK9u!-jb;Ke&%%Z z@@{W$Z+Gv`KW_iHyqS4*c6R2yH!pEAidRzJLE79_wV1E>gTfa*s)`sJ9l<$kMnPA+_-TI z7Az=PvZRIV7cX8sc<_K<-}Cb2%c4b#R;pBq9fe<>1`QhI&!69dLuzX3@ZrNBKYnb1 z$i68+WYtK2V(g8_3Pffdk1CZ7NJFp z7PoKTHdW%rjT^&;4db0SlhL?w<8|xSWn^UdGynDL*TRJht>3LPp?|1GjvUDg@fUpc z>eWGm2IbA0*A@3{;+i#Uu3o*`R0^j;g$fnii_jbr5)zm>WfeOI{dw{@|5mk_>~@tZ zRrc@SuVm5WtmB|JC2`oQu#U*|KHM z*}0&sSFawYyi|r$8*k1D%Ze2%5@ASQ`}XbgU~xOq9zA*}e6Mg6Tj^e1zI<7Ynl#B<7>WW+oH)@0>2KG(dGjPP@S8Vp zQ~>W4&R>~-{>n@y*>W{%@{Os~g|)*mc<^Awk?@IdTXuSdBY6U|;~PCnXZlSH!`U?m z0IF84Dw_%}SFW7up{Y7m(}%A*Rnrtl36d$zj~_p(Q4_=Pz9f>h`+Vli8HwzJRi|n? z#*u=E#AISZ=`1mGV0IY!*_=3WB4^AGYS^%$irF@7*r2ey!jWv_lWU?`0?XSk-fq(G$!dH4NFW+G={7I-&K`C*{)qXE9_{D z9XfQ#P!FI_pFXy<;I=`Mk!iC<7AYj|7P%QUGz69#iIo=klm;1q|0!Wb9R4vbdZc>C zj~}-yle3FYOA<%}OK9$&)AN9=B{QUc6WmpFMllbXTzC5tc!JJzPe$FZjOL@kuP7qNW=V{0lP-dpFdwR0-iBrhFxM$@rW4IB7FDmowXlpC7&b- zE`_uWpL*cHfmSqO7$c&;aN&Yf1DH#9SE7izRlx&Uq4w?DyJ8v&aiKzms2xyN?b@{~ z6dnO^yLIa(PkLk!O$NaAxSLFyN|_;@~sx>)f^$GPLS#49Pk`B1(k4I4Xlte4ycFUmxwOqrst zRD7cE-o1<4AaK0^A3l624XazXt`}T$@xVi$IddjuNm7sj@7}%J%N6L8tin~UlyYe# z8rwlOamheEpp0$}djPnmn=oO55Mm27NtpW6se78ed-wX|&@*7b zfaS}Vvyb^k$saQX)PhimNUDs7BNc0@4Ks?wTD59reaKP^L6VC@%v7SQPAXwkkq0Gf ziX*9W>PqA^yNB5)MvopXGd4=7+op=@RBnglHfJR-$Gs&62j0?%5hJYgnQpBjv7>6; z$PTQ4DVy20Z5wMz z4f!{D)f~8M)~vxE<}0W^_7Q??9;`#ft9te7s>f)e_l_Mq*s_V-e4SK^aPpAlCCKHW z)D}yO@^qFQ^_Ogh28YN2%Ki19a$gVXQiVrBSL8HvDG8r2kTJe~f*NW+2?1RSiZnU@ z8ld)i+N3hjUZ0000#zFkLorz0a!4u;`si|KlARTuvt@ z%-h*^>-*nLI*dMSF2_Fau{m$(pvh{i*W}tE#&GeCO?j+1b7-jHu{KwY1i?k7%dhW! zY!Nvv@yDT7Cb5UVt`uG0_SVGLT2Exd={Y`Gk=LejxAOe=Jd?MlXVt1i39o;zXRLZ{ z)wO6_?s49JCjCp_|N2HX#LIuIRDNU3<9vC`Pfn)$CccwYnx6R|E#JL(k;3!7GqRv? N@O1TaS?83{1ORN4hvWbN literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/download@2x.png b/Telegram/Resources/icons/menu/download@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6e489c2164f083e79d3b5421cf1bbfbfe5385351 GIT binary patch literal 660 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HgtAqRmkMP4%X4lFgz`9CC6KCpRscy@3wG+Op_2tJqR5YS{)itcQ=E2O;jgO7fD zTEvz&78`!8Sf@8#b;Gg3H>t7}#_V=q=Bvx~i*vDl2w8pg@y8YZD^3UKi0wZo&J?S6 zobzRH%H~K%r$)ZzjE+{XuSRNnd{v3q$jACO!1(oqSDqV^WVwDVOsl`PFu=q6*WbtG zYc;2OwI5!1F+)X&^Xik=qCE)$j}>_h$|CAkKoILJj)|4y#AW;G;8as>#vnu8>U1x*v9hy zyz;gz^JCt2VMA6A#viJtPQfZdFH5YJcye7}I`CojPS5tKZ_A=5HHjP*U!gcZYVEb9 zYD@Hkl}%a?KP=k$r*fZw!rsiatP$-0W-|ZzDR9nk*4bqfFY{bGe>Uy$F1>d-(>24i zrk;+Uo_^#@xXv&r<+sYa4zZu@uK&Aa}3t6hKU f2EGXPdj}iy`vjhKR8J{=2ucy2u6{1-oD!M<47UXg literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/download@3x.png b/Telegram/Resources/icons/menu/download@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..638c1624877ee1f95a67512bf7e565a2cde1356d GIT binary patch literal 893 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1SD_us|Wxo#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz1|Sip>6gA`6MbbHUh!1UbH#W5s< z^=*`Qmy)Bv+lw1*+Z38ASiiFT`_R2;N9pPgrLGS1g4g$yH7XbjAHO-;>t66!=g)T= zoe3(J&v`A?+1$RuRe0vlN3MIs*M@|DJ9<@_?kJ3(^Q7K-zc|>|UI1m;C&5<>s3kdYTU|h+Dte`utG^M$y^bP8!GG?J+x-VzlCTRQHaH z8F$vMvM^jy+@jIwRBjo+qf?(hFnaS%5${zT&Wl!Xsk)e1mw7F{^s?lURMyt0nB3q* zkB1%(+(muIucdB`5ZSu*cJ4OLodylAp$k$a?+J@@u?9vjzr3?lS&(hU3a*yzcg)#; z*8HomDbg+59lLn#`xeFnOB+~1^2H8MJ^!?5(YCnt>^EW)ErdcFTNYnUnt3+OHTQ2_ zyhxjGpy;Ko6AHI?mRQwRCzoW`+Q{8cV!0z^?cw++)~VMlc;%E8y`smCGAO$$GfoQo za4RTKI>G*pY`W6K8}Gm0DcGUP(BR2)>5GP3zxS4h91OnE=DFHZz4xxR`O3^(md)GY zqICQ1w7;rHgl0#Xue~wn_~V&=%j?&RGwFy5bGktig9G0Tiw~!t{Hc2LwW|5xgXhne zbNyHLVw zjveaK=(^C6dpqH2rJul&-hC5{d?%+yT0FDhi=&9nB@8nY8 zZ)C1soc?{?-u}q%$MO`@)6bpxdG`ODnX#)cu9&{6Vby_d%>~bQ#Z5l>q-dw#^2shN`=q^z#ef;@n ziw}?Q^2>_n_!plj{n69blRiUfBF9=@nMVdOc`BB526qcATt2@1%+`L{XZ2OCx$~W! zUvIgY^N)qsz;UX{?6dYRpa1MS$dvT$it+2V6tAmn#h))$Z1g$!D0;0}Uev|Q{H%}G z@wyc4zI%Uhqw}BX^LbM4Ud))na5l|YfZ=EYkDGLyiGZnGzwm;O6=xhCtSvGTFq-Nm zxS(!-Kg*Vd8oVsPkY-tN{q;qeBVn`H7Nu>DWV-UUOj2Q;37eY4y+`*&Hs6%tVS8vQ zxjsNcr2A-xy3KN?#sf(k4>a!SiP3Wxne^l7j^!<6gA`6MbbAj}uITCF7?Q#I z_LlGJLPr^f52p|Jo^bLIGvgAR-=OnE`iDT-HM^!0V%1$!SW_3?*f6DclBjj1=afDB zZO-raD}PrqXZxeVa~C6a6!#aV)&2i}#v(sH{)wxS0}A|*!t&4N=ilpfceA##F)>a) zxg~1ty6dmA%k|FPb6R*I!{pcR&rG2^W6Wlsee~s->RK(4t`e)-{rBqw_Sa88ooXRd z=c)bv9_NapopxSfXKlZoy7^|UqILYS;jEd{ zPrEL@*x}iyRvoy-ni88X$2b^ZO=Z7~nC71s9#UVZ;PakqtmqSmT(88bK0IVUP? z$SGLmG&|gY$?@s;-%l4NZ9e$WCYSA$|JMxb`RC;q9m<`*j7fTp*x`pC78kj$v`gH& z;Fw%hdi2fIZEQ;Xp$b}24*$;YKh&>laZ7#YBaU;g?UZ&V^{PrXu31?5k^N-Kq_T(u zWwsO6CZ2rCWhKSKmcLz^?>CF+fmdIDv9Dq_BB9MWo?t5RIi)NwH&k7154I1H6KknnAq#qEUv~Z zDv@I*&A0k$)*XY&6$cWw-!6>U8uhf{q#G++`{BmJ4=xIs&6pFCP_Q$`VoijO(V-Hn zxm(sn8+;SG|Ke*^p@hvAgSmd<-AAkTwlQn}*xM!@R>2w~_E}4vFG1USuHTjLhpYiV zYwWhwdL>!k3AmGEcE~dzm`zJ-%f<*F3!c0)JMZQd7B3RGS7Rd8d;IZ+2?xR-Y_y&c z{-JNb-*VxYQ*X<5w>mLyQ8@a~yw|-%Nh@zwT;i6DZSoy85}Sb4q9e E0Q7X05&!@I literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/expand.png b/Telegram/Resources/icons/menu/expand.png new file mode 100644 index 0000000000000000000000000000000000000000..e817187b65867d2945d9ac3675be3172b0bc0c08 GIT binary patch literal 450 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgfOvls3F~maf z?i9nWRs(^y&})~%9N)av)mf`!+oI6%eB+jnY+~D@DjBmkZv4PDt?AwWxP-DZdNXSG zyjsdJ`Q)GZ^^XL6f8SX6d2(xF#%;6IZMo8I4{iKUX|OJkInF34?s6+DGHcCR}ebA4-~#Hv&2cl(tUo2Qq?UN$*ublONJ>`8vQ zB#ZS0=Wp@Tc$k>EB!mL^h@i}YK=dK-zzpX z89!QbMfj5K2mgCV7JT?84HIQF^c(MJ1;MRl7yxA@u0^+Q53s`rhwm~*G}MwZ&hH7hKLwv`l9D0x-1b4SW1hQxadg7s$VI9y=+ zd`xw+>->$LbBM9NDH`dG@1dr%eCxlI{A*Ml&BA z?qqCU+bH^}z=DBKzQ*i&yux|)#jRn z&YFJ6!Q<{kPq`J!!TJudGk!4{8UEbYAN^h?qIZMZ#f5+B_G?#fzr8WSR%^+t%wm~z zziG{L*7~gzxqIxuamBvm+`GH)=2;X+Wlo5f<1m?h_E^`tzqJk@_ipdeGUc6PKUpQS z>cq5gkKC-S(*kWJF0h$gf4%jk%p1o>$Hw!a57=jx8El9PVBrA8xTmY1%Q~loCIB}7 B19t!b literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/expand@3x.png b/Telegram/Resources/icons/menu/expand@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..596ac8c3cd876905091c968b02a050fbc093e149 GIT binary patch literal 763 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1SD_us|Wxo#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz1|Sip>6gA`6MbbHUhz?ACg;uw;_ z`gWH6szVL}$Id=pnd>0%CUsrUbfz3&A% z5@XBLKQB7j;;Cq8z1ezye%a>cyroLhH59lym=-lar~~$*A2j~`t*bYhxg~1t@4tQ< z_s8gc{#j!pCEM@bRcmLqpvp$h{@wKwtF!7!k5;_?dQ0}z`Q+Vqh1x6HZ%*GDe8ypQ z@3n-D5gGIApFP}OD)DyLuDf~dhZ!?3?mC|Bb31BE`|i7b)}n^4(!Fkhi+lu+Ya3kn zl;+(OyFOgCy65Jkgx`Pv{Zu_URhP4^dd=!d8#EIlmZ~OJvuShA7F)xUv;M%1&5{Qy zHqSgLu{rYKj!l6FA~p#gjN5oN&DccrW0cD6T%PNbNEtvx3uGKT3TC-Ye=A@^B>(4Tm4Sx#8kP@Xe{h? zOD|sa=EcF39LcMyo;KO{UTm#6w$Z9|`IX62_IzY$=31ANb0FrXMWf|LL*~VsKQb$C z+Q_naLm}(tO@?g7n?JG{Z+K{bd`A$Yiq6m2TYIg4>Kld|EO9!0%r5z&jPZs*qcr;i zpZ2YM^V{y+ysuSztM;ywJ^I;Z&Xkp5t8ZOfCmcgls|zF0 f=V0mqFV`QYIkWvf?%vxDN|+3uu6{1-oD!Mvf3WGl{P01AjT~S5?>RcB_tiC@O)I|r zf>(W6rk)u096ok~KoQr&bN=63`jH{wTZz?Qn}?5CRxsT2&zQx=3gj3_iKFg+OS#66lY)LN^iQf?d`60jl8lCZ~LlEzL+uP`Oh4)&$ab? z;~r-h&U-PjUFY=gzj9L;PH&Q%_@&6Aui5bdYqjM1UOV=EjO%00O%IJ+zXue`p00i_ I>zopr0D|(j*Z=?k literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/export@2x.png b/Telegram/Resources/icons/menu/export@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..43b2cc3281282436d8bcdf19be92867d51dfdde6 GIT binary patch literal 776 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@H6|OFJy)-;=er*g+J91IdWwUQg5(4q54IA+gtUuct4&3?Ea&=td+~nO z?YCw!eA{oYE0%an{U?G$n~Cie!AR3M$DIEN6^X=yZOAQUe@jZ z{<}7$HOy&_6q5*>f6kVg&KDB}{;lN*N>X9YH%h3y?6*8pMd;-7&okODzx=XObNT5D z@dpzwJSdi@n>{mPaa zyZKgE6@r)RZ<}#t`DM?o_0AGJY#}_coV5YRPArJgi`NtP(%*6P?#-7aEC*vGmbW!H zOFleWU!z~p7XR&J=(;fNZEXiGtBCC6gI#Af|;|MN?A z`wlL?c4kS_xqjDQmu3X546%_rUZUnNDjB@{_S<7ghB*_f7GF#-+%FY7xoZ1u*Tom( zlP7D=KC9HW$!+n(>#vuxDVtpQ?;v+z^0O^}jxAXiqP0YPkI^Un-s8!4da^1`Tv!pU z(5Qaaa?`r}tZ9lBN4)d5MrDQgIIZL1nGnJ@Yx1qU?b?&0Dx-A7-iaOj_S^QUNVGxh z+OUr&56WrIidq|{Au?fw*a3msjS(R`66gA`6MbbAj{?&;zflEL~m za=*8>qkx^TZ_>gg1__CZfjKHm6@Q6qaBSS_ovv7BCMKlgA`qk!v4nSqNm9CllS0!n z4h@MTN)wy}jtE?A_#ymtZ-4o|)ScU_PtNRq@0Zq{T3%LG_U!iDoi}Y=7dmkWFtso! zI-pTAIvl3&Tl4Yb#{`2Lckiw}|BZL?`Sa)7+uOy(#nskq-LT=qzkmNu8$EsbGPA1c z7R%whygZ%cE6bIZ2CZ~GEMsKXe)wV8?$pKqyWf4Rh>D5Ix^evY@oU$@x`X!h>Q407 zvLkHr14DCjajw>?s;VfF>y~B~5q9(KEi7K#5mK2cpuobx=yaft!(#24PfwmaxpL*o z*RQ5_NnzJ6&&ZoSdv;b+#OkYU?d`q3VN=v*vaiz>78dqfE-WcF&GD>M*7WtQ&Q6cs zzRg`4bTDS-uD^f(_PQ-z{W^GWgwD1-dvub`eBQs%P+t;rrOQfWwn{Td3F_M&A z-lON+WSCf6D{HwgCvA3##raE@f@V9FEc5>QuPyuZg$on<(sKDcd7JY~zT9d`-nM!3 zC+Ue{8axHy`M^&$+q2OLQLF)>FX1yM8@DK=ddC}`TFq;1Sk*WIZwfWnt zSF5_rvzFvDGc#vrXXk`m`|$hk&X~NE6qi&7qh5Q_>gsBvI>x(GvQIyKnyMfm;1Mp; zX0?0X1J>xh%_qxv7Oh*iPGbM90~19~O&2=*>-MJo`}Jd(-#@=m);sO??b{YnPKP&G zdKj7hIg!@8Q*y%Y{rj(b{EYhk=8aE=L`R3rs@WeWZN8~f*0%h?B1>cA&mTS<5WZ+< zW%a3QuhGMxU&oHMxm~!v>x1e`sV=1}KYsj}5zj5?lu@6bzuu>4vN``8v6$!&i+Mge z>sI{#aa$y~qHX$gaf>RWnMWp0&SbDUCsF3fUM;cmmz?k5`96b*GeuHYim{87=b+F;O`klg5&wGTCna`!8Qizopr0C@x8s{jB1 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/favorite.png b/Telegram/Resources/icons/menu/favorite.png new file mode 100644 index 0000000000000000000000000000000000000000..0e2fb54639f1d0f5052b4343f7c63ea937bfda67 GIT binary patch literal 668 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/forward@2x.png b/Telegram/Resources/icons/menu/forward@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..70ac7a0ca79ce1332a1dfcbc17c3f20b5d4e1f95 GIT binary patch literal 644 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HAx#mI90dBHvT3I_Wkbo!1b$6o(gw@)?GMCwrB`a`c=4W)X^ ztYkw&^r$(^JUq4&*BH+@|9rOJ z@|sMw$(~ko%XY@3D;(*){r27W-+TDy?BQ!?KDfK-%Ing5OT$)2zAjqGHpTI2mdK(9 zA1kiCHWglyDb=LdaL1ST%el18K4;5z^RhKJWx6e`Uey>m)vJ|Lim%;mG3)uYD<}TF zvdZ*Oq^=;C1KB2ZI&Htq5hKE7$X zk}_|2jtl!$$0!M3dHwYPOKZcELasBVb=EDGd<#!97B$Eyu%Bp@FMS{!cxx)B^OS8* PK`Fq~)z4*}Q$iB}B^Uky literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/forward@3x.png b/Telegram/Resources/icons/menu/forward@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2ab9b7f4b1c0acc999f4a3d8bad12e67a65402a7 GIT binary patch literal 750 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 N002ovPDHLkV1k5h8TJ4G literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/gif@3x.png b/Telegram/Resources/icons/menu/gif@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..7ac35154b0cbe64b9ba3e9f9c65d05b4327787b4 GIT binary patch literal 1564 zcmV+%2IKjOP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*IS=hDk(0RA>e5TFWc7T@*i`TL`&K zq+Bv^4Flv7LKwKG7$5@^M2Q&#e}EA(!N@=vAmviX{Zev?LP(0-5=zS5`+dLn+gk5# zpXWU1Jm)yh$@`qaY3;Sw+WWWG-fKN;@8{8I)Sv1B)dQ*rR1c^gP(7e}K=pu$9{5ME zeqv%`VPRoxY^;xukE^SzUU~BgJUl#HTwJWJtql(kudJ*XKT%v<+|tt0zgGDJFu*g$ zwwjunx3@Q|H0l!+-~psE+n`|0Ch^#G*(MQVYzNxe*$K{geSN*Xy%m_>+4S=Aa&T}E zW_*8tPfAK!U0oIU63yl1W!@#A`}+E#qocJ4l~6V(3jhEEU<7!GH~rHh2MTJHm6iI{ zzE=W}1dxEO2SRIWE3X6h=uxmxx3F%2tp~{L>@05>mR^s7g}P&6VtAZ@tp~`#!2v0} zyu4UEu5`f#Fu)_IfGtSc2yMQ$Kn_GE6a=iKDWqr~HbW>HW+k{yhoKr~x(~m1gde+N zV%=nfTmAk0!^6W-+8iAnot&I}e0<0Zf+)x7Lq@<{T{!Si4h1bUO-f42!otG+{XNNp zK(ZPc8NuOATQMUeV{2;*_K%N``}+ElKtMo1dwVlM@eRdU~2)`1ttx z`Z^>e#KXgbx-v5}D=I3wySu@$x3{;owWTg+XJ6zfMd{czb&@1SoT`VGt4|Fg7;Ex{x!731WSHU7pW+<^ScODogjNsi|ZJ zW<5MS%+AgxAHyW1ft;Ki%6l6d8}i`H*Q;zRhK7dnP;gk#PVQ4vQxL1Fs>0^%?d|2| zzmryGSXfvX4~}*e&jfvbe%{j3A~3(Xsm!pTpdcRK>FFuoG@W*LcP}U?;KxBgZf1niTL zm)2z%9!EDfHw1-<-Q8W&4Z~=X*ERA`m1V`p$4A~1^!&x6Msl|xCWC{6c@^Vmlmto@ zmBkn~SVBSq&Ee0mZ0df~vvw9?blQ5+%UU=^-OXegW*kPM-S>KRW9;_D?0hx&UcWzrfA_EJ<- zRB35xd3iZ5`f+O@4+tkZNdaAaNnyrR2347~%(Uk3l834|#>@}+Yi9Us45L#${3iL% z_iOxV@+i1p0X!Ophs~JcieclDG?ZDTM;z-RA|oRKkMQuY8B;V2r8G%{kgNuI0ZY*h z4GsL%0&KqPlm4+U*J0n!_#EPI`hW$C_5(gSk_a=#f^B>~uB(K%Am5me#F%aPs7gED zENBToHGs)~)+Z5T!Xo~_4>1J`)u!qJ)dQ*rR1c^gP(7e}K=pvM2mS-AZK4Bdn7`Qo O0000ZvAoQEar$QQVCQ+ybIoR7%`%@<4!TQWJyk^?L%BN@LR_ zw?*jWy|@sqH(g+XWcEda`AtuDy$e|FCa}P9-~awUHo33&?%@vZx+tEa!ey7#AK@|0 z!L#Rh@-)fAfk6`{D#$#z{dSsfq9ywZj(aUHEmBlCQeTDcn=$?L(@D!#>J`YivpXs% zJ8Eo>Ra~}CgDdK)>F&FH1$OhbHBWdv*)i!Am*$eXjN4`QCO_})DP&69eDnK{nKx=> zjD%W*-f$K6sZI8jXsdm7-VSIkyUFEm&c8&=61pG!`!?B#_sPS88}Gk+DL!^MRDDBm x;k9JGwK?;m_;Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NFph-kQR9Fe^n7>Y9Q4q#uEyQ4K zG=Ls@vxm<2#WrbgGZfCb_~qp#APmbi#<<|<&f@gQ z=H}*hcXxMob`};EOz6kQ$Ls5Bo)Lq2^1;aG^T}k=G`qjQKRP<9*Xv}?oR2AIv)N{| zY2JRP(>XagDVNLh^Yi1NOrpX7Gt&zYpvLX}X4cl$$bsVadcD29y;LgYf`S>wxTrf& z0J`|vZEz;r3U_*Xnog(fropqg;HV$~#*B&dYHs@d{{H@cBH^^)#$&?~cR(a8V7-?4 zFF;nYt{Z?VmC87c?+hRs6W~yIARHVVXp*@(56@6jpcEF0P+LPuK6NGX_#>ax^71l^ zmw{lwSVW+7Jwf66;3#EsANWMB;@R2RcDpV12wYkMF{S|2yM@Tm1c+2Nt;O7QfYtkS zp-|ALfWYOuEdLpla4#@`3k!5s%-@rA6uO5~{=-Z^rUP68f)3I^u#Jrkv3q!UuWMMSjl|o5HJCq^Q;a|x^0cq4DX`DoGN};5d z3~^?VS+$--C?ga~Y6(b#r7xcJYY&A)prn?7I8Qx4Kcip=D3wZLF^ONmWs`vpQj=n6 z4RN|_G#aAb+S)Sh{;aIv(2X1^hXR6?O-Z;nH#c22*BF5U3%EF*ot;G>u$;Zx58$q@ zu4EHHh(I5x{n`&)yc#s@FE1}8po@!($bh^XG!T7T*kZBxV=xfH1B%(g0_xl3!^8-W z25rnHAJ0#B3?in99u#99@;}#6S{4K`>4BP8i4zPjtz&({3}Zd?;0}~~-z@=Heo3z$ ztL62M{W-?vWElNw5aZ|iV5Ldp{-~K+$0b|gzZm1k literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/info@3x.png b/Telegram/Resources/icons/menu/info@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..4ea4275a5949763d5744a7341387e26d9ee71983 GIT binary patch literal 1660 zcmV-?27~#DP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*IS==1D|BRA>e5n>$M^OAyC>1iryQ zgDd#J2P$Z6q`^tOqHz5H3YwT0n3(Ao&`A6OCJG9Qf!PfO!3Uy&;sX@)qLJVWMLp+t zcVtdk)4jXXJL`I6Cs?YdyZ-gBo|%4B_2%ScuWS!wdm!5b*&g`a1G&G&G)M&n1x-y& zRaI4`rKM$MWmveqy}i4;yS%(SIy!oKdP;-McgW}+YiMZr5xY7%I%;cc^YZeH?BCwr z&d$y@Ha7l^T_-0e#%7tnSy@>*Iy$wS~Xj=6thy}iA&v$G5gHrubSuLlPQhlhv9$HzA} zHw+uJgl>6xd1GT^b8~Y`OG|!!zD=D0W@Kb!Wo5;Tu*)pd1s<#iAOMF$W}t1fmQ{aI*BET&F}`3e>FGE;QJQFAx+96Bh6t&!S^ zuqYs85(D6YfBPh zks2BzrohHzdwW|#QH--&iEjlO5(<*>+v{557E=HI{@!8D?t|9X*RQXydw>WO{i?76 zG$13nK{W)(@bIuyX3G>p+0yi{*k!2NUCxDBz8ZuDw=|MGFc%qzyD}2rU{rzM$?d?iRO8$vm2=-RV)OL~xmWK7vC@GKBEQ`u|IYZ%hTAh%p7#Lfsh~ z8}mm(1d5^5gN+p>Mc8X^a7-D@uy62V!tc?X|pkV3H<{ z&D4@b6^$zKZz@WPu%~NqEI#O;QfqLGG>>F&e9*GN=gW$cdVn4ugJY_l+tx6x-YQD! zNmv~tf+uMaXP3pVAS+6Wu+=egjRZ`52gn}y@)r>#C8$C;NX+mml0hZc=r<)N^3|49 zQ1a=24=@#IyW~b z`A$qsq`nlAfDSSQpdl3%Nm*r;qYA%aAgWg}n(!NhA_%Q-qs>L^3ay_l7O~6%>mJul8OTu5?$>3oY&-@>JNX&Dav4n9_9sclq zn$Z{)UtJ2Az>vd)4o~-^fXr{-?I5QAy0R`|&83b^$S!x20R&bB z4}GJbC-7Ob4^T%8++6x9hn;2Tv410nuTt{KyN6=5$J5=vG3k|*2|~pFPw*qNe<+CF zG3liL7Z5%eFDF7cnh-h@eY*bwB57phY!766Aln1k9{2^_YJPH7Ag?$80000OQ!6DK;miBrfo{$s@)*`>wr%&I}*5r8PQcsY`TR0+RxG!j?|xui@=d zlJC4<{q^$u!g=jKdf$JT_ps#t_0s#-Ew2~9lk56*UF^NNxDZ#X+GNkg7jw4Xe*E#r zY_T%l{^Q&%Ov^97e4W1Za^}W}GwXiOIG$vvVIsvl{q)lkE903wm%>)JGTVK#RT)*Y_-#@-}Ly&oA^_Qx>4DO2qRfITOo!*v7 zXX;H)Uae5C-@^3c?boUo$D`JU)$N~uy7qbVrrU2dj{bXO($yrpH0bA~UCs6P3KkSt z*dA{`%vd!2bn5>5`(HP?fBLB_#?4l>{dR42QjSDNh?eR^509P4PfS{I{IREs(Ce?e zf>xeMGoJM5^Utci_p-J!na@7^`RAMzNyB3->+j{5r5Z^#D+tX#%hvz2Xy$==hYBos z)U&q!>P%$#SRs>IwDV8jz6y_?PbF5eJZwGtmM;lg&A9mazoYjPHb#W3zS{3J`DDuG nnV+wwM8V+c>gTe~DWM4fn@tuB literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/invite@2x.png b/Telegram/Resources/icons/menu/invite@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..17f87f9f0b442cbd340a38e0519b2ca9747f71b4 GIT binary patch literal 1225 zcmV;)1UCDLP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NGGf6~2R9Fe^SW75vVH7@xlXsCv zBJUV5!9bBD3dy6yz)&I+13Aiok}^PwGQfm^WZ+rKz=%jv+@dHUc_&GEKkxnSUANV~ z`}v=J&ggdbK_JeJmFD*$G6@?WALmr; z?Cfx4MCa}8-P_yy_4P%V$H&K{q$HC&iMVBEW^yz$Gc#UZUaDRw^N)`YLe9?4s$yKD zoSvShZLY4af`fx~NV~eaIP`>s1RbP#6OIE%K-<*R)aVl-d1q&51a59_)(3m&o3*T{ z27iBlvd+)XYr#nW{{FtWxJYtZTADuCrfNn4nwpwm8WPN<<$AZiseVH_9 zMTv=tGOKc#nwm;Vc2r_WqaKhJn)Nt>)6-L0;@)7rs({w%3 zQ^aDo+cPpUm{BQ=j*cRc&_6vradj(UdYX}u5qe7@XyL-c!*NLw?C9u7)~3k|F9%)= z!r*UbXQvh$>wn*6^iE031%pI#axzT&`}?b_tBl4;N#DDMhKAwcVX~qf<2@J}8bY6h z2Ga<7bbo(;N=ga=FpXqoWg$t-rYW?xw(>t=C;%)a>g(&1y5N3A*&ZAmU}LEs1s4|= zCw0`4&DRhywzRY~Ha5PzywK8WwMIrpqHR*qkaA^Z1x0ppazab}zfK()Q%6NbwY9Zj zzz7WuWhJt;zP^ql#?{M8lY&T5E2%L$qO{A(%BriYb8~aU!orjoLydZ;Hgr=3VD$O% z=TWr^DxIw%!EMB0PGtxsj3G5JFi?L#ym2=-Hz+B67+KW=;>(!@DVMLWZ*6UDWo2b{ zcDB}_D8)m@X>M znRh4xRq)u@n1_ecH zmONuAe;5%82rm)sitjxW+bdm|2S1)Dt;QNmedztT0SXHXjnM)K7Z743v29gQI_ nCp6yDjc{kcodI_Sgfj386(bTCmQh!k00000NkvXXu0mjfH7F#j literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/invite@3x.png b/Telegram/Resources/icons/menu/invite@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9fc1e000a3f15b4ddd9d4cac376d6e2705a89d02 GIT binary patch literal 1739 zcmV;+1~mDJP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*IS>HAzH4RA>e5T1!Y(T@+5u7d{7y z4}4MLz*2mHm;(us60;0(;3#z9APgU%g@{6vL>&mGhA9a`PE<4y5u_&hMA5`T@PUzL zYCa0{t^fc1UD$5-x#!%ykN3!h|J=c4?Y-CgoW1s1Yo9Au^q=kl-2=J@bPwnr(Aoob zc6J(xu+oUH9NUnPkOvPQ+`W4@C@9Fs$H&ppacgU9Wo6~dmoM+$z3b`e+1%WeqqWfa z`1tsbA3y%1_&Yi}dj0yfudlC#+Q6vg=H}Mk-mYlTxy3(!{uCD%GfXUQh<9&hX6BsY ze1o@d-{M8JIC~5VUB7<)=g*%;4f*~1_vg=_hlYmc=jRU&4vgaT_xE4Dde!1=b9Hq^ zNMJNRJUnb@Xuy86wzei3J3Bk4r>DPv|DHj{u&%C-pjisg+S+7SH8yy{W zaB$$19UdOOv$I2!KYsj}lU7?aZ*OnQX^w1>CWms@;eNI9eZE0zV z9*Vw-G_7$sEiDbFDjbi0z{Ziz&mu!7+hbv2;rt@+C@d_DFahx9%^P0Izj&sfSZQgg z;TXX`U>@#2e*7S4h>!#p0vJM?Cl4RfhSBd84J&Z}{{1^yMSQzK12=Epq>*W! z^t>Ew+Aujvh54zeDS8!^B|YSX87hV+Cle(!xQe{%oNh}Doqok#ZH5GNLVnRm{6Bp7K$Ew$wD6PjVyZ9^Dw6CeYLwhM0kah}I94C8`o-VR%;6)zvf=V9`Kt5OLO}!ugB(Pg+@2 zR#u{EVZi?N>zA|}f%XD#XLngynUn(@(c9abpP&Em;X`DA$Z4KGe?BoWA;m<- z7#kZat2EET*w~nquh0xQNCn|>)z{Yx@gc~&ySuPl%2RAcBf|_zFp90wt4L%)OD2NLnTNOf<;$0zo}PqO9dNd@%^p0Y3MD5eXJuufzwP4UB3=FZ z^=o%`cWrI0G!99TP0pMdCWne}Pf7+vC(d+HjvM9?co6^%y?ex4RLWqBM%|}RpA@Lf zzohOQGrt~!95qRT1$EE_T{lbTumhUDy)O9%;5#O@a_ULY0X z(OU@T+qZ8x0O<=FBJ@H4Px~z;B}MKkOvnZWWF*S!+9&FbFDfcRIjEqMxt8F&+qZA? zC~7+MFv$hQGTuNb8s5qA@$u#5Wo$O-s=^FjIpm6gfq@Yb5z^NWI|8;14h|}CFvHUQ z`}d{KYI1TCH-CJMNjxJYLIyVDh*@qKJdv2%~VsEmSx@p^FOswN04vYkUH^SPhZ^TM~@znUC`Lr zD92EJu84FF5g%y*+VSSUm6Ox=?>s6g^zf#qr(eB#g&3xYt1s#v&^@4gK=**|0o?<- h2XqhU9{AsQ;9qU&_DzF52!8+o002ovPDHLkV1oW+D2xCA literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/leave.png b/Telegram/Resources/icons/menu/leave.png new file mode 100644 index 0000000000000000000000000000000000000000..ad79e545800a5fb355a7c809bc27e423373d4226 GIT binary patch literal 555 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgfY^tY=V~B;| z+YrO`2LmLoKAV{Ek;mhR8+*6?folhoHb|(-?)s(7_K|y*#}dJR4F@| zzf_1-kz4XGS4pn_ec5gW!4GfCx+OOiSlCGQW^I*Pu4wymqu7hgk^rTNJ7VEZKQy@p&hcBm{BmcSt%r%!+p^s!#6p)Je^_wf{ln?{*B*b} c&#~$N|J|(n8ad0Cbbunt)78&qol`;+0DwU2HUIzs literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/leave@2x.png b/Telegram/Resources/icons/menu/leave@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c9678f318ff8614a264a482977af85d0312764b3 GIT binary patch literal 959 zcmV;w13>(VP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NFDM>^@R9Fe^SU*T|Q4}}*@=r!B zHY7TT;SfmJ-jFEy2bZP>F|08Rf`*3n2GPN#t<^0zM^R8Dgaj3gT!ey#)QbLR`hDl) z#`Qh*y?3uYTY65%bAIQ%-~FBY?z{KOWYSMkKvLkBDKNn`UaeMZwOXgAr?~)q{!XWJ zadB~TbJOP+;qTJYQZASK{QUe&|GU1v-rCv{fdnqGv9a;-@j=gol@X7}aY0&x)iQ&@ zP^naAXJ=8Bx3{;~*H^-d3WZ{3W(I?|x3^DDPVnCmjc7EAM*8sZ;PratayeBYv)P=_ z=TQad9aZjda5kGo?RFHOo11%o ze+TF7?JcZr!;*SFmO?%EH>`9z4cRcZQmNEeMyJ!IQYk@By)01_QYw`$mrJkL_v*@I zp->3PMyS(QZmZQoY2RrXlLyn@-QA_;G*&`Dj+)cB2~l(U0YZYD{xI9jWBdL7qoX6( zlki~3LoY8cQ&Urbhxaa-OfD`iK0ZDUN#{|hUa#XRDZ1fwIx!p4btsd`;2d#{cDr4x z)o@MHmIZ^s5D@ zn-CqFaVtd41_+7rEmNsf9*+lh!^~cc!bU7Yr>CbdMPO{O#vo3Ulap6hSETcXISx@2 z8r%DEgo?!?imk7&GeP9G+wE4X)qsbsez{yGPsB)8 z%V5Ln^Z6ha2n1k0B@zj&8BX9b;Eb`nyo?WYXJ=>Rxm-16@P3}3pW`=TWCLyo;KqXU zF;sztg@tc&y1&1N8w;w3GQq6N1{46Dc6N5)RAsZ-$Y*!A+pSisg+c)?2*f$qGige; hq=2M=q`=Q9@DKCJUq9q53;zHB002ovPDHLkV1hZ}t6u;B literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/leave@3x.png b/Telegram/Resources/icons/menu/leave@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..ec56270ebce1c86e8ee3799547ff54d48966258f GIT binary patch literal 1183 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1SD_us|Wxo#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz1|Sip>6gA`6MbbHUhz{2V2;uw;_ z`gYcSZ)Hc3<7XwePRI~c6v*Y#WI5<1sO0FgxM_u_;L*5%clH9@|Cx82+*%SCv_x2` zsnJ9!YjMO14l~6$t)WQ^)$Y`m?tGeRRPj4G&6s_&@4eY?_L$E%w=Yk#vih=Ec>xN1 zV8mpn{j?c2BK$4&k{{rvOj$jF`h_WjfS z#dr@09z0kO!?5n_zJ2=^FIK+j;`^;(`<5+7zUpajT)zDIn>TA#iWE(8Tl`S-_PclM zWCZ#`ugvZ-J1J>n5OU}K{qoY%nQtF{{rdI6g9p!^J^TCju1|?t%i)JRckVoS(sNdA zeSLjx?c8M^6Sr^MmXR=j-aMs=9S;5ylgrA=R&a+%N$qzKuL)kheEF5vfBx9~w-sNR zU~O-|JnqrQ9o*G(*4Rf~Zfk2hwU6AR)lDUEcMIWm3;HP#qu{jb^GP_9$0a^YH!~4xr-7OXifFn7{Ox`9v&{?aj`6C zW8thtYyb4cr)f0?Iwl1i{P*KW1yG)?d0Wj^-Z!5<37tKoq0O>l%N+@`l~!hE&l-B8 zeoVQz_TkBj8G7gTz4E(%=gyz6UvqMD45nQW;r+Cq_2-|XMR)S{n$G;nv*u)WH&fd+ ze(vy`u7<`CgV|OIO*f}737=dhHN(J+_27{WD>>7qpS?OMtFp4Px?1{v--lOcn>&9$ ze%xHglKk%6^Uub{#xq|03uNmy73+1|_+hzlhV;{$HzV6l{hXAQl+@(bxAFBxDv@+rD?1PK9Z~y-A z;lYSj#|E#1{~p`+hiJK8pBA8bcaolf1tX4|NzOWqK-UA{zJpTUv$@UUvg?fkI2uBw#(U9ok zlbG`^I`P52!*J?V$M{T9|i3H)${ESA6bB7ykOB*e_bX&6b zzT9$bLmPMShnCa9J%x(Lw`JV+dEYes>eZ_;ddGK6UgYQN`%p-nca@E#v%Imax1&+- zy0vR7541%}OyB0ST#j?a_S?6kJxg0{J!5hvmFKr!KAv&o!hJDu@r{qQzwJ|c*C!(< pm&CDf-M!hYw zW^fcRn%Q&t<(?S5gl)IqW-BB=xSqB3-1E=nNhrR&Pm&U(@&>b%}tvqb6lj= zNzwQ6qKhvQ3?%s4XPs_N@zC_z1jk3eLcb|WL zIQjbPtIN7iKmRNcvohqK>)z)RUKdy_IHq2_{Ia8>-t_KGHs{+9Cx&F%=53#C#b7eq z*G9h6MZ!|9KesudP}a0TC3!$H8tsqe!%|w?QU;mKTl1Ky#DoQ(!&A^iQmeHYCf8M zJNGVBM=a4n?}bxu+2*HxGZXgRnEJJ0Y;l z6N?V9m$EiH8ehpV+qwOAZfL0Y(jcRmD)*(nE@s$mJlD^#D{s5^N&X+pWq+_O|M^$TYWXlLPqWB&ziXP*Sn7<8A$XTPtN=)d-M6{tFOP_%qa`}Q?+*n%Phv()h(n z)wwqCX^7TTA2rpe-FNd$q&xz(rWUQfnv~?XJb3$U)f147S@4Pn28)w8VU|-X4(o*r7xNYCQgLY9&)dajXKSgX)oA#4$1eN#NvSjXc^?$(97%l~K22eYmul1{X}#@B z-hBVf-P&~h_0&_*lCF|`?Z+Q~EaR5)5pY=;*7G4 z?u%MmwDV5d=8dk-B3>NoLehISuqcXfT`byv-+S+r(@!_0nSE$deY14;6icq-N8g1y z?Y`S5Q{dp`ulfCVtES!O7Zm*pm)rN;iVU8j4g5LqvsY6QQb>T7%e(N$%EXtMPrdj2-tTVbo%ilJ_fk+E&LBArIRF4aNCezl z#E1jPh>Om5R6RuziN$z3+XM9jS_>iv9(Epi!QCA&7TGd@Sat*;c~ByPh6n&4!4v}| zL@ag?V~YQmMKC4)w+{+wFsD@jkb)xNXMONeJbxsl!AsfNPPdecb}>~pk!RbF=M;dN zY2L;CLAeU@$f|-O?WV_#;4nj$y;12s1$EUbT=~bEA~CLNC2Y((6O#nZE7aeV;Xf)5RKkSdr`*Vbm#-=Wigj`zvoa>Jtt zNl8zAZtn;C_>6Km`Euetv%7^}WNT|{UteFr1?Wo-hx7Wids`}_r@OO`*-=+l*V1xa z>(?sxq?y8LL`7K{%IHIVb+zH6>#&XW_2GB#jEm-viXH@*ZOVx^g+xZy*4H1Zt{{WH zb?+l*`sU{5uEfTINjWM;uv4e@spusFiL^01tTZMg*x%P_I+T6R^+D)eI-Sm7sAP#% z2)n#hQ#sQZ3q=H|670`lQ#`U{7F2W_UV$1F3b zi;*XimXlebOF^y(L?4TlL6n_eTO;zZ`*WS|%@otm1vtv3mxFHK5)V&IY~O*87~<7*t@DqCoD@Vjh<@$i<`&Gl z6u(^Uheqe+IxptE+srF=TLX(77qRBln`}g305G z5NRqK8b@1md-P|fxTTR1lKiIp2TIz>j9cAvYL=}0Xi5l|%e4n2jqL@yDg_)6cmI)p z_d1_{)lt7MR3v0fmijE+wr8OHN(uRdlcklFsNIZ`l7Mf$Hgy&CQ^OMz567p2HD5sk zwuCyAyu8XAv5AQR1N^$m8VRGm>FE%C8)#OpZjK3M_lB&Mxuc9NLv@wMdw`7xG1z-l zlmFeCoy~9EzJY=6AP38ahY#0b7x;@_9hKH+)9wx;HD9jyriNa-R$7}{K~sky1zECN zwh2d-kKi|n+6{gvRHtCPk=MQrI*4+Ni_nF2B-yFgVQoZ%=udlEt|-w(T{LF)l9xP@ zNTfxu4QKQ|0>5_{4^ICV DA)&Cq literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/manage.png b/Telegram/Resources/icons/menu/manage.png new file mode 100644 index 0000000000000000000000000000000000000000..67d20772f0ebb857a736028bcfe8682ce201b249 GIT binary patch literal 517 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgfEZ@_`F~maf zZiwN!CI^Ag0}%|YOQ#7qvv;aaU3i4A-;tGFp~X0$m_f^r!R(d*--6DdTQek9`glC> z-*ocOe?7I?_dUNp+iSjg_vXz$YVp4}hNx?wE;5@f>iTis(LKTPGrm@>&6K)ma5QIH z>L#7X1svc@`q#%F8SZRb`@Ax9mXdnA@VV#3mrX2WnpUkU_)%l$zg)N_ z;7i^9@70>p=iEH9pS`59ems@N?hILYc*} zA8h*9&OUqWdu^Md59ggIiMHQ=@gHTzYsckOW5uN)ehxNM^V%i+|ALQM(`qFr%% n(--zK9qvC{DAU!le#1WoIj+?Vp794WKvCf7>gTe~DWM4fv|+}D literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/manage@2x.png b/Telegram/Resources/icons/menu/manage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..158a8c8a52f5c2b3fa7df50d1f14236ef2cb0393 GIT binary patch literal 630 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@H3TOHZBaO* zM{$j7JDx;@N!bm?m7LmX#aiZ^hIYaE?$0gENye+#Fqs&F%^@_nmy8H zsl^!G4QonVwZy??Q{4LN@4u^_+&7Oo?TH!Jal?~`Rc4<}n-u)^b%x2KtJ741PdhCT zJb7Wo@4x5%_8(_vjeEKzFJt%Jxb@-NvM!1SSw!rOOBeT4bXY7YTCsb-{I7*G7Dk-Q z{2TD+Z|PNj*MinB&VnM$vwkh)SiLYemNB;R2-hEmC-Z&=SXoS*2#Rx0S3j3^P66gA`6MbbAj}{@v5XF(iZa zZIrdQile}{cSpXzdc-U$5_2S^z9C0VO|3~`8C#M}z*m8q#|a&q$7vuAsHv##H~dGpMfGiT5C9u*YsF?kUi z6}4!YYei*cWK2v7kIpyAS=rgyCJSpt7_#MkMD6AJZ#$-#zJLFI)#H;ln6Jq-_AJgY zHZ@IU7c{*ibNG3X$ye`htYO?KDJe(3x3f7MxK*rT#~c3h$B!MmcHQDr%G&XW(fUgN zv14u*9fR%c?YD>XB{cCUD!*%NWXy_cxqkin)O=U+zA?-}~bQc?Y?Lt5>hyyH|Gp`^AfuE7$)& z_i4J?<9F}gUA%ZPLZ_^v;>XXQD?7!+zVF*-r**m0MM)>|<#9uMd;cTz=FhLasqo5u zs@nyv?-w(sJkrq9)6>*knD(GaY~z8&=}af0lj{2ej5g)x=BAciFk){=O-+@Rm8}Rg zepDTh#NNw)_wnP!?Dy^Uwn#1DI>;?5Dmv|;l$4a8zkj7Z|K0;En^JXJpWVGX_tJ{8 zq{ojRdvSa^=J0H0LGhX`Tc(tky}jyQAazJ|rt-F3yI!?uuk>FUbTgulLHI-s&mE;5 zd-l|1WUN@Z@+9Y?{rlr}bSHW|dHC>P(w&<(JFiv+22ON+zq3>J%coDDzJ1%4&QgB7 zx0kmt?8fsM)-Km{c7z*dH~-^K&`pYv59+BX*>f;lsqW&Swr7Co*wZFh{Llw14AcgXP<|i?6eBVAS0}!S@8p- zOIjKvHN*T|h4+!&H>!>AeeXK5!}3|xd2ObXr}rJ$)l_h#tgP(G;i=oduwD~wv6ecp z_1BRjEX5`Y{%txR&(C@J@@027_oXGQdvccS+`CuQ++~SBw}n&$Fhi(K7OVA`{Yb}X z`s+K+kDf_9e_k$sZ6Ax~sU;zzhn#q37jnf;@tnEZ>E6Gamf`XpowrjCK%s)RXG&$;*Ws^9HBpYX%Pc$JjVOrK5{B@r&k-d7^2a{b3IW|ZuW z%XHyAllHm7=3ni>ZMWB+ej0RL_3RWl2h8Sb>V?uDf~qZ#*3xJFmZ1b-Mp#ve#0ByHRVe zLCf9xN!pyK|mr$vp;*K4fi{wQrQOgI~? z?mu6|XyM&F_T^D)r+F>?{BzBvs*;6FMvs;RI7;xfNBq%s=A4@FU%6$`#S8<9BlVM( lxiVNg>31J>a{1BlL*5|3aOIAu6;_})_H^}gS?83{1OVyn{+|E< literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/move_from_menu@2x.png b/Telegram/Resources/icons/menu/move_from_menu@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..13ff7f744f40dad6b6ecb399701595fc73e52537 GIT binary patch literal 999 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 J%Q~loCIBmt1`_}P literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/move_to_menu@2x.png b/Telegram/Resources/icons/menu/move_to_menu@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..67034365995944e87106fa36487705885ea4c7f7 GIT binary patch literal 947 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@H>+);2NM_|X&X;BF^-$cVc+e@tC;dG? zN7I67NgRz0=T+=JO=M=b-1YwMZ-(s==jP1(`Rw-0&vzCtK3sgFVH3{_mtC(*tY)8G zcKx;Mt^C=!X0xwfzkW4q>s`(LwKX+0<>lrxeHyfX|NQY|$Nv5HwzgBxH&;~I%&Xh4 zKb!rrg;ejk^XH!y@7l8`WQIhWz>%j#Grg8pSQPdxbWpgEW7g}YT=?(r=bE~@PYH!9 z4L&{kSYbC`-ML_IoV(J*sI|vZ_b%gdem&GdtPLj=%lW$9v>ec z6|DF}f=8^o_2HN9iR;&|=VfEQymDg4q}0ukY;)$OMwHI+Q|}3QlVM^d!zao9bkX65 z6%`c*v(GjhN+{hKQ!_(fUteW@czAeC*{Ko+bzq1)CV8iAzunm?wsYY|O$%Q4P#wip zKcaa>Ia&`tynQ=*{q@x+%`b4i|NQd^%ZU`DBTFy8?AWMo#<09mLf=)AX|~fs2Z8(d z?nz{nx_HGHIGdOk984+PefN>%hm;OhK~E1(>6Vb06P(PngoDnt&7ZI(S9_wzg}|QV zPoF=3K6{oo`m3(w^TS?CKLJDks`|#0_H7#u1u;+LEx2WS`*V+C=4H9#9-Z%9B#^SYE(5v$jKunRkEcr;oQh@rs&k$=$aK0kzRcI&8pP^wfGH*<&w^71DCL TE^AqXK^ex=)z4*}Q$iB}|CxPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*IS<|4BqaRA>e5T1zN)K^XpBawiEz za)}~xOKwRLS%{@5xkOngtVl{JS;|I~SjaUy3zEdfB@u-M78ZzdSIGVUpZfl$G2fie zIo~(ue8>NvvwG(}Gw(dlJ2UUhyyyJ-Wjuxl3=bF{Fg)-dc)-DGjyX9w+1c4qQBf`~ zE>;_nYWVT-aeREdwzf7qJNxuY0UBNvPqrGtY*dwV-3hL)^IUsF?4-rn9~n9x?7oSY^mCP+7S5w^Cryu7?< zR2F2p!DDD>sHUcdF*G_l+SAkX@bJLsZ7(7qRa8_oH#cLN(AMVW=CBst-`{Da^>TN2 zH#03U#bKwj(bYPGbqFs84ru5xp8ziTJveOOr7&dv@4 z0FZ38o|&16ai{Ix-Q6W8C);XQN&Dd7VC-o$2E@t4#6-(BzRX~zs)vWi-rinBLNrdsXJ=;um=PSAGAWjqm;3nmkfIKSkdTm)k`l$hj*gC$x={Q2I7vzo;|C9afB%b% z3wm>0U0od<9K5`|lrp4&9wDTzu8uwv!c2p#0Vigw`M>>OmTMu1SPgaW%+$-rlOmgt07`m`+%Mq)1}=VI`87u2_MXm<^iC zYI}RTsHo`q`57k82O+3)G;X=c9ybY$t29-zPqx!%gkO54MXfHj7E zEq$w%8VxymBxf+l9UUEVDqF52fEbdsmitipHa0d^X%qAM0*I}zubbPoMKd!qV@q>W zTLEiqV`HPQudlwoo<@V!f-JJq4>35ZF6V!Glcn3#UJ zi6>@(8;(msK|!dX!J`T>;O53jKR>^JA(_MF_T!T|rpadF*5BW6DlRQ8{p@58y@bFG zr>)4y$fTsCyu3Wkk~w0IR5TN=jE`Dey?RQ1@L;a7^nVEIL6K>h0mDEgM)<_=otD&q zKyuWy(q1wHhJpGGD*Qc4f2!Tz-*ql3@j@vi;j+_djv?S zHAYwaBIECs)6-MhJ$jP?&&pqHQc_YLA0PF`$AkyK0Po9CC@P?_4#y3UY+_|{0fxJ) ztBZ*x_8LaO02nzlkpIh(`KTiJWMySx?IN2k6^P7RiP9iKV81#zI9OR(Q5-EqfiUbC j9xyy$c);+04n6P(3Uq0hkN~H#00000NkvXXu0mjfDc*op literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/mute.png b/Telegram/Resources/icons/menu/mute.png new file mode 100644 index 0000000000000000000000000000000000000000..6694f696988bf196060cbfd2ae864fbff69e74e4 GIT binary patch literal 765 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDq2jfhpb7#WBP} z@NTemMwX*U$fN(xkCtDEV%Zwx(KI1~!>noP0XXSXsHJa%}WonaMOOO#5SV zs{&9~u~lr5#taQD703He*2aVz-mtqT_Wj(sb2Dwf&nb>v^S_q0`CyHmzF0TE-IT)* zS(qBz+uLv7zTLd|arFH2+i&J%ZIya^^zp~8qe>NP-oJl;`m{I8>#tQaeah~%ZYVD= z=SbKy;q>X#+%qa{@(d&x7G2bs^7-eV$B&i8x?^Kv{$#mV@4TDGvix%93RNM_0wBtojiIwa&j*k^K1?@8;^5-`nTyXuhor> zi-62M;j2YI9e3hfw{BgT-|wyJH5wvL9M9%W+t}iyxbAG)X8-!@DMmB>ma9$f6uVfd zIrY@jqMzTsxjk!`_BL_xMGoaN>i>*>HGG_O`l-f*u+>Zb`;#}{?D;R;yy{{GFhW;d z)shT9);;t0xZo#I}8-Tn!)&$jJ5urx&LPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NGxk*GpR9Fe^SW75vVHEa$Kl9Ez zuOumDLXwGVCNWYbjKoYBkjKbClz}Kwk^$v4AQU3c0g|M|fW*Kn$t#b0Kh`~K|MvO! zIs3>}x6T>tv-bMe`qp>WUi)9`KQ=bjk2M3<4E$gQY;A38YHE6VdJ+;6EDG!H?w*#G z=I`%sk(YVn?Ck8{AD@ehiAuJ+uNId zPLYw3M@L6w&)3`A+vwyUeDgrNzt3tG>RTG&eUlC`Uwfa&kI5J0m4>Sy@>Ljb&`e+B7F0 zAD_+5O=g1xkXKk(7%PK=gQ0YGc1D_631NSKKPM;Wn>lrNcXN!ct}aH$Lu5T<(xb*_ zW@flFVE`Gqq!hBRE(DyUgRb#--xgOrmL$Sfgvp|-ZRwwMzrN}&`b zwxY$wMRM5K*q{ZSob(U^Ak298+S%E0aBxt;kCcIx&r3Q%S%;Nm54SyJx#GDCMHDv zCz+gK*WBDJ&7^5g#)Pm9id9@%TFUVX3JQqO^Yb$mD=+;Of`Wp`0#`IC^|ImK1Sexc zaKaS8oAv$uJ)#hjo0}WbMiDbIG7Rv-w-ioTS41sNcsKbciK9qNObnU{Emc=nGtl<- zHYqDADp;uq`U$~Di__H96k_12;C@JLZEX}ArNc|;!K7?#Y-FV(SVRbJQcl>oBO)Ti z?VAD=6%|qJy}dmS+1J-c%J%klRw^4mt8@w-9UYu%jA^s8vzY0yQyd>3gsrji(1?cc=dfpCm&oPD+@X#)0{>|MhN-t?v9ateSP`0&&tY@1kt$JG5r)57aI)UzZVu3h>$pdiw5tq*vmj1 zwI+Vh{4wci{+bUkEl#RPdYh}N+tV*lU6+@aJv=;A0mNIgoWjGyPft$?c71(a^p(hQ zadA8ksi^Sn{QSJU9UAaVaKb*sFBi5ec{v+!ly7t*oML|oA0&Bnbd)(^gf)Gj(c**y z8iR;^O^K~vLiJ#FVYuPpVbx5nf|7EIii&!8cmPOeXQ#^kE4SzXb8~adNpSWm3u2xQ4-a|vV1sWEr2h{gJz668yEr((b@DJfyiKM_1VJ#o4S3=I4y=vGi`2LA61`~m!B#_$yK Rv4sEt002ovPDHLkV1k{+U$_7O literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/mute@3x.png b/Telegram/Resources/icons/menu/mute@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6be5c9a8c1ea534b5bea44805560008ec9925bec GIT binary patch literal 2127 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 FV1goW;UEA2 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/permissions.png b/Telegram/Resources/icons/menu/permissions.png new file mode 100644 index 0000000000000000000000000000000000000000..6c494262c9a8b934ce7ba6fe0bedbde78944b1ac GIT binary patch literal 740 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 Lu6{1-oD!MD z3T;L!MoHx}%|{U?inyHGPpf>in}6>5y}##up7(v9Ki)sy-<#*_je~%s57lS|mSZcH$K#LU(&{?-=uw4TH09d94 z0BTrky;r9F-_)}V_`hB^7NR^B0RWvkFYH18DA2;6ggtRY*dzGj@?*EWGpGOJ>CtjrEZUpw_=Bvm1PV*gP# z;hY__ApRJZu{P`wxp+#YoMzqO=zbl|O4l4RFsNV)98U4~=kRzu4ksx!H8nl`j#T*M*1*>eJa z91dq>WF*MmnM5X&4UDH4)4T&ii#@&6ssz#*jnL_FDGp^;}9ayH|q1U@pg(t|jkta&mHUfftc&sG|FAa5((= zCrwSC?CbMpv^Y3BTUlAjnwwu4M+DrJ$qEd;>ySufXi(78b5Omsw6uzf3JVL1!CbAQ zeLYrD1Cx`cJNObwKs|ku;hJ^nddk6|67WNm51m4RD`@c6;JTZ&wT(@1?n&)rphzrE zHoCvI=7b#O49Mljhmp}Orz8C@ySlsgZcJ%6Ha2cJO-RekEKQF&b_@(}#Uz6i zkQJ}D+$yb4|3JgoLFXSm!i8F^1PsF19bL<2{_>km@5UFd9?={_)%?UnSd(3T`dSrr zLmw>v=59QlPKOzYbYsiz$Moc%LxYO1c$RIuE2yjtp-|BD+g%KNE*kVUAz$EirMkM> z=0jS$rXvQ93D<@W8h!oZ$#CPGxQRVgtjxbp) zUciG7_P*j0HNwRQYGB}7UtcD_`uF^N#Bft>trd8d*+DD}FSoBwD_5_yV!)#rLf+#bhwku|P;w(cB3K z*hOkJ$h6!oLyGA3i&pU-vYFj4vEM5Yo&gENh~FvdV5l+Xa0#mCz#s?Fu&w=ifl8urUYJX(LY%MOim21ub1<>uz*BtO3$;y_8DL^!;^^pTn#+m>$l@*tr<%x;F5uUpuF(CWoe67<@|ktAUVmX;?%vqiL)5H) E0pz!5s{jB1 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/profile.png b/Telegram/Resources/icons/menu/profile.png new file mode 100644 index 0000000000000000000000000000000000000000..57a0b4f80422537a51d04fdef398a050f57fbb09 GIT binary patch literal 795 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 L^>bP0l+XkKo3!vC literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/qr_code@2x.png b/Telegram/Resources/icons/menu/qr_code@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..019f62ef00bccda37ff9d998f68e2eba49b1a08d GIT binary patch literal 774 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 Hu0mjf%;#|q literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/read@2x.png b/Telegram/Resources/icons/menu/read@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8dcbaab00b27d3f79380a0e7754db58ed201e9b6 GIT binary patch literal 1552 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 Z`~xrxF0QDFJ^=s#002ovPDHLkV1gqdZI1u| literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/read_audio.png b/Telegram/Resources/icons/menu/read_audio.png new file mode 100644 index 0000000000000000000000000000000000000000..cc19a57215f5fd059807b61a3fcc31244b278317 GIT binary patch literal 527 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgftkToPF~maf z=@i?(rT~#vPR>r=xviX21;Z0^UC#^Y+-!*6uytVyqpoe=uk4VxB%?n?BwK(bi`g)_84vi+~*Undqjz4iQ;lhjm2e~&nTo4Ef+EAy)z4*}Q$iB}FYL>! literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/read_audio@2x.png b/Telegram/Resources/icons/menu/read_audio@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5b3556a499c52f3a164205e3604d972f5ebeed08 GIT binary patch literal 1123 zcmV-p1f2VcP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NF%}GQ-R9Fe^n9nP1Q547TyB-rM zO3DjGA|{kl7)ySn43q)?fW*L%fdLsQh8P$!Q4$GdA`?+YOeFd76pEPn_1@=M&$7?Y zd+yPFyt-$={_$Pk^*wu^z1G?{5=lPE6-cf?Vprf>IQp!ttmfwC`uh5Uf`T8f4?I6# zpOcf5_4W1T<>i~3n{eduS+%vbZES2jK0f~PeEMv{ zpe;*DNf{d(>+9U2sj0_VzF)`8K-~asl zYz~HOXJ%%ut*x2wzPY)H%e1sKFGi*S05h#1fy&Dy=r|Pn`}@j!czD>_+8We25&?{f znnU#=P3)ApHmj?vA?Pr{P&GjaZSYsJAjikYm1t^eDl`#>)6>&R1+B$Rzz#=4DR{-u zYQ!Dp<~qf7?*0na6V6BAwNoV}CEeZKoW9c1(wOfFiGELz$HZFz1T(G22T^OI1}>dwY9=EH5u#SXgjcDXls(F@Az1hnwh_?W3cknwpxK znHfQ%udJ-hW~H=21<9viV@X8U)zNpSC*DA+8R{G7tp7++QPKSTd}U>&z;nQ>eG%!qr=0) zi;Ihz_2%a0Fh4#%c3LT|I&xwxBOwB#SvCa^jGdjG7RO$lAgN<$Xh@>%<>e(SFKzzD zOdU;4O#+T1bs#iIawQn54rwGRxgsb?`9US537^+ZZ25tvAO%`+aWQ$6!l%?EqoyG!N zNc8Dq66RW{USl?hnM7p0mUu}404%=C*Q@V9Tjo?rzN6TnN~bQSoRErwq{ef4ddek) pa`qqnq~{cu97(P~as_->;5Q+=CZt_%0zd!&002ovPDHLkV1kPg{cHdL literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/read_audio@3x.png b/Telegram/Resources/icons/menu/read_audio@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..64ad08126aebeffcff8958a6d1636cd3db26948e GIT binary patch literal 1657 zcmV-<28Q{GP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*IS=<4Ht8RA>e5T1zN4ZxnY=LMSOI zEU-Yi#mcQLNE921tlY|)k}TXdBq>=aJF*c;*jU&hmkkyumy%nG+$ns&@0)*5=YMA2 z$Gl_4_j!s z+#pVDZ0!8}ydL(LT9{P$LC~WQSb!U(^+hwR4OdrJj#wTY9Ssf+78Vv_@lcix(H$<) zh+9yAnj-{&qYGj6O+rIM!|Us-n$z|5b$54nN=k};9#Dn}4Ap4p0v+jx`jV!%xA)M{ zkebBv^K*ZHe^^+UF?1Nh93X0Bbcarj!8&23>DBb~G&Uw!ZC@d%;weo{e4+knYmsmXn+Mc^$lHHvX)@+WosZhPESv_ z!Yc(6;LJA=FnDztoSdAQnd$24ii(P&clFC`odg+k@<}A7G-lXp^sMZ4b#*LzdU|?l zYil#W3Ei>%4V3i9MOza*Sk8`ZR9ls_78MoISWp?0#K0zwPALc|83+&|=;47fi6SEL z`IHv2gp-pKYQ^Nk!^5<+wEuPU*#$afITwh1W+c6j5|GluRFSIxzKPnInrO-xmbJCD zpF&XuCE3{paH#ax+@42kT0X+#HFUdWY!eG^wD9dkQ*5%~n3=a=8 zwbazqjg5`s;$qgWdC3Scddx)T7|xie_QJvfy>wPave(qqgn|0__(*L-Lqlh0XFEGP zy}V>(V8RG6dK43~3=4HG)jl{lpqIwv@$vDjtgQY0eQJ)`f(!#2vAphL1Q%-HZH&P>b8%UfDn z-rn9QNMmDTNJt26p)v@7hG?PmM57S&I(B+`Ds0RW`uh3`3JNYRE(D;juWxpCwzyOa zl!kG~)VSZ!g0#?-USv;h5-YfD_J1xka`Q)}vV zEHE%o{^-@vk`}z9n3|gE?d@gD;K<0x`T4mcLl6KBaTgO+$ZA367)v#1wA4WQTaZky zudk~M@VU7;EGH5iMgXsDB+4?!a3W1D_2)j+ipf<~RjaG3adC099qAQvTrBtU3C0L8 zdK3_{%rU&bqS~mk=%ur=pPwJjB*(_a0s;c4E$Weyk`m>}jkc?0Mu5>%>pN^QHwj)| zUjEJ`*r8XrVXSPasi~n3poBxDU8`(?Z>-S7Oprz5&%MmdOzN1X{Fe(&@HB8VfVsp9 zC+3?=91UPJ8aT|sDH1#A6u!C2VGbUevE#SO%1U--_VDoFLdS1#3=hrlfhjgz6p<4X z6CE8L;o;$b=AhGmRvnmvh5O~6MuKlR6>`HDf69P#&sVjIZ|?bW z9lrVa_-OiuUF&Cm4k5-Qn{P^Pff@u^ubv}*1qc7i2P`)?HzGR`0=ls9V*$Z{30OC6Us1wp}8(u5*|>bA3Nji z0TvAW5K&CFpZBq|RU^U1wIg6hz>a_&0XqW!Tm*gr@f(PSK#p``00000NkvXXu0mjf D=wt9N literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/read_reactions.png b/Telegram/Resources/icons/menu/read_reactions.png new file mode 100644 index 0000000000000000000000000000000000000000..f3a37993578af751ecb167f8528e2d3d2210914d GIT binary patch literal 820 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/read_ticks.png b/Telegram/Resources/icons/menu/read_ticks.png new file mode 100644 index 0000000000000000000000000000000000000000..8eaab34cc67283237f30681b90c14e749e35d6fb GIT binary patch literal 494 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgfEW*>pF~mYJ zIYEMTv7&GMfJCw1)A37 z?^4p!uV21g{rlV7etG*lckc>zU5J=8X;Oxg!@DJ(lN**X)E+!}a^=dEKR-P^9lyWs z=g*&st6I7uqNABjuUxsJu=>TTS4>=T)@42I?d%e}&d;;`{rS0nMux^FsS>k*ms7RF z|NZ?fE-1)2F*_%RWmeI%Gm>?6b(NJr+xg{zGUjGxVzKIK@s5s+FFw7$zdt%EDl8;~ z!FOlH$3+t+OxUvJ%iZ1Ojb%%gElYZJNG~Zdk{;2TCnrl^UvoUPZ_OH>46X@Bmd=YPw6n8YVB8sMyDHD4m4RVz#^f)n-+RY^ O!rIf-&t;ucLK6T`9K`hi literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/read_ticks@2x.png b/Telegram/Resources/icons/menu/read_ticks@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8345e900944fc92190ae33c6776464b26a89f511 GIT binary patch literal 727 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HV4IBUzfc8HrMgI<@wKh&p)<2_k7Qu3(aN@(hGPmuw^iBVZ3!< ze};qFfJILSHH%%eEt2`UsLCC-0JyFszRQdZ<@^X z`F`0T)kNyO=C*YmE{n=`_i{VTZ$9XtH$B;y>1deL!hjoDTNTb0ScI$$xzXdWacbN7 z=jKwp9>z0$u4I{-DF@^%efY8BYnALJpXI^5Zp~*oM4~fy#N=&_YBkw>(`WV7Bx9zp z1yb#YAC_3{k2&_RpzEm8l9}h9vo$lWR|<&l+bim_IPlHH(@*nu_CIfRV!Wgy#=ZF_ zk4+=f*>cB~AxyIaG>&Z1nSZ`HXKPgC+OPm2jSDsmI%22uwjWMwKg@V{-|wS0bHpyK zxt=}yEZZy}wZkrr&k`Se{+aNiXlF}2o7@y1wZ^-7+sk&#@&v6E5oVnw-&A77yZGY1 zMIl-r7gX5rUH|@j@9C#Z%uKAa;v0*0^4zm1-oCC?LOGx(D-b-gMvVb zm8?g@Ki+fCjqPmb`pNaP^Ds3s0L^>O(CTC;)vF-PcH;K?@6C6IWc#deQ2={(8LiLI#2xflIaMa%UmW8@1C{cO3`njxgN@xNAO=T$) literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/read_ticks@3x.png b/Telegram/Resources/icons/menu/read_ticks@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..7f64c04a7dcfb4cfdfb01d65a3f1fc711654c52c GIT binary patch literal 1259 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1SD_us|Wxo#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz1|Sip>6gA`6MbbHUhz!K`|;uw;_ z`ZmH-qdZrp)^}#RQp=(g4o^uhvj_>Xq{OI>DIG>@c{C5XO;O@bO7@t@D%Lh-p^v1P zhKQ5oX&vMH<@^5a{h#;zS9R^7uh%}u$DH4Ju6Ew%InQ_QuYULUtM{K4=0l7R8wwmO z6l4VWIM}gpw=!EtE;=#oWuS_yquie=FOYWpFeN0Yv<0)pthe=rcH~B ziHV7en>J-i#-hJdKF_%N@#9DP{q-|utEGPZ`gMQg|G&LGJy(u|{M*yrefrI}7BQBUm+!9LSUGUJr9vhw1O9}6%2`td_TR@V1X zQc_aEycx;K$!%?IM?&Ndy?ppE@luy*XMewXp~j;K=OjO0-|V5g|NJeF z{(1WOsTD3f`Uf{9b@) zpmgWXEn8Z&yw03&3=Iu^b#T_KS^vV9SKKNoDOsT(ZeCPWv_ihVzTW2e6_(KC($cH9 zZq1r8pLyY%SFgOR-i^eajY)^`Tq2xwuxa%gf8B@FnHt1OWoKo* z&~kW_wTtWJzXuN*W>i;KpF4N%$e)@H*{fHtx+crZ$?bcX;p)ozk@5AbR~~aFPo8XZ zS6)_j=kDFYpI0wvY&>}83{R%(J!50z$^4NqF+M&HA+i!Gs@4`3Ik~xlpPxKAa{G3) z*Y8hepMHG%X7*A-LSli+qP}5U%x(LV{iZc>({@ZW}aaG@a4;t z@RSe^Q;?Bcn3AL~KUuqGO;}i1N9QeR35gZ&UhS5C`0(K;k?FH%bIYz=x$=|2z1z3F z6J=i36&6lRYt0gok@<6X^1_c#PB*O=0VZ~fNp}t&bmV&M@%>Zv*LUyqbaZ;$0@;+} zF3LP9C@Gn8$l}u9BS%;afj(WdXwj6JZ8aewOnW{|bkUqMXU-CXK3+>BBc-PcdQ0TR z#ns=(pEN#p?AWJpx2f-T?zF6wm|nl@z%^elub?8nS;vn3y?p16PAtn6Q4!CdYc4pa zr!Swd|XUytZC*V(bMP7T|4sU^f_S2D%Ctt73$>V vZ`<$lSN>_xzaPr+0$4IJJd4*{Xsl-xG`4xb;Qzc9RM2?3`njxgN@xNATPHdq literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/reply.png b/Telegram/Resources/icons/menu/reply.png new file mode 100644 index 0000000000000000000000000000000000000000..d52ca37e9922feab0c2a8b223157fa310f892f84 GIT binary patch literal 429 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgfOx)AOF~maf zZJ=SFYkAlM5^Q!Of+%OkbuMTF}|z9VqhI=Jl?+l?_@-dTogT ztkX|~$JlwWI|@wbQ1M*%`dFb)1=F=s-P1+4%?@2?%)K4of6k&WQ6lNX;-l|fx)!BG zUMrpZ{`X-6nWZ|XPi@MXm3II8s#Rg3rC0tKa7dg!bZUj|dnMn?(^3z{EZ6(qt{vwn z@SvaP@SaysE9DLyiTdUya$TcK=XBG#!Z~}VB&^|=m?+5hptxR9BJRY#OsPXQEG5cQ yo>ta{#a#bt;+uPW9_PFVmGkPI{!aT>$aLRFVy;9?v@R%O7(8A5T-G@yGywqL^_+zO literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/reply@2x.png b/Telegram/Resources/icons/menu/reply@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9b323de23a735ab7c9d49efd075b983ce1f1ea6f GIT binary patch literal 603 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HB~K>xqK7!$~_e29E%uO6*<}(l$yG3 z)}Ee_c;|&$Asf$WZ{x>L>hu5oOnY`TidSBxfn@@N(2sPMw!;sLcFsAQHZ@{;?(O)O zi&wpxZM!kgY_{*-xccRa*Usi`zih&LcL~b`UoWNGO0(tF-)|zt>lzr*`~LUeI{9g*_{82GF6TOB7^@z$ zebL08byu@`k3ZJv%8+|-WRL#M)_&&w>N7T9e#wyki1SM#Kd$ZjKS=wC@ErB3Ni2UR3O#yRVI$;!H}AWu(RauFHoj_;e}DhE|B;1So6hM| z;o^ZC<}EPVdi$+XU`X(V2`6gA`6MbbHUhz|`UC;uw;_ z`gVr(`b#wiw<@KB5we<7PGmjGWD__h>X{|F8;}H&eD7m26Pl>0^vh%aAk=dSiRyQ}?yRqQm zn`f13@yjQl{qRqehwbU#=aCnVwMlDAZ>g|3SN!_E)x_Dy%Xa%N4Z8etim51HJ9{(Z zjGIm;P56ASHJyK+y!p=-4hfxCiHFzD|0?&~V)oPJtOtMOtpAXp#dj=mb=c|}OVcY} zjkZbMN0X#tp7Semmrc(#k^1O}SX?H*YcjXI)~0wmEK=uffkoTlhi`Xvuxxt9xUc@RLB6-E y_kkssGb7%8|GoUO=TU)_$tcMJo=6N99*|EH{%*}Vxw#mWHa%VaT-G@yGywqSLR6Fh literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/report.png b/Telegram/Resources/icons/menu/report.png new file mode 100644 index 0000000000000000000000000000000000000000..aed0311c7ee43d93696155c71c12849890c01805 GIT binary patch literal 516 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgfEYH)$F~maf z>=eViW(NUR@k!PSPmcXy33zZQe8EGFm{#TsOAB5mM|j96cro%8=AL|a;7R9Jhux=_ zc}$q3dEw3c|Mtwr3Pk6*h`w%hk|$^QGl_whe3+Bqe)(rWIkWg9(9YPR2&?LU6} zu_4dlw`JAx%`M6bOBFaudMo`VJ*nDT78@>d^kG3kYdT*cGq*gp=yqGy>Y||RxI$v1{`cR1YwT{PsPRd1Ivwp;n|*s)m~SI* zV~@)^?K$Dn`G;;E*8HzlDfN-{Na2}lGku>{?px8m=Vs2TRY9vFrxm7`g*zTUd|Cpm zeQAoceeq9;W*0$@g}wFb^z>A!W~rMfzjk`G{g!&ubu0O`H6DAye)M{*pa1v9mq-u& jb!R?q-+$}m>-bP0l+XkKB}T{1 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/report@2x.png b/Telegram/Resources/icons/menu/report@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e6e8a7fad2c0c229aaf199da4e93dcb399dd5055 GIT binary patch literal 1059 zcmV+;1l;?HP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NFjY&j7R9Fe^n7>XcK@`T}=0@dW z?EFXI0iaW#!{`I>09s>119n!H(iq>sh7J-FJ3>K1a~o?DZKy;8#OS?0J;`x)8Fpv( za&JtoQ*36=eCPYlo}HaNv#Hcq`^vzdWgwl{ePv~3Yilc)%WZCMa)sya?(Y8no@>9~ ze|UIE%Y;V(d+B$jYi}7`FTbd7BgU6aCBF3dSr`> zi`8niQmHI2FPqfk@%Z-kmS;r6PCjUbLSboX$%H*VKAxVQo}8SJIn$o7zp=5=>2%E7 z9}ET;7ZubGUPp6$0+;nU>;tq*~1+CXIe$-ucTrN+`_*x**m>@^OgW>r2Sd+}nd3Z)bp;B5TBC*CK`P7xjz=<59CV3zr zU1DseqtVF3&9@IZ62hsXGPDOI<-~l02(hU|R6rD?;-=^j%N&O)p`t<_$j}`15>o{N z(x^jejArM35rB50@iMCtDk}CsK%5yuXcy{kw<|F1xOizmDk@&zO=k_3x|mAT@kKj2 zI=Z>Jf#>}E++>UBLym+1RMdh`wlP|W;!Lg^Bd5FT>uX`#-`|g;{g^M6O2uOFV;t90 za^zx;lnFkrXJ=>f9iS5z$=kg7apf=>gDVHh2dcYy|-Zwbp=Mp9{XqN7Pz!b0j>r(;b6|>8~CX6CUzE z*HKy)1TpD>npcSv3@@!?@ed5J9(r(xD&fIiqLC}<)nm21-id$5xSR}~{vUjTyTiAI@14s}PheW~xXU;_GAo__7DiR-VoEKF8`?kpEo=?$ d%lJQM;5V`0^{lo#H+ld7002ovPDHLkV1k`F;939x literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/report@3x.png b/Telegram/Resources/icons/menu/report@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..dcca89785196fd0b5dac62a932b18b2876a26e74 GIT binary patch literal 1663 zcmV-_27vjAP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*IS==}AOERA>e5n>$M_Nf5`68u&oL zKw%Mlp`wYgn~1RaqKJ`^W@2J$=qE4|KY#`%28x1#u$h726Acs}prC;m2)=z~(2Uf5+O|+WyL3Jv}|m&CR8yrB?PIA0HPN z7n_@#|75STvomY8^l#SJ*H27LY;A4*>vW-rIw0wLVi+_vHO4>dGw1CAV2|V zz|#>JHq+D7udlDau*rjP>{T&(6*=F+|yZe}6wZIyyc+K0Q6XySroB zpeA%{Yirxv+dDfuySlo{%F3eDnPA4p$CsCvqbm5nUs6&sH8sWPx4xUFr>CW*rP0yR zy1Ke}+f<+$l~J)mVFE*#i^uWvw5qCVadFYgVNXh8bHqtpjme6BudFiACnqN>Dk>7gMJNCT zV0c2pbU|iIIz#wf-Q3*t_Vz|F%`e2YNB*H~aAx!^6YF^8Fkh9?s3pxe@ZE1p#OnH0VLn6mu1}x3^{U zuu08TGgQyl8v_^`k`*LF)?#lEw~+dekB<&}c4NV#W6*$%#phSh%y1HtLsSA*SlA$4~nwtogH%63G zZkmW&+}_?wopfc$K*?}`DuhkZ2o}eP-O95t(HK+ve)!hl6n&Xh{Z7?c+voIc3E_g_xARrmMY3e zIm(KXA{+_AddJdkHk$IJ5UCUUfSyBwF91YP9Vu4T{t!xr9#pLhv|aQ3{M=~LbG}S3 z*ipn?vMPUOubA|Ts2(Rm21oXBg z1d2b5B>t~L1CUG%K@MMbWn!Ij%bzT&-0n_g8?yzIrj5BO|#!L1SFa_L8h?|9LXJ<$HM$ut4^BLmCH!n$v z*4EaIjg7!J1d6s-5_ivYQUX(Kf7H-tT60Te{*k@n=tn#&NE!)S-!t(SG~)M6)#6)J za$QF0BKnd0ZNOEMmQm_CxemMU`8h<;?9Be@e!x=Lk8{GGvCuM%@#$#z4G4pA3J@5}0Qr$0pSw;e-l`Y9AP2@)vWSKgfylkhz3;Qhoekc#yv$ zAwt`KdG4kH)u^meUIr?k&-&ay1!R5uZXaTrH_5()J(v1q!nC)u03fjW$9xP=M}c9@ zIY514;N}$|KoxwRNaQHzH;#QOC7-){DEj?8-F=KjxlIs)^eGpoNp=rWYXB2NL4Q!- z-!bVhq0HbXAPkrwCqg)y5IPHep??A*X%yvR3lv+R*aF2C_z%+aj?_WHhu;7I002ov JPDHLkV1lWh{R#j8 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/reschedule.png b/Telegram/Resources/icons/menu/reschedule.png new file mode 100644 index 0000000000000000000000000000000000000000..0d04287389b0feaca61e2b51b37b7ba498ad0bce GIT binary patch literal 653 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgf?7OFnV~B;| z-4N@3M@NaLUEwPCrn)p=nlI3~-9d4`9262Z-{fICoVQ)N*KMxf z^84@O^~5)7$@L#iy8QA>)!upMpC3&!l;FAc+O+M5!0*3x`yLePOh2tXm5WPZir3OJ zX~s_@)?SOz+kQ81;@Rh)gI2!CvhzOm)TrWWR_M~8Ku)s@FH7E*NzZXwc;Hcap@|gh z;;_{lHL6UcdUcdIoK|0DGM3=k^dr2d>12x0?6X(0OlKeSGM~-ct#B=CD?|I?g+6MJ zgM|8zH+ve*_c zxVNAu#i;XVqDNEl@?#V4%kKLmc=bYtiAkMQ&EuS)$0b&UkG+=)_52HYx^{P)myPq0 z%*P)sCVE_0>-s8v`}`8Y{^Nx&3w&PW+0EboS*~-Rrq@y-zE4$qD-^$0{nd{@v3&Pu a_Xq5}CPvjgW?W^Uq~Pi5=d#Wzp$PzJnha+E literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/reschedule@2x.png b/Telegram/Resources/icons/menu/reschedule@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5984b3582e20b781b28a85e5cdb39cf3c9b6c1e6 GIT binary patch literal 1253 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/restart_bot.png b/Telegram/Resources/icons/menu/restart_bot.png new file mode 100644 index 0000000000000000000000000000000000000000..423e4c5c10aec700afad31a1d6a7311f58fb4465 GIT binary patch literal 718 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/retract_vote@2x.png b/Telegram/Resources/icons/menu/retract_vote@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2a52169773806c58d787c9d75e7eeb1d541ed850 GIT binary patch literal 1460 zcmV;l1xxygP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NH9!W$&R9Fe^SXn4`T@-%JLu8gQ zQl=sy5|OwtTu740SX?OK0+Bl*G9?!-a3KmINl2y;GDM+d&QLPX^Yr~s_HR4Rd*1gP zzTfZf?>iUoyU$wBTKhTcti9IWMlovGBW>(M@vmj{q=g;+uQ#tH>sE~w|D7Uk-Lnaaz$X1ECSA~_86$+1ZjH04qUtb?_h>C!vDjm<( zj*gBJgwCu+r;hUuy(Scure0h0cnmj!{Ati{!%gc+YB4aioTHj`8XT{OH60Dtu zh6WS@f=o$CK|EMiGcz+pVrgl~QgPfKA0Lx=1_lOlsQE;Ng@wc%zm=7hoN&}qf#B((^AeSHcuH#g_;{qXQW(2_canVFfMo}RcDbUpeo zTU%S47-EHZuSs10B&w>;^N|%W|$r%h#|DnTQW#cLi`(&_4Rdv z#)gJDB^ehL6%j3H(f);3Gdw&@=Mb+wEI&BGQ80fFVS7N(d3kv(N4TX01{g%b!@~nY zBrlx+NiA;0l0-yA5IhU1UbZw29cOKAE%k`O!omV- zKW`608*XZ9VjALT^^bitLT{&A3o^&@+uNJl>F-OiN$TwESerP8e?5hT)5X3sAt9l$v5|H? z!T<$kXJ-f7gxuWRuPsS%_}$O%2mqQqvK0dq;;)^Ygva6!@=pZ#Bk&g{Qr&DD>z6qI O0000Z4Ww literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/retract_vote@3x.png b/Telegram/Resources/icons/menu/retract_vote@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..7c2af35a2f0da8a941303abe435170058d3056f3 GIT binary patch literal 2199 zcmV;I2x#|-P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*IS@0ZBwbRA>e5npcPwOAv;SIV&pW zoE0OA0R=@&;F=J{fH`15#Du61zL+q8pooGA#H<(*AH;x)_+So*Ip>_S_kP#Gu})7< zPw&h*p1rc?VYj-w>aVVz4u987ESC9;G6LDMWs72-L2ZW&8S?b$)5C`kXV0EJgLW}Q zw?>Q@@#Dvje}4X2w{9H*AtRc|s0giN$Br4Xm+9@364hT4m^Z4wAuw%J|NFrFqWZ&u zWl8VKG3yi6(xpqYWYNQZ|Ni~$+qVxNKD>Yb{)Gz{PM$n@{P^)}*RGi{Q{QTMRy;1h z-{s4f=g*&Ct5&Vl2cYdiy?XWB^U5yto7d|iWi{s59OjWVYt|YyYOo;JuV4S* z!2`cIFI~FC^iEkMUdM*mw3Mn*qedGyZv6J`n>WIbA3u&BJ=*IcWi@`WX#;b5S*1!9 z&Iuy%hBs%#G*YD)j`tZgU7#KLYa^+gQ zc(D>2hrxgW1GHWuRT9slMT@?C`2uO^(W8ewmJ*vyU=Db7;jOV|0^xpQZNas48^eEG6Oi4yj%12ijCsPOLHJL#Z){rUkm z@y%t+mR+!5!T9mx((uJS$JQ|mMxQTbLY+tj}^@lLd@Eho$1o0 zOGwB(dGfq|{aRvGt5z)}R*+fo;>DR=qehJ?P@sUH?#!7pWoNj&`Dq5!_v_bB0+GiJ zFbLaRzI^$+ckepB&YnFB^Uxx3#g_fyIL)0qw^lQta>a@j5{M%uz#vpJbL{l#)6$XQ zmPw98YNn;78GQOK!G;YRO0!+NcFAI*4OxFEJlcFj6Uem6rjjK~%A%C@fhlB+>w~n3 zBEuNgty{+vlOR*4PTjkAudMNtA3uI9n>YYvQOf$ja^%P%mB_TnVibAStXax7ym8E zE#w;Q-MhD{5no=ue7UQC^ypFOSbY0`CC)1)TgtpDSFW5_(@?{4>N-Mzru!-DpP2Fn zgo}fpy;I++RV!DaMT-`jHf>Taqs599W5bZiU1kC46UdZnXd@_3j2w)O)o&eAuySDN z=`X3X&6 z!sINQ`UM0xGv{+a^)qA^`@m7`$0h9?W^{l5&4f$Y14+sD-ESgazVK?#9IfHu3o(=(dyKx6JVfihONk) z9%EmoOc|}FQptpohO#St`}S3o?ThW(x0g_nE*u9B9+X&bz7C-@N3v$u8MDgeWQN z3NPfal)S1vpp~YU3bLTN-YYjtE4X;2eEIUhPLz#`sJJvFH!7za-Me>JZuriefuRy! zxcdl90EP+iccA3on>TMJavO{vO0`tGcI}H7FG}~WOa_vVO_c1KYA?!sN5EGdPo6w+ z5v0J!nx#vZ7V7B`^`C+U0+796$A>QYX~M<0>F{I7Ss}b?DIY?$QQNwj0xmM5x($^&3yjdN;2zmd{=FzTQyXdEd5?jd4 zLqYKt`GkrckNuPHjreg!IlTGVvu8Y5@}#_>CBMzL0AAb7n#>W%9D&Rc$Q*&p5wIPB Ze*v(lE8rf9-zxwB002ovPDHLkV1m8iHf8_- literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/save_image.png b/Telegram/Resources/icons/menu/save_image.png new file mode 100644 index 0000000000000000000000000000000000000000..820e092500926016fc56ab5e11b815bb5d4eae8e GIT binary patch literal 710 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDq2jfyuzr#WBP} z@NS6rio!sVZ`0h>ju0-qTfBy^maIx$7hb>_n|?{^P` zG?|0hVwU{>|8LtlOTK^ae!M%Fw>H1_b#(Uo(r*t7>P{NX^a)xyrBXugvLIJ$+UCgR zmkk|H+08${H|~9fP1n&!Z_A=JM2dFGh%V*rKKkkF*RRj_YfJSiIqFSs4%M3aB8AW0 zLFUV)9J8rjsaA92^rri;rB3eC_`dOBfklAIR4-e;`-}Lk9|`t_t#19eM*PsjqMc>C z=N{j^Odw$W^~u(I9X;RN%-ekP*yF;*7X>)hi9af_T7EfmZP?=AJ#qSdZFAe+>6C=5 z4Rd^5Vs#^W?X|l7_jAl<2%Y`gDUkU5bLEPJSiR{-lM)RiGDIWn=JRh%mzC^2*5BV> zwO4PVhr=-+zvY)xj4D4IHEfNGi%Z%#!$(bdX^7U<8oT3f0$1LDuPws$;EJgr-`-#+ ziThQ1-Od$Qgsi^$ql3Mf(NB z-t?6Qas?_v4?q7Daq4kVVqA9mY0|_0G23tVMr^;m*ME2V@4s~uY~}ckOa8juzkmN@ z{e=vZg#j7cZyQSLNc%r|`<7S1?>JX%Y|o$HzonPfZR$FzmdKI;Vst0BjI2*Z=?k literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/save_image@2x.png b/Telegram/Resources/icons/menu/save_image@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..44c66941fd3f155a5f3628c7fb8969976951c8d9 GIT binary patch literal 1213 zcmV;u1Va0XP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NGCrLy>R9Fe^Sj#JQQ53)Ky+p#m z;D(6EW5VDPCX_J1fQbymL@1HOK=})#NCp^4GGm}587KzIRPu-c$t&{A`}zH}zE-<^ z_BrRC>vZe;x_59|d#&GI>$lh1&+Bjmf58m=XBlt>ay$hE1)ZIp_xJb5$H#$;tBw^G z7Iu4k`~CfmFJv{y;c)92ppTD_ud1p_Pfw4EiZXyHO^=U{qobpHdwXn+jg5_oi9r)z z$Y*C~Y%&*|PG@&__w(~J2ITi|V`D>%6c-oAt{{shQC4IKY!(+6%gf6}T)<=np{}kj zW^;3Mv$nQ&dU|S=5S7eoF9ja+hAXwSw1i?SKz^xwESc=Pxw)AteSLjxBO8SAk&shj zgf&GPRO;&LO0ou^DHGxq?#H~bg|1>!+u|2nUt?n%>#8>2Y{L1Fe;)zs8PepXjkX+PA?A?RTx81Upw;q!>$aWWb^a$G*wbu(}E0*2+);(LkJfj4taQZn3k3%hN-Ek!EpotzK}(ek?c1i+@F{Y z3FqhM+1c4*Fr+X!IoW6mi)fOSgj_Dy(9jS@w!Xfelar(Eg%NW_Z~`(jbiqAZi?^Ur z5&|2Jad&rDQc@y%%+1Zk?S}vt7Z)ihDLp+sjDL7|C@n1&@z!K5p_Y~w_D;g<>uYUo zE%{AKO5zO$7pcO+Lek?J!#TrQR$X0fjR&J8LP!SAJmPV3a>DZ0*H=eJM|5=b=H@0@ zp<$Nft*)-_?d^@MA0HnL4GkQ{f*=yY-H6r&oZ>EMq`Z*SLPOf*brW@ZMD81jY0l$DiH&;0!S%gamVLBhnugr48x;$loY#w&U2 z_5IN^A$9?wt*uS$laY}j=4N?$IW#m>1W2;i>*X;ZPkh2lFm-c$d|adgd1Pcn3&rJT zVPOG};@R0*y6$K(q9!XV3saCh_xJaUCKFl85FQ@bgiQMQW@gV240;${&~|rsv2d_@ z4f@+|k_n*-6a#+=;9-yXXje!+F|Y*~_>>9Zl1u2w$VlzI)4-9jDIy{Q%Z)JG+uH`< zzc*h-;2E^FwUwBd2n|*{=FsooL&y!-q^73AC+0OyLu{uU(OkfmBP}!=o5RDy<_xq5 za5_3VvXKW|VFv;mJjAr&M2%cBwxM>&Gxjw6{lH591kB={ogK_hYnAdZSg=Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*IS>SV=@dRA>e5T3JX|TNKW#=1`I1 z6hf0ZreKl-D20JWgh(nPh~R)eD1<&JK4~Hf=7WNW4xNm zoWRsnlG5tlk9%md*yrr?pMUh1d;SMqd+oK?THo4xuRWb($Ml~b0X+hG1oQ~#5zr%G z#R!Clhd+P*d~$NKs;bJt!NH1_Y^fSZ=I7`C`SZ)o&DCiAFO71CC3f!IxqyHGW<4=6 zkOpL$3|EW`_XqB1t>gsAkLql(GuUwCdiwk9PMOtMF9Tyk( z_U+q0!@(;5fByV=`SNACbHTyE)ZU{Xk##rBqBIyySW#>QGo z8}t|$ia^!Y)@DI_B2~YB{rd3XgQ(U7z8Wx$z?PO4xzhdp{f&(cIp1WCG{=z8P1ays zL;1Yw?(V*N_3H8C$Bk2DhP26ZOlT96iq2Zl1qB5{X{%M33{03jklCrXNJpKWos?te zv=A89E9!bvQxh%PKP?1?RhW5?Y%xAQ&WcBZ5CWrn3*Vrv=_62dql0tbS|#zt1_?CeZ4xm^Im7Kix<0%tH_ zi;j+_OiE+N+|kidSy@S$2L}g3Lqn9KOxtoOdU|@oCpM@gVrOUP#*G{Dp@<{d)2B~4 zVVruj9zxFSs+&UKaI`ue)cR8+=xD8M9F?%%(!0)|yBE-q?Go;zL}f?Mu*?^ViH1r`+*)!*NbBlF|OkCFEj-N5k=xsHNiG%gXmy}cD%8D?4! zSaNdmj~_pnm*2j9yLt1bqC?1a$aqXrB9Il4LKWpTF|7m)cWht3e&u`x&Wwx5}?k*BAg0BUbpPyfT zetuzLAvQqcAo+BX@UqIk)QT>qUm;OVi-sAZAN>c{!&9#pdQ_D?S&g z0K*9U{Q0xoA#iY$<>bU)!eXp)!ZR~7>_AymRD^3_P5^qa3lW9MEWQYstE=m~ckehq zXmMa*fX?!yq$C_Dr~vkRK|w*(xvZ=#922PwXbfF*6Ckz0Xb~`6FmfKqi$E@Qh&;I? zWna5?jagyD?c298Q8`t3$fPl1!e$YQz^bdOIoq#Zy}EVl*7o)`$Df{_#_NeZx##5M zh}^n<{kmKa&Y-vv5j8P|F9(*HnTd={0nESDqwL|9nZ($W%b2pShy^oB>J zx#21b3?qaVVF~#FTRu*UkB<+wr<_kxQA+Ndyr_8L!iBlHIZh9@^H}0VO^o1kNH{Y% zu`B92apJ_YXU{lcn%osz$(d))oEaM%OlXvglMZQ5F8n7g;#_5G94cuz#a&Ar0azh_8Pr)1GM|Fx=Ns zzst(XUcY`#Ikur`ipOD8yHO!9Jk3xo5fKrzXd4=bBf6hjTU)b$U0kHFbR-e@l7+tC zTEK>?3ZUXnqKY4#h;#@)|3gk69UaBDf?P}6Jlo=MgmsKFjSp%p^Ysp%t>`@&*MT-J z_Vn~{IL#_%XJ^|3wvmw$`q*z4B-R-H_VMFK8}|=2hrTiam2i$RU?4ExQd3j$dW|WE z3lA+@D%#ux8krqA5PQXk4E(@PCiMzknfkG8eHH Q^8f$<07*qoM6N<$g2zZN@&Et; literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/search.png b/Telegram/Resources/icons/menu/search.png new file mode 100644 index 0000000000000000000000000000000000000000..8dedda843de980f9266adaf9cf836d9fd7c32145 GIT binary patch literal 576 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgfY?Y^rV~B;| z-H_c~hXO>V#Ip4E>v4!NMjzBz(ZTi4#UY66Uq|jN3GV$4+z0hHY}m9-B;<&iqhhC^ z{L}^S4m^6=HY5AiU6a1zXFl(2(@jKvZ9i}RIPGPL)#Q^$9)EoO^;d`;Ct%GbWP zNq?5s^wX!GUfQHHYstqPGjA24CWQ-6^vfhwCwm??*rRml#V$UX?xP&e4W~1J?kKVh z`pgt4;&^M@Tiu-!u7L*UqSii3ijUvmp2GCAO7P$Ol_6Zrhi2S+x8wf%$EGJ%?PmPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NFpGibPR9Fe^S2;^_Q4meyz6KGa zMg>Kbbb^S5HZh`&Vr^|_C#e5G`~hx_5Rf!!1VvO(1Vu0=E?_4vs2D|YDFg+V#P7hs z@bYqRd>ev%NfF+icjnA_bLZWeXS1b$=?tVZ@SkPCZs2+Cc6)Pkb7Nzp+wCqcF229N zzrDTP-`|f$qXyVaxzyL!&&&{rdW1DESTMSBRMU4{!&Zm?>Z8wL8hKTO^`dXWZ8in_cAE~;! zT76rxc1Y~D*49?KwYN_QwW(^Q2{`#;baa#$ za9Ha-R|TwS;CFX-#Au*Lq6ed*$sIGDAbw4a{>8crsIv%#UKD< znz_2VBHpK`Ck)X7kjR9&fV}XJIa35NYU}9e`2752O+V%dwSu{T)x5sGR#a3N4KDFh zJ}&kS^(3ot^kB>dtcET&Ha7C|@+8~>v!R+IJ(#oHIDa= z&w^wfuwbUcoJsz>kM01SjfuC5>qRznzl@Vx6ubiZ*Q;a%XM#W51&LA7Z*w} zs%K?o#q0HwaejWjzrP=oq!RPn*98Ry+uPfmr(iIck&*G+B2@8;ii$#^5Niqq0!Xt8 z^V>_zA(2RgHTnI13%Z-hhbSp2;cp`-8y_DxNoaw4X=&-v(Glf|$88IE%~0Umd}n6| vnx>|v%vFj)W=zwiGmy@}-_5{3+eXn99<(0P00000NkvXXu0mjfPfY0U literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/search@3x.png b/Telegram/Resources/icons/menu/search@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..fef63044e7984e4b596766cdafad2646bc555dfb GIT binary patch literal 1166 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1SD_us|Wxo#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz1|Sip>6gA`6MbbAj}{=?J7F(iZa z?JR5WF98B=v2UNOW_8uRX#arKg+*6~MOsiKXUhdAR$UhXX>IOYkt4?r#V06cq-u*P z{W2DrlIple;od%W=EONU*Cs!CqqcjF?ljMHXRJS;^E{X8_v+Q1^Qi|=ph6;B5$D^f zm9@3C_4W1s{{G(H-o?en|26L1yLa#I-H-L9rKN?1AHRNGx@J@L%+pWZ+}-*4`QN{P zzu)^`fCF!;&!*GIyK^ckemr}&Ol7W8?~H^Qfq8G=zD-Y0cU@$*uhmlF<|1{Qmv>*_;3V`D0^mA0HVhDI@dd&6_{pKRZ8|G}~mMz!oO117CLP z>gcdESJ&3wy>%-qD@#jOo@>QI85fV4(*3?0*7x=G-MV$lD|pgcjpRi;7-!!yKH0tQ zp0?W3uU|_gx9sdud^Sn$!OI@iEFP6LCr^47t2z3f5jBrtxq7O)J<~l++_EhGqyuB% z2GP0qBQ#b-&Y13UY`RO>d+9!{?RtrVDxXhn5X;=6;VZ3S>i1~fmd>qVVil7loVS_2 zkXK+(wR`vGk+^&E*?%8CJg`oi^tX7Q7N1C+xPxW+=CEU#J9aId*4W56UzCZP!~4Mg zgodec1;18XK57jNyAkhs=^aS-hnPxCu$m}pIiI;AXy!-#wHyqmjw-$@$YTA;KVjD0ZCBp7P3BvB_EN+5CD+mn z+4G+2?YFhJUmjf79Q~7P**(4D%*>P3RzW|Oi|KCPHE+(IBX5(JMZR8EBd=2;ELmLM z-?0=J(WZG8X?4M_Ny1eJ7vI{s)AHzBV2~vxDf#BD@s21~wU6PSx96i;e{b*6 z2WdZF%xhiq-;zbzJwNzOE%(8Hr=ApdJbn7~?%mjvEP0O~KUP;)|CAPbYW3>XuM+F3 ztED9+S9%#~y?Ag_=yQr||MUe|JW=|nQf$jEr) zb$55)o-292a*Qil~K|`f zh?w`gXTrX?^}Fx-UH_VHk}cWB$PlqojP-MP!>g}V)3mD@8W{E7O?;;Ldv?^Nsw=D# zURFOcH!HK9!K6KZ$G`#xZn!AcirMmck>o&Nb$8l|2)$qLF3VmN5`Cm@=c_C z)h4UVSi!@_eE##Kibln)X7kU#tT&s@C@MSGZ+Y47xoKW&k7{P#=vtIxCcS0aY1QJB zs~xoE%If}hhArfBI{I3DqWuJs{8`IZttz~^GW=yD%jZr0ENidVY*|#WC9a^CW9|Id ioc)zoyLSD1^PRbIkGsrT0hg(u*z$Dsb6Mw<&;$T*g5NCw literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/select@2x.png b/Telegram/Resources/icons/menu/select@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..67ff85b45a9f38fc2e407d4b095e7ac8ad52dd0f GIT binary patch literal 1110 zcmV-c1gZOpP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NFz)3_wR9Fe^n6WQxK@`SOEV8l^ z!XoiU;Pw6jQA-pG1zTFpHmImH3KfklSEExXR0;)^f_4)MTUlZ^#CyN@4#(`w-Mcea z-peM>EpFzXIp_PnduHyLncLCveSK%(YZ>TF9G=N!CMG7v#>PfRN4bM@dwY9#cgOwm z^77%~Au)1TAlyq!OUK8@^?LnhlZ!4Ka1)_n1peOHY<72d_vPiKiHry{&V&%?&*C*? z-QC@VLLr~e_x1Ie(6w5vTrM+4T-eD6*ZBB&Pfw5O_W1a?y}iA)wMFJkd&2g}$jI5* znfdyaN@ah4e`aQ;x3|{?#Yh(pxS3Ia0Ok6JStchZ$${cltJSr&wRAe|gMu5*glITW z0Q$s6`w&dF74GoxaCmq)+O@fr5CRnhz=WDeujc0M?QMO1y|dG6!nxWABpeWt1#HkX z{|(42)_DWa{QSI26KVlOH31Gq0K&$`h9;Sp3y6$$1xjI|i1jr($*0alhClI08IbQy zpmaV#;X81YGI!oYATgVnSsCpE*7OT9X{LaD0B^{ z{C{>NY7GnwoS&bQ@2jgT>&pOK#sNA=o5D{|PmAC4^K;}n)il!SK+VO)g`mB@z77oy znJ$1sA-#~AT@6E~Q;cFtfaw?1M$O5|3EMY`+S}W^zrQyT0Ea>>N-B@hf@C{kLio2W zHN|2vm&>`~N)acB&8S4Gw+j?+an&p=EU;p@QA(kt;?s~JH_Wp9_;XoCee_qOAuSp! zD=RY5PESu=S3Xhc-Pzf3dr_ma7`KCigRZW)w}nE`Aa&8+Epu~o;&gL!<2tRbu1YU= zOH-&Cz@ZQ{NL{XXOZ;aK>-F`ut0{q+n9sgJT+7191hg~_4h{y5l<@f$M!Y#sNeuw%T8COGQ$E`dOOwAEh{CoX z1bA-H`uqDgH#bYA(&FNxwRY<3xsBir8W3%_g+)_)ZSoP+cE=zz{ndkF!b5(09i>SU z7n<}yO}*g+!$<46`Ns`sJ@gO`RKkP3sF6GA)nm2PK&o@H-!VQXL$Ch_?e)V-v&H*S zGqsLOw&L$N6XKH?WeIMuwy@s${Pe`l+AsT%c@0@4kp32im8A_I`6tX~`Jet4juiK8 c{GT)M3!A@}ks|!4CIA2c07*qoM6N<$g6v`d00000 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/select@3x.png b/Telegram/Resources/icons/menu/select@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6974a22fc72f3d7afd9902e72a29867b5181f150 GIT binary patch literal 1616 zcmV-W2Cw;vP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*IS=x=BPqRA>e5o4qeSOBBZ++{8-= z1&zc@f>7us5`|kxBod88OQF%IBuY`yh(a{}01XKZh2*LwL<9-(l8{iKke_$Ky`O7u z_BT7bvvy`@J-JVI3z=tk&N<)j?97=n=d4U7z0wg#M<5-6bOe5nK;G|W0gwv!($ccBGA!KR-#%)IqW}E- zJU>6*+}!-@>pDF>4eXZvn^jd+BO@bQTU&n{T?itMlI$~a5!BY!&d$z0KR+8W@(7^> zRVZ|oXQ#oknVz10dwcVsi~R$IsCCw)F){Ns*4x`VH#di4P}%6^)IJ&CSg%EiDBF1uAhI%<%B=%F2qWgZ=w?d3odG#_5+q@-kVaWN3b-rincUte)?v92XV5JWssE#@$) zt5dIkO-;?t&W_*w#l^+Iz<|oLN3?-BN>Jt3k5NoV)T7-EXT`jitg_I@#>R?@inP@! z1W<)SzeB=wBHoh8;D1-w*Vi2#9SVf8Zlf0E(jWrB@|P|_3FqoC#CfUq?mC@hR{Z2g|kY?TZA*ksN^RB7A_L@6!$8r!x4uGB>4=} z(h!?_e*$e$7h9*r{YrNbFfHxfz|&RoZ-0(P(n*A{z(kQf832d_4Lp*O}1borKz>qoa6;gM)+a?(RSnzyOT+NP;Rp3TQ7ZEQq7>Gj3yMX2vy2 zicaMiBo_kI00OF8XJ==wjraHWZ_mOiJ<;!rtQ^y-NB}TEa^V3rsui-Fq$^y>{r&x@ zlBWIqtZr^@%FD}D`heuZ11f-3Jw5kZTU%W*8cRz{p2xO-_*szx>Fn$bu>&L#A%Ojz z1DuDHcp}H-7qfK-R?=RCd+6!u+1S_!F(E;c06T&K#H7HP%vp$yIFD4U$a#mWl^{ug zmBgg8mXi+*w`B0tm=(4pND^QrF$0wBn_STazbUL zjFOOu&q{(My+9G0r`^@nCHkDHsVUE6?+?t< zQvA|#_x=6-q7B+1+^nzybrg3WKu&9eCh)nvy^X@n7Ap`NZqP_-g;eeB?JTiyZWdXY zhg1;L4T8hDS!4w^3N+#%>IK0=Lqno4l^!&PUn*{PS%CpCA~v9g1M@sJJ7@-S6G6~6 z@PQ&Sc1x+4raEYfQl7R{CXbjJ2*V=BT*EXJsdu6DR%V=SHGJ zcNg}LzI1jrOuwNwPQsL_zq-1L?U$DqvJ}+O{Xn(uSWB28A2t2upnju4RMr6WlJZ9#;AE=)_E=8{$)=3KW1^v|BpWsb7`ogqTbEWWpV9;|2;* zD1@8nRK_@o zai-+T?mraRCngeh{{@5v^1kw>mN8lgwdR5~`CULC* O0000vMnIUF&jYlZeD_J?QanX^s)>hG=f6ej>-=v8N6-~>O zaW0AoFrIS0eCqq^YFVM(mEqrukT_N>j} zyrkWHe#4-ZQ+#&q-d(&iX7NRi0KMtK8X_rQw*39_g{90w#;)yV&bIsS=buee*t38C z>8GEP&&^vNw9-VX*H--Hfu}{z3oj&XY>3gCT2)u4*7#ekLZS2MquTHHI*&hgRhszz zeZB#6;{iE085JSU2QN#yt{AY)IODW%!r3%iIsSt;C0`U-%{}%)@$B4ozciic-W-M! zJ->hdw*POxr}fOuo1cHy7|l%3xo{_WN>i89iv@-3HeW8jEa7W+Hb~xhgYnnblVWs{v23S9pB`7<*o zkBXSY?^2)LCl+7Km~?W<_18}eEW}y=lwFEXo1n+=Ce@w;l%_mg{an^LB{Ts5SK=;* literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/send@2x.png b/Telegram/Resources/icons/menu/send@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4edf9a6cb8777bde0f78bbb2c57a52b231efa5f9 GIT binary patch literal 1381 zcmV-r1)BPaP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NG&q+iv{LE*4q2mubb3D1ay58R2zLWXy|LyHeeLP#v9q)L4j$CU%*+fSQCeE6q@)xdAHTi5&C&wV*49=F3k#|uUjcJK-1qnQ z6Hh8CDrsqH2L}f%t^51?+S*zZ6BGHef%Sxh1mgJm`dUp*jr!Bj(8$WlIy*aKY2g5t zm6hr1>r>d@7mSRIUS3{^*YNOgjsqPXox;Mx%gala*2Tp|US6J-mKF#6*P64lv&3I# zXD6>wLqo%gii*3tJC@eT$w_8rCOfITy0Ubpr>7H7SRm|cNhVB9O&c2gyHa0e5Vqz2(6@_&_F}k$0L>x3V zHA$o9=;+wj*M~sG(pp_zjf{+xM*U+%L(%G@^VN> zh?Ev2!W$XsidTYm|I_8|CAyN#$sW~IJ8DaMzFXnOe)#K!-E=W^N2m}ZREG=HMLMN!Yx*GWlPLLdihleG4`#rF=wbjtj z@c8&B07Jk;t}H4lGB-B|46)wU))wJcKt*K8*VmW*pbzET+*}cT2@M+?8(ISf1qE?X zLcx@j92|wOHxb*Azlj|K0|Smhp`;TP6-A;Vs-J;@0hDGOWwuF{jP2o-ot>TQ>+ALO z^vLMK!U8Xhzmq1A=H_O8#AkZ#?d?(h(b@(Z0O$V`1}rTtrBAWKcCD?g+uPeY33zdF z5w(}FqR1$U8?uXqix3eVu?7lQi$cMOV@XL#J3BkMjOIiTot{4{=M~gKw ziYV3F+w0`yL>bFVpce+bBB0ERj*ebiTVrPh32tz3@cSOGYHDhTd+ZD(9hM4YT)R+f z%WE=t?Yg+Q&~lDtGd@0!H&9*`xp#(zg&iIqQa01m(|&$_a`*b~fWOGcV~@YTKb~Ds nwe0ThzJq`Me`etSFa!Srw&`7ljtHsU00000NkvXXu0mjffctjx literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/send@3x.png b/Telegram/Resources/icons/menu/send@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..eba0a1228a3eaa371534e845dc21d5ffb568c7e8 GIT binary patch literal 1976 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 KMNUMnLSTXlx(x#W literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/share@3x.png b/Telegram/Resources/icons/menu/share@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9877617803704655127353cbcdc3b0114e603c9e GIT binary patch literal 1676 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 Y9o^vDx!}XqxuA68>FVdQ&MBb@0OMOGh5!Hn literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/show_in_chat@2x.png b/Telegram/Resources/icons/menu/show_in_chat@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a4c4bfa6ce982db5edb7129205b2725576393c94 GIT binary patch literal 1338 zcmV-A1;zS_P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NGq)9|UR9Fe^SXn5&TNFQL%1j~| zN=V6^F~b87io7X9lJY|2l?RC;DN-WCGm=7?k{425%wx!qA!B5o{qL{4oprvm&-Z=* zbI$d@_dXmi*52#4)?VLQYp=ETQ78<51`ilKVDP|y>j5LZk9Tlz2n`Jl2nYaSZ*Om9 zWp#gle|vj-b#=A2wzj&u`tb0ew{jf>qoSf38yk0bcYn$LeSLkwtlHYz$jC??v}+GF zHa5=A&feVIlr=+~32)`)<(Zk8X>*)bAxlh5Y-?*nbU2N#udf>$8)s){h}6^5lZ}my zt*xz>mzS@vuZf8X2R=ABC@Lx%8yn;Hbz53kSTr;=e13ikzkPXmxuT*XI5=49qb)5h z5!veM>Xnrhp&;m%7GNGZ~Txcm6{Xd|nJ zadUGMe&5m2QA$dR8bX&vTwL7x`a0Q!n;0G*u7d)kf>3^Na1eJ}ULIkR2bi0ix3;#D zP3Pz5NHuwpZ!Yo?p&`l6&Q8q?Wl$FvmztUyq}0pH3-EV$caxKog@uJuxdo|`k`fBv z-rk<0qvP*ws;{pnYuek}r37#=Dj^|-#Lmu6SXh{pU|CrifqQ#-m zH8nLA6{xJNB&DLnKHJ{jW-u5X5)#6} z3JMA+OIli5I4&)Nf`Z=P-k%*o4o15cUv_x7UnrumU;u3-KI6FJbmQ*KI z29a-(0VMOM2}FY(L8VS*5E+}4l;r8@DP_vx;UQy1L_|no5Hfdncg97}k%FOD;w;9+ zrQ=~3`A$zyS?s&JyLq;9{ewx3If5OB0*hv)JVEfkxVV^-F)b}kz)_Jub?pNK15v}+ zadmZdssn@+(r9aIi-F)RsYdf7g>i9lksX9CYiDOCG((M!j*h0*F)=amhgt`UJB1=Q zH&@L9%>^cNLU(m_X#&{JztmiD7`y`CkWFa#bSF9E^cX*orqo#W_xH6OXOZ*5adBv9 zNG{BOoB7)T4MP$)p!xavabGC6L?OY$iu{D~^AAT@JcdZy_4T!8SC+Ge@!-$t>1ome zVq|1Q*C9V9CZ@l?pTYzs81l6pUNvpR2!LUVdj>5mER>g*qxVVOK}g}jT2)m=Ll1pb zUtgbm^tE~@qGNY-bol%Ga~7i$;Vr-(iqFr_7$I<&%tH|wJvutdDbaI@ijZi=u*tO@jvv9x!;||LuXl0P0fBC$`t+YybcN07*qoM6N<$f>Aq5i2wiq literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/show_in_chat@3x.png b/Telegram/Resources/icons/menu/show_in_chat@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..04dac196becc0053fc4c4c517f0becd99b345dfa GIT binary patch literal 2091 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/show_in_folder@3x.png b/Telegram/Resources/icons/menu/show_in_folder@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..c957b70d8bb6c556c35d82bebfe0e5decdf233f8 GIT binary patch literal 967 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1SD_us|Wxo#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz1|Sip>6gA`6MbbAj}Zs_Ua7?Q#I zHfnE{R-k~{^c8bE5|qmvT?4qeIh$OXRwytAo?*VxwN2m|-xOE!EE)zSIHAjp#4 zDsbeO8cS2xiX-={+4XePi|*JSzq@zV>m0?+#m}D4&Og`pD6*GLKZQZkfo%dKj7o@S z%Q1^y8uaq}@7ZUcncx2U_3PEFt*4%Dx|ws&eC?^anLca*o2EK%{Pp8U$I&FM| z&p+2punhhD^UnM4pVh<9KK}JhbN$#~ zsGIIiS$wggu+VYcA?5PY(xWf@th97~*Vt|1Tzyq*qDR3~4YBSNmI**kILpjq&qM0h zU-y3Hy)mmp8mD&*YxS)Kc02CEnXOKB5Uibl3jlvH6$BIT*=zn zWPK)XM%L@EQ5QToE@XUid_MQ9(8W|8cBaOgIc`bJn^t_BvF%aa;pSQX%Qjuiu(7e3 z;AkVqU#WfK%b_V!a!yjLtUnlC+>9l7o~%{4%q={veqBTB-!1p%mL2a)*V^=6y6Sje zrIyh(H~pTAKWCiXup#*!AFp)q@q&sAE37BW1+p1I1 z32lcJ-K{LHH0W_&FWT9%*^{sSst+SugJ44=L%_P@Lp(N=><0zB`Dm`~QK2Z|o5%lRZyrcutzq%cF8K#c|5n z2hV@MxbwaAeeL_I{F?He&uh*-FW&cj&U^m8-}&>Mf+hs5EZKc`VZe#3ty&_NUOfI7 zp(A!TuiR+no%iLP-=5xj`|WHR^SAZ#84CNS$b63yZoHY(7P0>N>Z@6cFM6Cv-gf=9 zuiE5;2?E`gbI<*(Ip^fhESo48BHew|g;7#nuD_Xwvqh=v_~V0I8F4N9N*&r*oRU8N zG>HB2;>Fr95fvj&!3V;L{SQu@b)E9yw4xDbeCNLRB|Bs0`7O_3F?hiA=hWfuvx9+k%JP*LGdO-uV3~0{!-T2vK-FF~7B;@)1r{kRMq8qEB{y|$ zy16Ex`RuWkiY`lo7AnUu?3jMK)#2u~MHg3`O%r~0>1D~%pv|y8ZWGmINp)6YF%Dc6w=nA>YfwT`_v%&VTFv zm+fZlxOnAtsm!C>Z^ii9B@+!K6i)qm`Y}e2-DL7f138|(aq$`=8=k!^aT2@ZDE9Sd zjmE1A8>1HUd+~xLjj5l0+H5p@dH5lN%2Y2;;l2B}h;_3Xh44yd-F*MO;P%^XCfq+O z+yd;mj^(=a&k+B;;$zm4@?vr{}J4V)|_&4{K&ejB_B2QO8mvv4FO#oifC|v*m literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/stickers@2x.png b/Telegram/Resources/icons/menu/stickers@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..22e686cd6c4c474b0329e89461aef51da8dfb661 GIT binary patch literal 1197 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/stop_poll@2x.png b/Telegram/Resources/icons/menu/stop_poll@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2c4360511ce89caeb598541c7d4f20ec98011f2b GIT binary patch literal 966 zcmV;%13CPOP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NFFiAu~R9Fe^m_1J_K@^7d=0+qa zC8CKX9S!^ee*uA(#9k<@tZ2l}%8G=g7>*O=46(gh1nIo zn_RZo%$|?;J#%LE%*V#Y`dMe-YZ=&#?4C}i3x&eL!NLCiK5uaD@9)RsG4J7U`0(%$ z89AII+_hS**XzB$zJ3Hes4&1x0u4vtZoRj+*KW7p-`@kmu!u3n1xI%lry)xu5{*XV z?Cfl3XUBw|PN#QwcZ?Aaa`M4*czC$Iy=|I3Jw07rU0q&Yk~vczv7OCk2ZMpx{mEp~ z>2yk^QZkwJgCazQ0cNHbAVB%;!%2$8A~{gp$H&L>^Yc_H<${74#<-|EPyo94+HG(q z+X{Dkdz;B*?54p|TyRtn03*gkdNnt**{s=YZf-hFIDc$7;tq&}1#GBk{uhv0tn&t- ziixe%TUO@UHaC>GipO7f{Qk>QU#QU>H_6DXZeP`C~p zrA+#PPlQ?QkHeGzsJ(^ARN329Hm$|{w05JfNr9CPLj>ItuzI~N)|55Jdb0%4rv_GQ zCUkT9UvuB(a#8obqosT7?vF83*Vf4TL;8Iug5= zmlx|g73djK0XP)G1*z%n88V$>6jK~byVbSA;c z@~fPLVaU|oY$%12n%d7cQ$%L|Xf(2@S1N)+xF9uwJwv9!vM>Jb z-yRByLrKlBKHG69jGhc}y6gA*5?!TIv4p%Lk%B|F;v09eH$k#D0 zCqt+EgLqw7NuGGqKWe7damm)=H^#WQBt}_6H&|O(?_4fDG1Fa`JB`zjS>g0r7*^RA o%bhU$n;*Rvwg$Hr{?8fs17nM?dd&2B?f?J)07*qoM6N<$g5RjKDgXcg literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/stop_poll@3x.png b/Telegram/Resources/icons/menu/stop_poll@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..ef509132bf6396f75a542f5265d6916d4a6387f2 GIT binary patch literal 1461 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 JPDHLkV1k2FlNbO1 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/unarchive@3x.png b/Telegram/Resources/icons/menu/unarchive@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..02e8a3ca73d35c201cdaa2495f36fd61e7d6a6c3 GIT binary patch literal 1366 zcmV-c1*!UpP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*ISe5T3aYCQ4~HdA-5+a ziIn0+l5$CMNtE&^w~$L7$peWz$)k8vB1DmAiHGy%@*p0N@St2mZc!-LbH2`;cFUg2 zKQsTHng4WV9{$!|v)0<*x7M0H^Uv%bKitF3fSUm~18xTXgADkY=2%crke{EQoSYmK z6l6Mxn&ao^=jrL`#>U3d($d%0mztSieQIjz>gwt*TaKfnqnw-^!2}e;Ra8_wK0ew) z>hC0PZ*T4G?TTQ;DE<8W`uqFQ71O&{@&9P}55w^Ft!^6WV zDh*lh;xREX(cIk31)80m9UdNjdV1pY-Vd=L)z{Z|b#anpgecqm|y1To%(6_g@MMXuP{KTA3OibL_+2H^H zlDE-wb8}I58u#JhAtNKh+qg#je0Zz~EX5 zP!$6!!%av?pw)7PvWJ5!PWLR8Wj8{NSO-)v>M%K0>SWQh$ zF;)^c45768{$U|8i530`%Zm!7)!eKirol?$X*D-Xhq9$H0w@TeE3(q&*4x`ld!k#?TCV(EFT6%gV|igB6Av z#-dKyK}_PdxVR_^w4ON1t;p@^q5BZ@1hv$L1H(aOQ!5k0cUoovAuTP94xN=bFdS45 z*syyPkK61xI5-Fi3Gv`#%W1#>7zPXipcY==N zpm9e>N9lVNd?Lxt&Yqv2-`(APeSI~MBoU^#uF!$i)zv8}DKs8Hs$FB$?3;|;E9d9u zG(Em11D?q(Hkp~3&(F`k#z(>fV1W0n6ov+H_QARVl2@#x6rkLLgM-{!;#3&{17P%Y zpz@X@c~!Ca;M1&07*qoM6N<$f>jQE&;S4c literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/unblock.png b/Telegram/Resources/icons/menu/unblock.png new file mode 100644 index 0000000000000000000000000000000000000000..62966c2b74e64210c34b7a81f9e4de0288346411 GIT binary patch literal 781 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDq2jfvMcn#WBP} z@az;@kD@?{l_Wj=U>GvKkHJURCRf`uZ zYxNxEU|~A3bKkzU{PObe4<9Dl&A%hw#!R1O zSF;Qqt*4mGKC2_)n0*GJNYyn0pqat%Ia$A&q*6^-28c}>5vf%6XV)-fB*ii z+uy%#p_0T2&!s_2Os3U%efs@ZsI%pm)BXw@Ifv$h3=_Y9|33L7%fy2TA3l7TaO$oB z(1h2owN<3Jz4WFZt~88NM~ApB5cVlYCepkr%@;tN+*`wWOs${jb;F@YuO)7n8^G z%egD$^-ZQltqofla%O}7(>HH;7I>%}l5$Mmc&w)LW{%kO;MG^_JhQKvM{u<+y8b%R zdXC@oj~@+pH9To=hRm ze_{2{WyiZ6OD#;F7VW&5Gbv$1K!VZCn(FH0W&e4einAz8T|398co!%sdb;|#taD0e F0sxYYTB`s6 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/unblock@2x.png b/Telegram/Resources/icons/menu/unblock@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d40eb59444d72c9bc22fbd483aca41773d63a674 GIT binary patch literal 1396 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/unfavorite.png b/Telegram/Resources/icons/menu/unfavorite.png new file mode 100644 index 0000000000000000000000000000000000000000..8286346ac8b1a94f3d595e450a448aa12f201097 GIT binary patch literal 815 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDq2jfoZ0vi(`m| z;N4(*k5_>r=js=#hVgKJ~GGn20ZyqNr+arY=3!1sKX8d4kK5=y6QD1{5 zjwqFq+yafj6`CAEPA&xkTZ8WZ{&dOJb*}t-p8fYN@Bciv^ZC5ucb6{hS6g$Gwa{Wt zb2D?V+vh)jY-ISvCyQ6=>+ApTQJH>P_fg>d`|taYKi0YC(kLx0z2eb#j|B&o{MqTH zHTBTJpEY%pJt-t|n2hfR5+N5kJQUzP-DaJ+x`@ZrCI^IinV$;&@K z=5P7!`}gX-af>e+%syKXxi+l-xU+@3ySs(k`s<%7_N?UdQ4!=|iCQam;n}may>b74 z{IIaGY4J=}5#n@sqGTk&bL;K5vuAmk)P-1^9e?PEaR=;-iCY;WFu_M{rjOdwg+BAo zxBIy&3Hq?*9%XS_D4<%SeKBLp{rB(Ry%Q37e&^mjCGm4HadGn&{F6{nR*~WR&#-vE zhl-Pa;FXUb4W;;bw$7P5S1}xDW_-MS`e9b76C8qEt&i8`%f_BbG3w9};Y!*#V@Iss z_2TeqY*7BuzRtKvt!(qnH)Xr|+L;-(roQ_6 zb!tzN+aHUTx`z%kecT+E26b*{GZ5>3_^8Hi{w^`iqe&a1*7_M<=-$2C`pKc!(Iv`K z+ji~x_4R9MQIXTcxpQR~U*wp4Hf{Ok%qLn?y@FOw5lYjpuC88?r2EiK^k$Bj+LJ$j z=J;HG{Wa-T#v;Gvv*$J~5EmD(P?FeiHjPeEecy59~XC^&}#1H;)lM8z8fr-FJB&`S3ZYDxPMvL r>YaD<9^Baa`gQi5k~yE_U)3`Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NHfJsC_R9Fe^SXn5pT@*IYQ!;fB zGK9<_p>R@2NZ|q@;ffp6mElg2;ZCQ_9F*b$rASG}GGtaK;e-ffIOfCuKY#mg+1~f_ zc{w^)p9`(M*0Y|q-u>>q)_OlBCB>g&2NXN-Vh1cNESj5}fByXW79|4f*_->`Tx_V<{Bjt2=cbAryCT1xpC}5c3;bGp2CDQ}I>;F_P zDk{QLQd$)i70SxWJn87@D6?i{Wbk?{nSO3=j@N&J91|0Bd3i}W_4W1Pg%YoWgTuzg z#_jE`p`jruAz%q5^Kx=>;!U3*dw6*4?(R}f3kwTYR#wDoWMqU}NlOxtI&-P2s`~Qf zi>aw8veeerR#Q_W%=-itmFKI6b2>deO*tJL9QgV95uM;YGJQfq0^tP$?g91>8^5!& z)78}_X$u1a0u~n+U0q!%s-~u9XJ;o-UteD*B_)wnENE$IA#cLV5w5PT{QdpK3@c}RuKgG;o$|oFP7+w z%mEtg?<+Mq_xQvk5R} zSq%*hF$@~GgM!#vkW3#G+}zyg>VY>TBt%T4 zudhEiI7m665=KNs@Gx{ekbsI;eq2T=L)m5VP#$Fxp##>|)>2NW%elF^Jo4ksm1kix z=4&?3qiLXlivgs`&d#REAIa6%*MDXn6eck-kv+PUu?wZ;^z@Xr3QY}z3Q>KIK=q@% zyj%(+#y9@hL54<(qa+Nz(N0cI*c1Es_(<|mQo^oaZ)l&eXQ82?5`Eu*1qTN+-o3p& znNS>abXojGM@RDjoF1GZ$_ZynW+UQVB*~SPm5lV;w{HRm%%&Y39TXA*ik@I-$;->* zC!v~}8h#=b5K3CEudlO^f(`ik^($IEpAD0tw6(S6sZoSHUuomgpR=%A@n$OIVgK$w%QH%o5hg3>RO8B}rFfc&h(aZ%)zK6hz z|G5aW0QQn{!laOrl0va02^fLt&Jz&?bZLfNxGdSaESNeHLRFeD@rJ z)4*R7gqfV2w70kCV~Aw{0Ao4fNEH?q@|d`|ILa6@Z;~YALiP9equ@?VOkjSH@^cn= z+0S42IR)bwUap{6ySuyh^z`KC=SyUhl&Auv*a5{3NZ5gY0e7)3PR|*+VgLXD07*qo IM6N<$f@5g89RL6T literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/unfavorite@3x.png b/Telegram/Resources/icons/menu/unfavorite@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..0fbc2a0f5cf5f5d6f0ed5c272cfa89f142265ea9 GIT binary patch literal 2386 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 WRjuIS(LdKgQRM0B=d#Wzp$Py67T^8= literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/unpin@2x.png b/Telegram/Resources/icons/menu/unpin@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..89a0aead5bbde8311163b78bd6a4a67bf4813de1 GIT binary patch literal 959 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 Ef`a#Uv;Y7A literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/unread@3x.png b/Telegram/Resources/icons/menu/unread@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..220ce7598b66657bdd2055309804167cbe13d6af GIT binary patch literal 2053 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 jgdPYz5PIN$Q1G`M%$JMvU%uI^~%?ey&8Z2oh? z`p$Q|`?pJL?;7nrU$XD{ocBAQ*S-InWpZA9s@K!cm2>^R-&y46c+w^w((zx~c zX0t2)J(lS|UbdUpfAK|yt=C`AJe$_Kpu~z-_}tOAW%d7h@4uga{y9h2(WD#AZt>qw zJ}oks?xotgAZ+#42%RNOhab-HTkg?${Bcm+k;x~QTz)BV-fr#Dq?Fp%Z1N|idwJX0nj0&`TtpbZ@V7d3X+BXrujR{E7S2)(<2sps2tklRuXE)wW<<8Nn<)pj+I>Rl72&AQRe<>7``Uw>8YJ(pti{PWBT z%>(N1%69Lt4f-VB-P?5VLEZlL^G}O3XIu%$XuR%tDr@VZ->YvfdgIvo{`a1#i{|{@ ae^Y*K*k>76ao(w*c=dGkb6Mw<&;$UU@ct+O literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/view_replies@2x.png b/Telegram/Resources/icons/menu/view_replies@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cc358365a096ca6bdd18fba8a32245e6b7d86e7b GIT binary patch literal 1039 zcmV+q1n~QbP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NFc}YY;R9Fe^SWQT3Q4sd$WlAoJ zFr+BTz=ffUXk(B_5D^4L5N+B7wka?n(ROayv=9n|XcK}P7Z$I=K(VMrEuuiMAQW6w zM1LSs8-sXnXdVaYo_jm@dV9PF-i1sv^L_I*bB~^L)Cx(DMx&XUn(FTEzP!AAe}9+6 zAuGt`a{c;vlF6i2tCf*kRUy~Fz`)MVj=Y+rNUE)^h2CJ3;8XTKNznvdscK?q+^0Sz z5(%|h&4A-gQSwF<3YAJVJv}`>K5jOf^?JQPW?fw!d=X&6%*@Q%+8WsKo_RbTlgUJY zcXxN^=jTU9M=vig#K~%ah?A2O^4hW+(P$KF`2Bt=>iYT`)+V10`m%3oYC1kXw%hG| zFabZ*6No~nwY3!{%cqGxvdzuSv9U4a-P+pP-rk08^OYGL9i5$>#pvVXqs?Y}czA$6 zxg%?CZXO&Qtf{Gi=*`VdS63I)?0R~7NUME5AD<5NyWMV*{Pgr>wOWPqdwYA|-rf*0 zJUlF%{3p7wuz-MEE~iw|TPRHpqIP$8kv|X!a0OA`p_Y~w%sV|j1tb@P9_Y==$_m=g z&(Hn+{h3ULFS*=LrVkS=_oGb_L>BPt>nj(49*4srO${F*@lynmn1BI-Fe<7y0)!;= zgIJ=Ba5&u8*9VaK`T2{B3sG3%WQl@qZ*O4%3sXyrN*tNAVk{_%pnN`$NMf)M$(2JH z+4Ax-vJ*qDVk|rqL8Ve@X=#ZC{2e)zk$p!QcFzAnkkM%T`SF0k{-4Q}NqL80n>R8t z0tK$FuHc7Ou1btNl#w+wG$5E5j9jv$Q3T1tE19G!NTGlYJN6HDnA}GG?G9Ni7V@in zc6P=UL|J9rq;gM3M+aQQlzZ51*dk6$Oz3nvfIxfTfX2m&6V%q$c5rae-rmk766=BU zWT8;tqC|`g_S&+j0UeW*ld)Kgs|Gx*9fEIdP}AAji7bbQhs9!%$|&H(qjWqTzrVld zOJfpbFc|jt_u+7jEWu#V>-F+6R_OnFWQ~oDsZz~;?Z7|Yf#2WN-+KRC1Lgn#002ov JPDHLkV1fYg(4GJQ literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/view_replies@3x.png b/Telegram/Resources/icons/menu/view_replies@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..b261bca6c10839c157a33d73d61b17ac60bc4e22 GIT binary patch literal 1418 zcmV;51$Fv~P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*IS<^hrcPRA>e5TT3W@TNJ_6k1{ebGLZ?Hn~;)H7;rNYgFg`yN+@)o7Z1XxV*i+OG--O;^K~uj^5wjo$v%#xCE-D zrKNvAuGQ7m;NW0aMB#*ImX?+(sFc5(o0~4d=4m-J4-XIOGc`4JZf?#c*k~9Q(3pyt zfppM7yK3Alz(ZYNe1OEpMswm0^dC2FTU%TIhgt#*K*GFlKY;C1X%?K|Nl8i3(b1uy zp?kJ z`if_x8x(h8zT5*mm;Awrt9qNthHlB{R`4O zV1h0fwW6Y;^z?KpG&uvQD{gwv>9~TI)UwM&Gu2VdIeOwa8ts4?=#B_~iRvHx<#Ct4ot0 zz<#!sn&Sb(dLWIRVd*UiX&x{M!xaz71}2^>IW*mA#F$kx{$VC}0+yJVNN2;v#RX*< z+HHV^goM=8)X?bn_xCBw(Cz^Yy}|VKG_a}B<6Pa&&W_4D61>jCQJW+2_xB$h9AuXJ zIr`$a&;Vhph0*Wo>S81eYYi~$3*#4QVPPTT-AU})+8TCV_|7euiatI*}4NKsv1Ul$YB`DVdi-E)Y^=Apmr6k2-ri #include @@ -496,7 +497,9 @@ void ProxyRow::showMenu() { if (_menu) { return; } - _menu = base::make_unique_q(window()); + _menu = base::make_unique_q( + window(), + st::dropdownMenuWithIcons); const auto weak = _menu.get(); _menu->setHiddenCallback([=] { weak->deleteLater(); @@ -517,25 +520,26 @@ void ProxyRow::showMenu() { _menuToggle->installEventFilter(_menu); const auto addAction = [&]( const QString &text, - Fn callback) { + Fn callback, + const style::icon *icon) { return _menu->addAction(text, std::move(callback)); }; addAction(tr::lng_proxy_menu_edit(tr::now), [=] { _editClicks.fire({}); - }); + }, &st::menuIconEdit); if (_view.supportsShare) { addAction(tr::lng_proxy_edit_share(tr::now), [=] { _shareClicks.fire({}); - }); + }, &st::menuIconShare); } if (_view.deleted) { addAction(tr::lng_proxy_menu_restore(tr::now), [=] { _restoreClicks.fire({}); - }); + }, &st::menuIconDelete); } else { addAction(tr::lng_proxy_menu_delete(tr::now), [=] { _deleteClicks.fire({}); - }); + }, &st::menuIconDelete); } const auto parentTopLeft = window()->mapToGlobal(QPoint()); const auto buttonTopLeft = _menuToggle->mapToGlobal(QPoint()); diff --git a/Telegram/SourceFiles/boxes/dictionaries_manager.cpp b/Telegram/SourceFiles/boxes/dictionaries_manager.cpp index d83c9cdef..6d3bbd113 100644 --- a/Telegram/SourceFiles/boxes/dictionaries_manager.cpp +++ b/Telegram/SourceFiles/boxes/dictionaries_manager.cpp @@ -16,9 +16,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "mainwidget.h" #include "mtproto/dedicated_file_loader.h" #include "spellcheck/spellcheck_utils.h" -#include "styles/style_layers.h" -#include "styles/style_settings.h" -#include "styles/style_boxes.h" #include "ui/wrap/vertical_layout.h" #include "ui/widgets/buttons.h" #include "ui/widgets/labels.h" @@ -27,6 +24,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/wrap/slide_wrap.h" #include "ui/effects/animations.h" #include "window/window_session_controller.h" +#include "styles/style_layers.h" +#include "styles/style_settings.h" +#include "styles/style_boxes.h" +#include "styles/style_menu_icons.h" namespace Ui { namespace { @@ -305,12 +306,14 @@ auto AddButtonWithLoader( if (!DictExists(id)) { return false; } - *contextMenu = base::make_unique_q(button); + *contextMenu = base::make_unique_q( + button, + st::popupMenuWithIcons); contextMenu->get()->addAction( tr::lng_settings_manage_remove_dictionary(tr::now), [=] { - Spellchecker::RemoveDictionary(id); - dictionaryRemoved->fire({}); - }); + Spellchecker::RemoveDictionary(id); + dictionaryRemoved->fire({}); + }, &st::menuIconDelete); contextMenu->get()->popup(QCursor::pos()); return true; }; diff --git a/Telegram/SourceFiles/boxes/language_box.cpp b/Telegram/SourceFiles/boxes/language_box.cpp index 2bca858d5..94635ebf8 100644 --- a/Telegram/SourceFiles/boxes/language_box.cpp +++ b/Telegram/SourceFiles/boxes/language_box.cpp @@ -33,6 +33,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_info.h" #include "styles/style_passport.h" #include "styles/style_chat_helpers.h" +#include "styles/style_menu_icons.h" #include #include @@ -437,7 +438,9 @@ void Rows::showMenu(int index) { if (_menu || !hasMenu(row)) { return; } - _menu = base::make_unique_q(window()); + _menu = base::make_unique_q( + window(), + st::dropdownMenuWithIcons); const auto weak = _menu.get(); _menu->setHiddenCallback([=] { weak->deleteLater(); @@ -460,21 +463,25 @@ void Rows::showMenu(int index) { }); const auto addAction = [&]( const QString &text, - Fn callback) { - return _menu->addAction(text, std::move(callback)); + Fn callback, + const style::icon *icon) { + return _menu->addAction(text, std::move(callback), icon); }; if (canShare(row)) { - addAction(tr::lng_proxy_edit_share(tr::now), [=] { share(row); }); + addAction( + tr::lng_proxy_edit_share(tr::now), + [=] { share(row); }, + &st::menuIconShare); } if (canRemove(row)) { if (row->removed) { addAction(tr::lng_proxy_menu_restore(tr::now), [=] { restore(row); - }); + }, &st::menuIconDelete); } else { addAction(tr::lng_proxy_menu_delete(tr::now), [=] { remove(row); - }); + }, &st::menuIconDelete); } } const auto toggle = menuToggleArea(row); diff --git a/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp index 8fd36a7cc..c979d01fc 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp @@ -32,6 +32,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/ui_utility.h" #include "window/window_session_controller.h" #include "history/history.h" +#include "styles/style_menu_icons.h" namespace { @@ -1521,7 +1522,9 @@ base::unique_qptr ParticipantsBoxController::rowContextMenu( const auto channel = _peer->asChannel(); const auto participant = row->peer(); const auto user = participant->asUser(); - auto result = base::make_unique_q(parent); + auto result = base::make_unique_q( + parent, + st::popupMenuWithIcons); if (_navigation) { result->addAction( (participant->isUser() @@ -1530,7 +1533,10 @@ base::unique_qptr ParticipantsBoxController::rowContextMenu( ? tr::lng_context_view_channel : tr::lng_context_view_group)(tr::now), crl::guard(this, [=] { - _navigation->showPeerInfo(participant); })); + _navigation->showPeerInfo(participant); }), + (participant->isUser() + ? &st::menuIconProfile + : &st::menuIconInfo)); } if (_role == Role::Kicked) { if (_peer->isMegagroup() @@ -1538,11 +1544,13 @@ base::unique_qptr ParticipantsBoxController::rowContextMenu( if (user && channel->canAddMembers()) { result->addAction( tr::lng_context_add_to_group(tr::now), - crl::guard(this, [=] { unkickParticipant(user); })); + crl::guard(this, [=] { unkickParticipant(user); }), + &st::menuIconInvite); } result->addAction( tr::lng_profile_delete_removed(tr::now), - crl::guard(this, [=] { removeKickedWithRow(participant); })); + crl::guard(this, [=] { removeKickedWithRow(participant); }), + &st::menuIconDelete); } return result; } @@ -1553,7 +1561,10 @@ base::unique_qptr ParticipantsBoxController::rowContextMenu( (isAdmin ? tr::lng_context_edit_permissions : tr::lng_context_promote_admin)(tr::now), - crl::guard(this, [=] { showAdmin(user); })); + crl::guard(this, [=] { showAdmin(user); }), + (isAdmin + ? &st::menuIconAdmin + : &st::menuIconPromote)); } if (user && _additional.canRestrictParticipant(participant)) { const auto canRestrictWithoutKick = [&] { @@ -1565,7 +1576,8 @@ base::unique_qptr ParticipantsBoxController::rowContextMenu( if (canRestrictWithoutKick) { result->addAction( tr::lng_context_restrict_user(tr::now), - crl::guard(this, [=] { showRestricted(user); })); + crl::guard(this, [=] { showRestricted(user); }), + &st::menuIconRestrict); } } if (user && _additional.canRemoveParticipant(participant)) { @@ -1575,7 +1587,8 @@ base::unique_qptr ParticipantsBoxController::rowContextMenu( (isGroup ? tr::lng_context_remove_from_group : tr::lng_profile_kick)(tr::now), - crl::guard(this, [=] { kickParticipant(user); })); + crl::guard(this, [=] { kickParticipant(user); }), + &st::menuIconRemove); } } return result; diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_invite_link.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_invite_link.cpp index 33b648a49..2f49c1ea6 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_invite_link.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_invite_link.cpp @@ -46,6 +46,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_layers.h" // st::boxDividerLabel. #include "styles/style_info.h" #include "styles/style_settings.h" +#include "styles/style_menu_icons.h" #include #include @@ -349,28 +350,36 @@ void Controller::addHeaderBlock(not_null container) { }); const auto createMenu = [=] { - auto result = base::make_unique_q(container); + auto result = base::make_unique_q( + container, + st::popupMenuWithIcons); if (revoked) { result->addAction( tr::lng_group_invite_context_delete(tr::now), - deleteLink); + deleteLink, + &st::menuIconDelete); } else { result->addAction( tr::lng_group_invite_context_copy(tr::now), - copyLink); + copyLink, + &st::menuIconCopy); result->addAction( tr::lng_group_invite_context_share(tr::now), - shareLink); + shareLink, + &st::menuIconShare); result->addAction( tr::lng_group_invite_context_qr(tr::now), - getLinkQr); + getLinkQr, + &st::menuIconQrCode); if (!admin->isBot()) { result->addAction( tr::lng_group_invite_context_edit(tr::now), - editLink); + editLink, + &st::menuIconEdit); result->addAction( tr::lng_group_invite_context_revoke(tr::now), - revokeLink); + revokeLink, + &st::menuIconRemove); } } return result; @@ -745,16 +754,18 @@ base::unique_qptr Controller::createRowContextMenu( const auto user = row->peer()->asUser(); Assert(user != nullptr); - auto result = base::make_unique_q(parent); + auto result = base::make_unique_q( + parent, + st::popupMenuWithIcons); const auto add = _peer->isBroadcast() ? tr::lng_group_requests_add_channel(tr::now) : tr::lng_group_requests_add(tr::now); result->addAction(add, [=] { processRequest(user, true); - }); + }, &st::menuIconInvite); result->addAction(tr::lng_group_requests_dismiss(tr::now), [=] { processRequest(user, false); - }); + }, &st::menuIconRemove); return result; } @@ -960,20 +971,26 @@ void AddPermanentLinkBlock( : data.link; }); const auto createMenu = [=] { - auto result = base::make_unique_q(container); + auto result = base::make_unique_q( + container, + st::popupMenuWithIcons); result->addAction( tr::lng_group_invite_context_copy(tr::now), - copyLink); + copyLink, + &st::menuIconCopy); result->addAction( tr::lng_group_invite_context_share(tr::now), - shareLink); + shareLink, + &st::menuIconShare); result->addAction( tr::lng_group_invite_context_qr(tr::now), - getLinkQr); + getLinkQr, + &st::menuIconQrCode); if (!admin->isBot()) { result->addAction( tr::lng_group_invite_context_revoke(tr::now), - revokeLink); + revokeLink, + &st::menuIconRemove); } return result; }; diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_invite_links.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_invite_links.cpp index 5a187af23..91f592a66 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_invite_links.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_invite_links.cpp @@ -28,6 +28,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_info.h" #include "styles/style_layers.h" // st::boxDividerLabel #include "styles/style_settings.h" // st::settingsDividerLabelPadding +#include "styles/style_menu_icons.h" #include @@ -578,27 +579,29 @@ base::unique_qptr LinksController::createRowContextMenu( const auto real = static_cast(row.get()); const auto data = real->data(); const auto link = data.link; - auto result = base::make_unique_q(parent); + auto result = base::make_unique_q( + parent, + st::popupMenuWithIcons); if (data.revoked) { result->addAction(tr::lng_group_invite_context_delete(tr::now), [=] { DeleteLink(_peer, _admin, link); - }); + }, &st::menuIconDelete); } else { result->addAction(tr::lng_group_invite_context_copy(tr::now), [=] { CopyInviteLink(link); - }); + }, &st::menuIconCopy); result->addAction(tr::lng_group_invite_context_share(tr::now), [=] { ShareInviteLinkBox(_peer, link); - }); + }, &st::menuIconShare); result->addAction(tr::lng_group_invite_context_qr(tr::now), [=] { InviteLinkQrBox(link); - }); + }, &st::menuIconQrCode); result->addAction(tr::lng_group_invite_context_edit(tr::now), [=] { EditLink(_peer, data); - }); + }, &st::menuIconEdit); result->addAction(tr::lng_group_invite_context_revoke(tr::now), [=] { RevokeLink(_peer, _admin, link); - }); + }, &st::menuIconRemove); } return result; } diff --git a/Telegram/SourceFiles/boxes/sticker_set_box.cpp b/Telegram/SourceFiles/boxes/sticker_set_box.cpp index 2b2852381..b07a71c83 100644 --- a/Telegram/SourceFiles/boxes/sticker_set_box.cpp +++ b/Telegram/SourceFiles/boxes/sticker_set_box.cpp @@ -43,6 +43,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_layers.h" #include "styles/style_chat_helpers.h" #include "styles/style_info.h" +#include "styles/style_menu_icons.h" #include #include @@ -297,12 +298,15 @@ void StickerSetBox::updateButtons() { const auto menu = std::make_shared>(); top->setClickedCallback([=] { - *menu = base::make_unique_q(top); + *menu = base::make_unique_q( + top, + st::popupMenuWithIcons); (*menu)->addAction( (isMasks ? tr::lng_stickers_share_masks : tr::lng_stickers_share_pack)(tr::now), - share); + share, + &st::menuIconShare); (*menu)->popup(QCursor::pos()); return true; }); @@ -328,12 +332,15 @@ void StickerSetBox::updateButtons() { const auto menu = std::make_shared>(); top->setClickedCallback([=] { - *menu = base::make_unique_q(top); + *menu = base::make_unique_q( + top, + st::popupMenuWithIcons); (*menu)->addAction( isMasks ? tr::lng_masks_archive_pack(tr::now) : tr::lng_stickers_archive_pack(tr::now), - archive); + archive, + &st::menuIconArchive); (*menu)->popup(QCursor::pos()); return true; }); @@ -652,7 +659,9 @@ void StickerSetBox::Inner::contextMenuEvent(QContextMenuEvent *e) { return; } _previewTimer.cancel(); - _menu = base::make_unique_q(this); + _menu = base::make_unique_q( + this, + st::popupMenuWithIcons); const auto document = _pack[index]; const auto sendSelected = [=](Api::SendOptions options) { @@ -669,11 +678,15 @@ void StickerSetBox::Inner::contextMenuEvent(QContextMenuEvent *e) { document, Data::FileOriginStickerSet(Data::Stickers::FavedSetId, 0)); }; + const auto isFaved = document->owner().stickers().isFaved(document); _menu->addAction( - (document->owner().stickers().isFaved(document) + (isFaved ? tr::lng_faved_stickers_remove : tr::lng_faved_stickers_add)(tr::now), - toggleFavedSticker); + toggleFavedSticker, + (isFaved + ? &st::menuIconUnfave + : &st::menuIconFave)); _menu->popup(QCursor::pos()); } diff --git a/Telegram/SourceFiles/calls/calls_box_controller.cpp b/Telegram/SourceFiles/calls/calls_box_controller.cpp index 85bc8ab86..2fc5122b7 100644 --- a/Telegram/SourceFiles/calls/calls_box_controller.cpp +++ b/Telegram/SourceFiles/calls/calls_box_controller.cpp @@ -30,6 +30,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_layers.h" // st::boxLabel. #include "styles/style_calls.h" #include "styles/style_boxes.h" +#include "styles/style_menu_icons.h" namespace Calls { namespace { @@ -356,12 +357,14 @@ base::unique_qptr BoxController::rowContextMenu( const auto session = &this->session(); const auto ids = session->data().itemsToIds(items); - auto result = base::make_unique_q(parent); + auto result = base::make_unique_q( + parent, + st::popupMenuWithIcons); result->addAction(tr::lng_context_delete_selected(tr::now), [=] { _window->show( Box(session, base::duplicate(ids)), Ui::LayerOption::KeepOther); - }); + }, &st::menuIconDelete); return result; } diff --git a/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp b/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp index 39d2a214d..7156707e3 100644 --- a/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp +++ b/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp @@ -37,12 +37,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/cached_round_corners.h" #include "base/unixtime.h" #include "base/random.h" +#include "base/qt_adapters.h" #include "window/window_adaptive.h" #include "window/window_session_controller.h" #include "styles/style_chat.h" #include "styles/style_widgets.h" #include "styles/style_chat_helpers.h" -#include "base/qt_adapters.h" +#include "styles/style_menu_icons.h" #include @@ -1190,7 +1191,9 @@ void FieldAutocomplete::Inner::contextMenuEvent(QContextMenuEvent *e) { ? _sendMenuType() : SendMenu::Type::Disabled; const auto method = FieldAutocomplete::ChooseMethod::ByClick; - _menu = base::make_unique_q(this); + _menu = base::make_unique_q( + this, + st::popupMenuWithIcons); const auto send = [=](Api::SendOptions options) { chooseAtIndex(method, index, options); diff --git a/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp b/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp index 213fcdac1..fa91ecc26 100644 --- a/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp +++ b/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp @@ -35,6 +35,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/history_view_cursor_state.h" #include "storage/storage_account.h" // Account::writeSavedGifs #include "styles/style_chat_helpers.h" +#include "styles/style_menu_icons.h" #include @@ -48,7 +49,7 @@ constexpr auto kSearchBotUsername = "gif"_cs; } // namespace void AddGifAction( - Fn &&)> callback, + Fn &&, const style::icon*)> callback, not_null document) { if (!document->isGifv()) { return; @@ -71,7 +72,7 @@ void AddGifAction( document->session().local().writeSavedGifs(); } data.stickers().notifySavedGifsUpdated(); - }); + }, saved ? &st::menuIconDelete : &st::menuIconGif); } class GifsListWidget::Footer : public TabbedSelector::InnerFooter { @@ -386,8 +387,11 @@ void GifsListWidget::fillContextMenu( ? item->getDocument() // Saved GIF. : item->getPreviewDocument(); // Searched GIF. if (document) { - auto callback = [&](const QString &text, Fn &&done) { - menu->addAction(text, std::move(done)); + auto callback = [&]( + const QString &text, + Fn &&done, + const style::icon *icon) { + menu->addAction(text, std::move(done), icon); }; AddGifAction(std::move(callback), document); } diff --git a/Telegram/SourceFiles/chat_helpers/gifs_list_widget.h b/Telegram/SourceFiles/chat_helpers/gifs_list_widget.h index b03485b32..f07044ebb 100644 --- a/Telegram/SourceFiles/chat_helpers/gifs_list_widget.h +++ b/Telegram/SourceFiles/chat_helpers/gifs_list_widget.h @@ -41,7 +41,7 @@ enum class Type; namespace ChatHelpers { void AddGifAction( - Fn &&)> callback, + Fn &&, const style::icon*)> callback, not_null document); class GifsListWidget diff --git a/Telegram/SourceFiles/chat_helpers/send_context_menu.cpp b/Telegram/SourceFiles/chat_helpers/send_context_menu.cpp index 9c3ac27ff..16ac9378f 100644 --- a/Telegram/SourceFiles/chat_helpers/send_context_menu.cpp +++ b/Telegram/SourceFiles/chat_helpers/send_context_menu.cpp @@ -17,6 +17,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_peer.h" #include "main/main_session.h" #include "apiwrap.h" +#include "styles/style_menu_icons.h" #include @@ -56,14 +57,18 @@ FillMenuResult FillSendMenu( } if (silent && now != Type::Reminder) { - menu->addAction(tr::lng_send_silent_message(tr::now), silent); + menu->addAction( + tr::lng_send_silent_message(tr::now), + silent, + &st::menuIconMute); } if (schedule && now != Type::SilentOnly) { menu->addAction( (now == Type::Reminder ? tr::lng_reminder_message(tr::now) : tr::lng_schedule_message(tr::now)), - schedule); + schedule, + &st::menuIconSchedule); } return FillMenuResult::Success; } @@ -78,7 +83,9 @@ void SetupMenuAndShortcuts( } const auto menu = std::make_shared>(); const auto showMenu = [=] { - *menu = base::make_unique_q(button); + *menu = base::make_unique_q( + button, + st::popupMenuWithIcons); const auto result = FillSendMenu(*menu, type(), silent, schedule); const auto success = (result == FillMenuResult::Success); if (success) { @@ -149,7 +156,9 @@ void SetupUnreadMentionsMenu( if (!peer) { return; } - state->menu = base::make_unique_q(button); + state->menu = base::make_unique_q( + button, + st::popupMenuWithIcons); const auto text = tr::lng_context_mark_read_mentions_all(tr::now); state->menu->addAction(text, [=] { if (!state->sentForPeers.emplace(peer).second) { @@ -163,7 +172,7 @@ void SetupUnreadMentionsMenu( }).fail([=] { state->sentForPeers.remove(peer); }).send(); - }); + }, &st::menuIconMarkRead); state->menu->popup(QCursor::pos()); }; diff --git a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp index eeccc6f36..bceb5a770 100644 --- a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp +++ b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp @@ -42,6 +42,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_toggling_media.h" // Api::ToggleFavedSticker #include "styles/style_chat_helpers.h" #include "styles/style_window.h" +#include "styles/style_menu_icons.h" #include @@ -2173,15 +2174,17 @@ void StickersListWidget::fillContextMenu( document, Data::FileOriginStickerSet(Data::Stickers::FavedSetId, 0)); }; + const auto isFaved = document->owner().stickers().isFaved(document); menu->addAction( - (document->owner().stickers().isFaved(document) + (isFaved ? tr::lng_faved_stickers_remove : tr::lng_faved_stickers_add)(tr::now), - toggleFavedSticker); + toggleFavedSticker, + isFaved ? &st::menuIconUnfave : &st::menuIconFave); menu->addAction(tr::lng_context_pack_info(tr::now), [=] { showStickerSetBox(document); - }); + }, &st::menuIconStickers); if (const auto id = set.id; id == Data::Stickers::RecentSetId) { menu->addAction(tr::lng_recent_stickers_remove(tr::now), [=] { @@ -2189,7 +2192,7 @@ void StickersListWidget::fillContextMenu( document, Data::FileOriginStickerSet(id, 0), false); - }); + }, &st::menuIconDelete); } } } diff --git a/Telegram/SourceFiles/chat_helpers/tabbed_selector.cpp b/Telegram/SourceFiles/chat_helpers/tabbed_selector.cpp index 47bfaf5f7..4b78b3f33 100644 --- a/Telegram/SourceFiles/chat_helpers/tabbed_selector.cpp +++ b/Telegram/SourceFiles/chat_helpers/tabbed_selector.cpp @@ -31,6 +31,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "mainwindow.h" #include "apiwrap.h" #include "styles/style_chat_helpers.h" +#include "styles/style_menu_icons.h" namespace ChatHelpers { @@ -1057,7 +1058,9 @@ void TabbedSelector::scrollToY(int y) { } void TabbedSelector::showMenuWithType(SendMenu::Type type) { - _menu = base::make_unique_q(this); + _menu = base::make_unique_q( + this, + st::popupMenuWithIcons); currentTab()->widget()->fillContextMenu(_menu, type); if (!_menu->empty()) { diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index 0df9533cd..21096322f 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -50,10 +50,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/unread_badge.h" #include "boxes/filters/edit_filter_box.h" #include "api/api_chat_filters.h" +#include "base/qt_adapters.h" #include "styles/style_dialogs.h" #include "styles/style_chat_helpers.h" #include "styles/style_window.h" -#include "base/qt_adapters.h" +#include "styles/style_menu_icons.h" namespace Dialogs { namespace { @@ -1760,7 +1761,9 @@ void InnerWidget::contextMenuEvent(QContextMenuEvent *e) { mousePressReleased(e->globalPos(), _pressButton); } - _menu = base::make_unique_q(this); + _menu = base::make_unique_q( + this, + row.fullId ? st::defaultPopupMenu : st::popupMenuWithIcons); if (row.fullId) { if (session().supportMode()) { fillSupportSearchMenu(_menu.get()); @@ -1775,8 +1778,11 @@ void InnerWidget::contextMenuEvent(QContextMenuEvent *e) { .section = Dialogs::EntryState::Section::ChatsList, .filterId = _filterId, }, - [&](const QString &text, Fn callback) { - return _menu->addAction(text, std::move(callback)); + [&]( + const QString &text, + Fn callback, + const style::icon *icon) { + return _menu->addAction(text, std::move(callback), icon); }); } connect(_menu.get(), &QObject::destroyed, [=] { diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp index 7b3f24f16..c2504a29f 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp @@ -57,6 +57,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "facades.h" #include "app.h" #include "styles/style_chat.h" +#include "styles/style_menu_icons.h" #include #include @@ -1158,7 +1159,9 @@ void InnerWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { isUponSelected = hasSelected; } - _menu = base::make_unique_q(this); + _menu = base::make_unique_q( + this, + st::popupMenuWithIcons); const auto link = ClickHandler::getActive(); auto view = App::hoveredItem() @@ -1176,7 +1179,7 @@ void InnerWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (isUponSelected > 0) { _menu->addAction(tr::lng_context_copy_selected(tr::now), [=] { copySelectedText(); - }); + }, &st::menuIconCopy); } if (lnkPhoto) { const auto photo = lnkPhoto->photo(); @@ -1184,10 +1187,10 @@ void InnerWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (!photo->isNull() && media && media->loaded()) { _menu->addAction(tr::lng_context_save_image(tr::now), App::LambdaDelayed(st::defaultDropdownMenu.menu.ripple.hideDuration, this, [=] { savePhotoToFile(photo); - })); + }), &st::menuIconSaveImage); _menu->addAction(tr::lng_context_copy_image(tr::now), [=] { copyContextImage(photo); - }); + }, &st::menuIconCopy); } if (photo->hasAttachedStickers()) { const auto controller = _controller; @@ -1197,14 +1200,15 @@ void InnerWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { }; _menu->addAction( tr::lng_context_attached_stickers(tr::now), - std::move(callback)); + std::move(callback), + &st::menuIconStickers); } } else { auto document = lnkDocument->document(); if (document->loading()) { _menu->addAction(tr::lng_context_cancel_download(tr::now), [=] { cancelContextDownload(document); - }); + }, &st::menuIconCancel); } else { const auto itemId = view ? view->data()->fullId() @@ -1220,17 +1224,17 @@ void InnerWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (notAutoplayedGif) { _menu->addAction(tr::lng_context_open_gif(tr::now), [=] { openContextGif(itemId); - }); + }, &st::menuIconShowInChat); } } if (!document->filepath(true).isEmpty()) { _menu->addAction(Platform::IsMac() ? tr::lng_context_show_in_finder(tr::now) : tr::lng_context_show_in_folder(tr::now), [=] { showContextInFolder(document); - }); + }, &st::menuIconShowInFolder); } _menu->addAction(lnkIsVideo ? tr::lng_context_save_video(tr::now) : (lnkIsVoice ? tr::lng_context_save_audio(tr::now) : (lnkIsAudio ? tr::lng_context_save_audio_file(tr::now) : tr::lng_context_save_file(tr::now))), App::LambdaDelayed(st::defaultDropdownMenu.menu.ripple.hideDuration, this, [this, document] { saveDocumentToFile(document); - })); + }), &st::menuIconDownload); if (document->hasAttachedStickers()) { const auto controller = _controller; auto callback = [=, doc = document] { @@ -1239,7 +1243,8 @@ void InnerWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { }; _menu->addAction( tr::lng_context_attached_stickers(tr::now), - std::move(callback)); + std::move(callback), + &st::menuIconStickers); } } } @@ -1253,7 +1258,10 @@ void InnerWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { auto msg = dynamic_cast(item); if (isUponSelected > 0) { - _menu->addAction(tr::lng_context_copy_selected(tr::now), [this] { copySelectedText(); }); + _menu->addAction( + tr::lng_context_copy_selected(tr::now), + [this] { copySelectedText(); }, + &st::menuIconCopy); } else { if (item && !isUponSelected) { const auto media = view->media(); @@ -1262,7 +1270,7 @@ void InnerWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (document->sticker()) { _menu->addAction(tr::lng_context_save_image(tr::now), App::LambdaDelayed(st::defaultDropdownMenu.menu.ripple.hideDuration, this, [this, document] { saveDocumentToFile(document); - })); + }), &st::menuIconDownload); } } if (msg @@ -1272,7 +1280,7 @@ void InnerWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { || item->Has())) { _menu->addAction(tr::lng_context_copy_text(tr::now), [=] { copyContextText(itemId); - }); + }, &st::menuIconCopy); } } } @@ -1285,7 +1293,8 @@ void InnerWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { actionText, [text = link->copyToClipboardText()] { QGuiApplication::clipboard()->setText(text); - }); + }, + &st::menuIconCopy); } } diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index 284b69902..b9def165e 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -49,6 +49,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "chat_helpers/emoji_interactions.h" #include "history/history_widget.h" #include "base/platform/base_platform_info.h" +#include "base/qt_adapters.h" #include "base/unixtime.h" #include "mainwindow.h" #include "layout/layout_selection.h" @@ -82,7 +83,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "app.h" #include "styles/style_chat.h" #include "styles/style_window.h" // st::windowMinWidth -#include "base/qt_adapters.h" +#include "styles/style_menu_icons.h" #include #include @@ -1673,7 +1674,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { && Api::WhoReadExists(_dragStateItem); _menu = base::make_unique_q( this, - hasWhoReadItem ? st::whoReadMenu : st::defaultPopupMenu); + hasWhoReadItem ? st::whoReadMenu : st::popupMenuWithIcons); const auto session = &this->session(); const auto controller = _controller; const auto groupLeaderOrSelf = [](HistoryItem *item) -> HistoryItem* { @@ -1706,13 +1707,13 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { item->addReaction(entry.emoji); }); } - _menu->addAction("Reaction", std::move(reactionMenu)); + _menu->addAction("Reaction", std::move(reactionMenu), &st::menuIconReactions); } } if (canSendMessages) { _menu->addAction(tr::lng_context_reply_msg(tr::now), [=] { _widget->replyToMessage(itemId); - }); + }, &st::menuIconReply); } const auto repliesCount = item->repliesCount(); const auto withReplies = (repliesCount > 0); @@ -1726,7 +1727,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { : tr::lng_replies_view_thread(tr::now); _menu->addAction(phrase, [=] { controller->showRepliesForMessage(_history, rootId); - }); + }, &st::menuIconViewReplies); } const auto t = base::unixtime::now(); const auto editItem = (albumPartItem && albumPartItem->allowsEdit(t)) @@ -1738,7 +1739,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { const auto editItemId = editItem->fullId(); _menu->addAction(tr::lng_context_edit_msg(tr::now), [=] { _widget->editMessage(editItemId); - }); + }, &st::menuIconEdit); } const auto pinItem = (item->canPin() && item->isPinned()) ? item @@ -1749,7 +1750,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { const auto controller = _controller; _menu->addAction(isPinned ? tr::lng_context_unpin_msg(tr::now) : tr::lng_context_pin_msg(tr::now), crl::guard(controller, [=] { Window::ToggleMessagePinned(controller, pinItemId, !isPinned); - })); + }), isPinned ? &st::menuIconUnpin : &st::menuIconPin); } }; const auto addPhotoActions = [&](not_null photo, HistoryItem *item) { @@ -1758,24 +1759,24 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (!photo->isNull() && media && media->loaded() && !hasCopyRestriction(item)) { _menu->addAction(tr::lng_context_save_image(tr::now), App::LambdaDelayed(st::defaultDropdownMenu.menu.ripple.hideDuration, this, [=] { savePhotoToFile(photo); - })); + }), &st::menuIconSaveImage); _menu->addAction(tr::lng_context_copy_image(tr::now), [=] { copyContextImage(photo, itemId); - }); + }, &st::menuIconCopy); } if (photo->hasAttachedStickers()) { _menu->addAction(tr::lng_context_attached_stickers(tr::now), [=] { session->api().attachedStickers().requestAttachedStickerSets( controller, photo); - }); + }, &st::menuIconStickers); } }; const auto addDocumentActions = [&](not_null document, HistoryItem *item) { if (document->loading()) { _menu->addAction(tr::lng_context_cancel_download(tr::now), [=] { cancelContextDownload(document); - }); + }, &st::menuIconCancel); return; } const auto itemId = item ? item->fullId() : FullMsgId(); @@ -1794,30 +1795,30 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (notAutoplayedGif) { _menu->addAction(tr::lng_context_open_gif(tr::now), [=] { openContextGif(itemId); - }); + }, &st::menuIconShowInChat); } if (!hasCopyRestriction(item)) { _menu->addAction(tr::lng_context_save_gif(tr::now), [=] { saveContextGif(itemId); - }); + }, &st::menuIconGif); } } if (!document->filepath(true).isEmpty()) { _menu->addAction(Platform::IsMac() ? tr::lng_context_show_in_finder(tr::now) : tr::lng_context_show_in_folder(tr::now), [=] { showContextInFolder(document); - }); + }, &st::menuIconShowInFolder); } if (!hasCopyRestriction(item)) { _menu->addAction(lnkIsVideo ? tr::lng_context_save_video(tr::now) : (lnkIsVoice ? tr::lng_context_save_audio(tr::now) : (lnkIsAudio ? tr::lng_context_save_audio_file(tr::now) : tr::lng_context_save_file(tr::now))), App::LambdaDelayed(st::defaultDropdownMenu.menu.ripple.hideDuration, this, [=] { saveDocumentToFile(itemId, document); - })); + }), &st::menuIconDownload); } if (document->hasAttachedStickers()) { _menu->addAction(tr::lng_context_attached_stickers(tr::now), [=] { session->api().attachedStickers().requestAttachedStickerSets( controller, document); - }); + }, &st::menuIconStickers); } }; @@ -1840,7 +1841,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { _widget->updateTopBarSelection(); } } - }); + }, &st::menuIconSelect); } }; @@ -1866,7 +1867,8 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { (isUponSelected > 1 ? tr::lng_context_copy_selected_items(tr::now) : tr::lng_context_copy_selected(tr::now)), - [=] { copySelectedText(); }); + [=] { copySelectedText(); }, + &st::menuIconCopy); } addItemActions(item, item); if (lnkPhoto) { @@ -1877,22 +1879,22 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (item && item->hasDirectLink() && isUponSelected != 2 && isUponSelected != -2) { _menu->addAction(item->history()->peer->isMegagroup() ? tr::lng_context_copy_message_link(tr::now) : tr::lng_context_copy_post_link(tr::now), [=] { HistoryView::CopyPostLink(session, itemId, HistoryView::Context::History); - }); + }, &st::menuIconLink); } if (isUponSelected > 1) { if (selectedState.count > 0 && selectedState.canForwardCount == selectedState.count) { _menu->addAction(tr::lng_context_forward_selected(tr::now), [=] { _widget->forwardSelected(); - }); + }, &st::menuIconForward); } if (selectedState.count > 0 && selectedState.canDeleteCount == selectedState.count) { _menu->addAction(tr::lng_context_delete_selected(tr::now), [=] { _widget->confirmDeleteSelected(); - }); + }, &st::menuIconDelete); } _menu->addAction(tr::lng_context_clear_selection(tr::now), [=] { _widget->clearSelected(); - }); + }, &st::menuIconSelect); } else if (item) { const auto itemId = item->fullId(); const auto blockSender = item->history()->peer->isRepliesChat(); @@ -1900,7 +1902,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (item->allowsForward()) { _menu->addAction(tr::lng_context_forward_msg(tr::now), [=] { forwardItem(itemId); - }); + }, &st::menuIconForward); } if (item->canDelete()) { _menu->addAction(Ui::DeleteMessageContextAction( @@ -1912,14 +1914,14 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (!blockSender && item->suggestReport()) { _menu->addAction(tr::lng_context_report_msg(tr::now), [=] { reportItem(itemId); - }); + }, &st::menuIconReport); } } addSelectMessageAction(item, false); if (isUponSelected != -2 && blockSender) { _menu->addAction(tr::lng_profile_block_user(tr::now), [=] { blockSenderItem(itemId); - }); + }, &st::menuIconBlock); } } } else { // maybe cursor on some text history item? @@ -1947,7 +1949,8 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { ((isUponSelected > 1) ? tr::lng_context_copy_selected_items(tr::now) : tr::lng_context_copy_selected(tr::now)), - [=] { copySelectedText(); }); + [=] { copySelectedText(); }, + &st::menuIconCopy); } addItemActions(item, item); } else { @@ -1960,15 +1963,16 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (document->sticker()->set) { _menu->addAction(document->isStickerSetInstalled() ? tr::lng_context_pack_info(tr::now) : tr::lng_context_pack_add(tr::now), [=] { showStickerPackInfo(document); - }); - _menu->addAction(session->data().stickers().isFaved(document) ? tr::lng_faved_stickers_remove(tr::now) : tr::lng_faved_stickers_add(tr::now), [=] { + }, &st::menuIconStickers); + const auto isFaved = session->data().stickers().isFaved(document); + _menu->addAction(isFaved ? tr::lng_faved_stickers_remove(tr::now) : tr::lng_faved_stickers_add(tr::now), [=] { Api::ToggleFavedSticker(document, itemId); - }); + }, isFaved ? &st::menuIconUnfave : &st::menuIconFave); } if (!hasCopyRestriction(item)) { _menu->addAction(tr::lng_context_save_image(tr::now), App::LambdaDelayed(st::defaultDropdownMenu.menu.ripple.hideDuration, this, [=] { saveDocumentToFile(itemId, document); - })); + }), &st::menuIconDownload); } } } @@ -1983,13 +1987,13 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { const auto phone = contact->phoneNumber; _menu->addAction(tr::lng_profile_copy_phone(tr::now), [=] { QGuiApplication::clipboard()->setText(phone); - }); + }, &st::menuIconCopy); } } if (item->isSponsored()) { _menu->addAction(tr::lng_sponsored_title({}), [=] { _controller->show(Box(Ui::AboutSponsoredBox)); - }); + }, &st::menuIconInfo); } if (!item->isService() && view @@ -1998,7 +2002,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { && (view->hasVisibleText() || mediaHasTextForCopy)) { _menu->addAction(tr::lng_context_copy_text(tr::now), [=] { copyContextText(itemId); - }); + }, &st::menuIconCopy); } } } @@ -2011,39 +2015,40 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { actionText, [text = link->copyToClipboardText()] { QGuiApplication::clipboard()->setText(text); - }); + }, + &st::menuIconCopy); } else if (item && item->hasDirectLink() && isUponSelected != 2 && isUponSelected != -2) { _menu->addAction(item->history()->peer->isMegagroup() ? tr::lng_context_copy_message_link(tr::now) : tr::lng_context_copy_post_link(tr::now), [=] { HistoryView::CopyPostLink(session, itemId, HistoryView::Context::History); - }); + }, &st::menuIconLink); } if (isUponSelected > 1) { if (selectedState.count > 0 && selectedState.count == selectedState.canForwardCount) { _menu->addAction(tr::lng_context_forward_selected(tr::now), [=] { _widget->forwardSelected(); - }); + }, &st::menuIconForward); } if (selectedState.count > 0 && selectedState.count == selectedState.canDeleteCount) { _menu->addAction(tr::lng_context_delete_selected(tr::now), [=] { _widget->confirmDeleteSelected(); - }); + }, &st::menuIconDelete); } _menu->addAction(tr::lng_context_clear_selection(tr::now), [=] { _widget->clearSelected(); - }); + }, &st::menuIconSelect); } else if (item && ((isUponSelected != -2 && (canForward || canDelete)) || item->isRegular())) { if (isUponSelected != -2) { if (canForward) { _menu->addAction(tr::lng_context_forward_msg(tr::now), [=] { forwardAsGroup(itemId); - }); + }, &st::menuIconForward); } if (canDelete) { const auto callback = [=] { deleteAsGroup(itemId); }; if (item->isUploading()) { - _menu->addAction(tr::lng_context_cancel_upload(tr::now), callback); + _menu->addAction(tr::lng_context_cancel_upload(tr::now), callback, &st::menuIconCancel); } else { _menu->addAction(Ui::DeleteMessageContextAction( _menu->menu(), @@ -2055,14 +2060,14 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (!canBlockSender && canReport) { _menu->addAction(tr::lng_context_report_msg(tr::now), [=] { reportAsGroup(itemId); - }); + }, &st::menuIconReport); } } addSelectMessageAction(item); if (isUponSelected != -2 && canBlockSender) { _menu->addAction(tr::lng_profile_block_user(tr::now), [=] { blockSenderAsGroup(itemId); - }); + }, &st::menuIconBlock); } } else if (App::mousedItem()) { addSelectMessageAction(App::mousedItem()->data()); diff --git a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp index c674eb413..b2f690d1f 100644 --- a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp +++ b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp @@ -53,6 +53,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_session_settings.h" #include "apiwrap.h" #include "facades.h" +#include "styles/style_menu_icons.h" #include #include @@ -137,13 +138,14 @@ void AddPhotoActions( App::LambdaDelayed( st::defaultDropdownMenu.menu.ripple.hideDuration, &photo->session(), - [=] { SavePhotoToFile(photo); })); + [=] { SavePhotoToFile(photo); }), + &st::menuIconSaveImage); menu->addAction(tr::lng_context_copy_image(tr::now), [=] { const auto item = photo->owner().message(contextId); if (!list->showCopyRestriction(item)) { CopyImage(photo); } - }); + }, &st::menuIconCopy); } if (photo->hasAttachedStickers()) { const auto controller = list->controller(); @@ -153,7 +155,8 @@ void AddPhotoActions( }; menu->addAction( tr::lng_context_attached_stickers(tr::now), - std::move(callback)); + std::move(callback), + &st::menuIconStickers); } } @@ -218,7 +221,8 @@ void AddSaveDocumentAction( App::LambdaDelayed( st::defaultDropdownMenu.menu.ripple.hideDuration, &document->session(), - save)); + save), + &st::menuIconDownload); } void AddDocumentActions( @@ -229,7 +233,7 @@ void AddDocumentActions( if (document->loading()) { menu->addAction(tr::lng_context_cancel_download(tr::now), [=] { document->cancel(); - }); + }, &st::menuIconCancel); return; } const auto contextId = item ? item->fullId() : FullMsgId(); @@ -245,12 +249,12 @@ void AddDocumentActions( if (notAutoplayedGif) { menu->addAction(tr::lng_context_open_gif(tr::now), [=] { OpenGif(list->controller(), contextId); - }); + }, &st::menuIconShowInChat); } if (document->isGifv() && !list->hasCopyRestriction(item)) { menu->addAction(tr::lng_context_save_gif(tr::now), [=] { SaveGif(list->controller(), contextId); - }); + }, &st::menuIconGif); } } if (document->sticker() && document->sticker()->set) { @@ -258,19 +262,23 @@ void AddDocumentActions( (document->isStickerSetInstalled() ? tr::lng_context_pack_info(tr::now) : tr::lng_context_pack_add(tr::now)), - [=] { ShowStickerPackInfo(document, list); }); + [=] { ShowStickerPackInfo(document, list); }, + &st::menuIconStickers); + const auto isFaved = document->owner().stickers().isFaved(document); menu->addAction( - (document->owner().stickers().isFaved(document) + (isFaved ? tr::lng_faved_stickers_remove(tr::now) : tr::lng_faved_stickers_add(tr::now)), - [=] { ToggleFavedSticker(document, contextId); }); + [=] { ToggleFavedSticker(document, contextId); }, + isFaved ? &st::menuIconUnfave : &st::menuIconFave); } if (!document->filepath(true).isEmpty()) { menu->addAction( (Platform::IsMac() ? tr::lng_context_show_in_finder(tr::now) : tr::lng_context_show_in_folder(tr::now)), - [=] { ShowInFolder(document); }); + [=] { ShowInFolder(document); }, + &st::menuIconShowInFolder); } if (document->hasAttachedStickers()) { const auto controller = list->controller(); @@ -280,7 +288,8 @@ void AddDocumentActions( }; menu->addAction( tr::lng_context_attached_stickers(tr::now), - std::move(callback)); + std::move(callback), + &st::menuIconStickers); } AddSaveDocumentAction(menu, item, document, list); } @@ -306,7 +315,8 @@ void AddPostLinkAction( (item->history()->peer->isMegagroup() ? tr::lng_context_copy_message_link : tr::lng_context_copy_post_link)(tr::now), - [=] { CopyPostLink(session, itemId, context); }); + [=] { CopyPostLink(session, itemId, context); }, + &st::menuIconLink); } MessageIdsList ExtractIdsList(const SelectedItems &items) { @@ -339,7 +349,7 @@ bool AddForwardSelectedAction( request.navigation, ExtractIdsList(request.selectedItems), callback); - }); + }, &st::menuIconForward); return true; } @@ -371,7 +381,7 @@ bool AddForwardMessageAction( ? owner->itemOrItsGroup(item) : MessageIdsList{ 1, itemId })); } - }); + }, &st::menuIconForward); return true; } @@ -419,7 +429,7 @@ bool AddSendNowSelectedAction( history, ExtractIdsList(request.selectedItems), callback); - }); + }, &st::menuIconSend); return true; } @@ -452,7 +462,7 @@ bool AddSendNowMessageAction( ? owner->itemOrItsGroup(item) : MessageIdsList{ 1, itemId })); } - }); + }, &st::menuIconSend); return true; } @@ -543,7 +553,7 @@ bool AddRescheduleAction( box->closeBox(); } }, box->lifetime()); - }); + }, &st::menuIconSchedule); return true; } @@ -567,7 +577,7 @@ bool AddReplyToMessageAction( return; } list->replyToMessageRequestNotify(item->fullId()); - }); + }, &st::menuIconReply); return true; } @@ -598,7 +608,7 @@ bool AddViewRepliesAction( const auto history = item->history(); menu->addAction(phrase, crl::guard(controller, [=] { controller->showRepliesForMessage(history, rootId); - })); + }), &st::menuIconViewReplies); return true; } @@ -621,7 +631,7 @@ bool AddEditMessageAction( return; } list->editMessageRequestNotify(item->fullId()); - }); + }, &st::menuIconEdit); return true; } @@ -648,7 +658,7 @@ bool AddPinMessageAction( const auto controller = list->controller(); menu->addAction(isPinned ? tr::lng_context_unpin_msg(tr::now) : tr::lng_context_pin_msg(tr::now), crl::guard(controller, [=] { Window::ToggleMessagePinned(controller, pinItemId, !isPinned); - })); + }), isPinned ? &st::menuIconUnpin : &st::menuIconPin); return true; } @@ -671,7 +681,7 @@ bool AddGoToMessageAction( if (item) { goToMessageClickHandler(item)->onClick(ClickContext{}); } - })); + }), &st::menuIconShowInChat); return true; } @@ -703,7 +713,7 @@ bool AddDeleteSelectedAction( list->cancelSelection(); })); request.navigation->parentController()->show(std::move(box)); - }); + }, &st::menuIconDelete); return true; } @@ -752,7 +762,8 @@ bool AddDeleteMessageAction( if (item->isUploading()) { menu->addAction( tr::lng_context_cancel_upload(tr::now), - callback); + callback, + &st::menuIconCancel); return true; } menu->addAction(Ui::DeleteMessageContextAction( @@ -795,7 +806,10 @@ void AddReportAction( : MessageIdsList{ 1, itemId })); } }); - menu->addAction(tr::lng_context_report_msg(tr::now), callback); + menu->addAction( + tr::lng_context_report_msg(tr::now), + callback, + &st::menuIconReport); } bool AddClearSelectionAction( @@ -807,7 +821,7 @@ bool AddClearSelectionAction( } menu->addAction(tr::lng_context_clear_selection(tr::now), [=] { list->cancelSelection(); - }); + }, &st::menuIconSelect); return true; } @@ -835,7 +849,7 @@ bool AddSelectMessageAction( list->selectItem(item); } } - }); + }, &st::menuIconSelect); return true; } @@ -885,7 +899,8 @@ void AddCopyLinkAction( const auto text = link->copyToClipboardText(); menu->addAction( action, - [=] { QGuiApplication::clipboard()->setText(text); }); + [=] { QGuiApplication::clipboard()->setText(text); }, + &st::menuIconCopy); } } // namespace @@ -898,7 +913,9 @@ ContextMenuRequest::ContextMenuRequest( base::unique_qptr FillContextMenu( not_null list, const ContextMenuRequest &request) { - auto result = base::make_unique_q(list); + auto result = base::make_unique_q( + list, + st::popupMenuWithIcons); const auto link = request.link; const auto view = request.view; @@ -925,7 +942,7 @@ base::unique_qptr FillContextMenu( if (!list->showCopyRestrictionForSelected()) { TextUtilities::SetClipboardText(list->getSelectedText()); } - }); + }, &st::menuIconCopy); } AddTopMessageActions(result, request, list); @@ -958,7 +975,7 @@ base::unique_qptr FillContextMenu( TextUtilities::SetClipboardText(HistoryItemText(item)); } } - }); + }, &st::menuIconCopy); } } @@ -1034,12 +1051,12 @@ void AddPollActions( if (poll->voted() && !poll->quiz()) { menu->addAction(tr::lng_polls_retract(tr::now), [=] { poll->session().api().polls().sendVotes(itemId, {}); - }); + }, &st::menuIconRetractVote); } if (item->canStopPoll()) { menu->addAction(tr::lng_polls_stop(tr::now), [=] { StopPoll(&poll->session(), itemId); - }); + }, &st::menuIconStopPoll); } } diff --git a/Telegram/SourceFiles/history/view/history_view_schedule_box.cpp b/Telegram/SourceFiles/history/view/history_view_schedule_box.cpp index 593c292a5..9c510efda 100644 --- a/Telegram/SourceFiles/history/view/history_view_schedule_box.cpp +++ b/Telegram/SourceFiles/history/view/history_view_schedule_box.cpp @@ -24,6 +24,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_info.h" #include "styles/style_layers.h" #include "styles/style_chat.h" +#include "styles/style_menu_icons.h" #include @@ -35,10 +36,13 @@ void FillSendUntilOnlineMenu( Fn callback) { const auto menu = std::make_shared>(); button->setClickedCallback([=] { - *menu = base::make_unique_q(button); + *menu = base::make_unique_q( + button, + st::popupMenuWithIcons); (*menu)->addAction( tr::lng_scheduled_send_until_online(tr::now), - std::move(callback)); + std::move(callback), + &st::menuIconSend); (*menu)->popup(QCursor::pos()); return true; }); diff --git a/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp b/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp index bb3682e14..c108edd1b 100644 --- a/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp +++ b/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp @@ -56,6 +56,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_dialogs.h" #include "styles/style_chat.h" #include "styles/style_info.h" +#include "styles/style_menu_icons.h" namespace HistoryView { namespace { @@ -280,7 +281,7 @@ void TopBarWidget::showMenu() { if (!_activeChat.key || _menu) { return; } - _menu.create(parentWidget()); + _menu.create(parentWidget(), st::dropdownMenuWithIcons); _menu->setHiddenCallback([weak = Ui::MakeWeak(this), menu = _menu.data()]{ menu->deleteLater(); if (weak && weak->_menu == menu) { @@ -300,9 +301,10 @@ void TopBarWidget::showMenu() { })); _menuToggle->installEventFilter(_menu); const auto addAction = [&]( - const QString &text, - Fn callback) { - return _menu->addAction(text, std::move(callback)); + const QString &text, + Fn callback, + const style::icon *icon) { + return _menu->addAction(text, std::move(callback), icon); }; Window::FillDialogsEntryMenu( _controller, diff --git a/Telegram/SourceFiles/info/info_wrap_widget.cpp b/Telegram/SourceFiles/info/info_wrap_widget.cpp index a9f72b9c5..bcb40f632 100644 --- a/Telegram/SourceFiles/info/info_wrap_widget.cpp +++ b/Telegram/SourceFiles/info/info_wrap_widget.cpp @@ -37,6 +37,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "lang/lang_keys.h" #include "styles/style_info.h" #include "styles/style_profile.h" +#include "styles/style_menu_icons.h" namespace Info { namespace { @@ -529,7 +530,9 @@ void WrapWidget::showTopBarMenu() { Ui::InnerDropdown::HideOption::IgnoreShow); return; } - _topBarMenu = base::make_unique_q(this); + _topBarMenu = base::make_unique_q( + this, + st::dropdownMenuWithIcons); _topBarMenu->setHiddenCallback([this] { InvokeQueued(this, [this] { _topBarMenu = nullptr; }); @@ -551,8 +554,9 @@ void WrapWidget::showTopBarMenu() { const auto addAction = [=]( const QString &text, - Fn callback) { - return _topBarMenu->addAction(text, std::move(callback)); + Fn callback, + const style::icon *icon) { + return _topBarMenu->addAction(text, std::move(callback), icon); }; if (const auto peer = key().peer()) { Window::FillDialogsEntryMenu( diff --git a/Telegram/SourceFiles/info/media/info_media_list_widget.cpp b/Telegram/SourceFiles/info/media/info_media_list_widget.cpp index 8d5594f6a..4999f2ef9 100644 --- a/Telegram/SourceFiles/info/media/info_media_list_widget.cpp +++ b/Telegram/SourceFiles/info/media/info_media_list_widget.cpp @@ -36,8 +36,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_session.h" #include "mainwidget.h" #include "mainwindow.h" -#include "styles/style_overview.h" -#include "styles/style_info.h" #include "base/platform/base_platform_info.h" #include "base/weak_ptr.h" #include "media/player/media_player_instance.h" @@ -45,6 +43,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "boxes/peer_list_controllers.h" #include "core/file_utilities.h" #include "facades.h" +#include "styles/style_overview.h" +#include "styles/style_info.h" +#include "styles/style_menu_icons.h" #include #include @@ -1580,14 +1581,17 @@ void ListWidget::showContextMenu( const auto itemFullId = item->fullId(); const auto owner = &session().data(); - _contextMenu = base::make_unique_q(this); + _contextMenu = base::make_unique_q( + this, + st::popupMenuWithIcons); _contextMenu->addAction( tr::lng_context_to_msg(tr::now), [=] { if (const auto item = owner->message(itemFullId)) { _controller->parentController()->showPeerHistoryAtItem(item); } - }); + }, + &st::menuIconShowInChat); auto photoLink = dynamic_cast(link.get()); auto fileLink = dynamic_cast(link.get()); @@ -1612,7 +1616,8 @@ void ListWidget::showContextMenu( tr::lng_context_cancel_download(tr::now), [document] { document->cancel(); - }); + }, + &st::menuIconCancel); } else { auto filepath = document->filepath(true); if (!filepath.isEmpty()) { @@ -1626,7 +1631,8 @@ void ListWidget::showContextMenu( (Platform::IsMac() ? tr::lng_context_show_in_finder(tr::now) : tr::lng_context_show_in_folder(tr::now)), - std::move(handler)); + std::move(handler), + &st::menuIconShowInFolder); } auto handler = App::LambdaDelayed( st::defaultDropdownMenu.menu.ripple.hideDuration, @@ -1646,7 +1652,8 @@ void ListWidget::showContextMenu( : isAudio ? tr::lng_context_save_audio_file(tr::now) : tr::lng_context_save_file(tr::now)), - std::move(handler)); + std::move(handler), + &st::menuIconDownload); } } } @@ -1658,7 +1665,8 @@ void ListWidget::showContextMenu( actionText, [text = link->copyToClipboardText()] { QGuiApplication::clipboard()->setText(text); - }); + }, + &st::menuIconCopy); } } if (overSelected == SelectionState::OverSelectedItems) { @@ -1667,20 +1675,23 @@ void ListWidget::showContextMenu( tr::lng_context_forward_selected(tr::now), crl::guard(this, [this] { forwardSelected(); - })); + }), + &st::menuIconForward); } if (canDeleteAll()) { _contextMenu->addAction( tr::lng_context_delete_selected(tr::now), crl::guard(this, [this] { deleteSelected(); - })); + }), + &st::menuIconDelete); } _contextMenu->addAction( tr::lng_context_clear_selection(tr::now), crl::guard(this, [this] { clearSelected(); - })); + }), + &st::menuIconSelect); } else { if (overSelected != SelectionState::NotOverSelectedItems) { if (item->allowsForward()) { @@ -1688,7 +1699,8 @@ void ListWidget::showContextMenu( tr::lng_context_forward_msg(tr::now), crl::guard(this, [this, universalId] { forwardItem(universalId); - })); + }), + &st::menuIconForward); } if (item->canDelete()) { _contextMenu->addAction(Ui::DeleteMessageContextAction( @@ -1710,7 +1722,8 @@ void ListWidget::showContextMenu( update(); } applyItemSelection(universalId, FullSelection); - })); + }), + &st::menuIconSelect); } } diff --git a/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.cpp b/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.cpp index 54b4b8ad9..fe73c81dd 100644 --- a/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.cpp +++ b/Telegram/SourceFiles/inline_bots/inline_bot_layout_internal.cpp @@ -128,7 +128,7 @@ void Gif::setPosition(int32 position) { void DeleteSavedGifClickHandler::onClickImpl() const { ChatHelpers::AddGifAction( - [](QString, Fn &&done) { done(); }, + [](QString, Fn &&done, const style::icon*) { done(); }, _data); } diff --git a/Telegram/SourceFiles/inline_bots/inline_results_inner.cpp b/Telegram/SourceFiles/inline_bots/inline_results_inner.cpp index 2b23004af..c1e1e8ab8 100644 --- a/Telegram/SourceFiles/inline_bots/inline_results_inner.cpp +++ b/Telegram/SourceFiles/inline_bots/inline_results_inner.cpp @@ -29,6 +29,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/effects/path_shift_gradient.h" #include "history/view/history_view_cursor_state.h" #include "styles/style_chat_helpers.h" +#include "styles/style_menu_icons.h" #include @@ -296,7 +297,9 @@ void Inner::contextMenuEvent(QContextMenuEvent *e) { ? _sendMenuType() : SendMenu::Type::Disabled; - _menu = base::make_unique_q(this); + _menu = base::make_unique_q( + this, + st::popupMenuWithIcons); const auto send = [=, selected = _selected](Api::SendOptions options) { selectInlineResult(selected, options, false); @@ -309,8 +312,11 @@ void Inner::contextMenuEvent(QContextMenuEvent *e) { const auto item = _mosaic.itemAt(_selected); if (const auto previewDocument = item->getPreviewDocument()) { - auto callback = [&](const QString &text, Fn &&done) { - _menu->addAction(text, std::move(done)); + auto callback = [&]( + const QString &text, + Fn &&done, + const style::icon *icon) { + _menu->addAction(text, std::move(done), icon); }; ChatHelpers::AddGifAction(std::move(callback), previewDocument); } diff --git a/Telegram/SourceFiles/settings/settings_common.cpp b/Telegram/SourceFiles/settings/settings_common.cpp index 5bfa90bae..2d3ca3948 100644 --- a/Telegram/SourceFiles/settings/settings_common.cpp +++ b/Telegram/SourceFiles/settings/settings_common.cpp @@ -32,6 +32,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_domain.h" #include "styles/style_layers.h" #include "styles/style_settings.h" +#include "styles/style_menu_icons.h" namespace Settings { @@ -210,22 +211,25 @@ void FillMenu( if (type == Type::Chat) { addAction( tr::lng_settings_bg_theme_create(tr::now), - [=] { window->show(Box(Window::Theme::CreateBox, window)); }); + [=] { window->show(Box(Window::Theme::CreateBox, window)); }, + &st::menuIconChangeColors); } else { const auto &list = Core::App().domain().accounts(); if (list.size() < ::Main::Domain::kMaxAccounts) { addAction(tr::lng_menu_add_account(tr::now), [=] { Core::App().domain().addActivated(MTP::Environment{}); - }); + }, &st::menuIconAddAccount); } if (!controller->session().supportMode()) { addAction( tr::lng_settings_information(tr::now), - [=] { showOther(Type::Information); }); + [=] { showOther(Type::Information); }, + &st::menuIconInfo); } addAction( tr::lng_settings_logout(tr::now), - [=] { window->showLogoutConfirmation(); }); + [=] { window->showLogoutConfirmation(); }, + &st::menuIconLeave); } } diff --git a/Telegram/SourceFiles/settings/settings_common.h b/Telegram/SourceFiles/settings/settings_common.h index 1f34036f3..a6862bac7 100644 --- a/Telegram/SourceFiles/settings/settings_common.h +++ b/Telegram/SourceFiles/settings/settings_common.h @@ -108,7 +108,8 @@ not_null AddSubsectionTitle( using MenuCallback = Fn handler)>; + Fn handler, + const style::icon *icon)>; void FillMenu( not_null controller, diff --git a/Telegram/SourceFiles/ui/chat/chat.style b/Telegram/SourceFiles/ui/chat/chat.style index 7d688e711..320acaaec 100644 --- a/Telegram/SourceFiles/ui/chat/chat.style +++ b/Telegram/SourceFiles/ui/chat/chat.style @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL using "ui/basic.style"; using "dialogs/dialogs.style"; using "ui/widgets/widgets.style"; +using "ui/menu_icons.style"; MessageBar { title: TextStyle; @@ -904,13 +905,13 @@ defaultWhoRead: WhoRead { photoSize: 30px; photoSkip: 5px; nameLeft: 57px; - iconPosition: point(14px, 9px); - itemPadding: margins(38px, 8px, 17px, 6px); + iconPosition: point(22px, 11px); + itemPadding: margins(61px, 9px, 17px, 7px); } -whoReadMenu: PopupMenu(defaultPopupMenu) { +whoReadMenu: PopupMenu(popupMenuWithIcons) { scrollPadding: margins(0px, 6px, 0px, 6px); maxHeight: 387px; - menu: Menu(defaultMenu) { + menu: Menu(menuWithIcons) { separatorPadding: margins(0px, 6px, 0px, 8px); } } diff --git a/Telegram/SourceFiles/ui/controls/delete_message_context_action.cpp b/Telegram/SourceFiles/ui/controls/delete_message_context_action.cpp index 31c0b6bd2..aae37a921 100644 --- a/Telegram/SourceFiles/ui/controls/delete_message_context_action.cpp +++ b/Telegram/SourceFiles/ui/controls/delete_message_context_action.cpp @@ -14,6 +14,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/unixtime.h" #include "base/timer.h" #include "styles/style_chat.h" +#include "styles/style_menu_icons.h" namespace Ui { namespace { @@ -104,6 +105,9 @@ void ActionWithTimer::paint(Painter &p) { if (isEnabled()) { paintRipple(p, 0, 0); } + + st::menuIconDelete.paint(p, _st.itemIconPosition, width()); + p.setPen(selected ? _st.itemFgOver : _st.itemFg); _text.drawLeftElided( p, @@ -239,8 +243,8 @@ base::unique_qptr DeleteMessageContextAction( menu, tr::lng_context_delete_msg(tr::now), std::move(callback)), - nullptr, - nullptr); + &st::menuIconDelete, + &st::menuIconDelete); } return base::make_unique_q( menu, diff --git a/Telegram/SourceFiles/ui/menu_icons.style b/Telegram/SourceFiles/ui/menu_icons.style new file mode 100644 index 000000000..6e34d9617 --- /dev/null +++ b/Telegram/SourceFiles/ui/menu_icons.style @@ -0,0 +1,81 @@ +/* +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 +*/ +using "ui/colors.palette"; +using "ui/widgets/widgets.style"; + +menuWithIcons: Menu(defaultMenu) { + itemIconPosition: point(20px, 7px); + itemPadding: margins(61px, 9px, 17px, 9px); +} +popupMenuWithIcons: PopupMenu(defaultPopupMenu) { + scrollPadding: margins(0px, 5px, 0px, 5px); + menu: menuWithIcons; +} +dropdownMenuWithIcons: DropdownMenu(defaultDropdownMenu) { + wrap: InnerDropdown(defaultInnerDropdown) { + scrollPadding: margins(0px, 5px, 0px, 5px); + } + menu: menuWithIcons; +} + +menuIconReactions: icon {{ "menu/read_reactions", menuSubmenuArrowFg }}; +menuIconReply: icon {{ "menu/reply", menuSubmenuArrowFg }}; +menuIconViewReplies: icon {{ "menu/view_replies", menuSubmenuArrowFg }}; +menuIconEdit: icon {{ "menu/edit", menuSubmenuArrowFg }}; +menuIconPin: icon {{ "menu/pin", menuSubmenuArrowFg }}; +menuIconUnpin: icon {{ "menu/unpin", menuSubmenuArrowFg }}; +menuIconCopy: icon {{ "menu/copy", menuSubmenuArrowFg }}; +menuIconForward: icon {{ "menu/forward", menuSubmenuArrowFg }}; +menuIconDelete: icon {{ "menu/delete", menuSubmenuArrowFg }}; +menuIconSelect: icon {{ "menu/select", menuSubmenuArrowFg }}; +menuIconSaveImage: icon {{ "menu/save_image", menuSubmenuArrowFg }}; +menuIconStickers: icon {{ "menu/stickers", menuSubmenuArrowFg }}; +menuIconCancel: icon {{ "menu/cancel", menuSubmenuArrowFg }}; +menuIconShowInChat: icon {{ "menu/show_in_chat", menuSubmenuArrowFg }}; +menuIconGif: icon {{ "menu/gif", menuSubmenuArrowFg }}; +menuIconShowInFolder: icon {{ "menu/show_in_folder", menuSubmenuArrowFg }}; +menuIconDownload: icon {{ "menu/download", menuSubmenuArrowFg }}; +menuIconLink: icon {{ "menu/link", menuSubmenuArrowFg }}; +menuIconBlock: icon {{ "menu/block", menuSubmenuArrowFg }}; +menuIconUnblock: icon {{ "menu/unblock", menuSubmenuArrowFg }}; +menuIconRestartBot: icon {{ "menu/restart_bot", menuSubmenuArrowFg }}; +menuIconReport: icon {{ "menu/report", menuSubmenuArrowFg }}; +menuIconFave: icon {{ "menu/favorite", menuSubmenuArrowFg }}; +menuIconUnfave: icon {{ "menu/unfavorite", menuSubmenuArrowFg }}; +menuIconProfile: icon {{ "menu/profile", menuSubmenuArrowFg }}; +menuIconInfo: icon {{ "menu/info", menuSubmenuArrowFg }}; +menuIconInvite: icon {{ "menu/invite", menuSubmenuArrowFg }}; +menuIconPromote: icon {{ "menu/admin_promote", menuSubmenuArrowFg }}; +menuIconAdmin: icon {{ "menu/admin", menuSubmenuArrowFg }}; +menuIconRemove: icon {{ "menu/stop_poll", menuSubmenuArrowFg }}; +menuIconStopPoll: icon {{ "menu/stop_poll", menuSubmenuArrowFg }}; +menuIconRetractVote: icon {{ "menu/retract_vote", menuSubmenuArrowFg }}; +menuIconRestrict: icon {{ "menu/permissions", menuSubmenuArrowFg }}; +menuIconShare: icon {{ "menu/share", menuSubmenuArrowFg }}; +menuIconArchive: icon {{ "menu/archive", menuSubmenuArrowFg }}; +menuIconUnarchive: icon {{ "menu/unarchive", menuSubmenuArrowFg }}; +menuIconMarkRead: icon {{ "menu/read", menuSubmenuArrowFg }}; +menuIconMarkUnread: icon {{ "menu/unread", menuSubmenuArrowFg }}; +menuIconChangeColors: icon {{ "menu/colors", menuSubmenuArrowFg }}; +menuIconExport: icon {{ "menu/export", menuSubmenuArrowFg }}; +menuIconClear: icon {{ "menu/clear", menuSubmenuArrowFg }}; +menuIconManage: icon {{ "menu/manage", menuSubmenuArrowFg }}; +menuIconDiscussion: icon {{ "menu/discussion", menuSubmenuArrowFg }}; +menuIconLeave: icon {{ "menu/leave", menuSubmenuArrowFg }}; +menuIconCreatePoll: icon {{ "menu/create_poll", menuSubmenuArrowFg }}; +menuIconQrCode: icon {{ "menu/qr_code", menuSubmenuArrowFg }}; +menuIconExpand: icon {{ "menu/expand", menuSubmenuArrowFg }}; +menuIconCollapse: icon {{ "menu/collapse", menuSubmenuArrowFg }}; +menuIconToMainMenu: icon {{ "menu/move_to_menu", menuSubmenuArrowFg }}; +menuIconFromMainMenu: icon {{ "menu/move_from_menu", menuSubmenuArrowFg }}; +menuIconAddAccount: icon {{ "menu/add_account", menuSubmenuArrowFg }}; +menuIconMute: icon {{ "menu/mute", menuSubmenuArrowFg }}; +menuIconUnmute: icon {{ "menu/unmute", menuSubmenuArrowFg }}; +menuIconSchedule: icon {{ "menu/reschedule", menuSubmenuArrowFg }}; +menuIconSend: icon {{ "menu/send", menuSubmenuArrowFg }}; +//menuIcon: icon {{ "menu/", menuSubmenuArrowFg }}; diff --git a/Telegram/SourceFiles/window/themes/window_themes_cloud_list.cpp b/Telegram/SourceFiles/window/themes/window_themes_cloud_list.cpp index fc89a4d64..dd2cb14e6 100644 --- a/Telegram/SourceFiles/window/themes/window_themes_cloud_list.cpp +++ b/Telegram/SourceFiles/window/themes/window_themes_cloud_list.cpp @@ -29,6 +29,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_settings.h" #include "styles/style_boxes.h" #include "styles/style_chat.h" +#include "styles/style_menu_icons.h" #include #include @@ -583,21 +584,23 @@ void CloudList::showMenu(Element &element) { _contextMenu = nullptr; return; } - _contextMenu = base::make_unique_q(element.button.get()); + _contextMenu = base::make_unique_q( + element.button.get(), + st::popupMenuWithIcons); const auto cloud = element.theme; if (const auto slug = element.theme.slug; !slug.isEmpty()) { _contextMenu->addAction(tr::lng_theme_share(tr::now), [=] { QGuiApplication::clipboard()->setText( _window->session().createInternalLinkFull("addtheme/" + slug)); Ui::Toast::Show(tr::lng_background_link_copied(tr::now)); - }); + }, &st::menuIconShare); } if (cloud.documentId && cloud.createdBy == _window->session().userId() && Background()->themeObject().cloud.id == cloud.id) { _contextMenu->addAction(tr::lng_theme_edit(tr::now), [=] { StartEditor(&_window->window(), cloud); - }); + }, &st::menuIconChangeColors); } const auto id = cloud.id; _contextMenu->addAction(tr::lng_theme_delete(tr::now), [=] { @@ -621,7 +624,7 @@ void CloudList::showMenu(Element &element) { tr::lng_theme_delete_sure(tr::now), tr::lng_theme_delete(tr::now), remove)); - }); + }, &st::menuIconDelete); _contextMenu->popup(QCursor::pos()); } diff --git a/Telegram/SourceFiles/window/window_filters_menu.cpp b/Telegram/SourceFiles/window/window_filters_menu.cpp index d097a8d5d..044268dfc 100644 --- a/Telegram/SourceFiles/window/window_filters_menu.cpp +++ b/Telegram/SourceFiles/window/window_filters_menu.cpp @@ -27,6 +27,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "apiwrap.h" #include "styles/style_widgets.h" #include "styles/style_window.h" +#include "styles/style_menu_icons.h" namespace Window { namespace { @@ -307,16 +308,23 @@ void FiltersMenu::showMenu(QPoint position, FilterId id) { if (i == end(_filters)) { return; } - _popupMenu = base::make_unique_q(i->second.get()); - const auto addAction = [&](const QString &text, Fn callback) { + _popupMenu = base::make_unique_q( + i->second.get(), + st::popupMenuWithIcons); + const auto addAction = [&]( + const QString &text, + Fn callback, + const style::icon *icon) { return _popupMenu->addAction( text, - crl::guard(&_outer, std::move(callback))); + crl::guard(&_outer, std::move(callback)), + icon); }; addAction( tr::lng_filters_context_edit(tr::now), - [=] { showEditBox(id); }); + [=] { showEditBox(id); }, + &st::menuIconEdit); auto filteredChats = [=] { return _session->session().data().chatsFilters().chatsList(id); @@ -327,7 +335,8 @@ void FiltersMenu::showMenu(QPoint position, FilterId id) { addAction( tr::lng_filters_context_remove(tr::now), - [=] { showRemoveBox(id); }); + [=] { showRemoveBox(id); }, + &st::menuIconDelete); _popupMenu->popup(position); } diff --git a/Telegram/SourceFiles/window/window_main_menu.cpp b/Telegram/SourceFiles/window/window_main_menu.cpp index c56cd1bfd..16c6d4356 100644 --- a/Telegram/SourceFiles/window/window_main_menu.cpp +++ b/Telegram/SourceFiles/window/window_main_menu.cpp @@ -60,6 +60,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_boxes.h" #include "styles/style_info.h" // infoTopBarMenu #include "styles/style_layers.h" +#include "styles/style_menu_icons.h" #include #include @@ -316,11 +317,17 @@ void MainMenu::AccountButton::paintEvent(QPaintEvent *e) { void MainMenu::AccountButton::contextMenuEvent(QContextMenuEvent *e) { if (!_menu && IsAltShift(e->modifiers())) { - _menu = base::make_unique_q(this); - const auto addAction = [&](const QString &text, Fn callback) { + _menu = base::make_unique_q( + this, + st::popupMenuWithIcons); + const auto addAction = [&]( + const QString &text, + Fn callback, + const style::icon *icon) { return _menu->addAction( text, - crl::guard(this, std::move(callback))); + crl::guard(this, std::move(callback)), + icon); }; MenuAddMarkAsReadAllChatsAction(&_session->data(), addAction); _menu->popup(QCursor::pos()); @@ -329,10 +336,12 @@ void MainMenu::AccountButton::contextMenuEvent(QContextMenuEvent *e) { if (&_session->account() == &Core::App().activeAccount() || _menu) { return; } - _menu = base::make_unique_q(this); + _menu = base::make_unique_q( + this, + st::popupMenuWithIcons); _menu->addAction(tr::lng_menu_activate(tr::now), crl::guard(this, [=] { Core::App().domain().activate(&_session->account()); - })); + }), &st::menuIconProfile); _menu->addAction(tr::lng_settings_logout(tr::now), crl::guard(this, [=] { const auto session = _session; const auto callback = [=](Fn &&close) { @@ -344,7 +353,7 @@ void MainMenu::AccountButton::contextMenuEvent(QContextMenuEvent *e) { tr::lng_settings_logout(tr::now), st::attentionBoxButton, crl::guard(session, callback))); - })); + }), &st::menuIconLeave); _menu->popup(QCursor::pos()); } @@ -684,9 +693,17 @@ void MainMenu::setupArchiveButton() { } else if (which != Qt::RightButton) { return; } - _contextMenu = base::make_unique_q(this); - const auto addAction = [&](const QString &text, Fn callback) { - return _contextMenu->addAction(text, std::move(callback)); + _contextMenu = base::make_unique_q( + this, + st::popupMenuWithIcons); + const auto addAction = [&]( + const QString &text, + Fn callback, + const style::icon *icon) { + return _contextMenu->addAction( + text, + std::move(callback), + icon); }; const auto hide = [=] { @@ -694,7 +711,10 @@ void MainMenu::setupArchiveButton() { controller->session().saveSettingsDelayed(); Ui::hideSettingsAndLayer(); }; - addAction(tr::lng_context_archive_to_list(tr::now), std::move(hide)); + addAction( + tr::lng_context_archive_to_list(tr::now), + std::move(hide), + &st::menuIconFromMainMenu); MenuAddMarkAsReadChatListAction( [f = folder()] { return f->chatsList(); }, diff --git a/Telegram/SourceFiles/window/window_peer_menu.cpp b/Telegram/SourceFiles/window/window_peer_menu.cpp index 559af5834..6543a214c 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.cpp +++ b/Telegram/SourceFiles/window/window_peer_menu.cpp @@ -64,6 +64,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_layers.h" #include "styles/style_boxes.h" #include "styles/style_window.h" // st::windowMinWidth +#include "styles/style_menu_icons.h" #include @@ -324,7 +325,7 @@ void Filler::addHidePromotion() { history->session().api().request(MTPhelp_HidePromoData( history->peer->input )).send(); - }); + }, &st::menuIconRemove); } void Filler::addTogglePin() { @@ -340,7 +341,12 @@ void Filler::addTogglePin() { const auto pinToggle = [=] { TogglePinnedDialog(controller, history, filterId); }; - const auto pinAction = _addAction(pinText(), pinToggle); + const auto pinAction = _addAction( + pinText(), + pinToggle, + (history->isPinnedDialog(filterId) + ? &st::menuIconUnpin + : &st::menuIconPin)); // #TODO icons dynamic auto actionText = history->session().changes().historyUpdates( history, @@ -359,7 +365,7 @@ void Filler::addInfo() { : tr::lng_context_view_channel(tr::now)); _addAction(text, [=] { controller->showPeerInfo(peer); - }); + }, peer->isUser() ? &st::menuIconProfile : &st::menuIconInfo); } //void Filler::addSearch() { @@ -367,7 +373,7 @@ void Filler::addInfo() { // const auto peer = _peer; // _addAction(tr::lng_profile_search_messages(tr::now), [=] { // controller->content()->searchInChat(peer->owner().history(peer)); -// }); +// }, &st::menuIconSearch); //} void Filler::addToggleUnreadMark() { @@ -387,7 +393,9 @@ void Filler::addToggleUnreadMark() { history, !markAsRead); } - }); + }, (IsUnreadHistory(history) + ? &st::menuIconMarkRead + : &st::menuIconMarkUnread)); // #TODO icons dynamic auto actionText = history->session().changes().historyUpdates( history, @@ -410,7 +418,10 @@ void Filler::addToggleArchive() { const auto toggle = [=] { ToggleHistoryArchived(history, !isArchived()); }; - const auto archiveAction = _addAction(label(), toggle); + const auto archiveAction = _addAction( + label(), + toggle, // #TODO icons dynamic + isArchived() ? &st::menuIconUnarchive : &st::menuIconArchive); auto actionText = history->session().changes().historyUpdates( history, @@ -442,8 +453,12 @@ void Filler::addBlockUser(not_null user) { user, v::null, v::null)); - } - }); + } // #TODO icons dynamic + }, (!user->isBlocked() + ? &st::menuIconBlock + : user->isBot() + ? &st::menuIconRestartBot + : &st::menuIconUnblock)); auto actionText = _peer->session().changes().peerUpdates( _peer, @@ -463,25 +478,29 @@ void Filler::addUserActions(not_null user) { if (user->session().supportMode()) { _addAction("Edit support info", [=] { user->session().supportHelper().editInfo(controller, user); - }); + }, &st::menuIconEdit); } if (!user->isContact() && !user->isSelf() && !user->isBot()) { _addAction( tr::lng_info_add_as_contact(tr::now), - [=] { window->show(Box(EditContactBox, controller, user)); }); + [=] { window->show(Box(EditContactBox, controller, user)); }, + &st::menuIconInvite); } if (user->canShareThisContact()) { _addAction( tr::lng_info_share_contact(tr::now), - [=] { PeerMenuShareContactBox(controller, user); }); + [=] { PeerMenuShareContactBox(controller, user); }, + &st::menuIconShare); } if (user->isContact() && !user->isSelf()) { _addAction( tr::lng_info_edit_contact(tr::now), - [=] { window->show(Box(EditContactBox, controller, user)); }); + [=] { window->show(Box(EditContactBox, controller, user)); }, + &st::menuIconEdit); _addAction( tr::lng_info_delete_contact(tr::now), - [=] { PeerMenuDeleteContact(user); }); + [=] { PeerMenuDeleteContact(user); }, + &st::menuIconRemove); } if (user->isBot() && !user->isRepliesChat() @@ -489,26 +508,31 @@ void Filler::addUserActions(not_null user) { using AddBotToGroup = AddBotToGroupBoxController; _addAction( tr::lng_profile_invite_to_group(tr::now), - [=] { AddBotToGroup::Start(user); }); + [=] { AddBotToGroup::Start(user); }, + &st::menuIconInvite); } addPollAction(user); if (!user->isBot() && _request.section == Section::History) { _addAction( tr::lng_chat_theme_change(tr::now), - [=] { controller->toggleChooseChatTheme(user); }); + [=] { controller->toggleChooseChatTheme(user); }, + &st::menuIconChangeColors); } if (user->canExportChatHistory()) { _addAction( tr::lng_profile_export_chat(tr::now), - [=] { PeerMenuExportChat(user); }); + [=] { PeerMenuExportChat(user); }, + &st::menuIconExport); } } _addAction( tr::lng_profile_delete_conversation(tr::now), - DeleteAndLeaveHandler(user)); + DeleteAndLeaveHandler(user), + &st::menuIconDelete); _addAction( tr::lng_profile_clear_history(tr::now), - ClearHistoryHandler(user)); + ClearHistoryHandler(user), + &st::menuIconClear); if (!user->isInaccessible() && user != user->session().user() && !user->isRepliesChat() @@ -524,31 +548,35 @@ void Filler::addChatActions(not_null chat) { const auto text = tr::lng_manage_group_title(tr::now); _addAction(text, [=] { navigation->showEditPeerBox(chat); - }); + }, &st::menuIconManage); } if (chat->canAddMembers()) { _addAction( tr::lng_channel_add_members(tr::now), - [=] { AddChatMembers(navigation, chat); }); + [=] { AddChatMembers(navigation, chat); }, + &st::menuIconInvite); } addPollAction(chat); if (chat->canExportChatHistory()) { _addAction( tr::lng_profile_export_chat(tr::now), - [=] { PeerMenuExportChat(chat); }); + [=] { PeerMenuExportChat(chat); }, + &st::menuIconExport); } } _addAction( tr::lng_profile_clear_and_exit(tr::now), - DeleteAndLeaveHandler(_peer)); + DeleteAndLeaveHandler(_peer), + &st::menuIconDelete); _addAction( tr::lng_profile_clear_history(tr::now), - ClearHistoryHandler(_peer)); + ClearHistoryHandler(_peer), + &st::menuIconClear); if (_request.section != Section::ChatsList) { if (!chat->amCreator()) { _addAction(tr::lng_profile_report(tr::now), [=] { HistoryView::ShowReportPeerBox(navigation, chat); - }); + }, &st::menuIconReport); } } } @@ -568,7 +596,7 @@ void Filler::addChannelActions(not_null channel) { navigation->showPeerHistory( chat, Window::SectionShow::Way::Forward); - }); + }, &st::menuIconDiscussion); } } if (EditPeerInfoBox::Available(channel)) { @@ -577,14 +605,15 @@ void Filler::addChannelActions(not_null channel) { : tr::lng_manage_channel_title(tr::now); _addAction(text, [=] { navigation->showEditPeerBox(channel); - }); + }, &st::menuIconManage); } if (channel->canAddMembers()) { _addAction( (channel->isMegagroup() ? tr::lng_channel_add_members(tr::now) : tr::lng_channel_add_users(tr::now)), - [=] { PeerMenuAddChannelMembers(navigation, channel); }); + [=] { PeerMenuAddChannelMembers(navigation, channel); }, + &st::menuIconInvite); } addPollAction(channel); if (channel->canExportChatHistory()) { @@ -592,19 +621,24 @@ void Filler::addChannelActions(not_null channel) { (isGroup ? tr::lng_profile_export_chat(tr::now) : tr::lng_profile_export_channel(tr::now)), - [=] { PeerMenuExportChat(channel); }); + [=] { PeerMenuExportChat(channel); }, + &st::menuIconExport); } } if (channel->amIn()) { auto text = isGroup ? tr::lng_profile_leave_group(tr::now) : tr::lng_profile_leave_channel(tr::now); - _addAction(text, DeleteAndLeaveHandler(channel)); + _addAction( + text, + DeleteAndLeaveHandler(channel), + &st::menuIconLeave); if ((isGroup && !channel->isPublic()) || channel->canDeleteMessages()) { _addAction( tr::lng_profile_clear_history(tr::now), - ClearHistoryHandler(channel)); + ClearHistoryHandler(channel), + &st::menuIconClear); } } else { auto text = isGroup @@ -612,13 +646,14 @@ void Filler::addChannelActions(not_null channel) { : tr::lng_profile_join_channel(tr::now); _addAction( text, - [=] { channel->session().api().joinChannel(channel); }); + [=] { channel->session().api().joinChannel(channel); }, + &st::menuIconInvite); // #TODO icons } if (_request.section != Section::ChatsList) { if (!channel->amCreator()) { _addAction(tr::lng_profile_report(tr::now), [=] { HistoryView::ShowReportPeerBox(navigation, channel); - }); + }, &st::menuIconReport); } } } @@ -650,7 +685,10 @@ void Filler::addPollAction(not_null peer) { source, sendMenuType); }; - _addAction(tr::lng_polls_create(tr::now), std::move(callback)); + _addAction( + tr::lng_polls_create(tr::now), + std::move(callback), + &st::menuIconCreatePoll); } void Filler::fill() { @@ -705,7 +743,7 @@ void Filler::addTogglesForArchive() { _addAction(text, [=] { controller->session().settings().setArchiveCollapsed(!hidden); controller->session().saveSettingsDelayed(); - }); + }, hidden ? &st::menuIconExpand : &st::menuIconCollapse); _addAction(tr::lng_context_archive_to_menu(tr::now), [=] { Ui::Toast::Show(Ui::Toast::Config{ @@ -718,7 +756,7 @@ void Filler::addTogglesForArchive() { controller->session().settings().setArchiveInMainMenu( !controller->session().settings().archiveInMainMenu()); controller->session().saveSettingsDelayed(); - }); + }, &st::menuIconToMainMenu); MenuAddMarkAsReadChatListAction( [folder = _folder] { return folder->chatsList(); }, @@ -1215,7 +1253,9 @@ void PeerMenuAddMuteAction( } else { peer->owner().updateNotifySettings(peer, 0); } - }); + }, (peer->owner().notifyIsMuted(peer) + ? &st::menuIconUnmute + : &st::menuIconMute)); // #TODO icons dynamic auto actionText = Info::Profile::NotificationsEnabledValue( peer @@ -1241,7 +1281,8 @@ void MenuAddMarkAsReadAllChatsAction( }; addAction( tr::lng_context_mark_read_all(tr::now), - std::move(callback)); + std::move(callback), + &st::menuIconMarkRead); } void MenuAddMarkAsReadChatListAction( @@ -1267,7 +1308,8 @@ void MenuAddMarkAsReadChatListAction( }; addAction( tr::lng_context_mark_read(tr::now), - std::move(callback)); + std::move(callback), + &st::menuIconMarkRead); } void ToggleHistoryArchived(not_null history, bool archived) { diff --git a/Telegram/SourceFiles/window/window_peer_menu.h b/Telegram/SourceFiles/window/window_peer_menu.h index b0412fb5e..399fe64e2 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.h +++ b/Telegram/SourceFiles/window/window_peer_menu.h @@ -37,7 +37,8 @@ class SessionNavigation; using PeerMenuCallback = Fn handler)>; + Fn handler, + const style::icon *icon)>; void FillDialogsEntryMenu( not_null controller, diff --git a/Telegram/cmake/td_ui.cmake b/Telegram/cmake/td_ui.cmake index 20d23d0d7..4f04ca58b 100644 --- a/Telegram/cmake/td_ui.cmake +++ b/Telegram/cmake/td_ui.cmake @@ -14,6 +14,7 @@ include(cmake/generate_numbers.cmake) set(style_files ui/td_common.style ui/filter_icons.style + ui/menu_icons.style ui/chat/chat.style boxes/boxes.style dialogs/dialogs.style From b773bb6e702efa0865a29a135e18ba1fc23f5511 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 10 Dec 2021 16:10:14 +0400 Subject: [PATCH 060/173] Add icons to the media viewer menus. --- Telegram/Resources/icons/chat/seen_checks.png | Bin 551 -> 0 bytes .../Resources/icons/chat/seen_checks@2x.png | Bin 848 -> 0 bytes .../Resources/icons/chat/seen_checks@3x.png | Bin 1477 -> 0 bytes Telegram/Resources/icons/chat/seen_played.png | Bin 421 -> 0 bytes .../Resources/icons/chat/seen_played@2x.png | Bin 718 -> 0 bytes .../Resources/icons/chat/seen_played@3x.png | Bin 1182 -> 0 bytes Telegram/Resources/icons/menu/add_account.png | Bin 852 -> 815 bytes .../Resources/icons/menu/add_account@2x.png | Bin 1582 -> 1543 bytes .../Resources/icons/menu/add_account@3x.png | Bin 2374 -> 2243 bytes Telegram/Resources/icons/menu/admin.png | Bin 897 -> 853 bytes Telegram/Resources/icons/menu/admin@2x.png | Bin 1773 -> 1678 bytes Telegram/Resources/icons/menu/admin@3x.png | Bin 2610 -> 2459 bytes .../Resources/icons/menu/admin_promote.png | Bin 847 -> 793 bytes .../Resources/icons/menu/admin_promote@2x.png | Bin 1646 -> 1546 bytes .../Resources/icons/menu/admin_promote@3x.png | Bin 2457 -> 2257 bytes Telegram/Resources/icons/menu/all_media.png | Bin 542 -> 536 bytes .../Resources/icons/menu/all_media@2x.png | Bin 802 -> 914 bytes .../Resources/icons/menu/all_media@3x.png | Bin 1191 -> 1211 bytes Telegram/Resources/icons/menu/archive.png | Bin 591 -> 570 bytes Telegram/Resources/icons/menu/archive@2x.png | Bin 926 -> 942 bytes Telegram/Resources/icons/menu/archive@3x.png | Bin 1395 -> 1301 bytes Telegram/Resources/icons/menu/block.png | Bin 757 -> 717 bytes Telegram/Resources/icons/menu/block@2x.png | Bin 1416 -> 1391 bytes Telegram/Resources/icons/menu/block@3x.png | Bin 2200 -> 2002 bytes Telegram/Resources/icons/menu/calendar.png | Bin 495 -> 480 bytes Telegram/Resources/icons/menu/calendar@2x.png | Bin 726 -> 773 bytes Telegram/Resources/icons/menu/calendar@3x.png | Bin 925 -> 1055 bytes Telegram/Resources/icons/menu/cancel.png | Bin 467 -> 476 bytes Telegram/Resources/icons/menu/cancel@2x.png | Bin 1025 -> 912 bytes Telegram/Resources/icons/menu/cancel@3x.png | Bin 1558 -> 1232 bytes Telegram/Resources/icons/menu/clear.png | Bin 603 -> 578 bytes Telegram/Resources/icons/menu/clear@2x.png | Bin 1122 -> 1053 bytes Telegram/Resources/icons/menu/clear@3x.png | Bin 1645 -> 1527 bytes Telegram/Resources/icons/menu/collapse.png | Bin 450 -> 413 bytes Telegram/Resources/icons/menu/collapse@2x.png | Bin 614 -> 630 bytes Telegram/Resources/icons/menu/collapse@3x.png | Bin 749 -> 835 bytes Telegram/Resources/icons/menu/colors.png | Bin 837 -> 773 bytes Telegram/Resources/icons/menu/colors@2x.png | Bin 1593 -> 1469 bytes Telegram/Resources/icons/menu/colors@3x.png | Bin 2388 -> 2185 bytes Telegram/Resources/icons/menu/copy.png | Bin 463 -> 489 bytes Telegram/Resources/icons/menu/copy@2x.png | Bin 657 -> 775 bytes Telegram/Resources/icons/menu/copy@3x.png | Bin 1025 -> 1074 bytes Telegram/Resources/icons/menu/create_poll.png | Bin 390 -> 514 bytes .../Resources/icons/menu/create_poll@2x.png | Bin 630 -> 797 bytes .../Resources/icons/menu/create_poll@3x.png | Bin 875 -> 1074 bytes Telegram/Resources/icons/menu/delete.png | Bin 470 -> 498 bytes Telegram/Resources/icons/menu/delete@2x.png | Bin 837 -> 823 bytes Telegram/Resources/icons/menu/delete@3x.png | Bin 1229 -> 1205 bytes Telegram/Resources/icons/menu/discussion.png | Bin 774 -> 742 bytes .../Resources/icons/menu/discussion@2x.png | Bin 1379 -> 1461 bytes .../Resources/icons/menu/discussion@3x.png | Bin 2148 -> 1985 bytes Telegram/Resources/icons/menu/download.png | Bin 394 -> 365 bytes Telegram/Resources/icons/menu/download@2x.png | Bin 660 -> 636 bytes Telegram/Resources/icons/menu/download@3x.png | Bin 893 -> 877 bytes Telegram/Resources/icons/menu/edit.png | Bin 440 -> 441 bytes Telegram/Resources/icons/menu/edit@2x.png | Bin 743 -> 700 bytes Telegram/Resources/icons/menu/edit@3x.png | Bin 951 -> 883 bytes Telegram/Resources/icons/menu/expand.png | Bin 450 -> 416 bytes Telegram/Resources/icons/menu/expand@2x.png | Bin 628 -> 589 bytes Telegram/Resources/icons/menu/expand@3x.png | Bin 763 -> 833 bytes Telegram/Resources/icons/menu/export.png | Bin 488 -> 483 bytes Telegram/Resources/icons/menu/export@2x.png | Bin 776 -> 819 bytes Telegram/Resources/icons/menu/export@3x.png | Bin 1078 -> 1069 bytes .../Resources/icons/menu/export_theme.png | Bin 0 -> 455 bytes .../Resources/icons/menu/export_theme@2x.png | Bin 0 -> 709 bytes .../Resources/icons/menu/export_theme@3x.png | Bin 0 -> 1046 bytes Telegram/Resources/icons/menu/favorite.png | Bin 668 -> 620 bytes Telegram/Resources/icons/menu/favorite@2x.png | Bin 1255 -> 1202 bytes Telegram/Resources/icons/menu/favorite@3x.png | Bin 1975 -> 1796 bytes Telegram/Resources/icons/menu/flip.png | Bin 0 -> 514 bytes Telegram/Resources/icons/menu/flip@2x.png | Bin 0 -> 947 bytes Telegram/Resources/icons/menu/flip@3x.png | Bin 0 -> 1266 bytes Telegram/Resources/icons/menu/forward.png | Bin 421 -> 373 bytes Telegram/Resources/icons/menu/forward@2x.png | Bin 644 -> 582 bytes Telegram/Resources/icons/menu/forward@3x.png | Bin 750 -> 807 bytes Telegram/Resources/icons/menu/gif.png | Bin 624 -> 613 bytes Telegram/Resources/icons/menu/gif@2x.png | Bin 1199 -> 1087 bytes Telegram/Resources/icons/menu/gif@3x.png | Bin 1564 -> 1557 bytes .../Resources/icons/menu/import_theme.png | Bin 0 -> 431 bytes .../Resources/icons/menu/import_theme@2x.png | Bin 0 -> 752 bytes .../Resources/icons/menu/import_theme@3x.png | Bin 0 -> 987 bytes Telegram/Resources/icons/menu/info.png | Bin 528 -> 500 bytes Telegram/Resources/icons/menu/info@2x.png | Bin 1078 -> 999 bytes Telegram/Resources/icons/menu/info@3x.png | Bin 1660 -> 1372 bytes Telegram/Resources/icons/menu/invite.png | Bin 664 -> 641 bytes Telegram/Resources/icons/menu/invite@2x.png | Bin 1225 -> 1178 bytes Telegram/Resources/icons/menu/invite@3x.png | Bin 1739 -> 1661 bytes Telegram/Resources/icons/menu/leave.png | Bin 555 -> 564 bytes Telegram/Resources/icons/menu/leave@2x.png | Bin 959 -> 903 bytes Telegram/Resources/icons/menu/leave@3x.png | Bin 1183 -> 1188 bytes Telegram/Resources/icons/menu/link.png | Bin 595 -> 579 bytes Telegram/Resources/icons/menu/link@2x.png | Bin 753 -> 1088 bytes Telegram/Resources/icons/menu/link@3x.png | Bin 1478 -> 1439 bytes Telegram/Resources/icons/menu/manage.png | Bin 517 -> 505 bytes Telegram/Resources/icons/menu/manage@2x.png | Bin 630 -> 904 bytes Telegram/Resources/icons/menu/manage@3x.png | Bin 1165 -> 1113 bytes .../Resources/icons/menu/move_from_menu.png | Bin 614 -> 611 bytes .../icons/menu/move_from_menu@2x.png | Bin 999 -> 965 bytes .../icons/menu/move_from_menu@3x.png | Bin 1428 -> 1292 bytes .../Resources/icons/menu/move_to_menu.png | Bin 636 -> 625 bytes .../Resources/icons/menu/move_to_menu@2x.png | Bin 947 -> 991 bytes .../Resources/icons/menu/move_to_menu@3x.png | Bin 1429 -> 1313 bytes Telegram/Resources/icons/menu/mute.png | Bin 765 -> 697 bytes Telegram/Resources/icons/menu/mute@2x.png | Bin 1359 -> 1382 bytes Telegram/Resources/icons/menu/mute@3x.png | Bin 2127 -> 2026 bytes Telegram/Resources/icons/menu/palette.png | Bin 0 -> 728 bytes Telegram/Resources/icons/menu/palette@2x.png | Bin 0 -> 1466 bytes Telegram/Resources/icons/menu/palette@3x.png | Bin 0 -> 2089 bytes Telegram/Resources/icons/menu/permissions.png | Bin 740 -> 672 bytes .../Resources/icons/menu/permissions@2x.png | Bin 1392 -> 1255 bytes .../Resources/icons/menu/permissions@3x.png | Bin 1943 -> 1839 bytes Telegram/Resources/icons/menu/pin.png | Bin 556 -> 520 bytes Telegram/Resources/icons/menu/pin@2x.png | Bin 887 -> 915 bytes Telegram/Resources/icons/menu/pin@3x.png | Bin 1349 -> 1207 bytes Telegram/Resources/icons/menu/profile.png | Bin 795 -> 686 bytes Telegram/Resources/icons/menu/profile@2x.png | Bin 1419 -> 1444 bytes Telegram/Resources/icons/menu/profile@3x.png | Bin 2264 -> 2234 bytes Telegram/Resources/icons/menu/qr_code.png | Bin 588 -> 624 bytes Telegram/Resources/icons/menu/qr_code@2x.png | Bin 774 -> 1118 bytes Telegram/Resources/icons/menu/qr_code@3x.png | Bin 1483 -> 1598 bytes Telegram/Resources/icons/menu/read.png | Bin 829 -> 773 bytes Telegram/Resources/icons/menu/read@2x.png | Bin 1552 -> 1488 bytes Telegram/Resources/icons/menu/read@3x.png | Bin 2355 -> 2164 bytes Telegram/Resources/icons/menu/read_audio.png | Bin 527 -> 533 bytes .../Resources/icons/menu/read_audio@2x.png | Bin 1123 -> 1016 bytes .../Resources/icons/menu/read_audio@3x.png | Bin 1657 -> 1542 bytes .../Resources/icons/menu/read_reactions.png | Bin 820 -> 760 bytes .../icons/menu/read_reactions@2x.png | Bin 1628 -> 1490 bytes .../icons/menu/read_reactions@3x.png | Bin 2462 -> 2274 bytes Telegram/Resources/icons/menu/read_ticks.png | Bin 494 -> 442 bytes .../Resources/icons/menu/read_ticks@2x.png | Bin 727 -> 799 bytes .../Resources/icons/menu/read_ticks@3x.png | Bin 1259 -> 1186 bytes Telegram/Resources/icons/menu/reply.png | Bin 429 -> 396 bytes Telegram/Resources/icons/menu/reply@2x.png | Bin 603 -> 615 bytes Telegram/Resources/icons/menu/reply@3x.png | Bin 798 -> 826 bytes Telegram/Resources/icons/menu/report.png | Bin 516 -> 481 bytes Telegram/Resources/icons/menu/report@2x.png | Bin 1059 -> 1048 bytes Telegram/Resources/icons/menu/report@3x.png | Bin 1663 -> 1398 bytes Telegram/Resources/icons/menu/reschedule.png | Bin 653 -> 683 bytes .../Resources/icons/menu/reschedule@2x.png | Bin 1253 -> 1269 bytes .../Resources/icons/menu/reschedule@3x.png | Bin 1858 -> 1864 bytes Telegram/Resources/icons/menu/restart_bot.png | Bin 718 -> 755 bytes .../Resources/icons/menu/restart_bot@2x.png | Bin 1331 -> 1402 bytes .../Resources/icons/menu/restart_bot@3x.png | Bin 2060 -> 2037 bytes Telegram/Resources/icons/menu/restore.png | Bin 0 -> 579 bytes Telegram/Resources/icons/menu/restore@2x.png | Bin 0 -> 1000 bytes Telegram/Resources/icons/menu/restore@3x.png | Bin 0 -> 1499 bytes .../Resources/icons/menu/retract_vote.png | Bin 790 -> 715 bytes .../Resources/icons/menu/retract_vote@2x.png | Bin 1460 -> 1389 bytes .../Resources/icons/menu/retract_vote@3x.png | Bin 2199 -> 2024 bytes Telegram/Resources/icons/menu/save_image.png | Bin 710 -> 653 bytes .../Resources/icons/menu/save_image@2x.png | Bin 1213 -> 1207 bytes .../Resources/icons/menu/save_image@3x.png | Bin 1774 -> 1810 bytes Telegram/Resources/icons/menu/search.png | Bin 576 -> 565 bytes Telegram/Resources/icons/menu/search@2x.png | Bin 1077 -> 1018 bytes Telegram/Resources/icons/menu/search@3x.png | Bin 1166 -> 1494 bytes Telegram/Resources/icons/menu/select.png | Bin 560 -> 530 bytes Telegram/Resources/icons/menu/select@2x.png | Bin 1110 -> 1045 bytes Telegram/Resources/icons/menu/select@3x.png | Bin 1616 -> 1422 bytes Telegram/Resources/icons/menu/send.png | Bin 726 -> 667 bytes Telegram/Resources/icons/menu/send@2x.png | Bin 1381 -> 1273 bytes Telegram/Resources/icons/menu/send@3x.png | Bin 1976 -> 1853 bytes .../Resources/icons/menu/send_when_online.png | Bin 0 -> 642 bytes .../icons/menu/send_when_online@2x.png | Bin 0 -> 1255 bytes .../icons/menu/send_when_online@3x.png | Bin 0 -> 1931 bytes Telegram/Resources/icons/menu/settings.png | Bin 0 -> 563 bytes Telegram/Resources/icons/menu/settings@2x.png | Bin 0 -> 1072 bytes Telegram/Resources/icons/menu/settings@3x.png | Bin 0 -> 1780 bytes Telegram/Resources/icons/menu/share.png | Bin 589 -> 573 bytes Telegram/Resources/icons/menu/share2.png | Bin 0 -> 561 bytes Telegram/Resources/icons/menu/share2@2x.png | Bin 0 -> 965 bytes Telegram/Resources/icons/menu/share2@3x.png | Bin 0 -> 1470 bytes Telegram/Resources/icons/menu/share@2x.png | Bin 1144 -> 1008 bytes Telegram/Resources/icons/menu/share@3x.png | Bin 1676 -> 1574 bytes .../Resources/icons/menu/show_in_chat.png | Bin 698 -> 668 bytes .../Resources/icons/menu/show_in_chat@2x.png | Bin 1338 -> 1304 bytes .../Resources/icons/menu/show_in_chat@3x.png | Bin 2091 -> 1928 bytes .../Resources/icons/menu/show_in_folder.png | Bin 446 -> 459 bytes .../icons/menu/show_in_folder@2x.png | Bin 662 -> 675 bytes .../icons/menu/show_in_folder@3x.png | Bin 967 -> 926 bytes Telegram/Resources/icons/menu/stickers.png | Bin 712 -> 649 bytes Telegram/Resources/icons/menu/stickers@2x.png | Bin 1197 -> 1282 bytes Telegram/Resources/icons/menu/stickers@3x.png | Bin 1930 -> 1788 bytes Telegram/Resources/icons/menu/stop_poll.png | Bin 462 -> 458 bytes .../Resources/icons/menu/stop_poll@2x.png | Bin 966 -> 937 bytes .../Resources/icons/menu/stop_poll@3x.png | Bin 1461 -> 1255 bytes Telegram/Resources/icons/menu/unarchive.png | Bin 589 -> 577 bytes .../Resources/icons/menu/unarchive@2x.png | Bin 935 -> 926 bytes .../Resources/icons/menu/unarchive@3x.png | Bin 1366 -> 1288 bytes Telegram/Resources/icons/menu/unblock.png | Bin 781 -> 713 bytes Telegram/Resources/icons/menu/unblock@2x.png | Bin 1396 -> 1344 bytes Telegram/Resources/icons/menu/unblock@3x.png | Bin 2049 -> 1905 bytes Telegram/Resources/icons/menu/unfavorite.png | Bin 815 -> 769 bytes .../Resources/icons/menu/unfavorite@2x.png | Bin 1558 -> 1502 bytes .../Resources/icons/menu/unfavorite@3x.png | Bin 2386 -> 2206 bytes Telegram/Resources/icons/menu/unmute.png | Bin 680 -> 627 bytes Telegram/Resources/icons/menu/unmute@2x.png | Bin 1133 -> 1236 bytes Telegram/Resources/icons/menu/unmute@3x.png | Bin 1920 -> 1790 bytes Telegram/Resources/icons/menu/unpin.png | Bin 549 -> 506 bytes Telegram/Resources/icons/menu/unpin@2x.png | Bin 959 -> 855 bytes Telegram/Resources/icons/menu/unpin@3x.png | Bin 1297 -> 1208 bytes Telegram/Resources/icons/menu/unread.png | Bin 739 -> 674 bytes Telegram/Resources/icons/menu/unread@2x.png | Bin 1398 -> 1299 bytes Telegram/Resources/icons/menu/unread@3x.png | Bin 2053 -> 1898 bytes .../Resources/icons/menu/view_replies.png | Bin 602 -> 587 bytes .../Resources/icons/menu/view_replies@2x.png | Bin 1039 -> 993 bytes .../Resources/icons/menu/view_replies@3x.png | Bin 1418 -> 1352 bytes Telegram/SourceFiles/boxes/connection_box.cpp | 2 +- Telegram/SourceFiles/boxes/language_box.cpp | 2 +- .../editor/scene/scene_item_base.cpp | 22 +++++-- .../view/history_view_context_menu.cpp | 2 +- .../view/history_view_schedule_box.cpp | 2 +- .../SourceFiles/media/view/media_view.style | 3 +- .../media/view/media_view_overlay_widget.cpp | 60 ++++++++++++++---- .../media/view/media_view_overlay_widget.h | 5 +- Telegram/SourceFiles/ui/chat/chat.style | 18 +++--- Telegram/SourceFiles/ui/menu_icons.style | 25 ++++++-- .../window/themes/window_theme_editor.cpp | 11 ++-- .../SourceFiles/window/window_main_menu.cpp | 10 ++- .../SourceFiles/window/window_peer_menu.cpp | 10 +-- 220 files changed, 121 insertions(+), 51 deletions(-) delete mode 100644 Telegram/Resources/icons/chat/seen_checks.png delete mode 100644 Telegram/Resources/icons/chat/seen_checks@2x.png delete mode 100644 Telegram/Resources/icons/chat/seen_checks@3x.png delete mode 100644 Telegram/Resources/icons/chat/seen_played.png delete mode 100644 Telegram/Resources/icons/chat/seen_played@2x.png delete mode 100644 Telegram/Resources/icons/chat/seen_played@3x.png create mode 100644 Telegram/Resources/icons/menu/export_theme.png create mode 100644 Telegram/Resources/icons/menu/export_theme@2x.png create mode 100644 Telegram/Resources/icons/menu/export_theme@3x.png create mode 100644 Telegram/Resources/icons/menu/flip.png create mode 100644 Telegram/Resources/icons/menu/flip@2x.png create mode 100644 Telegram/Resources/icons/menu/flip@3x.png create mode 100644 Telegram/Resources/icons/menu/import_theme.png create mode 100644 Telegram/Resources/icons/menu/import_theme@2x.png create mode 100644 Telegram/Resources/icons/menu/import_theme@3x.png create mode 100644 Telegram/Resources/icons/menu/palette.png create mode 100644 Telegram/Resources/icons/menu/palette@2x.png create mode 100644 Telegram/Resources/icons/menu/palette@3x.png create mode 100644 Telegram/Resources/icons/menu/restore.png create mode 100644 Telegram/Resources/icons/menu/restore@2x.png create mode 100644 Telegram/Resources/icons/menu/restore@3x.png create mode 100644 Telegram/Resources/icons/menu/send_when_online.png create mode 100644 Telegram/Resources/icons/menu/send_when_online@2x.png create mode 100644 Telegram/Resources/icons/menu/send_when_online@3x.png create mode 100644 Telegram/Resources/icons/menu/settings.png create mode 100644 Telegram/Resources/icons/menu/settings@2x.png create mode 100644 Telegram/Resources/icons/menu/settings@3x.png create mode 100644 Telegram/Resources/icons/menu/share2.png create mode 100644 Telegram/Resources/icons/menu/share2@2x.png create mode 100644 Telegram/Resources/icons/menu/share2@3x.png diff --git a/Telegram/Resources/icons/chat/seen_checks.png b/Telegram/Resources/icons/chat/seen_checks.png deleted file mode 100644 index c65944de130008a6b5e289baffd4de002ed7888f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 551 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 diff --git a/Telegram/Resources/icons/chat/seen_played@2x.png b/Telegram/Resources/icons/chat/seen_played@2x.png deleted file mode 100644 index 99884aae9e9972dbafb04a29db70c7b2235166f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 718 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 diff --git a/Telegram/Resources/icons/menu/add_account@2x.png b/Telegram/Resources/icons/menu/add_account@2x.png index 81583e5c6f16d1e2c4b605f4d45f941c0b961804..ef74df51a402dc595919409934cc92613c02e1c2 100644 GIT binary patch delta 1432 zcmV;J1!wxM42KMmfq!vHL_t(o3GG-}D6VT1Hk`OJhvV!B5y?DkV`iD+%5W!?k{gK- zxfOCDQZC$x+M&#aOvy}&Ohpu%?T|S#JLfr;{r-R7_kRC$_SHGQ3)Z{7XRUXA>s{0P zYiWHxpC0&+c|cpU@6prKi;Rp64GsPB<;x%MkG8h^mnwa~%A!80>63eDiWoSvSJh=@>qBbAQKz`&rn zxj8K@jp==Rds|po=woKu{1@+MYiql=w?{T@ZEdOL z<_~SiZIXv?q^xmubzNRwCK&sR3Ix}RZE|*YhAM)!wY7->ia7Xal0@7@M@Ms^85tQU zeasGd0!0YrN-Tv!`uzM1B$6~RFi;GTb0Xa;V+4BsX=#ajxSZ|qaU_GJl{##k3t`5_#*pDm3%Uq)qF0@ros7>2C}fF} zn3%};iinPm4$_Ev!^Ocp%wp6+0R{p0@bCZtj$7VV1}iQuCh?Y*7RHn$&^4(~p?Gk8 z4$0KiRMObh)x}kWc0qvf@NhA}+S(d11i;nR6@Ru90CWUv^l&6RnDg`Vs2PH{v@|p{ zB;xS!kPBdZhLneW|Nb3q2OJ|KBXMmL8Wa{5M#AXT@>=9+L@_NrJw4_5jP~&GAR1kc zG3ANw?rvK8`}@oDK?@B+R1yMRQvhX4oXFGD6P6(%AyH9Lj88;*dOAuDXynAo%8KAE zEq_sIiNH9;1<05qBO`SDK0ZD&u869ssUa9rCM6|>-Xo2(v$NT#R8&+XlKWtwqmlUV z@URr-gTJw{K~O6zD+N$}eSL-m9%dot5TqoFznGlRRirfF90-Z-B!yAWAfS=_FoIbi zPmGR^Dn1MN65$0Alrbd+sd!|h1tS=W%76a;KC=eFk(-;VN(n}}%FD~Mu&_{K5Q-IP z=QblLVH^P(tyJBTlH&4($9!~jL^u~07p?%83I8J+r0Nz|L{%n+De@4aQdJq1akzxw zgL`^<b#;|mx`2-*E(OWS$$ucc zyu74JlvqlOjb`HJiW#}Iw3HHr1+tikkB{f*)zTUq93-%~Ky&dQOsVn1-Q67y7jG}% zU<7k>bK`EHib21LCHwpP=jP@x(ZL_(<>gdxG3=qcp&b$)4j&pC+TGp7`3f|k=WK6p z3z(`eg)u~u7-7+{Kw}6&m`_bjVSf)B8yj$Nb6<>cf9 z!N$f$^nB8Qme<yTI%;)%sL#Urv0y#8V1 znh2IslLA@?A*F_KwwD?NHiNg=oGLJdmStsST#cGESFR#46a7{Eqvz@ADVi~UeyFRf mqg#Mj@RRfDf&ZTe{sz|=0ugnfa+t9I0000ik delta 1471 zcmV;w1wi_T46Y22fq$4uL_t(o3GG;0D5hH&{+%^$*g0&c(Uufyj7ZZ6g$u<6C5J%{ zccw&!c1qm1aUm1AP@0Pg7l;%!lAP{DIZQd_Shj5#hlCvWe#X1K|7U&c`~UB^|C_y= z@8bL4^{i*T@B6Ryu6MobGZ=n8|FIdcdA7gq?(Sh>VLm=S-hbZSc-z?6{Q3CI%*-4g zA3s~OWdnnPf2Ti!YzyH;% zSNaXx6BF(2?bS*h9Ualt*x0zSv7sDwaBz^6l%(cchE!Bk zARt)p*49>DULN9Cj}|*SyP~2ZrCSI)1eVU>5)-Yht?bIx)m2qhm6MZ`gl7_RaB#rD zo0}U}_3`6JlOr@bF*mGYe}6wFCPss(3yzJA-P_w^g@0vbWx9qj330VGz}AE#ghqnbcSLqh|bN5Ia`&USTm;jIi_aHPX)YHDcg{r!DZRFsrs1UVOD zhimPrkdP3Lu=)9UWg>rcw2ygdp48+$7HE=;$LX`^7m$JiL)_WRxEmvLeyG zfB%k96=*et1_XH!~Q8ubkf3_zojr<8f$O;1lNah4fpCU=p5FzxH>BRMlOQ`u{D2=&d| zw{NKr4k<~3jL0SA#fuk0mw+=0CTHIZ4d&@^V%$ znIY6$+$|NbLHKlZb8|yxhwYV>6}%w>p?^`}fGO2LAkUDmuP@V#4l$%hK-Nc&Ko%h~ z<|a5enC1xxaP*oz8Rq8ZX!zmbp~R^ECF8+w-nG%TrTT5TwlL_-QM1g(g!6UsTSTy zs)dDxasviKTU#6PA!u=oxasmEGBR>xWJEA8Z4M6)8l9sUV-o4`z5$16ZL4Og0UFq-d|BLG3^r-ZMWwQ=R?x0BjIFg{^`uaK{ zAps}J;^HD**HH-IGTPnU%?3;h*i$&CaM@rQE@)KOqISa`VjLG-Tp;QEXYe0ExCZg< z0&8KuCV#4o_mr@#(kAUY$ytVP6xrF?$VpJ{>FJr3l|@#Xnwsz>>ZwKRw|^u{Mn-V7 z;R^;ETw7a(mVU63 z`oW+T9D*+FJLCdBdU=l^q)@A%f59hekp`^!y(j9j$WO-)(6#m~c Z@Hg^`h{87{o(}*3002ovPDHLkV1ky+y$1jQ diff --git a/Telegram/Resources/icons/menu/add_account@3x.png b/Telegram/Resources/icons/menu/add_account@3x.png index d6597b787136cdd53228f5b9ea8c1736c3343f54..22d6c56c4a53c15159868172595b028d7ecba2fa 100644 GIT binary patch delta 2137 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 diff --git a/Telegram/Resources/icons/menu/admin.png b/Telegram/Resources/icons/menu/admin.png index bb9ed4c87b16212c9a9c9e1ca1e07d39a066f276..6ddda6a108f52ca18712f92cb8f6b50d3b8acea1 100644 GIT binary patch delta 736 zcmV<60w4W>2h|3Ufq%bAL_t(I5zSOhNTN{`&7VZlz(o=iZiImh5s4IB*-C8`BuQ!! z1ce%HS|rh8+6F>kixvtgh=d@5g5ahRtW}V0geV$wVS-YEL_d^2IVWGe&oL)jb{Efc z&$;*A_uY4&Jw4yeSf3n-&1P%0TC>^A=kpH_4`Z>|S_V#vo zc({#wg}++XL4OJag7fq9Xf)cvzq)&Sdznn8Ll_tsKyesAhlGQtQYlKZDH4mtH#axb zC17=R6?X>%=#Z+_Dv!sbB$pyI<@)*>?%?1cuKY*KbUK~a>jk;8vVtc5X&L4Kk?1-K z&~#>_dc98WRjpQgJRTN{h1o%0(K|%<_4SR6j5wW6ZP^ z&d!3Jn3$NJp2ppg2mq_q3KH(x+8V+P1_P10tcb?dJv}`cjm9o=iy{~5_xt}B@W!Lr z2L}gux|^Gu_#0}E#>DRK?&2)raF|S7yV?a~_F1;Kw;PQHreS$`8C!F?T${~?4&qs? zudmbL>XQ7C(r7fvWD@l;FIQJr0Q>v6gNH)e{H2`l67&~Gz*}l= SP#Nj~0000t delta 781 zcmV+o1M>XU27w2Vfq&~sL_t(I5v`OxEURG@$BTZbQ0bu2wCUm_8lfREkQj6$F*K?+ z5d*PF!_dK|QVGeO7|_ATf<+`GnA=2RkX#D}t}sXhi3Dxkdw+VW-aZ@AE>+9Ls+2-bEhr2xaT8FOrG?D_eb z(EI!Q#l=Oh*IQUvsD!%R?r=DKadAP|+uPgx{JgRHq~7cUn*sm(^+|B@&4Uo+-Yfq5}K& z_Ew4Z`~4J)peU}_*H;ju(J1(LMD%E4V&YF)P?VM>5(zDlUigGqd~}^NvO(3=)n>DK zWMqUG`ugnMx#+& zrKP1%_x1I$N5#d(5S5jcffFV~nWM>pOG-*WdwP0ycX!Ln%Na8Xl!?sD%wPiIB7iWO zttApV-SF@*MYgoGh|Nj2x3@tUvmhv#fZ6VLc6NgF_V!9ZrXo&`T~}8pC?y;m9H8Ia z+%%;H1%DF|m&7nil#`PaF*Cnh4o!KE;5G z=Z4U|y}hccDy^3>$y3KF$;N5Dd32tU$;nB2Nonir>uqgqwY9a&%gaoSmh*CceF^fg zWFfv!GCM(a2rR3stK7b9fTF0cjN-Q2?fw1z+zeJs-907rr_BG3HlJ%}YFW|%0000< LMFvhpu0mjf+k275 diff --git a/Telegram/Resources/icons/menu/admin@2x.png b/Telegram/Resources/icons/menu/admin@2x.png index 8baaecb1e7b70d675340ebce2b34714964646126..d63fde8cc63e3ecf69f313ac6322470297eafebc 100644 GIT binary patch delta 1569 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 KMNUMnLSTXsWi})L diff --git a/Telegram/Resources/icons/menu/admin@3x.png b/Telegram/Resources/icons/menu/admin@3x.png index ce868945d52abd0e6a03158bb160672edf0a1648..6d87a2798c43a2d09026755cae0360a0efbee34b 100644 GIT binary patch delta 2355 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 delta 2507 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 VtN0|XK9T?c002ovPDHLkV1kQ?(rf?# diff --git a/Telegram/Resources/icons/menu/admin_promote.png b/Telegram/Resources/icons/menu/admin_promote.png index ce7a550e62185df77f9df04ec7242a879bd80284..9ad438f571ae6a702c35d717b164b2cc19abd913 100644 GIT binary patch delta 676 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 diff --git a/Telegram/Resources/icons/menu/admin_promote@3x.png b/Telegram/Resources/icons/menu/admin_promote@3x.png index 8f9317cbfba606f8f6c89c48c4ccb85f2441efb4..2ab6368320e03abde5567eb44f6e0b4298774c92 100644 GIT binary patch delta 2152 zcmV-u2$%Pn6VVZnfPV-(NklSBMo$5QbM>GbYSgRKy%X!GMaHRoumhf&oPl zMFd5~1PTUBD54?;%!-1F5lmnJ5iw$VFh?-w9PY;*wk>*QdU|HgS-ISEUQSJS{eM^Y zbf~JHw6xSOH3F#-NR2>h1pdYdq^GA>s#Ga=?%aQ)@g%fat$$jz$&)9aKY#w~*RQ{S z|Nivp)2UOZ#*7(Lx^(Fzw3d9zQl(0b8a3+l>C?Y{{h~ka-}mp|_wV1|zkmNig$gC# zoY*ZCE?juPfB{&H-R{nKmb`oSZo`HRojP^OlP6E?_7hFO`pL-1*s^8IhYue-t+y$B z^5n^)MT?p=X@8Pv>%#Np%9X2Ct5z#kta$$Xx!LsV*RM~THm!H>-t*?od+^{vpz@R{ zQ>s?28s4JVi2C*G&zUpl-o1Nf6CXW#v~b}Z}uBb%76U$arp4z!Gi}EDN@9j#jb)wkJZJ3G&J}2?c3I^Tifv&wU#Yg z=GV;GvwvsDjvZUJY*`~gl**<}n=W3wn0?Z->G$v7SFc_@3a`S{ty}l!&z~Cm&6_u8 z%$QNLW=*A*B!QES^NmxEo@h2~-MTeaqf89RxM|a-X3d(#VvGdFI~h1|AbYGb=HthY zu?}>$BgJ*`;>Ac-B@C36m8Fb9s8gqofjYp~mVaB&wQJW5L^)7(>((vVO7Y^w<)bDC zbWHl-&z?Qgz&ZR#WFT8Kd(Z!+j0^1AnoxOj~2ory~29w2%BuVDm&DY|0Xa%!bjo zZ(j$Cpf(bv1_WRrd9h-}6a*piCY08_dv{4xu3R}o+svq)J9kQbM?QA!80ka_HgDdXtP`e45=W+xDik#TQzOxUB}C|r_M{_JYc`6UAwkdrGKdm2*AMOgpf?y6Fn2bE0RRf7i(G?SiD4jaY#sz zDSJp9nTE<-$D)$!o8@lS_pIeT5XLKm5O@rHIi6IjR;^MzBz!z|YzuGPxS_aKu3Tvg z%hqF+-oJleF(`pTsO!@Mdmwp+4%58#S3!O{9e9%sa2s2B+xi+b0mM znLM#Npb&U;>i{$-UKcD_pnp(oiG(l)OM*?a{wr6mDE;HdkNc^GC@0)djNCr@T{v(UC^bjG6mFaRTB1tY>OlNX z6z<9-`NWA6{b)m!YrzYiu_u^#R<(_bMCLv4)&~XDX_y?dve+q?%K6W z@#2eAu3XsRR&btbG zabak}wrbX_Sz6zCJags@*+N^2Y&~2=ci#Ky)2DHRu5A9$|0Hgu8|n0ulV|<<^=xZ4 zbeK*I;vOKr;D1yhoDEOnbw~;FnS|T2Z{NN#T@BYL93J!^C&rD%+lU)SCZwZ8XmjVz zr6+C^u^R`P46ghPj^K(z!X0P=$1Uv8p+iEfN*D<*=g^@;?!GxC++R+eI+au|uhDM^ z$aR}P1W1^z5s0{XvdmA(As}Jcs8OQ`&E+(Nj1t?UG-2IOzIyd4$~kRc%=XCjZrip^ zCdp;@*mC$pSgyU8&E+(lKm&h*`RVKyxY1;%nXx%-NAlX^<#2}<*)>U?VJYU+2&6_J eH3I*K5%>qVE1NfBhh~ca0000Y3^8 z>gwJ|B>k8E1k#^Cm`@->n96_aE?>TUw{G2P)v8sxbm=>H?tfgmbZO_#opB0Jv})BVLx!{%9p(-vB_*|P z-Fo%v)vsT__J85O8FKI5z4`O!*Qim$Y&#@G-MV!bE?oHF!2_eSFJHb~v0_E@=FJNg zD%7S;o3(4#zJ2@F$YPF}GG$7!V#Px8UsYSKT)7!DW?a91-RRlJj~};e+0wal=S-P0 zDO$2-&DyJ1uU)%#ef##!ThGs*KMx%`G^(QTC~7XKU3VPQ>Vs` z9b2$qLA@f++OlQK@*&)~al_cd7cX8g1PT-=;Hl5EF*!MT!-fq;OINR6oi=S+nKETO zmHBO~Uw^;;k|j%?JbB`6mr>fjeS5!372Kvxn>@7Nzkh$hf(5l}*H%~wDQ3)=u|tOr z8#iwJ@Zp1-4}6?Wn>Gz>4!v59uU@@cwQ5z%mMzm}!O4*$NB{o)-NwR&3l{>rK|mlo z_T|f$ty{M;b~9(r9QYw6g23!WfJRTGSIA5O!GF{f3fL-`lxxQ zPWbR51wv3G$${636g^d{RB^66Xr_{;6jZRkETqym0@MI}C77yQxpDw<3Uu`7(ToS_ zgp_Flkb({Hmk3tsIeq$c05Ta1Ne&uH6MrS_-Md$6aFc-n4&YfNLKrEvkt_;8KX~w< zBmK0I|l4#3pf7k-^ zbK3_&bX$=WbGdTmvehCSJ$h6Dcoo^SOEMWkFLbo6UcGuZZ{CzFOJ+B~L@((Sseg1L zp`%11wK7jxa(M?@n7(qyjvbO*ym)avE~SMW@`iZ(k+D!G?ewQ`@#}Nn<(jRMG?hm~2H!pFVwLjZ@}R zl$C5ZWzm-P9V5eGBM_K~WYH-rp?}G>Yu6e!Y)EE;N9zPzH8cSL23TT9X~?2eR;Flj zdrpjN&HDB0!G^=x&;2eaVs~Wl?KU0%By+o${$npFTaNIY@ysG2&FIjUtsn zbi`nlaIa3CIx)@O1;(^=g(2sScWWIuaG*9#PbE!mEbn@PL+KlfzBfLml^9BrNkPXn z`zWA+td>;blmP?^)-1Dfaer54V;_D+B5-V1g62FpQX!pc(>(-WfPFa>1(9!-+Bg>V z&;5;LpCeWHeB*4ESe-bDm0U|EL{M^-Ry|-SKGT&wd-jx?7cX8MxMRvv#%ZNdMYU?x zE?&GS4O=pS($JwpEjofW_<{)CXu?|bZ4*p#Mv4khmJ8$j0bYAZ%YU{)SuH4PkE5WY zMD-)KeEITayH^MmD^`qc_fca1XD2F9L8PNye=JSy+O?DRESb1$_Uzf(IFm}6v`15@ za`Uce(W25y{1+;e^@o#hH*9w>4r4a zPntAIDk7qDBXI62k$>yfty5xfHzF{=l8Y)g@cHxSC9-SRu5L&}J;%*b5$E~Z?+PuP z74T_2e*Bm*K#*$C>u81o5jslTj)geOm(DOWd`_eeYtag2unrqGOpgn{cK7bxvSUk^ zE=`q9_JUF!<26;!DPCWiG-)E;VCkz~y?VULqC9p-gwImxoPRlUQl&9CIa{`D%Iync zvEXVP4CSRUM>lHJ$bky6V%f4~^2y>rdWVat>@hh9 zHp@}E68@b#ch0zn4{XLk=-9ENl`^pV#y82A=>VppV$q^SwsuR{zkh#%ZN$3AwFOR$ zq)}2@4H`6vMSrEbM9Rf^F^C;NNZ(|?e*Nf%>=km{ds9R2xecn!P8cImVa#C}^u{)G zPjKeUnaY=sp>A?-Xi6O_)oAY^FHMefv8b5x#l4Ij#a)hb9j}MCk!PKc!J$CD%cS#!H z7|G+-Gk?DF-8O61j9`U*B)6E|9t1Bco-~GZCE+qo&z(D0i51*B;H+mA88T#u&yksM z=gkV4-$+_;kIU)0TMf^GjdL1Ao@Vcj2nN-xS+k7ydb#SsM)(g;62{Ir0Zip2Zn;_E zjE~5fa-TTp4G*UYkD9djM-q}kq-&~Ht;!vA<|}uydVBWl;cUUft@Nh!Cy@RG{`M#E YKVwsSPvSf`*Z=?k07*qoM6N<$g6I#AF8}}l diff --git a/Telegram/Resources/icons/menu/all_media.png b/Telegram/Resources/icons/menu/all_media.png index 9febf576c86d62400add80348551619a5e2eebd7..7d8119b3d1a94f8b39eb880ed72b7135d393e67f 100644 GIT binary patch delta 417 zcmV;S0bc%|1egSnfq#NYL_t(I5$%+{io!q?g|lH3NMk1<^zlmYI?XL=a+z|$Y!F)bm*_)hDl8%5FSbn5kb;tGPGX`1h=0a%J30yN0ClZNrBF35;jw%e^ZNey7z zwz>pEfF|k77GJYPF9IzhLZB|BAhA#j)G3YJAxkhNhbElI*V7udDMxF^=-+CjivCXB)2V3@F}tKQ z91fWjY%-ZRjzdNmfTj2$K!dDCp>>URFuTj;Qe{Y8@Gv`NSpxV%ljqVhwTN2p6F?K< zH8L#3FG6xBJ;Ly`AwYn(-|yA?wD!O9Xf+{jc=|V@MjH3Vk1Oy49hC+BeL#Yv00000 LNkvXXu0mjf`^(3K delta 423 zcmV;Y0a*T+1fB$tfq#feL_t(I5#3ZRj)OoH?rt`9MItItJpd_&q#jHUKw8&RKrhf< zgunqX9Dtx8cmxRoQArKdbieFt-b@H2y9uT{0>1a=dvD&~%wq9x*T*0;RaJFeUoMx> zH%*i0ITN3BRkj$;@GaF%6Z82Y{stSHL)eBNv}nx>7!Wmy)^JRA;u&VIj#244oe1sb+s z!kSM;R2Pbcl~aIdWI`O_Xv*f7`Y-08N5H5HYj(RGFnUB95(yKHOqeggpf#vMRaL9i z3e^RGC@*d(*?)_!k<7ya5wWCcdcWU+;mb5lF3MoUK$xvY6vyj3l^U}9LuyD$o;vtO zbzRrBZ5ud_(BplJapgVFn zQUdV+1(z0Nn2et^&mc2GzUO(^#^Zcf?Kcf0J;e=% R2z>wm002ovPDHLkV1lxWzsCRo diff --git a/Telegram/Resources/icons/menu/all_media@2x.png b/Telegram/Resources/icons/menu/all_media@2x.png index b2b3b6ce158e739e42878ce3ec54dce6c23b7759..a689a34bbecb5b1113f6891ed4f8c11d3f6b160f 100644 GIT binary patch delta 798 zcmV+(1L6Fl29gJmfq(o-L_t(o3GG-rYbsF?j#n`XTG$9tEbJ^*d_epaNntD6Stynv zwO}ijf`wSCrIno#G%sw#A|N&a1yiV?qLTZ;+?;IAzKmYty|7y>-cDtP!uh;9rV6a-Pm_!InCX>hGIe$MtXTr&3G8_)s@^Aps zTrM}APTxh>X0xeODmI%<$c`n1P>IanK>{jaltRb7Fr4r2@5R(YNw?e8>-9tjfTd6? z#voLV=?|A=fZ1#|8jX_b>FKH0>%Dwj&MVHS_algT6i;%K+q z{eJ(${AD(qU4L9$K;>{a3w4fDh z)g|~9lmFx6qoj2>943QCqd^7$B!NoO1yp1Ja!CUSf5|D>p27x^v-z%^Q898cgKR)z z)1Q%O0jcF#Hbbbz04>PH2I>+t0otX?_uJcB;sQ{%BrRywpDk&D#-!Q`@U9k%h1>zK zRE`ORT>Il5th(GeOto6= z>go!TR4RqZkb74Y#(X}HnGS^!C0lMD=e$0bKA(>&N~_iSlnT%R^AM2J$q;$^;&H@+Q7MeovH>0O+@oBzfYj0_n}4Bw=3g~(Ue88pM$TI(4EZ?uzP-J{ z!SDA=9)sA?0$r1M8DJ{m^FRVBNIrXT*ZLAG^pk^U=x$8ce3ODzLh2DA+P c{TB@U29q3y;(DzhC;$Ke07*qoM6N<$f}`7k0{{R3 delta 685 zcmV;e0#f~w2cia$fq#riL_t(o3GG-*u5m#SzHY9e4S1};NCb(Ak$A+Otiwh;W=tdq zMmB)hfEfw*ODg$Nsne$qcfc=y8%RCBs;)k#y83*5gy%r!yQ5MY!E=SF4qF!49@st#mpK;o)#77K=~pU9Z=Z)m$!@ zdcCf3NpChAv483J`yvD(5~ygV2|xi*Y!E`LNPm;k1fF7HQJeXEu2rO206x4VsG_kD zfC8Y<3}I~C2@%@tlyUw8OF)J&Ant^W(JR@IP*Sx&q(Xf3&~K8K^qii63}O6#3@Ax<`N zk6zL`WAy}N2xIE55WWhC9qyWO7scr8#~4(ZV1NRk2pPiIxEmwBQQ)?Vt2A!D7+?HX zY0iEmoO32>qp#8kVNyw8-}SMCs6eQ|$5!AMK?R>- Tx@%E*00000NkvXXu0mjf{&q=} diff --git a/Telegram/Resources/icons/menu/all_media@3x.png b/Telegram/Resources/icons/menu/all_media@3x.png index 4fa10d48f387ea08bfe45ca05d10eb61de2bb09e..d5390cc6da4a58b0a4b656d92028d192e164f7f0 100644 GIT binary patch delta 1097 zcmV-P1h)I93A+i9fqx}QL_t(&1?^fpFLgl_^_ECH!mWfxL!%-Q4HAXhiHL|oBNPf9 zf5IP7D22o;qN9+Dii97aP!oJvcbn-Q8VZUw>a#R%Z3^{{DV>d3ktv zI6FIgbaZ4{rP$QeG&(xk($Z2>QM{<9Ee{yoNwY9alxOjDSB^#y%PfSc)Utc5o z$lv4RyPjRAOCT3cJ& z+S;h!+}unilN2{LHhOw`DDLm?9~>NDVAL3pNF+KsI%;ccslU0oX=rGO`FR^3AD2m; zpPvtI8;k&8X=#c4hldAgf=Cl+(qv({fFqIt5QfG1seib-x=IIUXJ_G~g0rEaA@Tt@ z)m2qhQV&{qWN-v`Y_hVl63(a9v1QRFL0w%PMXW&V#T1?3`T1Gui;9YjSXfvn^%hN< z42GlK-CgSOf*}qEz5|m}6nw72ef-dRadE*OWEfOBf$zYajWb!P1Iy&uamA)H=E_PY z>wISnZ+{XFBX|<0DIGw%lVODW@*SAm;&EaM?=)VkbSJ|I_ww((8BT%~^;K6_m!aVt zh@;Tj+FHo#wYRsIeS&s-duznIyE}*_B_&3bH1Y{R>+9>2$4-PnYdio&p=bHT;|~GO zxH1TH{Df=ZSi&JdrTp0MPsxsonn0s%BMc!iadAaOg{7qU`ud9ElA?l~&cGipMZBrX%gaB@@UJe#Y}q_M zOMjL_pR?P2ZoZ(i?nvc(2*&L}X=y1J=<@P%)mnf1_+Qof7MfUozkIn4k60RMzg)+>XV>QtUqV}` zx%mN$$pPjqD?T~$ea7U>=H^FYa)gRC1DXNNfM!55pc&8%Xa+O`*_eS3bgGSIu|Q}j P00000NkvXXu0mjfdfyx~ delta 1077 zcmV-51j_rn38x8=fqxN6L_t(&1?`$mD{fH~$KC5SB?ALxWMD)xVI*I`KuitPQU3m+gqH$C{0aGl}ZI^eSLi$9UVqD@c#aOb8~ZgdWy8|?QMoORVEl69X&ZY`N;e` zI5_C<@Ap~26bzY#eV`fxeA0^3r>Cc1UthD^5pg~}Jtg`Ek*U1WUS3`>qqq<8m4phR zdF_b!Nehph%70{-D_5!)Gcx8aeUGt`j*gDlRB9af?(U8pIz)zDU0p3LElQuCpI={J zH_F`H+}hfj4FSkOno=T+9HcpPw%pLrPzn2OYHCVj23}oV?dj=p^x3ejtqnJH$ z%>s6JcXbwKmMDW_6roP}!I-2x1@Y$QrpiT4svr#2M}PPH{9KnXG=Z>H@yb>?zG0G0 z6$gihhh_($O0HDL_4T!_0%x33HpM74X#h;p*+l$1k*Y+#S2koPI9A%!mjaaPCRCGr zdea@#uW;hq!Y8_1x~f)_d|J{S^R29LdT^}96BIKqWGohv8YleVjL~0Na;V(06bi;) z7C@;MjelyAPepph=o)P?Rq4vgN~&+o&CTuY?Y4@#$uK~Nu)(aeaf~{YYGJJ=#rY%3 zKMh496W#0h__$5Y&d$!v%xE28QwA`%v$NBN$H&Kp0StS4dm{>Lx3{Ed0SXm7#kZK z92{(IZPh6UXFv9G7KUMnK#0H>M&QT4JnHUspXp)vo*(EsEveFrU_Q#j!^4_c--)#G zIDbVjU*YBDWt(Ma81V4$kgEtD85zMOJu_EnIdHBM=}0b}$o>7jRfCt8m#XjT>dK~I z%hI+~KQmY1IdFj!X{48X5={L?nP%Z|&dd{?NpCduzed_HU+tGDy(}V1wF6X>d@9l% z^R29LdT^}96BIKqWGohv8YleVjOpLldVje0pEIVa)g+%8=^5j0j4kGfFXLaewxkq* zQauS)lYH{i9pn0eE?!z%(qST|P*6LZ6KNg726LhiB|1tSlawLj*zuLIgqtLIgqtLIgqt{zl*rr&jPzAyfxN00000NkvXXu0mjfH8~D$ diff --git a/Telegram/Resources/icons/menu/archive.png b/Telegram/Resources/icons/menu/archive.png index 432bf2f7b59549382eab1e72acae4ae077d5d43d..4fce81e9204737570297f8eddd9888579c8b6203 100644 GIT binary patch delta 451 zcmV;!0X+WC1iA!}fq$e)L_t(I5#3a~s=`1N%;PH9XklUFH$>9e-QGe-VXKv3fm0^UN%|fwr;V^%$YOUJWdqlW0xAevr45> ztya_NbhHHJbUKYjBiD6>sxI(WtJUpxkH_QTaQKN^*=)AiY=5FMolb>bPHo%1-|vp& zsA|kfnGdB-rvn=<$vYK=HxvqmFbpr3%k6gi>xjjgrX>;y!!XwC_3s79=XqYaT<-V# zyWNgN8OY^w^?Kd+eao_#=ZmbmuFvQ5Mx#N>Yk=dRg*+NZns&Wji4wqr!y-xm&pSSd z90K@$Es*1QVJ! zn+?EhHlv<5px5hR;xn1d8{e}G8_Z}SGap*hG#87-`8<4HtyWZ)0n7(Jg<`R|TrQc1 t2Z19CvzE{2W&NaYw_E(SD24Qo1P{bfsRepx?6Lp=002ovPDHLkV1ix4*GK>W delta 472 zcmV;}0Vn>t1kVJJfq%J4L_t(I5zSPwio!q;HRo|QYIBvXr35V09}p`$EyO|#y@wMgo80D3u5y~ZdGqG&?6R9s=+#2;4HOQC z4Z~1XRZ;vUR<76U;c$4lT$u5LNF*{Ik8e+eZQF@N!rxDMG=CbM&1NuZx7+b}9H}&7 zu~?(gfNZ&30<)Jpf4|?aR4S9nWImsBIS6F4SzXt=-EOs7^=MM5)b)COVox3kT9U~m z8NJh|R4UOqqx1QU1h09w+lfn|IhV_c3}brw)KLi1FCla)09l4un1s#kXkl4p+~)_n!OVj>8WWQV~y}>d3jkdMv>C;e`aRp^73+TZ;$ZJX0u+e zV}_z#KZGlZL?V?+5%lKfW@~G!*X!wb@`$suGq%O!<74RKF_M{Lu?P{wc5!hb*);+y z6beku(b3UJ&41LF{r!DLn9JqVIK)R52n3#=pXcW0(DwQH`Stas)^8|3KR>^)uz;3s zw;KwDI-QPe`}z4f+s%Z6YPBjx#$Ype25g>#G6c;NXB7PEJmw8VrI!OZ*tbw@&jZdViLY$A4$OYCXef*&rpSK#;O5 z6XQ|%^Scnp;I%Qc+GUw)CX>l#vq0Y8->dz0WOxW;gF{P8OT@(j`SCo`20=Wjm5d`u z&%OV`p|!QO>1myv005Yt9fGsTxVcg4*qNGMQ9r z@_0Nn00AU2HGl!EFy ztJP$;!qbmt;7vN6rn~*s)z$9q?r2^8o6qNae}AWaOycwH?F}Q;=Zh+6fKQW916mC= z;xi*-3USPM*JO_&%bN>u^msFY_vYH2F2@1K0b3mS3tN5iGEr3pFaQ7m07*qoM6N<$ Eg5$TE9{>OV delta 810 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 diff --git a/Telegram/Resources/icons/menu/block.png b/Telegram/Resources/icons/menu/block.png index 3f9efcd873bc4e2f82c9195ea174ede1753a9e1d..6c81ea74d6ed3f48debd79f824d8f0dd22aa789a 100644 GIT binary patch delta 599 zcmV-d0;v7<1L_VMY_H&d6|E{BV!r>FUR{`~xmhVgiu zPN(&HJwTV2m#I|h@$vCP5Sxyg&1RucXfm0w9K4*QAV7hJ!O>_W5{c**MjwF$0s#_m zvDs`0h|Ok00DnP1`~Cj2Ek6P=cvKS*5NIZj03{%+)oQU=2%Ty97{ujr2?%v)W*iZB z<#M@Ntrm+#nsv?~A@EKzU9DEVUJu&m^L4vj93nI*um-NnvcMLv`6%s=^{pxk0=_Aip64&$HT-=h0SJzqpyEa>gM zK*zt*S5Q}1>-GBe_4V%V4);-|Qt5O$_=tA9T_h6utn_*qvamFzq*%#@SV+psPYmvT-1p*}Z@$}|dl$F+E_lx0bIy6sdB2;R ze|9(=4wuXQ`*dcr+3j{mB9YBz^Zx#x$z;Iz$8@Pw>f8CWT7Ruttp+KbPTOoY7K`;I zy4%}ZpU;P|PN#E!e}6a}5{ZOJBsw0Cg!$#=<@a0<4-aUB1Qd%!WZvy|u~G%6fr4qL65>6+&&y5e*+TjM3K4NfU$fb4I2;Ov!VAH5YN!)hhMq6J zXAq4>l}e@EZeK2!XWhsD$z+0y{HUW#c(-UOpU=|`RQdV&d9_-pR4S^HiltKNXf&G7 z=d@8!eRxjTWHMpEcqPoc%jH(9Rg{B0qDOv~$(QK$_0?*%Vn$%Z8#Ee?Uaz;^Zi6Kp z4u6hf&|rN-p%8WtF|@N-ECPW5L(C5q^XJZBFkq+EYBhM*>-Bg%ZZ?~}UXQ%~Uvd3s Z`tPvkQ@M#*%QFA~002ovPDHLkV1i;EJa+&9 diff --git a/Telegram/Resources/icons/menu/block@2x.png b/Telegram/Resources/icons/menu/block@2x.png index f6cad1fe4afd4012cf8e53e7030fdfc967433196..90612c87d8886183ddde628fbfdb26a4cf1c76ad 100644 GIT binary patch delta 1278 zcmVU&mA#!QS59#ec=c)YP=2qXP{1H#Ifo z>guX8+*cg3vaQK}SyQ5$XNIHR+S-b8}(a zWu*74GnKE4xYReAvPjGV#$aKPk;qlN;LEH^9dv&At5Ix2Y33`)|LpL zno^sZ9cVm`5HA@EH#avhW*#hv_7(x+?#8i24u58Rp&&(wamj%RU0hs{2KixUXQ!#D zX>V^28mtKEdC91W@A~?BSXfwQX6D)18JbQ`PPw_c+$$8MmW=lVIb2^~lW=-^O2Xvi zq>YUY!=0R*kbHiAP69;;Ni8leZgFvOVqyZZY;SKzudlB!I|>CULZS$v-e_!WL^**f zQGW=*GOB=@ni^YM+s@8TQUU?9N=r)v8`2Z~dMH3N#dS z++%2HNJTd=+#I3U+1bfke{A9B z=Z9=VP%$wv9~;W`3=R$wN>EUcob8AG*u1z72&b#7>q9#w9e8aKP+nf168m>;ii?X0 z8>LDlLc$s!A6M%0+Rn?%3yGaT($mvlcdFh({=2%mBDjEn0966-iho^L zSRnVIp&?b>-?y)>t|mm}4K6?4H+`c;&LUsrK4HpxW2lM(K*-O8+uYnN%5D-!rKP3h zg)cwQBFM3wU1)Hsb#-;|h<0#raCUYM40j9^R$izJQd3j;Q6M{z3I+uQ1$ok*e5ua$!gz88bx2C?RG1|0heU{q3`-^PThmef2pPyY;U3S!+Fey~A2(o0$Ck z{>lt^cz6T`2L2JRURG9ie0==R*YEcBw!6FA*4EY#W~TZY=YQtrW@l$dM@NH)pPye= zR+h-a?(S}Ka`MB&gGg`up_7x-+}s=`L-{!}GGhGjx*kVIM+8nJQ(9Wu;o+gs zHOW{VB7|c_nt*@+XriK`Xb7Se6&1oIE-x=9liz;^2M6P%=(2&v#l?mE-re010LKj) z&d~PuHUY-Q#t1MzKCY39nH;XSx7X3p5wjm3AJfy*gMWjAa7|!r6cWtLzRj_Vp`j-P z)-Nn95E98FLG>w3$lTmKBO`;1OG-+Lii%20OJ81INCS!@zr>Xpo0@)KZ)}47E;5lD zN)y5{#&#x~nVA_9z>);H3^5_j5L0JcIUcN+CM0~J=jUfaTUc0#2yrGvOU8PpZYUw< z%K~Ch7=NUJGeH_)NTaJaT85Yh3!EO_xtL-?q73npG1$-yaU^9zqQD9n0uo(7OiT=} zP+jL71%mV*5+X>J%n-xmmW(sx<>hsAbF;a*d2(`cb#+x$RmCsEPDoHEM8P=c90T_J zuBuCh(&6CXKp{b{udffKkY7^BNtzHxVkjF634hTc!p^1pMt8|r!+uyOEG%qqZ|5Nk z(u8=L1t#?L^u)^g`ud}zqlSitx3@PaIXo{1YcPxQjHVziE^c*ol|0nc)Hpjkvo|Fn zK0Y44=ttRdcXy{D%B`FwY8+v}k}&8kNppF5>FeuDO3)%Dp5Q0)rZq#Tqy7E;*Voq_ z9e*7n7d*VbzwhemIz2sYZEa;GgxA;Cyu7@Niwjcv`1tTF`URGigoK0yehDR<+8kvF z)ldlJK6r0$PpDUtg-fP{Q=5y3h-hqV6ru_W3iws4tE+`mO0uyCiDIC$!)-)_&_?n> z5y2#e{}CZ>!?CMkV`C)(%c+dDhlKufa({Aov6`Bigj4D=P9q!hrJ`;okFc||<3G4N zJ3CfZR`OV>8T?UaLb!pXAo}S#J3GlCF8cKJbp4EhMrCF~iHV7N+y82il$3-bLk@?B zhku>aJlfyiCl|G~wVI72fLNWatu1neI`8W0Dgn}>8Wzl48hUwtom1+%*;&m0z_zbc2;X_IUM>a@`ar1eJ)H){Qdp;8blHF^z@Vqq*afK zNQCgjUr)WxKPvz7@-ms@WZ@Fh8dVuLF)_iMkaPabpkRgGGCx0G_)(y(txW;1-xL}s z6dmS-%wvK@ps^XpcGo O00000(C!-cR!Cu#6lfQzERr4~ zMWTF&s7O-u#S#^J&_GMNKu~X@6>c&vy3g z+1qmtGf!*Qzi!|9*MFUvG|7JK4A>d4Ghk=H&cJ^+1AaaTJ%27PZs*RO%a<>oI(6#1 zckdoNcyR67wa=eF`@prgTr6C;@bTlve`%hco}TU7w|mR0<#r<@BlGg|9zA;0+S*!Q zUw`i0xep&cXh8jD{QUXzz<~pn$6&F+fPjFKl9F%VzUjem%K!TH>#9|&EDps&bN>GR zckbMA8oDrl{D1gSS66rI)~!#UJ_!@V{rmS9ELbpm_G}B|vCLF%ZZ5~FrBQXqjvZ6{ z&6_u`xw%;@)7{-&TwELy5@K0c9vYfEckal@2nX8I(sKU%`I?#C^kR8-%ChYS(!97Hh(rslo=Tr!q*ZQcpEls5Mk5A zWD}ZjTwPr~G&J<;)vKbSBDV1C*)znda4<1S6RJ_@nKNe!ttA2j1Fv4aimYjy+~T+g z46`35@!HzjEnBusnKDJ|2@|6*rR%^Ew9={&?d|PYyN?_>^8WpMX^M!5NJ&YNS964W zz<}z|p?^azJYn{e*2$9{#<|Bt00ai)&6_t-v}@L^!2pw{ZQHg9ZH{pG9#R180)gk#Ppa77{79MIXDjb-&=}|L`CcMn2}Os@SGG*mdc&MSEFN$qg0vJ1I9sf zkAHC~vRRh#9WWIbeq~^sbvc$7#L@rd&6B|PJi9u^nLg4-OZafJ8e}lEdZuhieJ8b5ocp# zV?uLTGI-{Tu!_K_tEi~J0awM>z8VE4RiQP(J;tSoiyFam{rYuL{P^*s&}>!<4EufD zBkbS5pHFMp1D!f`N-XFRj@^)+gu+*Oy;~4;$pO^sR`GnVxJGAE`NIL z$&)90_Uyq;0TdrTe2CNS(xpokBRh8N5NmpbQDB@}m9637Vd3C*O=u99)9^3{G|OPd zlU7a^x@hqJLK z@*gGUi&ofd5j0?jv!wzjMzLk}gJQXQzs0A#80t_Fbrca;lQ1g)T0e>*35duSJ zXQ!Y7v3KuYr;;X_69tT~lYxrYLz75UYO2Y@8>Oi7h*w-6aS>u=H~!Vag6UoxkR=?f zR2MH^0f8R@w9#0|!6t^?oqsrS!b0PJn8N9mJ?-1K?~i6nUvRa|zVP8fySQ2DkUt+^ zxNyNr(_||=JRCb?0fyrOj?&cb1@gv?8{!YAbT4@LWfGHwcmW|hdM~;AW%lsl!|c)< z!wlPBcJb!T8!LBDdbz<&#mgo3b$XKK_&7&$5yDq|e7reRZfoJ2n15sxj@PeW@3sjY z1uVx;pFS1iAj-?jb!5H31`_s-FUX#M1y{nvCW9?^baeQl2suT#d*BFg-{SdPeEj%v zwuuvTOiTF^!d7V>zrPC;zu&8=>nw&hGTEsCvEG!J$b3AkA%mGMzqrih7wsBI#;Q-(7`uh67cdBkP?F`r%urpw1 hz|Mf3f&YC5{syX*j;G9{9s~dY002ovPDHLkV1n#)vSR=M delta 2095 zcmV+~2+;S^510{N2nA{5P*F_p8<2i95A4u7!bsWih58{e-F=u z2SHIp!E{kfsE8NEbTFV^R8-7}2?JsTbHW@jV9q)I-~TTZWz9~{%XMO> zF=)`B)2C14iF}VAKb|{xZn<*h3Xq|Jrj#sMvQeW(_3PI!Uc7kOvSs(~-7EeW0QcIq zZ5t>spBb{UvW5*CcJk!OpFe-b9QgL_+mk0xj5DVB;lqa(En4KW=??WZYt}q-=8Q2q zWb@|Dn}rJ(c7F&@n3R=p&sfK*RjZyjaiT$k25vcT-n`kkapU2`hf9?zRk314VP>X% z`SRua_wTGLuV23=974)x;LxE%frEqHUAuOT8JeA)y=v8}xLuw;eY#}Hl4{ke<+Dqu z@6n@&G4aKV7n?V4-nnxp^GB0btXLuDmMBqz8K|imet-Y|eZPMFggGAomhyG$)@hrr zUArcWc%3?RK7al!)Gb@Kh=~mwHWYkZfEDOZ`<9uRIbgtm?c2Ar;>iLi#;sq!UaSYW zefzeM7)Bv=>eNZ_egNaf?3FGF0GZ+YutKoZ@fqwx`ojSE_*|Kxz&S@m+I%(1*jmayxY15{!UcK@Qa16hE`EsrP%9Sg^zhT1$ zA$91`LGS%?4Y$h~p zQ-8GTNN})Y96+?h=g*((rq*rD(iZFVD<~tT-SEPC#Qtu_biA1!dRR;<>dB*f>Cq!n z4hcGH-k7>E!KtY2GqQ9ZLi)Q$O#7A+#~dT3Nm_3hIC#VyQjBAXrJ~LVlcmX|V(@yZ z6&ojw;^b4&I7YRHuW{qX)P*S8vDaC>dVe)lAY(?{X0T&=-Ww5S#6mh|tk?NwNMpu~ z5sfWdwghI&KY#xGS+i!brxQ|KAUGAxh-p8KVA-$?LUOnGnW)Tujm>?l^O zn3t+C!H#Ke1E)L{jn77%G`n~2j&JVrR#J|c5i_aC`AtlD_UxI!Cf{@_`Z;F0Ab+Y$ zmoDy;Xs}~CRm8X$;C77jRm@PPJCk1e8tb)uL!!&ATeq4wZ_YNqTeoi1{Y41Cs8OSI z)4;)wd6kI>lZs}BP?_Rr)3a$(=TeeK${)4oxk ztXHp|h&4d4V>+UA)@HqZ`&Nsi_J5|Ez?Uyy-nwOtGc<`W?2h7ZwGYN_zaX8c% zod_Bq3hvpnC&80%#*7)d8;R7XPalq+=5(WZ;=;^+vXsiUrZR0}iYT#|On-rm@zJ%) zuV249j@U{4pi#zp<&CSh)eqjkf4?7zO~&BCgYnQXELgBWdqTaLy1(I(W>TprQc?vl zAQXs50W*7%Pg0oj@Y1DAlhSJn^wXzLPfDD#GXoO00L)FVscKT8a7ro^JYwElcS}r$ zN^0o^T|_NjyjWK?DS(e0Ie${9ae-jR;&%I!$bbI-w8rt{$8#~DFRnvBSP_;eu9u_Uu`+?RIDj9x;95Kv0DW6&&JHNSZitB7b{m5y(zp`0(N8 zWF*u?0B#<1*!;G3iHP>^!z&oQd%}Q)3m5vcCq&^t#(zV6<3hxJbWKRfZ=KkG9zT9u zGy>eef1jejZ%ip^?Aoh*(}S%Yqd}r_+NXfU+a5NVJmjW$%3Bz&PIv$M Z{{kJnc5Cf`DeC|L002ovPDHLkV1iu^BBuZV diff --git a/Telegram/Resources/icons/menu/calendar.png b/Telegram/Resources/icons/menu/calendar.png index 036bd32e49163815083521ee756b59ae49d86ff6..b61e0f5287b098aa7545d9ab0bac9bc352eb1985 100644 GIT binary patch delta 360 zcmV-u0hj*o1K6q|G#s@6z#k3=;J1M9`|~`DqPPwAYQO-778JfC1y6vNuj?8)1OXVp(1Mr` zq(IO#Z5Rgb5H!Ge`ZS2=`6Nm3n4sZn;OWz#uIqGN$76!NTrPO}GzjkRcDvy*K?97Z z>t*BaAM{HMYGIn@^L~DFK@SpI5WMc1s;X(4p3mnn41e4;&+|;vJRXl(mZ4dza9tOE zCBojL2rz)xPJH_xF2`|-qOdHBLmNE|Ls1lc-*5c?T7CgM3A?WgHlZy50000RdcDTk zCuryIb+tW>JkP7D3MV~gUc0@js;kv%JRW1X+wHnkgJoF;UVko^`~5zS<7VE1&1Q4C zTyVF~x<2~rd_F@4F)Xd0py_l9B9zMSYRZo z7joe^4xlW{hhB;#VqyeAE!#9rMNueuessI8hW0^kX|g5Hw;c zs3?jwO&jhpm~hQzUBPYH-O=Ch^9Nn8SFC0<8Vz3%5#x&^mfMb!BtgGeEQSXeh5_;M zcqEqF>(8<*3`5s-=ks}<=Rd}YqNr&aEHK`SS(e>yx2Myo|Nqf4komq3%YDi-_Fprt Vx(2WF*`@#h002ovPDHLkV1n#+wT=J) diff --git a/Telegram/Resources/icons/menu/calendar@2x.png b/Telegram/Resources/icons/menu/calendar@2x.png index c53106f9b982da8327e03ace44a51f4e520a5fc1..7fbdb506066e85cdd72346e30ad63646a689e1f6 100644 GIT binary patch delta 656 zcmV;B0&o4+1%(EXfq!pFL_t(o3GJA@uQ5Rs#_=K{zM>S-X(SSj=tQB@Dyc-L(JT2Y zloGu{B_h#?5}{Bc3Pj?gkodY!a&9K~zB|nBUH9g`Z)S_l?3wfY&diye*_kyM;SVWrk#i zL>Um(%XjF1$k63-p>Ei0Hc@}RQqQm~keIUBZ0K_n31_DKmiEslSJ}|j0td-i^XE0P)PrqgnjyC qGU@mG_*206vLG`cGaxfycmu`}O3SG>^s@i}00{s|MNUMnLSTZTb4soN delta 608 zcmV-m0-ybb2G#|Tfqy_rL_t(o3GJBAi$PHo$I;XXWkD9!;vYaMWn&`?Mas@fSz7r! z?EML%EbMHQ@Fz%i6ANXbloDpX-0AeX?wjlV(3s}Fg^qj9_wzmP+{g1c9O_UL_>U9F z<#Hdl1A&S2w+3j{hvC&1p->=1HGMVvsEP=S)?&WgH&S|sRR4Ns(*DKLHoCXR&U>P4q zu#>0@g#xQSoqtZLR7z59Dh({)%msEF<9lCdHIYcLcs83&r&C(DF#r~D1|&P;^9==q zL6)1(=Tu~SKyb1n3%()x-oxjUifj)EPIhF$H$;iw3SO=u-CIYsS}m8$Pnwg*Lq*%6Cx2=`Q$OD2=|KX^%IB>)z1Mj$&~ zU_2gYPfU1iHk-P2781ac1?)JI;8D8U?G}qgR@dwG`u+ZTz2;=*-iE_rJQ-@?rBX?b z3WY-Sv{_51VtW7!7|FX~713yPGMU)k1OWkug|HjJma#hgO;M}W@Y4=T`cMcFk1y`` u`^93>>2%udHvUw3T&OD51k?mHK4?ly}60000Y`nXT1Zrc(V`M01VO}l=e>CIJ}&Pzf+4tAh*1(OfK3hXr#Y&O}@;sDeTz(}buc9900#{7Oi%YJxxfM;xIaR6!vV5C$SyGR30V>I=9 z#j3IIHGf|=+r-Y8Q+y^C78cIW&&Bgi&x8PR%n=&HH-K0yCJz0znG?GdC$_N>mSU&V zIX*uA!UdL0CTC`51O<%H*yH14E|(L;m65i-zAoO_#4bhEn2fb06I0EYOm}5qs~MBw zs!U8ZV=~>9fvsjthO06$)r`q>R|dA4F&VDP#DDx>XACDfn5|Cd2>+F`DiZ@LU^pCp zj?9^{=jUfuzqq)Foj5kMH~=*SFw&Qo7Z(3B;52r7d&|nO`Ma^P!G;zGpr*UeRG1MZ z_>BPv64=Jn{rx?6o5KhVuLh)`W-=g2{KpSn>{6-35E0zm+-MFP=~kL?1Lq$=2U4m5 zl7G0^{LOXzu#A0l&Av1C;I6K&EZAIMSy|DnkzTKd9rwGtJ8p0MgmgMh54utFERG=q zV)%;1GcuVBtg^Tb4IKnPhPY7vVbS z-GK&)xB`umN9R_pb8JRV=K*RnC*w|^Il#r=N&_3r}#s<%Fd z!=V9=Z^+()-$R?tX3Q}JsP{&@>_e@1aL8zJi4pkY*1#BFC=_@@LFKy?WGkArUWVKo`i1YdU;&~;b3mPE9h=HVRq;yM_NFAxHz`pK|~%o6QQAzNooej(=0f zlN9(!16wYa{Lo&n$E$wH-ENn6Es*59r1HnUTt~!OABT{>lt5q~dw>P8>3ifzI>%TC zV*9{DVn%qlC$001Jpg~D02&UD_1&9etZ0V7AH=+K4neSbT*a?2ey^~ydw&q~adLz} n86uzzPzERilmW_sn+$vd>z^cK+$tc>00000NkvXXu0mjf%z=D> diff --git a/Telegram/Resources/icons/menu/cancel.png b/Telegram/Resources/icons/menu/cancel.png index f88a31e39c556bce5d177804926015a0f91214d3..c52cecef63b315e5857f4afbbc69982a059c63c1 100644 GIT binary patch delta 356 zcmV-q0h|8Q1Kb0UfqzCxL_t(I5#^M#z?C}_-|~S*aYzQy|>G;d&g$;|1RJ6kH=%vG?&*4KnVF>C!Usq z<2ZSq2SGrEvMjrj@!0fCe9eo^Umk<>3?+E?RJ``sTv_95(d|G zRp}A47EEG(!V68)TqrYwTG%kpSP5w4IF2lSVhqEGqDWK# zA>_nh!~Ayd8OksW(ihUOW?4360tlrvHq4}`Z@OXzToi>WOv&5@s48YsROX5qcABOS z!c;Lcn7OBd$sYiwskfn zh2)5Qu(^>wKO)rn_M!c?--t|+-ZRIq|JWq)?|~PgtpkAZ(_vfy00000_m~;c zNLnB_(lpJo?A#+#KuLg%1ffLsAW0I2LOUgj45TOuyjTRJfRX?i1ffLspe#!Uj6kAN zjD>LFsSuDLlvI*EXqtx46?OgD^9e&3PEx-JJuCnK002ovPDHLkV1muSo{Rth diff --git a/Telegram/Resources/icons/menu/cancel@2x.png b/Telegram/Resources/icons/menu/cancel@2x.png index ae05c193ee193255539304e64ca1c842b6ffa37e..2bb92f3eeb0bc92f0c7bc29eeaa9e5d4fa7da6fb 100644 GIT binary patch delta 797 zcmV+&1LFLF2#^PmfPVt|NkljeN9 z;9%;3(1k)_wOTob@#k?lc0qv{$dNZVnN0TkeVnSx+wHbkESk+`sZ`46^FJRK4IVMl z1wg?Np(En$$q$0*G9Hgr{d_+6dcAZy?al=N46qUrLCT%w-HXI}y;jlDXq3rhylGDa zU?@sQ>Ps;($bULE_xruwZa*Cb`-KQy!a^|oyW_=+3UbwIHCPm{Xy_Ufvag-~o>&?> zi(9RhKav{?5&3(_hFN#I!kGkaeuDJrd_p`3FOeXj$-iNl1e(R}ZjjP-7c6IzWF??( zw`=!Nuh+NRZKu<*cZr2A0Kn`3a)Bu0!rtp_VP(qBK!0*`%s0E;PDBTTfn5Tl^b(W3 z7eUFHxbT|-YPFgul5p*cSQr2SaJR&y(a`nT5F#sd969P+jlKcVW+MbPOT+5aG6x|P?iii0 zh7DN(;JHuB4>%*E1OQI@{Zp$sVU+_ zA4k64hAw;7=Vt`-)X{n4XtXN?UiOhojFHye)45XOLb1mY2R b9TtIq%65F@mmuKU00000NkvXXu0mjfH86tm delta 911 zcmV;A191G12Z0EXfPVvPNkl1j!{u|ka!67T)V(c`c?i?e%kxtm<3fY~$O`M$GfX3x&7=k3}q z1Amr*RBZP`p-`<>%jNRH!2!SU+}+*X-{12)nM~&Md2Hrrj(=#k+wGg1o5f=BE2J?5 z0GI?CO~4&pDwQrSE|$w>NEj9~U|eu?S8etuT*=)uf(Xf*b zTBTCSX0s;j>FMeG{Jh`qlR48Kv%kN;KOT?G+kbd?xV*fq*Xy}lE=Y=zAppQkFG!#Y z;-gt=wHi54-hao($4;lSx3}lQ0t_%N>JAlzF1~gQ&SYEZ27^JdShPdKt+?Q*BoM}o ziS%l2-rnB2-EJ!7wBUlV;fOmV5*DiA;a&nKCFpx=`tQLc(?8D1T*gANa&r#lbjC3xs;N2$@6n zK9x;tF%NAJluoCAuG)r0z>r`72N|H18%7AZAYjdMa&jVQ%9^#_pd^6daOkVZLWGea z!2n)kUtK_}H4`}>;D_(J*=&mC>gwwG`PnyWULGACU0+}OV&W1bLnhMKhZb@%s+)hp1KP-FSF-D7crG7wdaUJcGhmti~`U z$dM2&M8ja-@$s>MrqgLCXf+U&4@+AZ4-%qou}@rKBx#(dATGOg!^iN^<4%nwQ?fSs z1b@UnCRxWIV*0BG#h8cuWF4hR5{;PjKusy*1oJOHHb_jQSJ#u2*Vvz9Tuz2g-w#;h z3Ho3qdE%G*qh@LymuzkR1&oVJVpJt^hj$C_JC~21z;x5&F5@(1RyzGGjH>L5*=n)< lqiyxGur;`y@qf<1ZA`RR91000>D%PDHLkV1hid!kz#C diff --git a/Telegram/Resources/icons/menu/cancel@3x.png b/Telegram/Resources/icons/menu/cancel@3x.png index 151fe55ffc1a52bba307e6b809dccf356f37adc8..3114f1ec0ea4ab90e1d2debd1a8081d485e97d9c 100644 GIT binary patch delta 1119 zcmV-l1fctt4A2RXfPVx!NklyGkTM6o$u5hs{)Q12qr~CX(?11QXvtGX)WI zUqLfLQ!f~ciGjv~FQA}eU?L*2f|@NDiMt=uS{|#bPuKK?)uKAknyUYt^Z%!-tLxH@ zM!aGMVg_OcVg_OcVg|lk26}2@G(0>!F)`6(|%Uf4wijm|$2Xj|zQFO--Gio_fo105Qi&g_O#=8Xq4&Iy!PN zEmVao9G2zOXq0-!1_lP!*4Cz{r+a$bex9D5Zf|dYcdq;Ud+1{Ft8)zw4)*r;It7rB zy}iAqrKQBgiGQiFvfXaq-Q79w%EiUS^71l?&k_tRng9R;>~w;2Lewb0>3U{n=K1;A zBJ}d|va_=@GBV;cQ7SRP5Od2RAqb=xR@p?RS5{Um2K+ocJY;Y$6A5#iq&*W(x$|Wr zezHxgdU$x4oSggwD)9qXIJD#uw1i6!Q#ytf^6czvXn$zP!?X(s4smM*s+7o##=~9tbCpGrKyoaBMkVu-w{X^sslqWZOOLE4oXIH#$jH{>WhSQ5 zFRz;7zJH2ZTJN`N=E`!;&g4LU3-|Z;&(F_ybxQ$b(%09gs3xeKmq1AYdo{64lDCVA zk79-@rmYEnV`C$C%me@|!DFavBeY~vcKyZ@P`cCSfh1mnx3;zvZ8QOpc+8co5n6&F zrhxOCp3k$}HDNsoh08`^xkTfJcPxCj} zw;nt+slg8S!M>os_>^jPc2?_eN?Wj#V1G1+xokmLunWy#w+6UrVQ%IiEZFTgw1v50 zim+g}xX~8op#;K$Jw`%Xm5gcC>x(4_Hjf8B46=cC;neSNP

+KXHi~{d~06!8l3YnK!bFTM0SL8pgd{|CD zO!V3d%$4OjpnxXKt2tb*Lo4ey)~0gZovRQqCS{LaQ({UzV<~SR73`M;^|AAZvRH~4 lh#80(h#80(h#4rJfqz$-c3lSVDC__L002ovPDHLkV1jk!8odAj delta 1448 zcmV;Z1y}me36>0yfPV#mNklBiFt?ldUYj1CFY;0_5YJbAQ{r&yJ!^8FU^~uS} z%gaj!HvfZ6-?5&aoVW*bCz?TLXXnDg!t?WUB9BUx009a>4gNC)hRyu^{Ojv$3A?gy00dTz z$;6H&A7f)ED})?5PVKd-E;oSU0t^jqJ})6>)H>gwd=WNT}y-!=k>A&iO@3KJN@oF6Bh z+J=UP<>h57kAs7Q@$vEc`uez*P(cxOD=g+P8W%I3e1Atr$L{WK(ER1)<;284-S7#RyjPdtsGu z%X$nf;Gz*BkaC}7_y)(--rin!cXwIzy~==NLih%aG-C;&Nf=mPUnl+Z5=)^H6BrVv zA(H|$5Py8HL}aHSzricT9z){2K?X|Y`o{P4>gvjDGrB&hZMnE{^y!mgyg{kVyrhEE z#`KC{l~J_tdx}vJCn4rn@zoMu1ss9cr;ueGrbQDckNzauCKjL06u(z-8v)be+YP`@V>(8X>JpWtE-@7GK8?M(gn*htyp+sjY&&KEZpAS zvKG9*zi-O_@p+j~5I_uJ^I?>-pd<(@1dC%Lac1Q#iZLN$_05z?>=ht_k|3g?na`98$9{7X%m$5_cEn49b31KGFwqn<=+Hcn0253dqf9i#W?H<7CcRN? zlZP%1h#7R0>^A6IsAFPj0FotfFMrBSZWnWsEx*y^Tv2BDx^WSXs3qpk376k6oX-VQ z9LwzzH@@X_Qv%1xql4Q>nQmlaR9u;CBVi+-8-J?t^0`%uZ?4VtOt&@x52hw5Z?5B8 zK957F4oUR?*#j)u9?l6KVcm$7 diff --git a/Telegram/Resources/icons/menu/clear.png b/Telegram/Resources/icons/menu/clear.png index 3d1ac4ba1645a1294cfe4e468d4bd6cdd6d30610..36dba229d8e566e24eb1389f890a1893295ae997 100644 GIT binary patch delta 459 zcmV;+0W|*G1i}Q6fq$$?L_t(I5$#mJufbpxEna9WgulQbkuDlBAtnO}Lx+aNEMe{_ zAts5@B$1eeiGfvOmPkZWKPEOJF%W~_PV(Y=T77wK-uPaJ_TF>PIp6K=_m!glueS-X zEUVM$-e8SDB9XY??;ejwqfSbz+itULT1>TCLW8zsF~~TrSmW^;uN+ z#HYz*GV}Qy`o&^VEEWre0^(RK_Jctv6spx~&1SRRZjVNz)9D0Ruh)x4qv#7_hrvq5_254 z+wEqv89|f-yc#U>`MhG8VVLXnS}K(kt8%bhF2gIGPRk1v)#-G$+pXPhe=jK@27{qq zufq$6fTn4}NG6j2Q>hd|R0V<{V839@JkMhXhr{8+;Y85wc2$XGB<$VcaELB27u*Mf zfz4)zu)ik`PS=oqtU=|mnr{F`T%l>yPp=0*4+RA002ovPDHLkV1kfM B;M4#B delta 484 zcmVK(W zJU$+eMX*f3<#HVkhi0=WlSig26pDVozuj)FRx25i=|v)u%YWq(i^XK}$aIEb*6a0P zFi~6OU zxkjUbxxgKbMt|tY>-EBxKAB7gm3O-xwqrh@cRC%kfUOf|<3^Axm&-!%ZvQ+XE)OAe zfr9tggW>o4v5KhifD^9U?LME+g+hTqNvGHAZ8jUdUQfaz508qbp6zQe7(_IgOp16S z0F!RF+sMvlvnrKJ7&jOUv)ODqooX~1A^y~+X}VM@L0yaId7I64&BI(Ol?p(XWuG!7 z1K2?PBKG@zu~_6du3oQ0C6~)dCcgolPG_}Rg&ZXCwTMdMLT{)@%q$9edF$SThbH-%x${T!a~IcH z=$Z3>=R2Qg{>K>;65?090`UsOE5Nz}ot>R#vpFd#iFG0>et(0(@H={eCaM6YpxoTt zP$-0gy1ToX=At5ZI-RIyXJ_Z%KeDE#CRFqG_Eu93SPPfZfm*Vj87j(?}8r&uYVY;tn4yu2LIjg5^s zIyW~*#{c!6ze~!=$!TtGPEJmKe0+q}0Vi`-R@RT`Rb5>T(>9iKZ*OmUdU|$t_T}Y; z^Iu(Ep)JAQqf{!ng2&c?u;1U`7Z(>nHzy+2XlQ6aywB&0^^4j(73%HnC2Byh9335b zJRZB<4u1zYF~r>#7Z;-qzm0R!7(9YhDiua9EG$5S_bYnAi~$`#qu2HIwJ3FKYb#>5 zwzfpUA^=zySZ$-xC;}B2&dA8Py}d<}!oorU6t!EU(I6K*5t!H1ai74!!9ir$*x2~= ze#hF~-9<*L)%sPQw6wJI^K%UE>gxJxI6q#kR)0h13#71=^m;u%NWg2cSWwNu!GV+q zDr_yt3rA90Tbn?3(p^+k1X~vdwzs#F!{512Nl95*SwU)8Vw83Adc7F3yuAFK?EJCN zjc;#nV*+?~BO@dHxDRhnPY;4&%PuV~{cubA4QI&u`Z}h8&!wd$XaadN!0rW2Dk4Wm zM}K)S(l}w&Ky%J%y1BVAnM}lX0Po2A`}>H2=8*YYDJ+)Z;bC|XoUG&H z>im8`4m~_Pl$4Z6QwdR)s;VlY5rc`vttk)$b6=~~ityi0LjV8( delta 1007 zcmV|Mjo`-yQBf$G&%+`X~1cZu_kLt#7Tf z_TFo)eLXzfk2?bH2# zn;Y_Gd3jlf?_*L-O-+$EFE1|%2?_Y<70AYZ*R}X z$A?MCRqyHPA#XlEKXY?)xpYkZ^z`(%w>NTVVq${H##Q(9^juq8BX2G*FGE5?xQtBw zhK2_62EUb+m48e&u6k5d)ZN`3IkdRA$fe`!&&?d{CW%=hOwS?eOqW#6vmw z`1r`m%3>LiSI)`FnVy~&IY#M+7!M8($`iVXG#ZT+6@L}0tEq|>Z6C?`@3pCZ#)FgyI4ovolxVX5~)Ku)s=jUfc z!elZ92M5Q;$0sHxrlh1`+oI)DYVGds_V@QsPEG=^lp`tAYjkw9QtsRshx6N~YrHNk zEuo`OGk-8UJ4?D(Dph z7&9BF>gsBuy1&2o_V$)CZx6y9;Njtci0bOjSDqO&|aJbYwiM59~9s!?s$ z*|0Vp+PCrX@$2hrWwg-Eb$55`5}Pl*pSCN?S=cTvF3!%*#tu6;IIvo+*jP${d+d&Y dI|BbA@Eg3^F~P=OV*3%aD024hvmUGD!^C#$b>wCyvx$A6y(e)eA9TI;v= z{=PLF8XCe!h=33QAp$}Kga`-`5F#K%;C~c>;^N}9wY48Vet%e7TYnzfSy@?sUq8LQ zy`O}bjg8I4#l+AdH&mSUoetvFcWu>lU$Zstzt)D-C z5-Wi8^mMwb#(y9$FOOw4F)^X3sj0?%M6NqHI9y*}6S0Sf2TxB=wPyta{r&yK3ZSg4 z>@%=RNJwB=ZES4l>guXJF%uJ$!^1-&_VV)b?b|oCX9WT+EiJ?fpuN5QGq4H@3c@2I zV#mkF=H}*VPfSNgXJuuDSOFv@C8<3t5GW}rVOfogjDN_(>cdi=o}Qk&ySu%;J-pxB z+e4;8mxYTWGIw`(US3`(@qZo0^(XA6;Hvk_G~&r>BHr3x7KCNa>1F0NU94`g%|jMfCCUQA7`E zhhoeP=I7_XfBz0W9R5W_M6gO+TwFMW6?3bnr-wDkA7fU5>0ek_7#}}UQ&U;ZN}sNw zjb%$x);0&m?ysz@baZs&LrEl4T3Sj9(Kz#8$RWwK$KvDTd5#$l4h|L<7jaS}1<%gT z!hcH+lajZ>!^7#~*47qbc>otNOG`^qjX-8+XPcRsp(elwdkj}F55x1pKof&?l9U#p zvkVCdp;e=!qlD!FT*Qu!j!3nUkrA>DdwkI?IRVakM2eIQ4-XSo7QpdMuRcIUMTIgf zEi5dM6{Hhn5oK5r*NJ>WR)7Egt?)st*ndG^S63(Qfs+2t$jBgK0E2^rJdYEe{-A#$ z{ZCI%PEJld7s@M!7X$qt*#;;mD3Dj_>-xC3I9794SJ&$umHhVi_eU(r0~8<8(b4i- zMnQ-Mnbe|U_VMwNU#)Z+%FD~i0|3;r!NI}OsgRInlQML+wY5ozDE|Up$m!{6mVX;E zn4h1Y%$8B+vV9uTAe%E~Rx8Uw%=gyU*I8~z&@#W1LqkKXs@&XMS$tB|8kB!1omhvk z_cAjxrPZI3lENy%;lw6rX|*Xv-rL*z(B19os2)X+dzHh(!e$*#pvMsuu53z43A%_ns<KQ0zwl6SVL}Li`3%wnCd3NySWqHFK!|`40U-iH1cV3(5%}jK@E;%) W&q;J(pN#+j002ovPDHLkU;%=zesZkzg z9%htDDN?*lA(x2415G4}@Ft~P9$X(JLJ@MmC2}3N-2cBif4gti+2@>nE-ri8UVLlq zZ++kQTYIhVw$GzS(x0>g(hf*FAnky(1LEBQ12LLzZEbydd4G9vaUn+I`E52gH}CB1 zyuQBP-{1f8cr!P7bticGr2*DIsW@aYKB)YM_zW(6g zAVoDbHHDN)bU;{xlarGvs;jH3pr9a@Npxd-d;33s{(n$lRaI4@L&0Nkb8|CAwXv~b zX=%yBC$6cOm>7x*bbNfgxFGOY`}FD4)zwuBti8RRhfmm)p)fXGav{jNxw(aeg!udW zJ2*HXMLIeItipfs;>Gy*IOTD6cD~~`p-`Qbl~qzw z((v#wwU43U=+N;D2ndjuf*hAJfBN)Eo=2@26@M2LM*^FAe0&V8j9j?sSFc{Vy1IIL zdg4lWd3hmuWq7zD0#tc}+#$ z6BQAzHC!AT=+B-#Gchp{qHlC`w79sqsi_HvQwcw0(x-@Qbf`1>$&)9DnDlI@OCu$3 zZGUY=6c%VxNl6J+5f~UKaG`o^U%!5(YSg0P(@INA5sTGQiC0RsynFXft>r?QJ32b3 z8X@%h`g&bm-RIArHLD1jScju7)K&$2{CCX5!-M0;)q+;k4n{^s$Odr64i66x4i121 zX=w@l7Tltdk&%^^6>f>Tgo}#{{1CSaX@3U-AUD*E;0FflIdPy7Rp<=&NLNH;WF!^U z*49Rcx}=%B4l!4k(*Kr)h%zxTK~ForgZ<5-yHQ3)2GyiZU8K^esHiBa3jqyhUgatc z8F1q9>6+>b4Gq;$ma1j_{ryx?c6PR^71}+ot*xc{*4EaLG-)T2XEpQn6*X1qU4DJv^eQh+Hz ziDZ(A$U{Rznu$`PMd+g+KYq{+meFWOqZuev#0?)j5EX?Q&)eJk=HY$(PfSdde{Ty5 z3m-mw5N-~b86l{|gfG7>PNYAmZRvi4#+K*j=L^Y$5PVSt(B*S;b0}(W%YR(86O@(a;m!*9AcHW~2{ ze>Q~Jjck>IC^hy4~6-iWf;2u1rJ;T+MN**5omqm<;YqZ__a_?O%2*xy4*-fmb3%X k4oEv7?SQlc|LhL@2Va%q+hUHSp#T5?07*qoM6N<$f}4HWwg3PC diff --git a/Telegram/Resources/icons/menu/collapse.png b/Telegram/Resources/icons/menu/collapse.png index 330cedb208073c21809ad6da8253932b647003bc..956c75aa89fee502d703bab620f0b0702a930bee 100644 GIT binary patch delta 293 zcmV+=0owk;1Dykqfqw@{L_t(I5#^Mz3575ahJ9kGSc~8cE?{Hj4sPH8x`AM+pySxM ziH$Q@`F;q58*VP6^vf?;C z&$Fs3*LaDixdbKUEX^gRmQW{^j$@=vI%$NVs0_Lm|>-} r)O7w0Hx9mB|a3 z#bWRVcJ4`<{P(Xk)MdDa=5L+zIjy#@*Z)3-VLT8HlxdoZqA*SKE)JA!+sd*emg~B8 zU8B8*h94BpN|FR!v^t&jMBFnOn1(Z0BPyK2^5Cm9V{$R4c@2l1FsI&2#WXda_5JsoU*F#Jk;&Y@UmeVRBtJ0t$j4m)y@fea0jP1W=Mm5{P6H21+u? z1I3s&n~ls%4Gz8N?^7N?mY$5PSF6=#v#DI`^}1H84F&^c$+nUL)M~ZDFsxK6OxFAT z&UoK-ee(_4?SD2;gXa7Fp6}!>?-w6!S=MYea~y{ZgEpX9EEd^{MCLNahXN@>_6U3F z7vsBJE<2sh^?D^691e%cWK!Jtu2!q)%fvi;y&lP`j488B#l2F&l;p#1w_EBaJ>@&Z zCy04tBemUb=kvK9b2^>Q=d*6fw~n1!Y_PD-4h$Kyt3HKS# z!V0x3okpWkp^2Gf&<6KUxD#VyjLRrs6!;(o{s3+a0EzFai1+{i002ovPDHLkV1jRN B_8b5J delta 495 zcmVjf5}|hIfzCLJ^2ydm*IMgoC^F41#Y+7fu1vpqPA_5B(W@O ze=KMNn%{THvg{B{(1rlvDqu2A^XFY)=oJ#GfMb>kFr*I*y?;RPzJw``V*&(2A7KhBOV=ZkmQ$FITx}Q43u6 zeV?YOpu?w4B7cRD7{MJgWpn^&1DZU~>B`gAtiV;Rf8+(e?+ccBQ50ASUDv6N%l8JF zVHn2DZpsiRbZd7RjRtM5*R_(1b{QRPiOtLu&d=xbiF1J-OQwvjVQiH^jBA|cj^iNn z#5;#+65OhsvM~&_A+|*Bs|5%%C7q9J0m8bG{zlLOglPFtc002ovPDHLkV1m@9;x7OI diff --git a/Telegram/Resources/icons/menu/collapse@3x.png b/Telegram/Resources/icons/menu/collapse@3x.png index c9617e2716183094e0c07c6c4213670f781133e9..1f4936b5d3199d1559f0d5f6cdefc109c45463a0 100644 GIT binary patch delta 718 zcmV;<0x|vV1;YlAfq$(@L_t(&1?`$YuQ5Rs#xM6uh$v9eP^dM&fzVQ@G(Lz{rPoj> z)JhFX-#}=@M<7Hr{=~h{&CQ+2?Ck8!zOUVTHnRn@v&YQ&J!f`icAd93a~K7T0!9I& zfKk9GU=%P4yj+1yCNmz7SF2UK-42C9FYnK@4nXz!dkhAH;D4~K*Xv)d?{6w>?~ajA zCX?lInVFSJrEE4knM_!XT_KT3G@H#_F1Oii>}>q3$Jj%Zo`a?mw`erVLOmP~{REKo z?SidRsW2_>_d7Tx?fZF2m#xugFfbI->9n8T%lp=1qXY(Qbv9yP>TLAD6xm3EsjyK6 zb7Uh7CTF7!CVycg4`#nQ#c&<7)-A}JXxL3XI&RZqtWB> z(EXLy_Vs#wzu&WH$P0*7uh)ykVqSZR$;?HUm^Sbt#D6+@a7}^vcsvq_73a4(^+y3W zL-D_Oig^;_*|8~%=fmNEPe)7t4dU_mVzIbhukwk9UES?=n6do#+tCA1F{c#^U~`xB`{`am0d3z`#kEjRWJ}AP{Eb!0^t;#eY=d!QgML z6$}eh5ZJ6>5IP8KLa-pP*@2N~lYr4?lYhx+{10MmaJN>gwOTFYBne~nTq$Hj9!K7@4b`%h4LOEXVK~1zHe?!d282(+ zh7pL{5>&_yB}`&mHwqX9i~>dhqkvJsC_qMmFOL=|M96=yQ?qYBtC(QgOA}G_y#_L zFXG_jB#1bWH8m91I;Qmbd+WuVE;M2rFje0V`l*1M{_U zf_d4P!RR)AFrtkmjAG*oduwA1bK7{s9Ja&Zz~IRP0LNy1=2B0<%7*MYP7k`uYGa=< z6>^8|D;fKxkAH+(tu~oVy4`NITD6{)B+31LFPF>K+Hem}r&B$;yb8PB?(?c2`XxJ^ z4!yD2a6w%h=^|X}8;-$9T-K(P)JJIp$cZ_aGrx^+7uk-mFzh0-)iPHW%ZJ>HSpMPGrc-0v9oA30Pc-8D{b0TuP z-4ZW>W*$!-^e=U{#0YdZ$g5o}7I{_K;~qEY?8(KBSmzap!YcFlImUU_kP=nK1JWg32Can+d}^pX`q$SDOh#+4@d_r7Z=+^ozung+*es z!eX%H!Eo5y95CKCH;l3EEsU#;0%K_-!uZ*|RwHq`cl)j%<7D$)@n^MR)ggu}`^{>L zWW93AhLyco-^)H@3ILm0_X-u(Vn?FV42-~da-~&LkO)WwBmxoviNJpZ{s6BW$frk| RoNWLA002ovPDHLkV1oPHJ)!^r diff --git a/Telegram/Resources/icons/menu/colors.png b/Telegram/Resources/icons/menu/colors.png index e12e34a07adf2035a8c8f88043811412579e7f07..b4113d0f184c90383d2911145f35161e858aaed3 100644 GIT binary patch delta 656 zcmV;B0&o4r289NYfq!pFL_t(I5!IAENUC8J$J6pNF~LoO1_KcqL=XgBM2(;b7jes;TEoldt2!KD z8XX-Sk*3TSoSd9Yr&GCH&StY89v%jR!NI}7eCcxU)6-L_R3bDS4(IXlvET1&G@9jE zvr#mHa!e-EcYw>~77B%SyS=rw_3b1%Y;SKj8jV~ox4!+ zR;%HfcXxMZ5`XgfJV0-6Z=q0#$z;w%f6TM9v-kJ+$z;-Mwf6S*egeNwYPA{^e8BJb ze|&sgTwKfuzD&E_4qZ4LE*6W>>Gk>s@_|bJHlbI2GnP}(s_7(=DnAeiU zv0AOD+Ua!82gT#@X0s`gND#)bv)L>b=kH;=-EI^fiGM^kHa6yi1OmbH^D|gdsgz)0 z346VsQmG^oXf#?d7zD-Z^-?I5`4qx?dU^_7GMOaI&CSjG`}96p`&WGicI`_C=?1f9S#Rfp-@Nyf&#kl0Y#%x%>MZJxKgQL zi35QE)+!c@kx&pu@h>kg*d47_dwqQksKsJ|pU>yt+}z-TuCA`=bUHZ*iv9h4uzJ1b{{qdtEpN>h3l#tW00{s|MNUMnLSTYc7eY+{ delta 720 zcmV;>0x$iA2E_)Dfq$<_L_t(I5v5d1OKM>h)n2G1PC^nDu|_I|gwQB!)E}^cVh|EJ z5D`HLr_H1qG|I=oQj9Pn5CR7dMR62SC^TpgLFS7{EuZOK_nzxfJ|DNZXK>tmueJBL z&;Hhy!T82AIXO8oG4T!JNQzdgtyC)S@9%oOek5@uI5jo(`hWWR`1p8tclY)6wYj-D zl0F>N>2&ROduwZJW@hI8{=V64qQT+x;Yc(Z&FAwh77G+UpPx#l8jXfVqZytt2vMn2 zXy@SIfCdEu!NbEtyr5t-K)bF;BmyHC45Et5<>~?*>+tXp5cNbNk-_@H9pN;J6bgm< z59IN9<#PGs<701c&*5-@xxKyJIimBsva$lDB$LUVot?M0x6jW{wOZW)|NgSsY`fi# zF~OHeBq+4MzfW)&$H&L5R*NDnEiDxag<`R|yu3{E{(tz8RU(l9e{F4zBv>pKoPdTY zK&e#XcF-COf-03tAp*2-Hk%3Pw~Mh|UtgmZEu6*0#au3z&1U6tIh}xJu{70cbz@_L z4w43!%gtmms73G8!omUyy}Z24&(DL63x%@KX8-uQwJ@D{JdP@UzaK-T0fj<=7M`A- zY&IJ-{eS%Yj0laA2C87iu}5H2*xcOQ?(Qz70GUjdPN#7O_7*}TlY9NEt1Bo7ol`+< z>CMdzGM!E*RSU}n*J`!)W|20=j9$E6FAbcWoFMJ?_7-oC$Ah|;mzS{VlV~Ps;E(3w z;)05rOeW-wQ41dkf%tqr=wJZpN1?&n{G$^8N&W?FC}Yp`-W*T>0000^C>F%t5V1u?Q3-ko76cXB!IKIK zIYbYl9^%Q0Fn&R47e2Aw6ruz$>881*`t8)%80qXzV6`QAO%;l4dNi*Sy@>O z;^pPFzrRoXUw^-T+1c5#=eaFYgq_DKKgbI7Cqe{;E_wUKs<>jTNrKL>hprD|WlM_;#nwrwk(2%L7 z0;Zv%;p*xtdHV9@iyXwz(9pB9Gtx{*NRXqcl&G<>k$-%kKJ@kVK9Pg_`}?r4F!?BIYHBkxGo+uInyRj@E?@t}()|2Ei5eH?a+uI(6+X= z=S1`2!+!@30>sVD&Bet9aWME4rsf?-{1fC?Xwmscx6NU24n?W05>OuE7R$d z%+k_QhGP_P&|2QTd-tT7KtQcwbaWIAiP`1l(SG2pnm`U zO&p8`Z*OmfC>Z|05vk!Q5J*W$iAW^x5j9I@O@B>IC}&a)3=HH{VWhjeyUT-+C5wrP zL1!mq^mCpoqYTU%S9^eOuD=g$O)@9F7jGc&WNG-dOBeSLXvM@(8;T0%Xf z?SJ6lfE+9?Egr;gmX;Q!X1*{cv>#DS*bI4F#al2oHs&~pK$PR-;~WhR{LAV_1V@j; z-dI;xC(=Qq+u7M6mt$jN!pV;|h_^{1jDN6?A3ut0r937kCi29%zP?UQPJWDntsb+9 z9Am}S(b0hpN|2dXS69G!Z1^$`-gH$}6=xfF8ez8;Vc`k}1yV+}#m2^B%ce*42!$(( z2u;SLsj2DE&=5y6F)?9nZ7oAjz;bbML0e)IB5(~-!4(!K9QSjE#&RgCWhe{}4}X9A z_DytpaVLKO94?223gZqG5)#694ABsj z7*J7B5qWyNtRNH1%gZFiij$I(f`1K=9&zVF*NKjf=EH?9Dlr0)SzcZq`9PtFM4g?T zBtnCsYbX|Yj)_F{t;%~Ua!#P=hrI5f-}9P>{UIVEf@4L?5xvBpKYuFh5p4b};>V94 z924?{wPAjKo)b_|P#{9VY47Ohz+a0v=VfJOn5H5HWgp>yR|}4Vh}zm(Wk%7Z**iHo z38yro!KRU&oh=RRMOF{XvP>J)6aE3hx`?vCR)zB{Q|*=cnt|60$j!jNT_d^g2A!$V P00000NkvXXu0mjfv`4T& delta 1482 zcmV;*1vUD;3%LxCfq$b(L_t(o3GG-}DCS)lw+_Y9rym_R=)EbQ*?jtS4s&OUwmq%`SE6o!U|nC;HaPT~m<55K>^ zXY!Mi6Aup$8h`q|4JRk3hldAd7z@K2i;9Y(q2uG@49G@CnhG6PX`AFE-o&TF!cx#G;H>;^!oK{ zS)@3642J*h?QItLvcRg#BO@cpOlD^0^F(QBX#__5d4I4fqwn6mJ32aIHsFVkV(Ng`0hzQaWH1_uP%+1ZElw`<0e*8##&vSKjbSM(Y zVAa&rTwY%0b;riW3JMBHQc_YP!?;L{A`7XJG^v3=#+4|7OA9`K{!EH1D=UG4fee?I zm&fE_Q)J&Y-oJm3;(_TPCH3_5tgWpPHDcoJ+kdyxEWlYk(Y#>dBr1@WZd_M4fRiPN0FzdxhGY~h@g3!Drtli~RI zcp5PKj0ZC(ewhtK4?`n&3X+t*zW(s=F!_XAz|hc8CXv)Y zXn$xZDsIMr+S1F*OA7T=hP@z@#l^)>2Q~Ec^ack934ncsmjaBeZc0iD6-j6$BqYc} z3gs;=Eo4&c6JmmL6JP@a1B%>9NE*b6MZ!`Etv=JoB5iDJkbYTN8EzCF51)E_dkKJ> zi9bX<5^Y>sRLVgG0faCTVB~kLtgQH>UVl+hA@B*Sg8Q0$YG`N>0GJJ=zmbs}Qx^QS_W`^jniDG5= z)Y{rgn4+R0!r-aTXP$|P3DvHNe+luPLh>U^xCvo^jPVUb4}S=d7BK4R>50;o)PDgG zUynSAoOVV=20cJQidcF6zJX7Tjg4d;A$)OhL0wcolHn!C2{w#Whboh}@Mg%#$r01J zxw#3B6%_fS#2BECxhZ5=7U=8OujCERXHZa(82RnnH((Gtf+7Sy)zs9G`pwM^iXpMO z5)u?ZL^nS_Z)H<6{q%J%m5 z^xj}dap{ORH5%T=9fK>J^hHAwe-kX5PGc zBi5|1uO~oucJ|MoKdFn<26s`lVWUZiZy;h4B_#MVM_kw%fo5D>9E~LI#2_mpQM~f^J>LEs9ySR{PVR6~?Sy*N}tRaI3Kq4+Y7oS^ty?1j!esRMZ~#5mGBwh3RE kQ0?X0WT(^Eq-ODO#lD@07*qoM6N<$f~WJ+Hvj+t diff --git a/Telegram/Resources/icons/menu/colors@3x.png b/Telegram/Resources/icons/menu/colors@3x.png index 6329caf06e12006ad6212d3ff488f308c3719175..19641ef3752ccd878dc3649b3894105a6ea38fd3 100644 GIT binary patch delta 2080 zcmV+*2;cYA5{VIzfPV+`NklWvCTf6vwaK*o|UgqM)ECDk26J7TBFwh=~}8 z1)`|fB8Z46Hg+XXc)B?)h-er*-!JuiClR+LM-+ z`lUu7H3F#-h%f@#BJf0J$)7)e=gytGcI{fTX3bx}em#HwJb$vNBx3B*qsPaOAOBUq zJ$v>PDpV+mOpIVk|Ni}zNB@&IZrmtZv}go@Nx_mkckZW8pZ@R7-_(^WR|*#{oD_zJ zHDcJXVcM5BZ{D!Mbj!ty7Yi0F7*=fN<4>G8A#OZ-_AFn%eC)R$KYmCf#M!fF3lu1j z`L+hPpiG%EKYxGz6d#r>S>o{a>C;EI12}W$3_b^!oXN=XHaop(nP$1m@{XN+r*J0M`{f8 z;lqb><;vwoCQ%C}iqXtW)v8rJjT<|5tiT*%|Ni|sbARUa1ZRF@y?XVuxx04lve-0n z;zSLG-o1Nw_Uzd$ESc7YC)!s0w3{+@>Qs$~-oAZ%wrmNFX6+XK?rqelkv%4jMG$W(aph1Ixym5yuU%p%$cj(ZeP%0NJ zSfJULEq_}UialQ7=FOYyMfmpZ+p=ZLhE;az)G6^T;4%)YA{@R%i4qSVJ`|fE`t|D< zPDEN72gbd7_e2P3TUZG(#+NKv^5)H(Vh{vJb_5-ag%&by+_*e>@?_f4k5{*D-O>iV zdi9D44C`3dtXXg0zOCha`SOLoU%!53m~^NaR)2C7e5q2U46m@GO`A3mWOeV}U3+EF zI7wO%L2Nh{W{Cl=R;`+GxZ_oa4jsbD`h(7rCCl~e*9~Wkza(<)+O>-yJbjirb?R_Z zkqD#mpFcmXn?Y^gzJ2;qybzr_b<(2z==bm6SEx|IOF#zNrca;#?b|m$m3Wnr;nX>f zsDC(r{ydqR(Y15u&I~x=VqLm)sp#`0MvNHYVhY;OvSmv{CO1c~UcFeKh$vR9n7#v8 zkj0A^4=UP@Td`t=q1gTR(W6J@%a^yy@$1z=FpF)uGula$OP4PF7jv*b%m4@d=YP+iSFKv*IU7{6w64B=`vw#2k1AKL97Cvu zZr;3E5{lWgXX`F#u4z_|zdT!yCBLLRt`)Uz-P$H7NZ*7B6STyQ8#i*wYesjvarNre z*p{zJ=U%>iDQ0k^6e&_f+Yp7`v}uz_eDdUpXLQ49DHw-1ckUdo5K;8Gc$l0IAAde* z`RmrLbD_dFP=OGknCmBi?Jh8fpqxgS=Z6p2PTl|e_wQOVTQN2jNUBR(E=RDRO_L@~ z(n#o|M~_;zjh`H8*GHuznGm#Aty%)e5Yf1CV{I;XNblag{UjO{QW(iQJXf!u1gD*C zymIAAtrzSM+At1lh!O*C0Ioj$JPYrjL4)93 zym+ymDCozJAM+td9Gwx-gzEYo*|CG*jZ9uJK?v5H_KjgWefqTF6(2}MD6j_6Zepre zudY*9#||QZ+O=z&&;b9tb?asXe%djHFWprgKuG`ynb?aLFSKrG?te^F_HL@<65BDRz8kRXU|zVE7Ax2{DNVXF~vIlQb)PcG(% zk6A>1;vV?Abm<~mA%8}V8s%x9G;Y|iLE|+|Oe8QNID0gPmj~&JFTtW0#Y~+&2E}aw zdlE*7Sh;d#E-Q^p&~?n19XxnY6z|=;*D{I?8#XkeA)*RiMugoVxQHDgRjO2>aH4yu zASCYOK$+;a)RT$#DUu2j!YQ*b!*J<#XzC?v)~qoiT`u}cm47N(1}?^3q(EX8%f@pl zGR*t-?GqRTfxp~Elmp!5R1Jpa#%tEBS&U7$i(@xyBRnr$c8X$w`W|11RyLb?K@ZbSQ5qXN|+K#;so)XzD7cN|oNwW~Fx5OQ5 zp0@-XC7*=EA@XXtyMT1;ZZ370000< KMNUMnLSTaUFAh@x delta 2284 zcmVb;uP<6u|B7?!fLuY()$(5evmu1PcTUK}A7q zY%DD7E)=^9>~2Nu?ymQK?=39HnZ0v&_wKzaeBU1*XJ${%ojElVFJ9c=-?ah>W2|n5 z3>oUwsZ+3E!4Drkynp{b#?qrAE?>TU+qP}{_U+q0|Ns5?@qc6e`t><;=8TH4m@%zX zsnXM@Pc4(=|0hqLlq***W@-d1C_#b*moHzI_DJ~o^XH{Xl?qs7Y}mDL-(Fgx!~B@V zix-cLGC@i?c<`V!X6x3iJ9g}lGr*4?Jt|V9NRU#a%`12A+&_Q*w9R<^`gPKzNfRba zxN6lZd(r|PJb!qAw~V$vf$<+WaG*3`!GZ-A>qLnX;T7d4;JbJ4=Fgu$FxgRMbo%sZ zseQeA^=xs86DQuhd9(ZqeCN)cJbCiiIDaTmv}jSO_v6Qp*@RM8wk5$$;sD>ebt_k{ zToUb%gXhedBbA;uZJMrPvSi72?b;>LfUjS_o;`bZ9e??cm?5k9^5u)vm@w_AS@Pt` z_wCy!F@djKxso+&R!98bJUMytWU1?c0|yKWrA(Rf(4j*TANbiA-m+zjWPjDJUAq8O^uYoHNEf6kz^z-i_Q47g z%4*4qGgh)>N%G@ZyM9u;8#iu9Re)#CoaxUhsMf7pC%M^$5Br?_t9I?$zBzj!#HyP& zZ%RFY3AMOK4_pLli4rAjOBA-&kXX{IS1&;k1+ZALV#>KfHvT<*`t-h~EnmLe(H>>8 zQ-7yUzC}0?wrbT1!DOfu^V_#?$2}Zkxqsu&I7vINF4vZH*em&^p7MjVA}2vA3jtj8FKt0*&983_OyBK-@m^?g$mLn z3q~Is2Vl>hJvvVK8Cn!)&YY2qfOqfSO%4um|Ni}zPYmbJpYJK9#q4J4|hcNH_6duBiPDV z0J(wB{O11s`!=t)Z{H?Kk|dN`U4OcCQ3@6a2Mibx3g6Q_+OJ)^*4D%Vh~u*T>WN`I zT$5xsd-iODW8gsQwnd)Q;i!~r4OGIa4jnppGe%(@^j20UxlEQ4*-xk^IB7VX@* zv*hUsCWtAG26P}~H)+zu6CV{hMT!)9!ZCO5T!U?G+qP9~W7wum8LcTS32yhY){g&pzzOxCPf z^WD35ii|~z78z`7*|Mc#+vm@p!}d&VwusWfx zCQy!}J7K~ExfT{oD$HeCMB1B)*9c%Da zIv>w7{9;slx?y3XWW$CHl>@^w0eT8j1G@I)=?ZhAVxK;JBwFw=6@Q+x@F>B);x}|7 zjAk$ynbez7h~m|vr8ehQMScYazeS4{ZkYST;Z|(wQ7WUMJmII6MrWfJfT@Cy-q#cOA)MNBuy@}^#8t+wkRha@vOHw^<@8?KYxDB znl*aaW{Y$T_m*ws+&(sf%{e^4Y1aE3^t#MDBukboG#f1yiKiUSP?8+OJ#Te<7FVIf z==1cO-@aj`M1-(%B2OOzVrBdV)zLYnojT$vlaDp82*i))SyfSlVr{M-A z31y}3c#a%7B7bvpo?R;08KswD)0%Z~^%Y+%wItUzlPz7kRN@2kj*n)oez$b&*fFcK zU%GT@o&xJsWhS%qW;%-+MD=;4uTl(5G*Qp1$aI0<2> zdxo-Q%PRTNrAwFOS#rF;RZL~b)s&&D7pXmxUP+_aT7UAZ1>;ea%$44Oo)gn&zjp1K zZj3#H%Z+XYDOFcqps;fW4H_hqL$<4(Vc05$dSJrSJpCCdRQMPw$kjvARwFt@Byh8q|??4KemKqe)BPcwfiWivw5 zzm6C&B4w;eAm9cK$!^rO^e2G!t)X_}(~u!UqVA^ssUDV!qd#WM7{yOg;ZB({CHUTD zSZ%x@xP3;*J0@~MJS0g2Z>GG6h{KIrfw&cjTYXVbR;!L?w5+NsSbuCb8;YV(z7sb`3&T*? zbxD$N9A7LJ^Z6XZYMMOHZQC|Y^Of~@Jcgl`%O!{ohXddwNq*~*Wf}0YEWa|E&1N7H zMUkdy0Nd@httLs*Fbv0W8l|sB{z$xOZUayvADT)%uF>3U|-5aTPYV(RLDMvj<8ZZY+i99` z<_e3V7)8v6I0yhGFtNS5-9(!=fm*ZNpWl2wz@d-+%X^6wmXnOn0;-N#=Rp zok0*lN6von2|TEWK%&`A)6g{icsvZlD9f_zy1K3p8(^vHx}qqiX;xK*RH8?~LJ2T~ z31-W(hG9Tf1Y}w6`~DF0g=8GCEDOtZU2ziOo!>o(JP$(heefUjzE{NY|8z|6VLDI^iYde;w6j-Lh7Dq+jg3!h(rK*z_-52^ZYoDr#E&dK?M(r20&a|TmYZr pIFcmcH$VM3lVpx_8y??!3;~oO^El|FzHH*n2&Gd+ndKAL|GN^q~w; z2L6@-AqRMgL?V;Pm>jRy>u$GW(()+}27`q{VLqS3kYB7%xqn<13b{=6-Ej4KeZ5|1 zjp0$L)oR~GzqgazcVF~OCR3}`G8&Cox7}`+%O&nUG%lA*sZ?4l77ucMx{xltUJp(G zd_E_WNr%HB5{dXh=YSH8Mo~2T{od>KazNnOWiS|^fMT&2&(Iv;3~Bc8TCElc1TX@}hR^3iBQ={%458EMrqd~V1Wej^JdSag8f>df ztyUwq$z+24v)QcKY)0MndJQCD6;ng0R7#~%&?XXzYPH($_n9mS@=z#*=95usJ?`I3x>2#uGYJW5u?RNV$0fdBnC)&wj6>( z5xL`&h=j(2p6xyaM|!bXwApN#OooS{-h*HZ=yW=T!{PUEc(Y>r%Xk~)6QKV*pxJDO zW^1unK7X0Ez-qN3dyK&3&Xz;ZKBLiSwOVO38n@e>&*$OB{>~*I>U>;pbUK}9*k4H^ zkqA?jLzIulV<;1THT+9wsAgaR5{G{~_1~?}ztoMSF{T+lI=u t+wE2=mE-YvE2nMB0A+wO@J}-E4e7t~$%vU0_Y434002ovPDHLkV1m~$Lr4Gs delta 540 zcmV+%0^|LM29X7jfPVq|NklZ`xn4*MBox;}QMwFe3l9TCLG& zW9(=krNPli*P| zoK2-tNkWwZ7I%uP7}})3n2-Y1L-HIBho_UO)oP2yVz=9A-?Gllm1JrUx$u3~=nGlWT=Bkuo47WLcc z^?KcCG~hxDfsvodZ-d22>N;o!B%&*k{R4fOaen=NKX$JOVEoQik|}ihh2CD0kabxF etO9>pffY}efL_pGGCRKj0000(N2(k!}fq$GyL_t(&1?^hDOL|chFA*cCjM5^Z7NMe=BrzKLfrCRzOVSiH z1TAerbALjUG_-t&h8morA%YtE0YM;!;t-UANKi|mQE7b-3Af9AK7IGy>&@W2>D=?q zIiGVr=id9C-q+NG7czhhAOpw%GJp&q1F9HkmIBn()ipai+kfBR?{c|XTU!mre0zI4 z`o0X>D>a*+pFcS{DHe-gX0LEKtTf}AU_(PgXJ=<-%lYx!-QBH;Wx~K}!UtRefxzD0 zp51OY=T3XYVljFsOEy!O-|s&-IIvn--$J2~%jI5QUkxT#USnHZTL$gxYvy*lpPrt6 zX42Q!$H&L^_J6j|=WA}3vlZ310KMpkhlg}kx3{-rV`F;8e?~tuGecK(cX!v*)AMJt zuaYQi7^JYz&rh${TgCWyZ*i;&o6Yw4_}JdwUe0)be}8dtv10b4qob3PlfAvY+6|_n zJ);EfU>V2b@$>WZQmMq;l|P)Am>}%}AruN}F$M+(j(?AjX)_TS7Vy;6lomy@W?^B0 z&Jtdu7=U0f`274#+lb3B;Wsxo86e5SwY4>pC_I9g=zV>C%wvEUiwp2Rz`)fUvJcrR z4lOM$+9=;`}+6XX;|w+oQq=b0WJm!6Kp zK-7#Qr?8qZ>J6|k^_+_#V#mbzQ}2x(Q_r~=B7b&Fj6e0>*fI5-iy>mi#Q0P1jU7|Z zxfmjLOpHJE-W(mHf6vmg`lO8@aujxXc}XH(TwD;jF$IqQ6|b(YmY0`TR#xus?>9C! z8nYgf6-Qy<^Y8m2&W$W^OvOenLz^2GrsbruHF7$}?EY{>D5YvT4g*m$zMR4y9v*0< z>3`{IdT35|I2R(z!9gRqS{sh6 delta 910 zcmV;919AMa2!RNYfq!dBL_t(&1?^frODjPXHO~)HC>DM|L=nM81q&5_K++}{8^JOJ z5^U^ZZIMRpv=RS-AgHB98bMM$0;v@Vf+=DnNs*Z7dxs~4>vglt&hG5`;BIwi=FU0y zp1V7and$43M-&hRL;+Di6!?D?2)PV>e0)5SNJOL2>FMdIseh@Fkr79L&(F{KeE#a{ z%F!&d&I=0*2&mKP{BifZy}ixP&zp@^5q)rQ@c8)HeM((HwzszxsSUc}-MhWL?Z)KZ zFjTPtM;Z(d4;KoB<>h6|S&c@cUawmY_3Hfm#_sR$dpY>g9}0yoFE3e%K0ZD!E-sSE zPlNPneLEUSlyhxPS!6I}jbhQr~frze_NsZ<&p8}ly$LrmFhmS*+x@-j0s zV~ERF*qfUhn%M5{uCMfl$grQlqTEgF_4RdVXvmUlc6Rpg@UUDiV|ncQ>lr`*4$y#U z$>l-k%E}52?)?1R5_E5Gui0!;Pfu)M=5jepMz@{ucz>LRxWB*u9r5Vsi28VL1OGdz z+n#hfO#|K8*g$3v9Joo12@|LE8on&?q&y6w!Vu`q{Xxt*z0~lamwd zyl9WM4SyV<(dmqf4l&z<#3m;vDQK}+q)nGLLt|Vv;2tD4F!1F=#mi&E=X8jnF)kZ4 z4-&IM4{%5l3s8J5YN?o(YynP^iUlaX7PVANOSS+fNyP#bUyE8QrX^c|lcZt+imyd2 z71NR}z)4cE0L9m$R;n2L;ej=^c#Tg|O6>0Lu7BNbf5rj>P2+L7CQwQYXT)1uTfhH3 zFaka@R?GRzFK0GWaHRu}jl)kHQmWWb3tA-}NlZnhpX4JI>s<|Y8wclFy?q^zFf_(x z1Lr}-9v>em0Zz|wi;VVY+rVLGag56b+3kHrK;yDetyZJS;1Ax}*_rzjO=PvYy4sB% zdw+w8i3!|U==K;lPESwixuYQ)EXFfo1i0&0sZ{tVF@6*@Sf(0Q>Q9u+B k1w;W+Kok%KR229N@+21&)+dPH00000Ne4wvM6N<$f;0BDK>z>% diff --git a/Telegram/Resources/icons/menu/create_poll.png b/Telegram/Resources/icons/menu/create_poll.png index 7918de74a3afecaf90106150c064928e54590217..de5f8018fb15e4dc349ee0fe2175c52932ca08cf 100644 GIT binary patch delta 396 zcmV;70dxL_1A+vQfPVpONklyc91W5`*!i}4DE)&`mEqsUqp(kkX zO7J~=f%dulS&+d=NAo4o%akt9ju@wgbP!Z3^G^LZS{cwbeLoQGM|YPBE> zg20)ojLf2Dvx&_0daaV=Jj|lw@p!ph_WM0dr_|42>!j#DEyGFd;F~Td;8o2JX0X9y(67>=(au>}x_qQFJ7Mzd1B6m1Q|i z6EY_`{utpwG|OEFVUWBo&+{M%kU7b*??k-kJ9g}-X_{qOkbjR{{x*?i^wdFjDy6!v zL*5<1ty(R0UE?jt#IByUQc+_~#GUYsaHPz6!dulca{qE$JI)xRIF840Y}=O0{@56$ zX__QSmSz6UywVs+DIv`B%w>OUjKVPd#mHQV9rb-*RTWW1Q4GU?>~l0O7jkUi4SC&D V$+`MueED%PDHLkV1ioqf7Jj0 diff --git a/Telegram/Resources/icons/menu/create_poll@2x.png b/Telegram/Resources/icons/menu/create_poll@2x.png index 17e5a7d0f3a63760089b7808586bf7791726553e..99a38d2159da2ad06f1ee7c6efe5fa29340a5d04 100644 GIT binary patch delta 681 zcmV;a0#^O@1f2$ufPVsqNkl3X3xyW2m4qD zSO-`KSO?zefY0Ykr_=9vD9MFt&gb*v@u*g-O6K9jR&zA25`T}!&1N&$GMNk)QBb25 zgwv{2DlESgG#X7T7Bd=+FPVY_Nd*adiW&R;{%W_7PG}5E}R|UcJ(8~7vJ#UGy zjXWL?&nQK8xm>W%q%eg!aIM0TW4GH$7!H`pWCHuW-G6SAc97|tx?Zn?*KW6SI-NYn zAE~g}(cgEw-QZ{@W6=v*uh+=2SS*rWr2L&dgfA(mhH?auX^@PEg@tF%cM5urBBO;B z^s1S(4keSxZns;j)m{aW6X#zYWb9U}1vM24h4FYiolZ$eIhocWuh)wbi#;}!D2rB* z!C*isuYcF861fFq(h9=o&E;|tbXLMhE9iH1h&+XVMThXbU@p9Z;6B2`B4sd=Dk)<= z5-1Rl$x%0(4S2#M#AGs&fYoX}91Z|277Nmj!bPEP^x~pOEKyCv-B^b&}y|}oHv`zdc8jL&rz0TtY^7gmWI%LWEAf2ml4sErs?r`-0gO~UT;31 zm*$Me<9fY5nM?+Q!FIdVI9dv2n^pm_0000t8v6g{Q)UI`qQsAl&h*G3QiIrNucX$Jr`|g{udugcYk;H)YO#I>AbnQ5i-=Z zGE|kz<$nMDMWaz&=PHz3Fc_4og8%#bdm&rxm5ux%J3BjxGEEbqt_Xp`bd~p)$uzUD z>FMdSv$Iqx<@fu)O!Nm8R#sNX8Y>oy-;6XgG*qkAB!`7U!QpUx(;;Ktv>BV2m}qNj zld|dR>KYszWPdXICi_d)-fTAa_xD?^R(jOsauL>OGzJ0z!b-%$!^7j_BO_E|+uPge zA%>-gRHHo}&+Y9kx$1<7jg1Y?JmT>|MnKc%I(@JLZxPQLB?(6IOfAg4`nF)u(lHb?Y z*U`~YCWg@F!Pu(K$`l4Ms@3Y{plKr16(KNVhlhvxd|t|aXJ<#L47c08y}iA+w>L5}qNF1#pPQRII5=2e zU+?JX5P!Ah(ucOk{QUg*__&fboMoZUBOL-Om5SHvRnp`?D=sW7kW*zcnN)K4v-08L zVUh$8aCB6P$6wgV$qDiK{{C(3aK_ZbQX5ZVGX`5N)8Wx3%Lbwd6o0n7ybSHcmzS5#&CLcPX>7t<7(7sK zZEeB9!eX(kuC78?P~${J!|@gd4NcPDgcv@bPc)Lo`n-kNY&JTx&(BYq)gjGW7_(=T z%VixFL#M=B7%VN?3{LJet3#T%Fq|>HOdihIziX^@HV=WRW>$~j~*aQKFn9()l5??aS)q8t%G1P}p401-e0 i5CKF05kLf55rIDu(8bhy$VQm}0000+iB(dc|WtNP#50H~(Z>3`Sv0|Kb;i9?ljp-@mz zDJ`ff7tteh(U z+5Ku@?0V2a{;pjgwiJIh54f}EayhudYi=Ipa+y@D-|tT*6QU}D=;px;m!sC}b^09x z_4z#T9ea?&kKH^F*n=xV+OWS}G1$s!<{6dldNY|myMOgBgu!62+wCqE3ur;s!6~}k z^GDX1RHF;9!95Tj5Hz}Prtx@8PCSrrW{qD_VEmCaCVSH4^Z5uWMF7jam_opWA}cfg z=H}t`dKnmM3**44s^h3FOsL-k#)OuuA~3o9i_eY~6X#6sh(BMkOeRw-7X5y|+&b{j z&Q-Bar++h>&4$C_YPCwGQvA^+dKv?RTERzlCB;A>&}cLyrprIIF|cGZNry`$60~Ys z*%+AH?WVK8TrRX~T3Hy_>2xwJ7&T)h7P;^?J2!`&nZ| z0DuvIPN8XjD7AoJG(^RaGG{41;j2Je^L^3&u;ioP%&oPY% z05Ik(f;NI%*K_s8i4XxGT~G=d;n>?JTF)hJgb!{v`t6BcIok1flq6|=5ik)6M|*g* z%g#K{@ov*Jg&@6r-$%6e33e~zIPSV`{bXSxx^tYOkCsJvy@$hrm5XSa=C9r=`SO33 Y-@t9oV$(wzB>(^b07*qoM6N<$g6q?@q5uE@ delta 350 zcmV-k0ipi#1J(nOfqy_rL_t(I5#5tNYJ^Y_#*N0pUKf*Q3$d`()?;`QkKh5kfOfVX z!9vhhE5X)IVYgNmk>q0^Jj`U>wMZ6{SIErw{bro;k0AV+W141Jmh(J+Tn_@I5Vsb1 z*)mXO+jg3!(=>rm6vgwrx~^T<-72}QV+3@0TOFhjZ_`9=ntz5ZvgZnTUH-aG;yAV} ziz$xdtSuf_RmI}AZMpcH!Ta^xzr!9z$g->`iu;WK03(b@^2_C77zPnZ3IG@pX`{aH z4~K&&Qk|E<0sxFFET9F$Fi4W5sw&}l3JU-*u531ffzOa|JZ0A7Mr>wX*Lfugn6+y) zRQ|w3Z03g(Jy&tHaU4&l)7FoMtziKGMxNc5pO$$^lK8&gb=~=VCN$pt@pufwkmyLI w?^2%U_;58%lVzE>XdOjS5CqGz5bGbOpEbX~;K2$~1ONa407*qoM6N<$f)>}OL;wH) diff --git a/Telegram/Resources/icons/menu/delete@2x.png b/Telegram/Resources/icons/menu/delete@2x.png index 0d9d8c9c259eb2f6adcff34d6d815ba1c41f0366..4c3b41ac6fcda3308d5519b39b84706920a09303 100644 GIT binary patch delta 706 zcmV;z0zLi32Db)~fq$V%L_t(o3GG+AiYh@6b@c`+KDdae_`t+O1Vh1(aZ@vm^f%0m zH8l4VG#A8J#TSU|s;dYh_a3&P?A4i?Zg)-YoeqYYs&h`)RCQ0!I2`t{EAWq1;N{`x zal765d_I**-6%|_)4^bHI-PF(&%G^|%lrNQkI6s?fahi)tAArMlT5z2AInL*W$4s; zz4rNhNU`7V4~IiJSJ=5+u2?L>`1tq;hr>_rU7=7Ab?EhaH>uDqLIMLYITa13B936R zibtc-FOz|gz!RA0mIl|dY&P3yG~)5NtP%(W5{ZQDVeHv#w%hGwzauLSZUtUG zhb~LTe_!FMmdRwWOBahpBoeuLbu17;hX|x}cqZ6Nr6TrwtyVLESh(x;x=?_W1=Qi- zw!I*~y}bz|nM_*B83O1YX};j~U@wOR>iEEZ#gn12uvNs0kmC$wBH1wR^%GD1v< zh$O{;trMchB3(w#FhoR>GK8r*v18BYGgjrp#|Vg^Lj+Q)v+_6`+G3md{eB*K9|c8l zA#xwR_gJ?K94a*x|6a(+)b7b3F%yY~D0J9ICXi`>k2jkQBPv3nP$->F z3;Xr;wcT!8QuF|wPDiW;-7AQCGby57E*JVWnLA9>6GAOP0a0-Zz*Ji%EB^i*vd7TI o7qrSpv?14a+7+-X@E=v+FKR#?p9vmBL;wH)07*qoM6N<$g5OL{sQ>@~ delta 720 zcmV;>0x$iy2E_)Dfq$<_L_t(o3GG!Dh3WNF;!FyWM;~Zy-GRlJ-rZP~fal5|M$-aX8$?6*xQ)2#C`A`+GW_meNoX zIFY5a+rUPnaX1{9z3~tXTbOg*uzP5?+xdJxPWB+a-|zi?ztqGbMFF*wd^?nyq&$5yM= z#F>IWG>s6h69StJUgwJc^NM zV{!v?I0<0|LyjhJO+q+4mdmA}UQSePYN(PBRxmVF4VRjRz^0JN*I=Q&Bq3QTB>IME z8&dKLJ86l8WF@5uP~Q+uizceDla@$GR#Mu_Hbgm7@{0LMOC%&KDed(W!j0N)*Zh9E zo;oCShkt)^LN1pp6bfArsYW1yP;j2SsbNar7j+Yt)l1298p1!u?RG21h(@EAgPHkE z5}3eBE76}ruo#U-!l+y>-?WWDhD2zG!=bht5KKL6`1<-1&pJw_(#OZgcsxFz&sukf z!-1y}sZ>fZzrVk=60-!i+uiT?#jo`H-XVvH*-7!t@USe}Dg6==b^gSzli-;DLdGo12@xy*=@ik+HM0Bh&Tt^n}eLIXM6TlMsX_<1-t@ z{79BdOG_?!0DmSS2zLo_#DrYdyty469l2z{Fb;Q#O~(959yUgCbs8KTtgN(O{bpun z#>U2s@cct#GaMfu&&R-nSv@&9Db*EkadGkM>q}Nn$_Av7K*6#LI_|=`t9v45wd3gy)7^z|hVh1wnKy7Vpsg+ZZ_)$VvS6A-7Yj=0Iqod=;SfB&Yf*gB2gdi7) z)kd?tyeyZOm6a76Tr&<@k${|n!sDNZu=AyCWMoAA0gchoQDI{_aas*cVYt;5-kzQw zu>%_2-GAM}#&Y7c8k)i`FE53cGZ1I-2Gg>fJF}*+tE(#!Xl`!iM;GER#sDE`g@NV7 zX*G&13e6+i!QxjNOb8*! zDX28(*vH4m?d`3I84VV{+F(KmK~6!XDGV~aJb$>siVX5Yn2?3?kqI7UVZ48E9tleB zLrlm*?hHUG3*$!e%JI_v4a|fr^c%jQKR{vJ;DQ>yP9{uy##j%x6)w+)9m@k1-=}0b zV|W?c*4E~jw-p8|e!H7?VLW5Vl^2gS^<;oSWe6q5@@Rl_40L?DGrPhzsM4M>L(gcl zqJJIoz5Ul^-$Hb$bphfJ0IjPd&Mt;E1HRW^mCFk>uX)NefuvlQ{{rM5iBE`DS64ST zH}SCz!yN6##>UCX$%Tc5>gw;WpzuVXzrVj!@12v=!uJXCggv<7_3=Y;p5CLl#n{-` z2woBhK^yQ^$h$BE;9Or{Uk_Uw2zd+9q!lV=YHDhKf4}(hKmw{DS?M>Ae0hAggFIJ0 zb#-<5LskzyDPWb~$>Zvg_4*Rn#^s#b4|| z>_F^5>_CYB-`uj>&?v#QkR3uE))tA6BB)X zeQE^ZAlcd3Q6nv3U>lI_-`(Bq?CjKM1^{3(3MBfFCV1r@Sglr5tE#047{IDFkTfB6 zy`)MG#_8#)9)B#oXJ=FMc@L6?6SNs36uq_Bbs2zSq}t}YW~4w$d6uVS&7D%75e0O088$OM)T#xNP9 z85_F^5>_C_f ztgf#9`ukg1Sqa0K%mRs;7DSU#Av}|lli%OpwZjfh0QfTmYhwf^^0^Z)< z8pSw)K(2%!YRh3aV_=s{Vt9C1^B`lJio}B!iyn};- zYOe=_6g4FDDhwL5cNwat!sr6aqcB<(ltF67hJOH}B~cTS7M(F#2yw>hbLl%{v}WqW zeiqT@F=M1bYsRmfdNk3JXdRbqS1>%^0l>%EPS~8AY8UIf>NRtvF*r3e(iA zb7lHU$MZFgF7H&|<>jS%g#=@4Y%Ddz5PtwF$qXUGK!Uj}MNpidpG%_c?d|qUwz5|S>xo%j`iK5S`eX@7rTV(|Uc-rnBh}?d=VO{?B-hn+Np+Uv16L&ySCf`+TkZ@$rE>*vZKWzDXng_-E`u>_F^5 h>_F^5?7;ugfj=;^Dak;vRk8p8002ovPDHLkV1i4n7`gxe diff --git a/Telegram/Resources/icons/menu/discussion.png b/Telegram/Resources/icons/menu/discussion.png index 2fefee8b9a1ef043073b46df1c0abad543a3b3af..180a17d2bb0a573a1ac8a1a6d000d54f3b4b6d4f 100644 GIT binary patch delta 624 zcmV-$0+0QM2Id8jfqzg*L_t(I5#?0Ri?LA@=JR7xBZZn~8coVZSlCE0van_`jg^{a zhwS7ZK(eq<7P6C-jfE1iKrv>TnkJFV)XXdgB|nQKzNfj3ckueYKVU5Gd!F;0d(Uys zb1#GO`+k>~m*H^u`T4om>rJQAx3{-+I&HVx`FuWYGno5cxqn<9i^Xuza5yZLO7HLQ zv)SzA(stzkLV4PNx%fS*=!@ zh}+v+a43p~qknVV-QBfXEgB}9&DQI68sdP6uW+vDS7p-=!!rBaK<0)iZkM)`cc-G6SAn6tAp7~O7{Kx)M}KR!Mv z{6EX(a-pJ&i;LYri^T%s`ucj8pu^D0%galpQlTRmj9RUR7Hrx{AN1wL6+yoaYDFrQ z;woh_nSUH15D22tC~DtKh9;QJW{=0?P$)#WqobprK~TfZ%}uA%K`nm2|0lI;UtL`x zmClrB)iw1)Mmlkgbi^Yn^<0w!j zlZiwkh@;tT=5jgoasL!}C>;SnFa3TWe=ryfCK3r~hj!0zbN&V9>lB5IWy3ZA0000< KMNUMnLSTZSL5 z?(R@5EB*QT87D<7AY?L3CnqPMS*=#c9~q(EHtQmtPJcf>KHlHogFz<4bZ~Hh87IN~ zF?>EBVr#Y9CGc14_4V~=G-5KDYqmeXa25e>U^ z+;KLW1%JmOL?RJx3Z)^HN_Y9LG5lEMjuV7Jp*6ZG`Tc&FbvoT9NRaUj(MdqNy1JrJ zNV*Uh=zlv4vqGW3=ft1V>-A!>*kCZ6ot@p>+@J!{kIv7}Nu#LMYU~q@MvX=zW?Upx z!oV9{US47kLYh$5xrM`FkH-Vg#a6joE)WRdY2n7>@sMe&)k58(Reg>EJnM?+aabYSJi!085CHw-J!BOumOxZQ z5&aVjq9%SQD)|ti2>PS>2n2!{qF_OzsMsZf-53?@EztyQiS@lj=4E?wZaL@p^5A{k z`*H8yGi%nKJ!hYp+4sQ%)khTpRRsRq2&mnUURzt+&(AL`EPu?w!Qs)PN9N|{#>U1+ zM@I(-2mAZ`OG`^#U0tK2qgPi~_v4pf6%-WI*4B1*cJ`Oh=lJ-zxw+ZX(^CSwBxrDO z@X*kZA~&wDuNA4fySsgSd?c+U0M^yjZD?rVu7_taI5_z9=~Fy7dwY8W0|QVP85ub` zItB&?mX?-|kAIKf+}tpe+uPf!swz!QO@WofsGXdgW@l#^^|x=|%F4=2OiToAakk*Z z>FFu6#i_EkwiYy02EdNLeEC9**yW2CFANP0l^MwBOifK+zI@4i+Su5zw6v5#i4#~@ zSgfzF6W8J4VPs^aI6FD0Cr_T>j1$$|+#Fs>IUwaCEq^Vosi`TV`26`ZLZuupsC9F5 zV?Oou^{J^z%s2%F1>_A_z$Lhz7ywenj~_pXHZ?U>jLAP3Jgk$G6S7Q7N|InH1kK6G zAzI{5yp=-mU;4VbIx_3;@BbzHGrt-d8Z$F9M2_qriWJ#`y;&|UE~0FtfRJFxp--Pa ziLwg~4Sywr>FH@v1`4qK`}S=>Kmb!ceE9I$vu9`l za&vRl)$a(g`*-i&;r&1jVPG0CW-BWzo=VOXZGR1-iqeQTf~&@2%gf93?2%4TQ%U>$ z`EwHDJ1;MfgzoO{thkPijd6J}M*l=6=$v?}yA3e~7Q-0JW9v+a0csH1F_NG`^Y-?p zG0HoGvB;qdVA1mO^3u`KVHgb1KG5|1{G2PtSdK$GJ39p8RYAzt*49Xc_G4mVg2wDX zV1GJ1JWRrokrBjz#*>qiv`L!co1Kd7?QJGhIB02Up?HRehx0&)(CgQ)+uPgGyfPJb zUtV6`)6-L2T+How;^X5xJ3CS8We*DK1}#xvU(a|H4$yW?>VckuBJ^QYdAYQOJ=F4s33c^_m3YxmTb>4Kx~j2i0%G61PgAOgH!hhkH zHpIoFqoad)Q&UqT&7OHZUteFYT;v!xg^Y|0qhEPm$()7%nT9mzUr| zf6Yz7!0GAfDZk2~^rFyiZf-JHE-o&zv$OeY$jmimBzFQNcx(}Kbk;~>Op%zFh$|@y z!s6m0uFR{et6#r<#SInLS#%nxfPen}{=7y9-D*lo%7+gh7>VQo0=u%ZLi>x2jfFk3 zc1TDFuJmlvVg_h1l9Q8pos48}U=R@zLF?gprKP3eBqB+2Jy7y@2ViKy@c%?iOpMgx zqwsvSwzh&!?pEMpWo2b;Z7rHz4-XGKCOj-8bnYKkC_Zv+?=PI6pXbJd#y?o5sHh12 z-u-!nEEPs5E-nr+z)8Y+{P^>O<_oudAwrd26#-QQ{_hd^8~)_V$k%-R1poj507*qo IM6N<$g50*5o&W#< delta 1267 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 P00000NkvXXu0mjfp4q`; delta 2041 zcmV;dSHxaW5nJ#>#a>XbfM^g!MN||O z3mT0`5W$8OMX(@>6-5O>QA4aq?201xF81D%sQG^8bo26VZ*OmR@6JDN|G2!Fd3APn z=DjyBadELHHUqI4h|NH326AQ~PYxI!sB-1XwQJWdQ>IMu;(x`96)TpRnfW>UdHVF} zy?gh*fBzmHv2orTR=#}sPMtdam;E$q)Cgk&sh*XU_2kKu^XJc>K7IP+$&=^KouelZ za@6`ulqfM~%$TD`kN)`a1N|I4yu%eMRgTfa*s)`sJ9l<$kMnPA+_-TI7Az=PvZRIV7cX8sc<_K< z-}Cb2%c4b#R;pBq9fe<>1`QhI&!69dLuzX3@ZrNBKYnb1$i68+WYtK2V(g8_3Pffdk1CZ7Js2dix#(U-!@g^#*G`ph7IGL zIFr%1apQIC)@5X5_%r|Y>(|1C3$5R+GogQ|MvffG3-K3x_3G6@g9hczo7WZhY~q?V zYp!0s+EfasLWK$y+>6j05)u-aIb{_)2mN{SIR93)nCy0yDpmIH->+oRrbCPNddgNB}-oAai2WzBGojR{xy;7`kGF<5!3US%8Wv^YkrW9DZbZIC& z{BYS1_+%B+*|TT+A%?f3TD5ANhf0l}J$pKrI)8QQRK;%DvSrTMxuC39uO6qoREAR< zZ_WwJiWMsoVMt#4_U-dvaXZoFHw~Y<@~{^zTI7V;%9SgnRqP)u2`7xaqhY;BmA-xZ z7P3m5BxZ&U#970zFoe}DeU zOeWcKHEQyWsnmtF!!da9V8xN}iEvwXdW9o-0<+^AJxXW#O$@`?H3$HzR;?_#c82Q8ck!<7R6u3bAT>}ZS~I&{cT51>z< zKDM;rwn37SX|qKZDJ1R|xfwMy1eP0#l@|Dv1{r|=DPct%{xL3kq}OK9$&)AN9=B{QUc6WmpFMllbXTzC5tc!JJzPe$F zZjOL@kuP7qNW=V{0lP-dpMO7JG6J44V}@N~Pw|Kt)FOQM?wz$CYbBo~2`+`S4WD}8 zz=2jYVHhK#zi{D#R0EhxcUPi_x>dmgS)umr+q+^K3UQ%Ag{U1+R_)rgD-<39aJzNu zCQo`~5KRWa^|+f%n@X7>o#c|;d|Oa;@NVUtaho2L#63dazI~ZNDSsE3>rDZlwpz9kJCJ9ey>+yyVnM5aucqOMeYqVL|l zi`yV@y#OCRd?*d8Teq$kTyycjL!UWwCS^%dkOA-Bz1zzb=##9%Rj!nBX(Srl=y3E= z4A-$^N1L}hR3>rBKz}`;jBX8k0Jx@`FkylaVhc1$nEKPHdz!s__xj_|Gho1g<;$0| zkNHN)A2S8if>4M^s*Hyt6>F&tGm6AowQ6O3$WjYIl8ZykRHCa+Dq&QS2PJEYBdK%h zO5`-VhuJ4aj~*>EHcF`5ri$uRZinPHXC*Jky(I<*-qMH>BY&*(nQpBjv7>6;$PTQ4DVy20Z5wMz4f!{D z)f~8M)~vxE<}0W^_7Q??9;`#ft9te7s>f)e_l_Mq*s_V-e4SK^aPpAlCCKHW)D}yO z@^qFQ^_Ogh26BhU0m}XLpK@Oh>QaSAL09B7b14a*Fpx36eu5fmKM4U{3W_v2{~Dn7 zdfa?Yr%jtSacDXT%Ohn$@XAmQQ*v+YRQy*1#UFTaEWAjm7n2j4f!GYhW*{~L-ps)N X7X0$Z3JUFj00000NkvXXu0mjfXn6Ko diff --git a/Telegram/Resources/icons/menu/download.png b/Telegram/Resources/icons/menu/download.png index 449dffea5797324cedd6ff78ee87511a1a4d9964..822e8716b6da357f2b81269a7990ec6fe660b7a3 100644 GIT binary patch delta 244 zcmVqpg?}MPaS&`@SqojL!}rDAB|y&vTE>+k#YU4Q*RhRbvncN;G$*jL|SC zrC`1|fS}x+GG=92CZ)VOv~7#hd;O>;%#FiaDN#pFqGTfXcap3-E5Te2!!YwTsp}f! uNI<;wKm7g17)oi(rEnO;%b-6GZ{P;~l!eVDven1{0000=Ay$Uq3il417I%$$uR%5CzJzRI*OvUZO09d0x#0{{Y_ecUmx*#BkVH_L({bR2?F0VO_C&n=1;|U YyQ88Y=Z?%B01E&B07*qoM6N<$f`15l$p8QV diff --git a/Telegram/Resources/icons/menu/download@2x.png b/Telegram/Resources/icons/menu/download@2x.png index 6e489c2164f083e79d3b5421cf1bbfbfe5385351..e9a78093e4c0162d4c60258c521a3ca9dfd50767 100644 GIT binary patch delta 517 zcmV+g0{Z=w1^fh%fq&*nL_t(o3GJ9YZo)tig~5W7lAl0LL+=XlBP2?=4oBb)^xOdn zE`h{95)w@gfPjJm=aVP0R(6OZubqIhTUfI*^WHu`ufcXIWrlIUIPeM%q}}l>N~_iC zyE_QWV6|)5Tq|cWr)Ecm48k@HiE)DG!7Yu!W;;z zzw92eZF@Kz)@rq|GxXPi00izYXwHwvqvJTI)2Uvs`=|zk0VM{3uS7EtO2B=kN7J8P zvcus3MJ|_{OeT#+;}M;jr;TPHBn7Tkb>m8I#xEVBfi~#}2;A$B zEr4{l+j*K=t$&tK2L(~`)Bs6DjjUZRm$%!kXu4c3?RJ~IPY_8;(nB*4!6tR&QEao> zc$zw$jw*<$r-n9~lhUE`mP)1ddM%o+*Xw9Bl9+(0#5B;RqLPh^#o}tUlC^KQn=hb5 zL$V5j>@2xlE=7uZB>4wwL|>s$SS%K*8m1(J>VGej&wl6U^SNjuV5+%xS`!c4vaD{m zOE8^I@Atbtp<#F}2SWA``-ATYF`g3JKjJ>)y?8d8skd}oF|<)$x_Q!zOF@w5n13?^m0lZe?SC$gKzj5Wbg(^NJ)qY0D(D- zh!N)>2oNa&B3p@s-4Y|U@Jug~cBII#Mtt}d4)u*PxhWgU1k2R`(lCmxR%3I*^~ ztJUN2s86WNP%IX|&KCk*F2@P!Q)IJQK|+BJrvX7a>(yB+NPqPtSg{TT{ZKROkm^aW zVjT+lp=N*9p-@Om`u*c~ttpjChr^-KXe1H|)#U3Hj9?JsAi0iwpu6Ai#sB$aGD#+r z(qyex6I}#S3t)_hE=Z&XgcL;r0E`jo!3?KZ(ChVR) zA)i{U)}(`4G-An$4z>(+t+n&1U1eF79lX zDOM_#%U_pg#Q2S17XNfUgztyb>BJ5gDS~{lSg=(5D+4r_%Vjbdc1FLr-EP8uhoPe z4u^y7!fn}G2CmI8W}sYgDl#UXl^jT#m>hEuS3wgK&q@v?O-znCh^wH9iDxATk|rj{ z9K==7#Kg0b1NrlbS*_Mqt2Lj`d%d2|=QGLBF`Z6>!JxXa$iz^Ha+VF`zf4N4MD(Omsc_zAvsow<;_4q7LkS8wS0LwjOx>2t z<DKC`7pwHtveZ<#PM|o>dG3wOWlm!IpD{5)|Ggl;|*<&2rwh+bwI1 z+X9RdiGK{}NXcX}_+JrgMr#ciz&cdY-Abp^++@_=002xn=??|rnW5tiw*YuZA}Ju5 zOl~$C^{jA+Tat_@GcYjL!O0OMcCbvhk0ZD{p^48fs^zA*K8 zJc5ibg}L2sgZZn~>g96L3euc&2!IShV^2Ih@B$EDb?tV$AhoeDxEc`<5}*Vq0ZM=ppalL-0{;Q=&tShKJD)TF00001gbS9`=KIgSmXLI`sSK*mIAGz)kUmFts^*DR%69!8Mz6s1g zD&diX(ab-^dj)1V)L+8)T(-0}z8B_13$P#fY;0j-2-uBs{ zhjec$b0=H3MBZ3uCCVB6-HTtv*QeidMY*Fee$JD6>y7u%|9o9waq4N2g1`(Pwaqu* zSPFTDS;+JqO*;Lw$V4huPn`48qs0#kGHebzT+Q05mA*bii>>~~kItns{7x675=167 zueB+)n!EdM-`lNWt3A1FRCq#kjJX!hY5B8zak^dd^Usx=Z*J&mKDZ!m{buX)M->=F zXLmbk9DldR>|Bb`isMn;J1%D2S-Z-@a7l5CMx#@?W&Dm#eg44c%{N87S8+HmTEV62 zVrE_Dwe-@w^4ZD0w>7dt%l{L`XE+v3)< z--u1L5DINWEyn|=>+>Xvgt|_Z@mA0r(lOFLxU&Jr7s$C{oY$1 zaxnNto9Ajv_1?SM<|{LESvGHni_-14)BdU+5t diff --git a/Telegram/Resources/icons/menu/edit.png b/Telegram/Resources/icons/menu/edit.png index 04e52a0695ad825537c55273846e608e9efbacd8..b328e4b99e907296766a013472872a7bb4f495b5 100644 GIT binary patch delta 321 zcmV-H0lxmY1Gxi`fqx@OL_t(I5$%#aiiAKAg=bvEL=4PK^aO%n;t5O)Oa#whAcCpj zO$5DzComCn!N3EEi5U5V;%w~}I5I5Ew6oz<)LmWm^{Yo+E}wYjz}K^a`#Vk3wrxw2 zRM+)AOL}5iHp{ZxZ^Us-Q4}fRryeQOG?}L9`##W;Bq3%YWq+P$%d${~=Xt<#U6(-A zuBGq$JkL3fLxFAEMp5)CXr~y4q3ilMj=&NG0n7q{nx?%3I#RF!Syfd51<)rc&<5zD zDE@(h6TPd2i~{=8G=+URev4)iOav5$VYY1xf?zlD3a;$3f6Z3N-UP51=p% zWm#5LmDrbk5IPvG>pEaz48w3VYcKoraDB*%qNpg!vMlSmmSx#A%|pTGdftI=k%Gq5 T_9yR#00000NkvXXu0mjfk9(Bm delta 320 zcmV-G0l)sa1Goc_fqx=NL_t(I5$)5z>P27}2k_%xMn;!lwv%!Z23O!N3|5(#l|dO$ zlzT9mjl!gqq!j1ry!B@DbNt40rl;fmetMqQ`yLdq%Ch{%!ip%0(1>l@VC8vE5X6nXkTOk^Wq(;X<~R;mnx^4@E(+XB zUDx}*o2H2ZzV8F1s_I1^J;n-51TU+qDrC8?3rZZvw-ppXR?{?~BuT}Zuf%1MNzbEi=kTzjbl(y z6vgv=7=|=W3ps)Si<_pYuIt;josV7DhGC53xGW2NSui7P&7ZdJ8vdR5+`t<--`L}w S`i{x~0000l(|zteJ%L{>&5nM|(N>km>IjfTVFkbgFIkYFzx&GQnW=8tOA&XHu`BK2y;A{Mx_n z1V1t!k4v{L$DvQsH|$pU;`okJ1}NW4GIHw|^S|!D;(`8Zf}?^`bqa(TMs% zV}raw$v_~0K>dE7LP)WpG@u#^g%GIM>q!t&U^EQ~MU2612L}4lSQ#Z+wb^V~ zb-7${O@^xVt2mv`a=GkwyPJ>+$QFKV|seCeNj|Cs(gTX+KW;`A% zoCPn_{6BKH_4$18SApN}zu)h0CczU5d|C{L!&1?L5jfqzj+L_t(o3GJ9WuK__6$2}WCA+$aK(d$UW2T&j?L?NN^F(f{M zprVlIXf+Cj!mCk9BuZ~WL~u_sHz#vv_pZHa=A{Y)A@Yn8tC!lR;#sGEMBkI`~7~q-Rkwa!++s;JdBfv-EJR^Mu0+J z)9KXdbaIL)HLWNOA$tN7LsO|#Y&Kh=P(Y~^WnyT`<+4tvBVy+Bd8L^oXoO6I!N6!V zN+te>eGE;z-9~NbnQ5IenGD_an>IrOoBVRQgu`Lc7>!1Q7O1BzCwHGdckwOUQc1hQEy7W9-e|JQsNZJ>(%e*fWcAQ~__0S!1{X(tkiuLXPP zEuGKAM(@d+? z3Z0)rL+iBJZ2kldFhP|xo6SE&^ZdHO0%G>mGwX(AN`KV`bMw)7u}s0@TdfvuTG7)F z1>&v^L~^^`-=l#;{Fk2$WZltdlmN|UGY|m9U<^hZUNjIj9*+~C@p#NY;H`2r5HgiY z5ukp*j|8-#C=CQor_%(e*Xz+7#8#RHqGq#M0@Uqx86d7S1|}HZ;@=dr*&GZ8;WZhr zP$(3O#cGHrJf{MIz+$n$fxL`dE=LrS_~p2#gv;`Jy%H$U1;x(ey!rI|(0o2$E|>6i zN3Yi(kH`Ifzuj)v>oqh^CX-UBluRafyPa?)YKy9Xs(`A%KUd%lGh<^?3sA~+00000 LNkvXXu0mjfqRuQ; diff --git a/Telegram/Resources/icons/menu/edit@3x.png b/Telegram/Resources/icons/menu/edit@3x.png index ef846b4935af5cab8453996a332cda78edaf6129..f95298a9d020ad0489e15a87ba70a0cb7ba5fbc9 100644 GIT binary patch delta 767 zcmVJD)65v@Jk$CkH?ctCf#oL>2!KL9)IE__If7KXmqt&{rNgB zmrJYFvfJ&if1?OzR;$(P_4)<%{k~qWeLkNE8NQN3qtWd7lgTa8!7;O2Rlu&_B zKA$%(d$mYvRK#DCO-|M8_0(b+*UqQXWRp|D1g2XP<9{$Dk@Qe;*kB<^W~s@j6xr_g zyA`M;Y?h*;Y@5x-I%7qs;MMe33rfNoNX4r0W?TQ2T`>_HD@9q}(}-iGpexQm1ySDB zRIAk_Wt9EpOf#yWV-<_VZnql?W(6u3joEBwK`NWg1`l{B*mAkle}g3G3?wTj5C~8z zFmkz^=6{MJ4)Vev#Qhb`J{SzLVA*Vzc5w`$$BN_~3WZp(OeVwOAzdb*f<(jNFbkGS zrTAdxpaOL zK9x%4csxQQ9Prl#V!(ejN~IF(2IUS4!})w>8+gUC)9ExjVtQ<`>Xn+D@T61^4D~Sw z6`^IH=uiMfqu=lA-*Bl(`IGj~r%rY{oy}&mSSDj=c)e*wSji*szq1k`+67NtC?5JkP&QckXnYx8iZm(O9^1k8x&x|NqQ5Z(m>JMIt~V zKq5dQKq5dQKq5dQ@MHx3Jo)|Ce%)%d1_A+-$+TLnuGi~pcYiL<-a?_!Xf*o!^8!`5 zTsE7{;`HVvttu3XbUJ;%-+xfQf0xT;I2?XSEAQS3sB*d7FXf?hI2L^S1#vXcSTiIo{1|kntASzlw{?EU{k1aUbC%NJX&g(uRxnhka8G)>! zdGQCyWPg%&Sip8YkgZ|KgJ zMuQh70~Hu-HX9DB)oR=@d8oi(x7%@8wOZwX$$v%#28Y9e!{E^pHkh1LU~suyIILJK zGQxB^owTl7F!mDP==FMW7(BEvolX~v#d^Jl11tEwh8tFR1ymOEDklzLD?6P|)K}pJ zQ2Bg5wtY%sJKRv*Y&OD4P*VmfDzvd!OgIc~%(>leadV;&-h4C~jmP7#kib{qu{)So z@I8*dPNx%G%I$W$g+c+g3*R%TNg_ZZKq5dQKq5dQKq5dQKqBzY2>b)=lkWe1)m4H3 O0000l_ z uPIsYN8vd55sv$TC`Jmv#p`hEApTHZtUvSq$)Z`=p0000+mRzd9TEiA1pJ%k{L=drZ$1{Stj zc>!y&vG4|#g6{ubV0O$dn0>tJr3jPB{GWf~5Ka5oq4Sf4VQAYnWwvb_hT%L<$|wb( z9LE6}A3+c(i8bwu>Kw<>^@qW}@5{0T4vxlgqyp6-NfL;=u7AT^*R^37s>)~Gk0T+2 zmvvp!G{rK@G8|UqZ)X_ybk1wqDHo?|G;yuA-^8tgt@00%Wuu=ARK#pi@p66+r cX!*gxH|I8&WC@5-761SM07*qoM6N<$f&$#2ng9R* diff --git a/Telegram/Resources/icons/menu/expand@2x.png b/Telegram/Resources/icons/menu/expand@2x.png index 5197da5b552d49909d99d033cf5be894ccec43b0..7ababd7d55042306fc95ef492b76b414d7109492 100644 GIT binary patch delta 470 zcmV;{0V)3U1kD7Hfq%D2L_t(o3GJA%s)H~ThU=wEAHccNRq87Ao!ZG)a1)1)?IZL7 z1a}uF!NE=H;^G6i>HR?n5|enjRnO&;3?-bLob&l7IV9cfbkhoG1+)UR3K;72r_;$a zO`%WQwt1fSeJ>nc#h4@s@+sQm@mM9XFetQ9pbSG#6Vt?GrCUYxQRaH?GV`nT` z5Cmh(x_#GmIfd@``?@LB(HYSD{bpp8ObjTBB5=?%je(#gJrf5+&ol)hW)cEXGRc5A zrZ5a)*`nFDJ)Er9>ov{C_ITHImSs&HR|w z0sccutl)Nge1BFj&|r^ar^{*q&Ie8j&dO}4WgMUlXog}TyceK?45O$i%cPu*0&Nuc z0$d!1QB>X8P>VURnu*+;PBcLHG8q#Ykc^2ENXYaPAnB{)^F4LD-4Nt@y|UlWV=fS3 zyr0;6VbfDK{fIHs?6F^d$u5_R=Xu;M0PoD>@i=AO!cT(tHLH!X4&Lc9lrP!9ukC4? zs^>nR&$29KJ~MyE$fhamhGCq~XKu-uf73Jy8s?@uS^=$qR)9`{Z_s1}#qQ*bBLDyZ M07*qoM6N<$f?QMN0RR91 delta 509 zcmVvgrsoaAFp8o) z&rJbYmTkA&=ksX_ko1G5uIra=tk-MFs=v9u*o@G|^NixLKYx*OezS?RPCXuv)9F-I zRWn$%tmzT4c_1zIbUK~QW{bt5C<^VC_$A*mDg$kljahX(9)lpDTRj;TAav?-xwvGq z0Ab#sQ!be-K+p#B#wC*-$T3qZAeT&Sft)e@0f=SV@AvQv4ju@ru&O}@mDJ|=a=9Fj z$8@(ZV=|fG!+(hZgROxT@^Cl+4j+6r;5|+k+PvqLcbjW;*7(X;z320pWx|`Q0${MU`E`g5wK~hPOw&|_nf6cf`CJ8%p{11sLh99O)p4&P45Y2& zCY>}@nwP>rNZpZ19;hQzFF;+G`T{aB`M!@^?;Kc-uy!WVq5OWoD|@%wu~&BltZ{e3|3y|;`iH4U6UlO$<+ z$d*?~ZECfaQ9T&Y1~k{}wdow}L4iSm&sE?DnRYO+UQh%G00000NkvXXu0mjfdOPL_t(&1?`%#&M83@$3OR8jY1+(knjW=op=BwqEUDP5l`R| zNQ6$JAWE;G(C9@WK~y?XsT4xNz5istOg3wF=lBwtoxNwPF>{kn<*_d8-VKheExms zy4`N+bXs%V%I;UI)jLq%wuM4L=~=VE;c$2t>~uOsqfuRP{~>lPomacvZn0QMJz$Pa zCX>tMB5n0ijma z6%aND7$#mo*neKZ0>UN*3j&)PnDJ~LU}m#4u@#+?`7Y%^!t6cK&3e# zpU=D5f3E%)(e->j7nb(2sI&@Ljx?Li@px>nPb3odpZ+R`!{Jt|HJwgtwVE3B%+=10VF$gluD(7v)AMC=xStK1E`P# ztYm8i;j?h}eS-XGg*eYjK@%EBltNmEG7(0s}dn%`h-Jn|WYFHY33(Y^H)K*$f8r zX8Rc!^?$`5`u^yJOocNAbkS%uL`PQne!q(vQw!1@V1H}n_XO=Byp+wDm4^oynmpL( zBc^kXrBbPSy&jLpUpXUpmJe-f#zEth(Lq ydcAfu@lRHO6<`He0akz&UW`W1CQWE zEUc^q5i6UNS_y)U|M0!<5eQ*jcW3jW$%IKEF*~z6zi)Q4gKniFmna|#hytR3C?E=m z0;0e_74Rtj{eFKknY3E1`~6O_zg#Z!`Fu1Q9gjzfeLgmzdVf3~KknCbI?X3y;;8HO z+8yf8W4qlFhj@qCm$g&OK&y?`V6j+epMU1zw{;lpy1LzNhro!CtY=W-~Mu@memIaeat;bBNl#yV-1- zz4B=df*`7W@riqD5DMGrbgI>ARv+U@pmIK(G$c(7pxBF~^23P*a@&7U{}E2K=gIpb$^K6W@d(5MO0BiL;NkswNA(^ zTzW^CfpLvSXLG9T=)q)c8Pz38JZs+QwRpy{I(4Vila##i0D}syY;3?>**JkYu`vUq zv+)BXvatlCuyF;mvM~lTv+)Kqu;D+)xKaTmEcsp9y*v3YF;_68Ld(WJW6>Nluu(E* zKfv<7sebJHKF*%?dcAtRt{uhmJe-uNR;$|9;y%PFvUqkm-GpIirLv!;vUZW$pxf=H z^Iff0=^Q`gl`doF^SRUMSVPQnjp3vw;xnuLWN1w;W+Kok%K fL;+FY4GR1MoSRPZyS;}400000NkvXXu0mjf(fK-O diff --git a/Telegram/Resources/icons/menu/export.png b/Telegram/Resources/icons/menu/export.png index cc9fdee685b91954d648b85f1f40e05203b95909..81303d4c819dd3115062c0e65d52400cd517be17 100644 GIT binary patch delta 363 zcmV-x0hIpe1LFgbfqzX&L_t(I5o2H&1w$_c7~xLl;o)g(YvbkRg^S=}T)TFyySp1% z0m2|zS=n8?b`fdN<;#~nJw1^P8suzNR#tX)b~ZLP78Vv}W@bi4gva47*U-?YuC9i2 zu`raCmA`-g{vQMU`}gn9pFf?Qoe(``Wo1AmnEF}ZLXRImE`Kd8<>%)II)sUd2|~gd zn>TNUs{}HDvS`L34Epu!*OVz!kX4h!W+GlS&~<2vkwp+L0)})_QW7^e_us#Nf#CuH zU%!4`wQALmA3yy3{N~S}9~2Y>F$)+KvuDq?w6p|^JfBwV>>;E=3HbA99 zLPBTHo(0AR&}2BE8eotCZOYEhMmGh*=j7xR6ciK|78Vs16&Dwml#~<^5rHe^B4UgK+Vp6HQ>EX(`-9+UvfvL2E2ayX8ILEr^@8Ly2#2fhKXT+WwOS+BeR O0000`w}TUd#pSSVNsAwqnhD89}9*@4UD-s_F48`))N3ORFLbLKa9 z&UkS_2PHrWPy&=%Sa>wJdBgL093#UYzl?K zzl?xApkhu43No9`Py*y`x8qnjQ{ktBeSndIaG7}Ags)$8>} zqY(*5eMCUT@pzmQMW(_>1{>Z{tJR8DhNj01{&YATf;>NUAP~UOkoN}%jSP$rx_>Md zdwqRnG-ndrZui^U8wV}kY}9(D3i!+5U2C;kOgBxa4^{Hr&Z@CkEcohi*Yf#1F7H{_ kri)PmlmI0_348~EpDVyHEVVcL!TkXphTm)E$h~)vpfUR8^13B$s4BG9Vd{3`hoa zF<@rVR;x7>3OSul_UP}L+wC?S4!7H_4p+Ti?_uPcOeQXuOMf&Wv)Oz+9*xZB%Xc^& z7EK7aQmJ%4pAE|Ce!utoeN=^3LYx``6b4Uhw0w!^kr4i^2vTAs18*{5dDBj(StJt4 z=ku6{)9LiNDW}WOU%_C|;c%ey(G=v9+OkK><#N4VQz30O+hVbByWN}3#^dqm?y|p3 z>g)BIOeU#>e1ATlI@KUkr!Tgc)Th%)wSPkx3k*tE?+JeN-wy@-P!4M z1i@Swr-pz-8R5l$d@pc@U-rpWu2w6yhQQElHdDg;{r>rU&P_#8^6wOs0@f2V7;VrU>Hkx1aiMNW7^HZYR7 tYZPxF5MWDK+=E0)1|$QLf&XIQ6aHtnJ4OSx*$e;x002ovPDHLkV1ioAIf(!O diff --git a/Telegram/Resources/icons/menu/export@3x.png b/Telegram/Resources/icons/menu/export@3x.png index 518e2d39f242e70e7ef1e98f475fec7f570a38f5..76e573e13808bad3b41d49a8a8e3217ba8e3fc7f 100644 GIT binary patch delta 954 zcmV;r14aC{2(1W^fq$1tL_t(&1?^ZnNGm}UH8K7b3qcWrA_UYz5iJx8!B3GCf~|!} zNE3*KcBT@pwGn{*5gyEj>R!3+pEXLVyq;1PB2_zyt_@8Q$LBo}8R?b#>`W zN4!Dj{MOgk+kb2}a7Iv4{#Qk*BdwmEp0l&F+`#km^Nx-V9ZtkUT3T8zE-rM_VAPz+ zWIjGV-rwI}UteEdUY?$w!r}19$cR#Gx7*Ezvs%TxPsx>S|&dz~>fwHnPyzU_T(yt^4l{tf)J>;94o7L4-Vd$?Ihzo=FAAj0c!WchR z{3;rsQ$Zq9VFiKFKqoX~27+CXP~SXb&CSg^2!O-ksHv$@um3v>TU%Shh8B;C zvy^&)!hhl6VI&esBod>eqmrH%KDCcEH8u71^?}`k(dHU>?O*ZtztSW0(P$L3kPqD3 z+dDBa0ewkH$^86$V`Jm=^fV|UZz*Z)cKhDmUVD2xG?kT=xOm^%+LC%T3%F4PC1+Ww zCi(5{ZE|vwj|!yn{D5r(J6Ot+;MUewP%w7L)qm9$?^c5bl!|qyL&l7OM)4sxH#hUV zZEtT^R8;VV;e>X7f6p3&zK)HJ@jf+ZHa0d`k2+-B;L097FhBg6=;-KZYHEs&GCVx| z`1r_baIX7mRREx^tqq?z>sPDn_xqKA#7r(PFXuVDySrmGD1&`Ok%NPSN)9Ex%o`&0 zNq++H#tI8|4*?8aYU+|uFi&sZN1xA! zC6t{RUdG~qCB(cnC}lQ2K8|}4zMh=s^70bPz0z2->zz&~u6p>|PESvD5EOG&+uz@x zOeWdduqjtpSDPzKec9lW2Nx|^A@=w8y)#}f79o9pXcQqp2oM5<03kpK5CVh%AwUQa c0%k_w7ftSSUIBTa>;M1&07*qoM6N<$f_EOq#{d8T delta 963 zcmV;!13dh#2(}22fq$S$L_t(&1?^eCODjPTJ`+u1p`w7u>FH^DdfEiTZfwQofBXkw~<-R+Hc{H#Zjwg?f5=S`^ngHaJ*5pFcP_ z=-d({nGhfZ2!8=WzK4MnZ)0l3Xo11EaSgX~Bhlh<#R+J{0 z2d*s>6BACS6B!nkLCqR!m#>9GLgMZ1ZKYDdT$#H4{r!zbqpRyvy;v-^yu2)9Hcap6 zwWU}r_VxA2bQ&8QgW0TPG8q}Cj4n-rF=2gu9XY;iW`CP>IM343Qkz0_rc3qyhHJ~v z(2$O1Z4OBdgKu>7+Ja-Yv$NBt_Bzw`9y3-}R&ZlQ%yqe3*gzC`v!>Q`c?RK-O1!(f zOQlkULP1BfpE=ao;9+abq&{YAtDrm?X15)r9itsHguv+N==}UVYD2TYjNb{fe~J~J z2DQqE!++t|*H@$Z*!2YNT%i0|RSoYiv~3@caF_TyA7!L}frSjXxE8dwVi|0o{~q z%jM-|AP^8pR}_XiyPn_$TfKwHb_}AfuC5rr+JC^26v~$p&HCH2zrQbB1Mlb9c8!+X z+uJx=Lc_2*NHR72$YzbX8IZfbzt>3lTKDYiOlTO0h#ab$@shLIEOv&c;G#J*GxPB9 zz!T9vIy&-ty)xla`o_kFM$p%~@FnRQiXznb`1qJ#3lTzSe{XNEOmdSq51bZUTkxX{ z@qa@tc>nm@6jOMHmzNhfdNP^Bk&|fvI?fn&Ne6ovsrnuhl1`^1k;vQI8>3jXA&d(A zrtxhSV=QWnMlHngYPHH6AZ$mYQO!gfbn)dam&-zXK*V|0e8+8I5>pYLhFJHnZ3rF+ zp^VLz4aBZTs&q3WF(V5pYQbaG#-!F>vePGlQcqr5Fi8y l0YZQfAOr{jLg1$%@Ehq`ZB2IW@<9Lq002ovPDHLkV1l~7)$;%V diff --git a/Telegram/Resources/icons/menu/export_theme.png b/Telegram/Resources/icons/menu/export_theme.png new file mode 100644 index 0000000000000000000000000000000000000000..84a40f33e7f4eb44624bc019044a815f7cb0ff73 GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgf%+S-tF~maf z?PSBOmH-h~cVX_gBGQiBf+80WiQd@3K7HX@?jp`fYCP`_cu8M8<;0Yvsxo({M8TE+ z#~YV;8m_PUzUTM5|1}?rDzC}MAK0{}f2q&qKebbGZ`a>cZaWrkxS*fivwQAn<=RZw+_r0&zZDkV@P=3Y5%GG4R;~aZ^)vBaF`$VKX z9C{KKteM!6IK!e()b*$2TE__u5(gdfY}IZr5H|nY>nHZE_h0;l*WXt4J$48S-P-!& z)n}W0&Z1>cQ-ltxB<_!yN*VzY&ZDW z-{ehMmMPKZdwEN)_q+8hn!DDy2W}BE(T{GlU!cJiIqhS8-p_@{4Lv8NM3z19|M`G* ZALI6lhMP~Tb0k55=;`X`vd$@?2>>hLrz`*f literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/export_theme@2x.png b/Telegram/Resources/icons/menu/export_theme@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..845195c2a8773f7ae555ff9e55d7a5de5c4b83f9 GIT binary patch literal 709 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@He?JksWdB)&tCg*pG5wkKoA19hR@zUMOR1A{Wx3maGGp2s`m*6UCA-WnzPB&CgkSz^l7tgq3_Z+~pr zCDEkr-u1zw=GA-kuOBNuq)fe`e{{a0D7*a;3FkOw6JaCaPqP}r|Nft|u*9mjUrCJV z`*JI}ejbNLp7rZqE^wId_AvMr!`3z5pBL$ToUJwMl60)n#Dpl350{*5k55^m zvElH)^OBpY>(BO;I9-1|)zU+4@~$;Yf;81!AK6XuUMjTv{o68Y-RVgk4qcf}F=?*9 z!hu@l`PzNdn4i_{pYOMP`)%K4k9PJOhHFi&vEzU8v*ujd=I_7nPF7_)_0%Y~%am<` zsP)R{3iJKcWAhZAzI6L_>V(O?*o_f7B3vaZE0@SU5Xs+u`)r!<6W^8F4Lyt*L6BGY Z2UGTHqn>#JzB!;I=a=5Xb-k literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/export_theme@3x.png b/Telegram/Resources/icons/menu/export_theme@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..99e5001eec416d3ba207086c8330104fa703f2d5 GIT binary patch literal 1046 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1SD_us|Wxo#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz1|Sip>6gA`6MbbAj}-r(ut7?Q#I zcBZwra-hiZUI}h%?)ViK&*}0iMQ}8UiD|m%=;-|6xb~A}o70=^-@92ZxhN`hC}?!3 z2^?X!GvB@cY);$Zo?>Ik_cJ)Fmz~`C{G%VO%bFf|@dx0;5eGBug z#(6It>Oa4d+?Ckj=i?*NeKh_ocVp^|6-$2W=;>X1{q_E%q)wxkd(QruHf`Fwckf&R z|GP|?ac1Mmt$O-D|2-sCJ}(vW~Cb^y(wbWg@uOJ*1I=sP?)L{m^8_YiF0~}=fv&Xw%xmTPv!dO&!2tNnCWtTIr4JuAoc7_$Rexq7%-3OTo-kK7^ij>~IcL-O`T0Np{Bz+# zK)|C3t%7_U0SrviEz=Zge;m@8^zV{w+Qjx!4c#+U-pOoNI*;B-c>Tf3@U?EQWPrL@ zar4^4uaB(RZj$COH{uNMHop4@kJOp0=ivEat+Uw1JJaaI#LdzM|7UTvHhmTsSlGMz zyp4rLMQQ2N7Ud0Jc5Vr*QQgg1m6hcs=dr=0vOeuG!{hYNT?Laqetk3FFzeN>PyQEE zg>|dhzt5PxQk_M2jruVakAL@tAD@Z*vPl0>o$g`lskSdI?(jDYWF_sHG$jHUA4QVe z-*|?v4O^S)voz@X_3Q8aCEqJI^VP0hn!`BJW8c3Pwv;Hh%g-B5-q;j)>EgwU_wLPG zJY(LxXR?R>{rmUvW8s$Pi^Vp)oSd()`BB1*l6CSX3Xk=4IUYZL3=E`q7j`K*Fi44Y zeRRml%QKVeT{p!gD9HJM^T}I6FV>yuU1AvabW6Mb;e!Vo?|3K8RqXT-e<&@H)&9|c z&f3nD#fuj+GcVjGZ|@Y%yFdKR8*_7WlXYu1TY+-{BT}X~RQ`Z}#yw@7W1;VYvTW00)arc z+wF8ZKA-PfXE2#e-sKvNMz1%DL?ZY5{f}G#=!?DT_4?^_`hO)C0QzF1)oRu6_m#x} z=zkhXs^@aKYPDK07&MtoX0zF1vH1P|a=EMoTCG;Q-JZ|q$K&yQK3^^u`c|ve&1Rzn zjA|pUCYemG*XzUKu-ol8;=y3hXf$rO8=2*DX|-BePowMgYA_fQi9|FSWdpUtCz#D< zT#e0U6Adj+Y=1l+Pp4B2Gn2{i&5Ok%91d&P4-x@lgwyHtgZu#F@i@P>-|us|+=KiD zVi6!l_=_PBhr_|qFg4k1Ri_@% delta 551 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/flip@2x.png b/Telegram/Resources/icons/menu/flip@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..596076d1d45e172ef291ffee29de84b67442704c GIT binary patch literal 947 zcmV;k15EshP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NF9Z5t%R9Fe^SU*T=Q5g3hH8}Jz zPzqXJWQ4ngIG8xpAT(4d_2VP@GuEN!AD|tA~ZTW>hX9IiNtS4(&_Zl(vp-Rtyb&hlW%ATa=7^+!iX)Y0K^kgoIdbE3qm zV~r^m&d~JqbUYq68jaMB1;@w7Y*P$pG8xkK`1pvF5KNU6h`GPgA08f(-*Itq;dDB` zGcrCt{>oH5Lol=1Y;L!EY;26WXf&Gn`FWSirPJxC@(rL?t4pO42-WL#u_Un}#HNh3 zk&XqXOt04)3B4+1Z(# zoNVW$03obv!h-^qmfVC|t(Mp8#p(=)!?|3Jr9!aez1QygUd<0q#JuIskQfiDSB6lB zQ&9mz`}_Mia&c$(#i9m@?d@%Raiy5eW;#<8$ekhFNVQsx3}3BQDGv%1AhfZufvbLZ zcehX|P#zR0uf$(Ae0K^+F}O&Np%P$)h6gA`6MbbHUhz!Kx>;uw;_ z`Znsc_EtxUa!b9P`8p~~0`exNIGc%Wa%f3v{=uBmJoj9a${G)`lw@V4))dD@=iR)N zRJ`oM@^;4Wdw;$1b!OH5>t}Wr>?^M+7F&M*jIr_i&(&$qX5N1McyZk+CItMynswH! zS#{QR4ED#_JUu=0^YiOv>={({9yoiR`~Hbjr#^lEe%+3xVTriiE8e6dT{|ipXPmv7 z&%(}r{P^+q_V(9W`}Xgbmy^49|NiSwbN$;|TSY}gTwGmaU7L8})vISupQ@^< z&6_`e{rdIwH8n4myi@=D`SbH<&wxT(ZzlcOzjLRimX=Z7f@RCvbbFR;^zrdIbMhpo z=FaLZx)qhB zWo#U*uB)e~wo+4o-}OdXQqrPTt4?kC7oPg+7yH?yGr^DDRvNZ*S#w84N0(mvrStM+ zfRCr=&VBoqP3!OLQ&Lj$aFr;ptem;z_U+p`xmw4V9QzZU%FD_&i9UP&+}+LX+_`f% zd=mKQ9zS@{v8t*nGjruLn`O(E<>lwU6fO`|RaF%g6`l3D;mgaHolD*^@RV#4K5*bb zgY;Sp2yy{rdFD3B)&CojHHboS3jM zF z*s)^;a?HJl4msV`ym-P_DygxtvEYk~g0=PR4Vn|$B>Y~yS@`nf$BRH4Pr2|+uV3>0 z%o(1&}cW>P2u#S{@B`zk`*52;>Ghms|kplCJ7cV-l`rK&ZJkkHKM(B|qvyEka zKDJ^~Qd!$?FJHdA@aMzVuTPt=@j1tA-T&%U)`x>r4X(XjxKNSLJhO`Dy2aC{Pme6w zv}qF9?t7{iypK5k&`{*vc>VhIxpQTewr$<&dPBs+ndg?diOHMy?;k%+&CK-Nv3vT- z$_3Mdf`dQq>AGk9R@E$cncU?sWo@EfTpbT5PC7GT!h{2U@u#+{2?*T2dslU@Ak)Rm zmz{x;b5Q26AV+mp*Q<=o%!A1v%WbY6^4Yj?<9yqzPFb68ZYaAL{PytS=H=6-ekqLg zk=B0v4lLq?%WqqY125{)5GI8A)>a{_Rze2svbS6 zFNL-x&1v^$(Fu)sV`CF8{;?`Yd6$azBz|B*&iW_iVE6W?l=3$g`#MS0P_Y0wEQolZ YU&&vtUthW_7gXMOy85}Sb4q9e04!}ifB*mh literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/forward.png b/Telegram/Resources/icons/menu/forward.png index d60f2dee71a6270dc448b5d01525beef0b942fd8..c2c141a05c7f5ae367f4db3a520b21cc983aa9c1 100644 GIT binary patch delta 253 zcmVFQnQSW zjo-a{H;By=6B8rgM@B}*tgNh~M~{B^@Zk$K@a@~TzkmO>wY4D|#DdI$uoo|09336K zd-v|?)2ILb{Tow(hlhu$sp-Xw7cr#}B3@oz|NsBb&CNv!p?0z+Po4}^P*+!nDvZIK zFk!;;=g%>Op#sF30#v?X!-iwWj$t*Zx3?FMThPM@7}8ix0SX!!8C6wPwYRrpRe){~ z&`u!0s?^cZ5vw>vkQq%5n0C*dI|od@XyT*XVHpAd&jxz?ED+&&00000NkvXXu0mjf D_Vaid delta 302 zcmV+}0nz^T0;L0xfPVoGNklFEI#{rve8=nMS7 z*47qo3c7`smX<(Me*E~ca^=c<_wE4=f-8kHfG$l=PX6`lmw&vx{HIT!;NmEZ8#ive ze*IcOK>gsy->{+-VoWTNT5oBa!WB^mc)2C0dszfp9 z#fuj}=Kx8pN++K^dxljUyC4@A7j}tJ(Lodf02#5D*b{wu=Kufz07*qoM6N<$f&t=< Ab^rhX diff --git a/Telegram/Resources/icons/menu/forward@2x.png b/Telegram/Resources/icons/menu/forward@2x.png index 70ac7a0ca79ce1332a1dfcbc17c3f20b5d4e1f95..ad8b12b8d5a80dcb4a60a437c81af881247e8b72 100644 GIT binary patch delta 463 zcmV;=0WkiA1;zxBfq$?`L_t(o3GJ1?io!q;#yvd^c2+_J3$fA82e3>Eg9>Q{3$+s4 zlxkzC-CzLc&CGW;yHx* zf8bNQ-Dd3NgOLlTDwRsB)v8vjxm*sm9u_bnnM@{?N`c^bJQfNC-}f0}ehQXbEEaIr z;m`cwtm`_zB}1XADqg-1a$tE71o?cP(T!8OI@bys!XH!(C-GpQTa> z9_RD0pxG{ z^n!cIBg*ghMvEw6 zltJZc6r$kqc-HGR6QpSxf+2w1O%3$UX0uGqcDoG*gMw*BrF*J@S(QqK2^tQEMxzDK zt*Mdy+(Mxcn=_lu1OufdP}A*pGnouS4F-c;F1Oiiq<^HZhcZEYH|=&i!$zk7MNzD& zF%Wb*!&F`<6fAhdM#vm8B|-?suN0>n|EW0?pR`&n25z_8utV`gKt4ned~?la)07Sl zmMs|^>14ul87tkm)Bq*pvM1z6^osWcyV9!Q&b~0wiT|3OON8`-B=broj{qN1p9p2vX zgASkr=m0u^4xj_*06KsUpabXtI`BUokjZ2^o$l4x-EQ}Ky?;KPPUUi0p-{XIUccW5 zs`IDWY`zZLa5((r`uKhwwqP)LJRV<@EgFp?+Y{bgaNVA8(Lge;8?M`5bKrmN$$Gsm zl}ZWMKt!0wohBBG9S(=b-Fx3aann>SP*KvJ0K&#{|@#yP`!cc*(P$)!EK@f>Vu8Sqk5R3{GmP#cGY&M&b9|f+`2}uRw zCX)#TRwxv%$|Xz?mlHT=v@nA4G-^btx zVlWt<58yk+Hk++dskGZ|pU?MQ4z{BM=m0u^4lAGo=m0u^4xj_*06KsUpabXtIv}tE Y@8$pYc&zZcjsO4v07*qoM6N<$g5v2>*#H0l delta 632 zcmV-;0*C#l2JQurfqz&@L_t(&1?^eAt^q+5<_b}uK_n6#g%=QwXFw?$5*;(>!v6-E7&hGbpXU^>Gj>CZi3P1rU00p1` z6o3Ly017|>C;$bx3S_g{$z(DfkMsFF*YT~4@p$}rJbqt~%YWrktJU5LJ{xSIP`I)B zG;ZdMeHyn)r9y-7GxJ8J1#awmwXFqtvu$d)z>qhtJhn9=Z?;Vh7ud_ZRjXBQ(67-c z;w0kZ_xlrxL^K+WL?SMiOC&_ZCzHt(i$$mNj`Mszr_*Wr8W0JW_wjnY^?JSE?;DGB z^WsQRdo&u!BY*xgl2j~}N~_gM5qi#T4~N4)4vGh+KA*4C>2RK{)TD}7I2@kMW=f&+ zZ!R(v??w5L5%z`K?H&vURMSr`yWOtW>&@r$&1OUO{bZHCv~KcfHk(g!ZnxV;qv7#* zq|vhiUrzVb$?}))PbQP6)5%P1I-SO1G5I^PBduda7=OCmu9?+xxeNw_Y;5utOId|N zAu1k&7=81mQYm@t>_|&l5sY%VY_Ot6yWM7ElebvSijcNiEiDI|g9WnhsOjTse7QeVv z5VOUmgmDUD=8S3EMp8kHN|!eN=sTYdZ5w}zh{;T&0x@3#K5yv)V%Hb6kvkfeM*Hm> zwCcV6W23W*6|hc$Xm+MI51n;_z_XzM6o3Ly017|>C;$bZ02F`%Pyh;OP~ZoO1P2mU SWZIhm0000-W8Vf4!vf=-DxFS))$8?l?ArihSYRa87d=!e6~O6qqEHk?r_)IoyUAq24$b#v zS*=!tBqk%mYa$?Cxm<3sSWG69@p$ZZyJNA~YPCXB`u+a=vT$UvSXfWsF_F<|%;)pf zYSrOzbi3VPFn?$^n>88@UIf)tDixH2HgC6EnMC1m7@xmfE+3D_Ua!|~x1|P`%au$f zL!pqAd|uJvaKM35sSE@Hg+ifLt4TdJn+?3r=aZ6z#Rsa>>Fjp9Y&Kgel~6yXPAX`% zTA55n$}oQH5vCDROvi9I+-x?*ViEmauh+;vola-78D~461C)TFP^;B^Y%mxY5{U%sWC4lE2=TvN+FK&}jd(mB k46$rEe}5ygmXAR310I0QT1U3boB#j-07*qoM6N<$f>6rrTL1t6 delta 505 zcmVlqfq&XbL_t(I5#3Zj=s{5w_IOgV$-p2+`5PIT3GB!k36`F*de+jT>JW%>PXz1unG-tRl-edpe*Q2g5=&_7eF)lR3= zWHQmndt<#`kH_Q7OTP~Lm8D2Y9t2Lj` z@ArGV-F~mj=kuYIR4Vlv^?U^o0KHx>mX-L7MkD6WYoV+JLS&VRzA{9PMWfM3k`xYy zMNw?ETJ3h*U@&B}*>pN>v)Pi#q*5v8o=&F_l*RHyg+c+CNF*{C3@Vk1$Kx3ehlxa@ zTCGN-(O4{o&VO95SC)d4^0`$06H&ku(K8|O9B>2$l@ z4m%o+#_4pb)oSc+*xhco-|v@7B`(fawB2qU4u>EJXsy|7hAz!!lf?uA0aS#l*&uA5 zsMF~LgTZpS3~9g!X*fWy*ZWALVzG!*kM2O7dcB^>WO6JP%kg+ztybvNVzGG2a!-aH z;ecYM$)S{1tEDdfl-SfDE(?@@ZL`^6#@!*ym?1N@VIU20sX<%$dJ&T&dyS;pV*O zJ@4~8J@0uxZgo2C(K4WAK+8aCGoV+XHyVv)Wo6mf*$OdV?SHztxj8#KdwzcY+CY=Z zG&MDa!T)~Y0W82lk*ucT;^IIc@C!;lK!O59@tWjQrq}B|9#2zK6NQFCp>Q}1r1+8F z@BqBDw6vn4g2rxbZMC$t2*7)Ldl7->_V%{5we=gU!XbbKII)0E5WlvzMxld)gM!c> zbPo*;5ew)9Fn_^dkU|qquwZb~-2f*R(8&fFWbKTM4DwuGU(32wY%)00F}Pe1ccjWN zCQqE7pI=>FZ8n=PE-nrZ4kD2VkHzw-t*t#eI=Z{NBWFQD0TvVoz__})Iz2s=dXloE z(J0MsR#p}dz$P|1Ir;STL|u5lzP>IkEfp3PQq1)9G=H3s2xagL4-aE6=3q9uySphK z;N%1yvm`bW3YwdnV^FDqlu!}u?d_4jyu2K^J3BklFtT4>UhH{HW8XFs(PA7ow z@9zf&2CzWd+S<0ax8bo^EVPB<)FUP`GBY!&iAcoIgLE!0FOy&4Ev})Cjt&~Xva&Ke zI}7{#{C|9Nb8}*1qNb*1cXw9-9lLz|!d8e!msn6`WhFsuY-}*r)8h^NTb#+M6>gsAwPft}<74ifpPbd>h z4Y%7Ji^bqUhWviNPz@r*f{u@miNk8O&dkg_JUqFGq)-`|f@j4wBReSK)Iudl~TA&&}z2ncJwp`oFqq=Z(S zln={Ip(*WxtsqET)KV;**m$HKwsG{b4MWzHb}8H9qE;TSdaqm%PEg{=$;nZji~$*( z>9|WSi0@GC?d=?-y1@rF(|t;j^3R~R3r3#w`EwtN5Qi&R3O}W#*?G59_-BKB%HBok vblB_gQ00000NkvXXu0mjf74p;* delta 1086 zcmV-E1i|~i2(Jl{fPVxTNklQu27ha>z4rRPf33CG z{`YZma{L?-a75rgi@-O-_YDmV&CAP+jEwa2^D{KCM|pE|vwyR*GdMVSa&n^gDfB)U&A0Pk(I9r@BJvusSG7~HJfKxbGr3{pto101b^73+ie*XCQ*w!0-YA!4+ zEF~o+Fffp-Yiep*T3QS|!A@if#Djx_4UGPf3eLyI#uzJrqGSymmzI{&;^N}MR5rv0 z1d>2RKnp^ant#Hcq86DtKR*{1CJBI;o13F^0ga)Bkl5j7)Q#a=2_OM&MaXc?*DEa% z`g&|bL{~%Ydu2#SNK#T#TwI)wkI(-8{_N~5p27^hBr`J;MY_DaOr?v9OIli*vN;|f zA15Xz?(XiyLR&(6dpm0$f?`)vQgU^5#aTXIUS7JpyMF@$0%%!LQ9(UuQM0Si142|(RD66qHOlkh;X%x0jvTBWnnShlkVq(a{kFcX#)Mgal7d&$qX?wY4=Zp~l9>*Vk9B-P_yi z?CgAgezw6_Lr4^d@PZGktgI}0gtD-(5b3i4P=8fbCC{Qe4-E~;8b#LZvfJBRF7WpD zrm(TGA>P={&8?uIK=G&y(ICK^zs=1}v;)OJ8EOb^Z*Ox!L_`Dy>@Sc*FW`{dUU4c9 zaZVx2{Kdw`iqy+CvaBJrzP?UtY;|!aqi%|dil|>%S&`k@FKcS3zrTNLYb!cB8ri{a zZ+~rVMa$05&reNF1vU~PcV7G1z=MVmf>BmhHatA+<>iHgsjjY0My;)_WeCxwsHcEW zJPuKUAT2M^%9@m6{q*!S&VljqaZ$@q?(Xg)PEAcs1nBDOIz2r-JUr~{>x1Ut;Gnm+ z7cbM+)+Vo_vF)cOLR^ggfvxW0;ekU6jei?SJUcs+{Z39!;*%WMI7F#Ok)e>aT}pOB z`IiXM6dw=hgzsHYgYB(MeS!@<=u@V^m_4)*!VQ;T2)@~<3Xp(?-a-iXZQ3O#Co5li zX7B?9u8Z_6psj%9iz04urgDPwk1mRT=PHdP1O){#9v@z%G5s(6*e<>uz%G?nj^V%ARK_x`Z56U?#P5dlX8{{0C208CG|Wc;|I0{{R307*qoM6N<$ Eg0N^0xc~qF diff --git a/Telegram/Resources/icons/menu/gif@3x.png b/Telegram/Resources/icons/menu/gif@3x.png index 7ac35154b0cbe64b9ba3e9f9c65d05b4327787b4..eccd873f1e862cd8c492e98b4b6739de80cb38df 100644 GIT binary patch delta 1446 zcmV;X1zGx>43!L!fq#EVL_t(&1?^hdD|TBLH;;u9ag;GKPbrk?f@3O@GUN{sGTlf~ zgi9`P!5_fgL86c;iZaVQ910gC^OWIm&hOY?&spugy=TAs^}U8~uZy?ede&Oc`aREj z*ILiB_tw!-isAvq1BwR}4=5f`JfL_$@qpriU(5r#673BN3V%vVOA8DPw70i6F)@)i z>b<(%-`^h|9xg5}c6D_vEG)c_S}!lJ{{H^IKTQD{P}0=4l$4a~>+4Tr)DI${1Y+`S zi;RqXe0=_eJ zUETi(W7oO6yMN!_-m1r;va*t0tDT)4)gDq$yR6eGJia(L{Ho>YW}+5+Ztw|;hLD5 zng#>}`1<<#`S}6=`C5jDhc7QLd7Aa~^kQRUAsiYSdU<(aTdl0DqN1XVjEqY zB_!G3-+wnWG^8OQLrnmnN=^R{q!`xP+R9EK#49T+Ha0fgWVW`p&(F_X9{@W$J5FwF zY`0$>Z}=jV@%jNtFu+uOUlyUVs}4a+f%&CF+JW}cp& zgnxAZcr8M?)+BNa^YHK>emIK>YYq|;5?ozfSv?aI6Y|zvj$t^XX>K-w&C1HEs;Z*Q z4H<4vPfu-a?dj<$^;Zpqi6eGta&mHCU!UrM!d98by-*P(Wo2cao}P$5xB}nfT*=JL z6zwcgh!|I1<}Syuv$Hdz#oj`lot-#2sDFtAiHV6kiCR^JXl-q6Y7OB!%Q0+YV}oYG z%}cnht`4DwzrTNdeLV@)db*mLn)(}4aH-&N&Dz=;X_F4*>@n7`h=>T>*Yw;9Q6h@I zzCJNfaXV8V0@#h%nN-yT$XPKqz(HV+IH;W*GimtZUi(mz94A=8@r1B}(Ee#!EC1uz%5j4+lIl zJgP)b+%R7H7#$r=13nzY#Kf>1cvRUYar`}B{K3{Q@v63>qC$LGbaZszYWTJ<*I_Vn z@~`_j#9IsYL;gKKVBw5IiuDygIeK%C@s^VNNDRMtQ6eR|;0@QXijTyQ0pRnn_xwmq zLr%(Y#RG~56b~pKP&}Y`Kp*jd;sM12pUngR0OxTMy)*vyp#T5?07*qoM6N<$f{tdn ACIA2c delta 1453 zcmV;e1ycHz44e#*fq#ZcL_t(&1?^hPE45t|Kc8C&xlE*7GH?w8H*aQss~gLs2)%~pn5>{fQcUXN3VWjVt-;`VPR}+tdEb6tE;PC zdGiT8JUm=nT&%6F4G#~mtgIM6QCwWy($dnuR`~-kz%$0Snwpxow>PUa>Jt>;0i-h9 zpkU1=@z`|PCJ|$72in=$3C?(ZeZ9TC6`0@I^z!m@aBvW2e1CsWN=jN?T^0Be&E@4~ z-X);>`ud`yqkpvrl~6V(3jhEEU<7!GH~rHh2MTJHm6iI{zE=W}1dxEO2SRIWE3X6h z=uxmxx3F%2tp~{L>@05>mR^s7g}P&6VtAZ@tp~`#!2v0}yu4UEu5`f#Fu)_IfGtSc z2yMQ$Kn_GE6a=iKDWqr~HbW>HW+k{yhoKr~x(~m1gnu8qVq)E7gj@an{lmk%VDKgh^x)v2 zlamtp($e@jfadu4`1<-fBqYSc!-KjqGczkH zD!RM7!Lhfux3#sUE@x+FMq^cZ6`UQfuC7Ro5r6Q==;)}aRja%k+}zwQFE4q&PE1UA zdwVkkD08r35E3LXHa5n(kTZx0VtsvGp3i#a|K*`7OZTa%sbmIbJv=B! z1b=;ge%{j3A~3(Xsm!pTpdcRK>FFuoG@W*LcP}U?;KxBgZf1niTLm)2z%9!EDfHw1-< z-Q8W&4Z~=X*ERA`m1V`p$4A~1^!&x6Mt^d*ASQ!@gLxI>Xp{s>6_v#pHdsPJ0?py) z=SORjmzP&mRD{AWFfcGbKc8e!7HXf{saGJ7bx^DcOkCC*VVE$8o?5Y~sfo53h~na6 zQD37$u<DKWJ!*a@p?@sK z=I7`6TW;9U*4D=7#;mNY+S*z&V0(L8`w33HW+jxx7%Fj`IJ&yJ2os7!ygkF!IkF;l z9p!f>(9zLBk`^Z9H!i^0*x0}fK8keFd_9Hy$-k6ZTwG*!>f#&X1$n5-wj$=k`7$>* zx4*w%e(s^6p}M*{l6ii9#^alscz<>?8hk$E;Rr`EUrflmfu9UHeP?HfKR#mVU^Xgx z;lReU($mvX93kXj6|PBWD4ZCO455hX8BYu1>m>|_`g~uB(K%Am5me#F%aPs7gEDENBToHGs)~ z)+Z5T!Xo~_4>1J`)u!qJ)g}X~2UHKJ9#B1?dO-Dnv6z?w)C>H+QXzy6k%Weo$}czRv?or`@%=4OXwb;GY}psr z0@*)q8;oy#xH4yoUQwjjAD!!^mFlGo46~oloFzW%$G-dD_a;hQHVOQ{z>xKM+jPsm z$8nR`4jx^zNJHlMO-{WHA6Bh;A#(1IwYvHThR^-^UQtW9t3ZL}>FVdQ&MBb@0E7da AvH$=8 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/import_theme@2x.png b/Telegram/Resources/icons/menu/import_theme@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..575e1e4395fcafa289bce91fab886de67fcb9c2b GIT binary patch literal 752 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@HeS`0Z@g_S-)sCDMu#8a__;*k!q7LwxL}-+%Yr zeyiZ6HhJ>NB{6#19-NE}Y!b6wE?upVtPK_5JeyX$|9-NHQ0K>rn3W+a-Dee87$oX~ zJhm`0%@*rE`nD{4&H2YAR-vmySLAxPO`dRoK}~hTr*$r^PKlduc2qt8yfbX|Ojg6A znu`uF?4HE(=FIcYufIlxq#pkEyEZYoqxZZB!-fWK?H3m3S6}sdu_JE1S@VSDw;cmd zIBU#4>*eb-p+axEx076ljpNmNCgYhrPjj;hw7gbuigqrH&@r3qm%lxF_0^yUmtKBJ z+9)u~V20L#07nkpCtNeCJ3cF&>Ty#pKhi!u`p0y`d2z=BIQ$*5_^6jHf#N>F`^cdT{gFFv2a#rqGIrrrJhd-^F_}ZH@9JHo#trDK(HK{sz+WaLB z`}!ty$nvgrI&N=nYMFD@Z+Ww!4Bzw5KWDE`6AsF6R_JW z8?(ei{N&y^|8;ZaBPTd~4LNHb8J+u~a#D0qZ%OZ_J9i$hQ+#_x_5u+8IB)fVy=mY3 U1jFM~_kmKIr>mdKI;Vst0PLeSK>z>% literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/import_theme@3x.png b/Telegram/Resources/icons/menu/import_theme@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2169f43c3556e9dbbf40dfc66b58c723d8ceb514 GIT binary patch literal 987 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1SD_us|Wxo#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz1|Sip>6gA`6MbbAj}?&|5{7?Q#I zHfncPQlLm_TjLLxj!d^LAH{Vp&2(5*+o;dFn@DZ)uPE?F-!vBt&+5cz--`=muY+*rm|+q{LTo zFDIT9zMRbWN~aY~fuDyF@`Pvs>)R60c?`fGJt6D z`)$4{vQ^P_yhC4?VoxEFHE8C{JWqJAJx%XP({s`(karn!K&ERvEcGI{W1 z$b63Vo^^hos)n7dZKv0nWR>|1TFz@vKh4^H`&m^_@Djz!`R-Qln)6m)HM-u$vi$N& z)9|>qU+Z?h`Gpf0PBhUBGhYtxC ze*O4i;c@%s&B(Q3%AOn>jx4j%-4eYvjE(7@`W5b}M(oXu6Sb#$d6_z0`ug?jdSFD} z2;;ig7uDPr)O+}&v!VYU0r?;ZpquH#SZPg*Q$(&c?V`Ep|pS$8!F{9McB*Rs*{l`USv#&ZN zCoj**aX)=U*lM#3XKoXr{dSG+jEfTGYK-ld1^@ZAci+BWf9r0|^jlu>Z0^~#Ey=kJ zeLt=WgzAcQd#D)AKfgBj$&UT|m-{ogb2=PI@?;5L8Pcc3>3eZjMvW)K?R)p`y_wQp zHh;#{SJ^%$FaP|J`ER>p=T6S{!|~g%qr>$L;LG!mpb?fijk-tDnm{r-UW|r@X0e literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/info.png b/Telegram/Resources/icons/menu/info.png index 6f8030d109a19f9c33f19f89ab984c5b2a3ae956..7753fe9f47857d4db1e00ec273fbc0b3be01019d 100644 GIT binary patch delta 380 zcmV-?0fYXK1oQ)tfqz~}L_t(I5#^LIZi7G&MV*L}iV}!q=yC+y&_JC7L~=pFkt}fo z$Q7XS4J^?^6;VKL5IHYPysUR^S&5V;nT9`q{vVdvT~@3A7jYc#cDuH1-$VdNA+Js1 z&MbssSQJH)By_0jy6<~5>-9QKQ^#?drpfcX>pIhT#%wm5aeo|#VaT$~vMjYm3P}k; z6h&%D$E*d>;c)PMU$32VN(hhzL2%-XCm+HKJmY#rfhIomS*8WgvleuBKdoXT-TjVv>b=Pzzj~I*Omqz>jp0jHXTS`@c3^5i-E{&?H;s$KD zTUndIy9kX$h8T;+f29`>1aN|HCl~+VN+-es}x336>A79#E`;Ex2;2wSJ$0m(` a4}1Vrj@Iv)GLzQ;0000lu3=O&4Y2SJb|Nz*iK+g4TeAq>Q%m&m&@gn zrl~G)97hL1Ab%r4D6?H5rmiRoTGchX-41X*pDQWINaVPZ>Ix~OerVfvKQ#H>ym10% zv)T9fnb>_CG7^Lm>~vMMr5tuU2K1O)yls9?fC`E6A~9C>zyVH00000NkvXXu0mjf DjxEC& diff --git a/Telegram/Resources/icons/menu/info@2x.png b/Telegram/Resources/icons/menu/info@2x.png index 2f9b41516b04398cacd37c064c3f1053e9ff708f..bf7e1d2d6d879b8224bc6ea86b2709f55baf6473 100644 GIT binary patch delta 883 zcmV-(1C0E(2fASXZF*rVhA?cD_|OJNIpcK4fahS}ZO*-Ipj z?HGY$1P&X4WIXzllaq^!i(;{Oet!PVYViEB+G4S|y}cccMt?6aFY(BuX_ZQ);c&QK zum1!#0Kfo8V~>Q+X0wyY#M6yet9eeLf?^~?W^gi@>~^~tRg;^|W;`C(>-9pRkWQz+ zS`C3NgG>QXFp8){Vzv|p!FK8Q`^x_O{M_kuQmIt1E&yPFRS^=Xg0;-EP&__9D(Ut0 z_37!US?wJG7=IO2hw7hvBFGw>?RML2Hs1|J`;Q{(;ueJQ*N%l37U;_5ax^b?(Wt9W z(C$u#>v1%67dIM>a7sZaNaW{18|U2V31<@o*-0canG6d-LkLFdeu6w0>6|5@$*O0e>TSOz#en3j~ab-5LKLCsS?) zlAAH#K+|fq#0G*t>)Q;3k~1+8HU(6xRWU%qH5w4WcdLa2Lo56ka;toC4{?XfAp6uk z>pAk%YMxW>!NFi4gKEf*@ohsImQSE>O{hLb$@t7i1*ap-5u0a?y;*xKhGe9mRU?h zc(_F>Kd!E>Bti&&e#m(I@&o~lr-_5LHI-p_(Tsy91@@SS+e~6rAnvJHkLjBfN4pOA|zpJRxup# zmuw)jpY)jqJ9ROYXsuSu=kwGz`murT!9O;rqnta<1sX6B@YU|FeHInHyp(F60y*=b zAFN`2vtc*LCq34S3?vl=d_MosPkQ@|_L1utf&U@`e*sbVa!%Rl|33f#002ov JPDHLkV1nRmsx<%r delta 963 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 B;&T81 diff --git a/Telegram/Resources/icons/menu/invite.png b/Telegram/Resources/icons/menu/invite.png index 2d7dd94d92459c425bd14430a173842602a1de6d..ea0de5b309f5e7d2d8c71c442d24e49913538c9d 100644 GIT binary patch delta 524 zcmV+n0`vWt1%U;SfPVq&Nkl-Lt+wCq z1Azda&ld;;i9`Z+xm@ns!j}ZSUXLwAqfwf^zrWvZH?deuLsqNRYLm%CXebndky5E7 z1j1sm09vh98bWjFIFreg%Vk0~n+>!~CL@G|+wGQytS%Od=S zR;v}4`?7=I34bb;s#GeWU^1B;4hIMvjm>7may%YKBh6+r5{blOv0krtzu(<%H?e*Z zI-RcD?G6Tm^?H4|Tp;@WK2GYHJswXu9M0$SsZ@$yVl{`uSu7UqcALlh`Cbl=x?-`6?UbM79B`qvik zHy08Lg(j0pqtR@)+vD;0n-+ErkH-rH0;kjI>u06YX|Y($u7CTO$6_%kG#U+;%jI-B zGnow1R;z^rKK4Eej7H<_cFSh791e#@eLf$w+-^6Gd=7%aAbM0P6~veV+r_ug>2x%LKp+rkwOUXl zi1;DIB9N9!C4anEGMN;KM0XaxqS2^SD$VEf?0R^q*Xx~5r{C}6+Sm~TxqI|_y#Pm} zQ6v%xg+lFi8)+_=W2+#4FN6a4?e%)-$6Bpce!ri~edmL++wCaD{^B%>f*qw&`I5SW zf8KDQa5z23hrlGm_%-`Fg$HYPAA4o6Yn2oMag>#ssh4Y&K;w8G|4ao6QD~<#L(8p2BcA z3@2)}`iWrx@pv3%a=HADzIaHC@^m^K3pF002ovPDHLkV1lt%38nx5 diff --git a/Telegram/Resources/icons/menu/invite@2x.png b/Telegram/Resources/icons/menu/invite@2x.png index 17f87f9f0b442cbd340a38e0519b2ca9747f71b4..c2609e6df60e1c1536feb6d62534bf5ba096027d 100644 GIT binary patch delta 1064 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 CC<1-} delta 1630 zcmV-k2BG==49g9WfPV%xNkliWc7Ga)u+oUH9NUnPkOvPQ z+`W4@C@9Fs$H&ppacgU9Wo6~dmoM+$z3b`e+1%WeqqWfa`1tsbA3y%1_&Yi}dj0yf zudlC#+Q6vg=H}Mk-mYlTxy3(!{uCD%GfXUQh<9&hX6BsYe1o@d-{M8JIC~5VUB7<) z=g*%;4f*~1_kZWlpNEEq=I7@R4i1ds^!N8)y?WK+Y;$#WMMz*YK0G{ZXlTHGv$nP- z8aq2Xr>CdCfB&9A#;~rgj-Xiz(AwI{D2nHUXQ-fGYHI4n#s))`k&&T5a@k8!QBkL- zr?iS49Ub=e_9pd!<%^4pG~wLboUN^`Ny1A)=;08I?@_xC5V;dR7uGUNwv zh|$Oa0e=DX&?L-dSa5J~W@aY-O|ml}(8(SS=>7eDPC^=OX=#ZbioS|8t#LRlEe)qC z9FKp%#*xm?B10$JV_{+8{37otEG&#L0r2L{8(zx4c&49NX=$n97{Nba9_~MW{2*wE zkOUS27($vS4*W!^t>Ew+Aujvh54ze zDS8!^B|YSX87hV+Cle(!xQe{%oNh}Doqok#ZH5GNLVnRm{6Bp7K$Ew$wD6PjVyZ9^Dw6 zCV$Y>8HSjFgNW7-l_jbYWnp+$)z#HB6=2aoZxC_TrNa4(`cGO}R904^X<@+r_3M|k z8-eg+orj>xxBm_Z7DKIfLph2!K%2pI5GnOn9$h*6{uw2ShY(^u)3`*qY=AvOpH0A-YKVxEI#B4B%t@~i!^0yx zI~##}dwW~%u;Q7Ac{rwTumhUDy)O9%;5#O@a_ULY0X(OU@T+qZ8x z0O<=FBJ@H4Px~z;B}MKkOvnZWWF*S!+9&FbFDfcRIjEqMxt8F&+qZA?C~7+MFv$hQ zGTuNb8s5qA@$u#5Wo$O-s=^FjIpm6gfq@Yb5z^NWI|8;14h|}CFvHUQ`+xVP&uVgV z5;v3=zd`o$@+v4OSX*0T9yof8bQj$WW-u%e0GZHte0+?)jnvHyq0kT+Gp;ol+fXYA zF%d(qsi~pm;n+b45o5uPT~$>@%L1&GEI&U#=C=RIlPBDI3L~Nz$HfwDn^x68US1w8 zW@KbUSXn^=R8RP}g%%nb8h>Qc`kJjto6o)`%0td1ygj z&X*==S`ncDn9D&%Ni{=6TUr1zLp5B)X|U7i4+`)xlN=9~^%&D2U~V7fgk5|d-b6)D z_%Ldac>pR6W9~li$qCI=Q<#=z-UIVLwNXcqZ`zPL@n270+~!A*9#@fF(Ad~0$54H) zh;$ASA87&F@#epklhgO_JSr*l@TRAyU%h&T7^aA;FX|r9J)nC)_kivJ-2=J@bPwnr c_}_ToUv263O@loMe*gdg07*qoM6N<$f_SP!qw~v!>n$zd&z2exLof-CalcT8b`l|ypPAC)# zxm=E67#xInx7+o4z4dzigp-f;dj0l#9S#Rk6v;{)4Tr<$^MAS1=|rQ^fN!NzDa*1< z)5Im@SP%rLMo|=UnxdM`Cc0WY9xoP)ep&!QH2vEw@bWVdGMmjNlL^GKEDwi6UDwG> zR1uKKX$%bpgN9*Tuh%E95XSi^bX~Vvtpc^tXu#fTwUCT#)bIDx>GXSJm?L5{W#y0Dd<@Ur;DSZW-`cmPJ`;FkB6<1r>Ey zZZ@0kcB^UHa=F~^_bBJ>i9|w@r0H~ukjv%br3itlsy3(7>D6y*+cw@>zy9GF;W#dv n%@UuH@puf6iC_Ok{?UOSjx)~6O8n&Y00000NkvXXu0mjfRSe!b delta 436 zcmV;l0Zab01giv)fq#`rL_t(I5$#klufb3l)#j04@eD}BMhA;Oz}CTHuoxvBy80sq z@e7(rq!IprFx!oSrHKd{k!VRR-icOv+k5-4zPvl!e)pVn&;9P#uMLI%?BK|oeLn_? z*s)<4`~9BA8AvLXnoK75;4z=ii^U>i=M!==QdPClXef%ZTz@W~l>5wNGO{eM*XvTL zQ&5%BGHiy5+TI6NASYPA|$e7#Gb)0W`7tV?cs3v(kPe9RVo!t(@fKJ5BT(Is5EMXBXLL91<^Z3$z;;r6X^1e zkt9h-0ba3K%(5&x7pEaT>9H2*X>?E`k+@tg&1SP)E^js)Qs@->cs%Cwd6MwOg+c)c zWSH?zeJqxa5xTzBYRzV|)oMkH@Pb8AoKB~w(}`w1NG&uP?RLA!7FDOm;c&q3;g>Jg e!YWLQt@ZRS>;9b>B9BD{I? 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 delta 1069 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 delta 636 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 Y0DlXbJnNm5F#rGn07*qoM6N<$g0?QFo&W#< diff --git a/Telegram/Resources/icons/menu/manage.png b/Telegram/Resources/icons/menu/manage.png index 67d20772f0ebb857a736028bcfe8682ce201b249..36acf2de970f75090d7b9238339ab1cf2253b4e7 100644 GIT binary patch delta 385 zcmV-{0e=341o;Dyfq!F3L_t(I5$#mJtAbD%)qW6xgSI4uA_%qwjxN#QAJODL;lJV5 z*4pCiq}b9Zv=}-BMnSnWH3Ur!y^n%) zBn-oNJRYj5QoUNp@;q-@R=eFs2EqA!-tBhXZWoyGcwCkxfPdrhcsiX>Lx8U9Fp#>6 zq5z#~nxCu7<&rdW9QmUCelN>%t3?>pU9VTflgZ?8IKcLDxgf~~L{SWaKoA6mHpg*n z+h%B}lcs6v`+i-O%9BJSNt(~+olXaInx?^_0Du$lJg?boes5l_R?>-Es37OdCn#bQxge!VanjTA+BUC*Zc&GAzwR5yD#98#+!Y`E5O z99Lm~k!D#oolYw<48!~V4mgS;*L6`zjBdAEk|b24?RJX|o6V;BWAZ#lk`4U)jIepV f=V4=;`STfq!pFL_t(I5#3ZVu7W@iRlryP1*Mh{LkEc^m7&BAk3j_oAcQke za{ww%05;kX4xour+L#!rOi18QvdO~#E+(7bN%iKvH?zC5vrHym`>|9fE6Z{=n-xXz zp2fUVADH!et!Wz3FvV<^WwI>ea0sr~t7)3RbX`~1_2cmX+<&&M=Xq(GA}5Cv&gXN} zG&mfBs;Y4Kd_GU76NFIoe!pX$4!}xL6w&1n-L`Ejib9kKq$Ej)!(psngoH6l*L67m zcDo%j5c$5@aU7#v@H~&Lo6W}eeTE@S3EWy3hWq^h8ZaU6<-udx0A9tx`fNngQe00000Ne4wvM6N<$f`Nj$?EnA( diff --git a/Telegram/Resources/icons/menu/manage@2x.png b/Telegram/Resources/icons/menu/manage@2x.png index 158a8c8a52f5c2b3fa7df50d1f14236ef2cb0393..21ccea9402cc0e345b77fc415dd52e053ec1cf29 100644 GIT binary patch delta 789 zcmV+w1M2+t1c(QafPVt=Nkl8ZtH zLB-*47>~zCqY)~8VP9QcaVvo7w_2_8w|#tkL>1J=2Lwc;(LlLx+pShBm&?(+ z<4Z>GPa@yn-?^@jj}H=q)rlFx()8l(?X6m^UMv>*e4gHmnY3E1TCJAZO(KVjiwoGv zR+pHwO(LXx_CJ|91Vz`(B|*s%hR)TAfT z5k$Q3B}=E%TU%R#+y3b2$ZR&F02b&XO}Ooo$)pHC+XZJGR|2$Tw9eEV zzGPVU$$wC@>H3;eVQyX^k{9NYv|f zR0R9-^78QT5EbDrgRc($FD2SVwEccR=^7HzYk##GKce_&P%IYXNr8bc8QcZ}j;7h^ zbZ9VOL`ZzeipApo{yx)sgwG(@;i~~b9q;b$P#x~F=jUfsL2Z0MK)ilFDEd9S+wDF) zJka~%OGfWcB740a*Y)=HMq;o!F+*6IUd&`N0K;ccp-`arT9fMxtTXT%Gw=@pO3Rho TkPexY00000NkvXXu0mjf(esPM delta 512 zcmV+b0{{Jp2lfPzfPVqtNkldC??YgdO z7zX4r?c41(olaM)l^~g1+}`bWVHgTOGvY9umF@HS%(YkjJe^K3S9-Vvi$Fv&-}l9| zl5sp9>3kCW8Bbx`cBj+HA=!Gpj%Q<@@pybV9N-j_ED46#i)|rUtJR{XMkJ#Lr<0e< zg#)Z1rIUX&`+s(wy4Z8GwmX?j7K?>tS;ekI%svu5CM)s`ev z%R- Cr2BvX diff --git a/Telegram/Resources/icons/menu/manage@3x.png b/Telegram/Resources/icons/menu/manage@3x.png index 7a1f7cebb2e3265eaf1b44bd8c8cb1529ebb6d51..7b9767c872c84864dc57107a4b3ed039ba2695df 100644 GIT binary patch delta 998 zcmV(+9i~_Y7hvORu<9sLG-@cI=eHwGvq4c#kX(X`^@{i zoi{r(yB!_!Co>>3ATuB{ATuB{ATuB{&<+`}*=!pd8|idh4|#JYr_aDvRv<oE7(|&zummxO!+{*^c00;Ef+dLY5YX~%TVggX#;6}19o^sG z9~&FvpRZtoC>D$1aQN=-4)ImO!otG+{k=;0efj?Wo=Th=1? z#RZEoy~eh;w{LH6p~hI?s5XT{As&zGm|b6AClU#w0o2&x;h|1_61|$KRMyzR!GVxa z=tEIRH-8Ue31XE>1(_>lRJN)B>%+IVH<Imr&rQf&~HrTn(L`o;Ed>U!C*Lic?clh&MewjdIfkUSi$d-N>P< zix&-{_yr4v!cRttKwm3@HSEL&1_p@xvEJTZB^*)i>FIGgox~9ayP+6i>+VI4q#OYXBSz%0P;~fK_v$HcscNVjUhX;?x^D91$3#Rkr$;nBrjpqFP zJf7XYzP|SL^{G07l7KaCe}BJ9Z{iX*n&;=|z<HQT?h3gDywkmqAlz;@;wWWQnh-2O%tYK&m$oHF z-+w{Fsm9XMlE62b(P;GZ^HVG3a1y+;vqNl!MQ|pQxw^U{wi;G$Zf;^_3lRWN6@>C_ zi+&ftO>3W_!lVzynVA`t59cKhAbc$0^Z8f;pc5;X%Pc_bHk^Qr?(`aqL?VNOgNy@! zN)O&>0-%mrwOZBMO2RmV1DI?!tK)91CSPTZ$v2vmdqb}=3V?`a7-I+nhma`q2$mqG z{Ne((tvr0t*Am;7%gal6RSRc9umaxO+r!|bATuB{ATuB{ATuB{ATuB{(9{h41IB`n U<^2dv#sB~S07*qoM6N<$f)iEXZU6uP delta 1051 zcmV+$1myeK2#pDlfq(Z&L_t(&1?^fpOC&)M_U^>@>f!?x6kNnqe}HTzCMJR)rUqgl zh(-qb2h8*rY`TGg_&{V)6jT%qG%z#}0~Hlf#P{Pq*t4#g*{SKCp1qmf>y4_btG=$U zX1b;yTTozrCIcn|CIcn|CIcn|CIb!`XlrZR+SNPbrV`F2@ z&CQIBYS-D>+04w$&CQL)5fh9w=v`V`qNYW7d3jk}Tx1L^_8FRMYil&2eG~v|A50ZL z9*^5WWHs;a?|-V}$=Czd9)XObXfri6Wd{*8+#JK_QZ)5T_61f8WMpK-_lE{Rz}j;p zJ`Gp-`1rWGy4nsRYPjM7JJgTH#zxUWQ$9aGw^t5ef(#)e?ty^;YFdQX*VmJilaG%N zi$0`H@hKe~9Oy^M%`tuS01?7M?E3nevT${EMRLvylYf(w>9-NprKhJypN~uN&>uh^ zp{uK_y}ccu@1vt5d9VM@@|Py#?(Xi<(a~5ec6fOB`T41d78duuzCJ3`i9{kSVd=*) zKR-{zo}Zt6*&ymil}6Ai_t9vS;wUaIE-5LYX5fMrvB0Be0?1ope~(ZyvTto|Wp>aq z2Y_W|Wq%zV9e7bQ;(JhH2aONi<4Oqf#z5woaC5A*w3K&t?bSzc8p0KsBeuG_>Vzw)Po+}XSdIV_ z$b1akBDlP~d}wH>sj0~cqQAdiEG>~pD*yor#MAj_0S21gY{tI9&VptzijCgdoF`;JQf)=s$^>reE3od**sTsJS zwIAEt+rx?;>yORN&Eer;twYSfGhqSUrEvR1kGHe^Px+S*#u*VWaL>{$p4G0y~?9P^f#%h3R~J@xhV zPFeAwN5y-3dg2|i6=-Q`ak9bs2A6D3y;AzY!9k$Voc2WkAYkpoD}nFt?^jk<+CgMB zVx>|Vm^aRNOT@d_do$kmip01%=6cU70)NTNzQDSIaKv_YcI3mAxAXFJA$3(}+oylkYoy}cDTM5Ip(I2u@3SV$(57JW#Y;w&)b=) z<{0PacOTZi1S!g-R29NP44ZKZU6e_gt3uxX**RAqh>6=|z+}K=z+}K=AS)U84HUYf V5o`+(ZN>lq002ovPDHLkV1mNw1;PLT diff --git a/Telegram/Resources/icons/menu/move_from_menu.png b/Telegram/Resources/icons/menu/move_from_menu.png index 3a4b3a76ca29f991b993115248bb9adef4862786..0dc84b3dfa6e92ab963b74ff7fa8bc8deede63fd 100644 GIT binary patch delta 492 zcmV|anN$4erPIO``g;M+m zje?MfLez+8MKm-d3Q?#;rIHAR=i{AZU+zqHX8izDY|cIR+%tD)?kLLFE{FJM*=#nS z&%51jF$Ly&z4m&&e!p+YYL>WCsWh9-%jI%DpMPb`>-CmOC4Xe*^SPy#h1F{H{eIW$ zb%#UJsi{M%R;xjVEm@_au!3+nyjrd9_xtPh;uTV?s;blJ42445?e>2I(hUZKWHQ-m zwN9rKk#@l6^A!q(;c%ErrA&=ZQccqqi-lnr#C!&52PLFY8B*29<3S-0a2$a^fMvTFKGQsot#G%CF@ou+kNglv1ahRs^ zj*!DEp>1=yT%*yLOeUF31`|s>59A&33fx+|-Tv$Xy=84jtoy7$*h*3gf_Gq!~a=E iJbJ-okqhx(3H|_6kHcIRVgJqm0000(XkFqxjgUqA`P zW|0(&7>vY(GD*sSe?on$iNW{%`mXN1?|Ii_bC&lz=lss^o_p@S&tUj8GpZUgnM{d9 zA`}W4jp`I-9*@V-Xmq_^X+#aoX7hMF{(Zr=+pWvxQr8pTVt=u$Rx5}!8V#Gx23OOp zR%^Lj25rCJ15+*5f3Mfe<#O}+e6!imv2zdSR&XRqy4`Ls>`6gEiP!5T zLf_<*N~JK}TCLV@w-qahoqRrDEEd!0biH0@EV6Ck{1}lTkkK9rN$87Z1PB*mHk)O$ zSwa3D))&GcoPSPdzu(7EJkin@LjO3R!{N~FcAse7hpk%5=ko;u0Y2DjwJ=&};X)4v z13pEtwh%5zBocXKqq{<(@P<$(lkxlgypY{)Z#J6_hoe%d@NtT@JNo%IN^-m1*c4Qf z$>el8rEwnU4;#n7TrNEx4^$?T317@(eIXqGdcBUv<7iJ*pm^Wf<#K_8*L*si_;r9W zV9iq}PoESrq1|o=r&_I+N~QDptkQaPp#n1Eq)P`lJXXdAhaf>siO;KnFvnTx;- zf)E0sMYJwNcM%3DRI7*-0%=$K#6Q3`Awe!IK}sc*zQZ>#ynLf?#y9SK3z>K4+;h*I z8E58=j0~Tl149P}>%b@{z0GD@U0t=??W3c-DTMj=_qS51+<)KSzrMb5*3yRU?Cdle z4N&*}v|6o$g9FjQFqBP9OeB-ZzIAjY!l$XJDMlGZsF(j^V`DcrH-SKa;GdqJ?(XhT zLy@lCgezXJ*YEce=;Py~&*%I3`O(f)Bhu+K9bzmNgFZEeGZKkJAcC-6U0rcz{ekW6 z?NK%R`}=?T`hR-a+}xyu+uPgSIM`D*J3IUG@?ta^k@o%lU9Z=>KkB^VZ zEQCTKJ(}bQf|R49qmz>p{hFi+f)w0%^lOqSNQ$O$VlwA1t}=&*hm(_&z47I8*=n@{ zgZ1?B@qYp5dgGP7VuElhT3A?6=4-aY;joY(u_=3ac+gZp05}{-1N#$a3W13^6pcm` zi3D@Yr&X7hmQtw{u0Dtqi^X6tNV|9%VuHZ<{{G&B*X?#+TwG8!D=RC#@oFluDO2Yw zBT$pe<;a~7-t?gcY|;ctQ6o(du9x^=(&-H`TYrv25F|wnGzl+iGLDYludgqU$Fsb= ze0_b5gSMkr=v9s&lzjgG2-RkS8BUp1}QBqq(O*dh+M+)G30bQHPC|H zAOtPpC+A%U0pq(2h)gE4wzh@_F66hjx4c8?;8wlDn~jYPve9R=+4c2x6{JgGW@ZK_ zHcA=CAbzoZqePeDUBXC!PlHec+8%1yQ$|H%n(?hkmm!V!*TB^0^LcpRU-~d>=)lkc bDGvMtrLyg@Wr_)g00000NkvXXu0mjfr>>`2 delta 883 zcmV-(1C0E|2j>Tnfqzj+L_t(o3GGl*K3eS6hsO++Gv|%w1tXN=;G8M=n`!W zEun+ZKM;4RhG>;0MIoBp8k*W19CQ&xb8t}m&idV6dh)(@-t(U0$K`@&(D&o_{GQ)= zp7-+@4AW;Cf#D)xlr%RQjaIAGWHL$O`(f|z@6BfO?d`3#g^?GF#SRY-*%0jYdXY#Zm&+;Pe`t5R-R*Xpz2C#bLo^!w z0i>}B$->ZPoPXVJ7cOK8=I7@tl?t;&NH#Y&Wi8ckYin!w_xFssR4SRxW;Kh?{-dKK zW;5>JR4Sz|XlZHb<>h7EQW!r5!`$2)r|B10KR7s;nVI1l$5chi5{U#y&d)NeIu3^e zAS8Qxd%ISvaR$Rz?RNXc#f8OU0Tl-8%F2p}v(adeSCb}+S*bz z1UWh4z@v!}bU+ZOvG-*%85vES4yuku5RN;Lp}~!Sory<4%BaNZ#^Clj$>?$`~Cjw>+1oOT!UZ? zot&IduS@|aLk7FLy5gJ*BBWuKwOTEXS6s!-i2-o<6eIh4HKYvrs#dEqDZ|My5C||g zcXxNmWU}9-wld`cQPpPoh2G!aClYMtPN(y$=YRWOkg{(OD-oAIK{9IKXhMP{)l5jx z-rgQXS1D7Jj zHk-xuRDe|N8jT>h!F2_Xsy|f#pE7*zU^X%fpenl(fXK<664G#UbHgS}KA%?v4c!59 z=4=J-I5IwE=jZ2G_yNMz31(+!XLM!ZEcI0po1L8sV3 z7QO^dKoeYO_~Z!T2rLpzpRGm}DiDGe(Nh$iRSPA|;O^2_+ecDFYc8 zm>DSlf<&1xF;Ijg5jQ0!l%bG>@_yx+-23aE+ip3&Z}0DO_F2AL`wUL&?6dY-zu($> z?Y+<5=f@9onFyE&m#J*|{uzFMfA8<_4+#n3pcfVvHatA+HYI9* zX=y1XCBD}EOEz}@~hK5c}P1)LKWMl+vHCX>-!sGGu^z^*Fy-|+~ z3k!hpN!MAy;NT$jfwb=G>T+gMT^qgQ>FJ639T*r;SMy(^v9Xa_hs?mrg4fj4gdkGy zwp{SVLY-si@q2rFiHV8A#Ldmk?d`32bX$myj!sBO5Px0(CND1!lZ`0(qJTW60Sg8h zv#64cqQ#J`*Vos2S4>JwN`;Gyi=?C^x!O

*nU>U}FWq$cu)C203y?i*0Uh78Vu? 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 Hu0mjfOZ@s% diff --git a/Telegram/Resources/icons/menu/move_to_menu@2x.png b/Telegram/Resources/icons/menu/move_to_menu@2x.png index 67034365995944e87106fa36487705885ea4c7f7..10a49d83bb1e8a34e32d6703a496546f5bab6c81 100644 GIT binary patch delta 875 zcmV-x1C;!;2j2&ffqzL!L_t(o3GG+UOFBUuHI1MQqEn?I2+<`vWSu&72}Dpz^dNZY z5Os;5Q&|YwGq$(ggUo*B zz4v+ZnQ?Z;Vlf}H0%iq_tw4`X`LVIFKp^07IC^^YQi$@;&wtP3jl03BFV+ zrPFETkkGZ8sLJBvqTlZ)&|FhSIgj*fJ) zI$#?c8`RC#)_+zP$8@plm!1TMZ#YNKR-VQ2M62jwzihcW0jXi&rcfx%&dvfbKR>Sqn4}Wab^7l%x%a}H!#Y#sPR=fKR+j{ z`1||&=6~j9_y40d;;XBx_4Rdpp49+soX^nI)D-`FU!lz7Z(@gSW~apBaz6%!-HCyySqF3p-{uf;(Ufc zE|<$bpO1LLAqyv`g@pwqmgx$=@=X~@Lp+hCI)6DiiNil`ZNd&@L=i)fFwT>pA=XnO zk&um5>{Z;5%o8?DF$Xdh_o9~ZF?TaFGq?wyoSewI#9q5KgsiwQ?eFi4rDs_RQ-%)$ z!MR*6me75K%F;v{nxmtmTe?>Blq|BWE@8PVrNGR_54abAfQf0xPk01Zj`5t zI>a>Nu1S|6jf*uf^|e|JwHKqCEVBY;1^%Q0{{X`N2Nj`QRMY?f002ovPDHLkV1kf- BvpfI* delta 831 zcmV-F1Hk;>2eSu|fqxxIL_t(o3GG-rYbsF?j#ohuu?SI!rIuO<3TXpEKusDe3&BPa zENy~~V3AU}O-LcOA;CgaOlR*82!f!NVhDkN&m=zbkpl-gy6@fl0Jm7qoSFIN+nMv+ zqoc!f$bhm8=tR2fbUK^Orq}C5+Had}Hk;Si*VSsZ-6_9)e1Cj=cXv0LOn@u<`S|#_ zzrQ~{J(bUcczQgZe!nl92je&zjn2={<#W2cyi}MNh7iQ%a+yk{csOy6p+F$eY&MNX zBXR!y^L&1O@?dePF!JK@cs`#eLvX!bM2!(^Vt)awR_kCeAf8A`Fc=i;DP(tcb~c;M2y(aEHJMC89zXhGu}FNhe&=#I zVL~S-CtqJ*T2mqT7z`GRh2ivzk*}|>4F&_#sga11WwTiZoSkJ@b(~Hoj8N=oG&&p( z83*N}!{K;%crcsIfWlyPxm!qp|L4A z4M$ZhA*%RW4HXE5!{OW8Td&uv$v4mm@ALV@1juAE#HG{eh_NR&0H=W%FGU#wn?j*L z5Z~V37-)4wN?b5QG&gX;WO2LQ;u-K{hy@WzNC_K+RGE-MHYyWR&W4|mv~4SqNYGJ? zWAgL!^MB3F4O{gs8Rx@FrSkarxYZ}I$v=j$!cqf~4RG2$+w+VeY11CZNQobKv{)=~ z%n&O$afZ{)yfG>3``7cTlX5Ag9)DFKycI76F{F&*R=* ztyXunGJ2E}LP%Ux@W_b0*M(iF@wP9wz%fRiW) z$AGaVE0@doB>*E_o#0j~mFSg)@suYbH_2p@UiuJD00;jPTdfvduQhET5W)!%f*PlV zKRCb%A$E@?oa8_piA90wZ!5J@1wg<8TvTp22_6)O4E#qK_y(7DT}?!-1ycY3002ov JPDHLkV1g=vf;s>I diff --git a/Telegram/Resources/icons/menu/move_to_menu@3x.png b/Telegram/Resources/icons/menu/move_to_menu@3x.png index 7136e1b2d34f2a6e43b243aaac44d66d49396859..4cf99120cf777ec1f1463190ad1287eec53f12ad 100644 GIT binary patch delta 1200 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 RS|k7f002ovPDHLkV1jz&3mE_a delta 648 zcmV;30(bqn1^oq(fq!R7L_t(I5#3WeXlg+eRO0_b;-}DB1hrB~f{<7UHiD&~7FISE zqD`y?1q+o3u}i6G0-9DU@q>jRSO_*Dg%+YHm?$bFLEq%9TvsvJKHe7h&d$!6J@=e* zS*-tk1%ttSJ}(xF4?dK`;RFJKhlhvT+uMVq<6EE4x7loJwSOAz#pCgc#UgmD@9*!+ z%S#07^?I31cHD)qcXxLPV7!pa%gYOxcsy<}7yzQtD3tU0{Nv*z7K>e6T>NTBd%4|i z1gFz!s3j5!a4MAozPY)nR4UkZyIr+feZ-5)8%SsV zn-``DA4N{<^?Ik%0rq;mFhco(IdtR!P9~FJkO-#9ZhyBg77HRknFRs?F#3Zh#*OfM z-Q7~ui~dH?*VotU_4@Jg5g64#MogwZ#$R7w&(F_j8Rf8pw3o$VDVNI%g#zMMt2G*p z_M!@f0=!qN74pYI39hcLc24`XCwwRrLI~!bma&9FA+F74vrm85WHOmfrzVq$7SVYr zmCEIE`G5BIM&^K)?O~(Q2qVlV{xbT2@si8sD3DgGrB9Dzv)PRQ6N9SJXwJ^gs?{nP zSH_E(`{VI6YqeTYwSK>!%jHlGzu!+zi5E&vi%(#i&4#|frBo{M`Fuu=N;et}WXdq7 i0n}*rY281k_yZ@6bodte)Y||6002ovPDHLkU;%=+3`3Cs diff --git a/Telegram/Resources/icons/menu/mute@2x.png b/Telegram/Resources/icons/menu/mute@2x.png index e3536c815c5f0c1604a519aa42e571c954f6a265..935b2ece5662c92738ea8d9ccf7834648bc3d01d 100644 GIT binary patch delta 1269 zcmV)Q~LX=D)Q^=SM87{bxGL)1MQc~nX z6uD7cDi;(=Zd}NPA-PayB1xhM88T0qW%fO_{#NgQ&VJwH9Djdbedk>4)?RxJ&%5^8 zYp;EN{nG#R5zt3K9|1(b*Vot7)bvjYMQv^E*Voscfb669=PV8Gbe7}k=LlZn&Y+e^lgRm7ojbad3)+gsVM(yAOL zM@Prk*H`voW@biK5)%`N+1J-c97{{fmX?;gyE}#j`bVJ>Vgi#KOixe4C4ZATAX>7v zwnnBuJUoyVHaa&qm$kGegqSijGb<`8tgNi0=Hvj8jDM@E>(bH^VS0IaiHnPq>S~~o z6L8ts*qEK24N)N`brZ^fAa7w|f$Szs+uPgb=H}`~1RUw7Kp9mVLf^q81Y~4nB=uoq zW3#unN0@4AYNShI8kJ*eYKjyvK0ZD=IXRK2Moj8}P=t^=Gcz+TE-vg3OtQbfzYllJ z7ZV{NA%7%|<4|2)?cw1el~cx~4rpj-h^$>)Tu4oAZEX=hK0aP*UqBZY7LsUdYpY;c zaqrXtg@%US-rkbI#l=Mf0|T;&>?Ef8J);^iKE{`qmqI{mYin?fFUBeg()jo|-*-6A zqylF|;8>x8-`w0_iu)uXA%Xato0~-NB|}q;s(*lZL4lCNw7R-VpD{Kz#_Agz8|VdS z$|Z4UXNNePpe(NoASeqlU0q$_X7Ka#Yiny`2OyBtG{yNPVt03!2pl>hc+?RP^o5wN zudmnF*V#G|&(F_9a0$T8Lmb{^R?!_0Ob9WtX(pngqKL*hC&JFojtKM=EJnnS0KtSt zOn>g~?p0M)iZUj?@|KsE84!26U`o*l==}VAst}!>oq}a~ zmR!v&C@4UpoSvR~d3ljGsu7MJc|oC4G5JrWVs2ny;L6GhrpQDb7CsK(z%DB60y(=mzqSQn_U_4&_V)IF8BiEhQxd$Cxmo5TIFxJb)6XtE-FE|36Gf zi1+t*LV(siH8mBz5l!ps>lqLT6>dxlRYR(!3ytR$zh4OoMnq2iF)zi$?^<14YShWg z%fmx}(cqtu($Z3)7BHQiok6m>xmhUipE0oo_)`J@H^38a9tFF2SVl)jb7!p}sbA7Z fKp%m>C<4C$3zBG|-$?%I00000NkvXXu0mjf$pBeP delta 1246 zcmV<41R?w83eO6Vfq%J4L_t(o3GG-*C~aXB_I^L}&O5IpDP=;EiEAb?QYMVVOc;>I z$Uu~VC{dCDi5)v#5>+bHJmX_x4?|*NRmwDst?CjqkpNor& zl#~?n4mLJ^etv_4gRifzSy@>Ljb&`e+B7F0AD_+5O=g1xkXKk(7%PK= zgQ0YGc1D_631NSKKPM;Wn>lrNcXN!ct}aH$Lu5T<(xb*_W@flFVE`Gqq!hBRE7pNlFOSgVzxG7Gve+=5mz${CsiglRPvu z#CDgLmw%`daoKF1j0xejzq+~t=F7`VRaKRUHa$H}u_h)aMExh3oMG48+$_zcX->w3 zunme;Tv}Sn@d^qGh|u%%GZiZ@{S|_Og2)0_G%5A6;obx%V?uDk6u_JH{rx?n5R#jl z8`4G*Gcqy^@WQtgPFPn&Elzkh`6r2^NK8x&ntur`RaaLt(DwE=DJv=}Sg8p53BgB; z)6~=yV&JOaen@R?Z4?`&!%OJFq-<<#WThflL6X|uDlnCY-n93LO!sseFwaUqTPt}t(mE^PmGLV%ER zVt;5+NKH+pTfB6v4+sb#`TYExm5N~LBV$kLv*T3=X!wthkMwlv>gsrji(1?cc=dfp zCm&oPD+@X#)0{>|MhN-t?v9ateSP`0&&tY@1kt$JG5r)57aI)Uzke4N7Ko5IfQtt2ve?T&9JMBX(EKs!Y5tlI zFfC51NP3&As@u~qP+gaompwc@Q~|_Wvz)@i!%t6733h#bUG$a6adB}x52>i|?fm?_ zyd4_wOmM2_GbRbaa$CVT3h(pwZ%l0~&*feNBn2Uw=aN zV0K}+;o)J`Os#^Fa*B$IdU$vMNM~oK%Kj_2=m2wbbIeI~>M%x>a>53UtC6jw%NWdG=s~Z&whc{|_NOS|d4gdU|?7bNvPe#t<0I&~W(Ap{1pz zq@*NcGuEJ|V!$maDPhe&5j;ITak>Z$4E!hPR#0mO{_hO@0sLjg@D%c~g#Z8m07*qo IM6N<$f^>RTVE_OC diff --git a/Telegram/Resources/icons/menu/mute@3x.png b/Telegram/Resources/icons/menu/mute@3x.png index 6be5c9a8c1ea534b5bea44805560008ec9925bec..4762b83de48c49729d7174a3e45988101ef52637 100644 GIT binary patch delta 1918 zcmV-^2Z8v{5b6(*fqzsi9u$REW=S6wAzDaieo0E% z1A9L(C`dA)LhDDcq7d;zLW#0aw=B@#5V%<@r|EjqQ?&b?>O+;dM> zaQt!2>^*z-+VkG$dU)7>b_DDQ*b%TJU`N1?fE@ul0&YfNl7GDY!i5WylamJr2mAW^ z(*Voc(J~|zPh?PJ3D*MoH_1TbGL12X(?D~ zf1{(LTeogCVbR~;zoew(x0zr6KYskUXU`rJ)~sogmzT#KGQn;3?Ab40zT`$Y&dJHK z#!*+TAlQ!|KY!+~xWsM7j2X|LKj+N_j2Rvo87X)*>F1wNX?-y$D99YQY15`Xdi01h z`S$JG?c2B8+S+&}mK=9FJw3g@zaI;`s;UYroQtf-Cb;?e`Q5*NpA*2~Y}&L5&S5;R zUAso2?(S~#c=F`QpFe*l5x|otPd0DfObXTmm$<>dTYtB1asM!ZQ&LjMtpf)Rko5ca z@1CBXnrQm;=_rzj0LFRg(xuegVxY(kUS7R=m3#t#uiLk8=icnzy_+jw3`u(V@?|a} z{PpYC6DLlPn#Dkc8)go9qk;YV_X~bVh(R+xKEAH54udS%L9w#3a>|q`f;DT3hTM)E zIl>(}c7N=cW5;r0ntoVVSYctIBRwqLzrzg&S65dTxM2pKJbBWQ6>3z7X$_YzU*6c* z$Rh<@TU+bp<>l0}yOr{BgETcYH7Y7fuN!q@uz(eK{``4?TYi4No^jXeeSLjnV`Fip zqVrVFO>W&KVw$Og2M=;?I1;0yqvgFAOZV;D_kZET2hA=f*sfi>v^J)>nIMK9b8~Y! zw+9a%&^ckuLD2B__HJls;O2mzJ$puK=D5j;Vg2~{_)r%dT)%#uJA(<&r7mDxQn?`w z!#X!%f}4ccwr$%mJ8=Ivd-g0p-?SbVFJ6or47qgk=1uO2DqgT)0k;Bkn1>G^K3uY7 ziGN_iRc?C3rcRy8uT;3c1P2ETec=osV(py=A)zs7oQsZJpMFsV7_wHTe1|A-Y+>7P zM>rBb8#ZjfTZ1~o22fsJF60z2-$()L1RSUcaN)v*%*;%xfrX5W3@QR(ol_BMtXadQ#@HQVux`jr?m=2w8uuRA7t#+64dtT5#6%KtVC5R) zb`{qfZ^AL2;k<}D5EX^1Jyt1+IQUb<(1$zRcrF0X=lAd5lheYf-P6-UA`bo_G1J_z z6DA}ike4rBydVr9Y=dv#zU5NFe}9%3x-l_sSy@>tR;(Zwk<}s$5E2r?i+aSk&N%Gm z<}uFJ&%Fe@Hed8Od4=;$YqD(FGJZ$JJY2MB5x2$@=6dsx>xVQia>8Q>Qq8 z+mRe#Q%J4Yrk zH(+tR++<0G8wRblwH3*>S+iyd-ISG;kyil1dgIE!vaq~L!|T_t=Pxw>ICD9o47?-0;@o*&f`mcI?;zCZyvOL_|b@Fr8y~)R@fgg9#6h9KU(< zhVRi%J)=sMaU*37fRB(GK!4~39o6F8xpOIvBWI;avC*l2LvWQFZvET`KATkea6N3b z_wL=}7UdXEsidSNZb5?8xe4hv_^^8QYKditbk`U)!yLdkY}~jJX=fxDsh$AH^F@rW zTi}LIB%~k#D(h|j{Q3AS%DX;&`ZTg}60_Eb@Z}O~nvW#*81>hL;eWUxOx!p&Mr-_5 zv4WI+dwVlZb9jhPi^1kKVxaMELI72Z|L=2#_vlGV# zcLk|J?c)&6X9%jE-uD>4>>@*>+l}Ok3ZBuwBk_SyLa#5!-sj= zbmF{M=?R|EGf_p~*0CdCN5GDN9RWK6b_DDQ{2vkc0UD(=ssIsgCw07*qoM6N<$ Ef;Tg|4*&oF delta 2020 zcmVgu`Ec@sE8!BfgTzl zXdt6m_Rh&ym^DOk;$~x)Wrr*NbR_M z`EvK}-PJ0M08?fK2L}V5+Btvw_HELnNovW~dvviKIdVk7cJACc1e{V$#(^o*Cr+IB z=+Ps(WT2axnuZS_E|qVwQx{u!c=)JMqco(O1%C!ny?ggQd-g2DR$X0(g`2xRDF zg@1;3>eHtWm0}H>HZTz@V!vS5P<0ADbLLEHTWf3Uz<~qRY?7YUt5?&Rg5I@jmzvuG zHVt4{QyO_7l9J|ZA`ez1P=T3^z@jR7zyj|F04o4 zf`Z(b_NN=C5S?KB)ijPx0~o9rGiHn$+s2I>{}}l1|APk)Qah8AlNp0IYqPca`ST}Z zaMwgGjN=ZTlQJM4H(OJ{zCxe~??vUTUAvYUR$g9C875DjOq&u~dpRW&T)T`sw|~Kd z2h+tqcI=p|jDK1tVd$~J!dcshz`n~q9oo4_E^2)4U-?+UZjyGSuBEiFy( zfS}<47+5I{S-AuZ?XnLH(sZ#QY{xEz*Iu+}5!FuV(9lo{3^4~C#lb+M{(JZC(NPKQ z5nzz3i%p{2wF@s5t^C}%bH{bui+|P#v2WQZcOGoma?`#q>CvMH+`2G89fiUTY>2I}--H=Rzyu8fDJ%_Kkyg`D(47bj((PbFK2B}L;YOSN`}e0!)Wv91 zLVM~RqoOUmZwRC4D+Di+l9EDYMn*{!Az9(kRWYS+mAPieAGS zHpITjYp6YlIrUVL@l~r<(a8qsO`A3m8TzDIY>29^UcE|EEG&{B3sj$*NfBt+__NYpDJRC%(WEsIGt~(T6_^ihCCNyOen2{_p_YJ7?=FKxD zM;9BMlUTk_pFWKnH-FBQe2dI0R;<7#6pBIM^A1%1Oo`LR2G0Qph=b?h!-sKkai%2O zVn$Jw0t1cv$b^IhQ$n?|nG)qm<_#M*Fl;yvrG+unJPsT(B?D?Nf{i6wz}ZEy?cKXq7_AV<>ghK&xb~+EM~@z54}YzTVna@We3qIH8YiK+ zGN%3wL#$vZKz7CFhWgQ|Q>Pd<#4%g9Zr!tI54|M?kH(=V#b!1D5G&;w0^a%j`ST2$ zx`~`0ajk|*H8xz&>ffzsNVGqMPr_Ktss@&tnyRZvjm^U!dFWc8X26v(E6Y%9xw*OO zDbgN_t+BC@Rb2|CQ#!p9DS1{_*6Y`=DI|Q3h#=FHZd7=1r2@BPFsiC|`b@w;#n)iF(y5FyNo_AjSck}(LOV3r<%sc#WL)2QM znK}FK_q#35+IlO;jKBS`>dA8Jxqkd?&D}>Il~|p9{<&=T-M3}aPpkGdAAIoc-Mifl zpL7H`PCYd;X>~f7U=R~qJLOE$#y4fvtFJa`Pd=$2x%AIrj>wfExAL~ftrz#2e|~v@ z#)D*|nFp?4zkc9ihR8;t&LjSff9mW#E;OWUzS&T`Q|80jv%DW3KUP-sTYlL>s@LsR zgbZK0)m%G!d*Qqv9q7)vncq`(X`FS9~-JU$ewsvqSSvh$&sVe#mVzh zhDoDC!@-0jj|+Vmc4}s5{P_A+bV=R*{c-De#=Ns!8MIPiX4G1>O-vJH)HG&%)z*e_t8v+X{$rSsdU3zs^2H^K#V4P9^08tA%j~mk#Z$bNPVte_<36l5y;bGm zyX>t}Y3(LIHYjb3=-H(i)O@c0_~P4d)pQy3rgQ%a&}iu@P^|xH$)Q@;?Y4Mh)Y`oK z{F4z{Q@I-7y?^g{dObsyo6eP~=bsyfI9-1Iwd?4k^;LAbvZfxq&xDin+)78&qol`;+ E0IaY&3jhEB literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/palette@2x.png b/Telegram/Resources/icons/menu/palette@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b88969cf1d5ab941987a4225427fc8cc74dfdc10 GIT binary patch literal 1466 zcmV;r1x5OaP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NHBuPX;R9Fe^SXn5oZ4@>h8IS2? zo=PcWrVC>^i40|kk_$vi;!2SSNs5Hzq|Oz`7)2Dyl+dBfTp*DQ2Zs#Da1j3g>0kBw z+TXXgZyV~rurGG&Tkm?FcYSNEcfD(G1%;2#M+811@V*gHd=0(6zP`D+xv8nCiHXVe z_4Th`zxMX_c6WF0?(SYgD>v5O-abD+e|C2EAED31#YKC2dwhKS=g*(zrj{4r;NZ~L z*C*tLfDWD&78Yu1YRa{X*pz{{va&KIB}G|TnQd@#aUZs+d?VFE5>(oEW~fwUxbeL_`GBH#9UbeQazj(?iJ1%cG_H z`+GMxH|~;H+1lFr_V$)oVq#*rFoc0^oSK@-miqhqnLZ;UgXtk4klo$gwA$0t!(9?9 z|M>BP@Esi;5}2^CF!FVMeO*sakF5p;1^xZ|7pTq6O`J8RCjsSnb8|zSI4BaU&pcXL zSy9#zVLLlJzBLY7KtKTh)S!%@m(~o?EXW}wm(M9nlbM-G$mZr|S#~1UaNjX2TU%SA z#SvjjQNrNhAR(ioq5wcoOH52e!$sId;r}!G^5qM))5XO_V`F0i!WCjh62wv=5xA}a zL&_=m-@kt+7To08+S($CN=ixyh41q6azY{Gq>PJ;6Xbd77Hk>!k*caH9`SxxS62`y zP7qKco}Qk}QntXoE10~swM8gtFDBp+%L{rmfoEoBNWd+&va&+*v)?r}HLI(uFvDR) zzb1QxM>bI4cEq$rnEm~I5>P-zMMXwNM%aTXW%FVcmKawMR7`D;kB?-}?d*aK0uJHE zAX79O5`O>wot~a9h?lK|A3HlcTpQLzj*pMIdL|2`jKzS3idnx>FfcF(4h|-g$;nAU zHUWoN>Abl^s3a{dE%<@U2ZNiSLjp>?2c1krm7NX&J9$)}K7FdIt0P+E(cj-+9<+i2 z8?5~N{NzLOtkKmH5)#(d*2o)t7Z(@vtezACMU6$=%q}i25F#TZ$H&K?%wgwp|K*rF5V5qCBGhA6&876=BC{}QHcc&LRKR-tX#lXVD!#6fISQz*MR#}4; zLnvu8Ha1427}F%zc+UtY8!aSU!MrdqFp!j#gfimc1QbsLsKla|m)FmqKcU3E=IiS_ zJv}X9z+5oBQLdprC*p%E`%jFF&}v zsHd*3F4~fPV+t4<8EI;2LTg}6NZKgKWqUK($H!-4VuCru7Y+{((Wc*QKaoV3Vlgi- zEiFkngt-O3fkcu>Gn3jFr2)8l#)sRR910 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/palette@3x.png b/Telegram/Resources/icons/menu/palette@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..444a7c92892094b084379b486fb1c4cc8e381904 GIT binary patch literal 2089 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 T)BKM700000NkvXXu0mjf8nydR literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/permissions.png b/Telegram/Resources/icons/menu/permissions.png index 6c494262c9a8b934ce7ba6fe0bedbde78944b1ac..ab4309f711f14875c35e7692a65118dca66e9c5b 100644 GIT binary patch delta 554 zcmV+_0@eNG1)v3xfqx1~L_t(I5#?09%dv43e#kc^7RsW0Objwe60wj{2Fk{uj7*aM zfx8Lt8l?ugJEEWj-em@Z~33>)1cU!{GpMym$W^;gfqza(L_t(I5!F;rh-q;Y_Fpp@O+#rWTYnd7b~DLNHms}^%8pXD zgt8Q}8cSIyE6Rd}SV@`96bg$evY1$~q6jnI`<|b7-O)8!zV}=3o$q|-+;h+GoXcYU zYlnMDK{q!ykB^U9t@i5bYBrl)5^}0hsZ@nRVZC1e`g(dl%Mv(;)nJUsjmdvqxj3S=1!270~z$g)^mE;kqqZZ?}*tw!gW zF^9uxG#W^xR4N%2p->2Qx!rC??~ybbjnLuA6vbwVSm;bG`Pr@mltFyl}hLirO;?J z_xJb2#I2i5rr~f1na}5=G)I65OsCUu=ks~AnQ|Bm29P*dvA4Ik)oKO2SS&mq52g7A z$fRboS!@7tph04>7|VsoOeXXC`r7Sw@ydZfKqixY3#J>;y}!SsE<)mt|CF&mqtS@2 zJckc+Bxeu^=JWY(w}bBa`PpnXV<)lbVDK3^7fk05iSX>(+gmdJUaxn%-MU<^@pw#^ zUWDWE_~A|Ve`v}@VKmWUcX9W4qr1C1xUglIMtl`%vi}kO1_nbZJr8+P5&!@I07*qo IM6N<$f_BR<4gdfE diff --git a/Telegram/Resources/icons/menu/permissions@2x.png b/Telegram/Resources/icons/menu/permissions@2x.png index b3f0f947e0e790d4f6ca914ff05549f9f882ee8a..777467dba5af7c4cdb09dceac3b04cf998525c79 100644 GIT binary patch delta 1141 zcmV-*1d99c3g-!sfqzj+L_t(o3GG-(D78@-{$2AtMCKKuL?}{7Sx^>~Aw$?0HrTRY zL3Wl%krXRz43Ut`Wg#R&79#UJ&%^)JTc@vczv+Hm|4{c^+|D`g^FHVK-gD0Tp6~wp zWqM2zFh$@$jDV%3%m3<=5H++2u^j*ceN($bP}oVC?%Npe7mpvKzT8lw<4f`WpC zE9K$g;p^)w1TaTNCA6Y#m>?7i@;^E{;)tk=DuGPROo-6I!2#={frNB*b%h4Biq<&8 z1R>hQj(@{1oQAdU?(T|kdq!@8&; zqobpNfq^I#!e|k|&d!dK#p&s(5d>{+ZW3>7Y%Eit-$0y}mzVX&F%lCKL*sjUd!hgX zmJF#3<&#+A;^OeGqKxu`IHv?a@s~#`Sh4Wk-GAM5V)5J3(jv8uWQg3{+_15TBqAb0 z2B~1eU81kAkEzj|)0&%`iDYhWPGL$JGwu&VLqkkWeSN(QSjLo_o6AVB;xb4%6E+GK zn-Nu4SIeQLZ3P7dbk_z|TU(nnP}bt;=r}VoLuznDD=RBy;o?S5PtW%DcJ@m1^Yd!% zPk$m@E-o&Mi;F~r8)`{Oi3kXpUZ+FixxKx`Oo$&!mAAJyDq3)Ga7IQ3u5b7E_e{<7 z^fdOhD38LRySqCQ2@!pKd?4Ub4%yk+Y(AL=0^Hi#s_}cx!NCC+C}Mwmdtko>Q4t!38hK2%)LVpM~BO@dFZfu0zvr0=#ky=7RLa<~g_{Yb` zxQors&JGL=?C!0E)S6DP+hz70OtKT*!364Hx7>nI(!8 z<${zVL}bVX`A8x{lDI%gB2x(&Gmnw^GyMNkyLRW@XL`@!`!D{u&{}&v>)Gqw!&+;f zU%!6-epcXrwgL*@^*ss-3f|t{?(Xj9=H{lRrnk4ZCnqPnyMMb=Q&X?6uirHbFCJT4 z+lGdQqobpLME%|0-}mDrUnZjDiU^VczD>!$w}&r@^6`ggTu(k zh@+#U;2awp8~gkF=jZ2odU_TX79JiRDk>@z@bK`En3y;;G(<MtzdAfpvQ#lTH$ZEdZstrf=T>+6$2 zoNHk#-w{+wvhkmvpORye%DAwwK&Ub@GNgjV0)KFyX`T%a4;PD*Wi5w?km z34c)#iDOvarluwu&B4LJSDF}md;9I}ZNi4j;pyoqadIJ}l9Ez;dpnH=Tvk?ALMXli zk&%%|?vxE(17A;qLlN%j>7oAX>+5)JiKFoH^2*K4#of`=)MPLy^>_e{jg3(%2o)6- z3`~lOs!rPs_%AOn3nzF=5f~VVMwZO?^ndh(xtp7t%gV~?>+5lea03KGLGI4X%%r}& z1Pu)h!4I0BpQmYFq(3@Q!6_xkDEmP{K_W>c4dRtaNoQtebaZqipmFNy$v{1!j)DTl z=jP^6+5nb7MNORI8X6iJ7Z*otlarG%F)`@KD3l0j7-*Y^N3?-~0U5`u9=94P3V){! zTTI{fqobqfkQfraYH4XH`8YIC>gwu@o2#qq&d!eD*HfAHH;juMDyNpwb_t7&RKd`7 zbaY@zm_eeBkB^HSmt&9YETU1me(j>Z)K3 zLc9LOc9xlu6A)vgsv-zwkX@+h+Xc}9Az`$%w9v`i+}uz}prV`Z>guB7 ze?#B|w7I!S=0HgoS=Et+|I^>+kd*iK_UL711oR$8Mn->QRRlTN?1_dKPhGSMOk%~u prLCCGJ*zeFbN~_TBfOFrAglV;eq91pMN^T zuP6A=)7opVdGEdUTKhjHlkqbmU_`)(fDr*B0!9Rk2rN_tTz?iy(Y&4w8#V+72mdqo z^Y!)p^5x6FbH6ul-hBT2d7kdCfLvW&ckbL-TU-17{rmr9ezUW)j~_oSE-qfbe*ItJ zlqn@8<>kwlGVVyDZ{NP{)b4HExbfb-d(yV6VP|G$8XFt^{QR75^|G?ECMPH5?8nB# z>3a9>-NeL%9Dfb)AaJgwD=jUB>4L?-fB)|4>NPv9o zzyZOmSFc`0Mn+nt6+(n9IyyQU8X9Vq5JwVk-n{w8kAENBvChs;A0HnZbRh8z3=D8l zy}iBO-rhEdvX=#y)r%J|xGA@8-CD9_iOq7?tXU)YR##VNvozZo^YZezSGc>76>Jwb z$B8}6Q|r{!)Vg)+?38I8`_iRLd31mN{E5_Ood_A~g9i`tcwM`8O@>e(bbfw5S6@|C zoxE~mY{opj^o(O5AoU%osxHa0yy9VM}Xj=g*Ll5hYg zPMlC6cI1?&rziFv>8`J@*CHJ??nb+@|-%(e|jMn;Iy-`}5L1pxUyDJcmz zQd(Nts#U9=Jb6-4QSs^1Cpi{e(`(nRrCGjugmgS`7fRYLT3V%n@Oy(HJQ2vruH#fJKm>3#53P24&qP~Cs z{`~oK8tMh0*b}OQOap6bYN}B0;o7zKc|%ptvSrIYe*8#|A&web2UW?^1b8-_o}MOs00svKQGeP> zQ`>0Z%)CB6B)=;2{tf{H744+<`uz#$qOz^6^yIV_wLYQ~#*pZu?8x<9$Tq3VnvEt;( zlV87n6%--ahJ}S$6CBO7m6er(GQ6;B2_c>q;Xm=hX!Oq6+1YRvFNFA_i4UCd@$rWb zA4VgC4w@(l!26_LZ;6*KT_QDR0M99Sz|j&G9Cv}&sv*vm9+jsFJEy6sNq;bLtJ7}0Fr@pADNN$So z*k)K&8ZH2!)iF6!qNAgQhXB4xfN`|&4H|_X{*xmoL=U`D^3b9W34eyj;08V%^M@Up zT6n;&6+>pjQjpPi@7{G1uV9j0jvYUKoL|8YG1dIq65ilZPM8JrE5dkNN Z!2cv`9u)qszij{j002ovPDHLkV1hO6N&Nr- delta 1836 zcmV+{2h;ek4wny*fPV)8NkleZ`Xzkao{Rr=}R#qs0E@87=(;Hbw6sNw7U}1+ zLQhv$*RyBOj*pM4x+8NF&+X*NlXK?Gv4WA>DD3U+4JmC2Zd`}XZK=@NB#)_<&7nVFf!v-H}vYnpHqFDuD?L4(@#^Nyn+W&%5$){oy0*2oF|bKVN#x46Ii;Igk6gh49_Wu2Qirm}V>*VAlr)z<0=gys@+(Sb{%a<<~#S;<| z^5e%3ihrM)nkouh4F`kz{rh)Hyl2lIwGP_vWo2bi{Er_$&YL$+JB-F2IXO9$6_H(d z?1CH2gxtS>zeY2)t3Q7Hm^y~_iXUUch7Fikuo5Z1dasm}6v}e(;zf0RbMInBrhISS zyx~MdyrF5=@87=*3JS1-DRsvpNt0nC;JRj~qE-5i&bFRD|f#47%9ZSn*sa716c(9lp$VC;zV^Yd}IoR^n}u~0ebLTZl(($LVr&>5Nl;berG ziIp2QY8b>knSp@;%)pM04jvl3fvCXHTm;>5X!7jYGaRX7M+`r`yu7dt4}S;<*s^7d zY^@)`11qGk6&Xd9mX;P~@Lg zy;>8UY31zfY{r7;&!6K>Fn`^1x&}6a6bHwGw{PEOR$Hoowf@G98>o2G%GY#A-j+=8 zK;0PAntot`!(U{aI2TtzMUrYwD_3J4#l7B-yKzfDBsGg(5 zO`|!zOXcR~X4w%$YMhUI77XmkN&XTQZLEb3{Z$pm@fkkK#m4 zO%0ExC>@!p$Paz==uxVSuW|4~(kqY==Y7q-+R=LQp+kqH#RmdDN0Sy%NkE29 zbu=BaSkDuNDKavW8qFi`-Mg0onTbuTV|X$={up#Vefq>KeKXN3gH6%V(aa}4N`4|3 zTC|v>dyHg~U;`Gm45v?@-n41cf&~kd(D4}gD32-rrzHUj^n a5%?SOS787ybak5m00000G9D{Jg{ z11T*?j14x1#7k_Updmbf#%PR0W&h;F<0u-J&6d(IXXeaz=JHo6pYOjWpsK3ty5sTK zG|g(Y`bVr`80Ygjj^oK>a=Bc5->=u}rCFdLc`z7=qKM>HtACYc8Cd1&;uJv;cnM$u zjUKt@iJ>TpZQIl7bhTQ|=W|vIrLY|IhJwkvb;x2 delta 437 zcmV;m0ZRUe1gr#*fq#}sL_t(I5#^Mzj)FiChDEQju%NK821!id1$+e1l9JZgDnT2c zgPzLx0%A=<=qwZyNqhuqjT-fSvthH!9(e5?jkB{eAOGzBSgHKkr}p7w)oQiZ>-GD6 zQ4|k{!-rk(Wvx~#ilRsM1VPYjHs6a%*P!h8`|I^O8jTc1nSV~Fx7%&I-Tsb6DW+-C zS6Y?@7IX=MK$D!HUaw1%)NZ#`RV7+j3Tc2Y465roryr?Kr?XnEE|*Jo8V^jAr=Suu zqQJG!$6QENq*~@Nz-(<+cg>u{&tpy zMkvKS!V_8U^?!FT7(j3sh6OA_!P(&+Ub|mcxZ?uWrxe2ciG@4DMCDpoWn9*5HiKAr zf~}-6=d@rmm(0Lc#WMI3yDhEiP;W`~|OWHXD3HY@Q!$nl_nC f@)Umcf69IXeo6EyEm!zK00000NkvXXu0mjf5I4`6 diff --git a/Telegram/Resources/icons/menu/pin@2x.png b/Telegram/Resources/icons/menu/pin@2x.png index b80a0d8cd509022c7449c285a8f81924b739a427..08c7978464f5234a0e1b78418ed495d643a93cd8 100644 GIT binary patch delta 799 zcmV+)1K|Ak29pPnfq(r;L_t(o3GJ7^OR8ZM$HN>Fmns{M=TbDCCY%YPh|0E-i+0V z{~c+#yu2JMfJL5%mX?;%>GbC2ChIWPLF4s$`M!~kTYs%q8h?CzNQ*-Q9?;RzkwlZt zW|PU}+uK{W+eLBE>2!#rUa!BqyHiMmy8t03^MyiTh(poz=H`Yx9En5}9bgL~rtl?c zLv6t;v1QpiXJ==m;`Q})ZEcM$IAKRlgW7_6H{k$l8@0O8X#6FUoCdW8^^Rpu(fZ!r z-sk7%%zsRRX$W~{rXd>KqKbT=L}&)4InvDFr@7Ni%M^`9DeaKOA|o{#O@*<;jY>dQ zS68D-_$$+0P^nbv>FJ3yI-O2T$KFq^R*P?yvpXHo`T2Pu5RlZdm~i`%%<}TGBrJXa z8VUrSsB4`23Ew~@iApD)gEY!%9v&W0j5zspaDQ+>K-bsTa{(HqAu}wd)6-J|!azI_ zi-yCL$z%w~?REFHhFH-*p{GNi84ichkMmz(>Rp@7_W1aCa&j_byE(N%^?>RD)dQ*r d{umPv`~nm9^fmRV&o%%6002ovPDHLkV1nR|i(mi% delta 770 zcmV+d1O5Dy2lob$fq&siL_t(o3GJ7=uPIR!hYz745si*Qb9zDI(U5o~Cs8Q)2ZTmP zty3zrq7$7~B^sULoI*o=D+NIW1>xM^z3XN&na7^lW1QS#rkJqydVI5H?X}muy;+x) z0V@Mm2A<4-&*y8m+l$5GbUGc6$Is8tR;%UpdY^P_(7aeI0)OILc5S!YY&L7qsbRBf zwfcBGWHA2(x7)2$Dj9apZ78Ne>~6RF@$pe86ned$K>2e_Vw(MaAB)Ar4}_O>KA$O3 zKfxrS35UaC8v30|rNm5`Oh&F_jzkZQoC!7ll6|M2hM4f~gnB|RP)vzUQ7RX{zrP2A zL6^&grR(*2xqnDqO8rWVu`}QM`dbK!2|4bUNiih9n-3qYsf=oOcXO zg(cxgDwoR&%lsnL88S*VaE>#W&&O;wBV%}pMx%VjGHo#pc0SHvnTnPmkw~CQOktAH zpa8UjtE^Wl6`_wA&XZ|01oS}^pL;OV5fJ8aj*tvh{WNkW;bq|mz7ZHv zIF|bTzTg*oimI4xk9rciGuh%Bfo-C9)$Mi*ldn!1a*de|b0&H;=5c%@;JZa{NKL)* zc#NlsXQ|5*lp1A4#6ywK_u&j0`b07*qoM6N<$g7B1a AzyJUM diff --git a/Telegram/Resources/icons/menu/pin@3x.png b/Telegram/Resources/icons/menu/pin@3x.png index 2f13abb0aeafeeead0103b086e2fe71ee2e82c37..3540c235c71a915b2546c38b0edab8d753193a22 100644 GIT binary patch delta 1093 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 delta 1308 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 diff --git a/Telegram/Resources/icons/menu/qr_code.png b/Telegram/Resources/icons/menu/qr_code.png index 6cc94fd809b3d13cbef51b6108228ae1593dc8a5..81a8a966b7ae7f3a37310d494174650177ddb880 100644 GIT binary patch delta 505 zcmVlqfq&XbL_t(I5$%+_j)74Wh5ZZ~bSe}SqEJ$5RD@ok(GZ?PrIWZu zK~y||gf~#ppb!ZfJOB-GnJ+oX`7fC<-BeU-?Y;Ki=d6DpCe!ElmjjAHkWQzQ$)wF@ zd%a%E<+9yw-)=WFM2f{?I2=|Kg~)h39*stZT9wj;`qSyO*?(-d+by`+Y>ITN)q)Zv zg#e6Ltu&xUqk)K-BHrzGce|ay0I0wSkRjHVo3(`VUoID>iQxHsw%hFj1E2yUK!#Xb zt80Y9VzJ1y*=&|g0Z^GjCQ~B#C367W&FAx6f#H;8GMV{&E(D9k0t$XUpH8RK@AnhY z*6J{)#a-+;9)FLA!(lR+1Ofq}06+xYQy0W zcO#Jq^_5BmoXuvny>w=?yQNa8*Xv2M@gk8(P%xcNL!l7s1D?%htJP|~UTYiaaHrE@ zcV(zntKqJsfLtzzAR3Kog959o0cT|&kB1cTrRA23AaaM|!+X76sgXd}h}YTfA=>jek3Th>{(Gu`)e;3R;$%?I@OdHbUK~Wg>ARnOn)XLBmnM3@&wsiFFt31 zNBaG2g+jq`oL;XdSpY6U$;y_L+~@^^My#4+G)&w}OyrvUqGdk>ZX?vCS2!Hjj$jEA z0eDgpRI&@W6y!t*nPRb6Fln_~6-KRA!zCzLXpkwL?RL0_U&xydI7JF_aZ8cMk550cMPvw zE~AlYnqZpn;xT}>cvXaQ{eB+_=JPqhSS(hlRM3SLmoCbD0CKq;Y~HT&xFgP`E~5p5 z!Dh3W&*!g4b5A5w*tV^eU>%Jh_npmVOQq6!y}tg?+)hSX{~h2&HfvKozs;D=&A@nd5&WRkx3M!PZX-wu5OD=Q^Pa#|dM00000 LNkvXXu0mjfdgJ5{ diff --git a/Telegram/Resources/icons/menu/qr_code@2x.png b/Telegram/Resources/icons/menu/qr_code@2x.png index 019f62ef00bccda37ff9d998f68e2eba49b1a08d..7b872deed1499dc16ca75d4bc8c1fb7c6bc78c25 100644 GIT binary patch delta 1004 zcmVhh{@H60N;QwaeODN$pGcz+XGF0>V`FVeT|KZ_58GkoONJz-b%ZrVTRnhtR z`Ptc-4kHBh_4TKxr|+)k<>h61dO9sF&FvQw5ehD&cUL-$WwfLymiO$ z;NZaOxUu(~yq1g?VzG#Kd3m|DwWWcHT3%ir9UTqR+1WWbIH;nIj*fwW0fw)yudA!8 zkB^TkDk>_HjDNClSy@@ihYFaAyxhgbMO<8*!>p;PNu;y0vsN@WHzzy_mIvbmS0a`7 zbSTL1Yd{uKtC-w8Jv}+pHa0edQ8gK+r>6^01vSKprrBYoI)I=PvP%CF`xE*o+d(r# zBN1E2#&(dZCcF;4t!S;mCKeM+u(!9z)@5(A!`U*nNPh{|-Q6vQySuyA1H-biG8h#4 z`ugm)hsPBn+|t0TRj8PTE4$R=x2C4Xx~r|N^-vbk)YOzU2?Nu|yxXqyK!-<2k2#T> zfCr8`@#@qlu{v#SZKPTo3?zlZ(u|LfFDxvmBMZn=V`F1}ett~MuaclE(z}O-hU_|8 zD<6N-41fGQvH$E-Qc}{;(2$grbaZrNJ#(NoH#g_z=F(8!-rlSz3`|jTqu@yYZl3k^ z_0iE$$A%ZD6%`c(lU>%@+NzO~lasHnuZ15Q8&f_!5W%+Z?d{b)KRG$6@v5tU zQQi%L9v!F-4-e<$ zuAQBo<>h6(DH$Q)ER>M*^Yd;OXwoUcxh2hFCfhWFWej`ZGG5x^aAlt zE3z(ndU}NCcVc2fMU|D6%3obwDIXq);AK;~y}exn(~2}6pRLMs=~F&zz??Ks>JdPO z0{+>Mn3y;-GegmE7t7Ahw((dga>H!6zFFRZKe#c9HuYq`HADG3#u3IJ`Wf&u;Ai0T aWZ(xcPg}~ae)u5(0000Y~9A^=hO_aKOB{ zMIzpg4Dur!wY6GpFc^rqUa#l#IZXihd_J4ail$z#4~Iiqy&W0B4chIt^kB7GIT_Fk z0ZfzN?Z_Y>L?+-Wwt7Pj^<;{PA_;U6Ks}ij!CjC=`b#k^=vue`Nr!M2%Sf=pokOCY zOrcRE!E&dbOn-~;X~`nuW)Oh$20NTvLzD>0bBN3b9mPHH>wVyQI|i0QgZGu>?I@|; zSI4*QrEYt+Dg-aq0c{QWl^To1ip3&)r_<^2cr=43CepNmu!rw`!XhQ=$mMcKuv{)t z8EaBZtVRQVySH2}%R5QF5Sc?Ukptkq%g~#Czh5eqOn<6{VFd?FOaGwg4(I(6Rpv!8 zT_3|EFHt1M?BEB0OqhDSyVL13uw}Yl2N~UNR~7*Pl_t1K5OSqb+3)uVbvm6|t(F-f z2)ox%5c^(zqtS@R9e>m3dUq{OUsIvp#wQ*=MjoYWhY zSh+l@$A9B-DwWD)GTZHTv)Py?9+)?U_1JSD-fA4J% sMF|6F|XN}@<6lnlsY;F$r*n+ahqc?_7! zfJ~HRLWH6WBnB9GlQ57_^2l3E5K_o9ukZfq)N0?o&pG!0?|*OV?lW3z?cd&O?X_QP zuYG>~QlIjG@__Py@__Py@__Py@__Qd|I7n+miE`v)3da+G=DKM(bw14-rk<8{`U5E zdU`rDGt<@8_5A$Im5QvhvvYBAaY{;xzrVkuqaz1+e}BKcyquq(@9gZnxw+v=ZOLY4 zW}cm${gL?g_V!|9W6gB~0GLE$f1nhq&0Dj+6iv$*L73Oq*NBJ+BYh|WfWR`uztT6% zK*_OUP2AYn5Pv5ax(XqRSfmUM17L=cr#QI-#~ZO&SAKqeRC;o9f`tT^lSCt2TwJoU zvV44eG&U?OEH5vwzrUY@L5Ly}Vj+!A!0szdqi~~av)PE5eW^e!__AjFXPL4g0Bp9oQ zhX-Og;{5!4d3l+HGo=8bY{D4 zTjR8AtZc`0EB|Dn>ex>n9X;FBi0OIdC(C3<4ACuh1E(<2x&#YgD-xI$vS0$R1Pfp* zvKWz;?SB|zcB+in!sJK|4GoQpiz6^wQCA2ss!$O}KoQiDP`5QIWeJ@_hAk!h7Y+}YW|!OEUjS`oYpLva~lD-ulvTC1q2&{%+1R#ujlmUKg^n3xz34-d8?(Y7I= zUh;}T;SY$pxj8#Kohu)NC}NQ^Gz?%}W}A+o6@OfxFhnvIXqdaZJBnXLBTxi@d}~ns zsqse#ea zQH%!FG9oZ1v$M0mObrYU4$AL`M!J+-c|dtUc|gJg7VnA@ZAw9qs3|Kei;j+dd3ix5 zXMcEjShreIQc^)d0fLXMt*zG9*8BT=U6?4exMQ^4n`eT*-0sK6$1^fA$e^mKs>a4f zVl|?$u#nAg;WUFI#5j(tWesbq13Dxmgo`<@uC7FbR##U!7#k3acq=6~45=_yoW)?p zI1u?p4pv@XZl(1`)odFC{|6%`du_p+NPlo}Fm)U8tIV|pkryJSk&zLqs1e)S+Y=KL z>>6uoYT__pA>`H=n`0F5)<|F+&5DbQ3-gO6ZdL?tX=%~bhh4FbavHGbN$E&Ctr}M$V0d*ckPfw2sL$6rO z_4T#4x3>t>mB>y-{6&(MmZmjFk`W< z2=--+%C=x}YJh$cGtUIe{757g9v&VQ6@_RJ3)tv=2)hN=m6r3siwtYJqLl}f2b2et p2b2et2b2et2b2et2maxKzX5gVIye9T002ovPDHLkV1npOzuo`< delta 1371 zcmV-h1*H1E49g3UfqykgL_t(&1?^f(C~i>{_DV`35<(_QnR=BnG7u?7!bFG^Mkoe% z!VnXsL|!RnX26w!sR#oTB}(!rdE^lx-23IP)oPu6&OYaN{_cNkpTXbSYk%vp*V$*C zwf27^BFtqXU?N~5U?N~5U?N~5U?T9t2t>Mrvt$)qU%}q#1unK;DeqLQ& zZEkK(OiUac99RKLPJVuVM@L6#X=z$oT6A=@74!7;bbNfgyu3U+JNxnRVFmn%1M@pO zJAd3=Z*On?{ryTWxf1{Y2CzG=f8YSz;2M5PL*2{Ei%atao12?+HatH+Phgh>-0*E} z*n#fvmGG~orhmq6ZI}{ZmqR!Mm+aIMU;m7?wY5!7PLcqK_xJbP+gr{F(6OqoSftPfxS5vN#_)p_y|6G;~5U=eM`FPfbm6PB8T9>MD;VG{(in z*(oY6E{1;`UsP0N1%t^k5P_f-7T~}fjB-3&vIBeIAAcSml2SbA4yy_%9UL4aJcx#d z2CFeJIR+wD4ClZo&oOX`&noFCC6_aKW=CjWUtjsGmB#ktOfF7*!4x6{BLYTYnubE0 z_?*x$jHCY}+AQopx>?_@nmcChSeQgWzZFrlldqxzAU-DqhKmzSFog)gIKeSOoWqFL zFASXsp?^``IFtwhSXEUO;X!b5;tQq_As7)b%8NB2PB2dBt4Z`%1qB5pv$nQ2K0dB| zr6Qe6+J4~z!MV_ zD}O2~va_?1%GcM|A08g;1PTiakv1`ll)JmTYX{?eZwvD=-RI@yZES30W@ZMwxwyC} zFE3XfKMfBL_xARZ(<37zeSLj2^nvjA1--JeB3{JcSiQu(5-<$Gv?7Dypo&2)V>RHw z(Uw$ri3@S%YaMmHfMF<#edUt${TRe>>wlY?nw0W(%#4hTrKKg8g_WI>(DFmnwuE{s z>XXOV*jRUWHwEwR?#@%AnVz1m++*&O2eL&^PY*fZTk=49<-1&aG=Nr^b7<$;9Ep(9qD)(SOn7 zq968QId( zBE*BfX<@Xm`1tswq$II0@vo@9*!0ugY^ifl&^_XkmDwW@cuDm($bJ zg5z?iKQMKv$QRhazyLmYsIRZb`G3dB$q8Pei;IiFY5tcBv$icb3I6qciN)ac<+W`Q z8Wh7&{J9P@s66oeP;v(ij>3FI1lksYfxu7+^UMsz=MZor)U~31o%n!-2Mjb$&+(?V zUZ_h15>*TR^B^pRx^2-vWBBF_)dMfmQ23xL5soT{D6hi$loOqc?;nZ%`&6wMxD{BN z`%lHNSGAw@xlbPGQ}_;dnLPCU80|6NKg6`Ad$J{nkfeKI!wgLXOax2>Oax2>Oax2> dOax>E{sM~Fs{jmqKJfqm002ovPDHLkV1iBHj`;up diff --git a/Telegram/Resources/icons/menu/read.png b/Telegram/Resources/icons/menu/read.png index 13decacf38567d309a597873b47824c4332b2dbf..748dceb4068c6370eb38cae79bad24f8aa0928b9 100644 GIT binary patch delta 656 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 vvjEAw00000NkvXXu0mjf($2u_ diff --git a/Telegram/Resources/icons/menu/read@3x.png b/Telegram/Resources/icons/menu/read@3x.png index a5035f7353f16ab6bb7dca0d409e2467cac55bd2..bf5e2b7eac57e161f3fcf164dec8d8f3058b0c24 100644 GIT binary patch delta 2059 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 Z`~xrxF0QDFJ^=s#002ovPDHLkV1kMQXe|H$ diff --git a/Telegram/Resources/icons/menu/read_audio.png b/Telegram/Resources/icons/menu/read_audio.png index cc19a57215f5fd059807b61a3fcc31244b278317..d5c17e8eeb6e94981dbfe8688247434eafa1250a 100644 GIT binary patch delta 414 zcmV;P0b%}+1eFAkfq#EVL_t(I5#5xbj>13?hT#ktWCnc3Y|D*tv>i#uyJo1IPv z&iQ=4Ua!UEoM^39n@lGA{r)4hZ~+PBB;-QfZuf9Fpb!MXXn!<%j~50mAR!33i5U>m z?RKM!e!rgy#10@K2tR01HXnrAZnwXx2to(~w4xpv0mZ9YTCG+XhMUc%*XyNqAwYwi z1~WF}WDpASJTHo(-EQ}IJRHZVR+A%!23avP1}DvT7^*_&^ZDg+sn_ev<&w~9wQ4jP z5*?4nAfzbrn}4$8zMM`cg@{2>gTY`p9NM-$o6Q6~9*-E3B1j@6e(|2}PGcrQ++AX( zX=)5hNnI-TC{cfi+%jgWTyhGF==zuj(MKK{}!Bt@0; zM4oeswMuxjqD7C)i!pQS)WQY)?ujM0UL>^rw?8&b?iX*mpA$z1tRF*0LMf((7Z@Hj#HN9>2z{k zSJN~R#{dSnU3->-oU$&y?-i%nLvRw&#j*(TVKe*V9@CQ!3zoc zZJ!8S@A+siBhVK!qRvad5g`ZKv&WZyY=Y~L8{Z0`ED=v>A*%5J00001t(fq!C2L_t(o3GJ9MOCv!P$CDsv(u8yx6f~e!zJQ8|g+;Ja3qew; zUm(~7v=Fos`~)gmq!TPfEHs34Vr8dbAaWL>LJGAo-u<`-&)n|pZZ?Trj!TMl_RatO z=Rfmi-kUWL==?e>&{={1Yz2bN%r_p74-XIX-@lui8-M;bL+jgjWMpK0ef{$C z@~6X(E&#xMQ~P!3@9*E=->+7y4odzo0|ShUuTgx2ER)G>ZEf}R^ymODFE52c;r{+! zVnpB=eqv%G7K-X^kdbo6pbBjg5_9&_|R3}j*gDb z&(E{jY$Ou-^0c*Z*Zl;ot-lTfX-$p^Pvb6LT3Qmh@_)R(zIM-qkSL)$(yWeDD!et!P>`B}wnZ*Lp(6C_Xx z401cCn}wV!o{VHEhy|x3||m08}bn>aiUYvYW6_!^KWz`1trR zVrq?dcYk+dV`I8oCnqP-H#$06i=hn_gksboEEuyOl~0|rI5@q&zrVB1S5{VNfa&Y& zJ2^QS92~UZl~9MU06YZwz1i&U?v9U-mr5muiAJLf3k#OLq0rOQlW5W> zrDJYx&T)!?KvSi|v$!rVFY7G_P2XNznW*RWV`gUN`1ttj>}+*)H5?ARtW689AFy*G z+I{PShNkwq!b%9*>ynSAw)+ecO}b7TC~l%0;BWd+3`$(;d9t52H#cif(_j0PR=J!z za)I2{H6J=PfC1Lxr6jFykTc2ST3hUb=mOBlr$r#(BV_iOQG?s!A69l{9ZP2gIxFxG at-vqP&Z+2FFy&qV0000L(lu{T=exwYP0snx+ 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 delta 1547 zcmV+m2K4!c4EYR@fq&ykL_t(&1?^f(C^l~tcTYknDJd+lK)J=rtt?0s8;Pvk%9@fa z+%_aBStvWQ5lPrs*ddn<7ATjJTZ-H%e82CTe^2LsX5PoVW5)M-zj+sLXP!Cd_x#S8 z=W@<7a_&0hfz_rxlDmJw20>lJfHM5`PmD6A}`lqoad^gM)&C z(AVAF-R`W_V#o-qp1dSfVhx*`T6;4YipWZ4KxA@fM!M9AWm#-?EL(^9`=}8m{j;d z(4!AnfE%RsMSnA_4OdrJj#wTY9Ssf+78Vv_@lcix(H$<)h+9yAnj-{&qYGj6O+rIM z!|Us-n$z|5b$54nN=k};9#Dn}4Ap4p0v+jx`jV!%xA)M{kebBv^K*ZHe^^+UF?1Nh z93X0Bbcarj!8&23>DBb~G&UVJxgilTS*%WRzl8FTVUB&IZG*lP5w>~(c@EPHx-dTMKHGr$SmvHcB{^v6Y8 z6FgYXj%`$1m9!QW713Bw8I#1oCXP-i2q+l{5FzN{fij6ABJuf@7P5qslM`yi&b4btE(x4o}L~g@(f2&06Bkuf1RArHH8JB@zI!^oJ_G$V(1}JUtdqHa0x3c zi7P8Bv|W)mH#ha~xva(kJqaH#$vu|BVAYl=%Wq-U<>cfH4-Yf7)YR0Cjg8{sV%DyC z$$tniddx)T7|xie_QJvfy>wPave(qqgn|0__(*L-Lqlh0XFEGPy}V>(V8RG6dK43~ z3=4HG)jl{lpqIwv@$vDjtgQY0eQJ)`f(!#2vAphL1Q{jE=p?$VgNAqae-A&5MhR5fKrh@#W=ZYimnfss&1e(o<{dbu2J2Q2yxE(0`H^ zyrYAydOs=o5s|)bCxj8H+ z5*$VVuWTgBGRJTtO)d53KGcfIRaI51tE+KwakL%j6>?lG_wotG2rzmS5VFiMyuYH_ zsIus#v$CI`AI>Dl#>N5y0;nzOk$;ks66MH^wyR}EfYDRyJ8UsG30_`a{>~)Wp;x$J ztZb>Nsi6*_ghQlVt89U9tkA?vkVWFpz0Ax^>X@edmkUksG;lP4xx@-5=9^0#4PZ1H zILyH*55O~6MuKlR6>`HDf69P#&sVjIZ|?bW9lrVa_-Oiu zUF&Cm4k5-Qn{P^Pff@u^ubv}*1qc7i2P`)?HzGR`0=ls9V*$Z{30O7d?#=*<)PsD!2M`GduA}?V%7j?;58BnIZJ{J@X z3&s89}qVg`bP zAUKFLv^a=4svw9z76%7W!v29s5t|Y$(x9Lv4HUINkRT0G1MmIbgnBLUUYdJ`m-C+U zJ)ifS^PY!9`Z?d20F6ddtJPauTg77W?CflNd;1#@5|790bbmU(-%hjHtW+wK$z*qT z7p$F~olq$BzuZV9^8Ea4Hkwa?==1sJgANZ5d%d1OAiy9V9v*Z$9h=R@n9wPiOb!GB zNP~^)`FSpvn-47PY! z@7S-4iwm(>43N!cn`(Z&OW`#djiplQT(ZKg45(&1f-|x$0GGge% z#*fDyU0z3}9FE!S*|#aHTCH+8 z9Ad;^Fnhedz8)MLV0_rjR;z`DA`0f%U||HfC>ZC;$_j`cj|WS5dV0!aGLMgsu_zlG z8*?(hy0A^lN-!A2W-rS5 ciOrqBAJ>>T@3Aq8{Qv*}07*qoM6N<$f~9jl;{X5v delta 703 zcmV;w0zm!v1+)f`fq$M!L_t(I5#3WuOKM>hJ!%q?kBO-yiAteFVNj9}BAf{(ffzQc zK{${o2ZA&Tf)F7Zqz(GSFAXo}Tic)HmE(-a;=yewf=hnGLe?WV1Sl`}j zue0~}?M)EB)>!>IlgVV;+uI8Z3pY16-EOxZt*?J>ZZ4C_JbykuK0iNye%bx~{p93i zFJXLqTp$qiO(p{)BO`yl?DqB+B37%_X0vrVom#D?)9F&F6r3L)A8xmsOrZyxo136| zz22drp?p4nd3gz7GMQSf*8BTALWhTks29cZcsxk3*=!o2nVFflx3{OKr+U4vR;wX# zeSLj#aRIQnxPRDeHlYQ)va$k2yWQ?`xj^Rg`Bbf)ogFardi~zs9vHK;vq;P3a_8sg z07jz`g~;V{kx0}lZFzYaU~O%UD%1af`7r_>+36r!zmVv$z+mB!0n=u ziHV83ySrE{hOpUeMrl+YK{%aG{1VNcoSeM8ybKQy|KNl|AzU^Z#IRrp(b13aw*y82 zLXg|q+5*sOwFojv0=y3o52vT68jWUYX$e zwD6OSjeiYDq13jS)fTB%e3q*5sj4R28{m(jV!Vxb8W1V$l|NZ?H{2dk^AXl;Fc zot8-q);c~uMzY7_!9JBrB}~bn?IX3mzZ#3h^7(vF!8-tl!(m_)MPCl-6$*uz5l}G} ze!m|QS65d!Vrj%;aU>D}#_Ey$L4e6*?(XhF2sk+~?9KlEK4!HykOv0`z=QJtkD*g8 lmrMF35{XKsB9Ffw`~?@$Z9E~<$-CzKLW$P_oE z#D!3XGL)f+q(l^wB9gIiL8e6JA~WCr^sVep$M1L@-~atL=Ulw@Uhi7Zdd}Kwt-TH& zPy7)_KpX*a1peO$NQmY>Iy&0Z(^FMdb!lm-y}kYX{9H7gkAGHN2{|}8czb(mXlSgh zttBNT1q1{ztkcueOy<_+@8jhlGUS$ms3M%S(KGJp4&WNMvPY?e6Z99H*I@n)(NL5QLnZ+{42IK{qrs zWM*a}7}&0?tbdS#va<5*>?|p~zP{q@8XFsF%bt)&Mn?V_PEJlvguA}JPKX{J9^ixs z1qB6>L`g|$dU~4F_)qru`1tVfkmN^4M>zVQa5URSUsOa|g7ARd^UCh|W#|Meb zA15Rnil3}nT3Sfc&CQJ@I95n(Y;0(|zrW9*I4w#`OUbgLq5=k1R#qn`C*U+VILPdM zeSHNu$$!eqj*N`JaBOUh)WGuT=?M}9Mn*;k=YDW-K*%^d2KDs<1x04Py}hKZqoYG9 zg`;8ietv$$$=~0fgv4oUYm4bDEG!Tdq6J}pe?M&_A|ja1*9&WFYbqH$StFsl0&sJ4 zbF6C6wZRDz1`19HFx%GD)DVM$f&vKfq-|AI6@SzDdJ!BPOlEk3Q%Xt-*&ul*Cnq69 z`Cv^#1P@$40}T%kC#d1!Vd$VpX*)AB^O=dD94C#WBeSckD=ZKL#tE?*7#M(XXJ2QDKB1MDm%}C|CWf{>Jw03@>gwvq z2A3=A`WYD+NN`-1tjIaSp~49bp@NB_p?@K5H#avqBJdET)zwupL-qv*29jlBVj_aK zxVXp_=(ir42tiS0A+>LAZXf{^?mMnfYHDi#$_WiRHa3SVImqZ9tz>nCFF+V5Z;(waMW%m)+!omV$I620J2p-Tu>VO#ukpP%dJ{pQ5 z0jK5VWx~Z1K5#SO7XcC$gMgWt8HP-Zyrh75*xA{^jk&q`#>NH-agIhtMxyxs%tldB zacF3WabgRk1zTf*sn^lb5g@okA0Hp-6}Y;(x_*ZIBRTpt%MyMbv__}V)?3zw1GGN& z_WJr7|0DR3SK-FEi7*b}A0YV6gww%Upc3(ugTMcR7D5G1ph)wOaLm8)R#Q_GY5q4n kiG7G8AdY}I0zZwwKcnKf`U-g{uK)l507*qoM6N<$f^}wti~s-t delta 1517 zcmVSZ9M93w(a+EC-o1MU1_na>Ty|?~tEhs`&Q429OLuqoFJHc}!^@X1 zNt2I{57No_&VSBMVq)UCbWrf!yLXxN)vH%QK|!>10OAq(+`4sZc6OHCYHDgiLP9W! zjIa?N9)4a;QBhGuH#IdyT-UE(|Mu-0zz-ijz$WnK&70HH(>$8D888H!beEPxOiN4a$B!St2L}gP6Uq`w0EcXEZ?ivkDB*>Lg#

zHUepCYLeLp93pE}R#p-P5{}t{jfr^n>>2xsYQkvN%Uc6KIbUteEh z!*;uR^(sKlSw%$!6Dl&6mzRmc-`}779zTA(zrPPnRaI3S2~FfF)Pw|(rog~J@gu8ZBpH>OTyaF;6@P)(*Vl8fj*iaHpFaUMH#aj#nqp&P z8R2c1l#~Pz>z(*_cXyeeoka|UQ2?%Q-@fG-%mOWTD8^2qNL^iBl*hWdIw28+VrMW? zUS3XwZ{EBCh?(V_xw^Wto4A2$F*i5If?#xachlS>z{<*smd^0-u!e?)IK?US$&)8U zxPQLBPCJWpc6JeuiHV_L)DPOpIMt!)%9SfL5ULKH7+Cwr#HrCmfZMlk^Bdl|a|a&0 zksBHsL;{3RZEY(?2<{8*?7?Geu%J4iRM^62&WoK4l$7wm#l^)mn7zF{Hb3F0Mp6}=_7iGCo~YY8 z?Z!xMZZ4}qFGlAKy6^ek+8V5C66r6NsW@hAu{yHEa03S&_D!yVZEG+O8En8n-ALFH^ zr83OQ--d;S@fRQuu(`R3-VKGA5g6EC=;<(0XlSVL(+Vq{drswb2qPUF9NxWqCmj2< zjrN!RjpXg^%{?pJ+S}W?EoK&SUVx3x|MlzF_$(Bv!P>&qVB&ar;rojmkiVj$A}U3q z!=LyEil~Pa5XnaspsB&ZG%+!O?-Q9o)MYz6JN$>_)2B}|k5sp+45%{jzs|s4v+S~@ Tt}#5Z00000NkvXXu0mjfM<(!E diff --git a/Telegram/Resources/icons/menu/read_reactions@3x.png b/Telegram/Resources/icons/menu/read_reactions@3x.png index cf413852cf5e85e544ba98a346b2f9400b5b87cd..e39e7e45a6b30fff5f97a9e847eeff588c8af17f 100644 GIT binary patch delta 2169 zcmV-<2!{8b6XFq&fPV-~NklcW6{i5Wo|A?~1(;djmy9#jaRUQBkog*hR$N z6??;iu_sCt6tRMW4aJ6tT`btK_ujkT_md^Vxc742y}KO#@$yG9Z>R0d?#|B4CMwGN z@jT#p!1I9T0nY=T2RsjW9`HQi?15~H zGs{n(K0SZ_ynjfMBAVvQmoIJFwAr&~j~>jIFCT8IUcEYJ60TdfZf)4G;qKkLnkEu( zwrts6y?W(;b+&HZ$}E{pwQAMw-MgoWv8`pxmS&>3X3Ur|Y+y|Q{Qdj)5hF%K!WgY% z?AWn-9*-YCUc7km=FOXb{rY9bfByWLJ$rUxDORl5?SI?1H4B!oZqd=v+qZAm;}+b% ze}54Y3EU3EfHm2&Ws4s1g*lT2 z3l`LJk`YdwI`z}1Ph}Ew=g!s2rcIk>Y2r0tK#Ky()~p0G1y*bjVuUg$oyI z`N;)y%70IsIHBjnCbX2vy1jk-*0L>c-n?81nqA;UixwF<>C>mzH0*PBtfeB%pX3wg z&!3m67~u2g&m193)6AJO&AM@SS+?cLljq{aisR_!KEo)GzQl*NI zk0E-)z6k+{kD?Afz5i%Ymwt5zZrK=KJLYtlc1B55dB zuAHS{-n@B9*#_^aQ>P3s>#rF{j~*@Re*E~6Idf)%J$Ue-jPKjGPqVm$IRhdQpkBRt zA}C$DbmCw+i`L&Qh;a$6SX`$pFCL0v~i4!Lp0$k9xZCe>P05=u3f#No^P@K1Z{rXvhM}LnV z6?IbVP}IpF0CrkjL4R^@o;hA{P>_XB{ERRXhk(^)-)K(B^l>F zOeA;pmmUB9{d*C|YUqsa@ZrO(r+*e)qecy)zo94Ra+edaKh3c;a-@o(%+WKUir1=x zgDHDO7Qm1pL%6RK5)xz(+b~`WWy=vK3_-_^9W^R&_}aB=qJjd?FxIYJTLuB>8U-%U zrtHzOh$uThe`Sa(e3MNOXRjZaQF|hBoYuAc=DX8(FE`LlXPo5l@ zFej=`ojQpE0G;*fvxjYI(xkBjSdr7h`u`j-V1U-km1F32g+Z+LFT@|VV#SJD0lPwX zJM^X}E>p1ilNAh(v#Rw4ojV|0wo#jFrP3+r z(xrd+x>Q}aZk>#~1RQOnT-SS&C{HiZr2-!|srN8X_kUM5ZQ3LTbE`C4OpVp0EcKB zojlz|N1(2+ix)3Ww@)XG1b{wW2#Sv>K$b0A zMg_nl8xKNEg@2W7(V_)cEj?BtGr+K6!(^_F8a3iUM-z}hX3d&a2qFp$9z0m5d3ss~ z_Jft2kRAl3ifL4e1j32$%T7dXqqlYa`gNI5AOKCicJ11kS@KUY*7idJ_ggrh{9OBk zSd9C5*9^oe0=$0?2)HHzn1suH>#@-E>>=?!`w v@I2so!1I9T0nY=T2RsjW9`HQy+XMdt(2jn8{A=>O00000NkvXXu0mjfd?PW9 delta 2359 zcmV-73CQ;15uOu}fPV=HNklWyqCT5P;Y2?rt%#!0rZ75fc?Vun-j$3&Fxb zQS3%V>{bj!#SX;4?(Xi6eRj_>4D()Zd9VBDem_3uJ<}&<=FGW&{T2I*%|L7hVlxn% zf!GYhW*{~Le`*HeL{?FfBuN@JY*?d4jjUO-e)#a=;>C*_Hh*k5d-iN(wft#mEn2j= zfB*hZ&mX>J%9QC3TNCDr6)s%3Lx&Dks#L+^*RNlnIdkUSyLY{M_4<|dckkY@c)k|NRVLq^y%NffA=g*fPtq^pOz?5;*U8H+KR=GAAjrCt##|x4bQ$8FJ8cV z;=~EV9w$zmGJj>tlqyv!apJ^p-n=<|`t-ST=e~aZYRIDaId0sz0PFJe=a(;E1`QgN zFJHb&l`8Guzu(ZmeEG6mxpHD6F7@r(_sNqdhV0g@TWnn+i!P8YTeeT1J{b$%zkhE= zMvWRJcCc^Pu3c*gSQC7PCRM6bJ9q9hSpC_hOBWFpMSq}ApFUday?ghnR;`M@T)A=) zKLlkqD!X^ZiWP!&z}vTPt5vJEZrwUFZazPM{;ZcbTE4AZxl$``+_#NWA1^3?gb5RpKbdGf7!FL#c>MUW*5qKe9H-w%#5Xx_ z-gUz_a-dh#!-o&GoPq@lYMR4`4-1w`&25|?KYxC(!ZIEXuxQaDtwzH)Zrn(jGNlok zB}*1RzCk=?$`maG7%N!^EeBVHhQP}yb=V0LCdfE>MX$4F4-BVHo!Xr89XoccU%y_Y z-??)qMT!(g5c5h*cQoF0gLu-UNg}}k#>7pVHfaJWSdH@ zxqn~3eoV7NJ$UfI>l+)`zi)c(kyEo~O>NWAp+mLao;`ayECq@l=k}nvLV&4jwIE&Q zwrbUiL+`NEfoapGHFC3O&+gwhUB`6n*ip0Bs#QztUA}y|U@u*|Bq$~~dGh3f3IQPZ zixhw%LxyN()QjolF;17p0^=LG*h%14W`A-31Y^gJby%Xj=H=+>pwHz%uqNGCu3TAA zApq0|POwUH)G8qH7T`smRkhvnvyKYxCW1&eS+izZ@BI1m9V%I}WZ%Ah6O`Vi!W$T%fg#aPWC0vGa>Sfk z^pOc14T_sKZ5mj*UkYk8tx*TSlYb{qY7{%duOttW!rat{S{wxd&S)m+mo8oEXqb*3 zJ$h(t7_jVcWFk-k?~EBUv?VQDwhT>p?b@|9KYMKQ3x< zHEh^0jSUr+X>tPV*RSs+kZD8(09iXU$)iV)*8CiC_z4wMQZkNjwA_qbs((1QfeG2^ z(xo%l;6F_k#U97Y-V*}=*qOo0{D*Shym^|xLWK&BpQ_@*g$sf@aNq#F3M0Brn>N&V zpj@S5ut9#7E?ru*0BqZ~O&Ez8g5pS_d@`Z;28m3M@243dtf)QO1lJod9;b zs0J7?U_c0hxm-y#=%nC@_KgjoyD?ycPg6nKVG1bMWr3GUN;?KwkOKcBGl3OZSg$h} zt3(G|bZp$XF*F5%sEJr29H3LDPL2Z`bb{4cE|AE7@nk9rJS`g7_~tI}VX zLnB>lA3l7z5b7*P`1J;7q4W(91Fv4as-**SqV&2E`ex0V6(9-`!1@#4kx*`{@+lfLQ43?4ibGnKwi-cScQ###~mRxQC~g7)p(Yiu~MPv7?K+kY2X-^@jmti=L~xhx%B zaqTvbtbz?6h_-KpIB63(>z6HCrp=|xuf3w&)7amFqvspd4BZE9H+i4yl9-!5eR_hK zCiu;ZpGf`>z&Cw2bDH+<-TOOxl09bLs}S3@Yges%*REaKD;`X|opwzh4$Pe|vcAon zIa3=AjGx-F&VQXd8-mbEdo9a9{43u~m(ITshc$g~93TQ~Ic3Y1<##dKvE93O%acVg zDng_2=^M$Eu3PYeMvfe*Ee58gS)@o2k-(dndC=lnhh~-#LQgtj zxH)s?7_V5FiWMsgJuf)k{Mov7Yaxgt!1|cn;%w!28-LuRes!&&7iO->a1jReiz&;Z zyDU!Zv}x1)IP=e&Pz3+DbZ_3gna3WlOgi|qS$T-!*@-?6FKV zCQbOIj2ow)K@uYZYqBj{w(z>oHB1ji7iML=zwI#F%+DwOH)znnnMm$3Rh47pRuNiT zDpDSE?|&pHdw*}^#~+8{iY3tkA+-CwEbQCJXRVMtXS4B?D(@^_6ZHs(iueJGs9^7D z0tfRvplO8oe*n1A@LEYZVj5mzH1US?#o;u@(NyF#3K<8F-$ewUvLYNjjB)xCLn**{ zCg*K|Qk`>8(}9{$w?Q>MFuyOMl|rB=Ao2FeFEGapLF_X&1F;#1%|L7hVlxn%f!GYh dW+0j~@HbQF37QTQIhX(d002ovPDHLkV1h8!dT#&# diff --git a/Telegram/Resources/icons/menu/read_ticks.png b/Telegram/Resources/icons/menu/read_ticks.png index 8eaab34cc67283237f30681b90c14e749e35d6fb..69a7cf5c9d399df21bf2a42d6c4a4893a585927c 100644 GIT binary patch delta 322 zcmV-I0loh21G)o{fqx`PL_t(I5o2H&1*0KA*AVFM?>~P0IK;}5l9JoEZ?m(rlk9@N zzP|te|4*Jg8K^TqKOe~6ym>RprnI)U0(CB0w1|m`DJ?Ax$lkMO4+jSaPJ>ukS^4?- z(WGl?YJfUdty;y*%p4aN_wV1oLx&D=adDw3L*aIJcfWr9T7N}F1uj}#Tnsd2gnkTw08gg{XkQIz5p^fIXOK%JbwQCdF9F#5fKqI_4v3DhXCDj^ypC@ z9v)Lu({JCt0Xv;3At8ZJ8&)|dC#Qsj1fW}hvcA5)hYuf?k&(fwa#V0M1VAAG0Pu@^ USGUb(`2YX_07*qoM6N<$g70*g`v3p{ delta 374 zcmV-+0g3*)1MUNmfqz&@L_t(I5o2H&1*0KAObD>Bu-Mz%Gcz+o6sxGHC@U)yqY*_7 zQ2(k`tN#E04>SuXVP$3Y`Sa)f`}dDvn>GR6WnyCT@#DvD-@Z9G zI1to}P{7E@ID7VNpeZ|d?qp|Y*VEH``}XaRA3xmP-4Tk=Sbvg|l4v48?xabRfTjR_ z!O6*~sj2z$<;!2ce);+NVXB0RSX)~IHPqD9Agk!=>H-QLJ9dnRhX)wC&z?Q|^XE@! zXehE8bT&}wl`B{N{reXY5do2FY-|LYa^}n#etv#=dHIJAAO8LOH#RmFT_+}AK|ulN z^6%fjTUuIHRBu!OO}TjSqL7e~w6yfyyLW+hq^71~>cTE!VPOF@2pA(kQ?6gXE(QiS zZrlKJb8~aC>%k@J=H_*}{K0cr`iB&zSZb*dy0KI6F U^sDbnTmS$707*qoM6N<$g361yZvX%Q diff --git a/Telegram/Resources/icons/menu/read_ticks@2x.png b/Telegram/Resources/icons/menu/read_ticks@2x.png index 8345e900944fc92190ae33c6776464b26a89f511..477f34d4293f2c62adc6eabd5625000e7dba9375 100644 GIT binary patch delta 682 zcmV;b0#*Ij1)m0xfq#ifL_t(o3GG!oXd+P*jUvGa0SQ73h!{b|Xh1B)LTp43KShW| zh!#o$N=##6YiS#ajisHECXF_tjh&4k*yKYyBymO)<>e z&pC(l?w#4#pci$3IzSzu4p0ZE1JnWP0Ot+}1cIxptEZ=@V1F>k0zW@Le|&sQrBbZ; z8ejQ*elC~$@#_LjOr}UAf^oRZ<#J|fUC%roFO$g-*6ZtQ!gO|awpc7MRj=1ce7z6p zbegCs6bhT0o5<($`R4OEroc9tOtxMfhz@f@)Ramkp-_nNizv)r_=qD zn%&)9tJV4?L@X8~YHGEbSS-dC=p7D+nCf&o27}>CsNWUr?CkVFE6rx}U@*W`zuz~ROrIhAXhH0-Uz z;UHLEua~*W3WWkw8jYsaYGKP{GI2Vcq=lOYIE9y&7bJj@((Cnr>+yJ)o2*i)kW8sm zHk(Z>{(t!RI66AwMg$85jsT_-X+T^k6k=}j!NCF6!@ueI`5DXLC{IpKSU6n1!eNmE zLQ1$ZH+gSw@8RJAQ!wU%K!8j7rC8x`m@E_!!|^dUxmYX`p-{OLf%~A#TjYK7V?8x+{)Q$3Krzk|P*MEDv94OWGTtxNz{ZA<@ z<6f(uf+Z43v)MG6O!w0;Wi%S^DYmYNM51=PjSE1ZgTX*9mt!*m#a0@jP}pj27>{wB2ZtBy%j{GQS6b+K6 z(kvDWv)K$hfdb8UL8(*%n@}jkv@D;`gKV{0S*=!35-89-04x^EZnwi`hr22AWJJ!$g7RVc_%mVCZtWgkJ_8luRap-G6SkcDo%6QmGUZ1)3j%bUF>A z(Y~ToD)FFrJPz0Q`@PHM0s{gCnqPr(xeVUjZWnF1kw^rtpu6dIyTO1!f#$bBAP{sq z9Y}!w4bJB?K0TdI9*+kM0)YS%1)Apog+ehJjUW>S$lLGtgMruUMfpCZK=VwX)9J?J zF=RR(k6OWC5Ddg(F?z~?4Tr-(u?Wy>ULujG)oSR4ORv{oJE1_E%?1aG#bVdgpJB97 vRVo#silU z`@hzDzkQQS5|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45`T~cB!RD%fR&Y1PfySB z@$uBul&7cXd-e+o3jX=`%FD}pkI_)Og@wiR^z@Hk7sjU7Tv=J!FXYF=!-JQXmtIUO zji#oi6B83U#}IgLZ_O1I6}`N?FqWL0{1($ni?Ols=;$chh3@U`Rs7}V<~~0^Gj?)v zVsCG+U|P8~GJi4}92{i3&~tNh*4EZ+F(V`6@$r$d>+9?2=xAm%qzw!V`uh6VF7(pU zlC7;RyTp9EzrSbf_VzYDKAstE>F(}swhO(wy6WKIz%JwB;xG)xFvygY6lS!gJ3Bks zF7(F6hO@IXyNrs8y1Kez3==XlGm{x@>9)2uwhN7w$$!nwja`O@hF)A;Foxox>9wn| zv61aU@9ph*czE!rf`Wq1&dwM^p)W2jW=31Owzih-LLVL;dV71bOFut9lyU_tFE3~2 z&uf&j?Ck9C-@k{2h5g^BS5{UkcCirq`ug&7e0+S4j*b+py1JT~578|xEw8;kJw4^; z=l^~mrGKTR%D&wY2d|fZb$NLi5fQ+AeX=&r6VW?$U3;xI8WdE0klVj`w1!?;aINMO>=&TeI8g&AmUf>EUy`y}1k+WOXt(syiZEM5*{ zcy+0%sf^j!*eon8FazD+-*0GW$k^v;#5puHq!_BJtJ67%jEuyG!~i}stP?r_!qU=m zc7Jx38R+5RVH{)_`)rLfuM#$@c~({ye4yN+=&@szL>%eaqPe*_j>*hGkByD#ozncn z&(JO|F1x$CYz}j;s;UYL6gOhPB_$7Q1_l^_o}Zsb6;Uuv++wEb9a}>~ zgW?a1wKA&Z9UV0^jQ6Yr1_q|5 zrw0cIqde$k!o$OLn?`I|P=54cU$PO~5qxIt?d{6n8((rTVpV`j#BWXE#=0000V6US3}0LQzo>(EuA88;SNKppA{q+S(e)MOER%}q#12uVpvNqKpBA!c7+pPrr`F_nj=rl!-=(|@G({{B89B7(#vBqTgNJrQ$g zXh>gQpP0%+BO{~n@p01n`1lwd9Zlk5Vq$Qfm}6sOhK7d3R35_V;o)J@iZzLkk0)^` z;#fmsPEAdjn3xb#d5F8BzrUZf;{HiaP9|}op`o|8x5S*EpEox*C*~(WB(%iD#M;_g z96!(V|8`a+S;0!p97)n>gq~59&*4tyT($tw6sXCRkaHW3aAGkA0K26 zVs30~*xA_;^E2Vu*_m`m+#9j6vF{n6p`k%~p?|6^Pp*{iRkWR*9VE&3jPh|#VPPTZ z!}ByCAmHsDYierfDnRUNx(ez3;NXCmdwYA%&d$XAe25*@)zw8~A08gQ;b=ug1@Qsv z>gq_GlarG?-5(ttxx2d)^Q)kNfx*no3~5E)Gcz-j4_RDXOiVyj9T+4fJ2*IOZEX?r zvO`1bZT=@=LopgfwNpHCdX*49=EZ8>+9>pJU>78_4WPonaBt5 z^z@WhWK;+>Gcz-jv;txq)8wtJtX5W5h>6-87#OJT>bo1^;o3(r>k!FQz6dWA<-IJm5fQc?zy=+c^H>}y1>>=N=j044w}Zs{nOmsEL{ZD6%+0$veBdP#i3tyezfAof z9mBVQ1N1Hu8}fN(%KARG`52nU1%!U5rca6mX991sqC(1Cve5i>mC08i(A00000 LNkvXXu0mjfNv$wS diff --git a/Telegram/Resources/icons/menu/reply.png b/Telegram/Resources/icons/menu/reply.png index d52ca37e9922feab0c2a8b223157fa310f892f84..6d14fe2f3e86d124d8439a007684036673d101e0 100644 GIT binary patch delta 277 zcmV+w0qXv(1B?TZfPVn?NklX@RXr9}m|0DZAx!-hY9{(SxV^$Rxe=FOXZ`}PF|1!46s3$p0B zbLag1{SO^Fbo%sZWN`?agM-7~-hS=cwRLrM&CSi23J@YpOn*#^7cc(*|9@_7Ef7AOMrJEk~FV8f;HJ07b+%y7-bGk|Gh`}XZGUc4Y)%c#o1 b83F*gje&aHGY$+}00000NkvXXu0mjf8#apd delta 310 zcmV-60m=T11FZv)fPVoONkl2Osie4#t zg#~EzltQ8rL?MKkll;jWi6`IBpG@^%b>4aBo_pW9x7+*tTLLV#lPHQwl5iZCrYTi$ ziG)j06!Sdmx_+sEDk3h1VNeB^$X8rGNC!a>kccEnuIt8eOn-O+)^#n*a@#h-(1C5+ zUysf>j$s&L@T0}=M2ezhS=M!(@B70r9HlJF%Cc;lX5aU!s#aBX)ci0A7|X)Ss6Fo@ zP1BZT!Ca><_lGN9K@i}N48y$Y<#`^$#9H=76xS$6<#~QqT-Wt9O>Ntr37+72o_|99mi}=9-%J>t7+hN|3IG5A07*qo IM6N<$g6YeTPyhe` diff --git a/Telegram/Resources/icons/menu/reply@2x.png b/Telegram/Resources/icons/menu/reply@2x.png index 9b323de23a735ab7c9d49efd075b983ce1f1ea6f..b0c2f125e6f6bd85ffaab6b02cf78370e0e84ece 100644 GIT binary patch delta 496 zcmVu6f0wGNEF}Tv{G|b;YJasFpqOiGpqWmm#2ff+ zwOXzv0VW`gv$_Ay8|$6={JjC!CX-3{w>auFu3D`&9*@cC`Fy@!uTGiN`0;q$?RN9| zd^8&E_j_uNx1gqJmOVV1)9KV~Hoa+6vlT_*;jq;Xhr?*paT-(rdoUJ@EtgBu*EG#W zqw&SO5{X2iP=AnRd9_+uWSvgOuHp4LolfhzZZXyCb*~-ZtI_RtNr&6*me1$CcChF3 zGr^<`!yrt(Ue7MzWiAkAE z#)mq+#Ku%AmFRi2C=81LWwTk@`70*8wr;!2drz)Rb|4QU;~{!JpQIda()&Ik0l~izaIDws!{P8AD5O((2}Ds$rBWg3 mp$s~J4xj_*06OqF2Yvuw9om~!l8+Gp0000{EAqa+mB7%z9eanzx+~_881`NwfGvnlcZ~pma=EYhKA0&VTkN^_+ zX9R}B;c~g0&1RKYmu=f$>7%OZn?12^Hk(boUVo<{*3E9W(|Bd8R2b4%4UgkE=Z#4zMs?*GtTu zmCCYwyJz;G#U*>QCN-d`~7|&mdXwm z?ZbBp$}wFhTz|Ksk&Ld@YK_O^D2iwv;KaNy*@ce-zbBZp)9CpThcL^;vR zTar&I7v%}|jzEHY2gfT-|57W&6Pzb{k_7yb65{E2JQ7dcZuccJ_d&lrO(v83_xZo# zI3|WH%gR?5QLvt%GPT?7B2iRR(2zs}ayvl~^m;wGFI~Ax9>Hg+VDJQmWHcHr77M6S zrD7{57QbbjON25_GTd%A&QxN;UDt(M7KUN7*%XtJGm9iihGA624d-Go90?!+B!C1e aMBp12O&TBWR?@uy0000 diff --git a/Telegram/Resources/icons/menu/reply@3x.png b/Telegram/Resources/icons/menu/reply@3x.png index 9f83501bdc99d9e9f727b06ac920d392cc620db8..4b006f222765e6be0c48bfc09fedc4895e22be35 100644 GIT binary patch delta 709 zcmV;$0y_Pk2D%22fq$e)L_t(&1?`wSuK`gI$1m|pM56L&L`8f61%*TVwlTZw%*^jUd(N5NuP;1M z0aO4LKm||%Q~(t~1yBK002M$5K0pDDMq{;FKLF$cAruO&*MIBt`P^=|f$-v`#VN9#47z~myFuUsY`gA%aR|FgIvSYDW zJRXnTZohI;sZ=77$kj#8r)IMmmO;8yut>rNz%dN4b$>b?It19MRElGW+pgecL~J&g zSLt+`X4`BwCX?xQLL9G3zy{eC3I&?2SS)fx_}7&LY$}zCel(WLrBcb~6UM((KQ|;` zi$FE_Xj6j{gvqt=H=juu`e? zY}!nd5`P+2==vv<35g23Eqq|)vcEy!NZbloJea^B@J+UAwd!;_Nm?&4Six?xX|-Cq z|B@@%O}4>c@Dd&pR7EUC1D;8r&zH~V9S%piT!yZX(IMk-ZeWndYPE{TDu4>00;m8gz@or6%p#plDU~1U00000NkvXXu0mjfTxk!W<(=tv|Iq9YMedEEO?+>^}RhdKMqn2GH!#Wv41>-S&t%Ghl5BLzqSQh*d7 z1xNu>fD|AFNC8sd|4_i~b~l^N*=&Zd%jJ3#XphG;nM{6v{(r#s4qyf<&>?P?2Lsi3 zJpK&T-+#+T>@F2JvED2ku}4%WC#n}yfMWGx0pYkqvEqpHVpVS&EB3~8JBD#yS$=1? zB9;ByDc|XIa=9GaY_(d|>-FRD$QH_^4~N5Mvstg#i^W35&JX$~5(&dSP-%9#Ts9hw zXf*l*7sZ-ZDt{HFBzKKpuh(|F9S8)(e7^PiCDU0^U%TC&&*!nQGntH{A#9qbq9K5n z%cWQ>im{1o9$4kITJ4FOhtuiw`~AseG7^axFfc8%*=(=ZGn79ei^J;cc8?Mjhgc{S z>UO(^xb63Q$@TV71+UkujSWteN~QDp%;I4$dFY&Eg@1lF77Pyn79_Kil<);O~_-wE6U@8vAVXIcF zd^t7LN`HYpVvEIM8eHcOAq#ewZ8RG3N7YdK1h5+$?&hslYd)XjTP~M1xXvHqgI{gF zcDLIV3I+4+RkwUj#8i7JV4uJQM3e4(`i`l_xq>QNyQLklN2BYNC8rS6d(mi0U}a>6d(mi0aAbzFrmO7W)t^236q0! P00000NkvXXu0mjf`K(B` diff --git a/Telegram/Resources/icons/menu/report.png b/Telegram/Resources/icons/menu/report.png index aed0311c7ee43d93696155c71c12849890c01805..f78d51534083429fb3820286e4a04c39d7963d80 100644 GIT binary patch delta 361 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 delta 1554 zcmV+t2JQLw3jYj{fPV$)Nkl?+I zVq$9OComE}fCeT8ih_Z#nStOF4HO@spn(_&zEITNA7{LM>(=y)XZrNHv&fl1t7p3Y z^{<|OR?W#|idV4(iY-uVfnp2%Y=M%WVgaP`^74+3j)sPY>VN9$nwlCc+~40nJUm=q zU!R=z~(2Uf5+O|+WyL3Jv}|m&CR8yrB?PIA0HPN7n_@#|75STvomY8^l#SJ z*H27LY;A4*>vW-rIw0wLVi+_vHO4>dGw1CAV2|Vz|#>JHq+D7udlDau*rjDPj__s`DGGBHHiet&;IIyyQ&K0ZA?y}P?(+Mp(MYin!U+uJ)kJG;8N z%F4>3)R|z$$H$kKm!m59zh6>PGBq{D=(oO`r>Cc-rKQo)(Ym_2c-vH<8kJG8LSX_! zn2X2p^R%j}YH@MV%H!bRU}$Klva&L%B~(yE-3p62jDIG@Ojf_Kv2k~IH*Eg$@^WNk zBx+{Q(FW>(02Ri^D5i77NnDM|ihi%GGSDX{Co3u{62nC(00m%pLc(-GW=lFl_+8!H z-1PSLMlj6lHn4!JMudRpKFRP6kE{Lt{g#%Nyy(X&1C9yh8#H{*B}`4qz}ngx+rL<1 z9v)%>Lx0LNWIR9v!Fr`;b{g_Gcone6ka};Bfl|J{v7TOCUCB11>$A1Z7dMGMeNv4# zDCM~?$*{GNUNKp@%@$*0V=Pl#2uYm!tcy`KPeRNA=Tn90RlzY4JHQPN4$9V{=m3Ig z2?8`e z2YNB*H~aAx!^6YF^8Fkh9?s3pxe@ZE1p#OnH0VLn6mu1}x3^{Uuu08TGgQyl8v_^` zk`*LF)?#lEw~+dekB<&}c4NV#W6*$%N}Y6N z$Uw<(fGUJd(FhjDh~3JwFwq!O`+p)xN>GJxn3%;e6?h`X6jn?3j-sRp2iz=T&-0n_g8?yzIrj5BO|#!L1SFa_L8h?|9LXJ<$HM$ut4^BLmCH!n$v*4EaIjg7!J z1d6s-5_ivYQUX(Kf7H-tT60Te{*k@n=tn#&NE!)S-!t(SG~)M6)#6)Ja(`V$=_2}( z`)$Bgl9o~GIk^tI@A)}I(Cp0q>3+ac*pG9o7yifSJiVDcApo?%YIGPYT3w@z~0wQS?VX~i^ZbIB*nzw zXP^|LL6{6m*$ft;lp-aASp6(0CHYD6_nx<>_x5;5ec$+f2Cj2m=UmQn&Ur|r|NFyW zF#di3LZL8`NDPO=)9G}--}n1{yWRHt{cJY-ttt7HC6mdaP=6>K4&QFKYPH($_cxmj zkH^z!G-|aPu-EG?7K^WiPYk#e3I%8ZECd3AxOk97z{!ld=rJ= zm`0;zG8xFR*=)bu%P*hLKOT>@S`Dw*?e=Uoi)SblO1)lRE|*Lu6VE?zJRS!lkx2BQ zNF;dD)oO)j0DsG5GHA-<@gSap5CF5;4DHNjGd%eg!!~=pp2cE8>XVUJECv~ApFy|V zl}e>3=f?=jYa`ZC`FK1AKA+EXI2^>o?xxcz3LgOTBDi2OY$u&g!+(7?8Vytc2UV$5Q1}G2S}ly} ziNXacl}fMIV}w$vgdSZk7f%0kNTpI?h_KwRudh$lR;$(Nbi%vxHVFn_DwVF+tI=qD zoA4l$$t1MhYPIm&#bljM2aSM>+wFc7d_X>*Z@b-IE*G#%rBbn2ESJlTMkDxx$z)&b%7 delta 536 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 delta 1749 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 AdH?_b delta 1218 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 Q00000NkvXXt^-0~f@=T0s{jB1 delta 1953 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 B?^OT* literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/restore@2x.png b/Telegram/Resources/icons/menu/restore@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c375ba499e7d7641a3c4c6404bbe30dd33eae396 GIT binary patch literal 1000 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 Hu0mjf0JBIx diff --git a/Telegram/Resources/icons/menu/retract_vote@2x.png b/Telegram/Resources/icons/menu/retract_vote@2x.png index 2a52169773806c58d787c9d75e7eeb1d541ed850..20a18160be3866d6a93860a9b45be120d97f33b0 100644 GIT binary patch delta 1277 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 Hu0mjfK8c!D diff --git a/Telegram/Resources/icons/menu/retract_vote@3x.png b/Telegram/Resources/icons/menu/retract_vote@3x.png index 7c2af35a2f0da8a941303abe435170058d3056f3..ee6da2efda43c91f8598df0891b2479083ab33db 100644 GIT binary patch delta 1917 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 Y0kEhm;2w$JD*ylh07*qoM6N<$g3FIEJ^%m! diff --git a/Telegram/Resources/icons/menu/save_image.png b/Telegram/Resources/icons/menu/save_image.png index 820e092500926016fc56ab5e11b815bb5d4eae8e..51899e994883ea08c3da01d227f672a0260952aa 100644 GIT binary patch delta 536 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 LNkvXXu0mjfTc;Lf delta 1099 zcmV-R1ho6N3B3uBfqy4SL_t(o3GGpd=Y62Fg_Ohylqf^341B{j|PTyM6XK=br0y>-)NQa9Vq<-(Kst z*V@nPa0GwB4E$#qa0PNa1qB72ot^jh_s7S_fsCt;6&4nDdw+ZT{r!zEWHrd)aO)YM zkB^V9s;Wv)PmhX!+u|2nUt?n%>#8>2Y{L1Fe; z)zs8PepXjkX+PA?A?RTx81UpNI5awwviBgq7Z|F zgUmxKz^Yp;;$$x&^4Ztdr=2HzC}gm< zG=EHJW@ZMD81jY0l$DiH&;0!S%gamVLBhnugr48x;$loY#w&U2_5IN^A$9?wt*uS$ zlaY}j=4N?$IW#m>1W2;i>*X;ZPkh2lFm-c$d|adgd1Pcn3&rJTVPOG};@R0*y6$K( zq9!XV3saCh_xJaUCKFl85FQ@bgiQMQW`AbS5Da=4UC?%Scd>A=dJX#9ZjuS13KRo> z3E*Lm`Dj;2J~6Nb82FS4;gU<}$jC_Tz0<&vu_+=V0?Ums+uPd);J-ItM&KE=wY8O) zmrx%uZ{S@-JAhS1<#?4E%E$_ygvvjV;%m$D}P|C6>zlGL{`qTXV0D^ zM~`ycI?=3{``49>(8G*ySuxeK7IP@*Do%&4kN}YDk{3Vx~wxd zWu;E+;>C*&4zmxosi`SFJ^l6T*QQ3a6S)d8FE6is`+xS4uXs>#adA^qQzWrlF#9MJ zU5tr|S-f~Lbsar=^gqE04yzFJ@$n&6-@ku<^ym>a?Hs5OTf25G5f~a8Li(bnodXqO z{5{0C($2|n_f&{+)%nBO+1U>sJh*o4+UnJ-HO{hp`SJ@FE_8HsoI7`J>C&Ydt!CA( zUcE|14SzmdvmN>&RJSxmZ*T904I5}|QzezFtLwdc_sHtRi4$Z(VBwz_FQ$TngWKEN z{rvpMKRIxBcW-WPj*N_?ETL;w{6?Dk&7I7dwZidEG&!*@7%e= zn-X4lVh-$5`RDmj!+B;2p~D$#^cA2mzS55L@TgC zj7hG<#>P%gPEyzaeEaqds}T zPft%A^}sEhH!6BYLX<*-gM*5!B;k!4H+UK(!+8Pbi3J4(y?ghLd@U*};z^l1gkl^; z18D+`jEpoiG;j&@19+f72APWy_Y~Xjbq^YC=>T{7#}o22gi(vNkL7|rXsPE zCr@%e@B|PWTmp;`LIlc_dtqUrqJMw6xw*m!{r&yAeYNCM%8B9jV0wC*JCT)@1w(vi zdCdw1WOgCBqq;Mb_cAjxg^^#rd})5uDR)?_L?DJwim5DAcj*X3BTdk-(Cm|;`Iy#CMjQiTy*eG0);b!&o=g(Y6!hbN_xN)Nv zR}LOLD6Gzh4Bp$zfVmo0M0zDup$$SH=0+j zTtT%;_I3+YhzWO=b#-+(?y_4l+%XkmNYh+9FE5WDZt^bOF)uq1Y)GwoPO)|CRvy7m zo;=|!^l7%O0`fUyF`3LY3MV64FZZUz1Y^!Z#`c1T7|00000NkvXXu0mjf2V*>F delta 1664 zcmV-`27mdI4(<(*fqz&@L_t(&1?^f{NLE`E&a387k>V6WlR2hfk^?A(fkuQ#Dk6yB zfIcXMJ}5qEA`0e%f`|_y_F#skfe%6i1tkTQ7o2j)0ZE*|)Krqv>fVogXtUVo?DL<0 z^p|`72VHyZwbxqT+Iz1(ony!JpB@1{0(u1W2eBVfe{gnx&JKY#vwa&oe&s>;E^ z!HSk_sTxS;=jZ?V^UKZ6)oA@MjdF)2cJAD{fPesIJuxwn(dvYgdNr+$kB`4|=T1ya zjK9DCsZ*zDm6`PF>S{wnLvL@dT#t*33uSUeT4f3y7Z>;T?b|=Y!7BfM{``6Q@@2Vm z!NI}Q-lIp4Xk##rBqBIyySW#>QGo8}t|$ia^!Y)@DI_B2~YB z{rd3XgQ(U7z8Wx$z?PO4xzhdp{f&(cIp1WCG{=z8P1aysL;1Yw?(V*N_3H8C$Bk2D zhP26ZOlT96iq2Zl1qB5{X{%M33{03jklCrXNJpKWoqv>L=d=(Q)+_3IQ&STy+CMD> zhE zu{|)jB26C7b(P}!`nt+gRK|8Fz$91h-@mT{hE**tE^0}hJiJ2$23P0;#gI^fTkd%8 zRmxTc78MoM-`|fT^W(>lk@pnc!0`{cj)Gw{E)l%Fy%k#-W?Bzea&q#IA3vCv-@bjj zd4Kb!qC?1a$aqXrB9Il4LKWpTF|7m)cWht3e&u`x&Wwx5}?k*BAg0BUbpPyfTetuzLAvQq*G*OOiXYb6z|=; zr=rIKRqDVZBO`ZrcR9D}>+3~^s8d3iaf1jXj&W-C4ysQ|+W{QUW|+#zsq zljY>ZU&3Ona>6q+GweWFR8)j(U`_yfunQ4|$t=DIn5(PnyLaz6KWK4aV1Ul@q<^F& z94M#&_Ip7=LDaddtSlT8sSIcgU2_v4wZUi+FkCQl9>|M8E_H}Jxg%v?yLOFPVZ`m* zw=q#URd~pxF=E1I5sJX7tE)NNuU@^nb?esl_BO|#o}R|*i9EUIp%Jwl zFszTOlXvglMZQ5F8n7g;#_zUb-&(+istTau zPNIq*orrV@KmS8c9~~XVw}MgCrG69uvjxk^$FyB&BQ}KF@DTfOWEn6zu z+yok#9XSwt#fJ|cT4r9E;Dp{pkANNlJpy_J^a$t?&?E4FkHEixA$Kwtu@>_H0000< KMNUMnLSTa0j2LR zh{a;6swNT%%d)1^>0mIp-EOR4y6*G&n$70*dVRfK=kxjbe1F0)3?q}t&=Xi{uh+9} zyVYt*lEm}8APD(ncB|_; zg>hUemBKL_jRuvvM6?#$sZ=U1)#1!$vwpwt5I*M5$K<$hI1G2WTslRk4HSt)oXXpF z6*?Ra064-M6MqKKZnq;uy1QPlhr=P2rPFClvtF-LDJhmpCA6tls}TUhS}Yc(X$FHq z0x{iAr-NGUc3V*tzuzB?MvKKF29J?prtx^3nMnX#f@-yTxm-~0@p#~m50|J=D4;>u zlqiZs3S8z}!*p<=-*0U^9-~3BERRN`)9IAWW;dJ7-#2m|6tsN5-{ZyL$R5(Dq3GT5 ocn+a07*qoM6N<$f_9MEjQ{`u delta 457 zcmV;)0XF`%1i%E4fq$w=L_t(I5#3a~io#G7lwAakk1hxn0b9W+sE7*wL_kss{)law z7z@8Z3&Ah2u(GxkRKzAhA&C(mm7wmx;^l^zYuep3j&tTr?mcHT6#BQ%H{)jMbUKsC z#N+Yn_4;@`7)sxgEX&*N_W63w=X1B)&&KJRUL&uE&49#vH%kqE7jB*}3ccm+CFyn^426TCEZqdqgI{-)^^3sYLh>0A4s3+Ay-oWU^Q+kO|~#Fc=&T2gI^a zD15LWW!w?-n$PF^{eHDtAz#QUs>NdQcsyd*?41xF7DA|0DyP%QG|g-_%hCm@VXc?T z1&76-Ob|Uw(`Ynsu2!qX5(TWi{lx|B{admhiw??ZD-J(*fq!I4L_t(o3GG)+D6~-&_8$!qt1*V82w7P%4K*7ZCJWgO8w(^Q z8#a@rvYKLLW5Gh2NTQh{re@Sk*i8|Ug})-d$00D-b8}55)92^s%gc+FJes(Lg@1*;y}fH|Yxno}D1|;x zPfwehn?plG#l^*%va2HJTI<6|tDa_Z>lsJ6B?5gAENRaMo+#RW_He7?@k&b+)lro+6pwzid(6~h5*X{i95;MCmQ99465byZVS^JA8h zl9I#2L!xYLZT*N>2dJ;F|M>VocI+6d)hbD@uCC@YXt&!XSyHftg$4SqQ&Uq?gf9@z zBN4Z^x4&YVe`jZBKR!MpZzK{i8jY&*VVlzh0fSXtPJd|v8LW}PU;x1H_n)7i3y{%M zxR6#?R}oK5O>Jpui3Y@rhzcq%FDF`Jwg&Utf=! z)DWnwti+>1CbhS>OJ-_lXyAsVsi{elB@3IJoTTsi@bDm$y{@kA`udtEOG`_#GV(Y) zAi-de1YTcX(Whc>#iZj>?&|77-2}$ZiHV7rNPn$C+-&>%`z(X@Xn1%St4a40>L@EK z>+kR1+uLId51dY?R{5BGoEneE!!k6$2||+u+rGs^q0s#NJO@WcMq=jF8iW%LhvVer zgq5NPsBd6kATu))=FQH|G60Thm5;~I%F1eOZJnN;4u`|kU|`c=K_QRsmbwGt;^|QO zG=Dfa7%%5<#$kpa9k##Q?Pj0)`uYUmBu$~><>h6n2{(REPfwDB1u|G=G;357UjFXx zZUHz+Q@G5$UN6^Vu~?EMERaE$y|J-DHI0pp36RN~!WneAT#Ji~_{ThXs=AWyfbM|q cz<=(*A10P}u@euvU;qFB07*qoM6N<$g5wR%jsO4v delta 962 zcmV;z13mou2ek;0fq$P#L_t(o3GG)oOLI{WP2#==5u-*0MU-@ch=n#WqK#s0ZD%K_ z|3Lf!ZjBI-G-(7yR8Ry(FeWZwCoZTMMR6$v1((F{z`*eGa&LSaf_zC4-ko>m%z1O? z-I-^zrGM!Rq%-iJWx#IWdF^(4b8~ZJW24*cE-o&DESTMSBRMU4{!&Zm?>Z8wL8hKTO^`dXWZ8in_cAAhO3x>|i(vUW)9w$|2Gy0yH# zEW@O><9vF2d?ZXuOG|1n-<1lgtgIx^>FFt>bzQ{c@$>U@azWSA=qnXeUS3WVI0-d! zCBxX4*^)6Ti&W6d%L_r#&s9F!m*{{5X0{)FrGhX~kaJB<&5tZH0M|0J$&hT93OYGC zAy8*$Cx4@LU7+7#Tp<@`)5VYgZf|d=mln0DYNZJ{`C@c*lo)VW>pfQmtZ3kOcXz~S zphuzyqoT1`C_Kyjnl;-0ArfDy1F9Xr>7?j(E^aj zgt>sc@Q*oD1Tkvs=;-+T{A5i(<_Wcexq#KYzJI<}R8$xZF7Z=7F7^)fB&%`sV9W)q zhAuWXHuCcFB-{eCrlA6wCMG5_Gc$<*kq34IqQ9!_Bl-90@$eCh!9_V&hO(AwHs zUtiz*`@0~%VH5U_>q(V^kM01SjfuC5>qRznzl@Vx6ubiZ*Q;a%XM#W51&LA7Z*w}s%K?o#q0HwaejWj zzrP=oq!RPn*98Ry+uPfmr(iIck&*G+B2@8;ii$#^5Niqq0!Xt8^V>_zA(2RgHTnI1 z3%Z-hhbSp2;cp`-8y_DxNoaw4X=&-v(K`|4iN|dVc+F7Y+k9td2b!j)rp)kI?CWy5 kEM`p8r8AJuz~9ZlKifvp6&|!6(f|Me07*qoM6N<$f`&@oa{vGU diff --git a/Telegram/Resources/icons/menu/search@3x.png b/Telegram/Resources/icons/menu/search@3x.png index fef63044e7984e4b596766cdafad2646bc555dfb..197f7a24cf24ff265f853453690546105d37a6bd 100644 GIT binary patch delta 1383 zcmV-t1(^Dd3DygcfPV!*Nklt_&fdkT&?}SYdz~(>)qqp=g%MU z6B!U05E&2|5E&2|5E&2|5E=NNWx#-YyyoWSQBhIe-roPb|9@<3Y>tkO{=WZaW@ct* zXW!o5xI5J$psA^8c6N4mclYh>EvRez?d|O~H#didhU$6= zzrWw#-=7x;{y3hVp6Fm-QvdPc%gYPC9zHdHS}GAEBO^~wPrnQR9ddPbb!=>`r>AFX zYHD|P7h!yyl`}+FI zSncfW`1ttnB&QfFCMM?j`I+W-e}CWD*l2HW|08BlP|(Q82yF`)pV!XL?nhhQDqt$d zm!X+$Z*K<#1jzDQR8+)#a71ftY%B|er?Qce(Za$49e>s2A4B`Yh7_=XS?62cGr57s~e z{_yaizAqR`C+F+yOO#JePNt`)NmISh*Vjituxr5a3u|j@ zG>H27Lq=eSe z5g5i5f#!bDFf%hl5rN=iEg`ZpK}KM7_fy|h7`pTT#w*$vqbaeeFfeTJO-xKA`jDc= zY|Rc14y0Ipqa!1*xw$z4gl-ca9!{F-h2-R90)oNDOp@f4P6P`J3%UY@lQJ(i*e+sL zB!3HZXJ;obWT`kPU=a7%+VdJ|1qB5J76P_7QVH?W%gD%}8ML>zt4Bsh*x%nLu;_>C z=X%+!3=Itz7Z(W$EIufH$VT~S(AwHc03lRYSATr}TdjnI1eym{YRr&|ofj7u(`YD$ zTUl8tMpJ8uV+G9yl^kU?-NM2`rk<0ZpMS5GoEm!+IZ*1LW4pS#N=ZqPj*0zyQ&SU- z02!mp!^1;5h)y)Io?c#FGRy`C2Y)QWq0pb1nYp#K#n@_^sGPdHyX%CpbWjw}&d$yl zekeJitX)x2!E8-%a109zYiMYoPs)s~ris4b=H@1yhE6oSyu6l|m%rqPhd72{FMo?j z&{4JN;Q7G706HP9fNck_6;gTFwzjq%9UY&`@ib9wGCp`oNeO&ocSi4Npue)R^4}B~ znM?!*1~OBnwqP{R@9ysE>+9)-I668S4{0mZJ`>QX4S@xDMqrc{QV|wT3Q-inMLQsg^v14<8Owb)fbKt z^eqfx!;P+`rKMH_J$jLolf%S@r5|S;Jqkf9RqTnG6%vaIj!s$)^ymd{USQ}20CHkt zq8{=8j%s;%IUQSSYU+2|`t`1?tW2{8jE|3h{-cF{#lo`1T95xxpq|CP5N(kGkpYnb pkpYnbkpYnbkpYnbkpWEx{smT0fE5a6E;axF002ovPDHLkV1j?Jj$i-) delta 1053 zcmV+&1mgSF3yukpfPVw{NklJ4^IX5QbgtfFy|z-7Q?z-7Q?z-7Q?z-1s|2674Qm3e)AeSd#{Pk&EOOG`_0b2I-a+}_^a z-QDqjb#--daq;!_rL3}hnakxyM@J725AW~qzf1m5Kn-O~vdhPdY9AlaffG&GdY=Zz_ZDgpvjR=Ca2&%eLF2ZR0m{5(HDUs+ih z931TI?ELrhLx13sn>3*iv;qpi^tml8EChpleSO{9+G=WQDjgpRsG%H0NSPatO|Y+y zj*i;e+DcQBttexnxB;8mGs%mt-YX`h_4Rcbw7HBS=8_)Z>5L_63?!_{$w_l2K~2mR zH(UhO%6o@tM`jl}c3;Ur0a36Oo!?j}s9BhoM8=myR)6msjw-ho<# zx}}zZfdQWt0t*OBz`tOCm0ocAt2yF@QC8SrN!a7#V|i&yRFKGT19(!I@h`0i0DsEGA?|Q$1^Ew_(Fgt!y4kEOZkY zb9anG2~{)Ya&~q$g&y-<@=U67x1aJz0w9~4o3fIFIozhFr&Hs`i>}7WNR&{<+#4-s zW`AZ>zd?0sYAQ8uIA(rRMPd_r!K2!_xjDt{vPB|lsbp1koUkByDR z;AZ*go`tOcIRqO=Z&U1j3&H-%lSoUC9J)v)&g_!xD2=qxD2=qxD2=qxD3={1{VGU X8*^nefn9pN$$8o$^EPsy2V|8Hx8I4A1nx4<+ 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 YrnFTS6>3YjF981c5g zJ&lcx$H&KnV?dvsoi)NiK=Of}(X9H#si`Rm6n}C8sSJ)PIT1fUKUemDok2kIfu7N< zbn%;|PY!^rg-=dSEXIkuP<3!{(A(Rq5ZK64ZP|bTG}IMIPhC_En=p3HlpQO4vZYQ# zHKM9MK0anmMg8Ttt~Ar76a9lSd~I> zY1r+wZ#G5gezjxw+Z%y;6jO z6~Q3Zv}`eIdwF@0cd}}2p=3lG!ImvR*SgR&YE!~|R0UpWCfFK?)8?a!6bIfK0Dm#T zW=>R_r>gLqIS5O<{Wd*4&0F#M`g(YHI5;>6RN_O<%RJa&w%=fr%?(q8F@eaUDLY%- zXv^kD34~GUX7e)=+OqlK4`CeH{8U@gmd%grXk+q?YGZC;szy;$Bjse*fwpSQI(N5^bDRgeW*zVlewzGEEl- zn8})5AR~>LNxvW4G9f}%$YOitV|}o(h*2UARU2p1b&Y|-tT4tt-`{>rlzLq>VN9e($ccBGA!KR-#%)IqW}E-JU>6*+}!-@>pDF>4eXZv zn^jd+BO@bQTU&n{T?itMlI$~a5!BY!&d$z0KR+8W@(7^>RVZ|oXQ#oknVz10dwcVs zi~R$IsCCw)F@G`hHP+kPJ2y9nV^G=t`1m+HJUlu&IypJHySu|}&=a^76%~z*jm^!? zEiEkt1qCW`9L(_W@XE@Hs)POed3kx`rwn+|lNGa`Yi zFo7Y=h3m2Nw4|hDad9ya$KKvvUteEwaj~u?L=Z$gP=77vFsiFluYXNV&Cbq_-~7eJ z#lXOT%CkqbfjCM~<=2lJW|Wcm8n)$Zc}%E zrS%4+m~lyl&_-m1vr5QYgfqpc_bREw5r+vR`3%$25Sx2{0&P(jTc^eS zN_P-2E$!XF(^c|se~w1dNrbS#M3Fri0Ehz(Jb#n(8^=CT3xQnBh$%in07&s9Ahp$Q zZ*Pml2vW6GBp?6`5fvcyjF7hw*O}1b zorKz>qoa6;gM)+a?(RSnzyOT+NP;Rp3TQ7ZEQq7>Gj3yMX2vy2icaMiBo_kI00OF8 zXMbmBu8sHi_ixX_Dm~Hfi>w^esz?AZKyu*$HL4Y|oTMvU$^HHPsFJ4r{H$(nZpzEc zRr-MB!UHORRXsiTTU%RQF&axtOPDk!W2r(f+k^nn`0mP)hnSab#h>bXpRIJE(hpUw!Nr08aq_dWj4-B_t z@YI+Uwj@XrU?njFla(FNnMifAQZDzb-&!htVZ>@YDg@$2iFoScl3kciJpf+W2_ z5u2yo)zu~XoT;fP&tvZoYDHq_`T6;9Zm<&j)5ZttMGu(_kVGW__JUIU(sK9x{eS(U z4cZ~xtgr%g6n7s$PHTfE@VULcjl#_qD-auQ&`4^9RPF8UEU|EI7Fn5xR1nh*g2TC4 zWCb<~G~yuY1;Il@L!vO19yEquDsFaJfdMcgHlT(B^E@>>Xa;f*V=BT*EXJsdu6DR%V=SHGJcNg}LzI1jr zOuwNwPQsL_zq-1L?U$DqvJ}+O{Xn(uSWB2R!+5_4$dOYoD@#~%(i z{t^~)WMb^UEoIPwZgiGPUaqP*pY@r43Ydc*V!G3nxP+KX`eec#Z{r3EQ7a`6U86tO zU|DkxAdoj^;tHY!Rf+ovty{6-{KnZ-D#^Quzil9hxT=b&g~aJ>zQ$C>IEitlgq7->5lfpi4Y5lBbiAM$!t<3}cOtpET307*qo IM6N<$f@Q4UE&u=k diff --git a/Telegram/Resources/icons/menu/send.png b/Telegram/Resources/icons/menu/send.png index 3050ae4cedd7017e8d5103b8f03637104155d4a3..3daa1f2d8b500f0d2bee4d3394892492687119ad 100644 GIT binary patch delta 549 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 eX5jxY1OEcH>0O472&vrw0000d-pl_ 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 Hu0mjf>*uDf diff --git a/Telegram/Resources/icons/menu/send_when_online.png b/Telegram/Resources/icons/menu/send_when_online.png new file mode 100644 index 0000000000000000000000000000000000000000..c351562ebfac67e78c8ecf5fdc91061b8bff956b GIT binary patch literal 642 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgf?2V_3V~B;| z-6^^qT7eR6?0dPJT>o%(v++h$it!-OMq2U4K;NQ-#g76K`0W z58liv+Zj`1H{UW?#7Bw2Ap6%_m&F&aW|i8=ZN9nY*{!$V(zgoCa%R~Ow?28}jqe^S zofckrSa2h6`^gj``^hJH+7EyJ`DdM2lh|a9i5@v-(hnRI6w-fOsoTH*{(E;N!S=(A z2|toHW|+-xby^sqqm*IT$#Cdl!Sc(6J7f6OF6nGDkm}9b9=-Z%Qo|FF+?Tmt2NtZp zs&#tW>D0Ta%2VzMF*dwB$NaFw>ih4%6*ki(*Is30o;Jhr`RB^8$*+a?uTr&SFi6Oh z@{6^Rv!CmC`DKVu7%u~xj`CrbyzSN7Z*QEXvhI4e*3_!t)p6^E85DhiyIf;;oSlLBn&jpaPm9(}^ILwlaU+m#c5Bh&B?T$!lTRL&Uft-z zkgzORZCPOI(xAkxQESuq_Ejk{Y|wxF{QkiNhFh<{`j|I}P3Cy;{G!sso!f5bu4C%o zeEaRb6|D=7s{H!>S75VdO_0Q%7`@77ktVTVqy3ltv;O9t`R`iKu<8h(;v?0ZTu}Ub My85}Sb4q9e00GzsfdBvi literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/send_when_online@2x.png b/Telegram/Resources/icons/menu/send_when_online@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9099425f7457881fe3af36ce349ec13587ee0661 GIT binary patch literal 1255 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 R>HGiy002ovPDHLkV1m=QeO&+m literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/settings.png b/Telegram/Resources/icons/menu/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..9b7ba02b358ba414e736b97909c1f177417299e6 GIT binary patch literal 563 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 delta 470 zcmV;{0V)2y1kD7Hfq%D2L_t(I5#^LEsKQVb$JHSWnFg6j!8Xt~v}myy#k3~2v1Z?b zVzY<{CX*o8MKEX)iy*ir;z!&B!6XWPA-+Ehhv?pW^F5m@yZ4-(-#!0x&Yi{b*^kfX zi$Ac()S0BSTEpnrhXY&J=fe3=yt22-ij z;c%$e>(B*tVD)-Em&;|A6_3Y)x!iqxLhu?+05_v>&C|gMN!>u7Zeo5?RG!9Z+nj8kfx$2fk5D9yL+P} zolXaoTrPKKHh*41`);=z3^oPH`c!!Qt4E|+aK8_)Br)e2iAxLhtLlZiG* z8b}mHxV~+FHk*YznM^`67HDlcou+A83&v!d9msaOjZgT^W^+27a3)4c7lOqLS7bCA z0kl{wQ1W|(o{`y0%d%`HlW{to&lFhZ^Er-r!*2xlBNB-ip79CBFD}*&yEu+)+5i9m M07*qoM6N<$f&~WRo&W#< diff --git a/Telegram/Resources/icons/menu/share2.png b/Telegram/Resources/icons/menu/share2.png new file mode 100644 index 0000000000000000000000000000000000000000..cc8d32ac2d57b75053806b3ea00615ce46e6e8f5 GIT binary patch literal 561 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgfY__M1V~B;| z-4NUL2NOiDRhK4SaS`un+caysO!VeV_BZvgqFD!0E4Z_xro+Keo`De3GU4;KPE7y>YUI?;nI{ zm0Ha`V9vAnZr){++J4JT#~vI0;5nSKIWlAE<;+R{9OK^P?!SNkZCUv0(A8I)1Ws@I z_JjRmhRLeTTY1|rm+p;P`>ks4oebaWue&02s%+$})g+mV?dB{0JebfRbfCd&Wk}Qf z7TfLItxP{Adazt@TfFgZ-oyvRvpP4tk$Sc1{(IjUlRsa-Jni(;w9OM$PQLzXHSy=c zNk{oun6^goR-R2Wb`-diw>{Z%Qp3}rP|>Z@y>2^W{H8sfe#_r$LYa-+`x2||tNs=% zcv@bOo6O2z#=5%ur^@1KvC59-(!pZgM>lM-IUg+2`a1rMx7_dh9A783aXP&f?mSXr j6)N(y#%}gIbNl@apYK1q?|D|V8x&ohu6{1-oD!MCUY literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/share2@2x.png b/Telegram/Resources/icons/menu/share2@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5b5fe006936805130c25e2dd61b9ab63e97e0ab6 GIT binary patch literal 965 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 R29^K-002ovPDHLkV1h#{y2Ahf delta 1566 zcmV+(2I2Xp42%tsfq(W%L_t(&1?^f%EM-j;Zo1791Tl+YVP#AwriBd>LIe?Gh@g`W z=@!xpGhxfZ6k?+jA`+395*EaQ4J!*Qj0?Xx#^{*+U;3u2tLqN$x$p8kxo^R#^G;Qr z@7%hlzB=_jd{94X1k?zq5l|zbMnH{#8iDs60XsXp_Xe<_pnqV0fB)&}>EPht%ae$)?yev( zDCg$pY;A1~6`KSwU|U*Ra&~q$NNhB)%gf8Xy*=guZftD$`1lweHX0aYU;q*Z8}$DE z{sxAP0S51}_J6Pf8EhvfClL`5hJ=j|4BjJWAagL-uCA`);^GVjn;i#a0UOc=k_T-M`B{`wfg=NQ zT61&r*RNl>wZ#9szP`S=xVW~q77!4CU5hgS^FS}YG0`C14-E}jT3Qkfg!%dTgoK2% zvol)xB7d@nnR=Y}0fi<%WF?N*Ns;&7T<4Z*Fepd}YpyAWcn8(LsU?wkmTt9lBv} zOIP?h)4rb23g@uJO$CBF(lnUgK4lZQWB&Dl#QpXm& zMK~sehldlFun5D#!Z0q;hzaQH=;-L~?tkv)=7yRFUV3anK|w*_L0lJ&#}>{E-Xm`@ zYXtcngacGtY<3O$n3xzkPIz>mKYy0!Bleu2z}vJuC5F)Q&UqMoHf>Mh;!Nl)4epnxcawQR#rwFf-o{N^7p&n66%CoTU)e^Mwzbj zNIWsr68Xg(?8|sd86PB?qF0Gb_Uq~CA)_EAfUPAbCld`{fZxl@%m4lU;61@A#YY>m zf+}J|LjyBldwcu0Z{H9&M*r+4GJhc*ek`_+A3t)V;6|Lz0kj!jiGhKEw6ruJ7n~Ak zi9P>`A(1ldmNV8S9D>scD66WfhzAfF8yjJSq&GG;M(c@;9|C;;{@vQzT3{?nB>@ck z0slOre2IH>bd)#^AtWRuDJkjj@Q_w=@~>aNs;jHDJUfd46C{Bzaw&lyVSf+|n4q(> zlQd}oTj#T?MS{STCxO%&`A78j_NKiTlyM-(-t|v6EgF1aVkA)EDh=mbMn;Ap7^0k+ znep)O&;kf+!T=K_fv}M#f$X5#w_93T2nI&LmR(+6F8d@#14C-1o7_Y%TM5Oc!QkPV zAf3`&QDf}*Na%?aAc4{z;D6khWS4=HI)IT=Q~&h z!{HphiHAfEocc0%`>G6c>U20iOK0@?k#1)K$tfqw=`L_t(I5$#jE%jt0#f89mGL}4PyWRXFNSqX#9rNl%T6d7d{ zBTD%P?6SCIaNCr!ArZ+X#o}_#=Y8pWyf~?I*7rL-zt8h|p6By>E*~F1@Bcd>5C|j^ z36)CymsC6+FAxZHI-Tuy`|Il+kH_I~n8{?cTJ6h>lxNiM_kSmoN#v?jD(!ZAG#c&q zdznn8R4T1jt57He?sPh5v)Oa(4Ph`Cxm*qkip8QzrF!PE*=&!;vs$f|%caR=dM4bE zR4R2opCge7VHgaCbUIxq6ue$9jYhlTP}l8tH=B)IE+@=ChQ(rmmUui)plCFDxm*^D z#b7XitI=pMnSacyS0oZmr_)}qN03_-hr>ZYy zvB(|_1_|z?=4My1F7 z;&Qq8wQ99W9B+S3uh*l4p-||tp51PTqC_G=9M@*g=YR9(W{bt*$z;;+_aB>m4aOd# zNH`oOxn7PR7lZMy*K37BL73kR3@D$^Ll+hjd;HD!^}%AX+-^4(63=Kf-VRbK~;jbO|4X-K*yPMN90RR9107*qoM6N<$f+qI~pa1{> delta 580 zcmV-K0=xa31-b>0fqx`PL_t(I5$#mV%jr=R^&DX!l9XqR70OI0Wr~SXCj0?1Fd<|p zLq^|}k%^HWM&jFh|vE)$CKi1NJa-k*-2`}N)H&c8F-XYaLFd#|(iVKBbWzZ778 z1<>hq4u?anR;yGhKA->N_i4A=#bWVtxqOxN; zJV4cIRU{J8V+hf&E|+V)UY|}UyWLLrKkP^(0u~g)X0s`mP$>NP_?XY<`~ALNuba(g zlBQ57rqk(awSR($#QDpxSS*mRR;#gCEGod`@kXN&+ANpLxm*r80N89cl4dj-kH=%D z(;+DgRNm|LmdmA7DkZo?B7p+kZa3vY2&I9V0AK`zL0~){&%+6B+(V%d9fV#6g8|(W zkH-O%$z;Tdr+`?6LIIvfBe2i~LA+^z7g^8NV4*b(h<`*PAr$Yl76=5u<@I_=76U^_ ziA|miVh@KyO6+Vl`&n#*!EiVny4~)xB8o2@4uc-gPXd2=ez{yeo6R7QR;zuMLs|bd zkSOqcKGUb+g$`V?SPc8M*=*A3G**Pe;SdDI-RJW)8VwXanM~;ONiZ)4^um@v9V9?F zOfY?EF+FanRO<86zAO=)58sH>>C|X6N~IFQV;b=dv|6oFsf4EJ$Zz{y1%3j>uuX}e S@YS6F0000bb@ diff --git a/Telegram/Resources/icons/menu/show_in_chat@2x.png b/Telegram/Resources/icons/menu/show_in_chat@2x.png index a4c4bfa6ce982db5edb7129205b2725576393c94..a69a81931c677952648b65de5ea5cce90f6c4de6 100644 GIT binary patch delta 1191 zcmV;Y1X%mJ3YZFzfq#NYL_t(o3GG-}D7{-0H-<81%uJCXq&z4kLgImpQOZyr457U9 zBo7ir#zZnd8hi{$@? zH83!!uCD(0_lW1OEUNSN=q>S9%-Q(io0Dn-kiLgyhPQJgtCk|0k78Vv# z4*Bxl-dOr$FVhr)cz%BF>gsZJb>-rNgM(4~1V1`DD*xzd<>cfL zGvqlXB}LUce4*0WP*@tZjBKe|L6Vu7Ns$Ew1ze0+=-}W$PX`*HSpCVDm6cJyXpcif zLpVX$;(xcdHzLRG1Ox;XJ-kfyStlJacCbOA95T}$f7n#(M?TF#NF7~m}(uM#_#U#2p}{xlv=R_ zz7qTc^Zx$s>FLR;#5Bz(`m$K}i{IPZBkKhQ27msN3I11ARS`gCWu-vDFfA=D1XEE_ z!H8AJxw$!l^YimlQT`*))6>J(0tTm#yP?3KO%o@5eSKUf5JpEw6AUhC7Nf&5ps~S3 z0<=i=v+V2ZD{+WBoAoSUpukBX>fGF17Ds86^WotkSPVe^{{B?X66iOC-Pze;FJ52 zXLEDY($Z3LZ7BubH|y)`G{bFeZKkHCQeZW5jMyV1Bh(Li0q$=#cy%fady|us)EC}d zg@uJ0jj$ypC1+=6)WhQ9qP@Mnx+TBVVfotHTGE_|-_z66hK7cShzMh2W3D+;n}3*? z*wN8J#~5PR+S>Z%kT3Tc6c!eSxfr)J8v&NVGiZN*A8i8lf%wQXNOg=y(d6aj{me6n zMu1BvJw1JGZH?w%4uR1pAt6C@VNstyLtth?!$h~0dP?K6!wgwmT$lck-&$+0 zwf0dc41Wd>7(8I`z<=ujBfXDzaBv6>4Gjng0AX)$Z)Ih5e}8{}dwY9zb+xv(wz|6d z@bI9wavcPtqM{lb8+Uhif64xReSN{K+S=O4$VeTuYY#OxHqOq@-rU@jHA9>UZ{_9X znVFesbDUNoOH52`YimPvIE}BbuNxa1XJ==K)YH?Gjg5`1t*w`rm#?p{iHQjZJ~%ii zDk>Tq8{_tMTYp+uSTr;=e13ikzkPXmxuT*XI5=49qb)5h5!veM>Xnrhp&;m%7GNGZ~Txcm6{Xd|nJadUGMe&5m2QA$dR8bX&v zTwL7x`a0Q!n;0G*u7d)kf>3^Na1eJ}ULIkR2bi0iw|};_l1=C5=SVeqk#8>Y5uqW; z&dyHF3}sLk7nhov8l=?A%M0*#cXyMMlZAzaQn>}Gl9Cb%-`?Jyqod>RZK|)YCu`c< z+oc3>Fe)J-g~ZOzPFPr&lwes|8G(Cyd!=CC`^edkj}In*&ownQ6&0wgtR$tP#N*>* ze0;p9EPpmpT1hG^D@zKdz$HgrVbGJ46REsOPfsUxZ*Ol+O-&gY8E7M@e#67V#Jae+ zKukpsLq07nEioj@7z&suOi@}|O6qW`CQr)aG8vtknt!U!{9eHhhC!Oc8KM|$Ha9mj*v-w2 zwY4=5gWDM!4Z+*nn`bN6l=AcQ^U6K`zpJY&8J&=jz_XQWXJ==2Jpsi9lksX9CYiDOCG((M!j(?7()-f?L@rPOmiaUiOH#b+!0?h>`b3%7@ zb!h_F&cD=LaTvS;-;hmc_;e>Z=Q8hVkIf>FH_G0%BxjMAsodCVwWT zzrUZt1SJ^qwH;nHZNvzGVTyYOEi5dQmzSgWN!>w6;lWx}RYgM&eN|sypM3PSdMKh} zcXV|4`}=biqZ8pRz#fXv&(9bkaG1`uHbS)unW(UnlM`+V`#A=YLT|?JFL>l%US7f!+)#{* nqJoA^g9i*AFnHkq?Sa1l>Qc=ow%6rs00000NkvXXu0mjfp;tk= diff --git a/Telegram/Resources/icons/menu/show_in_chat@3x.png b/Telegram/Resources/icons/menu/show_in_chat@3x.png index 04dac196becc0053fc4c4c517f0becd99b345dfa..3e363244c109e00e81aa1832c382c6dae25def83 100644 GIT binary patch delta 1821 zcmV+&2jcjv5QqI@AqYn$9wPG<=_3w z$H%=7dS>Qqb7tn8GiUx57RF~-z_5T}0mA}@1q=%q7BDPeSbxBwJBE z=gpH7@%r`a2M-=}b#*m1Hr}~&=hv@aW}2tzY*(&adF03uXbI&^`}+F&ii?Y*qM}S! zLSIU3w(Hlg|9|-L!?gK`sX9A5Q&Li_tgQ6aQvnV6W6?3e6( z`SN8_Qj!L3W~0g-fZ3SB7L0oF;zhUw;lS_q!-o&=-n|RkeZ{)tXYGj7#bRien~#{_4WJq?R)$7t>mcAoqw22Wo4zLneX4fpOcg0?d`2e zq>GD7W@ct>ZSD8(-^FZ4M@Q4s(={vrzkdF9HLSFc`u`}PeS@E3l( zyu3UiAz}Xf`HCE1i2VF~DjM*qQ>PROl@Y)i{(p+H{_x?$+O=yHDUn!7x*5g_Az}OW z?TUPWaP;U=Mg;)JZ|l~rY6#_Uva+%$)30B@hKGmC5m;DYDGCY-D3uI+;=~Cx`}4wu z3zW&bckg&1R9?3~qh4NK0_UqHq~I7(B^2SJq9R3YV63{jI?C$CjT?$oT!f~kCd%vd z>3`E))aikP2M((uCZiW772HgLyuC4H&A@(ujf;2BIER2giJy23o!bkvIy?=U@=lY(zSX*1;cFd@7iCnyRu@vH;KHRKnY#bUIQWJcUJ!5&96fByI2#KM`j~_E) z_;+~~r|4s2V;KnmHJ6UGv@}W*85t>|il_^Ylu~WnxKV_{>3}n&l!p%=<{-}MK7VlF z0HZ=wP?Ogo9itgNLdz_UoCdteRJflKckI|PF`{(r$Kj@^@Qt*|gWcWT*$~brya;RZ z0BoxM{(d$}Ij~MKFgQ5a(b2*BC2vX66BC?x7?pAPj{vx~GffsOSioQgNKfq9vu6wg zKwMlLZSvsv@87c__y_=gG$|p=WTyxc=nllr_MxsFmdpaZ}WM-HH%|U>^ zcI_IQ6@Wc^_HcCJccZ{US>QfvYir9#|98aPDbLHP|Svbg+)JD#?{rMR{5fPjUf za|4WWg_#Pbn>TN!+0T?*%v1A~S#e@O2o4SwtQ+JZRr~v@J(Z3NC|&@?C2kyb#o7er zqYXv~e)Q;(VBOGcX=#a$j@HIYguQ(Ea^!9_V`75x^6~_C4iWWVcYh$c#`^#hNda7w z4jnp#XIo7|;J8t`08e`9WNcC7!dsjshCnv`;Saa^^XJcF+enH;DWbi-9k1s25Oc5y z2=s8%usVD!3Jq8s#0-4v*RS8SX%p|{ASk2yf(p5$6mxZYczB@F1a+Bp<$*6>zKBl_ zj|A^knjSs$pCo?&fPbQ_`swjz!uqku85tRp_hS9ESLBGQD2ghQeuZf)4 z!J2-?cvB4u3c?f7)DKutW|0r32p)KIL0W^egdebAqw?5l?bm-|R0H@46uj6^j_}R~ z7sq~bgvtt>3dJ{I!vcl{3=0?*Ff3qLz_5T}0mA}@1q=&_EEez&6OB6yNhK*#00000 LNkvXXu0mjfh5Ch^ delta 1985 zcmV;y2R`_S533N6fPV*-NklS7;Vn5P<*Kd#(k0jRm}l-Pi?DL{N|<4}u`- zgP`bxVlNM(FFpkYNi2vJRICq)y&|X>8`rMbdj#=n61(?)<|q4)v%6=@{f)xieMsh< zX=i57&dizf$70bFc_8vY`Dd5P87a11ZkaNq?HHS+i!dX3hR6dur9H zRa{*B_U+rhOP{AtpT2qXCP}Kam?Rrkv0}vm0|un0r}ya5qkH%69XfQVP@#g>DaMZ; zJ^HKkxp3jap+kp?ii!mCHvm&oQU(ngv~uOj7cXA?6ZZM=;X{6Y{-jBh8a8bB>usu1 zrOM>VlOH^I5P#Mj2fk0AK5f{rp;M<$zs9`El`G@jhYue*EG-#R-@bjz%ggK2r%yQZ zLVjaCd-mMCd2`2(9SvGp+3nl6uUxtE>eVZP1#yB;s78$%si~=T>eQ)Uzy6=4Pt~eb z4MK3y>eZ{~&6|e=16dMKgoj0o7O`90-U?x0?%cWk`+xT*Bzo#Y8s3>WapImmdkC0r zGKrs=nVFu_!V@%Y+VsqsGmh#B8yMWKUAxfIt5>f+dh}>wqoaH#SFBipBSOn}Wo+NR z{r&s*?OF>93un!m#U69z42bB~t=pC@TfThxV%N2Q|9-Y{KzT-T@)8CpO?*YmmoN9T z<&3hOk$-4BfBwAE$nfgbtIeA?cjgH?+pk|g$_1t4$&)9;h7AiUDiA#zZ^n!nB_$eZ_kNR$I{n>KCi@9M~rBX#T6b)a^iB8kIdE<_x;d-dw|?AbGA+v(G%|I_9t zG~*s6bmz{U<``|QkK%Cb*siuCd-wS9;}LFAngI&Vix)4d zWsv1UxaqqhcEZ7f2bH+BYuEY-O{DK>)27*9wUqYy_3PQQXIHCM&1_X1i;vEoJ15zJ z$!~smHO<0>3zeWz0)B@#Dv? zU4OeekQ$~a)nJoS$h>~Gby`{)HM?Z=gkQdV*|~FP!(uE{>(;HGKYuO-ayIb!U3?e9 zW>fE-+|Ne06u1GkYu6?mOT}>*AMs`mA3n^d^8WpMJHfqs_b9U5#LD>*BSt9pB}whMnVO(vdpUFy?=4z#$kz~q^c?ty>(+UwDn)nc(&g*duac2h#Oc|Q7xVV+-7ATK2M!$QNUSE|y>sV|ZQHgUqc!vgJi6YRm zldT!{8pmI2s11{H*-ocUow7*H0DmDz5^%tgLj$ZRl^g>jC`wjI(5h7{Yp4yAZ`H4Ygr+@7}d=#DgJ2hFC*0KtUi0I1|XB0albsj)4)>;K73>fqMB8 z6;r|E*s)_jpxp0<2%Z zKCv1{Xw|A!l7Y^lEQlOg;*-kveiAh4MC$UNpob0}DjA6d-eokcsBk3}8CjK7w48oM zNyQOPonLnB*kSN^0<~bl0_hLnkt0VY(C$$A6v12)$mQ|v$Smc)x>&4IrAnN>Br{zH zK0gyrDXtujEx1@N40!3%rGK6aOAv6-R8gd$py1~nG<{w{(0Ehrh8s6-m`m-1NftyK zRQZO3hRom=r2+!A1}jT7Z{`r0 z)z`sdX3m`HZH6NSG41;G>&iAlkSP@kLCI>rQ9!Cz1xupN_S0Ds%YXS1q<><+r#ycA zxc`GwTwdsgDHp$VT$FRqo;{1#eq3qrQSaWpRc1pCx0wDb$>2J_bFk-WPTHG4+_?qq zL%S{jw{enFZX@4wwc{sLy2^D&a4BKmek|bT&6|D_kGo(ShHE5yYY9!%Ji;U^1R%b|3p-G53Mi#-g0s~o+EV!p%q^XIEGNFW^qq*0?r*_-N?RoU6ue!A;{ zlqQIY)rrBpasGb9>OD zMGJ~Ak`I3=f;zYv;Wsuk!+Ef({6d0SSu~715P2Z-K;(hQ1Ca+J4@4gLAA8_mduX|w TO5<+$00000NkvXXu0mjfj(O*) diff --git a/Telegram/Resources/icons/menu/show_in_folder.png b/Telegram/Resources/icons/menu/show_in_folder.png index df4875536a0336503c5a271b21a1e0528ac772db..c10ca4ac10f865fd1ddd395a13e252988d6317cb 100644 GIT binary patch delta 339 zcmV-Z0j&PM1Iq)DfqykgL_t(I5$%+*u0%i-hPk;!p`?>-M6o0!I^k`$@B%uoqomqO zO|?o|6iOrt+3d#3y_47sbC;cMHo3)4_50^LeIX`1jEfzYD> lmo|=L@LD`>eVok>`~qIstgx@}gCYO`002ovPDHLkV1jk)p+^7! delta 326 zcmV-M0lEIm1HJ>0fqy7TL_t(I5o2H&1;mFyPEO97H*fwUfuBErE?v5mjg5^MLl_~7 ztgWq&9656C+_^Jn&cL;ai;MgF`_G;|J1s2@E{Kc40+Fz{w+Ax9!^7{~xr3~9$&w|h zsj1r9+Hc>!MHUCLfzI#m@4tNcGDI9|5DN>4@%{UEG}Xz;$$vl%etv$6ii&7bLPA0z zAtAcDx(^>dL`c=u)d2%XT3Q+*M2KZ$V*}JuTwDxM$V5mzPWiic?*ip`d3muI1hfIC zK0*@Yy9mu>s6mX3&~$(%O+1&{E+XD$TqZsz3V#N~2KafsqSfBrzE zpjqVL!Gl2l>Oa-1kuxo(W@Hf)6B8i!z<~qEf*^KoZZ29e0`w^!08|Xrf^NzvA5RDX Y00|P4P*Zl+%>V!Z07*qoM6N<$g2U;RQ2+n{ diff --git a/Telegram/Resources/icons/menu/show_in_folder@2x.png b/Telegram/Resources/icons/menu/show_in_folder@2x.png index c1a08be71e8e84d2620d0874e02988476acc9f10..0ff5f823cd832f906b6dd4c216d6355f8fbf372f 100644 GIT binary patch delta 557 zcmV+|0@D4K1)~L!fqxB2L_t(o3GG(W<1O@b?;{GIrqEY`Q|%wHN#@zgFC<- z;0|yH7zeCO#0H5(A{vdl-EKC0iw=jwbULlq>o7q9&rG^pu76&ychNCctCi2^duDBv z3+`Kom>Xm=nb_@il;;mgq-B9XV7*=g*XeZ1<#O}+9OVULYPFiv>4a6dflMZY!tPCe zDmR2eA(Cu1o7HMn37{EJ+-|oaOsCThhhsLI(IvIXZnql_hnvkt4S?jc*(_;Bxm-q; z*;J)c(cfHxJbxaKg+jqZnv^6j|w7mU)Ld{Rtw=A#9}d<%@&D7I-QOT_92T6 z2lI!fI8xAb&My#Jm|C;t#dht?ShcEn@^5 z9+=9Zclo8Jr_Atn{S-7+%ihJI{eDlRcs!n0Xri>VkhBW&#yB322_ltBEtkv1Vj}JV`>zuOV?&?fD6;chj-9Kapm4sZv!1K_|nYd;6@8wnOf00000NkvXXu0mjfB=`w1 delta 544 zcmV+*0^j|k1(pSnfqwu=L_t(o3GG-tuK__6wTNgGJ{l5*_zxsPMWYdVolp~8VRr`uabb3KYBcTxT-pQL}VsF-t_a2iiW~(`Kk9*FZYsIY1rY@C$N2v~tz{hW(R;%6b_vcP@mF;#L3WYxCDSwej+-^6WrU=YtGndQt zE>9Y1G#n0dxg0k4`+ccYIvfs!z+tgitX8WGw%hG;xy(!dSx`gAq0XA%FFyrYX^cXk9v1hD4EDJ|Xp# z(GgmHWYn;9Z25#vrxOb$7z}fV?_ER=&Xi000089)Y*f%9U(?RGaBjpyg*FL@7mwtw60$Hzxa)0D|%mdmBQ zifAvOc^WLIUaeL&SD4f3Tr3uxg^0Kpi^X5AP0!BPY&IVr9*9rB->=u} z0GwE)gg_vW%jL-G$Hzx378?$S#GR#dM>IypS_xp+G>+366-rwJeMZN%Iw%hHtTCLB|Px(>e zo;No)Ldp|~gt(uy_3rL&KA#IWIZ%d|*>1N>CzQ8xcwvwy91bh~sSsu1<>kfa^U13~ z!s{r7!QP=zXgZyWqEu!akH^>7*Al4zn*T7C^?KF`WPb!wOQX@q>-8p+$#^_|dwY9v zaX~rkRRKvb7&M#BJ5Tr>n)#Y*tk1Na)_BICgvUXM{ zlS#Q;CU`6si`8l+>Q8~AFzDXT_}{cVJv|B2nM@|3O356BQIQ%~&$6&%O+{6DdzKxe zm{xswP=9#XDt3&`kM>qs9mC^(K%$SMqnhbCG?fnarva>e065u%RD(J^%ZD$U9&Y`fhGw}opV zq5AtW1z@w;D8vBQeCzcZj@It!^?FhV{c5Mvxxc^P z<%&k5aPZ0rr>#R|_VKssI2007*qoM6N<$f@_a{MF0Q* delta 851 zcmV-Z1FZa>2ge7HfqyYcL_t(&1?^hBYAR6>HkYWKh+rdjK}Apt3kiZmf~X(?QOpC_ zinbEd1=0!Hq_FT6EG+T>5d>?65X8nN1cHjF#NT@dE-WW<+&#zLy_)N6A+vMl=bLZN zj^bI31}|g)89)Y*0b~FfKn9QjWME$gY&Kh^Qt9{mo6Y7o+kf@-_0?*%%H^`zY~DAm z%6^$l22iqwhU^!Lu`P}dK^Cwr$D!k1dyxMDt}i5na1Z-f3Md|>Pw|ktyUv7k}^D>Znrxe4hxp)bb34U6sO z;(%i?7}RRDf;-G!m}=|wTF^)c&}i~O=biNu(Pb?$EHEcE@lk()PrGbf>))4}V0uthA@yvHxdyj7B4JAF!MtlJ=^~ zTVRI6AxAnm)PODt*K)apvq=tr)l2~ffDwR!08pvf=%=0V_uK31tHa?Sec*UN#EYyoK7c{M=B-cNF<`v3oInT3d#TvKuVNBUB17+R}hEdp#UBgHj^@& z%}mO9Nlfu#{ssg{0F0>s5hJ_Z&ih)QO7+0rgSQI-3_ubAj7!J>GJp&q1IPd}fD9l5 d$bdKle*nPPxgjQ@gx3H7002ovPDHLkV1lo+lh*(M diff --git a/Telegram/Resources/icons/menu/stickers.png b/Telegram/Resources/icons/menu/stickers.png index 13e31e39b1bd03808198b959ede5e4bbb7ea5204..cd5982410b1a53d3d51b98005f1f5de60e2a5804 100644 GIT binary patch delta 532 zcmV+v0_*+A1&IZafPVq=NklHJi;61Hgn70>tmv`s0M1YQ>nfTCIE(s)>9)ACHC4>2#7M5{b~)@p#PV^XYUtkw`GI*=#01 z=?}kLKQEjL&q%IT+@TpWvArY_Z{eM9^9FANrSE*D8OD2<2nAK{f zw8PIO39#PFd>pi$|fU&AB$23i~qo2 z_6JyGlS#=aNs^R}3?#{9L6ptl=lkf~_jT`m?|N^1ce&?$&gXN!=bY~kj{9$)LQ;@Y zsdT&Dp-{+bwJH?S=;QHNEEe5vcQTpW?{|sz<=XA`&1M7kuYVtCAitCx_gWKy*=&Yb zuh*;9YNOFe$YZwG>rEz;!C(-JIi1e=e9l5o107)zR2z%ML;)Em9*=_z34|hw$K$~Y zXkLWAbwGv$LSpgxFkSfQ=&e>1Br*vR;1gkw;Kdi z0{qIu|CvxcDt`ehkw`ck4zt-z7!0@o1(c_$(P#+ykOY|9Xfy(WzF!iSC0qetOWYcv{xpU-FPAWl%L h)xwRFE#!X%J^=+{U+mtcn<)SQ002ovPDHLkV1mCm9A5wc diff --git a/Telegram/Resources/icons/menu/stickers@2x.png b/Telegram/Resources/icons/menu/stickers@2x.png index 22e686cd6c4c474b0329e89461aef51da8dfb661..58b4c68fa6566ec5de13c85425dabc5f9f4ab053 100644 GIT binary patch delta 1169 zcmV;C1aAAS34#icfq!gCL_t(o3GG-*D6LTxKDgc_Z+V3hF+>IoMHwe*<=mehQCL{`@bKV9B!8KL3WR!(x+SZvt(};d@bdb?e0+Qy9v+^ZojpB0 z=}CDsFfcGCCMF>v!Q0!LlnAh{u5NO2k}-A#Oa&3p1mE7?Mn*_}u*1jJtk`~5~_bSg6~I}%M40g1y(Ie$DnytTEpprAlG3MGaB0PH(} zM*mAQrW``!o|~J?&CNxBD=8_NpP#qDii(P6XJ^rxYierp^Yc-^7J&ZMI76sJL<3T| zY;JCr*`cHl1(5j30KLXIpvcHbW{il4V3`F`DS{cmLVSEY%PbfNw7RT?r^SI2hHs zzrQcju?D5x-rinWS(%!e%1VoHe0*%t;MKT>Fn?p5+jn+$Iy*aMI?|MumTqrvcXf4X zq5%>ZnZY8Tz!g*i+y~2L=qtBWQ?cS zv42F2Rn`XtG|n_)OmL4Q4yJp4e$IhzY;16pqJy5E9>N?Q9f^9K+|kiNHY+PD8eDaC zHJS}aAPR^tCnrZ~dvbC@$l>8(B|xF9sHh+t{XT+aP*6~Pef{F%;^X6^7|`0F;R(8C|x+hqOg*alUrI^$baAX__)lA+Zh@U0j8#=WB_Rt+aA?$eSM8# zxUrd7%vek(meS%6Wry#YzrR29SkR`XCJTUH6#-#vY;24Wuyp?#gxnk)9N-EIPGqRO zyxic*L2+P0E?g9O$;3Ms>V{Ve(O?Uc3*)B?SLvalAu5rEhK8`PFzj&NQ_y2s?SDk` zGk-SVT#FNQMn(p;!Q0zgG$H<%0?9z#V5MeeW{eYKF+iSp?P&IQ z)Dy1ye7Uw65aK{D#wIoBH=ho5OJ)gB{!1@5HkLk$A-MNPYvm9C015yANkvXXu0mjfWltcU delta 1083 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 Z1E0EAWO{|N*#H0l00>D%PDHLkV1npNEeHSr delta 1822 zcmV+(2jTeq4T=wtfq(Q#L_t(&1?`$iNLF1K$4$!=E6t#hM$m#lv)Y735*b8`+B86r zNGa_q2t;sG7#6i?Ra#`jB4}O|LC~UTS`wy$cojNsW&>&x( zSbyLMcP55DjW;GDZMOLJ>({1Dn_@-oWDKXcmQ4q+#DC{WCRu5VYU`J%ywGv2wHxr9 zYDE)bS=0>CB{Z277XhGEbRugvOTM(iAWqr1@~bZZXmbf5{e*q_q%$%wCMaLg6#f8) zL|a^~qd`^JoB|_bQVRV}XkelRM#3foAPb;I3S`G8hK}UR0hK>KF-DasL}zU=fXM6d*Z~2 zg$ox3&-LI&05OD7K@s)1=6a0BwvJ)z&Ye5+=FN*#(=5#^R;-Am;wT(ji#hu1yV%H) zBVCNd*ZOX<(!#*K5# zHoLpKRWOo>Gq42<7R;PElPQ}!JLw~oCTU!=X3f^ETN7BIU%!5BwI5qxn>TOXxpOBz znCoh4YFb-ct^Q0VR}iO9pC)5Af4Ok{S}eB7gTOo-RDW}GGd;=$)|@$WZr;3^aDP;| zc=6(e)lqCM_T$G7<-og1*s)^=y~}TKBV1fueE$4-Yfi+$2A9#=(HKWmU0q%5i3$q~ zm9N{kZ!0>SICSWcJeS+YTNz_zwFP36_ASG0VXCnB-HsLoxxc1gz?&D{^FhQ{=YM~)n^HmnBs`t|Eleb1gfnm|bL z;K74ZpP>?>Abu}dvgGO0r&2wXzIX55;K7514Lg~YmBoma*60OxQ9tgsZGYROKDV`g zl2$&OzXJyjNDIL<`GnPu#%yV6k#;_P`lJbj7uT&@CrwA-o2Bi zO#1QT$A+qf!N}CER};DTBZrU(9DQ5hWMptnLsr2Mdhp-@iz%xDn-poBDaWd)G0&bo zE47##{SE~*#a>188Y#vH0)H$-5@KClT`%9Z!m3rPnAxQkvy@HHftS3CzuMYb36Wwj zoaxi2Yn_mV+gmvT6n#^wqeqWQH5Q_NxvFJo-MDdM;J{uP5*O_<(UCaA>EvCmySEr^ z#mhd~ywD7`aP+|vNqP?97#QP9>w!eY0AV!?h8_OboMCxIvSGu9aDUA}iO|6COS5RR z1yQkZ4Ie%{(6;l>WIQ=)XlRhVYxU~Y3J$HoDr`2C7uD3MQ41TV5A4v+R8i6!=w zfLj%5kmCTdM6z4*KrLfZV)VeMZI$Y0ee5hND=Srf)8Dvy9X)zC6Jn~wcIE)vND z6A7rd4r@2Bvl!5EMTi~t!eqmd_gB4v$&%CLAr&M|y>h_B6B0h&TWDM0i4!MEVUMQY ze);l+z0CXf?@9JKW8yUC{{8!jY_3e}X->KZ(lwB-fpiW0Z5K804{Vd1Ih!CfqyhfL_t(I5#^LWl0;At#%H&Uk%U?4-h-Ft@8_x++T zd%2JyCS*gvfRiNIAa)?cgb4CEm+SSKrs+h;vdownw$M!mRj>rZFyOKlzV8dcyRa4p zEm$DO?z5t%X-n9;NzFGM$2pEfOvr}jv}T_+eu_M2AxR{T$iZ?$eSJj8_2WbPYuAVv kC%tEm-@n*I;NLSo0Qpkao63^Y6#xJL07*qoM6N<$f=%b5`2YX_ delta 342 zcmV-c0jd7V1I`1GfqytjL_t(I5zUl6ZiFxpMmMw^0MP*_fCeG100l?kLbQmIb8v%H zAR$7HM9I&-#H;KY;#CwmN?ah%%=?D1$M)s&-^PooAjfgCEDOWXwr!Yk9Gj-8>$>YY zmE`F6Jg=&%ZQJ&JpXd4YV=%$QNyv5GqvmWUNit2-vMfbW#D8&Y7=~b&VB#bM0Cv{i zJ%rbFZQIuO{kvD51wjA+rp!gb{0hjjELnTB0KkC1UL%XA>?gH6=A$lPB#+MbIXz+{ z*@9z0Z381gC?R>C(-gK-@;)_yksy?)vMg!vXOENEikYIq3h)?5+=axvsG<>x!jeBI8W)wx=FA5k5LP?^n{bbd1AW5X{ijYgsr4@Td oE)CC!$n~>_?KhuVQP-b+uRzEd#7_eUApigX07*qoM6N<$f?nmN_y7O^ diff --git a/Telegram/Resources/icons/menu/stop_poll@2x.png b/Telegram/Resources/icons/menu/stop_poll@2x.png index 2c4360511ce89caeb598541c7d4f20ec98011f2b..36844744e191d8c529af857ed1e0f92843b81600 100644 GIT binary patch delta 821 zcmV-51Iqly2dM{;fqxT8L_t(o3GJ9WZX!VthGDgv5s)CnN)Y)5MuH0VnH~l&(lP<`(}6AJ-26 zFu-Q)M(D@K$H`>kXvXiu=h%e^f<}tG!O>{6)oP(sRqpru(P&h!*Yo*&CX@Mb_$W}N zkuCrVMi6mGyfyhjuv|Kwj zjtIbrs5n#?*?+_&>)d>Nd^8%3qaw3^1Q8drAPnw194{=;mCI!_D^Agft4+|JcKWNa zHFOofyuA1mazjBP!-F=+zSAAfB5>1V(x>YQauc~ogn%ZaVVfAOVs|xA>Ao|InFLue z==Js0U59Beu|Swn;a8TODJKKL%`@KkB|YLGl$ePMzkea%>FG%ZLBKuog!vDx@T17i z`_10O87_^)414e8E!}QcNK}!P)4?E)BtgvQb1O8g@@zH}Dph1<{%);EIh9IDVZC14 zd#lwd8^lkv#V^C*&>l6ERu$Q`oV2{Zzr#iN;s`(Kh(sP99>o3re-Sw&fmT8;iq5*I zI=IXZ`hUt62bYnECK3sp!j!I7E2}lj$;Tk#sr4EZ zIMqi`uN)U$gRqGZa6=bG3=*4ko>&BA=_J~osVx9tn$jZ(iQk-66ubQ5JJyrr46-oE zi^)W5wHoK0^|68K)gK$wQ1+e10x?T}vDIp>wo^bv4=<$(vp~$e>Vs9lHyc)iJn7*t z@-7=5^%yky4e2Q<)R#W#g*n@IuKNu97c=k|th;QR*ex-800000NkvXXu0mjfWQ>ZR delta 850 zcmV-Y1Fih22gV1GfqyVbL_t(o3GJ9YPbxtahV|w~Bq$}Ki6tEk`~iOfftJKxD6Fh# z#Lmi!gv5f{#)giLj+UO*L>ekTB5H#7xjE)!mYs#!6}_8Ww%E*`kM})uX7V%G3degr(I zFu+U#4M*T^y|=g5Znxjx-vh$1h%v?mM|T#dAxk6@jYi|_>}+Re$Aq3vr+0UEj1doV z^1*X>c(}d2ZJIqjJzZU0U0z<2Ia407oy}$kgMr!o$z;;$bV{XCGMV&)B1DA&W~LV) zK>6*%Ns7fHIe$>x$H&L>^Yc_H<${74#<-|EPyo94+HG(q+X{Dkdz;B*?54p|TyRtn z03*gkdNnt**{s=YZf-hFIDc$7;tq&}1#GBk{uhv0tn&t-iixe%TUO@UHaC>GipO7f{Qk>QU#QU>H_6DXZeP=B}%9HmV9flq{4?2p5g0I0o% z$W+HJtKqH(G@ha2W^aAPs~(Iyw@&mzNjoIu+;{QUN#=!Ud`6 z?HMwiVt*7<989~_wgHDiFqKq3f16CIlkJ45l6JLPJv}|$+S>A~tdh64w^pllb93X@ zLXpemkSnR!cmiTGD$<~UuCK3mcX$2h3nck`J}4mZQd0T!4A}zQA5(cUq=}hJqegRb zauQ+4)ZJ_-g_4@u&o)y;X8ve2vZz-of-YN-U8Pd7guEh=fg0r7*^RA%bhU$n;*Rvwg$Hr c{?8fs17nM?dd&2B?f?J)07*qoM6N<$f($yR{{R30 diff --git a/Telegram/Resources/icons/menu/stop_poll@3x.png b/Telegram/Resources/icons/menu/stop_poll@3x.png index ef509132bf6396f75a542f5265d6916d4a6387f2..e776e66ad8b36f2bff5de64539830d9d23adc505 100644 GIT binary patch delta 1142 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 M07*qoM6N<$g2oEu9{>OV diff --git a/Telegram/Resources/icons/menu/unarchive@2x.png b/Telegram/Resources/icons/menu/unarchive@2x.png index f7f13290bfb53345418bc8aa5f0d60c9a3de06cf..807a027da9a4d064ccb3358ab8c4d511a72e7f45 100644 GIT binary patch delta 810 zcmV+_1J(Se2c8Fzfqw`|L_t(o3GG+EOL9>duCEl*z%hRz^ar?zi|s;7qU97W4$>4! zHn{61LR&Zq*5EHJh{8>wP5KX7M28}xLC{1KzlZP8;o7;s&b_*P+&k!d-t#`s`<&-o zkN2*v8JFRJ;lOGgSXW8!a5zGtkkjd0Usnqu%=7vD^6h&Pvd`Tc&- z5`K^?t3gFP9w&f&KCcSESp-_bk47x?51S(QGV(Z`*?(F68A?kV2{|`~18p&mKAd&H zHk(Z>T^k8Si8w^()C4AzsaC5!{<{!hs0Jldqe~Flm&@g&qa)G)0fss?X%~dXl}d&F z(-BP=>eQrB5b-7wiLmDD)TBiaQA53Xcz7VPXrM~II2^vbyp*bu%5w|qbUMe!$5M1O54kdmX&D=EZy8Im+>9Ye$*je7p5(G`B(@ZAA+kaT9UgRF?^?Ib*I9`UlUavwm=QIdGOZd@BXM6nl zh(1m&B7R0YJ3DW0Z)6>-_b?PhPpeP^S{XIsTShfwoAItmZ$p~b7GUe2 opCg~)y*9XkG8`}*Sc(IG0WGTBxB3j(WdHyG07*qoM6N<$f^XE0r2qf` delta 819 zcmV-31I+xM2d4*+fqxN6L_t(o3GG-hYa&4uj%UCil0sC_Qd>I(+klm#h1ysMsX~5& z*aY$i+5E-kq#QSoqtYesZ^TJ=ioKm-rwJ! zo}Rp3uW=m|84L!8!=YgvT;OCfxw*M9t|^g799bAn5W1hApZE9oDw-76P&68CwOTft zje@`L+j_lL;Zky8<=x)iK0ZFu65MXL>2&(}`B@2nU_2ZS&t@}vzU6Y6%jFJ$bPi#% zu(XMDu~;C5R)2!)>+8{IM3E>-EEdxmDZ)h}k+-)uVjc_zS65e}h`qm9EK-cwzYh-& zVnHsK>*M3YY$?Q##o%x_I8EQUemp^y?rIv$V5SF068!9Z8)RkA_O5-DMRk29PW zK~gokG?^kuu1342(+iTS!H$BYFhe+ZCl(}CgWT3++grqO87J_#FB z>}+0MUVmr-!ax^;=mG#3z=Aa^bknoq7Y`u^V@E5mLAhL}C>RLg>W2_H&&ev3$z-Ip z!5qnxVNhBpgvc=}Bl@PSUa$Y$w^S;1Pz_~*3jjhQL?yl4rEjOv@AqjhAUtGsIvtHj zPLn=C2o_3V3A7_w2n>BwCXF=7J_`~R_J6Dp_J76n*vt@BLCvrGEt8YskWGWkkYkLG zsDC<)^L~xg@#(;I2gTyB@|EP2Jx0#bDYEx^Jt|VO*;E7_?EpDtK{}3%UqjVu6;}cP z;pl|0N~OY%EL^0qE^2dkcgGHWNGIUIU1GP}Wh=>41BsAMAP8>U1pWa{NTK7(5yDYe xOe`?FwmMa*KnPlpYpRX7dS}GB0{?ymegW*62bw%4VATKs002ovPDHLkV1i^Hhok@i diff --git a/Telegram/Resources/icons/menu/unarchive@3x.png b/Telegram/Resources/icons/menu/unarchive@3x.png index 02e8a3ca73d35c201cdaa2495f36fd61e7d6a6c3..95e772123da42afec82f127ffd65d55242be7f48 100644 GIT binary patch delta 1175 zcmV;I1Zex#3Wy4jfq!yIL_t(&1?^hTD|JB_c0Z#0CbF@Rg@qN_*bs^pB3Z~Ez=nl| zy<(+oBt`a=g%Bbk8#c(wS4cuc`AsC>_vCy{@0okp7q@rbGxNO9^Ul0? z&Y61>63oYBz+}K=z+}K=z+@nF8HfaAl#`QFQc{who*oc~4uAjn_&7a1y}G)hPJMPo zMa9a>${%H)ot>Tf`g(nOtVrG6-JhSI%0&GG{{H?R92`tcOw=JSIXQV^VnVefiod?T zUQke=RvT(*dwZKk)nlKZpBEMu`qJj($0H>rWoc=tuC9&-*xlXj>+8F@xuMR0c4lVg zz`#ILQxnBGJbyf_s;YW=dZJDVc2ZK(+}s>DKT}gvP%8mF3L+AT^!N9FeSOi0tE;P^ z5!E-CV|;v^#z0y3_VxyYbRUh?@&5i!Sn($(CwX~!4C3M8;qmd2HB}oK85y~`xhx9Elz*0%VzXhMI1SV>O;{Lg?4qt> zTxJZ#dVhZ}_m0VxlWT{&ySx1Sd~vs5;>+#r?O{^|!l;Yp=4LT-ml@mJ+bb_GXAsB7 z$JokVUtgI=kCB#^*4WrsTwKh;ff#O9S<|0^&E)OvjTP0!#f73>%L^@pzP!9-WIzn` zybN^cgMW3*fM9fXb~<#@=mG)CM_gv28p8shv~O>3X;Z(=5#Z=?d_=;yuK!n4pD+{& z9(lB7M~5)18Qd;EKR>^`yuc7IAsxz#ii&8lHZ(NE5fw7Fwzen^n(=7^0g3~90zPVI z3<9w4RaaM2257<=pEimkwiOCB6p zZr~Di!p3lb*cjLwzV(vEj~lq!RpY^(Dn6oSy>qljMvuI zyt9F}qobpimX?Eq1Kc8eA1LlAO&E?fCnqPx!D3xSB7Ef{77q1GTZ$Ak47L##hFS2# z!OWPSY=xn(nXv$~fSrJj=9=`9L|ey<;eW&*C(;&a7-&iq5DQ9&FdV#fbaedw`M^Lk z78{9vX?GrCPV+w>aUZ!?MKgxS5V^tRqKWB=gyFwtN=1A?NqZ`?IRYF#e?c*rJw9SJ z`5P>|HwZ8?fmDIm^z<~tg3;C0C7Z2RJcOo9KukQ+*UAOIAS zc>@h;s#tDNZzx&%JE?6N5fq_8fRS-ETz)(p$7f|_WoKu{|2BdnXbdNE2UR*>-HJiP pxJ?F3222J_222J_1|($QFXXuYln{G?{9yn9002ovPDHLkV1hBVI)?xN delta 1253 zcmV$TtaS9DA#ko&YX73p36To|DKuubY>p@)?TyL+TXX< znmzN+>>oee!_9!30XG9~2L6K#_?hNdP*9McpP!tZ9268}I)8|oFMdl#>Udp z(%09QnwemIYHI50>gq3Bj-#WaoSYoN1Qf$nR8%}ZKH5U+?<8+;Z|&{vieSVj{rvp; z`}@%tcCun~Ei5cVL_~;TLZbu(1kBCNv1uF;wzs##!^0^m4O#EvF)=aG+}z9snw^~; z9v*&rdgAon4}Y;B)z{Z|b#anpgecqm|y1To%(6_g@MMXuP{KTA3OibL_+2H^HlDE-wb8}I58u#JhAtNKh z+qg#j@Li_FUB&kMBdGUyfin_kOrZ>m+_4V=b@td0)wLmuL zv4pg>wSUoPVx%%ACI+`3y|Y(URnhdLdj9^ZO{+Jk2s^;wS_x1U11rN#NJya80|Nv0 z{VAdo%VfX+7^>!=vQx^$!otFs1q5e1kRp+T;h-{OWn%2~zbm-JysKSnYwOQH2L$gT z>Gf8PeBr6j|XN z$;ikEC59oCRAU7%*W3?|HRbGKrSm%tzZJ1TZ@aY0dW zLwZV}YzMKGl@)x2l0ZYiP#^)dP{N)()Fyx)pX3V*3(LyNAcGZ#8pfhd*+ER=wz#+` z3bdX$%B{%l>7n}&^aQokh6BSvWm78?!*^O{0U<3djSiiaIWQbl57@AK6p!2NIDa@e z2nh-C;A6{azyKHq3<97Um>K&g?(grZ|Mc{<lep#TFm6g-GrtN`n;w_p8Ih!?m?F!>ffT5N;ed18xS~47eHa!3_Kc$r)Xl<$LDehAyH&%O0tl|!iHkOUM%fo;}5W4 zVUoha#)_@-2T%${7D(AC8w)?DDM=!XLVn$E_nqE(@5?mz-rc=tae988&v~A6o^u`^ z{=LEFa@A@zkH`DV)SsT7VzF2vkytDi*Xwn;T$;`1-(p1~5r4nmPlQS&lG$vw-|r8H z!)mp1I2@zV2$pm@t=H?nz=gwM>>Q0o5r@ss=d(_y3j_i%3Iu||U;yrXK3}ibkB^UE zuuurevfJ%!HrwOzz{2PAhr?l|Qc31Rsr6tyV!HKnw;0^&*DJWYQ>5=^&fUMq@dhP6C8zLO_8om#bc{ zPp8vc;=5(L-71wzDAe;piT!@RP$(cNoDnfLn~l+E{1mj??Lwgt;ij?-2172F0}+%` zsie_paQwAe?Nbm=6n#LtsVp=B?7d!3Bog65$K!FaSbroV=>jsMg5ajIph~4u%;;X6 zm&IbCuP60e5L`5tR;xW8kEv9OTy;lyd3i}DleZ2k3w{6k`bt!K8~JWQ*{xRVuA9n| z$z*q9K8#+k7x!YdT0cw_iOQmw?}_NzPN##1PU{g|yjU#8ia%f}6pD7cjl8KBBm&-XE4!#a_V>}*jG#c2TTrOiV hi^ak#At?X%`~!FqO4hf+EfxR(002ovPDHLkV1oSfA|n6* delta 664 zcmV;J0%!fn1&s!ffq!>NL_t(I5zUl6NODma$4l}f)EoqZ3Zy~Qa!E%)X>*ZWM5VD! zaTjz@X)|>;aFRkdMKHrniQI&cpha*|w88Ih(D(m#;->fBmzUn*r8AuS-2d}Dzx$l$ zoO8Ff{^#KH`TzbosZ?sUT5UGl%gf7ZwW`%>dcFSdxRa9;hkwIC#c4E}_xE??V~oe+ z+uK{bHX4n~%gdvqBPxu=2m}JixxT)JZ+Cb1;o)IEpWE&B=jZ3;aw!xFA0Hn-u&d#4 zXfzsG5JW;3kW8^qV4+ZeD-;Sr6pO{hVsSd1n$6};r&B7G{s@AD#*)kB5N~d701}Br z0Cl@vD49&A)qiR+K|7Q*o6Rg1OFEtQdc6>RJ|AW*5HnVXd3$>s^J1~s+4;(X!ZHK` z0j;k6{r!HwkFKF27|2PbQlvDNd`j~B{St|U#zMb%JRU%U!2pr>_xF>@1d+jD@bK`E z%H1$xvDoYDDA9N-NIZPHr91g6@<#NGh8R2jkZd?eOkH*3#Vx><{PwTDNNV&SY0!XLR zZKxkFG=G*_tyZa2%&<@8?CcDnNF>4grlqSxHDpaB*=73=Blexw^VOJw07tUw?LDou;Lwg@4-K z-fmJeD=SOd1AoJ1cXyZBySqDZz&Ix-M+_*8jg9&F`I-2!E?ZPoBu=$V-rnBR)6*{r!DvLPJBLsi>%sx+1KttvNX8bcHGwdSP&IP~2&mVq;^^&dyL25)wjpGNP$z zXlP)?<>h5Kd3=0iw!FMtHN38!MJ9|hR-BocVMq)bXnzDKJ3AZM+}vE2j*pM)2C_nF z%;f3mNndkwa|{^}5CDw;VK5~~Xx@q}H1^NzzDt%!fXS5Q!Zs2(03 z%$}T_d>4ZCgM))97%*`yz$yhx0V*skL>3D=flg0P>F2xY=H{mCl*UYG3?Z=m9uX`9CXR7#9WZ0;^YinFhzM4%uCAuCudh!WstN-1xq<-`=BB&5 zJAbMW=;h@lEiFwvw6(PnsJXdWl&XRO5L_5AF#v(kO%e}#Fpg{lN=;1_y{cdg1TPku z^78Vu!Q@1>y1J^>tI8IERG1`~oF{R#jgOBPy%mBAkRlTfvKJQ@?5xJdMk^q+rqbV9 zrLJtT?}mqmNrOAd*H>z6iuA%+ql+R+1Ait|=lX>GpI1t$Wu1Walt58YQ7SbJn7BUm z^z^9sF>5n1F+m_6NzK}63JjQ{qocV8Ys{?_vAPpza&l6=ssWR_6Mf6@@NgVM!Gu(? z*XZa6nMOxP*+}#A^ZL|gv_HiZ7Z)e@z0S@~Gtu?cKgCp2Q^Q6=io3e6udjamKYv=h zdt_u}$ob1!CZz`}IPLH6FDok}2M#n-Q&TwIVrfAU2yk}BAs>?nAC?(hBXOonPfzFB z9yS951H9kCLq|sk?{@}&rBu|~+R6bgtz|6WoGO#tq@D1Jq7>4iQDS1^;^Lz2BbC6R z6we)aLz3$@-D;WeIE_9Z;M=CJo t=jWq(cXv1JP2AeDwid9pz<<*M{{Y9W)kllnUWotz002ovPDHLkV1kz@S_A+9 delta 1283 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 delta 1943 zcmV;I2Wa^54uKGmfPV*TNkl({TJJ$v@m zt5@h-j94+AH*a2jeLW_XFJHcV{`^_w-h-`Mw@Neb-@iX_1&bFiwj6KpcJt;<@iS-6 zobK*!sY1YyA3quz8t_^U95_&ny#x;)Jdnx&4jecTz<>LV8#mY(xUsRZxVZS?!-t9- zlZyB`di1EG<;U{!@)09Oh_Pqj%9Sfz4X{6M)2B~oOEme04I7L&(CQ~oo@DLp*|R0Y zy1F`6nK8!g(4j-c-W#xR;lkeDUZpah+?Fm~%9h8D9pebrtXacOusVzO-o1OQ@`(=~ zJSg^_fq!MomT|;J#g^PQZrsQbtXsE^BgW1{v`h^9kP|0PU|#v~;RD-aE{TbWks_V} z2i!21a`hON9O#T0Gempm&K*%*y?WJ7cX|~*nc5%fcf+1^P_znh#0)+a>E+Ubt@|y zRt44yX0vP8u8ACA+_-W4Xdhb;gCi|&w{PF(x;bLVnV9qvg9h=VeQcK) zJbyai#u38<6XOt>|KIL0BMx0|3KM?hVfiPBal_fg_SZKoue{3RC@po|x^)ZOj34ih zVF3PpnqSInB*p&}u+NS6ToWctkbsyNu*d=UTzB{GT~_@K?0}n*EHHvYFG;sFH8pX> zIFgB~xw)BD-ea85%uaQ=MMp=A6DEf3m4CABI z_VMFK>9Mx9wv3F7GiT1=)K^(qiT(bnRjb5_2LPudROXT!Qi~D_A5WF>rtI;BqyU_< zkxdX+t^j(>@avMB1i{4a-@h+%fUd4C;ouKo!@Y9lN-pIP3o+E>2{$H&OazC8eSeuh zJ}m$G^{WRdS0)DUyrfD@_TM)YK_*zDeDvs%I04|yq}X6bB3J+{M~)oHWwkLkF#IZe zC2?n;8&1H=+Q_$D5@=6ws2W(tn`>aV(@F9o2=cB zA3x@RIy*Z#dZfWwo0pfzTI7pZtACA^9`iXA#i=eg<#5^2(IKHjr5wqI4<9aCfSQ^b zsn-e6B8Cd=b6c`x335IhlMqAd-<-@rvXzMy6%}z=ZOrQ_{08nZ!@GTMN;Jk$M2c$B zqD6`dkB1K*W@5W`?K0bFNOXJ5aP5qnK`bpT%^cs{xpR4o42GP9HQQTDoPQC6UkBV? zzI=%UxH%@gY*@;jk zB$$JABJqTnGj4e0l+W||`G5INIQT5%6)^|gE?&II-Gx;fn-8BsIuTyJe3`vRMMXLB z(pSd*`-a@T?3IlG)~{dR=f;cw)2B}}v8hw1y7X$Fo9vYlKuJl7%X-z~hYlTLVxGLa zy4;Wp!3Q)oGMCR;Sy@bM=gyrj9U8^8xMgN$dQxdWCkqxVU}8uZ^?y^lc(BjSMJ4`= zVu|EiUf7A64;21OTWEsJ?ZSl%+-bSFxfb#2sDsHZIXRh$;czi()F_?cEo_6v4LfdR zU6>p0x>*FPsSX;q)YMca28_!Bn!#I`2ZtLj!|}xv5JN`RlQoU$28SE2j`C+7a6_tn z?b@{*nR^@@ZriqPQ-1~|9&u+#_f7_m`q(aEv$k*FK66_Hfg5HKB~@hbL^A#S`SZAD zgbW!bOqk*G3U06s8#Zk0*s(Z$K)!tWavZL3_^qg@;KPU~-vi98<3xfBn&y6UBeBoT zXAe8!;I9nY-nc*Ih7Xs;tZS~z=a|G8Hd}fr!R_Aa>S_+o8GkM{zdHnHG0{@xzB7WL@xG z3p-}yt3d+`LwkFBYilbO!{^VR1M`)Zz=1-G6UOe{yWtj77bam#`;bAX1wt(lYJpG- d{Qq0vKSY_6Nf3}>uE_uZ002ovPDHLkV1k*{)kgpT diff --git a/Telegram/Resources/icons/menu/unfavorite.png b/Telegram/Resources/icons/menu/unfavorite.png index 8286346ac8b1a94f3d595e450a448aa12f201097..dbad8a154775c3300ab912ac51e804c3a8f664e5 100644 GIT binary patch delta 652 zcmV;70(1SZ27v~Ufq!dBL_t(I5#?0POJZ>pRm?An7)vdTHbR7g;KmjruEdoK7fNZ8 z$gDDG;X(yh{t41TFuyj66ru|?cP%PER<_ZFf(XLINGL@R;ny5|!|RbxXST!K)p_@v zbGg5Jf4|3I{I4Mri7qZK0)c=~DE!+Q@cI0CX(p5TIg4~UJ%7*AXS&@kY^$rQB#m~4 z!{PT?0N|6PmVuL#laG&&TCKLbyG!WK&d!keHVXi!)49w~<+NJu^Yio5)6>Dh0rGac zJ)6xE0)YGbd#ZRL=5RPnCQ~YvHX4oh_xHoYLr5hO31PtJWHPzAxk1J2>+3`!;rIL3 z*4D^!ED{BS!GH7f^GGBTi^WtbmDlS9mCxr1L9^M!_;@@Xi^bw{x$EoeCX;DrXD64- zkrjS}VzF2*mxPWRN@R69-G5*(z|Bx9l|<(F_!t7nApUgD zBOEOp4&zW{Ei~9_wO}?HjnE$*9fd+6+Vg&`CJ+clqmjemAc>8QjoaH>Y|Z2GAc+Z* z)G}bPSm4>(+MU=8Psd;|yuQA++ikgAzOWY%o12^H-|cosqfvmXt1Dy> z0QfYU&CnXv+QLsb5g$5mh5$TD1TG002ovP6b4+LSTZV6j0y* delta 698 zcmV;r0!96S2CoK?fq$7vL_t(I5#3WiNa|4(&VQhWB}#}$$rBL-2mgUIn4v?BZV3ej z;vm?dg9<8`_yU8-#i7MbFoFnLBy??XC{d^>2ogd>a1gap-}~~?MMa$-?+m}+Ip6ut zx#ym9?$Xk~CalE;aX6fVg9D95^Zfig91a(g7kMu)FaL}rmw(GG;!&U9?~ljhEY?JU z8yg#_;`d0Pz@+@SN-CAY!TEfCWo3nu0)YU)Un7A6le*?A3IvUSD4yXTt>=$bSeC3WejYZyjCCWHN{>6bfRo zn7Cao*XQTw`}@1eWFpAg+8PL;fs7CW&iJCoolfWN?Ts$f_V#wO+3a?^4u=B)DwXQ> z^_7fbM*KL0e&IlwOh!SaQi-<)Fcyp9;(R`zx)v$LVzFASPBGAnySqE&!s}afBO124 zy889?b$@blLXn-F9i!0*lg(zQ(`n=?l}b{nloDnudwYAJVlClD71?YSCglA5oJ`Z} z^7p!q(ye z8w>_Qg#r_|-rCv%qE@S4US7a)I-Rp~;Z0#puroNPr>9&lcbo(hkET|ux!rEy*tP5H gYut34^Iz(J0fJUk%(%77OaK4?07*qoM6N<$f?$DAq5uE@ diff --git a/Telegram/Resources/icons/menu/unfavorite@2x.png b/Telegram/Resources/icons/menu/unfavorite@2x.png index 1f852b1667b09ba13b6f56afe691e0127668460b..976f451354c2497b986bda6dc467f15eae68e237 100644 GIT binary patch delta 1390 zcmV-!1(Eue4BiWnfqzIzL_t(o3GG;0D5h%^cG|`%#Ed~PIm{4~siBD|Q*uZSIn`v8 zDK113GtJc88N^Ofga{WXAyPeeYqd_5B(ekH5zicwB-1b_KN6r#CS%@%Q()v$NaY-hVzhIZ>ZbErytwnEn0z zzpj6qo10NlQEJht>HO-|tJBj{iiV!Y$Hxv14r^8RXJ-eVt!Wu&^*$mWGA~!n}X~o&XR?1Cy+a>dJTT z-mR^z5&Pxk<>$|zC0s^EMn^|S04y&rYiVhb6#|A(!UTZCMctu|jm_xjD8+W9H{gN_%cJixtb$@l4nwm;5w+@4Xf`}n6FYi|HKY$M( zK9B=;?e*)|5+7}CZLA;1gadxZ!bdzH1TDEoM@LJ@<%d}CpFe++&*9-APP8H}DJcne zhcLf?|MvCuRm3Q2Km|hb8X6kX)6-ML$ZISuEe8h&$rDc$a6~DA`uX`$aRmTZIw2uJ z0)G&PaOc(lc#tcv+@kNlGLB(kVIjwad?Q{u0-+y5)?rM3em<8Gkr9q?XBcS3q%R_G zmm?!1_xARP3xeXVFJhj0_1LuUk=3!7+`E zjlFpBf-$(N$fdA?UKAsYlTz>|kp^=`Rj=q4xLeis5Lr7<5=j`n4dmLfe z2_#A#9UWTv_4Rd$iHE_#!QAkpihca}kxdUTaPw7NU9E&2X=Z+Yp0_V6D+?XE61?gr zZge6dB9ybBmZ2Z#n3|fJ6jO$BhC5m5dSfFbmq^z6$&)8FH8mX5$jFGbwY4l#MSrD} zlM}I{kSS82xBT<^C#l}wzkk2Fx*|u^|F>`7D*CFZ`SRrp@hWy5IJum!Ap`~nigO_A zaIJvwVBfW9UMV0nZag2>qp`7(^x_k32?{X7urS;nVZpF$Y*JA`zlNptiAkkhMR3`Xq)T$}n+3Rs4A3&tm*VA$r|IMrRg5$>f;O zYm4PmmIweexa2ZBJBxmtVV<6ztE;Op@z)ibAlx;tW93mja6HGy$5FRM3MDemAHH#M wuzGuYMHm_cgoraBDj(&?6?j~M|LF?+4I4srNUwk|DF6Tf07*qoM6N<$f;r`)VE_OC delta 1447 zcmV;Y1z7st3ziI!fq#HWL_t(o3GG-}D6U-;HqTQsbr3Ry%psw0Qbp0(cn?!DG} zKP4r_pJE3TJMdx$EG#UVo11_B{Q2X@kA{W@6BCmc=D)nKw12cbJUsk|`@_=A%vWSh1jgOCKGL$gA=`IOS zR#wJHhlYj>3=HJ^79|4f* z_->`Tx_V<{Bjt2=cbAryCT1xpC}5c3;bGp2CDQ}I>;F_PDk{QLQd$)i70SxWJn87@ zD6?i{Wbk?{nSO3=j@N&J91|0Bd3i}W_4W1Pg%YoWgMY)u#>VaKt)ZbIDIs79CG&D} za^g*&AbWUt?C$PTP74bQR#sNTYh+}ETS-e2kUDdzs;c_(<%_AQDYDeo)>czfBh32* z6_w|!hjThTJxw_s931%h`4OGqJu-blLIU9h0`39!4;#O;v(wepC20!-0stq=!?t&8w*mD0N#vu0bXK6 zJ;Y}4fH!5lV(hn`o*p)a&c3`pV{L8C;+>zL%YPgse0_cK(3I26%nZhlH}en!aMI}t zzrnD%xyj;TzVY(%5_6#h&(F_OPMCx|Jw3%RIU3M{oH3ww$U**R!qGuTW9XZko2;xX zv4f6|PH%57<%DNNw->`?YCs5D=8L%?EG$eW?1d781P(RDYj1By1}_jwN;nND--JO~ zM}Kh_U<6B$fQnoY0)YgWSC@{Cj!R2Rg?<+Mq_xQvk5R}Sq%*hF$@~GgM!#vkbg`c6x`h0=<0ztBqT&kq_3|(I5-y;$0-km6er@^xL;@0td{d9UUDM5(0{zU}(w9%i|}ZnwlDZA{7uy zTCT6Jvyg%f`1ip^f+`nvZ4c`4@%90a8XfFi~`SxR7y%p__{YRFhJkY%mqunhro;fxqk?=0QQn{ z!laOrl0va02^fLt&Jz&?bZLfNxGdSaESNeHLRFeD@rJ)4*R7gqfV2 zw70kCV~Aw{0Ao4fNEH?q@|d`|ILa6@Z;~YALiP9equ@?VOkjSH@^cn=+0S42IR)bw zUap{6ySuyh^z`KC=SyUhlpv@Aq}Tz)4oKL6e*t%~E>6!GxnckS002ovPDHLkV1o8% BuucE~ diff --git a/Telegram/Resources/icons/menu/unfavorite@3x.png b/Telegram/Resources/icons/menu/unfavorite@3x.png index 0fbc2a0f5cf5f5d6f0ed5c272cfa89f142265ea9..65642ed701a4823e218637091e266394dfc3aca8 100644 GIT binary patch delta 2100 zcmV-42+Q}<5}px|fqw`|L_t(&1?`$;s8vf8$B)-e3@q$U3@l7cL`+0P#R6Nzz(TME z3j_TiBIXwZu@K{nAU0xQfnBKB-SOVent^Br{>L+rEnBw#)aWy1$~1E1$fHM(et-G$<;|NnXV0D;H*Q?k ztXco;LFUe#d-v|$e_4Nr4jrQF4<6fs1q-Y}{a~zHx9(3JSo!khKY#x0H?VKtzE!MP z@z;$l&8@mYg9e>Cb;_PSyBp@&J7B;7*-Nipy=v2@P2j@%a$!U zdBh1tEMLAnbLPx$57(m-W5L-v2WkLeEIS@ zJYYsdCz>lxt|lOR;?2Jkt0WJ7)${G zwgD;PC?c01AlGXg9i^*M>FxJaN)u>047~Bw$7b9+nAJcdiL!3{{4G#ND=eq&9ehQt5&U8 z3U;HPfBX0E7d?Cqez4T>$weMKcpyG0V&~4Cc2Y~m)U|6@KhOI2?=MQ;zI|J(R;>yZ zDwHl=nk`+hV8Oh3^OEk^^W~>49Dd1?CC{8WBY$owg43x~sZzlW;QEIT9}FdS^Xu2I zd?RFJZ0S>{PI1`OsZ%Go6&G^Us8N+FRWcB)&-U%x4L=?}eAuW_BLnGZZr!@o&=91_ z#-1=?f(Ep+bbtLrW&6{)P%;~Gzr-P{^X0ZJV6)Hp&A(jwPs#U8- z0z}Z7Hf@@2MG|WtW&Z3A9Xg02md+m-D}P(I?8S>01+0jZCr=hHUfdy-MAzlZm&Hnt z9zBxK@Q;X|@^Rtin&?nO_PBTNUa_i(d-v{z7Q|vP?l}4>+OAzYhd-{aELpM;WW`qk z11W_=fRBFJvSor-1ZPx+Hu_I{nAVR6)aJ>P=Vxc)|EEluVmP{C!-ibBayc{&9e+Ah zPnQrU5t}q=l0(GZg*l8GZp@xN+btEpckSA>hEldu)v8q;lAH~k5QfzH_3M+UnPSM^ zz1y~J3n6bNQZYU3G2KxvpuKzdc8slZ<;rqYh~VMFhdpy*KRuW*Zo0UEGq~g@k}$u0 z`}X>NQ@*ZPvBFWnDo~)nfddC*RDX)NdGltC8a3jYM=i)TDsHvm z_p&~E;=}4WY)}P~H~}$a$PiC3^k%=+ZdpI_Gi%^i8+!i9zsN>n`e7|1Z2Xcv=u!a>fuXwf1gR|2_a z%^GT;$^!_RBCZGmV8ezDZ5MfbGs?^;pFVxMjSPpQ3i`^Y3x5|bD5ca7p$(5Yjy&(6 zFzwud9{_hM&M{+Z0qokft4NU|e#YnmpzDF&v15mQ zRpCm;led99e*Acb>WZFjvEA*Gm~NQT(x5?uJY@|gFryB|vKzlLK!j+dzkn)R@@pSM zXNH=TyY=7g=zpW)Dw)u=7qD^reDvs1lO|0J|H%4z_0tWlUcK7Dgwy0OHQsEwFH-SM zqUeVRziN@}1n+q_>(Zr*?I=GDQqT79-o0~2|3I%;wgJTX%;~XX$L`#@V=ebaoM;B38Hi>ent^Brq8W&0 eAew>jX5eqV9rh6A&`)sy0000 delta 2281 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 DnHh(l diff --git a/Telegram/Resources/icons/menu/unmute.png b/Telegram/Resources/icons/menu/unmute.png index 297348e08de0f8115f07b64af96a82550d10feb9..c6aa5c4cb01fb01f97220b93b103842a74395d67 100644 GIT binary patch delta 509 zcmVh*dxnM@juCY#M#tyUJI3V(&7)9EZ03$xj*)oLLW z3WfA~{bVu$E))u4vG}!|OeSl!TI==NZnuMtMo=6Mhk^Ngej<@L91gWwO)8asq2+S9 z%H?wN7US`Fzu$X29>QY^kw0Fq_jEd?)9FVciA1tmtpz5ePb+j?nHx&oylSuoJ>)nM?+5*6VfB3+W51zLS;b^ErUu@89iq0NAo_ zw+jnMmOd>Oi(0J)?RY#!qtVS~({8tE_73v-JSu5aDs~k(N^;a}TJ!Dp6Nb@f1OpL| z$6_%8Mh1|5C}k#^`#|R z$z&3JL8aI035CLkuGxLUxL`0S5{cNA{UP=zMPdWE+c@yl00000NkvXXu0mjfMymPi delta 563 zcmV-30?hsM1gHg&fPVrKNkl;|Q8KWyvB_jm3}P^dC|})_uX~@IH}}21u6MiL-*7&j^ZcIocb;?3`}X#4gL=L* z9*-9Y1bjZ?ms=NMx%jgx7$^#)z_Jr z^Z9&@M)Q7-Y&HujTEb%r5ya#1>~_0;zb_Vxe`vYg?&Wfc-9R3NCbmH40^qu%jJSo?RFcx zQ>j#hMq7|fCh7T2$J`nU!3n0*X|TfKFp45Vbn!q>r_+tX9iUh&Hk(bm-HtUBj#jJH zqWu=arlZdqa6$ev?2~3PJfq5rMsU3iRlr{Znau6nG870 zo=hgR3hBz_GHly!w;$)|bUGG`<-&O7_-V38B*Klz<#M<_i1~cJSS(B?6Io^o5#-^8 zynLJtj7B4bX0sVy84%{yet#lYT5uHa6BiYy%dCjqqa~sahXbzRH6&?2Bk;J=SRY;0_2XXpIm$e6*?+mcz5V9qM!*7X;!tH}Wj#GT(ZTHOEL@5mD*I(Yf-zy*F1pW&Si@UqK zShcmaEiNu*NH#V$kTHnASpAYXIyy>BOdK5@O-V_yw|}?q>gtM!hm6d={gpfK= z@%Q%^DqzweVg`4DPeT67A|oS{l9I4?dwbj3+InzsAQWI_cXxMfZ4Fr|n1+eU%1Rd( zmxP1_WPc9|)&BlIW(Nd+NNRe;`6VGzQ(9KIWPb@j^kn4Q5`a(-i3aDKL{Lx=iOb7N z8BntW3JndduCAt6%qJuQ0|QB%ot;?}5RU!A!U7XzX=!P4a+2=F5CY~GfKU%9;p^)w z6aB_#b8|BrFp5Y~Q4wknjT9CZk`VbWjLR$a%E}7Y%F4>nJH>GT69pQTdU|>qy;|rS zCV$XDQF~TbS4&GvkB^TjjMjlN4H_J@DZ>^%R!2rgSVmRfo12>=;4)jvN)3UZHdmPN z^76v0sfvcolamvXl~PQqfTRLWPEP1tG=g^K=;$b2B`yDD;GUnKV=Tm3Rn9{-H8q}| zp6K=y6BFpcr>Cb%i~2aIiv9ilQBhG4cz=F=M$vm@tZXcz6g*N zxVX6C;bCMeXpy9^udjqCk_^QHLwaUrrWiaZV9GZz!7<|mh&eeqD8&41YHFe9s p_xk#}s+h*qBA`V;i-39r{sKf5T$l8-Z&CmN002ovPDHLkV1hjQ85RHl delta 1019 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 Y1M`(8aM8v5*8l(j07*qoM6N<$f|EGYrvLx| diff --git a/Telegram/Resources/icons/menu/unpin@2x.png b/Telegram/Resources/icons/menu/unpin@2x.png index 89a0aead5bbde8311163b78bd6a4a67bf4813de1..37c34e80b798d3faf88003df934c892d262c4ecd 100644 GIT binary patch delta 739 zcmV<90v!Fn2iFFWfPVtPNklH@wOR!!;$*p8 zj%`XK7K?p+e0=X8pP!$JM1oR*H7pW|yuZK0{V5a*)}Z|hnM{Tx*=#oCuv9AThw~hb z$73WnnM`PyQmGU!-|cpFIvo_ey1Ht&+t@FN>E`AJCIKbW{rx?zTCG-PG8uXMg+c*e z6~q({hiRCS$$uoSSFhI@G>D93ibkU(EM+iXlKl?qlO)S#h(s)0ZN0m0(s4Z%oYV^XWtZnv8e z%rO^78WX;eX-b@$u2;^WkJ6OirhBx7#70 zP$+~oX^mhoh>}4?IFrNSczb(8g8hD<7J`hsxVV7!h{9yI+h1Q_kH zc|0EEhcmgSE0@dI&)Z0+(|CoG^M*}`oKNtvOI(IwCWfDk`Nf8BXZS;afM{rt9579% zQ^?BYa*P6gzdxVP3;GQ*7z}_3`oxgt9>NP%oK4TcGBp1f4kk)YsRL36qz>@tz#l18 V-dIIpJeL3f002ovPDHLkV1hHdSyKQ2 delta 844 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 delta 621 zcmV-z0+Rir1>*&ffqzX&L_t(I5#3bJYx!{)|1cXnnEY5tIjq>!_rz%jrC5H2TFKdE zrMa&ZXL67u{sZhhie(pyn**iL@*@$JY^})leQo$GA0OKF`+Z;D@8@~Fp4YqQ{eGT@ zApYBRuqQK#MDpi*@p!ymueW5LoSZlu4!vIg`T5!DboPW3pnrP3-fFc9D!B{>17a>N zE?TV?=?sU%JB6%P>u@*(wNj}B0s*Jfd3}9tx7*olHewzhAK%{I;E~Ja@pv4xtE(#- zEtkvn@$oSljc#sk7z_r5!DKRLvso+_Tl$4UA%y&XKZQm>d$CxQN+ppef)j~^&*y8m+pn*$XJ=;{6pO_I z#_jFxhIh;0a5#}jWImsR{QUf^)9I*`Xfz6#&*xJCI{WD8NFWfNZLv$m&m6lANEPi^byc zc#QFs&1U=kKCKFzKZTP{r!g7o^?I>byuZJnOeVWx{t^FQBZC|eDL3h-00000NkvXX Hu0mjf5|Su6 diff --git a/Telegram/Resources/icons/menu/unread@2x.png b/Telegram/Resources/icons/menu/unread@2x.png index af933105642901c67887ff19ac4a3f7b8c05609a..b452b9e7440238020d9ae1399f06a5479c0a3dc1 100644 GIT binary patch delta 1186 zcmV;T1YP^~3X=+ufq#8TL_t(o3GG-}D0W>GHvBSYp63h6P$U;b_%r8@C>Kb|jT^ae zAw$WO3(0ULk`i$tQ!8tl#ysfj=v!1>7 zI(x6Z_G@HhcnldZWWbPtpUr@=KEs=un!32SxVgD~etzEF-G5zOT|v+!{P*_*BmfHw z3o9!tni$PnvySuyJ-`_<82wy8IDj2(ukI(JxtJY+}zyk@9!@y zEv>Gu?(OYCK!5%i`|Rv2Mez9e*woZiP*Bj)((?TLOvwrQ{K)_N`+IP3FeD^IiF0FP zBY8D6G>Gu6t*vCLuC5lD@cNIYifO{a!jM>7TU%)Gb$<#A3#X>0m{neIb#)~GKBWlB zGz=pIa09|-o}Qkzx3>rS@bEAtB?a3`=qWE>Utbd-I5=2@WEzGM0i<91`uZrb=jZ2s zetyy*zBVl_joeY6uss*?v~iA-1zOs_?Vj*iBPfg6@^R8*7}w3OM{*ch9R2FB*E zt*y<;$$zPE-36oq`ZpYd8Vm z{QCOp;NYOtO$vvYmY0`V93)`2G9^P|QD1o!tD=1O*DCMB7c$+1zOYk0~*vD%8<3S^$!fMIV7DG zA0Hpsx|&vfG$6z&i^Igm#zqCt(a{lQ2+L4~n*wN7Ru(armzVS45^D&hnb0zulSe17 zNBJfI>Jtws5fEA&LZ_yt^4xUO$Hc^traBk{=u#5Zlnu5C^4Ajjov}@SC5XuMN(%TUc12(;%wL%S*jV3H$0O zl4u~gWAY7X7FZ{PkCmC3$;T?N;5tV$!+#oAw=aH^r>Cc*q!9z6DK0KnFs3XdH#e8) zMn^|wfnp;H;QahN`QjJdRZ&rq7{qy(=!X~*m7Zi=$e9w?p!W85b93{xwKWu~i;D|% zs93gW>u^;~NJvOZO7isdWccIbV=TdqjSZ&JQNUG~HY(;v4GD&6Yiq-LVpEqF(0|P1 zs%m9rrDFslx0;$78gFN3r?j*bpFs52f=o2XN@ZmwU7nH5Uyy~A0MBps;br1)qiCC>gwvayxQ8@ z)z#HsUtc`<_xE>weZ8KZ9v7^b?C&`?`jTUS@t$jC@vU!SwHGvy5n3xg*JerIPVD=P~QPD@K$Utgyr zv9Ylf&m`dU9~~W0eFz&H8>OYCUS3{mY69^$Jv~hnVFCB+;5#lZE|Q_;nKm zY{aPuU4MA4rlyASmz9+X5MqN&xx;_{{F$4ZqjN)mKj=Y#CUyzFhFlJj zC_g`+P#}ho9|X`s!%j|4YinyloC8AexES6CbSle!e=tgr$z0@EY8CL|;T1%CzU>+7@X#l*yrbs#Mu0$9~liW8fa z2F?EdK3t{JiCD>`8-)DDN}y_-m_axs2tQ6|RZsN8mywat+S=;j;qlYOku*56==}Vg zG*Jq2`&B3-X`oyIp|`iUySuw2vzUjDkB>adL7(_;Ye{n8>=jyNSZs*cg+7 zBB0dNR6>pd%hA!1Ni{Jsk?7z*GBT1$hYf_FLBUGMd3OPM1gK6>x)U|zMSMhgXhp_K zN=oQbkw6qs#YUi-9UUDCXv&8A`ue`Vzkd^2++kz`WsJZMYEyZ6xeOF*H;$a^>uW-I zadCmmE~_TRAvx2V3W$WuUaBb}L_|d3+$Yu`mgC~$Bp_@Z$;rutr6QQbwghXQH=h+5=%~YHECZ{C?r#f!hfgVY{`pg(sN!_;_5Fm789y9wHRc(b1Gk zLqiOJXecf&#KJQ!j}dRbpW30T3T9gZBTCi)8(-U(%*P+ vV4$2sd4z{1{2=_5rL!3Li~03{q8|7c2Ld>~rLv3I00000NkvXXu0mjf58iE9 diff --git a/Telegram/Resources/icons/menu/unread@3x.png b/Telegram/Resources/icons/menu/unread@3x.png index 220ce7598b66657bdd2055309804167cbe13d6af..d8571a7c9ba04f01f5cf3bcecd3f1a99aa822002 100644 GIT binary patch delta 1790 zcmV6Ea(V7O$8*m; zSO4JnAZzcv_P2(+_gZ`Jb=IuW{xlD09?(3Xc|h}k<^jzEntum04;c1Fw?9;NTD)9sS_J z13n5mAt8Yys6#`oii!$>BwZ5`;>nXIXU?2K43IDE=+UDb?bWMSJaXu8($mugJo52n zar*iBy?*_g%h1t%eSK+ZY1Y=(vQU;X-M@dI0Dt`Wv17-MrQ`p#9zA+QY*@FOHf=J< zrlb?$`+viS4}`8G`uqE_Y_Ob^ApScCE0!=N_RqnC2Z;?tY;3GziAyGWcz6s93~*@B zckkXs4qd`$eB;xnPXt?7SSSXtVZ#Pu1A$F0#)*EpD+inS`Sa&khlGWMlbM-$@7_J? zQA_}e<|5J(Eg;}o-ot0{e&gus>T2#SWGx(djDLd==SHX`@HcPXh%pM{hYAYB$H$Xk z5P$ysiHnO96R)5jXDE(;_Uu`G5G3W{;bCH%n3zx&s1}iN9z}Q{#QFL8)YR0)VKu0L zfPmTASrUQefP}$;eSLkA1Bd~{jT<*OgA)3}g$o=J(LxEza&vCqzRjh8?&#V92LI5HKMy4YzLW~&pluso)xr^ztf zwU$#%opIb#i;9Zc+S*1(N56def+dQJDSxh>s<{=ZovZ?J;J^WO6km0eva&KV?BmCe zmX?;Qu9AEOq;w4l2_Yb?Z)7lP{{IOn!?teSN(PLKj1c`-5K@Nm+umPinAGW>U*N~b z$5-)(!rcNVVEo5r0=wN*P52S<`t|Fk!kI81k0rV=_V(>t?rsT4silZCLNmR*ynl#Z zVFK^LbXmsfWcTjfaukqjn5UZKyB(8KE7l&?jaOI)6xw+x8ObQq* zWynL)90`P^#mSu-VL%)(|iR)f`+bP{@{6Px&YoR$&o0sN=ZPdr8G=G7g<=nY*V!qc` zU91Ps+6c4Z;o;^rLx7I!GmIgfP}jlr48a3mZ{XV~>Q_em{{8#bty?IO352dh6JKX> zrN4gt%HuvC0*!pit9XJ@YT^@>J9qA+q@+j`olUV#*4J;ikjoK|a!hV+F4V>P+_Ps- zSXdZlA$a02foBDPfOi3pXZVkehbJ&o^j2XmwiCHojDW6}E?ru`e!U9vRuV$2)`(kR zZEY<+$XUB~?Mmt+N0zLmxO3-D6tj`05Gt^Rus!g}CyuI!;Mn?d#ArO42Q&|89?(3X gc|h}k<^g!%A9}jIj2|j!lmGw#07*qoM6N<$f(vefQ~&?~ delta 1947 zcmV;M2W0r_4uueqfPV*XNklS7;SW7=V*lqUJ_p#TEsLioM2QEJzRw_#ly3 zP*fCALF`>r)VxIT!GZ-N77!zdm{_o&VnGxO7O){IVsF(_fB*Npa^=dZRjWRJ{Ai_O zjT$u;ELbpR%$TI4Bn1cBWy_ZB*|SHPkJJ$F_V3?+>(;GLpFYKgGJi*p9<@@XZ{NOe z-n_BraQN`y>VMU%TX6_xp64-l?%bCzU)rl;T&+{5j!}b=BS-%D@xzF0oVk7bcJ11= zjT{1)@oW-WzI*qsQl(0Y61>1)zkW5^U^R34^l9D{g^Azc`0?YNKcx>JKJa$^{P|N; z@$K8USy@?%2Ib0?yK&=&V#D?8*Ox3=GH~F)v17+>+<&-{BSb-%JbALh$NP{6wR7iA zMSvVWc<^Auh7E%U5ANEvYm+8T5)u+LVX?8X90m;8r~l}GB;}k zD3brVbLVWRJ9q9ZkqZh6Y>+LN*g03PUX_f1If5+-JS}kgefjc5m-6}ZXQC=APP1ms z(lG&6uU>71X*WM*$`r{3nES+z!0Xz90|%s_9XocIa^l&(fB#-$63Urk+D#Jma6CvZ zM1P#5*Q7XLE|L{1Rty_9Y|^Aj+qZ8w9?KIaPIN7^Lx&E(e*Kb?h7KL-nu{BP)YMdV zmy~D^A3Ju;%jKy&t`jFtxKYw0E`iv$Z-3wH?a@|wCv6TGOYv2!RwWUX0=UX7u>)P` z)vMR@=g*~RBfNL-UT!llVuuVFBH59*dg0=g2Dg$Xb1+C9fY};c#}1D{^8k-DR%*3t z*Dg7XG|Yj%aN)wmix;P*rOBEH2^gV*FX{L1-%HB!&7siK7nxL4b*2)bXSNj~+de!#@Q!F^oe=YX65CW^yX(RSL~KiZ;^D-w2ad z6JDV}US1wSti2{ChLM>|np(AL$>HyUargQ2=c(tQz|^TziTH@WY?Lv16}d(vLH+vm z8yPDt`(?_AH{aN`pcQA{&rHM=G7}c_2b!OsFGW#Nl*8!5J$v?)mJl@3 zyYQk0)oI;5031hNxCBSDfB$}|&&-)KJ@O``Qc7-^>XDakGR{C5yHX%fVt*rd64tL@ zFP-GQF6mCJ2{tVbsR_jo6C~$TO`A4VvUKux=j1_QcInbZ9vfIl+1M|0YLU`aBxwZcy5jNU$CaLyC&o^Rl$Vg!VfXIcof6yQ&7M75It+Nz zrcL%FL9Nc1F+&lZlamt^^M4pR4`NTC_+J#}Q9`+b?S)eXCZjlp1Y>K1FEQu;Gy-M-;0#6$cF(WYj8v znJQJP$TRoh!-oMdHLw^lVuaFP#zL-~2nKX~kRZLdd-raGR^BIQ-+xe_y>Q`z6rsUb zg=p`r%cSI6A}Mv;xN)W=b?er3mAp}|Bo{VrU`-Z!kCX>TOqei%?g?#Py~s|*f@r2&w{En;a&vQ)nyhpjFxB}8ZQ~Nnl}}4Z8A{fQ zAqvri|B7aE$QxyBZGTAw2~(KhyEjEdM21)*1xu-&I(4F~FIWA*ycb--z9M($4nTFO zD_=$NM$uB5H*cQ(Q<79=!t_dMnJe{7=Sq6Pq{%JSqPK7SQcEK6>5j~uC-3RkfPYok{Z3y?wU1g(xj3(xe-U7K~b8Ze7i`f%73oomz({THaSpLU4}=~F hJrH`}f8>FG02IiYXFw^ko*DoE002ovPDHLkV1oL6%#r{A diff --git a/Telegram/Resources/icons/menu/view_replies.png b/Telegram/Resources/icons/menu/view_replies.png index 0c119764fb299e0699199448871799b0d689b50c..2f57201cc9aae5daa766b25f139ece1fc1e2436a 100644 GIT binary patch delta 468 zcmV;_0W1F61j_`Ffq%70L_t(I5#^MMfeYYR&Y3me5kNfQuK=mUrd zR${B24`3&Pjg59HHVYz%2&VT1EUiWSMLoLnZ(c>h*f9R;yO4!C(;4 zv)QcM?GghaXa}WIsnKXGm&?^^MZUw~;5ZJ&JkQ7DaRfP?&SJ3`i9{-u3Sm02Uaxz- zp4Q6ca_94TG#c4#Hu90%ZnwAFt<`EJlL?Q*g#uaWbozVB=WITo2P}#r!8}v^ zyS`j5a!jRg0NUDVzHQMjUm8-TrO8M8V!fThMcL%f=p2@5C{bDeRsPZnYtd43z15tBuUab zq_KBJQO4u(e!nNvI0#3v-|u5V?V40`I2xN9t;NfiBwf}yWLL~8epwf3!B0f;q`hAreCtq$d~y40N(&57pQ8$Of^mb0000< KMNUMnLSTZ>MBHBh delta 483 zcmV<90UZ9z1lk0Ufq%qFL_t(I5!F+_t3h!bMGu3CQesfA6q{_KFv#*2(;Y1S2N~>2 zC=0tkK@55+tB8dSiAjnHgZ#)l-1k1;+jV{2GQH1qzUQ3px#xcG{c1GNCzVR&^Ld?4 z_uQgRLCW=dtyZh=W??^4RAzn1%7w#Wuh(ld8by9Q9uEeCWPdU_o6WM>tle(+`FxO; z%jIx5yj(7_?YE^~uWvS+c>d!YkH>bq4Ns%dAhp-)nayT}pmaJ76VAo$c7Ohj-|wH# z=Lm|$V%UR5U-!x7axj-lC550?tF>4xq=LiYm`d*J?1e2uTc-pbr{~kcJTa!f0q{Dq3oc zpuy3pDFT}U{{_crY;F(*!9g9gR}>2*(TaxXi>RpHA3brU>$%7GUhUQk*Wq&R^Z7f! z^PKB*j!vij_zZOO)g0~I+}y^-#_8$l&CLzROeIxsZ}08x?SK3G`^Ck@XaAjrX>gtLLh5vkedn1FTr6nZj>FFsH3L=-w z%ge2;Edino9DiiGv$G?L$axh2EiNv?-D0r_5|P)@(NR}dmlPVwC3Cr4$z+mdlg(xi z4-Y{VGs@W5STGng7!1(na=F>r+2`kHjMvxKmzS3XKJ0coR+A!xLZL_`!i**+36=F;^6|l#eVl6y)se z3}LaF{r&w?VHxt_;bEFeKA&f(KST=9z%QLnQ{>UnQD$Uzabb^;_0!W6(+!KbzrRmg z{p92%5D3(2HKwIpAsbN3C_qeA+*vfp`^iL01R?`42UdJO-@(Db_4Tz#+s>;(KuG!L zuy(Lg_P^jMZvI zZ)QlZID)y|?k}e5yr6-9d3gZ{^v*&Rw?J)2clGxMEPu~e800000NkvXXu0mjf Dd3LpU delta 924 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 BT7Cck delta 1306 zcmV+#1?Bq43W^Jmfq(Q#L_t(&1?^i)D1KWMzurnINh0Nu5W+wP1_*gXc_fcAGBGld z37MOal2RCOGZBM75fe&6;V%r7cPW<=$@`Uie>rtp_IK>FopV0l{_g*rf!11Qt##IK z?S0l+-`<l+e}6x&)z#JD;9yro;e=_UqEd+d{(c${ ze)us8lz-*@9*c^KqN;eW-rnA*ghOMj=I7^AQc|c6Ud!Cv+{?>LDio(-PLgwMg7YMLld67`AQ#^isToT5u8xn8Cbd6vHx<#Ct4ot0z<#!sn&Sb(dLWIR zVd*UiX&x{M!xaz71}2^>IW*mA#F$kx{$VC}0+yJVNN2;v#RX*<+HHV^goM=8)X?bn z_xCBw(Cz^Yy}|VKG_a}B<6Pa&&W_4D5`VnT!%>?f@%Q&192{hp`#JjJx6lA#tA)|; z>gr-73~LQA>3|kP` zGUabo@l*S)yOWcX85tQkF`;W^YAWKxGBPq!QBk4$7&8i3AUi!h#Ziyp;o-%_MSnq8 z#({ZydJYW@F(vr?{5(HDAG1a9@gizi&%{Qih$huB2n<^)0|Nu~_4U*jzL9w`WhMU0+`p6cmW>%1V0tV1I0Ethcw9Nremoved) { addAction(tr::lng_proxy_menu_restore(tr::now), [=] { restore(row); - }, &st::menuIconDelete); + }, &st::menuIconRestore); } else { addAction(tr::lng_proxy_menu_delete(tr::now), [=] { remove(row); diff --git a/Telegram/SourceFiles/editor/scene/scene_item_base.cpp b/Telegram/SourceFiles/editor/scene/scene_item_base.cpp index 0e7484ea5..f4c7d5df0 100644 --- a/Telegram/SourceFiles/editor/scene/scene_item_base.cpp +++ b/Telegram/SourceFiles/editor/scene/scene_item_base.cpp @@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "lang/lang_keys.h" #include "ui/widgets/popup_menu.h" #include "styles/style_editor.h" +#include "styles/style_menu_icons.h" #include #include @@ -195,26 +196,35 @@ void ItemBase::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { const auto add = [&]( auto base, const QKeySequence &sequence, - Fn callback) { + Fn callback, + const style::icon *icon) { // TODO: refactor. const auto sequenceText = QChar('\t') + sequence.toString(QKeySequence::NativeText); - _menu->addAction(base(tr::now) + sequenceText, std::move(callback)); + _menu->addAction( + base(tr::now) + sequenceText, + std::move(callback), + icon); }; - _menu = base::make_unique_q(nullptr); + _menu = base::make_unique_q( + nullptr, + st::popupMenuWithIcons); add( tr::lng_photo_editor_menu_delete, kDeleteSequence, - [=] { actionDelete(); }); + [=] { actionDelete(); }, + &st::menuIconDelete); add( tr::lng_photo_editor_menu_flip, kFlipSequence, - [=] { actionFlip(); }); + [=] { actionFlip(); }, + &st::menuIconFlip); add( tr::lng_photo_editor_menu_duplicate, kDuplicateSequence, - [=] { actionDuplicate(); }); + [=] { actionDuplicate(); }, + &st::menuIconCopy); _menu->popup(event->screenPos()); } diff --git a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp index b2f690d1f..d53b4f5f3 100644 --- a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp +++ b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp @@ -553,7 +553,7 @@ bool AddRescheduleAction( box->closeBox(); } }, box->lifetime()); - }, &st::menuIconSchedule); + }, &st::menuIconReschedule); return true; } diff --git a/Telegram/SourceFiles/history/view/history_view_schedule_box.cpp b/Telegram/SourceFiles/history/view/history_view_schedule_box.cpp index 9c510efda..30a328de0 100644 --- a/Telegram/SourceFiles/history/view/history_view_schedule_box.cpp +++ b/Telegram/SourceFiles/history/view/history_view_schedule_box.cpp @@ -42,7 +42,7 @@ void FillSendUntilOnlineMenu( (*menu)->addAction( tr::lng_scheduled_send_until_online(tr::now), std::move(callback), - &st::menuIconSend); + &st::menuIconWhenOnline); (*menu)->popup(QCursor::pos()); return true; }); diff --git a/Telegram/SourceFiles/media/view/media_view.style b/Telegram/SourceFiles/media/view/media_view.style index 9409e3cf9..672903080 100644 --- a/Telegram/SourceFiles/media/view/media_view.style +++ b/Telegram/SourceFiles/media/view/media_view.style @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL using "ui/basic.style"; using "ui/widgets/widgets.style"; +using "ui/menu_icons.style"; mediaviewOverDuration: 150; @@ -137,7 +138,7 @@ mediaviewFileIconSize: 80px; mediaviewFileLink: defaultLinkButton; -mediaviewMenu: Menu(defaultMenu) { +mediaviewMenu: Menu(menuWithIcons) { itemBg: mediaviewMenuBg; itemBgOver: mediaviewMenuBgOver; itemFg: mediaviewMenuFg; diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 8c1fb901d..21fb4d690 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -63,6 +63,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/random.h" #include "base/unixtime.h" #include "base/qt_signal_producer.h" +#include "base/qt_adapters.h" #include "base/event_filter.h" #include "main/main_account.h" #include "main/main_domain.h" // Domain::activeSessionValue. @@ -75,7 +76,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "facades.h" #include "styles/style_media_view.h" #include "styles/style_chat.h" -#include "base/qt_adapters.h" +#include "styles/style_menu_icons.h" #ifdef Q_OS_MAC #include "platform/mac/touchbar/mac_touchbar_media_view.h" @@ -901,30 +902,46 @@ void OverlayWidget::refreshCaptionGeometry() { void OverlayWidget::fillContextMenuActions(const MenuCallback &addAction) { if (_document && _document->loading()) { - addAction(tr::lng_cancel(tr::now), [=] { saveCancel(); }); + addAction( + tr::lng_cancel(tr::now), + [=] { saveCancel(); }, + &st::mediaMenuIconCancel); } if (_message && _message->isRegular()) { - addAction(tr::lng_context_to_msg(tr::now), [=] { toMessage(); }); + addAction( + tr::lng_context_to_msg(tr::now), + [=] { toMessage(); }, + &st::mediaMenuIconShowInChat); } if (_document && !_document->filepath(true).isEmpty()) { const auto text = Platform::IsMac() ? tr::lng_context_show_in_finder(tr::now) : tr::lng_context_show_in_folder(tr::now); - addAction(text, [=] { showInFolder(); }); + addAction( + text, + [=] { showInFolder(); }, + &st::mediaMenuIconShowInFolder); } if (!hasCopyRestriction()) { if ((_document && documentContentShown()) || (_photo && _photoMedia->loaded())) { - addAction(tr::lng_mediaview_copy(tr::now), [=] { copyMedia(); }); + addAction( + tr::lng_mediaview_copy(tr::now), + [=] { copyMedia(); }, + &st::mediaMenuIconCopy); } } if ((_photo && _photo->hasAttachedStickers()) || (_document && _document->hasAttachedStickers())) { addAction( tr::lng_context_attached_stickers(tr::now), - [=] { showAttachedStickers(); }); + [=] { showAttachedStickers(); }, + &st::mediaMenuIconStickers); } if (_message && _message->allowsForward()) { - addAction(tr::lng_mediaview_forward(tr::now), [=] { forwardMedia(); }); + addAction( + tr::lng_mediaview_forward(tr::now), + [=] { forwardMedia(); }, + &st::mediaMenuIconForward); } const auto canDelete = [&] { if (_message && _message->canDelete()) { @@ -944,17 +961,26 @@ void OverlayWidget::fillContextMenuActions(const MenuCallback &addAction) { return false; }(); if (canDelete) { - addAction(tr::lng_mediaview_delete(tr::now), [=] { deleteMedia(); }); + addAction( + tr::lng_mediaview_delete(tr::now), + [=] { deleteMedia(); }, + &st::mediaMenuIconDelete); } if (!hasCopyRestriction()) { - addAction(tr::lng_mediaview_save_as(tr::now), [=] { saveAs(); }); + addAction( + tr::lng_mediaview_save_as(tr::now), + [=] { saveAs(); }, + &st::mediaMenuIconDownload); } if (const auto overviewType = computeOverviewType()) { const auto text = _document ? tr::lng_mediaview_files_all(tr::now) : tr::lng_mediaview_photos_all(tr::now); - addAction(text, [=] { showMediaOverview(); }); + addAction( + text, + [=] { showMediaOverview(); }, + &st::mediaMenuIconShowAll); } } @@ -4419,8 +4445,11 @@ bool OverlayWidget::handleContextMenu(std::optional position) { _menu = base::make_unique_q( _widget, st::mediaviewPopupMenu); - fillContextMenuActions([&] (const QString &text, Fn handler) { - _menu->addAction(text, std::move(handler)); + fillContextMenuActions([&]( + const QString &text, + Fn handler, + const style::icon *icon) { + _menu->addAction(text, std::move(handler), icon); }); _menu->setDestroyedCallback(crl::guard(_widget, [=] { activateControls(); @@ -4666,8 +4695,11 @@ void OverlayWidget::receiveMouse() { void OverlayWidget::showDropdown() { _dropdown->clearActions(); - fillContextMenuActions([&] (const QString &text, Fn handler) { - _dropdown->addAction(text, std::move(handler)); + fillContextMenuActions([&]( + const QString &text, + Fn handler, + const style::icon *icon) { + _dropdown->addAction(text, std::move(handler), icon); }); _dropdown->moveToRight(0, height() - _dropdown->height()); _dropdown->showAnimated(Ui::PanelAnimation::Origin::BottomRight); diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h index d6d779ebc..40f6edbb6 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h @@ -274,7 +274,10 @@ private: void updateControls(); void updateControlsGeometry(); - using MenuCallback = Fn)>; + using MenuCallback = Fn, + const style::icon *)>; void fillContextMenuActions(const MenuCallback &addAction); void resizeCenteredControls(); diff --git a/Telegram/SourceFiles/ui/chat/chat.style b/Telegram/SourceFiles/ui/chat/chat.style index 320acaaec..0ad691378 100644 --- a/Telegram/SourceFiles/ui/chat/chat.style +++ b/Telegram/SourceFiles/ui/chat/chat.style @@ -905,22 +905,22 @@ defaultWhoRead: WhoRead { photoSize: 30px; photoSkip: 5px; nameLeft: 57px; - iconPosition: point(22px, 11px); - itemPadding: margins(61px, 9px, 17px, 7px); + iconPosition: point(10px, 7px); + itemPadding: margins(41px, 9px, 17px, 7px); } whoReadMenu: PopupMenu(popupMenuWithIcons) { scrollPadding: margins(0px, 6px, 0px, 6px); maxHeight: 387px; menu: Menu(menuWithIcons) { - separatorPadding: margins(0px, 6px, 0px, 8px); + separatorPadding: margins(0px, 6px, 0px, 5px); } } -whoReadChecks: icon{{ "chat/seen_checks", windowFg }}; -whoReadChecksOver: icon{{ "chat/seen_checks", windowFgOver }}; -whoReadChecksDisabled: icon{{ "chat/seen_checks", menuFgDisabled }}; -whoReadPlayed: icon{{ "chat/seen_played", windowFg }}; -whoReadPlayedOver: icon{{ "chat/seen_played", windowFgOver }}; -whoReadPlayedDisabled: icon {{ "chat/seen_played", menuFgDisabled }}; +whoReadChecks: icon{{ "menu/read_ticks", menuSubmenuArrowFg }}; +whoReadChecksOver: icon{{ "menu/read_ticks", menuSubmenuArrowFg }}; +whoReadChecksDisabled: icon{{ "menu/read_ticks", menuFgDisabled }}; +whoReadPlayed: icon{{ "menu/read_audio", menuSubmenuArrowFg }}; +whoReadPlayedOver: icon{{ "menu/read_audio", menuSubmenuArrowFg }}; +whoReadPlayedDisabled: icon {{ "menu/read_audio", menuFgDisabled }}; historyRequestsUserpics: GroupCallUserpics { size: 22px; diff --git a/Telegram/SourceFiles/ui/menu_icons.style b/Telegram/SourceFiles/ui/menu_icons.style index 6e34d9617..3a9e81552 100644 --- a/Telegram/SourceFiles/ui/menu_icons.style +++ b/Telegram/SourceFiles/ui/menu_icons.style @@ -9,8 +9,8 @@ using "ui/colors.palette"; using "ui/widgets/widgets.style"; menuWithIcons: Menu(defaultMenu) { - itemIconPosition: point(20px, 7px); - itemPadding: margins(61px, 9px, 17px, 9px); + itemIconPosition: point(15px, 5px); + itemPadding: margins(56px, 8px, 17px, 8px); } popupMenuWithIcons: PopupMenu(defaultPopupMenu) { scrollPadding: margins(0px, 5px, 0px, 5px); @@ -76,6 +76,23 @@ menuIconFromMainMenu: icon {{ "menu/move_from_menu", menuSubmenuArrowFg }}; menuIconAddAccount: icon {{ "menu/add_account", menuSubmenuArrowFg }}; menuIconMute: icon {{ "menu/mute", menuSubmenuArrowFg }}; menuIconUnmute: icon {{ "menu/unmute", menuSubmenuArrowFg }}; -menuIconSchedule: icon {{ "menu/reschedule", menuSubmenuArrowFg }}; +menuIconSchedule: icon {{ "menu/calendar", menuSubmenuArrowFg }}; +menuIconReschedule: icon {{ "menu/reschedule", menuSubmenuArrowFg }}; menuIconSend: icon {{ "menu/send", menuSubmenuArrowFg }}; -//menuIcon: icon {{ "menu/", menuSubmenuArrowFg }}; +menuIconFlip: icon {{ "menu/flip", menuSubmenuArrowFg }}; +menuIconWhenOnline: icon {{ "menu/send_when_online", menuSubmenuArrowFg }}; +menuIconPalette: icon {{ "menu/palette", menuSubmenuArrowFg }}; +menuIconImportTheme: icon {{ "menu/import_theme", menuSubmenuArrowFg }}; +menuIconExportTheme: icon {{ "menu/export_theme", menuSubmenuArrowFg }}; +menuIconRestore: icon {{ "menu/restore", menuSubmenuArrowFg }}; +menuIconSettings: icon {{ "menu/settings", menuSubmenuArrowFg }}; + +mediaMenuIconStickers: icon {{ "menu/stickers", mediaviewMenuFg }}; +mediaMenuIconCancel: icon {{ "menu/cancel", mediaviewMenuFg }}; +mediaMenuIconShowInChat: icon {{ "menu/show_in_chat", mediaviewMenuFg }}; +mediaMenuIconShowInFolder: icon {{ "menu/show_in_folder", mediaviewMenuFg }}; +mediaMenuIconDownload: icon {{ "menu/download", mediaviewMenuFg }}; +mediaMenuIconCopy: icon {{ "menu/copy", mediaviewMenuFg }}; +mediaMenuIconForward: icon {{ "menu/forward", mediaviewMenuFg }}; +mediaMenuIconDelete: icon {{ "menu/delete", mediaviewMenuFg }}; +mediaMenuIconShowAll: icon {{ "menu/all_media", mediaviewMenuFg }}; diff --git a/Telegram/SourceFiles/window/themes/window_theme_editor.cpp b/Telegram/SourceFiles/window/themes/window_theme_editor.cpp index 4531035a6..a200022a1 100644 --- a/Telegram/SourceFiles/window/themes/window_theme_editor.cpp +++ b/Telegram/SourceFiles/window/themes/window_theme_editor.cpp @@ -37,6 +37,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_dialogs.h" #include "styles/style_layers.h" #include "styles/style_boxes.h" +#include "styles/style_menu_icons.h" namespace Window { namespace Theme { @@ -703,7 +704,9 @@ void Editor::showMenu() { if (_menu) { return; } - _menu = base::make_unique_q(this); + _menu = base::make_unique_q( + this, + st::dropdownMenuWithIcons); _menu->setHiddenCallback([weak = Ui::MakeWeak(this), menu = _menu.get()]{ menu->deleteLater(); if (weak && weak->_menu == menu) { @@ -727,15 +730,15 @@ void Editor::showMenu() { base::call_delayed(st::defaultRippleAnimation.hideDuration, this, [=] { exportTheme(); }); - }); + }, &st::menuIconExportTheme); _menu->addAction(tr::lng_theme_editor_menu_import(tr::now), [=] { base::call_delayed(st::defaultRippleAnimation.hideDuration, this, [=] { importTheme(); }); - }); + }, &st::menuIconImportTheme); _menu->addAction(tr::lng_theme_editor_menu_show(tr::now), [=] { File::ShowInFolder(EditingPalettePath()); - }); + }, &st::menuIconPalette); _menu->moveToRight(st::themesMenuPosition.x(), st::themesMenuPosition.y()); _menu->showAnimated(Ui::PanelAnimation::Origin::TopRight); } diff --git a/Telegram/SourceFiles/window/window_main_menu.cpp b/Telegram/SourceFiles/window/window_main_menu.cpp index 16c6d4356..457889ffc 100644 --- a/Telegram/SourceFiles/window/window_main_menu.cpp +++ b/Telegram/SourceFiles/window/window_main_menu.cpp @@ -113,7 +113,9 @@ void ShowCallsBox(not_null window) { const auto menu = std::make_shared(); const auto menuButton = box->addTopButton(st::infoTopBarMenu); menuButton->setClickedCallback([=] { - *menu = base::make_unique_q(menuButton); + *menu = base::make_unique_q( + menuButton, + st::popupMenuWithIcons); const auto showSettings = [=] { window->showSettings( Settings::Type::Calls, @@ -124,11 +126,13 @@ void ShowCallsBox(not_null window) { }); (*menu)->addAction( tr::lng_settings_section_call_settings(tr::now), - showSettings); + showSettings, + &st::menuIconSettings); if (controller->delegate()->peerListFullRowsCount() > 0) { (*menu)->addAction( tr::lng_call_box_clear_all(tr::now), - clearAll); + clearAll, + &st::menuIconDelete); } (*menu)->popup(QCursor::pos()); return true; diff --git a/Telegram/SourceFiles/window/window_peer_menu.cpp b/Telegram/SourceFiles/window/window_peer_menu.cpp index 6543a214c..e5985d149 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.cpp +++ b/Telegram/SourceFiles/window/window_peer_menu.cpp @@ -346,7 +346,7 @@ void Filler::addTogglePin() { pinToggle, (history->isPinnedDialog(filterId) ? &st::menuIconUnpin - : &st::menuIconPin)); // #TODO icons dynamic + : &st::menuIconPin)); auto actionText = history->session().changes().historyUpdates( history, @@ -395,7 +395,7 @@ void Filler::addToggleUnreadMark() { } }, (IsUnreadHistory(history) ? &st::menuIconMarkRead - : &st::menuIconMarkUnread)); // #TODO icons dynamic + : &st::menuIconMarkUnread)); auto actionText = history->session().changes().historyUpdates( history, @@ -420,7 +420,7 @@ void Filler::addToggleArchive() { }; const auto archiveAction = _addAction( label(), - toggle, // #TODO icons dynamic + toggle, isArchived() ? &st::menuIconUnarchive : &st::menuIconArchive); auto actionText = history->session().changes().historyUpdates( @@ -453,7 +453,7 @@ void Filler::addBlockUser(not_null user) { user, v::null, v::null)); - } // #TODO icons dynamic + } }, (!user->isBlocked() ? &st::menuIconBlock : user->isBot() @@ -1255,7 +1255,7 @@ void PeerMenuAddMuteAction( } }, (peer->owner().notifyIsMuted(peer) ? &st::menuIconUnmute - : &st::menuIconMute)); // #TODO icons dynamic + : &st::menuIconMute)); auto actionText = Info::Profile::NotificationsEnabledValue( peer From bfdbb6429579c121ef4f095bdfd8ed7b35ec1e18 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 13 Dec 2021 14:16:40 +0400 Subject: [PATCH 061/173] Move some Settings icons to a subfolder. --- .../{ => settings}/settings_advanced.png | Bin .../{ => settings}/settings_advanced@2x.png | Bin .../{ => settings}/settings_advanced@3x.png | Bin .../icons/{ => settings}/settings_chat.png | Bin .../icons/{ => settings}/settings_chat@2x.png | Bin .../icons/{ => settings}/settings_chat@3x.png | Bin .../icons/{ => settings}/settings_edit.png | Bin .../icons/{ => settings}/settings_edit@2x.png | Bin .../icons/{ => settings}/settings_edit@3x.png | Bin .../{ => settings}/settings_edit_name.png | Bin .../{ => settings}/settings_edit_name@2x.png | Bin .../{ => settings}/settings_edit_name@3x.png | Bin .../icons/{ => settings}/settings_emoji.png | Bin .../{ => settings}/settings_emoji@2x.png | Bin .../{ => settings}/settings_emoji@3x.png | Bin .../icons/{ => settings}/settings_faq.png | Bin .../icons/{ => settings}/settings_faq@2x.png | Bin .../icons/{ => settings}/settings_faq@3x.png | Bin .../icons/{ => settings}/settings_folders.png | Bin .../{ => settings}/settings_folders@2x.png | Bin .../{ => settings}/settings_folders@3x.png | Bin .../{ => settings}/settings_information.png | Bin .../settings_information@2x.png | Bin .../settings_information@3x.png | Bin .../settings_interface_scale.png | Bin .../settings_interface_scale@2x.png | Bin .../settings_interface_scale@3x.png | Bin .../{ => settings}/settings_language.png | Bin .../{ => settings}/settings_language@2x.png | Bin .../{ => settings}/settings_language@3x.png | Bin .../icons/{ => settings}/settings_name.png | Bin .../icons/{ => settings}/settings_name@2x.png | Bin .../icons/{ => settings}/settings_name@3x.png | Bin .../{ => settings}/settings_notifications.png | Bin .../settings_notifications@2x.png | Bin .../settings_notifications@3x.png | Bin .../{ => settings}/settings_phone_number.png | Bin .../settings_phone_number@2x.png | Bin .../settings_phone_number@3x.png | Bin .../settings_privacy_security.png | Bin .../settings_privacy_security@2x.png | Bin .../settings_privacy_security@3x.png | Bin .../{ => settings}/settings_stickers.png | Bin .../{ => settings}/settings_stickers@2x.png | Bin .../{ => settings}/settings_stickers@3x.png | Bin .../icons/{ => settings}/settings_themes.png | Bin .../{ => settings}/settings_themes@2x.png | Bin .../{ => settings}/settings_themes@3x.png | Bin .../{ => settings}/settings_username.png | Bin .../{ => settings}/settings_username@2x.png | Bin .../{ => settings}/settings_username@3x.png | Bin Telegram/SourceFiles/boxes/boxes.style | 8 ++--- Telegram/SourceFiles/editor/editor.style | 6 ++-- Telegram/SourceFiles/info/info.style | 4 +-- Telegram/SourceFiles/settings/settings.style | 32 +++++++++--------- Telegram/SourceFiles/window/window.style | 8 ++--- 56 files changed, 29 insertions(+), 29 deletions(-) rename Telegram/Resources/icons/{ => settings}/settings_advanced.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_advanced@2x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_advanced@3x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_chat.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_chat@2x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_chat@3x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_edit.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_edit@2x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_edit@3x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_edit_name.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_edit_name@2x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_edit_name@3x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_emoji.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_emoji@2x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_emoji@3x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_faq.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_faq@2x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_faq@3x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_folders.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_folders@2x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_folders@3x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_information.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_information@2x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_information@3x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_interface_scale.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_interface_scale@2x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_interface_scale@3x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_language.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_language@2x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_language@3x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_name.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_name@2x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_name@3x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_notifications.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_notifications@2x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_notifications@3x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_phone_number.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_phone_number@2x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_phone_number@3x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_privacy_security.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_privacy_security@2x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_privacy_security@3x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_stickers.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_stickers@2x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_stickers@3x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_themes.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_themes@2x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_themes@3x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_username.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_username@2x.png (100%) rename Telegram/Resources/icons/{ => settings}/settings_username@3x.png (100%) diff --git a/Telegram/Resources/icons/settings_advanced.png b/Telegram/Resources/icons/settings/settings_advanced.png similarity index 100% rename from Telegram/Resources/icons/settings_advanced.png rename to Telegram/Resources/icons/settings/settings_advanced.png diff --git a/Telegram/Resources/icons/settings_advanced@2x.png b/Telegram/Resources/icons/settings/settings_advanced@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_advanced@2x.png rename to Telegram/Resources/icons/settings/settings_advanced@2x.png diff --git a/Telegram/Resources/icons/settings_advanced@3x.png b/Telegram/Resources/icons/settings/settings_advanced@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_advanced@3x.png rename to Telegram/Resources/icons/settings/settings_advanced@3x.png diff --git a/Telegram/Resources/icons/settings_chat.png b/Telegram/Resources/icons/settings/settings_chat.png similarity index 100% rename from Telegram/Resources/icons/settings_chat.png rename to Telegram/Resources/icons/settings/settings_chat.png diff --git a/Telegram/Resources/icons/settings_chat@2x.png b/Telegram/Resources/icons/settings/settings_chat@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_chat@2x.png rename to Telegram/Resources/icons/settings/settings_chat@2x.png diff --git a/Telegram/Resources/icons/settings_chat@3x.png b/Telegram/Resources/icons/settings/settings_chat@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_chat@3x.png rename to Telegram/Resources/icons/settings/settings_chat@3x.png diff --git a/Telegram/Resources/icons/settings_edit.png b/Telegram/Resources/icons/settings/settings_edit.png similarity index 100% rename from Telegram/Resources/icons/settings_edit.png rename to Telegram/Resources/icons/settings/settings_edit.png diff --git a/Telegram/Resources/icons/settings_edit@2x.png b/Telegram/Resources/icons/settings/settings_edit@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_edit@2x.png rename to Telegram/Resources/icons/settings/settings_edit@2x.png diff --git a/Telegram/Resources/icons/settings_edit@3x.png b/Telegram/Resources/icons/settings/settings_edit@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_edit@3x.png rename to Telegram/Resources/icons/settings/settings_edit@3x.png diff --git a/Telegram/Resources/icons/settings_edit_name.png b/Telegram/Resources/icons/settings/settings_edit_name.png similarity index 100% rename from Telegram/Resources/icons/settings_edit_name.png rename to Telegram/Resources/icons/settings/settings_edit_name.png diff --git a/Telegram/Resources/icons/settings_edit_name@2x.png b/Telegram/Resources/icons/settings/settings_edit_name@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_edit_name@2x.png rename to Telegram/Resources/icons/settings/settings_edit_name@2x.png diff --git a/Telegram/Resources/icons/settings_edit_name@3x.png b/Telegram/Resources/icons/settings/settings_edit_name@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_edit_name@3x.png rename to Telegram/Resources/icons/settings/settings_edit_name@3x.png diff --git a/Telegram/Resources/icons/settings_emoji.png b/Telegram/Resources/icons/settings/settings_emoji.png similarity index 100% rename from Telegram/Resources/icons/settings_emoji.png rename to Telegram/Resources/icons/settings/settings_emoji.png diff --git a/Telegram/Resources/icons/settings_emoji@2x.png b/Telegram/Resources/icons/settings/settings_emoji@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_emoji@2x.png rename to Telegram/Resources/icons/settings/settings_emoji@2x.png diff --git a/Telegram/Resources/icons/settings_emoji@3x.png b/Telegram/Resources/icons/settings/settings_emoji@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_emoji@3x.png rename to Telegram/Resources/icons/settings/settings_emoji@3x.png diff --git a/Telegram/Resources/icons/settings_faq.png b/Telegram/Resources/icons/settings/settings_faq.png similarity index 100% rename from Telegram/Resources/icons/settings_faq.png rename to Telegram/Resources/icons/settings/settings_faq.png diff --git a/Telegram/Resources/icons/settings_faq@2x.png b/Telegram/Resources/icons/settings/settings_faq@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_faq@2x.png rename to Telegram/Resources/icons/settings/settings_faq@2x.png diff --git a/Telegram/Resources/icons/settings_faq@3x.png b/Telegram/Resources/icons/settings/settings_faq@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_faq@3x.png rename to Telegram/Resources/icons/settings/settings_faq@3x.png diff --git a/Telegram/Resources/icons/settings_folders.png b/Telegram/Resources/icons/settings/settings_folders.png similarity index 100% rename from Telegram/Resources/icons/settings_folders.png rename to Telegram/Resources/icons/settings/settings_folders.png diff --git a/Telegram/Resources/icons/settings_folders@2x.png b/Telegram/Resources/icons/settings/settings_folders@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_folders@2x.png rename to Telegram/Resources/icons/settings/settings_folders@2x.png diff --git a/Telegram/Resources/icons/settings_folders@3x.png b/Telegram/Resources/icons/settings/settings_folders@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_folders@3x.png rename to Telegram/Resources/icons/settings/settings_folders@3x.png diff --git a/Telegram/Resources/icons/settings_information.png b/Telegram/Resources/icons/settings/settings_information.png similarity index 100% rename from Telegram/Resources/icons/settings_information.png rename to Telegram/Resources/icons/settings/settings_information.png diff --git a/Telegram/Resources/icons/settings_information@2x.png b/Telegram/Resources/icons/settings/settings_information@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_information@2x.png rename to Telegram/Resources/icons/settings/settings_information@2x.png diff --git a/Telegram/Resources/icons/settings_information@3x.png b/Telegram/Resources/icons/settings/settings_information@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_information@3x.png rename to Telegram/Resources/icons/settings/settings_information@3x.png diff --git a/Telegram/Resources/icons/settings_interface_scale.png b/Telegram/Resources/icons/settings/settings_interface_scale.png similarity index 100% rename from Telegram/Resources/icons/settings_interface_scale.png rename to Telegram/Resources/icons/settings/settings_interface_scale.png diff --git a/Telegram/Resources/icons/settings_interface_scale@2x.png b/Telegram/Resources/icons/settings/settings_interface_scale@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_interface_scale@2x.png rename to Telegram/Resources/icons/settings/settings_interface_scale@2x.png diff --git a/Telegram/Resources/icons/settings_interface_scale@3x.png b/Telegram/Resources/icons/settings/settings_interface_scale@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_interface_scale@3x.png rename to Telegram/Resources/icons/settings/settings_interface_scale@3x.png diff --git a/Telegram/Resources/icons/settings_language.png b/Telegram/Resources/icons/settings/settings_language.png similarity index 100% rename from Telegram/Resources/icons/settings_language.png rename to Telegram/Resources/icons/settings/settings_language.png diff --git a/Telegram/Resources/icons/settings_language@2x.png b/Telegram/Resources/icons/settings/settings_language@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_language@2x.png rename to Telegram/Resources/icons/settings/settings_language@2x.png diff --git a/Telegram/Resources/icons/settings_language@3x.png b/Telegram/Resources/icons/settings/settings_language@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_language@3x.png rename to Telegram/Resources/icons/settings/settings_language@3x.png diff --git a/Telegram/Resources/icons/settings_name.png b/Telegram/Resources/icons/settings/settings_name.png similarity index 100% rename from Telegram/Resources/icons/settings_name.png rename to Telegram/Resources/icons/settings/settings_name.png diff --git a/Telegram/Resources/icons/settings_name@2x.png b/Telegram/Resources/icons/settings/settings_name@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_name@2x.png rename to Telegram/Resources/icons/settings/settings_name@2x.png diff --git a/Telegram/Resources/icons/settings_name@3x.png b/Telegram/Resources/icons/settings/settings_name@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_name@3x.png rename to Telegram/Resources/icons/settings/settings_name@3x.png diff --git a/Telegram/Resources/icons/settings_notifications.png b/Telegram/Resources/icons/settings/settings_notifications.png similarity index 100% rename from Telegram/Resources/icons/settings_notifications.png rename to Telegram/Resources/icons/settings/settings_notifications.png diff --git a/Telegram/Resources/icons/settings_notifications@2x.png b/Telegram/Resources/icons/settings/settings_notifications@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_notifications@2x.png rename to Telegram/Resources/icons/settings/settings_notifications@2x.png diff --git a/Telegram/Resources/icons/settings_notifications@3x.png b/Telegram/Resources/icons/settings/settings_notifications@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_notifications@3x.png rename to Telegram/Resources/icons/settings/settings_notifications@3x.png diff --git a/Telegram/Resources/icons/settings_phone_number.png b/Telegram/Resources/icons/settings/settings_phone_number.png similarity index 100% rename from Telegram/Resources/icons/settings_phone_number.png rename to Telegram/Resources/icons/settings/settings_phone_number.png diff --git a/Telegram/Resources/icons/settings_phone_number@2x.png b/Telegram/Resources/icons/settings/settings_phone_number@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_phone_number@2x.png rename to Telegram/Resources/icons/settings/settings_phone_number@2x.png diff --git a/Telegram/Resources/icons/settings_phone_number@3x.png b/Telegram/Resources/icons/settings/settings_phone_number@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_phone_number@3x.png rename to Telegram/Resources/icons/settings/settings_phone_number@3x.png diff --git a/Telegram/Resources/icons/settings_privacy_security.png b/Telegram/Resources/icons/settings/settings_privacy_security.png similarity index 100% rename from Telegram/Resources/icons/settings_privacy_security.png rename to Telegram/Resources/icons/settings/settings_privacy_security.png diff --git a/Telegram/Resources/icons/settings_privacy_security@2x.png b/Telegram/Resources/icons/settings/settings_privacy_security@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_privacy_security@2x.png rename to Telegram/Resources/icons/settings/settings_privacy_security@2x.png diff --git a/Telegram/Resources/icons/settings_privacy_security@3x.png b/Telegram/Resources/icons/settings/settings_privacy_security@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_privacy_security@3x.png rename to Telegram/Resources/icons/settings/settings_privacy_security@3x.png diff --git a/Telegram/Resources/icons/settings_stickers.png b/Telegram/Resources/icons/settings/settings_stickers.png similarity index 100% rename from Telegram/Resources/icons/settings_stickers.png rename to Telegram/Resources/icons/settings/settings_stickers.png diff --git a/Telegram/Resources/icons/settings_stickers@2x.png b/Telegram/Resources/icons/settings/settings_stickers@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_stickers@2x.png rename to Telegram/Resources/icons/settings/settings_stickers@2x.png diff --git a/Telegram/Resources/icons/settings_stickers@3x.png b/Telegram/Resources/icons/settings/settings_stickers@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_stickers@3x.png rename to Telegram/Resources/icons/settings/settings_stickers@3x.png diff --git a/Telegram/Resources/icons/settings_themes.png b/Telegram/Resources/icons/settings/settings_themes.png similarity index 100% rename from Telegram/Resources/icons/settings_themes.png rename to Telegram/Resources/icons/settings/settings_themes.png diff --git a/Telegram/Resources/icons/settings_themes@2x.png b/Telegram/Resources/icons/settings/settings_themes@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_themes@2x.png rename to Telegram/Resources/icons/settings/settings_themes@2x.png diff --git a/Telegram/Resources/icons/settings_themes@3x.png b/Telegram/Resources/icons/settings/settings_themes@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_themes@3x.png rename to Telegram/Resources/icons/settings/settings_themes@3x.png diff --git a/Telegram/Resources/icons/settings_username.png b/Telegram/Resources/icons/settings/settings_username.png similarity index 100% rename from Telegram/Resources/icons/settings_username.png rename to Telegram/Resources/icons/settings/settings_username.png diff --git a/Telegram/Resources/icons/settings_username@2x.png b/Telegram/Resources/icons/settings/settings_username@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_username@2x.png rename to Telegram/Resources/icons/settings/settings_username@2x.png diff --git a/Telegram/Resources/icons/settings_username@3x.png b/Telegram/Resources/icons/settings/settings_username@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_username@3x.png rename to Telegram/Resources/icons/settings/settings_username@3x.png diff --git a/Telegram/SourceFiles/boxes/boxes.style b/Telegram/SourceFiles/boxes/boxes.style index a38dcdae0..55c5e4975 100644 --- a/Telegram/SourceFiles/boxes/boxes.style +++ b/Telegram/SourceFiles/boxes/boxes.style @@ -135,8 +135,8 @@ editBioCountdownLabel: FlatLabel(defaultFlatLabel) { textFg: windowSubTextFg; } -contactUserIcon: icon {{ "settings_name", menuIconFg }}; -contactPhoneIcon: icon {{ "settings_phone_number", menuIconFg }}; +contactUserIcon: icon {{ "settings/settings_name", menuIconFg }}; +contactPhoneIcon: icon {{ "settings/settings_phone_number", menuIconFg }}; contactIconPosition: point(-5px, 23px); contactPadding: margins(49px, 2px, 0px, 12px); @@ -667,8 +667,8 @@ proxyRowEdit: IconButton(defaultIconButton) { width: 40px; height: 40px; - icon: icon {{ "settings_edit_name", menuIconFg }}; - iconOver: icon {{ "settings_edit_name", menuIconFgOver }}; + icon: icon {{ "settings/settings_edit_name", menuIconFg }}; + iconOver: icon {{ "settings/settings_edit_name", menuIconFgOver }}; iconPosition: point(12px, 13px); rippleAreaSize: 40px; diff --git a/Telegram/SourceFiles/editor/editor.style b/Telegram/SourceFiles/editor/editor.style index 262ffa356..9190b9a29 100644 --- a/Telegram/SourceFiles/editor/editor.style +++ b/Telegram/SourceFiles/editor/editor.style @@ -72,10 +72,10 @@ photoEditorRedoButton: IconButton(photoEditorRotateButton) { } photoEditorStickersButton: IconButton(photoEditorRotateButton) { - icon: icon {{ "settings_stickers", photoEditorButtonIconFg }}; - iconOver: icon {{ "settings_stickers", photoEditorButtonIconFgOver }}; + icon: icon {{ "settings/settings_stickers", photoEditorButtonIconFg }}; + iconOver: icon {{ "settings/settings_stickers", photoEditorButtonIconFgOver }}; } -photoEditorStickersIconActive: icon {{ "settings_stickers", photoEditorButtonIconFgActive }}; +photoEditorStickersIconActive: icon {{ "settings/settings_stickers", photoEditorButtonIconFgActive }}; photoEditorUndoButtonInactive: icon {{ "photo_editor/undo", photoEditorButtonIconFgInactive }}; photoEditorRedoButtonInactive: icon {{ "photo_editor/undo-flip_horizontal", photoEditorButtonIconFgInactive }}; diff --git a/Telegram/SourceFiles/info/info.style b/Telegram/SourceFiles/info/info.style index 93269eba3..f3ebb58df 100644 --- a/Telegram/SourceFiles/info/info.style +++ b/Telegram/SourceFiles/info/info.style @@ -519,8 +519,8 @@ infoMembersCancelSearch: CrossButton { infoMembersSearchTop: 15px; infoChannelsAddChannel: IconButton(infoMembersButton) { - icon: icon {{ "settings_edit_name", menuIconFg, point(9px, 9px) }}; - iconOver: icon {{ "settings_edit_name", menuIconFgOver, point(9px, 9px) }}; + icon: icon {{ "settings/settings_edit_name", menuIconFg, point(9px, 9px) }}; + iconOver: icon {{ "settings/settings_edit_name", menuIconFgOver, point(9px, 9px) }}; } infoMembersCreatorIcon: icon {{ diff --git a/Telegram/SourceFiles/settings/settings.style b/Telegram/SourceFiles/settings/settings.style index 6dd224ce4..8ccbcb499 100644 --- a/Telegram/SourceFiles/settings/settings.style +++ b/Telegram/SourceFiles/settings/settings.style @@ -44,18 +44,18 @@ settingsUpdate: SettingsButton(infoMainButton, settingsButton) { settingsUpdateStatePosition: point(22px, 29px); settingsDividerLabelPadding: margins(22px, 10px, 22px, 19px); -settingsIconInformation: icon {{ "settings_information", menuIconFg }}; -settingsIconNotifications: icon {{ "settings_notifications", menuIconFg }}; -settingsIconChat: icon {{ "settings_chat", menuIconFg }}; -settingsIconFolders: icon {{ "settings_folders", menuIconFg }}; -settingsIconGeneral: icon {{ "settings_advanced", menuIconFg }}; -settingsIconPrivacySecurity: icon {{ "settings_privacy_security", menuIconFg }}; -settingsIconLanguage: icon {{ "settings_language", menuIconFg }}; -settingsIconInterfaceScale: icon {{ "settings_interface_scale", menuIconFg }}; -settingsIconFaq: icon {{ "settings_faq", menuIconFg }}; -settingsIconStickers: icon {{ "settings_stickers", menuIconFg }}; -settingsIconEmoji: icon {{ "settings_emoji", menuIconFg }}; -settingsIconThemes: icon {{ "settings_themes", menuIconFg }}; +settingsIconInformation: icon {{ "settings/settings_information", menuIconFg }}; +settingsIconNotifications: icon {{ "settings/settings_notifications", menuIconFg }}; +settingsIconChat: icon {{ "settings/settings_chat", menuIconFg }}; +settingsIconFolders: icon {{ "settings/settings_folders", menuIconFg }}; +settingsIconGeneral: icon {{ "settings/settings_advanced", menuIconFg }}; +settingsIconPrivacySecurity: icon {{ "settings/settings_privacy_security", menuIconFg }}; +settingsIconLanguage: icon {{ "settings/settings_language", menuIconFg }}; +settingsIconInterfaceScale: icon {{ "settings/settings_interface_scale", menuIconFg }}; +settingsIconFaq: icon {{ "settings/settings_faq", menuIconFg }}; +settingsIconStickers: icon {{ "settings/settings_stickers", menuIconFg }}; +settingsIconEmoji: icon {{ "settings/settings_emoji", menuIconFg }}; +settingsIconThemes: icon {{ "settings/settings_themes", menuIconFg }}; settingsSetPhotoSkip: 7px; @@ -129,7 +129,7 @@ settingsInfoAbout: FlatLabel(settingsInfoValue) { settingsInfoAboutPosition: point(78px, 34px); settingsInfoRightSkip: 60px; settingsInfoEditRight: 14px; -settingsInfoEditIconOver: icon {{ "settings_edit", menuIconFgOver }}; +settingsInfoEditIconOver: icon {{ "settings/settings_edit", menuIconFgOver }}; settingsBio: InputField(defaultInputField) { textBg: transparent; textMargins: margins(0px, 7px, 0px, 13px); @@ -146,9 +146,9 @@ settingsBio: InputField(defaultInputField) { font: boxTextFont; } settingsInfoAfterSkip: 14px; -settingsInfoName: icon {{ "settings_name", menuIconFg }}; -settingsInfoPhone: icon {{ "settings_phone_number", menuIconFg }}; -settingsInfoUsername: icon {{ "settings_username", menuIconFg }}; +settingsInfoName: icon {{ "settings/settings_name", menuIconFg }}; +settingsInfoPhone: icon {{ "settings/settings_phone_number", menuIconFg }}; +settingsInfoUsername: icon {{ "settings/settings_username", menuIconFg }}; settingsBioMargins: margins(20px, 6px, 20px, 6px); settingsBioCountdown: FlatLabel(defaultFlatLabel) { diff --git a/Telegram/SourceFiles/window/window.style b/Telegram/SourceFiles/window/window.style index a9fb195c7..a6278553d 100644 --- a/Telegram/SourceFiles/window/window.style +++ b/Telegram/SourceFiles/window/window.style @@ -134,10 +134,10 @@ mainMenuNewGroup: icon {{ "menu_new_group", menuIconFg }}; mainMenuNewGroupOver: icon {{ "menu_new_group", menuIconFgOver }}; mainMenuNewChannel: icon {{ "menu_new_channel", menuIconFg }}; mainMenuNewChannelOver: icon {{ "menu_new_channel", menuIconFgOver }}; -mainMenuContacts: icon {{ "settings_name", menuIconFg }}; -mainMenuContactsOver: icon {{ "settings_name", menuIconFgOver }}; -mainMenuCalls: icon {{ "settings_phone_number", menuIconFg }}; -mainMenuCallsOver: icon {{ "settings_phone_number", menuIconFgOver }}; +mainMenuContacts: icon {{ "settings/settings_name", menuIconFg }}; +mainMenuContactsOver: icon {{ "settings/settings_name", menuIconFgOver }}; +mainMenuCalls: icon {{ "settings/settings_phone_number", menuIconFg }}; +mainMenuCallsOver: icon {{ "settings/settings_phone_number", menuIconFgOver }}; mainMenuSettings: icon {{ "menu_settings", menuIconFg }}; mainMenuSettingsOver: icon {{ "menu_settings", menuIconFgOver }}; mainMenuNightMode: icon {{ "menu_night_mode", menuIconFg }}; From 9c18f7b0e34ef7ea56a927922e59307497e19179 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 13 Dec 2021 15:26:19 +0400 Subject: [PATCH 062/173] Allow choosing allowed reactions in groups / channels. --- Telegram/CMakeLists.txt | 2 + Telegram/Resources/langs/lang.strings | 7 + .../boxes/peers/edit_peer_info_box.cpp | 49 +++- .../boxes/peers/edit_peer_reactions.cpp | 209 ++++++++++++++++++ .../boxes/peers/edit_peer_reactions.h | 27 +++ Telegram/SourceFiles/data/data_changes.h | 15 +- Telegram/SourceFiles/data/data_channel.cpp | 5 +- Telegram/SourceFiles/data/data_chat.cpp | 5 +- .../data/data_message_reactions.cpp | 12 +- .../SourceFiles/data/data_message_reactions.h | 2 + Telegram/SourceFiles/info/info.style | 6 + .../info/profile/info_profile_values.cpp | 30 +++ .../info/profile/info_profile_values.h | 6 + 13 files changed, 363 insertions(+), 12 deletions(-) create mode 100644 Telegram/SourceFiles/boxes/peers/edit_peer_reactions.cpp create mode 100644 Telegram/SourceFiles/boxes/peers/edit_peer_reactions.h diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index 5d367d577..21427c7c9 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -180,6 +180,8 @@ PRIVATE 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 + boxes/peers/edit_peer_reactions.h boxes/peers/edit_peer_requests_box.cpp boxes/peers/edit_peer_requests_box.h boxes/peers/edit_peer_type_box.cpp diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index e3da4ba3f..f5e1a0ad4 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -1005,9 +1005,16 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_manage_peer_removed_users" = "Removed users"; "lng_manage_peer_permissions" = "Permissions"; "lng_manage_peer_invite_links" = "Invite links"; +"lng_manage_peer_reactions" = "Reactions"; +"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_available" = "Available reactions"; + "lng_manage_peer_group_type" = "Group type"; "lng_manage_peer_channel_type" = "Channel type"; "lng_manage_peer_link_type" = "Link type"; diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp index 859504da4..922ead843 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp @@ -21,6 +21,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "boxes/peers/edit_peer_invite_links.h" #include "boxes/peers/edit_linked_chat_box.h" #include "boxes/peers/edit_peer_requests_box.h" +#include "boxes/peers/edit_peer_reactions.h" #include "boxes/stickers_box.h" #include "ui/boxes/single_choice_box.h" #include "chat_helpers/emoji_suggestions_widget.h" @@ -31,6 +32,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_peer.h" #include "data/data_session.h" #include "data/data_changes.h" +#include "data/data_message_reactions.h" #include "history/admin_log/history_admin_log_section.h" #include "info/profile/info_profile_values.h" #include "lang/lang_keys.h" @@ -288,7 +290,8 @@ private: object_ptr createManageGroupButtons(); object_ptr createStickersEdit(); - bool canEditInformation() const; + [[nodiscard]] bool canEditInformation() const; + [[nodiscard]] bool canEditReactions() const; void refreshHistoryVisibility(); void showEditPeerTypeBox( std::optional> error = {}); @@ -596,6 +599,17 @@ bool Controller::canEditInformation() const { return false; } +bool Controller::canEditReactions() const { + if (const auto channel = _peer->asChannel()) { + return channel->amCreator() + || (channel->adminRights() & ChatAdminRight::ChangeInfo); + } else if (const auto chat = _peer->asChat()) { + return chat->amCreator() + || (chat->adminRights() & ChatAdminRight::ChangeInfo); + } + return false; +} + void Controller::refreshHistoryVisibility() { if (!_controls.historyVisibilityWrap) { return; @@ -1017,6 +1031,39 @@ void Controller::fillManageSection() { }, wrap->lifetime()); } } + if (canEditReactions()) { + const auto session = &_peer->session(); + auto reactionsCount = Info::Profile::MigratedOrMeValue( + _peer + ) | rpl::map( + Info::Profile::AllowedReactionsCountValue + ) | rpl::flatten_latest(); + auto fullCount = Info::Profile::FullReactionsCountValue(session); + auto label = rpl::combine( + std::move(reactionsCount), + std::move(fullCount) + ) | rpl::map([=](int allowed, int total) { + return allowed + ? QString::number(allowed) + " / " + QString::number(total) + : tr::lng_manage_peer_reactions_off(tr::now); + }); + const auto done = [=](const std::vector &chosen) { + SaveAllowedReactions(_peer, chosen); + }; + AddButtonWithCount( + _controls.buttonsLayout, + tr::lng_manage_peer_reactions(), + std::move(label), + [=] { + _navigation->parentController()->show(Box( + EditAllowedReactionsBox, + !_peer->isBroadcast(), + session->data().reactions().list(), + session->data().reactions().list(_peer), + done)); + }, + st::infoIconReactions); + } if (canViewAdmins) { AddButtonWithCount( _controls.buttonsLayout, diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_reactions.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_reactions.cpp new file mode 100644 index 000000000..0df4cc658 --- /dev/null +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_reactions.cpp @@ -0,0 +1,209 @@ +/* +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 "boxes/peers/edit_peer_reactions.h" + +#include "data/data_message_reactions.h" +#include "data/data_document.h" +#include "data/data_document_media.h" +#include "data/data_peer.h" +#include "data/data_chat.h" +#include "data/data_channel.h" +#include "data/data_session.h" +#include "main/main_session.h" +#include "apiwrap.h" +#include "lang/lang_keys.h" +#include "ui/widgets/buttons.h" +#include "info/profile/info_profile_icon.h" +#include "settings/settings_common.h" +#include "styles/style_settings.h" +#include "styles/style_info.h" + +namespace { + +using Data::Reaction; + +void AddReactionIcon( + not_null button, + not_null document) { + struct State { + std::shared_ptr media; + QImage image; + }; + + const auto size = st::editPeerReactionsPreview; + const auto state = button->lifetime().make_state(State{ + .media = document->createMediaView(), + }); + const auto icon = Ui::CreateChild(button.get()); + icon->setAttribute(Qt::WA_TransparentForMouseEvents); + icon->resize(size, size); + button->sizeValue( + ) | rpl::start_with_next([=](QSize size) { + icon->moveToLeft( + st::settingsSectionIconLeft, + (size.height() - icon->height()) / 2, + size.width()); + }, icon->lifetime()); + + const auto setImage = [=](not_null image) { + state->image = Images::prepare( + image->original(), + size * style::DevicePixelRatio(), + size * style::DevicePixelRatio(), + Images::Option::Smooth | Images::Option::TransparentBackground, + size, + size); + icon->update(); + }; + if (const auto image = state->media->getStickerLarge()) { + setImage(image); + } else { + document->session().downloaderTaskFinished( + ) | rpl::map([=] { + return state->media->getStickerLarge(); + }) | rpl::filter([=](Image *image) { + return (image != nullptr); + }) | rpl::take( + 1 + ) | rpl::start_with_next([=](not_null image) { + setImage(image); + }, button->lifetime()); + } + + icon->paintRequest( + ) | rpl::start_with_next([=] { + Painter p(icon); + const auto width = icon->width(); + if (!state->image.isNull()) { + p.drawImage(0, 0, state->image); + } + }, icon->lifetime()); +} + +} // namespace + +void EditAllowedReactionsBox( + not_null box, + bool isGroup, + const std::vector &list, + const std::vector &selected, + Fn &)> callback) { + box->setTitle(tr::lng_manage_peer_reactions()); + + struct State { + base::flat_map> toggles; + rpl::variable anyToggled; + rpl::event_stream forceToggleAll; + }; + const auto state = box->lifetime().make_state(State{ + .anyToggled = !selected.empty(), + }); + + const auto collect = [=] { + auto result = std::vector(); + result.reserve(state->toggles.size()); + for (const auto &[emoji, button] : state->toggles) { + if (button->toggled()) { + result.push_back(emoji); + } + } + return result; + }; + + const auto container = box->verticalLayout(); + + const auto enabled = Settings::AddButton( + container, + tr::lng_manage_peer_reactions_enable(), + st::manageGroupButton.button); + Ui::CreateChild( + enabled.get(), + st::infoIconReactions, + st::manageGroupButton.iconPosition); + enabled->toggleOn(state->anyToggled.value()); + enabled->toggledChanges( + ) | rpl::filter([=](bool value) { + return (value != state->anyToggled.current()); + }) | rpl::start_to_stream(state->forceToggleAll, enabled->lifetime()); + + Settings::AddSkip(container); + Settings::AddDividerText( + container, + (isGroup + ? tr::lng_manage_peer_reactions_about + : tr::lng_manage_peer_reactions_about_channel)()); + + Settings::AddSkip(container); + Settings::AddSubsectionTitle( + container, + tr::lng_manage_peer_reactions_available()); + + const auto active = [&](const Data::Reaction &entry) { + return ranges::contains(selected, entry.emoji, &Reaction::emoji); + }; + const auto add = [&](const Data::Reaction &entry) { + const auto button = Settings::AddButton( + container, + rpl::single(entry.title), + st::manageGroupButton.button); + AddReactionIcon(button, entry.staticIcon); + state->toggles.emplace(entry.emoji, button); + button->toggleOn(rpl::single( + active(entry) + ) | rpl::then( + state->forceToggleAll.events() + )); + button->toggledChanges( + ) | rpl::start_with_next([=](bool toggled) { + if (toggled) { + state->anyToggled = true; + } else if (collect().empty()) { + state->anyToggled = false; + } + }, button->lifetime()); + }; + for (const auto &entry : list) { + add(entry); + } + + box->addButton(tr::lng_settings_save(), [=] { + const auto ids = collect(); + box->closeBox(); + callback(ids); + }); + box->addButton(tr::lng_cancel(), [=] { + box->closeBox(); + }); +} + +void SaveAllowedReactions( + not_null peer, + const std::vector &allowed) { + auto ids = allowed | ranges::views::transform([=](QString value) { + return MTP_string(value); + }) | ranges::to; + + peer->session().api().request(MTPmessages_SetChatAvailableReactions( + peer->input, + MTP_vector(ids) + )).done([=](const MTPUpdates &result) { + peer->session().api().applyUpdates(result); + if (const auto chat = peer->asChat()) { + chat->setAllowedReactions(allowed); + } else if (const auto channel = peer->asChannel()) { + channel->setAllowedReactions(allowed); + } else { + Unexpected("Invalid peer type in SaveAllowedReactions."); + } + }).fail([=](const MTP::Error &error) { + if (error.type() == qstr("REACTION_INVALID")) { + peer->updateFullForced(); + peer->owner().reactions().refresh(); + } + }).send(); +} diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_reactions.h b/Telegram/SourceFiles/boxes/peers/edit_peer_reactions.h new file mode 100644 index 000000000..917957b7f --- /dev/null +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_reactions.h @@ -0,0 +1,27 @@ +/* +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 "ui/layers/generic_box.h" + +class PeerData; + +namespace Data { +struct Reaction; +} // namespace Data + +void EditAllowedReactionsBox( + not_null box, + bool isGroup, + const std::vector &list, + const std::vector &selected, + Fn &)> callback); + +void SaveAllowedReactions( + not_null peer, + const std::vector &allowed); diff --git a/Telegram/SourceFiles/data/data_changes.h b/Telegram/SourceFiles/data/data_changes.h index 1b8b768f1..9b64579ad 100644 --- a/Telegram/SourceFiles/data/data_changes.h +++ b/Telegram/SourceFiles/data/data_changes.h @@ -86,17 +86,18 @@ struct PeerUpdate { BannedUsers = (1ULL << 25), Rights = (1ULL << 26), PendingRequests = (1ULL << 27), + Reactions = (1ULL << 28), // For channels - ChannelAmIn = (1ULL << 28), - StickersSet = (1ULL << 29), - ChannelLinkedChat = (1ULL << 30), - ChannelLocation = (1ULL << 31), - Slowmode = (1ULL << 32), - GroupCall = (1ULL << 33), + ChannelAmIn = (1ULL << 29), + StickersSet = (1ULL << 30), + ChannelLinkedChat = (1ULL << 31), + ChannelLocation = (1ULL << 32), + Slowmode = (1ULL << 33), + GroupCall = (1ULL << 34), // For iteration - LastUsedBit = (1ULL << 33), + LastUsedBit = (1ULL << 34), }; using Flags = base::flags; friend inline constexpr auto is_flag_type(Flag) { return true; } diff --git a/Telegram/SourceFiles/data/data_channel.cpp b/Telegram/SourceFiles/data/data_channel.cpp index 360755acc..4389c3c30 100644 --- a/Telegram/SourceFiles/data/data_channel.cpp +++ b/Telegram/SourceFiles/data/data_channel.cpp @@ -762,7 +762,10 @@ PeerId ChannelData::groupCallDefaultJoinAs() const { } void ChannelData::setAllowedReactions(std::vector list) { - _allowedReactions = std::move(list); + if (_allowedReactions != list) { + _allowedReactions = std::move(list); + session().changes().peerUpdated(this, UpdateFlag::Reactions); + } } const std::vector &ChannelData::allowedReactions() const { diff --git a/Telegram/SourceFiles/data/data_chat.cpp b/Telegram/SourceFiles/data/data_chat.cpp index 7d5d6bb61..022faaee7 100644 --- a/Telegram/SourceFiles/data/data_chat.cpp +++ b/Telegram/SourceFiles/data/data_chat.cpp @@ -288,7 +288,10 @@ void ChatData::setPendingRequestsCount( } void ChatData::setAllowedReactions(std::vector list) { - _allowedReactions = std::move(list); + if (_allowedReactions != list) { + _allowedReactions = std::move(list); + session().changes().peerUpdated(this, UpdateFlag::Reactions); + } } const std::vector &ChatData::allowedReactions() const { diff --git a/Telegram/SourceFiles/data/data_message_reactions.cpp b/Telegram/SourceFiles/data/data_message_reactions.cpp index 75fc019c1..169a9b915 100644 --- a/Telegram/SourceFiles/data/data_message_reactions.cpp +++ b/Telegram/SourceFiles/data/data_message_reactions.cpp @@ -24,15 +24,19 @@ constexpr auto kRefreshEach = 60 * 60 * crl::time(1000); } // namespace Reactions::Reactions(not_null owner) : _owner(owner) { - request(); + refresh(); base::timer_each( kRefreshEach ) | rpl::start_with_next([=] { - request(); + refresh(); }, _lifetime); } +void Reactions::refresh() { + request(); +} + const std::vector &Reactions::list() const { return _available; } @@ -47,6 +51,10 @@ std::vector Reactions::list(not_null peer) const { } } +rpl::producer<> Reactions::updates() const { + return _updated.events(); +} + std::vector Reactions::Filtered( const std::vector &reactions, const std::vector &emoji) { diff --git a/Telegram/SourceFiles/data/data_message_reactions.h b/Telegram/SourceFiles/data/data_message_reactions.h index af521df1f..2209bb174 100644 --- a/Telegram/SourceFiles/data/data_message_reactions.h +++ b/Telegram/SourceFiles/data/data_message_reactions.h @@ -24,6 +24,8 @@ class Reactions final { public: explicit Reactions(not_null owner); + void refresh(); + [[nodiscard]] const std::vector &list() const; [[nodiscard]] std::vector list(not_null peer) const; diff --git a/Telegram/SourceFiles/info/info.style b/Telegram/SourceFiles/info/info.style index f3ebb58df..8fd8a317b 100644 --- a/Telegram/SourceFiles/info/info.style +++ b/Telegram/SourceFiles/info/info.style @@ -362,6 +362,7 @@ infoIconAdministrators: icon {{ "info/edit/group_manage_admins", infoIconFg, poi infoIconBlacklist: icon {{ "info_blacklist", infoIconFg, point(-2px, -2px) }}; infoIconPermissions: icon {{ "info/edit/group_manage_permissions", infoIconFg, point(0px, -2px) }}; infoIconInviteLinks: icon {{ "info/edit/group_manage_links", infoIconFg, point(-2px, 0px) }}; +infoIconReactions: icon {{ "menu/read_reactions", infoIconFg, point(2px, 4px) }}; infoInformationIconPosition: point(25px, 12px); infoNotificationsIconPosition: point(20px, 5px); infoSharedMediaIconPosition: point(20px, 24px); @@ -707,6 +708,11 @@ editPeerInvitesTopSkip: 10px; editPeerInvitesSkip: 10px; editPeerInviteLinkBoxBottomSkip: 15px; +editPeerReactionsButton: SettingsButton(infoProfileButton) { + padding: margins(59px, 13px, 8px, 11px); +} +editPeerReactionsPreview: 28px; + historyTopBarBack: IconButton(infoTopBarBack) { width: 52px; } diff --git a/Telegram/SourceFiles/info/profile/info_profile_values.cpp b/Telegram/SourceFiles/info/profile/info_profile_values.cpp index 248055dac..61e31dd40 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_values.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_values.cpp @@ -16,6 +16,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "lang/lang_keys.h" #include "data/data_peer_values.h" #include "data/data_shared_media.h" +#include "data/data_message_reactions.h" #include "data/data_folder.h" #include "data/data_changes.h" #include "data/data_channel.h" @@ -401,6 +402,35 @@ rpl::producer CanAddMemberValue(not_null peer) { return rpl::single(false); } +rpl::producer FullReactionsCountValue( + not_null session) { + const auto reactions = &session->data().reactions(); + return rpl::single( + rpl::empty_value() + ) | rpl::then( + reactions->updates() + ) | rpl::map([=] { + return int(reactions->list().size()); + }) | rpl::distinct_until_changed(); +} + +rpl::producer AllowedReactionsCountValue(not_null peer) { + if (peer->isUser()) { + return FullReactionsCountValue(&peer->session()); + } + return peer->session().changes().peerFlagsValue( + peer, + UpdateFlag::Reactions + ) | rpl::map([=] { + if (const auto chat = peer->asChat()) { + return int(chat->allowedReactions().size()); + } else if (const auto channel = peer->asChannel()) { + return int(channel->allowedReactions().size()); + } + Unexpected("Peer type in AllowedReactionsCountValue."); + }); +} + template rpl::producer BadgeValueFromFlags(Peer peer) { return Data::PeerFlagsValue( diff --git a/Telegram/SourceFiles/info/profile/info_profile_values.h b/Telegram/SourceFiles/info/profile/info_profile_values.h index cd35fae6a..b3313db44 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_values.h +++ b/Telegram/SourceFiles/info/profile/info_profile_values.h @@ -12,6 +12,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL struct ChannelLocation; +namespace Main { +class Session; +} // namespace Main + namespace Ui { class RpWidget; template @@ -63,6 +67,8 @@ rpl::producer SharedMediaCountValue( Storage::SharedMediaType type); rpl::producer CommonGroupsCountValue(not_null user); rpl::producer CanAddMemberValue(not_null peer); +rpl::producer FullReactionsCountValue(not_null peer); +rpl::producer AllowedReactionsCountValue(not_null peer); enum class Badge { None, From e148b5ff086912728758beae169e0b82dec55591 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 13 Dec 2021 18:03:47 +0400 Subject: [PATCH 063/173] Proof-of-concept reactions dropdown. --- .../boxes/peers/edit_peer_reactions.cpp | 4 +- .../SourceFiles/core/click_handler_types.h | 1 + .../admin_log/history_admin_log_inner.cpp | 5 + .../admin_log/history_admin_log_inner.h | 2 + .../history/history_inner_widget.cpp | 62 +++- .../history/history_inner_widget.h | 11 +- .../history/view/history_view_cursor_state.h | 1 + .../history/view/history_view_element.cpp | 5 + .../history/view/history_view_element.h | 8 + .../history/view/history_view_list_widget.cpp | 5 + .../history/view/history_view_list_widget.h | 2 + .../history/view/history_view_message.cpp | 46 ++- .../history/view/history_view_message.h | 2 + .../history/view/history_view_reactions.cpp | 323 ++++++++++++++++++ .../history/view/history_view_reactions.h | 102 ++++++ .../info/media/info_media_list_widget.cpp | 2 +- Telegram/SourceFiles/ui/chat/chat.style | 7 + .../window/window_session_controller.cpp | 1 + .../window/window_session_controller.h | 5 + 19 files changed, 585 insertions(+), 9 deletions(-) diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_reactions.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_reactions.cpp index 0df4cc658..69a9ae1c9 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_reactions.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_reactions.cpp @@ -66,9 +66,7 @@ void AddReactionIcon( document->session().downloaderTaskFinished( ) | rpl::map([=] { return state->media->getStickerLarge(); - }) | rpl::filter([=](Image *image) { - return (image != nullptr); - }) | rpl::take( + }) | rpl::filter_nullptr() | rpl::take( 1 ) | rpl::start_with_next([=](not_null image) { setImage(image); diff --git a/Telegram/SourceFiles/core/click_handler_types.h b/Telegram/SourceFiles/core/click_handler_types.h index 6bdb282f9..7a90b0946 100644 --- a/Telegram/SourceFiles/core/click_handler_types.h +++ b/Telegram/SourceFiles/core/click_handler_types.h @@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/basic_click_handlers.h" constexpr auto kPeerLinkPeerIdProperty = 0x01; +constexpr auto kReactionIdProperty = 0x02; namespace Main { class Session; diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp index c2504a29f..0e123bef0 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp @@ -673,6 +673,11 @@ void InnerWidget::elementStartInteraction(not_null view) { void InnerWidget::elementShowReactions(not_null view) { } +const Data::Reaction *InnerWidget::elementCornerReaction( + not_null view) { + return nullptr; +} + void InnerWidget::saveState(not_null memento) { memento->setFilter(std::move(_filter)); memento->setAdmins(std::move(_admins)); diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.h b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.h index 4c4e73efa..7ec6b7fb8 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.h +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.h @@ -141,6 +141,8 @@ public: not_null view) override; void elementShowReactions( not_null view) override; + const Data::Reaction *elementCornerReaction( + not_null view) override; ~InnerWidget(); diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index b9def165e..9ff9f1bd8 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -20,6 +20,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/history_view_service_message.h" #include "history/view/history_view_cursor_state.h" #include "history/view/history_view_context_menu.h" +#include "history/view/history_view_reactions.h" #include "history/view/history_view_emoji_interactions.h" #include "history/history_item_components.h" #include "history/history_item_text.h" @@ -176,6 +177,8 @@ HistoryInner::HistoryInner( HistoryView::MakePathShiftGradient( controller->chatStyle(), [=] { update(); })) +, _reactionsMenus( + std::make_unique(historyWidget)) , _touchSelectTimer([=] { onTouchSelect(); }) , _touchScrollTimer([=] { onTouchScrollTimer(); }) , _scrollDateCheck([this] { scrollDateCheck(); }) @@ -222,6 +225,14 @@ HistoryInner::HistoryInner( _controller->emojiInteractions().playStarted(_peer, std::move(emoji)); }, lifetime()); + using ChosenReaction = HistoryView::ReactionsMenuManager::Chosen; + _reactionsMenus->chosen( + ) | rpl::start_with_next([=](ChosenReaction reaction) { + if (const auto item = session().data().message(reaction.context)) { + item->addReaction(reaction.emoji); + } + }, lifetime()); + session().data().itemRemoved( ) | rpl::start_with_next( [this](auto item) { itemRemoved(item); }, @@ -263,6 +274,18 @@ HistoryInner::HistoryInner( update(); }, lifetime()); + rpl::combine( + rpl::single( + rpl::empty_value() + ) | rpl::then(session().data().reactions().updates()), + session().changes().peerFlagsValue( + _peer, + Data::PeerUpdate::Flag::Reactions) + ) | rpl::start_with_next([=] { + _reactions = session().data().reactions().list(_peer); + repaintItem(App::mousedItem()); + }, lifetime()); + controller->adaptive().chatWideValue( ) | rpl::start_with_next([=](bool wide) { _isChatWide = wide; @@ -1510,6 +1533,7 @@ void HistoryInner::mouseActionFinish( .sessionWindow = base::make_weak(_controller.get()), }) }); + _reactionsMenus->hideAll(anim::type::normal); return; } if ((_mouseAction == MouseAction::PrepareSelect) @@ -2125,6 +2149,19 @@ void HistoryInner::copySelectedText() { } } +void HistoryInner::showReactionsMenu(FullMsgId itemId, QRect area) { + const auto top = itemTop(session().data().message(itemId)); + if (top < 0) { + area = QRect(); // Just hide. + } + const auto skip = st::reactionCornerOut.y(); + area = area.marginsRemoved({ 0, skip, 0, skip }); + _reactionsMenus->showReactionsMenu( + itemId, + { mapToGlobal(area.translated(0, top).topLeft()), area.size() }, + _reactions); +} + void HistoryInner::savePhotoToFile(not_null photo) { const auto media = photo->activeMediaView(); if (photo->isNull() || !media || !media->loaded()) { @@ -2884,6 +2921,13 @@ void HistoryInner::elementShowReactions(not_null view) { view->data())); } +const Data::Reaction *HistoryInner::elementCornerReaction( + not_null view) { + return (view == App::mousedItem() && !_reactions.empty()) + ? &_reactions.front() + : nullptr; +} + auto HistoryInner::getSelectionState() const -> HistoryView::TopBarWidget::SelectedState { auto result = HistoryView::TopBarWidget::SelectedState {}; @@ -2960,7 +3004,16 @@ void HistoryInner::mouseActionUpdate() { view = block->messages[_curItem].get(); item = view->data(); - App::mousedItem(view); + const auto was = App::mousedItem(); + if (was != view) { + if (!_reactions.empty()) { + repaintItem(was); + } + App::mousedItem(view); + if (!_reactions.empty()) { + repaintItem(view); + } + } m = mapPointToItem(point, view); if (view->pointState(m) != PointState::Outside) { if (App::hoveredItem() != view) { @@ -3095,6 +3148,7 @@ void HistoryInner::mouseActionUpdate() { || dragState.customTooltip) { Ui::Tooltip::Show(1000, this); } + showReactionsMenu(dragState.itemId, dragState.reactionArea); Qt::CursorShape cur = style::cur_default; if (_mouseAction == MouseAction::None) { @@ -3798,6 +3852,12 @@ not_null HistoryInner::ElementDelegate() { Instance->elementShowReactions(view); } } + const Data::Reaction *elementCornerReaction( + not_null view) override { + Expects(Instance != nullptr); + + return Instance->elementCornerReaction(view); + } }; diff --git a/Telegram/SourceFiles/history/history_inner_widget.h b/Telegram/SourceFiles/history/history_inner_widget.h index b6324ef84..9ae8b5451 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.h +++ b/Telegram/SourceFiles/history/history_inner_widget.h @@ -17,6 +17,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace Data { struct Group; class CloudImageView; +struct Reaction; } // namespace Data namespace HistoryView { @@ -28,6 +29,7 @@ enum class CursorState : char; enum class PointState : char; class EmptyPainter; class Element; +class ReactionsMenuManager; } // namespace HistoryView namespace Window { @@ -57,6 +59,7 @@ public: not_null scroll, not_null controller, not_null history); + ~HistoryInner(); [[nodiscard]] Main::Session &session() const; [[nodiscard]] not_null theme() const { @@ -117,6 +120,7 @@ public: void elementReplyTo(const FullMsgId &to); void elementStartInteraction(not_null view); void elementShowReactions(not_null view); + const Data::Reaction *elementCornerReaction(not_null view); void updateBotInfo(bool recount = true); @@ -155,8 +159,6 @@ public: // HistoryView::ElementDelegate interface. static not_null ElementDelegate(); - ~HistoryInner(); - protected: bool focusNextPrevChild(bool next) override; @@ -338,10 +340,10 @@ private: void deleteAsGroup(FullMsgId itemId); void reportItem(FullMsgId itemId); void reportAsGroup(FullMsgId itemId); - void reportItems(MessageIdsList ids); void blockSenderItem(FullMsgId itemId); void blockSenderAsGroup(FullMsgId itemId); void copySelectedText(); + void showReactionsMenu(FullMsgId itemId, QRect area); void setupSharingDisallowed(); [[nodiscard]] bool hasCopyRestriction(HistoryItem *item = nullptr) const; @@ -395,6 +397,9 @@ private: not_null, std::shared_ptr> _userpics, _userpicsCache; + std::vector _reactions; + std::unique_ptr _reactionsMenus; + MouseAction _mouseAction = MouseAction::None; TextSelectType _mouseSelectType = TextSelectType::Letters; QPoint _dragStartPosition; diff --git a/Telegram/SourceFiles/history/view/history_view_cursor_state.h b/Telegram/SourceFiles/history/view/history_view_cursor_state.h index d9ae01889..12004bb3c 100644 --- a/Telegram/SourceFiles/history/view/history_view_cursor_state.h +++ b/Telegram/SourceFiles/history/view/history_view_cursor_state.h @@ -53,6 +53,7 @@ struct TextState { bool customTooltip = false; uint16 symbol = 0; QString customTooltipText; + QRect reactionArea; }; diff --git a/Telegram/SourceFiles/history/view/history_view_element.cpp b/Telegram/SourceFiles/history/view/history_view_element.cpp index 144816711..dcc96009d 100644 --- a/Telegram/SourceFiles/history/view/history_view_element.cpp +++ b/Telegram/SourceFiles/history/view/history_view_element.cpp @@ -188,6 +188,11 @@ void SimpleElementDelegate::elementShowReactions( not_null view) { } +const Data::Reaction *SimpleElementDelegate::elementCornerReaction( + not_null view) { + return nullptr; +} + TextSelection UnshiftItemSelection( TextSelection selection, uint16 byLength) { diff --git a/Telegram/SourceFiles/history/view/history_view_element.h b/Telegram/SourceFiles/history/view/history_view_element.h index 2141c8414..eed7fb505 100644 --- a/Telegram/SourceFiles/history/view/history_view_element.h +++ b/Telegram/SourceFiles/history/view/history_view_element.h @@ -18,6 +18,10 @@ class HistoryMessage; class HistoryService; struct HistoryMessageReply; +namespace Data { +struct Reaction; +} // namespace Data + namespace Window { class SessionController; } // namespace Window @@ -92,6 +96,8 @@ public: virtual void elementReplyTo(const FullMsgId &to) = 0; virtual void elementStartInteraction(not_null view) = 0; virtual void elementShowReactions(not_null view) = 0; + virtual const Data::Reaction *elementCornerReaction( + not_null view) = 0; virtual ~ElementDelegate() { } @@ -150,6 +156,8 @@ public: void elementReplyTo(const FullMsgId &to) override; void elementStartInteraction(not_null view) override; void elementShowReactions(not_null view) override; + const Data::Reaction *elementCornerReaction( + not_null view) override; protected: [[nodiscard]] not_null controller() const { diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp index a3d17e04b..29d0e9505 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp @@ -1461,6 +1461,11 @@ void ListWidget::elementStartInteraction(not_null view) { void ListWidget::elementShowReactions(not_null view) { } +const Data::Reaction *ListWidget::elementCornerReaction( + not_null view) { + return nullptr; // #TODO reactions +} + void ListWidget::saveState(not_null memento) { memento->setAroundPosition(_aroundPosition); auto state = countScrollState(); diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.h b/Telegram/SourceFiles/history/view/history_view_list_widget.h index 33a781691..78341683a 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.h +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.h @@ -279,6 +279,8 @@ public: void elementReplyTo(const FullMsgId &to) override; void elementStartInteraction(not_null view) override; void elementShowReactions(not_null view) override; + const Data::Reaction *elementCornerReaction( + not_null view) override; void setEmptyInfoWidget(base::unique_qptr &&w); diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index 8df8d76af..d9f03fa69 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -28,6 +28,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_session.h" #include "data/data_user.h" #include "data/data_channel.h" +#include "data/data_message_reactions.h" #include "lang/lang_keys.h" #include "mainwidget.h" #include "main/main_session.h" @@ -604,6 +605,28 @@ void Message::draw(Painter &p, const PaintContext &context) const { p.translate(-reactionsPosition); } + if (const auto reaction = delegate()->elementCornerReaction(this)) { + if (!_react) { + _react = std::make_unique([=] { + history()->owner().requestViewRepaint(this); + }, [=] { + if (const auto reaction + = delegate()->elementCornerReaction(this)) { + data()->addReaction(reaction->emoji); + } + }, g); + _react->toggle(true); + } else { + _react->updateGeometry(g); + } + _react->show(reaction); + } else if (_react) { + _react->toggle(false); + if (_react->isHidden()) { + _react = nullptr; + } + } + if (bubble) { if (displayFromName() && item->displayFrom() @@ -744,6 +767,10 @@ void Message::draw(Painter &p, const PaintContext &context) const { drawRightAction(p, context, fastShareLeft, fastShareTop, width()); } + if (_react) { + _react->paint(p, context); + } + if (media) { media->paintBubbleFireworks(p, g, context.now); } @@ -1070,6 +1097,12 @@ PointState Message::pointState(QPoint point) const { return PointState::Outside; } + if (_react) { + if (const auto state = _react->pointState(point)) { + return *state; + } + } + const auto media = this->media(); const auto item = message(); const auto reactionsInBubble = _reactions && needInfoDisplay(); @@ -1246,6 +1279,14 @@ TextState Message::textState( return result; } + if (_react) { + if (const auto state = _react->textState(point, request)) { + result.link = state->link; + result.reactionArea = state->reactionArea; + return result; + } + } + const auto reactionsInBubble = _reactions && needInfoDisplay(); auto keyboard = item->inlineReplyKeyboard(); auto keyboardHeight = 0; @@ -1923,9 +1964,11 @@ void Message::itemDataChanged() { auto Message::verticalRepaintRange() const -> VerticalRepaintRange { const auto media = this->media(); const auto add = media ? media->bubbleRollRepaintMargins() : QMargins(); + const auto addBottom = add.bottom() + + (_react ? std::max(_react->bottomOutsideMargin(height()), 0) : 0); return { .top = -add.top(), - .height = height() + add.top() + add.bottom() + .height = height() + add.top() + addBottom }; } @@ -2669,6 +2712,7 @@ int Message::resizeContentGetHeight(int newWidth) { if (_reactions && !reactionsInBubble) { newHeight += st::mediaInBubbleSkip + _reactions->resizeGetHeight(contentWidth); } + if (const auto keyboard = item->inlineReplyKeyboard()) { const auto keyboardHeight = st::msgBotKbButton.margin + keyboard->naturalHeight(); newHeight += keyboardHeight; diff --git a/Telegram/SourceFiles/history/view/history_view_message.h b/Telegram/SourceFiles/history/view/history_view_message.h index 0d4803fae..8c6877344 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.h +++ b/Telegram/SourceFiles/history/view/history_view_message.h @@ -19,6 +19,7 @@ struct HistoryMessageForwarded; namespace HistoryView { class ViewButton; +class ReactButton; class Reactions; class WebPage; @@ -233,6 +234,7 @@ private: mutable ClickHandlerPtr _rightActionLink; mutable ClickHandlerPtr _fastReplyLink; mutable std::unique_ptr _viewButton; + mutable std::unique_ptr _react; std::unique_ptr _reactions; mutable std::unique_ptr _comments; diff --git a/Telegram/SourceFiles/history/view/history_view_reactions.cpp b/Telegram/SourceFiles/history/view/history_view_reactions.cpp index 0c3aa7c71..321f18b27 100644 --- a/Telegram/SourceFiles/history/view/history_view_reactions.cpp +++ b/Telegram/SourceFiles/history/view/history_view_reactions.cpp @@ -8,11 +8,25 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/history_view_reactions.h" #include "history/view/history_view_message.h" +#include "history/view/history_view_cursor_state.h" #include "history/history_message.h" +#include "ui/chat/chat_style.h" #include "ui/text/text_options.h" #include "ui/text/text_utilities.h" +#include "data/data_message_reactions.h" +#include "data/data_document.h" +#include "data/data_document_media.h" +#include "core/click_handler_types.h" +#include "main/main_session.h" +#include "styles/style_chat.h" +#include "styles/palette.h" namespace HistoryView { +namespace { + +constexpr auto kItemsPerRow = 5; + +} // namespace Reactions::Reactions(Data &&data) : _data(std::move(data)) @@ -101,4 +115,313 @@ Reactions::Data ReactionsDataFromMessage(not_null message) { return result; } +ReactButton::ReactButton( + Fn update, + Fn react, + QRect bubble) +: _update(std::move(update)) +, _handler(std::make_shared(react)) { + updateGeometry(bubble); +} + +void ReactButton::updateGeometry(QRect bubble) { + const auto topLeft = bubble.topLeft() + + QPoint(bubble.width(), bubble.height()) + + QPoint(st::reactionCornerOut.x(), st::reactionCornerOut.y()) + - QPoint( + st::reactionCornerSize.width(), + st::reactionCornerSize.height()); + _geometry = QRect(topLeft, st::reactionCornerSize); + _imagePosition = _geometry.topLeft() + QPoint( + (_geometry.width() - st::reactionCornerImage) / 2, + (_geometry.height() - st::reactionCornerImage) / 2); +} + +int ReactButton::bottomOutsideMargin(int fullHeight) const { + return _geometry.y() + _geometry.height() - fullHeight; +} + +std::optional ReactButton::pointState(QPoint point) const { + if (!_geometry.contains(point)) { + return std::nullopt; + } + return PointState::Inside; +} + +std::optional ReactButton::textState( + QPoint point, + const StateRequest &request) const { + if (!_geometry.contains(point)) { + return std::nullopt; + } + auto result = TextState(nullptr, _handler); + result.reactionArea = _geometry; + return result; +} + +void ReactButton::paint(Painter &p, const PaintContext &context) { + const auto shown = _shownAnimation.value(_shown ? 1. : 0.); + if (shown == 0.) { + return; + } + p.setOpacity(shown); + p.setBrush(context.messageStyle()->msgBg); + p.setPen(st::shadowFg); + const auto radius = _geometry.height() / 2; + p.drawRoundedRect(_geometry, radius, radius); + if (!_image.isNull()) { + p.drawImage(_imagePosition, _image); + } + p.setOpacity(1.); +} + +void ReactButton::toggle(bool shown) { + if (_shown == shown) { + return; + } + _shown = shown; + _shownAnimation.start(_update, _shown ? 0. : 1., _shown ? 1. : 0., 120); +} + +bool ReactButton::isHidden() const { + return !_shown && !_shownAnimation.animating(); +} + +void ReactButton::show(not_null reaction) { + if (_media && _media->owner() == reaction->staticIcon) { + return; + } + _handler->setProperty(kReactionIdProperty, reaction->emoji); + _media = reaction->staticIcon->createMediaView(); + const auto setImage = [=](not_null image) { + const auto size = st::reactionCornerImage; + _image = Images::prepare( + image->original(), + size * style::DevicePixelRatio(), + size * style::DevicePixelRatio(), + Images::Option::Smooth | Images::Option::TransparentBackground, + size, + size); + _image.setDevicePixelRatio(style::DevicePixelRatio()); + }; + if (const auto image = _media->getStickerLarge()) { + setImage(image); + } else { + reaction->staticIcon->session().downloaderTaskFinished( + ) | rpl::map([=] { + return _media->getStickerLarge(); + }) | rpl::filter_nullptr() | rpl::take( + 1 + ) | rpl::start_with_next([=](not_null image) { + setImage(image); + _update(); + }, _downloadTaskLifetime); + } +} + +ReactionsMenu::ReactionsMenu( + QWidget *parent, + const std::vector &list) +: _dropdown(parent) { + _dropdown.setAutoHiding(false); + + const auto content = _dropdown.setOwnedWidget( + object_ptr(&_dropdown)); + + const auto count = int(list.size()); + const auto single = st::reactionPopupImage; + const auto padding = st::reactionPopupPadding; + const auto width = padding.left() + single + padding.right(); + const auto height = padding.top() + single + padding.bottom(); + const auto rows = (count + kItemsPerRow - 1) / kItemsPerRow; + const auto columns = (int(list.size()) + rows - 1) / rows; + const auto inner = QRect(0, 0, columns * width, rows * height); + const auto outer = inner.marginsAdded(padding); + content->resize(outer.size()); + + _elements.reserve(list.size()); + auto x = padding.left(); + auto y = padding.top(); + auto row = -1; + auto perrow = 0; + while (_elements.size() != list.size()) { + if (!perrow) { + ++row; + perrow = (list.size() - _elements.size()) / (rows - row); + x = (outer.width() - perrow * width) / 2; + } + auto &reaction = list[_elements.size()]; + _elements.push_back({ + .emoji = reaction.emoji, + .geometry = QRect(x, y + row * height, width, height), + }); + x += width; + --perrow; + } + + struct State { + int selected = -1; + int pressed = -1; + }; + const auto state = content->lifetime().make_state(); + content->setMouseTracking(true); + content->events( + ) | rpl::start_with_next([=](not_null e) { + const auto type = e->type(); + if (type == QEvent::MouseMove) { + const auto position = static_cast(e.get())->pos(); + const auto i = ranges::find_if(_elements, [&](const Element &e) { + return e.geometry.contains(position); + }); + const auto selected = (i != end(_elements)) + ? int(i - begin(_elements)) + : -1; + if (state->selected != selected) { + state->selected = selected; + content->update(); + } + } else if (type == QEvent::MouseButtonPress) { + state->pressed = state->selected; + content->update(); + } else if (type == QEvent::MouseButtonRelease) { + const auto pressed = std::exchange(state->pressed, -1); + if (pressed >= 0) { + content->update(); + if (pressed == state->selected) { + _chosen.fire_copy(_elements[pressed].emoji); + } + } + } + }, content->lifetime()); + + content->paintRequest( + ) | rpl::start_with_next([=] { + auto p = QPainter(content); + const auto radius = st::roundRadiusSmall; + { + auto hq = PainterHighQualityEnabler(p); + p.setBrush(st::emojiPanBg); + p.setPen(Qt::NoPen); + p.drawRoundedRect(content->rect(), radius, radius); + } + auto index = 0; + const auto activeIndex = (state->pressed >= 0) + ? state->pressed + : state->selected; + const auto size = Ui::Emoji::GetSizeNormal(); + for (const auto &element : _elements) { + const auto active = (index++ == activeIndex); + if (active) { + auto hq = PainterHighQualityEnabler(p); + p.setBrush(st::windowBgOver); + p.setPen(Qt::NoPen); + p.drawRoundedRect(element.geometry, radius, radius); + } + if (const auto emoji = Ui::Emoji::Find(element.emoji)) { + Ui::Emoji::Draw( + p, + emoji, + size, + element.geometry.x() + (width - size) / 2, + element.geometry.y() + (height - size) / 2); + } + } + }, content->lifetime()); + + _dropdown.resizeToContent(); +} + +void ReactionsMenu::showAround(QRect area) { + const auto parent = _dropdown.parentWidget(); + const auto left = std::min( + std::max(area.x() + (area.width() - _dropdown.width()) / 2, 0), + parent->width() - _dropdown.width()); + _fromTop = (area.y() >= _dropdown.height()); + _fromLeft = (area.center().x() - left + <= left + _dropdown.width() - area.center().x()); + const auto top = _fromTop + ? (area.y() - _dropdown.height()) + : (area.y() + area.height()); + _dropdown.move(left, top); +} + +void ReactionsMenu::toggle(bool shown, anim::type animated) { + if (animated == anim::type::normal) { + if (shown) { + using Origin = Ui::PanelAnimation::Origin; + _dropdown.showAnimated(_fromTop + ? (_fromLeft ? Origin::BottomLeft : Origin::BottomRight) + : (_fromLeft ? Origin::TopLeft : Origin::TopRight)); + } else { + _dropdown.hideAnimated(); + } + } else if (shown) { + _dropdown.showFast(); + } else { + _dropdown.hideFast(); + } +} + +[[nodiscard]] rpl::producer ReactionsMenu::chosen() const { + return _chosen.events(); +} + +[[nodiscard]] rpl::lifetime &ReactionsMenu::lifetime() { + return _dropdown.lifetime(); +} + +ReactionsMenuManager::ReactionsMenuManager(QWidget *parent) +: _parent(parent) { +} + +ReactionsMenuManager::~ReactionsMenuManager() = default; + +void ReactionsMenuManager::showReactionsMenu( + FullMsgId context, + QRect globalReactionArea, + const std::vector &list) { + if (globalReactionArea.isEmpty()) { + context = FullMsgId(); + } + const auto listsEqual = ranges::equal( + _list, + list, + ranges::equal_to(), + &Data::Reaction::emoji, + &Data::Reaction::emoji); + const auto changed = (_context != context || !listsEqual); + if (_menu && changed) { + _menu->toggle(false, anim::type::normal); + _hiding.push_back(std::move(_menu)); + } + _context = context; + _list = list; + if (list.size() < 2 || !context || (!changed && !_menu)) { + return; + } else if (!_menu) { + _menu = std::make_unique(_parent, list); + _menu->chosen( + ) | rpl::start_with_next([=](QString emoji) { + _menu->toggle(false, anim::type::normal); + _hiding.push_back(std::move(_menu)); + _chosen.fire({ context, std::move(emoji) }); + }, _menu->lifetime()); + } + const auto area = QRect( + _parent->mapFromGlobal(globalReactionArea.topLeft()), + globalReactionArea.size()); + _menu->showAround(area); + _menu->toggle(true, anim::type::normal); +} + +void ReactionsMenuManager::hideAll(anim::type animated) { + if (animated == anim::type::instant) { + _hiding.clear(); + _menu = nullptr; + } else if (_menu) { + _menu->toggle(false, anim::type::normal); + _hiding.push_back(std::move(_menu)); + } +} + } // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/history_view_reactions.h b/Telegram/SourceFiles/history/view/history_view_reactions.h index af9075556..721e2e299 100644 --- a/Telegram/SourceFiles/history/view/history_view_reactions.h +++ b/Telegram/SourceFiles/history/view/history_view_reactions.h @@ -8,13 +8,27 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #pragma once #include "history/view/history_view_object.h" +#include "ui/effects/animations.h" +#include "ui/widgets/inner_dropdown.h" + +class Image; namespace Ui { class ChatStyle; +struct ChatPaintContext; } // namespace Ui +namespace Data { +struct Reaction; +class DocumentMedia; +} // namespace Data + namespace HistoryView { +using PaintContext = Ui::ChatPaintContext; +enum class PointState : char; +struct TextState; +struct StateRequest; class Message; class Reactions final : public Object { @@ -52,4 +66,92 @@ private: [[nodiscard]] Reactions::Data ReactionsDataFromMessage( not_null message); +class ReactButton final { +public: + ReactButton(Fn update, Fn react, QRect bubble); + + void updateGeometry(QRect bubble); + [[nodiscard]] int bottomOutsideMargin(int fullHeight) const; + [[nodiscard]] std::optional pointState(QPoint point) const; + [[nodiscard]] std::optional textState( + QPoint point, + const StateRequest &request) const; + + void paint(Painter &p, const PaintContext &context); + + void toggle(bool shown); + [[nodiscard]] bool isHidden() const; + void show(not_null reaction); + +private: + const Fn _update; + const ClickHandlerPtr _handler; + QRect _geometry; + bool _shown = false; + Ui::Animations::Simple _shownAnimation; + + QImage _image; + QPoint _imagePosition; + std::shared_ptr _media; + rpl::lifetime _downloadTaskLifetime; + +}; + +class ReactionsMenu final { +public: + ReactionsMenu( + QWidget *parent, + const std::vector &list); + + void showAround(QRect area); + void toggle(bool shown, anim::type animated); + + [[nodiscard]] rpl::producer chosen() const; + + [[nodiscard]] rpl::lifetime &lifetime(); + +private: + struct Element { + QString emoji; + QRect geometry; + }; + Ui::InnerDropdown _dropdown; + rpl::event_stream _chosen; + std::vector _elements; + bool _fromTop = true; + bool _fromLeft = true; + +}; + +class ReactionsMenuManager final { +public: + explicit ReactionsMenuManager(QWidget *parent); + ~ReactionsMenuManager(); + + struct Chosen { + FullMsgId context; + QString emoji; + }; + + void showReactionsMenu( + FullMsgId context, + QRect globalReactionArea, + const std::vector &list); + void hideAll(anim::type animated); + + [[nodiscard]] rpl::producer chosen() const { + return _chosen.events(); + } + +private: + QWidget *_parent = nullptr; + rpl::event_stream _chosen; + + std::unique_ptr _menu; + FullMsgId _context; + std::vector _list; + std::vector> _hiding; + +}; + } // namespace HistoryView diff --git a/Telegram/SourceFiles/info/media/info_media_list_widget.cpp b/Telegram/SourceFiles/info/media/info_media_list_widget.cpp index 4999f2ef9..fa89173f2 100644 --- a/Telegram/SourceFiles/info/media/info_media_list_widget.cpp +++ b/Telegram/SourceFiles/info/media/info_media_list_widget.cpp @@ -962,7 +962,7 @@ void ListWidget::repaintItem(QRect itemGeometry) { } bool ListWidget::isMyItem(not_null item) const { - auto peer = item->history()->peer; + const auto peer = item->history()->peer; return (_peer == peer) || (_migrated == peer); } diff --git a/Telegram/SourceFiles/ui/chat/chat.style b/Telegram/SourceFiles/ui/chat/chat.style index 0ad691378..58e7ebbe6 100644 --- a/Telegram/SourceFiles/ui/chat/chat.style +++ b/Telegram/SourceFiles/ui/chat/chat.style @@ -954,3 +954,10 @@ sendAsButton: SendAsButton { } duration: 150; } + +reactionCornerSize: size(23px, 18px); +reactionCornerOut: point(7px, 5px); +reactionCornerImage: 14px; + +reactionPopupImage: 25px; +reactionPopupPadding: margins(5px, 5px, 5px, 5px); diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index 9be829b3a..c443b910a 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -20,6 +20,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/history.h" #include "history/history_item.h" #include "history/view/history_view_replies_section.h" +#include "history/view/history_view_reactions.h" #include "media/player/media_player_instance.h" #include "media/view/media_view_open_common.h" #include "data/data_document_resolver.h" diff --git a/Telegram/SourceFiles/window/window_session_controller.h b/Telegram/SourceFiles/window/window_session_controller.h index 2cca76cdd..05d81d4b7 100644 --- a/Telegram/SourceFiles/window/window_session_controller.h +++ b/Telegram/SourceFiles/window/window_session_controller.h @@ -55,8 +55,13 @@ struct ChatThemeBackgroundData; namespace Data { struct CloudTheme; enum class CloudThemeType; +struct Reaction; } // namespace Data +namespace HistoryView { +class ReactionsMenu; +} // namespace HistoryView + namespace Window { class MainWindow; From 371c9c1bfef2d0c474ef9d61881f4e1076d3898e Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 15 Dec 2021 19:25:48 +0400 Subject: [PATCH 064/173] Implement a nice corner reaction button. --- .../SourceFiles/core/click_handler_types.h | 1 - .../admin_log/history_admin_log_inner.cpp | 5 - .../admin_log/history_admin_log_inner.h | 2 - .../history/history_inner_widget.cpp | 95 ++- .../history/history_inner_widget.h | 30 +- .../history/view/history_view_cursor_state.h | 1 - .../history/view/history_view_element.cpp | 11 +- .../history/view/history_view_element.h | 11 +- .../history/view/history_view_list_widget.cpp | 5 - .../history/view/history_view_list_widget.h | 2 - .../history/view/history_view_message.cpp | 77 +-- .../history/view/history_view_message.h | 12 +- .../history/view/history_view_reactions.cpp | 554 +++++++++++++----- .../history/view/history_view_reactions.h | 171 ++++-- Telegram/SourceFiles/ui/chat/chat.style | 8 +- .../window/window_session_controller.h | 5 - 16 files changed, 658 insertions(+), 332 deletions(-) diff --git a/Telegram/SourceFiles/core/click_handler_types.h b/Telegram/SourceFiles/core/click_handler_types.h index 7a90b0946..6bdb282f9 100644 --- a/Telegram/SourceFiles/core/click_handler_types.h +++ b/Telegram/SourceFiles/core/click_handler_types.h @@ -10,7 +10,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/basic_click_handlers.h" constexpr auto kPeerLinkPeerIdProperty = 0x01; -constexpr auto kReactionIdProperty = 0x02; namespace Main { class Session; diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp index 0e123bef0..c2504a29f 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp @@ -673,11 +673,6 @@ void InnerWidget::elementStartInteraction(not_null view) { void InnerWidget::elementShowReactions(not_null view) { } -const Data::Reaction *InnerWidget::elementCornerReaction( - not_null view) { - return nullptr; -} - void InnerWidget::saveState(not_null memento) { memento->setFilter(std::move(_filter)); memento->setAdmins(std::move(_admins)); diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.h b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.h index 7ec6b7fb8..4c4e73efa 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.h +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.h @@ -141,8 +141,6 @@ public: not_null view) override; void elementShowReactions( not_null view) override; - const Data::Reaction *elementCornerReaction( - not_null view) override; ~InnerWidget(); diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index 9ff9f1bd8..d4c46c55d 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -177,8 +177,10 @@ HistoryInner::HistoryInner( HistoryView::MakePathShiftGradient( controller->chatStyle(), [=] { update(); })) -, _reactionsMenus( - std::make_unique(historyWidget)) +, _reactionsManager( + std::make_unique( + historyWidget, + [=](QRect updated) { update(updated); })) , _touchSelectTimer([=] { onTouchSelect(); }) , _touchScrollTimer([=] { onTouchScrollTimer(); }) , _scrollDateCheck([this] { scrollDateCheck(); }) @@ -225,8 +227,8 @@ HistoryInner::HistoryInner( _controller->emojiInteractions().playStarted(_peer, std::move(emoji)); }, lifetime()); - using ChosenReaction = HistoryView::ReactionsMenuManager::Chosen; - _reactionsMenus->chosen( + using ChosenReaction = HistoryView::Reactions::Manager::Chosen; + _reactionsManager->chosen( ) | rpl::start_with_next([=](ChosenReaction reaction) { if (const auto item = session().data().message(reaction.context)) { item->addReaction(reaction.emoji); @@ -283,7 +285,7 @@ HistoryInner::HistoryInner( Data::PeerUpdate::Flag::Reactions) ) | rpl::start_with_next([=] { _reactions = session().data().reactions().list(_peer); - repaintItem(App::mousedItem()); + _reactionsManager->applyList(_reactions); }, lifetime()); controller->adaptive().chatWideValue( @@ -799,8 +801,8 @@ void HistoryInner::paintEvent(QPaintEvent *e) { view = block->messages[iItem].get(); item = view->data(); } - p.translate(0, -top); context.translate(0, top); + p.translate(0, -top); } if (htop >= 0) { auto iBlock = (_curHistory == _history ? _curBlock : 0); @@ -863,6 +865,7 @@ void HistoryInner::paintEvent(QPaintEvent *e) { view = block->messages[iItem].get(); item = view->data(); } + context.translate(0, top); p.translate(0, -top); if (readTill && _widget->doWeReadServerHistory()) { @@ -959,6 +962,9 @@ void HistoryInner::paintEvent(QPaintEvent *e) { return true; }); p.setOpacity(1.); + + _reactionsManager->paintButtons(p, context); + p.translate(0, _historyPaddingTop); _emojiInteractions->paint(p); } @@ -1533,7 +1539,7 @@ void HistoryInner::mouseActionFinish( .sessionWindow = base::make_weak(_controller.get()), }) }); - _reactionsMenus->hideAll(anim::type::normal); + _reactionsManager->hideSelectors(anim::type::normal); return; } if ((_mouseAction == MouseAction::PrepareSelect) @@ -1719,21 +1725,6 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { return; } const auto itemId = item->fullId(); - if (item->canReact()) { - auto reactionMenu = std::make_unique( - this, - st::reactionMenu); - auto &reactions = item->history()->owner().reactions(); - const auto &list = reactions.list(item->history()->peer); - if (!list.empty()) { - for (const auto &entry : list) { - reactionMenu->addAction(entry.emoji, [=] { - item->addReaction(entry.emoji); - }); - } - _menu->addAction("Reaction", std::move(reactionMenu), &st::menuIconReactions); - } - } if (canSendMessages) { _menu->addAction(tr::lng_context_reply_msg(tr::now), [=] { _widget->replyToMessage(itemId); @@ -2149,19 +2140,6 @@ void HistoryInner::copySelectedText() { } } -void HistoryInner::showReactionsMenu(FullMsgId itemId, QRect area) { - const auto top = itemTop(session().data().message(itemId)); - if (top < 0) { - area = QRect(); // Just hide. - } - const auto skip = st::reactionCornerOut.y(); - area = area.marginsRemoved({ 0, skip, 0, skip }); - _reactionsMenus->showReactionsMenu( - itemId, - { mapToGlobal(area.translated(0, top).topLeft()), area.size() }, - _reactions); -} - void HistoryInner::savePhotoToFile(not_null photo) { const auto media = photo->activeMediaView(); if (photo->isNull() || !media || !media->loaded()) { @@ -2696,6 +2674,7 @@ void HistoryInner::enterEventHook(QEnterEvent *e) { } void HistoryInner::leaveEventHook(QEvent *e) { + _reactionsManager->showButton({}); if (auto item = App::hoveredItem()) { repaintItem(item); App::hoveredItem(nullptr); @@ -2807,13 +2786,13 @@ bool HistoryInner::canCopySelected() const { } bool HistoryInner::canDeleteSelected() const { - auto selectedState = getSelectionState(); - return (selectedState.count > 0) && (selectedState.count == selectedState.canDeleteCount); + const auto selectedState = getSelectionState(); + return (selectedState.count > 0) + && (selectedState.count == selectedState.canDeleteCount); } bool HistoryInner::inSelectionMode() const { - if (!_selected.empty() - && (_selected.begin()->second == FullSelection)) { + if (hasSelectedItems()) { return true; } else if (_mouseAction == MouseAction::Selecting && _dragSelFrom @@ -2921,13 +2900,6 @@ void HistoryInner::elementShowReactions(not_null view) { view->data())); } -const Data::Reaction *HistoryInner::elementCornerReaction( - not_null view) { - return (view == App::mousedItem() && !_reactions.empty()) - ? &_reactions.front() - : nullptr; -} - auto HistoryInner::getSelectionState() const -> HistoryView::TopBarWidget::SelectedState { auto result = HistoryView::TopBarWidget::SelectedState {}; @@ -2955,10 +2927,14 @@ void HistoryInner::clearSelected(bool onlyTextSelection) { } } +bool HistoryInner::hasSelectedItems() const { + return !_selected.empty() && _selected.cbegin()->second == FullSelection; +} + MessageIdsList HistoryInner::getSelectedItems() const { using namespace ranges; - if (_selected.empty() || _selected.cbegin()->second != FullSelection) { + if (!hasSelectedItems()) { return {}; } @@ -2985,6 +2961,21 @@ void HistoryInner::onTouchSelect() { mouseActionStart(_touchPos, Qt::LeftButton); } +auto HistoryInner::reactionButtonParameters( + not_null view, + QPoint position) const +-> HistoryView::Reactions::ButtonParameters { + const auto top = itemTop(view); + if (top < 0 + || !view->data()->canReact() + || _mouseAction == MouseAction::Dragging + || inSelectionMode()) { + return {}; + } + const auto local = view->reactionButtonParameters(position); + return local.translated({ 0, itemTop(view) }); +} + void HistoryInner::mouseActionUpdate() { if (hasPendingResizedItems()) { return; @@ -3015,6 +3006,7 @@ void HistoryInner::mouseActionUpdate() { } } m = mapPointToItem(point, view); + _reactionsManager->showButton(reactionButtonParameters(view, m)); if (view->pointState(m) != PointState::Outside) { if (App::hoveredItem() != view) { repaintItem(App::hoveredItem()); @@ -3025,6 +3017,8 @@ void HistoryInner::mouseActionUpdate() { repaintItem(App::hoveredItem()); App::hoveredItem(nullptr); } + } else { + _reactionsManager->showButton({}); } if (_mouseActionItem && !_mouseActionItem->mainView()) { mouseActionCancel(); @@ -3148,7 +3142,6 @@ void HistoryInner::mouseActionUpdate() { || dragState.customTooltip) { Ui::Tooltip::Show(1000, this); } - showReactionsMenu(dragState.itemId, dragState.reactionArea); Qt::CursorShape cur = style::cur_default; if (_mouseAction == MouseAction::None) { @@ -3852,12 +3845,6 @@ not_null HistoryInner::ElementDelegate() { Instance->elementShowReactions(view); } } - const Data::Reaction *elementCornerReaction( - not_null view) override { - Expects(Instance != nullptr); - - return Instance->elementCornerReaction(view); - } }; diff --git a/Telegram/SourceFiles/history/history_inner_widget.h b/Telegram/SourceFiles/history/history_inner_widget.h index 9ae8b5451..988e93249 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.h +++ b/Telegram/SourceFiles/history/history_inner_widget.h @@ -29,9 +29,13 @@ enum class CursorState : char; enum class PointState : char; class EmptyPainter; class Element; -class ReactionsMenuManager; } // namespace HistoryView +namespace HistoryView::Reactions { +class Manager; +struct ButtonParameters; +} // namespace HistoryView::Reactions + namespace Window { class SessionController; } // namespace Window @@ -69,7 +73,7 @@ public: void messagesReceived(PeerData *peer, const QVector &messages); void messagesReceivedDown(PeerData *peer, const QVector &messages); - TextForMimeData getSelectedText() const; + [[nodiscard]] TextForMimeData getSelectedText() const; void touchScrollUpdated(const QPoint &screenPos); @@ -82,14 +86,16 @@ public: void repaintItem(const HistoryItem *item); void repaintItem(const Element *view); - bool canCopySelected() const; - bool canDeleteSelected() const; + [[nodiscard]] bool canCopySelected() const; + [[nodiscard]] bool canDeleteSelected() const; - HistoryView::TopBarWidget::SelectedState getSelectionState() const; + [[nodiscard]] auto getSelectionState() const + -> HistoryView::TopBarWidget::SelectedState; void clearSelected(bool onlyTextSelection = false); - MessageIdsList getSelectedItems() const; - bool inSelectionMode() const; - bool elementIntersectsRange( + [[nodiscard]] MessageIdsList getSelectedItems() const; + [[nodiscard]] bool hasSelectedItems() const; + [[nodiscard]] bool inSelectionMode() const; + [[nodiscard]] bool elementIntersectsRange( not_null view, int from, int till) const; @@ -120,7 +126,6 @@ public: void elementReplyTo(const FullMsgId &to); void elementStartInteraction(not_null view); void elementShowReactions(not_null view); - const Data::Reaction *elementCornerReaction(not_null view); void updateBotInfo(bool recount = true); @@ -343,7 +348,10 @@ private: void blockSenderItem(FullMsgId itemId); void blockSenderAsGroup(FullMsgId itemId); void copySelectedText(); - void showReactionsMenu(FullMsgId itemId, QRect area); + + HistoryView::Reactions::ButtonParameters reactionButtonParameters( + not_null view, + QPoint position) const; void setupSharingDisallowed(); [[nodiscard]] bool hasCopyRestriction(HistoryItem *item = nullptr) const; @@ -398,7 +406,7 @@ private: std::shared_ptr> _userpics, _userpicsCache; std::vector _reactions; - std::unique_ptr _reactionsMenus; + std::unique_ptr _reactionsManager; MouseAction _mouseAction = MouseAction::None; TextSelectType _mouseSelectType = TextSelectType::Letters; diff --git a/Telegram/SourceFiles/history/view/history_view_cursor_state.h b/Telegram/SourceFiles/history/view/history_view_cursor_state.h index 12004bb3c..d9ae01889 100644 --- a/Telegram/SourceFiles/history/view/history_view_cursor_state.h +++ b/Telegram/SourceFiles/history/view/history_view_cursor_state.h @@ -53,7 +53,6 @@ struct TextState { bool customTooltip = false; uint16 symbol = 0; QString customTooltipText; - QRect reactionArea; }; diff --git a/Telegram/SourceFiles/history/view/history_view_element.cpp b/Telegram/SourceFiles/history/view/history_view_element.cpp index dcc96009d..f2543b405 100644 --- a/Telegram/SourceFiles/history/view/history_view_element.cpp +++ b/Telegram/SourceFiles/history/view/history_view_element.cpp @@ -15,6 +15,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/media/history_view_media_grouped.h" #include "history/view/media/history_view_sticker.h" #include "history/view/media/history_view_large_emoji.h" +#include "history/view/history_view_reactions.h" #include "history/view/history_view_cursor_state.h" #include "history/history.h" #include "base/unixtime.h" @@ -188,11 +189,6 @@ void SimpleElementDelegate::elementShowReactions( not_null view) { } -const Data::Reaction *SimpleElementDelegate::elementCornerReaction( - not_null view) { - return nullptr; -} - TextSelection UnshiftItemSelection( TextSelection selection, uint16 byLength) { @@ -979,6 +975,11 @@ TextSelection Element::adjustSelection( return selection; } +Reactions::ButtonParameters Element::reactionButtonParameters( + QPoint position) const { + return {}; +} + void Element::clickHandlerActiveChanged( const ClickHandlerPtr &handler, bool active) { diff --git a/Telegram/SourceFiles/history/view/history_view_element.h b/Telegram/SourceFiles/history/view/history_view_element.h index eed7fb505..76b84a5b4 100644 --- a/Telegram/SourceFiles/history/view/history_view_element.h +++ b/Telegram/SourceFiles/history/view/history_view_element.h @@ -43,6 +43,10 @@ class Media; using PaintContext = Ui::ChatPaintContext; +namespace Reactions { +struct ButtonParameters; +} // namespace Reactions + enum class Context : char { History, Replies, @@ -96,8 +100,6 @@ public: virtual void elementReplyTo(const FullMsgId &to) = 0; virtual void elementStartInteraction(not_null view) = 0; virtual void elementShowReactions(not_null view) = 0; - virtual const Data::Reaction *elementCornerReaction( - not_null view) = 0; virtual ~ElementDelegate() { } @@ -156,8 +158,6 @@ public: void elementReplyTo(const FullMsgId &to) override; void elementStartInteraction(not_null view) override; void elementShowReactions(not_null view) override; - const Data::Reaction *elementCornerReaction( - not_null view) override; protected: [[nodiscard]] not_null controller() const { @@ -319,6 +319,9 @@ public: TextSelection selection, TextSelectType type) const; + [[nodiscard]] virtual auto reactionButtonParameters( + QPoint position) const -> Reactions::ButtonParameters; + // ClickHandlerHost interface. void clickHandlerActiveChanged( const ClickHandlerPtr &handler, diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp index 29d0e9505..a3d17e04b 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp @@ -1461,11 +1461,6 @@ void ListWidget::elementStartInteraction(not_null view) { void ListWidget::elementShowReactions(not_null view) { } -const Data::Reaction *ListWidget::elementCornerReaction( - not_null view) { - return nullptr; // #TODO reactions -} - void ListWidget::saveState(not_null memento) { memento->setAroundPosition(_aroundPosition); auto state = countScrollState(); diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.h b/Telegram/SourceFiles/history/view/history_view_list_widget.h index 78341683a..33a781691 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.h +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.h @@ -279,8 +279,6 @@ public: void elementReplyTo(const FullMsgId &to) override; void elementStartInteraction(not_null view) override; void elementShowReactions(not_null view) override; - const Data::Reaction *elementCornerReaction( - not_null view) override; void setEmptyInfoWidget(base::unique_qptr &&w); diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index d9f03fa69..78103f3d2 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -605,28 +605,6 @@ void Message::draw(Painter &p, const PaintContext &context) const { p.translate(-reactionsPosition); } - if (const auto reaction = delegate()->elementCornerReaction(this)) { - if (!_react) { - _react = std::make_unique([=] { - history()->owner().requestViewRepaint(this); - }, [=] { - if (const auto reaction - = delegate()->elementCornerReaction(this)) { - data()->addReaction(reaction->emoji); - } - }, g); - _react->toggle(true); - } else { - _react->updateGeometry(g); - } - _react->show(reaction); - } else if (_react) { - _react->toggle(false); - if (_react->isHidden()) { - _react = nullptr; - } - } - if (bubble) { if (displayFromName() && item->displayFrom() @@ -767,10 +745,6 @@ void Message::draw(Painter &p, const PaintContext &context) const { drawRightAction(p, context, fastShareLeft, fastShareTop, width()); } - if (_react) { - _react->paint(p, context); - } - if (media) { media->paintBubbleFireworks(p, g, context.now); } @@ -1097,12 +1071,6 @@ PointState Message::pointState(QPoint point) const { return PointState::Outside; } - if (_react) { - if (const auto state = _react->pointState(point)) { - return *state; - } - } - const auto media = this->media(); const auto item = message(); const auto reactionsInBubble = _reactions && needInfoDisplay(); @@ -1279,14 +1247,6 @@ TextState Message::textState( return result; } - if (_react) { - if (const auto state = _react->textState(point, request)) { - result.link = state->link; - result.reactionArea = state->reactionArea; - return result; - } - } - const auto reactionsInBubble = _reactions && needInfoDisplay(); auto keyboard = item->inlineReplyKeyboard(); auto keyboardHeight = 0; @@ -1828,6 +1788,28 @@ TextSelection Message::adjustSelection( return result; } +Reactions::ButtonParameters Message::reactionButtonParameters( + QPoint position) const { + const auto top = marginTop(); + if (!QRect(0, top, width(), height() - top).contains(position)) { + return {}; + } + auto result = Reactions::ButtonParameters{ .context = data()->fullId() }; + result.outbg = hasOutLayout(); + const auto geometry = countGeometry(); + result.center = geometry.topLeft() + + QPoint(geometry.width(), geometry.height()) + + st::reactionCornerCenter; + const auto size = st::reactionCornerSize; + const auto button = QRect( + result.center - QPoint(size.width() / 2, size.height() / 2), + size); + result.active = button.marginsAdded( + st::reactionCornerActiveAreaPadding + ).contains(position); + return result; +} + void Message::drawInfo( Painter &p, const PaintContext &context, @@ -1932,11 +1914,14 @@ void Message::refreshReactions() { const auto &list = item->reactions(); if (list.empty() || embedReactionsInBottomInfo()) { _reactions = nullptr; - } else if (!_reactions) { - _reactions = std::make_unique( - ReactionsDataFromMessage(this)); + return; + } + using namespace Reactions; + auto data = InlineListDataFromMessage(this); + if (!_reactions) { + _reactions = std::make_unique(std::move(data)); } else { - _reactions->update(ReactionsDataFromMessage(this), width()); + _reactions->update(std::move(data), width()); } } @@ -1964,11 +1949,9 @@ void Message::itemDataChanged() { auto Message::verticalRepaintRange() const -> VerticalRepaintRange { const auto media = this->media(); const auto add = media ? media->bubbleRollRepaintMargins() : QMargins(); - const auto addBottom = add.bottom() - + (_react ? std::max(_react->bottomOutsideMargin(height()), 0) : 0); return { .top = -add.top(), - .height = height() + add.top() + addBottom + .height = height() + add.top() + add.bottom() }; } diff --git a/Telegram/SourceFiles/history/view/history_view_message.h b/Telegram/SourceFiles/history/view/history_view_message.h index 8c6877344..aeaca7fee 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.h +++ b/Telegram/SourceFiles/history/view/history_view_message.h @@ -19,10 +19,12 @@ struct HistoryMessageForwarded; namespace HistoryView { class ViewButton; -class ReactButton; -class Reactions; class WebPage; +namespace Reactions { +class InlineList; +} // namespace Reactions + // Special type of Component for the channel actions log. struct LogEntryOriginal : public RuntimeComponent { @@ -85,6 +87,9 @@ public: TextSelection selection, TextSelectType type) const override; + Reactions::ButtonParameters reactionButtonParameters( + QPoint position) const override; + bool hasHeavyPart() const override; void unloadHeavyPart() override; @@ -234,8 +239,7 @@ private: mutable ClickHandlerPtr _rightActionLink; mutable ClickHandlerPtr _fastReplyLink; mutable std::unique_ptr _viewButton; - mutable std::unique_ptr _react; - std::unique_ptr _reactions; + std::unique_ptr _reactions; mutable std::unique_ptr _comments; Ui::Text::String _rightBadge; diff --git a/Telegram/SourceFiles/history/view/history_view_reactions.cpp b/Telegram/SourceFiles/history/view/history_view_reactions.cpp index 321f18b27..adb9a55a5 100644 --- a/Telegram/SourceFiles/history/view/history_view_reactions.cpp +++ b/Telegram/SourceFiles/history/view/history_view_reactions.cpp @@ -11,8 +11,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/history_view_cursor_state.h" #include "history/history_message.h" #include "ui/chat/chat_style.h" +#include "ui/chat/message_bubble.h" #include "ui/text/text_options.h" #include "ui/text/text_utilities.h" +#include "ui/image/image_prepare.h" #include "data/data_message_reactions.h" #include "data/data_document.h" #include "data/data_document_media.h" @@ -21,20 +23,39 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_chat.h" #include "styles/palette.h" -namespace HistoryView { +namespace HistoryView::Reactions { namespace { constexpr auto kItemsPerRow = 5; +constexpr auto kToggleDuration = crl::time(80); +constexpr auto kActivateDuration = crl::time(150); +constexpr auto kInCacheIndex = 0; +constexpr auto kOutCacheIndex = 1; +constexpr auto kShadowCacheIndex = 0; +constexpr auto kEmojiCacheIndex = 1; +constexpr auto kMaskCacheIndex = 2; +constexpr auto kCacheColumsCount = 3; + +[[nodiscard]] QSize CountOuterSize() { + const auto extended = QRect( + QPoint(), + st::reactionCornerSize + ).marginsAdded(st::reactionCornerShadow); + const auto scale = Button::ScaleForState(ButtonState::Active); + return QSize( + int(base::SafeRound(extended.width() * scale)), + int(base::SafeRound(extended.height() * scale))); +} } // namespace -Reactions::Reactions(Data &&data) +InlineList::InlineList(Data &&data) : _data(std::move(data)) , _reactions(st::msgMinWidth / 2) { layout(); } -void Reactions::update(Data &&data, int availableWidth) { +void InlineList::update(Data &&data, int availableWidth) { _data = std::move(data); layout(); if (width() > 0) { @@ -42,20 +63,20 @@ void Reactions::update(Data &&data, int availableWidth) { } } -void Reactions::updateSkipBlock(int width, int height) { +void InlineList::updateSkipBlock(int width, int height) { _reactions.updateSkipBlock(width, height); } -void Reactions::removeSkipBlock() { +void InlineList::removeSkipBlock() { _reactions.removeSkipBlock(); } -void Reactions::layout() { +void InlineList::layout() { layoutReactionsText(); initDimensions(); } -void Reactions::layoutReactionsText() { +void InlineList::layoutReactionsText() { if (_data.reactions.empty()) { _reactions.clear(); return; @@ -87,18 +108,18 @@ void Reactions::layoutReactionsText() { Ui::NameTextOptions()); } -QSize Reactions::countOptimalSize() { +QSize InlineList::countOptimalSize() { return QSize(_reactions.maxWidth(), _reactions.minHeight()); } -QSize Reactions::countCurrentSize(int newWidth) { +QSize InlineList::countCurrentSize(int newWidth) { if (newWidth >= maxWidth()) { return optimalSize(); } return { newWidth, _reactions.countHeight(newWidth) }; } -void Reactions::paint( +void InlineList::paint( Painter &p, const Ui::ChatStyle *st, int outerWidth, @@ -106,8 +127,8 @@ void Reactions::paint( _reactions.draw(p, 0, 0, outerWidth); } -Reactions::Data ReactionsDataFromMessage(not_null message) { - auto result = Reactions::Data(); +InlineListData InlineListDataFromMessage(not_null message) { + auto result = InlineListData(); const auto item = message->message(); result.reactions = item->reactions(); @@ -115,111 +136,84 @@ Reactions::Data ReactionsDataFromMessage(not_null message) { return result; } -ReactButton::ReactButton( - Fn update, - Fn react, - QRect bubble) -: _update(std::move(update)) -, _handler(std::make_shared(react)) { - updateGeometry(bubble); +Button::Button( + Fn update, + ButtonParameters parameters) +: _update(std::move(update)) { + _geometry = QRect(QPoint(), CountOuterSize()); + _outbg = parameters.outbg; } -void ReactButton::updateGeometry(QRect bubble) { - const auto topLeft = bubble.topLeft() - + QPoint(bubble.width(), bubble.height()) - + QPoint(st::reactionCornerOut.x(), st::reactionCornerOut.y()) - - QPoint( - st::reactionCornerSize.width(), - st::reactionCornerSize.height()); - _geometry = QRect(topLeft, st::reactionCornerSize); - _imagePosition = _geometry.topLeft() + QPoint( - (_geometry.width() - st::reactionCornerImage) / 2, - (_geometry.height() - st::reactionCornerImage) / 2); +Button::~Button() = default; + +bool Button::outbg() const { + return _outbg; } -int ReactButton::bottomOutsideMargin(int fullHeight) const { - return _geometry.y() + _geometry.height() - fullHeight; +bool Button::isHidden() const { + return (_state == State::Hidden) && !_scaleAnimation.animating(); } -std::optional ReactButton::pointState(QPoint point) const { - if (!_geometry.contains(point)) { - return std::nullopt; +QRect Button::geometry() const { + return _geometry; +} + +void Button::applyParameters(ButtonParameters parameters) { + const auto size = _geometry.size(); + const auto geometry = QRect( + parameters.center - QPoint(size.width(), size.height()) / 2, + size); + if (_outbg != parameters.outbg) { + _outbg = parameters.outbg; + _update(_geometry); } - return PointState::Inside; -} - -std::optional ReactButton::textState( - QPoint point, - const StateRequest &request) const { - if (!_geometry.contains(point)) { - return std::nullopt; + if (_geometry != geometry) { + if (!_geometry.isNull()) { + _update(_geometry); + } + _geometry = geometry; + _update(_geometry); } - auto result = TextState(nullptr, _handler); - result.reactionArea = _geometry; - return result; + applyState(parameters.active ? State::Active : State::Shown); } -void ReactButton::paint(Painter &p, const PaintContext &context) { - const auto shown = _shownAnimation.value(_shown ? 1. : 0.); - if (shown == 0.) { +void Button::applyState(State state) { + if (_state == state) { return; } - p.setOpacity(shown); - p.setBrush(context.messageStyle()->msgBg); - p.setPen(st::shadowFg); - const auto radius = _geometry.height() / 2; - p.drawRoundedRect(_geometry, radius, radius); - if (!_image.isNull()) { - p.drawImage(_imagePosition, _image); - } - p.setOpacity(1.); + const auto duration = (state == State::Hidden + || _state == State::Hidden) + ? kToggleDuration + : kActivateDuration; + _scaleAnimation.start( + [=] { _update(_geometry); }, + ScaleForState(_state), + ScaleForState(state), + duration); + _state = state; } -void ReactButton::toggle(bool shown) { - if (_shown == shown) { - return; +float64 Button::ScaleForState(State state) { + switch (state) { + case State::Hidden: return 0.7; + case State::Shown: return 1.; + case State::Active: return 1.4; } - _shown = shown; - _shownAnimation.start(_update, _shown ? 0. : 1., _shown ? 1. : 0., 120); + Unexpected("State in ReactionButton::ScaleForState."); } -bool ReactButton::isHidden() const { - return !_shown && !_shownAnimation.animating(); +float64 Button::OpacityForScale(float64 scale) { + return (scale >= 1.) + ? 1. + : ((scale - ScaleForState(State::Hidden)) + / (ScaleForState(State::Shown) - ScaleForState(State::Hidden))); } -void ReactButton::show(not_null reaction) { - if (_media && _media->owner() == reaction->staticIcon) { - return; - } - _handler->setProperty(kReactionIdProperty, reaction->emoji); - _media = reaction->staticIcon->createMediaView(); - const auto setImage = [=](not_null image) { - const auto size = st::reactionCornerImage; - _image = Images::prepare( - image->original(), - size * style::DevicePixelRatio(), - size * style::DevicePixelRatio(), - Images::Option::Smooth | Images::Option::TransparentBackground, - size, - size); - _image.setDevicePixelRatio(style::DevicePixelRatio()); - }; - if (const auto image = _media->getStickerLarge()) { - setImage(image); - } else { - reaction->staticIcon->session().downloaderTaskFinished( - ) | rpl::map([=] { - return _media->getStickerLarge(); - }) | rpl::filter_nullptr() | rpl::take( - 1 - ) | rpl::start_with_next([=](not_null image) { - setImage(image); - _update(); - }, _downloadTaskLifetime); - } +float64 Button::currentScale() const { + return _scaleAnimation.value(ScaleForState(_state)); } -ReactionsMenu::ReactionsMenu( +Selector::Selector( QWidget *parent, const std::vector &list) : _dropdown(parent) { @@ -331,7 +325,7 @@ ReactionsMenu::ReactionsMenu( _dropdown.resizeToContent(); } -void ReactionsMenu::showAround(QRect area) { +void Selector::showAround(QRect area) { const auto parent = _dropdown.parentWidget(); const auto left = std::min( std::max(area.x() + (area.width() - _dropdown.width()) / 2, 0), @@ -345,7 +339,7 @@ void ReactionsMenu::showAround(QRect area) { _dropdown.move(left, top); } -void ReactionsMenu::toggle(bool shown, anim::type animated) { +void Selector::toggle(bool shown, anim::type animated) { if (animated == anim::type::normal) { if (shown) { using Origin = Ui::PanelAnimation::Origin; @@ -362,65 +356,351 @@ void ReactionsMenu::toggle(bool shown, anim::type animated) { } } -[[nodiscard]] rpl::producer ReactionsMenu::chosen() const { +[[nodiscard]] rpl::producer Selector::chosen() const { return _chosen.events(); } -[[nodiscard]] rpl::lifetime &ReactionsMenu::lifetime() { +[[nodiscard]] rpl::lifetime &Selector::lifetime() { return _dropdown.lifetime(); } -ReactionsMenuManager::ReactionsMenuManager(QWidget *parent) -: _parent(parent) { +Manager::Manager(QWidget *selectorParent, Fn buttonUpdate) +: _outer(CountOuterSize()) +, _inner(QRectF( + (_outer.width() - st::reactionCornerSize.width()) / 2., + (_outer.height() - st::reactionCornerSize.height()) / 2., + st::reactionCornerSize.width(), + st::reactionCornerSize.height())) +, _buttonUpdate(std::move(buttonUpdate)) +, _selectorParent(selectorParent) { + const auto ratio = style::DevicePixelRatio(); + _cacheInOut = QImage( + _outer.width() * 2 * ratio, + _outer.height() * kFramesCount * ratio, + QImage::Format_ARGB32_Premultiplied); + _cacheInOut.setDevicePixelRatio(ratio); + _cacheInOut.fill(Qt::transparent); + _cacheParts = QImage( + _outer.width() * kCacheColumsCount * ratio, + _outer.height() * kFramesCount * ratio, + QImage::Format_ARGB32_Premultiplied); + _cacheParts.setDevicePixelRatio(ratio); + _cacheParts.fill(Qt::transparent); + _shadowBuffer = QImage( + _outer * ratio, + QImage::Format_ARGB32_Premultiplied); } -ReactionsMenuManager::~ReactionsMenuManager() = default; +Manager::~Manager() = default; -void ReactionsMenuManager::showReactionsMenu( - FullMsgId context, - QRect globalReactionArea, - const std::vector &list) { - if (globalReactionArea.isEmpty()) { +void Manager::showButton(ButtonParameters parameters) { + if (_button && _buttonContext != parameters.context) { + _button->applyState(ButtonState::Hidden); + _buttonHiding.push_back(std::move(_button)); + } + _buttonContext = parameters.context; + if (!_buttonContext || _list.size() < 2) { + return; + } + if (!_button) { + _button = std::make_unique