Greasy Fork is available in English.

oo.movie( VIP视频解析 + 豆瓣影视页净化 )

VIP视频解析 + 豆瓣影视页净化。精选VIP解析,视频少广告,原网页解析,享受VIP的原画观影体验。手机端与电脑端通用。支持腾讯视频、爱奇艺、优酷、芒果TV、搜狐视频、PPTV、1905、乐视、土豆等网站。VIP解析评分排序,不同网站,越好用的解析越靠前。

Mint 2020.01.29.. Lásd a legutóbbi verzió

// ==UserScript==
// @name         oo.movie( VIP视频解析 + 豆瓣影视页净化 )
// @version      20.2.3
// @description  VIP视频解析 + 豆瓣影视页净化。精选VIP解析,视频少广告,原网页解析,享受VIP的原画观影体验。手机端与电脑端通用。支持腾讯视频、爱奇艺、优酷、芒果TV、搜狐视频、PPTV、1905、乐视、土豆等网站。VIP解析评分排序,不同网站,越好用的解析越靠前。
// @author       (o˘◡˘o)
// @namespace    https://gitee.com/ecruos/oo
// @icon         https://gw.alicdn.com/tfs/TB1ZvwSycbpK1RjSZFyXXX_qFXa-48-48.ico
// @license      GPL License
// @include      *
// ==/UserScript==

var 是 = true,
  否 = false;

// 是 / 否
var 手机端是否允许原网页解析 = 否;

/**
 * 用户自定义 VIP视频解析接口 → 后面自动补全要解析的网址
 * 在`符号之间添加,一行一个,类似 SEARCH_SOURCES
 * 支持格式如下:

http://xxx.com/?url=
解析名字  http://xxx.com/?url=

 */
var VIP解析 = `

`;

// ** 表示搜索时的关键词
var 搜索源 = `

  豆瓣  https://search.douban.com/movie/subject_search?search_text=**  https://m.douban.com/search/?type=movie&query=**

  爱奇艺  https://m.iqiyi.com/search.html?source=default&key=**  https://so.iqiyi.com/so/q_**

  腾讯  https://m.v.qq.com/search.html?act=0&keyWord=**   https://v.qq.com/x/search/?q=**

  哔哩哔哩  https://m.bilibili.com/search.html?keyword=**  https://search.bilibili.com/all?keyword=**

  优酷  https://www.soku.com/m/y/video?q=**  https://so.youku.com/search_video/q_**

  芒果  https://m.mgtv.com/so/?k=**  https://so.mgtv.com/so/k-**

  搜狐  https://m.tv.sohu.com/upload/h5/m/mso.html?key=**  https://so.tv.sohu.com/mts?wd=**

  咪咕  http://www.miguvideo.com/mgs/website/prd/search.html?keywords=**  http://m.miguvideo.com/mgs/msite/prd/search.html?#**

  1905 https://vip.1905.com/Search?q=**

  PPTV http://sou.pptv.com/s_video?kw=**  https://msou.pptv.com/s_video/pg_result?keyword=**

  乐视  http://m.le.com/search?wd=**  http://so.le.com/s?wd=**

  奈菲  https://www.nfmovies.com/search.php?page=1&searchword=**

  残月  http://ys.23yue.cn/seacher-**.html

  云播  https://m.yunbtv.com/vodsearch/-------------.html?wd=**  https://www.yunbtv.com/vodsearch/-------------.html?wd=**

  飞极速  http://m.feijisu8.com/search/**  http://feijisu8.com/search/**

  独播  https://www.duboku.net/vodsearch/-------------.html?wd=**

  拾伍  https://www.shiwutv.com/vodsearch/-------------.html?wd=**

  大全  http://01th.net/search/?wd=**

  樱花  http://m.yhdm.tv/search/**/  http://www.yhdm.tv/search/**/

  1090  https://1090ys.com/?c=search&sort=addtime&order=desc&page=1&wd=**

  APP  https://app.movie/index.php/vod/search.html?wd=**

  八兔  http://www.8tutv.com/search/?category=0&q=**

  Vipku  http://www.2n65.cn/index.php/vod/search.html?wd=**

  影迷  https://www.yingmiwo.com/vodsearch.html?wd=**

`;

/**
 * VIP解析 + 换站搜索 + 网站净化
 *
 * name: 标识说明
 * match: 匹配网址,正则或字符串
 * hide: 要净化隐藏的css选择器
 * css: 自定义css
 * jump: 在搜索页要添加 换站搜索 的css选择器
 * keyword: 在搜索页获取标题 → 换站搜索 的搜索词
 * vip: 在播放页要添加 Vip解析列表 的css选择器
 * title: 在播放页获取标题 → 换站搜索 的搜索词
 * fixUrl: 解析时对播放网址进行变换,比如将手机端播放网址变成电脑端播放网址
 */
var BETTER_ADDONS = [
  // 正版源
  {
    name: '哔哩哔哩·搜索',
    match: /bilibili.com\/search|search.bilibili.com/,
    jump: '#all-list | append, .index__board__src-search-board-'
  },
  {
    name: '哔哩哔哩 - m',
    match: /m\.bilibili\.com/,
    sign: '.mg-footer-copyright',
    hide:
      '.index__openAppBtn__src-commonComponent-topArea-, .index__container__src-commonComponent-bottomOpenApp-, .bili-app, .recom-wrapper, .b-footer, .open-app-bar, .open-app-float, .more-review-wrapper'
  },
  {
    name: '腾讯·搜索',
    match: /v.qq.com\/(\w+\/)?search/,
    jump: '#result, .wrapper_main > .mod_pages',
    sign: '.copyright',
    hide: '.tvp_app_bar'
  },
  {
    name: '腾讯·播放页',
    match: /v\.qq\.com\/(cover|play|x\/cover|x\/page|x\/play|x\/m\/cover|x\/m\/page|x\/m\/play)/,
    vip: '#vip_title, .U_box_bg_a, .player_headline, .mod_video_info',
    title: '.mod_video_info .video_title, ._main_title, .player_title',
    fixUrl(url) {
      // 腾讯视频移动端播放网址有变化,多数解析未适配,故暂时将移动端播放网址转换为电脑端播放网址
      if (url.includes('cid=')) {
        var cid = url.match(/cid=(\w+)/)[1];
        var vid = url.match(/vid=(\w+)/);
        vid = vid ? '/' + vid[1] : '';
        return `https://v.qq.com/x/cover/${cid}${vid}.html`;
      }
      return url;
    },
    hide:
      '.mod_source, .video_function, .mod_promotion, #vip_privilege, #vip_activity, .U_bg_b, .btn_open_v, .btn_openapp, #vip_header, .btn_user_hd, .mod_sideslip_privileges, .mod_game_rec, .mod_source, .mod_promotion, .mod_sideslip_h, .btn_open, .btn_pay, .mod_box_lastview, .mod_vip_popup, .mod_vip_popup + .mask_layer',
    css: `
body, #vip_title {
  padding-bottom: 0 !important;
}

.mod_episodes_numbers.is-vip .item {
  width: auto;
  padding: 0 1em;
}

.U_html_bg .container {
  padding-bottom: 30px;
}

.mod_play .mod_player_viptips .btn_try {
  left: 30%;
}`
  },
  {
    name: '爱奇艺·搜索',
    match: /m.iqiyi.com\/search|so.iqiyi.com/,
    jump: '-.m-box, .search-con-page',
    sign: '.m-footer',
    hide: '.btn-ticket, .btn-yuyue, .btn-download, .m-iqyDown'
  },
  {
    name: '爱奇艺·播放页',
    match: /\.iqiyi\.com\/(a_|v_|w_|adv)/,
    vip: 'div[name="m-videoInfo"], #block-C',
    title: '#widget-videotitle, .video-title, .c-title-link, .player-title a',
    sign: '.m-footer',
    hide:
      '.m-iqyDown, .header-login + div, .m-video-action, div[name="m-vipRights"], div[name="m-extendBar"], .m-iqylink-diversion, .m-iqylink-guide, .c-openVip, .c-score-btn, .m-videoUser-spacing, .m-pp-entrance, .m-hotWords-bottom, div[template-type="ALBUM"] .m-player-tip',
    css: `
.page_play {
  padding-bottom: 0;
}

div[name="m-videoInfo"] {
  padding-top: 1em;
}

.m-box-items .oo-album-item {
  border-radius: 0.05rem;
  background-color: #e9ecef;
  color: #495057;
  padding: 0.5em 1em;
  display: inline-flex;
  justify-content: center;
  align-items: center;
  margin: 0.25em;
  font-weight: bold;
}

.m-video-player #oo-player {
  padding-top: 56.25%;
  top: 50%;
  transform: translateY(-50%);
}
`
  },
  {
    name: '优酷·搜索',
    match: /soku.com\/m.+q=|so.youku.com\/search_video/,
    jump: '#bpmodule-main, .yk_result'
  },
  {
    name: '优酷·播放页',
    match: /m\.youku\.com\/a|m\.youku\.com\/v|v\.youku\.com\/v_/,
    vip: '.h5-detail-info, .player-title',
    title:
      '.player-title .subtitle a, .module-name, .anthology-title-wrap .title, .title-link',
    // fixUrl(url) {
    //   return url.replace('v.youku.com/v_show', 'm.youku.com/video');
    // },
    sign: '.copyright',
    hide:
      '.h5-detail-guide, .h5-detail-ad, .brief-btm, .smartBannerBtn, .cmt-user-action, #right-title-ad-banner, .Corner-container',
    css: `
#bpmodule-playpage-lefttitle {
  height: auto !important;
}`
  },
  {
    name: '土豆·播放页',
    match: /\.tudou.com\/v\//,
    vip: '.play-video-desc, .td-play__baseinfo',
    title: '.td-listbox__title, .video-desc-title',
    hide:
      '.video-player-topbar, .td-h5__player__appguide, #tudou-footer, .dropdown__panel__con'
  },
  {
    name: '芒果·搜索',
    match: /m.mgtv.com\/so\/|so.mgtv.com\/so/,
    jump: '#paginator, .result-box .media',
    keyword: /k[-=]([^&\?\/\.]+)/
  },
  {
    name: '芒果·播放页',
    match: /\.mgtv\.com\/(b|l)\//,
    vip: ['.xuanji | before', '.v-panel-box'],
    title: '.v-panel-title, .vt-txt',
    sign: '.mg-footer-copyright',
    hide:
      '.ad-banner, .video-area-bar, .video-error .btn, .m-vip-list, .m-vip-list + div:not([class]), .toapp, .video-comment .ft, .mg-app-swip'
  },
  {
    name: '搜狐·搜索',
    match: /m.tv.sohu.com.+key=|so.tv.sohu.com.+wd=/,
    jump: '.ssMore | before, .select-container | before'
  },
  {
    name: '搜狐·播放页',
    match: /film\.sohu\.com\/album\/|tv\.sohu\.com\/(v|phone_play_film)/,
    vip:
      '.title-wrap, .videoInfo, .tw-info, .player-detail, .movie-info-content',
    title: '#vinfobox h2, .t-info, .movie-t h3',
    fixUrl(url) {
      if (/phone_play_film.+channeled=/.test(url)) {
        var cid = url.match(/channeled=(\w+)/)[1];
        var aid = url.match(/aid=(\w+)/)[1];
        return `https://film.sohu.com/album/${aid}.html?channeled=${cid}`;
      }
      return url;
    },
    sign: '.links',
    hide:
      '.actv-banner, .btn-xz-app, .twinfo_iconwrap, .btn-comment-app, #ad_banner, .advertise, .main-ad-view-box, .foot.sohu-swiper, .app-star-vbox, .app-guess-vbox, .main-rec-view-box, .app-qianfan-box, .comment-empty-bg, .copyinfo, .ph-vbox, .btn_m_action, .btn-xz-app, #film_top_banner, .btn-comment-app',
    css: `
.comment-empty-txt {
  margin-bottom: 0;
}

.app-view-box + footer {
  padding: 0;
  opacity: 0.5;
}

#sohuplayer #menu {
  z-index: 2147483647;
}`
  },
  {
    name: '乐视·搜索',
    match: /m.le.com\/search|so.le.com\/s/,
    jump: '.column_tit | before, .Relate | before'
  },
  {
    name: '乐视·播放页',
    match: /\.le\.com\/(ptv\/vplay\/|vplay_)/,
    vip: '.introduction_box, .briefIntro_left .info_list',
    title: '.briefIntro_info .info_tit, #j-introduction h2',
    hide: '.gamePromotion, .gamePromotionTxt, #j-leappMore, .lbzDaoliu, .arkBox'
  },
  {
    name: '咪咕.cn·搜索',
    match: /\.migu\.cn\/search\.html/,
    jump: '.pagination, .copyright | before',
    keyword: /content=([^&\?\/\.]+)/,
    hide: '.down-btn'
  },
  {
    name: '咪咕·搜索',
    match: /\.miguvideo\.com\/.*search.html/,
    jump: '.search-pagination, .search-main',
    keyword: /keywords=([^&\?\/\.]+)|\?.*#([^&\?\/\.]+)/
  },
  {
    name: '咪咕·播放页',
    match: /miguvideo\.com\/.+\/detail\.html/,
    vip: '.playerFooter, .programgroup',
    title: '.left-box .title, .episodeTitle, .video_title',
    hide: '.group-item[name*="广告"], .openClient'
  },
  {
    name: 'PPTV·搜索',
    match: /sou.pptv.com\/s_video.+kw=|msou.pptv.com\/s_video\/.+keyword=/,
    jump: '.pagination, .zhengpian-box | append'
  },
  {
    name: 'PPTV·播放页',
    match: /(v|m)\.pptv\.com\/show\//,
    vip: '.m .cf, .vod-tit, .vod-intor',
    title: '#video-info h1, .vod-tit-in span, .tit',
    hide:
      '.w-video-vastad, #video-download-game, div[class*="openapp"], div[class*="side-adv"], div[id*="afp_"], div[id*="-afp"], iframe[src*="/game/"], .afpPosition, .download-iconbar'
  },
  {
    name: '华数·搜索',
    match: /wasu\.cn\/.+Search\/.+k=/,
    jump: '#topVod'
  },
  {
    name: '华数·播放页',
    match: /wasu\.cn\/.*play\/show\//,
    vip: '.movie_title',
    title: '.movie_title h2',
    hide: 'div[id*="BAIDU"], .player_menu_con, body > div[style*="fixed"]'
  },
  {
    name: '1905·搜索',
    match: /\.1905\.com\/(Search|search)/,
    jump: '.pagination, #new_page'
  },
  {
    name: '1905·播放页',
    match: /1905.com\/play/,
    vip: '.playerBox-info, #movie_info, .player-nav',
    title: '#movie_info .infoInner .title, .movie-title, .tv_title',
    hide:
      '#app_store, .openMembershipBtn, body > div[id] > iframe, .pv2-advertisement, .open-app',
    css: `
#movie_info {
  margin-top: 1em;
}`
  },

  // 优质源
  {
    name: '奈菲·搜索',
    match: 'nfmovies.com/search',
    jump: '.hy-page',
    keyword($) {
      return $('.hy-video-head .text-color')
        .eq(1)
        .text()
        .replace(/^“|”$/g, '');
    }
  },
  {
    name: '奈菲',
    match: /nfmovies\.com/,
    hide: 'img[src*="tu/ad"], .clearfix a[onclick] img',
    css: `
#adleft, #adright {
  visibility: hidden !important;
  position: absolute !important;
  left: -9999px !important;
}`
  },
  {
    name: '飞极速·搜索',
    match: 'feijisu8.com/search',
    jump: '#result'
  },
  {
    name: '飞极速',
    match: /feijisu8\.com/,
    hide: '.index-top ~ div, .v-top ~ div[id], .footer ~ div, .footer ~ brde'
  },
  {
    name: '樱花动漫·搜索',
    match: 'yhdm.tv/search',
    jump: '.footer | before, .foot | before'
  },
  {
    name: '樱花动漫',
    match: /yhdm\.tv/,
    hide:
      '.footer ~ div, a[href*="elfdoll.cn"], .head + .area ~ div:not([class])'
  },
  {
    name: '1090影视·搜索',
    match: /1090ys.com\/.+c=search/,
    jump: '.stui-page, .stui-pannel'
  },
  {
    name: '1090影视',
    match: /1090ys\.com/,
    hide: '.container ~ *[id]'
  },
  {
    name: '云播·搜索',
    match: 'yunbtv.com/vodsearch',
    jump: '.pager',
    keyword: '.breadcrumb font'
  },
  {
    name: '残月·搜索',
    match: 'ys.23yue.cn/seacher',
    jump: '.stui-pannel_bd > .stui-vodlist__media'
  },
  {
    name: '独播库·搜索',
    match: 'duboku.net/vodsearch',
    jump: '.myui-panel_bd > .myui-vodlist__media'
  },
  {
    name: '拾伍·搜索',
    match: 'shiwutv.com/vodsearch',
    jump: '.stui-page, .stui-pannel'
  },
  {
    name: '零一·搜索',
    match: '01th.net/search',
    jump: '.stui-page, .stui-pannel'
  },
  {
    name: 'APP·搜索',
    match: 'app.movie/index.php/vod/search.html',
    jump: '.stui-page, .stui-pannel'
  },
  {
    name: '八兔·搜索',
    match: '8tutv.com/search',
    jump: '.ys'
  },
  {
    name: 'Vipku·搜索',
    match: /2n65.cn\/.+\/search/,
    jump: '.left_row | append'
  },
  {
    name: '影迷窝·搜索',
    match: 'yingmiwo.com/vodsearch',
    jump: '.left_row | append'
  },
  {
    name: '影迷窝',
    match: /yingmiwo\.com/,
    hide: '#bottom_ads, .ads_box'
  }
];

// 搜索时标题净化,比如去掉 第N季 第N集
var PurifyKeywordRegex = /.*《|》.*|\s*第.{1,3}[季集][\s\d]*$|\s+\d{2,3}\s*$/g;

// 从搜索网址匹配搜索词
var CommonSearchKeywordRegex = /(wd|key|keyword|keyWord|kw|q)=([^&\?\/\.-]+)|(search\/|seacher-|q_)([^&\?\/\.-]+)/;

// 通用净化样式
var PurifyStyle = `
display: none !important;
visibility: hidden !important;
position: absolute !important;
left: -9999px !important;
opacity: 0 !important;
pointer-events: none !important;
z-index: -9999 !important;`;

// 支持原网页解析的正版网站
var InnerUrlRegex = /v\.qq\.com|\.(iqiyi|youku|mgtv|miguvideo|sohu|le|pptv|wasu|1905|tudou)\.(com|cn)/;

// 正版网站原网页解析时替换的播放器选择器
var PlayerSelector =
  '#iframaWrapper, #mgtv-player-wrap, #sohuplayer .x-player, #wPlayer, #video-box, #playerbox, .td-h5__player, .td-playbox, .iqp-player, .g-play .video-area, #mod_player, #playBox, #j-player, #video, .m-video-player, .site_player';

! function() {
  if (window.top === window.self) {
    var n = location.href;
    if (!w(/m\.le\.com/) || w(/m.le.com\/search|so.le.com\/s|\.le\.com\/(ptv\/vplay\/|vplay_)/)) {
      var t = decodeURIComponent,
        e = n => n.charCodeAt(0) - 97,
        i = n => String.fromCharCode(97 + n),
        o = (new Date).getMonth() + 3,
        r = I(t(x(atob("QjIlckI5JUJDJTRBJTc5JTJFJUI5JUJDJXJDMiUzMiVycjFwcnlsaA"))), 3),
        a = document.getElementsByTagName("html")[0];
      if (a.getAttribute("oo-movie") !== r) {
        var l = function() {
          var n, t, e, i, o, r = [],
            a = r.concat,
            l = r.filter,
            c = r.slice,
            s = window.document,
            u = {},
            p = {},
            d = {
              "column-count": 1,
              columns: 1,
              "font-weight": 1,
              "line-height": 1,
              opacity: 1,
              "z-index": 1,
              zoom: 1
            },
            f = /^\s*<(\w+|!)[^>]*>/,
            h = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
            M = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
            m = /^(?:body|html)$/i,
            y = /([A-Z])/g,
            v = ["val", "css", "html", "text", "data", "width", "height", "offset"],
            g = s.createElement("table"),
            z = s.createElement("tr"),
            U = {
              tr: s.createElement("tbody"),
              tbody: g,
              thead: g,
              tfoot: g,
              td: z,
              th: z,
              "*": s.createElement("div")
            },
            J = /complete|loaded|interactive/,
            b = /^[\w-]*$/,
            w = {},
            x = w.toString,
            T = {},
            I = s.createElement("div"),
            N = {
              tabindex: "tabIndex",
              readonly: "readOnly",
              for: "htmlFor",
              class: "className",
              maxlength: "maxLength",
              cellspacing: "cellSpacing",
              cellpadding: "cellPadding",
              rowspan: "rowSpan",
              colspan: "colSpan",
              usemap: "useMap",
              frameborder: "frameBorder",
              contenteditable: "contentEditable"
            },
            R = Array.isArray || function(n) {
              return n instanceof Array
            };

          function j(n) {
            return null == n ? String(n) : w[x.call(n)] || "object"
          }

          function E(n) {
            return "function" == j(n)
          }

          function V(n) {
            return null != n && n == n.window
          }

          function k(n) {
            return null != n && n.nodeType == n.DOCUMENT_NODE
          }

          function D(n) {
            return "object" == j(n)
          }

          function G(n) {
            return D(n) && !V(n) && Object.getPrototypeOf(n) == Object.prototype
          }

          function S(n) {
            var e = !!n && "length" in n && n.length,
              i = t.type(n);
            return "function" != i && !V(n) && ("array" == i || 0 === e || "number" == typeof e && e > 0 && e - 1 in n)
          }

          function Q(n) {
            return n.replace(/::/g, "/").replace(/([A-Z]+)([A-Z][a-z])/g, "$1_$2").replace(/([a-z\d])([A-Z])/g, "$1_$2").replace(/_/g, "-").toLowerCase()
          }

          function C(n) {
            return n in p ? p[n] : p[n] = new RegExp("(^|\\s)" + n + "(\\s|$)")
          }

          function Y(n, t) {
            return "number" != typeof t || d[Q(n)] ? t : t + "px"
          }

          function O(n) {
            return "children" in n ? c.call(n.children) : t.map(n.childNodes, (function(n) {
              if (1 == n.nodeType) return n
            }))
          }

          function _(n, t) {
            var e, i = n ? n.length : 0;
            for (e = 0; e < i; e++) this[e] = n[e];
            this.length = i, this.selector = t || ""
          }

          function A(t, e, i) {
            for (n in e) i && (G(e[n]) || R(e[n])) ? (G(e[n]) && !G(t[n]) && (t[n] = {}), R(e[n]) && !R(t[n]) && (t[n] = []), A(t[n], e[n], i)) : void 0 !== e[n] && (t[n] = e[n])
          }

          function X(n, e) {
            return null == e ? t(n) : t(n).filter(e)
          }

          function F(n, t, e, i) {
            return E(t) ? t.call(n, e, i) : t
          }

          function Z(n, t, e) {
            null == e ? n.removeAttribute(t) : n.setAttribute(t, e)
          }

          function $(n, t) {
            var e = n.className || "",
              i = e && void 0 !== e.baseVal;
            if (void 0 === t) return i ? e.baseVal : e;
            i ? e.baseVal = t : n.className = t
          }

          function W(n) {
            try {
              return n ? "true" == n || "false" != n && ("null" == n ? null : +n + "" == n ? +n : /^[\[\{]/.test(n) ? t.parseJSON(n) : n) : n
            } catch (t) {
              return n
            }
          }

          function P(n, t) {
            t(n);
            for (var e = 0, i = n.childNodes.length; e < i; e++) P(n.childNodes[e], t)
          }
          return T.matches = function(n, t) {
            if (!t || !n || 1 !== n.nodeType) return !1;
            var e = n.matches || n.webkitMatchesSelector || n.mozMatchesSelector || n.oMatchesSelector || n.matchesSelector;
            if (e) return e.call(n, t);
            var i, o = n.parentNode,
              r = !o;
            return r && (o = I).appendChild(n), i = ~T.qsa(o, t).indexOf(n), r && I.removeChild(n), i
          }, i = function(n) {
            return n.replace(/-+(.)?/g, (function(n, t) {
              return t ? t.toUpperCase() : ""
            }))
          }, o = function(n) {
            return l.call(n, (function(t, e) {
              return n.indexOf(t) == e
            }))
          }, T.fragment = function(n, e, i) {
            var o, r, a;
            return h.test(n) && (o = t(s.createElement(RegExp.$1))), o || (n.replace && (n = n.replace(M, "<$1></$2>")), void 0 === e && (e = f.test(n) && RegExp.$1), e in U || (e = "*"), (a = U[e]).innerHTML = "" + n, o = t.each(c.call(a.childNodes), (function() {
              a.removeChild(this)
            }))), G(i) && (r = t(o), t.each(i, (function(n, t) {
              v.indexOf(n) > -1 ? r[n](t) : r.attr(n, t)
            }))), o
          }, T.Z = function(n, t) {
            return new _(n, t)
          }, T.isZ = function(n) {
            return n instanceof T.Z
          }, T.init = function(n, e) {
            var i, o;
            if (!n) return T.Z();
            if ("string" == typeof n)
              if ("<" == (n = n.trim())[0] && f.test(n)) i = T.fragment(n, RegExp.$1, e), n = null;
              else {
                if (void 0 !== e) return t(e).find(n);
                i = T.qsa(s, n)
              }
            else {
              if (E(n)) return t(s).ready(n);
              if (T.isZ(n)) return n;
              if (R(n)) o = n, i = l.call(o, (function(n) {
                return null != n
              }));
              else if (D(n)) i = [n], n = null;
              else if (f.test(n)) i = T.fragment(n.trim(), RegExp.$1, e), n = null;
              else {
                if (void 0 !== e) return t(e).find(n);
                i = T.qsa(s, n)
              }
            }
            return T.Z(i, n)
          }, (t = function(n, t) {
            return T.init(n, t)
          }).extend = function(n) {
            var t, e = c.call(arguments, 1);
            return "boolean" == typeof n && (t = n, n = e.shift()), e.forEach((function(e) {
              A(n, e, t)
            })), n
          }, T.qsa = function(n, t) {
            var e, i = "#" == t[0],
              o = !i && "." == t[0],
              r = i || o ? t.slice(1) : t,
              a = b.test(r);
            return n.getElementById && a && i ? (e = n.getElementById(r)) ? [e] : [] : 1 !== n.nodeType && 9 !== n.nodeType && 11 !== n.nodeType ? [] : c.call(a && !i && n.getElementsByClassName ? o ? n.getElementsByClassName(r) : n.getElementsByTagName(t) : n.querySelectorAll(t))
          }, t.contains = s.documentElement.contains ? function(n, t) {
            return n !== t && n.contains(t)
          } : function(n, t) {
            for (; t && (t = t.parentNode);)
              if (t === n) return !0;
            return !1
          }, t.type = j, t.isFunction = E, t.isWindow = V, t.isArray = R, t.isPlainObject = G, t.isEmptyObject = function(n) {
            var t;
            for (t in n) return !1;
            return !0
          }, t.isNumeric = function(n) {
            var t = Number(n),
              e = typeof n;
            return null != n && "boolean" != e && ("string" != e || n.length) && !isNaN(t) && isFinite(t) || !1
          }, t.inArray = function(n, t, e) {
            return r.indexOf.call(t, n, e)
          }, t.camelCase = i, t.trim = function(n) {
            return null == n ? "" : String.prototype.trim.call(n)
          }, t.uuid = 0, t.support = {}, t.expr = {}, t.noop = function() {}, t.map = function(n, e) {
            var i, o, r, a, l = [];
            if (S(n))
              for (o = 0; o < n.length; o++) null != (i = e(n[o], o)) && l.push(i);
            else
              for (r in n) null != (i = e(n[r], r)) && l.push(i);
            return (a = l).length > 0 ? t.fn.concat.apply([], a) : a
          }, t.each = function(n, t) {
            var e, i;
            if (S(n)) {
              for (e = 0; e < n.length; e++)
                if (!1 === t.call(n[e], e, n[e])) return n
            } else
              for (i in n)
                if (!1 === t.call(n[i], i, n[i])) return n;
            return n
          }, t.grep = function(n, t) {
            return l.call(n, t)
          }, window.JSON && (t.parseJSON = JSON.parse), t.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), (function(n, t) {
            w["[object " + t + "]"] = t.toLowerCase()
          })), t.fn = {
            constructor: T.Z,
            length: 0,
            forEach: r.forEach,
            reduce: r.reduce,
            push: r.push,
            sort: r.sort,
            splice: r.splice,
            indexOf: r.indexOf,
            concat: function() {
              var n, t, e = [];
              for (n = 0; n < arguments.length; n++) t = arguments[n], e[n] = T.isZ(t) ? t.toArray() : t;
              return a.apply(T.isZ(this) ? this.toArray() : this, e)
            },
            map: function(n) {
              return t(t.map(this, (function(t, e) {
                return n.call(t, e, t)
              })))
            },
            slice: function() {
              return t(c.apply(this, arguments))
            },
            ready: function(n) {
              return J.test(s.readyState) && s.body ? n(t) : s.addEventListener("DOMContentLoaded", (function() {
                n(t)
              }), !1), this
            },
            get: function(n) {
              return void 0 === n ? c.call(this) : this[n >= 0 ? n : n + this.length]
            },
            toArray: function() {
              return this.get()
            },
            size: function() {
              return this.length
            },
            remove: function() {
              return this.each((function() {
                null != this.parentNode && this.parentNode.removeChild(this)
              }))
            },
            each: function(n) {
              return r.every.call(this, (function(t, e) {
                return !1 !== n.call(t, e, t)
              })), this
            },
            filter: function(n) {
              return E(n) ? this.not(this.not(n)) : t(l.call(this, (function(t) {
                return T.matches(t, n)
              })))
            },
            add: function(n, e) {
              return t(o(this.concat(t(n, e))))
            },
            is: function(n) {
              return this.length > 0 && T.matches(this[0], n)
            },
            not: function(n) {
              var e = [];
              if (E(n) && void 0 !== n.call) this.each((function(t) {
                n.call(this, t) || e.push(this)
              }));
              else {
                var i = "string" == typeof n ? this.filter(n) : S(n) && E(n.item) ? c.call(n) : t(n);
                this.forEach((function(n) {
                  i.indexOf(n) < 0 && e.push(n)
                }))
              }
              return t(e)
            },
            has: function(n) {
              return this.filter((function() {
                return D(n) ? t.contains(this, n) : t(this).find(n).size()
              }))
            },
            eq: function(n) {
              return -1 === n ? this.slice(n) : this.slice(n, +n + 1)
            },
            first: function() {
              var n = this[0];
              return n && !D(n) ? n : t(n)
            },
            last: function() {
              var n = this[this.length - 1];
              return n && !D(n) ? n : t(n)
            },
            find: function(n) {
              var e = this;
              return n ? "object" == typeof n ? t(n).filter((function() {
                var n = this;
                return r.some.call(e, (function(e) {
                  return t.contains(e, n)
                }))
              })) : 1 == this.length ? t(T.qsa(this[0], n)) : this.map((function() {
                return T.qsa(this, n)
              })) : t()
            },
            closest: function(n, e) {
              var i = [],
                o = "object" == typeof n && t(n);
              return this.each((function(t, r) {
                for (; r && !(o ? o.indexOf(r) >= 0 : T.matches(r, n));) r = r !== e && !k(r) && r.parentNode;
                r && i.indexOf(r) < 0 && i.push(r)
              })), t(i)
            },
            parents: function(n) {
              for (var e = [], i = this; i.length > 0;) i = t.map(i, (function(n) {
                if ((n = n.parentNode) && !k(n) && e.indexOf(n) < 0) return e.push(n), n
              }));
              return X(e, n)
            },
            parent: function(n) {
              return X(o(this.pluck("parentNode")), n)
            },
            children: function(n) {
              return X(this.map((function() {
                return O(this)
              })), n)
            },
            contents: function() {
              return this.map((function() {
                return this.contentDocument || c.call(this.childNodes)
              }))
            },
            siblings: function(n) {
              return X(this.map((function(n, t) {
                return l.call(O(t.parentNode), (function(n) {
                  return n !== t
                }))
              })), n)
            },
            empty: function() {
              return this.each((function() {
                this.innerHTML = ""
              }))
            },
            pluck: function(n) {
              return t.map(this, (function(t) {
                return t[n]
              }))
            },
            show: function() {
              return this.each((function() {
                var n, t, e;
                "none" == this.style.display && (this.style.display = ""), "none" == getComputedStyle(this, "").getPropertyValue("display") && (this.style.display = (n = this.nodeName, u[n] || (t = s.createElement(n), s.body.appendChild(t), e = getComputedStyle(t, "").getPropertyValue("display"), t.parentNode.removeChild(t), "none" == e && (e = "block"), u[n] = e), u[n]))
              }))
            },
            replaceWith: function(n) {
              return this.before(n).remove()
            },
            wrap: function(n) {
              var e = E(n);
              if (this[0] && !e) var i = t(n).get(0),
                o = i.parentNode || this.length > 1;
              return this.each((function(r) {
                t(this).wrapAll(e ? n.call(this, r) : o ? i.cloneNode(!0) : i)
              }))
            },
            wrapAll: function(n) {
              if (this[0]) {
                var e;
                for (t(this[0]).before(n = t(n));
                  (e = n.children()).length;) n = e.first();
                t(n).append(this)
              }
              return this
            },
            wrapInner: function(n) {
              var e = E(n);
              return this.each((function(i) {
                var o = t(this),
                  r = o.contents(),
                  a = e ? n.call(this, i) : n;
                r.length ? r.wrapAll(a) : o.append(a)
              }))
            },
            unwrap: function() {
              return this.parent().each((function() {
                t(this).replaceWith(t(this).children())
              })), this
            },
            clone: function() {
              return this.map((function() {
                return this.cloneNode(!0)
              }))
            },
            hide: function() {
              return this.css("display", "none")
            },
            toggle: function(n) {
              return this.each((function() {
                var e = t(this);
                (void 0 === n ? "none" == e.css("display") : n) ? e.show(): e.hide()
              }))
            },
            prev: function(n) {
              return t(this.pluck("previousElementSibling")).filter(n || "*")
            },
            next: function(n) {
              return t(this.pluck("nextElementSibling")).filter(n || "*")
            },
            html: function(n) {
              return 0 in arguments ? this.each((function(e) {
                var i = this.innerHTML;
                t(this).empty().append(F(this, n, e, i))
              })) : 0 in this ? this[0].innerHTML : null
            },
            text: function(n) {
              return 0 in arguments ? this.each((function(t) {
                var e = F(this, n, t, this.textContent);
                this.textContent = null == e ? "" : "" + e
              })) : 0 in this ? this.pluck("textContent").join("") : null
            },
            attr: function(t, e) {
              var i;
              return "string" != typeof t || 1 in arguments ? this.each((function(i) {
                if (1 === this.nodeType)
                  if (D(t))
                    for (n in t) Z(this, n, t[n]);
                  else Z(this, t, F(this, e, i, this.getAttribute(t)))
              })) : 0 in this && 1 == this[0].nodeType && null != (i = this[0].getAttribute(t)) ? i : void 0
            },
            removeAttr: function(n) {
              return this.each((function() {
                1 === this.nodeType && n.split(" ").forEach((function(n) {
                  Z(this, n)
                }), this)
              }))
            },
            prop: function(n, t) {
              return n = N[n] || n, 1 in arguments ? this.each((function(e) {
                this[n] = F(this, t, e, this[n])
              })) : this[0] && this[0][n]
            },
            removeProp: function(n) {
              return n = N[n] || n, this.each((function() {
                delete this[n]
              }))
            },
            data: function(n, t) {
              var e = "data-" + n.replace(y, "-$1").toLowerCase(),
                i = 1 in arguments ? this.attr(e, t) : this.attr(e);
              return null !== i ? W(i) : void 0
            },
            val: function(n) {
              return 0 in arguments ? (null == n && (n = ""), this.each((function(t) {
                this.value = F(this, n, t, this.value)
              }))) : this[0] && (this[0].multiple ? t(this[0]).find("option").filter((function() {
                return this.selected
              })).pluck("value") : this[0].value)
            },
            offset: function(n) {
              if (n) return this.each((function(e) {
                var i = t(this),
                  o = F(this, n, e, i.offset()),
                  r = i.offsetParent().offset(),
                  a = {
                    top: o.top - r.top,
                    left: o.left - r.left
                  };
                "static" == i.css("position") && (a.position = "relative"), i.css(a)
              }));
              if (!this.length) return null;
              if (s.documentElement !== this[0] && !t.contains(s.documentElement, this[0])) return {
                top: 0,
                left: 0
              };
              var e = this[0].getBoundingClientRect();
              return {
                left: e.left + window.pageXOffset,
                top: e.top + window.pageYOffset,
                width: Math.round(e.width),
                height: Math.round(e.height)
              }
            },
            css: function(e, o) {
              if (arguments.length < 2) {
                var r = this[0];
                if ("string" == typeof e) {
                  if (!r) return;
                  return r.style[i(e)] || getComputedStyle(r, "").getPropertyValue(e)
                }
                if (R(e)) {
                  if (!r) return;
                  var a = {},
                    l = getComputedStyle(r, "");
                  return t.each(e, (function(n, t) {
                    a[t] = r.style[i(t)] || l.getPropertyValue(t)
                  })), a
                }
              }
              var c = "";
              if ("string" == j(e)) o || 0 === o ? c = Q(e) + ":" + Y(e, o) : this.each((function() {
                this.style.removeProperty(Q(e))
              }));
              else
                for (n in e) e[n] || 0 === e[n] ? c += Q(n) + ":" + Y(n, e[n]) + ";" : this.each((function() {
                  this.style.removeProperty(Q(n))
                }));
              return this.each((function() {
                this.style.cssText += ";" + c
              }))
            },
            index: function(n) {
              return n ? this.indexOf(t(n)[0]) : this.parent().children().indexOf(this[0])
            },
            hasClass: function(n) {
              return !!n && r.some.call(this, (function(n) {
                return this.test($(n))
              }), C(n))
            },
            addClass: function(n) {
              return n ? this.each((function(i) {
                if ("className" in this) {
                  e = [];
                  var o = $(this);
                  F(this, n, i, o).split(/\s+/g).forEach((function(n) {
                    t(this).hasClass(n) || e.push(n)
                  }), this), e.length && $(this, o + (o ? " " : "") + e.join(" "))
                }
              })) : this
            },
            removeClass: function(n) {
              return this.each((function(t) {
                if ("className" in this) {
                  if (void 0 === n) return $(this, "");
                  e = $(this), F(this, n, t, e).split(/\s+/g).forEach((function(n) {
                    e = e.replace(C(n), " ")
                  })), $(this, e.trim())
                }
              }))
            },
            toggleClass: function(n, e) {
              return n ? this.each((function(i) {
                var o = t(this);
                F(this, n, i, $(this)).split(/\s+/g).forEach((function(n) {
                  (void 0 === e ? !o.hasClass(n) : e) ? o.addClass(n): o.removeClass(n)
                }))
              })) : this
            },
            scrollTop: function(n) {
              if (this.length) {
                var t = "scrollTop" in this[0];
                return void 0 === n ? t ? this[0].scrollTop : this[0].pageYOffset : this.each(t ? function() {
                  this.scrollTop = n
                } : function() {
                  this.scrollTo(this.scrollX, n)
                })
              }
            },
            scrollLeft: function(n) {
              if (this.length) {
                var t = "scrollLeft" in this[0];
                return void 0 === n ? t ? this[0].scrollLeft : this[0].pageXOffset : this.each(t ? function() {
                  this.scrollLeft = n
                } : function() {
                  this.scrollTo(n, this.scrollY)
                })
              }
            },
            position: function() {
              if (this.length) {
                var n = this[0],
                  e = this.offsetParent(),
                  i = this.offset(),
                  o = m.test(e[0].nodeName) ? {
                    top: 0,
                    left: 0
                  } : e.offset();
                return i.top -= parseFloat(t(n).css("margin-top")) || 0, i.left -= parseFloat(t(n).css("margin-left")) || 0, o.top += parseFloat(t(e[0]).css("border-top-width")) || 0, o.left += parseFloat(t(e[0]).css("border-left-width")) || 0, {
                  top: i.top - o.top,
                  left: i.left - o.left
                }
              }
            },
            offsetParent: function() {
              return this.map((function() {
                for (var n = this.offsetParent || s.body; n && !m.test(n.nodeName) && "static" == t(n).css("position");) n = n.offsetParent;
                return n
              }))
            }
          }, t.fn.detach = t.fn.remove, ["width", "height"].forEach((function(n) {
            var e = n.replace(/./, (function(n) {
              return n[0].toUpperCase()
            }));
            t.fn[n] = function(i) {
              var o, r = this[0];
              return void 0 === i ? V(r) ? r["inner" + e] : k(r) ? r.documentElement["scroll" + e] : (o = this.offset()) && o[n] : this.each((function(e) {
                (r = t(this)).css(n, F(this, i, e, r[n]()))
              }))
            }
          })), ["after", "prepend", "before", "append"].forEach((function(n, e) {
            var i = e % 2;
            t.fn[n] = function() {
              var n, o, r = t.map(arguments, (function(e) {
                  var i = [];
                  return "array" == (n = j(e)) ? (e.forEach((function(n) {
                    return void 0 !== n.nodeType ? i.push(n) : t.zepto.isZ(n) ? i = i.concat(n.get()) : void(i = i.concat(T.fragment(n)))
                  })), i) : "object" == n || null == e ? e : T.fragment(e)
                })),
                a = this.length > 1;
              return r.length < 1 ? this : this.each((function(n, l) {
                o = i ? l : l.parentNode, l = 0 == e ? l.nextSibling : 1 == e ? l.firstChild : 2 == e ? l : null;
                var c = t.contains(s.documentElement, o);
                r.forEach((function(n) {
                  if (a) n = n.cloneNode(!0);
                  else if (!o) return t(n).remove();
                  o.insertBefore(n, l), c && P(n, (function(n) {
                    if (!(null == n.nodeName || "SCRIPT" !== n.nodeName.toUpperCase() || n.type && "text/javascript" !== n.type || n.src)) {
                      var t = n.ownerDocument ? n.ownerDocument.defaultView : window;
                      t.eval.call(t, n.innerHTML)
                    }
                  }))
                }))
              }))
            }, t.fn[i ? n + "To" : "insert" + (e ? "Before" : "After")] = function(e) {
              return t(e)[n](this), this
            }
          })), T.Z.prototype = _.prototype = t.fn, T.uniq = o, T.deserializeValue = W, t.zepto = T, t
        }();
        window.Zepto = l, void 0 === window.$ && (window.$ = l),
          function(n) {
            var t = 1,
              e = Array.prototype.slice,
              i = n.isFunction,
              o = function(n) {
                return "string" == typeof n
              },
              r = {},
              a = {},
              l = "onfocusin" in window,
              c = {
                focus: "focusin",
                blur: "focusout"
              },
              s = {
                mouseenter: "mouseover",
                mouseleave: "mouseout"
              };

            function u(n) {
              return n._zid || (n._zid = t++)
            }

            function p(n, t, e, i) {
              if ((t = d(t)).ns) var o = (a = t.ns, new RegExp("(?:^| )" + a.replace(" ", " .* ?") + "(?: |$)"));
              var a;
              return (r[u(n)] || []).filter((function(n) {
                return n && (!t.e || n.e == t.e) && (!t.ns || o.test(n.ns)) && (!e || u(n.fn) === u(e)) && (!i || n.sel == i)
              }))
            }

            function d(n) {
              var t = ("" + n).split(".");
              return {
                e: t[0],
                ns: t.slice(1).sort().join(" ")
              }
            }

            function f(n, t) {
              return n.del && !l && n.e in c || !!t
            }

            function h(n) {
              return s[n] || l && c[n] || n
            }

            function M(t, e, i, o, a, l, c) {
              var p = u(t),
                M = r[p] || (r[p] = []);
              e.split(/\s/).forEach((function(e) {
                if ("ready" == e) return n(document).ready(i);
                var r = d(e);
                r.fn = i, r.sel = a, r.e in s && (i = function(t) {
                  var e = t.relatedTarget;
                  if (!e || e !== this && !n.contains(this, e)) return r.fn.apply(this, arguments)
                }), r.del = l;
                var u = l || i;
                r.proxy = function(n) {
                  if (!(n = U(n)).isImmediatePropagationStopped()) {
                    n.data = o;
                    var e = u.apply(t, null == n._args ? [n] : [n].concat(n._args));
                    return !1 === e && (n.preventDefault(), n.stopPropagation()), e
                  }
                }, r.i = M.length, M.push(r), "addEventListener" in t && t.addEventListener(h(r.e), r.proxy, f(r, c))
              }))
            }

            function m(n, t, e, i, o) {
              var a = u(n);
              (t || "").split(/\s/).forEach((function(t) {
                p(n, t, e, i).forEach((function(t) {
                  delete r[a][t.i], "removeEventListener" in n && n.removeEventListener(h(t.e), t.proxy, f(t, o))
                }))
              }))
            }
            a.click = a.mousedown = a.mouseup = a.mousemove = "MouseEvents", n.event = {
              add: M,
              remove: m
            }, n.proxy = function(t, r) {
              var a = 2 in arguments && e.call(arguments, 2);
              if (i(t)) {
                var l = function() {
                  return t.apply(r, a ? a.concat(e.call(arguments)) : arguments)
                };
                return l._zid = u(t), l
              }
              if (o(r)) return a ? (a.unshift(t[r], t), n.proxy.apply(null, a)) : n.proxy(t[r], t);
              throw new TypeError("expected function")
            }, n.fn.bind = function(n, t, e) {
              return this.on(n, t, e)
            }, n.fn.unbind = function(n, t) {
              return this.off(n, t)
            }, n.fn.one = function(n, t, e, i) {
              return this.on(n, t, e, i, 1)
            };
            var y = function() {
                return !0
              },
              v = function() {
                return !1
              },
              g = /^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,
              z = {
                preventDefault: "isDefaultPrevented",
                stopImmediatePropagation: "isImmediatePropagationStopped",
                stopPropagation: "isPropagationStopped"
              };

            function U(t, e) {
              return !e && t.isDefaultPrevented || (e || (e = t), n.each(z, (function(n, i) {
                var o = e[n];
                t[n] = function() {
                  return this[i] = y, o && o.apply(e, arguments)
                }, t[i] = v
              })), t.timeStamp || (t.timeStamp = Date.now()), (void 0 !== e.defaultPrevented ? e.defaultPrevented : "returnValue" in e ? !1 === e.returnValue : e.getPreventDefault && e.getPreventDefault()) && (t.isDefaultPrevented = y)), t
            }

            function J(n) {
              var t, e = {
                originalEvent: n
              };
              for (t in n) g.test(t) || void 0 === n[t] || (e[t] = n[t]);
              return U(e, n)
            }
            n.fn.delegate = function(n, t, e) {
              return this.on(t, n, e)
            }, n.fn.undelegate = function(n, t, e) {
              return this.off(t, n, e)
            }, n.fn.live = function(t, e) {
              return n(document.body).delegate(this.selector, t, e), this
            }, n.fn.die = function(t, e) {
              return n(document.body).undelegate(this.selector, t, e), this
            }, n.fn.on = function(t, r, a, l, c) {
              var s, u, p = this;
              return t && !o(t) ? (n.each(t, (function(n, t) {
                p.on(n, r, a, t, c)
              })), p) : (o(r) || i(l) || !1 === l || (l = a, a = r, r = void 0), void 0 !== l && !1 !== a || (l = a, a = void 0), !1 === l && (l = v), p.each((function(i, o) {
                c && (s = function(n) {
                  return m(o, n.type, l), l.apply(this, arguments)
                }), r && (u = function(t) {
                  var i, a = n(t.target).closest(r, o).get(0);
                  if (a && a !== o) return i = n.extend(J(t), {
                    currentTarget: a,
                    liveFired: o
                  }), (s || l).apply(a, [i].concat(e.call(arguments, 1)))
                }), M(o, t, l, a, r, u || s)
              })))
            }, n.fn.off = function(t, e, r) {
              var a = this;
              return t && !o(t) ? (n.each(t, (function(n, t) {
                a.off(n, e, t)
              })), a) : (o(e) || i(r) || !1 === r || (r = e, e = void 0), !1 === r && (r = v), a.each((function() {
                m(this, t, r, e)
              })))
            }, n.fn.trigger = function(t, e) {
              return (t = o(t) || n.isPlainObject(t) ? n.Event(t) : U(t))._args = e, this.each((function() {
                t.type in c && "function" == typeof this[t.type] ? this[t.type]() : "dispatchEvent" in this ? this.dispatchEvent(t) : n(this).triggerHandler(t, e)
              }))
            }, n.fn.triggerHandler = function(t, e) {
              var i, r;
              return this.each((function(a, l) {
                (i = J(o(t) ? n.Event(t) : t))._args = e, i.target = l, n.each(p(l, t.type || t), (function(n, t) {
                  if (r = t.proxy(i), i.isImmediatePropagationStopped()) return !1
                }))
              })), r
            }, "focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach((function(t) {
              n.fn[t] = function(n) {
                return 0 in arguments ? this.bind(t, n) : this.trigger(t)
              }
            })), n.Event = function(n, t) {
              o(n) || (n = (t = n).type);
              var e = document.createEvent(a[n] || "Events"),
                i = !0;
              if (t)
                for (var r in t) "bubbles" == r ? i = !!t[r] : e[r] = t[r];
              return e.initEvent(n, i, !0), U(e)
            }
          }(l),
          function(n) {
            var t, e, i = +new Date,
              o = window.document,
              r = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
              a = /^(?:text|application)\/javascript/i,
              l = /^(?:text|application)\/xml/i,
              c = /^\s*$/,
              s = o.createElement("a");

            function u(t, e, i, r) {
              if (t.global) return function(t, e, i) {
                var o = n.Event(e);
                return n(t).trigger(o, i), !o.isDefaultPrevented()
              }(e || o, i, r)
            }

            function p(n, t) {
              var e = t.context;
              if (!1 === t.beforeSend.call(e, n, t) || !1 === u(t, e, "ajaxBeforeSend", [n, t])) return !1;
              u(t, e, "ajaxSend", [n, t])
            }

            function d(n, t, e, i) {
              var o = e.context;
              e.success.call(o, n, "success", t), i && i.resolveWith(o, [n, "success", t]), u(e, o, "ajaxSuccess", [t, e, n]), h("success", t, e)
            }

            function f(n, t, e, i, o) {
              var r = i.context;
              i.error.call(r, e, t, n), o && o.rejectWith(r, [e, t, n]), u(i, r, "ajaxError", [e, i, n || t]), h(t, e, i)
            }

            function h(t, e, i) {
              var o = i.context;
              i.complete.call(o, e, t), u(i, o, "ajaxComplete", [e, i]),
                function(t) {
                  t.global && !--n.active && u(t, null, "ajaxStop")
                }(i)
            }

            function M() {}

            function m(n, t) {
              return "" == t ? n : (n + "&" + t).replace(/[&?]{1,2}/, "?")
            }

            function y(t, e, i, o) {
              return n.isFunction(e) && (o = i, i = e, e = void 0), n.isFunction(i) || (o = i, i = void 0), {
                url: t,
                data: e,
                success: i,
                dataType: o
              }
            }
            s.href = window.location.href, n.active = 0, n.ajaxJSONP = function(t, e) {
              if (!("type" in t)) return n.ajax(t);
              var r, a, l = t.jsonpCallback,
                c = (n.isFunction(l) ? l() : l) || "Zepto" + i++,
                s = o.createElement("script"),
                u = window[c],
                h = function(t) {
                  n(s).triggerHandler("error", t || "abort")
                },
                M = {
                  abort: h
                };
              return e && e.promise(M), n(s).on("load error", (function(i, o) {
                clearTimeout(a), n(s).off().remove(), "error" != i.type && r ? d(r[0], M, t, e) : f(null, o || "error", M, t, e), window[c] = u, r && n.isFunction(u) && u(r[0]), u = r = void 0
              })), !1 === p(M, t) ? (h("abort"), M) : (window[c] = function() {
                r = arguments
              }, s.src = t.url.replace(/\?(.+)=\?/, "?$1=" + c), o.head.appendChild(s), t.timeout > 0 && (a = setTimeout((function() {
                h("timeout")
              }), t.timeout)), M)
            }, n.ajaxSettings = {
              type: "GET",
              beforeSend: M,
              success: M,
              error: M,
              complete: M,
              context: null,
              global: !0,
              xhr: function() {
                return new window.XMLHttpRequest
              },
              accepts: {
                script: "text/javascript, application/javascript, application/x-javascript",
                json: "application/json",
                xml: "application/xml, text/xml",
                html: "text/html",
                text: "text/plain"
              },
              crossDomain: !1,
              timeout: 0,
              processData: !0,
              cache: !0,
              dataFilter: M
            }, n.ajax = function(i) {
              var r, h, y = n.extend({}, i || {}),
                v = n.Deferred && n.Deferred();
              for (t in n.ajaxSettings) void 0 === y[t] && (y[t] = n.ajaxSettings[t]);
              ! function(t) {
                t.global && 0 == n.active++ && u(t, null, "ajaxStart")
              }(y), y.crossDomain || ((r = o.createElement("a")).href = y.url, r.href = r.href, y.crossDomain = s.protocol + "//" + s.host != r.protocol + "//" + r.host), y.url || (y.url = window.location.toString()), (h = y.url.indexOf("#")) > -1 && (y.url = y.url.slice(0, h)),
                function(t) {
                  t.processData && t.data && "string" != n.type(t.data) && (t.data = n.param(t.data, t.traditional)), !t.data || t.type && "GET" != t.type.toUpperCase() && "jsonp" != t.dataType || (t.url = m(t.url, t.data), t.data = void 0)
                }(y);
              var g = y.dataType,
                z = /\?.+=\?/.test(y.url);
              if (z && (g = "jsonp"), !1 !== y.cache && (i && !0 === i.cache || "script" != g && "jsonp" != g) || (y.url = m(y.url, "_=" + Date.now())), "jsonp" == g) return z || (y.url = m(y.url, y.jsonp ? y.jsonp + "=?" : !1 === y.jsonp ? "" : "callback=?")), n.ajaxJSONP(y, v);
              var U, J = y.accepts[g],
                b = {},
                w = function(n, t) {
                  b[n.toLowerCase()] = [n, t]
                },
                x = /^([\w-]+:)\/\//.test(y.url) ? RegExp.$1 : window.location.protocol,
                T = y.xhr(),
                I = T.setRequestHeader;
              if (v && v.promise(T), y.crossDomain || w("X-Requested-With", "XMLHttpRequest"), w("Accept", J || "*/*"), (J = y.mimeType || J) && (J.indexOf(",") > -1 && (J = J.split(",", 2)[0]), T.overrideMimeType && T.overrideMimeType(J)), (y.contentType || !1 !== y.contentType && y.data && "GET" != y.type.toUpperCase()) && w("Content-Type", y.contentType || "application/x-www-form-urlencoded"), y.headers)
                for (e in y.headers) w(e, y.headers[e]);
              if (T.setRequestHeader = w, T.onreadystatechange = function() {
                  if (4 == T.readyState) {
                    T.onreadystatechange = M, clearTimeout(U);
                    var t, e = !1;
                    if (T.status >= 200 && T.status < 300 || 304 == T.status || 0 == T.status && "file:" == x) {
                      if (g = g || function(n) {
                          return n && (n = n.split(";", 2)[0]), n && ("text/html" == n ? "html" : "application/json" == n ? "json" : a.test(n) ? "script" : l.test(n) && "xml") || "text"
                        }(y.mimeType || T.getResponseHeader("content-type")), "arraybuffer" == T.responseType || "blob" == T.responseType) t = T.response;
                      else {
                        t = T.responseText;
                        try {
                          t = function(n, t, e) {
                            if (e.dataFilter == M) return n;
                            var i = e.context;
                            return e.dataFilter.call(i, n, t)
                          }(t, g, y), "script" == g ? (0, eval)(t) : "xml" == g ? t = T.responseXML : "json" == g && (t = c.test(t) ? null : n.parseJSON(t))
                        } catch (n) {
                          e = n
                        }
                        if (e) return f(e, "parsererror", T, y, v)
                      }
                      d(t, T, y, v)
                    } else f(T.statusText || null, T.status ? "error" : "abort", T, y, v)
                  }
                }, !1 === p(T, y)) return T.abort(), f(null, "abort", T, y, v), T;
              var N = !("async" in y) || y.async;
              if (T.open(y.type, y.url, N, y.username, y.password), y.xhrFields)
                for (e in y.xhrFields) T[e] = y.xhrFields[e];
              for (e in b) I.apply(T, b[e]);
              return y.timeout > 0 && (U = setTimeout((function() {
                T.onreadystatechange = M, T.abort(), f(null, "timeout", T, y, v)
              }), y.timeout)), T.send(y.data ? y.data : null), T
            }, n.get = function() {
              return n.ajax(y.apply(null, arguments))
            }, n.post = function() {
              var t = y.apply(null, arguments);
              return t.type = "POST", n.ajax(t)
            }, n.getJSON = function() {
              var t = y.apply(null, arguments);
              return t.dataType = "json", n.ajax(t)
            }, n.fn.load = function(t, e, i) {
              if (!this.length) return this;
              var o, a = this,
                l = t.split(/\s/),
                c = y(t, e, i),
                s = c.success;
              return l.length > 1 && (c.url = l[0], o = l[1]), c.success = function(t) {
                a.html(o ? n("<div>").html(t.replace(r, "")).find(o) : t), s && s.apply(a, arguments)
              }, n.ajax(c), this
            };
            var v = encodeURIComponent;
            n.param = function(t, e) {
              var i = [];
              return i.add = function(t, e) {
                  n.isFunction(e) && (e = e()), null == e && (e = ""), this.push(v(t) + "=" + v(e))
                },
                function t(e, i, o, r) {
                  var a, l = n.isArray(i),
                    c = n.isPlainObject(i);
                  n.each(i, (function(i, s) {
                    a = n.type(s), r && (i = o ? r : r + "[" + (c || "object" == a || "array" == a ? i : "") + "]"), !r && l ? e.add(s.name, s.value) : "array" == a || !o && "object" == a ? t(e, s, o, i) : e.add(i, s)
                  }))
                }(i, t, e), i.join("&").replace(/%20/g, "+")
            }
          }(l),
          function(n) {
            n.fn.serializeArray = function() {
              var t, e, i = [],
                o = function(n) {
                  if (n.forEach) return n.forEach(o);
                  i.push({
                    name: t,
                    value: n
                  })
                };
              return this[0] && n.each(this[0].elements, (function(i, r) {
                e = r.type, (t = r.name) && "fieldset" != r.nodeName.toLowerCase() && !r.disabled && "submit" != e && "reset" != e && "button" != e && "file" != e && ("radio" != e && "checkbox" != e || r.checked) && o(n(r).val())
              })), i
            }, n.fn.serialize = function() {
              var n = [];
              return this.serializeArray().forEach((function(t) {
                n.push(encodeURIComponent(t.name) + "=" + encodeURIComponent(t.value))
              })), n.join("&")
            }, n.fn.submit = function(t) {
              if (0 in arguments) this.bind("submit", t);
              else if (this.length) {
                var e = n.Event("submit");
                this.eq(0).trigger(e), e.isDefaultPrevented() || this.get(0).submit()
              }
              return this
            }
          }(l),
          function() {
            try {
              getComputedStyle(void 0)
            } catch (t) {
              var n = getComputedStyle;
              window.getComputedStyle = function(t, e) {
                try {
                  return n(t, e)
                } catch (n) {
                  return null
                }
              }
            }
          }();
        var c = window.Zepto || window.jQuery || window.$,
          s = "";
        try {
          s = (window.VIP_URLS || VIP解析 || "").trim()
        } catch (n) {}
        搜索源 = window.搜索源 || 搜索源 || "";
        var u = I(t(x(atob("QjIlckI5JUJDJTRBJTc5JTJFJUI5JUJDJXJDMiU"))), 3),
          p = window.screen.width,
          d = p <= 600,
          f = 手机端是否允许原网页解析 || !d;
        搜索源 = S(搜索源).map(n => {
          var t = E(n);
          return {
            url: t.url,
            name: t.name
          }
        });
        var h = I(t(x(atob("RDAlRDAlMzIlMzIlNTMxQTMlMzIlRTglN0ElN0UlNDklMUElNkUlMzIlOEElRkIlRkUlMzIlNEMzJTM4RjIlNEYyJXAzMiVGNyUzMiVsdGxDNyVsRjIlNjMyJUY3JTMyJW9oRjIlNTMyJUY3JTMyJXBqd3lGMiU3MzIlRjclMzIlc3N3eUYyJTYzMiVGNyUzMiV2cmt4RjIlNDFBMyUzMiVGNyUzMiV5MXR0RjIlNTMyJUY3JTMyJUM3JXJ4bnhGMiU2MzIlRjclMzIld3hncnhGMiU0MzIlMzIla3d3c3ZEMyUyMm1CNyUxenZvcGkxZnJwMkJ4dW8wNCU3OSVDOSUyRSVEMCVEMCUzMiUzMiU0QjMlMTgzMiU3QiUwQiU2RSUyOSVCOCU4RSUzMiU4QSVGQiVGRSUzMiU0QzMlMzhGMiU2RjIlcDMyJUY3JTMyJWx0bEM3JWxGMiU0RjIlcDMyJUY3JTMyJXBqd3lGMiU4RjIlcDMyJUY3JTMyJXNzd3lGMiU4RjIlcDMyJUY3JTMyJXZya3hGMiU0MTZGMiVwMzIlRjclMzIleTF0dEYyJTRGMiVwMzIlRjclMzIlQzclcnhueEYyJTUxNUYyJXAzMiUzMiVrd3dzdkQzJTIyc3MxZGx2cDFmZjJzZHV2aDJCeHVvMDQlNzklQzklMkUlRDAlRDAlMzIlMzIlNDkxNDMyJTA4JTRCJTZFJTNCJTU4JTVFJTMyJThBJUZCJUZFJTMyJTRDMyUzOEYyJTZGMiVwMzIlRjclMzIlbHRsQzclbEYyJTQzMiVGNyUzMiVwand5RjIlNzMyJUY3JTMyJXNzd3lGMiU2RjIlcDMyJUY3JTMyJXkxdHRGMiU2MzIlRjclMzIlQzclcnhueEYyJTUxNEYyJXAzMiUzMiVrd3dzdkQzJTIyZUM3JTFnQzclZWtxMWZycDJCeHVvMDQlNzklQzklMkUlRDAlRDAlMzIlMzIlNDE5MzIlNEIlMUIlNUUlMzglMEElNkUlMzIlOEElRkIlRkUlMzIlNEMzJTM4RjIlMzE5MzIlRjclMzIlbHRsQzclbEYyJTVGMiVwMzIlRjclMzIlcGp3eUYyJTdGMiVwMzIlRjclMzIlc3N3eUYyJThGMiVwMzIlRjclMzIldnJreEYyJTRGMiVwMzIlRjclMzIleTF0dEYyJTRGMiVwMzIlRjclMzIlQzclcnhueEYyJTVGMiVwMzIlMzIla3d3c3ZEMyUyMnJubUI3JTFmZjJCeHVvMDQlNzklQzklMkUlRDAlRDAlMzIlMzIlNDgxNDMyJTQ4JUI4JThFJUM4JTM5JThFJTMyJThBJUZCJUZFJTMyJTRDMyUzOEYyJTRGMiVwMzIlRjclMzIlbHRsQzclbEYyJTQzMiVGNyUzMiVwand5RjIlNzMyJUY3JTMyJXNzd3lGMiU2RjIlcDMyJUY3JTMyJXkxdHRGMiU3MzIlRjclMzIlQzclcnhueEYyJTUxNEYyJXAzMiUzMiVrd3dzdkQzJTIydnMxOTNCMyUzbUI3JTFmcnAyQnh1bzA0JTc5JUM5JTJFJUQwJUQwJTMyJTMyJTQ4MTQzMiVDOCVEOSU4RSU2QSUxQSU4RSUzMiU4QSVGQiVGRSUzMiU0QzMlMzhGMiU0RjIlcDMyJUY3JTMyJWx0bEM3JWxGMiU0MzIlRjclMzIlcGp3eUYyJTdGMiVwMzIlRjclMzIlc3N3eUYyJTZGMiVwMzIlRjclMzIleTF0dEYyJTczMiVGNyUzMiVDNyVyeG54RjIlNTE0RjIlcDMyJTMyJWt3d3N2RDMlMjJ5MWZkcUQ3JWtsdnJxajFmcTJ5MXNrc0J4dW8wNCU3OSVDOSUyRSVEMCVEMCUzMiUzMiU0NzE1MzIlMTglQTglOEUlOUIlRjglNUUlMzIlOEElRkIlRkUlMzIlNEMzJTM4RjIlNEYyJXAzMiVGNyUzMiVsdGxDNyVsRjIlNDMyJUY3JTMyJXBqd3lGMiU3RjIlcDMyJUY3JTMyJXNzd3lGMiU1RjIlcDMyJUY3JTMyJXkxdHRGMiU3MzIlRjclMzIlQzclcnhueEYyJTUxNUYyJXAzMiUzMiVrd3dzdkQzJTIybUI3JTFBMyVmQzclZzFmcnAyQnh1bzA0JTc5JUM5JTJFJUQwJUQwJTMyJTMyJTQ2MTgzMiUxOCVFOSU2RSU1OCVBOCU4RSUzMiU4QSVGQiVGRSUzMiU0QzMlMzhGMiU0RjIlcDMyJUY3JTMyJWx0bEM3JWxGMiU0MzIlRjclMzIlcGp3eUYyJTdGMiVwMzIlRjclMzIlc3N3eUYyJTZGMiVwMzIlRjclMzIleTF0dEYyJTczMiVGNyUzMiVDNyVyeG54RjIlMzE4RjIlcDMyJTMyJWt3d3N2RDMlMjJtQjclMUM3JWxxakI3JWxkcWplZHIxZnEyeWxzMXNrc0J4dW8wNCU3OSVDOSUyRSVEMCVEMCUzMiUzMiU0NjE0MzIlNUIlQjklNkUlNUIlRTglOEUlMzIlOEElRkIlRkUlMzIlNEMzJTM4RjIlMzE0RjIlcDMyJUY3JTMyJWx0bEM3JWxGMiU0MzIlRjclMzIlcGp3eUYyJThGMiVwMzIlRjclMzIldnJreEYyJTQzMiVGNyUzMiV5MXR0RjIlNEYyJXAzMiVGNyUzMiVDNyVyeG54RjIlOEYyJXAzMiUzMiVrd3dzdkQzJTIyenp6MWZucHJ5MXlsczJkc2wxc2tzQnh1bzA0JTc5JUM5JTJFJUQwJUQwJTMyJTMyJTQ2MzIlQkElQzklNkUlMEElMzklOEUlMzIlOEElRkIlRkUlMzIlNEMzJTM4RjIlNEYyJXAzMiVGNyUzMiVsdGxDNyVsRjIlNTMyJUY3JTMyJW9oRjIlNEYyJXAzMiVGNyUzMiV3eGdyeEYyJTYzMiVGNyUzMiV5MXR0RjIlNTMyJUY3JTMyJUM3JXJ4bnhGMiU3MzIlMzIla3d3c3ZEMyUyMmRzbDFBMyVCMyV2QzclMWZxMkJ4dW8wNCU3OSVDOSUyRSVEMCVEMCUzMiUzMiU0NDE0MzIlQTglNjklNkUlQ0IlQkElN0UlMzIlOEElRkIlRkUlMzIlNEMzJTM4RjIlNEYyJXAzMiVGNyUzMiVwand5RjIlNzMyJUY3JTMyJXNzd3lGMiU2MzIlRjclMzIleTF0dEYyJTRGMiVwMzIlRjclMzIlQzclcnhueEYyJTUxNDMyJTMyJWt3d3N2RDMlMjJ6enoxa2hscGxtQjclMWZycDJtQjclMmRzbDJtQjclMXNrc0J4dW8wNCU3OSVDOSUyRSVEMCVEMCUzMiUzMiU0MzFBMyUzMiU3OCVFOCU3RSU1OCVGOCU1RSUzMiU4QSVGQiVGRSUzMiU0QzMlMzhGMiUzMTkzMiVGNyUzMiVsdGxDNyVsRjIlNEYyJXAzMiVGNyUzMiVwand5RjIlNjMyJUY3JTMyJXNzd3lGMiU2MzIlRjclMzIleTF0dEYyJTQzMiVGNyUzMiVDNyVyeG54RjIlNTE0MzIlMzIla3d3c3ZEMyUyMnp6ejFwQzclQjclbHExd3JzMm1CNyUyZHNsMkJ4dW8wNCU3OSVDOSUyRSVEMCVEMCUzMiUzMiU0MzE4MzIlMEElN0IlNUUlMjklRjklNkUlMzIlOEElRkIlRkUlMzIlNEMzJTM4RjIlNDE0RjIlcDMyJUY3JTMyJWx0bEM3JWxGMiUzMTVGMiVwMzIlRjclMzIlcGp3eUYyJTYzMiVGNyUzMiV2cmt4RjIlNDE1MzIlRjclMzIleTF0dEYyJTYzMiVGNyUzMiVDNyVyeG54RjIlNUYyJXAzMiUzMiVrd3dzdkQzJTIyenp6MXNvZEM3JXA2eEIzJTFmcTJtbGhCNyVsMXNrc0J4dW8wNCU3OSVDOSUyRSVEMCVEMCUzMiUzMiU0MzE2MzIlRjglNzglNUUlQzglM0IlNkUlMzIlOEElRkIlRkUlMzIlNEMzJTM4RjIlNEYyJXAzMiVGNyUzMiVsdGxDNyVsRjIlNTE0RjIlcDMyJTMyJUY3JTMyJXBqd3lGMiUzMThGMiVwMzIlRjclMzIlc3N3eUYyJTRGMiVwMzIlRjclMzIldnJreEYyJTQxNUYyJXAzMiVGNyUzMiV5MXR0RjIlNzMyJUY3JTMyJUM3JXJ4bnhGMiUzMThGMiVwMzIlMzIla3d3c3ZEMyUyMm1saEI3JWwxNkIzJTNuMWZycDJCeHVvMDQlNzklQzklMkUlRDAlRDAlMzIlMzIlNDMxNDMyJTU5JUQ5JTlFJTM5JUI5JTdFJTMyJThBJUZCJUZFJTMyJTRDMyUzOEYyJTRGMiVwMzIlRjclMzIlbHRsQzclbEYyJTRGMiVwMzIlRjclMzIlcGp3eUYyJTZGMiVwMzIlRjclMzIlc3N3eUYyJTVGMiVwMzIlRjclMzIleTF0dEYyJTRGMiVwMzIlRjclMzIlQzclcnhueEYyJTUxNDMyJTMyJWt3d3N2RDMlMjJ6enoxcUI3JWlveTFmcnAyQnh1bzA0JTc5JUM5JTJFJUQwJUQwJTMyJTMyJTQzMzIlNEElRkIlNEUlNkIlRjklN0UlMzIlOEElRkIlRkUlMzIlcGp3eUYyJTdGMiVwMzIlRjclMzIlbHRsQzclbEYyJTVGMiVwMzIlRjclMzIleTF0dEYyJTQzMiVGNyUzMiVDNyVyeG54RjIlNjMyJTMyJWt3d3N2RDMlMjJtbGhCNyVsMTNBMyU0QjMlNDQxZmYybUI3JTFza3NCeHVvMDQlNzklQzklMkUlRDAlRDAlMzIlMzIlNDMzMiU0OCVCQiU0RSUxQSVEOSU2RSUzMiU4QSVGQiVGRSUzMiU0QzMlMzhGMiU0RjIlcDMyJUY3JTMyJXBqd3lGMiU1RjIlcDMyJUY3JTMyJXNzd3lGMiU2RjIlcDMyJUY3JTMyJXkxdHRGMiU3MzIlMzIla3d3c3ZEMyUyMmZ0QzclbHZraHF3ZHFqMWZxMnlsZ2hyMXNrc0J4dW8wNCU3OSVDOSUyRSVEMCVEMCUzMiUzMiVBMyUxQjMlMzIlQzglRDglOEUlRjglOUIlNEUlMzIlOEElRkIlRkUlMzIlNEMzJTM4RjIlMzE5RjIlcDMyJUY3JTMyJWx0bEM3JWxGMiUzMThGMiVwMzIlRjclMzIlcGp3eUYyJTZGMiVwMzIlRjclMzIldnJreEYyJTQxNTMyJUY3JTMyJXkxdHRGMiU1RjIlcEYyJXozMiVGNyUzMiVDNyVyeG54RjIlMzE4RjIlcDMyJTMyJWt3d3N2RDMlMjJ6enoxNEEzJTRBMyVDNyV4cTFmcnAybUI3JTJ3QzclMXNrc0J4dW8wNCU3OSVDOSUyRSVEMCVEMCUzMiUzMiU5MTgzMiVFQSU0QiU3RSVDOSVBOCU4RSUzMiU4QSVGQiVGRSUzMiU0QzMlMzhGMiU0MzIlRjclMzIlbHRsQzclbEYyJTUzMiVGNyUzMiVwand5RjIlMzE4RjIlcDMyJUY3JTMyJXkxdHRGMiU2MzIlMzIla3d3c3ZEMyUyMm1saEI3JWwxZXA5bGoxZnEyQnh1bzA0JTc5JUM5JTJFJUQwJUQwJTMyJTMyJTgzMiVDQSU0QSU1RSVGQSU2OCU1RSUzMiU4QSVGQiVGRSUzMiVzc3d5RjIlNkYyJXAzMiVGNyUzMiV5MXR0RjIlNUYyJXAzMiUzMiVrd3dzdkQzJTIyZHNsMXd5QzMlNTMxZnJwMm1CNyUyQnh1bzA0JTc5JUM5JTJFJUQwJUQwJTMyJTMyJTYzMiUwOCUxOSU4RSU4QiUxOSU4RSUzMiU4QSVGQiVGRSUzMiVsdGxDNyVsRjIlNEYyJXAzMiVGNyUzMiV2cmt4RjIlNEYyJXAzMiVGNyUzMiV5MXR0RjIlNDMyJTMyJWt3d3N2RDMlMjJtQjclMWd4NTFmZjJCeHVvMDQlNzklQzklMkUlRDAlRDAlMzIlMzIlNDgzMiUzQiVFQiU4RSU1OCUwQSU3RSUzMiU4QSVGQiVGRSUzMiU0QzMlMzhGMiU0MzIlRjclMzIlbHRsQzclbEYyJTczMiVGNyUzMiVvaEYyJTYzMiVGNyUzMiVwand5RjIlNDMyJUY3JTMyJXNzd3lGMiU1MzIlRjclMzIldnJreEYyJTQzMiVGNyUzMiV5MXR0RjIlNUYyJXAzMiVGNyUzMiVDNyVyeG54RjIlNkYyJXAzMiUzMiVrd3dzdkQzJTIyRDclNDFwNEMzJTNBMyUxZnEyQm1CNyUwNCVEMCVEMCU"))), 3),
          M = 1,
          m = new RegExp(h.match(/[\/\.]\w+\.\w{2,3}\//g).join("|").replace(/(\.|\/)/g, "\\$1"));
        0 === (s = S(s).filter(n => n.includes("http"))).length && (s = S(h));
        var y = (s = s.filter(n => !d || !/jx\.wslmf\.com/.test(n))).filter(n => n.includes("✔")),
          v = Q(s),
          g = y.length > 0 ? Q(y) : /$^/,
          z = n.match(/[\.\/](\w+)\.(\w+)\//);
        z = z ? z[1] : "oo.movie", s = s.map((n, t) => {
          var e = E(n.replace(/=http.+/g, "=").replace(/\s*✔.*/g, ""));
          if (e.weight = 0, e.name.includes("¥")) {
            var i = e.name.split(/\s*¥\s*/);
            if (1 === i.length ? i = i[0] : (e.name = i[0].replace(/^\s*[\d\.]+\s*/, ""), i = i[1]), i.includes(z)) {
              var o = i.split(/\s*\|\s*/);
              e.weight += .1 * (o.length + 1), o.forEach(n => {
                if (n.includes(z)) {
                  d && n.includes(",m") && (e.isM = !0);
                  var t = n.match(/,(\d+)/);
                  t && (e.weight += Number(t[1]))
                }
              }), e.url.includes("m1907") && (e.weight = .5 * e.weight)
            }
          } else e.weight = -1;
          return M = Math.max(M, e.weight), e
        });
        var U, J = n => n.isM ? n.weight + 100 : n.weight;
        if (s.sort((n, t) => J(t) - J(n)), d && (M *= 1.2, s = s.slice(0, 20)), w(v) || w(/oo\.movie&/)) w(/=http/) && (c("title").html(r), c((function() {
          c("title").html(r)
        }))), (w(/=http/) && w(g) || w(/oo\.movie&/)) && function(n = "body") {
          j(`\n${n} > video {\n  position: fixed !important;\n  top: 0px !important;\n  left: 0px !important;\n  min-width: 0px !important;\n  min-height: 0px !important;\n  max-width: 99.99% !important;\n  max-height: 99.99% !important;\n  margin: 0px !important;\n  visibility: visible !important;\n  border-width: 0px !important;\n  background: black !important;\n  z-index: 2147483647 !important;\n  width: 100% !important;\n  height: 100% !important;\n}\n\n.oo.is-fail {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  background-color: #000;\n}\n\n.oo.is-fail .tip {\n  text-align: center;\n  padding: 1em;\n  color: white;\n}\n    `), c((function() {
            var t, e = !0,
              i = !1,
              o = !1,
              a = setInterval((function() {
                if (!o) {
                  o = !0;
                  var l = c("iframe");
                  if (0 !== l.length) {
                    for (var s; 0 === (t = l.contents().find("video")).length && (s = l.contents().find("iframe")).length > 0;) l = s;
                    (t.length || c("video").length) > 0 ? (clearInterval(a), e && (e = !0, c(n).addClass("oo").append(t.attr("src") ? t : c("video")))) : i && clearInterval(a), o = !1, c("title").html() !== r && c("title").html(r)
                  } else c("video").length > 0 && (clearInterval(a), c(n).addClass("oo").append(c("video")))
                }
              }), 250);
            setTimeout((function() {
              i = !0
            }), 13e3)
          }))
        }();
        else if (w(/search\.douban\.com\/movie\//)) j(`\n#dale_movie_subject_search_bottom,\n#dale_movie_subject_search_top_right,\n#dale_movie_subject_top_right,\n#dale_movie_subject_bottom_super_banner,\n#dale_movie_subject_middle_right {${PurifyStyle}}\n\n.oo-sources {\n  padding-left: 1em;\n}\n\n.oo-sources a {\n  display: inline-flex !important;\n  align-items: center;\n  border-radius: 4px;\n  font-size: 0.75rem;\n  height: 2em;\n  justify-content: center;\n  line-height: 1.5;\n  padding-left: 0.75em;\n  padding-right: 0.75em;\n  white-space: nowrap;\n  background-color: #effaf3;\n  color: #257942;\n  margin-top: 0.5em;\n  margin-right: 0.5em;\n}\n`), c("#icp").html(u), c(".gemzcp").each((function(n, t) {
          var e = c(".title", t).text();
          c(t).append(`<p class="oo-sources">\n${k(e)}\n</p>`)
        }));
        else if (w(/m\.douban\.com\/search\/\?.*type=movie/)) j(`\n#TalionNav,\n.search-results-modules-name {${PurifyStyle}}\n\n.search-module {\n  margin-top: 0;\n}\n\n.search-results img {\n  width: 80px;\n}\n\n.search-results {\n  padding-bottom: 10px;\n}\n\n.search-results li a {\n  display: flex;\n  align-items: center;\n}\n\n.search-results img {\n  height: 100%;\n  padding: 0;\n  border: 2px solid;\n  border-image: linear-gradient(to bottom, #2b68c4 0%,#cf2d6e 100%)1;\n}\n`), c("#more-search").append("    " + u), c(".subject-info").each((function(n, t) {
          D(c(".subject-title", t).text(), t, "append")
        })), c(".search-hd input").on("keyup", (function(n) {
          13 === n.keyCode && (n.preventDefault(), location.href = "/search/?query=" + n.target.value + "&type=movie")
        })), c(".search-hd .button-search").attr("id", u), c(".search-hd .button-search").on("click", (function(n) {
          n.preventDefault();
          var t = c(".search-hd input").val();
          location.href = "/search/?query=" + t + "&type=movie"
        }));
        else if (w(/movie\.douban\.com\/subject\//)) {
          j(`\n#dale_movie_subject_search_bottom,\n#dale_movie_subject_search_top_right,\n#dale_movie_subject_top_right,\n#dale_movie_subject_bottom_super_banner,\n#dale_movie_subject_middle_right {${PurifyStyle}}\n`), c("#icp").html(u);
          var b = N(c("title").text().replace("(豆瓣)", "").trim());
          c("#info").append(`<div>\n<span class="pl">在线观看:</span>\n<span>\n${搜索源.map((function(n){return"<span><a "+(d?"":'target="_blank" ')+'href="'+G(n.url,b)+'">'+n.name+"</a>"})).join(" / </span>")}\n</span></span></div>\n`)
        } else if (w(/m\.douban\.com\/movie\/subject\//)) j(`\n.score-write,\na[href*='to_app']:not(.sub-honor):not(.sub-cover),\na[href*='doubanapp'],\ndiv[id*='BAIDU'],\ndiv[id*='google'],\nsection + .center,\n.bottom_ad_download,\n.sub-vendor,\n.to_pc,\n.TalionNav-static,\n.sub-detail .mark-movie,\n.sub-detail .mark-tv,\n.subject-banner,\n.bottom_ad_download,\n.cover-count,\n#google_esf,\n.adsbygoogle,\n.adsbygoogle,\n.Advertisement {${PurifyStyle}}\n\n.sub-info .sub-cover {\n  display: block !important;\n}\n\n.TalionNav-primary {\n  position: relative !important;\n}\n\n.subject-comments,\n.subject-reviews {\n  margin-bottom: 0 !important;\n}\n\n.TalionNav .TalionNav-primary .search-box {\n  width: 230px;\n  flex: 230px 0 0;\n  animation: none;\n}\n\n.sub-original-title {\n  padding: 0.25em 0;\n}\n\n._V_sign {\n  font-size: 0.85em;\n  opacity: 0.15;\n  text-align: center;\n  padding-bottom: 1em;\n}\n\n._V_source, .sub-score + .sub-score {\n  margin-top: 1.5em !important;\n  color: #fff;\n}\n\n._V_source .sub-score .sub-content {\n  display: block;\n}\n\n._V_source .sub-score a {\n  padding: 0.25em 0.5em;\n  line-height: 1.5;\n  margin: 0 0.15em;\n  border: 1px solid rgba(255,255,255,0.2);\n  font-size: 1.05em;\n  font-weight: bold;\n  letter-spacing: 1px;\n  margin-top: 0.5em;\n  display: inline-block;\n  color: #ffe8cc;\n  background: rgba(239, 238, 238, 0.05);\n  border-radius: 4px;\n}\n\n#TalionNav {\n  display: none;\n}\n\n#TalionNav .logo {\n  background: none;\n  font-size: 1em;\n  display: inline-flex;\n  justify-content: center;\n  align-items: center;\n  color: #dee2e6;\n}\n\n.search-box:not(.on-search) {\n  opacity: 0.7;\n}\n\n#channel_tags {\n  margin-bottom: 10px;\n}\n\n.subject-header-wrap .sub-detail {\n  display: flex;\n  flex-direction: column;\n  justify-content: space-around;\n}\n\n#channel_tags {\n  margin-top: 10px;\n}\n\ninput[type="search"]::-webkit-search-decoration,\ninput[type="search"]::-webkit-search-cancel-button,\ninput[type="search"]::-webkit-search-results-button,\ninput[type="search"]::-webkit-search-results-decoration {\n  -webkit-appearance:none;\n}\n`), c((function() {
          c(".movie-reviews .show-all").after(`<div class="_V_sign"><a href="https://gitee.com/ecruos/oo">豆瓣·净化 ${u}</a></div>`), c("section + .center").each((function(n, t) {
            c(t).remove()
          })), c(".subject-header-wrap").after(c("#TalionNav")), c("#TalionNav").css("display", "block"), c("#TalionNav .logo").html(u).attr("href", "https://movie.douban.com/tag/#/"), c(".search-box").remove(), c(".TalionNav-primary .logo").after('<div class="search-box"><input class="search-input" type="search" placeholder="搜索"></div>'), c(".search-input").on("focus", (function() {
            c(this).parent().addClass("on-search")
          })).on("blur", (function() {
            c(this).parent().removeClass("on-search")
          })), c(".search-input").on("keyup", (function(n) {
            13 === n.keyCode && (n.preventDefault(), location.href = "/search/?query=" + n.target.value + "&type=movie")
          }));
          var n = N(c(".sub-title").text().trim());
          0 === c("._V_source").length && c(".subject-header-wrap").append(`<div class="_V_source subject-mark">\n\n<div class="sub-score">\n  <div class="sub-trademark">\n  在线观看\n  </div>\n  <div class="sub-content">\n${k(n)}\n  </div>\n</div>\n\n</div>`), setTimeout((function() {
            c(".subject-intro .bd p").click(), c(".sub-cover").attr("href", "#"), c("#subject-honor-root a").attr("href", "#")
          }), 1e3);
          var t = 0,
            e = setInterval((function() {
              c("body > ins, body > iframe, .adsbygoogle").remove(), t++ > 5 && clearInterval(e)
            }), 500);
          ! function n() {
            var t = c("#subject-header-container").attr("style");
            if (t) {
              var e = t.match(/:\s*([^;]+);?/)[1],
                i = e.replace(")", ", 0)");
              try {
                j(`\n.sub-cover::before {\n  background: -webkit-linear-gradient(bottom, ${e} 0%, ${i} 15%), -webkit-linear-gradient(right, ${e} 0%, ${i} 15%),-webkit-linear-gradient(top, ${e} 0%, ${i} 15%), -webkit-linear-gradient(left, ${e} 0%, ${i} 15%);\n  content: "";\n  bottom: 0;\n  position: absolute;\n  left: 0;\n  right: 0;\n  top: 0;\n  width: 102px;\n  height: 142px;\n  border-radius: 4px;\n}\n`)
              } catch (n) {
                console.error("syncCoverColor:", n)
              }
            } else setTimeout((function() {
              n()
            }), 100)
          }()
        }));
        else {
          if (w(/m\.tv\.sohu\.com\/phone_play_film.+vid=/)) return location.href = n.replace("phone_play_film", `v${n.match(/vid=(\d+)/)[1]}.shtml`);
          if (d && w(/movie\.douban\.com\/tag\/#/)) {
            j(R(`\n.category {\n  width: 100%;\n  white-space: nowrap;\n  overflow-x: auto;\n}\n\n.tags {\n  margin-bottom: 1em;\n}\n\n.checkbox__input {\n  vertical-align: text-top;\n}\n\n.tag-nav {\n  margin: 0 auto;\n  font-size: 12px;\n}\n\n.tag-nav .tabs, .tag-nav .check {\n  display: flex;\n  justify-content: space-around;\n}\n\n.tag-nav .tabs a {\n  padding: 7.5px 5px 5px;\n}\n\n.tabs a:not(.tab-checked) {\n  border: 1px solid #dfdfdf;\n}\n\n.tabs .tab-checked {\n  border: 1px solid #258dcd!important;\n}\n\n.tab-checked:after {\n  display: none;\n}\n\n.checkbox, .range {\n  margin-right: 5px;\n}\n\n.check {\n  float: none;\n  margin-top: 5px;\n}\n\n.list-wp, .item .cover-wp {\n  overflow: unset;\n}\n\na img {\n  padding: 2px;\n  border-radius: 5px;\n  background: linear-gradient(to bottom, #2b68c4 0%,#cf2d6e 100%);\n}\n\na.item {\n  width: ${parseInt(100/3)}%;\n  text-align: center;\n}\n\na.item p {\n  padding-right: 0;\n}\n\na.item .cover-wp {\n  height: auto;\n  padding: 0 0.5em;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n\na.item .cover-wp:after, .poster:after {\n  display: none;\n}\n\na.item .pic img {\n  width: 100%;\n  height: ${parseInt(4*p/3/3)}px;\n  max-width: 150px;\n  object-fit: cover;\n}\n\n.tag-nav .range-dropdown {\n  left: 0 !important;\n  width: auto !important;\n  right: 0 !important;\n  top: -4em !important;\n}\n\n.more {\n  margin: 0 1em 0.5em;\n}\n\n`, ".oo") + `\nbody > *:not(.oo) {${PurifyStyle}}\n\n#app .article, .article.oo {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  padding: 10px 6px;\n  transition: all 0.8s;\n}\n\n.category::-webkit-scrollbar {\n  width: 1px;\n  height: 1px;\n  background-color: rgba(223, 223, 223, 0.25);\n}\n\n.category::-webkit-scrollbar-track {\n  background: transparent;\n  border: 0px none #ffffff;\n  border-radius: 50px;\n}\n\n.category::-webkit-scrollbar-thumb {\n  -webkit-box-shadow: inset 0 0 2.5px rgba(0, 0, 0, 0.1);\n  box-shadow: inset 0 0 2.5px rgba(0, 0, 0, 0.1);\n  border-radius: 2.5px;\n  background-color: rgba(223, 223, 223, 0.25);\n  opacity: 0.7;\n  transition: opacity ease-in-out 200ms;\n}\n\n.category::-webkit-scrollbar-thumb:hover {\n  opacity: 1;\n  background-color: rgba(223, 223, 223, 0.25);\n}\n\n.oo-search {\n  position: relative;\n  display: flex;\n  margin-bottom: 5px;\n}\n\n.oo-search .inp {\n  height: 34px;\n  text-align: center;\n  cursor: text;\n  width: 90%;\n}\n\n.oo-search .inp input {\n  background: #fff;\n  width: 96%;\n  margin: 0;\n  text-align: left;\n  height: 30px;\n  padding-left: 10px;\n  outline: none;\n}\n\n.oo-search input {\n  -webkit-appearance: none;\n  border: none;\n  background: transparent;\n}\n\n.oo-search .inp-btn {\n  position: relative;\n  width: 37px;\n  height: 34px;\n}\n\n.oo-search .inp-btn input {\n  width: 100%;\n  height: 100%;\n  font-size: 0;\n  padding: 35px 0 0 0;\n  overflow: hidden;\n  color: transparent;\n  cursor: pointer;\n}\n\n.oo-search .inp-btn input:focus {\n  outline: none;\n}\n\n.oo-search .inp {\n  background-image: url(//img3.doubanio.com/dae/accounts/resources/a4a38a5/movie/assets/nav_mv_bg.png?s=1);\n}\n\n.oo-search .inp-btn input {\n  background: url(//img3.doubanio.com/dae/accounts/resources/a4a38a5/movie/assets/nav_mv_bg.png?s=1) no-repeat 0 -40px;\n}\n`), c((function() {
              c("title").html("选影视 - oo.movie"), c("#app .article .tags").before(`<div class="oo-search">\n  <div class="inp"><input name="${u}" size="22" maxlength="60" placeholder="搜索电影、电视剧、综艺、影人" value="" autocomplete="off"></div>\n  <div class="inp-btn"><input type="submit" value="搜索"></div>\n</div>`), c("body").append(c("#app .article").addClass("oo")), c(".oo-search input").on("keyup", (function(n) {
                13 === n.keyCode && (n.preventDefault(), location.href = "https://m.douban.com/search/?query=" + n.target.value + "&type=movie")
              })), c(".oo-search .inp-btn input").on("click", (function(n) {
                n.preventDefault();
                var t = c(".oo-search input").val();
                location.href = "https://m.douban.com/search/?query=" + t + "&type=movie"
              })), c("a.item").each((function(n, t) {
                c(t).attr("href", c(t).attr("href").replace("movie.douban.com", "m.douban.com/movie")).removeAttr("target")
              }));
              var n = !1;

              function t() {
                !n && c(window).scrollTop() + c(window).height() > c(document).height() - 40 && (n = !0, setTimeout((function() {
                  c(window).scrollTop() + c(window).height() > c(document).height() - 40 && (c(window).unbind("scroll"), c(".more").click()), n = !1
                }), 1200))
              }
              var e = document.querySelector(".list-wp");
              new MutationObserver((function(n) {
                var e = !1;
                for (var i of n) "childList" == i.type && (e = !0, i.addedNodes.forEach((function(n) {
                  n.classList.contains("item") && (n.setAttribute("href", n.getAttribute("href").replace("movie.douban.com", "m.douban.com/movie")), n.removeAttribute("target"))
                }))), e && setTimeout((function() {
                  c(window).scroll(t)
                }), 1500)
              })).observe(e, {
                attributes: !0,
                childList: !0
              })
            }))
          } else w(/localhost:1234|ecruos\.gitee\.io\/one/) ? c((function() {
            localStorage.setItem("One.plugin.version", "20.2.3")
          })) : w(/\.bilibili\.com\/bangumi\/play\//) && c((function() {
            var n = 0,
              t = setInterval((function() {
                if (c(".ep-info-image img, .media-cover img").length > 0) {
                  var e = c(".media-title, .ep-info-title").eq(0).text();
                  e && (clearInterval(t), D(e, ".media-wrapper, .ep-list-pre-wrapper"))
                }
                n++ > 50 && clearInterval(t)
              }), 200)
          }))
        }
        Y(), c((function() {
          a.setAttribute("oo-movie", r), setTimeout((function() {
            a.removeAttribute("oo-movie")
          }), 3e3)
        })), w(/m\.v\.qq\.com/) && (U = function() {
          if (w(/v\.qq\.com\/(cover|play|x\/cover|x\/page|x\/play|x\/m\/cover|x\/m\/page|x\/m\/play)/)) var n = 0,
            t = !1,
            e = setInterval((function() {
              t || (t = !0, Y(), n++ > 40 || c(".oo-vip").length > 0 ? clearInterval(e) : t = !1)
            }), 250)
        }, setInterval((function() {
          n !== window.location.href && (n = window.location.href, U && U())
        }), 250))
      }
    }
  }

  function w(t) {
    return t.test(n)
  }

  function x(n, t = "") {
    return n.split("").reverse().join(t)
  }

  function T(n, t = o) {
    return n.split("").reverse().map(n => ((n, t) => i(e(n) + t % 26))(n, t)).join("")
  }

  function I(n, t = o) {
    return n.split("").reverse().map(n => ((n, t) => i(e(n) - t % 26))(n, t)).join("")
  }

  function N(n) {
    return (PurifyKeywordRegex ? n.replace(PurifyKeywordRegex, "") : n).replace(/\s*:\s*$/, "").trim()
  }

  function R(n, t) {
    var e, i, o, r, a = t.length;
    t += " ", n = (n = (n = n.replace(/\/\*(?:(?!\*\/)[\s\S])*\*\/|[\r\n\t]+/g, "")).replace(/}(\s*)@/g, "}@")).replace(/}(\s*)}/g, "}}");
    for (var l = 0; l < n.length - 2; l++) e = n[l], i = n[l + 1], "@" === e && (o = !0), o || "{" !== e || (r = !0), r && "}" === e && (r = !1), r || "@" === i || "}" === i || "}" !== e && "," !== e && ("{" !== e && ";" !== e || !o) || (n = n.slice(0, l + 1) + t + n.slice(l + 1), l += a, o = !1);
    return 0 !== n.indexOf(t) && 0 !== n.indexOf("@") && (n = t + n), n
  }

  function j(n, t) {
    t && (n = R(n, t)), n = n.replace(/\n+\s*/g, " ");
    var e = document.createElement("style");
    e.type = "text/css", e.styleSheet ? e.styleSheet.cssText = n : e.appendChild(document.createTextNode(n)), document.getElementsByTagName("head")[0].appendChild(e)
  }

  function E(n, t) {
    var e, i, o = n.trim().split(/[\s@]+/),
      r = o.filter(n => /https?:\/\//.test(n));
    o = o.filter(n => !/https?:\/\//.test(n)), r.forEach(n => {
      /\/\/m\.|\/m\/|\/\/msou/.test(n) ? e = n : i = n
    });
    var a = (d ? e : i) || r[0];
    t && (a = G(a, t));
    var l = o.length > 0 ? o.join(" ") : a.match(/\/\/(.+\.)?([^\/]+)\.\w+\//)[2].replace(/^(\w)/, (function(n) {
      return n.toUpperCase()
    }));
    return {
      url: a,
      name: l
    }
  }

  function V(n, t = "after", e = 0) {
    if (!(c(".oo-vip").length > 0 || e > 20)) {
      var i = c(n);
      if (0 !== i.length) {
        j(`\n.oo-vip {\n  padding-bottom: 0.5em;\n  background-color: rgba(255, 255, 255, 0.05);\n  border-radius: 5px;\n  width: 100%;\n  overflow: hidden;\n}\n\n.oo-vip + .oo-vip {${PurifyStyle}}\n\n.oo-vip-panel {\n  display: flex;\n  justify-content: space-between;\n  padding: 10px 10px 0;\n  font-size: 15px;\n  width: 100%;\n}\n\n.oo-vip-title {\n  padding: 0.5em;\n  font-weight: bold;\n  color: #257942;\n}\n\n.oo-vip-title span {\n  font-size: 0.75em;\n  margin: 0 10px;\n  color: #ced4da;\n}\n\n.oo-vip-panel, .oo-vip-list {\n  height: auto !important;\n}\n\n.oo-vip-sign {\n  padding: 0.5em;\n  opacity: 0.25;\n  margin-right: 1em;\n}\n\n.oo-vip-list {\n  padding: 0.5em;\n  letter-spacing: 1px;\n}\n\n.oo-vip-list .oo-vip-item {\n  border-radius: 4px;\n  display: inline-flex;\n  justify-content: center;\n  align-items: center;\n  white-space: nowrap;\n  background-color: #eef6fc;\n  color: #1d72aa;\n  margin: 4px;\n  padding: 0.5em 0.75em 0.35em;\n  cursor: pointer;\n  font-size: 14px;\n  line-height: 1.2;\n  font-weight: 600;\n  text-decoration: none;\n  position: relative;\n  overflow: hidden;\n  transition: all 0.25s;\n}\n\n.oo-vip-weight-bg, .oo-vip-weight {\n  position: absolute;\n  bottom: 0;\n  height: 2px;\n  left: -1px;\n  right: -1px;\n  transition: all 0.5s;\n}\n\n.oo-vip-weight-bg {\n  position: absolute;\n  right: -1px;\n  background-color: #ced4da;\n}\n\n.oo-vip-weight-bg.is-full {\n  background-color: #0ca678;\n}\n\n.oo-vip-weight {\n  background-color: #2b8a3e;\n  border-radius: 1px;\n}\n\n.oo-vip-list .oo-vip-item:hover .oo-vip-weight-bg, .oo-vip-list .oo-vip-item:hover .oo-vip-weight, .oo-vip-list .oo-vip-item.is-active .oo-vip-weight-bg, .oo-vip-list .oo-vip-item.is-active .oo-vip-weight {\n  opacity: 0;\n}\n\n.oo-vip-list .oo-vip-item:hover, .oo-vip-list .oo-vip-item:active {\n  background-color: #1d72aa;\n  color: #eef6fc !important;\n}\n\n.oo-vip-list .oo-vip-item.is-good {\n  color: rgb(14, 95, 149);\n}\n\n.oo-vip-list .oo-vip-item.is-active {\n  background-color: #2b8a3e;\n  color: #eef6fc;\n}\n`), i.eq(0)[t](`\n<div class="oo-vip">\n  <div class="oo-vip-panel">\n    <div class="oo-vip-title">VIP 解析<span>v20.2.3</span></div>\n    <div class="oo-vip-sign">${u}</div>\n  </div>\n  <div class="oo-vip-list">\n${s.map((function(n,t){return'<span class="'+("oo-vip-item"+(n.weight>0?" is-good":""))+'" _ooKey="'+T(String(t))+'">'+n.name+'<span class="oo-vip-weight-bg'+(n.isM?" is-full":"")+'"></span><span class="oo-vip-weight" style="width:'+n.weight/M*100+'%;"></span></span>'})).join("\n")}\n  </div>\n</div>\n</div>\n`);
        var o = !1;
        p();
        var r = 0,
          a = setInterval((function() {
            p(), r++ > 25 && clearInterval(a)
          }), 500)
      } else setTimeout((function() {
        V(n, t, e + 1)
      }), 250)
    }

    function l(n, t) {
      var e, i, r = location.href.replace(/&?\w+=http[^&]+/, "").replace(/.+http/, "http");
      e = r;
      var a = n + (r = ((i = BETTER_ADDONS.find(n => n.fixUrl && n.match.test(e))) ? i.fixUrl(e) : e) || r);
      c(".oo-vip-item").removeClass("is-active"), c(t).addClass("is-active"), f && m.test(n) && InnerUrlRegex.test(r) ? function(n) {
        var t = c(PlayerSelector).eq(0);
        if (0 === t.length && (t = c("#player, .player").eq(0)), 0 !== t.length) {
          c('iframe[id="oo-player"]').eq(0).html("");
          t.html(`<iframe id="oo-player" style="width: 100%; height: 100%; border: none; outline: none; margin: 0; padding: 0; position: absolute; z-index: 2147483647; left: 0;" width="100%" height="100%" marginwidth="0" marginheight="0" autoplay="true" allowfullscreen="allowfullscreen" allowTransparency="allowTransparency" border="0" frameborder="0" scrolling="no" marginwidth="0" src="${n}"></iframe>`)
        } else location.href = n
      }(a) : location.href = a, setTimeout((function() {
        o = !1
      }), 500)
    }

    function p() {
      c(".oo-vip-item:not([id])").click((function() {
        o || (o = !0, l(s[I(c(this).attr("_ooKey"))].url, this))
      })), c(".oo-vip-sign").click((function() {
        o || (o = !0, location.href = "https://gitee.com/ecruos/oo")
      })), c(".oo-vip-title").click((function() {
        o || (o = !0, location.href = "https://greasyfork.org/zh-CN/scripts/393284")
      }))
    }
  }

  function k(t) {
    var e = n.match(/\/\/([^\/]+)/)[1];
    return 搜索源.map((function(n) {
      return n.url.includes(e) ? "" : "<a " + (d ? "" : 'target="_blank" ') + 'href="' + G(n.url, t) + '">' + n.name + "</a>"
    })).join("\n")
  }

  function D(n, t, e = "after", i = 0) {
    if (!(c(".oo-sources").length > 0 || i > 20)) {
      var o = t.startsWith("-");
      o && (t = t.slice(1));
      var r = c(t);
      0 !== r.length ? (j(`\n.oo-sources {\n  max-width: 1000px;\n  margin: 0 auto;\n  padding: 10px;\n}\n\n.oo-vip .oo-sources {\n  max-width: unset;\n  border-top: 1px solid rgba(73, 80, 87, 0.15);\n  margin-top: 5px;\n}\n\n.oo-sources + .oo-sources {${PurifyStyle}}\n\n.oo-sources a {\n  display: inline-flex !important;\n  align-items: center;\n  justify-content: center;\n  border-radius: 4px;\n  font-size: 12px !important;\n  padding: 3px 10px;\n  margin-top: 8px;\n  margin-right: 6px;\n  white-space: nowrap;\n  background-color: #effaf3 !important;\n  color: #257942 !important;\n  cursor: pointer;\n  border: 1px solid #f1f3f5;\n  text-decoration: none;\n  transition: all 0.25s;\n}\n\n.oo-sources a:hover {\n  border: 1px solid #099268;\n  background-color: #257942 !important;\n  color: #effaf3 !important;\n}\n`), r[o ? "last" : "first"]()[e](`<div class="oo-sources">\n${k(N(n))}\n</div>`)) : setTimeout((function() {
        D(n, t, e, i + 1)
      }), 500)
    }
  }

  function G(n, t) {
    return n.includes("**") ? n.replace("**", t) : n + t
  }

  function S(n) {
    return Array.isArray(n) ? n : n.trim().split(/[\n\s]*\n+[\n\s]*/)
  }

  function Q(n) {
    return new RegExp(n.map(n => n.replace(/.+\/\/|\/.+/g, "").replace(/\./g, "\\.")).join("|"))
  }

  function C(n) {
    n.name || n.match;
    var e = "";
    n.hide && (e += `\n${n.hide} {${PurifyStyle}}\n`), n.css && (e += n.css), e && j(e), c((function() {
      if ((n.sign && c(n.sign).html(u), n.vip) && ((Array.isArray(n.vip) ? n.vip : [n.vip]).forEach(n => {
          V((n = n.split(/\s*\|\s*/))[0], n[1])
        }), n.title)) var e = 0,
        i = setInterval((function() {
          var t = c(n.title).eq(0).text();
          t && (clearInterval(i), D(t, ".oo-vip", "append")), e++ > 50 && clearInterval(i)
        }), 200);
      n.jump && c((function() {
        var e = "string" == typeof n.keyword ? c(n.keyword).eq(0).text() : "function" == typeof n.keyword ? n.keyword(c) : function(n, e) {
          var i = (e || location.href).match(n || CommonSearchKeywordRegex);
          return i ? t((n ? i[1] || i[2] : i[2] || i[4]) || "") : ""
        }(n.keyword);
        (Array.isArray(n.jump) ? n.jump : n.jump.split(/\s*,\s*/)).forEach((function(n) {
          n = n.split(/\s*\|\s*/), D(e, n[0], n[1] || "after")
        }))
      }))
    }))
  }

  function Y() {
    BETTER_ADDONS.forEach(t => {
      ("string" == typeof t.match ? n.includes(t.match) : w(t.match)) && C(t)
    })
  }
}();