Full Code of NoryCao/zhuishushenqi for AI

master a9d225cce6c6 cached
1638 files
121.4 MB
1.6M tokens
477 symbols
1 requests
Download .txt
Showing preview only (6,472K chars total). Download the full file or copy to clipboard to get everything.
Repository: NoryCao/zhuishushenqi
Branch: master
Commit: a9d225cce6c6
Files: 1638
Total size: 121.4 MB

Directory structure:
gitextract_zvr8h67z/

├── .gitignore
├── .idea/
│   ├── codeStyles/
│   │   └── Project.xml
│   ├── modules.xml
│   ├── vcs.xml
│   ├── workspace.xml
│   ├── xcode.xml
│   └── zhuishushenqi.iml
├── Podfile
├── README.md
├── Script.sh
├── addSource.md
├── en.lproj/
│   └── Localizable.strings
├── images/
│   └── aptv.plist
├── zh-Hans.lproj/
│   └── Localizable.strings
├── zh-Hant.lproj/
│   └── Localizable.strings
├── zhuishushenqi/
│   ├── App/
│   │   ├── AppDelegate.swift
│   │   ├── AppOpenAdManager.swift
│   │   ├── AppStyle.swift
│   │   ├── BUAdManager.swift
│   │   ├── BookManager.swift
│   │   ├── Config.swift
│   │   ├── FBEncryptorAES.h
│   │   ├── FBEncryptorAES.m
│   │   ├── FBEncryptorAESUtils.h
│   │   ├── FBEncryptorAESUtils.mm
│   │   ├── Reader.swift
│   │   ├── Theme.swift
│   │   ├── ZSDBManager.h
│   │   ├── ZSDBManager.m
│   │   ├── ZSDBPropertyModel.h
│   │   ├── ZSDBPropertyModel.m
│   │   ├── ZSDatabase.swift
│   │   ├── ZSEncryptorAESUtils.swift
│   │   ├── ZSJSON.swift
│   │   ├── ZSLogin.swift
│   │   ├── ZSMobileLogin.swift
│   │   └── ZSThirdLogin.swift
│   ├── Assets.xcassets/
│   │   ├── AppIcon.appiconset/
│   │   │   └── Contents.json
│   │   ├── Contents.json
│   │   ├── Default-640x1136.imageset/
│   │   │   └── Contents.json
│   │   ├── LaunchImage.launchimage/
│   │   │   └── Contents.json
│   │   ├── New Version/
│   │   │   ├── Contents.json
│   │   │   ├── QDReaderSetting_brightnessDown_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── QDReaderSetting_brightnessUp_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bbs_icon_like02_26_26.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bbs_icon_message_20_20.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bbs_icon_message_34_34_34x34_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bbs_icon_more_big_26_26.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bbs_icon_personal_34_34_34x34_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bbs_icon_share_26_26_26x26_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bbs_icon_topic_26_26_26x26_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── blackboard_bg_375x667_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookshelf_bg_logo_80_19_80x19_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookshelf_icon_gift_34_34.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookshelf_icon_gift_new_34_34.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookshelf_icon_history_34_34.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookshelf_icon_more_10_10_10x10_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookshelf_icon_more_34_34.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookshelf_icon_more_wifi_24_24.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookshelf_icon_seach_34_34.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookshelf_top_bg_one_line.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookshelf_top_bg_two_line.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookstore_bg.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookstore_def_classify_20_20_20x20_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── chapter_review_send_tip_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── community_noReview_sofa_icon.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── community_star_p_32x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── details_icon_star_n_32_32_32x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── discover_Ranking_109x50_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── discover_booklist_108x50_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── discover_classify_108x50_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── discover_icon_audiobook_26_26_26x26_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── discover_icon_comics_26_26_26x26_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── discover_icon_exclusive_26_26_26x26_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── discover_icon_free_26_26_26x26_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── discover_icon_random_26_26_26x26_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── discover_icon_timing_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── discover_icon_vip_26_26_26x26_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── f_author_icon_14x14_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── f_commentator_icon_14x14_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── f_doyen_icon_12x12_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── f_moderator_icon_14x14_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── f_official_icon_12x12_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── forum_image_15x13_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── icon_delete_1_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── icon_download_a_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── icon_night_30x30_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── icon_tools_menu_30x30_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── icon_tools_setting_30x30_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── icon_top_selected_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── mj_refresh.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── nav_goldCoin_34_34_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── no_network_140x128_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── notification_personal_icon_message_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── official_icon_30x30_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── peach_reader_def_xuance2_32_32_32x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_account_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_booklist_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_darkmode_24_24_23x23_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_history_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_huntbook_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_id_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_level _24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_level3 _24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_opinion_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_reply_14_14_14x14_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_setting_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_topic_14_14_14x14_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_vip_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_warn_16_16_10x10_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_zslike_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── pic_day_46x46_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── pic_night_46x46_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── profile_personal_icon_message_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── slice_bg_515_88x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── slice_bg_barbie_88x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── slice_bg_jade_88x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── slice_bg_linen_88x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── slice_bg_night_88x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── slice_bg_paper_88x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── slice_bg_white_88x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── slice_bg_wood_88x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── slice_bg_yexiu_88x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── source_checkbox_normal.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── source_checkbox_selected.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── source_delete.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tab_bbs.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tab_bbs_sel.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tab_bookshelf.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tab_bookshelf_sel.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tab_bookstore.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tab_bookstore_sel.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tab_discover.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tab_discover_sel.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tab_profile.imageset/
│   │   │   │   └── Contents.json
│   │   │   └── tab_profile_sel.imageset/
│   │   │       └── Contents.json
│   │   ├── bg_back_white.imageset/
│   │   │   └── Contents.json
│   │   ├── catelog.imageset/
│   │   │   └── Contents.json
│   │   ├── fzhongjun.imageset/
│   │   │   └── Contents.json
│   │   ├── fzmiaowu.imageset/
│   │   │   └── Contents.json
│   │   ├── fzqingke.imageset/
│   │   │   └── Contents.json
│   │   ├── fzshusong.imageset/
│   │   │   └── Contents.json
│   │   ├── fzsuxinshil.imageset/
│   │   │   └── Contents.json
│   │   ├── fzxijinling.imageset/
│   │   │   └── Contents.json
│   │   ├── fzyouhei.imageset/
│   │   │   └── Contents.json
│   │   ├── kai.imageset/
│   │   │   └── Contents.json
│   │   ├── lantingh.imageset/
│   │   │   └── Contents.json
│   │   ├── leftbar.imageset/
│   │   │   └── Contents.json
│   │   ├── li.imageset/
│   │   │   └── Contents.json
│   │   ├── loadside.imageset/
│   │   │   └── Contents.json
│   │   ├── longwangchuanshuo.imageset/
│   │   │   └── Contents.json
│   │   ├── navigationbar-sidebar.imageset/
│   │   │   └── Contents.json
│   │   ├── pianpian.imageset/
│   │   │   └── Contents.json
│   │   ├── rightbar.imageset/
│   │   │   └── Contents.json
│   │   ├── riwen.imageset/
│   │   │   └── Contents.json
│   │   ├── sure_placeholder_error.imageset/
│   │   │   └── Contents.json
│   │   ├── weibei.imageset/
│   │   │   └── Contents.json
│   │   ├── yapi.imageset/
│   │   │   └── Contents.json
│   │   └── zhuishushenqi/
│   │       ├── AppIcon29x29.imageset/
│   │       │   └── Contents.json
│   │       ├── AppIcon40x40.imageset/
│   │       │   └── Contents.json
│   │       ├── AppIcon57x57.imageset/
│   │       │   └── Contents.json
│   │       ├── AppIcon60x60.imageset/
│   │       │   └── Contents.json
│   │       ├── AppIcon72x72.imageset/
│   │       │   └── Contents.json
│   │       ├── AppIcon76x76.imageset/
│   │       │   └── Contents.json
│   │       ├── Apprecommend.imageset/
│   │       │   └── Contents.json
│   │       ├── Contents.json
│   │       ├── Default-1242x2208.imageset/
│   │       │   └── Contents.json
│   │       ├── Default-750x1334.imageset/
│   │       │   └── Contents.json
│   │       ├── Default-iPad.imageset/
│   │       │   └── Contents.json
│   │       ├── Default.imageset/
│   │       │   └── Contents.json
│   │       ├── IQButtonBarArrowDown.imageset/
│   │       │   └── Contents.json
│   │       ├── IQButtonBarArrowUp.imageset/
│   │       │   └── Contents.json
│   │       ├── Icon.imageset/
│   │       │   └── Contents.json
│   │       ├── Icon_114.imageset/
│   │       │   └── Contents.json
│   │       ├── Icon_120.imageset/
│   │       │   └── Contents.json
│   │       ├── Icon_58.imageset/
│   │       │   └── Contents.json
│   │       ├── Icon_80.imageset/
│   │       │   └── Contents.json
│   │       ├── NavBack.imageset/
│   │       │   └── Contents.json
│   │       ├── NavForward.imageset/
│   │       │   └── Contents.json
│   │       ├── NavHome.imageset/
│   │       │   └── Contents.json
│   │       ├── NavRefresh.imageset/
│   │       │   └── Contents.json
│   │       ├── a_charge_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── a_charge_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── a_charge_record.imageset/
│   │       │   └── Contents.json
│   │       ├── a_charge_record_new.imageset/
│   │       │   └── Contents.json
│   │       ├── a_exchange.imageset/
│   │       │   └── Contents.json
│   │       ├── a_exchange_new.imageset/
│   │       │   └── Contents.json
│   │       ├── a_noadvs.imageset/
│   │       │   └── Contents.json
│   │       ├── a_purchase_record.imageset/
│   │       │   └── Contents.json
│   │       ├── a_purchase_record_new.imageset/
│   │       │   └── Contents.json
│   │       ├── a_zhuishubi.imageset/
│   │       │   └── Contents.json
│   │       ├── a_zhuishubi_new.imageset/
│   │       │   └── Contents.json
│   │       ├── a_zhuishuquan.imageset/
│   │       │   └── Contents.json
│   │       ├── a_zhuishuquan_new.imageset/
│   │       │   └── Contents.json
│   │       ├── actionbar_back.imageset/
│   │       │   └── Contents.json
│   │       ├── actionbar_close.imageset/
│   │       │   └── Contents.json
│   │       ├── actionbar_forward.imageset/
│   │       │   └── Contents.json
│   │       ├── actionbar_refresh.imageset/
│   │       │   └── Contents.json
│   │       ├── activity_image.imageset/
│   │       │   └── Contents.json
│   │       ├── add_book_hint.imageset/
│   │       │   └── Contents.json
│   │       ├── add_success.imageset/
│   │       │   └── Contents.json
│   │       ├── adwall_blue_pic.imageset/
│   │       │   └── Contents.json
│   │       ├── adwall_blue_text.imageset/
│   │       │   └── Contents.json
│   │       ├── adwall_white_pic.imageset/
│   │       │   └── Contents.json
│   │       ├── adwall_white_text.imageset/
│   │       │   └── Contents.json
│   │       ├── alert_error_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── alert_success_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── app_image.imageset/
│   │       │   └── Contents.json
│   │       ├── appointActivity_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── appointActivity_close.imageset/
│   │       │   └── Contents.json
│   │       ├── ar_shadow.imageset/
│   │       │   └── Contents.json
│   │       ├── arrow.imageset/
│   │       │   └── Contents.json
│   │       ├── artboard.imageset/
│   │       │   └── Contents.json
│   │       ├── autoreading_start.imageset/
│   │       │   └── Contents.json
│   │       ├── autoreading_start_landscape.imageset/
│   │       │   └── Contents.json
│   │       ├── avatar_wrapper.imageset/
│   │       │   └── Contents.json
│   │       ├── background_green.imageset/
│   │       │   └── Contents.json
│   │       ├── background_green_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── background_white.imageset/
│   │       │   └── Contents.json
│   │       ├── background_white_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── background_yellow.imageset/
│   │       │   └── Contents.json
│   │       ├── background_yellow_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── baidu_logo.imageset/
│   │       │   └── Contents.json
│   │       ├── baidubutton.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_add.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_add_count.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_add_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_arrow_down.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_arrow_right.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_cancel.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_cancel_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_mark.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_retention_ratio.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_search.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_search_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_share.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_share_red.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_share_white.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_star_empty.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_star_filled.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_useful.imageset/
│   │       │   └── Contents.json
│   │       ├── beijing.imageset/
│   │       │   └── Contents.json
│   │       ├── blackGreen_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── bofang.imageset/
│   │       │   └── Contents.json
│   │       ├── bofangNotify.imageset/
│   │       │   └── Contents.json
│   │       ├── bookDirectory_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── bookDirectory_separator.imageset/
│   │       │   └── Contents.json
│   │       ├── bookShelf_check.imageset/
│   │       │   └── Contents.json
│   │       ├── bookShelf_uncheck.imageset/
│   │       │   └── Contents.json
│   │       ├── booklist_delete.imageset/
│   │       │   └── Contents.json
│   │       ├── brightess_high.imageset/
│   │       │   └── Contents.json
│   │       ├── brightess_low.imageset/
│   │       │   └── Contents.json
│   │       ├── brightess_white_high.imageset/
│   │       │   └── Contents.json
│   │       ├── brightess_white_low.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_delete.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_delete_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_download.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_download_cancel.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_download_finished.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_download_waiting.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_downloading.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_feed.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_feed_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_feed_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_feed_tip.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_feeded.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_last_read.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_last_read_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_stick.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_stick_cancel.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_stick_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_stick_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── btn_slider_off.imageset/
│   │       │   └── Contents.json
│   │       ├── btn_slider_on.imageset/
│   │       │   └── Contents.json
│   │       ├── btn_slider_thumb.imageset/
│   │       │   └── Contents.json
│   │       ├── btn_slider_thumb_pressed.imageset/
│   │       │   └── Contents.json
│   │       ├── btn_slider_track.imageset/
│   │       │   └── Contents.json
│   │       ├── btn_slider_track_pressed.imageset/
│   │       │   └── Contents.json
│   │       ├── c_arrow_down.imageset/
│   │       │   └── Contents.json
│   │       ├── c_check.imageset/
│   │       │   └── Contents.json
│   │       ├── cell_selected_background.imageset/
│   │       │   └── Contents.json
│   │       ├── cell_selected_tip.imageset/
│   │       │   └── Contents.json
│   │       ├── change_mode_checked.imageset/
│   │       │   └── Contents.json
│   │       ├── change_mode_unchecked.imageset/
│   │       │   └── Contents.json
│   │       ├── change_resource.imageset/
│   │       │   └── Contents.json
│   │       ├── close.imageset/
│   │       │   └── Contents.json
│   │       ├── coffee_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── common_button_big_blue.imageset/
│   │       │   └── Contents.json
│   │       ├── common_button_big_blue_disable.imageset/
│   │       │   └── Contents.json
│   │       ├── common_button_big_blue_highlighted.imageset/
│   │       │   └── Contents.json
│   │       ├── common_button_white.imageset/
│   │       │   └── Contents.json
│   │       ├── common_button_white_highlighted.imageset/
│   │       │   └── Contents.json
│   │       ├── common_icon_arrow.imageset/
│   │       │   └── Contents.json
│   │       ├── compose_keyboardbutton_background.imageset/
│   │       │   └── Contents.json
│   │       ├── compose_toolbar_background.imageset/
│   │       │   └── Contents.json
│   │       ├── cover_wrapper.imageset/
│   │       │   └── Contents.json
│   │       ├── d_comment.imageset/
│   │       │   └── Contents.json
│   │       ├── d_default.imageset/
│   │       │   └── Contents.json
│   │       ├── d_delete.imageset/
│   │       │   └── Contents.json
│   │       ├── d_follow.imageset/
│   │       │   └── Contents.json
│   │       ├── d_followed.imageset/
│   │       │   └── Contents.json
│   │       ├── d_forward.imageset/
│   │       │   └── Contents.json
│   │       ├── d_forward_large.imageset/
│   │       │   └── Contents.json
│   │       ├── d_forwarded_large.imageset/
│   │       │   └── Contents.json
│   │       ├── d_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── d_votes.imageset/
│   │       │   └── Contents.json
│   │       ├── day_mode.imageset/
│   │       │   └── Contents.json
│   │       ├── day_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── default_avatar_deep.imageset/
│   │       │   └── Contents.json
│   │       ├── default_avatar_light.imageset/
│   │       │   └── Contents.json
│   │       ├── default_book_cover.imageset/
│   │       │   └── Contents.json
│   │       ├── delete_book_tip.imageset/
│   │       │   └── Contents.json
│   │       ├── dingshi.imageset/
│   │       │   └── Contents.json
│   │       ├── directory.imageset/
│   │       │   └── Contents.json
│   │       ├── directory_close.imageset/
│   │       │   └── Contents.json
│   │       ├── directory_close_pressed.imageset/
│   │       │   └── Contents.json
│   │       ├── directory_not_previewed.imageset/
│   │       │   └── Contents.json
│   │       ├── directory_previewed.imageset/
│   │       │   └── Contents.json
│   │       ├── directory_vip_chapter.imageset/
│   │       │   └── Contents.json
│   │       ├── discover_icon_back_24_24.imageset/
│   │       │   └── Contents.json
│   │       ├── discover_icon_bookshelf_24_24.imageset/
│   │       │   └── Contents.json
│   │       ├── discover_icon_bookshelf_24_24_p.imageset/
│   │       │   └── Contents.json
│   │       ├── discover_icon_more_24_24.imageset/
│   │       │   └── Contents.json
│   │       ├── discover_icon_next_36_36.imageset/
│   │       │   └── Contents.json
│   │       ├── discover_icon_palying_20_14.imageset/
│   │       │   └── Contents.json
│   │       ├── discover_icon_play_76_76.imageset/
│   │       │   └── Contents.json
│   │       ├── discover_icon_pouse_76_76.imageset/
│   │       │   └── Contents.json
│   │       ├── discover_icon_timing_24_24.imageset/
│   │       │   └── Contents.json
│   │       ├── discover_icon_up_36_36.imageset/
│   │       │   └── Contents.json
│   │       ├── draft_defaultImage.imageset/
│   │       │   └── Contents.json
│   │       ├── empty_failed.imageset/
│   │       │   └── Contents.json
│   │       ├── enter_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── erciyuanv3.imageset/
│   │       │   └── Contents.json
│   │       ├── error.imageset/
│   │       │   └── Contents.json
│   │       ├── exchange_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── exchange_center.imageset/
│   │       │   └── Contents.json
│   │       ├── exchange_duihuan.imageset/
│   │       │   └── Contents.json
│   │       ├── exchange_jiantou.imageset/
│   │       │   └── Contents.json
│   │       ├── exchange_jinru.imageset/
│   │       │   └── Contents.json
│   │       ├── exchange_jinru_h.imageset/
│   │       │   └── Contents.json
│   │       ├── exchange_kuang.imageset/
│   │       │   └── Contents.json
│   │       ├── exchange_tixian.imageset/
│   │       │   └── Contents.json
│   │       ├── exp_current.imageset/
│   │       │   └── Contents.json
│   │       ├── exp_more.imageset/
│   │       │   └── Contents.json
│   │       ├── exp_paiming.imageset/
│   │       │   └── Contents.json
│   │       ├── exp_progress.imageset/
│   │       │   └── Contents.json
│   │       ├── exp_publishBook.imageset/
│   │       │   └── Contents.json
│   │       ├── exp_publishTopic.imageset/
│   │       │   └── Contents.json
│   │       ├── exp_updateHeader.imageset/
│   │       │   └── Contents.json
│   │       ├── f_author_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── f_commentator_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── f_distillate.imageset/
│   │       │   └── Contents.json
│   │       ├── f_doyen_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── f_game_center_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── f_girl_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── f_hot.imageset/
│   │       │   └── Contents.json
│   │       ├── f_invent_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── f_like_comment.imageset/
│   │       │   └── Contents.json
│   │       ├── f_like_comment_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── f_like_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── f_like_icon_select.imageset/
│   │       │   └── Contents.json
│   │       ├── f_moderator_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── f_official_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── f_ramble_default_cover.imageset/
│   │       │   └── Contents.json
│   │       ├── f_ramble_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── f_sort.imageset/
│   │       │   └── Contents.json
│   │       ├── f_today_topic.imageset/
│   │       │   └── Contents.json
│   │       ├── fanhui.imageset/
│   │       │   └── Contents.json
│   │       ├── fb_cancel.imageset/
│   │       │   └── Contents.json
│   │       ├── fb_cancel_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── fb_gray_angle.imageset/
│   │       │   └── Contents.json
│   │       ├── fb_set.imageset/
│   │       │   └── Contents.json
│   │       ├── fb_set_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── fb_white_angle.imageset/
│   │       │   └── Contents.json
│   │       ├── fd_tip.imageset/
│   │       │   └── Contents.json
│   │       ├── fd_tip_title.imageset/
│   │       │   └── Contents.json
│   │       ├── feedback.imageset/
│   │       │   └── Contents.json
│   │       ├── fenxiang.imageset/
│   │       │   └── Contents.json
│   │       ├── float_forum_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── float_forum_icon_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── font_decrease.imageset/
│   │       │   └── Contents.json
│   │       ├── font_decrease_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── font_decrease_unable.imageset/
│   │       │   └── Contents.json
│   │       ├── font_increase.imageset/
│   │       │   └── Contents.json
│   │       ├── font_increase_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── font_increase_unable.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_avatar_small.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_book_entry.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_collect_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_collect_icon_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_comment_cancel.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_comment_cancel_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_comment_confirm.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_comment_confirm_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_comment_confirm_unable.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_comment_input_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_comment_reply.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_comment_reply_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_comment_start.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_comment_start_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_enter.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_gray_star.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_help_default_cover.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_hint_arrow_right_up.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_like_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_liked_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_more_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_more_icon_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_more_option.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_more_option_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_not_voted.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_post_comment_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_post_red.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_post_red_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_post_shadow.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_public_help_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_public_review_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_red_star.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_share_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_share_icon_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_topic_type_post.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_topic_type_vote.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_vote_add.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_vote_add_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_vote_delete.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_voted.imageset/
│   │       │   └── Contents.json
│   │       ├── fuliv3.imageset/
│   │       │   └── Contents.json
│   │       ├── fullscreen.imageset/
│   │       │   └── Contents.json
│   │       ├── g_boy.imageset/
│   │       │   └── Contents.json
│   │       ├── g_boy_avatar.imageset/
│   │       │   └── Contents.json
│   │       ├── g_boy_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── g_boy_tip.imageset/
│   │       │   └── Contents.json
│   │       ├── g_close.imageset/
│   │       │   └── Contents.json
│   │       ├── g_girl.imageset/
│   │       │   └── Contents.json
│   │       ├── g_girl_avatar.imageset/
│   │       │   └── Contents.json
│   │       ├── g_girl_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── g_girl_tip.imageset/
│   │       │   └── Contents.json
│   │       ├── g_left_line.imageset/
│   │       │   └── Contents.json
│   │       ├── g_right_line.imageset/
│   │       │   └── Contents.json
│   │       ├── g_sex_tip.imageset/
│   │       │   └── Contents.json
│   │       ├── g_tip_overview.imageset/
│   │       │   └── Contents.json
│   │       ├── game_image.imageset/
│   │       │   └── Contents.json
│   │       ├── gou.imageset/
│   │       │   └── Contents.json
│   │       ├── green_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── guanbi.imageset/
│   │       │   └── Contents.json
│   │       ├── guanbiNotify.imageset/
│   │       │   └── Contents.json
│   │       ├── hsm_default_avatar.imageset/
│   │       │   └── Contents.json
│   │       ├── hsm_icon_1.imageset/
│   │       │   └── Contents.json
│   │       ├── hsm_icon_2.imageset/
│   │       │   └── Contents.json
│   │       ├── hsm_icon_3.imageset/
│   │       │   └── Contents.json
│   │       ├── hsm_new_topic_tip.imageset/
│   │       │   └── Contents.json
│   │       ├── interstitialIcon.imageset/
│   │       │   └── Contents.json
│   │       ├── interstitialIconclose.imageset/
│   │       │   └── Contents.json
│   │       ├── jiantou.imageset/
│   │       │   └── Contents.json
│   │       ├── jingdian.imageset/
│   │       │   └── Contents.json
│   │       ├── jinjiv3.imageset/
│   │       │   └── Contents.json
│   │       ├── landscape.imageset/
│   │       │   └── Contents.json
│   │       ├── last_read_resource.imageset/
│   │       │   └── Contents.json
│   │       ├── liantu.imageset/
│   │       │   └── Contents.json
│   │       ├── liebiao.imageset/
│   │       │   └── Contents.json
│   │       ├── lishiv3.imageset/
│   │       │   └── Contents.json
│   │       ├── listbofang.imageset/
│   │       │   └── Contents.json
│   │       ├── listpaixu.imageset/
│   │       │   └── Contents.json
│   │       ├── listshengyin.imageset/
│   │       │   └── Contents.json
│   │       ├── listxiazai.imageset/
│   │       │   └── Contents.json
│   │       ├── listxuanji.imageset/
│   │       │   └── Contents.json
│   │       ├── login_background.imageset/
│   │       │   └── Contents.json
│   │       ├── login_country_background.imageset/
│   │       │   └── Contents.json
│   │       ├── login_country_background_highlighted.imageset/
│   │       │   └── Contents.json
│   │       ├── logo.imageset/
│   │       │   └── Contents.json
│   │       ├── logo_recommend.imageset/
│   │       │   └── Contents.json
│   │       ├── logo_recommend_ipad.imageset/
│   │       │   └── Contents.json
│   │       ├── lsm_view_shadow.imageset/
│   │       │   └── Contents.json
│   │       ├── m_success_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── mode_baidu.imageset/
│   │       │   └── Contents.json
│   │       ├── mode_cp.imageset/
│   │       │   └── Contents.json
│   │       ├── mode_easou.imageset/
│   │       │   └── Contents.json
│   │       ├── mode_juhe.imageset/
│   │       │   └── Contents.json
│   │       ├── mode_leidian.imageset/
│   │       │   └── Contents.json
│   │       ├── mode_shenma.imageset/
│   │       │   └── Contents.json
│   │       ├── mode_sogou.imageset/
│   │       │   └── Contents.json
│   │       ├── mode_soso.imageset/
│   │       │   └── Contents.json
│   │       ├── mode_tieba.imageset/
│   │       │   └── Contents.json
│   │       ├── mode_zhineng.imageset/
│   │       │   └── Contents.json
│   │       ├── month_jiaobiao.imageset/
│   │       │   └── Contents.json
│   │       ├── month_kuang.imageset/
│   │       │   └── Contents.json
│   │       ├── month_kuang1.imageset/
│   │       │   └── Contents.json
│   │       ├── month_touxiang.imageset/
│   │       │   └── Contents.json
│   │       ├── monthly_book_mark.imageset/
│   │       │   └── Contents.json
│   │       ├── monthly_mark.imageset/
│   │       │   └── Contents.json
│   │       ├── move-down.imageset/
│   │       │   └── Contents.json
│   │       ├── move-up.imageset/
│   │       │   └── Contents.json
│   │       ├── mp_arrow_down.imageset/
│   │       │   └── Contents.json
│   │       ├── mp_arrow_left.imageset/
│   │       │   └── Contents.json
│   │       ├── mp_arrow_right.imageset/
│   │       │   └── Contents.json
│   │       ├── mp_arrow_up.imageset/
│   │       │   └── Contents.json
│   │       ├── mp_refresh.imageset/
│   │       │   └── Contents.json
│   │       ├── mp_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── mp_unselected.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_ad_shadow.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_arrow.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_avatar_wrapper.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_book_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_header_background.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_header_shadow.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_home_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_hot_vote.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_mani_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_post_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_reply_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_separator.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_title.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_topic_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_vote_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── n_comment.imageset/
│   │       │   └── Contents.json
│   │       ├── n_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── n_link.imageset/
│   │       │   └── Contents.json
│   │       ├── n_reply.imageset/
│   │       │   └── Contents.json
│   │       ├── n_vote.imageset/
│   │       │   └── Contents.json
│   │       ├── nav_add_book.imageset/
│   │       │   └── Contents.json
│   │       ├── nav_add_book_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── nav_arrow_down.imageset/
│   │       │   └── Contents.json
│   │       ├── nav_arrow_up.imageset/
│   │       │   └── Contents.json
│   │       ├── nav_back_red.imageset/
│   │       │   └── Contents.json
│   │       ├── nav_back_red_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── nav_back_white.imageset/
│   │       │   └── Contents.json
│   │       ├── nav_back_white_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── nav_home_side_menu.imageset/
│   │       │   └── Contents.json
│   │       ├── nav_home_side_menu_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── navigationbar_background.imageset/
│   │       │   └── Contents.json
│   │       ├── navigationbar_background_os7.imageset/
│   │       │   └── Contents.json
│   │       ├── network_cut.imageset/
│   │       │   └── Contents.json
│   │       ├── newUser_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── newUser_close.imageset/
│   │       │   └── Contents.json
│   │       ├── new_nav_hilighted.imageset/
│   │       │   └── Contents.json
│   │       ├── new_nav_night_hilighted.imageset/
│   │       │   └── Contents.json
│   │       ├── new_nav_night_normal.imageset/
│   │       │   └── Contents.json
│   │       ├── new_nav_night_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── new_nav_normal.imageset/
│   │       │   └── Contents.json
│   │       ├── new_nav_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── new_nav_vertical_separator.imageset/
│   │       │   └── Contents.json
│   │       ├── new_notification_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── new_notification_tip.imageset/
│   │       │   └── Contents.json
│   │       ├── night_mode.imageset/
│   │       │   └── Contents.json
│   │       ├── nl_qq.imageset/
│   │       │   └── Contents.json
│   │       ├── nl_wechat.imageset/
│   │       │   └── Contents.json
│   │       ├── nl_weibo.imageset/
│   │       │   └── Contents.json
│   │       ├── nl_xiaomi.imageset/
│   │       │   └── Contents.json
│   │       ├── no_network.imageset/
│   │       │   └── Contents.json
│   │       ├── no_resource.imageset/
│   │       │   └── Contents.json
│   │       ├── notice_image.imageset/
│   │       │   └── Contents.json
│   │       ├── nvshengv3.imageset/
│   │       │   └── Contents.json
│   │       ├── official_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── p_anywhere.imageset/
│   │       │   └── Contents.json
│   │       ├── p_anywhere_ipad.imageset/
│   │       │   └── Contents.json
│   │       ├── p_anywhere_title.imageset/
│   │       │   └── Contents.json
│   │       ├── p_anywhere_title_ipad.imageset/
│   │       │   └── Contents.json
│   │       ├── p_btn.imageset/
│   │       │   └── Contents.json
│   │       ├── p_btn_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── p_fast.imageset/
│   │       │   └── Contents.json
│   │       ├── p_fast_ipad.imageset/
│   │       │   └── Contents.json
│   │       ├── p_fast_title.imageset/
│   │       │   └── Contents.json
│   │       ├── p_fast_title_ipad.imageset/
│   │       │   └── Contents.json
│   │       ├── p_guest_tip.imageset/
│   │       │   └── Contents.json
│   │       ├── p_guest_tip_ipad.imageset/
│   │       │   └── Contents.json
│   │       ├── p_logo.imageset/
│   │       │   └── Contents.json
│   │       ├── p_logo_ipad.imageset/
│   │       │   └── Contents.json
│   │       ├── p_logo_small.imageset/
│   │       │   └── Contents.json
│   │       ├── p_logo_small_ipad.imageset/
│   │       │   └── Contents.json
│   │       ├── p_qq_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── p_sina_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── p_synchronize.imageset/
│   │       │   └── Contents.json
│   │       ├── p_synchronize_ipad.imageset/
│   │       │   └── Contents.json
│   │       ├── p_synchronize_title.imageset/
│   │       │   └── Contents.json
│   │       ├── p_synchronize_title_ipad.imageset/
│   │       │   └── Contents.json
│   │       ├── pay_alipay.imageset/
│   │       │   └── Contents.json
│   │       ├── pay_apple.imageset/
│   │       │   └── Contents.json
│   │       ├── pay_record_option.imageset/
│   │       │   └── Contents.json
│   │       ├── pay_weixin.imageset/
│   │       │   └── Contents.json
│   │       ├── pf_header_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── pf_new_notification.imageset/
│   │       │   └── Contents.json
│   │       ├── pf_ratebottom.imageset/
│   │       │   └── Contents.json
│   │       ├── pf_rateupper.imageset/
│   │       │   └── Contents.json
│   │       ├── pink_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── play_big_image.imageset/
│   │       │   └── Contents.json
│   │       ├── player_back.imageset/
│   │       │   └── Contents.json
│   │       ├── player_pause.imageset/
│   │       │   └── Contents.json
│   │       ├── player_play.imageset/
│   │       │   └── Contents.json
│   │       ├── portrait.imageset/
│   │       │   └── Contents.json
│   │       ├── post_tip_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── preview_btn.imageset/
│   │       │   └── Contents.json
│   │       ├── previewed_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── progress_cancel.imageset/
│   │       │   └── Contents.json
│   │       ├── progress_cancel_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── progresshud_background.imageset/
│   │       │   └── Contents.json
│   │       ├── promotion_image.imageset/
│   │       │   └── Contents.json
│   │       ├── qqicon.imageset/
│   │       │   └── Contents.json
│   │       ├── ranking_arrow_down.imageset/
│   │       │   └── Contents.json
│   │       ├── ranking_other.imageset/
│   │       │   └── Contents.json
│   │       ├── rd_func_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── rd_reading_add_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── rd_reading_added_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── rd_reading_change_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── readAloud.imageset/
│   │       │   └── Contents.json
│   │       ├── readAloud_exit.imageset/
│   │       │   └── Contents.json
│   │       ├── readAloud_more.imageset/
│   │       │   └── Contents.json
│   │       ├── readAloud_more_highLighted.imageset/
│   │       │   └── Contents.json
│   │       ├── readAloud_pause.imageset/
│   │       │   └── Contents.json
│   │       ├── readAloud_play.imageset/
│   │       │   └── Contents.json
│   │       ├── reading_landscape.imageset/
│   │       │   └── Contents.json
│   │       ├── reading_more_setting.imageset/
│   │       │   └── Contents.json
│   │       ├── reading_more_setting_landscape.imageset/
│   │       │   └── Contents.json
│   │       ├── reading_record_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── reading_setting.imageset/
│   │       │   └── Contents.json
│   │       ├── reading_tip_menu.imageset/
│   │       │   └── Contents.json
│   │       ├── reading_tip_next.imageset/
│   │       │   └── Contents.json
│   │       ├── reading_tip_pre.imageset/
│   │       │   └── Contents.json
│   │       ├── recommend_new.imageset/
│   │       │   └── Contents.json
│   │       ├── recommend_top.imageset/
│   │       │   └── Contents.json
│   │       ├── red_menu_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── refresh_arrow.imageset/
│   │       │   └── Contents.json
│   │       ├── refresh_finish.imageset/
│   │       │   └── Contents.json
│   │       ├── reward.imageset/
│   │       │   └── Contents.json
│   │       ├── reward_launch.imageset/
│   │       │   └── Contents.json
│   │       ├── rp_arrow.imageset/
│   │       │   └── Contents.json
│   │       ├── rp_badge_disabled.imageset/
│   │       │   └── Contents.json
│   │       ├── rp_badge_normal.imageset/
│   │       │   └── Contents.json
│   │       ├── rp_checkbox.imageset/
│   │       │   └── Contents.json
│   │       ├── rp_checkbox_unchecked.imageset/
│   │       │   └── Contents.json
│   │       ├── rp_disabled_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── rp_info.imageset/
│   │       │   └── Contents.json
│   │       ├── rp_no_network.imageset/
│   │       │   └── Contents.json
│   │       ├── rp_normal_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── rp_selected_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_0.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_1.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_10.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_2.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_3.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_4.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_5.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_6.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_7.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_8.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_9.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_comic.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_exclusive.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_monthly.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_recommended.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_store.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_wifi.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_view_shadow.imageset/
│   │       │   └── Contents.json
│   │       ├── s_wechat.imageset/
│   │       │   └── Contents.json
│   │       ├── sdk_weibo_logo.imageset/
│   │       │   └── Contents.json
│   │       ├── search_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── search_cannot_delete.imageset/
│   │       │   └── Contents.json
│   │       ├── search_cannot_refresh.imageset/
│   │       │   └── Contents.json
│   │       ├── search_delete.imageset/
│   │       │   └── Contents.json
│   │       ├── search_history_mark.imageset/
│   │       │   └── Contents.json
│   │       ├── search_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── search_refresh.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_fontFanJian_jian.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_font_bigger_nomal.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_font_bigger_nomal_h.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_font_bigger_uneable.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_font_fan.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_font_jian.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_font_nomal.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_font_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_font_snaller_normal.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_font_snaller_normal_h.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_font_snaller_uneable.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_orientation_hengpin.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_orientation_shupin.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_paly.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_set.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_space_big_nomal.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_space_big_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_space_nomal.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_space_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_space_small_nomal.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_space_small_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_theme_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── shang.imageset/
│   │       │   └── Contents.json
│   │       ├── sheepskin_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── shengyin.imageset/
│   │       │   └── Contents.json
│   │       ├── show_right_sidemenu_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── sign_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── sign_gotoSign.imageset/
│   │       │   └── Contents.json
│   │       ├── sign_signed.imageset/
│   │       │   └── Contents.json
│   │       ├── sign_success.imageset/
│   │       │   └── Contents.json
│   │       ├── slider.imageset/
│   │       │   └── Contents.json
│   │       ├── slider_black.imageset/
│   │       │   └── Contents.json
│   │       ├── slider_red.imageset/
│   │       │   └── Contents.json
│   │       ├── sm_arrow_down.imageset/
│   │       │   └── Contents.json
│   │       ├── sm_bottom_background.imageset/
│   │       │   └── Contents.json
│   │       ├── sm_bottom_shadow.imageset/
│   │       │   └── Contents.json
│   │       ├── sm_exit.imageset/
│   │       │   └── Contents.json
│   │       ├── sm_exit_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── sm_forum_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── sm_forum_bg_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── sm_topic_tip_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── sm_web_back.imageset/
│   │       │   └── Contents.json
│   │       ├── sm_web_forward.imageset/
│   │       │   └── Contents.json
│   │       ├── sm_web_refresh.imageset/
│   │       │   └── Contents.json
│   │       ├── splash_bottom_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── splash_bottom_logo.imageset/
│   │       │   └── Contents.json
│   │       ├── success.imageset/
│   │       │   └── Contents.json
│   │       ├── switch.imageset/
│   │       │   └── Contents.json
│   │       ├── task_lanch.imageset/
│   │       │   └── Contents.json
│   │       ├── task_person.imageset/
│   │       │   └── Contents.json
│   │       ├── task_praise.imageset/
│   │       │   └── Contents.json
│   │       ├── task_share.imageset/
│   │       │   └── Contents.json
│   │       ├── timeline_relationship_icon_addattention.imageset/
│   │       │   └── Contents.json
│   │       ├── timeline_relationship_icon_attention.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_baidu.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_baidu_active.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_bg1.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_close.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_fold.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_message.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_message_active.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_navBack.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_navBack_active.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_navForward.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_navForward_active.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_unfold.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_weibo.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_weibo_active.imageset/
│   │       │   └── Contents.json
│   │       ├── update_image.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_account-1.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_account.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_bookList-1.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_bookList.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_comment.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_exchange.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_experience-1.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_experience.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_history.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_msg-1.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_msg.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_rate-1.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_rate.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_setting-1.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_setting.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_setting2.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_task.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_topic-1.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_topic.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_wechat.imageset/
│   │       │   └── Contents.json
│   │       ├── verify_code_button.imageset/
│   │       │   └── Contents.json
│   │       ├── verify_code_button_highlighted.imageset/
│   │       │   └── Contents.json
│   │       ├── video_volumeoff.imageset/
│   │       │   └── Contents.json
│   │       ├── video_volumeon.imageset/
│   │       │   └── Contents.json
│   │       ├── violet_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── voicefenxiang.imageset/
│   │       │   └── Contents.json
│   │       ├── volumeoff.imageset/
│   │       │   └── Contents.json
│   │       ├── volumeon.imageset/
│   │       │   └── Contents.json
│   │       ├── wangwenv3.imageset/
│   │       │   └── Contents.json
│   │       ├── water_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── wechat.imageset/
│   │       │   └── Contents.json
│   │       ├── wechatQR.imageset/
│   │       │   └── Contents.json
│   │       ├── weekGreen_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── weekPink_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── white_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── xia.imageset/
│   │       │   └── Contents.json
│   │       ├── yellow_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── yuan.imageset/
│   │       │   └── Contents.json
│   │       ├── yuanchuangv3.imageset/
│   │       │   └── Contents.json
│   │       ├── zanting.imageset/
│   │       │   └── Contents.json
│   │       ├── zantingNotify.imageset/
│   │       │   └── Contents.json
│   │       ├── zhonghev3.imageset/
│   │       │   └── Contents.json
│   │       ├── zhui.imageset/
│   │       │   └── Contents.json
│   │       ├── zssq_image.imageset/
│   │       │   └── Contents.json
│   │       ├── zuire.imageset/
│   │       │   └── Contents.json
│   │       ├── zuixin.imageset/
│   │       │   └── Contents.json
│   │       ├── 方正兰亭黑.imageset/
│   │       │   └── Contents.json
│   │       ├── 日文字体.imageset/
│   │       │   └── Contents.json
│   │       ├── 楷体.imageset/
│   │       │   └── Contents.json
│   │       ├── 翩翩体.imageset/
│   │       │   └── Contents.json
│   │       ├── 隶变.imageset/
│   │       │   └── Contents.json
│   │       ├── 雅痞.imageset/
│   │       │   └── Contents.json
│   │       ├── 魏碑.imageset/
│   │       │   └── Contents.json
│   │       ├── 黑体.imageset/
│   │       │   └── Contents.json
│   │       └── 默认.imageset/
│   │           └── Contents.json
│   ├── Base/
│   │   ├── Controllers/
│   │   │   ├── BaseViewController.swift
│   │   │   ├── SideViewController.swift
│   │   │   ├── ZSBaseNavigationViewController.swift
│   │   │   ├── ZSBaseTableViewController.swift
│   │   │   ├── ZSSegmentViewController.swift
│   │   │   └── ZSSegmenuViewController.swift
│   │   ├── Models/
│   │   │   ├── SwiftyJSON.swift
│   │   │   ├── XYCBaseModel.h
│   │   │   ├── XYCBaseModel.m
│   │   │   └── ZSCacheHelper.swift
│   │   ├── ViewManager/
│   │   │   ├── ZSAppInfo.swift
│   │   │   ├── ZSBaseTableViewManger.swift
│   │   │   ├── ZSBookDownloader.swift
│   │   │   └── ZSCellAdapterProtocol.swift
│   │   └── Views/
│   │       ├── CommunityView.swift
│   │       ├── DarkStarView.swift
│   │       ├── DarkView.swift
│   │       ├── EmptyView.swift
│   │       ├── EmptyView.xib
│   │       ├── LightStarView.swift
│   │       ├── LightView.swift
│   │       ├── QSLoadingView.swift
│   │       ├── RateView.swift
│   │       ├── UIScrollView+StateView.h
│   │       ├── UIScrollView+StateView.m
│   │       ├── V2FPSLabel.swift
│   │       ├── XYCActionSheet.swift
│   │       ├── ZSBaseCellAdapter.swift
│   │       └── ZSBaseSectionAdapter.swift
│   ├── Base.lproj/
│   │   ├── LaunchScreen.storyboard
│   │   └── Main.storyboard
│   ├── Client/
│   │   ├── QSAPI.swift
│   │   └── QSNetworkManager.swift
│   ├── Extension/
│   │   ├── Alamofire+ZSExtension.swift
│   │   ├── ApplicationExtension.swift
│   │   ├── Array+ZSExtension.swift
│   │   ├── Date+Extension.swift
│   │   ├── DateIntervalFormatter+formatter.swift
│   │   ├── Dictionary+QSExtension.swift
│   │   ├── DispatchTime+Extension.swift
│   │   ├── LocalizedUtils.swift
│   │   ├── NSDate+Extension.h
│   │   ├── NSDate+Extension.m
│   │   ├── NSObject+Extension.swift
│   │   ├── NSString+Encode.h
│   │   ├── NSString+Encode.m
│   │   ├── NotificationCenter+QSExtension.swift
│   │   ├── Reachability.swift
│   │   ├── SQLite+Extension.swift
│   │   ├── String+QSExtension.swift
│   │   ├── SwiftStdlib/
│   │   │   ├── FloatExtensions.swift
│   │   │   └── IntExtensions.swift
│   │   ├── UIButton+Extension.swift
│   │   ├── UICollectionView+QSExtension.swift
│   │   ├── UIColor+Theme.swift
│   │   ├── UIFont+Extension.swift
│   │   ├── UIFont+ZSExtension.h
│   │   ├── UIFont+ZSExtension.m
│   │   ├── UIImage+QSData.swift
│   │   ├── UIImageView+zhuishu.swift
│   │   ├── UILabel+zhuishu.swift
│   │   ├── UINavigationItem+BackItem.h
│   │   ├── UINavigationItem+BackItem.m
│   │   ├── UIStoryboardExtension.swift
│   │   ├── UITableView+FINAutomaticHeightCell.swift
│   │   ├── UITableView+QSGeneric.swift
│   │   ├── UITableView+swizzling.swift
│   │   ├── UITableViewCell+ZSExtension.swift
│   │   ├── UIView+ScreenShot.swift
│   │   ├── UIViewController+Alert.swift
│   │   ├── UserDefaultsExtension.swift
│   │   ├── Value.swift
│   │   └── copy.txt
│   ├── Info.plist
│   ├── IntroducePage/
│   │   ├── QSIntroduceCell.swift
│   │   ├── QSIntroduceCell.xib
│   │   ├── QSIntroduceReadCell.swift
│   │   ├── QSIntroduceReadCell.xib
│   │   ├── QSLastIntroduceCell.swift
│   │   ├── QSLastIntroduceCell.xib
│   │   └── ZSIntroducePage.swift
│   ├── NewVersion/
│   │   ├── BookShelf/
│   │   │   ├── NavigationBar.swift
│   │   │   ├── ZSBookLocalShelfViewController.swift
│   │   │   ├── ZSBookShelfHeaderView.swift
│   │   │   ├── ZSBookShelfViewController.swift
│   │   │   ├── ZSBookShelfViewModel.swift
│   │   │   ├── ZSRefreshTextHeader.swift
│   │   │   ├── ZSShelfManager.swift
│   │   │   ├── ZSShelfOperatingView.swift
│   │   │   ├── ZSShelfStorage.swift
│   │   │   ├── ZSShelfTableViewCell.swift
│   │   │   ├── ZSSyncStorage.swift
│   │   │   ├── ZSToast.swift
│   │   │   └── mjRefreshHeadTitle.plist
│   │   ├── BookStore/
│   │   │   └── ZSBookStoreViewController.swift
│   │   ├── Comment/
│   │   │   ├── ZSForumComment.swift
│   │   │   ├── ZSForumPageCell.swift
│   │   │   ├── ZSForumPageFooterView.swift
│   │   │   ├── ZSForumPageHeaderView.swift
│   │   │   ├── ZSForumPageTitleHeaderView.swift
│   │   │   ├── ZSForumPageViewController.swift
│   │   │   ├── ZSForumTextView.swift
│   │   │   ├── ZSForumToolBar.swift
│   │   │   ├── ZSForumViewModel.swift
│   │   │   ├── ZSPostReview.swift
│   │   │   ├── ZSPostReviewAuthor.swift
│   │   │   ├── ZSPostReviewBook.swift
│   │   │   └── ZSPostReviewHelpful.swift
│   │   ├── Community/
│   │   │   ├── ZSCommunityCell.swift
│   │   │   ├── ZSCommunityHot.swift
│   │   │   ├── ZSCommunityHotCell.swift
│   │   │   ├── ZSCommunityNavigationBar.swift
│   │   │   ├── ZSCommunityViewController.swift
│   │   │   ├── ZSCommunityViewModel.swift
│   │   │   ├── ZSDynamicHeaderView.swift
│   │   │   ├── ZSDynamicViewModel.swift
│   │   │   ├── ZSFollowings.swift
│   │   │   ├── ZSInsertedBookScoreView.swift
│   │   │   ├── ZSNoNetworkView.swift
│   │   │   ├── ZSNotification.swift
│   │   │   ├── ZSNotificationCell.swift
│   │   │   ├── ZSNotificationViewController.swift
│   │   │   ├── ZSNotificationViewModel.swift
│   │   │   ├── ZSRefreshFooter.swift
│   │   │   └── ZSUserDynamicViewController.swift
│   │   ├── CoreText/
│   │   │   ├── CTSettings.swift
│   │   │   ├── MarkupParser.swift
│   │   │   ├── ZSDisplayView.swift
│   │   │   └── ZSTouchAnchorView.swift
│   │   ├── Device/
│   │   │   ├── ZSFloatingManager.swift
│   │   │   ├── ZSFloatingView.swift
│   │   │   ├── ZSFloatingViewController.swift
│   │   │   ├── ZSFloatingWindow.swift
│   │   │   └── ZSMemoryFloatingView.swift
│   │   ├── Discover/
│   │   │   ├── ZSDiscoverHeaderView.swift
│   │   │   ├── ZSDiscoverItem.swift
│   │   │   ├── ZSDiscoverNavigationBar.swift
│   │   │   ├── ZSDiscoverViewController.swift
│   │   │   └── ZSSearchViewController.swift
│   │   ├── File/
│   │   │   └── EncrtptorText
│   │   ├── Mine/
│   │   │   ├── ZSAddSourceTextField.h
│   │   │   ├── ZSAddSourceTextField.m
│   │   │   ├── ZSAddSourceViewController.swift
│   │   │   ├── ZSDetailButtonCell.swift
│   │   │   ├── ZSMineHeaderView.swift
│   │   │   ├── ZSMineMenuItem.swift
│   │   │   ├── ZSMineNavigationBar.swift
│   │   │   ├── ZSMineViewController.swift
│   │   │   ├── ZSMineViewModel.swift
│   │   │   ├── ZSRegularVerifyViewController.swift
│   │   │   ├── ZSSetting.swift
│   │   │   ├── ZSSourceCell.swift
│   │   │   └── ZSSourcesViewController.swift
│   │   ├── Network/
│   │   │   └── ZSNetwork.swift
│   │   ├── Reader/
│   │   │   ├── Color.swift
│   │   │   ├── ReaderBar.swift
│   │   │   ├── ReaderNavigationBar.swift
│   │   │   ├── ThemeManager.swift
│   │   │   ├── ZSBookCache.swift
│   │   │   ├── ZSBookChapter.swift
│   │   │   ├── ZSBookDiskCache.swift
│   │   │   ├── ZSBookMemoryCache.swift
│   │   │   ├── ZSHorizonalViewController.swift
│   │   │   ├── ZSNormalViewController.swift
│   │   │   ├── ZSPageTableViewCell.swift
│   │   │   ├── ZSPageViewController.swift
│   │   │   ├── ZSReadHistory.swift
│   │   │   ├── ZSReader.swift
│   │   │   ├── ZSReaderBaseViewModel.swift
│   │   │   ├── ZSReaderBottomBar.swift
│   │   │   ├── ZSReaderBottomBigBar.swift
│   │   │   ├── ZSReaderCache.swift
│   │   │   ├── ZSReaderCatalogViewController.swift
│   │   │   ├── ZSReaderController.swift
│   │   │   ├── ZSReaderDownloader.swift
│   │   │   ├── ZSReaderStyleSelectionView.swift
│   │   │   ├── ZSReaderThemeSelectionView.swift
│   │   │   ├── ZSReaderToolbar.swift
│   │   │   ├── ZSReaderTopbar.swift
│   │   │   ├── ZSReaderTouchArea.swift
│   │   │   ├── ZSReaderVCProtocol.swift
│   │   │   └── ZSVerticalViewController.swift
│   │   ├── Search/
│   │   │   ├── AikanHtmlParser.h
│   │   │   ├── AikanHtmlParser.m
│   │   │   ├── AikanParserModel.h
│   │   │   ├── AikanParserModel.m
│   │   │   ├── AikanParserModel.swift
│   │   │   ├── ZSAikanHtmlParser.swift
│   │   │   ├── ZSBookInfoHeaderView.swift
│   │   │   ├── ZSHeaderSearch.swift
│   │   │   ├── ZSHeaderSearchCell.swift
│   │   │   ├── ZSHotWord.swift
│   │   │   ├── ZSSearchBookView.swift
│   │   │   ├── ZSSearchBookViewController.swift
│   │   │   ├── ZSSearchBookViewModel.swift
│   │   │   ├── ZSSearchHistory.swift
│   │   │   ├── ZSSearchHotView.swift
│   │   │   ├── ZSSearchHotwords.swift
│   │   │   ├── ZSSearchInfoBottomView.swift
│   │   │   ├── ZSSearchInfoTableViewCell.swift
│   │   │   ├── ZSSearchInfoViewController.swift
│   │   │   ├── ZSSearchRecommendView.swift
│   │   │   ├── ZSSearchResultCell.swift
│   │   │   ├── ZSSearchResultView.swift
│   │   │   ├── ZSSourceManager.swift
│   │   │   └── ZSTopSearchBar.swift
│   │   ├── Tabbar/
│   │   │   └── ZSTabBarController.swift
│   │   ├── ZSAPI/
│   │   │   ├── LICENSE
│   │   │   ├── ZSAPI/
│   │   │   │   └── Classes/
│   │   │   │       └── ZSAPI.swift
│   │   │   └── ZSAPI.podspec
│   │   ├── ZSAppConfig/
│   │   │   ├── LICENSE
│   │   │   ├── ZSAppConfig/
│   │   │   │   └── Classes/
│   │   │   │       ├── AppStyle.swift
│   │   │   │       ├── Config.swift
│   │   │   │       ├── Reader.swift
│   │   │   │       └── Theme.swift
│   │   │   └── ZSAppConfig.podspec
│   │   ├── ZSExtension/
│   │   │   ├── LICENSE
│   │   │   ├── ZSExtension/
│   │   │   │   └── Classes/
│   │   │   │       ├── Alamofire+ZSExtension.swift
│   │   │   │       ├── Array+ZSExtension.swift
│   │   │   │       ├── Date+Extension.swift
│   │   │   │       ├── DateIntervalFormatter+formatter.swift
│   │   │   │       ├── Dictionary+QSExtension.swift
│   │   │   │       ├── DispatchTime+Extension.swift
│   │   │   │       ├── LocalizedUtils.swift
│   │   │   │       ├── NSData+Base64.h
│   │   │   │       ├── NSData+Base64.m
│   │   │   │       ├── NSDate+Extension.h
│   │   │   │       ├── NSDate+Extension.m
│   │   │   │       ├── NSObject+Extension.swift
│   │   │   │       ├── NSString+Encode.h
│   │   │   │       ├── NSString+Encode.m
│   │   │   │       ├── Network.swift
│   │   │   │       ├── NotificationCenter+QSExtension.swift
│   │   │   │       ├── Reachability.swift
│   │   │   │       ├── SQLite+Extension.swift
│   │   │   │       ├── String+QSExtension.swift
│   │   │   │       ├── SwiftStdlib/
│   │   │   │       │   ├── FloatExtensions.swift
│   │   │   │       │   └── IntExtensions.swift
│   │   │   │       ├── UIButton+Extension.swift
│   │   │   │       ├── UICollectionView+QSExtension.swift
│   │   │   │       ├── UIColor+Theme.swift
│   │   │   │       ├── UIFont+Extension.swift
│   │   │   │       ├── UIFont+ZSExtension.h
│   │   │   │       ├── UIFont+ZSExtension.m
│   │   │   │       ├── UIImage+QSData.swift
│   │   │   │       ├── UIImageView+zhuishu.swift
│   │   │   │       ├── UILabel+zhuishu.swift
│   │   │   │       ├── UINavigationItem+BackItem.h
│   │   │   │       ├── UINavigationItem+BackItem.m
│   │   │   │       ├── UITableView+FINAutomaticHeightCell.swift
│   │   │   │       ├── UITableView+QSGeneric.swift
│   │   │   │       ├── UITableView+swizzling.swift
│   │   │   │       ├── UITableViewCell+ZSExtension.swift
│   │   │   │       ├── UIView+ScreenShot.swift
│   │   │   │       ├── UIViewController+Alert.swift
│   │   │   │       ├── Value.swift
│   │   │   │       └── ZSBaseService.swift
│   │   │   └── ZSExtension.podspec
│   │   └── ZSThirdPartSDK/
│   │       ├── LICENSE
│   │       ├── ZSThirdPartSDK/
│   │       │   └── Classes/
│   │       │       ├── TencentOpenAPI.framework/
│   │       │       │   ├── Headers/
│   │       │       │   │   ├── QQApiInterface.h
│   │       │       │   │   ├── QQApiInterfaceObject.h
│   │       │       │   │   ├── TencentOAuth.h
│   │       │       │   │   └── sdkdef.h
│   │       │       │   └── TencentOpenAPI
│   │       │       ├── ThirdPardSDK-Info.plist
│   │       │       ├── WXApiRequestHandler.h
│   │       │       ├── WXApiRequestHandler.m
│   │       │       ├── WeChatSDK1.8.3/
│   │       │       │   ├── README.txt
│   │       │       │   ├── WXApi.h
│   │       │       │   ├── WXApiObject.h
│   │       │       │   ├── WechatAuthSDK.h
│   │       │       │   └── libWeChatSDK.a
│   │       │       ├── ZSLogin.h
│   │       │       ├── ZSLogin.m
│   │       │       ├── ZSLoginHelper.h
│   │       │       ├── ZSLoginHelper.m
│   │       │       ├── ZSLoginService.swift
│   │       │       ├── ZSMobileLogin.swift
│   │       │       ├── ZSQQUser.swift
│   │       │       ├── ZSThirdLogin.h
│   │       │       ├── ZSThirdLogin.m
│   │       │       ├── ZSThirdPartSDK.h
│   │       │       ├── ZSWXAccessTokenResp.swift
│   │       │       └── libWeiboSDK/
│   │       │           ├── WBHttpRequest.h
│   │       │           ├── WeiboSDK.bundle/
│   │       │           │   └── others/
│   │       │           │       └── mfp.cer
│   │       │           ├── WeiboSDK.h
│   │       │           └── libWeiboSDK.a
│   │       └── ZSThirdPartSDK.podspec
│   ├── RightSide/
│   │   ├── Category/
│   │   │   ├── Controllers/
│   │   │   │   ├── Category/
│   │   │   │   │   └── ZSCatelogViewController.swift
│   │   │   │   └── CategoryDetail/
│   │   │   │       ├── ZSBaseSegmentItemViewController.swift
│   │   │   │       ├── ZSCategoryDetailViewController.swift
│   │   │   │       └── ZSCatelogItemViewController.swift
│   │   │   ├── Models/
│   │   │   │   ├── AddBookAPI.swift
│   │   │   │   ├── AllChapterAPI.swift
│   │   │   │   ├── BookDetailAPI.swift
│   │   │   │   ├── BookShelfAPI.swift
│   │   │   │   ├── CategoryModel.swift
│   │   │   │   ├── DynamicAPI.swift
│   │   │   │   ├── LatestChapterAPI.swift
│   │   │   │   ├── RankingAPI.swift
│   │   │   │   ├── RankingDetailAPI.swift
│   │   │   │   ├── ShelfMessageAPI.swift
│   │   │   │   ├── ZSCatelogHeaderView.swift
│   │   │   │   ├── ZSCatelogModel.swift
│   │   │   │   └── ZSCatelogParameterModel.swift
│   │   │   ├── ViewModel/
│   │   │   │   ├── ZSCatelogDetailViewModel.swift
│   │   │   │   ├── ZSCatelogViewModel.swift
│   │   │   │   └── ZSSegmentBaseViewModel.swift
│   │   │   └── Views/
│   │   │       ├── .DS_Store~876a9ee6afa162f4fb71eff5fa02f2e0dbe52ae2
│   │   │       ├── .DS_Store~HEAD
│   │   │       └── ZSCatelogCell.swift
│   │   ├── Network/
│   │   │   └── QSHotwords.swift
│   │   ├── Ranking/
│   │   │   ├── Controllers/
│   │   │   │   ├── QSRankViewController.swift
│   │   │   │   ├── RankingViewController.swift
│   │   │   │   ├── TopDetailViewController.swift
│   │   │   │   └── ZSRankViewController.swift
│   │   │   ├── Models/
│   │   │   │   └── QSRankModel.swift
│   │   │   ├── Service/
│   │   │   │   ├── ZSRankDetailWebService.swift
│   │   │   │   └── ZSRankService.swift
│   │   │   ├── ViewModel/
│   │   │   │   ├── ZSRankDetailViewModel.swift
│   │   │   │   └── ZSRankViewModel.swift
│   │   │   └── Views/
│   │   │       ├── RankingViewCell.swift
│   │   │       ├── ReadHistoryCell.swift
│   │   │       ├── ReadHistoryCell.xib
│   │   │       ├── TopDetailCell.swift
│   │   │       └── TopDetailCell.xib
│   │   ├── Search/
│   │   │   ├── Controllers/
│   │   │   │   ├── SearchDetailViewController.swift
│   │   │   │   └── SearchViewController.swift
│   │   │   ├── Models/
│   │   │   │   └── QSSearchItem.swift
│   │   │   ├── QSHistoryHeaderView.swift
│   │   │   ├── QSSearchAutoCompleteTable.swift
│   │   │   ├── QSSearchHeaderView.swift
│   │   │   ├── QSSearchInteractor.swift
│   │   │   ├── QSSearchPresenter.swift
│   │   │   ├── QSSearchProtocols.swift
│   │   │   ├── QSSearchResultTable.swift
│   │   │   ├── QSSearchRouter.swift
│   │   │   ├── QSSearchViewController+SearchBar.swift
│   │   │   ├── QSSearchViewController+Transition.swift
│   │   │   ├── QSSearchViewController.swift
│   │   │   ├── Views/
│   │   │   │   ├── QSHistoryCell.swift
│   │   │   │   ├── QSHistoryCell.swift~876a9ee6afa162f4fb71eff5fa02f2e0dbe52ae2
│   │   │   │   ├── QSHistoryCell.swift~HEAD
│   │   │   │   ├── QSHistoryCell.xib
│   │   │   │   ├── SearchView.swift
│   │   │   │   ├── ZSHistoryHeaderView.swift
│   │   │   │   ├── ZSSearchHeaderView.swift
│   │   │   │   ├── ZSSearchViewCell.swift
│   │   │   │   └── ZSSearchViewCell.xib
│   │   │   └── ZSSearchResultViewController.swift
│   │   └── Topic/
│   │       ├── Controllers/
│   │       │   ├── Filter/
│   │       │   │   └── ZSFilterThemeViewController.swift
│   │       │   ├── ThemeTopic/
│   │       │   │   ├── QSThemeTopicInteractor.swift
│   │       │   │   ├── QSThemeTopicPresenter.swift
│   │       │   │   ├── QSThemeTopicProtocols.swift
│   │       │   │   ├── QSThemeTopicRouter.swift
│   │       │   │   └── QSThemeTopicViewController.swift
│   │       │   └── TopicDetail/
│   │       │       ├── QSTopicDetailInteractor.swift
│   │       │       ├── QSTopicDetailPresenter.swift
│   │       │       ├── QSTopicDetailProtocols.swift
│   │       │       ├── QSTopicDetailRouter.swift
│   │       │       ├── QSTopicDetailViewController.swift
│   │       │       └── TopicDetailViewController.swift
│   │       ├── Models/
│   │       │   ├── ThemeTopicModel.swift
│   │       │   ├── TopicDetailHeader.swift
│   │       │   ├── TopicDetailModel.swift
│   │       │   └── ZSFilterThemeModel.swift
│   │       ├── ViewModel/
│   │       │   ├── ZSFilterThemeViewModel.swift
│   │       │   └── ZSThemeTopicViewModel.swift
│   │       └── Views/
│   │           ├── ThemeTopicCell.swift
│   │           ├── ThemeTopicCell.xib
│   │           ├── TopicDetailCell.swift
│   │           ├── TopicDetailCell.xib
│   │           ├── TopicDetailHeaderCell.swift
│   │           ├── TopicDetailHeaderCell.xib
│   │           └── ZSFilterThemeCell.swift
│   ├── Root/
│   │   ├── Controllers/
│   │   │   ├── DynamicViewController.swift
│   │   │   ├── LeftViewController.swift
│   │   │   ├── LookBookViewController.swift
│   │   │   ├── ReadHistoryViewController.swift
│   │   │   ├── RightViewController.swift
│   │   │   ├── RootViewController+FetchData.swift
│   │   │   ├── RootViewController+Subviews.swift
│   │   │   ├── RootViewController.swift
│   │   │   ├── ZSBookShelvesViewController.swift
│   │   │   ├── ZSForumViewController.swift
│   │   │   ├── ZSImportBookViewController.swift
│   │   │   ├── ZSLocalShelfViewController.swift
│   │   │   ├── ZSLoginViewController.swift
│   │   │   ├── ZSModifyNicknameViewController.swift
│   │   │   ├── ZSMyViewController.swift
│   │   │   ├── ZSRootViewController.swift
│   │   │   ├── ZSSettingViewController.swift
│   │   │   ├── ZSShelfViewController.swift
│   │   │   ├── ZSUserAccountViewController.swift
│   │   │   ├── ZSUserInfoViewController.swift
│   │   │   ├── ZSVoiceBookCategoryViewController.swift
│   │   │   ├── ZSVoiceBookSegmentViewController.swift
│   │   │   ├── ZSVoicePlayListViewController.swift
│   │   │   ├── ZSVoicePlayViewController.swift
│   │   │   ├── ZSVoicePlayerViewController.swift
│   │   │   ├── ZSVoucherViewController.swift
│   │   │   ├── ZSWebItem.swift
│   │   │   ├── ZSWebStoreViewController.swift
│   │   │   ├── ZSWebViewController.swift
│   │   │   └── ZSWebViewControllerDelegate.swift
│   │   ├── Models/
│   │   │   ├── QSHotModel.swift
│   │   │   ├── ZSAccount.swift
│   │   │   ├── ZSCoin.swift
│   │   │   ├── ZSConfigUtil.swift
│   │   │   ├── ZSQQUser.swift
│   │   │   ├── ZSShelfMessage.swift
│   │   │   ├── ZSUserBind.swift
│   │   │   ├── ZSUserBookshelf.swift
│   │   │   ├── ZSUserDetail.swift
│   │   │   ├── ZSVoiceAlbum.swift
│   │   │   ├── ZSVoucher.swift
│   │   │   ├── ZSWebBIHandler.swift
│   │   │   ├── ZSWebContext.swift
│   │   │   ├── ZSWebJumpHandler.swift
│   │   │   ├── ZSWebSpeakHandler.swift
│   │   │   ├── ZSWebToolHandler.swift
│   │   │   ├── ZSWebUserHandler.swift
│   │   │   └── ZSYJSchemeHandle.swift
│   │   ├── Service/
│   │   │   ├── ZSBaseService.swift
│   │   │   ├── ZSDiscussWebService.swift
│   │   │   ├── ZSLoginService.swift
│   │   │   ├── ZSMyService.swift
│   │   │   ├── ZSRootWebService.swift
│   │   │   └── ZSShelfWebService.swift
│   │   ├── ViewModel/
│   │   │   ├── ZSDiscussViewModel.swift
│   │   │   ├── ZSHomeViewModel.swift
│   │   │   ├── ZSLocalShelfViewModel.swift
│   │   │   ├── ZSMyViewModel.swift
│   │   │   ├── ZSProtocol.swift
│   │   │   ├── ZSRootViewModel.swift
│   │   │   ├── ZSSetting.plist
│   │   │   ├── ZSSettingViewModel.swift
│   │   │   ├── ZSShelfViewModel.swift
│   │   │   └── ZSVoicePlayViewModel.swift
│   │   └── Views/
│   │       ├── BarButton.swift
│   │       ├── DynamicCell.swift
│   │       ├── DynamicCell.xib
│   │       ├── DynamicCell.xib~876a9ee6afa162f4fb71eff5fa02f2e0dbe52ae2
│   │       ├── DynamicCell.xib~HEAD
│   │       ├── HomeListViewCell.swift
│   │       ├── QSHelpViewCell.swift
│   │       ├── QSHelpViewCell.xib
│   │       ├── QSHomeDeleteBtn.swift
│   │       ├── QSLaunchRecView.swift
│   │       ├── QSLaunchRecView.xib
│   │       ├── QSSegmentDropView.swift
│   │       ├── RightTableViewCell.swift
│   │       ├── RootNavigationView.swift
│   │       ├── SegMenu.swift
│   │       ├── SwipableCell.swift
│   │       ├── ZSLeftViewCell.swift
│   │       ├── ZSLoginVerifyView.swift
│   │       ├── ZSLoginView.swift
│   │       ├── ZSMyCell.swift
│   │       ├── ZSMyHeaderView.swift
│   │       ├── ZSReviewsCell.swift
│   │       ├── ZSReviewsCell.xib
│   │       ├── ZSSwipeCell.swift
│   │       ├── ZSThirdLoginView.swift
│   │       ├── ZSUserBindCell.swift
│   │       ├── ZSVoiceCategoryCell.swift
│   │       ├── ZSVoiceCategoryHeaderView.swift
│   │       ├── ZSVoicePlayProgressView.swift
│   │       ├── ZSVoicePlayerCatelogHeaderView.swift
│   │       ├── ZSVoicePlayerCatelogView.swift
│   │       ├── ZSVoicePlayerView.swift
│   │       ├── ZSVoiceSegmentView.swift
│   │       └── ZSVoucherView.swift
│   ├── Splash/
│   │   ├── QSSplashScreen.swift
│   │   └── SplashViewController.swift
│   ├── TXTReader/
│   │   ├── BookComment/
│   │   │   ├── Model/
│   │   │   │   └── ZSBookCTLayoutModel.swift
│   │   │   ├── Service/
│   │   │   │   ├── ZSBookCTService.swift
│   │   │   │   └── ZSBookCommentService.swift
│   │   │   ├── View/
│   │   │   │   ├── BookCommentViewController.swift
│   │   │   │   ├── QSBookCommentInteractor.swift
│   │   │   │   ├── QSBookCommentPresenter.swift
│   │   │   │   ├── QSBookCommentProtocols.swift
│   │   │   │   ├── QSBookCommentRouter.swift
│   │   │   │   ├── QSBookCommentViewController.swift
│   │   │   │   ├── TXTReader.storyboard
│   │   │   │   ├── ZSBestReviewView.swift
│   │   │   │   ├── ZSBookReviewViewController.swift
│   │   │   │   ├── ZSFeelingView.swift
│   │   │   │   ├── ZSHottwitterViewController.swift
│   │   │   │   ├── ZSReviewDetailView.swift
│   │   │   │   └── ZSWriteReview.swift
│   │   │   └── ViewModel/
│   │   │       ├── ZSBookCTViewModel.swift
│   │   │       └── ZSBookCommentViewModel.swift
│   │   ├── BookDetail/
│   │   │   ├── BookDetailViewController.swift
│   │   │   ├── Models/
│   │   │   │   ├── Book.swift
│   │   │   │   ├── BookComment.swift
│   │   │   │   ├── BookCommentDetail.swift
│   │   │   │   ├── BookDetail.swift
│   │   │   │   ├── BookShelf.json
│   │   │   │   ├── BookShelf.swift
│   │   │   │   ├── BookShelfInfo.swift
│   │   │   │   ├── ChapterInfo.json
│   │   │   │   ├── ChapterInfo.swift
│   │   │   │   ├── Chapters.json
│   │   │   │   ├── PageInfo.swift
│   │   │   │   ├── QSBook.swift
│   │   │   │   ├── QSBookList.swift
│   │   │   │   ├── QSChapter.swift
│   │   │   │   ├── QSHotComment.swift
│   │   │   │   ├── QSPage.swift
│   │   │   │   ├── QSReaderParse.swift
│   │   │   │   ├── QSReaderSetting.swift
│   │   │   │   ├── QSReaderViewFlowLayout.swift
│   │   │   │   ├── QSRecomment.swift
│   │   │   │   ├── QSRecord.swift
│   │   │   │   ├── ResourceModel.swift
│   │   │   │   ├── UpdateInfo.swift
│   │   │   │   ├── User.swift
│   │   │   │   └── ZSReadRecord.swift
│   │   │   ├── QSBookDetailInteractor.swift
│   │   │   ├── QSBookDetailPresenter.swift
│   │   │   ├── QSBookDetailProtocols.swift
│   │   │   ├── QSBookDetailRouter.swift
│   │   │   ├── QSBookDetailViewController.swift
│   │   │   ├── QSInterestedViewController.swift
│   │   │   ├── Views/
│   │   │   │   ├── .DS_Store~876a9ee6afa162f4fb71eff5fa02f2e0dbe52ae2
│   │   │   │   ├── .DS_Store~HEAD
│   │   │   │   ├── BookCommentCell.swift
│   │   │   │   ├── BookCommentCell.xib
│   │   │   │   ├── BookCommentViewCell.swift
│   │   │   │   ├── BookCommentViewCell.xib
│   │   │   │   ├── BookDetailHeader.swift
│   │   │   │   ├── BookDetailHeader.xib
│   │   │   │   ├── CategoryButton.swift
│   │   │   │   ├── CategoryTableViewCell.swift
│   │   │   │   ├── CategoryTableViewCell.xib
│   │   │   │   ├── ChangeSourceCell.swift
│   │   │   │   ├── ChangeSourceCell.xib
│   │   │   │   ├── HotCommentCell.swift
│   │   │   │   ├── HotCommentCell.xib
│   │   │   │   ├── PageView.swift
│   │   │   │   ├── ProgressView.swift
│   │   │   │   ├── QSBatteryView.swift
│   │   │   │   ├── QSBookDetailContentView.swift
│   │   │   │   ├── QSBookDetailRateView.swift
│   │   │   │   ├── QSBookDetailTagsView.swift
│   │   │   │   ├── QSBookListViewCell.swift
│   │   │   │   ├── QSBookListViewCell.xib
│   │   │   │   ├── QSDiscussCell.swift
│   │   │   │   ├── QSDiscussCell.xib
│   │   │   │   ├── QSRecommendCell.swift
│   │   │   │   ├── QSRecommendCell.xib
│   │   │   │   ├── ToolBar.swift
│   │   │   │   ├── UserfulCell.swift
│   │   │   │   └── UserfulCell.xib
│   │   │   ├── ZSDetailInfoCell.swift
│   │   │   ├── ZSDetailSection.swift
│   │   │   └── ZSDetailViewController.swift
│   │   ├── Category/
│   │   │   ├── CategoryController.swift
│   │   │   ├── CategoryViewController.swift
│   │   │   ├── ChangeSourceViewController.swift
│   │   │   ├── QSCategoryInteractor.swift
│   │   │   ├── QSCategoryPresenter.swift
│   │   │   ├── QSCategoryProtocols.swift
│   │   │   ├── QSCategoryReaderViewController.swift
│   │   │   └── QSCategoryRouter.swift
│   │   ├── Community/
│   │   │   ├── QSCommunityInteractor.swift
│   │   │   ├── QSCommunityPresenter.swift
│   │   │   ├── QSCommunityProtocols.swift
│   │   │   ├── QSCommunityRouter.swift
│   │   │   └── QSCommunityViewController.swift
│   │   ├── Reader/
│   │   │   ├── Model/
│   │   │   │   ├── MonitorFileChangeHelp.h
│   │   │   │   ├── MonitorFileChangeHelp.m
│   │   │   │   ├── ZSBoughtInfo.swift
│   │   │   │   ├── ZSChapterBody.swift
│   │   │   │   ├── ZSChapterInfo.swift
│   │   │   │   ├── ZSChapterSelectModel.swift
│   │   │   │   ├── ZSHTTPConnection.h
│   │   │   │   ├── ZSHTTPConnection.m
│   │   │   │   ├── ZSHTTPTool.h
│   │   │   │   ├── ZSHTTPTool.m
│   │   │   │   ├── ZSReaderProtocol.swift
│   │   │   │   └── web/
│   │   │   │       ├── index.html
│   │   │   │       ├── s.css
│   │   │   │       └── upload.html
│   │   │   ├── PageViewController.swift
│   │   │   ├── QSMoreSettingController.swift
│   │   │   ├── QSReaderBackgroundViewController.swift
│   │   │   ├── QSReaderViewController.swift
│   │   │   ├── QSTextProtocols.swift
│   │   │   ├── QSTextReaderController.swift
│   │   │   ├── QSTextRouter.swift
│   │   │   ├── Service/
│   │   │   │   ├── ZSFontService.swift
│   │   │   │   ├── ZSReaderManager.swift
│   │   │   │   └── ZSReaderWebService.swift
│   │   │   ├── TXTReaderViewController.swift
│   │   │   ├── View/
│   │   │   │   ├── ZSChapterPayView.swift
│   │   │   │   ├── ZSChapterSelectView.swift
│   │   │   │   ├── ZSFontViewController.swift
│   │   │   │   ├── ZSHorizonalMoveCell.swift
│   │   │   │   ├── ZSHorizonalMoveViewController.swift
│   │   │   │   ├── ZSMultiplePayView.swift
│   │   │   │   ├── ZSNoneAnimationViewController.swift
│   │   │   │   ├── ZSReaderBaseViewController.swift
│   │   │   │   └── ZSReaderViewController.swift
│   │   │   ├── ViewModel/
│   │   │   │   ├── ZSBookBoughtViewModel.swift
│   │   │   │   ├── ZSFontViewModel.swift
│   │   │   │   ├── ZSReaderViewModel+Bought.swift
│   │   │   │   └── ZSReaderViewModel.swift
│   │   │   ├── ZSSpeakerCell.swift
│   │   │   └── ZSSpeakerViewController.swift
│   │   └── Speech/
│   │       ├── Model/
│   │       │   ├── Network.swift
│   │       │   ├── Speaker.swift
│   │       │   ├── TTSConfig.swift
│   │       │   ├── TTSResource/
│   │       │   │   ├── common.jet
│   │       │   │   ├── speakers.plist
│   │       │   │   └── xiaoyan.jet
│   │       │   ├── VoiceBook.swift
│   │       │   ├── iflyMSC.framework/
│   │       │   │   ├── Headers/
│   │       │   │   │   ├── IFlyAudioSession.h
│   │       │   │   │   ├── IFlyDataUploader.h
│   │       │   │   │   ├── IFlyDebugLog.h
│   │       │   │   │   ├── IFlyISVDelegate.h
│   │       │   │   │   ├── IFlyISVRecognizer.h
│   │       │   │   │   ├── IFlyMSC.h
│   │       │   │   │   ├── IFlyPcmRecorder.h
│   │       │   │   │   ├── IFlyRecognizerView.h
│   │       │   │   │   ├── IFlyRecognizerViewDelegate.h
│   │       │   │   │   ├── IFlyResourceUtil.h
│   │       │   │   │   ├── IFlySetting.h
│   │       │   │   │   ├── IFlySpeechConstant.h
│   │       │   │   │   ├── IFlySpeechError.h
│   │       │   │   │   ├── IFlySpeechEvaluator.h
│   │       │   │   │   ├── IFlySpeechEvaluatorDelegate.h
│   │       │   │   │   ├── IFlySpeechEvent.h
│   │       │   │   │   ├── IFlySpeechRecognizer.h
│   │       │   │   │   ├── IFlySpeechRecognizerDelegate.h
│   │       │   │   │   ├── IFlySpeechSynthesizer.h
│   │       │   │   │   ├── IFlySpeechSynthesizerDelegate.h
│   │       │   │   │   ├── IFlySpeechUtility.h
│   │       │   │   │   ├── IFlyUserWords.h
│   │       │   │   │   ├── IFlyVoiceWakeuper.h
│   │       │   │   │   └── IFlyVoiceWakeuperDelegate.h
│   │       │   │   └── iflyMSC
│   │       │   ├── pcmPlayerCode/
│   │       │   │   ├── PcmPlayer.h
│   │       │   │   ├── PcmPlayer.m
│   │       │   │   └── PcmPlayerDelegate.h
│   │       │   ├── speaker.json
│   │       │   └── speakers.plist
│   │       └── View/
│   │           ├── AKPickerView.h
│   │           ├── AKPickerView.m
│   │           └── ZSSpeechView.swift
│   ├── Vendor/
│   │   ├── CTDisplayText/
│   │   │   └── Source/
│   │   │       ├── CTDisplayText.h
│   │   │       ├── CTFrameParser.h
│   │   │       ├── CTFrameParser.m
│   │   │       ├── CTFrameParserConfig.h
│   │   │       ├── CTFrameParserConfig.m
│   │   │       ├── CoreTextData.h
│   │   │       ├── CoreTextData.m
│   │   │       ├── CoreTextImageData.h
│   │   │       ├── CoreTextImageData.m
│   │   │       ├── CoreTextLinkData.h
│   │   │       ├── CoreTextLinkData.m
│   │   │       ├── CoreTextUtils.h
│   │   │       ├── CoreTextUtils.m
│   │   │       ├── RegexKitLite.h
│   │   │       ├── RegexKitLite.m
│   │   │       └── Views/
│   │   │           ├── CTDisplayView.h
│   │   │           ├── CTDisplayView.m
│   │   │           ├── MagnifiterView.h
│   │   │           ├── MagnifiterView.m
│   │   │           ├── UIView+frameAdjust.h
│   │   │           └── UIView+frameAdjust.m
│   │   ├── CocoaHTTPServer/
│   │   │   ├── Core/
│   │   │   │   ├── Categories/
│   │   │   │   │   ├── DDData.h
│   │   │   │   │   ├── DDData.m
│   │   │   │   │   ├── DDNumber.h
│   │   │   │   │   ├── DDNumber.m
│   │   │   │   │   ├── DDRange.h
│   │   │   │   │   └── DDRange.m
│   │   │   │   ├── HTTPAuthenticationRequest.h
│   │   │   │   ├── HTTPAuthenticationRequest.m
│   │   │   │   ├── HTTPConnection.h
│   │   │   │   ├── HTTPConnection.m
│   │   │   │   ├── HTTPLogging.h
│   │   │   │   ├── HTTPMessage.h
│   │   │   │   ├── HTTPMessage.m
│   │   │   │   ├── HTTPResponse.h
│   │   │   │   ├── HTTPServer.h
│   │   │   │   ├── HTTPServer.m
│   │   │   │   ├── Mime/
│   │   │   │   │   ├── MultipartFormDataParser.h
│   │   │   │   │   ├── MultipartFormDataParser.m
│   │   │   │   │   ├── MultipartMessageHeader.h
│   │   │   │   │   ├── MultipartMessageHeader.m
│   │   │   │   │   ├── MultipartMessageHeaderField.h
│   │   │   │   │   └── MultipartMessageHeaderField.m
│   │   │   │   ├── Responses/
│   │   │   │   │   ├── HTTPAsyncFileResponse.h
│   │   │   │   │   ├── HTTPAsyncFileResponse.m
│   │   │   │   │   ├── HTTPDataResponse.h
│   │   │   │   │   ├── HTTPDataResponse.m
│   │   │   │   │   ├── HTTPDynamicFileResponse.h
│   │   │   │   │   ├── HTTPDynamicFileResponse.m
│   │   │   │   │   ├── HTTPFileResponse.h
│   │   │   │   │   ├── HTTPFileResponse.m
│   │   │   │   │   ├── HTTPRedirectResponse.h
│   │   │   │   │   └── HTTPRedirectResponse.m
│   │   │   │   ├── WebSocket.h
│   │   │   │   └── WebSocket.m
│   │   │   ├── Extensions/
│   │   │   │   └── WebDAV/
│   │   │   │       ├── DAVConnection.h
│   │   │   │       ├── DAVConnection.m
│   │   │   │       ├── DAVResponse.h
│   │   │   │       ├── DAVResponse.m
│   │   │   │       ├── DELETEResponse.h
│   │   │   │       ├── DELETEResponse.m
│   │   │   │       ├── PUTResponse.h
│   │   │   │       └── PUTResponse.m
│   │   │   ├── LICENSE.txt
│   │   │   └── README.markdown
│   │   ├── M80AttributedLabel/
│   │   │   ├── M80AttributedLabel.h
│   │   │   ├── M80AttributedLabel.m
│   │   │   ├── M80AttributedLabelAttachment.h
│   │   │   ├── M80AttributedLabelAttachment.m
│   │   │   ├── M80AttributedLabelDefines.h
│   │   │   ├── M80AttributedLabelURL.h
│   │   │   ├── M80AttributedLabelURL.m
│   │   │   ├── NSMutableAttributedString+M80.h
│   │   │   └── NSMutableAttributedString+M80.m
│   │   ├── OCGumbo/
│   │   │   ├── OCGumbo+Query.h
│   │   │   ├── OCGumbo+Query.m
│   │   │   ├── OCGumbo.h
│   │   │   ├── OCGumbo.m
│   │   │   └── gumbo/
│   │   │       ├── attribute.c
│   │   │       ├── attribute.h
│   │   │       ├── char_ref.c
│   │   │       ├── char_ref.h
│   │   │       ├── char_ref.rl
│   │   │       ├── error.c
│   │   │       ├── error.h
│   │   │       ├── gumbo.h
│   │   │       ├── insertion_mode.h
│   │   │       ├── parser.c
│   │   │       ├── parser.h
│   │   │       ├── string_buffer.c
│   │   │       ├── string_buffer.h
│   │   │       ├── string_piece.c
│   │   │       ├── string_piece.h
│   │   │       ├── tag.c
│   │   │       ├── tag.in
│   │   │       ├── tag_enum.h
│   │   │       ├── tag_gperf.h
│   │   │       ├── tag_sizes.h
│   │   │       ├── tag_strings.h
│   │   │       ├── token_type.h
│   │   │       ├── tokenizer.c
│   │   │       ├── tokenizer.h
│   │   │       ├── tokenizer_states.h
│   │   │       ├── utf8.c
│   │   │       ├── utf8.h
│   │   │       ├── util.c
│   │   │       ├── util.h
│   │   │       ├── vector.c
│   │   │       └── vector.h
│   │   ├── PullToRefresh/
│   │   │   └── QSPullToRefresh/
│   │   │       ├── QSPullToRefresh/
│   │   │       │   ├── DefaultRefreshView.swift
│   │   │       │   ├── DefaultViewAnimator.swift
│   │   │       │   ├── Info.plist
│   │   │       │   ├── PullToRefresh.swift
│   │   │       │   ├── QSPullToRefresh.h
│   │   │       │   ├── RefreshViewAnimator.swift
│   │   │       │   ├── State.swift
│   │   │       │   └── UIScrollView+PullToRefresh.swift
│   │   │       ├── QSPullToRefresh.xcodeproj/
│   │   │       │   ├── project.pbxproj
│   │   │       │   └── project.xcworkspace/
│   │   │       │       └── contents.xcworkspacedata
│   │   │       └── QSPullToRefreshTests/
│   │   │           ├── Info.plist
│   │   │           └── QSPullToRefreshTests.swift
│   │   ├── ThirdLoginSDK/
│   │   │   └── TencentOpenAPI.framework/
│   │   │       ├── Headers/
│   │   │       │   ├── QQApiInterface.h
│   │   │       │   ├── QQApiInterfaceObject.h
│   │   │       │   ├── TencentOAuth.h
│   │   │       │   └── sdkdef.h
│   │   │       └── TencentOpenAPI
│   │   ├── XimalayaSDK_iOS_5.5.1/
│   │   │   ├── include/
│   │   │   │   ├── Authorization/
│   │   │   │   │   └── XMLYAuthorize.h
│   │   │   │   ├── Downloader/
│   │   │   │   │   └── XMSDKDownloadManager.h
│   │   │   │   ├── FMDB/
│   │   │   │   │   ├── FMDatabase.h
│   │   │   │   │   ├── FMDatabase.m
│   │   │   │   │   ├── FMDatabaseAdditions.h
│   │   │   │   │   ├── FMDatabaseAdditions.m
│   │   │   │   │   ├── FMDatabasePool.h
│   │   │   │   │   ├── FMDatabasePool.m
│   │   │   │   │   ├── FMDatabaseQueue.h
│   │   │   │   │   ├── FMDatabaseQueue.m
│   │   │   │   │   ├── FMResultSet.h
│   │   │   │   │   └── FMResultSet.m
│   │   │   │   ├── MBProgressHUD/
│   │   │   │   │   ├── MBProgressHUD.h
│   │   │   │   │   └── MBProgressHUD.m
│   │   │   │   ├── Model/
│   │   │   │   │   ├── XMAlbum.h
│   │   │   │   │   ├── XMAlbumColumn.h
│   │   │   │   │   ├── XMAlbumColumnItem.h
│   │   │   │   │   ├── XMAlbumGuessLike.h
│   │   │   │   │   ├── XMAnnouncer.h
│   │   │   │   │   ├── XMAnnouncerCategory.h
│   │   │   │   │   ├── XMAttribute.h
│   │   │   │   │   ├── XMBanner.h
│   │   │   │   │   ├── XMCacheTrack.h
│   │   │   │   │   ├── XMCategory.h
│   │   │   │   │   ├── XMCategoryHumanRecommend.h
│   │   │   │   │   ├── XMColdbootDetail.h
│   │   │   │   │   ├── XMColdbootTag.h
│   │   │   │   │   ├── XMColumn.h
│   │   │   │   │   ├── XMColumnDetail.h
│   │   │   │   │   ├── XMColumnEditor.h
│   │   │   │   │   ├── XMColumnList.h
│   │   │   │   │   ├── XMDimension.h
│   │   │   │   │   ├── XMErrorModel.h
│   │   │   │   │   ├── XMHotTrack.h
│   │   │   │   │   ├── XMHotword.h
│   │   │   │   │   ├── XMIndexRankItem.h
│   │   │   │   │   ├── XMLastUptrack.h
│   │   │   │   │   ├── XMLiveAnnouncer.h
│   │   │   │   │   ├── XMLiveCity.h
│   │   │   │   │   ├── XMMetadata.h
│   │   │   │   │   ├── XMProvince.h
│   │   │   │   │   ├── XMRadio.h
│   │   │   │   │   ├── XMRadioSchedule.h
│   │   │   │   │   ├── XMRankSectionList.h
│   │   │   │   │   ├── XMRelatedProgram.h
│   │   │   │   │   ├── XMSubordinatedAlbum.h
│   │   │   │   │   ├── XMTag.h
│   │   │   │   │   ├── XMTrack.h
│   │   │   │   │   ├── XMTrackColumn.h
│   │   │   │   │   ├── XMTrackColumnItem.h
│   │   │   │   │   └── XMTrackDownloadStatus.h
│   │   │   │   ├── Player/
│   │   │   │   │   ├── XMADAudioPlayer.h
│   │   │   │   │   ├── XMSDKPlayer.h
│   │   │   │   │   └── XMSDKPlayerDataCollector.h
│   │   │   │   ├── Request/
│   │   │   │   │   └── XMReqMgr.h
│   │   │   │   └── Utility/
│   │   │   │       ├── XMSDK.h
│   │   │   │       ├── XMSDKInfo.h
│   │   │   │       └── XMSingleTone.h
│   │   │   └── libXMOpenPlatform.a
│   │   ├── YTK/
│   │   │   ├── YTKKeyValueStore.h
│   │   │   └── YTKKeyValueStore.m
│   │   └── uchardet/
│   │       ├── libuchardet-ios.a
│   │       └── uchardet.h
│   ├── ViewController.swift
│   └── zhuishushenqi-Bridge-Header.h
├── zhuishushenqi.xcodeproj/
│   ├── project.pbxproj
│   ├── project.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       └── zhuishushenqi.xcscmblueprint
│   └── xcshareddata/
│       └── xcschemes/
│           └── zhuishushenqi.xcscheme
├── zhuishushenqi.xcworkspace/
│   ├── contents.xcworkspacedata
│   └── xcshareddata/
│       └── IDEWorkspaceChecks.plist
├── zhuishushenqiTests/
│   ├── Info.plist
│   └── zhuishushenqiTests.swift
└── zhuishushenqiUITests/
    ├── Info.plist
    └── zhuishushenqiUITests.swift

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore

## Build generated
build/
DerivedData/

## Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata/

## Other
*.moved-aside
*.xcuserstate

## Obj-C/Swift specific
*.hmap
*.ipa
*.dSYM.zip
*.dSYM

## Playgrounds
timeline.xctimeline
playground.xcworkspace

# Swift Package Manager
#
# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
# Packages/
.build/

# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
Pods/

# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
Carthage/Checkouts

Carthage/Build

# fastlane
#
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
# screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md

fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output

#ds
.DS_Store


================================================
FILE: .idea/codeStyles/Project.xml
================================================
<component name="ProjectCodeStyleConfiguration">
  <code_scheme name="Project" version="173">
    <Objective-C-extensions>
      <file>
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="ClassPredef" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Class" />
      </file>
      <class>
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" />
        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" />
      </class>
      <extensions>
        <pair source="mm" header="h" fileNamingConvention="NONE" />
        <pair source="cpp" header="h" fileNamingConvention="NONE" />
        <pair source="c" header="h" fileNamingConvention="NONE" />
      </extensions>
    </Objective-C-extensions>
  </code_scheme>
</component>

================================================
FILE: .idea/modules.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectModuleManager">
    <modules>
      <module fileurl="file://$PROJECT_DIR$/.idea/zhuishushenqi.iml" filepath="$PROJECT_DIR$/.idea/zhuishushenqi.iml" />
    </modules>
  </component>
</project>

================================================
FILE: .idea/vcs.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="VcsDirectoryMappings">
    <mapping directory="$PROJECT_DIR$" vcs="Git" />
  </component>
</project>

================================================
FILE: .idea/workspace.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ChangeListManager">
    <list default="true" id="523ea935-5349-4e5b-8622-82c30aced980" name="Default" comment="">
      <change afterPath="$PROJECT_DIR$/zhuishushenqi/Extension/SQLite+Extension.swift" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/.idea/xcode.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/xcode.xml" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/Podfile" beforeDir="false" afterPath="$PROJECT_DIR$/Podfile" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/Podfile.lock" beforeDir="false" afterPath="$PROJECT_DIR$/Podfile.lock" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/Pods/Manifest.lock" beforeDir="false" afterPath="$PROJECT_DIR$/Pods/Manifest.lock" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/Pods/Pods.xcodeproj/project.pbxproj" beforeDir="false" afterPath="$PROJECT_DIR$/Pods/Pods.xcodeproj/project.pbxproj" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/Pods/Target Support Files/Pods-zhuishushenqi/Pods-zhuishushenqi-acknowledgements.markdown" beforeDir="false" afterPath="$PROJECT_DIR$/Pods/Target Support Files/Pods-zhuishushenqi/Pods-zhuishushenqi-acknowledgements.markdown" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/Pods/Target Support Files/Pods-zhuishushenqi/Pods-zhuishushenqi-acknowledgements.plist" beforeDir="false" afterPath="$PROJECT_DIR$/Pods/Target Support Files/Pods-zhuishushenqi/Pods-zhuishushenqi-acknowledgements.plist" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/Pods/Target Support Files/Pods-zhuishushenqi/Pods-zhuishushenqi-frameworks.sh" beforeDir="false" afterPath="$PROJECT_DIR$/Pods/Target Support Files/Pods-zhuishushenqi/Pods-zhuishushenqi-frameworks.sh" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/Pods/Target Support Files/Pods-zhuishushenqi/Pods-zhuishushenqi.debug.xcconfig" beforeDir="false" afterPath="$PROJECT_DIR$/Pods/Target Support Files/Pods-zhuishushenqi/Pods-zhuishushenqi.debug.xcconfig" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/Pods/Target Support Files/Pods-zhuishushenqi/Pods-zhuishushenqi.release.xcconfig" beforeDir="false" afterPath="$PROJECT_DIR$/Pods/Target Support Files/Pods-zhuishushenqi/Pods-zhuishushenqi.release.xcconfig" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/zhuishushenqi.xcodeproj/project.pbxproj" beforeDir="false" afterPath="$PROJECT_DIR$/zhuishushenqi.xcodeproj/project.pbxproj" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/zhuishushenqi/RightSide/Ranking/Models/QSRankModel.swift" beforeDir="false" afterPath="$PROJECT_DIR$/zhuishushenqi/RightSide/Ranking/Models/QSRankModel.swift" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/zhuishushenqi/RightSide/Search/QSSearchViewController.swift" beforeDir="false" afterPath="$PROJECT_DIR$/zhuishushenqi/RightSide/Search/QSSearchViewController.swift" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/zhuishushenqi/RightSide/Search/ZSSearchResultViewController.swift" beforeDir="false" afterPath="$PROJECT_DIR$/zhuishushenqi/RightSide/Search/ZSSearchResultViewController.swift" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/zhuishushenqi/Root/Controllers/ZSShelfViewController.swift" beforeDir="false" afterPath="$PROJECT_DIR$/zhuishushenqi/Root/Controllers/ZSShelfViewController.swift" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/zhuishushenqi/TXTReader/BookDetail/Models/BookDetail.swift" beforeDir="false" afterPath="$PROJECT_DIR$/zhuishushenqi/TXTReader/BookDetail/Models/BookDetail.swift" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/zhuishushenqi/TXTReader/Category/QSCategoryReaderViewController.swift" beforeDir="false" afterPath="$PROJECT_DIR$/zhuishushenqi/TXTReader/Category/QSCategoryReaderViewController.swift" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/zhuishushenqi/TXTReader/Reader/QSTextReaderController.swift" beforeDir="false" afterPath="$PROJECT_DIR$/zhuishushenqi/TXTReader/Reader/QSTextReaderController.swift" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/zhuishushenqi/TXTReader/Reader/QSTextRouter.swift" beforeDir="false" afterPath="$PROJECT_DIR$/zhuishushenqi/TXTReader/Reader/QSTextRouter.swift" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/zhuishushenqi/TXTReader/Reader/Service/QSTextInteractor.swift" beforeDir="false" afterPath="$PROJECT_DIR$/zhuishushenqi/TXTReader/Reader/Service/ZSReaderWebService.swift" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/zhuishushenqi/TXTReader/Reader/TXTReaderViewController.swift" beforeDir="false" afterPath="$PROJECT_DIR$/zhuishushenqi/TXTReader/Reader/TXTReaderViewController.swift" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/zhuishushenqi/TXTReader/Reader/View/ZSHorizonalMoveViewController.swift" beforeDir="false" afterPath="$PROJECT_DIR$/zhuishushenqi/TXTReader/Reader/View/ZSHorizonalMoveViewController.swift" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/zhuishushenqi/TXTReader/Reader/View/ZSNoneAnimationViewController.swift" beforeDir="false" afterPath="$PROJECT_DIR$/zhuishushenqi/TXTReader/Reader/View/ZSNoneAnimationViewController.swift" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/zhuishushenqi/TXTReader/Reader/View/ZSReaderViewController.swift" beforeDir="false" afterPath="$PROJECT_DIR$/zhuishushenqi/TXTReader/Reader/View/ZSReaderViewController.swift" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/zhuishushenqi/TXTReader/Reader/ViewModel/QSTextPresenter.swift" beforeDir="false" afterPath="$PROJECT_DIR$/zhuishushenqi/TXTReader/Reader/ViewModel/ZSReaderViewModel.swift" afterDir="false" />
    </list>
    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
    <option name="SHOW_DIALOG" value="false" />
    <option name="HIGHLIGHT_CONFLICTS" value="true" />
    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
    <option name="LAST_RESOLUTION" value="IGNORE" />
  </component>
  <component name="DatabaseView">
    <option name="SHOW_INTERMEDIATE" value="true" />
    <option name="GROUP_DATA_SOURCES" value="true" />
    <option name="GROUP_SCHEMA" value="true" />
    <option name="GROUP_CONTENTS" value="false" />
    <option name="SORT_POSITIONED" value="false" />
    <option name="SHOW_EMPTY_GROUPS" value="false" />
    <option name="AUTO_SCROLL_FROM_SOURCE" value="false" />
    <option name="HIDDEN_KINDS">
      <set />
    </option>
    <expand />
    <select />
  </component>
  <component name="ExecutionTargetManager" SELECTED_TARGET="iphoneos_4d4975b3b77ffe83bb4b3cdfb1774599eca8fea6" />
  <component name="FUSProjectUsageTrigger">
    <session id="-1055346378">
      <usages-collector id="statistics.lifecycle.project">
        <counts>
          <entry key="project.closed" value="1" />
          <entry key="project.open.time.4" value="1" />
          <entry key="project.opened" value="1" />
        </counts>
      </usages-collector>
      <usages-collector id="statistics.appcode.build">
        <counts>
          <entry key="buildservice" value="9" />
        </counts>
      </usages-collector>
      <usages-collector id="statistics.file.extensions.open">
        <counts>
          <entry key="swift" value="7" />
        </counts>
      </usages-collector>
      <usages-collector id="statistics.file.types.open">
        <counts>
          <entry key="Swift" value="7" />
        </counts>
      </usages-collector>
      <usages-collector id="statistics.file.extensions.edit">
        <counts>
          <entry key="LLDB" value="21" />
          <entry key="swift" value="14" />
        </counts>
      </usages-collector>
      <usages-collector id="statistics.file.types.edit">
        <counts>
          <entry key="LLDBCommands" value="21" />
          <entry key="Swift" value="14" />
        </counts>
      </usages-collector>
      <usages-collector id="statistics.appcode.reveal">
        <counts>
          <entry key="inject" value="2" />
          <entry key="installOnDevice" value="2" />
          <entry key="showInReveal" value="1" />
        </counts>
      </usages-collector>
    </session>
  </component>
  <component name="FileEditorManager">
    <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
      <file pinned="false" current-in-tab="false">
        <entry file="file://$PROJECT_DIR$/zhuishushenqi/Splash/QSSplashScreen.swift">
          <provider selected="true" editor-type-id="text-editor">
            <state relative-caret-position="1035">
              <caret line="72" column="66" selection-start-line="72" selection-start-column="66" selection-end-line="72" selection-end-column="66" />
            </state>
          </provider>
        </entry>
      </file>
      <file pinned="false" current-in-tab="false">
        <entry file="file://$PROJECT_DIR$/zhuishushenqi/Extension/SQLite+Extension.swift">
          <provider selected="true" editor-type-id="text-editor">
            <state relative-caret-position="-311">
              <caret line="1" column="26" selection-start-line="1" selection-start-column="26" selection-end-line="1" selection-end-column="26" />
            </state>
          </provider>
        </entry>
      </file>
      <file pinned="false" current-in-tab="false">
        <entry file="file://$PROJECT_DIR$/zhuishushenqi/RightSide/Ranking/Models/QSRankModel.swift">
          <provider selected="true" editor-type-id="text-editor">
            <state relative-caret-position="270">
              <caret line="18" column="5" lean-forward="true" selection-start-line="18" selection-start-column="5" selection-end-line="18" selection-end-column="5" />
              <folding>
                <element signature="e#134#146#0" expanded="true" />
              </folding>
            </state>
          </provider>
        </entry>
      </file>
      <file pinned="false" current-in-tab="false">
        <entry file="file://$PROJECT_DIR$/zhuishushenqi/TXTReader/BookDetail/Models/ResourceModel.swift">
          <provider selected="true" editor-type-id="text-editor" />
        </entry>
      </file>
      <file pinned="false" current-in-tab="false">
        <entry file="file://$PROJECT_DIR$/Pods/HandyJSON/Source/Deserializer.swift">
          <provider selected="true" editor-type-id="text-editor">
            <state relative-caret-position="183">
              <caret line="77" selection-start-line="77" selection-end-line="77" />
            </state>
          </provider>
        </entry>
      </file>
      <file pinned="false" current-in-tab="true">
        <entry file="file://$PROJECT_DIR$/Pods/HandyJSON/Source/ExtendCustomModelType.swift">
          <provider selected="true" editor-type-id="text-editor" />
        </entry>
      </file>
      <file pinned="false" current-in-tab="false">
        <entry file="file://$PROJECT_DIR$/Pods/QSNetwork/Source/QSManager.swift">
          <provider selected="true" editor-type-id="text-editor" />
        </entry>
      </file>
      <file pinned="false" current-in-tab="false">
        <entry file="file://$PROJECT_DIR$/zhuishushenqi/App/AppDelegate.swift">
          <provider selected="true" editor-type-id="text-editor">
            <state relative-caret-position="17">
              <caret line="15" selection-start-line="15" selection-end-line="15" />
            </state>
          </provider>
        </entry>
      </file>
    </leaf>
  </component>
  <component name="Git.Settings">
    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
  </component>
  <component name="IdeDocumentHistory">
    <option name="CHANGED_PATHS">
      <list>
        <option value="$PROJECT_DIR$/zhuishushenqi/Splash/QSSplashScreen.swift" />
        <option value="$PROJECT_DIR$/zhuishushenqi/Extension/SQLite+Extension.swift" />
        <option value="$PROJECT_DIR$/zhuishushenqi/RightSide/Ranking/Models/QSRankModel.swift" />
      </list>
    </option>
  </component>
  <component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
  <component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER" />
  <component name="JsGulpfileManager">
    <detection-done>true</detection-done>
    <sorting>DEFINITION_ORDER</sorting>
  </component>
  <component name="ProjectFrameBounds" extendedState="6">
    <option name="x" value="140" />
    <option name="y" value="43" />
    <option name="width" value="1400" />
    <option name="height" value="914" />
  </component>
  <component name="ProjectView">
    <navigator proportions="" version="1">
      <foldersAlwaysOnTop value="true" />
    </navigator>
    <panes>
      <pane id="Scope" />
      <pane id="Cidr.FilesView" />
      <pane id="ProjectPane">
        <subPane>
          <expand>
            <path>
              <item name="" type="efc3779f:XcodeRootNode" />
              <item name="zhuishushenqi" type="1d218c8b:XcodeProjectNode" />
            </path>
            <path>
              <item name="" type="efc3779f:XcodeRootNode" />
              <item name="zhuishushenqi" type="1d218c8b:XcodeProjectNode" />
              <item name="zhuishushenqi" type="fcab9f18:XcodeViewNode" />
            </path>
            <path>
              <item name="" type="efc3779f:XcodeRootNode" />
              <item name="zhuishushenqi" type="1d218c8b:XcodeProjectNode" />
              <item name="zhuishushenqi" type="fcab9f18:XcodeViewNode" />
              <item name="App" type="fcab9f18:XcodeViewNode" />
            </path>
          </expand>
          <select />
        </subPane>
      </pane>
    </panes>
  </component>
  <component name="PropertiesComponent">
    <property name="WebServerToolWindowFactoryState" value="false" />
    <property name="last_opened_file_path" value="$PROJECT_DIR$" />
    <property name="settings.editor.selected.configurable" value="preferences.lookFeel" />
  </component>
  <component name="RunDashboard">
    <option name="ruleStates">
      <list>
        <RuleState>
          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
        </RuleState>
        <RuleState>
          <option name="name" value="StatusDashboardGroupingRule" />
        </RuleState>
      </list>
    </option>
  </component>
  <component name="RunManager">
    <configuration name="zhuishushenqi" type="AppleRunConfiguration" factoryName="Application" PASS_PARENT_ENVS_2="true" PROJECT_NAME="zhuishushenqi" TARGET_NAME="zhuishushenqi" CONFIG_NAME="Debug" SCHEME_NAME="zhuishushenqi" IS_LOCATION_SIMULATION_ALLOWED="true" RUN_TARGET_PROJECT_NAME="zhuishushenqi" RUN_TARGET_NAME="zhuishushenqi" MAKE_ACTIVE="TRUE">
      <EXTENSION ID="org.jetbrains.appcode.reveal.RevealRunConfigurationExtension">
        <REVEAL_SETTINGS autoInject="true" autoInstall="true" askToEnableAutoInstall="true" />
      </EXTENSION>
      <method v="2">
        <option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
      </method>
    </configuration>
    <configuration default="true" type="js.build_tools.gulp" factoryName="Gulp.js">
      <node-interpreter>project</node-interpreter>
      <node-options />
      <gulpfile />
      <tasks />
      <arguments />
      <envs />
      <method v="2" />
    </configuration>
  </component>
  <component name="SvnConfiguration">
    <configuration />
  </component>
  <component name="TaskManager">
    <task active="true" id="Default" summary="Default task">
      <changelist id="523ea935-5349-4e5b-8622-82c30aced980" name="Default" comment="" />
      <created>1496934697985</created>
      <option name="number" value="Default" />
      <option name="presentableId" value="Default" />
      <updated>1496934697985</updated>
      <workItem from="1496934700307" duration="1576000" />
      <workItem from="1534145274644" duration="2298000" />
    </task>
    <servers />
  </component>
  <component name="TimeTrackingManager">
    <option name="totallyTimeSpent" value="3874000" />
  </component>
  <component name="TodoView">
    <todo-panel id="selected-file">
      <is-autoscroll-to-source value="true" />
    </todo-panel>
    <todo-panel id="all">
      <are-packages-shown value="true" />
      <is-autoscroll-to-source value="true" />
    </todo-panel>
  </component>
  <component name="ToolWindowManager">
    <frame x="5" y="23" width="1672" height="953" extended-state="6" />
    <layout>
      <window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.18957055" />
      <window_info id="Structure" order="1" weight="0.25" />
      <window_info id="Designer" order="2" />
      <window_info id="Favorites" order="3" side_tool="true" />
      <window_info anchor="bottom" id="Database Changes" show_stripe_button="false" />
      <window_info anchor="bottom" id="Message" order="0" />
      <window_info anchor="bottom" id="Find" order="1" />
      <window_info anchor="bottom" id="Run" order="2" weight="0.32868758" />
      <window_info anchor="bottom" id="Debug" order="3" weight="0.3472706" />
      <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
      <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
      <window_info anchor="bottom" id="TODO" order="6" weight="0.329849" />
      <window_info anchor="bottom" id="Version Control" order="7" weight="0.329849" />
      <window_info anchor="bottom" id="Terminal" order="8" weight="0.329849" />
      <window_info anchor="bottom" id="Event Log" order="9" side_tool="true" />
      <window_info anchor="bottom" id="Messages" order="10" weight="0.24622531" />
      <window_info anchor="right" id="Database" weight="0.32944787" />
      <window_info anchor="right" id="Commander" order="0" weight="0.4" />
      <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
      <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
      <window_info anchor="right" id="Palette&#9;" order="3" />
    </layout>
  </component>
  <component name="TypeScriptGeneratedFilesManager">
    <option name="version" value="1" />
  </component>
  <component name="VcsContentAnnotationSettings">
    <option name="myLimit" value="2678400000" />
  </component>
  <component name="XDebuggerManager">
    <breakpoint-manager>
      <breakpoints-dialog>
        <breakpoints-dialog />
      </breakpoints-dialog>
      <default-breakpoints>
        <breakpoint enabled="true" type="CidrExceptionBreakpoint">
          <properties />
        </breakpoint>
      </default-breakpoints>
    </breakpoint-manager>
  </component>
  <component name="editorHistoryManager">
    <entry file="file://$PROJECT_DIR$/zhuishushenqi/Extension/UIImage+QSData.swift">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="100">
          <caret line="43" column="9" selection-start-line="43" selection-start-column="9" selection-end-line="43" selection-end-column="9" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/zhuishushenqi/Splash/QSSplashScreen.swift">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="1035">
          <caret line="72" column="66" selection-start-line="72" selection-start-column="66" selection-end-line="72" selection-end-column="66" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/Pods/HandyJSON/Source/Deserializer.swift">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="183">
          <caret line="77" selection-start-line="77" selection-end-line="77" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/Pods/QSNetwork/Source/QSManager.swift">
      <provider selected="true" editor-type-id="text-editor" />
    </entry>
    <entry file="file://$PROJECT_DIR$/zhuishushenqi/App/AppDelegate.swift">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="17">
          <caret line="15" selection-start-line="15" selection-end-line="15" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/zhuishushenqi/TXTReader/BookDetail/Models/ResourceModel.swift">
      <provider selected="true" editor-type-id="text-editor" />
    </entry>
    <entry file="file://$PROJECT_DIR$/zhuishushenqi/Extension/SQLite+Extension.swift">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="-311">
          <caret line="1" column="26" selection-start-line="1" selection-start-column="26" selection-end-line="1" selection-end-column="26" />
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/zhuishushenqi/RightSide/Ranking/Models/QSRankModel.swift">
      <provider selected="true" editor-type-id="text-editor">
        <state relative-caret-position="270">
          <caret line="18" column="5" lean-forward="true" selection-start-line="18" selection-start-column="5" selection-end-line="18" selection-end-column="5" />
          <folding>
            <element signature="e#134#146#0" expanded="true" />
          </folding>
        </state>
      </provider>
    </entry>
    <entry file="file://$PROJECT_DIR$/Pods/HandyJSON/Source/ExtendCustomModelType.swift">
      <provider selected="true" editor-type-id="text-editor" />
    </entry>
  </component>
</project>

================================================
FILE: .idea/xcode.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="XcodeMetaData" PROJECT_FILE="$PROJECT_DIR$/zhuishushenqi.xcworkspace" SHOW_WORKSPACE_NOTIFICATIONS="true" />
</project>

================================================
FILE: .idea/zhuishushenqi.iml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<module classpath="AppCode" type="CIDR_MODULE" version="4" />

================================================
FILE: Podfile
================================================
source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/sinaweibosdk/weibo_ios_sdk.git'

# 对于Swift应用来说下面两句是必须的
platform :ios, '10.0'
use_frameworks!
# Swift静态库方式
#use_modular_headers!
inhibit_all_warnings!
branch = ENV['sha']

# target的名字一般与你的项目名字相同
target 'zhuishushenqi' do
project './zhuishushenqi.xcodeproj'

pod 'YYText'
pod 'YYModel'
pod 'YYImage'
pod 'MBProgressHUD'
pod 'MJRefresh'
pod 'CocoaAsyncSocket'
pod 'CocoaLumberjack', '3.4.2'
pod 'YYCategories'
pod 'FMDB'
pod 'WechatOpenSDK', '1.8.3'
pod "Weibo_SDK", :git => "https://github.com/sinaweibosdk/weibo_ios_sdk.git"
pod 'FLEX', :configurations => ['Debug']
pod 'MLeaksFinder'
pod 'FBRetainCycleDetector'

# DoraemonKit不支持模拟器
#pod 'DoraemonKit/Core', '~> 3.0.4', :configurations => ['Debug'] #必选
#pod 'DoraemonKit/WithGPS', '~> 3.0.4', :configurations => ['Debug'] #可选
#pod 'DoraemonKit/WithLoad', '~> 3.0.4', :configurations => ['Debug'] #可选
#pod 'DoraemonKit/WithLogger', '~> 3.0.4', :configurations => ['Debug'] #可选
#pod 'DoraemonKit/WithDatabase', '~> 3.0.4', :configurations => ['Debug'] #可选
#pod 'DoraemonKit/WithMLeaksFinder', '~> 3.0.4', :configurations => ['Debug'] #可选
#pod 'DoraemonKit/WithWeex', '~> 3.0.4', :configurations => ['Debug'] #可选

# swift libraries
pod 'Alamofire'
pod 'Cache'
pod 'HandyJSON'
#pod 'Kingfisher'
pod 'PKHUD'
pod 'SnapKit', '5.0.0'
pod 'SQLite.swift'
#pod 'Then'
pod 'Zip'
pod 'RxAlamofire'
pod 'RxCocoa'
pod 'UICircularProgressRing'
pod 'RCBacktrace', '~> 0.1.6'
pod 'Google-Mobile-Ads-SDK','~> 7.69'
pod 'Ads-CN'
pod 'YungCache', :git => 'https://github.com/Noah37/YungCache.git'
pod 'YungNetworkTool', :git => 'https://github.com/Noah37/YungNetworkTool.git'

# local pods
pod 'ZSAPI', :path => "zhuishushenqi/NewVersion/ZSAPI"
pod 'ZSAppConfig', :path => "zhuishushenqi/NewVersion/ZSAppConfig"
pod 'ZSExtension', :path => "zhuishushenqi/NewVersion/ZSExtension"

end

post_install do |installer|

  ## Fix for XCode 12.5
  find_and_replace("Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/FBClassStrongLayout.mm",
                      "layoutCache[currentClass] = ivars;", "layoutCache[(id<NSCopying>)currentClass] = ivars;")
    
#  installer.pods_project.targets.each do |target|
#    # 我們也可以懶惰不用 if,讓所有 pod 的版本都設為一樣的
#    target.build_configurations.each do |config|
#      config.build_settings['SWIFT_VERSION'] = '5.0'
#    end
    
#    if ['RxSwift', 'RxSwiftExt', 'RxCocoa', 'RxDataSources', 'ProtocolBuffers-Swift'].include? target.name
#    end
#  end
end

def find_and_replace(dir, findstr, replacestr)
  Dir[dir].each do |name|
      text = File.read(name)
      replace = text.gsub(findstr,replacestr)
      if text != replace
          puts "Fix: " + name
          File.open(name, "w") { |file| file.puts replace }
          STDOUT.flush
      end
  end
  Dir[dir + '*/'].each(&method(:find_and_replace))
end


================================================
FILE: README.md
================================================
# zhuishushenqi

![Platform](https://img.shields.io/badge/platforms-iOS%208.0+%20%7C%20macOS%2010.10+%20%7C%20tvOS%209.0+%20%7C%20watchOS%202.0+-333333.svg)

[![Language](https://img.shields.io/badge/language-Swift-brightgreen.svg?style=flat)](https://developer.apple.com/Objective-C)
[![License](http://img.shields.io/badge/license-MIT-lightgrey.svg?style=flat)](http://mit-license.org)

**采用Swift语言,仿追书神器做的,主要是练习阅读器的一些技术,包括仿真阅读等。不断更新中......**

#### changelog

- **20170607:增加书架删除,缓存,修复一些缺陷**

- **20170612: 增加开屏广告,增加首次安装新特性,推荐书籍等**

- **20170808:充分利用Swift语言特性,整合API,引入CocoaPods管理三方库**

- **20171219: 适配iPhone X**

- **20180110: 修复了iOS 11 上阅读器文字不显示问题**

- **20180403: 阅读器内存优化,内存保持稳定**

- **20180606: Swift语言更新至4.0**

- **20180726: 阅读器代码优化**

- **20180803: 增加本地书籍阅读功能**

- **20180819: 追书社区新增大量功能,侧滑菜单新增大量功能**

- **20180828: 评论区增加图文混排功能,正确展示评论中的图片及链接**

- **20180919: 适配Swift4.2及Xcode10**

- **20181002: 添加手机登录及三方登录功能**

- **20181025: 添加登录后书架信息同步**

- **20181102: 添加自动签到功能,进入APP即可自动签到**

- **20190102: 修复书架刷新卡顿&阅读过的书籍置顶(branch dev_db)**

- **20180321:修复多个缺陷,分类页面优化**

- **20190409:修复书架删除书籍时误删整个书架的问题**

- **20190622: Swift 5.0支持**

- **20200103: 搜索页增加热门推荐与搜索历史**

- **20200106: 来源功能手动添加支持&删除carthage支持**

- **20200221:切换翻页方式功能添加(支持pageCurl,左右平移,无动画效果)**

- **20200517:书架内容展示添加最近更新章节**

- **20201219:添加规则验证页面,添加新的书源前可逐条验证规则后添加**

- **20210613:图片加载方式变更,大图片不再缓存,优化内存占用**

- **20211223: 添加来源**

----

**仅供学习交流,请勿用于商业用途**

## Requirements

- iOS 9.0+ / macOS 10.14+ / tvOS 9.0+ / watchOS 2.0+
- Xcode 10.2+
- Swift 5.0+

Main development of zhuishushenqi olny support Swift 5.0+.

## Install

请执行以下两步操作,确保所有的依赖库安装完成后使用.

**CocoaPods:**

`$ pod install`

**Carthage:**

`$ carthage update --platform iOS`

### Here you can see blow.

=======

## regular
 [添加来源](addSource.md)

### 效果图如下:
<!--![zhuishushenqi](zhuishushenqi.png)
![zhuishenqiing](images/qs_bookshelf.png)
![zhuishenqiimg](images/qs_reader.png)
![zhuishenqiimg](images/qs_readerMain.png)
![zhuishenqiimg](images/qs_changeSource.png)-->

<img src="images/qs_bookshelf.png" width="20%" height="20%" /><img src="images/qs_reader.png" width="20%" height="20%" /><img src="images/qs_readerMain.png" width="20%" height="20%" /><img src="images/qs_changeSource.png" width="20%" height="20%" /><img src="images/regular_verify.png" width="20%" height="20%" />


## Contact

Follow and contact me on mail [2252055382@qq.com](https://mail.qq.com/). If you find an issue, just [open a ticket](https://github.com/NoryCao/zhuishushenqi/issues/new). Pull requests are warmly welcome as well.

## License

zhuishushenqi is released under the MIT license. See LICENSE for details.




================================================
FILE: Script.sh
================================================
#!/bin/sh

#  Script.sh
#  zhuishushenqi
#
#  Created by yung on 2017/8/10.
#  Copyright © 2017年 QS. All rights reserved.

# Localizable.strings文件路径
localizableFile="en.lproj/Localizable.strings"
# 生成的swift文件路径(根据个人习惯修改)
localizedFile="zhuishushenqi/Extension/LocalizedUtils.swift"
# 将localizable.strings中的文本转为swift格式的常量,存入一个临时文件
cat ${localizableFile}
sed "s/^\"/  static var localized_/g" "${localizableFile}" | sed "s/\" = \"/: String { return \"/g" | sed "s/;$/.localized }/g" > "${localizedFile}.tmp"
# 先将localized作为计算属性输出到目标文件
echo -e "import Foundation\n\nextension String {\n  var localized: String { return NSLocalizedString(self, comment: self) }" > "${localizedFile}"
# 再将临时文件中的常量增量输出到目标文件
cat "${localizedFile}.tmp" >> "${localizedFile}"
# 最后增量输出一个"}"到目标文件,完成输出
echo -e "\n}" >> "${localizedFile}"
# 删除临时文件
rm "${localizedFile}.tmp"


================================================
FILE: addSource.md
================================================
### 添加来源

如果默认的一些书籍来源搜索不到小说,该怎么办? 这时候,你需要自定义小说来源网站

以 [笔趣阁](http://www.boquku.com)为例

#### 1. 打开 [笔趣阁](http://www.boquku.com)网站,搜索【夜的命名术】
![](images/boquge_search_result@2x.png)

#### 2. 在网页点击右键,选择检查网页
![](images/boquge_search_html@2x.png)

#### 3. 找到唯一能定位搜索结果的标签
````
<div class="panel-body" id="novel-list">
		<ul><li class="list-group-item clearfix">
			<div class="col-xs-1">类型</div>
			<div class="col-xs-3">小说名称</div>
			<div class="col-xs-4">最新章节</div>
			<div class="col-xs-2">作者</div>
			<div class="col-xs-2">更新时间</div></li><li class="list-group-item clearfix">
			<div class="col-xs-1"><i class="tag-blue">都市</i></div>
			<div class="col-xs-3"><a href="/xs/135992/index.html">夜的命名术</a></div>
			<div class="col-xs-4"><a href="/book/135992/178501916.html">为了保住大家的投资,再讲一个故事</a></div>
			<div class="col-xs-2">会说话的肘子</div>
			<div class="col-xs-2"><span class="time">2021-12-12 19:39</span></div>
		</li>
		
		
		
		
		<li class="list-group-item"><div class="listMore"><ul class="pagination pagination-sm">
		<li class="active"><a href="">1</a></li></ul></div></li>
		</ul>
		</div>
````

#### 4. 根据xpath取值获取,获取所有搜索结果
例如

- books: .panel-body ul li
- bookName: @.col-xs-3 a@0@
- bookAuthor: @.col-xs-2@0@
- bookUrl: @.col-xs-3 a@0@abs:href
- bookLastChapter: @.col-xs-4 a@0@

**@**为分隔符,分割标签与序号
以 **bookName** 为例:
bookName为定位某一个具体的标签

第一个【@】后面的**.col-xs-3 a**指定对应的标签的定位,一般指定的标签具有唯一性

第二个【@】后面的数字为序号,一般为0,特殊情况也可取具体数字

第三个【@】后面的一般用于获取链接的具体值,固定abs:href或者abs:src,根据具体的标签来看

> .col-xs-3 表示class为col-xs-3的标签,如果没有class,而是只有id,则需要遵循css选择器,改为 `#col-xs-3`

#### 5. 获取详情页内容
这一步获取到小说的以下内容

- detailBookIcon: @.col-xs-2 img@0@abs:src
- chapters: .list-group-item li a
- detailChaptersUrl: @.list-group li a@12@abs:href 
- detailBookDesc: @p#shot@0@

> 【detailChaptersUrl 这里有一个更简洁的写法,  @.list-group-item tac a@0@abs:href, 为啥不用他呢,因为list-group-item后面的tac并不是一个标签层级,而我们用空格区分标签的层级,所以识别会失败,后面考虑将空格分割法改为其他的特殊符号】
> 【chapters比较特殊,假如从小说页面找不到所有的章节,而需要点击链接进入下一级页面的话,就需要detailChaptersUrl的值】
> 【获取列表的时候,直接写标签路径就可以了,如chapters这种】
> 【detailChaptersUrl 章节要获取到a标签,方便后面取值】

#### 6. 获取具体章节名及章节链接

- chapterName: @@@
- chapterUrl: @@@abs:href

#### 7. 获取章节内容
- content: @div#txtContent@0@
- contentReplace:
- contentRemove:

#### 8. 获取网页编码,搜索链接
- searchEncoding: .gbk
- searchUrl: http://www.boquge.com/search.htm?keyword=%@
- host: https://www.boquge.com/
- name: boquge

#### 9. 验证规则正确性
在 我的->设置->书籍规则验证页面进行验证

附上[http://www.yetianlian.com/](http://www.yetianlian.com/) 网站实例

- searchEncoding: .utf8
- searchUrl: http://www.yetianlian.com/s.php?ie=utf-8&q=%@
- books: .bookbox
- bookName: @.bookname a@0@
- bookAuthor: @.author@0@
- bookUrl: @.bookname a@0@abs:href
- bookLastChapter: @.update a@0@
- bookIcon: @.bookimg a@0@abs:href
- bookUpdateTime: 
- chapters: .listmain dl dd a
- detailBookDesc: @.intro@0@
- chapterName: @@@
- chapterUrl: @@@abs:href
- content: @div#content@0@
- host: http://www.yetianlian.com/
- name: 何以笙箫默









================================================
FILE: en.lproj/Localizable.strings
================================================
/* 
  Localizable.strings
  zhuishushenqi

  Created by yung on 2017/8/10.
  Copyright © 2017年 QS. All rights reserved.
*/

"login" = "Login";
"logout" = "Logout";


================================================
FILE: images/aptv.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>items</key>
    <array>
        <dict>
            <key>assets</key>
            <array>
                <dict>
                    <key>kind</key>
                    <string>software-package</string>
                    <key>url</key>
                    <string>http://192.168.0.100:8080/hello/aptv.ipa</string>          <!-- ipa的http地址 -->
                </dict>
                <dict>
                    <key>kind</key>
                    <string>full-size-image</string>
                    <key>needs-shine</key>
                    <false/>
                    <key>url</key>
                    <string></string>
                </dict>
                <dict>
                    <key>kind</key>
                    <string>display-image</string>
                    <key>needs-shine</key>
                    <false/>
                    <key>url</key>
                    <string>http://mywebserver.com/显示的图标.png</string>      		<!-- 显示的图标.png的http地址 -->
                </dict>
            </array>
            <key>metadata</key>
            <dict>
                <key>bundle-identifier</key>
                <string>com.kimen.aptv</string>        				<!-- 游戏的bundleId, 比如com.linxinfa.mygame -->
                <key>bundle-version</key>
                <string>1.0.0</string>
                <key>kind</key>
                <string>software</string>
                <key>title</key>
                <string>游戏名字</string>   							 <!-- 游戏名字 -->
            </dict>
        </dict>
    </array>
</dict>
</plist>


================================================
FILE: zh-Hans.lproj/Localizable.strings
================================================
/* 
  Localizable.strings
  zhuishushenqi

  Created by yung on 2017/8/10.
  Copyright © 2017年 QS. All rights reserved.
*/

"login" = "登录";
"logout" = "退出";


================================================
FILE: zh-Hant.lproj/Localizable.strings
================================================
/* 
  Localizable.strings
  zhuishushenqi

  Created by yung on 2017/8/10.
  Copyright © 2017年 QS. All rights reserved.
*/

"login" = "log in";
"logout" = "log out";


================================================
FILE: zhuishushenqi/App/AppDelegate.swift
================================================
//
//  AppDelegate.swift
//  zhuishushenqi
//
//  Created by Nory Cao on 16/9/16.
//  Copyright © 2016年 QS. All rights reserved.
//

import UIKit
import RxSwift
import GoogleMobileAds

#if DEBUG
//import DoraemonKit
import FLEX
import ZSAppConfig
#endif


let rightScaleX:CGFloat = 0.2
let rootVCKey = "rootVCKey"
let GADUnitID = "ca-app-pub-6271484308025079/5733340734"

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    var lastTabVC:UIViewController?
    
    var appOpenAd:GADAppOpenAd?
    
    var loadTime:Date?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        // Cause API of UI called on a background thread issue.
//        GADMobileAds.sharedInstance().start(completionHandler: nil)
//        AppOpenAdManager.shared.loadAd()
        
        BUAdManager.shared.loadAd()

        #if DEBUG
//        DoraemonManager.shareInstance().install()
        FLEXManager.shared().showExplorer()
        #endif
        
        let notificationCenter = NotificationCenter.default
        notificationCenter.addObserver(self, selector: #selector(type(of: self).removeAllObjects), name: UIApplication.didReceiveMemoryWarningNotification, object: nil)
        
        // 新版本特性
        let firstRun = USER_DEFAULTS.bool(forKey: UserDefaults.firstRunKey)
        if !firstRun {
            USER_DEFAULTS.set(true, forKey: UserDefaults.firstRunKey)
            USER_DEFAULTS.synchronize()
            ZSIntroducePage.shared.show {
                // 根据性别推荐书籍(第一次安装才会出现) 由home页面自己发起
                NotificationCenter.default.post(Notification(name: Notification.Name(rawValue:SHOW_RECOMMEND)))
            }
        }

        if #available(iOS 9.0, *) {
            
        } else {
            UIApplication.shared.setStatusBarHidden(false, with: .fade)
            UIApplication.shared.statusBarStyle = .lightContent
        }
        #if DEBUG
            let fpsLabel = V2FPSLabel(frame: CGRect(x:15, y:ScreenHeight-100, width:55,height: 20));
            self.window?.addSubview(fpsLabel);
        #else
        #endif

        configureDataBase()
        /**
         设置 UINavigationNar 外观
         */
        UINavigationBar.appearance().barTintColor = UIColor.white
        UINavigationBar.appearance().tintColor = UIColor ( red: 0.7235, green: 0.0, blue: 0.1146, alpha: 1.0 )
        let navbarTitleTextAttributes = [NSAttributedString.Key.foregroundColor:UIColor ( red: 0.7235, green: 0.0, blue: 0.1146, alpha: 1.0 )]
        UINavigationBar.appearance().titleTextAttributes = navbarTitleTextAttributes
        
        UITabBar.appearance().tintColor = UIColor ( red: 0.7235, green: 0.0, blue: 0.1146, alpha: 1.0 )
        
//        let APP_KEY = "e31646fa4555ea3472d4114921ee192e"
//        let APP_SECRET = "b961a55b60fbd7129e49a986e44352fb"
//        XMSDKPlayer.shared()?.setAutoNexTrack(true)
//        XMReqMgr.sharedInstance()?.registerXMReqInfo(withKey: APP_KEY, appSecret: APP_SECRET)
        
        IFlySetting.setLogFile(LOG_LEVEL.LVL_ALL)
        IFlySetting.showLogcat(true)
        let paths = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first ?? ""
        IFlySetting.setLogFilePath(paths)
//        let appid = "5ba0b197"
//        let xfyj = "5445f87d"
//        let zssq = "566551f4"
//        let xfyj2 = "591a4d99"
//        let initString = "appid=\(zssq)"
//        IFlySpeechUtility.createUtility(initString)
        
        // 提前解析
        DispatchQueue.global().async {
            TTSConfig.share.getSpeakers()
        }
        
        ZSBookManager.shared
        
        let path = ZSShelfConstant.inboxPath
        ZSShelfManager.share.scanPath(path: path)

        
//        WeiboSDK.enableDebugMode(false)
//        WeiboSDK.registerApp(ZSThirdLogin.WBAppID)
        
        // database
        /*测试代码
         let database = ZSDatabase()
         database.createBookshelf()
         if let book = ZSBookManager.shared.books.allValues().first as? BookDetail {
         database.insertBookshelf(book: book)
         }
         let books = database.queryBookshelf()
         QSLog("books:\(books)")
         
         let testModel = ZSDBTestModel()
         let subModel = ZSDBTestSubModel()
         subModel.key = "IU6rIl2d2GWnEio"
         testModel.id = "Yg5fsKPOvpii0qAH2lpmJhjFmRhfe4dshhjY5Oim2Y"
         testModel.num = 1
         testModel.subModel = subModel
         
         ZSDBManager.share()?.getPropertys(testModel)
         
         */
        decryptedStr()
        
        return true
    }
    
    func configureDataBase(){
        let store  = YTKKeyValueStore(dbWithName: dbName)
        
        if store?.isTableExists(searchHistory) == false {
            store?.createTable(withName: searchHistory)
        }
    }
    
    @objc
    func removeAllObjects() {
        let alert = UIAlertController(title: "提示", message: "内存警告", preferredStyle: .alert)
        let confirmAction = UIAlertAction(title: "确定", style: .default) { (action) in
            
        }
        alert.addAction(confirmAction)
        if let vc = self.window?.rootViewController {
            vc.present(alert, animated: true, completion: nil)
        }
    }
    
    func decryptedStr() {
        // zhuishu的解密方法
        let textFile = Bundle.main.path(forResource: "EncrtptorText", ofType: nil) ?? ""
        if let cpContent = try? String(contentsOfFile: textFile) {
            let str =  FBEncryptorAESUtils.getDecryptedStr(withKey: "inTv0kKl4pI1BMk2munvAg==", cipherText: cpContent)
            print("FBEncryptorAESUtils:\(str)")
        }
    }
    
    func showSplash() {
        // 后台超过3分钟才展示开屏广告
        let splashTime = UserDefaults.standard.double(forKey: UserDefaults.splashTimeKey)
        let currentTime = Date().timeIntervalSince1970
        if currentTime - splashTime > 180 {
            UserDefaults.standard.set(currentTime, forKey: UserDefaults.splashTimeKey)
            UserDefaults.standard.synchronize()
            let splashViewController = UIStoryboard.main.instantiateInitialViewController()
            let keyWindow = UIApplication.shared.windows.first(where: { $0.isKeyWindow })
            keyWindow?.rootViewController = splashViewController
        }
    }
    
    func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
        let path = ZSShelfConstant.inboxPath
        ZSShelfManager.share.scanPath(path: path)
        return true
    }

    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        if url.isFileURL {
            NotificationCenter.default.post(name: NSNotification.Name.LocalShelfChanged, object: nil)
            return true
        }
        QQApiInterface.handleOpen(url, delegate: ZSThirdLogin.share)
        if TencentOAuth.canHandleOpen(url) {
            return TencentOAuth.handleOpen(url)
        }
        var result = WXApi.handleOpen(url, delegate: WXApiRequestHandler.share)
        result = WeiboSDK.handleOpen(url, delegate: ZSThirdLogin.share)
        return result
    }
    
    func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
        QQApiInterface.handleOpen(url, delegate: ZSThirdLogin.share)
        if TencentOAuth.canHandleOpen(url) {
            return TencentOAuth.handleOpen(url)
        }
        var result = WXApi.handleOpen(url, delegate: WXApiRequestHandler.share)
        result = WeiboSDK.handleOpen(url, delegate: ZSThirdLogin.share)
        return result
    }
    
    func applicationWillResignActive(_ application: UIApplication) {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.

    }

    func applicationDidEnterBackground(_ application: UIApplication) {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
        
    }

    func applicationWillEnterForeground(_ application: UIApplication) {
        // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
        showSplash()
        let pasteboard = UIPasteboard.general
        let items = pasteboard.items
        for item in items {
            if let vcnList = item["IFlySpeechPlusVcnList"] as? Data {
                if let files = NSKeyedUnarchiver.unarchiveObject(with: vcnList) as? [[String:Any]] {
                    for file in files {
                        if let vcn = file["vcn"] as? [String:Any] {
                            if let data = file["data"] as? Data {
                                let path = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0]
                                let filePath = "\(path)/\(vcn["name"] ?? "").jet"
                                let url = URL(fileURLWithPath: filePath)
                                _ = try? data.write(to: url)
                            }
                        }
                    }
                }
                
            } else if ZSThirdLoginStorage.share.canHandle(pasteData: item) {
                ZSThirdLoginStorage.share.handle(pasteData: item as! [String : Data])
            }
        }
    }
    
    func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        return .all
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    }

    func applicationWillTerminate(_ application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    }


}




================================================
FILE: zhuishushenqi/App/AppOpenAdManager.swift
================================================
//
//  Copyright 2021 Google LLC
//
//  Licensed under the Apache License, Version 2.0 (the "License");
//  you may not use this file except in compliance with the License.
//  You may obtain a copy of the License at
//
//      https://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS,
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  See the License for the specific language governing permissions and
//  limitations under the License.
//
import GoogleMobileAds

protocol AppOpenAdManagerDelegate: AnyObject {
  /// Method to be invoked when an app open ad is complete (i.e. dismissed or fails to show).
  func appOpenAdManagerAdDidComplete(_ appOpenAdManager: AppOpenAdManager)
}

class AppOpenAdManager: NSObject {
  /// Ad references in the app open beta will time out after four hours,
  /// but this time limit may change in future beta versions. For details, see:
  /// https://support.google.com/admob/answer/9341964?hl=en
  let timeoutInterval: TimeInterval = 4 * 3_600
  /// The app open ad.
  var appOpenAd: GADAppOpenAd?
  /// Maintains a reference to the delegate.
  weak var appOpenAdManagerDelegate: AppOpenAdManagerDelegate?
  /// Keeps track of if an app open ad is loading.
  var isLoadingAd = false
  /// Keeps track of if an app open ad is showing.
  var isShowingAd = false
  /// Keeps track of the time when an app open ad was loaded to discard expired ad.
  var loadTime: Date?

  static let shared = AppOpenAdManager()

  private func wasLoadTimeLessThanNHoursAgo(timeoutInterval: TimeInterval) -> Bool {
    // Check if ad was loaded more than n hours ago.
    if let loadTime = loadTime {
      return Date().timeIntervalSince(loadTime) < timeoutInterval
    }
    return false
  }

  private func isAdAvailable() -> Bool {
    // Check if ad exists and can be shown.
    return appOpenAd != nil && wasLoadTimeLessThanNHoursAgo(timeoutInterval: timeoutInterval)
  }

  private func appOpenAdManagerAdDidComplete() {
    // The app open ad is considered to be complete when it dismisses or fails to show,
    // call the delegate's appOpenAdManagerAdDidComplete method if the delegate is not nil.
    appOpenAdManagerDelegate?.appOpenAdManagerAdDidComplete(self)
  }

  func loadAd() {
    // Do not load ad if there is an unused ad or one is already loading.
    if isLoadingAd || isAdAvailable() {
      return
    }
    isLoadingAd = true
    print("Start loading app open ad.")
    GADAppOpenAd.load(
      withAdUnitID: "ca-app-pub-3940256099942544/5662855259",
      request: GADRequest(),
      orientation: UIInterfaceOrientation.portrait
    ) { ad, error in
      self.isLoadingAd = false
      if let error = error {
        self.appOpenAd = nil
        self.loadTime = nil
        print("App open ad failed to load with error: \(error.localizedDescription).")
        return
      }

      self.appOpenAd = ad
      self.appOpenAd?.fullScreenContentDelegate = self
      self.loadTime = Date()
      print("App open ad loaded successfully.")
    }
  }

  func showAdIfAvailable(viewController: UIViewController) {
      return 
    // If the app open ad is already showing, do not show the ad again.
    if isShowingAd {
      print("App open ad is already showing.")
      return
    }
    // If the app open ad is not available yet but it is supposed to show,
    // it is considered to be complete in this example. Call the appOpenAdManagerAdDidComplete
    // method and load a new ad.
    if !isAdAvailable() {
      print("App open ad is not ready yet.")
      appOpenAdManagerAdDidComplete()
      loadAd()
      return
    }
    if let ad = appOpenAd {
      print("App open ad will be displayed.")
      isShowingAd = true
      ad.present(fromRootViewController: viewController)
    }
  }
}

extension AppOpenAdManager: GADFullScreenContentDelegate {
  func adDidPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) {
    print("App open ad is presented.")
  }

  func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
    appOpenAd = nil
    isShowingAd = false
    print("App open ad was dismissed.")
    appOpenAdManagerAdDidComplete()
    loadAd()
  }

  func ad(
    _ ad: GADFullScreenPresentingAd,
    didFailToPresentFullScreenContentWithError error: Error
  ) {
    appOpenAd = nil
    isShowingAd = false
    print("App open ad failed to present with error: \(error.localizedDescription).")
    appOpenAdManagerAdDidComplete()
    loadAd()
  }
}


================================================
FILE: zhuishushenqi/App/AppStyle.swift
================================================
//
//  AppStyle.swift
//  zhuishushenqi
//
//  Created by yung on 2017/8/8.
//  Copyright © 2017年 QS. All rights reserved.
//

import Foundation

let nightKey = "light.key"
let fontSizeKey = "fontSize.key"
let animationStyleKey = "animationStyle.key"

struct AppStyle {
    
    static var shared = AppStyle()
    
    var readFontSize:Int {
        set {
            UserDefaults.standard.set(newValue, forKey: fontSizeKey)
        }
        get {
            let size = UserDefaults.standard.integer(forKey: fontSizeKey)
            if size == 0 {
                return 20;
            }
            return size
        }
    }
    
    var reader:Reader = AppStyle.getReader() {
        didSet{
            AppStyle.setReader(reader)
        }
    }
    
    var theme:AppTheme = UserDefaults.standard.bool(forKey: nightKey) ? .night : .day {
        didSet{
            UserDefaults.standard.set(theme == .night, forKey: nightKey)
        }
    }
    
    var animationStyle:ZSReaderAnimationStyle = ZSReaderAnimationStyle(rawValue: UserDefaults.standard.integer(forKey: animationStyleKey)) ?? .none {
        didSet {
            UserDefaults.standard.set(animationStyle.rawValue, forKey: animationStyleKey)
            UserDefaults.standard.synchronize()
        }
    }
    
    private init(){}
    
    static func getReader()->Reader{
        let value = UserDefaults.standard.integer(forKey: readerKey)
        switch value {
        case 1:
            return .yellow
        case 2:
            return .green
        default:
            return .white
        }
    }
    
    static func setReader(_ reader:Reader){
        var value = 0
        switch reader {
        case .yellow:
            value = 1
        case .green:
            value = 2
        default:
            value = 0
        }
        UserDefaults.standard.set(value, forKey: readerKey)
    }

}


================================================
FILE: zhuishushenqi/App/BUAdManager.swift
================================================
//
//  BUAdManager.swift
//  zhuishushenqi
//
//  Created by daye on 2021/12/27.
//  Copyright © 2021 QS. All rights reserved.
//

import Foundation
import BUAdSDK
import UIKit

typealias BUAdHandler = ()->Void

class BUAdManager:NSObject {
    
    private static let appKey = "5256970"
    
    private static let secretKey = ""
    
    static let shared = BUAdManager()
    
    private var splashAdView:BUSplashAdView?
    
    private var startTime:CFTimeInterval = 0
    
    private var loadAdSuccess:Bool = false
    
    var completion:BUAdHandler?
    var success:BUAdHandler?
    
    func loadAd() {
        let territory = UserDefaults.standard.integer(forKey: "territory")
        let isNoCN = territory > 0 && territory != BUAdSDKTerritory.CN.rawValue
        
        BUAdSDKManager.setAppID(BUAdManager.appKey)
        BUAdSDKManager.setTerritory(isNoCN ? BUAdSDKTerritory.NO_CN:BUAdSDKTerritory.CN)
        BUAdSDKManager.setGDPR(0)
        BUAdSDKManager.setCoppa(0)
        BUAdSDKManager.setCCPA(1)
#if DEBUG
        BUAdSDKManager.setLoglevel(.verbose)
#endif
        BUAdSDKManager.start(asyncCompletionHandler: { [weak self] success, error in
            self?.loadAdSuccess = success
        })
    }
    
    func startBUAdSDK(viewController:UIViewController) {
        if loadAdSuccess {
            addSplashAD(viewController: viewController)
        } else {
            completion?()
        }
    }
    
    private func addSplashAD(viewController:UIViewController) {
        let frame = UIScreen.main.bounds
        splashAdView = BUSplashAdView(slotID: BUAdSlotID.normal_splash_ID, frame: frame)
        splashAdView?.tolerateTimeout = 3
        splashAdView?.delegate = self
        
        startTime = CACurrentMediaTime()
        splashAdView?.loadAdData()
        viewController.view.addSubview(splashAdView!)
        splashAdView?.rootViewController = viewController
    }
    
    private func removeSplashAd() {
        splashAdView?.removeFromSuperview()
    }
}

extension BUAdManager:BUSplashAdDelegate {
    
    func splashAdDidLoad(_ splashAd: BUSplashAdView) {
        success?()
    }
    
    func splashAdDidClose(_ splashAd: BUSplashAdView) {
        completion?()
        removeSplashAd()
    }
    
    func splashAdDidClickSkip(_ splashAd: BUSplashAdView) {
        completion?()
        removeSplashAd()
    }
    
    func splashAd(_ splashAd: BUSplashAdView, didFailWithError error: Error?) {
        completion?()
        removeSplashAd()
    }
    
    func splashAdCountdown(toZero splashAd: BUSplashAdView) {
        
    }
    
    func splashAdDidCloseOtherController(_ splashAd: BUSplashAdView, interactionType: BUInteractionType) {
        
    }
}

class BUAdSlotID {
    static let normal_splash_ID = "887655509"
}


================================================
FILE: zhuishushenqi/App/BookManager.swift
================================================
//
//  BookManager.swift
//  zhuishushenqi
//
//  Created by yung on 2017/8/9.
//  Copyright © 2017年 QS. All rights reserved.
//

import Foundation

// 书籍信息保存类
public class ZSBookManager {
    
    // 策略
    // 书架信息:保存书架书籍的所有id的list到本地
    // 根据id从本地文件中查询是否存在该书籍,如果不存在,从list中删除该id,如果存在,在内存中保存信息
    // 书架中书籍的id保存为list的key,对key取md5即为保存的文件名
    let ZSBookShelfIDSKey = "ZSBookShelfIDSKey"
    let ZSReadHistorySaveIDKey = "ZSReadHistorySaveKey"
    let ZSReadHistoryBooksKey = "ZSReadHistoryBooksKey"
    
    fileprivate static var _ids:[String] = []
    fileprivate static var _books:[String:BookDetail] = [:]
    fileprivate static var _historyIds:[String] = []
    fileprivate static var _historyBooks:[String:BookDetail] = [:]
    
    // 书架的所有书籍的id
    var ids:[String] {
        get {
            return booksID()
        }
        set {}
    }
    
    // 书架中的所有书籍的model,请勿使用set方法
    var books:[String:BookDetail] {
        get {
            return booksInfo()
        }
        set {}
    }
    
    /// 阅读历史
    var historyBooks:[String:BookDetail] {
        get {
            return historyBooksInfo()
        }
        set {}
    }
    
    var historyIds:[String] {
        get {
            return historyBooksID()
        }
        set {}
    }
    
    var _diskQueue:DispatchQueue!
    
    static let shared = ZSBookManager()
    
    private init() {
        ZSBookManager.calTime {
            ZSBookManager._ids = ZSBookManager._ids.filterDuplicates({$0})
            let ids = ZSBookManager._ids
            var index = 0
            for id in ids {
                if id == "" {
                    ZSBookManager._ids.remove(at: index)
                }
                index += 1
            }
            if ZSBookManager._ids.count > 0 {
                self.saveBooksID(booksID: ZSBookManager._ids)
            }
        }
    }
    
    //MARK: - 置顶
    func topBook(key:String) {
        var book_index = 0
        for index in 0..<ids.count {
            if ids[index] == key {
                book_index = index
            }
        }
        ZSBookManager._ids.remove(at: book_index)
        ZSBookManager._ids.insert(key, at: 0)
        saveBooksID(booksID: ZSBookManager._ids)
    }
    
    //MARK: - 添加,默认添加到尾部
    func addBook(book:BookDetail) {
        addBookId(book: book)
        addBookInfo(book: book)
    }
    
    //MARK: - 添加多本书籍,一般推荐书籍或者从远程拉取大量书籍时使用
    func addBooks(books:[BookDetail]) {
        for book in books {
            addBook(book: book)
        }
    }
    
    //MARK: - 删除指定书籍
    func deleteBook(book:BookDetail) {
        if !existBookId(bookId: book._id) {
            QSLog("\(book.title)不存在")
            return
        }
        clearId(id: book._id)
        clearBook(book: book)
    }
    
    //MARK: - 更新书架信息
    func update(bookshelfs:[BookShelf]) {
        for bookshelf in bookshelfs {
            guard let book = ZSBookManager._books[bookshelf._id ?? ""] else { return }
            if let updateStr = bookshelf.updated {
                if updateStr != book.updateInfo?.updated {
                    book.isUpdated = true
                    book.updateInfo = bookshelf
                    self.updateBook(book: book)
                }
            }
        }
    }
    
    //MARK: - 更新
    func updateBook(book:BookDetail) {
        if !existBookInfo(book: book) {
            QSLog("\(book.title)不存在")
            // 不存在,添加
            addBook(book: book)
        }
        QSLog("\(book.title)更新成功")
        ZSBookManager._books["\(book._id)"] = book
        saveBooks(book:book)
    }
    
    /// id数组中是否存在该id
    func existBookId(bookId:String) -> Bool {
        var exist_id:Bool = false
        for id in ZSBookManager._ids {
            if bookId == id {
                exist_id = true
            }
        }
        return exist_id
    }
    
    
    //MARK: - 浏览记录
    fileprivate func existHistoryId(id:String) ->Bool {
        var exist_id:Bool = false
        for historyId in ZSBookManager._historyIds {
            if historyId == id {
                exist_id = true
            }
        }
        return exist_id
    }
    
    func addHistory(book:BookDetail) {
        addHistoryId(id: book._id)
        addHistoryBook(book: book)
    }
    
    fileprivate func addHistoryId(id:String) {
        if existHistoryId(id: id) {
            return
        }
        if id == "" {
            return
        }
        ZSBookManager._historyIds.append(id)
        let path = ZSCacheHelper.historyPath
        let idString = ZSBookManager._historyIds.joined(separator: ",")
        let success = ZSCacheHelper.shared.storage(obj: idString, for: ZSReadHistorySaveIDKey, cachePath: path)
        if success {
            QSLog("阅读历史保存成功")
        }
    }
    
    fileprivate func addHistoryBook(book:BookDetail) {
        if book._id == "" {
            return
        }
        ZSBookManager.calTime {
            let path = ZSCacheHelper.historyPath
            let success = ZSCacheHelper.shared.storage(obj: book, for: book._id, cachePath: path)
            if success {
                QSLog("保存'\(book.title)'的阅读记录成功@_@")
            }
        }
    }
    
    /// 删除id数组中的该书id与本地id
    fileprivate func clearId(id:String) {
        var index = 0
        for bookId in ZSBookManager._ids {
            if id == bookId {
                break
            }
            index += 1
        }
        ZSBookManager._ids.remove(at: index)
        saveBooksID(booksID: ZSBookManager._ids)
    }
    
    /// 书籍数组中是否存在该书籍
    fileprivate func existBookInfo(book:BookDetail) -> Bool {
        var book_exist = false
        for item in ZSBookManager._books {
            if item.key == book._id {
                book_exist = true
            }
        }
        return book_exist
    }
    
    /// 添加书籍的id到id数组中
    private func addBookId(book:BookDetail) {
        if book._id == "" {
            // 为空,不添加
            return
        }
        if existBookId(bookId: book._id) {
            // 书架中已存在,不添加
            return
        }
        ZSBookManager._ids.append(book._id)
        saveBooksID(booksID: ZSBookManager._ids)
    }
    
    /// 添加书籍到书籍数组中
    private func addBookInfo(book:BookDetail) {
        if book._id == "" {
            // 为空,不添加
            return
        }
        if existBookInfo(book: book) {
            // 书架中已存在,不添加
            return
        }
        ZSBookManager._books["\(book._id)"] = book
        saveBooks(book: book)
    }
    
    //MARK: - 保存该书籍信息到本地
    fileprivate func saveBooks(book:BookDetail) {
        ZSBookManager._books = books
        // 只更新这本书,防止多次重复无用更新
        ZSBookManager.calTime {
            let cachePath = ZSCacheHelper.bookshelfBooksPath
            let success = ZSCacheHelper.shared.storage(obj: book, for: book._id, cachePath: cachePath)
            if success {
                QSLog("保存'\(book.title)'成功@_@")
            }
        }
    }
    
    //MARK: - 保存id数组到本地
    fileprivate func saveBooksID(booksID:[String]) {
        ZSBookManager._ids = booksID
        let path = ZSCacheHelper.bookshelfPath
        let idString = booksID.joined(separator: ",")
        let success = ZSCacheHelper.shared.storage(obj: idString, for: ZSBookShelfIDSKey, cachePath: path)
        if success {
            QSLog("书架List保存成功")
        }
    }
    
    /// 清除本地书籍信息
    fileprivate func clearBook(book:BookDetail) {
        ZSBookManager.calTime {
            let path = ZSCacheHelper.bookshelfBooksPath
            ZSCacheHelper.shared.clear(for: book._id, cachePath: path)
        }
    }
    
    //MARK: - 历史信息
    fileprivate func historyBooksInfo() -> [String:BookDetail] {
        if ZSBookManager._historyBooks.count > 0 {
            return ZSBookManager._historyBooks
        }
        var models:[String:BookDetail] = [:]
        for id in self.historyIds {
            let path = ZSCacheHelper.historyPath
            if let obj = ZSCacheHelper.shared.cachedObj(for: id, cachePath: path) as? BookDetail {
                models[id] = obj
            }
        }
        ZSBookManager._historyBooks = models
        return models
    }
    
    fileprivate func historyBooksID() ->[String] {
        if ZSBookManager._historyIds.count > 0 {
            return ZSBookManager._historyIds
        }
        let path = ZSCacheHelper.historyPath
        if let ids = ZSCacheHelper.shared.cachedObj(for: ZSReadHistorySaveIDKey, cachePath: path) as? String {
            let idArr = ids.components(separatedBy: ",")
            ZSBookManager._historyIds = idArr
            return idArr
        }
        ZSBookManager._historyIds = []
        return []
    }
    
    /// 获取本地保存的所有的书籍信息
    fileprivate func booksInfo() -> [String:BookDetail] {
        if ZSBookManager._books.count > 0 && ZSBookManager._books.count == self.ids.count {
            
            return ZSBookManager._books
        }
        var models:[String:BookDetail] = [:]
        for id in self.ids {
            let path = ZSCacheHelper.bookshelfBooksPath
            if let obj = ZSCacheHelper.shared.cachedObj(for: id, cachePath: path) as? BookDetail {
                models[id] = obj
            }
        }
        ZSBookManager._books = models
        return models
    }
    
    // 如果ids存在,返回ids,如果不存在,读文件后保存到ids中,修改时页需要更新ids中的内容
    fileprivate func booksID() ->[String] {
        if ZSBookManager._ids.count > 0 {
            return ZSBookManager._ids.filter{ return $0 != "" }
        }
        let key = ZSBookShelfIDSKey
        let path = ZSCacheHelper.bookshelfPath
        if let ids = ZSCacheHelper.shared.cachedObj(for: key, cachePath: path) as? String {
            let idArr = ids.components(separatedBy: ",").filter{ $0 != "" }
            ZSBookManager._ids = idArr
            return idArr
        }
        ZSBookManager._ids = []
        return []
    }
    
    // 计算耗时的方法
    static func calTime(_ action: @escaping () ->Void){
        let startTime = CFAbsoluteTimeGetCurrent()
        action()
        let linkTime = (CFAbsoluteTimeGetCurrent() - startTime)
        QSLog("Linked in \(linkTime * 1000.0) ms")
    }
}

// 由于采用数组时,每次遍历的时间会很长,无法快速保存,因此采用NSDictionary来保存书架中的书籍,key为对应的书籍的_id
// 书架信息只保存_id 数组,这样可以对书籍进行排序
// 根据_id从本地保存的数据中取出NSDictionary
// 每 一本书籍单独保存,避免读取时影响速度
// 该类为书架书籍管理类,管理书架上的书籍的信息,缓存等
public class BookManager {
    let bookshelfSaveKey = "bookshelfSaveKey"
    let readHistorySaveKey = "readHistorySaveKey"
    
    let zsbookshelvesSaveKey = "zsbookshelvesSaveKey"
    let zshistorysavekey = "zshistorysavekey"

    var _diskQueue:DispatchQueue!
    
    static let shared = BookManager()
    
    private init() {
        
        BookManager.calTime {
            //在这写入要计算时间的代码
            self.booksID = self.bookshelf()
            
            self.books = [String:Any]()
            for bookId in self.booksID {
                let bookInfo = self.bookInfo(id: bookId)
                self.books[bookId] = bookInfo
            }
        }
    }
    
    static func calTime(_ action: @escaping () ->Void){
        let startTime = CFAbsoluteTimeGetCurrent()
        action()
        let linkTime = (CFAbsoluteTimeGetCurrent() - startTime)
        QSLog("Linked in \(linkTime * 1000.0) ms")
    }
    
    // key为_id,value 为BookDetail
    var books:[String:Any]!
    
    // booksID 为所有的书籍的id
    var booksID:[String]!
    
    func bookExist(book:BookDetail?) ->Bool {
        if books[book?._id ?? ""] != nil {
            return true
        }
        return false
    }
    
    // 更新bookdetail的信息,bookdetail的数组与updateinfo数组是一一对应的
    func updateInfoUpdate(updateInfo:[BookShelf]){
        if updateInfo.count != books.allKeys().count {
            return
        }
        for index in 0..<books.allKeys().count {
            let key = books.allKeys()[index]
            if let bookDetail = books[key] as? BookDetail {
                let updateObj = updateInfo[index]
                if anyUpdate(bookInfo: bookDetail.updateInfo, updateInfo: updateObj) {
                    bookDetail.isUpdated = true
                }
                bookDetail.updateInfo = updateInfo[index]
            }
        }
    }
    
    //需要将对应的update信息赋给model
    func updateToModel(updateModels:[BookShelf]){
        for updateModel in updateModels {
            let id = updateModel._id ?? ""
            let book:BookDetail? = books[id] as? BookDetail
            if let model = book  {
                // 如果updateInfo已存在,则比较是否有更新
                if anyUpdate(bookInfo: model.updateInfo, updateInfo: updateModel) {
                    model.isUpdated = true
                }
                model.updateInfo = updateModel
                books[model._id] = model
            }
        }
    }
    
    func anyUpdate(bookInfo:BookShelf?,updateInfo:BookShelf)->Bool{
        if let updatedString = bookInfo?.updated {
            if updatedString != updateInfo.updated {
                return true
            }
        }
        return false
    }
    
    // 删除书籍时,只删除记录,缓存的书籍信息保留
    func deleteBook(book:BookDetail){
        removeBook(book: book)
        saveBooksID()
    }
    
    func removeBook(book:BookDetail){
        if let books:[String] = self.booksID {
            var index = 0
            for bookid in books {
                if book._id == bookid {
                    self.booksID?.remove(at: index)
                    self.books?.removeValue(forKey: bookid)
                }
                index += 1
            }
        }
    }
    
    // 更新书架中保存的书籍信息,从内存更新
    @discardableResult
    func modifyBookshelf(book:BookDetail)->[String:Any]{
        var tmpBook = books["\(book._id)"]
        if let _ = tmpBook{
            tmpBook = book
            books["\(book._id)"] = tmpBook!
        } else {
            // 书籍不存在,则添加
            books["\(book._id)"] = book
        }
        DispatchQueue.global().async {
            // 持久化时,章节内容置为空
            book.book.chapters = [QSChapter()]
            self.addBookInfo(info: book)
        }
        return books
    }
    
    // 更新书架中保存的书籍信息,当用户同意添加到书架时才会调用这个方法
    // 首次安装推荐时获取的书籍列表
    func modifyBookshelf(books:[BookDetail]?){
        if let models = books {
            for model in models {
                modifyBookshelf(book: model)
            }
        }
    }
    
    // 更新书籍的记录
    func modifyRecord(_ book:BookDetail,_ chapter:Int?,_ page:Int?) {
        modifyRecord(book, chapter, page, nil)
    }
    
    func modifyRecord(_ book:BookDetail,_ chapter:Int?,_ page:Int?,_ bookId:String?) {
        books[book._id] = book
        DispatchQueue.global().async {
            // 持久化时,章节内容置为空,避免内容过大
            book.book.chapters = [QSChapter()]
            self.saveBookInfo(info: book)
        }
    }
    
    // 数据持久化
    func saveBookshelf(shelf:BookDetail){
        self.booksID.append(shelf._id)
        let data = NSKeyedArchiver.archivedData(withRootObject: shelf)
        setData(data: data, forKey: bookshelfSaveKey)
    }
    
    public func bookshelf()->[String]{
        let data = qs_data(forKey: bookshelfSaveKey)
        if let bookData = data {
            
            let obj = NSKeyedUnarchiver.unarchiveObject(with: bookData) as? [String]
            return obj ?? []
        }
        return []
    }
    
    func localBookInfo(key:String)->BookDetail?{
        let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last?.appending("/\(key)")
        let url = URL(fileURLWithPath: path ?? "https://www.baidu.com")
        if let data = try? Data(contentsOf: url, options: Data.ReadingOptions.mappedIfSafe) {
            let obj = NSKeyedUnarchiver.unarchiveObject(with: data) as? BookDetail
            return obj
        }
        return nil
    }
    
    // 从本地根据id获取书籍的信息
    func bookInfo(id:String) ->BookDetail?{
        let data = qs_data(forKey: id)
        if let bookData = data {
            let obj = NSKeyedUnarchiver.unarchiveObject(with: bookData) as? BookDetail
            books[id] = obj
            return obj
        }
        return nil
    }
    
    //MARK: - 浏览记录
    func readHistory()->[BookDetail]{
        if let data = qs_data(forKey: readHistorySaveKey) {
            if let books = NSKeyedUnarchiver.unarchiveObject(with: data) as? [BookDetail] {
                return books
            }
        }
        return []
    }
    
    // 数组中是否存在当前书籍,以id作为标志
    func bookExist(book:BookDetail,at:[BookDetail])->Bool{
        var exist = false
        for model in at {
            if model._id == book._id {
                exist = true
            }
        }
        return exist
    }
    
    func addReadHistory(book:BookDetail){
        // 先匹配
        var history = readHistory()
        if !bookExist(book: book, at: history) {
            history.insert(book, at: 0)
            let data = NSKeyedArchiver.archivedData(withRootObject: history)
            setData(data: data, forKey: readHistorySaveKey)
        }
    }
    
    //MARK: - 添加书籍保存
    func addBook(book:BookDetail){
        addBookID(book: book)
        addBookInfo(info: book)
    }
    
    func addBookID(book:BookDetail){
        if book._id != ""{
            self.booksID.append(book._id)
            saveBooksID()
        }
    }
    
    // 将书籍对应的BookDetail 模型存储到沙盒
    func addBookInfo(info:BookDetail){
        if info._id != ""{
            self.books[info._id] = info
            saveBookInfo(info: info)
        }
    }
    
    func saveBookInfo(info:BookDetail) {
        let data = NSKeyedArchiver.archivedData(withRootObject: info)
        setData(data: data, forKey: info._id)
    }
    
    func saveBooksID(){
        let booksData = NSKeyedArchiver.archivedData(withRootObject: self.booksID)
        setData(data: booksData, forKey: bookshelfSaveKey)
    }
    
    //MARK: -  数据持久化方法
    func qs_data(forKey:String) ->Data?{
        let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last?.appending("/\(forKey.md5())")
        let url = URL(fileURLWithPath: path ?? "https://www.baidu.com")
        let data = try? Data(contentsOf: url, options: Data.ReadingOptions.mappedIfSafe)
        return data
    }
    
    func setData(data:Data,forKey:String){
        let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last?.appending("/\(forKey.md5())")
        if _diskQueue == nil {
            let label = "com.norycao.zhuishushenqi.disk"
            let qos =  DispatchQoS.default
            let attributes = DispatchQueue.Attributes.concurrent
            let autoreleaseFrequency:DispatchQueue.AutoreleaseFrequency!
            if #available(iOS 10.0, *) {
                autoreleaseFrequency = DispatchQueue.AutoreleaseFrequency.never
            } else {
                // Fallback on earlier versions
                autoreleaseFrequency = DispatchQueue.AutoreleaseFrequency.inherit
            }
            _diskQueue = DispatchQueue(label: label, qos: qos, attributes: attributes, autoreleaseFrequency: autoreleaseFrequency, target: nil)
        }

        _diskQueue.async {
            let url = URL(fileURLWithPath: path ?? "https://www.baidu.com")
            do{
                try data.write(to: url)
            }catch let error {
                QSLog(error)
            }
        }
    }
    
}


================================================
FILE: zhuishushenqi/App/Config.swift
================================================
//
//  Config.swift
//  zhuishushenqi
//
//  Created by Nory Cao on 16/9/17.
//  Copyright © 2016年 QS. All rights reserved.
//

import Foundation
import UIKit

// FIXME: comparison operators with optionals were removed from the Swift Standard Libary.
// Consider refactoring the code to use the non-optional operators.
fileprivate func < <T : Comparable>(lhs: T?, rhs: T?) -> Bool {
  switch (lhs, rhs) {
  case let (l?, r?):
    return l < r
  case (nil, _?):
    return true
  default:
    return false
  }
}

// FIXME: comparison operators with optionals were removed from the Swift Standard Libary.
// Consider refactoring the code to use the non-optional operators.
fileprivate func >= <T : Comparable>(lhs: T?, rhs: T?) -> Bool {
  switch (lhs, rhs) {
  case let (l?, r?):
    return l >= r
  default:
    return !(lhs < rhs)
  }
}
//MARK:- API
let BASEURL = "http://api.zhuishushenqi.com"
let IMAGE_BASEURL = "http://statics.zhuishushenqi.com"
let CHAPTERURL = "http://chapter2.zhuishushenqi.com/chapter"
let BOOKSHELF =  "user/bookshelf"
let RANKING = "ranking/gender"

// db
let searchHistory = "searchHistory"
let dbName = "QS.zhuishushenqi.searchHistory"

//MARK: - 常用frame
let BOUNDS = UIScreen.main.bounds
let ScreenWidth = UIScreen.main.bounds.size.width
let ScreenHeight = UIScreen.main.bounds.size.height
let SCALE = (ScreenWidth / 320.0)
let TOP_BAR_Height:CGFloat = 64
let FOOT_BAR_Height:CGFloat = 49 + kTabbarBlankHeight
let STATEBARHEIGHT = UIApplication.shared.statusBarFrame.height
let kNavgationBarHeight:CGFloat = (IPHONEX ? 88:64)
let kTabbarBlankHeight:CGFloat  = (IPHONEX ? 34:0)
let kQSReaderTopMargin:CGFloat = (IPHONEX ? 30:0)

//区分屏幕
let IPHONE4 = UIScreen.instancesRespond(to: #selector(getter: RunLoop.currentMode)) ? CGSize(width: 640, height: 960).equalTo((UIScreen.main.currentMode?.size)!) : false
let IPHONE5 = UIScreen.instancesRespond(to: #selector(getter: RunLoop.currentMode)) ? CGSize(width: 640, height: 1136).equalTo((UIScreen.main.currentMode?.size)!) : false
let IPHONE6 = UIScreen.instancesRespond(to: #selector(getter: RunLoop.currentMode)) ? CGSize(width: 750, height: 1334).equalTo((UIScreen.main.currentMode?.size)!) : false
let IPHONE6Plus = UIScreen.instancesRespond(to: #selector(getter: RunLoop.currentMode)) ? CGSize(width: 1242, height: 2208).equalTo((UIScreen.main.currentMode?.size)!) : false
let IPHONEX_SMALL = UIScreen.instancesRespond(to: #selector(getter: RunLoop.currentMode)) ? CGSize(width: 828, height: 1792).equalTo((UIScreen.main.currentMode?.size)!) : false
let IPHONEX_MID = UIScreen.instancesRespond(to: #selector(getter: RunLoop.currentMode)) ? CGSize(width: 1125, height: 2436).equalTo((UIScreen.main.currentMode?.size)!) : false
let IPHONEX_BIG = UIScreen.instancesRespond(to: #selector(getter: RunLoop.currentMode)) ? CGSize(width: 1242, height: 2688).equalTo((UIScreen.main.currentMode?.size)!) : false
let IPHONEX = IPHONEX_SMALL || IPHONEX_MID || IPHONEX_BIG || iPhone12Series()


//根据系统判断 获取iPad的屏幕尺寸

let IOS9_OR_LATER = (Float(UIDevice.current.systemVersion) >= 9.0)
let IOS8_OR_LATER = (Float(UIDevice.current.systemVersion) >= 8.0)
let IOS7_OR_LATER = (Float(UIDevice.current.systemVersion) >= 7.0)
let APP_DELEGATE = (UIApplication.shared.delegate as! AppDelegate)
let APP_DELEGATEKeyWindow = UIApplication.shared.delegate?.window
let USER_DEFAULTS =  UserDefaults.standard
let KeyWindow = UIApplication.shared.keyWindow
let SideVC = SideViewController.shared
let ReaderBg = "ReaderBg"
let FontSize = "FontSize"
let OriginalBrightness = "OriginalBrightness"
let Brightness = "Brightness"
let ReadingProgress = "ReadingProgress"
let PostLink = "PostLink"

// notification
let SHOW_RECOMMEND = "ShowRecomend"
let BOOKSHELF_REFRESH = "BookShelfRefresh"
let BOOKSHELF_ADD = "BOOKSHELF_ADD"
let BOOKSHELF_DELETE = "BOOKSHELF_DELETE"

let RootDisappearNotificationName = "RootDisappearNotificationName"


func getAttributes(with lineSpave:CGFloat,font:UIFont)->NSDictionary{
    let paraStyle = NSMutableParagraphStyle()
    paraStyle.lineBreakMode = .byCharWrapping
    paraStyle.alignment = .left
    paraStyle.lineSpacing = lineSpave
    paraStyle.hyphenationFactor = 1.0
    paraStyle.firstLineHeadIndent = 0.0
    paraStyle.paragraphSpacingBefore = 0.0
    paraStyle.headIndent = 0
    paraStyle.tailIndent = 0
    let dict = [NSAttributedString.Key.font:font,NSAttributedString.Key.kern:1.5,NSAttributedString.Key.paragraphStyle:paraStyle] as [NSAttributedString.Key : Any]
    return dict as NSDictionary
}

func attributeText(with lineSpace:CGFloat,text:String,font:UIFont)->NSAttributedString{
    let paraStyle = NSMutableParagraphStyle()
    paraStyle.lineBreakMode = .byCharWrapping
    paraStyle.alignment = .left
    paraStyle.hyphenationFactor = 1.0
    paraStyle.firstLineHeadIndent = 0.0
    paraStyle.paragraphSpacingBefore = 0.0
    paraStyle.headIndent = 0
    paraStyle.tailIndent = 0
    let dict = [NSAttributedString.Key.font:font,NSAttributedString.Key.kern:1.5,NSAttributedString.Key.paragraphStyle:paraStyle] as [NSAttributedString.Key : Any]
    let attributeStr = NSAttributedString(string: text, attributes: dict)
    return attributeStr
}

func QSLog<T>(_ message:T,fileName:String = #file,lineName:Int = #line,funcName:String = #function){
    #if DEBUG
        print("QSLog:\((fileName as NSString).lastPathComponent)[\(lineName)]\(funcName):\n\(message)\n")
    #endif
}

func calTime(_ action: @escaping () ->Void){
    let startTime = CFAbsoluteTimeGetCurrent()
    action()
    let linkTime = (CFAbsoluteTimeGetCurrent() - startTime)
    QSLog("Linked in \(linkTime * 1000.0) ms")
}

func iPhone12Series() ->Bool {
    let _12MiniSize = CGSize(width: 360, height: 780)
    let _12ProSize = CGSize(width: 390, height: 844)
    let _12ProMaxSize = CGSize(width: 428, height: 926)

    let _12MiniLandscapeSize = CGSize(width: 780, height: 360)
    let _12ProLandscapeSize = CGSize(width: 844, height: 390)
    let _12ProMaxLandscapeSize = CGSize(width: 926, height: 428)
    
    let isIPhone12Series:Bool = UIScreen.main.bounds.size.equalTo(_12MiniSize) ||
                            UIScreen.main.bounds.size.equalTo(_12ProSize) ||
                            UIScreen.main.bounds.size.equalTo(_12ProMaxSize) ||
                            UIScreen.main.bounds.size.equalTo(_12MiniLandscapeSize) ||
                            UIScreen.main.bounds.size.equalTo(_12ProLandscapeSize) ||
                            UIScreen.main.bounds.size.equalTo(_12ProMaxLandscapeSize)
    return isIPhone12Series
}



================================================
FILE: zhuishushenqi/App/FBEncryptorAES.h
================================================
//
//  FBEncryptorAES.h
//  zhuishushenqi
//
//  Created by yung on 2018/11/9.
//  Copyright © 2018年 QS. All rights reserved.
//

#import <CommonCrypto/CommonCryptor.h>
#import <Foundation/Foundation.h>

#define FBENCRYPT_ALGORITHM     kCCAlgorithmAES128
#define FBENCRYPT_BLOCK_SIZE    kCCBlockSizeAES128
#define FBENCRYPT_KEY_SIZE      kCCKeySizeAES128

@interface FBEncryptorAES : NSObject {
    
}

//-----------------
// API (raw data)
//-----------------
+ (NSData*)generateIv;
+ (NSData*)encryptData:(NSData*)data key:(NSData*)key iv:(NSData*)iv;
+ (NSData*)decryptData:(NSData*)data key:(NSData*)key iv:(NSData*)iv;


//-----------------
// API (base64)
//-----------------
// the return value of encrypteMessage: and 'encryptedMessage' are encoded with base64.
//
+ (NSString*)encryptBase64String:(NSString*)string keyString:(NSString*)keyString separateLines:(BOOL)separateLines;
+ (NSString*)decryptBase64String:(NSString*)encryptedBase64String keyString:(NSString*)keyString;

//-----------------
// API (utilities)
//-----------------
+ (NSString*)hexStringForData:(NSData*)data;
+ (NSData*)dataForHexString:(NSString*)hexString;


@end


================================================
FILE: zhuishushenqi/App/FBEncryptorAES.m
================================================
//
//  FBEncryptorAES.m
//  zhuishushenqi
//
//  Created by yung on 2018/11/9.
//  Copyright © 2018年 QS. All rights reserved.
//

#import "FBEncryptorAES.h"
#import "NSData+Base64.h"

@implementation FBEncryptorAES

#pragma mark -
#pragma mark Initialization and deallcation


#pragma mark -
#pragma mark Praivate


#pragma mark -
#pragma mark API

+ (NSData*)encryptData:(NSData*)data key:(NSData*)key iv:(NSData*)iv;
{
    NSData* result = nil;
    
    // setup key
    unsigned char cKey[FBENCRYPT_KEY_SIZE];
    bzero(cKey, sizeof(cKey));
    [key getBytes:cKey length:FBENCRYPT_KEY_SIZE];
    
    // setup iv
    char cIv[FBENCRYPT_BLOCK_SIZE];
    bzero(cIv, FBENCRYPT_BLOCK_SIZE);
    if (iv) {
        [iv getBytes:cIv length:FBENCRYPT_BLOCK_SIZE];
    }
    
    // setup output buffer
    size_t bufferSize = [data length] + FBENCRYPT_BLOCK_SIZE;
    void *buffer = malloc(bufferSize);
    
    // do encrypt
    size_t encryptedSize = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          FBENCRYPT_ALGORITHM,
                                          kCCOptionPKCS7Padding,
                                          cKey,
                                          FBENCRYPT_KEY_SIZE,
                                          cIv,
                                          [data bytes],
                                          [data length],
                                          buffer,
                                          bufferSize,
                                          &encryptedSize);
    if (cryptStatus == kCCSuccess) {
        result = [NSData dataWithBytesNoCopy:buffer length:encryptedSize];
    } else {
        free(buffer);
        NSLog(@"[ERROR] failed to encrypt|CCCryptoStatus: %d", cryptStatus);
    }
    
    return result;
}

+ (NSData*)decryptData:(NSData*)data key:(NSData*)key iv:(NSData*)iv;
{
    NSData* result = nil;
    
    // setup key
    unsigned char cKey[FBENCRYPT_KEY_SIZE];
    bzero(cKey, sizeof(cKey));
    [key getBytes:cKey length:FBENCRYPT_KEY_SIZE];
    
    // setup iv
    char cIv[FBENCRYPT_BLOCK_SIZE];
    bzero(cIv, FBENCRYPT_BLOCK_SIZE);
    if (iv) {
        [iv getBytes:cIv length:FBENCRYPT_BLOCK_SIZE];
    }
    
    // setup output buffer
    size_t bufferSize = [data length] + FBENCRYPT_BLOCK_SIZE;
    void *buffer = malloc(bufferSize);
    
    // do decrypt
    size_t decryptedSize = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
                                          FBENCRYPT_ALGORITHM,
                                          kCCOptionPKCS7Padding,
                                          cKey,
                                          FBENCRYPT_KEY_SIZE,
                                          cIv,
                                          [data bytes],
                                          [data length],
                                          buffer,
                                          bufferSize,
                                          &decryptedSize);
    
    if (cryptStatus == kCCSuccess) {
        result = [NSData dataWithBytesNoCopy:buffer length:decryptedSize];
    } else {
        free(buffer);
        NSLog(@"[ERROR] failed to decrypt| CCCryptoStatus: %d", cryptStatus);
    }
    
    return result;
}


+ (NSString*)encryptBase64String:(NSString*)string keyString:(NSString*)keyString separateLines:(BOOL)separateLines
{
    NSData* data = [self encryptData:[string dataUsingEncoding:NSUTF8StringEncoding]
                                 key:[keyString dataUsingEncoding:NSUTF8StringEncoding]
                                  iv:nil];
    return [data base64EncodedStringWithSeparateLines:separateLines];
}

+ (NSString*)decryptBase64String:(NSString*)encryptedBase64String keyString:(NSString*)keyString
{
    NSData* encryptedData = [NSData dataFromBase64String:encryptedBase64String];
    NSData* data = [self decryptData:encryptedData
                                 key:[keyString dataUsingEncoding:NSUTF8StringEncoding]
                                  iv:nil];
    if (data) {
        return [[NSString alloc] initWithData:data
                                     encoding:NSUTF8StringEncoding];
    } else {
        return nil;
    }
}


#define FBENCRYPT_IV_HEX_LEGNTH (FBENCRYPT_BLOCK_SIZE*2)

+ (NSData*)generateIv
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        srand((unsigned)time(NULL));
    });
    
    char cIv[FBENCRYPT_BLOCK_SIZE];
    for (int i=0; i < FBENCRYPT_BLOCK_SIZE; i++) {
        cIv[i] = rand() % 256;
    }
    return [NSData dataWithBytes:cIv length:FBENCRYPT_BLOCK_SIZE];
}


+ (NSString*)hexStringForData:(NSData*)data
{
    if (data == nil) {
        return nil;
    }
    
    NSMutableString* hexString = [NSMutableString string];
    
    const unsigned char *p = [data bytes];
    
    for (int i=0; i < [data length]; i++) {
        [hexString appendFormat:@"%02x", *p++];
    }
    return hexString;
}

+ (NSData*)dataForHexString:(NSString*)hexString
{
    if (hexString == nil) {
        return nil;
    }
    
    const char* ch = [[hexString lowercaseString] cStringUsingEncoding:NSUTF8StringEncoding];
    NSMutableData* data = [NSMutableData data];
    while (*ch) {
        char byte = 0;
        if ('0' <= *ch && *ch <= '9') {
            byte = *ch - '0';
        } else if ('a' <= *ch && *ch <= 'f') {
            byte = *ch - 'a' + 10;
        }
        ch++;
        byte = byte << 4;
        if (*ch) {
            if ('0' <= *ch && *ch <= '9') {
                byte += *ch - '0';
            } else if ('a' <= *ch && *ch <= 'f') {
                byte += *ch - 'a' + 10;
            }
            ch++;
        }
        [data appendBytes:&byte length:1];
    }
    return data;
}

@end


================================================
FILE: zhuishushenqi/App/FBEncryptorAESUtils.h
================================================
//
//  FBEncryptorAESUtils.h
//  zhuishushenqi
//
//  Created by yung on 2018/11/9.
//  Copyright © 2018年 QS. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface FBEncryptorAESUtils : NSObject

+ (NSString *)getDecryptedStrWithKey:(NSString *)key cipherText:(NSString *)cipherText;

@end

NS_ASSUME_NONNULL_END


================================================
FILE: zhuishushenqi/App/FBEncryptorAESUtils.mm
================================================
//
//  FBEncryptorAESUtils.m
//  zhuishushenqi
//
//  Created by yung on 2018/11/9.
//  Copyright © 2018年 QS. All rights reserved.
//

#import "FBEncryptorAESUtils.h"
#import "FBEncryptorAES.h"

       
@implementation FBEncryptorAESUtils

+ (NSString *)getDecryptedStrWithKey:(NSString *)key cipherText:(NSString *)cipherText {
    NSData *v9 = [[NSData alloc] initWithBase64EncodedString:key options:(NSDataBase64DecodingIgnoreUnknownCharacters)];
    NSData *v11 = [[NSData alloc] initWithBase64EncodedString:cipherText options:(NSDataBase64DecodingIgnoreUnknownCharacters)];
    if (v11.length > 16) {
        NSData *v12 = [v11 subdataWithRange:NSMakeRange(0, 16)];
        NSInteger v14 = v11.length;
        NSData *v15 = [v11 subdataWithRange:NSMakeRange(16, v14 - 16)];
        NSData *resultData = [FBEncryptorAES decryptData:v15 key:v9 iv:v12];
        NSString *resultText = [[NSString alloc] initWithData:resultData encoding:(NSUTF8StringEncoding)];
        return resultText;
    }
    return @"";
}

@end


================================================
FILE: zhuishushenqi/App/Reader.swift
================================================
//
//  ReaderStyle.swift
//  zhuishushenqi
//
//  Created by yung on 2017/8/9.
//  Copyright © 2017年 QS. All rights reserved.
//

import Foundation

enum Reader:Int {
    case white
    case yellow
    case green
    case blackgreen
    case pink
    case sheepskin
    case violet
    case water
    case weekGreen
    case weekPink
    case coffee
}

extension Reader {
    
    var backgroundImage:UIImage {
        switch self {
        case .yellow:
            return #imageLiteral(resourceName: "yellow_mode_bg")
        case .white:
            return #imageLiteral(resourceName: "white_mode_bg")
        case .green:
            return #imageLiteral(resourceName: "green_mode_bg")
        case .blackgreen:
            return #imageLiteral(resourceName: "new_nav_night_normal")
        case .pink:
            return #imageLiteral(resourceName: "violet_mode_bg")
        case .sheepskin:
            return #imageLiteral(resourceName: "beijing")
        case .violet:
            return #imageLiteral(resourceName: "violet_mode_bg")
        case .water:
            return #imageLiteral(resourceName: "sheepskin_mode_bg")
        case .weekPink:
            return #imageLiteral(resourceName: "violet_mode_bg")
        case .weekGreen:
            return #imageLiteral(resourceName: "violet_mode_bg")
        case .coffee:
            return #imageLiteral(resourceName: "pf_header_bg")
        default:
            return #imageLiteral(resourceName: "violet_mode_bg")
        }
    }
    
    var textColor:UIColor {
        switch self {
        case .yellow,.white,.green:
            return UIColor.black
        case .blackgreen,.coffee:
            return UIColor.white
        default:
            return UIColor.black
        }
    }
    
    var batteryColor:UIColor {
        switch self {
        case .yellow,.white,.green:
            return UIColor.darkGray
        case .blackgreen,.coffee:
            return UIColor.white
        default:
            return UIColor.darkGray
        }
    }
    
}


================================================
FILE: zhuishushenqi/App/Theme.swift
================================================
//
//  Theme.swift
//  zhuishushenqi
//
//  Created by yung on 2017/8/9.
//  Copyright © 2017年 QS. All rights reserved.
//

import Foundation

let readerKey = "reader.key"

enum AppTheme {
    case day
    case night
}

extension AppTheme {

    
}


================================================
FILE: zhuishushenqi/App/ZSDBManager.h
================================================
//
//  ZSDBManager.h
//  zhuishushenqi
//
//  Created by yung on 2018/11/22.
//  Copyright © 2018年 QS. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "ZSDBPropertyModel.h"

@protocol ZSDBModel <NSObject>

- (NSString *)tableName;
- (NSString *)primaryKey;
- (NSString *)foreignKey;
- (NSDictionary <NSString *,NSString *>*)dbColumnMapping;
- (NSArray <NSString *>*)ignoredKeys;

@end

@interface ZSDBManager : NSObject

+ (instancetype)share;

- (NSArray <ZSDBPropertyModel *>*)getPropertys:(NSObject *)model;

@end



================================================
FILE: zhuishushenqi/App/ZSDBManager.m
================================================
//
//  ZSDBManager.m
//  zhuishushenqi
//
//  Created by yung on 2018/11/22.
//  Copyright © 2018年 QS. All rights reserved.
//

#import "ZSDBManager.h"
#import <objc/runtime.h>
#import <FMDB/FMDB.h>

/** SQLite五种数据类型 */
#define SQLTEXT     @"TEXT"
#define SQLINTEGER  @"INTEGER"
#define SQLREAL     @"REAL"
#define SQLBLOB     @"BLOB"
#define SQLNULL     @"NULL"
#define PrimaryKey  @"primary key"

#define primaryId   @"pk"

@interface ZSDBManager ()

@property (nonatomic, strong) FMDatabaseQueue *dbQueue;

@end

@implementation ZSDBManager

+ (instancetype)share {
    static ZSDBManager *share = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        share = [[ZSDBManager alloc] init];
    });
    return share;
}

- (BOOL)isTableExist:(NSObject <ZSDBModel>*)model {
    __block BOOL res = NO;
    [self.dbQueue inDatabase:^(FMDatabase *db) {
        NSString *tableName = [model tableName];
        res = [db tableExists:tableName];
    }];
    return res;
}

- (NSArray *)getColumnsFrom:(NSObject <ZSDBModel>*)model {
    NSMutableArray *columns = [NSMutableArray array];
    [self.dbQueue inDatabase:^(FMDatabase *db) {
        NSString *tableName = NSStringFromClass(self.class);
        FMResultSet *resultSet = [db getTableSchema:tableName];
        while ([resultSet next]) {
            NSString *column = [resultSet stringForColumn:@"name"];
            [columns addObject:column];
        }
    }];
    return [columns copy];
}

+ (NSString *)getColumnAndTypeString:(NSArray <ZSDBPropertyModel *>*)models {
    NSMutableString *pars = [NSMutableString string];
    for (ZSDBPropertyModel *model in models) {
        if (![model.type isEqualToString:NSStringFromProtocol(@protocol(ZSDBModel))]) {
            if (model.mappingKey) {
                [pars appendString:model.mappingKey];
            } else {
                [pars appendString:model.originalKey];
            }
            [pars appendString:model.type];
            NSInteger count = [models indexOfObject:model];
            if (count != models.count - 1) {
                [pars appendString:@","];
            }
        }
    }
    return pars;
}

+ (BOOL)createTable:(NSObject <ZSDBModel>*)model
{
    __block BOOL res = YES;
    [ZSDBManager.share.dbQueue inTransaction:^(FMDatabase *db, BOOL *rollback) {
        NSString *tableName = [model tableName];
        NSArray <ZSDBPropertyModel *>* propertys = [[ZSDBManager share]getPropertys:model];
        NSString *columeAndType = [self.class getColumnAndTypeString:propertys];
        NSString *sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@(%@);",tableName,columeAndType];
        if (![db executeUpdate:sql]) {
            res = NO;
            *rollback = YES;
            return;
        };
        
        NSMutableArray *columns = [NSMutableArray array];
        FMResultSet *resultSet = [db getTableSchema:tableName];
        while ([resultSet next]) {
            NSString *column = [resultSet stringForColumn:@"name"];
            [columns addObject:column];
        }
        NSMutableArray *propertyStrings = @[].mutableCopy;
        for (ZSDBPropertyModel *model in propertys) {
            if (model.mappingKey) {
                [propertyStrings addObject:model.mappingKey];
            } else {
                [propertyStrings addObject:model.originalKey];
            }
        }
        
        NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)",columns];
        //过滤数组
        NSArray *resultArray = [propertyStrings filteredArrayUsingPredicate:filterPredicate];
        for (NSString *column in resultArray) {
            NSUInteger index = [propertyStrings indexOfObject:column];
            NSString *proType = [[propertys objectAtIndex:index] type];
            if (![proType isEqualToString:NSStringFromProtocol(@protocol(ZSDBModel))]) {
                NSString *fieldSql = [NSString stringWithFormat:@"%@ %@",column,proType];
                NSString *sql = [NSString stringWithFormat:@"ALTER TABLE %@ ADD COLUMN %@ ",[model tableName],fieldSql];
                if (![db executeUpdate:sql]) {
                    res = NO;
                    *rollback = YES;
                    return ;
                }
            }
        }
    }];
    
    return res;
}

//- (BOOL)saveOrUpdate:(NSObject <ZSDBModel>*)model {
//    NSString *primaryKey = [model primaryKey];
//    id primaryValue = [model valueForKey:primaryKey];
//    if ([primaryValue intValue] <= 0) {
//        return [self save];
//    }
//    return [self update];
//}

- (BOOL)save:(NSObject <ZSDBModel>*)model
{
    NSString *tableName = [model tableName];
    NSMutableString *keyString = [NSMutableString string];
    NSMutableString *valueString = [NSMutableString string];
    NSMutableArray *insertValues = [NSMutableArray  array];
    NSArray <ZSDBPropertyModel* >*columns = [self getPropertys:model];
    for (int i = 0; i < columns.count; i++) {
        NSString *columnName = columns[i].mappingKey ? columns[i].mappingKey:columns[i].originalKey;
        [keyString appendFormat:@"%@,", columnName];
        [valueString appendString:@"?,"];
        id value = [model valueForKey:columnName];
        if (!value) {
            value = @"";
        }
        [insertValues addObject:value];
    }
    
    [keyString deleteCharactersInRange:NSMakeRange(keyString.length - 1, 1)];
    [valueString deleteCharactersInRange:NSMakeRange(valueString.length - 1, 1)];
    __block BOOL res = NO;
    [self.dbQueue inDatabase:^(FMDatabase *db) {
        NSString *sql = [NSString stringWithFormat:@"INSERT INTO %@(%@) VALUES (%@);", tableName, keyString, valueString];
        res = [db executeUpdate:sql withArgumentsInArray:insertValues];
        NSLog(res?@"插入成功":@"插入失败");
    }];
    return res;
}

/** 批量保存用户对象 */
+ (BOOL)saveObjects:(NSArray <ZSDBModel>*)array
{
    __block BOOL res = YES;
    // 如果要支持事务
    [ZSDBManager.share.dbQueue inTransaction:^(FMDatabase *db, BOOL *rollback) {
        for (NSObject <ZSDBModel>*model in array) {
            NSString *tableName = [model tableName];
            NSMutableString *keyString = [NSMutableString string];
            NSMutableString *valueString = [NSMutableString string];
            NSMutableArray *insertValues = [NSMutableArray  array];
            NSArray <ZSDBPropertyModel* >*columns = [ZSDBManager.share getPropertys:model];
            for (int i = 0; i < columns.count; i++) {
                NSString *columnName = columns[i].mappingKey ? columns[i].mappingKey:columns[i].originalKey;
                [keyString appendFormat:@"%@,", columnName];
                [valueString appendString:@"?,"];
                id value = [model valueForKey:columnName];
                if (!value) {
                    value = @"";
                }
                [insertValues addObject:value];
            }
            [keyString deleteCharactersInRange:NSMakeRange(keyString.length - 1, 1)];
            [valueString deleteCharactersInRange:NSMakeRange(valueString.length - 1, 1)];
            
            NSString *sql = [NSString stringWithFormat:@"INSERT INTO %@(%@) VALUES (%@);", tableName, keyString, valueString];
            BOOL flag = [db executeUpdate:sql withArgumentsInArray:insertValues];
            NSLog(flag?@"插入成功":@"插入失败");
            if (!flag) {
                res = NO;
                *rollback = YES;
                return;
            }
        }
    }];
    return res;
}

/** 更新单个对象 */
- (BOOL)update:(NSObject <ZSDBModel>*)model
{
    __block BOOL res = NO;
    [self.dbQueue inDatabase:^(FMDatabase *db) {
        NSString *tableName = [model tableName];
        id primaryValue = [model valueForKey:[model primaryKey]];
        if (!primaryValue || primaryValue <= 0) {
            return ;
        }
        NSMutableString *keyString = [NSMutableString string];
        NSMutableArray *updateValues = [NSMutableArray  array];
        NSArray <ZSDBPropertyModel* >*columns = [ZSDBManager.share getPropertys:model];
        for (int i = 0; i < columns.count; i++) {
            NSString *columnName = columns[i].mappingKey ? columns[i].mappingKey:columns[i].originalKey;
            [keyString appendFormat:@" %@=?,", columnName];
            id value = [model valueForKey:columnName];
            if (!value) {
                value = @"";
            }
            [updateValues addObject:value];
        }
        
        //删除最后那个逗号
        [keyString deleteCharactersInRange:NSMakeRange(keyString.length - 1, 1)];
        NSString *sql = [NSString stringWithFormat:@"UPDATE %@ SET %@ WHERE %@ = ?;", tableName, keyString, primaryId];
        [updateValues addObject:primaryValue];
        res = [db executeUpdate:sql withArgumentsInArray:updateValues];
        NSLog(res?@"更新成功":@"更新失败");
    }];
    return res;
}

/** 批量更新用户对象*/
+ (BOOL)updateObjects:(NSArray <ZSDBModel>*)array
{
    __block BOOL res = YES;
    // 如果要支持事务
    [ZSDBManager.share.dbQueue inTransaction:^(FMDatabase *db, BOOL *rollback) {
        for (NSObject <ZSDBModel>*model in array) {
            id primaryValue = [model valueForKey:[model primaryKey]];
            if (!primaryValue || primaryValue <= 0) {
                res = NO;
                *rollback = YES;
                return;
            }
            
            NSMutableString *keyString = [NSMutableString string];
            NSMutableArray *updateValues = [NSMutableArray  array];
            NSArray <ZSDBPropertyModel* >*columns = [ZSDBManager.share getPropertys:model];
            for (int i = 0; i < columns.count; i++) {
                NSString *columnName = columns[i].mappingKey ? columns[i].mappingKey:columns[i].originalKey;
                [keyString appendFormat:@" %@=?,", columnName];
                id value = [model valueForKey:columnName];
                if (!value) {
                    value = @"";
                }
                [updateValues addObject:value];
            }
            
            //删除最后那个逗号
            [keyString deleteCharactersInRange:NSMakeRange(keyString.length - 1, 1)];
            NSString *sql = [NSString stringWithFormat:@"UPDATE %@ SET %@ WHERE %@=?;", [model tableName], keyString, [model primaryKey]];
            [updateValues addObject:primaryValue];
            BOOL flag = [db executeUpdate:sql withArgumentsInArray:updateValues];
            NSLog(flag?@"更新成功":@"更新失败");
            if (!flag) {
                res = NO;
                *rollback = YES;
                return;
            }
        }
    }];
    
    return res;
}

/** 删除单个对象 */
- (BOOL)deleteObject:(NSObject <ZSDBModel>*)model
{
    __block BOOL res = NO;
    [self.dbQueue inDatabase:^(FMDatabase *db) {
        NSString *tableName = [model tableName];
        id primaryValue = [model valueForKey:[model primaryKey]];
        if (!primaryValue || primaryValue <= 0) {
            return ;
        }
        NSString *sql = [NSString stringWithFormat:@"DELETE FROM %@ WHERE %@ = ?",tableName,[model primaryKey]];
        res = [db executeUpdate:sql withArgumentsInArray:@[primaryValue]];
        NSLog(res?@"删除成功":@"删除失败");
    }];
    return res;
}

/** 批量删除用户对象 */
+ (BOOL)deleteObjects:(NSArray <ZSDBModel>*)array
{
    __block BOOL res = YES;
    // 如果要支持事务
    [ZSDBManager.share.dbQueue inTransaction:^(FMDatabase *db, BOOL *rollback) {
        for (NSObject <ZSDBModel>*model in array) {
            NSString *tableName = [model tableName];
            id primaryValue = [model valueForKey:[model primaryKey]];
            if (!primaryValue || primaryValue <= 0) {
                return ;
            }
            
            NSString *sql = [NSString stringWithFormat:@"DELETE FROM %@ WHERE %@ = ?",tableName,[model primaryKey]];
            BOOL flag = [db executeUpdate:sql withArgumentsInArray:@[primaryValue]];
            NSLog(flag?@"删除成功":@"删除失败");
            if (!flag) {
                res = NO;
                *rollback = YES;
                return;
            }
        }
    }];
    return res;
}

/** 通过条件删除数据 */
+ (BOOL)deleteObjectsByCriteria:(NSString *)criteria model:(NSObject <ZSDBModel>*)model
{
    __block BOOL res = NO;
    [ZSDBManager.share.dbQueue inDatabase:^(FMDatabase *db) {
        NSString *tableName = [model tableName];
        NSString *sql = [NSString stringWithFormat:@"DELETE FROM %@ %@ ",tableName,criteria];
        res = [db executeUpdate:sql];
        NSLog(res?@"删除成功":@"删除失败");
    }];
    return res;
}

/** 通过条件删除 (多参数)--2 */
+ (BOOL)deleteObjectsWithModel:(NSObject <ZSDBModel>*)model Format:(NSString *)format, ...
{
    va_list ap;
    va_start(ap, format);
    NSString *criteria = [[NSString alloc] initWithFormat:format locale:[NSLocale currentLocale] arguments:ap];
    va_end(ap);
    
    return [self deleteObjectsByCriteria:criteria model:model];
}

/** 清空表 */
+ (BOOL)clearTable:(NSObject <ZSDBModel>*)model
{
    __block BOOL res = NO;
    [ZSDBManager.share.dbQueue inDatabase:^(FMDatabase *db) {
        NSString *tableName = [model tableName];
        NSString *sql = [NSString stringWithFormat:@"DELETE FROM %@",tableName];
        res = [db executeUpdate:sql];
        NSLog(res?@"清空成功":@"清空失败");
    }];
    return res;
}

- (NSArray *)queryAll:(NSObject <ZSDBModel>*)model {
    NSLog(@"ZSDBModel---%s",__func__);
    NSMutableArray *models = [NSMutableArray array];
    [self.dbQueue inDatabase:^(FMDatabase * _Nonnull db) {
        NSString *tableName = [model tableName];
        NSString *sql = [NSString stringWithFormat:@"SELECT * FROM %@",tableName];
        FMResultSet *resultSet = [db executeQuery:sql];
        while ([resultSet next]) {
            Class modelClass = [model class];
            NSObject <ZSDBModel>*queryModel = [[modelClass alloc] init];
            NSArray <ZSDBPropertyModel* >*columns = [self getPropertys:queryModel];
            for (NSInteger i = 0; i< columns.count; i++) {
                NSString *columnName = columns[i].mappingKey ? columns[i].mappingKey:columns[i].originalKey;
                NSString *columnType = columns[i].type;
                if ([columnType isEqualToString:SQLTEXT]) {
                    [queryModel setValue:[resultSet stringForColumn:columnName] forKey:columnName];
                } else if ([columnType isEqualToString:SQLBLOB]) {
                    [queryModel setValue:[resultSet dataForColumn:columnName] forKey:columnName];
                } else if ([columnName isEqualToString:NSStringFromProtocol(@protocol(ZSDBModel))]) {
                    // 单独查询这个表即可
                } else {
                    [queryModel setValue:[NSNumber numberWithLongLong:[resultSet longLongIntForColumn:columnName]] forKey:columnName];
                }
            }
            [models addObject:queryModel];
            FMDBRelease(queryModel);
        }
    }];
    return models;
}

/** 查找某条数据 */
+ (instancetype)findFirstByCriteria:(NSString *)criteria model:(NSObject <ZSDBModel> *)model
{
    NSArray *results = [ZSDBManager findByCriteria:criteria model:model];
    if (results.count < 1) {
        return nil;
    }
    
    return [results firstObject];
}

+ (instancetype)findByPK:(int)inPk model:(NSObject <ZSDBModel> *)model
{
    NSString *condition = [NSString stringWithFormat:@"WHERE %@=%d",primaryId,inPk];
    return [self findFirstByCriteria:condition model:model];
}

+ (NSArray *)findWithModel:(NSObject <ZSDBModel> *)model Format:(NSString *)format, ...
{
    va_list ap;
    va_start(ap, format);
    NSString *criteria = [[NSString alloc] initWithFormat:format locale:[NSLocale currentLocale] arguments:ap];
    va_end(ap);
    return [self findByCriteria:criteria model:model];
}

/** 通过条件查找数据 */
+ (NSArray *)findByCriteria:(NSString *)criteria model:(NSObject <ZSDBModel> *)model
{
    NSMutableArray *users = [NSMutableArray array];
    [ZSDBManager.share.dbQueue inDatabase:^(FMDatabase *db) {
        NSString *tableName = [model tableName];
        NSString *sql = [NSString stringWithFormat:@"SELECT * FROM %@ %@",tableName,criteria];
        FMResultSet *resultSet = [db executeQuery:sql];
        while ([resultSet next]) {
            NSObject <ZSDBModel> *result = [[[model class] alloc] init];
            NSArray <ZSDBPropertyModel* >*columns = [ZSDBManager.share getPropertys:result];
            for (int i=0; i< columns.count; i++) {
                NSString *columnName = columns[i].mappingKey ? columns[i].mappingKey:columns[i].originalKey;
                NSString *columnType = columns[i].type;
                if ([columnType isEqualToString:SQLTEXT]) {
                    [result setValue:[resultSet stringForColumn:columnName] forKey:columnName];
                } else if ([columnType isEqualToString:SQLBLOB]) {
                    [result setValue:[resultSet dataForColumn:columnName] forKey:columnName];
                } else if ([columnName isEqualToString:NSStringFromProtocol(@protocol(ZSDBModel))]) {
                    // 单独查询这个表即可
                } else {
                    [result setValue:[NSNumber numberWithLongLong:[resultSet longLongIntForColumn:columnName]] forKey:columnName];
                }
            }
            [users addObject:model];
            FMDBRelease(model);
        }
    }];
    
    return users;
}


- (NSArray <ZSDBPropertyModel *>*)getPropertys:(NSObject <ZSDBModel>*)model {
    NSString *foreignKey;
    NSString *primaryKey;
    NSDictionary <NSString *,NSString *> *mapping;
    NSArray <NSString *>*ignoredKeys;
    mapping = [model dbColumnMapping];
    primaryKey = [model primaryKey];
    foreignKey = [model foreignKey];
    ignoredKeys = [model ignoredKeys];
    NSMutableArray *propertys = @[].mutableCopy;
    unsigned int outCount, i;
    objc_property_t *properties = class_copyPropertyList([model class], &outCount);
    for (i = 0; i < outCount; i++) {
        objc_property_t property = properties[i];
        //获取属性名
        NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
        // 如果在忽略列表中,不处理
        if ([ignoredKeys containsObject:propertyName]) {
            continue;
        }
        id propertyValue = [model valueForKey:propertyName];
        ZSDBPropertyModel *propertyModel = [[ZSDBPropertyModel alloc] init];
        propertyModel.originalKey = propertyName;
        propertyModel.value = propertyValue;
        
        if (mapping[propertyName]) {
            propertyModel.mappingKey = mapping[propertyName];
        }
        if ([propertyName isEqualToString:primaryKey]) {
            propertyModel.isPrimaryKey = YES;
        } else {
            propertyModel.isPrimaryKey = NO;
        }
        
        if ([propertyValue conformsToProtocol:@protocol(ZSDBModel)]) {
            propertyModel.type = [NSString stringWithFormat:@"%@",@protocol(ZSDBModel)];
            propertyModel.value = [self getPropertys:propertyValue];
            continue;
        }
        //获取属性类型等参数
        NSString *propertyType = [NSString stringWithCString: property_getAttributes(property) encoding:NSUTF8StringEncoding];
        /*
         各种符号对应类型,部分类型在新版SDK中有所变化,如long 和long long
         c char         C unsigned char
         i int          I unsigned int
         l long         L unsigned long
         s short        S unsigned short
         d double       D unsigned double
         f float        F unsigned float
         q long long    Q unsigned long long
         B BOOL
         @ 对象类型 //指针 对象类型 如NSString 是@“NSString”
         
         
         64位下long 和long long 都是Tq
         SQLite 默认支持五种数据类型TEXT、INTEGER、REAL、BLOB、NULL
         因为在项目中用的类型不多,故只考虑了少数类型
         */
        if ([propertyType hasPrefix:@"T@\"NSString\""]) {
            propertyModel.type = SQLTEXT;
        } else if ([propertyType hasPrefix:@"T@\"NSData\""]) {
            propertyModel.type = SQLBLOB;
        } else if ([propertyType hasPrefix:@"Ti"]||[propertyType hasPrefix:@"TI"]||[propertyType hasPrefix:@"Ts"]||[propertyType hasPrefix:@"TS"]||[propertyType hasPrefix:@"TB"]||[propertyType hasPrefix:@"Tq"]||[propertyType hasPrefix:@"TQ"] || [propertyType hasPrefix:@"T@\"NSNumber\""]) {
            propertyModel.type = SQLINTEGER;
        } else {
            propertyModel.type = SQLREAL;
        }
    }
    return propertys;
}

+ (NSString *)dbPathWithDirectoryName:(NSString *)directoryName
{
    NSString *docsdir = [NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSFileManager *filemanage = [NSFileManager defaultManager];
    if (directoryName == nil || directoryName.length == 0) {
        docsdir = [docsdir stringByAppendingPathComponent:@"zhuishushenqi"];
    } else {
        docsdir = [docsdir stringByAppendingPathComponent:directoryName];
    }
    BOOL isDir;
    BOOL exit =[filemanage fileExistsAtPath:docsdir isDirectory:&isDir];
    if (!exit || !isDir) {
        [filemanage createDirectoryAtPath:docsdir withIntermediateDirectories:YES attributes:nil error:nil];
    }
    NSString *dbpath = [docsdir stringByAppendingPathComponent:@"zssq.sqlite"];
    return dbpath;
}

+ (NSString *)dbPath
{
    return [self dbPathWithDirectoryName:nil];
}

- (FMDatabaseQueue *)dbQueue
{
    if (_dbQueue == nil) {
        _dbQueue = [[FMDatabaseQueue alloc] initWithPath:[self.class dbPath]];
    }
    return _dbQueue;
}

@end


================================================
FILE: zhuishushenqi/App/ZSDBPropertyModel.h
================================================
//
//  ZSDBPropertyModel.h
//  zhuishushenqi
//
//  Created by yung on 2018/11/23.
//  Copyright © 2018年 QS. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface ZSDBPropertyModel : NSObject

@property (nonatomic, copy) NSString *originalKey;
@property (nonatomic, copy) NSString *mappingKey;
@property (nonatomic, strong) id value;
@property (nonatomic, copy) NSString *type;
@property (nonatomic, assign) BOOL isPrimaryKey;

@end



================================================
FILE: zhuishushenqi/App/ZSDBPropertyModel.m
================================================
//
//  ZSDBPropertyModel.m
//  zhuishushenqi
//
//  Created by yung on 2018/11/23.
//  Copyright © 2018年 QS. All rights reserved.
//

#import "ZSDBPropertyModel.h"

@implementation ZSDBPropertyModel

@end


================================================
FILE: zhuishushenqi/App/ZSDatabase.swift
================================================
//
//  ZSDatabase.swift
//  zhuishushenqi
//
//  Created by caony on 2018/11/6.
//  Copyright © 2018 QS. All rights reserved.
//

import UIKit
import SQLite

struct ZSDatabase {

    var db:Connection!
    
    init() {
        connectDatabase()
    }
    
    // 与数据库建立连接
    mutating func connectDatabase(filePath: String = "/Documents") -> Void {
        
        let sqlFilePath = NSHomeDirectory() + filePath + "/db.sqlite3"
        
        do { // 与数据库建立连接
            db = try Connection(sqlFilePath)
            print("与数据库建立连接 成功")
        } catch {
            print("与数据库建立连接 失败:\(error)")
        }
    }
    
    //MARK: - 书架信息记录需要基本信息表,阅读记录(record)
    let TABLE_LAMP = Table("bookshelf") // 表名称
    let TABLE_LAMP_ID = Expression<Int64>("lamp_id") // 列表项及项类型
    let TABLE_LAMP_BOOKNAME = Expression<String>("bookName")
    let TABLE_LAMP_BOOKID = Expression<String>("bookId")
    let TABLE_LAMP_COVER = Expression<String>("cover")
    let TABLE_LAMP_AUTHOR = Expression<String>("author")
    let TABLE_LAMP_LAST_CHAPTER = Expression<String>("lastChapter")
    let TABLE_LAMP_LAST_UPDATE_TIME = Expression<String>("lastUpdateTime")
    let TABLE_LAMP_LAST_HAVE_UPDATE = Expression<Bool>("haveUpdate")
    let TABLE_LAMP_LAST_UPDATED = Expression<String>("updated")
    let TABLE_LAMP_LAST_CHAPTER_COUNT = Expression<Int64>("lastChapterCount")
    let TABLE_LAMP_LAST_VISIT_TIME = Expression<Float64>("lastVisitTime")
    let TABLE_LAMP_REFERENCE_SOURCE = Expression<String>("referenceSource")
    let TABLE_LAMP_TOPIC_COUNT = Expression<Int64>("topicCount")
    
    func createBookshelf() {

        do {
            try db.run(TABLE_LAMP.create(temporary: false, ifNotExists: true, withoutRowid: false, block: { (table) in
                table.column(TABLE_LAMP_ID, primaryKey: .autoincrement) // 主键自加且不为空
                table.column(TABLE_LAMP_BOOKNAME)
                table.column(TABLE_LAMP_BOOKID, unique:true)
                table.column(TABLE_LAMP_COVER)
                table.column(TABLE_LAMP_AUTHOR)
                table.column(TABLE_LAMP_LAST_CHAPTER)
                table.column(TABLE_LAMP_LAST_UPDATE_TIME)
                table.column(TABLE_LAMP_LAST_HAVE_UPDATE)
                table.column(TABLE_LAMP_LAST_UPDATED)
                table.column(TABLE_LAMP_LAST_CHAPTER_COUNT)
                table.column(TABLE_LAMP_LAST_VISIT_TIME)
                table.column(TABLE_LAMP_REFERENCE_SOURCE)
                table.column(TABLE_LAMP_TOPIC_COUNT)
            }))
            print("创建表 bookshelf 成功")
        } catch {
            print("创建表 bookshelf 失败:\(error)")
        }
    }
    
    func queryBookshelf() ->[BookDetail] {
        var books:[BookDetail] = []
        for item in (try! db.prepare(TABLE_LAMP)) {
            let book = BookDetail()
            let updateInfo = BookShelf()
            updateInfo.lastChapter = item[TABLE_LAMP_LAST_CHAPTER]
            updateInfo.updated = item[TABLE_LAMP_LAST_UPDATE_TIME]
            book.title = item[TABLE_LAMP_BOOKNAME]
            book._id = item[TABLE_LAMP_BOOKID]
            book.cover = item[TABLE_LAMP_COVER]
            book.author = item[TABLE_LAMP_AUTHOR]
            book.updated = item[TABLE_LAMP_LAST_UPDATE_TIME]
            book.isUpdated = item[TABLE_LAMP_LAST_HAVE_UPDATE]
            book.updateInfo = updateInfo
            books.append(book)
        }
        
        return books
    }
    
    func updateInfo(updateInfo:UpdateInfo) {
        let item = TABLE_LAMP.filter(TABLE_LAMP_BOOKID == (updateInfo._id ?? ""))
        
        do {
            if try db.run(item.update(TABLE_LAMP_LAST_CHAPTER <- (updateInfo.lastChapter ?? ""), TABLE_LAMP_LAST_UPDATE_TIME <- (updateInfo.updated ?? ""))) > 0 {
                print("书籍\(String(describing: updateInfo._id)) 更新成功")
            } else {
                print("书籍\(String(describing: updateInfo._id)) 更新失败")
            }
        } catch {
            print("书籍\(String(describing: updateInfo._id)) 更新失败")
        }
    }
    
    func insertBookshelf(book:BookDetail) ->Bool {
//        2016-08-22T12:05:34.501Z
        var result = false
        let timeInterval = Date().timeIntervalSince1970
        let insert = TABLE_LAMP.insert(TABLE_LAMP_BOOKNAME <- book.title,TABLE_LAMP_BOOKID <- book._id, TABLE_LAMP_COVER <- book.cover, TABLE_LAMP_AUTHOR <- book.author, TABLE_LAMP_LAST_CHAPTER <- (book.updateInfo?.lastChapter ?? ""), TABLE_LAMP_LAST_UPDATE_TIME <- (book.updateInfo?.updated ?? ""), TABLE_LAMP_LAST_HAVE_UPDATE <- book.isUpdated,TABLE_LAMP_LAST_UPDATED <- (book.updateInfo?.updated ?? ""),TABLE_LAMP_LAST_CHAPTER_COUNT <- (Int64(book.chaptersInfo?.count ?? 0)),TABLE_LAMP_LAST_VISIT_TIME <- timeInterval,TABLE_LAMP_REFERENCE_SOURCE <- book.record?.source?.name ?? "",TABLE_LAMP_TOPIC_COUNT <- 0)
        do {
            let rowID = try db.run(insert)
            print("插入数据成功:\(rowID)")
            result = true
        } catch {
            print("插入数据失败\(error)")
        }
        return result
    }

}


================================================
FILE: zhuishushenqi/App/ZSEncryptorAESUtils.swift
================================================
//
//  ZSEncryptorAESUtils.swift
//  zhuishushenqi
//
//  Created by yung on 2018/11/9.
//  Copyright © 2018年 QS. All rights reserved.
//

import UIKit

class ZSEncryptorAESUtils {
    
    func getDecryptedStr(key:String, cipherText:String) {
        let keyData = Data(base64Encoded: key, options: Data.Base64DecodingOptions(rawValue: 0))
        let data = Data(base64Encoded: cipherText, options: Data.Base64DecodingOptions(rawValue: 0))
        
        
    }

}


================================================
FILE: zhuishushenqi/App/ZSJSON.swift
================================================
//
//  ZSJSON.swift
//  zhuishushenqi
//
//  Created by caony on 2018/11/20.
//  Copyright © 2018 QS. All rights reserved.
//

import UIKit

protocol ZSJSON {
    func toJSONModel() -> Any?
}

extension ZSJSON {
    func toJSONModel() -> Any? {
        let mirror = Mirror(reflecting: self)
        if mirror.children.count > 0 {
            var result : [String:Any] = [:]
            for children in mirror.children {
                let propertyNameString = children.label!
                let value = children.value
                if let jsonValue = value as? ZSJSON {
                    result[propertyNameString] = jsonValue.toJSONModel()
                }
            }
            return result
        }
        return self
    }
}

extension Optional : ZSJSON {
    func toJSONModel() -> Any? {
        if let x = self {
            if let value = x as? ZSJSON {
                return value.toJSONModel()
            }
        }
        return nil
    }
}

extension String : ZSJSON {}
extension Int : ZSJSON {}
extension Bool : ZSJSON {}
extension CGFloat : ZSJSON {}
extension Float : ZSJSON {}
extension Double : ZSJSON {}
extension Dictionary : ZSJSON {
    func encode(obj:Any) -> Any? {
        let mirror = Mirror(reflecting: obj)
        
        return nil
    }
}
extension Array : ZSJSON {}


================================================
FILE: zhuishushenqi/App/ZSLogin.swift
================================================
//
//  ZSLogin.swift
//  zhuishushenqi
//
//  Created by yung on 2018/10/20.
//  Copyright © 2018年 QS. All rights reserved.
//

import UIKit
import ZSAPI

class ZSLogin {
    
    var token:String = ""
    
    var lastLoginType = ZSThirdLoginStorage.share.lastLoginType
    
    var mobileLogin:Bool = false
    
    // 登录用户的关注与被关注者
    var followings:[ZSFollowings]?
    var followers:[ZSFollowings]?
    
    static let share = ZSLogin()
    private init() {
        if let token =  ZSThirdLogin.share.userInfo?.token {
            self.token = token
        } else if let token = ZSMobileLogin.share.userInfo?.token {
            self.mobileLogin = true
            self.token = token
        }
        if self.token.count > 0 {
            fetchFollowings()
            fetchFollowers()
        }
    }
    
    func hasLogin() ->Bool {
        if token != "" {
            return true
        }
        return false
    }
    
    func userInfo() ->ZSQQLoginResponse? {
        if let userInfo = ZSThirdLogin.share.userInfo {
            return userInfo
        } else if let userInfo = ZSMobileLogin.share.userInfo {
            return userInfo
        }
        return nil
    }
    
    func logout() {
        self.token = ""
        ZSThirdLoginStorage.share.resetLocalUserInfo()
        ZSThirdLogin.share.userInfo = nil
        ZSThirdLogin.share.wxTokenResp = nil
    }

    func login() {
        
    }
    
    
    func fetchFollowings() {
        let api = ZSAPI.userFollowings("\(self.userInfo()?.user?._id ?? "")")
        zs_get(api.path) { (json) in
            guard let followings = json?["followings"] as? [Any] else {
                return
            }
            if let followingModels = [ZSFollowings].deserialize(from: followings) as? [ZSFollowings] {
                self.followings = followingModels
            }
        }
    }
    
    func fetchFollowers() {
        let api = ZSAPI.userFollowers("\(self.userInfo()?.user?._id ?? "")")
        zs_get(api.path) { (json) in
            guard let followers = json?["followers"] as? [Any] else {
                return
            }
            if let followingModels = [ZSFollowings].deserialize(from: followers) as? [ZSFollowings] {
                self.followers = followingModels
            }
        }
    }
}


================================================
FILE: zhuishushenqi/App/ZSMobileLogin.swift
================================================
//
//  ZSMobileLogin.swift
//  zhuishushenqi
//
//  Created by yung on 2018/10/24.
//  Copyright © 2018年 QS. All rights reserved.
//

import UIKit

class ZSMobileLogin {
    
    let tencentCaptChaAppID = "2061491951"
    
    var mobile:String = ""
    
    var userInfo:ZSQQLoginResponse?
    
    let MobileLoginQQUserFilePathKey = "MobileLoginQQUserFilePathKey"
    let MobileLoginLastLoginTypeKey = "MobileLoginLastLoginTypeKey"
    
    static let share = ZSMobileLogin()
    private init() {
        let user = self.localUserInfo()
        self.userInfo = user
    }
    
    func startVerifyHTML() ->String {
        let sdkOpts = ["sdkOpts":["height":140,"width":140]]
        let data = try! JSONSerialization.data(withJSONObject: sdkOpts, options: .prettyPrinted)
        if let string = String(data: data, encoding: .utf8) {
            if let percentString = string.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) {
                let radom = self.getRandomSeq()
                let jsString = "<!DOCTYPE html> <html lang=\"zh_cn\"> <head> <title></title> <meta charset=\"UTF-8\"> <meta name=\"renderer\" content=\"webkit\"> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no\"> <meta name=\"format-detection\" content=\"address=no; email=no\"> <script src=\"https://ssl.captcha.qq.com/TCaptcha.js?v=\(radom)\" type=\"text/javascript\"></script> </head> <body> <div style=\"display: none\"><iframe id=\"tcaptcha_callback_iframe\"></iframe></div> <script type=\"text/javascript\"> (function(){ function getSDKJsonString(json) { var jsonString = encodeURIComponent(JSON.stringify(json)); return jsonString; }; window.SDKTCaptchaVerifyCallback = function (retJson) { if (retJson){ SDKTCaptchaCommonCallback(\"tcwebscheme://callback?retJson=\"+getSDKJsonString(retJson)); } }; window.SDKTCaptchaReadyCallback = function (retJson) { if (retJson && retJson.sdkView && retJson.sdkView.width && retJson.sdkView.height && parseInt(retJson.sdkView.width) >0 && parseInt(retJson.sdkView.height) >0 ){ SDKTCaptchaCommonCallback(\"tcwebscheme://readyCallback?retJson=\"+getSDKJsonString(retJson)); } }; window.onerror = function (msg, url, line, col, error) { if (window.TencentCaptcha == null) { SDKTCaptchaCommonCallback(\"tcwebscheme://jserrorCallback?retJson=\"+encodeURIComponent(msg)); } }; var SDKTCaptchaCommonCallback= function (url) { document.getElementById(\"tcaptcha_callback_iframe\").src = url; }; var sdkOptions = JSON.parse(decodeURIComponent(\"\(percentString)\")); sdkOptions[\"ready\"] = window.SDKTCaptchaReadyCallback; window.onload = function () { new TencentCaptcha(\"\(ZSMobileLogin.share.tencentCaptChaAppID)\", SDKTCaptchaVerifyCallback, sdkOptions).show(); }; })(); </script></body></html>"
                return jsString
            }
            
        }
        return ""
    }
    
    func fetchSMSCode() {
        
    }
    
    func getRandomSeq() ->String {
        
        let v2 = arc4random()
        var v3:CLongLong = 0
        if v2 != 0 {
            v3 = CLongLong(v2)
        } else {
            v3 = 1
        }
        let v4 = Date()
        let v6 = v4.timeIntervalSince1970
        let v7 = v6 * 1000.0
        let result = String(format: "%llu_%ld", v7,v3)
        return result
    }
    
    func saveUserInfo(userInfo:ZSQQLoginResponse) {
        let filePath = "\(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])/\(MobileLoginQQUserFilePathKey.md5())"
        NSKeyedArchiver.archiveRootObject(userInfo, toFile: filePath)
        UserDefaults.standard.setValue("mobile", forKey: MobileLoginLastLoginTypeKey.md5())
        UserDefaults.standard.synchronize()
    }
    
    func localUserInfo() -> ZSQQLoginResponse? {
        let filePath = "\(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])/\(MobileLoginQQUserFilePathKey.md5())"
        let user = NSKeyedUnarchiver.unarchiveObject(withFile: filePath) as? ZSQQLoginResponse
        return user
    }
    
    func resetLocalUserInfo() {
        let filePath = "\(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])/\(MobileLoginQQUserFilePathKey.md5())"
        try? FileManager.default.removeItem(atPath: filePath)
    }
    
}


================================================
FILE: zhuishushenqi/App/ZSThirdLogin.swift
================================================
//
//  ZSThirdLogin.swift
//  zhuishushenqi
//
//  Created by yung on 2018/10/19.
//  Copyright © 2018年 QS. All rights reserved.
//

import UIKit
import HandyJSON
import AdSupport
import ZSAPI

typealias ZSThirdLoginResultHandler = (_ success:Bool)->Void

enum ThirdLoginType:String {
    case None = "None"
    case WX = "WX"
    case QQ = "QQ"
    case WB = "WB"
    case XM = "XM"
}

typealias ZSLoginSuccess = ()->Void

class ZSThirdLogin: NSObject {
    
    var tencentOAuth:TencentOAuth!
    
    var webService:ZSLoginService = ZSLoginService()
    
    var userInfo:ZSQQLoginResponse?
    
    var wxTokenResp:ZSWXAccessTokenResp?
    
    var wbAuthorizeResp:WBAuthorizeResponse?
    
    var successHandler:ZSLoginSuccess?
    
    var loginResultHandler:ZSThirdLoginResultHandler?
    
    var permissions = ["get_user_info","get_simple_userinfo","add_t"]
    
    let wxAuthScope = "snsapi_userinfo,snsapi_friend,snsapi_contact,snsapi_message"
    
    static let QQAppID = "100497199"
    
    static let WXAppID = "wxaf0fdeed6872dfcf"
    
    static let WXAppSecret = "0464c67bdd87c303c5bfdc5761beb329"
    
    static let WBAppID = "2023668704"
    
    static let WBAppSecret = "26efa7a6a6bed540092c9535bda75db9"
    
    static let WBRedirectURI = "http://ushaqi.com"
    
    static let share = ZSThirdLogin()
    private override init() {
        super.init()
        tencentOAuth = TencentOAuth(appId: ZSThirdLogin.QQAppID, andDelegate: self)
        let (user,token) = ZSThirdLoginStorage.share.localUserInfo()
        self.userInfo = user
        self.wxTokenResp = token
    }
    
    func QQAuth() {
        tencentOAuth.authorize(permissions, inSafari: false)
    }
    
    func WXAuth() {
        WXApi.registerApp(ZSThirdLogin.WXAppID)
        WXApiRequestHandler.share.sendWXAuth(scope: wxAuthScope, state: "YouShaQi")
    }
    
    func WBAuth() {
        let request = WBAuthorizeRequest()
        request.redirectURI = ZSThirdLogin.WBRedirectURI
        request.scope = "all"
        WeiboSDK.send(request)
    }
    
    func login(type:ThirdLoginType) {
        switch type {
        case .QQ:
            // QQ登录
            QQLogin()
            break
        case .WX:
            // 微信登录
            WXLogin()
            break
        case .WB:
            // 微博登录
            WBLogin()
            break
        default:
            break
        }
    }
    
    func refreshWXToken() {
//        https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
        // 一般第一次获取到access_token后直接登录追书d,获取token,后面基本不需要access_token了
        
    }
    
    private func QQLogin() {
        let idfa = ASIdentifierManager.shared().advertisingIdentifier.uuidString
        let platform_code = "QQ"
        let platform_token = tencentOAuth.accessToken ?? ""
        let platform_uid = tencentOAuth.openId ?? ""
        let version = "2"
        KeyWindow?.showProgress()
        let loginApi:ZSAPI = ZSAPI.login(idfa: idfa, platform_code: platform_code, platform_token: platform_token, platform_uid: platform_uid, version: version ,tag: "")
        webService.QQLogin(url: loginApi.path, parameter: loginApi.parameters) { (json) in
            KeyWindow?.hideProgress()
            if let user = json {
                // 登录成功
                KeyWindow?.showTip(tip: "登录成功")
                self.userInfo = user
                ZSLogin.share.token = self.userInfo?.token ?? ""
                ZSThirdLoginStorage.share.saveUserInfo(userInfo: user, type: .QQ)
                self.successHandler?()
                self.loginResultHandler?(true)

            } else {
                KeyWindow?.showTip(tip: "登录失败")
                self.userInfo = nil
                self.loginResultHandler?(false)
            }
        }
    }
    
    private func WXLogin() {
        if let resp = self.wxTokenResp {
            let idfa = ASIdentifierManager.shared().advertisingIdentifier.uuidString
            let platform_code = "WeixinNew"
            let platform_token = resp.access_token
            let platform_uid = resp.openid
            let version = "2"
            let tag = "zssq"
            KeyWindow?.showProgress()
            let loginApi = ZSAPI.login(idfa: idfa, platform_code: platform_code, platform_token: platform_token, platform_uid: platform_uid, version: version, tag: tag)
            webService.WXLogin(url: loginApi.path, parameter: loginApi.parameters) { (json) in
                KeyWindow?.hideProgress()
                if let user = json {
                    // 登录成功
                    KeyWindow?.showTip(tip: "登录成功")
                    self.userInfo = user
                    ZSLogin.share.token = self.userInfo?.token ?? ""
                    ZSThirdLoginStorage.share.saveUserInfo(userInfo: user, type: .WX)
                    self.successHandler?()
                    self.loginResultHandler?(true)
                } else {
                    KeyWindow?.showTip(tip: "登录失败")
                    self.userInfo = nil
                    self.loginResultHandler?(false)
                }
            }
        }
    }
    
    private func WBLogin() {
        if let resp = self.wbAuthorizeResp {
            let idfa = ASIdentifierManager.shared().advertisingIdentifier.uuidString
            let platform_code = "SinaWeibo"
            let platform_token = resp.accessToken ?? ""
            let platform_uid = resp.userID ?? ""
            let version = "2"
            let tag = "zssq"
            KeyWindow?.showProgress()
            let loginApi = ZSAPI.login(idfa: idfa, platform_code: platform_code, platform_token: platform_token, platform_uid: platform_uid, version: version, tag: tag)
            webService.WBLogin(url: loginApi.path, parameter: loginApi.parameters) { (json) in
                KeyWindow?.hideProgress()
                if let user = json, let _ = json?.token  {
                    // 登录成功
                    KeyWindow?.showTip(tip: "登录成功")
                    self.userInfo = user
                    ZSLogin.share.token = self.userInfo?.token ?? ""
                    ZSThirdLoginStorage.share.saveUserInfo(userInfo: user, type: .WX)
                    self.successHandler?()
                    self.loginResultHandler?(true)
                } else {
                    KeyWindow?.showTip(tip: "登录失败")
                    self.userInfo = nil
                    self.loginResultHandler?(false)
                }
            }
        }
    }
}

extension ZSThirdLogin:WeiboSDKDelegate {
    func didReceiveWeiboRequest(_ request: WBBaseRequest!) {
        
    }
    
    func didReceiveWeiboResponse(_ response: WBBaseResponse!) {
        if let authorize = response as? WBAuthorizeResponse {
            self.wbAuthorizeResp = authorize
            login(type: .WB)
        }
    }
    
}


extension ZSThirdLogin:QQApiInterfaceDelegate {
    func onReq(_ req: QQBaseReq!) {
        
    }
    
    func onResp(_ resp: QQBaseResp!) {
        
    }
    
    func isOnlineResponse(_ response: [AnyHashable : Any]!) {
        
    }
    
}

extension ZSThirdLogin:TencentSessionDelegate {
    func tencentDidLogin() {
        self.login(type: .QQ)
    }
    
    func tencentDidNotLogin(_ cancelled: Bool) {
        if cancelled {
            KeyWindow?.showTip(tip: "用户取消了操作")
        }
    }
    
    func tencentDidNotNetWork() {
        KeyWindow?.showTip(tip: "网络连接失败")
    }
}

class WXApiRequestHandler: NSObject,WXApiDelegate {
    
    static let share = WXApiRequestHandler()
    private override init() {}
    
    @discardableResult
    func sendWXAuthRequestScope(scope:String, state:String, inViewController:UIViewController) -> Bool {
        let req = SendAuthReq()
        req.scope = scope
        req.state = state
        return WXApi.sendAuthReq(req, viewController: inViewController, delegate: self)
    }
    
    @discardableResult
    func sendWXAuth(scope:String,state:String) -> Bool {
        let req = SendAuthReq()
        req.scope = scope
        req.state = state
        return WXApi.send(req)
    }
    
    func onReq(_ req: BaseReq!) {
        
    }
    
    func onResp(_ resp: BaseResp!) {
        if let res = resp as? SendAuthResp {
            print(res)
            if res.errCode == 0 {
                // 获取code成功
                let code = res.code
                let getAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=\(ZSThirdLogin.WXAppID)&secret=\(ZSThirdLogin.WXAppSecret)&code=\(code ?? "")&grant_type=authorization_code"
                zs_get(getAccessTokenUrl, parameters: nil) { (json) in
                    let tokenResp = ZSWXAccessTokenResp.deserialize(from: json)
                    ZSThirdLoginStorage.share.saveWXToken(wxTokenResp: tokenResp)
                    ZSThirdLogin.share.login(type: .WX)
                }
            } else {
                KeyWindow?.showTip(tip: "请求Code出错")
            }
        }
    }
    
}

class ZSThirdLoginStorage: NSObject {
    
    var rawData:[String:Any] = [:]
    var works:[Any] = []
    var educations:[Any] = []
    var level:CLongLong = 0
    var regAt:Double = 0
    var shareCount:CLongLong = 0
    var friendCount:CLongLong = 0
    var followerCount:CLongLong = 0
    var birthday:Date?
    var verifyReason:String = ""
    var verifyType:CLongLong = 0
    var aboutMe:String = ""
    var url:String = ""
    var gender:CLongLong = 0
    var icon:String = ""
    var nickname:String = ""
    var uid:String = ""

    var credential:SSDKCredential?
    var data:SSDKQQData?
    var platformType:CLongLong = 0
    
    // 只作为上次登录方式的记录,如果该登录方式的数据不存在,则应该将该值置为None
    var lastLoginType:ThirdLoginType = .None
    
    let ThirdLoginQQUserFilePathKey = "ThirdLoginQQUserFilePathKey"
    let ThirdLoginWXTokenFilePathKey = "ThirdLoginWXTokenFilePathKey"
    let ThirdLoginLastLoginTypeKey = "ThirdLoginLastLoginTypeKey"
    
    static let share = ZSThirdLoginStorage()
    private override init() {
        super.init()
        
        let lastTypeObj = UserDefaults.standard.string(forKey: ThirdLoginLastLoginTypeKey.md5())
        self.lastLoginType = ThirdLoginType(rawValue: lastTypeObj ?? "") ?? .None
    }
    
    func canHandle(pasteData:[String:Any]) -> Bool {
        if pasteData.allKeys().count > 0 {
            if pasteData.allKeys()[0].contains("tencent") {
                return true
            }
        }
        return false
    }
    
    func handle(pasteData:[String:Data]) {
        for (key,value) in pasteData {
            if key.contains("tencent") {
                if let obj = NSKeyedUnarchiver.unarchiveObject(with: value) as? [String:Any] {
                    self.rawData = obj
                    self.data = SSDKQQData.deserialize(from: obj)
                    print(self.rawData)
                }
            }
        }
        
    }
    
    func saveWXToken(wxTokenResp:ZSWXAccessTokenResp?) {
        if let resp = wxTokenResp {
            let TokenFilePath = "\(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])/\(ThirdLoginWXTokenFilePathKey.md5())"
            NSKeyedArchiver.archiveRootObject(resp, toFile: TokenFilePath)
        }
    }
    
    func localUserInfo() -> (ZSQQLoginResponse?,ZSWXAccessTokenResp?) {
        let filePath = "\(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])/\(ThirdLoginQQUserFilePathKey.md5())"
        let TokenFilePath = "\(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])/\(ThirdLoginWXTokenFilePathKey.md5())"
        let user = NSKeyedUnarchiver.unarchiveObject(withFile: filePath) as? ZSQQLoginResponse
        let token = NSKeyedUnarchiver.unarchiveObject(withFile: TokenFilePath) as? ZSWXAccessTokenResp
        return (user,token)
    }
    
    func resetLocalUserInfo() {
        let filePath = "\(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])/\(ThirdLoginQQUserFilePathKey.md5())"
        let TokenFilePath = "\(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])/\(ThirdLoginWXTokenFilePathKey.md5())"
        try? FileManager.default.removeItem(atPath: filePath)
        try? FileManager.default.removeItem(atPath: TokenFilePath)
    }
    
    func saveUserInfo(userInfo:ZSQQLoginResponse, type:ThirdLoginType) {
        let filePath = "\(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])/\(ThirdLoginQQUserFilePathKey.md5())"
        NSKeyedArchiver.archiveRootObject(userInfo, toFile: filePath)
        
        switch type {
        case .QQ:
            UserDefaults.standard.setValue(ThirdLoginType.QQ.rawValue, forKey: ThirdLoginLastLoginTypeKey.md5())
            UserDefaults.standard.synchronize()
            break
        case .WX:
            // 要自己保存微信登录成功拿到的token信息
            saveWXToken(wxTokenResp: ZSThirdLogin.share.wxTokenResp)
            UserDefaults.standard.setValue(ThirdLoginType.WX.rawValue, forKey: ThirdLoginLastLoginTypeKey.md5())
            UserDefaults.standard.synchronize()
            break
        case .WB:
            
            break
        
        case .None:
            break
        default:
            break
        }
    }
}

class SSDKCredential {
    var expirationDate:Date?
    var openId:String = ""
    var available:Bool = false
    var rawData:[String:Any] = [:]
    var expired:String = ""
    var secret:String = ""
    var token:String = ""
    var uid:String = ""

}

class SSDKQQData:HandyJSON {
    var pf:String = ""
    var pfkey:String = ""
    var access_token:String = ""
    var passDataResp:[Any] = []
    var pay_token:String = ""
    var msg:String = ""
    var user_cancelled:Bool = false
    var ret:Int = 0
    var encrytoken:String = ""
    var expires_in:TimeInterval = 7776000
    
    required init() {}
}

class ZSWXAccessTokenResp: HandyJSON, NSCoding{
    var openid:String = ""
    var scope:String = ""
    var expires_in:Float = 0
    var access_token:String = ""
    var unionid:String = ""
    var refresh_token:String = ""
    
    required init() {}
    
    required init?(coder aDecoder: NSCoder) {
        aDecoder.decodeObject(forKey: "openid")
        aDecoder.decodeObject(forKey: "scope")
        aDecoder.decodeObject(forKey: "expires_in")
        aDecoder.decodeObject(forKey: "access_token")
        aDecoder.decodeObject(forKey: "unionid")
        aDecoder.decodeObject(forKey: "refresh_token")
    }
    
    func encode(with aCoder: NSCoder) {
        aCoder.encode(self.openid, forKey: "openid")
        aCoder.encode(self.scope, forKey: "scope")
        aCoder.encode(self.expires_in, forKey: "expires_in")
        aCoder.encode(self.access_token, forKey: "access_token")
        aCoder.encode(self.unionid, forKey: "unionid")
        aCoder.encode(self.refresh_token, forKey: "refresh_token")
    }

}



================================================
FILE: zhuishushenqi/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "iphone",
      "size" : "20x20",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "20x20",
      "scale" : "3x"
    },
    {
      "size" : "29x29",
      "idiom" : "iphone",
      "filename" : "AppIcon29x29@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "29x29",
      "idiom" : "iphone",
      "filename" : "AppIcon29x29@3x.png",
      "scale" : "3x"
    },
    {
      "size" : "40x40",
      "idiom" : "iphone",
      "filename" : "AppIcon40x40@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "40x40",
      "idiom" : "iphone",
      "filename" : "AppIcon40x40@3x.png",
      "scale" : "3x"
    },
    {
      "size" : "60x60",
      "idiom" : "iphone",
      "filename" : "AppIcon60x60@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "60x60",
      "idiom" : "iphone",
      "filename" : "AppIcon60x60@3x.png",
      "scale" : "3x"
    },
    {
      "idiom" : "ipad",
      "size" : "20x20",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "20x20",
      "scale" : "2x"
    },
    {
      "size" : "29x29",
      "idiom" : "ipad",
      "filename" : "AppIcon29x29~ipad.png",
      "scale" : "1x"
    },
    {
      "size" : "29x29",
      "idiom" : "ipad",
      "filename" : "AppIcon29x29@2x~ipad.png",
      "scale" : "2x"
    },
    {
      "size" : "40x40",
      "idiom" : "ipad",
      "filename" : "AppIcon40x40~ipad.png",
      "scale" : "1x"
    },
    {
      "size" : "40x40",
      "idiom" : "ipad",
      "filename" : "AppIcon40x40@2x~ipad.png",
      "scale" : "2x"
    },
    {
      "size" : "76x76",
      "idiom" : "ipad",
      "filename" : "AppIcon76x76~ipad.png",
      "scale" : "1x"
    },
    {
      "size" : "76x76",
      "idiom" : "ipad",
      "filename" : "AppIcon76x76@2x~ipad.png",
      "scale" : "2x"
    },
    {
      "size" : "83.5x83.5",
      "idiom" : "ipad",
      "filename" : "AppIcon83.5x83.5@2x~ipad.png",
      "scale" : "2x"
    },
    {
      "size" : "1024x1024",
      "idiom" : "ios-marketing",
      "filename" : "AppIcon1024x1024.png",
      "scale" : "1x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/Contents.json
================================================
{
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/Default-640x1136.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "Default-640x1136@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/LaunchImage.launchimage/Contents.json
================================================
{
  "images" : [
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "2688h",
      "filename" : "Brand Assets-800-Portrait-812h@3x-2.png",
      "minimum-system-version" : "12.0",
      "orientation" : "portrait",
      "scale" : "3x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "1792h",
      "filename" : "Brand Assets-800-Portrait-812h@3x-1.png",
      "minimum-system-version" : "12.0",
      "orientation" : "portrait",
      "scale" : "2x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "2436h",
      "filename" : "Brand Assets-800-Portrait-812h@3x.png",
      "minimum-system-version" : "11.0",
      "orientation" : "portrait",
      "scale" : "3x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "736h",
      "filename" : "Brand Assets-800-Portrait-736h@3x.png",
      "minimum-system-version" : "8.0",
      "orientation" : "portrait",
      "scale" : "3x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "667h",
      "filename" : "Brand Assets-800-667h@2x.png",
      "minimum-system-version" : "8.0",
      "orientation" : "portrait",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "iphone",
      "filename" : "Brand Assets-700@2x.png",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "scale" : "2x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "retina4",
      "filename" : "Default-640x1136@2x.png",
      "minimum-system-version" : "7.0",
      "orientation" : "portrait",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "filename" : "Brand Assets-700-Portrait~ipad.png",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "scale" : "1x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "filename" : "Brand Assets-700-Portrait@2x~ipad.png",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "scale" : "2x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/Contents.json
================================================
{
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/QDReaderSetting_brightnessDown_24x24_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "QDReaderSetting_brightnessDown_24x24_@1x.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "QDReaderSetting_brightnessDown_24x24_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "QDReaderSetting_brightnessDown_24x24_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/QDReaderSetting_brightnessUp_24x24_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "QDReaderSetting_brightnessUp_24x24_@1x.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "QDReaderSetting_brightnessUp_24x24_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "QDReaderSetting_brightnessUp_24x24_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/bbs_icon_like02_26_26.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "bbs_icon_like02_26_26@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "bbs_icon_like02_26_26@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/bbs_icon_message_20_20.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "bbs_icon_message_20_20@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "bbs_icon_message_20_20@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/bbs_icon_message_34_34_34x34_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "bbs_icon_message_34_34_34x34_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "bbs_icon_message_34_34_34x34_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/bbs_icon_more_big_26_26.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "bbs_icon_more_big_26_26@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "bbs_icon_more_big_26_26@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/bbs_icon_personal_34_34_34x34_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "bbs_icon_personal_34_34_34x34_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "bbs_icon_personal_34_34_34x34_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/bbs_icon_share_26_26_26x26_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "bbs_icon_share_26_26_26x26_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "bbs_icon_share_26_26_26x26_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/bbs_icon_topic_26_26_26x26_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "bbs_icon_topic_26_26_26x26_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "bbs_icon_topic_26_26_26x26_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/blackboard_bg_375x667_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "blackboard_bg_375x667_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "blackboard_bg_375x667_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/bookshelf_bg_logo_80_19_80x19_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookshelf_bg_logo_80_19_80x19_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookshelf_bg_logo_80_19_80x19_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/bookshelf_icon_gift_34_34.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookshelf_icon_gift_34_34@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookshelf_icon_gift_34_34@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/bookshelf_icon_gift_new_34_34.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookshelf_icon_gift_new_34_34@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookshelf_icon_gift_new_34_34@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/bookshelf_icon_history_34_34.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookshelf_icon_history_34_34@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookshelf_icon_history_34_34@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/bookshelf_icon_more_10_10_10x10_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookshelf_icon_more_10_10_10x10_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookshelf_icon_more_10_10_10x10_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/bookshelf_icon_more_34_34.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookshelf_icon_more_34_34@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookshelf_icon_more_34_34@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/bookshelf_icon_more_wifi_24_24.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookshelf_icon_more_wifi_24_24@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookshelf_icon_more_wifi_24_24@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/bookshelf_icon_seach_34_34.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookshelf_icon_seach_34_34@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookshelf_icon_seach_34_34@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/bookshelf_top_bg_one_line.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookshelf_top_bg_one_line@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookshelf_top_bg_one_line@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/bookshelf_top_bg_two_line.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookshelf_top_bg_two_line@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookshelf_top_bg_two_line@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/bookstore_bg.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookstore_bg@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookstore_bg@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/bookstore_def_classify_20_20_20x20_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookstore_def_classify_20_20_20x20_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "bookstore_def_classify_20_20_20x20_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/chapter_review_send_tip_24x24_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "chapter_review_send_tip_24x24_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "chapter_review_send_tip_24x24_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/community_noReview_sofa_icon.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "community_noReview_sofa_icon@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "community_noReview_sofa_icon@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/community_star_p_32x32_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "community_star_p_32x32_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "community_star_p_32x32_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/details_icon_star_n_32_32_32x32_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "details_icon_star_n_32_32_32x32_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "details_icon_star_n_32_32_32x32_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/discover_Ranking_109x50_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "discover_Ranking_109x50_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "discover_Ranking_109x50_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/discover_booklist_108x50_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "discover_booklist_108x50_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "discover_booklist_108x50_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/discover_classify_108x50_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "discover_classify_108x50_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "discover_classify_108x50_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/discover_icon_audiobook_26_26_26x26_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "discover_icon_audiobook_26_26_26x26_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "discover_icon_audiobook_26_26_26x26_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/discover_icon_comics_26_26_26x26_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "discover_icon_comics_26_26_26x26_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "discover_icon_comics_26_26_26x26_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/discover_icon_exclusive_26_26_26x26_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "discover_icon_exclusive_26_26_26x26_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "discover_icon_exclusive_26_26_26x26_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/discover_icon_free_26_26_26x26_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "discover_icon_free_26_26_26x26_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "discover_icon_free_26_26_26x26_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/discover_icon_random_26_26_26x26_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "discover_icon_random_26_26_26x26_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "discover_icon_random_26_26_26x26_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/discover_icon_timing_24_24_24x24_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "discover_icon_timing_24_24_24x24_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/discover_icon_vip_26_26_26x26_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "discover_icon_vip_26_26_26x26_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "discover_icon_vip_26_26_26x26_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/f_author_icon_14x14_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "f_author_icon_14x14_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "f_author_icon_14x14_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/f_commentator_icon_14x14_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "f_commentator_icon_14x14_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "f_commentator_icon_14x14_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/f_doyen_icon_12x12_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "f_doyen_icon_12x12_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "f_doyen_icon_12x12_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/f_moderator_icon_14x14_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "f_moderator_icon_14x14_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "f_moderator_icon_14x14_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/f_official_icon_12x12_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "f_official_icon_12x12_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "f_official_icon_12x12_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/forum_image_15x13_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "forum_image_15x13_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "forum_image_15x13_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/icon_delete_1_24x24_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "icon_delete_1_24x24_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "icon_delete_1_24x24_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/icon_download_a_24x24_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "icon_download_a_24x24_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "icon_download_a_24x24_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/icon_night_30x30_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "icon_night_30x30_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/icon_tools_menu_30x30_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "icon_tools_menu_30x30_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/icon_tools_setting_30x30_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "icon_tools_setting_30x30_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/icon_top_selected_24x24_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "icon_top_selected_24x24_@1x.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "icon_top_selected_24x24_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "icon_top_selected_24x24_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/mj_refresh.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "mj_refresh@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/nav_goldCoin_34_34_24x24_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "nav_goldCoin_34_34_24x24_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "nav_goldCoin_34_34_24x24_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/no_network_140x128_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "no_network_140x128_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "no_network_140x128_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/notification_personal_icon_message_24_24_24x24_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "notification_personal_icon_message_24_24_24x24_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "notification_personal_icon_message_24_24_24x24_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/official_icon_30x30_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "official_icon_30x30_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "official_icon_30x30_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/peach_reader_def_xuance2_32_32_32x32_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "peach_reader_def_xuance2_32_32_32x32_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "peach_reader_def_xuance2_32_32_32x32_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/personal_icon_account_24_24_24x24_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_account_24_24_24x24_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_account_24_24_24x24_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/personal_icon_booklist_24_24_24x24_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_booklist_24_24_24x24_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_booklist_24_24_24x24_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/personal_icon_darkmode_24_24_23x23_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_darkmode_24_24_23x23_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_darkmode_24_24_23x23_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/personal_icon_history_24_24_24x24_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_history_24_24_24x24_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_history_24_24_24x24_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/personal_icon_huntbook_24_24_24x24_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_huntbook_24_24_24x24_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_huntbook_24_24_24x24_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/personal_icon_id_24_24_24x24_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_id_24_24_24x24_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_id_24_24_24x24_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/personal_icon_level _24_24_24x24_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_level _24_24_24x24_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_level _24_24_24x24_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/personal_icon_level3 _24_24_24x24_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_level3 _24_24_24x24_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_level3 _24_24_24x24_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/personal_icon_opinion_24_24_24x24_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_opinion_24_24_24x24_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_opinion_24_24_24x24_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/personal_icon_reply_14_14_14x14_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_reply_14_14_14x14_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_reply_14_14_14x14_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/personal_icon_setting_24_24_24x24_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_setting_24_24_24x24_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_setting_24_24_24x24_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/personal_icon_topic_14_14_14x14_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_topic_14_14_14x14_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_topic_14_14_14x14_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/personal_icon_vip_24_24_24x24_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_vip_24_24_24x24_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_vip_24_24_24x24_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/personal_icon_warn_16_16_10x10_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_warn_16_16_10x10_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_warn_16_16_10x10_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/personal_icon_zslike_24_24_24x24_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_zslike_24_24_24x24_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "personal_icon_zslike_24_24_24x24_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/pic_day_46x46_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "pic_day_46x46_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/pic_night_46x46_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "pic_night_46x46_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/profile_personal_icon_message_24_24_24x24_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "profile_personal_icon_message_24_24_24x24_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "profile_personal_icon_message_24_24_24x24_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/slice_bg_515_88x32_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "slice_bg_515_88x32_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/slice_bg_barbie_88x32_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "slice_bg_barbie_88x32_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "slice_bg_barbie_88x32_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/slice_bg_jade_88x32_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "slice_bg_jade_88x32_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "slice_bg_jade_88x32_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/slice_bg_linen_88x32_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "slice_bg_linen_88x32_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "slice_bg_linen_88x32_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: zhuishushenqi/Assets.xcassets/New Version/slice_bg_night_88x32_.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "slice_bg_night_88x32_@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "slice_bg_night_88x32_@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

===============
Download .txt
gitextract_zvr8h67z/

├── .gitignore
├── .idea/
│   ├── codeStyles/
│   │   └── Project.xml
│   ├── modules.xml
│   ├── vcs.xml
│   ├── workspace.xml
│   ├── xcode.xml
│   └── zhuishushenqi.iml
├── Podfile
├── README.md
├── Script.sh
├── addSource.md
├── en.lproj/
│   └── Localizable.strings
├── images/
│   └── aptv.plist
├── zh-Hans.lproj/
│   └── Localizable.strings
├── zh-Hant.lproj/
│   └── Localizable.strings
├── zhuishushenqi/
│   ├── App/
│   │   ├── AppDelegate.swift
│   │   ├── AppOpenAdManager.swift
│   │   ├── AppStyle.swift
│   │   ├── BUAdManager.swift
│   │   ├── BookManager.swift
│   │   ├── Config.swift
│   │   ├── FBEncryptorAES.h
│   │   ├── FBEncryptorAES.m
│   │   ├── FBEncryptorAESUtils.h
│   │   ├── FBEncryptorAESUtils.mm
│   │   ├── Reader.swift
│   │   ├── Theme.swift
│   │   ├── ZSDBManager.h
│   │   ├── ZSDBManager.m
│   │   ├── ZSDBPropertyModel.h
│   │   ├── ZSDBPropertyModel.m
│   │   ├── ZSDatabase.swift
│   │   ├── ZSEncryptorAESUtils.swift
│   │   ├── ZSJSON.swift
│   │   ├── ZSLogin.swift
│   │   ├── ZSMobileLogin.swift
│   │   └── ZSThirdLogin.swift
│   ├── Assets.xcassets/
│   │   ├── AppIcon.appiconset/
│   │   │   └── Contents.json
│   │   ├── Contents.json
│   │   ├── Default-640x1136.imageset/
│   │   │   └── Contents.json
│   │   ├── LaunchImage.launchimage/
│   │   │   └── Contents.json
│   │   ├── New Version/
│   │   │   ├── Contents.json
│   │   │   ├── QDReaderSetting_brightnessDown_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── QDReaderSetting_brightnessUp_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bbs_icon_like02_26_26.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bbs_icon_message_20_20.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bbs_icon_message_34_34_34x34_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bbs_icon_more_big_26_26.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bbs_icon_personal_34_34_34x34_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bbs_icon_share_26_26_26x26_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bbs_icon_topic_26_26_26x26_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── blackboard_bg_375x667_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookshelf_bg_logo_80_19_80x19_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookshelf_icon_gift_34_34.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookshelf_icon_gift_new_34_34.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookshelf_icon_history_34_34.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookshelf_icon_more_10_10_10x10_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookshelf_icon_more_34_34.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookshelf_icon_more_wifi_24_24.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookshelf_icon_seach_34_34.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookshelf_top_bg_one_line.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookshelf_top_bg_two_line.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookstore_bg.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── bookstore_def_classify_20_20_20x20_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── chapter_review_send_tip_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── community_noReview_sofa_icon.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── community_star_p_32x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── details_icon_star_n_32_32_32x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── discover_Ranking_109x50_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── discover_booklist_108x50_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── discover_classify_108x50_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── discover_icon_audiobook_26_26_26x26_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── discover_icon_comics_26_26_26x26_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── discover_icon_exclusive_26_26_26x26_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── discover_icon_free_26_26_26x26_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── discover_icon_random_26_26_26x26_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── discover_icon_timing_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── discover_icon_vip_26_26_26x26_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── f_author_icon_14x14_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── f_commentator_icon_14x14_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── f_doyen_icon_12x12_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── f_moderator_icon_14x14_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── f_official_icon_12x12_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── forum_image_15x13_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── icon_delete_1_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── icon_download_a_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── icon_night_30x30_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── icon_tools_menu_30x30_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── icon_tools_setting_30x30_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── icon_top_selected_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── mj_refresh.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── nav_goldCoin_34_34_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── no_network_140x128_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── notification_personal_icon_message_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── official_icon_30x30_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── peach_reader_def_xuance2_32_32_32x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_account_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_booklist_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_darkmode_24_24_23x23_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_history_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_huntbook_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_id_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_level _24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_level3 _24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_opinion_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_reply_14_14_14x14_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_setting_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_topic_14_14_14x14_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_vip_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_warn_16_16_10x10_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── personal_icon_zslike_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── pic_day_46x46_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── pic_night_46x46_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── profile_personal_icon_message_24_24_24x24_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── slice_bg_515_88x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── slice_bg_barbie_88x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── slice_bg_jade_88x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── slice_bg_linen_88x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── slice_bg_night_88x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── slice_bg_paper_88x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── slice_bg_white_88x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── slice_bg_wood_88x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── slice_bg_yexiu_88x32_.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── source_checkbox_normal.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── source_checkbox_selected.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── source_delete.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tab_bbs.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tab_bbs_sel.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tab_bookshelf.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tab_bookshelf_sel.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tab_bookstore.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tab_bookstore_sel.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tab_discover.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tab_discover_sel.imageset/
│   │   │   │   └── Contents.json
│   │   │   ├── tab_profile.imageset/
│   │   │   │   └── Contents.json
│   │   │   └── tab_profile_sel.imageset/
│   │   │       └── Contents.json
│   │   ├── bg_back_white.imageset/
│   │   │   └── Contents.json
│   │   ├── catelog.imageset/
│   │   │   └── Contents.json
│   │   ├── fzhongjun.imageset/
│   │   │   └── Contents.json
│   │   ├── fzmiaowu.imageset/
│   │   │   └── Contents.json
│   │   ├── fzqingke.imageset/
│   │   │   └── Contents.json
│   │   ├── fzshusong.imageset/
│   │   │   └── Contents.json
│   │   ├── fzsuxinshil.imageset/
│   │   │   └── Contents.json
│   │   ├── fzxijinling.imageset/
│   │   │   └── Contents.json
│   │   ├── fzyouhei.imageset/
│   │   │   └── Contents.json
│   │   ├── kai.imageset/
│   │   │   └── Contents.json
│   │   ├── lantingh.imageset/
│   │   │   └── Contents.json
│   │   ├── leftbar.imageset/
│   │   │   └── Contents.json
│   │   ├── li.imageset/
│   │   │   └── Contents.json
│   │   ├── loadside.imageset/
│   │   │   └── Contents.json
│   │   ├── longwangchuanshuo.imageset/
│   │   │   └── Contents.json
│   │   ├── navigationbar-sidebar.imageset/
│   │   │   └── Contents.json
│   │   ├── pianpian.imageset/
│   │   │   └── Contents.json
│   │   ├── rightbar.imageset/
│   │   │   └── Contents.json
│   │   ├── riwen.imageset/
│   │   │   └── Contents.json
│   │   ├── sure_placeholder_error.imageset/
│   │   │   └── Contents.json
│   │   ├── weibei.imageset/
│   │   │   └── Contents.json
│   │   ├── yapi.imageset/
│   │   │   └── Contents.json
│   │   └── zhuishushenqi/
│   │       ├── AppIcon29x29.imageset/
│   │       │   └── Contents.json
│   │       ├── AppIcon40x40.imageset/
│   │       │   └── Contents.json
│   │       ├── AppIcon57x57.imageset/
│   │       │   └── Contents.json
│   │       ├── AppIcon60x60.imageset/
│   │       │   └── Contents.json
│   │       ├── AppIcon72x72.imageset/
│   │       │   └── Contents.json
│   │       ├── AppIcon76x76.imageset/
│   │       │   └── Contents.json
│   │       ├── Apprecommend.imageset/
│   │       │   └── Contents.json
│   │       ├── Contents.json
│   │       ├── Default-1242x2208.imageset/
│   │       │   └── Contents.json
│   │       ├── Default-750x1334.imageset/
│   │       │   └── Contents.json
│   │       ├── Default-iPad.imageset/
│   │       │   └── Contents.json
│   │       ├── Default.imageset/
│   │       │   └── Contents.json
│   │       ├── IQButtonBarArrowDown.imageset/
│   │       │   └── Contents.json
│   │       ├── IQButtonBarArrowUp.imageset/
│   │       │   └── Contents.json
│   │       ├── Icon.imageset/
│   │       │   └── Contents.json
│   │       ├── Icon_114.imageset/
│   │       │   └── Contents.json
│   │       ├── Icon_120.imageset/
│   │       │   └── Contents.json
│   │       ├── Icon_58.imageset/
│   │       │   └── Contents.json
│   │       ├── Icon_80.imageset/
│   │       │   └── Contents.json
│   │       ├── NavBack.imageset/
│   │       │   └── Contents.json
│   │       ├── NavForward.imageset/
│   │       │   └── Contents.json
│   │       ├── NavHome.imageset/
│   │       │   └── Contents.json
│   │       ├── NavRefresh.imageset/
│   │       │   └── Contents.json
│   │       ├── a_charge_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── a_charge_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── a_charge_record.imageset/
│   │       │   └── Contents.json
│   │       ├── a_charge_record_new.imageset/
│   │       │   └── Contents.json
│   │       ├── a_exchange.imageset/
│   │       │   └── Contents.json
│   │       ├── a_exchange_new.imageset/
│   │       │   └── Contents.json
│   │       ├── a_noadvs.imageset/
│   │       │   └── Contents.json
│   │       ├── a_purchase_record.imageset/
│   │       │   └── Contents.json
│   │       ├── a_purchase_record_new.imageset/
│   │       │   └── Contents.json
│   │       ├── a_zhuishubi.imageset/
│   │       │   └── Contents.json
│   │       ├── a_zhuishubi_new.imageset/
│   │       │   └── Contents.json
│   │       ├── a_zhuishuquan.imageset/
│   │       │   └── Contents.json
│   │       ├── a_zhuishuquan_new.imageset/
│   │       │   └── Contents.json
│   │       ├── actionbar_back.imageset/
│   │       │   └── Contents.json
│   │       ├── actionbar_close.imageset/
│   │       │   └── Contents.json
│   │       ├── actionbar_forward.imageset/
│   │       │   └── Contents.json
│   │       ├── actionbar_refresh.imageset/
│   │       │   └── Contents.json
│   │       ├── activity_image.imageset/
│   │       │   └── Contents.json
│   │       ├── add_book_hint.imageset/
│   │       │   └── Contents.json
│   │       ├── add_success.imageset/
│   │       │   └── Contents.json
│   │       ├── adwall_blue_pic.imageset/
│   │       │   └── Contents.json
│   │       ├── adwall_blue_text.imageset/
│   │       │   └── Contents.json
│   │       ├── adwall_white_pic.imageset/
│   │       │   └── Contents.json
│   │       ├── adwall_white_text.imageset/
│   │       │   └── Contents.json
│   │       ├── alert_error_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── alert_success_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── app_image.imageset/
│   │       │   └── Contents.json
│   │       ├── appointActivity_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── appointActivity_close.imageset/
│   │       │   └── Contents.json
│   │       ├── ar_shadow.imageset/
│   │       │   └── Contents.json
│   │       ├── arrow.imageset/
│   │       │   └── Contents.json
│   │       ├── artboard.imageset/
│   │       │   └── Contents.json
│   │       ├── autoreading_start.imageset/
│   │       │   └── Contents.json
│   │       ├── autoreading_start_landscape.imageset/
│   │       │   └── Contents.json
│   │       ├── avatar_wrapper.imageset/
│   │       │   └── Contents.json
│   │       ├── background_green.imageset/
│   │       │   └── Contents.json
│   │       ├── background_green_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── background_white.imageset/
│   │       │   └── Contents.json
│   │       ├── background_white_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── background_yellow.imageset/
│   │       │   └── Contents.json
│   │       ├── background_yellow_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── baidu_logo.imageset/
│   │       │   └── Contents.json
│   │       ├── baidubutton.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_add.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_add_count.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_add_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_arrow_down.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_arrow_right.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_cancel.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_cancel_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_mark.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_retention_ratio.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_search.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_search_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_share.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_share_red.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_share_white.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_star_empty.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_star_filled.imageset/
│   │       │   └── Contents.json
│   │       ├── bd_useful.imageset/
│   │       │   └── Contents.json
│   │       ├── beijing.imageset/
│   │       │   └── Contents.json
│   │       ├── blackGreen_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── bofang.imageset/
│   │       │   └── Contents.json
│   │       ├── bofangNotify.imageset/
│   │       │   └── Contents.json
│   │       ├── bookDirectory_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── bookDirectory_separator.imageset/
│   │       │   └── Contents.json
│   │       ├── bookShelf_check.imageset/
│   │       │   └── Contents.json
│   │       ├── bookShelf_uncheck.imageset/
│   │       │   └── Contents.json
│   │       ├── booklist_delete.imageset/
│   │       │   └── Contents.json
│   │       ├── brightess_high.imageset/
│   │       │   └── Contents.json
│   │       ├── brightess_low.imageset/
│   │       │   └── Contents.json
│   │       ├── brightess_white_high.imageset/
│   │       │   └── Contents.json
│   │       ├── brightess_white_low.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_delete.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_delete_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_download.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_download_cancel.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_download_finished.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_download_waiting.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_downloading.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_feed.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_feed_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_feed_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_feed_tip.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_feeded.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_last_read.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_last_read_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_stick.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_stick_cancel.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_stick_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── bs_stick_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── btn_slider_off.imageset/
│   │       │   └── Contents.json
│   │       ├── btn_slider_on.imageset/
│   │       │   └── Contents.json
│   │       ├── btn_slider_thumb.imageset/
│   │       │   └── Contents.json
│   │       ├── btn_slider_thumb_pressed.imageset/
│   │       │   └── Contents.json
│   │       ├── btn_slider_track.imageset/
│   │       │   └── Contents.json
│   │       ├── btn_slider_track_pressed.imageset/
│   │       │   └── Contents.json
│   │       ├── c_arrow_down.imageset/
│   │       │   └── Contents.json
│   │       ├── c_check.imageset/
│   │       │   └── Contents.json
│   │       ├── cell_selected_background.imageset/
│   │       │   └── Contents.json
│   │       ├── cell_selected_tip.imageset/
│   │       │   └── Contents.json
│   │       ├── change_mode_checked.imageset/
│   │       │   └── Contents.json
│   │       ├── change_mode_unchecked.imageset/
│   │       │   └── Contents.json
│   │       ├── change_resource.imageset/
│   │       │   └── Contents.json
│   │       ├── close.imageset/
│   │       │   └── Contents.json
│   │       ├── coffee_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── common_button_big_blue.imageset/
│   │       │   └── Contents.json
│   │       ├── common_button_big_blue_disable.imageset/
│   │       │   └── Contents.json
│   │       ├── common_button_big_blue_highlighted.imageset/
│   │       │   └── Contents.json
│   │       ├── common_button_white.imageset/
│   │       │   └── Contents.json
│   │       ├── common_button_white_highlighted.imageset/
│   │       │   └── Contents.json
│   │       ├── common_icon_arrow.imageset/
│   │       │   └── Contents.json
│   │       ├── compose_keyboardbutton_background.imageset/
│   │       │   └── Contents.json
│   │       ├── compose_toolbar_background.imageset/
│   │       │   └── Contents.json
│   │       ├── cover_wrapper.imageset/
│   │       │   └── Contents.json
│   │       ├── d_comment.imageset/
│   │       │   └── Contents.json
│   │       ├── d_default.imageset/
│   │       │   └── Contents.json
│   │       ├── d_delete.imageset/
│   │       │   └── Contents.json
│   │       ├── d_follow.imageset/
│   │       │   └── Contents.json
│   │       ├── d_followed.imageset/
│   │       │   └── Contents.json
│   │       ├── d_forward.imageset/
│   │       │   └── Contents.json
│   │       ├── d_forward_large.imageset/
│   │       │   └── Contents.json
│   │       ├── d_forwarded_large.imageset/
│   │       │   └── Contents.json
│   │       ├── d_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── d_votes.imageset/
│   │       │   └── Contents.json
│   │       ├── day_mode.imageset/
│   │       │   └── Contents.json
│   │       ├── day_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── default_avatar_deep.imageset/
│   │       │   └── Contents.json
│   │       ├── default_avatar_light.imageset/
│   │       │   └── Contents.json
│   │       ├── default_book_cover.imageset/
│   │       │   └── Contents.json
│   │       ├── delete_book_tip.imageset/
│   │       │   └── Contents.json
│   │       ├── dingshi.imageset/
│   │       │   └── Contents.json
│   │       ├── directory.imageset/
│   │       │   └── Contents.json
│   │       ├── directory_close.imageset/
│   │       │   └── Contents.json
│   │       ├── directory_close_pressed.imageset/
│   │       │   └── Contents.json
│   │       ├── directory_not_previewed.imageset/
│   │       │   └── Contents.json
│   │       ├── directory_previewed.imageset/
│   │       │   └── Contents.json
│   │       ├── directory_vip_chapter.imageset/
│   │       │   └── Contents.json
│   │       ├── discover_icon_back_24_24.imageset/
│   │       │   └── Contents.json
│   │       ├── discover_icon_bookshelf_24_24.imageset/
│   │       │   └── Contents.json
│   │       ├── discover_icon_bookshelf_24_24_p.imageset/
│   │       │   └── Contents.json
│   │       ├── discover_icon_more_24_24.imageset/
│   │       │   └── Contents.json
│   │       ├── discover_icon_next_36_36.imageset/
│   │       │   └── Contents.json
│   │       ├── discover_icon_palying_20_14.imageset/
│   │       │   └── Contents.json
│   │       ├── discover_icon_play_76_76.imageset/
│   │       │   └── Contents.json
│   │       ├── discover_icon_pouse_76_76.imageset/
│   │       │   └── Contents.json
│   │       ├── discover_icon_timing_24_24.imageset/
│   │       │   └── Contents.json
│   │       ├── discover_icon_up_36_36.imageset/
│   │       │   └── Contents.json
│   │       ├── draft_defaultImage.imageset/
│   │       │   └── Contents.json
│   │       ├── empty_failed.imageset/
│   │       │   └── Contents.json
│   │       ├── enter_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── erciyuanv3.imageset/
│   │       │   └── Contents.json
│   │       ├── error.imageset/
│   │       │   └── Contents.json
│   │       ├── exchange_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── exchange_center.imageset/
│   │       │   └── Contents.json
│   │       ├── exchange_duihuan.imageset/
│   │       │   └── Contents.json
│   │       ├── exchange_jiantou.imageset/
│   │       │   └── Contents.json
│   │       ├── exchange_jinru.imageset/
│   │       │   └── Contents.json
│   │       ├── exchange_jinru_h.imageset/
│   │       │   └── Contents.json
│   │       ├── exchange_kuang.imageset/
│   │       │   └── Contents.json
│   │       ├── exchange_tixian.imageset/
│   │       │   └── Contents.json
│   │       ├── exp_current.imageset/
│   │       │   └── Contents.json
│   │       ├── exp_more.imageset/
│   │       │   └── Contents.json
│   │       ├── exp_paiming.imageset/
│   │       │   └── Contents.json
│   │       ├── exp_progress.imageset/
│   │       │   └── Contents.json
│   │       ├── exp_publishBook.imageset/
│   │       │   └── Contents.json
│   │       ├── exp_publishTopic.imageset/
│   │       │   └── Contents.json
│   │       ├── exp_updateHeader.imageset/
│   │       │   └── Contents.json
│   │       ├── f_author_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── f_commentator_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── f_distillate.imageset/
│   │       │   └── Contents.json
│   │       ├── f_doyen_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── f_game_center_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── f_girl_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── f_hot.imageset/
│   │       │   └── Contents.json
│   │       ├── f_invent_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── f_like_comment.imageset/
│   │       │   └── Contents.json
│   │       ├── f_like_comment_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── f_like_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── f_like_icon_select.imageset/
│   │       │   └── Contents.json
│   │       ├── f_moderator_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── f_official_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── f_ramble_default_cover.imageset/
│   │       │   └── Contents.json
│   │       ├── f_ramble_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── f_sort.imageset/
│   │       │   └── Contents.json
│   │       ├── f_today_topic.imageset/
│   │       │   └── Contents.json
│   │       ├── fanhui.imageset/
│   │       │   └── Contents.json
│   │       ├── fb_cancel.imageset/
│   │       │   └── Contents.json
│   │       ├── fb_cancel_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── fb_gray_angle.imageset/
│   │       │   └── Contents.json
│   │       ├── fb_set.imageset/
│   │       │   └── Contents.json
│   │       ├── fb_set_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── fb_white_angle.imageset/
│   │       │   └── Contents.json
│   │       ├── fd_tip.imageset/
│   │       │   └── Contents.json
│   │       ├── fd_tip_title.imageset/
│   │       │   └── Contents.json
│   │       ├── feedback.imageset/
│   │       │   └── Contents.json
│   │       ├── fenxiang.imageset/
│   │       │   └── Contents.json
│   │       ├── float_forum_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── float_forum_icon_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── font_decrease.imageset/
│   │       │   └── Contents.json
│   │       ├── font_decrease_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── font_decrease_unable.imageset/
│   │       │   └── Contents.json
│   │       ├── font_increase.imageset/
│   │       │   └── Contents.json
│   │       ├── font_increase_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── font_increase_unable.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_avatar_small.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_book_entry.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_collect_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_collect_icon_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_comment_cancel.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_comment_cancel_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_comment_confirm.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_comment_confirm_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_comment_confirm_unable.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_comment_input_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_comment_reply.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_comment_reply_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_comment_start.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_comment_start_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_enter.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_gray_star.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_help_default_cover.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_hint_arrow_right_up.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_like_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_liked_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_more_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_more_icon_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_more_option.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_more_option_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_not_voted.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_post_comment_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_post_red.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_post_red_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_post_shadow.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_public_help_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_public_review_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_red_star.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_share_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_share_icon_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_topic_type_post.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_topic_type_vote.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_vote_add.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_vote_add_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_vote_delete.imageset/
│   │       │   └── Contents.json
│   │       ├── forum_voted.imageset/
│   │       │   └── Contents.json
│   │       ├── fuliv3.imageset/
│   │       │   └── Contents.json
│   │       ├── fullscreen.imageset/
│   │       │   └── Contents.json
│   │       ├── g_boy.imageset/
│   │       │   └── Contents.json
│   │       ├── g_boy_avatar.imageset/
│   │       │   └── Contents.json
│   │       ├── g_boy_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── g_boy_tip.imageset/
│   │       │   └── Contents.json
│   │       ├── g_close.imageset/
│   │       │   └── Contents.json
│   │       ├── g_girl.imageset/
│   │       │   └── Contents.json
│   │       ├── g_girl_avatar.imageset/
│   │       │   └── Contents.json
│   │       ├── g_girl_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── g_girl_tip.imageset/
│   │       │   └── Contents.json
│   │       ├── g_left_line.imageset/
│   │       │   └── Contents.json
│   │       ├── g_right_line.imageset/
│   │       │   └── Contents.json
│   │       ├── g_sex_tip.imageset/
│   │       │   └── Contents.json
│   │       ├── g_tip_overview.imageset/
│   │       │   └── Contents.json
│   │       ├── game_image.imageset/
│   │       │   └── Contents.json
│   │       ├── gou.imageset/
│   │       │   └── Contents.json
│   │       ├── green_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── guanbi.imageset/
│   │       │   └── Contents.json
│   │       ├── guanbiNotify.imageset/
│   │       │   └── Contents.json
│   │       ├── hsm_default_avatar.imageset/
│   │       │   └── Contents.json
│   │       ├── hsm_icon_1.imageset/
│   │       │   └── Contents.json
│   │       ├── hsm_icon_2.imageset/
│   │       │   └── Contents.json
│   │       ├── hsm_icon_3.imageset/
│   │       │   └── Contents.json
│   │       ├── hsm_new_topic_tip.imageset/
│   │       │   └── Contents.json
│   │       ├── interstitialIcon.imageset/
│   │       │   └── Contents.json
│   │       ├── interstitialIconclose.imageset/
│   │       │   └── Contents.json
│   │       ├── jiantou.imageset/
│   │       │   └── Contents.json
│   │       ├── jingdian.imageset/
│   │       │   └── Contents.json
│   │       ├── jinjiv3.imageset/
│   │       │   └── Contents.json
│   │       ├── landscape.imageset/
│   │       │   └── Contents.json
│   │       ├── last_read_resource.imageset/
│   │       │   └── Contents.json
│   │       ├── liantu.imageset/
│   │       │   └── Contents.json
│   │       ├── liebiao.imageset/
│   │       │   └── Contents.json
│   │       ├── lishiv3.imageset/
│   │       │   └── Contents.json
│   │       ├── listbofang.imageset/
│   │       │   └── Contents.json
│   │       ├── listpaixu.imageset/
│   │       │   └── Contents.json
│   │       ├── listshengyin.imageset/
│   │       │   └── Contents.json
│   │       ├── listxiazai.imageset/
│   │       │   └── Contents.json
│   │       ├── listxuanji.imageset/
│   │       │   └── Contents.json
│   │       ├── login_background.imageset/
│   │       │   └── Contents.json
│   │       ├── login_country_background.imageset/
│   │       │   └── Contents.json
│   │       ├── login_country_background_highlighted.imageset/
│   │       │   └── Contents.json
│   │       ├── logo.imageset/
│   │       │   └── Contents.json
│   │       ├── logo_recommend.imageset/
│   │       │   └── Contents.json
│   │       ├── logo_recommend_ipad.imageset/
│   │       │   └── Contents.json
│   │       ├── lsm_view_shadow.imageset/
│   │       │   └── Contents.json
│   │       ├── m_success_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── mode_baidu.imageset/
│   │       │   └── Contents.json
│   │       ├── mode_cp.imageset/
│   │       │   └── Contents.json
│   │       ├── mode_easou.imageset/
│   │       │   └── Contents.json
│   │       ├── mode_juhe.imageset/
│   │       │   └── Contents.json
│   │       ├── mode_leidian.imageset/
│   │       │   └── Contents.json
│   │       ├── mode_shenma.imageset/
│   │       │   └── Contents.json
│   │       ├── mode_sogou.imageset/
│   │       │   └── Contents.json
│   │       ├── mode_soso.imageset/
│   │       │   └── Contents.json
│   │       ├── mode_tieba.imageset/
│   │       │   └── Contents.json
│   │       ├── mode_zhineng.imageset/
│   │       │   └── Contents.json
│   │       ├── month_jiaobiao.imageset/
│   │       │   └── Contents.json
│   │       ├── month_kuang.imageset/
│   │       │   └── Contents.json
│   │       ├── month_kuang1.imageset/
│   │       │   └── Contents.json
│   │       ├── month_touxiang.imageset/
│   │       │   └── Contents.json
│   │       ├── monthly_book_mark.imageset/
│   │       │   └── Contents.json
│   │       ├── monthly_mark.imageset/
│   │       │   └── Contents.json
│   │       ├── move-down.imageset/
│   │       │   └── Contents.json
│   │       ├── move-up.imageset/
│   │       │   └── Contents.json
│   │       ├── mp_arrow_down.imageset/
│   │       │   └── Contents.json
│   │       ├── mp_arrow_left.imageset/
│   │       │   └── Contents.json
│   │       ├── mp_arrow_right.imageset/
│   │       │   └── Contents.json
│   │       ├── mp_arrow_up.imageset/
│   │       │   └── Contents.json
│   │       ├── mp_refresh.imageset/
│   │       │   └── Contents.json
│   │       ├── mp_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── mp_unselected.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_ad_shadow.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_arrow.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_avatar_wrapper.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_book_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_header_background.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_header_shadow.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_home_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_hot_vote.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_mani_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_post_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_reply_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_separator.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_title.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_topic_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── mv_vote_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── n_comment.imageset/
│   │       │   └── Contents.json
│   │       ├── n_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── n_link.imageset/
│   │       │   └── Contents.json
│   │       ├── n_reply.imageset/
│   │       │   └── Contents.json
│   │       ├── n_vote.imageset/
│   │       │   └── Contents.json
│   │       ├── nav_add_book.imageset/
│   │       │   └── Contents.json
│   │       ├── nav_add_book_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── nav_arrow_down.imageset/
│   │       │   └── Contents.json
│   │       ├── nav_arrow_up.imageset/
│   │       │   └── Contents.json
│   │       ├── nav_back_red.imageset/
│   │       │   └── Contents.json
│   │       ├── nav_back_red_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── nav_back_white.imageset/
│   │       │   └── Contents.json
│   │       ├── nav_back_white_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── nav_home_side_menu.imageset/
│   │       │   └── Contents.json
│   │       ├── nav_home_side_menu_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── navigationbar_background.imageset/
│   │       │   └── Contents.json
│   │       ├── navigationbar_background_os7.imageset/
│   │       │   └── Contents.json
│   │       ├── network_cut.imageset/
│   │       │   └── Contents.json
│   │       ├── newUser_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── newUser_close.imageset/
│   │       │   └── Contents.json
│   │       ├── new_nav_hilighted.imageset/
│   │       │   └── Contents.json
│   │       ├── new_nav_night_hilighted.imageset/
│   │       │   └── Contents.json
│   │       ├── new_nav_night_normal.imageset/
│   │       │   └── Contents.json
│   │       ├── new_nav_night_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── new_nav_normal.imageset/
│   │       │   └── Contents.json
│   │       ├── new_nav_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── new_nav_vertical_separator.imageset/
│   │       │   └── Contents.json
│   │       ├── new_notification_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── new_notification_tip.imageset/
│   │       │   └── Contents.json
│   │       ├── night_mode.imageset/
│   │       │   └── Contents.json
│   │       ├── nl_qq.imageset/
│   │       │   └── Contents.json
│   │       ├── nl_wechat.imageset/
│   │       │   └── Contents.json
│   │       ├── nl_weibo.imageset/
│   │       │   └── Contents.json
│   │       ├── nl_xiaomi.imageset/
│   │       │   └── Contents.json
│   │       ├── no_network.imageset/
│   │       │   └── Contents.json
│   │       ├── no_resource.imageset/
│   │       │   └── Contents.json
│   │       ├── notice_image.imageset/
│   │       │   └── Contents.json
│   │       ├── nvshengv3.imageset/
│   │       │   └── Contents.json
│   │       ├── official_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── p_anywhere.imageset/
│   │       │   └── Contents.json
│   │       ├── p_anywhere_ipad.imageset/
│   │       │   └── Contents.json
│   │       ├── p_anywhere_title.imageset/
│   │       │   └── Contents.json
│   │       ├── p_anywhere_title_ipad.imageset/
│   │       │   └── Contents.json
│   │       ├── p_btn.imageset/
│   │       │   └── Contents.json
│   │       ├── p_btn_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── p_fast.imageset/
│   │       │   └── Contents.json
│   │       ├── p_fast_ipad.imageset/
│   │       │   └── Contents.json
│   │       ├── p_fast_title.imageset/
│   │       │   └── Contents.json
│   │       ├── p_fast_title_ipad.imageset/
│   │       │   └── Contents.json
│   │       ├── p_guest_tip.imageset/
│   │       │   └── Contents.json
│   │       ├── p_guest_tip_ipad.imageset/
│   │       │   └── Contents.json
│   │       ├── p_logo.imageset/
│   │       │   └── Contents.json
│   │       ├── p_logo_ipad.imageset/
│   │       │   └── Contents.json
│   │       ├── p_logo_small.imageset/
│   │       │   └── Contents.json
│   │       ├── p_logo_small_ipad.imageset/
│   │       │   └── Contents.json
│   │       ├── p_qq_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── p_sina_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── p_synchronize.imageset/
│   │       │   └── Contents.json
│   │       ├── p_synchronize_ipad.imageset/
│   │       │   └── Contents.json
│   │       ├── p_synchronize_title.imageset/
│   │       │   └── Contents.json
│   │       ├── p_synchronize_title_ipad.imageset/
│   │       │   └── Contents.json
│   │       ├── pay_alipay.imageset/
│   │       │   └── Contents.json
│   │       ├── pay_apple.imageset/
│   │       │   └── Contents.json
│   │       ├── pay_record_option.imageset/
│   │       │   └── Contents.json
│   │       ├── pay_weixin.imageset/
│   │       │   └── Contents.json
│   │       ├── pf_header_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── pf_new_notification.imageset/
│   │       │   └── Contents.json
│   │       ├── pf_ratebottom.imageset/
│   │       │   └── Contents.json
│   │       ├── pf_rateupper.imageset/
│   │       │   └── Contents.json
│   │       ├── pink_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── play_big_image.imageset/
│   │       │   └── Contents.json
│   │       ├── player_back.imageset/
│   │       │   └── Contents.json
│   │       ├── player_pause.imageset/
│   │       │   └── Contents.json
│   │       ├── player_play.imageset/
│   │       │   └── Contents.json
│   │       ├── portrait.imageset/
│   │       │   └── Contents.json
│   │       ├── post_tip_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── preview_btn.imageset/
│   │       │   └── Contents.json
│   │       ├── previewed_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── progress_cancel.imageset/
│   │       │   └── Contents.json
│   │       ├── progress_cancel_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── progresshud_background.imageset/
│   │       │   └── Contents.json
│   │       ├── promotion_image.imageset/
│   │       │   └── Contents.json
│   │       ├── qqicon.imageset/
│   │       │   └── Contents.json
│   │       ├── ranking_arrow_down.imageset/
│   │       │   └── Contents.json
│   │       ├── ranking_other.imageset/
│   │       │   └── Contents.json
│   │       ├── rd_func_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── rd_reading_add_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── rd_reading_added_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── rd_reading_change_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── readAloud.imageset/
│   │       │   └── Contents.json
│   │       ├── readAloud_exit.imageset/
│   │       │   └── Contents.json
│   │       ├── readAloud_more.imageset/
│   │       │   └── Contents.json
│   │       ├── readAloud_more_highLighted.imageset/
│   │       │   └── Contents.json
│   │       ├── readAloud_pause.imageset/
│   │       │   └── Contents.json
│   │       ├── readAloud_play.imageset/
│   │       │   └── Contents.json
│   │       ├── reading_landscape.imageset/
│   │       │   └── Contents.json
│   │       ├── reading_more_setting.imageset/
│   │       │   └── Contents.json
│   │       ├── reading_more_setting_landscape.imageset/
│   │       │   └── Contents.json
│   │       ├── reading_record_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── reading_setting.imageset/
│   │       │   └── Contents.json
│   │       ├── reading_tip_menu.imageset/
│   │       │   └── Contents.json
│   │       ├── reading_tip_next.imageset/
│   │       │   └── Contents.json
│   │       ├── reading_tip_pre.imageset/
│   │       │   └── Contents.json
│   │       ├── recommend_new.imageset/
│   │       │   └── Contents.json
│   │       ├── recommend_top.imageset/
│   │       │   └── Contents.json
│   │       ├── red_menu_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── refresh_arrow.imageset/
│   │       │   └── Contents.json
│   │       ├── refresh_finish.imageset/
│   │       │   └── Contents.json
│   │       ├── reward.imageset/
│   │       │   └── Contents.json
│   │       ├── reward_launch.imageset/
│   │       │   └── Contents.json
│   │       ├── rp_arrow.imageset/
│   │       │   └── Contents.json
│   │       ├── rp_badge_disabled.imageset/
│   │       │   └── Contents.json
│   │       ├── rp_badge_normal.imageset/
│   │       │   └── Contents.json
│   │       ├── rp_checkbox.imageset/
│   │       │   └── Contents.json
│   │       ├── rp_checkbox_unchecked.imageset/
│   │       │   └── Contents.json
│   │       ├── rp_disabled_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── rp_info.imageset/
│   │       │   └── Contents.json
│   │       ├── rp_no_network.imageset/
│   │       │   └── Contents.json
│   │       ├── rp_normal_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── rp_selected_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_0.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_1.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_10.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_2.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_3.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_4.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_5.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_6.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_7.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_8.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_9.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_comic.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_exclusive.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_monthly.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_recommended.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_store.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_icon_wifi.imageset/
│   │       │   └── Contents.json
│   │       ├── rsm_view_shadow.imageset/
│   │       │   └── Contents.json
│   │       ├── s_wechat.imageset/
│   │       │   └── Contents.json
│   │       ├── sdk_weibo_logo.imageset/
│   │       │   └── Contents.json
│   │       ├── search_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── search_cannot_delete.imageset/
│   │       │   └── Contents.json
│   │       ├── search_cannot_refresh.imageset/
│   │       │   └── Contents.json
│   │       ├── search_delete.imageset/
│   │       │   └── Contents.json
│   │       ├── search_history_mark.imageset/
│   │       │   └── Contents.json
│   │       ├── search_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── search_refresh.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_fontFanJian_jian.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_font_bigger_nomal.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_font_bigger_nomal_h.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_font_bigger_uneable.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_font_fan.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_font_jian.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_font_nomal.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_font_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_font_snaller_normal.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_font_snaller_normal_h.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_font_snaller_uneable.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_orientation_hengpin.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_orientation_shupin.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_paly.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_set.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_space_big_nomal.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_space_big_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_space_nomal.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_space_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_space_small_nomal.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_space_small_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── setting_theme_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── shang.imageset/
│   │       │   └── Contents.json
│   │       ├── sheepskin_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── shengyin.imageset/
│   │       │   └── Contents.json
│   │       ├── show_right_sidemenu_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── sign_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── sign_gotoSign.imageset/
│   │       │   └── Contents.json
│   │       ├── sign_signed.imageset/
│   │       │   └── Contents.json
│   │       ├── sign_success.imageset/
│   │       │   └── Contents.json
│   │       ├── slider.imageset/
│   │       │   └── Contents.json
│   │       ├── slider_black.imageset/
│   │       │   └── Contents.json
│   │       ├── slider_red.imageset/
│   │       │   └── Contents.json
│   │       ├── sm_arrow_down.imageset/
│   │       │   └── Contents.json
│   │       ├── sm_bottom_background.imageset/
│   │       │   └── Contents.json
│   │       ├── sm_bottom_shadow.imageset/
│   │       │   └── Contents.json
│   │       ├── sm_exit.imageset/
│   │       │   └── Contents.json
│   │       ├── sm_exit_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── sm_forum_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── sm_forum_bg_selected.imageset/
│   │       │   └── Contents.json
│   │       ├── sm_topic_tip_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── sm_web_back.imageset/
│   │       │   └── Contents.json
│   │       ├── sm_web_forward.imageset/
│   │       │   └── Contents.json
│   │       ├── sm_web_refresh.imageset/
│   │       │   └── Contents.json
│   │       ├── splash_bottom_icon.imageset/
│   │       │   └── Contents.json
│   │       ├── splash_bottom_logo.imageset/
│   │       │   └── Contents.json
│   │       ├── success.imageset/
│   │       │   └── Contents.json
│   │       ├── switch.imageset/
│   │       │   └── Contents.json
│   │       ├── task_lanch.imageset/
│   │       │   └── Contents.json
│   │       ├── task_person.imageset/
│   │       │   └── Contents.json
│   │       ├── task_praise.imageset/
│   │       │   └── Contents.json
│   │       ├── task_share.imageset/
│   │       │   └── Contents.json
│   │       ├── timeline_relationship_icon_addattention.imageset/
│   │       │   └── Contents.json
│   │       ├── timeline_relationship_icon_attention.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_baidu.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_baidu_active.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_bg1.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_close.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_fold.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_message.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_message_active.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_navBack.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_navBack_active.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_navForward.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_navForward_active.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_unfold.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_weibo.imageset/
│   │       │   └── Contents.json
│   │       ├── toolbar_weibo_active.imageset/
│   │       │   └── Contents.json
│   │       ├── update_image.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_account-1.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_account.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_bookList-1.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_bookList.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_comment.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_exchange.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_experience-1.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_experience.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_history.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_msg-1.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_msg.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_rate-1.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_rate.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_setting-1.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_setting.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_setting2.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_task.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_topic-1.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_topic.imageset/
│   │       │   └── Contents.json
│   │       ├── userCenter_wechat.imageset/
│   │       │   └── Contents.json
│   │       ├── verify_code_button.imageset/
│   │       │   └── Contents.json
│   │       ├── verify_code_button_highlighted.imageset/
│   │       │   └── Contents.json
│   │       ├── video_volumeoff.imageset/
│   │       │   └── Contents.json
│   │       ├── video_volumeon.imageset/
│   │       │   └── Contents.json
│   │       ├── violet_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── voicefenxiang.imageset/
│   │       │   └── Contents.json
│   │       ├── volumeoff.imageset/
│   │       │   └── Contents.json
│   │       ├── volumeon.imageset/
│   │       │   └── Contents.json
│   │       ├── wangwenv3.imageset/
│   │       │   └── Contents.json
│   │       ├── water_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── wechat.imageset/
│   │       │   └── Contents.json
│   │       ├── wechatQR.imageset/
│   │       │   └── Contents.json
│   │       ├── weekGreen_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── weekPink_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── white_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── xia.imageset/
│   │       │   └── Contents.json
│   │       ├── yellow_mode_bg.imageset/
│   │       │   └── Contents.json
│   │       ├── yuan.imageset/
│   │       │   └── Contents.json
│   │       ├── yuanchuangv3.imageset/
│   │       │   └── Contents.json
│   │       ├── zanting.imageset/
│   │       │   └── Contents.json
│   │       ├── zantingNotify.imageset/
│   │       │   └── Contents.json
│   │       ├── zhonghev3.imageset/
│   │       │   └── Contents.json
│   │       ├── zhui.imageset/
│   │       │   └── Contents.json
│   │       ├── zssq_image.imageset/
│   │       │   └── Contents.json
│   │       ├── zuire.imageset/
│   │       │   └── Contents.json
│   │       ├── zuixin.imageset/
│   │       │   └── Contents.json
│   │       ├── 方正兰亭黑.imageset/
│   │       │   └── Contents.json
│   │       ├── 日文字体.imageset/
│   │       │   └── Contents.json
│   │       ├── 楷体.imageset/
│   │       │   └── Contents.json
│   │       ├── 翩翩体.imageset/
│   │       │   └── Contents.json
│   │       ├── 隶变.imageset/
│   │       │   └── Contents.json
│   │       ├── 雅痞.imageset/
│   │       │   └── Contents.json
│   │       ├── 魏碑.imageset/
│   │       │   └── Contents.json
│   │       ├── 黑体.imageset/
│   │       │   └── Contents.json
│   │       └── 默认.imageset/
│   │           └── Contents.json
│   ├── Base/
│   │   ├── Controllers/
│   │   │   ├── BaseViewController.swift
│   │   │   ├── SideViewController.swift
│   │   │   ├── ZSBaseNavigationViewController.swift
│   │   │   ├── ZSBaseTableViewController.swift
│   │   │   ├── ZSSegmentViewController.swift
│   │   │   └── ZSSegmenuViewController.swift
│   │   ├── Models/
│   │   │   ├── SwiftyJSON.swift
│   │   │   ├── XYCBaseModel.h
│   │   │   ├── XYCBaseModel.m
│   │   │   └── ZSCacheHelper.swift
│   │   ├── ViewManager/
│   │   │   ├── ZSAppInfo.swift
│   │   │   ├── ZSBaseTableViewManger.swift
│   │   │   ├── ZSBookDownloader.swift
│   │   │   └── ZSCellAdapterProtocol.swift
│   │   └── Views/
│   │       ├── CommunityView.swift
│   │       ├── DarkStarView.swift
│   │       ├── DarkView.swift
│   │       ├── EmptyView.swift
│   │       ├── EmptyView.xib
│   │       ├── LightStarView.swift
│   │       ├── LightView.swift
│   │       ├── QSLoadingView.swift
│   │       ├── RateView.swift
│   │       ├── UIScrollView+StateView.h
│   │       ├── UIScrollView+StateView.m
│   │       ├── V2FPSLabel.swift
│   │       ├── XYCActionSheet.swift
│   │       ├── ZSBaseCellAdapter.swift
│   │       └── ZSBaseSectionAdapter.swift
│   ├── Base.lproj/
│   │   ├── LaunchScreen.storyboard
│   │   └── Main.storyboard
│   ├── Client/
│   │   ├── QSAPI.swift
│   │   └── QSNetworkManager.swift
│   ├── Extension/
│   │   ├── Alamofire+ZSExtension.swift
│   │   ├── ApplicationExtension.swift
│   │   ├── Array+ZSExtension.swift
│   │   ├── Date+Extension.swift
│   │   ├── DateIntervalFormatter+formatter.swift
│   │   ├── Dictionary+QSExtension.swift
│   │   ├── DispatchTime+Extension.swift
│   │   ├── LocalizedUtils.swift
│   │   ├── NSDate+Extension.h
│   │   ├── NSDate+Extension.m
│   │   ├── NSObject+Extension.swift
│   │   ├── NSString+Encode.h
│   │   ├── NSString+Encode.m
│   │   ├── NotificationCenter+QSExtension.swift
│   │   ├── Reachability.swift
│   │   ├── SQLite+Extension.swift
│   │   ├── String+QSExtension.swift
│   │   ├── SwiftStdlib/
│   │   │   ├── FloatExtensions.swift
│   │   │   └── IntExtensions.swift
│   │   ├── UIButton+Extension.swift
│   │   ├── UICollectionView+QSExtension.swift
│   │   ├── UIColor+Theme.swift
│   │   ├── UIFont+Extension.swift
│   │   ├── UIFont+ZSExtension.h
│   │   ├── UIFont+ZSExtension.m
│   │   ├── UIImage+QSData.swift
│   │   ├── UIImageView+zhuishu.swift
│   │   ├── UILabel+zhuishu.swift
│   │   ├── UINavigationItem+BackItem.h
│   │   ├── UINavigationItem+BackItem.m
│   │   ├── UIStoryboardExtension.swift
│   │   ├── UITableView+FINAutomaticHeightCell.swift
│   │   ├── UITableView+QSGeneric.swift
│   │   ├── UITableView+swizzling.swift
│   │   ├── UITableViewCell+ZSExtension.swift
│   │   ├── UIView+ScreenShot.swift
│   │   ├── UIViewController+Alert.swift
│   │   ├── UserDefaultsExtension.swift
│   │   ├── Value.swift
│   │   └── copy.txt
│   ├── Info.plist
│   ├── IntroducePage/
│   │   ├── QSIntroduceCell.swift
│   │   ├── QSIntroduceCell.xib
│   │   ├── QSIntroduceReadCell.swift
│   │   ├── QSIntroduceReadCell.xib
│   │   ├── QSLastIntroduceCell.swift
│   │   ├── QSLastIntroduceCell.xib
│   │   └── ZSIntroducePage.swift
│   ├── NewVersion/
│   │   ├── BookShelf/
│   │   │   ├── NavigationBar.swift
│   │   │   ├── ZSBookLocalShelfViewController.swift
│   │   │   ├── ZSBookShelfHeaderView.swift
│   │   │   ├── ZSBookShelfViewController.swift
│   │   │   ├── ZSBookShelfViewModel.swift
│   │   │   ├── ZSRefreshTextHeader.swift
│   │   │   ├── ZSShelfManager.swift
│   │   │   ├── ZSShelfOperatingView.swift
│   │   │   ├── ZSShelfStorage.swift
│   │   │   ├── ZSShelfTableViewCell.swift
│   │   │   ├── ZSSyncStorage.swift
│   │   │   ├── ZSToast.swift
│   │   │   └── mjRefreshHeadTitle.plist
│   │   ├── BookStore/
│   │   │   └── ZSBookStoreViewController.swift
│   │   ├── Comment/
│   │   │   ├── ZSForumComment.swift
│   │   │   ├── ZSForumPageCell.swift
│   │   │   ├── ZSForumPageFooterView.swift
│   │   │   ├── ZSForumPageHeaderView.swift
│   │   │   ├── ZSForumPageTitleHeaderView.swift
│   │   │   ├── ZSForumPageViewController.swift
│   │   │   ├── ZSForumTextView.swift
│   │   │   ├── ZSForumToolBar.swift
│   │   │   ├── ZSForumViewModel.swift
│   │   │   ├── ZSPostReview.swift
│   │   │   ├── ZSPostReviewAuthor.swift
│   │   │   ├── ZSPostReviewBook.swift
│   │   │   └── ZSPostReviewHelpful.swift
│   │   ├── Community/
│   │   │   ├── ZSCommunityCell.swift
│   │   │   ├── ZSCommunityHot.swift
│   │   │   ├── ZSCommunityHotCell.swift
│   │   │   ├── ZSCommunityNavigationBar.swift
│   │   │   ├── ZSCommunityViewController.swift
│   │   │   ├── ZSCommunityViewModel.swift
│   │   │   ├── ZSDynamicHeaderView.swift
│   │   │   ├── ZSDynamicViewModel.swift
│   │   │   ├── ZSFollowings.swift
│   │   │   ├── ZSInsertedBookScoreView.swift
│   │   │   ├── ZSNoNetworkView.swift
│   │   │   ├── ZSNotification.swift
│   │   │   ├── ZSNotificationCell.swift
│   │   │   ├── ZSNotificationViewController.swift
│   │   │   ├── ZSNotificationViewModel.swift
│   │   │   ├── ZSRefreshFooter.swift
│   │   │   └── ZSUserDynamicViewController.swift
│   │   ├── CoreText/
│   │   │   ├── CTSettings.swift
│   │   │   ├── MarkupParser.swift
│   │   │   ├── ZSDisplayView.swift
│   │   │   └── ZSTouchAnchorView.swift
│   │   ├── Device/
│   │   │   ├── ZSFloatingManager.swift
│   │   │   ├── ZSFloatingView.swift
│   │   │   ├── ZSFloatingViewController.swift
│   │   │   ├── ZSFloatingWindow.swift
│   │   │   └── ZSMemoryFloatingView.swift
│   │   ├── Discover/
│   │   │   ├── ZSDiscoverHeaderView.swift
│   │   │   ├── ZSDiscoverItem.swift
│   │   │   ├── ZSDiscoverNavigationBar.swift
│   │   │   ├── ZSDiscoverViewController.swift
│   │   │   └── ZSSearchViewController.swift
│   │   ├── File/
│   │   │   └── EncrtptorText
│   │   ├── Mine/
│   │   │   ├── ZSAddSourceTextField.h
│   │   │   ├── ZSAddSourceTextField.m
│   │   │   ├── ZSAddSourceViewController.swift
│   │   │   ├── ZSDetailButtonCell.swift
│   │   │   ├── ZSMineHeaderView.swift
│   │   │   ├── ZSMineMenuItem.swift
│   │   │   ├── ZSMineNavigationBar.swift
│   │   │   ├── ZSMineViewController.swift
│   │   │   ├── ZSMineViewModel.swift
│   │   │   ├── ZSRegularVerifyViewController.swift
│   │   │   ├── ZSSetting.swift
│   │   │   ├── ZSSourceCell.swift
│   │   │   └── ZSSourcesViewController.swift
│   │   ├── Network/
│   │   │   └── ZSNetwork.swift
│   │   ├── Reader/
│   │   │   ├── Color.swift
│   │   │   ├── ReaderBar.swift
│   │   │   ├── ReaderNavigationBar.swift
│   │   │   ├── ThemeManager.swift
│   │   │   ├── ZSBookCache.swift
│   │   │   ├── ZSBookChapter.swift
│   │   │   ├── ZSBookDiskCache.swift
│   │   │   ├── ZSBookMemoryCache.swift
│   │   │   ├── ZSHorizonalViewController.swift
│   │   │   ├── ZSNormalViewController.swift
│   │   │   ├── ZSPageTableViewCell.swift
│   │   │   ├── ZSPageViewController.swift
│   │   │   ├── ZSReadHistory.swift
│   │   │   ├── ZSReader.swift
│   │   │   ├── ZSReaderBaseViewModel.swift
│   │   │   ├── ZSReaderBottomBar.swift
│   │   │   ├── ZSReaderBottomBigBar.swift
│   │   │   ├── ZSReaderCache.swift
│   │   │   ├── ZSReaderCatalogViewController.swift
│   │   │   ├── ZSReaderController.swift
│   │   │   ├── ZSReaderDownloader.swift
│   │   │   ├── ZSReaderStyleSelectionView.swift
│   │   │   ├── ZSReaderThemeSelectionView.swift
│   │   │   ├── ZSReaderToolbar.swift
│   │   │   ├── ZSReaderTopbar.swift
│   │   │   ├── ZSReaderTouchArea.swift
│   │   │   ├── ZSReaderVCProtocol.swift
│   │   │   └── ZSVerticalViewController.swift
│   │   ├── Search/
│   │   │   ├── AikanHtmlParser.h
│   │   │   ├── AikanHtmlParser.m
│   │   │   ├── AikanParserModel.h
│   │   │   ├── AikanParserModel.m
│   │   │   ├── AikanParserModel.swift
│   │   │   ├── ZSAikanHtmlParser.swift
│   │   │   ├── ZSBookInfoHeaderView.swift
│   │   │   ├── ZSHeaderSearch.swift
│   │   │   ├── ZSHeaderSearchCell.swift
│   │   │   ├── ZSHotWord.swift
│   │   │   ├── ZSSearchBookView.swift
│   │   │   ├── ZSSearchBookViewController.swift
│   │   │   ├── ZSSearchBookViewModel.swift
│   │   │   ├── ZSSearchHistory.swift
│   │   │   ├── ZSSearchHotView.swift
│   │   │   ├── ZSSearchHotwords.swift
│   │   │   ├── ZSSearchInfoBottomView.swift
│   │   │   ├── ZSSearchInfoTableViewCell.swift
│   │   │   ├── ZSSearchInfoViewController.swift
│   │   │   ├── ZSSearchRecommendView.swift
│   │   │   ├── ZSSearchResultCell.swift
│   │   │   ├── ZSSearchResultView.swift
│   │   │   ├── ZSSourceManager.swift
│   │   │   └── ZSTopSearchBar.swift
│   │   ├── Tabbar/
│   │   │   └── ZSTabBarController.swift
│   │   ├── ZSAPI/
│   │   │   ├── LICENSE
│   │   │   ├── ZSAPI/
│   │   │   │   └── Classes/
│   │   │   │       └── ZSAPI.swift
│   │   │   └── ZSAPI.podspec
│   │   ├── ZSAppConfig/
│   │   │   ├── LICENSE
│   │   │   ├── ZSAppConfig/
│   │   │   │   └── Classes/
│   │   │   │       ├── AppStyle.swift
│   │   │   │       ├── Config.swift
│   │   │   │       ├── Reader.swift
│   │   │   │       └── Theme.swift
│   │   │   └── ZSAppConfig.podspec
│   │   ├── ZSExtension/
│   │   │   ├── LICENSE
│   │   │   ├── ZSExtension/
│   │   │   │   └── Classes/
│   │   │   │       ├── Alamofire+ZSExtension.swift
│   │   │   │       ├── Array+ZSExtension.swift
│   │   │   │       ├── Date+Extension.swift
│   │   │   │       ├── DateIntervalFormatter+formatter.swift
│   │   │   │       ├── Dictionary+QSExtension.swift
│   │   │   │       ├── DispatchTime+Extension.swift
│   │   │   │       ├── LocalizedUtils.swift
│   │   │   │       ├── NSData+Base64.h
│   │   │   │       ├── NSData+Base64.m
│   │   │   │       ├── NSDate+Extension.h
│   │   │   │       ├── NSDate+Extension.m
│   │   │   │       ├── NSObject+Extension.swift
│   │   │   │       ├── NSString+Encode.h
│   │   │   │       ├── NSString+Encode.m
│   │   │   │       ├── Network.swift
│   │   │   │       ├── NotificationCenter+QSExtension.swift
│   │   │   │       ├── Reachability.swift
│   │   │   │       ├── SQLite+Extension.swift
│   │   │   │       ├── String+QSExtension.swift
│   │   │   │       ├── SwiftStdlib/
│   │   │   │       │   ├── FloatExtensions.swift
│   │   │   │       │   └── IntExtensions.swift
│   │   │   │       ├── UIButton+Extension.swift
│   │   │   │       ├── UICollectionView+QSExtension.swift
│   │   │   │       ├── UIColor+Theme.swift
│   │   │   │       ├── UIFont+Extension.swift
│   │   │   │       ├── UIFont+ZSExtension.h
│   │   │   │       ├── UIFont+ZSExtension.m
│   │   │   │       ├── UIImage+QSData.swift
│   │   │   │       ├── UIImageView+zhuishu.swift
│   │   │   │       ├── UILabel+zhuishu.swift
│   │   │   │       ├── UINavigationItem+BackItem.h
│   │   │   │       ├── UINavigationItem+BackItem.m
│   │   │   │       ├── UITableView+FINAutomaticHeightCell.swift
│   │   │   │       ├── UITableView+QSGeneric.swift
│   │   │   │       ├── UITableView+swizzling.swift
│   │   │   │       ├── UITableViewCell+ZSExtension.swift
│   │   │   │       ├── UIView+ScreenShot.swift
│   │   │   │       ├── UIViewController+Alert.swift
│   │   │   │       ├── Value.swift
│   │   │   │       └── ZSBaseService.swift
│   │   │   └── ZSExtension.podspec
│   │   └── ZSThirdPartSDK/
│   │       ├── LICENSE
│   │       ├── ZSThirdPartSDK/
│   │       │   └── Classes/
│   │       │       ├── TencentOpenAPI.framework/
│   │       │       │   ├── Headers/
│   │       │       │   │   ├── QQApiInterface.h
│   │       │       │   │   ├── QQApiInterfaceObject.h
│   │       │       │   │   ├── TencentOAuth.h
│   │       │       │   │   └── sdkdef.h
│   │       │       │   └── TencentOpenAPI
│   │       │       ├── ThirdPardSDK-Info.plist
│   │       │       ├── WXApiRequestHandler.h
│   │       │       ├── WXApiRequestHandler.m
│   │       │       ├── WeChatSDK1.8.3/
│   │       │       │   ├── README.txt
│   │       │       │   ├── WXApi.h
│   │       │       │   ├── WXApiObject.h
│   │       │       │   ├── WechatAuthSDK.h
│   │       │       │   └── libWeChatSDK.a
│   │       │       ├── ZSLogin.h
│   │       │       ├── ZSLogin.m
│   │       │       ├── ZSLoginHelper.h
│   │       │       ├── ZSLoginHelper.m
│   │       │       ├── ZSLoginService.swift
│   │       │       ├── ZSMobileLogin.swift
│   │       │       ├── ZSQQUser.swift
│   │       │       ├── ZSThirdLogin.h
│   │       │       ├── ZSThirdLogin.m
│   │       │       ├── ZSThirdPartSDK.h
│   │       │       ├── ZSWXAccessTokenResp.swift
│   │       │       └── libWeiboSDK/
│   │       │           ├── WBHttpRequest.h
│   │       │           ├── WeiboSDK.bundle/
│   │       │           │   └── others/
│   │       │           │       └── mfp.cer
│   │       │           ├── WeiboSDK.h
│   │       │           └── libWeiboSDK.a
│   │       └── ZSThirdPartSDK.podspec
│   ├── RightSide/
│   │   ├── Category/
│   │   │   ├── Controllers/
│   │   │   │   ├── Category/
│   │   │   │   │   └── ZSCatelogViewController.swift
│   │   │   │   └── CategoryDetail/
│   │   │   │       ├── ZSBaseSegmentItemViewController.swift
│   │   │   │       ├── ZSCategoryDetailViewController.swift
│   │   │   │       └── ZSCatelogItemViewController.swift
│   │   │   ├── Models/
│   │   │   │   ├── AddBookAPI.swift
│   │   │   │   ├── AllChapterAPI.swift
│   │   │   │   ├── BookDetailAPI.swift
│   │   │   │   ├── BookShelfAPI.swift
│   │   │   │   ├── CategoryModel.swift
│   │   │   │   ├── DynamicAPI.swift
│   │   │   │   ├── LatestChapterAPI.swift
│   │   │   │   ├── RankingAPI.swift
│   │   │   │   ├── RankingDetailAPI.swift
│   │   │   │   ├── ShelfMessageAPI.swift
│   │   │   │   ├── ZSCatelogHeaderView.swift
│   │   │   │   ├── ZSCatelogModel.swift
│   │   │   │   └── ZSCatelogParameterModel.swift
│   │   │   ├── ViewModel/
│   │   │   │   ├── ZSCatelogDetailViewModel.swift
│   │   │   │   ├── ZSCatelogViewModel.swift
│   │   │   │   └── ZSSegmentBaseViewModel.swift
│   │   │   └── Views/
│   │   │       ├── .DS_Store~876a9ee6afa162f4fb71eff5fa02f2e0dbe52ae2
│   │   │       ├── .DS_Store~HEAD
│   │   │       └── ZSCatelogCell.swift
│   │   ├── Network/
│   │   │   └── QSHotwords.swift
│   │   ├── Ranking/
│   │   │   ├── Controllers/
│   │   │   │   ├── QSRankViewController.swift
│   │   │   │   ├── RankingViewController.swift
│   │   │   │   ├── TopDetailViewController.swift
│   │   │   │   └── ZSRankViewController.swift
│   │   │   ├── Models/
│   │   │   │   └── QSRankModel.swift
│   │   │   ├── Service/
│   │   │   │   ├── ZSRankDetailWebService.swift
│   │   │   │   └── ZSRankService.swift
│   │   │   ├── ViewModel/
│   │   │   │   ├── ZSRankDetailViewModel.swift
│   │   │   │   └── ZSRankViewModel.swift
│   │   │   └── Views/
│   │   │       ├── RankingViewCell.swift
│   │   │       ├── ReadHistoryCell.swift
│   │   │       ├── ReadHistoryCell.xib
│   │   │       ├── TopDetailCell.swift
│   │   │       └── TopDetailCell.xib
│   │   ├── Search/
│   │   │   ├── Controllers/
│   │   │   │   ├── SearchDetailViewController.swift
│   │   │   │   └── SearchViewController.swift
│   │   │   ├── Models/
│   │   │   │   └── QSSearchItem.swift
│   │   │   ├── QSHistoryHeaderView.swift
│   │   │   ├── QSSearchAutoCompleteTable.swift
│   │   │   ├── QSSearchHeaderView.swift
│   │   │   ├── QSSearchInteractor.swift
│   │   │   ├── QSSearchPresenter.swift
│   │   │   ├── QSSearchProtocols.swift
│   │   │   ├── QSSearchResultTable.swift
│   │   │   ├── QSSearchRouter.swift
│   │   │   ├── QSSearchViewController+SearchBar.swift
│   │   │   ├── QSSearchViewController+Transition.swift
│   │   │   ├── QSSearchViewController.swift
│   │   │   ├── Views/
│   │   │   │   ├── QSHistoryCell.swift
│   │   │   │   ├── QSHistoryCell.swift~876a9ee6afa162f4fb71eff5fa02f2e0dbe52ae2
│   │   │   │   ├── QSHistoryCell.swift~HEAD
│   │   │   │   ├── QSHistoryCell.xib
│   │   │   │   ├── SearchView.swift
│   │   │   │   ├── ZSHistoryHeaderView.swift
│   │   │   │   ├── ZSSearchHeaderView.swift
│   │   │   │   ├── ZSSearchViewCell.swift
│   │   │   │   └── ZSSearchViewCell.xib
│   │   │   └── ZSSearchResultViewController.swift
│   │   └── Topic/
│   │       ├── Controllers/
│   │       │   ├── Filter/
│   │       │   │   └── ZSFilterThemeViewController.swift
│   │       │   ├── ThemeTopic/
│   │       │   │   ├── QSThemeTopicInteractor.swift
│   │       │   │   ├── QSThemeTopicPresenter.swift
│   │       │   │   ├── QSThemeTopicProtocols.swift
│   │       │   │   ├── QSThemeTopicRouter.swift
│   │       │   │   └── QSThemeTopicViewController.swift
│   │       │   └── TopicDetail/
│   │       │       ├── QSTopicDetailInteractor.swift
│   │       │       ├── QSTopicDetailPresenter.swift
│   │       │       ├── QSTopicDetailProtocols.swift
│   │       │       ├── QSTopicDetailRouter.swift
│   │       │       ├── QSTopicDetailViewController.swift
│   │       │       └── TopicDetailViewController.swift
│   │       ├── Models/
│   │       │   ├── ThemeTopicModel.swift
│   │       │   ├── TopicDetailHeader.swift
│   │       │   ├── TopicDetailModel.swift
│   │       │   └── ZSFilterThemeModel.swift
│   │       ├── ViewModel/
│   │       │   ├── ZSFilterThemeViewModel.swift
│   │       │   └── ZSThemeTopicViewModel.swift
│   │       └── Views/
│   │           ├── ThemeTopicCell.swift
│   │           ├── ThemeTopicCell.xib
│   │           ├── TopicDetailCell.swift
│   │           ├── TopicDetailCell.xib
│   │           ├── TopicDetailHeaderCell.swift
│   │           ├── TopicDetailHeaderCell.xib
│   │           └── ZSFilterThemeCell.swift
│   ├── Root/
│   │   ├── Controllers/
│   │   │   ├── DynamicViewController.swift
│   │   │   ├── LeftViewController.swift
│   │   │   ├── LookBookViewController.swift
│   │   │   ├── ReadHistoryViewController.swift
│   │   │   ├── RightViewController.swift
│   │   │   ├── RootViewController+FetchData.swift
│   │   │   ├── RootViewController+Subviews.swift
│   │   │   ├── RootViewController.swift
│   │   │   ├── ZSBookShelvesViewController.swift
│   │   │   ├── ZSForumViewController.swift
│   │   │   ├── ZSImportBookViewController.swift
│   │   │   ├── ZSLocalShelfViewController.swift
│   │   │   ├── ZSLoginViewController.swift
│   │   │   ├── ZSModifyNicknameViewController.swift
│   │   │   ├── ZSMyViewController.swift
│   │   │   ├── ZSRootViewController.swift
│   │   │   ├── ZSSettingViewController.swift
│   │   │   ├── ZSShelfViewController.swift
│   │   │   ├── ZSUserAccountViewController.swift
│   │   │   ├── ZSUserInfoViewController.swift
│   │   │   ├── ZSVoiceBookCategoryViewController.swift
│   │   │   ├── ZSVoiceBookSegmentViewController.swift
│   │   │   ├── ZSVoicePlayListViewController.swift
│   │   │   ├── ZSVoicePlayViewController.swift
│   │   │   ├── ZSVoicePlayerViewController.swift
│   │   │   ├── ZSVoucherViewController.swift
│   │   │   ├── ZSWebItem.swift
│   │   │   ├── ZSWebStoreViewController.swift
│   │   │   ├── ZSWebViewController.swift
│   │   │   └── ZSWebViewControllerDelegate.swift
│   │   ├── Models/
│   │   │   ├── QSHotModel.swift
│   │   │   ├── ZSAccount.swift
│   │   │   ├── ZSCoin.swift
│   │   │   ├── ZSConfigUtil.swift
│   │   │   ├── ZSQQUser.swift
│   │   │   ├── ZSShelfMessage.swift
│   │   │   ├── ZSUserBind.swift
│   │   │   ├── ZSUserBookshelf.swift
│   │   │   ├── ZSUserDetail.swift
│   │   │   ├── ZSVoiceAlbum.swift
│   │   │   ├── ZSVoucher.swift
│   │   │   ├── ZSWebBIHandler.swift
│   │   │   ├── ZSWebContext.swift
│   │   │   ├── ZSWebJumpHandler.swift
│   │   │   ├── ZSWebSpeakHandler.swift
│   │   │   ├── ZSWebToolHandler.swift
│   │   │   ├── ZSWebUserHandler.swift
│   │   │   └── ZSYJSchemeHandle.swift
│   │   ├── Service/
│   │   │   ├── ZSBaseService.swift
│   │   │   ├── ZSDiscussWebService.swift
│   │   │   ├── ZSLoginService.swift
│   │   │   ├── ZSMyService.swift
│   │   │   ├── ZSRootWebService.swift
│   │   │   └── ZSShelfWebService.swift
│   │   ├── ViewModel/
│   │   │   ├── ZSDiscussViewModel.swift
│   │   │   ├── ZSHomeViewModel.swift
│   │   │   ├── ZSLocalShelfViewModel.swift
│   │   │   ├── ZSMyViewModel.swift
│   │   │   ├── ZSProtocol.swift
│   │   │   ├── ZSRootViewModel.swift
│   │   │   ├── ZSSetting.plist
│   │   │   ├── ZSSettingViewModel.swift
│   │   │   ├── ZSShelfViewModel.swift
│   │   │   └── ZSVoicePlayViewModel.swift
│   │   └── Views/
│   │       ├── BarButton.swift
│   │       ├── DynamicCell.swift
│   │       ├── DynamicCell.xib
│   │       ├── DynamicCell.xib~876a9ee6afa162f4fb71eff5fa02f2e0dbe52ae2
│   │       ├── DynamicCell.xib~HEAD
│   │       ├── HomeListViewCell.swift
│   │       ├── QSHelpViewCell.swift
│   │       ├── QSHelpViewCell.xib
│   │       ├── QSHomeDeleteBtn.swift
│   │       ├── QSLaunchRecView.swift
│   │       ├── QSLaunchRecView.xib
│   │       ├── QSSegmentDropView.swift
│   │       ├── RightTableViewCell.swift
│   │       ├── RootNavigationView.swift
│   │       ├── SegMenu.swift
│   │       ├── SwipableCell.swift
│   │       ├── ZSLeftViewCell.swift
│   │       ├── ZSLoginVerifyView.swift
│   │       ├── ZSLoginView.swift
│   │       ├── ZSMyCell.swift
│   │       ├── ZSMyHeaderView.swift
│   │       ├── ZSReviewsCell.swift
│   │       ├── ZSReviewsCell.xib
│   │       ├── ZSSwipeCell.swift
│   │       ├── ZSThirdLoginView.swift
│   │       ├── ZSUserBindCell.swift
│   │       ├── ZSVoiceCategoryCell.swift
│   │       ├── ZSVoiceCategoryHeaderView.swift
│   │       ├── ZSVoicePlayProgressView.swift
│   │       ├── ZSVoicePlayerCatelogHeaderView.swift
│   │       ├── ZSVoicePlayerCatelogView.swift
│   │       ├── ZSVoicePlayerView.swift
│   │       ├── ZSVoiceSegmentView.swift
│   │       └── ZSVoucherView.swift
│   ├── Splash/
│   │   ├── QSSplashScreen.swift
│   │   └── SplashViewController.swift
│   ├── TXTReader/
│   │   ├── BookComment/
│   │   │   ├── Model/
│   │   │   │   └── ZSBookCTLayoutModel.swift
│   │   │   ├── Service/
│   │   │   │   ├── ZSBookCTService.swift
│   │   │   │   └── ZSBookCommentService.swift
│   │   │   ├── View/
│   │   │   │   ├── BookCommentViewController.swift
│   │   │   │   ├── QSBookCommentInteractor.swift
│   │   │   │   ├── QSBookCommentPresenter.swift
│   │   │   │   ├── QSBookCommentProtocols.swift
│   │   │   │   ├── QSBookCommentRouter.swift
│   │   │   │   ├── QSBookCommentViewController.swift
│   │   │   │   ├── TXTReader.storyboard
│   │   │   │   ├── ZSBestReviewView.swift
│   │   │   │   ├── ZSBookReviewViewController.swift
│   │   │   │   ├── ZSFeelingView.swift
│   │   │   │   ├── ZSHottwitterViewController.swift
│   │   │   │   ├── ZSReviewDetailView.swift
│   │   │   │   └── ZSWriteReview.swift
│   │   │   └── ViewModel/
│   │   │       ├── ZSBookCTViewModel.swift
│   │   │       └── ZSBookCommentViewModel.swift
│   │   ├── BookDetail/
│   │   │   ├── BookDetailViewController.swift
│   │   │   ├── Models/
│   │   │   │   ├── Book.swift
│   │   │   │   ├── BookComment.swift
│   │   │   │   ├── BookCommentDetail.swift
│   │   │   │   ├── BookDetail.swift
│   │   │   │   ├── BookShelf.json
│   │   │   │   ├── BookShelf.swift
│   │   │   │   ├── BookShelfInfo.swift
│   │   │   │   ├── ChapterInfo.json
│   │   │   │   ├── ChapterInfo.swift
│   │   │   │   ├── Chapters.json
│   │   │   │   ├── PageInfo.swift
│   │   │   │   ├── QSBook.swift
│   │   │   │   ├── QSBookList.swift
│   │   │   │   ├── QSChapter.swift
│   │   │   │   ├── QSHotComment.swift
│   │   │   │   ├── QSPage.swift
│   │   │   │   ├── QSReaderParse.swift
│   │   │   │   ├── QSReaderSetting.swift
│   │   │   │   ├── QSReaderViewFlowLayout.swift
│   │   │   │   ├── QSRecomment.swift
│   │   │   │   ├── QSRecord.swift
│   │   │   │   ├── ResourceModel.swift
│   │   │   │   ├── UpdateInfo.swift
│   │   │   │   ├── User.swift
│   │   │   │   └── ZSReadRecord.swift
│   │   │   ├── QSBookDetailInteractor.swift
│   │   │   ├── QSBookDetailPresenter.swift
│   │   │   ├── QSBookDetailProtocols.swift
│   │   │   ├── QSBookDetailRouter.swift
│   │   │   ├── QSBookDetailViewController.swift
│   │   │   ├── QSInterestedViewController.swift
│   │   │   ├── Views/
│   │   │   │   ├── .DS_Store~876a9ee6afa162f4fb71eff5fa02f2e0dbe52ae2
│   │   │   │   ├── .DS_Store~HEAD
│   │   │   │   ├── BookCommentCell.swift
│   │   │   │   ├── BookCommentCell.xib
│   │   │   │   ├── BookCommentViewCell.swift
│   │   │   │   ├── BookCommentViewCell.xib
│   │   │   │   ├── BookDetailHeader.swift
│   │   │   │   ├── BookDetailHeader.xib
│   │   │   │   ├── CategoryButton.swift
│   │   │   │   ├── CategoryTableViewCell.swift
│   │   │   │   ├── CategoryTableViewCell.xib
│   │   │   │   ├── ChangeSourceCell.swift
│   │   │   │   ├── ChangeSourceCell.xib
│   │   │   │   ├── HotCommentCell.swift
│   │   │   │   ├── HotCommentCell.xib
│   │   │   │   ├── PageView.swift
│   │   │   │   ├── ProgressView.swift
│   │   │   │   ├── QSBatteryView.swift
│   │   │   │   ├── QSBookDetailContentView.swift
│   │   │   │   ├── QSBookDetailRateView.swift
│   │   │   │   ├── QSBookDetailTagsView.swift
│   │   │   │   ├── QSBookListViewCell.swift
│   │   │   │   ├── QSBookListViewCell.xib
│   │   │   │   ├── QSDiscussCell.swift
│   │   │   │   ├── QSDiscussCell.xib
│   │   │   │   ├── QSRecommendCell.swift
│   │   │   │   ├── QSRecommendCell.xib
│   │   │   │   ├── ToolBar.swift
│   │   │   │   ├── UserfulCell.swift
│   │   │   │   └── UserfulCell.xib
│   │   │   ├── ZSDetailInfoCell.swift
│   │   │   ├── ZSDetailSection.swift
│   │   │   └── ZSDetailViewController.swift
│   │   ├── Category/
│   │   │   ├── CategoryController.swift
│   │   │   ├── CategoryViewController.swift
│   │   │   ├── ChangeSourceViewController.swift
│   │   │   ├── QSCategoryInteractor.swift
│   │   │   ├── QSCategoryPresenter.swift
│   │   │   ├── QSCategoryProtocols.swift
│   │   │   ├── QSCategoryReaderViewController.swift
│   │   │   └── QSCategoryRouter.swift
│   │   ├── Community/
│   │   │   ├── QSCommunityInteractor.swift
│   │   │   ├── QSCommunityPresenter.swift
│   │   │   ├── QSCommunityProtocols.swift
│   │   │   ├── QSCommunityRouter.swift
│   │   │   └── QSCommunityViewController.swift
│   │   ├── Reader/
│   │   │   ├── Model/
│   │   │   │   ├── MonitorFileChangeHelp.h
│   │   │   │   ├── MonitorFileChangeHelp.m
│   │   │   │   ├── ZSBoughtInfo.swift
│   │   │   │   ├── ZSChapterBody.swift
│   │   │   │   ├── ZSChapterInfo.swift
│   │   │   │   ├── ZSChapterSelectModel.swift
│   │   │   │   ├── ZSHTTPConnection.h
│   │   │   │   ├── ZSHTTPConnection.m
│   │   │   │   ├── ZSHTTPTool.h
│   │   │   │   ├── ZSHTTPTool.m
│   │   │   │   ├── ZSReaderProtocol.swift
│   │   │   │   └── web/
│   │   │   │       ├── index.html
│   │   │   │       ├── s.css
│   │   │   │       └── upload.html
│   │   │   ├── PageViewController.swift
│   │   │   ├── QSMoreSettingController.swift
│   │   │   ├── QSReaderBackgroundViewController.swift
│   │   │   ├── QSReaderViewController.swift
│   │   │   ├── QSTextProtocols.swift
│   │   │   ├── QSTextReaderController.swift
│   │   │   ├── QSTextRouter.swift
│   │   │   ├── Service/
│   │   │   │   ├── ZSFontService.swift
│   │   │   │   ├── ZSReaderManager.swift
│   │   │   │   └── ZSReaderWebService.swift
│   │   │   ├── TXTReaderViewController.swift
│   │   │   ├── View/
│   │   │   │   ├── ZSChapterPayView.swift
│   │   │   │   ├── ZSChapterSelectView.swift
│   │   │   │   ├── ZSFontViewController.swift
│   │   │   │   ├── ZSHorizonalMoveCell.swift
│   │   │   │   ├── ZSHorizonalMoveViewController.swift
│   │   │   │   ├── ZSMultiplePayView.swift
│   │   │   │   ├── ZSNoneAnimationViewController.swift
│   │   │   │   ├── ZSReaderBaseViewController.swift
│   │   │   │   └── ZSReaderViewController.swift
│   │   │   ├── ViewModel/
│   │   │   │   ├── ZSBookBoughtViewModel.swift
│   │   │   │   ├── ZSFontViewModel.swift
│   │   │   │   ├── ZSReaderViewModel+Bought.swift
│   │   │   │   └── ZSReaderViewModel.swift
│   │   │   ├── ZSSpeakerCell.swift
│   │   │   └── ZSSpeakerViewController.swift
│   │   └── Speech/
│   │       ├── Model/
│   │       │   ├── Network.swift
│   │       │   ├── Speaker.swift
│   │       │   ├── TTSConfig.swift
│   │       │   ├── TTSResource/
│   │       │   │   ├── common.jet
│   │       │   │   ├── speakers.plist
│   │       │   │   └── xiaoyan.jet
│   │       │   ├── VoiceBook.swift
│   │       │   ├── iflyMSC.framework/
│   │       │   │   ├── Headers/
│   │       │   │   │   ├── IFlyAudioSession.h
│   │       │   │   │   ├── IFlyDataUploader.h
│   │       │   │   │   ├── IFlyDebugLog.h
│   │       │   │   │   ├── IFlyISVDelegate.h
│   │       │   │   │   ├── IFlyISVRecognizer.h
│   │       │   │   │   ├── IFlyMSC.h
│   │       │   │   │   ├── IFlyPcmRecorder.h
│   │       │   │   │   ├── IFlyRecognizerView.h
│   │       │   │   │   ├── IFlyRecognizerViewDelegate.h
│   │       │   │   │   ├── IFlyResourceUtil.h
│   │       │   │   │   ├── IFlySetting.h
│   │       │   │   │   ├── IFlySpeechConstant.h
│   │       │   │   │   ├── IFlySpeechError.h
│   │       │   │   │   ├── IFlySpeechEvaluator.h
│   │       │   │   │   ├── IFlySpeechEvaluatorDelegate.h
│   │       │   │   │   ├── IFlySpeechEvent.h
│   │       │   │   │   ├── IFlySpeechRecognizer.h
│   │       │   │   │   ├── IFlySpeechRecognizerDelegate.h
│   │       │   │   │   ├── IFlySpeechSynthesizer.h
│   │       │   │   │   ├── IFlySpeechSynthesizerDelegate.h
│   │       │   │   │   ├── IFlySpeechUtility.h
│   │       │   │   │   ├── IFlyUserWords.h
│   │       │   │   │   ├── IFlyVoiceWakeuper.h
│   │       │   │   │   └── IFlyVoiceWakeuperDelegate.h
│   │       │   │   └── iflyMSC
│   │       │   ├── pcmPlayerCode/
│   │       │   │   ├── PcmPlayer.h
│   │       │   │   ├── PcmPlayer.m
│   │       │   │   └── PcmPlayerDelegate.h
│   │       │   ├── speaker.json
│   │       │   └── speakers.plist
│   │       └── View/
│   │           ├── AKPickerView.h
│   │           ├── AKPickerView.m
│   │           └── ZSSpeechView.swift
│   ├── Vendor/
│   │   ├── CTDisplayText/
│   │   │   └── Source/
│   │   │       ├── CTDisplayText.h
│   │   │       ├── CTFrameParser.h
│   │   │       ├── CTFrameParser.m
│   │   │       ├── CTFrameParserConfig.h
│   │   │       ├── CTFrameParserConfig.m
│   │   │       ├── CoreTextData.h
│   │   │       ├── CoreTextData.m
│   │   │       ├── CoreTextImageData.h
│   │   │       ├── CoreTextImageData.m
│   │   │       ├── CoreTextLinkData.h
│   │   │       ├── CoreTextLinkData.m
│   │   │       ├── CoreTextUtils.h
│   │   │       ├── CoreTextUtils.m
│   │   │       ├── RegexKitLite.h
│   │   │       ├── RegexKitLite.m
│   │   │       └── Views/
│   │   │           ├── CTDisplayView.h
│   │   │           ├── CTDisplayView.m
│   │   │           ├── MagnifiterView.h
│   │   │           ├── MagnifiterView.m
│   │   │           ├── UIView+frameAdjust.h
│   │   │           └── UIView+frameAdjust.m
│   │   ├── CocoaHTTPServer/
│   │   │   ├── Core/
│   │   │   │   ├── Categories/
│   │   │   │   │   ├── DDData.h
│   │   │   │   │   ├── DDData.m
│   │   │   │   │   ├── DDNumber.h
│   │   │   │   │   ├── DDNumber.m
│   │   │   │   │   ├── DDRange.h
│   │   │   │   │   └── DDRange.m
│   │   │   │   ├── HTTPAuthenticationRequest.h
│   │   │   │   ├── HTTPAuthenticationRequest.m
│   │   │   │   ├── HTTPConnection.h
│   │   │   │   ├── HTTPConnection.m
│   │   │   │   ├── HTTPLogging.h
│   │   │   │   ├── HTTPMessage.h
│   │   │   │   ├── HTTPMessage.m
│   │   │   │   ├── HTTPResponse.h
│   │   │   │   ├── HTTPServer.h
│   │   │   │   ├── HTTPServer.m
│   │   │   │   ├── Mime/
│   │   │   │   │   ├── MultipartFormDataParser.h
│   │   │   │   │   ├── MultipartFormDataParser.m
│   │   │   │   │   ├── MultipartMessageHeader.h
│   │   │   │   │   ├── MultipartMessageHeader.m
│   │   │   │   │   ├── MultipartMessageHeaderField.h
│   │   │   │   │   └── MultipartMessageHeaderField.m
│   │   │   │   ├── Responses/
│   │   │   │   │   ├── HTTPAsyncFileResponse.h
│   │   │   │   │   ├── HTTPAsyncFileResponse.m
│   │   │   │   │   ├── HTTPDataResponse.h
│   │   │   │   │   ├── HTTPDataResponse.m
│   │   │   │   │   ├── HTTPDynamicFileResponse.h
│   │   │   │   │   ├── HTTPDynamicFileResponse.m
│   │   │   │   │   ├── HTTPFileResponse.h
│   │   │   │   │   ├── HTTPFileResponse.m
│   │   │   │   │   ├── HTTPRedirectResponse.h
│   │   │   │   │   └── HTTPRedirectResponse.m
│   │   │   │   ├── WebSocket.h
│   │   │   │   └── WebSocket.m
│   │   │   ├── Extensions/
│   │   │   │   └── WebDAV/
│   │   │   │       ├── DAVConnection.h
│   │   │   │       ├── DAVConnection.m
│   │   │   │       ├── DAVResponse.h
│   │   │   │       ├── DAVResponse.m
│   │   │   │       ├── DELETEResponse.h
│   │   │   │       ├── DELETEResponse.m
│   │   │   │       ├── PUTResponse.h
│   │   │   │       └── PUTResponse.m
│   │   │   ├── LICENSE.txt
│   │   │   └── README.markdown
│   │   ├── M80AttributedLabel/
│   │   │   ├── M80AttributedLabel.h
│   │   │   ├── M80AttributedLabel.m
│   │   │   ├── M80AttributedLabelAttachment.h
│   │   │   ├── M80AttributedLabelAttachment.m
│   │   │   ├── M80AttributedLabelDefines.h
│   │   │   ├── M80AttributedLabelURL.h
│   │   │   ├── M80AttributedLabelURL.m
│   │   │   ├── NSMutableAttributedString+M80.h
│   │   │   └── NSMutableAttributedString+M80.m
│   │   ├── OCGumbo/
│   │   │   ├── OCGumbo+Query.h
│   │   │   ├── OCGumbo+Query.m
│   │   │   ├── OCGumbo.h
│   │   │   ├── OCGumbo.m
│   │   │   └── gumbo/
│   │   │       ├── attribute.c
│   │   │       ├── attribute.h
│   │   │       ├── char_ref.c
│   │   │       ├── char_ref.h
│   │   │       ├── char_ref.rl
│   │   │       ├── error.c
│   │   │       ├── error.h
│   │   │       ├── gumbo.h
│   │   │       ├── insertion_mode.h
│   │   │       ├── parser.c
│   │   │       ├── parser.h
│   │   │       ├── string_buffer.c
│   │   │       ├── string_buffer.h
│   │   │       ├── string_piece.c
│   │   │       ├── string_piece.h
│   │   │       ├── tag.c
│   │   │       ├── tag.in
│   │   │       ├── tag_enum.h
│   │   │       ├── tag_gperf.h
│   │   │       ├── tag_sizes.h
│   │   │       ├── tag_strings.h
│   │   │       ├── token_type.h
│   │   │       ├── tokenizer.c
│   │   │       ├── tokenizer.h
│   │   │       ├── tokenizer_states.h
│   │   │       ├── utf8.c
│   │   │       ├── utf8.h
│   │   │       ├── util.c
│   │   │       ├── util.h
│   │   │       ├── vector.c
│   │   │       └── vector.h
│   │   ├── PullToRefresh/
│   │   │   └── QSPullToRefresh/
│   │   │       ├── QSPullToRefresh/
│   │   │       │   ├── DefaultRefreshView.swift
│   │   │       │   ├── DefaultViewAnimator.swift
│   │   │       │   ├── Info.plist
│   │   │       │   ├── PullToRefresh.swift
│   │   │       │   ├── QSPullToRefresh.h
│   │   │       │   ├── RefreshViewAnimator.swift
│   │   │       │   ├── State.swift
│   │   │       │   └── UIScrollView+PullToRefresh.swift
│   │   │       ├── QSPullToRefresh.xcodeproj/
│   │   │       │   ├── project.pbxproj
│   │   │       │   └── project.xcworkspace/
│   │   │       │       └── contents.xcworkspacedata
│   │   │       └── QSPullToRefreshTests/
│   │   │           ├── Info.plist
│   │   │           └── QSPullToRefreshTests.swift
│   │   ├── ThirdLoginSDK/
│   │   │   └── TencentOpenAPI.framework/
│   │   │       ├── Headers/
│   │   │       │   ├── QQApiInterface.h
│   │   │       │   ├── QQApiInterfaceObject.h
│   │   │       │   ├── TencentOAuth.h
│   │   │       │   └── sdkdef.h
│   │   │       └── TencentOpenAPI
│   │   ├── XimalayaSDK_iOS_5.5.1/
│   │   │   ├── include/
│   │   │   │   ├── Authorization/
│   │   │   │   │   └── XMLYAuthorize.h
│   │   │   │   ├── Downloader/
│   │   │   │   │   └── XMSDKDownloadManager.h
│   │   │   │   ├── FMDB/
│   │   │   │   │   ├── FMDatabase.h
│   │   │   │   │   ├── FMDatabase.m
│   │   │   │   │   ├── FMDatabaseAdditions.h
│   │   │   │   │   ├── FMDatabaseAdditions.m
│   │   │   │   │   ├── FMDatabasePool.h
│   │   │   │   │   ├── FMDatabasePool.m
│   │   │   │   │   ├── FMDatabaseQueue.h
│   │   │   │   │   ├── FMDatabaseQueue.m
│   │   │   │   │   ├── FMResultSet.h
│   │   │   │   │   └── FMResultSet.m
│   │   │   │   ├── MBProgressHUD/
│   │   │   │   │   ├── MBProgressHUD.h
│   │   │   │   │   └── MBProgressHUD.m
│   │   │   │   ├── Model/
│   │   │   │   │   ├── XMAlbum.h
│   │   │   │   │   ├── XMAlbumColumn.h
│   │   │   │   │   ├── XMAlbumColumnItem.h
│   │   │   │   │   ├── XMAlbumGuessLike.h
│   │   │   │   │   ├── XMAnnouncer.h
│   │   │   │   │   ├── XMAnnouncerCategory.h
│   │   │   │   │   ├── XMAttribute.h
│   │   │   │   │   ├── XMBanner.h
│   │   │   │   │   ├── XMCacheTrack.h
│   │   │   │   │   ├── XMCategory.h
│   │   │   │   │   ├── XMCategoryHumanRecommend.h
│   │   │   │   │   ├── XMColdbootDetail.h
│   │   │   │   │   ├── XMColdbootTag.h
│   │   │   │   │   ├── XMColumn.h
│   │   │   │   │   ├── XMColumnDetail.h
│   │   │   │   │   ├── XMColumnEditor.h
│   │   │   │   │   ├── XMColumnList.h
│   │   │   │   │   ├── XMDimension.h
│   │   │   │   │   ├── XMErrorModel.h
│   │   │   │   │   ├── XMHotTrack.h
│   │   │   │   │   ├── XMHotword.h
│   │   │   │   │   ├── XMIndexRankItem.h
│   │   │   │   │   ├── XMLastUptrack.h
│   │   │   │   │   ├── XMLiveAnnouncer.h
│   │   │   │   │   ├── XMLiveCity.h
│   │   │   │   │   ├── XMMetadata.h
│   │   │   │   │   ├── XMProvince.h
│   │   │   │   │   ├── XMRadio.h
│   │   │   │   │   ├── XMRadioSchedule.h
│   │   │   │   │   ├── XMRankSectionList.h
│   │   │   │   │   ├── XMRelatedProgram.h
│   │   │   │   │   ├── XMSubordinatedAlbum.h
│   │   │   │   │   ├── XMTag.h
│   │   │   │   │   ├── XMTrack.h
│   │   │   │   │   ├── XMTrackColumn.h
│   │   │   │   │   ├── XMTrackColumnItem.h
│   │   │   │   │   └── XMTrackDownloadStatus.h
│   │   │   │   ├── Player/
│   │   │   │   │   ├── XMADAudioPlayer.h
│   │   │   │   │   ├── XMSDKPlayer.h
│   │   │   │   │   └── XMSDKPlayerDataCollector.h
│   │   │   │   ├── Request/
│   │   │   │   │   └── XMReqMgr.h
│   │   │   │   └── Utility/
│   │   │   │       ├── XMSDK.h
│   │   │   │       ├── XMSDKInfo.h
│   │   │   │       └── XMSingleTone.h
│   │   │   └── libXMOpenPlatform.a
│   │   ├── YTK/
│   │   │   ├── YTKKeyValueStore.h
│   │   │   └── YTKKeyValueStore.m
│   │   └── uchardet/
│   │       ├── libuchardet-ios.a
│   │       └── uchardet.h
│   ├── ViewController.swift
│   └── zhuishushenqi-Bridge-Header.h
├── zhuishushenqi.xcodeproj/
│   ├── project.pbxproj
│   ├── project.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       └── zhuishushenqi.xcscmblueprint
│   └── xcshareddata/
│       └── xcschemes/
│           └── zhuishushenqi.xcscheme
├── zhuishushenqi.xcworkspace/
│   ├── contents.xcworkspacedata
│   └── xcshareddata/
│       └── IDEWorkspaceChecks.plist
├── zhuishushenqiTests/
│   ├── Info.plist
│   └── zhuishushenqiTests.swift
└── zhuishushenqiUITests/
    ├── Info.plist
    └── zhuishushenqiUITests.swift
Download .txt
SYMBOL INDEX (477 symbols across 65 files)

FILE: zhuishushenqi/App/FBEncryptorAES.h
  function interface (line 16) | interface FBEncryptorAES : NSObject {

FILE: zhuishushenqi/Base/Views/UIScrollView+StateView.h
  type ZSTableViewStatus (line 11) | typedef enum : NSUInteger {

FILE: zhuishushenqi/NewVersion/ZSThirdPartSDK/ZSThirdPartSDK/Classes/TencentOpenAPI.framework/Headers/QQApiInterfaceObject.h
  type QQApiSendResultCode (line 15) | typedef enum
  type ShareDestType (line 54) | typedef enum ShareDestType {
  type QQApiURLTargetType (line 116) | enum QQApiURLTargetType{
  type QQApiInterfaceReqType (line 463) | enum QQApiInterfaceReqType
  type QQApiInterfaceRespType (line 474) | enum QQApiInterfaceRespType

FILE: zhuishushenqi/NewVersion/ZSThirdPartSDK/ZSThirdPartSDK/Classes/TencentOpenAPI.framework/Headers/TencentOAuth.h
  type TencentAuthorizeState (line 20) | typedef enum
  type TencentAuthMode (line 27) | typedef enum
  function interface (line 40) | interface TencentOAuth : NSObject

FILE: zhuishushenqi/NewVersion/ZSThirdPartSDK/ZSThirdPartSDK/Classes/TencentOpenAPI.framework/Headers/sdkdef.h
  type TCOLogLevel (line 15) | typedef enum {
  type QQVersion (line 26) | typedef enum QQVersion
  type TIMVersion (line 41) | typedef enum TIMVersion {
  type TencentAuthShareType (line 49) | typedef enum TencentAuthShareType {
  type REPONSE_RESULT (line 57) | typedef enum
  type UpdateFailType (line 71) | typedef enum
  function interface (line 83) | interface APIResponse : NSObject<NSCoding> {
  type OpenSDKError (line 279) | typedef enum
  type NSString (line 379) | typedef NSString *TCOptionalStr;
  type id (line 381) | typedef id TCRequiredId;

FILE: zhuishushenqi/NewVersion/ZSThirdPartSDK/ZSThirdPartSDK/Classes/WeChatSDK1.8.3/WXApiObject.h
  type WXErrCode (line 14) | enum  WXErrCode {
  type WXScene (line 28) | enum WXScene {
  type WXAPISupport (line 36) | enum WXAPISupport {
  type WXBizProfileType (line 45) | enum WXBizProfileType{
  type WXMPWebviewType (line 62) | enum WXMPWebviewType {

FILE: zhuishushenqi/NewVersion/ZSThirdPartSDK/ZSThirdPartSDK/Classes/WeChatSDK1.8.3/WechatAuthSDK.h
  type AuthErrCode (line 12) | enum  AuthErrCode {

FILE: zhuishushenqi/TXTReader/Reader/Model/ZSHTTPConnection.h
  function interface (line 14) | interface ZSHTTPConnection : HTTPConnection{

FILE: zhuishushenqi/TXTReader/Speech/Model/iflyMSC.framework/Headers/IFlyISVRecognizer.h
  function interface (line 16) | interface IFlyISVRecognizer : NSObject

FILE: zhuishushenqi/Vendor/CTDisplayText/Source/RegexKitLite.h
  type NSInteger (line 89) | typedef long           NSInteger;
  type NSUInteger (line 90) | typedef unsigned long  NSUInteger;
  type NSInteger (line 95) | typedef int            NSInteger;
  type NSUInteger (line 96) | typedef unsigned int   NSUInteger;
  type RKLRegexOptions (line 115) | typedef uint32_t RKLRegexOptions;
  type NSUInteger (line 128) | typedef NSUInteger RKLRegexEnumerationOptions;

FILE: zhuishushenqi/Vendor/CocoaHTTPServer/Core/Categories/DDRange.h
  type DDRange (line 16) | typedef struct _DDRange {
  type DDRange (line 21) | typedef DDRange *DDRangePointer;
  function NS_INLINE (line 23) | NS_INLINE DDRange DDMakeRange(UInt64 loc, UInt64 len) {
  function NS_INLINE (line 30) | NS_INLINE UInt64 DDMaxRange(DDRange range) {
  function NS_INLINE (line 34) | NS_INLINE BOOL DDLocationInRange(UInt64 loc, DDRange range) {
  function NS_INLINE (line 38) | NS_INLINE BOOL DDEqualRanges(DDRange range1, DDRange range2) {

FILE: zhuishushenqi/Vendor/CocoaHTTPServer/Core/HTTPAuthenticationRequest.h
  function interface (line 11) | interface HTTPAuthenticationRequest : NSObject

FILE: zhuishushenqi/Vendor/CocoaHTTPServer/Core/HTTPConnection.h
  function interface (line 16) | interface HTTPConfig : NSObject
  function interface (line 36) | interface HTTPConnection : NSObject

FILE: zhuishushenqi/Vendor/CocoaHTTPServer/Core/HTTPMessage.h
  function interface (line 16) | interface HTTPMessage : NSObject

FILE: zhuishushenqi/Vendor/CocoaHTTPServer/Core/HTTPServer.h
  function interface (line 21) | interface HTTPServer : NSObject IMPLEMENTED_PROTOCOLS

FILE: zhuishushenqi/Vendor/CocoaHTTPServer/Core/Mime/MultipartMessageHeader.h
  function interface (line 24) | interface MultipartMessageHeader : NSObject {

FILE: zhuishushenqi/Vendor/CocoaHTTPServer/Core/Mime/MultipartMessageHeaderField.h
  function interface (line 8) | interface MultipartMessageHeaderField : NSObject {

FILE: zhuishushenqi/Vendor/CocoaHTTPServer/Core/Responses/HTTPAsyncFileResponse.h
  function interface (line 14) | interface HTTPAsyncFileResponse : NSObject <HTTPResponse>

FILE: zhuishushenqi/Vendor/CocoaHTTPServer/Core/Responses/HTTPDataResponse.h
  function interface (line 5) | interface HTTPDataResponse : NSObject <HTTPResponse>

FILE: zhuishushenqi/Vendor/CocoaHTTPServer/Core/Responses/HTTPDynamicFileResponse.h
  function interface (line 41) | interface HTTPDynamicFileResponse : HTTPAsyncFileResponse

FILE: zhuishushenqi/Vendor/CocoaHTTPServer/Core/Responses/HTTPFileResponse.h
  function interface (line 7) | interface HTTPFileResponse : NSObject <HTTPResponse>

FILE: zhuishushenqi/Vendor/CocoaHTTPServer/Core/Responses/HTTPRedirectResponse.h
  function interface (line 5) | interface HTTPRedirectResponse : NSObject <HTTPResponse>

FILE: zhuishushenqi/Vendor/CocoaHTTPServer/Core/WebSocket.h
  function interface (line 9) | interface WebSocket : NSObject

FILE: zhuishushenqi/Vendor/CocoaHTTPServer/Extensions/WebDAV/DAVConnection.h
  function interface (line 3) | interface DAVConnection : HTTPConnection {

FILE: zhuishushenqi/Vendor/CocoaHTTPServer/Extensions/WebDAV/DAVResponse.h
  function interface (line 3) | interface DAVResponse : NSObject <HTTPResponse> {

FILE: zhuishushenqi/Vendor/CocoaHTTPServer/Extensions/WebDAV/DELETEResponse.h
  function interface (line 3) | interface DELETEResponse : NSObject <HTTPResponse> {

FILE: zhuishushenqi/Vendor/CocoaHTTPServer/Extensions/WebDAV/PUTResponse.h
  function interface (line 3) | interface PUTResponse : NSObject <HTTPResponse> {

FILE: zhuishushenqi/Vendor/OCGumbo/OCGumbo+Query.h
  type OCQueryObject (line 18) | typedef OCQueryObject * (^OCGumboQueryBlockAS) (NSString *);
  type NSString (line 19) | typedef NSString *      (^OCGumboQueryBlockSS) (NSString *);
  type NSString (line 20) | typedef NSString *      (^OCGumboQueryBlockSV) (void);

FILE: zhuishushenqi/Vendor/OCGumbo/OCGumbo.h
  function interface (line 28) | interface OCGumboNode : NSObject {

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/attribute.c
  type GumboInternalParser (line 26) | struct GumboInternalParser
  function GumboAttribute (line 28) | GumboAttribute* gumbo_get_attribute(
  function gumbo_destroy_attribute (line 39) | void gumbo_destroy_attribute(

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/attribute.h
  type GumboInternalParser (line 26) | struct GumboInternalParser
  type GumboInternalParser (line 31) | struct GumboInternalParser

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/char_ref.c
  type GumboInternalParser (line 40) | struct GumboInternalParser
  type CharReplacement (line 47) | typedef struct {
  function parse_digit (line 65) | static int parse_digit(int c, bool allow_hex) {
  function add_no_digit_error (line 78) | static void add_no_digit_error(
  function add_codepoint_error (line 88) | static void add_codepoint_error(struct GumboInternalParser* parser,
  function add_named_reference_error (line 99) | static void add_named_reference_error(struct GumboInternalParser* parser,
  function maybe_replace_codepoint (line 110) | static int maybe_replace_codepoint(int codepoint) {
  function consume_numeric_ref (line 119) | static bool consume_numeric_ref(
  function maybe_add_invalid_named_reference (line 180) | static bool maybe_add_invalid_named_reference(
  function consume_named_ref (line 13940) | static bool consume_named_ref(struct GumboInternalParser* parser,
  function consume_char_ref (line 23041) | bool consume_char_ref(struct GumboInternalParser* parser,

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/char_ref.h
  type GumboInternalParser (line 30) | struct GumboInternalParser
  type GumboInternalUtf8Iterator (line 31) | struct GumboInternalUtf8Iterator
  type OneOrTwoCodepoints (line 41) | typedef struct {
  type GumboInternalParser (line 52) | struct GumboInternalParser
  type GumboInternalUtf8Iterator (line 53) | struct GumboInternalUtf8Iterator

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/error.c
  function print_message (line 33) | static int print_message(
  function print_tag_stack (line 75) | static void print_tag_stack(GumboParser* parser, const GumboParserError*...
  function handle_parser_error (line 88) | static void handle_parser_error(GumboParser* parser,
  function GumboError (line 157) | GumboError* gumbo_add_error(GumboParser* parser) {
  function gumbo_error_to_string (line 167) | void gumbo_error_to_string(
  function gumbo_caret_diagnostic_to_string (line 228) | void gumbo_caret_diagnostic_to_string(GumboParser* parser,
  function gumbo_print_caret_diagnostic (line 251) | void gumbo_print_caret_diagnostic(
  function gumbo_error_destroy (line 260) | void gumbo_error_destroy(GumboParser* parser, GumboError* error) {
  function gumbo_init_errors (line 270) | void gumbo_init_errors(GumboParser* parser) {
  function gumbo_destroy_errors (line 274) | void gumbo_destroy_errors(GumboParser* parser) {

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/error.h
  type GumboInternalParser (line 35) | struct GumboInternalParser
  type GumboErrorType (line 37) | typedef enum {
  type GumboDuplicateAttrError (line 83) | typedef struct GumboInternalDuplicateAttrError {
  type GumboTokenizerErrorState (line 99) | typedef enum {
  type GumboTokenizerError (line 119) | typedef struct GumboInternalTokenizerError {
  type GumboParserError (line 128) | typedef struct GumboInternalParserError {
  type GumboError (line 147) | typedef struct GumboInternalError {
  type GumboInternalParser (line 188) | struct GumboInternalParser
  type GumboInternalParser (line 191) | struct GumboInternalParser
  type GumboInternalParser (line 194) | struct GumboInternalParser
  type GumboInternalParser (line 197) | struct GumboInternalParser
  type GumboInternalParser (line 204) | struct GumboInternalParser
  type GumboInternalParser (line 212) | struct GumboInternalParser
  type GumboInternalParser (line 218) | struct GumboInternalParser

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/gumbo.h
  type GumboSourcePosition (line 67) | typedef struct {
  type GumboStringPiece (line 88) | typedef struct {
  type GumboVector (line 122) | typedef struct {
  type GumboTag (line 156) | typedef enum {
  type GumboAttributeNamespaceEnum (line 212) | typedef enum {
  type GumboAttribute (line 224) | typedef struct {
  type GumboNodeType (line 291) | typedef enum {
  type GumboNode (line 316) | typedef struct GumboInternalNode GumboNode;
  type GumboQuirksModeEnum (line 321) | typedef enum {
  type GumboNamespaceEnum (line 334) | typedef enum {
  type GumboParseFlags (line 348) | typedef enum {
  type GumboDocument (line 421) | typedef struct {
  type GumboText (line 448) | typedef struct {
  type GumboElement (line 472) | typedef struct {
  type GumboInternalNode (line 517) | struct GumboInternalNode {
  type GumboOptions (line 563) | typedef struct GumboInternalOptions {
  type GumboOutput (line 625) | typedef struct GumboInternalOutput {

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/insertion_mode.h
  type GumboInsertionMode (line 27) | typedef enum {

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/parser.c
  function free_wrapper (line 60) | static void free_wrapper(void* unused, void* ptr) { free(ptr); }
  type ReplacementEntry (line 172) | typedef struct _ReplacementEntry {
  type NamespacedAttributeReplacement (line 286) | typedef struct _NamespacedAttributeReplacement {
  type TextNodeBufferState (line 322) | typedef struct _TextNodeBufferState {
  type GumboParserState (line 340) | typedef struct GumboInternalParserState {
  function token_has_attribute (line 403) | static bool token_has_attribute(const GumboToken* token, const char* nam...
  function attribute_matches (line 410) | static bool attribute_matches(
  function attribute_matches_case_sensitive (line 418) | static bool attribute_matches_case_sensitive(
  function all_attributes_match (line 425) | static bool all_attributes_match(
  function set_frameset_not_ok (line 439) | static void set_frameset_not_ok(GumboParser* parser) {
  function GumboNode (line 444) | static GumboNode* create_node(GumboParser* parser, GumboNodeType type) {
  function GumboNode (line 453) | static GumboNode* new_document_node(GumboParser* parser) {
  function output_init (line 468) | static void output_init(GumboParser* parser) {
  function parser_state_init (line 476) | static void parser_state_init(GumboParser* parser) {
  function parser_state_destroy (line 498) | static void parser_state_destroy(GumboParser* parser) {
  function GumboNode (line 510) | static GumboNode* get_document_node(GumboParser* parser) {
  function is_fragment_parser (line 514) | static bool is_fragment_parser(const GumboParser* parser) {
  function GumboNode (line 520) | static GumboNode* get_current_node(GumboParser* parser) {
  function GumboNode (line 531) | static GumboNode* get_adjusted_current_node(GumboParser* parser) {
  function is_in_static_list (line 544) | static bool is_in_static_list(
  function set_insertion_mode (line 555) | static void set_insertion_mode(GumboParser* parser, GumboInsertionMode m...
  function GumboInsertionMode (line 564) | static GumboInsertionMode get_appropriate_insertion_mode(
  function reset_insertion_mode_appropriately (line 631) | static void reset_insertion_mode_appropriately(GumboParser* parser) {
  function GumboError (line 645) | static GumboError* parser_add_parse_error(
  function tag_in (line 681) | static bool tag_in(
  function tag_is (line 695) | static bool tag_is(const GumboToken* token, bool is_start, GumboTag tag) {
  function node_tag_in_set (line 706) | static bool node_tag_in_set(const GumboNode* node, const gumbo_tagset ta...
  function node_qualified_tag_is (line 716) | static bool node_qualified_tag_is(
  function node_html_tag_is (line 725) | static bool node_html_tag_is(const GumboNode* node, GumboTag tag) {
  function push_template_insertion_mode (line 729) | static void push_template_insertion_mode(
  function pop_template_insertion_mode (line 735) | static void pop_template_insertion_mode(GumboParser* parser) {
  function GumboInsertionMode (line 741) | static GumboInsertionMode get_current_template_insertion_mode(
  function is_mathml_integration_point (line 753) | static bool is_mathml_integration_point(const GumboNode* node) {
  function is_html_integration_point (line 760) | static bool is_html_integration_point(const GumboNode* node) {
  type InsertionLocation (line 774) | typedef struct {
  function InsertionLocation (line 779) | InsertionLocation get_appropriate_insertion_location(
  function append_node (line 829) | static void append_node(
  function insert_node (line 850) | static void insert_node(
  function maybe_flush_text_node_buffer (line 884) | static void maybe_flush_text_node_buffer(GumboParser* parser) {
  function record_end_of_element (line 921) | static void record_end_of_element(
  function GumboNode (line 929) | static GumboNode* pop_current_node(GumboParser* parser) {
  function append_comment_node (line 960) | static void append_comment_node(
  function clear_stack_to_table_row_context (line 973) | static void clear_stack_to_table_row_context(GumboParser* parser) {
  function clear_stack_to_table_context (line 981) | static void clear_stack_to_table_context(GumboParser* parser) {
  function clear_stack_to_table_body_context (line 989) | void clear_stack_to_table_body_context(GumboParser* parser) {
  function GumboNode (line 998) | static GumboNode* create_element(GumboParser* parser, GumboTag tag) {
  function GumboNode (line 1015) | static GumboNode* create_element_from_token(
  function insert_element (line 1047) | static void insert_element(GumboParser* parser, GumboNode* node,
  function GumboNode (line 1070) | static GumboNode* insert_element_from_token(
  function GumboNode (line 1083) | static GumboNode* insert_element_of_tag_type(
  function GumboNode (line 1095) | static GumboNode* insert_foreign_element(
  function insert_text_token (line 1115) | static void insert_text_token(GumboParser* parser, GumboToken* token) {
  function run_generic_parsing_algorithm (line 1136) | static void run_generic_parsing_algorithm(
  function acknowledge_self_closing_tag (line 1145) | static void acknowledge_self_closing_tag(GumboParser* parser) {
  function find_last_anchor_index (line 1151) | static bool find_last_anchor_index(GumboParser* parser, int* anchor_inde...
  function count_formatting_elements_of_tag (line 1170) | static int count_formatting_elements_of_tag(GumboParser* parser,
  function add_formatting_element (line 1193) | static void add_formatting_element(GumboParser* parser, const GumboNode*...
  function is_open_element (line 1218) | static bool is_open_element(GumboParser* parser, const GumboNode* node) {
  function GumboNode (line 1231) | GumboNode* clone_node(
  function reconstruct_active_formatting_elements (line 1263) | static void reconstruct_active_formatting_elements(GumboParser* parser) {
  function clear_active_formatting_elements (line 1315) | static void clear_active_formatting_elements(GumboParser* parser) {
  function GumboQuirksModeEnum (line 1328) | static GumboQuirksModeEnum compute_quirks_mode(
  function has_an_element_in_specific_scope (line 1362) | static bool has_an_element_in_specific_scope(GumboParser* parser,
  function has_open_element (line 1385) | static bool has_open_element(GumboParser* parser, GumboTag tag) {
  function has_an_element_in_scope (line 1391) | static bool has_an_element_in_scope(GumboParser* parser, GumboTag tag) {
  function has_node_in_scope (line 1406) | static bool has_node_in_scope(GumboParser* parser, const GumboNode* node) {
  function has_an_element_in_scope_with_tagname (line 1432) | static bool has_an_element_in_scope_with_tagname(
  function has_an_element_in_list_scope (line 1443) | static bool has_an_element_in_list_scope(GumboParser* parser, GumboTag t...
  function has_an_element_in_button_scope (line 1453) | static bool has_an_element_in_button_scope(GumboParser* parser, GumboTag...
  function has_an_element_in_table_scope (line 1463) | static bool has_an_element_in_table_scope(GumboParser* parser, GumboTag ...
  function has_an_element_in_select_scope (line 1469) | static bool has_an_element_in_select_scope(GumboParser* parser, GumboTag...
  function generate_implied_end_tags (line 1477) | static void generate_implied_end_tags(GumboParser* parser, GumboTag exce...
  function generate_all_implied_end_tags_thoroughly (line 1488) | static void generate_all_implied_end_tags_thoroughly(GumboParser* parser) {
  function close_table (line 1502) | static bool close_table(GumboParser* parser) {
  function close_table_cell (line 1517) | static bool close_table_cell(
  function close_current_cell (line 1537) | static bool close_current_cell(GumboParser* parser, const GumboToken* to...
  function close_current_select (line 1551) | static void close_current_select(GumboParser* parser) {
  function is_special_node (line 1561) | static bool is_special_node(const GumboNode* node) {
  function implicitly_close_tags (line 1591) | static bool implicitly_close_tags(GumboParser* parser, GumboToken* token,
  function maybe_implicitly_close_p_tag (line 1612) | static bool maybe_implicitly_close_p_tag(
  function maybe_implicitly_close_list_tag (line 1623) | static void maybe_implicitly_close_list_tag(
  function merge_attributes (line 1645) | static void merge_attributes(
  function adjust_foreign_attributes (line 1689) | static void adjust_foreign_attributes(GumboParser* parser, GumboToken* t...
  function adjust_svg_attributes (line 1709) | static void adjust_svg_attributes(GumboParser* parser, GumboToken* token) {
  function adjust_mathml_attributes (line 1727) | static void adjust_mathml_attributes(GumboParser* parser, GumboToken* to...
  function doctype_matches (line 1738) | static bool doctype_matches(const GumboTokenDocType* doctype,
  function maybe_add_doctype_error (line 1746) | static bool maybe_add_doctype_error(
  function remove_from_parent (line 1768) | static void remove_from_parent(GumboParser* parser, GumboNode* node) {
  function adoption_agency_algorithm (line 1792) | static bool adoption_agency_algorithm(
  function ignore_token (line 2038) | static void ignore_token(GumboParser* parser) {
  function finish_parsing (line 2055) | static void finish_parsing(GumboParser* parser) {
  function handle_initial (line 2071) | static bool handle_initial(GumboParser* parser, GumboToken* token) {
  function handle_before_html (line 2096) | static bool handle_before_html(GumboParser* parser, GumboToken* token) {
  function handle_before_head (line 2130) | static bool handle_before_head(GumboParser* parser, GumboToken* token) {
  function handle_in_head (line 2167) | static bool handle_in_head(GumboParser* parser, GumboToken* token) {
  function handle_in_head_noscript (line 2262) | static bool handle_in_head_noscript(GumboParser* parser, GumboToken* tok...
  function handle_after_head (line 2299) | static bool handle_after_head(GumboParser* parser, GumboToken* token) {
  function destroy_node (line 2352) | static void destroy_node(GumboParser* parser, GumboNode* node) {
  function handle_in_body (line 2386) | static bool handle_in_body(GumboParser* parser, GumboToken* token) {
  function handle_text (line 3043) | static bool handle_text(GumboParser* parser, GumboToken* token) {
  function handle_in_table (line 3066) | static bool handle_in_table(GumboParser* parser, GumboToken* token) {
  function handle_in_table_text (line 3171) | static bool handle_in_table_text(GumboParser* parser, GumboToken* token) {
  function handle_in_caption (line 3205) | static bool handle_in_caption(GumboParser* parser, GumboToken* token) {
  function handle_in_column_group (line 3252) | static bool handle_in_column_group(GumboParser* parser, GumboToken* toke...
  function handle_in_table_body (line 3302) | static bool handle_in_table_body(GumboParser* parser, GumboToken* token) {
  function handle_in_row (line 3354) | static bool handle_in_row(GumboParser* parser, GumboToken* token) {
  function handle_in_cell (line 3413) | static bool handle_in_cell(GumboParser* parser, GumboToken* token) {
  function handle_in_select (line 3456) | static bool handle_in_select(GumboParser* parser, GumboToken* token) {
  function handle_in_select_in_table (line 3552) | static bool handle_in_select_in_table(GumboParser* parser, GumboToken* t...
  function handle_in_template (line 3581) | static bool handle_in_template(GumboParser* parser, GumboToken* token) {
  function handle_after_body (line 3650) | static bool handle_after_body(GumboParser* parser, GumboToken* token) {
  function handle_in_frameset (line 3687) | static bool handle_in_frameset(GumboParser* parser, GumboToken* token) {
  function handle_after_frameset (line 3736) | static bool handle_after_frameset(GumboParser* parser, GumboToken* token) {
  function handle_after_after_body (line 3768) | static bool handle_after_after_body(GumboParser* parser, GumboToken* tok...
  function handle_after_after_frameset (line 3787) | static bool handle_after_after_frameset(
  function handle_html_content (line 3819) | static bool handle_html_content(GumboParser* parser, GumboToken* token) {
  function handle_in_foreign_content (line 3825) | static bool handle_in_foreign_content(GumboParser* parser, GumboToken* t...
  function handle_token (line 3958) | static bool handle_token(GumboParser* parser, GumboToken* token) {
  function fragment_parser_init (line 4010) | static void fragment_parser_init(GumboParser* parser, GumboTag fragment_...
  function GumboOutput (line 4070) | GumboOutput* gumbo_parse(const char* buffer) {
  function GumboOutput (line 4075) | GumboOutput* gumbo_parse_with_options(
  function gumbo_destroy_node (line 4173) | void gumbo_destroy_node(GumboOptions* options, GumboNode* node) {
  function gumbo_destroy_output (line 4181) | void gumbo_destroy_output(const GumboOptions* options, GumboOutput* outp...

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/parser.h
  type GumboInternalParserState (line 27) | struct GumboInternalParserState
  type GumboInternalOutput (line 28) | struct GumboInternalOutput
  type GumboInternalOptions (line 29) | struct GumboInternalOptions
  type GumboInternalTokenizerState (line 30) | struct GumboInternalTokenizerState
  type GumboParser (line 35) | typedef struct GumboInternalParser {

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/string_buffer.c
  type GumboInternalParser (line 27) | struct GumboInternalParser
  function maybe_resize_string_buffer (line 33) | static void maybe_resize_string_buffer(struct GumboInternalParser* parser,
  function gumbo_string_buffer_init (line 49) | void gumbo_string_buffer_init(
  function gumbo_string_buffer_reserve (line 56) | void gumbo_string_buffer_reserve(struct GumboInternalParser* parser,
  function gumbo_string_buffer_append_codepoint (line 61) | void gumbo_string_buffer_append_codepoint(
  function gumbo_string_buffer_append_string (line 87) | void gumbo_string_buffer_append_string(struct GumboInternalParser* parser,
  type GumboInternalParser (line 95) | struct GumboInternalParser
  function gumbo_string_buffer_clear (line 102) | void gumbo_string_buffer_clear(
  function gumbo_string_buffer_destroy (line 107) | void gumbo_string_buffer_destroy(

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/string_buffer.h
  type GumboInternalParser (line 29) | struct GumboInternalParser
  type GumboStringBuffer (line 36) | typedef struct {
  type GumboInternalParser (line 49) | struct GumboInternalParser
  type GumboInternalParser (line 54) | struct GumboInternalParser
  type GumboInternalParser (line 61) | struct GumboInternalParser
  type GumboInternalParser (line 64) | struct GumboInternalParser
  type GumboInternalParser (line 69) | struct GumboInternalParser
  type GumboInternalParser (line 74) | struct GumboInternalParser
  type GumboInternalParser (line 78) | struct GumboInternalParser

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/string_piece.c
  type GumboInternalParser (line 26) | struct GumboInternalParser
  function gumbo_string_equals (line 30) | bool gumbo_string_equals(
  function gumbo_string_equals_ignore_case (line 36) | bool gumbo_string_equals_ignore_case(
  function gumbo_string_copy (line 42) | void gumbo_string_copy(struct GumboInternalParser* parser,

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/string_piece.h
  type GumboInternalParser (line 26) | struct GumboInternalParser
  type GumboInternalParser (line 31) | struct GumboInternalParser

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/tag.c
  function gumbo_tag_from_original_text (line 40) | void gumbo_tag_from_original_text(GumboStringPiece* text) {
  function case_memcmp (line 68) | static int case_memcmp(const char* s1, const char* s2, unsigned int n) {
  function GumboTag (line 80) | GumboTag gumbo_tagn_enum(const char* tagname, unsigned int length) {
  function GumboTag (line 93) | GumboTag gumbo_tag_enum(const char* tagname) {

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/tag_gperf.h
  function tag_hash (line 1) | static unsigned int tag_hash(

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/token_type.h
  type GumboTokenType (line 25) | typedef enum {

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/tokenizer.c
  type StateResult (line 69) | typedef enum {
  type GumboTagState (line 77) | typedef struct GumboInternalTagState {
  type GumboTokenizerState (line 123) | typedef struct GumboInternalTokenizerState {
  function tokenizer_add_parse_error (line 202) | static void tokenizer_add_parse_error(
  function is_alpha (line 311) | static bool is_alpha(int c) {
  function ensure_lowercase (line 318) | static int ensure_lowercase(int c) {
  function GumboTokenType (line 322) | static GumboTokenType get_char_token_type(bool is_in_cdata, int c) {
  function clear_temporary_buffer (line 355) | static void clear_temporary_buffer(GumboParser* parser) {
  function append_char_to_temporary_buffer (line 366) | static void append_char_to_temporary_buffer(
  function temporary_buffer_equals (line 375) | static bool temporary_buffer_equals(GumboParser* parser, const char* tex...
  function doc_type_state_init (line 386) | static void doc_type_state_init(GumboParser* parser) {
  function reset_token_start_point (line 405) | static void reset_token_start_point(GumboTokenizerState* tokenizer) {
  function reset_tag_buffer_start_point (line 414) | static void reset_tag_buffer_start_point(GumboParser* parser) {
  function finish_temporary_buffer (line 424) | static void finish_temporary_buffer(GumboParser* parser, const char** ou...
  function finish_token (line 439) | static void finish_token(GumboParser* parser, GumboToken* token) {
  function finish_doctype_public_id (line 463) | static void finish_doctype_public_id(GumboParser* parser) {
  function finish_doctype_system_id (line 473) | static void finish_doctype_system_id(GumboParser* parser) {
  function emit_char (line 482) | static void emit_char(GumboParser* parser, int c, GumboToken* output) {
  function StateResult (line 490) | static StateResult emit_replacement_char(
  function StateResult (line 499) | static StateResult emit_eof(GumboParser* parser, GumboToken* output) {
  function emit_current_char (line 506) | static bool emit_current_char(GumboParser* parser, GumboToken* output) {
  function emit_doctype (line 513) | static void emit_doctype(GumboParser* parser, GumboToken* output) {
  function mark_tag_state_as_empty (line 522) | static void mark_tag_state_as_empty(GumboTagState* tag_state) {
  function StateResult (line 530) | static StateResult emit_current_tag(GumboParser* parser, GumboToken* out...
  function abandon_current_tag (line 570) | static void abandon_current_tag(GumboParser* parser) {
  function StateResult (line 584) | static StateResult emit_char_ref(GumboParser* parser,
  function StateResult (line 605) | static StateResult emit_comment(GumboParser* parser, GumboToken* output) {
  function maybe_emit_from_temporary_buffer (line 617) | static bool maybe_emit_from_temporary_buffer(
  function emit_temporary_buffer (line 649) | static bool emit_temporary_buffer(GumboParser* parser, GumboToken* outpu...
  function append_char_to_tag_buffer (line 662) | static void append_char_to_tag_buffer(
  function initialize_tag_buffer (line 673) | static void initialize_tag_buffer(GumboParser* parser) {
  function start_new_tag (line 684) | static void start_new_tag(GumboParser* parser, bool is_start_tag) {
  function copy_over_tag_buffer (line 708) | static void copy_over_tag_buffer(GumboParser* parser, const char** outpu...
  function copy_over_original_tag_text (line 720) | static void copy_over_original_tag_text(GumboParser* parser,
  function reinitialize_tag_buffer (line 741) | static void reinitialize_tag_buffer(GumboParser* parser) {
  function finish_tag_name (line 749) | static void finish_tag_name(GumboParser* parser) {
  function add_duplicate_attr_error (line 759) | static void add_duplicate_attr_error(GumboParser* parser, const char* at...
  function finish_attribute_name (line 781) | static bool finish_attribute_name(GumboParser* parser) {
  function finish_attribute_value (line 817) | static void finish_attribute_value(GumboParser* parser) {
  function is_appropriate_end_tag (line 837) | static bool is_appropriate_end_tag(GumboParser* parser) {
  function gumbo_tokenizer_state_init (line 845) | void gumbo_tokenizer_state_init(
  function gumbo_tokenizer_state_destroy (line 869) | void gumbo_tokenizer_state_destroy(GumboParser* parser) {
  function gumbo_tokenizer_set_state (line 879) | void gumbo_tokenizer_set_state(GumboParser* parser, GumboTokenizerEnum s...
  function gumbo_tokenizer_set_is_current_node_foreign (line 883) | void gumbo_tokenizer_set_is_current_node_foreign(
  function StateResult (line 893) | static StateResult handle_data_state(GumboParser* parser,
  function StateResult (line 918) | static StateResult handle_char_ref_in_data_state(GumboParser* parser,
  function StateResult (line 925) | static StateResult handle_rcdata_state(GumboParser* parser,
  function StateResult (line 947) | static StateResult handle_char_ref_in_rcdata_state(GumboParser* parser,
  function StateResult (line 954) | static StateResult handle_rawtext_state(GumboParser* parser,
  function StateResult (line 972) | static StateResult handle_script_state(GumboParser* parser,
  function StateResult (line 990) | static StateResult handle_plaintext_state(GumboParser* parser,
  function StateResult (line 1003) | static StateResult handle_tag_open_state(GumboParser* parser,
  function StateResult (line 1036) | static StateResult handle_end_tag_open_state(GumboParser* parser,
  function StateResult (line 1063) | static StateResult handle_tag_name_state(GumboParser* parser,
  function StateResult (line 1097) | static StateResult handle_rcdata_lt_state(GumboParser* parser,
  function StateResult (line 1112) | static StateResult handle_rcdata_end_tag_open_state(GumboParser* parser,
  function StateResult (line 1128) | static StateResult handle_rcdata_end_tag_name_state(GumboParser* parser,
  function StateResult (line 1160) | static StateResult handle_rawtext_lt_state(GumboParser* parser,
  function StateResult (line 1175) | static StateResult handle_rawtext_end_tag_open_state(GumboParser* parser,
  function StateResult (line 1190) | static StateResult handle_rawtext_end_tag_name_state(GumboParser* parser,
  function StateResult (line 1225) | static StateResult handle_script_lt_state(GumboParser* parser,
  function StateResult (line 1244) | static StateResult handle_script_end_tag_open_state(GumboParser* parser,
  function StateResult (line 1259) | static StateResult handle_script_end_tag_name_state(GumboParser* parser,
  function StateResult (line 1291) | static StateResult handle_script_escaped_start_state(GumboParser* parser,
  function StateResult (line 1304) | static StateResult handle_script_escaped_start_dash_state(GumboParser* p...
  function StateResult (line 1317) | static StateResult handle_script_escaped_state(GumboParser* parser,
  function StateResult (line 1339) | static StateResult handle_script_escaped_dash_state(GumboParser* parser,
  function StateResult (line 1364) | static StateResult handle_script_escaped_dash_dash_state(GumboParser* pa...
  function StateResult (line 1391) | static StateResult handle_script_escaped_lt_state(GumboParser* parser,
  function StateResult (line 1412) | static StateResult handle_script_escaped_end_tag_open_state(GumboParser*...
  function StateResult (line 1427) | static StateResult handle_script_escaped_end_tag_name_state(GumboParser*...
  function StateResult (line 1459) | static StateResult handle_script_double_escaped_start_state(GumboParser*...
  function StateResult (line 1488) | static StateResult handle_script_double_escaped_state(GumboParser* parser,
  function StateResult (line 1509) | static StateResult handle_script_double_escaped_dash_state(GumboParser* ...
  function StateResult (line 1533) | static StateResult handle_script_double_escaped_dash_dash_state(
  function StateResult (line 1559) | static StateResult handle_script_double_escaped_lt_state(GumboParser* pa...
  function StateResult (line 1573) | static StateResult handle_script_double_escaped_end_state(GumboParser* p...
  function StateResult (line 1602) | static StateResult handle_before_attr_name_state(GumboParser* parser,
  function StateResult (line 1640) | static StateResult handle_attr_name_state(GumboParser* parser,
  function StateResult (line 1683) | static StateResult handle_after_attr_name_state(GumboParser* parser,
  function StateResult (line 1723) | static StateResult handle_before_attr_value_state(GumboParser* parser,
  function StateResult (line 1772) | static StateResult handle_attr_value_double_quoted_state(GumboParser* pa...
  function StateResult (line 1800) | static StateResult handle_attr_value_single_quoted_state(GumboParser* pa...
  function StateResult (line 1828) | static StateResult handle_attr_value_unquoted_state(GumboParser* parser,
  function StateResult (line 1871) | static StateResult handle_char_ref_in_attr_value_state(GumboParser* parser,
  function StateResult (line 1913) | static StateResult handle_after_attr_value_quoted_state(GumboParser* par...
  function StateResult (line 1944) | static StateResult handle_self_closing_start_tag_state(GumboParser* parser,
  function StateResult (line 1965) | static StateResult handle_bogus_comment_state(GumboParser* parser,
  function StateResult (line 1980) | static StateResult handle_markup_declaration_state(GumboParser* parser,
  function StateResult (line 2015) | static StateResult handle_comment_start_state(GumboParser* parser,
  function StateResult (line 2044) | static StateResult handle_comment_start_dash_state(GumboParser* parser,
  function StateResult (line 2075) | static StateResult handle_comment_state(GumboParser* parser,
  function StateResult (line 2097) | static StateResult handle_comment_end_dash_state(GumboParser* parser,
  function StateResult (line 2123) | static StateResult handle_comment_end_state(GumboParser* parser,
  function StateResult (line 2162) | static StateResult handle_comment_end_bang_state(GumboParser* parser,
  function StateResult (line 2198) | static StateResult handle_doctype_state(GumboParser* parser,
  function StateResult (line 2224) | static StateResult handle_before_doctype_name_state(GumboParser* parser,
  function StateResult (line 2259) | static StateResult handle_doctype_name_state(GumboParser* parser,
  function StateResult (line 2297) | static StateResult handle_after_doctype_name_state(GumboParser* parser,
  function StateResult (line 2337) | static StateResult handle_after_doctype_public_keyword_state(
  function StateResult (line 2381) | static StateResult handle_before_doctype_public_id_state(GumboParser* pa...
  function StateResult (line 2421) | static StateResult handle_doctype_public_id_double_quoted_state(
  function StateResult (line 2454) | static StateResult handle_doctype_public_id_single_quoted_state(
  function StateResult (line 2487) | static StateResult handle_after_doctype_public_id_state(GumboParser* par...
  function StateResult (line 2529) | static StateResult handle_between_doctype_public_system_id_state(
  function StateResult (line 2568) | static StateResult handle_after_doctype_system_keyword_state(
  function StateResult (line 2611) | static StateResult handle_before_doctype_system_id_state(GumboParser* pa...
  function StateResult (line 2650) | static StateResult handle_doctype_system_id_double_quoted_state(
  function StateResult (line 2683) | static StateResult handle_doctype_system_id_single_quoted_state(
  function StateResult (line 2716) | static StateResult handle_after_doctype_system_id_state(GumboParser* par...
  function StateResult (line 2742) | static StateResult handle_bogus_doctype_state(GumboParser* parser,
  function StateResult (line 2753) | static StateResult handle_cdata_state(GumboParser* parser,
  type StateResult (line 2767) | typedef StateResult (*GumboLexerStateFunction)(
  function gumbo_lex (line 2812) | bool gumbo_lex(GumboParser* parser, GumboToken* output) {
  function gumbo_token_destroy (line 2869) | void gumbo_token_destroy(GumboParser* parser, GumboToken* token) {

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/tokenizer.h
  type GumboInternalParser (line 34) | struct GumboInternalParser
  type GumboTokenDocType (line 37) | typedef struct GumboInternalTokenDocType {
  type GumboTokenStartTag (line 50) | typedef struct GumboInternalTokenStartTag {
  type GumboToken (line 59) | typedef struct GumboInternalToken {
  type GumboInternalParser (line 75) | struct GumboInternalParser
  type GumboInternalParser (line 79) | struct GumboInternalParser
  type GumboInternalParser (line 85) | struct GumboInternalParser
  type GumboInternalParser (line 92) | struct GumboInternalParser
  type GumboInternalParser (line 107) | struct GumboInternalParser
  type GumboInternalParser (line 117) | struct GumboInternalParser

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/tokenizer_states.h
  type GumboTokenizerEnum (line 32) | typedef enum {

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/utf8.c
  function decode (line 88) | uint32_t static inline decode(uint32_t* state, uint32_t* codep, uint32_t...
  function add_error (line 102) | static void add_error(Utf8Iterator* iter, GumboErrorType type) {
  function read_char (line 127) | static void read_char(Utf8Iterator* iter) {
  function update_position (line 183) | static void update_position(Utf8Iterator* iter) {
  function utf8_is_invalid_code_point (line 198) | bool utf8_is_invalid_code_point(int c) {
  function utf8iterator_init (line 204) | void utf8iterator_init(GumboParser* parser, const char* source,
  function utf8iterator_next (line 215) | void utf8iterator_next(Utf8Iterator* iter) {
  function utf8iterator_current (line 223) | int utf8iterator_current(const Utf8Iterator* iter) { return iter->_curre...
  function utf8iterator_get_position (line 225) | void utf8iterator_get_position(
  function utf8iterator_maybe_consume_match (line 238) | bool utf8iterator_maybe_consume_match(Utf8Iterator* iter, const char* pr...
  function utf8iterator_mark (line 253) | void utf8iterator_mark(Utf8Iterator* iter) {
  function utf8iterator_reset (line 259) | void utf8iterator_reset(Utf8Iterator* iter) {
  function utf8iterator_fill_error_at_mark (line 267) | void utf8iterator_fill_error_at_mark(Utf8Iterator* iter, GumboError* err...

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/utf8.h
  type GumboInternalError (line 44) | struct GumboInternalError
  type GumboInternalParser (line 45) | struct GumboInternalParser
  type Utf8Iterator (line 50) | typedef struct GumboInternalUtf8Iterator {
  type GumboInternalParser (line 84) | struct GumboInternalParser
  type GumboInternalError (line 127) | struct GumboInternalError

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/util.c
  function gumbo_parser_deallocate (line 38) | void gumbo_parser_deallocate(GumboParser* parser, void* ptr) {
  function gumbo_debug (line 50) | void gumbo_debug(const char* format, ...) {

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/util.h
  type GumboInternalParser (line 34) | struct GumboInternalParser
  type GumboInternalParser (line 41) | struct GumboInternalParser
  type GumboInternalParser (line 46) | struct GumboInternalParser
  type GumboInternalParser (line 50) | struct GumboInternalParser

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/vector.c
  type GumboInternalParser (line 26) | struct GumboInternalParser
  function gumbo_vector_init (line 30) | void gumbo_vector_init(struct GumboInternalParser* parser,
  function gumbo_vector_destroy (line 42) | void gumbo_vector_destroy(
  function enlarge_vector_if_full (line 49) | static void enlarge_vector_if_full(
  function gumbo_vector_add (line 69) | void gumbo_vector_add(
  type GumboInternalParser (line 78) | struct GumboInternalParser
  function gumbo_vector_index_of (line 85) | int gumbo_vector_index_of(GumboVector* vector, const void* element) {
  function gumbo_vector_insert_at (line 94) | void gumbo_vector_insert_at(struct GumboInternalParser* parser, void* el...
  function gumbo_vector_remove (line 105) | void gumbo_vector_remove(
  type GumboInternalParser (line 114) | struct GumboInternalParser

FILE: zhuishushenqi/Vendor/OCGumbo/gumbo/vector.h
  type GumboInternalParser (line 28) | struct GumboInternalParser
  type GumboInternalParser (line 31) | struct GumboInternalParser
  type GumboInternalParser (line 37) | struct GumboInternalParser
  type GumboInternalParser (line 41) | struct GumboInternalParser
  type GumboInternalParser (line 46) | struct GumboInternalParser
  type GumboInternalParser (line 50) | struct GumboInternalParser
  type GumboInternalParser (line 56) | struct GumboInternalParser
  type GumboInternalParser (line 60) | struct GumboInternalParser

FILE: zhuishushenqi/Vendor/ThirdLoginSDK/TencentOpenAPI.framework/Headers/QQApiInterfaceObject.h
  type QQApiSendResultCode (line 15) | typedef enum
  type ShareDestType (line 54) | typedef enum ShareDestType {
  type QQApiURLTargetType (line 116) | enum QQApiURLTargetType{
  type QQApiInterfaceReqType (line 463) | enum QQApiInterfaceReqType
  type QQApiInterfaceRespType (line 474) | enum QQApiInterfaceRespType

FILE: zhuishushenqi/Vendor/ThirdLoginSDK/TencentOpenAPI.framework/Headers/TencentOAuth.h
  type TencentAuthorizeState (line 20) | typedef enum
  type TencentAuthMode (line 27) | typedef enum
  function interface (line 40) | interface TencentOAuth : NSObject

FILE: zhuishushenqi/Vendor/ThirdLoginSDK/TencentOpenAPI.framework/Headers/sdkdef.h
  type TCOLogLevel (line 15) | typedef enum {
  type QQVersion (line 26) | typedef enum QQVersion
  type TIMVersion (line 41) | typedef enum TIMVersion {
  type TencentAuthShareType (line 49) | typedef enum TencentAuthShareType {
  type REPONSE_RESULT (line 57) | typedef enum
  type UpdateFailType (line 71) | typedef enum
  function interface (line 83) | interface APIResponse : NSObject<NSCoding> {
  type OpenSDKError (line 279) | typedef enum
  type NSString (line 379) | typedef NSString *TCOptionalStr;
  type id (line 381) | typedef id TCRequiredId;

FILE: zhuishushenqi/Vendor/XimalayaSDK_iOS_5.5.1/include/Authorization/XMLYAuthorize.h
  type QRCodeSize (line 25) | typedef enum {

FILE: zhuishushenqi/Vendor/XimalayaSDK_iOS_5.5.1/include/FMDB/FMDatabase.h
  function interface (line 49) | interface FMDatabase : NSObject  {

FILE: zhuishushenqi/Vendor/XimalayaSDK_iOS_5.5.1/include/FMDB/FMDatabasePool.h
  function interface (line 31) | interface FMDatabasePool : NSObject {

FILE: zhuishushenqi/Vendor/XimalayaSDK_iOS_5.5.1/include/FMDB/FMDatabaseQueue.h
  function interface (line 14) | interface FMDatabaseQueue : NSObject {

FILE: zhuishushenqi/Vendor/XimalayaSDK_iOS_5.5.1/include/FMDB/FMResultSet.h
  function interface (line 19) | interface FMResultSet : NSObject {

FILE: zhuishushenqi/Vendor/XimalayaSDK_iOS_5.5.1/include/MBProgressHUD/MBProgressHUD.h
  type MBProgressHUDModeIndeterminate (line 39) | typedef NS_ENUM(NSInteger, MBProgressHUDMode) {
  type MBProgressHUDAnimationFade (line 54) | typedef NS_ENUM(NSInteger, MBProgressHUDAnimation) {
  type MBProgressHUDBackgroundStyleSolidColor (line 65) | typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) {

FILE: zhuishushenqi/Vendor/uchardet/uchardet.h
  type uchardet (line 46) | struct uchardet
Condensed preview — 1638 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,533K chars).
[
  {
    "path": ".gitignore",
    "chars": 1430,
    "preview": "# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n"
  },
  {
    "path": ".idea/codeStyles/Project.xml",
    "chars": 2023,
    "preview": "<component name=\"ProjectCodeStyleConfiguration\">\n  <code_scheme name=\"Project\" version=\"173\">\n    <Objective-C-extension"
  },
  {
    "path": ".idea/modules.xml",
    "chars": 278,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n   "
  },
  {
    "path": ".idea/vcs.xml",
    "chars": 180,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping dire"
  },
  {
    "path": ".idea/workspace.xml",
    "chars": 21694,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ChangeListManager\">\n    <list default=\"t"
  },
  {
    "path": ".idea/xcode.xml",
    "chars": 199,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"XcodeMetaData\" PROJECT_FILE=\"$PROJECT_DI"
  },
  {
    "path": ".idea/zhuishushenqi.iml",
    "chars": 100,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module classpath=\"AppCode\" type=\"CIDR_MODULE\" version=\"4\" />"
  },
  {
    "path": "Podfile",
    "chars": 2862,
    "preview": "source 'https://github.com/CocoaPods/Specs.git'\nsource 'https://github.com/sinaweibosdk/weibo_ios_sdk.git'\n\n# 对于Swift应用来"
  },
  {
    "path": "README.md",
    "chars": 2623,
    "preview": "# zhuishushenqi\n\n![Platform](https://img.shields.io/badge/platforms-iOS%208.0+%20%7C%20macOS%2010.10+%20%7C%20tvOS%209.0"
  },
  {
    "path": "Script.sh",
    "chars": 845,
    "preview": "#!/bin/sh\n\n#  Script.sh\n#  zhuishushenqi\n#\n#  Created by yung on 2017/8/10.\n#  Copyright © 2017年 QS. All rights reserved"
  },
  {
    "path": "addSource.md",
    "chars": 2913,
    "preview": "### 添加来源\n\n如果默认的一些书籍来源搜索不到小说,该怎么办? 这时候,你需要自定义小说来源网站\n\n以 [笔趣阁](http://www.boquku.com)为例\n\n#### 1. 打开 [笔趣阁](http://www.boquku"
  },
  {
    "path": "en.lproj/Localizable.strings",
    "chars": 164,
    "preview": "/* \n  Localizable.strings\n  zhuishushenqi\n\n  Created by yung on 2017/8/10.\n  Copyright © 2017年 QS. All rights reserved.\n"
  },
  {
    "path": "images/aptv.plist",
    "chars": 1709,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "zh-Hans.lproj/Localizable.strings",
    "chars": 157,
    "preview": "/* \n  Localizable.strings\n  zhuishushenqi\n\n  Created by yung on 2017/8/10.\n  Copyright © 2017年 QS. All rights reserved.\n"
  },
  {
    "path": "zh-Hant.lproj/Localizable.strings",
    "chars": 166,
    "preview": "/* \n  Localizable.strings\n  zhuishushenqi\n\n  Created by yung on 2017/8/10.\n  Copyright © 2017年 QS. All rights reserved.\n"
  },
  {
    "path": "zhuishushenqi/App/AppDelegate.swift",
    "chars": 10713,
    "preview": "//\n//  AppDelegate.swift\n//  zhuishushenqi\n//\n//  Created by Nory Cao on 16/9/16.\n//  Copyright © 2016年 QS. All rights r"
  },
  {
    "path": "zhuishushenqi/App/AppOpenAdManager.swift",
    "chars": 4587,
    "preview": "//\n//  Copyright 2021 Google LLC\n//\n//  Licensed under the Apache License, Version 2.0 (the \"License\");\n//  you may not "
  },
  {
    "path": "zhuishushenqi/App/AppStyle.swift",
    "chars": 1882,
    "preview": "//\n//  AppStyle.swift\n//  zhuishushenqi\n//\n//  Created by yung on 2017/8/8.\n//  Copyright © 2017年 QS. All rights reserve"
  },
  {
    "path": "zhuishushenqi/App/BUAdManager.swift",
    "chars": 2784,
    "preview": "//\n//  BUAdManager.swift\n//  zhuishushenqi\n//\n//  Created by daye on 2021/12/27.\n//  Copyright © 2021 QS. All rights res"
  },
  {
    "path": "zhuishushenqi/App/BookManager.swift",
    "chars": 19254,
    "preview": "//\n//  BookManager.swift\n//  zhuishushenqi\n//\n//  Created by yung on 2017/8/9.\n//  Copyright © 2017年 QS. All rights rese"
  },
  {
    "path": "zhuishushenqi/App/Config.swift",
    "chars": 6522,
    "preview": "//\n//  Config.swift\n//  zhuishushenqi\n//\n//  Created by Nory Cao on 16/9/17.\n//  Copyright © 2016年 QS. All rights reserv"
  },
  {
    "path": "zhuishushenqi/App/FBEncryptorAES.h",
    "chars": 1150,
    "preview": "//\n//  FBEncryptorAES.h\n//  zhuishushenqi\n//\n//  Created by yung on 2018/11/9.\n//  Copyright © 2018年 QS. All rights rese"
  },
  {
    "path": "zhuishushenqi/App/FBEncryptorAES.m",
    "chars": 5785,
    "preview": "//\n//  FBEncryptorAES.m\n//  zhuishushenqi\n//\n//  Created by yung on 2018/11/9.\n//  Copyright © 2018年 QS. All rights rese"
  },
  {
    "path": "zhuishushenqi/App/FBEncryptorAESUtils.h",
    "chars": 355,
    "preview": "//\n//  FBEncryptorAESUtils.h\n//  zhuishushenqi\n//\n//  Created by yung on 2018/11/9.\n//  Copyright © 2018年 QS. All rights"
  },
  {
    "path": "zhuishushenqi/App/FBEncryptorAESUtils.mm",
    "chars": 1020,
    "preview": "//\n//  FBEncryptorAESUtils.m\n//  zhuishushenqi\n//\n//  Created by yung on 2018/11/9.\n//  Copyright © 2018年 QS. All rights"
  },
  {
    "path": "zhuishushenqi/App/Reader.swift",
    "chars": 2023,
    "preview": "//\n//  ReaderStyle.swift\n//  zhuishushenqi\n//\n//  Created by yung on 2017/8/9.\n//  Copyright © 2017年 QS. All rights rese"
  },
  {
    "path": "zhuishushenqi/App/Theme.swift",
    "chars": 249,
    "preview": "//\n//  Theme.swift\n//  zhuishushenqi\n//\n//  Created by yung on 2017/8/9.\n//  Copyright © 2017年 QS. All rights reserved.\n"
  },
  {
    "path": "zhuishushenqi/App/ZSDBManager.h",
    "chars": 537,
    "preview": "//\n//  ZSDBManager.h\n//  zhuishushenqi\n//\n//  Created by yung on 2018/11/22.\n//  Copyright © 2018年 QS. All rights reserv"
  },
  {
    "path": "zhuishushenqi/App/ZSDBManager.m",
    "chars": 21322,
    "preview": "//\n//  ZSDBManager.m\n//  zhuishushenqi\n//\n//  Created by yung on 2018/11/22.\n//  Copyright © 2018年 QS. All rights reserv"
  },
  {
    "path": "zhuishushenqi/App/ZSDBPropertyModel.h",
    "chars": 451,
    "preview": "//\n//  ZSDBPropertyModel.h\n//  zhuishushenqi\n//\n//  Created by yung on 2018/11/23.\n//  Copyright © 2018年 QS. All rights "
  },
  {
    "path": "zhuishushenqi/App/ZSDBPropertyModel.m",
    "chars": 205,
    "preview": "//\n//  ZSDBPropertyModel.m\n//  zhuishushenqi\n//\n//  Created by yung on 2018/11/23.\n//  Copyright © 2018年 QS. All rights "
  },
  {
    "path": "zhuishushenqi/App/ZSDatabase.swift",
    "chars": 4996,
    "preview": "//\n//  ZSDatabase.swift\n//  zhuishushenqi\n//\n//  Created by caony on 2018/11/6.\n//  Copyright © 2018 QS. All rights rese"
  },
  {
    "path": "zhuishushenqi/App/ZSEncryptorAESUtils.swift",
    "chars": 469,
    "preview": "//\n//  ZSEncryptorAESUtils.swift\n//  zhuishushenqi\n//\n//  Created by yung on 2018/11/9.\n//  Copyright © 2018年 QS. All ri"
  },
  {
    "path": "zhuishushenqi/App/ZSJSON.swift",
    "chars": 1315,
    "preview": "//\n//  ZSJSON.swift\n//  zhuishushenqi\n//\n//  Created by caony on 2018/11/20.\n//  Copyright © 2018 QS. All rights reserve"
  },
  {
    "path": "zhuishushenqi/App/ZSLogin.swift",
    "chars": 2302,
    "preview": "//\n//  ZSLogin.swift\n//  zhuishushenqi\n//\n//  Created by yung on 2018/10/20.\n//  Copyright © 2018年 QS. All rights reserv"
  },
  {
    "path": "zhuishushenqi/App/ZSMobileLogin.swift",
    "chars": 4347,
    "preview": "//\n//  ZSMobileLogin.swift\n//  zhuishushenqi\n//\n//  Created by yung on 2018/10/24.\n//  Copyright © 2018年 QS. All rights "
  },
  {
    "path": "zhuishushenqi/App/ZSThirdLogin.swift",
    "chars": 14921,
    "preview": "//\n//  ZSThirdLogin.swift\n//  zhuishushenqi\n//\n//  Created by yung on 2018/10/19.\n//  Copyright © 2018年 QS. All rights r"
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "chars": 2209,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\""
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/Contents.json",
    "chars": 62,
    "preview": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/Default-640x1136.imageset/Contents.json",
    "chars": 316,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/LaunchImage.launchimage/Contents.json",
    "chars": 2240,
    "preview": "{\n  \"images\" : [\n    {\n      \"extent\" : \"full-screen\",\n      \"idiom\" : \"iphone\",\n      \"subtype\" : \"2688h\",\n      \"filen"
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/Contents.json",
    "chars": 62,
    "preview": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/QDReaderSetting_brightnessDown_24x24_.imageset/Contents.json",
    "chars": 471,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"QDReaderSetting_brightnessDown_24x24_@1x.png\",\n "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/QDReaderSetting_brightnessUp_24x24_.imageset/Contents.json",
    "chars": 465,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"QDReaderSetting_brightnessUp_24x24_@1x.png\",\n   "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/bbs_icon_like02_26_26.imageset/Contents.json",
    "chars": 372,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/bbs_icon_message_20_20.imageset/Contents.json",
    "chars": 374,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/bbs_icon_message_34_34_34x34_.imageset/Contents.json",
    "chars": 388,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/bbs_icon_more_big_26_26.imageset/Contents.json",
    "chars": 376,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/bbs_icon_personal_34_34_34x34_.imageset/Contents.json",
    "chars": 390,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/bbs_icon_share_26_26_26x26_.imageset/Contents.json",
    "chars": 384,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/bbs_icon_topic_26_26_26x26_.imageset/Contents.json",
    "chars": 384,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/blackboard_bg_375x667_.imageset/Contents.json",
    "chars": 374,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/bookshelf_bg_logo_80_19_80x19_.imageset/Contents.json",
    "chars": 390,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/bookshelf_icon_gift_34_34.imageset/Contents.json",
    "chars": 380,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/bookshelf_icon_gift_new_34_34.imageset/Contents.json",
    "chars": 388,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/bookshelf_icon_history_34_34.imageset/Contents.json",
    "chars": 386,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/bookshelf_icon_more_10_10_10x10_.imageset/Contents.json",
    "chars": 394,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/bookshelf_icon_more_34_34.imageset/Contents.json",
    "chars": 380,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/bookshelf_icon_more_wifi_24_24.imageset/Contents.json",
    "chars": 390,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/bookshelf_icon_seach_34_34.imageset/Contents.json",
    "chars": 382,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/bookshelf_top_bg_one_line.imageset/Contents.json",
    "chars": 380,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/bookshelf_top_bg_two_line.imageset/Contents.json",
    "chars": 380,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/bookstore_bg.imageset/Contents.json",
    "chars": 354,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/bookstore_def_classify_20_20_20x20_.imageset/Contents.json",
    "chars": 400,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/chapter_review_send_tip_24x24_.imageset/Contents.json",
    "chars": 390,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/community_noReview_sofa_icon.imageset/Contents.json",
    "chars": 386,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/community_star_p_32x32_.imageset/Contents.json",
    "chars": 376,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/details_icon_star_n_32_32_32x32_.imageset/Contents.json",
    "chars": 394,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/discover_Ranking_109x50_.imageset/Contents.json",
    "chars": 378,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/discover_booklist_108x50_.imageset/Contents.json",
    "chars": 380,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/discover_classify_108x50_.imageset/Contents.json",
    "chars": 380,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/discover_icon_audiobook_26_26_26x26_.imageset/Contents.json",
    "chars": 402,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/discover_icon_comics_26_26_26x26_.imageset/Contents.json",
    "chars": 396,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/discover_icon_exclusive_26_26_26x26_.imageset/Contents.json",
    "chars": 402,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/discover_icon_free_26_26_26x26_.imageset/Contents.json",
    "chars": 392,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/discover_icon_random_26_26_26x26_.imageset/Contents.json",
    "chars": 396,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/discover_icon_timing_24_24_24x24_.imageset/Contents.json",
    "chars": 333,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/discover_icon_vip_26_26_26x26_.imageset/Contents.json",
    "chars": 390,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/f_author_icon_14x14_.imageset/Contents.json",
    "chars": 370,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/f_commentator_icon_14x14_.imageset/Contents.json",
    "chars": 380,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/f_doyen_icon_12x12_.imageset/Contents.json",
    "chars": 368,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/f_moderator_icon_14x14_.imageset/Contents.json",
    "chars": 376,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/f_official_icon_12x12_.imageset/Contents.json",
    "chars": 374,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/forum_image_15x13_.imageset/Contents.json",
    "chars": 366,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/icon_delete_1_24x24_.imageset/Contents.json",
    "chars": 370,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/icon_download_a_24x24_.imageset/Contents.json",
    "chars": 374,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/icon_night_30x30_.imageset/Contents.json",
    "chars": 317,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/icon_tools_menu_30x30_.imageset/Contents.json",
    "chars": 322,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/icon_tools_setting_30x30_.imageset/Contents.json",
    "chars": 325,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/icon_top_selected_24x24_.imageset/Contents.json",
    "chars": 432,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_top_selected_24x24_@1x.png\",\n      \"scale\" "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/mj_refresh.imageset/Contents.json",
    "chars": 310,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/nav_goldCoin_34_34_24x24_.imageset/Contents.json",
    "chars": 380,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/no_network_140x128_.imageset/Contents.json",
    "chars": 368,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/notification_personal_icon_message_24_24_24x24_.imageset/Contents.json",
    "chars": 424,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/official_icon_30x30_.imageset/Contents.json",
    "chars": 370,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/peach_reader_def_xuance2_32_32_32x32_.imageset/Contents.json",
    "chars": 404,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/personal_icon_account_24_24_24x24_.imageset/Contents.json",
    "chars": 398,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/personal_icon_booklist_24_24_24x24_.imageset/Contents.json",
    "chars": 400,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/personal_icon_darkmode_24_24_23x23_.imageset/Contents.json",
    "chars": 400,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/personal_icon_history_24_24_24x24_.imageset/Contents.json",
    "chars": 398,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/personal_icon_huntbook_24_24_24x24_.imageset/Contents.json",
    "chars": 400,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/personal_icon_id_24_24_24x24_.imageset/Contents.json",
    "chars": 388,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/personal_icon_level _24_24_24x24_.imageset/Contents.json",
    "chars": 396,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/personal_icon_level3 _24_24_24x24_.imageset/Contents.json",
    "chars": 398,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/personal_icon_opinion_24_24_24x24_.imageset/Contents.json",
    "chars": 398,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/personal_icon_reply_14_14_14x14_.imageset/Contents.json",
    "chars": 394,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/personal_icon_setting_24_24_24x24_.imageset/Contents.json",
    "chars": 398,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/personal_icon_topic_14_14_14x14_.imageset/Contents.json",
    "chars": 394,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/personal_icon_vip_24_24_24x24_.imageset/Contents.json",
    "chars": 390,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/personal_icon_warn_16_16_10x10_.imageset/Contents.json",
    "chars": 392,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/personal_icon_zslike_24_24_24x24_.imageset/Contents.json",
    "chars": 396,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/pic_day_46x46_.imageset/Contents.json",
    "chars": 314,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/pic_night_46x46_.imageset/Contents.json",
    "chars": 316,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/profile_personal_icon_message_24_24_24x24_.imageset/Contents.json",
    "chars": 414,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/slice_bg_515_88x32_.imageset/Contents.json",
    "chars": 319,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/slice_bg_barbie_88x32_.imageset/Contents.json",
    "chars": 374,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/slice_bg_jade_88x32_.imageset/Contents.json",
    "chars": 370,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/slice_bg_linen_88x32_.imageset/Contents.json",
    "chars": 372,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/slice_bg_night_88x32_.imageset/Contents.json",
    "chars": 372,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/slice_bg_paper_88x32_.imageset/Contents.json",
    "chars": 372,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/slice_bg_white_88x32_.imageset/Contents.json",
    "chars": 372,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/slice_bg_wood_88x32_.imageset/Contents.json",
    "chars": 370,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/slice_bg_yexiu_88x32_.imageset/Contents.json",
    "chars": 321,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/source_checkbox_normal.imageset/Contents.json",
    "chars": 374,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/source_checkbox_selected.imageset/Contents.json",
    "chars": 378,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/source_delete.imageset/Contents.json",
    "chars": 356,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/tab_bbs.imageset/Contents.json",
    "chars": 344,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/tab_bbs_sel.imageset/Contents.json",
    "chars": 352,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/tab_bookshelf.imageset/Contents.json",
    "chars": 356,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/tab_bookshelf_sel.imageset/Contents.json",
    "chars": 364,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/tab_bookstore.imageset/Contents.json",
    "chars": 356,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/tab_bookstore_sel.imageset/Contents.json",
    "chars": 364,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/tab_discover.imageset/Contents.json",
    "chars": 354,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/tab_discover_sel.imageset/Contents.json",
    "chars": 362,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/tab_profile.imageset/Contents.json",
    "chars": 352,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/New Version/tab_profile_sel.imageset/Contents.json",
    "chars": 360,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/bg_back_white.imageset/Contents.json",
    "chars": 353,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bg_back_white.png\",\n      \"scale\" : \"1x\"\n    },\n"
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/catelog.imageset/Contents.json",
    "chars": 341,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"catelog.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n"
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/fzhongjun.imageset/Contents.json",
    "chars": 348,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/fzmiaowu.imageset/Contents.json",
    "chars": 346,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/fzqingke.imageset/Contents.json",
    "chars": 346,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/fzshusong.imageset/Contents.json",
    "chars": 348,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/fzsuxinshil.imageset/Contents.json",
    "chars": 352,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/fzxijinling.imageset/Contents.json",
    "chars": 352,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/fzyouhei.imageset/Contents.json",
    "chars": 346,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/kai.imageset/Contents.json",
    "chars": 336,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/lantingh.imageset/Contents.json",
    "chars": 346,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/leftbar.imageset/Contents.json",
    "chars": 341,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"leftbar.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n"
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/li.imageset/Contents.json",
    "chars": 334,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/loadside.imageset/Contents.json",
    "chars": 308,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/longwangchuanshuo.imageset/Contents.json",
    "chars": 360,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"longwangchuanshuo.jpg\",\n      \"scale\" : \"1x\"\n   "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/navigationbar-sidebar.imageset/Contents.json",
    "chars": 420,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"navigationbar-sidebar.png\",\n      \"scale\" : \"1x\""
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/pianpian.imageset/Contents.json",
    "chars": 346,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/rightbar.imageset/Contents.json",
    "chars": 343,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rightbar.png\",\n      \"scale\" : \"1x\"\n    },\n    {"
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/riwen.imageset/Contents.json",
    "chars": 340,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/sure_placeholder_error.imageset/Contents.json",
    "chars": 374,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/weibei.imageset/Contents.json",
    "chars": 342,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/yapi.imageset/Contents.json",
    "chars": 338,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/AppIcon29x29.imageset/Contents.json",
    "chars": 312,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/AppIcon40x40.imageset/Contents.json",
    "chars": 312,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/AppIcon57x57.imageset/Contents.json",
    "chars": 351,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"AppIcon57x57.png\",\n      \"scale\" : \"1x\"\n    },\n "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/AppIcon60x60.imageset/Contents.json",
    "chars": 354,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/AppIcon72x72.imageset/Contents.json",
    "chars": 288,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"AppIcon72x72~ipad.png\",\n      \"scale\" : \"1x\"\n    },\n "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/AppIcon76x76.imageset/Contents.json",
    "chars": 288,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"AppIcon76x76~ipad.png\",\n      \"scale\" : \"1x\"\n    },\n "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/Apprecommend.imageset/Contents.json",
    "chars": 309,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Apprecommend.jpg\",\n      \"scale\" : \"1x\"\n    },\n "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/Contents.json",
    "chars": 62,
    "preview": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/Default-1242x2208.imageset/Contents.json",
    "chars": 317,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/Default-750x1334.imageset/Contents.json",
    "chars": 316,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/Default-iPad.imageset/Contents.json",
    "chars": 312,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/Default.imageset/Contents.json",
    "chars": 307,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/IQButtonBarArrowDown.imageset/Contents.json",
    "chars": 370,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/IQButtonBarArrowUp.imageset/Contents.json",
    "chars": 366,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/Icon.imageset/Contents.json",
    "chars": 301,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Icon.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n   "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/Icon_114.imageset/Contents.json",
    "chars": 308,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/Icon_120.imageset/Contents.json",
    "chars": 308,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/Icon_58.imageset/Contents.json",
    "chars": 307,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/Icon_80.imageset/Contents.json",
    "chars": 307,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/NavBack.imageset/Contents.json",
    "chars": 304,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NavBack.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n"
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/NavForward.imageset/Contents.json",
    "chars": 307,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NavForward.png\",\n      \"scale\" : \"1x\"\n    },\n   "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/NavHome.imageset/Contents.json",
    "chars": 304,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NavHome.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n"
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/NavRefresh.imageset/Contents.json",
    "chars": 307,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NavRefresh.png\",\n      \"scale\" : \"1x\"\n    },\n   "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/a_charge_bg.imageset/Contents.json",
    "chars": 352,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/a_charge_icon.imageset/Contents.json",
    "chars": 356,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/a_charge_record.imageset/Contents.json",
    "chars": 360,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/a_charge_record_new.imageset/Contents.json",
    "chars": 319,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/a_exchange.imageset/Contents.json",
    "chars": 350,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/a_exchange_new.imageset/Contents.json",
    "chars": 314,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/a_noadvs.imageset/Contents.json",
    "chars": 346,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/a_purchase_record.imageset/Contents.json",
    "chars": 364,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/a_purchase_record_new.imageset/Contents.json",
    "chars": 321,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/a_zhuishubi.imageset/Contents.json",
    "chars": 352,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/a_zhuishubi_new.imageset/Contents.json",
    "chars": 315,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/a_zhuishuquan.imageset/Contents.json",
    "chars": 356,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/a_zhuishuquan_new.imageset/Contents.json",
    "chars": 317,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/actionbar_back.imageset/Contents.json",
    "chars": 355,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"actionbar_back.png\",\n      \"scale\" : \"1x\"\n    },"
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/actionbar_close.imageset/Contents.json",
    "chars": 357,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"actionbar_close.png\",\n      \"scale\" : \"1x\"\n    }"
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/actionbar_forward.imageset/Contents.json",
    "chars": 361,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"actionbar_forward.png\",\n      \"scale\" : \"1x\"\n   "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/actionbar_refresh.imageset/Contents.json",
    "chars": 361,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"actionbar_refresh.png\",\n      \"scale\" : \"1x\"\n   "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/activity_image.imageset/Contents.json",
    "chars": 358,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  },
  {
    "path": "zhuishushenqi/Assets.xcassets/zhuishushenqi/add_book_hint.imageset/Contents.json",
    "chars": 313,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n     "
  }
]

// ... and 1438 more files (download for full content)

About this extraction

This page contains the full source code of the NoryCao/zhuishushenqi GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1638 files (121.4 MB), approximately 1.6M tokens, and a symbol index with 477 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!