体会到那种维护"屎山"的感觉了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
whoami9894
V2EX    程序员

体会到那种维护"屎山"的感觉了

  •  
  •   whoami9894 2019-03-31 11:24:06 +08:00 13452 次点击
    这是一个创建于 2387 天前的主题,其中的信息可能已经有所发展或是发生改变。

    楼主本科生,这周接手了校宣传部一个比赛网站的开发任务,代码是好几年前祖传下来的 PHP Yii 框架开发,之后每年这个比赛都会加一些新需求,然后每年学生都得修修补补

    今年新加了几个分项,发现整个库表结构都得改,加上架构逻辑看起来很分散(不知道是框架的范式还是设计的问题),某个功能变了五六个文件得连带着改,还有不知道为什么某些表单结构和路由也放在数据库....。

    部署到服务器后上传图片的接口崩了,半天也没定位到 Bug,易班认证的 OAuth2 接口也崩了,(说因为要推广易班所以需要先易班认证才能在本站注册),发现整个代码很多补丁的痕迹...头大 orz

    老师本来告诉我有个功能前面几届都没给她实现,我当时没看项目代码,想着不是多复杂的功能,拍胸脯我今年肯定给她搞定...现在我明白为什么前几年没有实现了

    第 1 条附言    2019-03-31 21:14:55 +08:00
    感谢各位前辈的建议
    97 条回复    2019-04-02 13:28:14 +08:00
    mamahaha
        1
    mamahaha  
       2019-03-31 11:36:07 +08:00   21
    而且以后别人接手这个代码时,你也会被接手者划分到垃圾代码产生者来看待。
    CEBBCAT
        2
    CEBBCAT  
       2019-03-31 11:38:18 +08:00 via Android
    先上 git 私有库,再上重构大法?
    lovedebug
        3
    lovedebug  
       2019-03-31 11:40:02 +08:00 via Android
    重写可能更快。这类校内网站功能又不是很多很复杂。
    reus
        4
    reus  
       2019-03-31 11:40:20 +08:00   1
    重写吧
    whoami9894
        5
    whoami9894  
    OP
       2019-03-31 12:00:33 +08:00
    @CEBBCAT
    @lovedebug
    @reus
    提出过要重写,但老师的认知里从 0 到 1.2 怎么可能比从 1.1 到 1.2 更快
    CEBBCAT
        6
    CEBBCAT  
       2019-03-31 12:03:36 +08:00 via Android
    @whoami9894 快跑!!!
    blackmirror
        7
    blackmirror  
       2019-03-31 12:10:01 +08:00   11
    每个接手都想重写,到最后都是修修补补
    mscststs
        8
    mscststs  
       2019-03-31 12:12:37 +08:00 via Android
    @whoami9894 老师不懂开发,那么老师的意见很重要吗??不懂你们的逻辑
    emmettwoo
        9
    emmettwoo  
       2019-03-31 12:14:53 +08:00 via Android
    @blackmirror 太真实了
    whoami9894
        10
    whoami9894  
    OP
       2019-03-31 12:27:38 +08:00
    @mscststs
    这种项目大家其实都不愿意做,老师又催得紧,所以按自己的意思重写的话最后还得担责任,没有必要
    whoami9894
        11
    whoami9894  
    OP
       2019-03-31 12:29:54 +08:00
    @blackmirror
    刚开始那几年修修补补应该是能用的,之后每年比赛要求都变更,今年变化大新加了几个分项...唉
    Mac
        12
    Mac  
       2019-03-31 12:41:01 +08:00 via Android
    重构呗
    2589595915
        13
    2589595915  
       2019-03-31 12:48:26 +08:00 via iPhone
    老师算什么东西。你觉得该弄就弄。
    mscststs
        14
    mscststs  
       2019-03-31 13:02:32 +08:00 via Android
    @whoami9894 允悲,学校里面做苦力其实还蛮难受的
    hongfs
        15
    hongfs  
       2019-03-31 13:06:15 +08:00
    还好啦,我之前是 asp.net,
    scukmh
        16
    scukmh  
       2019-03-31 13:11:00 +08:00
    又没有钱,没事干嘛给他打工。
    notreami
        17
    notreami  
       2019-03-31 13:48:54 +08:00   1
    钱给够,时间给够。否则按需求改改完事,短板优化原则。

    每维护个"屎山"都重写,浪费时间和精力,最关键 ROI 太低,怎么证明你的能力?
    reus
        18
    reus  
       2019-03-31 13:55:28 +08:00
    @whoami9894 你先做出来,然后拿给老师看,如果做得好,自然就用你的了。学生时期,有这么一个机会,就要抓住。就算最终你的东西达不到要求,不用你的,你还是得到了宝贵的经验啊。
    okjb
        19
    okjb  
       2019-03-31 13:59:12 +08:00
    三年三年又三年,缝缝补补又三年,能用就行
    reus
        20
    reus  
       2019-03-31 14:09:26 +08:00   1
    如果你处理不了,那你就会成为老师口里的“前几届”其中之一
    qinkangdeid
        21
    qinkangdeid  
       2019-03-31 14:27:17 +08:00 via Android
    就像楼上一位兄台说的
    每一位接收者在看代码之后 心里都想着重构
    重构了几个方法后 放弃的概率越来越大
    重构好了 表面上看和以前一样 老板(老师)又不看代码 觉得有什么区别
    你说以前的版本在这个地方有个 bug 老板说你不能修复这个 bug 吗 怎么要重做 还要那么多时间
    你说我这次重构为了以后应对新需求上有更多的灵活性
    老板可能心里还没有任何需求 .......

    总之 领导不挑头的事情 很难重做
    团队团结还好 不团结 重构导致新问题了 锅就是你的了
    大家都说:以前的又不是不能用 的时候就非常尴尬了

    题主倒是可以提一提 看看老师的支持程度
    学习实践的话 题主可以自己私下有时间自己重构 一部分模块 别动老版本就行
    qinkangdeid
        22
    qinkangdeid  
       2019-03-31 14:34:07 +08:00
    @blackmirror 太真实了 真实得不行 每个接手者刚看到代码都会指点一遍前任 这个地方怎么这么写?这里怎么不抽出来 这里多此一举啊 要是我我就不这么做 这代码不能看 垃圾 我来改 改完几个方法后 最后 大都默默的 Ctrl+z......
    xiaomingVTEX
        23
    xiaomingVTEX  
       2019-03-31 14:47:37 +08:00
    @qinkangdeid 太真实了
    kindjeff
        24
    kindjeff  
       2019-03-31 14:56:29 +08:00   2
    vcluopeng
        25
    vcluopeng  
       2019-03-31 15:01:36 +08:00
    如果你的代码可读性高,并能留下详细的开发注释和文档.那么就整个项目重构吧.
    当然也要有信心在老师规定的时间内完成.
    不然就继续舔砖加瓦,毕竟有句古话:没有金刚钻,不揽瓷器活.
    还有记住 霍夫斯塔特定律
    cz5424
        26
    cz5424  
       2019-03-31 15:25:20 +08:00 via iPhone
    新开个项目写新功能,旧的他被慢慢的抛弃
    deepkolos
        27
    deepkolos  
       2019-03-31 15:34:37 +08:00
    我比较幸运,上来就重写
    farseeraliens
        28
    farseeraliens  
       2019-03-31 15:48:30 +08:00 via iPhone
    @CEBBCAT 不明白重构跟 git 什么关系?
    yuhr123
        29
    yuhr123  
       2019-03-31 15:50:04 +08:00 via iPhone
    把需求梳理一遍,用 python 重写。
    e2c
        30
    e2c  
       2019-03-31 16:03:49 +08:00
    新三年,旧三年,缝缝补补又三年

    看你的了啦
    CEBBCAT
        31
    CEBBCAT  
       2019-03-31 16:25:11 +08:00 via Android
    @farseeraliens 一来可以快速回到原来的状态,二来正式开发也需要 git 不是
    encro
        32
    encro  
       2019-03-31 19:14:27 +08:00
    最厉害的程序员就是能将一堆垃圾代码理出条例来。
    我以十多年的经验告诉你。
    encro
        33
    encro  
       2019-03-31 19:20:46 +08:00   2
    我的经验还告诉我,要舍得删除代码,看不懂的都删,直到程序跑不通了再去看(前提是有版本控制),可能你就能看明白以前的代码了。
    明显感觉你是开发功力还不够,需求不了解,不敢去问 boss,不愿意深入思考最有效的解决问题的办法,潜意识找理由放弃。
    如果你把这个任务当做是你毕业前最好的一个练手机会,那么相信你能成为导师最看重的学生,也能在毕业时超过大部分同学。
    quickma
        34
    quickma  
       2019-03-31 19:29:37 +08:00
    就一个建议,重写!!!
    Hyperion
        35
    Hyperion  
       2019-03-31 19:33:23 +08:00   1
    当然是偷梁换柱釜底抽薪,写一套寄生代码附加在原来的代码上(在前端还是后端动手脚都可以),然后另外开一个目录跑新写的程序,来提供新的接口啦。

    你说要在页面上新加两行分数?原始模板上直接对着结构写 Vue 的结构和标记,对着主体容器直接一个 new Vue,然后该怎么请求新结构就怎么请求。

    重构这种事情,说说当然是容易的,但上学阶段根本不可能嘛,一没动力二没精力,最后还是吃力不讨好。这种东西刚开始很有热情,但你社团活动不搞了嘛?四六级单词不要背嘛?什么晨跑锻炼不要搞了嘛?
    Alpha486
        36
    Alpha486  
       2019-03-31 19:45:35 +08:00 via iPhone
    这不接手则已,一接手就明白为啥前人连简单的功能都做不好!
    sazima
        37
    sazima  
       2019-03-31 20:39:42 +08:00
    给工资吗
    whoami9894
        38
    whoami9894  
    OP
       2019-03-31 21:15:45 +08:00
    @scukmh 没酬劳,团队的任务哈哈
    whoami9894
        39
    whoami9894  
    OP
       2019-03-31 21:16:18 +08:00
    @notreami
    按需求修修补补感觉头大,比重写还累
    whoami9894
        40
    whoami9894  
    OP
       2019-03-31 21:16:39 +08:00
    @reus
    感谢您的建议,决定重写了
    whoami9894
        41
    whoami9894  
    OP
       2019-03-31 21:17:36 +08:00
    @qinkangdeid 重构就不了,本来就不太喜欢 PHP,打算直接重写了。明天先探探老师口风
    whoami9894
        42
    whoami9894  
    OP
       2019-03-31 21:19:05 +08:00
    @vcluopeng
    能不能来得及我心里也没底,我自己不会前端,感觉工作量挺大的
    whoami9894
        43/div>
    whoami9894  
    OP
       2019-03-31 21:21:35 +08:00
    @encro
    确实是我功力不够,而且对 PHP 那套 MVC 范式也不熟悉,
    和导师没关系的,我是做 Web 安全的,Web 开发只是顺带着会一些。帖子说的老师是宣传部的老师,和我基本没什么交集
    ifxo
        44
    ifxo  
       2019-03-31 21:22:14 +08:00
    不用管了,拉泡屎走人
    whoami9894
        45
    whoami9894  
    OP
       2019-03-31 21:22:20 +08:00
    @x7395759
    重写重写走起
    whoami9894
        46
    whoami9894  
    OP
       2019-03-31 21:23:10 +08:00
    @Hyperion
    让我改原来的可能更花时间,而且还痛苦,不如重写了
    whoami9894
        47
    whoami9894  
    OP
       2019-03-31 21:24:27 +08:00
    @Alpha486 木有工资的

    @sazima 这下是明白了,年年打补丁,还提什么新功能
    encro
        48
    encro  
       2019-03-31 21:43:10 +08:00
    @whoami9894
    连开发都不会,还会安全了?
    encro
        49
    encro  
       2019-03-31 21:53:27 +08:00   2
    整天说重构的,有几种人:
    1,代码没看懂,反正要重构,潜意识已经做好走人准备;
    2,代码看懂了,借重构争取更多时间;
    3,代码看懂了,而且知道重构对自己来说是小 case,时间也能自己搞定和争取到,确信能写出以后更容易维护的代码来。

    切莫忘记很多时候你是无法重构的,比如你面对整个淘宝的代码,你只能一点一点平滑升级,这时才是考验你的架构和能力。
    就如人生不能重来,打好手上现有的牌才是最佳途径。
    ytmsdy
        50
    ytmsdy  
       2019-03-31 22:33:01 +08:00
    如果就维护几个月,那就忍忍吧。
    如果要维护几年,那就长痛不如短痛直接重构吧
    vincexu
        51
    vincexu  
       2019-03-31 22:35:28 +08:00 via Android
    @CEBBCAT 笑出声
    xuanyuanaosheng
        52
    xuanyuanaosheng  
       2019-03-31 22:43:05 +08:00 via Android
    重写吧,正好练手
    siriussilen
        53
    siriussilen  
       2019-03-31 22:48:19 +08:00 via iPhone
    如果是团委学生会之类的老师 我的教训就是千万别干. 他们拿你当苦力还不给钱 变了方法的给你提需求 一旦完不成 他们还会质疑你的能力……
    notreami
        54
    notreami  
       2019-03-31 22:51:45 +08:00
    @whoami9894 完全不需要考虑成本。。。年轻,真好~~~
    learningman
        55
    learningman  
       2019-03-31 22:55:32 +08:00
    @Hyperion 记得原来我在一个 C 项目里边藏了一个 Go 的二进制文件,至今还能用 qwq
    metabot
        56
    metabot  
       2019-03-31 23:00:43 +08:00 via Android
    易班。。这玩意儿。。令人怀念的大学生活
    whoami9894
        57
    whoami9894  
    OP
       2019-03-31 23:25:58 +08:00 via Android
    @encro
    您这样的逻辑就有问题了,安全和开发确实联系紧密比如一些业务逻辑漏洞,但毕竟侧重点相差很远,并没有一个先行后继关系。开发要的工程能力,架构,优化等等安全是不需要涉及的,而安全我举个 bypass 的例子: `"".__class__.__mro__[-1].__subclasses__()[60].__init__.__globals__['__builtins__']['eval']('__import__("os").system("ls")')`

    再有您这句"连...都不会,还会...了?"让人听起来很不是滋味
    whoami9894
        58
    whoami9894  
    OP
       2019-03-31 23:26:58 +08:00 via Android
    @ytmsdy
    维护确实只有几个月,然后就丢给下一届做了,可是据去年的说这老师经常加需求
    whoami9894
        59
    whoami9894  
    OP
       2019-03-31 23:28:20 +08:00 via Android
    @siriussilen
    您猜对了,党委宣传部老师,据说往届的说这老师"屁事"很多,三天两头加需求,确实像个苦力,不过也就当积累经验了
    whoami9894
        60
    whoami9894  
    OP
       2019-03-31 23:29:42 +08:00 via Android
    @learningman
    popen 调用二进制吗,为何不编译成动态库呢
    whoami9894
        61
    whoami9894  
    OP
       2019-03-31 23:31:10 +08:00 via Android
    @metabot
    和超星学习通一样,处处被诟病,几乎没人用,都是上级一厢情愿的推广
    0TSH60F7J2rVkg8t
        62
    0TSH60F7J2rVkg8t  
       2019-03-31 23:36:08 +08:00 via iPhone
    如果这项目给钱,而且钱够多,值得你花时间做的话,那就重写一遍;反之随便改改就完了
    zjsxwc
        63
    zjsxwc  
       2019-04-01 07:09:23 +08:00 via Android
    我的建议是请把代码写的更烂一点,最好来个全局混淆,让后来者无法维护
    loading
        64
    loading  
       2019-04-01 07:27:02 +08:00 via Android
    在现有数据库结构魔改,用特殊技巧使用数据库字段,似的能支持新需求,我觉得这个比重写更有挑战性。
    重写其实是另一种逃避方式。
    ytmsdy
        65
    ytmsdy  
       2019-04-01 08:57:08 +08:00 via iPhone
    又不给钱!重写什么啊!!
    spotfg
        66
    spotfg  
       2019-04-01 09:17:55 +08:00
    我今年运气不错,换了家新公司,上来上班第一天上司就说老板要求重构代码,这个月搞定。。。现在 4 月了,搞得差不多了……所以就加班一个月
    learningman
        67
    learningman  
       2019-04-01 09:19:01 +08:00
    @whoami9894 在本地再开一个端口,用 socks 通信
    是社团的项目,基本没有架构。我刚刚扫了一眼发现还有可疑的 pyc 文件
    annielong
        68
    annielong  
       2019-04-01 09:23:11 +08:00
    有时候只能魔改,新建表,把特殊配置全写进去
    guoyuchuan
        69
    guoyuchuan  
       2019-04-01 09:28:21 +08:00
    重构大法
    Seney
        70
    Seney  
       2019-04-01 09:39:14 +08:00
    @whoami9894 那你就直接说开发 1.3/1.4/1.5/。。。 学校这种一般都是编程很粗浅的同学写的,当时可能不知道什么叫工程
    encro
        71
    encro  
       2019-04-01 09:39:27 +08:00
    @whoami9894
    这个算是浅层次安全吧,语法上的,未来很多都要交给机器,
    未来这样的安全岗位应该有限(人数和发展前景),
    高级点的应该是架构级别的。
    架构级别别说不懂开发。
    解决安全问题更多是架构级别的解决。

    比如架构级别防止注入,网络通信安全,防止爬虫。都需要开发基础。
    reus
        72
    reus  
       2019-04-01 09:50:39 +08:00
    @encro 你十几年了连“重构”和“重写”都分不清,还指指点点?
    mogutouer
        73
    mogutouer  
       2019-04-01 09:59:52 +08:00
    所以你以为 重构 这个词是怎么来的
    liuzuo
        74
    liuzuo  
       2019-04-01 10:00:05 +08:00
    如果原代码能做到解藕,就按照要改的功能重写,微服务化。
    如果做不到,就在原有基础上魔改吧。
    cwx391497
        75
    cwx391497  
       2019-04-01 10:02:14 +08:00
    代码是屎山已经不恐怖了, 恐怖的是, 测试和文档也都是屎山
    gscoder
        76
    gscoder  
       2019-04-01 10:05:35 +08:00
    没必要重构,重构会发现有很多细小的功能点,到时候他们会说,之前可以这样这样现在怎么不行了,又不是要长期维护的项目,随便改改就行了
    alexmy
        77
    alexmy  
       2019-04-01 10:35:24 +08:00
    我这也是 5.6, yii1,性能部分重构下,就一个人,才没有精力去重写,现在毕竟稳定,老板其实只要能用就好,并不喜欢重头开发一遍,万一开发出来的又像之前 si 一样怎么办。
    no1xsyzy
        78
    no1xsyzy  
       2019-04-01 10:36:34 +08:00   1
    @whoami9894 #5
    简单地说:这不是 1.1,这是 1.1.0.0.α.zebra.Ⅳ..勹.г.\frac{ω5}{在吗?}
    要改成 1.2 需要在不改动功能的情况下把那些东西都去掉,也就是需要做很多次换心手术。

    每一次重构都是一个未知生物的换心手术:确定边界,取代边界(写测试),替换部件,确认新部件状态良好,还原边界。
    hellowmykami
        79
    hellowmykami  
       2019-04-01 11:00:46 +08:00
    魔改
    zarte
        80
    zarte  
       2019-04-01 11:30:35 +08:00
    有追求就重构
    求稳就在现有基础上打补丁留给下一任。
    jackmod
        81
    jackmod  
       2019-04-01 11:36:01 +08:00
    之前用 jekyll 重构一个大点的静态网站搞了好几天。这活不太好做。
    leekafai
        82
    leekafai  
       2019-04-01 11:37:18 +08:00
    每个人都抱着重写的愿望去维护,所以最后四不像,各有各的风格
    jimrok
        83
    jimrok  
       2019-04-01 11:38:28 +08:00
    注释里不要忘了加"// fuck xxx, FU"
    JimiJimi
        84
    JimiJimi  
       2019-04-01 16:56:41 +08:00   1
    最讨厌学校分配不懂技术还喜欢瞎命令的老师来管理技术部
    所以当年我解散了技术部
    是真的闹心
    whoami9894
        85
    whoami9894  
    OP
       2019-04-01 18:35:17 +08:00   1
    @loading 嗯确实我有点逃避的意味在里面,还是经验能力不足吧....魔改的话对我来说感觉要花更多的精力
    whoami9894
        86
    whoami9894  
    OP
       2019-04-01 18:38:05 +08:00
    @zjsxwc 所以干脆在我手上重写一遍,但随着未来加新的需求修修补补,肯定又会变成现在的屎山
    whoami9894
        87
    whoami9894  
    OP
       2019-04-01 18:40:22 +08:00
    @Seney 我看他的代码风格架构等等可能算是学生中不错的了,但跟工作多年的前辈们比肯定有很大差距。变成现在这样还是因为每年修修补补加上维护者水平不一
    whoami9894
        88
    whoami9894  
    OP
       2019-04-01 18:54:17 +08:00
    @encro 您可能不太了解,说的只是安全的一个片面,pentesting 工程师、reverse 工程师等等,很多安全问题没有办法从大的架构层面解决。而且您关注一下 defcon 等等安全会议,安全研究员们研究的大多就是我说的语言框架层面的新式漏洞,比如 PHP 的 phar 协议

    我们做过 ML 的 WAF 的玩具项目,也了解过市面上想关产品,被 AI 取代完全取代还是很遥远的(真有这一天那么应该 90%职业已经被取代了)

    > 架构级别防止注入,网络通信安全,防止爬虫
    架构级别怎么防止注入我还真不知道,愿闻其详。而举例 SQLi,即使有参数化查询能完全防止,但依然能在各大 SRC 平台看见 SQLi 漏洞,所以基础安全人员不会衰减的。后两样是基础,不太明白您说的不会是什么意思

    而且您说了这么半天依然没论证您“开发和安全的先行关系”的逻辑
    whoami9894
        89
    whoami9894  
    OP
       2019-04-01 18:55:53 +08:00
    @liuzuo 代码整体感觉确实是分成不同组件层面,但是某些逻辑分散纠结在一起,感觉很难改单个功能
    whoami9894
        90
    whoami9894  
    OP
       2019-04-01 18:57:18 +08:00
    @alexmy 唉我对 PHP 仅仅停留在语法层面,日常也没有拿它开发过项目,所以看着那套范式还是很头疼的
    whoami9894
        91
    whoami9894  
    OP
       2019-04-01 18:57:59 +08:00
    @no1xsyzy 不重构了,感觉我也没能力去重构的比现在好,还是换个熟悉的语言重写吧
    whoami9894
        92
    whoami9894  
    OP
       2019-04-01 19:00:04 +08:00
    @jimrok 哈哈哈不太好不太好
    sannyzeng
        93
    sannyzeng  
       2019-04-01 19:37:18 +08:00
    写代码最重要的还是第一代,不然后面都会给带偏。。。
    encro
        94
    encro  
       2019-04-02 09:14:45 +08:00
    @whoami9894 “代码都看不懂能做安全?”
    alexmy
        95
    alexmy  
       2019-04-02 10:10:26 +08:00
    @whoami9894 我接手的时候,还看了半天语法,我本身是做游戏开发的。
    whoami9894
        96
    whoami9894  
    OP
       2019-04-02 13:26:32 +08:00
    @encro
    你觉得我看不懂就看不懂吧,你这逻辑能力我也是服了,回复全程不讲逻辑无脑杠,block
    whoami9894
        97
    whoami9894  
    OP
       2019-04-02 13:28:14 +08:00
    @alexmy 老师催着这周四前要上线,再慢慢踩坑怕是肯定来不及了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2406 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 38ms UTC 15:44 PVG 23:44 LAX 08:44 JFK 11:44
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86