MUSCLE

Phần mềm chụp màn hình:
MUSCLE
Các chi tiết về phần mềm:
Phiên bản: 6.82 Cập nhật
Ngày tải lên: 22 Jun 18
Nhà phát triển: Jeremy Friesner
Giấy phép: Miễn phí
Phổ biến: 26

Rating: 5.0/5 (Total Votes: 1)

MUSCLE là viết tắt của Môi trường liên kết khách hàng máy chủ đa người dùng và đó là hệ thống nhắn tin nguồn mở, miễn phí, mạnh mẽ, có thể mở rộng và đa nền tảng bao gồm các thành phần máy chủ và ứng dụng khách. Nó sẽ giúp bạn viết tất cả các loại phần mềm phân tán, từ trò chơi nhiều người chơi và ứng dụng trò chuyện IRC, đến các ứng dụng tính toán SETI.


Tính năng trong nháy mắt

Với MUSCLE, người dùng sẽ có thể dễ dàng tùy chỉnh "máy chủ cơ bắp" được bao gồm bằng cách xác định giao thức logic hoặc phiên truyền trực tuyến của riêng họ. Phần mềm này giúp bạn viết mã khách hàng của bạn bằng một trong các ngôn ngữ lập trình C ++, C, C #, Java, Delphi hoặc Python.

Chương trình sử dụng cơ bắp giống như BMessage :: Tin nhắn, hỗ trợ gửi cơ phẳng: Tin nhắn giữa các máy tính qua TCP (Transmission Control Protocol) stream, triển khai & ldquo; máy chủ cơ bắp & rdquo; trên máy chủ, cho phép bạn viết các chương trình máy khách có thể được sử dụng để giao tiếp với máy chủ.

Ngoài ra, nó bao gồm các API nhắn tin đơn và đa luồng hỗ trợ tất cả các ngôn ngữ lập trình nói trên. Máy chủ & ldquo; cơ bắp & rdquo; có thể dễ dàng tùy chỉnh bằng cách xác định giao thức truyền tin nhắn hoặc logic phiên.

Bắt đầu với MUSCLE

Sau khi đăng nhập thành công, chương trình khách hàng có thể xác định người khác được đăng nhập vào máy chủ trung tâm, cũng như lưu trữ cơ bắp :: Tin nhắn trong RAM (bộ nhớ hệ thống) và gửi cơ :: Tin nhắn cho các khách hàng khác được kết nối đến máy chủ. Xin lưu ý rằng các chương trình khách hàng có thể đăng ký dữ liệu cụ thể trên máy chủ và nhận thông báo tức thì khi dữ liệu thay đổi.


Hỗ trợ một loạt các định tuyến tin nhắn

Phần mềm này được thiết kế để hỗ trợ một loạt các định tuyến thư, bao gồm các kiểu unicast, kiểu phát sóng và kiểu đa hướng thông qua cơ chế định tuyến phù hợp với mô hình phân cấp thông minh.


Các hệ điều hành và tính khả dụng được hỗ trợ

MUSCLE chạy trên bất kỳ hệ điều hành tuân thủ POSIX nào. Nó được phân phối dưới dạng một kho lưu trữ nguồn phổ dụng duy nhất cho phép người dùng tối ưu hóa ứng dụng cho hệ thống GNU / Linux của họ. Cả hai nền tảng phần cứng 32 bit và 64 bit đều được hỗ trợ tại thời điểm này.

Tính năng mới trong bản phát hành này:

  • kiểm tra / Makefile-mt không còn cố gắng biên dịch testreflectsession trừ khi thực hiện trên một hệ điều hành mà testreflectsession hỗ trợ.
  • Đã thực hiện một số chỉnh sửa nhỏ và sắp xếp lại & quot; MUSCLE theo Ví dụ & quot; các trang.
  • Đã thay thế một số thẻ `trong MkDocs bằng [URL] (...)
  • Đã loại bỏ quyền thừa kế riêng của CountedObject khỏi tất cả các lớp có nó - bây giờ chúng bao gồm biến thành viên private CountedObject thay thế. Điều này đã được thực hiện chỉ vì tất cả những thừa kế riêng đó đã làm lộn xộn các đồ thị thừa kế DOxygen.
  • Đã thêm macro DECLARE_COUNTED_OBJECT vào CountedObject.h để có thể loại bỏ mọi bộ nhớ tiềm năng của CountedObjects trong trường hợp không muốn tính đối tượng.
  • Đã xóa hỗ trợ cho -DMUSCLE_AVOID_OBJECT_COUNTING và thêm macro -DMUSCLE_ENABLE_OBJECT_COUNTING vào vị trí của nó. (Tức là, lớp CountedObject hiện bị vô hiệu hóa theo mặc định và phải được kích hoạt một cách rõ ràng để sử dụng nó)
  • Đã thêm & quot; MUSCLE theo Ví dụ & quot; tài liệu cho MiscUtilityFunctions. {cpp, h}
  • Đã thay đổi một số `thẻ` trong nguồn MkDocs của MUSCLE-by-Example thành [url] sao cho các phương thức mà chúng đề cập có thể được xem xét nhanh chóng.
  • máy chủ / Makefile giờ đây chỉ định libmuscle.a sau tệp chính () .o.
  • Đã sửa một số cảnh báo gcc trong thư mục kiểm tra (theo đề xuất của Mika)
  • UnparseFile () không trích dẫn các từ khoá có dấu cách đúng cách. Đã sửa lỗi.
  • Đã sửa các phụ thuộc trong phần & quot; MUSCLE theo Ví dụ & quot; ví dụ 'Makefiles.

Có gì mới trong phiên bản:

  • Thêm phương thức tiện lợi ShrinkToFit () vào Hàng đợi, Hashtable, và các lớp String. Phương thức này thu nhỏ đối tượng sao cho số lượng bộ nhớ mà nó đã cấp phát nội bộ phù hợp với kích thước của dữ liệu mà nó thực sự đang nắm giữ.
  • Hashtable :: EnsureSize () và Queue :: EnsureSize () bây giờ lấy một đối số tùy chọn (allowShrink), (nếu được đặt thành true) cho phép mảng được phân bổ nội bộ của đối tượng được phân bổ lại nhỏ hơn nếu nó lớn hơn cần thiết.
  • Đã sửa đổi hành vi mở rộng bộ đệm của lớp Chuỗi để hiệu quả hơn một chút.
  • Đã thêm một bảo vệ chống lại một đệ quy vô hạn tiềm ẩn có thể xảy ra trong khi đăng nhập & quot; OUT OF MEMORY & quot; lỗi sau khi lỗi phân bổ bộ nhớ, nếu một LogCallback cố gắng cấp phát bộ nhớ.

Tính năng mới trong phiên bản 6.01:

  • Đã thêm phương thức tiện lợi PrependWord () vào lớp Chuỗi.
  • Đã thêm WithReplacements () các phương thức tiện lợi vào lớp Chuỗi.
  • Đã thêm phương thức SetExplicitDelayMicros () vào lớp DetectNetworkConfigChangesSession.
  • Đã thêm phương thức IsCopperDetected () vào lớp NetworkInterfaceInfo, để mã đó có thể cho biết đầu cắm Ethernet có cáp cắm vào nó hay không.
  • Đã thêm dấu & quot; quietsend & quot; đối số cho hexterm.
  • Phương thức ảo NetworkInterfacesChanged () trong lớp DetectNetworkConfigChangesSession đã được thay đổi để đưa ra một đối số gọi ra các giao diện mạng cụ thể đã thay đổi. Chức năng này hiện chỉ được triển khai dưới Linux, MacOS / X và Windows. Đối với các hệ điều hành khác, đối số sẽ luôn là một danh sách trống.
  • Đã sửa lỗi trong việc triển khai Linux DetectNetworkConfigChangesSession có thể gây ra lỗi phân đoạn nếu recvmsg () trả lại lỗi (ví dụ: do tín hiệu được nhận).

Tính năng mới trong phiên bản 6.00:

  • Viết lại lớp SSLSocketDataIO để làm việc tốt hơn với I / O không chặn (kết hợp với lớp SSLSocketAdapterGateway mới).
  • Đã thêm các triển khai của SSLSocketDataIO :: SetPrivateKey () và SSLSocketDataIO :: SetCertificate () lấy ByteBuffer làm đối số.
  • Đã thêm lớp SSLSocketAdapterGateway được sử dụng để quản lý máy trạng thái nội bộ của OpenSSL khi sử dụng lớp SSLSocketDataIO với cổng của bạn.
  • Thêm các phương thức SetSSLPrivateKey () và GetSSLPrivateKey () vào lớp ReflectServer, để dễ dàng cho phép xác thực SSL trên tất cả các kết nối TCP đến. Các phương thức này có sẵn là iff MUSCLE_ENABLE_SSL được định nghĩa.
  • Thêm phương thức SetSSLPublicKeyCertificate () và GetSSLPublicKeyCertificate () vào lớp ReflectServer, để dễ dàng bật xác thực SSL trên các kết nối TCP gửi đi. Các phương thức này có sẵn là iff MUSCLE_ENABLE_SSL được định nghĩa.
  • Thêm phương thức SetSSLPrivateKey () và SetSSLPublicKeyCertificate () vào lớp MessageTransceiverThread, để dễ dàng bật chức năng SSL khi sử dụng I / O luồng.
  • Đã thêm một thư mục ssl_data với một số thông tin về việc tạo các khóa công khai / riêng tư OpenSSL và một cặp khóa ví dụ để sử dụng trong kiểm tra OpenSSL.
  • Khi MUSCLE_ENABLE_SSL được định nghĩa, giờ đây, cơ chế chấp nhận đối số 'privatekey = filename' tùy chọn. Khi được chỉ định, chế độ SSL sẽ được bật và được quản lý sẽ chỉ chấp nhận các kết nối TCP đến hiện tại các khóa công khai khớp với khóa / chứng chỉ riêng này.
  • Khi định nghĩa MUSCLE_ENABLE_SSL, portablereflectclient và qt_example giờ đây sẽ chấp nhận đối số 'publickey = filename' tùy chọn. Khi được chỉ định, chế độ SSL sẽ được bật và những khách hàng này sẽ kết nối với cơ bắp bằng cách sử dụng OpenSSL và hiển thị tệp này làm thông tin đăng nhập của họ.
  • Đã thêm & quot; Animate & quot; hộp kiểm đến bản demo qt_example. Kiểm tra nó làm cho cửa sổ di chuyển chỉ báo của nó xung quanh tự động. Điều này rất thú vị và cũng hữu ích nếu bạn muốn thử nghiệm một kịch bản trong đó nhiều khách hàng đang tạo lưu lượng truy cập cùng một lúc.
  • Đã tạo bản trình diễn qt_example đẹp hơn.
  • Đã đổi tên các macro trợ giúp C ++ 11 trong Hashtable.h và Queue.h để làm cho chúng ít có khả năng va chạm với các macro của các gói khác. * Sửa một số lỗi nhỏ trong lớp SSLSocketDataIO. o Đổi tên SSLSocketDataIO :: SetKey () thành SetPrivateKey (). o Đổi tên SSLSocketDataIO :: SetCertificate () thành SetPublicKeyCertificate (). o AbstractMessageIOGateway :: SetDataIO () bây giờ là một phương thức ảo.

Tính năng mới trong phiên bản 5.92:

  • Đã cải thiện hỗ trợ cho các thuật ngữ di chuyển C ++ 11 trong các lớp Queue và Hashtable (chỉ được bật khi -DMUSCLE_USE_CPLUSPLUS11 được xác định)
  • Đã thêm một số công cụ vào lớp Chuỗi để tôi có thể xem số lần đối tượng Chuỗi được sao chép, di chuyển, v.v. (chỉ được bật khi -DMUSCLE_COUNT_STRING_COPY_OPERATIONS được xác định)
  • Đã thêm hàm PrintAndClearStringCopyCounts () sẽ in ra dữ liệu Chuỗi hoạt động được thu thập ở trên.
  • Đã thêm một số phép thuật SFINAE vào hàm MuscleSwap () để nó hoán đổi bằng cách gọi SwapContents () khi có thể, thay vì bằng cách sao chép vào một đối tượng tạm thời.
  • Đã thêm một hàm tạo danh sách khởi tạo và quá tải của AddTailMulti () vào lớp Queue (chỉ có sẵn khi -DMUSCLE_USE_CPLUSPLUS11 được định nghĩa, tất nhiên)
  • Đã đổi tên hàng đợi và quá tải mảng của Hàng đợi :: AddTail () thành AddTailMulti (), để tránh xung đột với hỗ trợ phân tích mẫu C ++ 11 mới.
  • Đã đổi tên hàng đợi và quá tải mảng của Hàng đợi :: AddHead () thành AddHeadMulti (), để tránh xung đột với hỗ trợ phân tích mẫu C ++ 11 mới.
  • Macro MCRASH_IMPL được thay thế bằng một cuộc gọi để xác nhận (sai).
  • Một chút tinh chỉnh tương thích với Android.
  • Nhiều chương trình trong thư mục kiểm tra không được biên dịch theo C ++ 11. Đã sửa lỗi.
  • Đã sửa một số lỗi tiềm ẩn đã được công cụ phân tích tĩnh của công cụ tìm kiếm phát hiện.

Tính năng mới trong phiên bản 5.91:

  • Đã thêm phương thức tiện lợi EnsureCanPut () vào lớp Hashtable.
  • Đã thêm phương thức tiện lợi EnsureCanAdd () vào lớp Hàng đợi.
  • Đã thay đổi DoMutexAtomicIncrement () thành hàm nội tuyến để gọi hàm đó hiệu quả hơn.
  • Đã thay đổi QMessageTransceiverThread và QAcceptSocketsThread để gọi QCoreApplication :: postEvent () thay vì QApplication :: postEvent (), để cho phép các ứng dụng Qt không GUI.
  • Đã cập nhật tài liệu Hướng dẫn cho Người mới tham gia để phản ánh hỗ trợ UDP được cải thiện của MUSCLE.
  • Đã hợp nhất trong một số thay đổi tương thích với Android do Jean-FranA§ois Mullet cung cấp.
  • Sử dụng cờ biên dịch MUSCLE_USE_MUTEXES_FOR_ATOMIC_OPERATIONS sẽ khiến MUSCLE gặp sự cố khi khởi động do sự cố đơn đặt hàng của hoạt động. Điều này đã được khắc phục ngay bây giờ.
  • Cờ biên dịch MUSCLE_USE_MUTEXES_FOR_ATOMIC_OPERATIONS trước đây chỉ được sử dụng nếu không có triển khai AtomicCounter nào khác. Bây giờ cờ có ưu tiên cao hơn, do đó, đặt cờ có nghĩa là Mutexes sẽ được sử dụng, ngay cả khi có cơ chế khác (hiệu quả hơn).

Tính năng mới trong phiên bản 5.90:

  • Đã thêm phương thức GetPacketMaximumSize () vào lớp DataIO để cho phép mã cổng thông minh xử lý giao tiếp được gói tin theo kiểu UDP thông minh.
  • MessageIOGateway hiện hoạt động hữu ích cùng với UDPSocketDataIO.
  • Đã thêm chức năng tạo khuôn mẫu CreateObjectFromArchiveMessage () vào Message.h, để phục vụ như một đối tác khôi phục phía đối với GetArchiveMessageFromPool (), v.v.
  • AtomicCounter :: AtomicIncrement () bây giờ trả về một boolean (true iff giá trị bộ đếm mới bằng một).
  • Đã sửa đổi lớp HashtableIterator sao cho các phép lặp Hashtable chỉ đọc bây giờ là an toàn thread ngay cả khi cờ HTIT_FLAG_NOREGISTER không được chỉ định.
  • Đã thêm lớp muscle_thread_id vào SetupSystem.h, để thể hiện đúng ID chuỗi trong thời trang trung thực thực hiện.
  • Đã thêm & quot; bế tắc & quot; chương trình vào thư mục kiểm tra. Chương trình này cố ý mạo hiểm tạo ra bế tắc, như một cách để tập thể dục / thể hiện kiểm tra deadlockfinder.
  • Đã thêm hỗ trợ cho cờ dòng lệnh -DMUSCLE_AVOID_THREAD_SAFE_HASHTABLE_ITERATORS, cho những người muốn tránh chi phí an toàn chủ đề tự động và hứa cung cấp HTIT_FLAG_NOREGISTER đối số bằng tay khi cần thiết.
  • Đã thêm bộ nhớ cache tra cứu LRU tùy chọn vào hàm GetHostByName (), để nó có thể trở lại nhanh hơn khi cùng một tên máy chủ được giải quyết lặp đi lặp lại.
  • Đã thêm một hàm SetHostNameCacheSettings () cho phép và điều chỉnh bộ nhớ cache tra cứu LRU trong GetHostByName ().
  • Đã thêm hỗ trợ cho & quot; dnscache & quot; và & quot; dnscachesize & quot; đối số dòng lệnh trong HandleStandardDaemonArgs (), để cho phép đặc tả dòng lệnh của hành vi của bộ nhớ cache tra cứu LRU.
  • Đã sửa đổi lớp Hashtable sao cho các giá trị thành viên _iterHead, _iterTail và _freeHead giờ là uint32 thay vì con trỏ, để giảm mức sử dụng bộ nhớ.
  • Đã xóa phương thức ThreadLocalStorage :: SetFreeHeldObjectsOnExit () và thêm đối số boolean vào hàm tạo của nó thay vì pthreads không cho phép bạn thay đổi cài đặt đó sau khi pthread_key_create () đã được gọi.
  • Đã di chuyển GetCurrentThreadID () vào lớp body_thread_id dưới dạng hàm thành viên tĩnh và thay đổi nó để trả về đối tượng muscle_thread_id thay vì unsigned long.
  • Đã thay đổi tên máy chủ mặc định cho các phiên không có địa chỉ IP đã biết từ & quot; & quot; vào & quot; _unknown_ & quot ;, vì các dấu ngoặc nhọn trong chuỗi trước có ý nghĩa đặc biệt với bản phát hành 5.84 và có thể ảnh hưởng đến kết hợp đường dẫn nút theo các cách không mong muốn.
  • Các phương thức CalculateChecksum () trong Message.cpp đã được sửa đổi để mạnh mẽ hơn trong việc phát hiện sự khác biệt về chuyển vị dữ liệu.
  • Đã xóa hỗ trợ MUSCLE_USE_QT_FOR_ATOMIC_OPERATIONS khỏi AtomicCounter.h, vì lớp QAtomicInt của Qt không hỗ trợ chức năng mà giá trị trả về mới của phương thức AtomicIncrement () yêu cầu.
  • Đã xóa MessageIOGateway :: FlattenMessage () và MessageIOGateway :: UnflattenMessage (). Thêm vào vị trí của họ: MessageIOGateway :: FlattenHeaderAndMessage () và MessageIOGateway :: UnflattenHeaderAndMessage (). Các phương thức mới này xử lý cả byte tiêu đề và nội dung Thư cùng một lúc.
  • Đã thêm tệp udpproxy.vcproj vào thư mục kiểm tra, để giúp biên dịch udpproxy trong Windows.
  • Thông báo: Flatten () hiện lặp lại trên các trường trong Tin nhắn một lần, thay vì hai lần.
  • GetCurrentThreadID () bây giờ là một hàm nội tuyến, vì nó bây giờ có thể được gọi thường xuyên bởi HashtableIterator.
  • Đã sửa đổi mã deadlockfinder để sử dụng Hàng đợi thay vì Hashtables, vì không thể sử dụng muscle_thread_id làm loại khóa Hashtable nữa.
  • Đã sửa lỗi testudp.cpp để sử dụng đúng MessageIOGateway cho giao tiếp UDP của nó.
  • Tinh chỉnh ifdef trong FilePathInfo.cpp thêm một chút để statInfo.st_birthtimespec sẽ không được truy cập khi sử dụng MacOS / X SDK không cung cấp.
  • MessageDataIOGateway không còn cố gắng Unflatten một Tin nhắn từ một bộ đệm dữ liệu zlib-deflated mà nó đã không thể re-inflate.
  • Đã khắc phục lỗi trong SendDataUDP () có thể khiến SendDataUDP () trả về lỗi không chính xác khi gửi đến địa chỉ phát đa hướng bằng chế độ không chặn và bộ đệm đầu ra đã đầy.

Tính năng mới trong phiên bản 5.85:

  • Thêm LogTime (MUSCLE_LOG_DEBUG) gọi tới tất cả các đường dẫn lỗi trong MessageIOGateway :: DoInputImplementation () và Message :: Unflatten (), để dễ dàng xác định khi kết nối TCP bị hủy bỏ do dữ liệu tham nhũng.
  • Đã thêm hàm PreviousOperationHadTransientFailure (), trả về true iff errno là EINTR hoặc ENOBUFS.
  • Chỉ định spamspersecond = -1 giờ đây sẽ khiến hexterm gửi dữ liệu spam nhanh nhất có thể.
  • Việc thực hiện MUSCLE_USE_POLL của SocketMultiplexer.h đã cung cấp POLLERR cho WSAPoll () nhưng WSAPoll () không hỗ trợ POLLERR để WSAPoll () sẽ trả về lỗi khi điều này xảy ra. Đã giải quyết vấn đề bằng cách lọc ra POLLERR khi biên dịch trong Windows.
  • Đã khắc phục lỗi khi gửi () trả về ENOBUFS có thể khiến kết nối socket bị chấm dứt, mặc dù ENOBUFS không phải là một điều kiện chết người.
  • SocketMultiplexer.cpp sẽ không biên dịch khi MUSCLE_USE_POLL được xác định. Đã sửa lỗi.
  • Phương thức ZLibCodec :: Deflate () sẽ không nén tất cả dữ liệu trong bộ đệm rất lớn (ví dụ: trên 42MB). Đã sửa lỗi.

Tính năng mới trong phiên bản 5.84:

  • Cú pháp phạm vi số của lớp StringMatcher đã được mở rộng để bạn có thể chỉ định nhiều phạm vi. Ví dụ: & quot; & quot; sẽ khớp các chuỗi & quot; 19 & quot ;, & quot; 20 & quot ;, & quot; 21 & quot ;, & quot; 25 & quot ;, & quot; 30 & quot ;, & quot; 31 & quot ;, [...] và & quot; 50 & quot;.
  • Thêm hàm chuyển đổi GetCurrentTime64ForRunTime64 () và GetRunTime64ForCurrenTime64 () vào TimeUtilityFunctions.h.
  • Đã thêm phương thức tiện ích GetDescendant () vào lớp DataNode.
  • Đã thêm các toán tử di chuyển C ++ 11 và các toán tử chuyển-gán vào các lớp Hashtable, Queue, String, Message và ByteBuffer. Để tương thích ngược với các trình biên dịch cũ hơn, mã này sẽ chỉ được biên dịch nếu -DMUSCLE_USE_CPLUSPLUS11 được chỉ định trên dòng biên dịch.
  • Lớp SharedMemory giờ đây sẽ tự nerf vào lớp không chia sẻ bộ nhớ nếu -DMUSCLE_FAKE_SHARED_MEMORY được chỉ định.
  • Đã thêm thử nghiệm testfilepathinfo vào thư mục kiểm tra.
  • Đã cập nhật tất cả các tiêu đề thông báo bản quyền để đọc 2000-2013 Meyer Sound.
  • Đã thêm dấu cách giữa các mã thông báo macro (ví dụ: UINT32_FORMAT_SPEC) và hằng số chuỗi (ví dụ: & quot; Xin chào & quot;) để làm cho trình biên dịch C ++ 11 trở nên vui vẻ.
  • ByteBuffer.cpp có lỗi cú pháp để ngăn nó biên dịch trên các máy chủ lớn. Đã sửa lỗi.
  • Chỉ dành cho MacOS / X: Đã thay thế các cuộc gọi chức năng Carbon không được chấp nhận bằng các tương đương Mach, để tránh cảnh báo không dùng nữa trong 10.8.x.

Tính năng mới trong phiên bản 5.83:

  • Thêm các phiên bản tiện lợi của InflateByteBuffer () và DeflateByteBuffer () lấy một ByteBufferRef làm đối số.
  • Đã xóa một số phương thức cũ / không sử dụng (EnsureBufferSize () và FreeLargeBuffer ()) từ lớp AbstractMessageIOGateway.
  • Đã sửa một số lỗi chính tả trong các nhận xét trong thư mục con delphi.
  • Lớp Hashtable không còn tạo cảnh báo khi được biên dịch theo MSVC với -DMUSCLE_AVOID_MINIMIZED_HASHTABLES được xác định.
  • Đã sửa lỗi trong IPAddressAndPort :: ToString () khiến cho chuỗi địa chỉ IPv4 được định dạng không rõ ràng khi (preferIPv4Style) được đặt thành false.

Phần mềm tương tự

DB2
DB2

19 Feb 15

groonga
groonga

17 Feb 15

Phần mềm khác của nhà phát triển Jeremy Friesner

AudioMove
AudioMove

2 Jun 15

Ý kiến ​​để MUSCLE

Bình luận không
Nhập bình luận
Bật hình ảnh!