Commit 7cc9176d4aab97e371e58cd353961810b2c428c4
猝死的边缘疯狂试探
Too many changes.
To preserve performance only 100 of 254 files are displayed.
| ... | ... | @@ -20,6 +20,7 @@ |
| 20 | 20 | /*#endif*/ |
| 21 | 21 | import config from '@/common/config/config.js' |
| 22 | 22 | import service from '@/service/service.js' |
| 23 | + import API from '@/apis/index.js' | |
| 23 | 24 | export default { |
| 24 | 25 | onLaunch() { |
| 25 | 26 | // 检测客户端更新 |
| ... | ... | @@ -70,6 +71,13 @@ |
| 70 | 71 | methods: { |
| 71 | 72 | handleOnMessage(msg) { |
| 72 | 73 | let user = this.$store.state.user; |
| 74 | + if(msg.method == 'initMessage'){ | |
| 75 | + // this.setTabBarBadge(msg.unreadMessageCount); | |
| 76 | + } | |
| 77 | + if(msg.messageType == 'messageRead' || msg.messageType == 'text'){ | |
| 78 | + getApp().globalData.updateUnReadMessageCount(); | |
| 79 | + } | |
| 80 | + | |
| 73 | 81 | if (msg.messageType == 'joinRoom' && msg.intToUserId == user.id && user.user_type.length) { |
| 74 | 82 | console.log('joinRoom', msg); |
| 75 | 83 | uni.showModal({ |
| ... | ... | @@ -160,18 +168,34 @@ |
| 160 | 168 | }); |
| 161 | 169 | uni.$on('closeSocket', () => { |
| 162 | 170 | this.globalData.socketTask.close(); |
| 163 | - }) | |
| 171 | + }); | |
| 164 | 172 | uni.$on('openSocket', () => { |
| 165 | 173 | this.globalData.socketTask.onMessage((msg) => { |
| 166 | 174 | console.log('openSocket.onMessage', msg); |
| 167 | - | |
| 168 | 175 | }); |
| 169 | - }) | |
| 176 | + }); | |
| 177 | + this.globalData.updateUnReadMessageCount(); | |
| 170 | 178 | }, |
| 171 | 179 | }, |
| 172 | 180 | globalData: { |
| 173 | 181 | typeNum: 1, |
| 174 | - socketTask: {} | |
| 182 | + socketTask: {}, | |
| 183 | + updateUnReadMessageCount(){ | |
| 184 | + API.message.getUserUnReadMessageCount().then(res=>{ | |
| 185 | + console.log('getUserUnReadMessageCount',res); | |
| 186 | + let badgeNum = res.data; | |
| 187 | + if(badgeNum>0){ | |
| 188 | + uni.setTabBarBadge({ | |
| 189 | + index: 1, | |
| 190 | + text: badgeNum > 99 ? '99+' : badgeNum.toString() | |
| 191 | + }); | |
| 192 | + }else{ | |
| 193 | + uni.removeTabBarBadge({ | |
| 194 | + index: 1, | |
| 195 | + }); | |
| 196 | + } | |
| 197 | + }) | |
| 198 | + } | |
| 175 | 199 | } |
| 176 | 200 | }; |
| 177 | 201 | </script> | ... | ... |
| ... | ... | @@ -28,6 +28,10 @@ export default { |
| 28 | 28 | getMessageList(sendUserId,receviveUserId){ |
| 29 | 29 | return request.get(`/message/getMessageList/${sendUserId}/${receviveUserId}`) |
| 30 | 30 | }, |
| 31 | + //未读消息条数 | |
| 32 | + getUserUnReadMessageCount(){ | |
| 33 | + return request.get(`/message/userUnReadMessageCount`); | |
| 34 | + }, | |
| 31 | 35 | |
| 32 | 36 | |
| 33 | 37 | } |
| 34 | 38 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -12,6 +12,7 @@ |
| 12 | 12 | * @ 相关文档 https://doc.fastadmin.net/wanlshop/265.html |
| 13 | 13 | */ |
| 14 | 14 | export default { |
| 15 | + baseurl_chaoge:'https://huajiao.t1j2.com', | |
| 15 | 16 | appurl_chaoge: 'https://huajiao.t1j2.com/api', |
| 16 | 17 | socketurl: 'wss://huajiao.t1j2.com/api/message/websocket', //如果是ws:// 地址为ws://你服务器IP:7272 如 ws://123.4.56.78:7272,使用wss 后面不需要添加 :7272 端口 |
| 17 | 18 | cdnurl: 'http://app.xn--43vp3ce98aj8m.com', | ... | ... |
| ... | ... | @@ -6,25 +6,34 @@ |
| 6 | 6 | <view class="content-box-loading" v-if="!loading"> |
| 7 | 7 | <u-loading mode="flower"></u-loading> |
| 8 | 8 | </view> |
| 9 | + <view class="invite-btn" @click="handleInviteServieUser"> | |
| 10 | + 邀请客服参与 | |
| 11 | + </view> | |
| 9 | 12 | <view class="message" v-for="(item, index) in messageList" :key="index" :id="`msg-${item.id}`"> |
| 10 | 13 | <view class="message-item " :class="item.isItMe ? 'right' : 'left'"> |
| 11 | 14 | <image class="img" :src="item.fromUserHeadImg"> |
| 12 | 15 | </image> |
| 13 | 16 | <text class="username">{{item.roleName}}</text> |
| 14 | - <text class="read-status" :style="{color:item.state?'#999':'#333'}" v-if="item.userId == myMd5Id">{{ item.state?'已读':'未读' }}</text> | |
| 17 | + <text class="read-status" :style="{color:item.state?'#999':'#333'}" | |
| 18 | + v-if="item.userId == myMd5Id">{{ item.state?'已读':'未读' }}</text> | |
| 15 | 19 | <!-- contentType = 1 文本 --> |
| 16 | - <view class="content" v-if="item.contentType == 'text'">{{ item.content }}</view> | |
| 20 | + <view class="content" v-if="item.contentType == 'text'"> | |
| 21 | + <block v-for="(msg,index) in item.content"> | |
| 22 | + <text v-if="msg.type == 'text'">{{ msg.content }}</text> | |
| 23 | + <image v-if="msg.type == 'emjio'" :src="msg.content" style="width:50rpx;height:50rpx"></image> | |
| 24 | + </block> | |
| 25 | + </view> | |
| 17 | 26 | <!-- contentType = 2 语音 --> |
| 18 | 27 | <view class="content contentType2" :class="[{ 'content-type-right': item.isItMe }]" |
| 19 | - v-if="item.contentType == 2" @tap="handleAudio(item)" hover-class="contentType2-hover-class" | |
| 20 | - :style="{width:`${130+(item.contentDuration*2)}rpx`}"> | |
| 28 | + v-if="item.contentType == 'voice'" @tap="handleAudio(item)" hover-class="contentType2-hover-class" | |
| 29 | + :style="{width:`${130+(item.length*2)}rpx`}"> | |
| 21 | 30 | <view class="voice_icon" :class="[ |
| 22 | 31 | { voice_icon_right: item.isItMe }, |
| 23 | 32 | { voice_icon_left: !item.isItMe }, |
| 24 | 33 | { voice_icon_right_an: item.anmitionPlay && item.isItMe }, |
| 25 | 34 | { voice_icon_left_an: item.anmitionPlay && !item.isItMe } |
| 26 | 35 | ]"></view> |
| 27 | - <view class="">{{ item.contentDuration }}''</view> | |
| 36 | + <view class="">{{ item.content.length }}''</view> | |
| 28 | 37 | </view> |
| 29 | 38 | <!-- contentType = 3 图片 --> |
| 30 | 39 | <view class="content contentType3" v-if="item.contentType == 3" @tap="viewImg([item.content])"> |
| ... | ... | @@ -43,6 +52,8 @@ |
| 43 | 52 | <image v-if="chatType === 'keyboard'" class="icon_img" :src="require('@/static/keyboard.png')" |
| 44 | 53 | @click="switchChatType('voice')"></image> |
| 45 | 54 | <!-- #endif --> |
| 55 | + <image class="icon_img" :src="require('@/static/face.png')" | |
| 56 | + @click="switchFun('emj')"></image> | |
| 46 | 57 | <view class="input-box-flex-grow"> |
| 47 | 58 | <input v-if="chatType === 'voice'" type="text" class="content" id="input" v-model="formData.content" |
| 48 | 59 | :hold-keyboard="true" :confirm-type="'send'" :confirm-hold="true" |
| ... | ... | @@ -54,15 +65,11 @@ |
| 54 | 65 | {{ voiceTitle }} |
| 55 | 66 | </view> |
| 56 | 67 | </view> |
| 57 | - | |
| 58 | 68 | <!-- 功能性按钮 --> |
| 59 | - <image class=" icon_btn_add" :src="require('@/static/add.png')" @tap="switchFun"></image> | |
| 69 | + <!-- <image class=" icon_btn_add" :src="require('@/static/add.png')" @tap="switchFun"></image> --> | |
| 60 | 70 | |
| 61 | - <!-- #ifdef H5 --> | |
| 62 | - <button class="btn" type="primary" size="mini" @touchend.prevent="sendMsg(null)">发送</button> | |
| 63 | - <!-- #endif --> | |
| 71 | + <button class="btn" type="primary" size="mini" @touchend.prevent="sendMsg(null)" v-if="showEmoji">发送</button> | |
| 64 | 72 | </view> |
| 65 | - | |
| 66 | 73 | <view class="fun-box" :class="{'show-fun-box':showFunBtn}"> |
| 67 | 74 | <u-grid :col="4" hover-class="contentType2-hover-class" :border="false" @click="clickGrid"> |
| 68 | 75 | <u-grid-item v-for="(item, index) in funList" :index="index" :key="index" bg-color="#eaeaea"> |
| ... | ... | @@ -71,6 +78,15 @@ |
| 71 | 78 | </u-grid-item> |
| 72 | 79 | </u-grid> |
| 73 | 80 | </view> |
| 81 | + <view class="popup-layer u-border-top" @touchmove.stop.prevent="discard" v-show="showEmoji"> | |
| 82 | + <swiper class="emoji-swiper" indicator-dots="true" duration="150" > | |
| 83 | + <swiper-item v-for="(page,pid) in emojiTree" :key="pid"> | |
| 84 | + <view v-for="(em,eid) in page" :key="eid" @click="addEmoji(em)" class="emoji-item"> | |
| 85 | + <image mode="widthFix" :src="getEmojiUrl(em.url)" class="emoji-item-img"></image> | |
| 86 | + </view> | |
| 87 | + </swiper-item> | |
| 88 | + </swiper> | |
| 89 | + </view> | |
| 74 | 90 | |
| 75 | 91 | </view> |
| 76 | 92 | |
| ... | ... | @@ -94,9 +110,12 @@ |
| 94 | 110 | import { |
| 95 | 111 | mapState |
| 96 | 112 | } from 'vuex'; |
| 113 | + import emojiMixin from '@/pages/chat/emojiMixin.js' | |
| 97 | 114 | import service from '@/service/service.js' |
| 115 | + import config from '@/common/config/config.js'; | |
| 98 | 116 | let socketTask = getApp().globalData.socketTask; |
| 99 | 117 | export default { |
| 118 | + mixins:[emojiMixin], | |
| 100 | 119 | data() { |
| 101 | 120 | return { |
| 102 | 121 | intId: 0, |
| ... | ... | @@ -175,6 +194,19 @@ |
| 175 | 194 | ...mapState(['user', 'statistics', 'common']), |
| 176 | 195 | }, |
| 177 | 196 | methods: { |
| 197 | + handleInviteServieUser(){ | |
| 198 | + let that=this; | |
| 199 | + uni.showModal({ | |
| 200 | + content:'是否确认跳转到多人聊天?', | |
| 201 | + success({confirm}) { | |
| 202 | + if(confirm){ | |
| 203 | + uni.redirectTo({ | |
| 204 | + url:`/pages/meeting/meeting?userid=${that.intId}&username=${that.fromUserInfo.fromUserName}` | |
| 205 | + }) | |
| 206 | + } | |
| 207 | + } | |
| 208 | + }) | |
| 209 | + }, | |
| 178 | 210 | addMessage(data) { |
| 179 | 211 | this.messageList.push(data); |
| 180 | 212 | }, |
| ... | ... | @@ -186,30 +218,40 @@ |
| 186 | 218 | return; |
| 187 | 219 | } |
| 188 | 220 | this.API.message.getMessageList(this.md5Id, this.myMd5Id).then(res => { |
| 189 | - console.log('getMessageList',res) | |
| 221 | + console.log('getMessageList', res) | |
| 190 | 222 | this.messageList = res.data.list.map(t => { |
| 191 | 223 | t.isItMe = t.sendUserId == this.myMd5Id; |
| 192 | 224 | if (t.sendUserId == this.md5Id) { |
| 193 | 225 | t.fromUserHeadImg = this.fromUserInfo.fromUserHeadImg || |
| 194 | 226 | '/static/head/head1.png' |
| 195 | - t.roleName = this.fromUserInfo.user_type && this.fromUserInfo.user_type.includes(1)?'供方':'需方'; | |
| 227 | + t.roleName = this.fromUserInfo.user_type && this.fromUserInfo.user_type | |
| 228 | + .includes(1) ? '供方' : '需方'; | |
| 196 | 229 | } else { |
| 197 | 230 | t.fromUserHeadImg = this.user.avatar || '/static/head/head2.png'; |
| 198 | - t.roleName = this.user.user_type && this.user.user_type.includes(1)?'供方':'需方'; | |
| 231 | + t.roleName = this.user.user_type && this.user.user_type.includes(1) ? '供方' : | |
| 232 | + '需方'; | |
| 199 | 233 | } |
| 200 | 234 | t.userId = t.sendUserId; |
| 235 | + if(t.contentType == 'text'){ | |
| 236 | + t.content = this.replaceEmoji(t.content) | |
| 237 | + } | |
| 238 | + if(t.contentType == 'voice'){ | |
| 239 | + t.content = JSON.parse(t.content) | |
| 240 | + } | |
| 201 | 241 | return t; |
| 202 | 242 | }); |
| 203 | 243 | this.updateReadMessage(); |
| 204 | 244 | }) |
| 205 | 245 | }, |
| 206 | - updateReadMessage(){ | |
| 246 | + updateReadMessage() { | |
| 247 | + let params = JSON.stringify({ | |
| 248 | + method: 'UpdateReadMessage', | |
| 249 | + formUserId: this.md5Id, | |
| 250 | + token: service.getTokenChaoge() | |
| 251 | + }); | |
| 252 | + console.log('updateReadMessage', params); | |
| 207 | 253 | socketTask.send({ |
| 208 | - data: JSON.stringify({ | |
| 209 | - method: 'UpdateReadMessage', | |
| 210 | - fromUserId: this.md5Id, | |
| 211 | - token: service.getTokenChaoge() | |
| 212 | - }), | |
| 254 | + data: params, | |
| 213 | 255 | success() { |
| 214 | 256 | console.log('UpdateReadMessage success'); |
| 215 | 257 | } |
| ... | ... | @@ -244,12 +286,18 @@ |
| 244 | 286 | switchChatType(type) { |
| 245 | 287 | this.chatType = type; |
| 246 | 288 | this.showFunBtn = false; |
| 289 | + this.showEmoji = false; | |
| 247 | 290 | }, |
| 248 | 291 | //切换功能性按钮 |
| 249 | - switchFun() { | |
| 250 | - this.chatType = 'keyboard' | |
| 251 | - this.showFunBtn = !this.showFunBtn; | |
| 252 | - uni.hideKeyboard() | |
| 292 | + switchFun(type) { | |
| 293 | + // this.showFunBtn = !this.showFunBtn; | |
| 294 | + | |
| 295 | + console.log('switchFun',type); | |
| 296 | + if(type == 'emj'){ | |
| 297 | + this.chatType = 'voice'; | |
| 298 | + uni.hideKeyboard(); | |
| 299 | + this.showEmoji = true; | |
| 300 | + } | |
| 253 | 301 | }, |
| 254 | 302 | //发送消息 |
| 255 | 303 | sendMsg(data) { |
| ... | ... | @@ -264,10 +312,9 @@ |
| 264 | 312 | if (data) { |
| 265 | 313 | if (data.contentType == 'voice') { |
| 266 | 314 | //说明是发送语音 |
| 267 | - params.content = data.content; | |
| 315 | + params.messageContent = data.messageContent; | |
| 316 | + params.length = data.length; | |
| 268 | 317 | params.messageType = 'voice'; |
| 269 | - params.contentDuration = data.contentDuration; | |
| 270 | - params.anmitionPlay = false; | |
| 271 | 318 | } else if (data.contentType == 'image') { |
| 272 | 319 | //发送图片 |
| 273 | 320 | params.content = data.content; |
| ... | ... | @@ -277,7 +324,7 @@ |
| 277 | 324 | //验证输入框书否为空字符传 |
| 278 | 325 | return; |
| 279 | 326 | } |
| 280 | - console.log(params); | |
| 327 | + console.log(JSON.stringify(params)); | |
| 281 | 328 | socketTask.send({ |
| 282 | 329 | data: JSON.stringify(params), |
| 283 | 330 | success(res) { |
| ... | ... | @@ -316,6 +363,7 @@ |
| 316 | 363 | if (this.showFunBtn) { |
| 317 | 364 | this.showFunBtn = false; |
| 318 | 365 | } |
| 366 | + this.showEmoji = false; | |
| 319 | 367 | |
| 320 | 368 | // #ifdef MP-WEIXIN |
| 321 | 369 | if (params.contentType == 1) { |
| ... | ... | @@ -331,6 +379,7 @@ |
| 331 | 379 | //用户触摸屏幕的时候隐藏键盘 |
| 332 | 380 | touchstart() { |
| 333 | 381 | uni.hideKeyboard(); |
| 382 | + this.showEmoji = false; | |
| 334 | 383 | }, |
| 335 | 384 | // userid 用户id |
| 336 | 385 | linkToBusinessCard(userId) { |
| ... | ... | @@ -399,6 +448,7 @@ |
| 399 | 448 | tempFilePath, |
| 400 | 449 | duration |
| 401 | 450 | }) { |
| 451 | + let that=this; | |
| 402 | 452 | let contentDuration; |
| 403 | 453 | // #ifdef MP-WEIXIN |
| 404 | 454 | this.voiceTime = 0; |
| ... | ... | @@ -425,21 +475,36 @@ |
| 425 | 475 | // #endif |
| 426 | 476 | |
| 427 | 477 | this.recording = false; |
| 428 | - const params = { | |
| 429 | - contentType: 'voice', | |
| 430 | - content: tempFilePath, | |
| 431 | - contentDuration: Math.ceil(contentDuration) | |
| 432 | - }; | |
| 433 | - this.canSend && this.sendMsg(params); | |
| 478 | + | |
| 479 | + console.log('tempFilePath',tempFilePath); | |
| 480 | + uni.uploadFile({ | |
| 481 | + url:config.appurl_chaoge+'/file/Uploader/chat_voice', | |
| 482 | + filePath:tempFilePath, | |
| 483 | + name: 'file', | |
| 484 | + success(res){ | |
| 485 | + console.log('uploadfile ',res); | |
| 486 | + let data = JSON.parse(res.data); | |
| 487 | + if(data.data && data.data.url){ | |
| 488 | + const params = { | |
| 489 | + contentType: 'voice', | |
| 490 | + length:contentDuration || 1, | |
| 491 | + messageContent:data.data.url, | |
| 492 | + }; | |
| 493 | + that.canSend && that.sendMsg(params); | |
| 494 | + } | |
| 495 | + } | |
| 496 | + }); | |
| 497 | + | |
| 434 | 498 | }, |
| 435 | 499 | //控制播放还是暂停音频文件 |
| 436 | 500 | handleAudio(item) { |
| 501 | + console.log('handleAudio',item); | |
| 437 | 502 | this.AudioExam = item; |
| 438 | 503 | this.Audio.paused ? this.playAudio(item) : this.stopAudio(item); |
| 439 | 504 | }, |
| 440 | 505 | //播放音频 |
| 441 | 506 | playAudio(item) { |
| 442 | - this.Audio.src = item.content; | |
| 507 | + this.Audio.src = config.baseurl_chaoge+item.content.path; | |
| 443 | 508 | this.Audio.hasBeenSentId = item.hasBeenSentId; |
| 444 | 509 | this.Audio.play(); |
| 445 | 510 | item.anmitionPlay = true; |
| ... | ... | @@ -471,6 +536,7 @@ |
| 471 | 536 | sizeType: ['compressed'], |
| 472 | 537 | success: res => { |
| 473 | 538 | this.showFunBtn = false; |
| 539 | + this.showEmoji = false; | |
| 474 | 540 | for (let i = 0; i < res.tempFilePaths.length; i++) { |
| 475 | 541 | const params = { |
| 476 | 542 | contentType: 'image', |
| ... | ... | @@ -520,7 +586,7 @@ |
| 520 | 586 | userid, |
| 521 | 587 | username |
| 522 | 588 | } = info; |
| 523 | - | |
| 589 | + | |
| 524 | 590 | this.API.message.getUserInfo(this.user.id).then(res => { |
| 525 | 591 | this.myMd5Id = res.data.user.userId; |
| 526 | 592 | }) |
| ... | ... | @@ -567,30 +633,37 @@ |
| 567 | 633 | |
| 568 | 634 | //socket |
| 569 | 635 | uni.$on('socketMessage', (data) => { |
| 570 | - console.log('socketMessage',data); | |
| 636 | + console.log('socketMessage', data); | |
| 571 | 637 | this.updateReadMessage(); |
| 572 | 638 | if (data.messageType == 'text') { |
| 573 | 639 | let message = { |
| 574 | - isItMe:data.UserId == this.myMd5Id, | |
| 575 | - content:data.toMessage, | |
| 576 | - contentType:'text', | |
| 577 | - userId:data.UserId | |
| 640 | + isItMe: data.UserId == this.myMd5Id, | |
| 641 | + content: data.toMessage, | |
| 642 | + contentType: 'text', | |
| 643 | + userId: data.UserId | |
| 578 | 644 | }; |
| 579 | 645 | if (data.UserId == this.md5Id) { |
| 580 | 646 | //别人 |
| 581 | 647 | message.fromUserHeadImg = this.fromUserInfo.fromUserHeadImg || |
| 582 | 648 | '/static/head/head1.png' |
| 583 | - message.roleName = this.fromUserInfo.user_type && this.fromUserInfo.user_type.includes(1)?'供方':'需方'; | |
| 649 | + message.roleName = this.fromUserInfo.user_type && this.fromUserInfo.user_type.includes(1) ? | |
| 650 | + '供方' : '需方'; | |
| 584 | 651 | } else { |
| 585 | 652 | //我 |
| 586 | 653 | message.fromUserHeadImg = this.user.avatar || '/static/head/head2.png'; |
| 587 | - message.roleName = this.user.user_type && this.user.user_type.includes(1)?'供方':'需方'; | |
| 654 | + message.roleName = this.user.user_type && this.user.user_type.includes(1) ? '供方' : '需方'; | |
| 655 | + } | |
| 656 | + if(message.contentType == 'text'){ | |
| 657 | + message.content = this.replaceEmoji(message.content) | |
| 658 | + } | |
| 659 | + if(message.contentType == 'voice'){ | |
| 660 | + message.content = JSON.parse(message.content) | |
| 588 | 661 | } |
| 589 | 662 | this.addMessage(message); |
| 590 | 663 | } |
| 591 | - if(data.messageType == 'messageRead'){ | |
| 592 | - if(data.userId == this.md5Id){ | |
| 593 | - this.messageList = this.messageList.map(t=>{ | |
| 664 | + if (data.messageType == 'messageRead') { | |
| 665 | + if (data.userId == this.md5Id) { | |
| 666 | + this.messageList = this.messageList.map(t => { | |
| 594 | 667 | t.state = 1; |
| 595 | 668 | return t; |
| 596 | 669 | }); |
| ... | ... | @@ -623,6 +696,7 @@ |
| 623 | 696 | // #endif |
| 624 | 697 | } else { |
| 625 | 698 | this.showFunBtn = false; |
| 699 | + this.showEmoji = false; | |
| 626 | 700 | } |
| 627 | 701 | }); |
| 628 | 702 | } | ... | ... |
1.72 KB
1.5 KB
1.71 KB
1.72 KB
1.89 KB
1.78 KB
3.41 KB
3.76 KB
4.55 KB
3.07 KB
3.52 KB
7.67 KB
2.15 KB
1.6 KB
3.73 KB
1.48 KB
1.33 KB
2.9 KB
7.33 KB
7.34 KB
1.68 KB
1.78 KB
2.87 KB
1.86 KB
2.16 KB
2.33 KB
3.89 KB
2.45 KB
3.17 KB
5 KB
1.65 KB
5.38 KB
6.6 KB
4.1 KB
2.05 KB
11.7 KB
1.36 KB
1.16 KB
1.6 KB
1.67 KB
9.64 KB
3.23 KB
12 KB
4 KB
1.49 KB
4.21 KB
4.63 KB
3.59 KB
1.64 KB
5.85 KB
2.96 KB
3.6 KB
1.45 KB
1.97 KB
2.24 KB
2.35 KB
1.14 KB
4.74 KB
2.5 KB
1.5 KB
2.53 KB
1.1 KB
1.18 KB
971 Bytes
988 Bytes
1.33 KB
1.1 KB
2.47 KB
4.28 KB
979 Bytes
1.1 KB
991 Bytes
3.55 KB
2.14 KB
2.33 KB
1.18 KB
1.15 KB
1.12 KB
1.51 KB
1.47 KB
1.5 KB
1.55 KB
1.51 KB
1.55 KB
3.27 KB
1.54 KB
1.48 KB
1.5 KB
2.05 KB
2.34 KB
2.4 KB
1.02 KB
1.34 KB
1.08 KB
3.49 KB
2.94 KB