diff --git a/C++/C Primer 中文第四版(非扫描).pdf b/C++/C Primer 中文第四版(非扫描).pdf index 2097574..8802c7a 100644 Binary files a/C++/C Primer 中文第四版(非扫描).pdf and b/C++/C Primer 中文第四版(非扫描).pdf differ diff --git a/StreamMedia/flv_h265_patch/ffmpeg_3.3_flv_patch.rar b/StreamMedia/flv_h265_patch/ffmpeg_3.3_flv_patch.rar new file mode 100644 index 0000000..3bf11de Binary files /dev/null and b/StreamMedia/flv_h265_patch/ffmpeg_3.3_flv_patch.rar differ diff --git a/StreamMedia/flv_h265_patch/ffmpeg_3.3_flv_patch/flv.h b/StreamMedia/flv_h265_patch/ffmpeg_3.3_flv_patch/flv.h new file mode 100644 index 0000000..089bc76 --- /dev/null +++ b/StreamMedia/flv_h265_patch/ffmpeg_3.3_flv_patch/flv.h @@ -0,0 +1,139 @@ +/* + * FLV common header + * + * Copyright (c) 2006 The FFmpeg Project + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * FLV common header + */ + +#ifndef AVFORMAT_FLV_H +#define AVFORMAT_FLV_H + +/* offsets for packed values */ +#define FLV_AUDIO_SAMPLESSIZE_OFFSET 1 +#define FLV_AUDIO_SAMPLERATE_OFFSET 2 +#define FLV_AUDIO_CODECID_OFFSET 4 + +#define FLV_VIDEO_FRAMETYPE_OFFSET 4 + +/* bitmasks to isolate specific values */ +#define FLV_AUDIO_CHANNEL_MASK 0x01 +#define FLV_AUDIO_SAMPLESIZE_MASK 0x02 +#define FLV_AUDIO_SAMPLERATE_MASK 0x0c +#define FLV_AUDIO_CODECID_MASK 0xf0 + +#define FLV_VIDEO_CODECID_MASK 0x0f +#define FLV_VIDEO_FRAMETYPE_MASK 0xf0 + +#define AMF_END_OF_OBJECT 0x09 + +#define KEYFRAMES_TAG "keyframes" +#define KEYFRAMES_TIMESTAMP_TAG "times" +#define KEYFRAMES_BYTEOFFSET_TAG "filepositions" + + +enum { + FLV_HEADER_FLAG_HASVIDEO = 1, + FLV_HEADER_FLAG_HASAUDIO = 4, +}; + +enum FlvTagType { + FLV_TAG_TYPE_AUDIO = 0x08, + FLV_TAG_TYPE_VIDEO = 0x09, + FLV_TAG_TYPE_META = 0x12, +}; + +enum { + FLV_STREAM_TYPE_VIDEO, + FLV_STREAM_TYPE_AUDIO, + FLV_STREAM_TYPE_DATA, + FLV_STREAM_TYPE_NB, +}; + +enum { + FLV_MONO = 0, + FLV_STEREO = 1, +}; + +enum { + FLV_SAMPLESSIZE_8BIT = 0, + FLV_SAMPLESSIZE_16BIT = 1 << FLV_AUDIO_SAMPLESSIZE_OFFSET, +}; + +enum { + FLV_SAMPLERATE_SPECIAL = 0, /**< signifies 5512Hz and 8000Hz in the case of NELLYMOSER */ + FLV_SAMPLERATE_11025HZ = 1 << FLV_AUDIO_SAMPLERATE_OFFSET, + FLV_SAMPLERATE_22050HZ = 2 << FLV_AUDIO_SAMPLERATE_OFFSET, + FLV_SAMPLERATE_44100HZ = 3 << FLV_AUDIO_SAMPLERATE_OFFSET, +}; + +enum { + FLV_CODECID_PCM = 0, + FLV_CODECID_ADPCM = 1 << FLV_AUDIO_CODECID_OFFSET, + FLV_CODECID_MP3 = 2 << FLV_AUDIO_CODECID_OFFSET, + FLV_CODECID_PCM_LE = 3 << FLV_AUDIO_CODECID_OFFSET, + FLV_CODECID_NELLYMOSER_16KHZ_MONO = 4 << FLV_AUDIO_CODECID_OFFSET, + FLV_CODECID_NELLYMOSER_8KHZ_MONO = 5 << FLV_AUDIO_CODECID_OFFSET, + FLV_CODECID_NELLYMOSER = 6 << FLV_AUDIO_CODECID_OFFSET, + FLV_CODECID_PCM_ALAW = 7 << FLV_AUDIO_CODECID_OFFSET, + FLV_CODECID_PCM_MULAW = 8 << FLV_AUDIO_CODECID_OFFSET, + FLV_CODECID_AAC = 10<< FLV_AUDIO_CODECID_OFFSET, + FLV_CODECID_SPEEX = 11<< FLV_AUDIO_CODECID_OFFSET, +}; + +enum { + FLV_CODECID_H263 = 2, + FLV_CODECID_SCREEN = 3, + FLV_CODECID_VP6 = 4, + FLV_CODECID_VP6A = 5, + FLV_CODECID_SCREEN2 = 6, + FLV_CODECID_H264 = 7, + FLV_CODECID_REALH263= 8, + FLV_CODECID_MPEG4 = 9, + FLV_CODECID_HEVC = 12, +}; + +enum { + FLV_FRAME_KEY = 1 << FLV_VIDEO_FRAMETYPE_OFFSET, ///< key frame (for AVC, a seekable frame) + FLV_FRAME_INTER = 2 << FLV_VIDEO_FRAMETYPE_OFFSET, ///< inter frame (for AVC, a non-seekable frame) + FLV_FRAME_DISP_INTER = 3 << FLV_VIDEO_FRAMETYPE_OFFSET, ///< disposable inter frame (H.263 only) + FLV_FRAME_GENERATED_KEY = 4 << FLV_VIDEO_FRAMETYPE_OFFSET, ///< generated key frame (reserved for server use only) + FLV_FRAME_VIDEO_INFO_CMD = 5 << FLV_VIDEO_FRAMETYPE_OFFSET, ///< video info/command frame +}; + +typedef enum { + AMF_DATA_TYPE_NUMBER = 0x00, + AMF_DATA_TYPE_BOOL = 0x01, + AMF_DATA_TYPE_STRING = 0x02, + AMF_DATA_TYPE_OBJECT = 0x03, + AMF_DATA_TYPE_NULL = 0x05, + AMF_DATA_TYPE_UNDEFINED = 0x06, + AMF_DATA_TYPE_REFERENCE = 0x07, + AMF_DATA_TYPE_MIXEDARRAY = 0x08, + AMF_DATA_TYPE_OBJECT_END = 0x09, + AMF_DATA_TYPE_ARRAY = 0x0a, + AMF_DATA_TYPE_DATE = 0x0b, + AMF_DATA_TYPE_LONG_STRING = 0x0c, + AMF_DATA_TYPE_UNSUPPORTED = 0x0d, +} AMFDataType; + +#endif /* AVFORMAT_FLV_H */ diff --git a/StreamMedia/flv_h265_patch/ffmpeg_3.3_flv_patch/flvdec.c b/StreamMedia/flv_h265_patch/ffmpeg_3.3_flv_patch/flvdec.c new file mode 100644 index 0000000..8adae2f --- /dev/null +++ b/StreamMedia/flv_h265_patch/ffmpeg_3.3_flv_patch/flvdec.c @@ -0,0 +1,1320 @@ +/* + * FLV demuxer + * Copyright (c) 2003 The FFmpeg Project + * + * This demuxer will generate a 1 byte extradata for VP6F content. + * It is composed of: + * - upper 4 bits: difference between encoded width and visible width + * - lower 4 bits: difference between encoded height and visible height + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/avstring.h" +#include "libavutil/channel_layout.h" +#include "libavutil/dict.h" +#include "libavutil/opt.h" +#include "libavutil/intfloat.h" +#include "libavutil/mathematics.h" +#include "libavcodec/bytestream.h" +#include "libavcodec/mpeg4audio.h" +#include "avformat.h" +#include "internal.h" +#include "avio_internal.h" +#include "flv.h" +#include "hevc.h" + +#define VALIDATE_INDEX_TS_THRESH 2500 + +#define RESYNC_BUFFER_SIZE (1<<20) + +typedef struct FLVContext { + const AVClass *class; ///< Class for private options. + int trust_metadata; ///< configure streams according onMetaData + int wrong_dts; ///< wrong dts due to negative cts + uint8_t *new_extradata[FLV_STREAM_TYPE_NB]; + int new_extradata_size[FLV_STREAM_TYPE_NB]; + int last_sample_rate; + int last_channels; + struct { + int64_t dts; + int64_t pos; + } validate_index[2]; + int validate_next; + int validate_count; + int searched_for_end; + + uint8_t resync_buffer[2*RESYNC_BUFFER_SIZE]; + + int broken_sizes; + int sum_flv_tag_size; + + int last_keyframe_stream_index; + int keyframe_count; + int64_t video_bit_rate; + int64_t audio_bit_rate; + int64_t *keyframe_times; + int64_t *keyframe_filepositions; + int missing_streams; + AVRational framerate; +} FLVContext; + +static int probe(AVProbeData *p, int live) +{ + const uint8_t *d = p->buf; + unsigned offset = AV_RB32(d + 5); + + if (d[0] == 'F' && + d[1] == 'L' && + d[2] == 'V' && + d[3] < 5 && d[5] == 0 && + offset + 100 < p->buf_size && + offset > 8) { + int is_live = !memcmp(d + offset + 40, "NGINX RTMP", 10); + + if (live == is_live) + return AVPROBE_SCORE_MAX; + } + return 0; +} + +static int flv_probe(AVProbeData *p) +{ + return probe(p, 0); +} + +static int live_flv_probe(AVProbeData *p) +{ + return probe(p, 1); +} + +static void add_keyframes_index(AVFormatContext *s) +{ + FLVContext *flv = s->priv_data; + AVStream *stream = NULL; + unsigned int i = 0; + + if (flv->last_keyframe_stream_index < 0) { + av_log(s, AV_LOG_DEBUG, "keyframe stream hasn't been created\n"); + return; + } + + av_assert0(flv->last_keyframe_stream_index <= s->nb_streams); + stream = s->streams[flv->last_keyframe_stream_index]; + + if (stream->nb_index_entries == 0) { + for (i = 0; i < flv->keyframe_count; i++) { + av_log(s, AV_LOG_TRACE, "keyframe filepositions = %"PRId64" times = %"PRId64"\n", + flv->keyframe_filepositions[i], flv->keyframe_times[i] * 1000); + av_add_index_entry(stream, flv->keyframe_filepositions[i], + flv->keyframe_times[i] * 1000, 0, 0, AVINDEX_KEYFRAME); + } + } else + av_log(s, AV_LOG_WARNING, "Skipping duplicate index\n"); + + if (stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { + av_freep(&flv->keyframe_times); + av_freep(&flv->keyframe_filepositions); + flv->keyframe_count = 0; + } +} + +static AVStream *create_stream(AVFormatContext *s, int codec_type) +{ + FLVContext *flv = s->priv_data; + AVStream *st = avformat_new_stream(s, NULL); + if (!st) + return NULL; + st->codecpar->codec_type = codec_type; + if (s->nb_streams>=3 ||( s->nb_streams==2 + && s->streams[0]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE + && s->streams[1]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE)) + s->ctx_flags &= ~AVFMTCTX_NOHEADER; + if (codec_type == AVMEDIA_TYPE_AUDIO) { + st->codecpar->bit_rate = flv->audio_bit_rate; + flv->missing_streams &= ~FLV_HEADER_FLAG_HASAUDIO; + } + if (codec_type == AVMEDIA_TYPE_VIDEO) { + st->codecpar->bit_rate = flv->video_bit_rate; + flv->missing_streams &= ~FLV_HEADER_FLAG_HASVIDEO; + st->avg_frame_rate = flv->framerate; + } + + + avpriv_set_pts_info(st, 32, 1, 1000); /* 32 bit pts in ms */ + flv->last_keyframe_stream_index = s->nb_streams - 1; + add_keyframes_index(s); + return st; +} + +static int flv_same_audio_codec(AVCodecParameters *apar, int flags) +{ + int bits_per_coded_sample = (flags & FLV_AUDIO_SAMPLESIZE_MASK) ? 16 : 8; + int flv_codecid = flags & FLV_AUDIO_CODECID_MASK; + int codec_id; + + if (!apar->codec_id && !apar->codec_tag) + return 1; + + if (apar->bits_per_coded_sample != bits_per_coded_sample) + return 0; + + switch (flv_codecid) { + // no distinction between S16 and S8 PCM codec flags + case FLV_CODECID_PCM: + codec_id = bits_per_coded_sample == 8 + ? AV_CODEC_ID_PCM_U8 +#if HAVE_BIGENDIAN + : AV_CODEC_ID_PCM_S16BE; +#else + : AV_CODEC_ID_PCM_S16LE; +#endif + return codec_id == apar->codec_id; + case FLV_CODECID_PCM_LE: + codec_id = bits_per_coded_sample == 8 + ? AV_CODEC_ID_PCM_U8 + : AV_CODEC_ID_PCM_S16LE; + return codec_id == apar->codec_id; + case FLV_CODECID_AAC: + return apar->codec_id == AV_CODEC_ID_AAC; + case FLV_CODECID_ADPCM: + return apar->codec_id == AV_CODEC_ID_ADPCM_SWF; + case FLV_CODECID_SPEEX: + return apar->codec_id == AV_CODEC_ID_SPEEX; + case FLV_CODECID_MP3: + return apar->codec_id == AV_CODEC_ID_MP3; + case FLV_CODECID_NELLYMOSER_8KHZ_MONO: + case FLV_CODECID_NELLYMOSER_16KHZ_MONO: + case FLV_CODECID_NELLYMOSER: + return apar->codec_id == AV_CODEC_ID_NELLYMOSER; + case FLV_CODECID_PCM_MULAW: + return apar->sample_rate == 8000 && + apar->codec_id == AV_CODEC_ID_PCM_MULAW; + case FLV_CODECID_PCM_ALAW: + return apar->sample_rate == 8000 && + apar->codec_id == AV_CODEC_ID_PCM_ALAW; + default: + return apar->codec_tag == (flv_codecid >> FLV_AUDIO_CODECID_OFFSET); + } +} + +static void flv_set_audio_codec(AVFormatContext *s, AVStream *astream, + AVCodecParameters *apar, int flv_codecid) +{ + switch (flv_codecid) { + // no distinction between S16 and S8 PCM codec flags + case FLV_CODECID_PCM: + apar->codec_id = apar->bits_per_coded_sample == 8 + ? AV_CODEC_ID_PCM_U8 +#if HAVE_BIGENDIAN + : AV_CODEC_ID_PCM_S16BE; +#else + : AV_CODEC_ID_PCM_S16LE; +#endif + break; + case FLV_CODECID_PCM_LE: + apar->codec_id = apar->bits_per_coded_sample == 8 + ? AV_CODEC_ID_PCM_U8 + : AV_CODEC_ID_PCM_S16LE; + break; + case FLV_CODECID_AAC: + apar->codec_id = AV_CODEC_ID_AAC; + break; + case FLV_CODECID_ADPCM: + apar->codec_id = AV_CODEC_ID_ADPCM_SWF; + break; + case FLV_CODECID_SPEEX: + apar->codec_id = AV_CODEC_ID_SPEEX; + apar->sample_rate = 16000; + break; + case FLV_CODECID_MP3: + apar->codec_id = AV_CODEC_ID_MP3; + astream->need_parsing = AVSTREAM_PARSE_FULL; + break; + case FLV_CODECID_NELLYMOSER_8KHZ_MONO: + // in case metadata does not otherwise declare samplerate + apar->sample_rate = 8000; + apar->codec_id = AV_CODEC_ID_NELLYMOSER; + break; + case FLV_CODECID_NELLYMOSER_16KHZ_MONO: + apar->sample_rate = 16000; + apar->codec_id = AV_CODEC_ID_NELLYMOSER; + break; + case FLV_CODECID_NELLYMOSER: + apar->codec_id = AV_CODEC_ID_NELLYMOSER; + break; + case FLV_CODECID_PCM_MULAW: + apar->sample_rate = 8000; + apar->codec_id = AV_CODEC_ID_PCM_MULAW; + break; + case FLV_CODECID_PCM_ALAW: + apar->sample_rate = 8000; + apar->codec_id = AV_CODEC_ID_PCM_ALAW; + break; + default: + avpriv_request_sample(s, "Audio codec (%x)", + flv_codecid >> FLV_AUDIO_CODECID_OFFSET); + apar->codec_tag = flv_codecid >> FLV_AUDIO_CODECID_OFFSET; + } +} + +static int flv_same_video_codec(AVCodecParameters *vpar, int flags) +{ + int flv_codecid = flags & FLV_VIDEO_CODECID_MASK; + + if (!vpar->codec_id && !vpar->codec_tag) + return 1; + + switch (flv_codecid) { + case FLV_CODECID_H263: + return vpar->codec_id == AV_CODEC_ID_FLV1; + case FLV_CODECID_SCREEN: + return vpar->codec_id == AV_CODEC_ID_FLASHSV; + case FLV_CODECID_SCREEN2: + return vpar->codec_id == AV_CODEC_ID_FLASHSV2; + case FLV_CODECID_VP6: + return vpar->codec_id == AV_CODEC_ID_VP6F; + case FLV_CODECID_VP6A: + return vpar->codec_id == AV_CODEC_ID_VP6A; + case FLV_CODECID_H264: + return vpar->codec_id == AV_CODEC_ID_H264; + case FLV_CODECID_HEVC: + return vpar->codec_id == AV_CODEC_ID_HEVC; + default: + return vpar->codec_tag == flv_codecid; + } +} + +static int flv_set_video_codec(AVFormatContext *s, AVStream *vstream, + int flv_codecid, int read) +{ + int ret = 0; + AVCodecParameters *par = vstream->codecpar; + enum AVCodecID old_codec_id = vstream->codecpar->codec_id; + switch (flv_codecid) { + case FLV_CODECID_H263: + par->codec_id = AV_CODEC_ID_FLV1; + break; + case FLV_CODECID_REALH263: + par->codec_id = AV_CODEC_ID_H263; + break; // Really mean it this time + case FLV_CODECID_SCREEN: + par->codec_id = AV_CODEC_ID_FLASHSV; + break; + case FLV_CODECID_SCREEN2: + par->codec_id = AV_CODEC_ID_FLASHSV2; + break; + case FLV_CODECID_VP6: + par->codec_id = AV_CODEC_ID_VP6F; + case FLV_CODECID_VP6A: + if (flv_codecid == FLV_CODECID_VP6A) + par->codec_id = AV_CODEC_ID_VP6A; + if (read) { + if (par->extradata_size != 1) { + ff_alloc_extradata(par, 1); + } + if (par->extradata) + par->extradata[0] = avio_r8(s->pb); + else + avio_skip(s->pb, 1); + } + ret = 1; // 1 byte body size adjustment for flv_read_packet() + break; + case FLV_CODECID_H264: + par->codec_id = AV_CODEC_ID_H264; + vstream->need_parsing = AVSTREAM_PARSE_HEADERS; + ret = 3; // not 4, reading packet type will consume one byte + break; + case FLV_CODECID_MPEG4: + par->codec_id = AV_CODEC_ID_MPEG4; + ret = 3; + break; + case FLV_CODECID_HEVC: + par->codec_id = AV_CODEC_ID_HEVC; + vstream->need_parsing = AVSTREAM_PARSE_NONE; + ret = 3; // not 4, reading packet type will consume one byte + break; + default: + avpriv_request_sample(s, "Video codec (%x)", flv_codecid); + par->codec_tag = flv_codecid; + } + + if (!vstream->internal->need_context_update && par->codec_id != old_codec_id) { + avpriv_request_sample(s, "Changing the codec id midstream"); + return AVERROR_PATCHWELCOME; + } + + return ret; +} + +static int amf_get_string(AVIOContext *ioc, char *buffer, int buffsize) +{ + int length = avio_rb16(ioc); + if (length >= buffsize) { + avio_skip(ioc, length); + return -1; + } + + avio_read(ioc, buffer, length); + + buffer[length] = '\0'; + + return length; +} + +static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, int64_t max_pos) +{ + FLVContext *flv = s->priv_data; + unsigned int timeslen = 0, fileposlen = 0, i; + char str_val[256]; + int64_t *times = NULL; + int64_t *filepositions = NULL; + int ret = AVERROR(ENOSYS); + int64_t initial_pos = avio_tell(ioc); + + if (flv->keyframe_count > 0) { + av_log(s, AV_LOG_DEBUG, "keyframes have been paresed\n"); + return 0; + } + av_assert0(!flv->keyframe_times); + av_assert0(!flv->keyframe_filepositions); + + if (s->flags & AVFMT_FLAG_IGNIDX) + return 0; + + while (avio_tell(ioc) < max_pos - 2 && + amf_get_string(ioc, str_val, sizeof(str_val)) > 0) { + int64_t **current_array; + unsigned int arraylen; + + // Expect array object in context + if (avio_r8(ioc) != AMF_DATA_TYPE_ARRAY) + break; + + arraylen = avio_rb32(ioc); + if (arraylen>>28) + break; + + if (!strcmp(KEYFRAMES_TIMESTAMP_TAG , str_val) && !times) { + current_array = × + timeslen = arraylen; + } else if (!strcmp(KEYFRAMES_BYTEOFFSET_TAG, str_val) && + !filepositions) { + current_array = &filepositions; + fileposlen = arraylen; + } else + // unexpected metatag inside keyframes, will not use such + // metadata for indexing + break; + + if (!(*current_array = av_mallocz(sizeof(**current_array) * arraylen))) { + ret = AVERROR(ENOMEM); + goto finish; + } + + for (i = 0; i < arraylen && avio_tell(ioc) < max_pos - 1; i++) { + if (avio_r8(ioc) != AMF_DATA_TYPE_NUMBER) + goto invalid; + current_array[0][i] = av_int2double(avio_rb64(ioc)); + } + if (times && filepositions) { + // All done, exiting at a position allowing amf_parse_object + // to finish parsing the object + ret = 0; + break; + } + } + + if (timeslen == fileposlen && fileposlen>1 && max_pos <= filepositions[0]) { + for (i = 0; i < FFMIN(2,fileposlen); i++) { + flv->validate_index[i].pos = filepositions[i]; + flv->validate_index[i].dts = times[i] * 1000; + flv->validate_count = i + 1; + } + flv->keyframe_times = times; + flv->keyframe_filepositions = filepositions; + flv->keyframe_count = timeslen; + times = NULL; + filepositions = NULL; + } else { +invalid: + av_log(s, AV_LOG_WARNING, "Invalid keyframes object, skipping.\n"); + } + +finish: + av_freep(×); + av_freep(&filepositions); + avio_seek(ioc, initial_pos, SEEK_SET); + return ret; +} + +static int amf_parse_object(AVFormatContext *s, AVStream *astream, + AVStream *vstream, const char *key, + int64_t max_pos, int depth) +{ + AVCodecParameters *apar, *vpar; + FLVContext *flv = s->priv_data; + AVIOContext *ioc; + AMFDataType amf_type; + char str_val[1024]; + double num_val; + + num_val = 0; + ioc = s->pb; + amf_type = avio_r8(ioc); + + switch (amf_type) { + case AMF_DATA_TYPE_NUMBER: + num_val = av_int2double(avio_rb64(ioc)); + break; + case AMF_DATA_TYPE_BOOL: + num_val = avio_r8(ioc); + break; + case AMF_DATA_TYPE_STRING: + if (amf_get_string(ioc, str_val, sizeof(str_val)) < 0) { + av_log(s, AV_LOG_ERROR, "AMF_DATA_TYPE_STRING parsing failed\n"); + return -1; + } + break; + case AMF_DATA_TYPE_OBJECT: + if (key && + (ioc->seekable & AVIO_SEEKABLE_NORMAL) && + !strcmp(KEYFRAMES_TAG, key) && depth == 1) + if (parse_keyframes_index(s, ioc, + max_pos) < 0) + av_log(s, AV_LOG_ERROR, "Keyframe index parsing failed\n"); + else + add_keyframes_index(s); + while (avio_tell(ioc) < max_pos - 2 && + amf_get_string(ioc, str_val, sizeof(str_val)) > 0) + if (amf_parse_object(s, astream, vstream, str_val, max_pos, + depth + 1) < 0) + return -1; // if we couldn't skip, bomb out. + if (avio_r8(ioc) != AMF_END_OF_OBJECT) { + av_log(s, AV_LOG_ERROR, "Missing AMF_END_OF_OBJECT in AMF_DATA_TYPE_OBJECT\n"); + return -1; + } + break; + case AMF_DATA_TYPE_NULL: + case AMF_DATA_TYPE_UNDEFINED: + case AMF_DATA_TYPE_UNSUPPORTED: + break; // these take up no additional space + case AMF_DATA_TYPE_MIXEDARRAY: + { + unsigned v; + avio_skip(ioc, 4); // skip 32-bit max array index + while (avio_tell(ioc) < max_pos - 2 && + amf_get_string(ioc, str_val, sizeof(str_val)) > 0) + // this is the only case in which we would want a nested + // parse to not skip over the object + if (amf_parse_object(s, astream, vstream, str_val, max_pos, + depth + 1) < 0) + return -1; + v = avio_r8(ioc); + if (v != AMF_END_OF_OBJECT) { + av_log(s, AV_LOG_ERROR, "Missing AMF_END_OF_OBJECT in AMF_DATA_TYPE_MIXEDARRAY, found %d\n", v); + return -1; + } + break; + } + case AMF_DATA_TYPE_ARRAY: + { + unsigned int arraylen, i; + + arraylen = avio_rb32(ioc); + for (i = 0; i < arraylen && avio_tell(ioc) < max_pos - 1; i++) + if (amf_parse_object(s, NULL, NULL, NULL, max_pos, + depth + 1) < 0) + return -1; // if we couldn't skip, bomb out. + } + break; + case AMF_DATA_TYPE_DATE: + avio_skip(ioc, 8 + 2); // timestamp (double) and UTC offset (int16) + break; + default: // unsupported type, we couldn't skip + av_log(s, AV_LOG_ERROR, "unsupported amf type %d\n", amf_type); + return -1; + } + + if (key) { + apar = astream ? astream->codecpar : NULL; + vpar = vstream ? vstream->codecpar : NULL; + + // stream info doesn't live any deeper than the first object + if (depth == 1) { + if (amf_type == AMF_DATA_TYPE_NUMBER || + amf_type == AMF_DATA_TYPE_BOOL) { + if (!strcmp(key, "duration")) + s->duration = num_val * AV_TIME_BASE; + else if (!strcmp(key, "videodatarate") && + 0 <= (int)(num_val * 1024.0)) + flv->video_bit_rate = num_val * 1024.0; + else if (!strcmp(key, "audiodatarate") && + 0 <= (int)(num_val * 1024.0)) + flv->audio_bit_rate = num_val * 1024.0; + else if (!strcmp(key, "datastream")) { + AVStream *st = create_stream(s, AVMEDIA_TYPE_SUBTITLE); + if (!st) + return AVERROR(ENOMEM); + st->codecpar->codec_id = AV_CODEC_ID_TEXT; + } else if (!strcmp(key, "framerate")) { + flv->framerate = av_d2q(num_val, 1000); + if (vstream) + vstream->avg_frame_rate = flv->framerate; + } else if (flv->trust_metadata) { + if (!strcmp(key, "videocodecid") && vpar) { + int ret = flv_set_video_codec(s, vstream, num_val, 0); + if (ret < 0) + return ret; + } else if (!strcmp(key, "audiocodecid") && apar) { + int id = ((int)num_val) << FLV_AUDIO_CODECID_OFFSET; + flv_set_audio_codec(s, astream, apar, id); + } else if (!strcmp(key, "audiosamplerate") && apar) { + apar->sample_rate = num_val; + } else if (!strcmp(key, "audiosamplesize") && apar) { + apar->bits_per_coded_sample = num_val; + } else if (!strcmp(key, "stereo") && apar) { + apar->channels = num_val + 1; + apar->channel_layout = apar->channels == 2 ? + AV_CH_LAYOUT_STEREO : + AV_CH_LAYOUT_MONO; + } else if (!strcmp(key, "width") && vpar) { + vpar->width = num_val; + } else if (!strcmp(key, "height") && vpar) { + vpar->height = num_val; + } + } + } + if (amf_type == AMF_DATA_TYPE_STRING) { + if (!strcmp(key, "encoder")) { + int version = -1; + if (1 == sscanf(str_val, "Open Broadcaster Software v0.%d", &version)) { + if (version > 0 && version <= 655) + flv->broken_sizes = 1; + } + } else if (!strcmp(key, "metadatacreator") && !strcmp(str_val, "MEGA")) { + flv->broken_sizes = 1; + } + } + } + + if (amf_type == AMF_DATA_TYPE_OBJECT && s->nb_streams == 1 && + ((!apar && !strcmp(key, "audiocodecid")) || + (!vpar && !strcmp(key, "videocodecid")))) + s->ctx_flags &= ~AVFMTCTX_NOHEADER; //If there is either audio/video missing, codecid will be an empty object + + if (!strcmp(key, "duration") || + !strcmp(key, "filesize") || + !strcmp(key, "width") || + !strcmp(key, "height") || + !strcmp(key, "videodatarate") || + !strcmp(key, "framerate") || + !strcmp(key, "videocodecid") || + !strcmp(key, "audiodatarate") || + !strcmp(key, "audiosamplerate") || + !strcmp(key, "audiosamplesize") || + !strcmp(key, "stereo") || + !strcmp(key, "audiocodecid") || + !strcmp(key, "datastream")) + return 0; + + s->event_flags |= AVFMT_EVENT_FLAG_METADATA_UPDATED; + if (amf_type == AMF_DATA_TYPE_BOOL) { + av_strlcpy(str_val, num_val > 0 ? "true" : "false", + sizeof(str_val)); + av_dict_set(&s->metadata, key, str_val, 0); + } else if (amf_type == AMF_DATA_TYPE_NUMBER) { + snprintf(str_val, sizeof(str_val), "%.f", num_val); + av_dict_set(&s->metadata, key, str_val, 0); + } else if (amf_type == AMF_DATA_TYPE_STRING) + av_dict_set(&s->metadata, key, str_val, 0); + } + + return 0; +} + +#define TYPE_ONTEXTDATA 1 +#define TYPE_ONCAPTION 2 +#define TYPE_ONCAPTIONINFO 3 +#define TYPE_UNKNOWN 9 + +static int flv_read_metabody(AVFormatContext *s, int64_t next_pos) +{ + FLVContext *flv = s->priv_data; + AMFDataType type; + AVStream *stream, *astream, *vstream; + AVStream av_unused *dstream; + AVIOContext *ioc; + int i; + // only needs to hold the string "onMetaData". + // Anything longer is something we don't want. + char buffer[32]; + + astream = NULL; + vstream = NULL; + dstream = NULL; + ioc = s->pb; + + // first object needs to be "onMetaData" string + type = avio_r8(ioc); + if (type != AMF_DATA_TYPE_STRING || + amf_get_string(ioc, buffer, sizeof(buffer)) < 0) + return TYPE_UNKNOWN; + + if (!strcmp(buffer, "onTextData")) + return TYPE_ONTEXTDATA; + + if (!strcmp(buffer, "onCaption")) + return TYPE_ONCAPTION; + + if (!strcmp(buffer, "onCaptionInfo")) + return TYPE_ONCAPTIONINFO; + + if (strcmp(buffer, "onMetaData") && strcmp(buffer, "onCuePoint")) { + av_log(s, AV_LOG_DEBUG, "Unknown type %s\n", buffer); + return TYPE_UNKNOWN; + } + + // find the streams now so that amf_parse_object doesn't need to do + // the lookup every time it is called. + for (i = 0; i < s->nb_streams; i++) { + stream = s->streams[i]; + if (stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { + vstream = stream; + flv->last_keyframe_stream_index = i; + } else if (stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { + astream = stream; + if (flv->last_keyframe_stream_index == -1) + flv->last_keyframe_stream_index = i; + } + else if (stream->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) + dstream = stream; + } + + // parse the second object (we want a mixed array) + if (amf_parse_object(s, astream, vstream, buffer, next_pos, 0) < 0) + return -1; + + return 0; +} + +static int flv_read_header(AVFormatContext *s) +{ + int flags; + FLVContext *flv = s->priv_data; + int offset; + int pre_tag_size = 0; + + avio_skip(s->pb, 4); + flags = avio_r8(s->pb); + + flv->missing_streams = flags & (FLV_HEADER_FLAG_HASVIDEO | FLV_HEADER_FLAG_HASAUDIO); + + s->ctx_flags |= AVFMTCTX_NOHEADER; + + offset = avio_rb32(s->pb); + avio_seek(s->pb, offset, SEEK_SET); + + /* Annex E. The FLV File Format + * E.3 TheFLVFileBody + * Field Type Comment + * PreviousTagSize0 UI32 Always 0 + * */ + pre_tag_size = avio_rb32(s->pb); + if (pre_tag_size) { + av_log(s, AV_LOG_WARNING, "Read FLV header error, input file is not a standard flv format, first PreviousTagSize0 always is 0\n"); + } + + s->start_time = 0; + flv->sum_flv_tag_size = 0; + flv->last_keyframe_stream_index = -1; + + return 0; +} + +static int flv_read_close(AVFormatContext *s) +{ + int i; + FLVContext *flv = s->priv_data; + for (i=0; inew_extradata[i]); + av_freep(&flv->keyframe_times); + av_freep(&flv->keyframe_filepositions); + return 0; +} + +static int flv_get_extradata(AVFormatContext *s, AVStream *st, int size) +{ + av_freep(&st->codecpar->extradata); + if (ff_get_extradata(s, st->codecpar, s->pb, size) < 0) + return AVERROR(ENOMEM); + return 0; +} + +static int flv_queue_extradata(FLVContext *flv, AVIOContext *pb, int stream, + int size) +{ + av_free(flv->new_extradata[stream]); + flv->new_extradata[stream] = av_mallocz(size + + AV_INPUT_BUFFER_PADDING_SIZE); + if (!flv->new_extradata[stream]) + return AVERROR(ENOMEM); + flv->new_extradata_size[stream] = size; + avio_read(pb, flv->new_extradata[stream], size); + return 0; +} + +static void clear_index_entries(AVFormatContext *s, int64_t pos) +{ + int i, j, out; + av_log(s, AV_LOG_WARNING, + "Found invalid index entries, clearing the index.\n"); + for (i = 0; i < s->nb_streams; i++) { + AVStream *st = s->streams[i]; + /* Remove all index entries that point to >= pos */ + out = 0; + for (j = 0; j < st->nb_index_entries; j++) + if (st->index_entries[j].pos < pos) + st->index_entries[out++] = st->index_entries[j]; + st->nb_index_entries = out; + } +} + +static int amf_skip_tag(AVIOContext *pb, AMFDataType type) +{ + int nb = -1, ret, parse_name = 1; + + switch (type) { + case AMF_DATA_TYPE_NUMBER: + avio_skip(pb, 8); + break; + case AMF_DATA_TYPE_BOOL: + avio_skip(pb, 1); + break; + case AMF_DATA_TYPE_STRING: + avio_skip(pb, avio_rb16(pb)); + break; + case AMF_DATA_TYPE_ARRAY: + parse_name = 0; + case AMF_DATA_TYPE_MIXEDARRAY: + nb = avio_rb32(pb); + case AMF_DATA_TYPE_OBJECT: + while(!pb->eof_reached && (nb-- > 0 || type != AMF_DATA_TYPE_ARRAY)) { + if (parse_name) { + int size = avio_rb16(pb); + if (!size) { + avio_skip(pb, 1); + break; + } + avio_skip(pb, size); + } + if ((ret = amf_skip_tag(pb, avio_r8(pb))) < 0) + return ret; + } + break; + case AMF_DATA_TYPE_NULL: + case AMF_DATA_TYPE_OBJECT_END: + break; + default: + return AVERROR_INVALIDDATA; + } + return 0; +} + +static int flv_data_packet(AVFormatContext *s, AVPacket *pkt, + int64_t dts, int64_t next) +{ + AVIOContext *pb = s->pb; + AVStream *st = NULL; + char buf[20]; + int ret = AVERROR_INVALIDDATA; + int i, length = -1; + int array = 0; + + switch (avio_r8(pb)) { + case AMF_DATA_TYPE_ARRAY: + array = 1; + case AMF_DATA_TYPE_MIXEDARRAY: + avio_seek(pb, 4, SEEK_CUR); + case AMF_DATA_TYPE_OBJECT: + break; + default: + goto skip; + } + + while (array || (ret = amf_get_string(pb, buf, sizeof(buf))) > 0) { + AMFDataType type = avio_r8(pb); + if (type == AMF_DATA_TYPE_STRING && (array || !strcmp(buf, "text"))) { + length = avio_rb16(pb); + ret = av_get_packet(pb, pkt, length); + if (ret < 0) + goto skip; + else + break; + } else { + if ((ret = amf_skip_tag(pb, type)) < 0) + goto skip; + } + } + + if (length < 0) { + ret = AVERROR_INVALIDDATA; + goto skip; + } + + for (i = 0; i < s->nb_streams; i++) { + st = s->streams[i]; + if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) + break; + } + + if (i == s->nb_streams) { + st = create_stream(s, AVMEDIA_TYPE_SUBTITLE); + if (!st) + return AVERROR(ENOMEM); + st->codecpar->codec_id = AV_CODEC_ID_TEXT; + } + + pkt->dts = dts; + pkt->pts = dts; + pkt->size = ret; + + pkt->stream_index = st->index; + pkt->flags |= AV_PKT_FLAG_KEY; + +skip: + avio_seek(s->pb, next + 4, SEEK_SET); + + return ret; +} + +static int resync(AVFormatContext *s) +{ + FLVContext *flv = s->priv_data; + int64_t i; + int64_t pos = avio_tell(s->pb); + + for (i=0; !avio_feof(s->pb); i++) { + int j = i & (RESYNC_BUFFER_SIZE-1); + int j1 = j + RESYNC_BUFFER_SIZE; + flv->resync_buffer[j ] = + flv->resync_buffer[j1] = avio_r8(s->pb); + + if (i > 22) { + unsigned lsize2 = AV_RB32(flv->resync_buffer + j1 - 4); + if (lsize2 >= 11 && lsize2 + 8LL < FFMIN(i, RESYNC_BUFFER_SIZE)) { + unsigned size2 = AV_RB24(flv->resync_buffer + j1 - lsize2 + 1 - 4); + unsigned lsize1 = AV_RB32(flv->resync_buffer + j1 - lsize2 - 8); + if (lsize1 >= 11 && lsize1 + 8LL + lsize2 < FFMIN(i, RESYNC_BUFFER_SIZE)) { + unsigned size1 = AV_RB24(flv->resync_buffer + j1 - lsize1 + 1 - lsize2 - 8); + if (size1 == lsize1 - 11 && size2 == lsize2 - 11) { + avio_seek(s->pb, pos + i - lsize1 - lsize2 - 8, SEEK_SET); + return 1; + } + } + } + } + } + return AVERROR_EOF; +} + +static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) +{ + FLVContext *flv = s->priv_data; + int ret, i, size, flags; + enum FlvTagType type; + int stream_type=-1; + int64_t next, pos, meta_pos; + int64_t dts, pts = AV_NOPTS_VALUE; + int av_uninit(channels); + int av_uninit(sample_rate); + AVStream *st = NULL; + int last = -1; + int orig_size; + +retry: + /* pkt size is repeated at end. skip it */ + pos = avio_tell(s->pb); + type = (avio_r8(s->pb) & 0x1F); + orig_size = + size = avio_rb24(s->pb); + flv->sum_flv_tag_size += size + 11; + dts = avio_rb24(s->pb); + dts |= (unsigned)avio_r8(s->pb) << 24; + av_log(s, AV_LOG_TRACE, "type:%d, size:%d, last:%d, dts:%"PRId64" pos:%"PRId64"\n", type, size, last, dts, avio_tell(s->pb)); + if (avio_feof(s->pb)) + return AVERROR_EOF; + avio_skip(s->pb, 3); /* stream id, always 0 */ + flags = 0; + + if (flv->validate_next < flv->validate_count) { + int64_t validate_pos = flv->validate_index[flv->validate_next].pos; + if (pos == validate_pos) { + if (FFABS(dts - flv->validate_index[flv->validate_next].dts) <= + VALIDATE_INDEX_TS_THRESH) { + flv->validate_next++; + } else { + clear_index_entries(s, validate_pos); + flv->validate_count = 0; + } + } else if (pos > validate_pos) { + clear_index_entries(s, validate_pos); + flv->validate_count = 0; + } + } + + if (size == 0) { + ret = FFERROR_REDO; + goto leave; + } + + next = size + avio_tell(s->pb); + + if (type == FLV_TAG_TYPE_AUDIO) { + stream_type = FLV_STREAM_TYPE_AUDIO; + flags = avio_r8(s->pb); + size--; + } else if (type == FLV_TAG_TYPE_VIDEO) { + stream_type = FLV_STREAM_TYPE_VIDEO; + flags = avio_r8(s->pb); + size--; + if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_VIDEO_INFO_CMD) + goto skip; + } else if (type == FLV_TAG_TYPE_META) { + stream_type=FLV_STREAM_TYPE_DATA; + if (size > 13 + 1 + 4) { // Header-type metadata stuff + int type; + meta_pos = avio_tell(s->pb); + type = flv_read_metabody(s, next); + if (type == 0 && dts == 0 || type < 0 || type == TYPE_UNKNOWN) { + if (type < 0 && flv->validate_count && + flv->validate_index[0].pos > next && + flv->validate_index[0].pos - 4 < next + ) { + av_log(s, AV_LOG_WARNING, "Adjusting next position due to index mismatch\n"); + next = flv->validate_index[0].pos - 4; + } + goto skip; + } else if (type == TYPE_ONTEXTDATA) { + avpriv_request_sample(s, "OnTextData packet"); + return flv_data_packet(s, pkt, dts, next); + } else if (type == TYPE_ONCAPTION) { + return flv_data_packet(s, pkt, dts, next); + } + avio_seek(s->pb, meta_pos, SEEK_SET); + } + } else { + av_log(s, AV_LOG_DEBUG, + "Skipping flv packet: type %d, size %d, flags %d.\n", + type, size, flags); +skip: + avio_seek(s->pb, next, SEEK_SET); + ret = FFERROR_REDO; + goto leave; + } + + /* skip empty data packets */ + if (!size) { + ret = FFERROR_REDO; + goto leave; + } + + /* now find stream */ + for (i = 0; i < s->nb_streams; i++) { + st = s->streams[i]; + if (stream_type == FLV_STREAM_TYPE_AUDIO) { + if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && + (s->audio_codec_id || flv_same_audio_codec(st->codecpar, flags))) + break; + } else if (stream_type == FLV_STREAM_TYPE_VIDEO) { + if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && + (s->video_codec_id || flv_same_video_codec(st->codecpar, flags))) + break; + } else if (stream_type == FLV_STREAM_TYPE_DATA) { + if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) + break; + } + } + if (i == s->nb_streams) { + static const enum AVMediaType stream_types[] = {AVMEDIA_TYPE_VIDEO, AVMEDIA_TYPE_AUDIO, AVMEDIA_TYPE_SUBTITLE}; + st = create_stream(s, stream_types[stream_type]); + if (!st) + return AVERROR(ENOMEM); + + } + av_log(s, AV_LOG_TRACE, "%d %X %d \n", stream_type, flags, st->discard); + + if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && + ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY || + stream_type == FLV_STREAM_TYPE_AUDIO)) + av_add_index_entry(st, pos, dts, size, 0, AVINDEX_KEYFRAME); + + if ( (st->discard >= AVDISCARD_NONKEY && !((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY || (stream_type == FLV_STREAM_TYPE_AUDIO))) + ||(st->discard >= AVDISCARD_BIDIR && ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_DISP_INTER && (stream_type == FLV_STREAM_TYPE_VIDEO))) + || st->discard >= AVDISCARD_ALL + ) { + avio_seek(s->pb, next, SEEK_SET); + ret = FFERROR_REDO; + goto leave; + } + + // if not streamed and no duration from metadata then seek to end to find + // the duration from the timestamps + if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && + (!s->duration || s->duration == AV_NOPTS_VALUE) && + !flv->searched_for_end) { + int size; + const int64_t pos = avio_tell(s->pb); + // Read the last 4 bytes of the file, this should be the size of the + // previous FLV tag. Use the timestamp of its payload as duration. + int64_t fsize = avio_size(s->pb); +retry_duration: + avio_seek(s->pb, fsize - 4, SEEK_SET); + size = avio_rb32(s->pb); + if (size > 0 && size < fsize) { + // Seek to the start of the last FLV tag at position (fsize - 4 - size) + // but skip the byte indicating the type. + avio_seek(s->pb, fsize - 3 - size, SEEK_SET); + if (size == avio_rb24(s->pb) + 11) { + uint32_t ts = avio_rb24(s->pb); + ts |= avio_r8(s->pb) << 24; + if (ts) + s->duration = ts * (int64_t)AV_TIME_BASE / 1000; + else if (fsize >= 8 && fsize - 8 >= size) { + fsize -= size+4; + goto retry_duration; + } + } + } + + avio_seek(s->pb, pos, SEEK_SET); + flv->searched_for_end = 1; + } + + if (stream_type == FLV_STREAM_TYPE_AUDIO) { + int bits_per_coded_sample; + channels = (flags & FLV_AUDIO_CHANNEL_MASK) == FLV_STEREO ? 2 : 1; + sample_rate = 44100 << ((flags & FLV_AUDIO_SAMPLERATE_MASK) >> + FLV_AUDIO_SAMPLERATE_OFFSET) >> 3; + bits_per_coded_sample = (flags & FLV_AUDIO_SAMPLESIZE_MASK) ? 16 : 8; + if (!st->codecpar->channels || !st->codecpar->sample_rate || + !st->codecpar->bits_per_coded_sample) { + st->codecpar->channels = channels; + st->codecpar->channel_layout = channels == 1 + ? AV_CH_LAYOUT_MONO + : AV_CH_LAYOUT_STEREO; + st->codecpar->sample_rate = sample_rate; + st->codecpar->bits_per_coded_sample = bits_per_coded_sample; + } + if (!st->codecpar->codec_id) { + flv_set_audio_codec(s, st, st->codecpar, + flags & FLV_AUDIO_CODECID_MASK); + flv->last_sample_rate = + sample_rate = st->codecpar->sample_rate; + flv->last_channels = + channels = st->codecpar->channels; + } else { + AVCodecParameters *par = avcodec_parameters_alloc(); + if (!par) { + ret = AVERROR(ENOMEM); + goto leave; + } + par->sample_rate = sample_rate; + par->bits_per_coded_sample = bits_per_coded_sample; + flv_set_audio_codec(s, st, par, flags & FLV_AUDIO_CODECID_MASK); + sample_rate = par->sample_rate; + avcodec_parameters_free(&par); + } + } else if (stream_type == FLV_STREAM_TYPE_VIDEO) { + int ret = flv_set_video_codec(s, st, flags & FLV_VIDEO_CODECID_MASK, 1); + if (ret < 0) + return ret; + size -= ret; + } else if (stream_type == FLV_STREAM_TYPE_DATA) { + st->codecpar->codec_id = AV_CODEC_ID_TEXT; + } + + if (st->codecpar->codec_id == AV_CODEC_ID_AAC || + st->codecpar->codec_id == AV_CODEC_ID_H264 || + st->codecpar->codec_id == AV_CODEC_ID_MPEG4 || + st->codecpar->codec_id == AV_CODEC_ID_HEVC) { + int type = avio_r8(s->pb); + size--; + if (st->codecpar->codec_id == AV_CODEC_ID_H264 || st->codecpar->codec_id == AV_CODEC_ID_MPEG4 + || st->codecpar->codec_id == AV_CODEC_ID_HEVC) { + // sign extension + int32_t cts = (avio_rb24(s->pb) + 0xff800000) ^ 0xff800000; + pts = dts + cts; + if (cts < 0) { // dts might be wrong + if (!flv->wrong_dts) + av_log(s, AV_LOG_WARNING, + "Negative cts, previous timestamps might be wrong.\n"); + flv->wrong_dts = 1; + } else if (FFABS(dts - pts) > 1000*60*15) { + av_log(s, AV_LOG_WARNING, + "invalid timestamps %"PRId64" %"PRId64"\n", dts, pts); + dts = pts = AV_NOPTS_VALUE; + } + } + if (type == 0 && (!st->codecpar->extradata || st->codecpar->codec_id == AV_CODEC_ID_AAC || + st->codecpar->codec_id == AV_CODEC_ID_H264 || st->codecpar->codec_id == AV_CODEC_ID_HEVC)) { + AVDictionaryEntry *t; + + if (st->codecpar->extradata) { + if ((ret = flv_queue_extradata(flv, s->pb, stream_type, size)) < 0) + return ret; + ret = FFERROR_REDO; + goto leave; + } + if ((ret = flv_get_extradata(s, st, size)) < 0) + return ret; + + /* Workaround for buggy Omnia A/XE encoder */ + t = av_dict_get(s->metadata, "Encoder", NULL, 0); + if (st->codecpar->codec_id == AV_CODEC_ID_AAC && t && !strcmp(t->value, "Omnia A/XE")) + st->codecpar->extradata_size = 2; + + if (st->codecpar->codec_id == AV_CODEC_ID_AAC && 0) { + MPEG4AudioConfig cfg; + + if (avpriv_mpeg4audio_get_config(&cfg, st->codecpar->extradata, + st->codecpar->extradata_size * 8, 1) >= 0) { + st->codecpar->channels = cfg.channels; + st->codecpar->channel_layout = 0; + if (cfg.ext_sample_rate) + st->codecpar->sample_rate = cfg.ext_sample_rate; + else + st->codecpar->sample_rate = cfg.sample_rate; + av_log(s, AV_LOG_TRACE, "mp4a config channels %d sample rate %d\n", + st->codecpar->channels, st->codecpar->sample_rate); + } + } + + ret = FFERROR_REDO; + goto leave; + } + } + + /* skip empty data packets */ + if (!size) { + ret = FFERROR_REDO; + goto leave; + } + + ret = av_get_packet(s->pb, pkt, size); + if (ret < 0) + return ret; + pkt->dts = dts; + pkt->pts = pts == AV_NOPTS_VALUE ? dts : pts; + pkt->stream_index = st->index; + pkt->pos = pos; + if (flv->new_extradata[stream_type]) { + uint8_t *side = av_packet_new_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, + flv->new_extradata_size[stream_type]); + if (side) { + memcpy(side, flv->new_extradata[stream_type], + flv->new_extradata_size[stream_type]); + av_freep(&flv->new_extradata[stream_type]); + flv->new_extradata_size[stream_type] = 0; + } + } + if (stream_type == FLV_STREAM_TYPE_AUDIO && + (sample_rate != flv->last_sample_rate || + channels != flv->last_channels)) { + flv->last_sample_rate = sample_rate; + flv->last_channels = channels; + ff_add_param_change(pkt, channels, 0, sample_rate, 0, 0); + } + + if ( stream_type == FLV_STREAM_TYPE_AUDIO || + ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY) || + stream_type == FLV_STREAM_TYPE_DATA) + pkt->flags |= AV_PKT_FLAG_KEY; + +leave: + last = avio_rb32(s->pb); + if (last != orig_size + 11 && last != orig_size + 10 && + !avio_feof(s->pb) && + (last != orig_size || !last) && last != flv->sum_flv_tag_size && + !flv->broken_sizes) { + av_log(s, AV_LOG_ERROR, "Packet mismatch %d %d %d\n", last, orig_size + 11, flv->sum_flv_tag_size); + avio_seek(s->pb, pos + 1, SEEK_SET); + ret = resync(s); + av_packet_unref(pkt); + if (ret >= 0) { + goto retry; + } + } + return ret; +} + +static int flv_read_seek(AVFormatContext *s, int stream_index, + int64_t ts, int flags) +{ + FLVContext *flv = s->priv_data; + flv->validate_count = 0; + return avio_seek_time(s->pb, stream_index, ts, flags); +} + +#define OFFSET(x) offsetof(FLVContext, x) +#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM +static const AVOption options[] = { + { "flv_metadata", "Allocate streams according to the onMetaData array", OFFSET(trust_metadata), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD }, + { "missing_streams", "", OFFSET(missing_streams), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 0xFF, VD | AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY }, + { NULL } +}; + +static const AVClass flv_class = { + .class_name = "flvdec", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; + +AVInputFormat ff_flv_demuxer = { + .name = "flv", + .long_name = NULL_IF_CONFIG_SMALL("FLV (Flash Video)"), + .priv_data_size = sizeof(FLVContext), + .read_probe = flv_probe, + .read_header = flv_read_header, + .read_packet = flv_read_packet, + .read_seek = flv_read_seek, + .read_close = flv_read_close, + .extensions = "flv", + .priv_class = &flv_class, +}; + +static const AVClass live_flv_class = { + .class_name = "live_flvdec", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; + +AVInputFormat ff_live_flv_demuxer = { + .name = "live_flv", + .long_name = NULL_IF_CONFIG_SMALL("live RTMP FLV (Flash Video)"), + .priv_data_size = sizeof(FLVContext), + .read_probe = live_flv_probe, + .read_header = flv_read_header, + .read_packet = flv_read_packet, + .read_seek = flv_read_seek, + .read_close = flv_read_close, + .extensions = "flv", + .priv_class = &live_flv_class, + .flags = AVFMT_TS_DISCONT +}; diff --git a/StreamMedia/flv_h265_patch/ffmpeg_3.3_flv_patch/flvenc.c b/StreamMedia/flv_h265_patch/ffmpeg_3.3_flv_patch/flvenc.c new file mode 100644 index 0000000..eb955e5 --- /dev/null +++ b/StreamMedia/flv_h265_patch/ffmpeg_3.3_flv_patch/flvenc.c @@ -0,0 +1,1114 @@ +/* + * FLV muxer + * Copyright (c) 2003 The FFmpeg Project + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/intreadwrite.h" +#include "libavutil/dict.h" +#include "libavutil/intfloat.h" +#include "libavutil/avassert.h" +#include "libavutil/mathematics.h" +#include "avio_internal.h" +#include "avio.h" +#include "avc.h" +#include "avformat.h" +#include "flv.h" +#include "internal.h" +#include "metadata.h" +#include "libavutil/opt.h" +#include "libavcodec/put_bits.h" +#include "libavcodec/aacenctab.h" +#include "hevc.h" + + +static const AVCodecTag flv_video_codec_ids[] = { + { AV_CODEC_ID_FLV1, FLV_CODECID_H263 }, + { AV_CODEC_ID_H263, FLV_CODECID_REALH263 }, + { AV_CODEC_ID_MPEG4, FLV_CODECID_MPEG4 }, + { AV_CODEC_ID_FLASHSV, FLV_CODECID_SCREEN }, + { AV_CODEC_ID_FLASHSV2, FLV_CODECID_SCREEN2 }, + { AV_CODEC_ID_VP6F, FLV_CODECID_VP6 }, + { AV_CODEC_ID_VP6, FLV_CODECID_VP6 }, + { AV_CODEC_ID_VP6A, FLV_CODECID_VP6A }, + { AV_CODEC_ID_H264, FLV_CODECID_H264 }, + { AV_CODEC_ID_HEVC, FLV_CODECID_HEVC }, + { AV_CODEC_ID_NONE, 0 } +}; + +static const AVCodecTag flv_audio_codec_ids[] = { + { AV_CODEC_ID_MP3, FLV_CODECID_MP3 >> FLV_AUDIO_CODECID_OFFSET }, + { AV_CODEC_ID_PCM_U8, FLV_CODECID_PCM >> FLV_AUDIO_CODECID_OFFSET }, + { AV_CODEC_ID_PCM_S16BE, FLV_CODECID_PCM >> FLV_AUDIO_CODECID_OFFSET }, + { AV_CODEC_ID_PCM_S16LE, FLV_CODECID_PCM_LE >> FLV_AUDIO_CODECID_OFFSET }, + { AV_CODEC_ID_ADPCM_SWF, FLV_CODECID_ADPCM >> FLV_AUDIO_CODECID_OFFSET }, + { AV_CODEC_ID_AAC, FLV_CODECID_AAC >> FLV_AUDIO_CODECID_OFFSET }, + { AV_CODEC_ID_NELLYMOSER, FLV_CODECID_NELLYMOSER >> FLV_AUDIO_CODECID_OFFSET }, + { AV_CODEC_ID_PCM_MULAW, FLV_CODECID_PCM_MULAW >> FLV_AUDIO_CODECID_OFFSET }, + { AV_CODEC_ID_PCM_ALAW, FLV_CODECID_PCM_ALAW >> FLV_AUDIO_CODECID_OFFSET }, + { AV_CODEC_ID_SPEEX, FLV_CODECID_SPEEX >> FLV_AUDIO_CODECID_OFFSET }, + { AV_CODEC_ID_NONE, 0 } +}; + +typedef enum { + FLV_AAC_SEQ_HEADER_DETECT = (1 << 0), + FLV_NO_SEQUENCE_END = (1 << 1), + FLV_ADD_KEYFRAME_INDEX = (1 << 2), + FLV_NO_METADATA = (1 << 3), + FLV_NO_DURATION_FILESIZE = (1 << 4), +} FLVFlags; + +typedef struct FLVFileposition { + int64_t keyframe_position; + double keyframe_timestamp; + struct FLVFileposition *next; +} FLVFileposition; + +typedef struct FLVContext { + AVClass *av_class; + int reserved; + int64_t duration_offset; + int64_t filesize_offset; + int64_t duration; + int64_t delay; ///< first dts delay (needed for AVC & Speex) + + int64_t datastart_offset; + int64_t datasize_offset; + int64_t datasize; + int64_t videosize_offset; + int64_t videosize; + int64_t audiosize_offset; + int64_t audiosize; + + int64_t metadata_size_pos; + int64_t metadata_totalsize_pos; + int64_t metadata_totalsize; + int64_t keyframe_index_size; + + int64_t lasttimestamp_offset; + double lasttimestamp; + int64_t lastkeyframetimestamp_offset; + double lastkeyframetimestamp; + int64_t lastkeyframelocation_offset; + int64_t lastkeyframelocation; + + int acurframeindex; + int64_t keyframes_info_offset; + + int64_t filepositions_count; + FLVFileposition *filepositions; + FLVFileposition *head_filepositions; + + AVCodecParameters *audio_par; + AVCodecParameters *video_par; + double framerate; + AVCodecParameters *data_par; + + int flags; +} FLVContext; + +typedef struct FLVStreamContext { + int64_t last_ts; ///< last timestamp for each stream +} FLVStreamContext; + +static int get_audio_flags(AVFormatContext *s, AVCodecParameters *par) +{ + int flags = (par->bits_per_coded_sample == 16) ? FLV_SAMPLESSIZE_16BIT + : FLV_SAMPLESSIZE_8BIT; + + if (par->codec_id == AV_CODEC_ID_AAC) // specs force these parameters + return FLV_CODECID_AAC | FLV_SAMPLERATE_44100HZ | + FLV_SAMPLESSIZE_16BIT | FLV_STEREO; + else if (par->codec_id == AV_CODEC_ID_SPEEX) { + if (par->sample_rate != 16000) { + av_log(s, AV_LOG_ERROR, + "FLV only supports wideband (16kHz) Speex audio\n"); + return AVERROR(EINVAL); + } + if (par->channels != 1) { + av_log(s, AV_LOG_ERROR, "FLV only supports mono Speex audio\n"); + return AVERROR(EINVAL); + } + return FLV_CODECID_SPEEX | FLV_SAMPLERATE_11025HZ | FLV_SAMPLESSIZE_16BIT; + } else { + switch (par->sample_rate) { + case 48000: + // 48khz mp3 is stored with 44k1 samplerate identifer + if (par->codec_id == AV_CODEC_ID_MP3) { + flags |= FLV_SAMPLERATE_44100HZ; + break; + } else { + goto error; + } + case 44100: + flags |= FLV_SAMPLERATE_44100HZ; + break; + case 22050: + flags |= FLV_SAMPLERATE_22050HZ; + break; + case 11025: + flags |= FLV_SAMPLERATE_11025HZ; + break; + case 16000: // nellymoser only + case 8000: // nellymoser only + case 5512: // not MP3 + if (par->codec_id != AV_CODEC_ID_MP3) { + flags |= FLV_SAMPLERATE_SPECIAL; + break; + } + default: +error: + av_log(s, AV_LOG_ERROR, + "FLV does not support sample rate %d, " + "choose from (44100, 22050, 11025)\n", par->sample_rate); + return AVERROR(EINVAL); + } + } + + if (par->channels > 1) + flags |= FLV_STEREO; + + switch (par->codec_id) { + case AV_CODEC_ID_MP3: + flags |= FLV_CODECID_MP3 | FLV_SAMPLESSIZE_16BIT; + break; + case AV_CODEC_ID_PCM_U8: + flags |= FLV_CODECID_PCM | FLV_SAMPLESSIZE_8BIT; + break; + case AV_CODEC_ID_PCM_S16BE: + flags |= FLV_CODECID_PCM | FLV_SAMPLESSIZE_16BIT; + break; + case AV_CODEC_ID_PCM_S16LE: + flags |= FLV_CODECID_PCM_LE | FLV_SAMPLESSIZE_16BIT; + break; + case AV_CODEC_ID_ADPCM_SWF: + flags |= FLV_CODECID_ADPCM | FLV_SAMPLESSIZE_16BIT; + break; + case AV_CODEC_ID_NELLYMOSER: + if (par->sample_rate == 8000) + flags |= FLV_CODECID_NELLYMOSER_8KHZ_MONO | FLV_SAMPLESSIZE_16BIT; + else if (par->sample_rate == 16000) + flags |= FLV_CODECID_NELLYMOSER_16KHZ_MONO | FLV_SAMPLESSIZE_16BIT; + else + flags |= FLV_CODECID_NELLYMOSER | FLV_SAMPLESSIZE_16BIT; + break; + case AV_CODEC_ID_PCM_MULAW: + flags = FLV_CODECID_PCM_MULAW | FLV_SAMPLERATE_SPECIAL | FLV_SAMPLESSIZE_16BIT; + break; + case AV_CODEC_ID_PCM_ALAW: + flags = FLV_CODECID_PCM_ALAW | FLV_SAMPLERATE_SPECIAL | FLV_SAMPLESSIZE_16BIT; + break; + case 0: + flags |= par->codec_tag << 4; + break; + default: + av_log(s, AV_LOG_ERROR, "Audio codec '%s' not compatible with FLV\n", + avcodec_get_name(par->codec_id)); + return AVERROR(EINVAL); + } + + return flags; +} + +static void put_amf_string(AVIOContext *pb, const char *str) +{ + size_t len = strlen(str); + avio_wb16(pb, len); + avio_write(pb, str, len); +} + +static void put_avc_eos_tag(AVIOContext *pb, unsigned ts) +{ + avio_w8(pb, FLV_TAG_TYPE_VIDEO); + avio_wb24(pb, 5); /* Tag Data Size */ + avio_wb24(pb, ts); /* lower 24 bits of timestamp in ms */ + avio_w8(pb, (ts >> 24) & 0x7F); /* MSB of ts in ms */ + avio_wb24(pb, 0); /* StreamId = 0 */ + avio_w8(pb, 23); /* ub[4] FrameType = 1, ub[4] CodecId = 7 */ + avio_w8(pb, 2); /* AVC end of sequence */ + avio_wb24(pb, 0); /* Always 0 for AVC EOS. */ + avio_wb32(pb, 16); /* Size of FLV tag */ +} + +static void put_amf_double(AVIOContext *pb, double d) +{ + avio_w8(pb, AMF_DATA_TYPE_NUMBER); + avio_wb64(pb, av_double2int(d)); +} + +static void put_amf_byte(AVIOContext *pb, unsigned char abyte) +{ + avio_w8(pb, abyte); +} + +static void put_amf_dword_array(AVIOContext *pb, uint32_t dw) +{ + avio_w8(pb, AMF_DATA_TYPE_ARRAY); + avio_wb32(pb, dw); +} + +static void put_amf_bool(AVIOContext *pb, int b) +{ + avio_w8(pb, AMF_DATA_TYPE_BOOL); + avio_w8(pb, !!b); +} + +static void write_metadata(AVFormatContext *s, unsigned int ts) +{ + AVIOContext *pb = s->pb; + FLVContext *flv = s->priv_data; + int write_duration_filesize = !(flv->flags & FLV_NO_DURATION_FILESIZE); + int metadata_count = 0; + int64_t metadata_count_pos; + AVDictionaryEntry *tag = NULL; + + /* write meta_tag */ + avio_w8(pb, FLV_TAG_TYPE_META); // tag type META + flv->metadata_size_pos = avio_tell(pb); + avio_wb24(pb, 0); // size of data part (sum of all parts below) + avio_wb24(pb, ts); // timestamp + avio_wb32(pb, 0); // reserved + + /* now data of data_size size */ + + /* first event name as a string */ + avio_w8(pb, AMF_DATA_TYPE_STRING); + put_amf_string(pb, "onMetaData"); // 12 bytes + + /* mixed array (hash) with size and string/type/data tuples */ + avio_w8(pb, AMF_DATA_TYPE_MIXEDARRAY); + metadata_count_pos = avio_tell(pb); + metadata_count = 4 * !!flv->video_par + + 5 * !!flv->audio_par + + 1 * !!flv->data_par; + if (write_duration_filesize) { + metadata_count += 2; // +2 for duration and file size + } + avio_wb32(pb, metadata_count); + + if (write_duration_filesize) { + put_amf_string(pb, "duration"); + flv->duration_offset = avio_tell(pb); + // fill in the guessed duration, it'll be corrected later if incorrect + put_amf_double(pb, s->duration / AV_TIME_BASE); + } + + if (flv->video_par) { + put_amf_string(pb, "width"); + put_amf_double(pb, flv->video_par->width); + + put_amf_string(pb, "height"); + put_amf_double(pb, flv->video_par->height); + + put_amf_string(pb, "videodatarate"); + put_amf_double(pb, flv->video_par->bit_rate / 1024.0); + + if (flv->framerate != 0.0) { + put_amf_string(pb, "framerate"); + put_amf_double(pb, flv->framerate); + metadata_count++; + } + + put_amf_string(pb, "videocodecid"); + put_amf_double(pb, flv->video_par->codec_tag); + } + + if (flv->audio_par) { + put_amf_string(pb, "audiodatarate"); + put_amf_double(pb, flv->audio_par->bit_rate / 1024.0); + + put_amf_string(pb, "audiosamplerate"); + put_amf_double(pb, flv->audio_par->sample_rate); + + put_amf_string(pb, "audiosamplesize"); + put_amf_double(pb, flv->audio_par->codec_id == AV_CODEC_ID_PCM_U8 ? 8 : 16); + + put_amf_string(pb, "stereo"); + put_amf_bool(pb, flv->audio_par->channels == 2); + + put_amf_string(pb, "audiocodecid"); + put_amf_double(pb, flv->audio_par->codec_tag); + } + + if (flv->data_par) { + put_amf_string(pb, "datastream"); + put_amf_double(pb, 0.0); + } + + ff_standardize_creation_time(s); + while ((tag = av_dict_get(s->metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) { + if( !strcmp(tag->key, "width") + ||!strcmp(tag->key, "height") + ||!strcmp(tag->key, "videodatarate") + ||!strcmp(tag->key, "framerate") + ||!strcmp(tag->key, "videocodecid") + ||!strcmp(tag->key, "audiodatarate") + ||!strcmp(tag->key, "audiosamplerate") + ||!strcmp(tag->key, "audiosamplesize") + ||!strcmp(tag->key, "stereo") + ||!strcmp(tag->key, "audiocodecid") + ||!strcmp(tag->key, "duration") + ||!strcmp(tag->key, "onMetaData") + ||!strcmp(tag->key, "datasize") + ||!strcmp(tag->key, "lasttimestamp") + ||!strcmp(tag->key, "totalframes") + ||!strcmp(tag->key, "hasAudio") + ||!strcmp(tag->key, "hasVideo") + ||!strcmp(tag->key, "hasCuePoints") + ||!strcmp(tag->key, "hasMetadata") + ||!strcmp(tag->key, "hasKeyframes") + ){ + av_log(s, AV_LOG_DEBUG, "Ignoring metadata for %s\n", tag->key); + continue; + } + put_amf_string(pb, tag->key); + avio_w8(pb, AMF_DATA_TYPE_STRING); + put_amf_string(pb, tag->value); + metadata_count++; + } + + if (write_duration_filesize) { + put_amf_string(pb, "filesize"); + flv->filesize_offset = avio_tell(pb); + put_amf_double(pb, 0); // delayed write + } + + if (flv->flags & FLV_ADD_KEYFRAME_INDEX) { + flv->acurframeindex = 0; + flv->keyframe_index_size = 0; + + put_amf_string(pb, "hasVideo"); + put_amf_bool(pb, !!flv->video_par); + metadata_count++; + + put_amf_string(pb, "hasKeyframes"); + put_amf_bool(pb, 1); + metadata_count++; + + put_amf_string(pb, "hasAudio"); + put_amf_bool(pb, !!flv->audio_par); + metadata_count++; + + put_amf_string(pb, "hasMetadata"); + put_amf_bool(pb, 1); + metadata_count++; + + put_amf_string(pb, "canSeekToEnd"); + put_amf_bool(pb, 1); + metadata_count++; + + put_amf_string(pb, "datasize"); + flv->datasize_offset = avio_tell(pb); + flv->datasize = 0; + put_amf_double(pb, flv->datasize); + metadata_count++; + + put_amf_string(pb, "videosize"); + flv->videosize_offset = avio_tell(pb); + flv->videosize = 0; + put_amf_double(pb, flv->videosize); + metadata_count++; + + put_amf_string(pb, "audiosize"); + flv->audiosize_offset = avio_tell(pb); + flv->audiosize = 0; + put_amf_double(pb, flv->audiosize); + metadata_count++; + + put_amf_string(pb, "lasttimestamp"); + flv->lasttimestamp_offset = avio_tell(pb); + flv->lasttimestamp = 0; + put_amf_double(pb, 0); + metadata_count++; + + put_amf_string(pb, "lastkeyframetimestamp"); + flv->lastkeyframetimestamp_offset = avio_tell(pb); + flv->lastkeyframetimestamp = 0; + put_amf_double(pb, 0); + metadata_count++; + + put_amf_string(pb, "lastkeyframelocation"); + flv->lastkeyframelocation_offset = avio_tell(pb); + flv->lastkeyframelocation = 0; + put_amf_double(pb, 0); + metadata_count++; + + put_amf_string(pb, "keyframes"); + put_amf_byte(pb, AMF_DATA_TYPE_OBJECT); + metadata_count++; + + flv->keyframes_info_offset = avio_tell(pb); + } + + put_amf_string(pb, ""); + avio_w8(pb, AMF_END_OF_OBJECT); + + /* write total size of tag */ + flv->metadata_totalsize = avio_tell(pb) - flv->metadata_size_pos - 10; + + avio_seek(pb, metadata_count_pos, SEEK_SET); + avio_wb32(pb, metadata_count); + + avio_seek(pb, flv->metadata_size_pos, SEEK_SET); + avio_wb24(pb, flv->metadata_totalsize); + avio_skip(pb, flv->metadata_totalsize + 10 - 3); + flv->metadata_totalsize_pos = avio_tell(pb); + avio_wb32(pb, flv->metadata_totalsize + 11); +} + +static int unsupported_codec(AVFormatContext *s, + const char* type, int codec_id) +{ + const AVCodecDescriptor *desc = avcodec_descriptor_get(codec_id); + av_log(s, AV_LOG_ERROR, + "%s codec %s not compatible with flv\n", + type, + desc ? desc->name : "unknown"); + return AVERROR(ENOSYS); +} + +static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par) { + int64_t data_size; + AVIOContext *pb = s->pb; + FLVContext *flv = s->priv_data; + + if (par->codec_id == AV_CODEC_ID_AAC || par->codec_id == AV_CODEC_ID_H264 + || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) { + int64_t pos; + avio_w8(pb, + par->codec_type == AVMEDIA_TYPE_VIDEO ? + FLV_TAG_TYPE_VIDEO : FLV_TAG_TYPE_AUDIO); + avio_wb24(pb, 0); // size patched later + avio_wb24(pb, 0); // ts + avio_w8(pb, 0); // ts ext + avio_wb24(pb, 0); // streamid + pos = avio_tell(pb); + if (par->codec_id == AV_CODEC_ID_AAC) { + avio_w8(pb, get_audio_flags(s, par)); + avio_w8(pb, 0); // AAC sequence header + + if (!par->extradata_size && (flv->flags & FLV_AAC_SEQ_HEADER_DETECT)) { + PutBitContext pbc; + int samplerate_index; + int channels = flv->audio_par->channels + - (flv->audio_par->channels == 8 ? 1 : 0); + uint8_t data[2]; + + for (samplerate_index = 0; samplerate_index < 16; + samplerate_index++) + if (flv->audio_par->sample_rate + == mpeg4audio_sample_rates[samplerate_index]) + break; + + init_put_bits(&pbc, data, sizeof(data)); + put_bits(&pbc, 5, flv->audio_par->profile + 1); //profile + put_bits(&pbc, 4, samplerate_index); //sample rate index + put_bits(&pbc, 4, channels); + put_bits(&pbc, 1, 0); //frame length - 1024 samples + put_bits(&pbc, 1, 0); //does not depend on core coder + put_bits(&pbc, 1, 0); //is not extension + flush_put_bits(&pbc); + + avio_w8(pb, data[0]); + avio_w8(pb, data[1]); + + av_log(s, AV_LOG_WARNING, "AAC sequence header: %02x %02x.\n", + data[0], data[1]); + } + avio_write(pb, par->extradata, par->extradata_size); + } else { + avio_w8(pb, par->codec_tag | FLV_FRAME_KEY); // flags + avio_w8(pb, 0); // AVC sequence header + avio_wb24(pb, 0); // composition time + if (par->codec_id == AV_CODEC_ID_HEVC) { + ff_isom_write_hvcc(pb, par->extradata, par->extradata_size, 0); + } else { + ff_isom_write_avcc(pb, par->extradata, par->extradata_size); + } + } + data_size = avio_tell(pb) - pos; + avio_seek(pb, -data_size - 10, SEEK_CUR); + avio_wb24(pb, data_size); + avio_skip(pb, data_size + 10 - 3); + avio_wb32(pb, data_size + 11); // previous tag size + } +} + +static int flv_append_keyframe_info(AVFormatContext *s, FLVContext *flv, double ts, int64_t pos) +{ + FLVFileposition *position = av_malloc(sizeof(FLVFileposition)); + + if (!position) { + av_log(s, AV_LOG_WARNING, "no mem for add keyframe index!\n"); + return AVERROR(ENOMEM); + } + + position->keyframe_timestamp = ts; + position->keyframe_position = pos; + + if (!flv->filepositions_count) { + flv->filepositions = position; + flv->head_filepositions = flv->filepositions; + position->next = NULL; + } else { + flv->filepositions->next = position; + position->next = NULL; + flv->filepositions = flv->filepositions->next; + } + + flv->filepositions_count++; + + return 0; +} + +static int shift_data(AVFormatContext *s) +{ + int ret = 0; + int n = 0; + int64_t metadata_size = 0; + FLVContext *flv = s->priv_data; + int64_t pos, pos_end = avio_tell(s->pb); + uint8_t *buf, *read_buf[2]; + int read_buf_id = 0; + int read_size[2]; + AVIOContext *read_pb; + + metadata_size = flv->filepositions_count * 9 * 2 + 10; /* filepositions and times value */ + metadata_size += 2 + 13; /* filepositions String */ + metadata_size += 2 + 5; /* times String */ + metadata_size += 3; /* Object end */ + + flv->keyframe_index_size = metadata_size; + + if (metadata_size < 0) + return metadata_size; + + buf = av_malloc_array(metadata_size, 2); + if (!buf) { + return AVERROR(ENOMEM); + } + read_buf[0] = buf; + read_buf[1] = buf + metadata_size; + + avio_seek(s->pb, flv->metadata_size_pos, SEEK_SET); + avio_wb24(s->pb, flv->metadata_totalsize + metadata_size); + + avio_seek(s->pb, flv->metadata_totalsize_pos, SEEK_SET); + avio_wb32(s->pb, flv->metadata_totalsize + 11 + metadata_size); + avio_seek(s->pb, pos_end, SEEK_SET); + + /* Shift the data: the AVIO context of the output can only be used for + * writing, so we re-open the same output, but for reading. It also avoids + * a read/seek/write/seek back and forth. */ + avio_flush(s->pb); + ret = s->io_open(s, &read_pb, s->filename, AVIO_FLAG_READ, NULL); + if (ret < 0) { + av_log(s, AV_LOG_ERROR, "Unable to re-open %s output file for " + "the second pass (add_keyframe_index)\n", s->filename); + goto end; + } + + /* mark the end of the shift to up to the last data we wrote, and get ready + * for writing */ + pos_end = avio_tell(s->pb); + avio_seek(s->pb, flv->keyframes_info_offset + metadata_size, SEEK_SET); + + /* start reading at where the keyframe index information will be placed */ + avio_seek(read_pb, flv->keyframes_info_offset, SEEK_SET); + pos = avio_tell(read_pb); + +#define READ_BLOCK do { \ + read_size[read_buf_id] = avio_read(read_pb, read_buf[read_buf_id], metadata_size); \ + read_buf_id ^= 1; \ +} while (0) + + /* shift data by chunk of at most keyframe *filepositions* and *times* size */ + READ_BLOCK; + do { + READ_BLOCK; + n = read_size[read_buf_id]; + if (n < 0) + break; + avio_write(s->pb, read_buf[read_buf_id], n); + pos += n; + } while (pos <= pos_end); + + ff_format_io_close(s, &read_pb); + +end: + av_free(buf); + return ret; +} + + +static int flv_write_header(AVFormatContext *s) +{ + int i; + AVIOContext *pb = s->pb; + FLVContext *flv = s->priv_data; + + for (i = 0; i < s->nb_streams; i++) { + AVCodecParameters *par = s->streams[i]->codecpar; + FLVStreamContext *sc; + switch (par->codec_type) { + case AVMEDIA_TYPE_VIDEO: + if (s->streams[i]->avg_frame_rate.den && + s->streams[i]->avg_frame_rate.num) { + flv->framerate = av_q2d(s->streams[i]->avg_frame_rate); + } + if (flv->video_par) { + av_log(s, AV_LOG_ERROR, + "at most one video stream is supported in flv\n"); + return AVERROR(EINVAL); + } + flv->video_par = par; + if (!ff_codec_get_tag(flv_video_codec_ids, par->codec_id)) + return unsupported_codec(s, "Video", par->codec_id); + + if (par->codec_id == AV_CODEC_ID_MPEG4 || + par->codec_id == AV_CODEC_ID_H263) { + int error = s->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL; + av_log(s, error ? AV_LOG_ERROR : AV_LOG_WARNING, + "Codec %s is not supported in the official FLV specification,\n", avcodec_get_name(par->codec_id)); + + if (error) { + av_log(s, AV_LOG_ERROR, + "use vstrict=-1 / -strict -1 to use it anyway.\n"); + return AVERROR(EINVAL); + } + } else if (par->codec_id == AV_CODEC_ID_VP6) { + av_log(s, AV_LOG_WARNING, + "Muxing VP6 in flv will produce flipped video on playback.\n"); + } + break; + case AVMEDIA_TYPE_AUDIO: + if (flv->audio_par) { + av_log(s, AV_LOG_ERROR, + "at most one audio stream is supported in flv\n"); + return AVERROR(EINVAL); + } + flv->audio_par = par; + if (get_audio_flags(s, par) < 0) + return unsupported_codec(s, "Audio", par->codec_id); + if (par->codec_id == AV_CODEC_ID_PCM_S16BE) + av_log(s, AV_LOG_WARNING, + "16-bit big-endian audio in flv is valid but most likely unplayable (hardware dependent); use s16le\n"); + break; + case AVMEDIA_TYPE_DATA: + if (par->codec_id != AV_CODEC_ID_TEXT && par->codec_id != AV_CODEC_ID_NONE) + return unsupported_codec(s, "Data", par->codec_id); + flv->data_par = par; + break; + case AVMEDIA_TYPE_SUBTITLE: + if (par->codec_id != AV_CODEC_ID_TEXT) { + av_log(s, AV_LOG_ERROR, "Subtitle codec '%s' for stream %d is not compatible with FLV\n", + avcodec_get_name(par->codec_id), i); + return AVERROR_INVALIDDATA; + } + flv->data_par = par; + break; + default: + av_log(s, AV_LOG_ERROR, "Codec type '%s' for stream %d is not compatible with FLV\n", + av_get_media_type_string(par->codec_type), i); + return AVERROR(EINVAL); + } + avpriv_set_pts_info(s->streams[i], 32, 1, 1000); /* 32 bit pts in ms */ + + sc = av_mallocz(sizeof(FLVStreamContext)); + if (!sc) + return AVERROR(ENOMEM); + s->streams[i]->priv_data = sc; + sc->last_ts = -1; + } + + flv->delay = AV_NOPTS_VALUE; + + avio_write(pb, "FLV", 3); + avio_w8(pb, 1); + avio_w8(pb, FLV_HEADER_FLAG_HASAUDIO * !!flv->audio_par + + FLV_HEADER_FLAG_HASVIDEO * !!flv->video_par); + avio_wb32(pb, 9); + avio_wb32(pb, 0); + + for (i = 0; i < s->nb_streams; i++) + if (s->streams[i]->codecpar->codec_tag == 5) { + avio_w8(pb, 8); // message type + avio_wb24(pb, 0); // include flags + avio_wb24(pb, 0); // time stamp + avio_wb32(pb, 0); // reserved + avio_wb32(pb, 11); // size + flv->reserved = 5; + } + + if (flv->flags & FLV_NO_METADATA) { + pb->seekable = 0; + } else { + write_metadata(s, 0); + } + + for (i = 0; i < s->nb_streams; i++) { + flv_write_codec_header(s, s->streams[i]->codecpar); + } + + flv->datastart_offset = avio_tell(pb); + return 0; +} + +static int flv_write_trailer(AVFormatContext *s) +{ + int64_t file_size; + AVIOContext *pb = s->pb; + FLVContext *flv = s->priv_data; + int build_keyframes_idx = flv->flags & FLV_ADD_KEYFRAME_INDEX; + int i, res; + int64_t cur_pos = avio_tell(s->pb); + + if (build_keyframes_idx) { + FLVFileposition *newflv_posinfo, *p; + + avio_seek(pb, flv->videosize_offset, SEEK_SET); + put_amf_double(pb, flv->videosize); + + avio_seek(pb, flv->audiosize_offset, SEEK_SET); + put_amf_double(pb, flv->audiosize); + + avio_seek(pb, flv->lasttimestamp_offset, SEEK_SET); + put_amf_double(pb, flv->lasttimestamp); + + avio_seek(pb, flv->lastkeyframetimestamp_offset, SEEK_SET); + put_amf_double(pb, flv->lastkeyframetimestamp); + + avio_seek(pb, flv->lastkeyframelocation_offset, SEEK_SET); + put_amf_double(pb, flv->lastkeyframelocation + flv->keyframe_index_size); + avio_seek(pb, cur_pos, SEEK_SET); + + res = shift_data(s); + if (res < 0) { + goto end; + } + avio_seek(pb, flv->keyframes_info_offset, SEEK_SET); + put_amf_string(pb, "filepositions"); + put_amf_dword_array(pb, flv->filepositions_count); + for (newflv_posinfo = flv->head_filepositions; newflv_posinfo; newflv_posinfo = newflv_posinfo->next) { + put_amf_double(pb, newflv_posinfo->keyframe_position + flv->keyframe_index_size); + } + + put_amf_string(pb, "times"); + put_amf_dword_array(pb, flv->filepositions_count); + for (newflv_posinfo = flv->head_filepositions; newflv_posinfo; newflv_posinfo = newflv_posinfo->next) { + put_amf_double(pb, newflv_posinfo->keyframe_timestamp); + } + + newflv_posinfo = flv->head_filepositions; + while (newflv_posinfo) { + p = newflv_posinfo->next; + if (p) { + newflv_posinfo->next = p->next; + av_free(p); + p = NULL; + } else { + av_free(newflv_posinfo); + newflv_posinfo = NULL; + } + } + + put_amf_string(pb, ""); + avio_w8(pb, AMF_END_OF_OBJECT); + + avio_seek(pb, cur_pos + flv->keyframe_index_size, SEEK_SET); + } + +end: + if (flv->flags & FLV_NO_SEQUENCE_END) { + av_log(s, AV_LOG_DEBUG, "FLV no sequence end mode open\n"); + } else { + /* Add EOS tag */ + for (i = 0; i < s->nb_streams; i++) { + AVCodecParameters *par = s->streams[i]->codecpar; + FLVStreamContext *sc = s->streams[i]->priv_data; + if (par->codec_type == AVMEDIA_TYPE_VIDEO && + (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC)) + put_avc_eos_tag(pb, sc->last_ts); + } + } + + file_size = avio_tell(pb); + + if (build_keyframes_idx) { + flv->datasize = file_size - flv->datastart_offset; + avio_seek(pb, flv->datasize_offset, SEEK_SET); + put_amf_double(pb, flv->datasize); + } + if (!(flv->flags & FLV_NO_METADATA)) { + if (!(flv->flags & FLV_NO_DURATION_FILESIZE)) { + /* update information */ + if (avio_seek(pb, flv->duration_offset, SEEK_SET) < 0) { + av_log(s, AV_LOG_WARNING, "Failed to update header with correct duration.\n"); + } else { + put_amf_double(pb, flv->duration / (double)1000); + } + if (avio_seek(pb, flv->filesize_offset, SEEK_SET) < 0) { + av_log(s, AV_LOG_WARNING, "Failed to update header with correct filesize.\n"); + } else { + put_amf_double(pb, file_size); + } + } + } + + return 0; +} + +static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) +{ + AVIOContext *pb = s->pb; + AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar; + FLVContext *flv = s->priv_data; + FLVStreamContext *sc = s->streams[pkt->stream_index]->priv_data; + unsigned ts; + int size = pkt->size; + uint8_t *data = NULL; + int flags = -1, flags_size, ret; + int64_t cur_offset = avio_tell(pb); + + if (par->codec_id == AV_CODEC_ID_VP6F || par->codec_id == AV_CODEC_ID_VP6A || + par->codec_id == AV_CODEC_ID_VP6 || par->codec_id == AV_CODEC_ID_AAC) { + flags_size = 2; + } else if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) { + flags_size = 5; + } else { + flags_size = 1; + } + + if (par->codec_id == AV_CODEC_ID_AAC || par->codec_id == AV_CODEC_ID_H264 + || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) { + int side_size = 0; + uint8_t *side = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, &side_size); + if (side && side_size > 0 && (side_size != par->extradata_size || memcmp(side, par->extradata, side_size))) { + av_free(par->extradata); + par->extradata = av_mallocz(side_size + AV_INPUT_BUFFER_PADDING_SIZE); + if (!par->extradata) { + par->extradata_size = 0; + return AVERROR(ENOMEM); + } + memcpy(par->extradata, side, side_size); + par->extradata_size = side_size; + flv_write_codec_header(s, par); + } + } + + if (flv->delay == AV_NOPTS_VALUE) + flv->delay = -pkt->dts; + + if (pkt->dts < -flv->delay) { + av_log(s, AV_LOG_WARNING, + "Packets are not in the proper order with respect to DTS\n"); + return AVERROR(EINVAL); + } + + ts = pkt->dts; + + if (s->event_flags & AVSTREAM_EVENT_FLAG_METADATA_UPDATED) { + write_metadata(s, ts); + s->event_flags &= ~AVSTREAM_EVENT_FLAG_METADATA_UPDATED; + } + + avio_write_marker(pb, av_rescale(ts, AV_TIME_BASE, 1000), + pkt->flags & AV_PKT_FLAG_KEY && (flv->video_par ? par->codec_type == AVMEDIA_TYPE_VIDEO : 1) ? AVIO_DATA_MARKER_SYNC_POINT : AVIO_DATA_MARKER_BOUNDARY_POINT); + + switch (par->codec_type) { + case AVMEDIA_TYPE_VIDEO: + avio_w8(pb, FLV_TAG_TYPE_VIDEO); + + flags = ff_codec_get_tag(flv_video_codec_ids, par->codec_id); + + flags |= pkt->flags & AV_PKT_FLAG_KEY ? FLV_FRAME_KEY : FLV_FRAME_INTER; + break; + case AVMEDIA_TYPE_AUDIO: + flags = get_audio_flags(s, par); + + av_assert0(size); + + avio_w8(pb, FLV_TAG_TYPE_AUDIO); + break; + case AVMEDIA_TYPE_SUBTITLE: + case AVMEDIA_TYPE_DATA: + avio_w8(pb, FLV_TAG_TYPE_META); + break; + default: + return AVERROR(EINVAL); + } + + if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4) { + /* check if extradata looks like mp4 formatted */ + if (par->extradata_size > 0 && *(uint8_t*)par->extradata != 1) + if ((ret = ff_avc_parse_nal_units_buf(pkt->data, &data, &size)) < 0) + return ret; + } else if (par->codec_id == AV_CODEC_ID_HEVC) { + if (par->extradata_size > 0 && *(uint8_t*)par->extradata != 1) + if ((ret = ff_hevc_annexb2mp4_buf(pkt->data, &data, &size, 0, NULL)) < 0) + return ret; + } else if (par->codec_id == AV_CODEC_ID_AAC && pkt->size > 2 && + (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) { + if (!s->streams[pkt->stream_index]->nb_frames) { + av_log(s, AV_LOG_ERROR, "Malformed AAC bitstream detected: " + "use the audio bitstream filter 'aac_adtstoasc' to fix it " + "('-bsf:a aac_adtstoasc' option with ffmpeg)\n"); + return AVERROR_INVALIDDATA; + } + av_log(s, AV_LOG_WARNING, "aac bitstream error\n"); + } + + /* check Speex packet duration */ + if (par->codec_id == AV_CODEC_ID_SPEEX && ts - sc->last_ts > 160) + av_log(s, AV_LOG_WARNING, "Warning: Speex stream has more than " + "8 frames per packet. Adobe Flash " + "Player cannot handle this!\n"); + + if (sc->last_ts < ts) + sc->last_ts = ts; + + if (size + flags_size >= 1<<24) { + av_log(s, AV_LOG_ERROR, "Too large packet with size %u >= %u\n", + size + flags_size, 1<<24); + return AVERROR(EINVAL); + } + + avio_wb24(pb, size + flags_size); + avio_wb24(pb, ts & 0xFFFFFF); + avio_w8(pb, (ts >> 24) & 0x7F); // timestamps are 32 bits _signed_ + avio_wb24(pb, flv->reserved); + + if (par->codec_type == AVMEDIA_TYPE_DATA || + par->codec_type == AVMEDIA_TYPE_SUBTITLE ) { + int data_size; + int64_t metadata_size_pos = avio_tell(pb); + if (par->codec_id == AV_CODEC_ID_TEXT) { + // legacy FFmpeg magic? + avio_w8(pb, AMF_DATA_TYPE_STRING); + put_amf_string(pb, "onTextData"); + avio_w8(pb, AMF_DATA_TYPE_MIXEDARRAY); + avio_wb32(pb, 2); + put_amf_string(pb, "type"); + avio_w8(pb, AMF_DATA_TYPE_STRING); + put_amf_string(pb, "Text"); + put_amf_string(pb, "text"); + avio_w8(pb, AMF_DATA_TYPE_STRING); + put_amf_string(pb, pkt->data); + put_amf_string(pb, ""); + avio_w8(pb, AMF_END_OF_OBJECT); + } else { + // just pass the metadata through + avio_write(pb, data ? data : pkt->data, size); + } + /* write total size of tag */ + data_size = avio_tell(pb) - metadata_size_pos; + avio_seek(pb, metadata_size_pos - 10, SEEK_SET); + avio_wb24(pb, data_size); + avio_seek(pb, data_size + 10 - 3, SEEK_CUR); + avio_wb32(pb, data_size + 11); + } else { + av_assert1(flags>=0); + avio_w8(pb,flags); + if (par->codec_id == AV_CODEC_ID_VP6) + avio_w8(pb,0); + if (par->codec_id == AV_CODEC_ID_VP6F || par->codec_id == AV_CODEC_ID_VP6A) { + if (par->extradata_size) + avio_w8(pb, par->extradata[0]); + else + avio_w8(pb, ((FFALIGN(par->width, 16) - par->width) << 4) | + (FFALIGN(par->height, 16) - par->height)); + } else if (par->codec_id == AV_CODEC_ID_AAC) { + avio_w8(pb, 1); // AAC raw + } else if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) { + avio_w8(pb, 1); // AVC NALU + avio_wb24(pb, pkt->pts - pkt->dts); + } + + avio_write(pb, data ? data : pkt->data, size); + + avio_wb32(pb, size + flags_size + 11); // previous tag size + flv->duration = FFMAX(flv->duration, + pkt->pts + flv->delay + pkt->duration); + } + + if (flv->flags & FLV_ADD_KEYFRAME_INDEX) { + switch (par->codec_type) { + case AVMEDIA_TYPE_VIDEO: + flv->videosize += (avio_tell(pb) - cur_offset); + flv->lasttimestamp = flv->acurframeindex / flv->framerate; + if (pkt->flags & AV_PKT_FLAG_KEY) { + double ts = flv->acurframeindex / flv->framerate; + int64_t pos = cur_offset; + + flv->lastkeyframetimestamp = flv->acurframeindex / flv->framerate; + flv->lastkeyframelocation = pos; + flv_append_keyframe_info(s, flv, ts, pos); + } + flv->acurframeindex++; + break; + + case AVMEDIA_TYPE_AUDIO: + flv->audiosize += (avio_tell(pb) - cur_offset); + break; + + default: + av_log(s, AV_LOG_WARNING, "par->codec_type is type = [%d]\n", par->codec_type); + break; + } + } + + av_free(data); + + return pb->error; +} + +static const AVOption options[] = { + { "flvflags", "FLV muxer flags", offsetof(FLVContext, flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "flvflags" }, + { "aac_seq_header_detect", "Put AAC sequence header based on stream data", 0, AV_OPT_TYPE_CONST, {.i64 = FLV_AAC_SEQ_HEADER_DETECT}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "flvflags" }, + { "no_sequence_end", "disable sequence end for FLV", 0, AV_OPT_TYPE_CONST, {.i64 = FLV_NO_SEQUENCE_END}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "flvflags" }, + { "no_metadata", "disable metadata for FLV", 0, AV_OPT_TYPE_CONST, {.i64 = FLV_NO_METADATA}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "flvflags" }, + { "no_duration_filesize", "disable duration and filesize zero value metadata for FLV", 0, AV_OPT_TYPE_CONST, {.i64 = FLV_NO_DURATION_FILESIZE}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "flvflags" }, + { "add_keyframe_index", "Add keyframe index metadata", 0, AV_OPT_TYPE_CONST, {.i64 = FLV_ADD_KEYFRAME_INDEX}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "flvflags" }, + { NULL }, +}; + +static const AVClass flv_muxer_class = { + .class_name = "flv muxer", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; + +AVOutputFormat ff_flv_muxer = { + .name = "flv", + .long_name = NULL_IF_CONFIG_SMALL("FLV (Flash Video)"), + .mime_type = "video/x-flv", + .extensions = "flv", + .priv_data_size = sizeof(FLVContext), + .audio_codec = CONFIG_LIBMP3LAME ? AV_CODEC_ID_MP3 : AV_CODEC_ID_ADPCM_SWF, + .video_codec = AV_CODEC_ID_FLV1, + .write_header = flv_write_header, + .write_packet = flv_write_packet, + .write_trailer = flv_write_trailer, + .codec_tag = (const AVCodecTag* const []) { + flv_video_codec_ids, flv_audio_codec_ids, 0 + }, + .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS | + AVFMT_TS_NONSTRICT, + .priv_class = &flv_muxer_class, +}; diff --git a/StreamMedia/flv_h265_patch/ffmpeg_flv/flv.h b/StreamMedia/flv_h265_patch/ffmpeg_flv/flv.h new file mode 100644 index 0000000..e776555 --- /dev/null +++ b/StreamMedia/flv_h265_patch/ffmpeg_flv/flv.h @@ -0,0 +1,140 @@ +/* + * FLV common header + * + * Copyright (c) 2006 The FFmpeg Project + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * FLV common header + */ + +#ifndef AVFORMAT_FLV_H +#define AVFORMAT_FLV_H + +/* offsets for packed values */ +#define FLV_AUDIO_SAMPLESSIZE_OFFSET 1 +#define FLV_AUDIO_SAMPLERATE_OFFSET 2 +#define FLV_AUDIO_CODECID_OFFSET 4 + +#define FLV_VIDEO_FRAMETYPE_OFFSET 4 + +/* bitmasks to isolate specific values */ +#define FLV_AUDIO_CHANNEL_MASK 0x01 +#define FLV_AUDIO_SAMPLESIZE_MASK 0x02 +#define FLV_AUDIO_SAMPLERATE_MASK 0x0c +#define FLV_AUDIO_CODECID_MASK 0xf0 + +#define FLV_VIDEO_CODECID_MASK 0x0f +#define FLV_VIDEO_FRAMETYPE_MASK 0xf0 + +#define AMF_END_OF_OBJECT 0x09 + +#define KEYFRAMES_TAG "keyframes" +#define KEYFRAMES_TIMESTAMP_TAG "times" +#define KEYFRAMES_BYTEOFFSET_TAG "filepositions" + + +enum { + FLV_HEADER_FLAG_HASVIDEO = 1, + FLV_HEADER_FLAG_HASAUDIO = 4, +}; + +enum FlvTagType { + FLV_TAG_TYPE_AUDIO = 0x08, + FLV_TAG_TYPE_VIDEO = 0x09, + FLV_TAG_TYPE_META = 0x12, +}; + +enum { + FLV_STREAM_TYPE_VIDEO, + FLV_STREAM_TYPE_AUDIO, + FLV_STREAM_TYPE_SUBTITLE, + FLV_STREAM_TYPE_DATA, + FLV_STREAM_TYPE_NB, +}; + +enum { + FLV_MONO = 0, + FLV_STEREO = 1, +}; + +enum { + FLV_SAMPLESSIZE_8BIT = 0, + FLV_SAMPLESSIZE_16BIT = 1 << FLV_AUDIO_SAMPLESSIZE_OFFSET, +}; + +enum { + FLV_SAMPLERATE_SPECIAL = 0, /**< signifies 5512Hz and 8000Hz in the case of NELLYMOSER */ + FLV_SAMPLERATE_11025HZ = 1 << FLV_AUDIO_SAMPLERATE_OFFSET, + FLV_SAMPLERATE_22050HZ = 2 << FLV_AUDIO_SAMPLERATE_OFFSET, + FLV_SAMPLERATE_44100HZ = 3 << FLV_AUDIO_SAMPLERATE_OFFSET, +}; + +enum { + FLV_CODECID_PCM = 0, + FLV_CODECID_ADPCM = 1 << FLV_AUDIO_CODECID_OFFSET, + FLV_CODECID_MP3 = 2 << FLV_AUDIO_CODECID_OFFSET, + FLV_CODECID_PCM_LE = 3 << FLV_AUDIO_CODECID_OFFSET, + FLV_CODECID_NELLYMOSER_16KHZ_MONO = 4 << FLV_AUDIO_CODECID_OFFSET, + FLV_CODECID_NELLYMOSER_8KHZ_MONO = 5 << FLV_AUDIO_CODECID_OFFSET, + FLV_CODECID_NELLYMOSER = 6 << FLV_AUDIO_CODECID_OFFSET, + FLV_CODECID_PCM_ALAW = 7 << FLV_AUDIO_CODECID_OFFSET, + FLV_CODECID_PCM_MULAW = 8 << FLV_AUDIO_CODECID_OFFSET, + FLV_CODECID_AAC = 10<< FLV_AUDIO_CODECID_OFFSET, + FLV_CODECID_SPEEX = 11<< FLV_AUDIO_CODECID_OFFSET, +}; + +enum { + FLV_CODECID_H263 = 2, + FLV_CODECID_SCREEN = 3, + FLV_CODECID_VP6 = 4, + FLV_CODECID_VP6A = 5, + FLV_CODECID_SCREEN2 = 6, + FLV_CODECID_H264 = 7, + FLV_CODECID_REALH263= 8, + FLV_CODECID_MPEG4 = 9, + FLV_CODECID_HEVC = 12, +}; + +enum { + FLV_FRAME_KEY = 1 << FLV_VIDEO_FRAMETYPE_OFFSET, ///< key frame (for AVC, a seekable frame) + FLV_FRAME_INTER = 2 << FLV_VIDEO_FRAMETYPE_OFFSET, ///< inter frame (for AVC, a non-seekable frame) + FLV_FRAME_DISP_INTER = 3 << FLV_VIDEO_FRAMETYPE_OFFSET, ///< disposable inter frame (H.263 only) + FLV_FRAME_GENERATED_KEY = 4 << FLV_VIDEO_FRAMETYPE_OFFSET, ///< generated key frame (reserved for server use only) + FLV_FRAME_VIDEO_INFO_CMD = 5 << FLV_VIDEO_FRAMETYPE_OFFSET, ///< video info/command frame +}; + +typedef enum { + AMF_DATA_TYPE_NUMBER = 0x00, + AMF_DATA_TYPE_BOOL = 0x01, + AMF_DATA_TYPE_STRING = 0x02, + AMF_DATA_TYPE_OBJECT = 0x03, + AMF_DATA_TYPE_NULL = 0x05, + AMF_DATA_TYPE_UNDEFINED = 0x06, + AMF_DATA_TYPE_REFERENCE = 0x07, + AMF_DATA_TYPE_MIXEDARRAY = 0x08, + AMF_DATA_TYPE_OBJECT_END = 0x09, + AMF_DATA_TYPE_ARRAY = 0x0a, + AMF_DATA_TYPE_DATE = 0x0b, + AMF_DATA_TYPE_LONG_STRING = 0x0c, + AMF_DATA_TYPE_UNSUPPORTED = 0x0d, +} AMFDataType; + +#endif /* AVFORMAT_FLV_H */ diff --git a/StreamMedia/flv_h265_patch/ffmpeg_flv/flvdec.c b/StreamMedia/flv_h265_patch/ffmpeg_flv/flvdec.c new file mode 100644 index 0000000..63cf244 --- /dev/null +++ b/StreamMedia/flv_h265_patch/ffmpeg_flv/flvdec.c @@ -0,0 +1,1418 @@ +/* + * FLV demuxer + * Copyright (c) 2003 The FFmpeg Project + * + * This demuxer will generate a 1 byte extradata for VP6F content. + * It is composed of: + * - upper 4 bits: difference between encoded width and visible width + * - lower 4 bits: difference between encoded height and visible height + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/avstring.h" +#include "libavutil/channel_layout.h" +#include "libavutil/dict.h" +#include "libavutil/opt.h" +#include "libavutil/intfloat.h" +#include "libavutil/mathematics.h" +#include "libavutil/time_internal.h" +#include "libavcodec/bytestream.h" +#include "avformat.h" +#include "internal.h" +#include "avio_internal.h" +#include "flv.h" +#include "hevc.h" + +#define VALIDATE_INDEX_TS_THRESH 2500 + +#define RESYNC_BUFFER_SIZE (1<<20) + +typedef struct FLVContext { + const AVClass *class; ///< Class for private options. + int trust_metadata; ///< configure streams according onMetaData + int trust_datasize; ///< trust data size of FLVTag + int dump_full_metadata; ///< Dump full metadata of the onMetadata + int wrong_dts; ///< wrong dts due to negative cts + uint8_t *new_extradata[FLV_STREAM_TYPE_NB]; + int new_extradata_size[FLV_STREAM_TYPE_NB]; + int last_sample_rate; + int last_channels; + struct { + int64_t dts; + int64_t pos; + } validate_index[2]; + int validate_next; + int validate_count; + int searched_for_end; + + uint8_t resync_buffer[2*RESYNC_BUFFER_SIZE]; + + int broken_sizes; + int sum_flv_tag_size; + + int last_keyframe_stream_index; + int keyframe_count; + int64_t video_bit_rate; + int64_t audio_bit_rate; + int64_t *keyframe_times; + int64_t *keyframe_filepositions; + int missing_streams; + AVRational framerate; + int64_t last_ts; + int64_t time_offset; + int64_t time_pos; +} FLVContext; + +/* AMF date type */ +typedef struct amf_date { + double milliseconds; + int16_t timezone; +} amf_date; + +static int probe(const AVProbeData *p, int live) +{ + const uint8_t *d = p->buf; + unsigned offset = AV_RB32(d + 5); + + if (d[0] == 'F' && + d[1] == 'L' && + d[2] == 'V' && + d[3] < 5 && d[5] == 0 && + offset + 100 < p->buf_size && + offset > 8) { + int is_live = !memcmp(d + offset + 40, "NGINX RTMP", 10); + + if (live == is_live) + return AVPROBE_SCORE_MAX; + } + return 0; +} + +static int flv_probe(const AVProbeData *p) +{ + return probe(p, 0); +} + +static int live_flv_probe(const AVProbeData *p) +{ + return probe(p, 1); +} + +static int kux_probe(const AVProbeData *p) +{ + const uint8_t *d = p->buf; + + if (d[0] == 'K' && + d[1] == 'D' && + d[2] == 'K' && + d[3] == 0 && + d[4] == 0) { + return AVPROBE_SCORE_EXTENSION + 1; + } + return 0; +} + +static void add_keyframes_index(AVFormatContext *s) +{ + FLVContext *flv = s->priv_data; + AVStream *stream = NULL; + unsigned int i = 0; + + if (flv->last_keyframe_stream_index < 0) { + av_log(s, AV_LOG_DEBUG, "keyframe stream hasn't been created\n"); + return; + } + + av_assert0(flv->last_keyframe_stream_index <= s->nb_streams); + stream = s->streams[flv->last_keyframe_stream_index]; + + if (stream->nb_index_entries == 0) { + for (i = 0; i < flv->keyframe_count; i++) { + av_log(s, AV_LOG_TRACE, "keyframe filepositions = %"PRId64" times = %"PRId64"\n", + flv->keyframe_filepositions[i], flv->keyframe_times[i] * 1000); + av_add_index_entry(stream, flv->keyframe_filepositions[i], + flv->keyframe_times[i] * 1000, 0, 0, AVINDEX_KEYFRAME); + } + } else + av_log(s, AV_LOG_WARNING, "Skipping duplicate index\n"); + + if (stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { + av_freep(&flv->keyframe_times); + av_freep(&flv->keyframe_filepositions); + flv->keyframe_count = 0; + } +} + +static AVStream *create_stream(AVFormatContext *s, int codec_type) +{ + FLVContext *flv = s->priv_data; + AVStream *st = avformat_new_stream(s, NULL); + if (!st) + return NULL; + st->codecpar->codec_type = codec_type; + if (s->nb_streams>=3 ||( s->nb_streams==2 + && s->streams[0]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE + && s->streams[1]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE + && s->streams[0]->codecpar->codec_type != AVMEDIA_TYPE_DATA + && s->streams[1]->codecpar->codec_type != AVMEDIA_TYPE_DATA)) + s->ctx_flags &= ~AVFMTCTX_NOHEADER; + if (codec_type == AVMEDIA_TYPE_AUDIO) { + st->codecpar->bit_rate = flv->audio_bit_rate; + flv->missing_streams &= ~FLV_HEADER_FLAG_HASAUDIO; + } + if (codec_type == AVMEDIA_TYPE_VIDEO) { + st->codecpar->bit_rate = flv->video_bit_rate; + flv->missing_streams &= ~FLV_HEADER_FLAG_HASVIDEO; + st->avg_frame_rate = flv->framerate; + } + + + avpriv_set_pts_info(st, 32, 1, 1000); /* 32 bit pts in ms */ + flv->last_keyframe_stream_index = s->nb_streams - 1; + add_keyframes_index(s); + return st; +} + +static int flv_same_audio_codec(AVCodecParameters *apar, int flags) +{ + int bits_per_coded_sample = (flags & FLV_AUDIO_SAMPLESIZE_MASK) ? 16 : 8; + int flv_codecid = flags & FLV_AUDIO_CODECID_MASK; + int codec_id; + + if (!apar->codec_id && !apar->codec_tag) + return 1; + + if (apar->bits_per_coded_sample != bits_per_coded_sample) + return 0; + + switch (flv_codecid) { + // no distinction between S16 and S8 PCM codec flags + case FLV_CODECID_PCM: + codec_id = bits_per_coded_sample == 8 + ? AV_CODEC_ID_PCM_U8 +#if HAVE_BIGENDIAN + : AV_CODEC_ID_PCM_S16BE; +#else + : AV_CODEC_ID_PCM_S16LE; +#endif + return codec_id == apar->codec_id; + case FLV_CODECID_PCM_LE: + codec_id = bits_per_coded_sample == 8 + ? AV_CODEC_ID_PCM_U8 + : AV_CODEC_ID_PCM_S16LE; + return codec_id == apar->codec_id; + case FLV_CODECID_AAC: + return apar->codec_id == AV_CODEC_ID_AAC; + case FLV_CODECID_ADPCM: + return apar->codec_id == AV_CODEC_ID_ADPCM_SWF; + case FLV_CODECID_SPEEX: + return apar->codec_id == AV_CODEC_ID_SPEEX; + case FLV_CODECID_MP3: + return apar->codec_id == AV_CODEC_ID_MP3; + case FLV_CODECID_NELLYMOSER_8KHZ_MONO: + case FLV_CODECID_NELLYMOSER_16KHZ_MONO: + case FLV_CODECID_NELLYMOSER: + return apar->codec_id == AV_CODEC_ID_NELLYMOSER; + case FLV_CODECID_PCM_MULAW: + return apar->sample_rate == 8000 && + apar->codec_id == AV_CODEC_ID_PCM_MULAW; + case FLV_CODECID_PCM_ALAW: + return apar->sample_rate == 8000 && + apar->codec_id == AV_CODEC_ID_PCM_ALAW; + default: + return apar->codec_tag == (flv_codecid >> FLV_AUDIO_CODECID_OFFSET); + } +} + +static void flv_set_audio_codec(AVFormatContext *s, AVStream *astream, + AVCodecParameters *apar, int flv_codecid) +{ + switch (flv_codecid) { + // no distinction between S16 and S8 PCM codec flags + case FLV_CODECID_PCM: + apar->codec_id = apar->bits_per_coded_sample == 8 + ? AV_CODEC_ID_PCM_U8 +#if HAVE_BIGENDIAN + : AV_CODEC_ID_PCM_S16BE; +#else + : AV_CODEC_ID_PCM_S16LE; +#endif + break; + case FLV_CODECID_PCM_LE: + apar->codec_id = apar->bits_per_coded_sample == 8 + ? AV_CODEC_ID_PCM_U8 + : AV_CODEC_ID_PCM_S16LE; + break; + case FLV_CODECID_AAC: + apar->codec_id = AV_CODEC_ID_AAC; + break; + case FLV_CODECID_ADPCM: + apar->codec_id = AV_CODEC_ID_ADPCM_SWF; + break; + case FLV_CODECID_SPEEX: + apar->codec_id = AV_CODEC_ID_SPEEX; + apar->sample_rate = 16000; + break; + case FLV_CODECID_MP3: + apar->codec_id = AV_CODEC_ID_MP3; + astream->need_parsing = AVSTREAM_PARSE_FULL; + break; + case FLV_CODECID_NELLYMOSER_8KHZ_MONO: + // in case metadata does not otherwise declare samplerate + apar->sample_rate = 8000; + apar->codec_id = AV_CODEC_ID_NELLYMOSER; + break; + case FLV_CODECID_NELLYMOSER_16KHZ_MONO: + apar->sample_rate = 16000; + apar->codec_id = AV_CODEC_ID_NELLYMOSER; + break; + case FLV_CODECID_NELLYMOSER: + apar->codec_id = AV_CODEC_ID_NELLYMOSER; + break; + case FLV_CODECID_PCM_MULAW: + apar->sample_rate = 8000; + apar->codec_id = AV_CODEC_ID_PCM_MULAW; + break; + case FLV_CODECID_PCM_ALAW: + apar->sample_rate = 8000; + apar->codec_id = AV_CODEC_ID_PCM_ALAW; + break; + default: + avpriv_request_sample(s, "Audio codec (%x)", + flv_codecid >> FLV_AUDIO_CODECID_OFFSET); + apar->codec_tag = flv_codecid >> FLV_AUDIO_CODECID_OFFSET; + } +} + +static int flv_same_video_codec(AVCodecParameters *vpar, int flags) +{ + int flv_codecid = flags & FLV_VIDEO_CODECID_MASK; + + if (!vpar->codec_id && !vpar->codec_tag) + return 1; + + switch (flv_codecid) { + case FLV_CODECID_H263: + return vpar->codec_id == AV_CODEC_ID_FLV1; + case FLV_CODECID_SCREEN: + return vpar->codec_id == AV_CODEC_ID_FLASHSV; + case FLV_CODECID_SCREEN2: + return vpar->codec_id == AV_CODEC_ID_FLASHSV2; + case FLV_CODECID_VP6: + return vpar->codec_id == AV_CODEC_ID_VP6F; + case FLV_CODECID_VP6A: + return vpar->codec_id == AV_CODEC_ID_VP6A; + case FLV_CODECID_H264: + return vpar->codec_id == AV_CODEC_ID_H264; + case FLV_CODECID_HEVC: + return vpar->codec_id == AV_CODEC_ID_HEVC; + default: + return vpar->codec_tag == flv_codecid; + } +} + +static int flv_set_video_codec(AVFormatContext *s, AVStream *vstream, + int flv_codecid, int read) +{ + int ret = 0; + AVCodecParameters *par = vstream->codecpar; + enum AVCodecID old_codec_id = vstream->codecpar->codec_id; + switch (flv_codecid) { + case FLV_CODECID_H263: + par->codec_id = AV_CODEC_ID_FLV1; + break; + case FLV_CODECID_REALH263: + par->codec_id = AV_CODEC_ID_H263; + break; // Really mean it this time + case FLV_CODECID_SCREEN: + par->codec_id = AV_CODEC_ID_FLASHSV; + break; + case FLV_CODECID_SCREEN2: + par->codec_id = AV_CODEC_ID_FLASHSV2; + break; + case FLV_CODECID_VP6: + par->codec_id = AV_CODEC_ID_VP6F; + case FLV_CODECID_VP6A: + if (flv_codecid == FLV_CODECID_VP6A) + par->codec_id = AV_CODEC_ID_VP6A; + if (read) { + if (par->extradata_size != 1) { + ff_alloc_extradata(par, 1); + } + if (par->extradata) + par->extradata[0] = avio_r8(s->pb); + else + avio_skip(s->pb, 1); + } + ret = 1; // 1 byte body size adjustment for flv_read_packet() + break; + case FLV_CODECID_H264: + par->codec_id = AV_CODEC_ID_H264; + vstream->need_parsing = AVSTREAM_PARSE_HEADERS; + ret = 3; // not 4, reading packet type will consume one byte + break; + case FLV_CODECID_MPEG4: + par->codec_id = AV_CODEC_ID_MPEG4; + ret = 3; + break; + case FLV_CODECID_HEVC: + par->codec_id = AV_CODEC_ID_HEVC; + vstream->need_parsing = AVSTREAM_PARSE_NONE; + ret = 3; + break; + default: + avpriv_request_sample(s, "Video codec (%x)", flv_codecid); + par->codec_tag = flv_codecid; + } + + if (!vstream->internal->need_context_update && par->codec_id != old_codec_id) { + avpriv_request_sample(s, "Changing the codec id midstream"); + return AVERROR_PATCHWELCOME; + } + + return ret; +} + +static int amf_get_string(AVIOContext *ioc, char *buffer, int buffsize) +{ + int length = avio_rb16(ioc); + if (length >= buffsize) { + avio_skip(ioc, length); + return -1; + } + + avio_read(ioc, buffer, length); + + buffer[length] = '\0'; + + return length; +} + +static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, int64_t max_pos) +{ + FLVContext *flv = s->priv_data; + unsigned int timeslen = 0, fileposlen = 0, i; + char str_val[256]; + int64_t *times = NULL; + int64_t *filepositions = NULL; + int ret = AVERROR(ENOSYS); + int64_t initial_pos = avio_tell(ioc); + + if (flv->keyframe_count > 0) { + av_log(s, AV_LOG_DEBUG, "keyframes have been parsed\n"); + return 0; + } + av_assert0(!flv->keyframe_times); + av_assert0(!flv->keyframe_filepositions); + + if (s->flags & AVFMT_FLAG_IGNIDX) + return 0; + + while (avio_tell(ioc) < max_pos - 2 && + amf_get_string(ioc, str_val, sizeof(str_val)) > 0) { + int64_t **current_array; + unsigned int arraylen; + + // Expect array object in context + if (avio_r8(ioc) != AMF_DATA_TYPE_ARRAY) + break; + + arraylen = avio_rb32(ioc); + if (arraylen>>28) + break; + + if (!strcmp(KEYFRAMES_TIMESTAMP_TAG , str_val) && !times) { + current_array = × + timeslen = arraylen; + } else if (!strcmp(KEYFRAMES_BYTEOFFSET_TAG, str_val) && + !filepositions) { + current_array = &filepositions; + fileposlen = arraylen; + } else + // unexpected metatag inside keyframes, will not use such + // metadata for indexing + break; + + if (!(*current_array = av_mallocz(sizeof(**current_array) * arraylen))) { + ret = AVERROR(ENOMEM); + goto finish; + } + + for (i = 0; i < arraylen && avio_tell(ioc) < max_pos - 1; i++) { + if (avio_r8(ioc) != AMF_DATA_TYPE_NUMBER) + goto invalid; + current_array[0][i] = av_int2double(avio_rb64(ioc)); + } + if (times && filepositions) { + // All done, exiting at a position allowing amf_parse_object + // to finish parsing the object + ret = 0; + break; + } + } + + if (timeslen == fileposlen && fileposlen>1 && max_pos <= filepositions[0]) { + for (i = 0; i < FFMIN(2,fileposlen); i++) { + flv->validate_index[i].pos = filepositions[i]; + flv->validate_index[i].dts = times[i] * 1000; + flv->validate_count = i + 1; + } + flv->keyframe_times = times; + flv->keyframe_filepositions = filepositions; + flv->keyframe_count = timeslen; + times = NULL; + filepositions = NULL; + } else { +invalid: + av_log(s, AV_LOG_WARNING, "Invalid keyframes object, skipping.\n"); + } + +finish: + av_freep(×); + av_freep(&filepositions); + avio_seek(ioc, initial_pos, SEEK_SET); + return ret; +} + +static int amf_parse_object(AVFormatContext *s, AVStream *astream, + AVStream *vstream, const char *key, + int64_t max_pos, int depth) +{ + AVCodecParameters *apar, *vpar; + FLVContext *flv = s->priv_data; + AVIOContext *ioc; + AMFDataType amf_type; + char str_val[1024]; + double num_val; + amf_date date; + + num_val = 0; + ioc = s->pb; + amf_type = avio_r8(ioc); + + switch (amf_type) { + case AMF_DATA_TYPE_NUMBER: + num_val = av_int2double(avio_rb64(ioc)); + break; + case AMF_DATA_TYPE_BOOL: + num_val = avio_r8(ioc); + break; + case AMF_DATA_TYPE_STRING: + if (amf_get_string(ioc, str_val, sizeof(str_val)) < 0) { + av_log(s, AV_LOG_ERROR, "AMF_DATA_TYPE_STRING parsing failed\n"); + return -1; + } + break; + case AMF_DATA_TYPE_OBJECT: + if (key && + (ioc->seekable & AVIO_SEEKABLE_NORMAL) && + !strcmp(KEYFRAMES_TAG, key) && depth == 1) + if (parse_keyframes_index(s, ioc, + max_pos) < 0) + av_log(s, AV_LOG_ERROR, "Keyframe index parsing failed\n"); + else + add_keyframes_index(s); + while (avio_tell(ioc) < max_pos - 2 && + amf_get_string(ioc, str_val, sizeof(str_val)) > 0) + if (amf_parse_object(s, astream, vstream, str_val, max_pos, + depth + 1) < 0) + return -1; // if we couldn't skip, bomb out. + if (avio_r8(ioc) != AMF_END_OF_OBJECT) { + av_log(s, AV_LOG_ERROR, "Missing AMF_END_OF_OBJECT in AMF_DATA_TYPE_OBJECT\n"); + return -1; + } + break; + case AMF_DATA_TYPE_NULL: + case AMF_DATA_TYPE_UNDEFINED: + case AMF_DATA_TYPE_UNSUPPORTED: + break; // these take up no additional space + case AMF_DATA_TYPE_MIXEDARRAY: + { + unsigned v; + avio_skip(ioc, 4); // skip 32-bit max array index + while (avio_tell(ioc) < max_pos - 2 && + amf_get_string(ioc, str_val, sizeof(str_val)) > 0) + // this is the only case in which we would want a nested + // parse to not skip over the object + if (amf_parse_object(s, astream, vstream, str_val, max_pos, + depth + 1) < 0) + return -1; + v = avio_r8(ioc); + if (v != AMF_END_OF_OBJECT) { + av_log(s, AV_LOG_ERROR, "Missing AMF_END_OF_OBJECT in AMF_DATA_TYPE_MIXEDARRAY, found %d\n", v); + return -1; + } + break; + } + case AMF_DATA_TYPE_ARRAY: + { + unsigned int arraylen, i; + + arraylen = avio_rb32(ioc); + for (i = 0; i < arraylen && avio_tell(ioc) < max_pos - 1; i++) + if (amf_parse_object(s, NULL, NULL, NULL, max_pos, + depth + 1) < 0) + return -1; // if we couldn't skip, bomb out. + } + break; + case AMF_DATA_TYPE_DATE: + // timestamp (double) and UTC offset (int16) + date.milliseconds = av_int2double(avio_rb64(ioc)); + date.timezone = avio_rb16(ioc); + break; + default: // unsupported type, we couldn't skip + av_log(s, AV_LOG_ERROR, "unsupported amf type %d\n", amf_type); + return -1; + } + + if (key) { + apar = astream ? astream->codecpar : NULL; + vpar = vstream ? vstream->codecpar : NULL; + + // stream info doesn't live any deeper than the first object + if (depth == 1) { + if (amf_type == AMF_DATA_TYPE_NUMBER || + amf_type == AMF_DATA_TYPE_BOOL) { + if (!strcmp(key, "duration")) + s->duration = num_val * AV_TIME_BASE; + else if (!strcmp(key, "videodatarate") && + 0 <= (int)(num_val * 1024.0)) + flv->video_bit_rate = num_val * 1024.0; + else if (!strcmp(key, "audiodatarate") && + 0 <= (int)(num_val * 1024.0)) + flv->audio_bit_rate = num_val * 1024.0; + else if (!strcmp(key, "datastream")) { + AVStream *st = create_stream(s, AVMEDIA_TYPE_SUBTITLE); + if (!st) + return AVERROR(ENOMEM); + st->codecpar->codec_id = AV_CODEC_ID_TEXT; + } else if (!strcmp(key, "framerate")) { + flv->framerate = av_d2q(num_val, 1000); + if (vstream) + vstream->avg_frame_rate = flv->framerate; + } else if (flv->trust_metadata) { + if (!strcmp(key, "videocodecid") && vpar) { + int ret = flv_set_video_codec(s, vstream, num_val, 0); + if (ret < 0) + return ret; + } else if (!strcmp(key, "audiocodecid") && apar) { + int id = ((int)num_val) << FLV_AUDIO_CODECID_OFFSET; + flv_set_audio_codec(s, astream, apar, id); + } else if (!strcmp(key, "audiosamplerate") && apar) { + apar->sample_rate = num_val; + } else if (!strcmp(key, "audiosamplesize") && apar) { + apar->bits_per_coded_sample = num_val; + } else if (!strcmp(key, "stereo") && apar) { + apar->channels = num_val + 1; + apar->channel_layout = apar->channels == 2 ? + AV_CH_LAYOUT_STEREO : + AV_CH_LAYOUT_MONO; + } else if (!strcmp(key, "width") && vpar) { + vpar->width = num_val; + } else if (!strcmp(key, "height") && vpar) { + vpar->height = num_val; + } + } + } + if (amf_type == AMF_DATA_TYPE_STRING) { + if (!strcmp(key, "encoder")) { + int version = -1; + if (1 == sscanf(str_val, "Open Broadcaster Software v0.%d", &version)) { + if (version > 0 && version <= 655) + flv->broken_sizes = 1; + } + } else if (!strcmp(key, "metadatacreator")) { + if ( !strcmp (str_val, "MEGA") + || !strncmp(str_val, "FlixEngine", 10)) + flv->broken_sizes = 1; + } + } + } + + if (amf_type == AMF_DATA_TYPE_OBJECT && s->nb_streams == 1 && + ((!apar && !strcmp(key, "audiocodecid")) || + (!vpar && !strcmp(key, "videocodecid")))) + s->ctx_flags &= ~AVFMTCTX_NOHEADER; //If there is either audio/video missing, codecid will be an empty object + + if ((!strcmp(key, "duration") || + !strcmp(key, "filesize") || + !strcmp(key, "width") || + !strcmp(key, "height") || + !strcmp(key, "videodatarate") || + !strcmp(key, "framerate") || + !strcmp(key, "videocodecid") || + !strcmp(key, "audiodatarate") || + !strcmp(key, "audiosamplerate") || + !strcmp(key, "audiosamplesize") || + !strcmp(key, "stereo") || + !strcmp(key, "audiocodecid") || + !strcmp(key, "datastream")) && !flv->dump_full_metadata) + return 0; + + s->event_flags |= AVFMT_EVENT_FLAG_METADATA_UPDATED; + if (amf_type == AMF_DATA_TYPE_BOOL) { + av_strlcpy(str_val, num_val > 0 ? "true" : "false", + sizeof(str_val)); + av_dict_set(&s->metadata, key, str_val, 0); + } else if (amf_type == AMF_DATA_TYPE_NUMBER) { + snprintf(str_val, sizeof(str_val), "%.f", num_val); + av_dict_set(&s->metadata, key, str_val, 0); + } else if (amf_type == AMF_DATA_TYPE_STRING) { + av_dict_set(&s->metadata, key, str_val, 0); + } else if (amf_type == AMF_DATA_TYPE_DATE) { + time_t time; + struct tm t; + char datestr[128]; + time = date.milliseconds / 1000; // to seconds + localtime_r(&time, &t); + strftime(datestr, sizeof(datestr), "%a, %d %b %Y %H:%M:%S %z", &t); + + av_dict_set(&s->metadata, key, datestr, 0); + } + } + + return 0; +} + +#define TYPE_ONTEXTDATA 1 +#define TYPE_ONCAPTION 2 +#define TYPE_ONCAPTIONINFO 3 +#define TYPE_UNKNOWN 9 + +static int flv_read_metabody(AVFormatContext *s, int64_t next_pos) +{ + FLVContext *flv = s->priv_data; + AMFDataType type; + AVStream *stream, *astream, *vstream; + AVStream av_unused *dstream; + AVIOContext *ioc; + int i; + char buffer[32]; + + astream = NULL; + vstream = NULL; + dstream = NULL; + ioc = s->pb; + + // first object needs to be "onMetaData" string + type = avio_r8(ioc); + if (type != AMF_DATA_TYPE_STRING || + amf_get_string(ioc, buffer, sizeof(buffer)) < 0) + return TYPE_UNKNOWN; + + if (!strcmp(buffer, "onTextData")) + return TYPE_ONTEXTDATA; + + if (!strcmp(buffer, "onCaption")) + return TYPE_ONCAPTION; + + if (!strcmp(buffer, "onCaptionInfo")) + return TYPE_ONCAPTIONINFO; + + if (strcmp(buffer, "onMetaData") && strcmp(buffer, "onCuePoint")) { + av_log(s, AV_LOG_DEBUG, "Unknown type %s\n", buffer); + return TYPE_UNKNOWN; + } + + // find the streams now so that amf_parse_object doesn't need to do + // the lookup every time it is called. + for (i = 0; i < s->nb_streams; i++) { + stream = s->streams[i]; + if (stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { + vstream = stream; + flv->last_keyframe_stream_index = i; + } else if (stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { + astream = stream; + if (flv->last_keyframe_stream_index == -1) + flv->last_keyframe_stream_index = i; + } + else if (stream->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) + dstream = stream; + } + + // parse the second object (we want a mixed array) + if (amf_parse_object(s, astream, vstream, buffer, next_pos, 0) < 0) + return -1; + + return 0; +} + +static int flv_read_header(AVFormatContext *s) +{ + int flags; + FLVContext *flv = s->priv_data; + int offset; + int pre_tag_size = 0; + + /* Actual FLV data at 0xe40000 in KUX file */ + if(!strcmp(s->iformat->name, "kux")) + avio_skip(s->pb, 0xe40000); + + avio_skip(s->pb, 4); + flags = avio_r8(s->pb); + + flv->missing_streams = flags & (FLV_HEADER_FLAG_HASVIDEO | FLV_HEADER_FLAG_HASAUDIO); + + s->ctx_flags |= AVFMTCTX_NOHEADER; + + offset = avio_rb32(s->pb); + avio_seek(s->pb, offset, SEEK_SET); + + /* Annex E. The FLV File Format + * E.3 TheFLVFileBody + * Field Type Comment + * PreviousTagSize0 UI32 Always 0 + * */ + pre_tag_size = avio_rb32(s->pb); + if (pre_tag_size) { + av_log(s, AV_LOG_WARNING, "Read FLV header error, input file is not a standard flv format, first PreviousTagSize0 always is 0\n"); + } + + s->start_time = 0; + flv->sum_flv_tag_size = 0; + flv->last_keyframe_stream_index = -1; + + return 0; +} + +static int flv_read_close(AVFormatContext *s) +{ + int i; + FLVContext *flv = s->priv_data; + for (i=0; inew_extradata[i]); + av_freep(&flv->keyframe_times); + av_freep(&flv->keyframe_filepositions); + return 0; +} + +static int flv_get_extradata(AVFormatContext *s, AVStream *st, int size) +{ + if (!size) + return 0; + + av_freep(&st->codecpar->extradata); + if (ff_get_extradata(s, st->codecpar, s->pb, size) < 0) + return AVERROR(ENOMEM); + st->internal->need_context_update = 1; + return 0; +} + +static int flv_queue_extradata(FLVContext *flv, AVIOContext *pb, int stream, + int size) +{ + if (!size) + return 0; + + av_free(flv->new_extradata[stream]); + flv->new_extradata[stream] = av_mallocz(size + + AV_INPUT_BUFFER_PADDING_SIZE); + if (!flv->new_extradata[stream]) + return AVERROR(ENOMEM); + flv->new_extradata_size[stream] = size; + avio_read(pb, flv->new_extradata[stream], size); + return 0; +} + +static void clear_index_entries(AVFormatContext *s, int64_t pos) +{ + int i, j, out; + av_log(s, AV_LOG_WARNING, + "Found invalid index entries, clearing the index.\n"); + for (i = 0; i < s->nb_streams; i++) { + AVStream *st = s->streams[i]; + /* Remove all index entries that point to >= pos */ + out = 0; + for (j = 0; j < st->nb_index_entries; j++) + if (st->index_entries[j].pos < pos) + st->index_entries[out++] = st->index_entries[j]; + st->nb_index_entries = out; + } +} + +static int amf_skip_tag(AVIOContext *pb, AMFDataType type) +{ + int nb = -1, ret, parse_name = 1; + + switch (type) { + case AMF_DATA_TYPE_NUMBER: + avio_skip(pb, 8); + break; + case AMF_DATA_TYPE_BOOL: + avio_skip(pb, 1); + break; + case AMF_DATA_TYPE_STRING: + avio_skip(pb, avio_rb16(pb)); + break; + case AMF_DATA_TYPE_ARRAY: + parse_name = 0; + case AMF_DATA_TYPE_MIXEDARRAY: + nb = avio_rb32(pb); + case AMF_DATA_TYPE_OBJECT: + while(!pb->eof_reached && (nb-- > 0 || type != AMF_DATA_TYPE_ARRAY)) { + if (parse_name) { + int size = avio_rb16(pb); + if (!size) { + avio_skip(pb, 1); + break; + } + avio_skip(pb, size); + } + if ((ret = amf_skip_tag(pb, avio_r8(pb))) < 0) + return ret; + } + break; + case AMF_DATA_TYPE_NULL: + case AMF_DATA_TYPE_OBJECT_END: + break; + default: + return AVERROR_INVALIDDATA; + } + return 0; +} + +static int flv_data_packet(AVFormatContext *s, AVPacket *pkt, + int64_t dts, int64_t next) +{ + AVIOContext *pb = s->pb; + AVStream *st = NULL; + char buf[20]; + int ret = AVERROR_INVALIDDATA; + int i, length = -1; + int array = 0; + + switch (avio_r8(pb)) { + case AMF_DATA_TYPE_ARRAY: + array = 1; + case AMF_DATA_TYPE_MIXEDARRAY: + avio_seek(pb, 4, SEEK_CUR); + case AMF_DATA_TYPE_OBJECT: + break; + default: + goto skip; + } + + while (array || (ret = amf_get_string(pb, buf, sizeof(buf))) > 0) { + AMFDataType type = avio_r8(pb); + if (type == AMF_DATA_TYPE_STRING && (array || !strcmp(buf, "text"))) { + length = avio_rb16(pb); + ret = av_get_packet(pb, pkt, length); + if (ret < 0) + goto skip; + else + break; + } else { + if ((ret = amf_skip_tag(pb, type)) < 0) + goto skip; + } + } + + if (length < 0) { + ret = AVERROR_INVALIDDATA; + goto skip; + } + + for (i = 0; i < s->nb_streams; i++) { + st = s->streams[i]; + if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) + break; + } + + if (i == s->nb_streams) { + st = create_stream(s, AVMEDIA_TYPE_SUBTITLE); + if (!st) + return AVERROR(ENOMEM); + st->codecpar->codec_id = AV_CODEC_ID_TEXT; + } + + pkt->dts = dts; + pkt->pts = dts; + pkt->size = ret; + + pkt->stream_index = st->index; + pkt->flags |= AV_PKT_FLAG_KEY; + +skip: + avio_seek(s->pb, next + 4, SEEK_SET); + + return ret; +} + +static int resync(AVFormatContext *s) +{ + FLVContext *flv = s->priv_data; + int64_t i; + int64_t pos = avio_tell(s->pb); + + for (i=0; !avio_feof(s->pb); i++) { + int j = i & (RESYNC_BUFFER_SIZE-1); + int j1 = j + RESYNC_BUFFER_SIZE; + flv->resync_buffer[j ] = + flv->resync_buffer[j1] = avio_r8(s->pb); + + if (i >= 8 && pos) { + uint8_t *d = flv->resync_buffer + j1 - 8; + if (d[0] == 'F' && + d[1] == 'L' && + d[2] == 'V' && + d[3] < 5 && d[5] == 0) { + av_log(s, AV_LOG_WARNING, "Concatenated FLV detected, might fail to demux, decode and seek %"PRId64"\n", flv->last_ts); + flv->time_offset = flv->last_ts + 1; + flv->time_pos = avio_tell(s->pb); + } + } + + if (i > 22) { + unsigned lsize2 = AV_RB32(flv->resync_buffer + j1 - 4); + if (lsize2 >= 11 && lsize2 + 8LL < FFMIN(i, RESYNC_BUFFER_SIZE)) { + unsigned size2 = AV_RB24(flv->resync_buffer + j1 - lsize2 + 1 - 4); + unsigned lsize1 = AV_RB32(flv->resync_buffer + j1 - lsize2 - 8); + if (lsize1 >= 11 && lsize1 + 8LL + lsize2 < FFMIN(i, RESYNC_BUFFER_SIZE)) { + unsigned size1 = AV_RB24(flv->resync_buffer + j1 - lsize1 + 1 - lsize2 - 8); + if (size1 == lsize1 - 11 && size2 == lsize2 - 11) { + avio_seek(s->pb, pos + i - lsize1 - lsize2 - 8, SEEK_SET); + return 1; + } + } + } + } + } + return AVERROR_EOF; +} + +static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) +{ + FLVContext *flv = s->priv_data; + int ret, i, size, flags; + enum FlvTagType type; + int stream_type=-1; + int64_t next, pos, meta_pos; + int64_t dts, pts = AV_NOPTS_VALUE; + int av_uninit(channels); + int av_uninit(sample_rate); + AVStream *st = NULL; + int last = -1; + int orig_size; + +retry: + /* pkt size is repeated at end. skip it */ + pos = avio_tell(s->pb); + type = (avio_r8(s->pb) & 0x1F); + orig_size = + size = avio_rb24(s->pb); + flv->sum_flv_tag_size += size + 11; + dts = avio_rb24(s->pb); + dts |= (unsigned)avio_r8(s->pb) << 24; + av_log(s, AV_LOG_TRACE, "type:%d, size:%d, last:%d, dts:%"PRId64" pos:%"PRId64"\n", type, size, last, dts, avio_tell(s->pb)); + if (avio_feof(s->pb)) + return AVERROR_EOF; + avio_skip(s->pb, 3); /* stream id, always 0 */ + flags = 0; + + if (flv->validate_next < flv->validate_count) { + int64_t validate_pos = flv->validate_index[flv->validate_next].pos; + if (pos == validate_pos) { + if (FFABS(dts - flv->validate_index[flv->validate_next].dts) <= + VALIDATE_INDEX_TS_THRESH) { + flv->validate_next++; + } else { + clear_index_entries(s, validate_pos); + flv->validate_count = 0; + } + } else if (pos > validate_pos) { + clear_index_entries(s, validate_pos); + flv->validate_count = 0; + } + } + + if (size == 0) { + ret = FFERROR_REDO; + goto leave; + } + + next = size + avio_tell(s->pb); + + if (type == FLV_TAG_TYPE_AUDIO) { + stream_type = FLV_STREAM_TYPE_AUDIO; + flags = avio_r8(s->pb); + size--; + } else if (type == FLV_TAG_TYPE_VIDEO) { + stream_type = FLV_STREAM_TYPE_VIDEO; + flags = avio_r8(s->pb); + size--; + if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_VIDEO_INFO_CMD) + goto skip; + } else if (type == FLV_TAG_TYPE_META) { + stream_type=FLV_STREAM_TYPE_SUBTITLE; + if (size > 13 + 1 + 4) { // Header-type metadata stuff + int type; + meta_pos = avio_tell(s->pb); + type = flv_read_metabody(s, next); + if (type == 0 && dts == 0 || type < 0) { + if (type < 0 && flv->validate_count && + flv->validate_index[0].pos > next && + flv->validate_index[0].pos - 4 < next + ) { + av_log(s, AV_LOG_WARNING, "Adjusting next position due to index mismatch\n"); + next = flv->validate_index[0].pos - 4; + } + goto skip; + } else if (type == TYPE_ONTEXTDATA) { + avpriv_request_sample(s, "OnTextData packet"); + return flv_data_packet(s, pkt, dts, next); + } else if (type == TYPE_ONCAPTION) { + return flv_data_packet(s, pkt, dts, next); + } else if (type == TYPE_UNKNOWN) { + stream_type = FLV_STREAM_TYPE_DATA; + } + avio_seek(s->pb, meta_pos, SEEK_SET); + } + } else { + av_log(s, AV_LOG_DEBUG, + "Skipping flv packet: type %d, size %d, flags %d.\n", + type, size, flags); +skip: + if (avio_seek(s->pb, next, SEEK_SET) != next) { + // This can happen if flv_read_metabody above read past + // next, on a non-seekable input, and the preceding data has + // been flushed out from the IO buffer. + av_log(s, AV_LOG_ERROR, "Unable to seek to the next packet\n"); + return AVERROR_INVALIDDATA; + } + ret = FFERROR_REDO; + goto leave; + } + + /* skip empty data packets */ + if (!size) { + ret = FFERROR_REDO; + goto leave; + } + + /* now find stream */ + for (i = 0; i < s->nb_streams; i++) { + st = s->streams[i]; + if (stream_type == FLV_STREAM_TYPE_AUDIO) { + if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && + (s->audio_codec_id || flv_same_audio_codec(st->codecpar, flags))) + break; + } else if (stream_type == FLV_STREAM_TYPE_VIDEO) { + if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && + (s->video_codec_id || flv_same_video_codec(st->codecpar, flags))) + break; + } else if (stream_type == FLV_STREAM_TYPE_SUBTITLE) { + if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) + break; + } else if (stream_type == FLV_STREAM_TYPE_DATA) { + if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA) + break; + } + } + if (i == s->nb_streams) { + static const enum AVMediaType stream_types[] = {AVMEDIA_TYPE_VIDEO, AVMEDIA_TYPE_AUDIO, AVMEDIA_TYPE_SUBTITLE, AVMEDIA_TYPE_DATA}; + st = create_stream(s, stream_types[stream_type]); + if (!st) + return AVERROR(ENOMEM); + + } + av_log(s, AV_LOG_TRACE, "%d %X %d \n", stream_type, flags, st->discard); + + if (flv->time_pos <= pos) { + dts += flv->time_offset; + } + + if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && + ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY || + stream_type == FLV_STREAM_TYPE_AUDIO)) + av_add_index_entry(st, pos, dts, size, 0, AVINDEX_KEYFRAME); + + if ( (st->discard >= AVDISCARD_NONKEY && !((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY || (stream_type == FLV_STREAM_TYPE_AUDIO))) + ||(st->discard >= AVDISCARD_BIDIR && ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_DISP_INTER && (stream_type == FLV_STREAM_TYPE_VIDEO))) + || st->discard >= AVDISCARD_ALL + ) { + avio_seek(s->pb, next, SEEK_SET); + ret = FFERROR_REDO; + goto leave; + } + + // if not streamed and no duration from metadata then seek to end to find + // the duration from the timestamps + if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && + (!s->duration || s->duration == AV_NOPTS_VALUE) && + !flv->searched_for_end) { + int size; + const int64_t pos = avio_tell(s->pb); + // Read the last 4 bytes of the file, this should be the size of the + // previous FLV tag. Use the timestamp of its payload as duration. + int64_t fsize = avio_size(s->pb); +retry_duration: + avio_seek(s->pb, fsize - 4, SEEK_SET); + size = avio_rb32(s->pb); + if (size > 0 && size < fsize) { + // Seek to the start of the last FLV tag at position (fsize - 4 - size) + // but skip the byte indicating the type. + avio_seek(s->pb, fsize - 3 - size, SEEK_SET); + if (size == avio_rb24(s->pb) + 11) { + uint32_t ts = avio_rb24(s->pb); + ts |= avio_r8(s->pb) << 24; + if (ts) + s->duration = ts * (int64_t)AV_TIME_BASE / 1000; + else if (fsize >= 8 && fsize - 8 >= size) { + fsize -= size+4; + goto retry_duration; + } + } + } + + avio_seek(s->pb, pos, SEEK_SET); + flv->searched_for_end = 1; + } + + if (stream_type == FLV_STREAM_TYPE_AUDIO) { + int bits_per_coded_sample; + channels = (flags & FLV_AUDIO_CHANNEL_MASK) == FLV_STEREO ? 2 : 1; + sample_rate = 44100 << ((flags & FLV_AUDIO_SAMPLERATE_MASK) >> + FLV_AUDIO_SAMPLERATE_OFFSET) >> 3; + bits_per_coded_sample = (flags & FLV_AUDIO_SAMPLESIZE_MASK) ? 16 : 8; + if (!st->codecpar->channels || !st->codecpar->sample_rate || + !st->codecpar->bits_per_coded_sample) { + st->codecpar->channels = channels; + st->codecpar->channel_layout = channels == 1 + ? AV_CH_LAYOUT_MONO + : AV_CH_LAYOUT_STEREO; + st->codecpar->sample_rate = sample_rate; + st->codecpar->bits_per_coded_sample = bits_per_coded_sample; + } + if (!st->codecpar->codec_id) { + flv_set_audio_codec(s, st, st->codecpar, + flags & FLV_AUDIO_CODECID_MASK); + flv->last_sample_rate = + sample_rate = st->codecpar->sample_rate; + flv->last_channels = + channels = st->codecpar->channels; + } else { + AVCodecParameters *par = avcodec_parameters_alloc(); + if (!par) { + ret = AVERROR(ENOMEM); + goto leave; + } + par->sample_rate = sample_rate; + par->bits_per_coded_sample = bits_per_coded_sample; + flv_set_audio_codec(s, st, par, flags & FLV_AUDIO_CODECID_MASK); + sample_rate = par->sample_rate; + avcodec_parameters_free(&par); + } + } else if (stream_type == FLV_STREAM_TYPE_VIDEO) { + int ret = flv_set_video_codec(s, st, flags & FLV_VIDEO_CODECID_MASK, 1); + if (ret < 0) + return ret; + size -= ret; + } else if (stream_type == FLV_STREAM_TYPE_SUBTITLE) { + st->codecpar->codec_id = AV_CODEC_ID_TEXT; + } else if (stream_type == FLV_STREAM_TYPE_DATA) { + st->codecpar->codec_id = AV_CODEC_ID_NONE; // Opaque AMF data + } + + if (st->codecpar->codec_id == AV_CODEC_ID_AAC || + st->codecpar->codec_id == AV_CODEC_ID_H264 || + st->codecpar->codec_id == AV_CODEC_ID_MPEG4 || + st->codecpar->codec_id == AV_CODEC_ID_HEVC ) { + int type = avio_r8(s->pb); + size--; + + if (size < 0) { + ret = AVERROR_INVALIDDATA; + goto leave; + } + + if (st->codecpar->codec_id == AV_CODEC_ID_H264 || st->codecpar->codec_id == AV_CODEC_ID_MPEG4 || st->codecpar->codec_id == AV_CODEC_ID_HEVC) { + // sign extension + int32_t cts = (avio_rb24(s->pb) + 0xff800000) ^ 0xff800000; + pts = dts + cts; + if (cts < 0) { // dts might be wrong + if (!flv->wrong_dts) + av_log(s, AV_LOG_WARNING, + "Negative cts, previous timestamps might be wrong.\n"); + flv->wrong_dts = 1; + } else if (FFABS(dts - pts) > 1000*60*15) { + av_log(s, AV_LOG_WARNING, + "invalid timestamps %"PRId64" %"PRId64"\n", dts, pts); + dts = pts = AV_NOPTS_VALUE; + } + } + if (type == 0 && (!st->codecpar->extradata || st->codecpar->codec_id == AV_CODEC_ID_AAC || + st->codecpar->codec_id == AV_CODEC_ID_H264 || st->codecpar->codec_id == AV_CODEC_ID_HEVC)) { + AVDictionaryEntry *t; + + if (st->codecpar->extradata) { + if ((ret = flv_queue_extradata(flv, s->pb, stream_type, size)) < 0) + return ret; + ret = FFERROR_REDO; + goto leave; + } + if ((ret = flv_get_extradata(s, st, size)) < 0) + return ret; + + /* Workaround for buggy Omnia A/XE encoder */ + t = av_dict_get(s->metadata, "Encoder", NULL, 0); + if (st->codecpar->codec_id == AV_CODEC_ID_AAC && t && !strcmp(t->value, "Omnia A/XE")) + st->codecpar->extradata_size = 2; + + ret = FFERROR_REDO; + goto leave; + } + } + + /* skip empty data packets */ + if (!size) { + ret = FFERROR_REDO; + goto leave; + } + + ret = av_get_packet(s->pb, pkt, size); + if (ret < 0) + return ret; + pkt->dts = dts; + pkt->pts = pts == AV_NOPTS_VALUE ? dts : pts; + pkt->stream_index = st->index; + pkt->pos = pos; + if (flv->new_extradata[stream_type]) { + uint8_t *side = av_packet_new_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, + flv->new_extradata_size[stream_type]); + if (side) { + memcpy(side, flv->new_extradata[stream_type], + flv->new_extradata_size[stream_type]); + av_freep(&flv->new_extradata[stream_type]); + flv->new_extradata_size[stream_type] = 0; + } + } + if (stream_type == FLV_STREAM_TYPE_AUDIO && + (sample_rate != flv->last_sample_rate || + channels != flv->last_channels)) { + flv->last_sample_rate = sample_rate; + flv->last_channels = channels; + ff_add_param_change(pkt, channels, 0, sample_rate, 0, 0); + } + + if ( stream_type == FLV_STREAM_TYPE_AUDIO || + ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY) || + stream_type == FLV_STREAM_TYPE_SUBTITLE || + stream_type == FLV_STREAM_TYPE_DATA) + pkt->flags |= AV_PKT_FLAG_KEY; + +leave: + last = avio_rb32(s->pb); + if (!flv->trust_datasize) { + if (last != orig_size + 11 && last != orig_size + 10 && + !avio_feof(s->pb) && + (last != orig_size || !last) && last != flv->sum_flv_tag_size && + !flv->broken_sizes) { + av_log(s, AV_LOG_ERROR, "Packet mismatch %d %d %d\n", last, orig_size + 11, flv->sum_flv_tag_size); + avio_seek(s->pb, pos + 1, SEEK_SET); + ret = resync(s); + av_packet_unref(pkt); + if (ret >= 0) { + goto retry; + } + } + } + + if (ret >= 0) + flv->last_ts = pkt->dts; + + return ret; +} + +static int flv_read_seek(AVFormatContext *s, int stream_index, + int64_t ts, int flags) +{ + FLVContext *flv = s->priv_data; + flv->validate_count = 0; + return avio_seek_time(s->pb, stream_index, ts, flags); +} + +#define OFFSET(x) offsetof(FLVContext, x) +#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM +static const AVOption options[] = { + { "flv_metadata", "Allocate streams according to the onMetaData array", OFFSET(trust_metadata), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD }, + { "flv_full_metadata", "Dump full metadata of the onMetadata", OFFSET(dump_full_metadata), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD }, + { "flv_ignore_prevtag", "Ignore the Size of previous tag", OFFSET(trust_datasize), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD }, + { "missing_streams", "", OFFSET(missing_streams), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 0xFF, VD | AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY }, + { NULL } +}; + +static const AVClass flv_class = { + .class_name = "flvdec", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; + +AVInputFormat ff_flv_demuxer = { + .name = "flv", + .long_name = NULL_IF_CONFIG_SMALL("FLV (Flash Video)"), + .priv_data_size = sizeof(FLVContext), + .read_probe = flv_probe, + .read_header = flv_read_header, + .read_packet = flv_read_packet, + .read_seek = flv_read_seek, + .read_close = flv_read_close, + .extensions = "flv", + .priv_class = &flv_class, +}; + +static const AVClass live_flv_class = { + .class_name = "live_flvdec", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; + +AVInputFormat ff_live_flv_demuxer = { + .name = "live_flv", + .long_name = NULL_IF_CONFIG_SMALL("live RTMP FLV (Flash Video)"), + .priv_data_size = sizeof(FLVContext), + .read_probe = live_flv_probe, + .read_header = flv_read_header, + .read_packet = flv_read_packet, + .read_seek = flv_read_seek, + .read_close = flv_read_close, + .extensions = "flv", + .priv_class = &live_flv_class, + .flags = AVFMT_TS_DISCONT +}; + +static const AVClass kux_class = { + .class_name = "kuxdec", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; + +AVInputFormat ff_kux_demuxer = { + .name = "kux", + .long_name = NULL_IF_CONFIG_SMALL("KUX (YouKu)"), + .priv_data_size = sizeof(FLVContext), + .read_probe = kux_probe, + .read_header = flv_read_header, + .read_packet = flv_read_packet, + .read_seek = flv_read_seek, + .read_close = flv_read_close, + .extensions = "kux", + .priv_class = &kux_class, +}; diff --git a/StreamMedia/flv_h265_patch/ffmpeg_flv/flvenc.c b/StreamMedia/flv_h265_patch/ffmpeg_flv/flvenc.c new file mode 100644 index 0000000..a9661a5 --- /dev/null +++ b/StreamMedia/flv_h265_patch/ffmpeg_flv/flvenc.c @@ -0,0 +1,1180 @@ +/* + * FLV muxer + * Copyright (c) 2003 The FFmpeg Project + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/intreadwrite.h" +#include "libavutil/dict.h" +#include "libavutil/intfloat.h" +#include "libavutil/avassert.h" +#include "libavutil/mathematics.h" +#include "avio_internal.h" +#include "avio.h" +#include "avc.h" +#include "avformat.h" +#include "flv.h" +#include "internal.h" +#include "metadata.h" +#include "libavutil/opt.h" +#include "libavcodec/put_bits.h" +#include "libavcodec/aacenctab.h" +#include "hevc.h" + + +static const AVCodecTag flv_video_codec_ids[] = { + { AV_CODEC_ID_FLV1, FLV_CODECID_H263 }, + { AV_CODEC_ID_H263, FLV_CODECID_REALH263 }, + { AV_CODEC_ID_MPEG4, FLV_CODECID_MPEG4 }, + { AV_CODEC_ID_FLASHSV, FLV_CODECID_SCREEN }, + { AV_CODEC_ID_FLASHSV2, FLV_CODECID_SCREEN2 }, + { AV_CODEC_ID_VP6F, FLV_CODECID_VP6 }, + { AV_CODEC_ID_VP6, FLV_CODECID_VP6 }, + { AV_CODEC_ID_VP6A, FLV_CODECID_VP6A }, + { AV_CODEC_ID_H264, FLV_CODECID_H264 }, + { AV_CODEC_ID_HEVC, FLV_CODECID_HEVC }, + { AV_CODEC_ID_NONE, 0 } +}; + +static const AVCodecTag flv_audio_codec_ids[] = { + { AV_CODEC_ID_MP3, FLV_CODECID_MP3 >> FLV_AUDIO_CODECID_OFFSET }, + { AV_CODEC_ID_PCM_U8, FLV_CODECID_PCM >> FLV_AUDIO_CODECID_OFFSET }, + { AV_CODEC_ID_PCM_S16BE, FLV_CODECID_PCM >> FLV_AUDIO_CODECID_OFFSET }, + { AV_CODEC_ID_PCM_S16LE, FLV_CODECID_PCM_LE >> FLV_AUDIO_CODECID_OFFSET }, + { AV_CODEC_ID_ADPCM_SWF, FLV_CODECID_ADPCM >> FLV_AUDIO_CODECID_OFFSET }, + { AV_CODEC_ID_AAC, FLV_CODECID_AAC >> FLV_AUDIO_CODECID_OFFSET }, + { AV_CODEC_ID_NELLYMOSER, FLV_CODECID_NELLYMOSER >> FLV_AUDIO_CODECID_OFFSET }, + { AV_CODEC_ID_PCM_MULAW, FLV_CODECID_PCM_MULAW >> FLV_AUDIO_CODECID_OFFSET }, + { AV_CODEC_ID_PCM_ALAW, FLV_CODECID_PCM_ALAW >> FLV_AUDIO_CODECID_OFFSET }, + { AV_CODEC_ID_SPEEX, FLV_CODECID_SPEEX >> FLV_AUDIO_CODECID_OFFSET }, + { AV_CODEC_ID_NONE, 0 } +}; + +typedef enum { + FLV_AAC_SEQ_HEADER_DETECT = (1 << 0), + FLV_NO_SEQUENCE_END = (1 << 1), + FLV_ADD_KEYFRAME_INDEX = (1 << 2), + FLV_NO_METADATA = (1 << 3), + FLV_NO_DURATION_FILESIZE = (1 << 4), +} FLVFlags; + +typedef struct FLVFileposition { + int64_t keyframe_position; + double keyframe_timestamp; + struct FLVFileposition *next; +} FLVFileposition; + +typedef struct FLVContext { + AVClass *av_class; + int reserved; + int64_t duration_offset; + int64_t filesize_offset; + int64_t duration; + int64_t delay; ///< first dts delay (needed for AVC & Speex) + + int64_t datastart_offset; + int64_t datasize_offset; + int64_t datasize; + int64_t videosize_offset; + int64_t videosize; + int64_t audiosize_offset; + int64_t audiosize; + + int64_t metadata_size_pos; + int64_t metadata_totalsize_pos; + int64_t metadata_totalsize; + int64_t keyframe_index_size; + + int64_t lasttimestamp_offset; + double lasttimestamp; + int64_t lastkeyframetimestamp_offset; + double lastkeyframetimestamp; + int64_t lastkeyframelocation_offset; + int64_t lastkeyframelocation; + + int acurframeindex; + int64_t keyframes_info_offset; + + int64_t filepositions_count; + FLVFileposition *filepositions; + FLVFileposition *head_filepositions; + + AVCodecParameters *audio_par; + AVCodecParameters *video_par; + double framerate; + AVCodecParameters *data_par; + + int flags; +} FLVContext; + +typedef struct FLVStreamContext { + int64_t last_ts; ///< last timestamp for each stream +} FLVStreamContext; + +static int get_audio_flags(AVFormatContext *s, AVCodecParameters *par) +{ + int flags = (par->bits_per_coded_sample == 16) ? FLV_SAMPLESSIZE_16BIT + : FLV_SAMPLESSIZE_8BIT; + + if (par->codec_id == AV_CODEC_ID_AAC) // specs force these parameters + return FLV_CODECID_AAC | FLV_SAMPLERATE_44100HZ | + FLV_SAMPLESSIZE_16BIT | FLV_STEREO; + else if (par->codec_id == AV_CODEC_ID_SPEEX) { + if (par->sample_rate != 16000) { + av_log(s, AV_LOG_ERROR, + "FLV only supports wideband (16kHz) Speex audio\n"); + return AVERROR(EINVAL); + } + if (par->channels != 1) { + av_log(s, AV_LOG_ERROR, "FLV only supports mono Speex audio\n"); + return AVERROR(EINVAL); + } + return FLV_CODECID_SPEEX | FLV_SAMPLERATE_11025HZ | FLV_SAMPLESSIZE_16BIT; + } else { + switch (par->sample_rate) { + case 48000: + // 48khz mp3 is stored with 44k1 samplerate identifer + if (par->codec_id == AV_CODEC_ID_MP3) { + flags |= FLV_SAMPLERATE_44100HZ; + break; + } else { + goto error; + } + case 44100: + flags |= FLV_SAMPLERATE_44100HZ; + break; + case 22050: + flags |= FLV_SAMPLERATE_22050HZ; + break; + case 11025: + flags |= FLV_SAMPLERATE_11025HZ; + break; + case 16000: // nellymoser only + case 8000: // nellymoser only + case 5512: // not MP3 + if (par->codec_id != AV_CODEC_ID_MP3) { + flags |= FLV_SAMPLERATE_SPECIAL; + break; + } + default: +error: + av_log(s, AV_LOG_ERROR, + "FLV does not support sample rate %d, " + "choose from (44100, 22050, 11025)\n", par->sample_rate); + return AVERROR(EINVAL); + } + } + + if (par->channels > 1) + flags |= FLV_STEREO; + + switch (par->codec_id) { + case AV_CODEC_ID_MP3: + flags |= FLV_CODECID_MP3 | FLV_SAMPLESSIZE_16BIT; + break; + case AV_CODEC_ID_PCM_U8: + flags |= FLV_CODECID_PCM | FLV_SAMPLESSIZE_8BIT; + break; + case AV_CODEC_ID_PCM_S16BE: + flags |= FLV_CODECID_PCM | FLV_SAMPLESSIZE_16BIT; + break; + case AV_CODEC_ID_PCM_S16LE: + flags |= FLV_CODECID_PCM_LE | FLV_SAMPLESSIZE_16BIT; + break; + case AV_CODEC_ID_ADPCM_SWF: + flags |= FLV_CODECID_ADPCM | FLV_SAMPLESSIZE_16BIT; + break; + case AV_CODEC_ID_NELLYMOSER: + if (par->sample_rate == 8000) + flags |= FLV_CODECID_NELLYMOSER_8KHZ_MONO | FLV_SAMPLESSIZE_16BIT; + else if (par->sample_rate == 16000) + flags |= FLV_CODECID_NELLYMOSER_16KHZ_MONO | FLV_SAMPLESSIZE_16BIT; + else + flags |= FLV_CODECID_NELLYMOSER | FLV_SAMPLESSIZE_16BIT; + break; + case AV_CODEC_ID_PCM_MULAW: + flags = FLV_CODECID_PCM_MULAW | FLV_SAMPLERATE_SPECIAL | FLV_SAMPLESSIZE_16BIT; + break; + case AV_CODEC_ID_PCM_ALAW: + flags = FLV_CODECID_PCM_ALAW | FLV_SAMPLERATE_SPECIAL | FLV_SAMPLESSIZE_16BIT; + break; + case 0: + flags |= par->codec_tag << 4; + break; + default: + av_log(s, AV_LOG_ERROR, "Audio codec '%s' not compatible with FLV\n", + avcodec_get_name(par->codec_id)); + return AVERROR(EINVAL); + } + + return flags; +} + +static void put_amf_string(AVIOContext *pb, const char *str) +{ + size_t len = strlen(str); + avio_wb16(pb, len); + avio_write(pb, str, len); +} + +// FLV timestamps are 32 bits signed, RTMP timestamps should be 32-bit unsigned +static void put_timestamp(AVIOContext *pb, int64_t ts) { + avio_wb24(pb, ts & 0xFFFFFF); + avio_w8(pb, (ts >> 24) & 0x7F); +} + +static void put_avc_eos_tag(AVIOContext *pb, unsigned ts) +{ + avio_w8(pb, FLV_TAG_TYPE_VIDEO); + avio_wb24(pb, 5); /* Tag Data Size */ + put_timestamp(pb, ts); + avio_wb24(pb, 0); /* StreamId = 0 */ + avio_w8(pb, 23); /* ub[4] FrameType = 1, ub[4] CodecId = 7 */ + avio_w8(pb, 2); /* AVC end of sequence */ + avio_wb24(pb, 0); /* Always 0 for AVC EOS. */ + avio_wb32(pb, 16); /* Size of FLV tag */ +} + +static void put_amf_double(AVIOContext *pb, double d) +{ + avio_w8(pb, AMF_DATA_TYPE_NUMBER); + avio_wb64(pb, av_double2int(d)); +} + +static void put_amf_byte(AVIOContext *pb, unsigned char abyte) +{ + avio_w8(pb, abyte); +} + +static void put_amf_dword_array(AVIOContext *pb, uint32_t dw) +{ + avio_w8(pb, AMF_DATA_TYPE_ARRAY); + avio_wb32(pb, dw); +} + +static void put_amf_bool(AVIOContext *pb, int b) +{ + avio_w8(pb, AMF_DATA_TYPE_BOOL); + avio_w8(pb, !!b); +} + +static void write_metadata(AVFormatContext *s, unsigned int ts) +{ + AVIOContext *pb = s->pb; + FLVContext *flv = s->priv_data; + int write_duration_filesize = !(flv->flags & FLV_NO_DURATION_FILESIZE); + int metadata_count = 0; + int64_t metadata_count_pos; + AVDictionaryEntry *tag = NULL; + + /* write meta_tag */ + avio_w8(pb, FLV_TAG_TYPE_META); // tag type META + flv->metadata_size_pos = avio_tell(pb); + avio_wb24(pb, 0); // size of data part (sum of all parts below) + avio_wb24(pb, ts); // timestamp + avio_wb32(pb, 0); // reserved + + /* now data of data_size size */ + + /* first event name as a string */ + avio_w8(pb, AMF_DATA_TYPE_STRING); + put_amf_string(pb, "onMetaData"); // 12 bytes + + /* mixed array (hash) with size and string/type/data tuples */ + avio_w8(pb, AMF_DATA_TYPE_MIXEDARRAY); + metadata_count_pos = avio_tell(pb); + metadata_count = 4 * !!flv->video_par + + 5 * !!flv->audio_par + + 1 * !!flv->data_par; + if (write_duration_filesize) { + metadata_count += 2; // +2 for duration and file size + } + avio_wb32(pb, metadata_count); + + if (write_duration_filesize) { + put_amf_string(pb, "duration"); + flv->duration_offset = avio_tell(pb); + // fill in the guessed duration, it'll be corrected later if incorrect + put_amf_double(pb, s->duration / AV_TIME_BASE); + } + + if (flv->video_par) { + put_amf_string(pb, "width"); + put_amf_double(pb, flv->video_par->width); + + put_amf_string(pb, "height"); + put_amf_double(pb, flv->video_par->height); + + put_amf_string(pb, "videodatarate"); + put_amf_double(pb, flv->video_par->bit_rate / 1024.0); + + if (flv->framerate != 0.0) { + put_amf_string(pb, "framerate"); + put_amf_double(pb, flv->framerate); + metadata_count++; + } + + put_amf_string(pb, "videocodecid"); + put_amf_double(pb, flv->video_par->codec_tag); + } + + if (flv->audio_par) { + put_amf_string(pb, "audiodatarate"); + put_amf_double(pb, flv->audio_par->bit_rate / 1024.0); + + put_amf_string(pb, "audiosamplerate"); + put_amf_double(pb, flv->audio_par->sample_rate); + + put_amf_string(pb, "audiosamplesize"); + put_amf_double(pb, flv->audio_par->codec_id == AV_CODEC_ID_PCM_U8 ? 8 : 16); + + put_amf_string(pb, "stereo"); + put_amf_bool(pb, flv->audio_par->channels == 2); + + put_amf_string(pb, "audiocodecid"); + put_amf_double(pb, flv->audio_par->codec_tag); + } + + if (flv->data_par) { + put_amf_string(pb, "datastream"); + put_amf_double(pb, 0.0); + } + + ff_standardize_creation_time(s); + while ((tag = av_dict_get(s->metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) { + if( !strcmp(tag->key, "width") + ||!strcmp(tag->key, "height") + ||!strcmp(tag->key, "videodatarate") + ||!strcmp(tag->key, "framerate") + ||!strcmp(tag->key, "videocodecid") + ||!strcmp(tag->key, "audiodatarate") + ||!strcmp(tag->key, "audiosamplerate") + ||!strcmp(tag->key, "audiosamplesize") + ||!strcmp(tag->key, "stereo") + ||!strcmp(tag->key, "audiocodecid") + ||!strcmp(tag->key, "duration") + ||!strcmp(tag->key, "onMetaData") + ||!strcmp(tag->key, "datasize") + ||!strcmp(tag->key, "lasttimestamp") + ||!strcmp(tag->key, "totalframes") + ||!strcmp(tag->key, "hasAudio") + ||!strcmp(tag->key, "hasVideo") + ||!strcmp(tag->key, "hasCuePoints") + ||!strcmp(tag->key, "hasMetadata") + ||!strcmp(tag->key, "hasKeyframes") + ){ + av_log(s, AV_LOG_DEBUG, "Ignoring metadata for %s\n", tag->key); + continue; + } + put_amf_string(pb, tag->key); + avio_w8(pb, AMF_DATA_TYPE_STRING); + put_amf_string(pb, tag->value); + metadata_count++; + } + + if (write_duration_filesize) { + put_amf_string(pb, "filesize"); + flv->filesize_offset = avio_tell(pb); + put_amf_double(pb, 0); // delayed write + } + + if (flv->flags & FLV_ADD_KEYFRAME_INDEX) { + flv->acurframeindex = 0; + flv->keyframe_index_size = 0; + + put_amf_string(pb, "hasVideo"); + put_amf_bool(pb, !!flv->video_par); + metadata_count++; + + put_amf_string(pb, "hasKeyframes"); + put_amf_bool(pb, 1); + metadata_count++; + + put_amf_string(pb, "hasAudio"); + put_amf_bool(pb, !!flv->audio_par); + metadata_count++; + + put_amf_string(pb, "hasMetadata"); + put_amf_bool(pb, 1); + metadata_count++; + + put_amf_string(pb, "canSeekToEnd"); + put_amf_bool(pb, 1); + metadata_count++; + + put_amf_string(pb, "datasize"); + flv->datasize_offset = avio_tell(pb); + flv->datasize = 0; + put_amf_double(pb, flv->datasize); + metadata_count++; + + put_amf_string(pb, "videosize"); + flv->videosize_offset = avio_tell(pb); + flv->videosize = 0; + put_amf_double(pb, flv->videosize); + metadata_count++; + + put_amf_string(pb, "audiosize"); + flv->audiosize_offset = avio_tell(pb); + flv->audiosize = 0; + put_amf_double(pb, flv->audiosize); + metadata_count++; + + put_amf_string(pb, "lasttimestamp"); + flv->lasttimestamp_offset = avio_tell(pb); + flv->lasttimestamp = 0; + put_amf_double(pb, 0); + metadata_count++; + + put_amf_string(pb, "lastkeyframetimestamp"); + flv->lastkeyframetimestamp_offset = avio_tell(pb); + flv->lastkeyframetimestamp = 0; + put_amf_double(pb, 0); + metadata_count++; + + put_amf_string(pb, "lastkeyframelocation"); + flv->lastkeyframelocation_offset = avio_tell(pb); + flv->lastkeyframelocation = 0; + put_amf_double(pb, 0); + metadata_count++; + + put_amf_string(pb, "keyframes"); + put_amf_byte(pb, AMF_DATA_TYPE_OBJECT); + metadata_count++; + + flv->keyframes_info_offset = avio_tell(pb); + } + + put_amf_string(pb, ""); + avio_w8(pb, AMF_END_OF_OBJECT); + + /* write total size of tag */ + flv->metadata_totalsize = avio_tell(pb) - flv->metadata_size_pos - 10; + + avio_seek(pb, metadata_count_pos, SEEK_SET); + avio_wb32(pb, metadata_count); + + avio_seek(pb, flv->metadata_size_pos, SEEK_SET); + avio_wb24(pb, flv->metadata_totalsize); + avio_skip(pb, flv->metadata_totalsize + 10 - 3); + flv->metadata_totalsize_pos = avio_tell(pb); + avio_wb32(pb, flv->metadata_totalsize + 11); +} + +static int unsupported_codec(AVFormatContext *s, + const char* type, int codec_id) +{ + const AVCodecDescriptor *desc = avcodec_descriptor_get(codec_id); + av_log(s, AV_LOG_ERROR, + "%s codec %s not compatible with flv\n", + type, + desc ? desc->name : "unknown"); + return AVERROR(ENOSYS); +} + +static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, int64_t ts) { + int64_t data_size; + AVIOContext *pb = s->pb; + FLVContext *flv = s->priv_data; + + if (par->codec_id == AV_CODEC_ID_AAC || par->codec_id == AV_CODEC_ID_H264 + || par->codec_id == AV_CODEC_ID_MPEG4 + || par->codec_id == AV_CODEC_ID_HEVC) { + int64_t pos; + avio_w8(pb, + par->codec_type == AVMEDIA_TYPE_VIDEO ? + FLV_TAG_TYPE_VIDEO : FLV_TAG_TYPE_AUDIO); + avio_wb24(pb, 0); // size patched later + put_timestamp(pb, ts); + avio_wb24(pb, 0); // streamid + pos = avio_tell(pb); + if (par->codec_id == AV_CODEC_ID_AAC) { + avio_w8(pb, get_audio_flags(s, par)); + avio_w8(pb, 0); // AAC sequence header + + if (!par->extradata_size && (flv->flags & FLV_AAC_SEQ_HEADER_DETECT)) { + PutBitContext pbc; + int samplerate_index; + int channels = flv->audio_par->channels + - (flv->audio_par->channels == 8 ? 1 : 0); + uint8_t data[2]; + + for (samplerate_index = 0; samplerate_index < 16; + samplerate_index++) + if (flv->audio_par->sample_rate + == mpeg4audio_sample_rates[samplerate_index]) + break; + + init_put_bits(&pbc, data, sizeof(data)); + put_bits(&pbc, 5, flv->audio_par->profile + 1); //profile + put_bits(&pbc, 4, samplerate_index); //sample rate index + put_bits(&pbc, 4, channels); + put_bits(&pbc, 1, 0); //frame length - 1024 samples + put_bits(&pbc, 1, 0); //does not depend on core coder + put_bits(&pbc, 1, 0); //is not extension + flush_put_bits(&pbc); + + avio_w8(pb, data[0]); + avio_w8(pb, data[1]); + + av_log(s, AV_LOG_WARNING, "AAC sequence header: %02x %02x.\n", + data[0], data[1]); + } + avio_write(pb, par->extradata, par->extradata_size); + } else { + avio_w8(pb, par->codec_tag | FLV_FRAME_KEY); // flags + avio_w8(pb, 0); // AVC sequence header + avio_wb24(pb, 0); // composition time + //ff_isom_write_avcc(pb, par->extradata, par->extradata_size); + if(par->codec_id == AV_CODEC_ID_HEVC) + { + ff_isom_write_hvcc(pb, par->extradata, par->extradata_size, 0); + } + else + { + ff_isom_write_avcc(pb, par->extradata, par->extradata_size); + } + } + data_size = avio_tell(pb) - pos; + avio_seek(pb, -data_size - 10, SEEK_CUR); + avio_wb24(pb, data_size); + avio_skip(pb, data_size + 10 - 3); + avio_wb32(pb, data_size + 11); // previous tag size + } +} + +static int flv_append_keyframe_info(AVFormatContext *s, FLVContext *flv, double ts, int64_t pos) +{ + FLVFileposition *position = av_malloc(sizeof(FLVFileposition)); + + if (!position) { + av_log(s, AV_LOG_WARNING, "no mem for add keyframe index!\n"); + return AVERROR(ENOMEM); + } + + position->keyframe_timestamp = ts; + position->keyframe_position = pos; + + if (!flv->filepositions_count) { + flv->filepositions = position; + flv->head_filepositions = flv->filepositions; + position->next = NULL; + } else { + flv->filepositions->next = position; + position->next = NULL; + flv->filepositions = flv->filepositions->next; + } + + flv->filepositions_count++; + + return 0; +} + +static int shift_data(AVFormatContext *s) +{ + int ret = 0; + int n = 0; + int64_t metadata_size = 0; + FLVContext *flv = s->priv_data; + int64_t pos, pos_end = avio_tell(s->pb); + uint8_t *buf, *read_buf[2]; + int read_buf_id = 0; + int read_size[2]; + AVIOContext *read_pb; + + metadata_size = flv->filepositions_count * 9 * 2 + 10; /* filepositions and times value */ + metadata_size += 2 + 13; /* filepositions String */ + metadata_size += 2 + 5; /* times String */ + metadata_size += 3; /* Object end */ + + flv->keyframe_index_size = metadata_size; + + if (metadata_size < 0) + return metadata_size; + + buf = av_malloc_array(metadata_size, 2); + if (!buf) { + return AVERROR(ENOMEM); + } + read_buf[0] = buf; + read_buf[1] = buf + metadata_size; + + avio_seek(s->pb, flv->metadata_size_pos, SEEK_SET); + avio_wb24(s->pb, flv->metadata_totalsize + metadata_size); + + avio_seek(s->pb, flv->metadata_totalsize_pos, SEEK_SET); + avio_wb32(s->pb, flv->metadata_totalsize + 11 + metadata_size); + avio_seek(s->pb, pos_end, SEEK_SET); + + /* Shift the data: the AVIO context of the output can only be used for + * writing, so we re-open the same output, but for reading. It also avoids + * a read/seek/write/seek back and forth. */ + avio_flush(s->pb); + ret = s->io_open(s, &read_pb, s->url, AVIO_FLAG_READ, NULL); + if (ret < 0) { + av_log(s, AV_LOG_ERROR, "Unable to re-open %s output file for " + "the second pass (add_keyframe_index)\n", s->url); + goto end; + } + + /* mark the end of the shift to up to the last data we wrote, and get ready + * for writing */ + pos_end = avio_tell(s->pb); + avio_seek(s->pb, flv->keyframes_info_offset + metadata_size, SEEK_SET); + + /* start reading at where the keyframe index information will be placed */ + avio_seek(read_pb, flv->keyframes_info_offset, SEEK_SET); + pos = avio_tell(read_pb); + +#define READ_BLOCK do { \ + read_size[read_buf_id] = avio_read(read_pb, read_buf[read_buf_id], metadata_size); \ + read_buf_id ^= 1; \ +} while (0) + + /* shift data by chunk of at most keyframe *filepositions* and *times* size */ + READ_BLOCK; + do { + READ_BLOCK; + n = read_size[read_buf_id]; + if (n < 0) + break; + avio_write(s->pb, read_buf[read_buf_id], n); + pos += n; + } while (pos <= pos_end); + + ff_format_io_close(s, &read_pb); + +end: + av_free(buf); + return ret; +} + +static int flv_init(struct AVFormatContext *s) +{ + int i; + FLVContext *flv = s->priv_data; + + for (i = 0; i < s->nb_streams; i++) { + AVCodecParameters *par = s->streams[i]->codecpar; + FLVStreamContext *sc; + switch (par->codec_type) { + case AVMEDIA_TYPE_VIDEO: + if (s->streams[i]->avg_frame_rate.den && + s->streams[i]->avg_frame_rate.num) { + flv->framerate = av_q2d(s->streams[i]->avg_frame_rate); + } + if (flv->video_par) { + av_log(s, AV_LOG_ERROR, + "at most one video stream is supported in flv\n"); + return AVERROR(EINVAL); + } + flv->video_par = par; + if (!ff_codec_get_tag(flv_video_codec_ids, par->codec_id)) + return unsupported_codec(s, "Video", par->codec_id); + + if (par->codec_id == AV_CODEC_ID_MPEG4 || + par->codec_id == AV_CODEC_ID_H263) { + int error = s->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL; + av_log(s, error ? AV_LOG_ERROR : AV_LOG_WARNING, + "Codec %s is not supported in the official FLV specification,\n", avcodec_get_name(par->codec_id)); + + if (error) { + av_log(s, AV_LOG_ERROR, + "use vstrict=-1 / -strict -1 to use it anyway.\n"); + return AVERROR(EINVAL); + } + } else if (par->codec_id == AV_CODEC_ID_VP6) { + av_log(s, AV_LOG_WARNING, + "Muxing VP6 in flv will produce flipped video on playback.\n"); + } + break; + case AVMEDIA_TYPE_AUDIO: + if (flv->audio_par) { + av_log(s, AV_LOG_ERROR, + "at most one audio stream is supported in flv\n"); + return AVERROR(EINVAL); + } + flv->audio_par = par; + if (get_audio_flags(s, par) < 0) + return unsupported_codec(s, "Audio", par->codec_id); + if (par->codec_id == AV_CODEC_ID_PCM_S16BE) + av_log(s, AV_LOG_WARNING, + "16-bit big-endian audio in flv is valid but most likely unplayable (hardware dependent); use s16le\n"); + break; + case AVMEDIA_TYPE_DATA: + if (par->codec_id != AV_CODEC_ID_TEXT && par->codec_id != AV_CODEC_ID_NONE) + return unsupported_codec(s, "Data", par->codec_id); + flv->data_par = par; + break; + case AVMEDIA_TYPE_SUBTITLE: + if (par->codec_id != AV_CODEC_ID_TEXT) { + av_log(s, AV_LOG_ERROR, "Subtitle codec '%s' for stream %d is not compatible with FLV\n", + avcodec_get_name(par->codec_id), i); + return AVERROR_INVALIDDATA; + } + flv->data_par = par; + break; + default: + av_log(s, AV_LOG_ERROR, "Codec type '%s' for stream %d is not compatible with FLV\n", + av_get_media_type_string(par->codec_type), i); + return AVERROR(EINVAL); + } + avpriv_set_pts_info(s->streams[i], 32, 1, 1000); /* 32 bit pts in ms */ + + sc = av_mallocz(sizeof(FLVStreamContext)); + if (!sc) + return AVERROR(ENOMEM); + s->streams[i]->priv_data = sc; + sc->last_ts = -1; + } + + flv->delay = AV_NOPTS_VALUE; + + return 0; +} + +static int flv_write_header(AVFormatContext *s) +{ + int i; + AVIOContext *pb = s->pb; + FLVContext *flv = s->priv_data; + + avio_write(pb, "FLV", 3); + avio_w8(pb, 1); + avio_w8(pb, FLV_HEADER_FLAG_HASAUDIO * !!flv->audio_par + + FLV_HEADER_FLAG_HASVIDEO * !!flv->video_par); + avio_wb32(pb, 9); + avio_wb32(pb, 0); + + for (i = 0; i < s->nb_streams; i++) + if (s->streams[i]->codecpar->codec_tag == 5) { + avio_w8(pb, 8); // message type + avio_wb24(pb, 0); // include flags + avio_wb24(pb, 0); // time stamp + avio_wb32(pb, 0); // reserved + avio_wb32(pb, 11); // size + flv->reserved = 5; + } + + if (flv->flags & FLV_NO_METADATA) { + pb->seekable = 0; + } else { + write_metadata(s, 0); + } + + for (i = 0; i < s->nb_streams; i++) { + flv_write_codec_header(s, s->streams[i]->codecpar, 0); + } + + flv->datastart_offset = avio_tell(pb); + return 0; +} + +static int flv_write_trailer(AVFormatContext *s) +{ + int64_t file_size; + AVIOContext *pb = s->pb; + FLVContext *flv = s->priv_data; + int build_keyframes_idx = flv->flags & FLV_ADD_KEYFRAME_INDEX; + int i, res; + int64_t cur_pos = avio_tell(s->pb); + + if (build_keyframes_idx) { + FLVFileposition *newflv_posinfo, *p; + + avio_seek(pb, flv->videosize_offset, SEEK_SET); + put_amf_double(pb, flv->videosize); + + avio_seek(pb, flv->audiosize_offset, SEEK_SET); + put_amf_double(pb, flv->audiosize); + + avio_seek(pb, flv->lasttimestamp_offset, SEEK_SET); + put_amf_double(pb, flv->lasttimestamp); + + avio_seek(pb, flv->lastkeyframetimestamp_offset, SEEK_SET); + put_amf_double(pb, flv->lastkeyframetimestamp); + + avio_seek(pb, flv->lastkeyframelocation_offset, SEEK_SET); + put_amf_double(pb, flv->lastkeyframelocation + flv->keyframe_index_size); + avio_seek(pb, cur_pos, SEEK_SET); + + res = shift_data(s); + if (res < 0) { + goto end; + } + avio_seek(pb, flv->keyframes_info_offset, SEEK_SET); + put_amf_string(pb, "filepositions"); + put_amf_dword_array(pb, flv->filepositions_count); + for (newflv_posinfo = flv->head_filepositions; newflv_posinfo; newflv_posinfo = newflv_posinfo->next) { + put_amf_double(pb, newflv_posinfo->keyframe_position + flv->keyframe_index_size); + } + + put_amf_string(pb, "times"); + put_amf_dword_array(pb, flv->filepositions_count); + for (newflv_posinfo = flv->head_filepositions; newflv_posinfo; newflv_posinfo = newflv_posinfo->next) { + put_amf_double(pb, newflv_posinfo->keyframe_timestamp); + } + + newflv_posinfo = flv->head_filepositions; + while (newflv_posinfo) { + p = newflv_posinfo->next; + if (p) { + newflv_posinfo->next = p->next; + av_free(p); + p = NULL; + } else { + av_free(newflv_posinfo); + newflv_posinfo = NULL; + } + } + + put_amf_string(pb, ""); + avio_w8(pb, AMF_END_OF_OBJECT); + + avio_seek(pb, cur_pos + flv->keyframe_index_size, SEEK_SET); + } + +end: + if (flv->flags & FLV_NO_SEQUENCE_END) { + av_log(s, AV_LOG_DEBUG, "FLV no sequence end mode open\n"); + } else { + /* Add EOS tag */ + for (i = 0; i < s->nb_streams; i++) { + AVCodecParameters *par = s->streams[i]->codecpar; + FLVStreamContext *sc = s->streams[i]->priv_data; + if (par->codec_type == AVMEDIA_TYPE_VIDEO && + (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC)) + put_avc_eos_tag(pb, sc->last_ts); + } + } + + file_size = avio_tell(pb); + + if (build_keyframes_idx) { + flv->datasize = file_size - flv->datastart_offset; + avio_seek(pb, flv->datasize_offset, SEEK_SET); + put_amf_double(pb, flv->datasize); + } + if (!(flv->flags & FLV_NO_METADATA)) { + if (!(flv->flags & FLV_NO_DURATION_FILESIZE)) { + /* update information */ + if (avio_seek(pb, flv->duration_offset, SEEK_SET) < 0) { + av_log(s, AV_LOG_WARNING, "Failed to update header with correct duration.\n"); + } else { + put_amf_double(pb, flv->duration / (double)1000); + } + if (avio_seek(pb, flv->filesize_offset, SEEK_SET) < 0) { + av_log(s, AV_LOG_WARNING, "Failed to update header with correct filesize.\n"); + } else { + put_amf_double(pb, file_size); + } + } + } + + return 0; +} + +static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) +{ + AVIOContext *pb = s->pb; + AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar; + FLVContext *flv = s->priv_data; + FLVStreamContext *sc = s->streams[pkt->stream_index]->priv_data; + unsigned ts; + int size = pkt->size; + uint8_t *data = NULL; + int flags = -1, flags_size, ret; + int64_t cur_offset = avio_tell(pb); + + if (par->codec_type == AVMEDIA_TYPE_AUDIO && !pkt->size) { + av_log(s, AV_LOG_WARNING, "Empty audio Packet\n"); + return AVERROR(EINVAL); + } + + if (par->codec_id == AV_CODEC_ID_VP6F || par->codec_id == AV_CODEC_ID_VP6A || + par->codec_id == AV_CODEC_ID_VP6 || par->codec_id == AV_CODEC_ID_AAC) + flags_size = 2; + else if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) + { + flags_size = 5; + } + else + { + flags_size = 1; + } + + /* + if (par->codec_id == AV_CODEC_ID_AAC || par->codec_id == AV_CODEC_ID_H264 + || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) { + int side_size = 0; + uint8_t *side = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, &side_size); + if (side && side_size > 0 && (side_size != par->extradata_size || memcmp(side, par->extradata, side_size))) { + av_free(par->extradata); + par->extradata = av_mallocz(side_size + AV_INPUT_BUFFER_PADDING_SIZE); + if (!par->extradata) { + par->extradata_size = 0; + return AVERROR(ENOMEM); + } + memcpy(par->extradata, side, side_size); + par->extradata_size = side_size; + flv_write_codec_header(s, par, pkt->dts); + } + } + */ + if (par->codec_id == AV_CODEC_ID_AAC || par->codec_id == AV_CODEC_ID_H264 + || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) { + int side_size = 0; + uint8_t *side = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, &side_size); + if (side && side_size > 0 && (side_size != par->extradata_size || memcmp(side, par->extradata, side_size))) { + av_free(par->extradata); + par->extradata = av_mallocz(side_size + AV_INPUT_BUFFER_PADDING_SIZE); + if (!par->extradata) { + par->extradata_size = 0; + return AVERROR(ENOMEM); + } + memcpy(par->extradata, side, side_size); + par->extradata_size = side_size; + flv_write_codec_header(s, par, pkt->dts); + } else { + flv_write_codec_header(s, par, pkt->dts); + } + } + + if (flv->delay == AV_NOPTS_VALUE) + flv->delay = -pkt->dts; + + if (pkt->dts < -flv->delay) { + av_log(s, AV_LOG_WARNING, + "Packets are not in the proper order with respect to DTS\n"); + return AVERROR(EINVAL); + } + if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4) { + if (pkt->pts == AV_NOPTS_VALUE) { + av_log(s, AV_LOG_ERROR, "Packet is missing PTS\n"); + return AVERROR(EINVAL); + } + } + + ts = pkt->dts; + + if (s->event_flags & AVSTREAM_EVENT_FLAG_METADATA_UPDATED) { + write_metadata(s, ts); + s->event_flags &= ~AVSTREAM_EVENT_FLAG_METADATA_UPDATED; + } + + avio_write_marker(pb, av_rescale(ts, AV_TIME_BASE, 1000), + pkt->flags & AV_PKT_FLAG_KEY && (flv->video_par ? par->codec_type == AVMEDIA_TYPE_VIDEO : 1) ? AVIO_DATA_MARKER_SYNC_POINT : AVIO_DATA_MARKER_BOUNDARY_POINT); + + switch (par->codec_type) { + case AVMEDIA_TYPE_VIDEO: + avio_w8(pb, FLV_TAG_TYPE_VIDEO); + + flags = ff_codec_get_tag(flv_video_codec_ids, par->codec_id); + + flags |= pkt->flags & AV_PKT_FLAG_KEY ? FLV_FRAME_KEY : FLV_FRAME_INTER; + break; + case AVMEDIA_TYPE_AUDIO: + flags = get_audio_flags(s, par); + + av_assert0(size); + + avio_w8(pb, FLV_TAG_TYPE_AUDIO); + break; + case AVMEDIA_TYPE_SUBTITLE: + case AVMEDIA_TYPE_DATA: + avio_w8(pb, FLV_TAG_TYPE_META); + break; + default: + return AVERROR(EINVAL); + } + + if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4) { + /* check if extradata looks like mp4 formatted */ + if (par->extradata_size > 0 && *(uint8_t*)par->extradata != 1) + if ((ret = ff_avc_parse_nal_units_buf(pkt->data, &data, &size)) < 0) + return ret; + } else if (par->codec_id == AV_CODEC_ID_HEVC) + { + if (par->extradata_size > 0 && *(uint8_t*)par->extradata != 1) + if ((ret = ff_hevc_annexb2mp4_buf(pkt->data, &data, &size, 0, NULL)) < 0) + return ret; + } + else if (par->codec_id == AV_CODEC_ID_AAC && pkt->size > 2 && + (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) { + if (!s->streams[pkt->stream_index]->nb_frames) { + av_log(s, AV_LOG_ERROR, "Malformed AAC bitstream detected: " + "use the audio bitstream filter 'aac_adtstoasc' to fix it " + "('-bsf:a aac_adtstoasc' option with ffmpeg)\n"); + return AVERROR_INVALIDDATA; + } + av_log(s, AV_LOG_WARNING, "aac bitstream error\n"); + } + + /* check Speex packet duration */ + if (par->codec_id == AV_CODEC_ID_SPEEX && ts - sc->last_ts > 160) + av_log(s, AV_LOG_WARNING, "Warning: Speex stream has more than " + "8 frames per packet. Adobe Flash " + "Player cannot handle this!\n"); + + if (sc->last_ts < ts) + sc->last_ts = ts; + + if (size + flags_size >= 1<<24) { + av_log(s, AV_LOG_ERROR, "Too large packet with size %u >= %u\n", + size + flags_size, 1<<24); + return AVERROR(EINVAL); + } + + avio_wb24(pb, size + flags_size); + put_timestamp(pb, ts); + avio_wb24(pb, flv->reserved); + + if (par->codec_type == AVMEDIA_TYPE_DATA || + par->codec_type == AVMEDIA_TYPE_SUBTITLE ) { + int data_size; + int64_t metadata_size_pos = avio_tell(pb); + if (par->codec_id == AV_CODEC_ID_TEXT) { + // legacy FFmpeg magic? + avio_w8(pb, AMF_DATA_TYPE_STRING); + put_amf_string(pb, "onTextData"); + avio_w8(pb, AMF_DATA_TYPE_MIXEDARRAY); + avio_wb32(pb, 2); + put_amf_string(pb, "type"); + avio_w8(pb, AMF_DATA_TYPE_STRING); + put_amf_string(pb, "Text"); + put_amf_string(pb, "text"); + avio_w8(pb, AMF_DATA_TYPE_STRING); + put_amf_string(pb, pkt->data); + put_amf_string(pb, ""); + avio_w8(pb, AMF_END_OF_OBJECT); + } else { + // just pass the metadata through + avio_write(pb, data ? data : pkt->data, size); + } + /* write total size of tag */ + data_size = avio_tell(pb) - metadata_size_pos; + avio_seek(pb, metadata_size_pos - 10, SEEK_SET); + avio_wb24(pb, data_size); + avio_seek(pb, data_size + 10 - 3, SEEK_CUR); + avio_wb32(pb, data_size + 11); + } else { + av_assert1(flags>=0); + avio_w8(pb,flags); + if (par->codec_id == AV_CODEC_ID_VP6) + avio_w8(pb,0); + if (par->codec_id == AV_CODEC_ID_VP6F || par->codec_id == AV_CODEC_ID_VP6A) { + if (par->extradata_size) + avio_w8(pb, par->extradata[0]); + else + avio_w8(pb, ((FFALIGN(par->width, 16) - par->width) << 4) | + (FFALIGN(par->height, 16) - par->height)); + } else if (par->codec_id == AV_CODEC_ID_AAC) { + avio_w8(pb, 1); // AAC raw + } + else if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) { + avio_w8(pb, 1); // AVC NALU + avio_wb24(pb, pkt->pts - pkt->dts); + } + + avio_write(pb, data ? data : pkt->data, size); + + avio_wb32(pb, size + flags_size + 11); // previous tag size + flv->duration = FFMAX(flv->duration, + pkt->pts + flv->delay + pkt->duration); + } + + if (flv->flags & FLV_ADD_KEYFRAME_INDEX) { + switch (par->codec_type) { + case AVMEDIA_TYPE_VIDEO: + flv->videosize += (avio_tell(pb) - cur_offset); + flv->lasttimestamp = flv->acurframeindex / flv->framerate; + if (pkt->flags & AV_PKT_FLAG_KEY) { + double ts = flv->acurframeindex / flv->framerate; + int64_t pos = cur_offset; + + flv->lastkeyframetimestamp = flv->acurframeindex / flv->framerate; + flv->lastkeyframelocation = pos; + flv_append_keyframe_info(s, flv, ts, pos); + } + flv->acurframeindex++; + break; + + case AVMEDIA_TYPE_AUDIO: + flv->audiosize += (avio_tell(pb) - cur_offset); + break; + + default: + av_log(s, AV_LOG_WARNING, "par->codec_type is type = [%d]\n", par->codec_type); + break; + } + } + + av_free(data); + + return pb->error; +} + +static int flv_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) +{ + int ret = 1; + AVStream *st = s->streams[pkt->stream_index]; + + if (st->codecpar->codec_id == AV_CODEC_ID_AAC) { + if (pkt->size > 2 && (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) + ret = ff_stream_add_bitstream_filter(st, "aac_adtstoasc", NULL); + } + return ret; +} + +static const AVOption options[] = { + { "flvflags", "FLV muxer flags", offsetof(FLVContext, flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "flvflags" }, + { "aac_seq_header_detect", "Put AAC sequence header based on stream data", 0, AV_OPT_TYPE_CONST, {.i64 = FLV_AAC_SEQ_HEADER_DETECT}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "flvflags" }, + { "no_sequence_end", "disable sequence end for FLV", 0, AV_OPT_TYPE_CONST, {.i64 = FLV_NO_SEQUENCE_END}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "flvflags" }, + { "no_metadata", "disable metadata for FLV", 0, AV_OPT_TYPE_CONST, {.i64 = FLV_NO_METADATA}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "flvflags" }, + { "no_duration_filesize", "disable duration and filesize zero value metadata for FLV", 0, AV_OPT_TYPE_CONST, {.i64 = FLV_NO_DURATION_FILESIZE}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "flvflags" }, + { "add_keyframe_index", "Add keyframe index metadata", 0, AV_OPT_TYPE_CONST, {.i64 = FLV_ADD_KEYFRAME_INDEX}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "flvflags" }, + { NULL }, +}; + +static const AVClass flv_muxer_class = { + .class_name = "flv muxer", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; + +AVOutputFormat ff_flv_muxer = { + .name = "flv", + .long_name = NULL_IF_CONFIG_SMALL("FLV (Flash Video)"), + .mime_type = "video/x-flv", + .extensions = "flv", + .priv_data_size = sizeof(FLVContext), + .audio_codec = CONFIG_LIBMP3LAME ? AV_CODEC_ID_MP3 : AV_CODEC_ID_ADPCM_SWF, + .video_codec = AV_CODEC_ID_FLV1, + .init = flv_init, + .write_header = flv_write_header, + .write_packet = flv_write_packet, + .write_trailer = flv_write_trailer, + .check_bitstream= flv_check_bitstream, + .codec_tag = (const AVCodecTag* const []) { + flv_video_codec_ids, flv_audio_codec_ids, 0 + }, + .flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS | + AVFMT_TS_NONSTRICT, + .priv_class = &flv_muxer_class, +}; diff --git a/StreamMedia/flv_h265_patch/flv_h265_patch.rar b/StreamMedia/flv_h265_patch/flv_h265_patch.rar new file mode 100644 index 0000000..4e08106 Binary files /dev/null and b/StreamMedia/flv_h265_patch/flv_h265_patch.rar differ diff --git a/StreamMedia/flv_h265_patch/nginx_rtmp_module/ngx_rtmp_codec_module.c b/StreamMedia/flv_h265_patch/nginx_rtmp_module/ngx_rtmp_codec_module.c new file mode 100644 index 0000000..b9d74f3 --- /dev/null +++ b/StreamMedia/flv_h265_patch/nginx_rtmp_module/ngx_rtmp_codec_module.c @@ -0,0 +1,1382 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#include +#include +#include "ngx_rtmp_codec_module.h" +#include "ngx_rtmp_live_module.h" +#include "ngx_rtmp_cmd_module.h" +#include "ngx_rtmp_bitop.h" +#include "ngx_rbuf.h" + + +#define NGX_RTMP_CODEC_META_OFF 0 +#define NGX_RTMP_CODEC_META_ON 1 +#define NGX_RTMP_CODEC_META_COPY 2 + + +static void * ngx_rtmp_codec_create_app_conf(ngx_conf_t *cf); +static char * ngx_rtmp_codec_merge_app_conf(ngx_conf_t *cf, + void *parent, void *child); +static ngx_int_t ngx_rtmp_codec_postconfiguration(ngx_conf_t *cf); +static ngx_int_t ngx_rtmp_codec_reconstruct_meta(ngx_rtmp_session_t *s); +static ngx_int_t ngx_rtmp_codec_copy_meta(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_chain_t *in); +static ngx_int_t ngx_rtmp_codec_prepare_meta(ngx_rtmp_session_t *s, + uint32_t timestamp); +static void ngx_rtmp_codec_parse_aac_header(ngx_rtmp_session_t *s, + ngx_chain_t *in); +static void ngx_rtmp_codec_parse_avc_header(ngx_rtmp_session_t *s, + ngx_chain_t *in); +static void ngx_rtmp_codec_parse_hevc_header(ngx_rtmp_session_t *s, + ngx_chain_t *in); +#if (NGX_DEBUG) +static void ngx_rtmp_codec_dump_header(ngx_rtmp_session_t *s, const char *type, + ngx_chain_t *in); +#endif + + +typedef struct { + ngx_uint_t meta; +} ngx_rtmp_codec_app_conf_t; + + +static ngx_conf_enum_t ngx_rtmp_codec_meta_slots[] = { + { ngx_string("off"), NGX_RTMP_CODEC_META_OFF }, + { ngx_string("on"), NGX_RTMP_CODEC_META_ON }, + { ngx_string("copy"), NGX_RTMP_CODEC_META_COPY }, + { ngx_null_string, 0 } +}; + + +static ngx_command_t ngx_rtmp_codec_commands[] = { + + { ngx_string("meta"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_enum_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_codec_app_conf_t, meta), + &ngx_rtmp_codec_meta_slots }, + + ngx_null_command +}; + + +static ngx_rtmp_module_t ngx_rtmp_codec_module_ctx = { + NULL, /* preconfiguration */ + ngx_rtmp_codec_postconfiguration, /* postconfiguration */ + NULL, /* create main configuration */ + NULL, /* init main configuration */ + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + ngx_rtmp_codec_create_app_conf, /* create app configuration */ + ngx_rtmp_codec_merge_app_conf /* merge app configuration */ +}; + + +ngx_module_t ngx_rtmp_codec_module = { + NGX_MODULE_V1, + &ngx_rtmp_codec_module_ctx, /* module context */ + ngx_rtmp_codec_commands, /* module directives */ + NGX_RTMP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static const char * +audio_codecs[] = { + "", + "ADPCM", + "MP3", + "LinearLE", + "Nellymoser16", + "Nellymoser8", + "Nellymoser", + "G711A", + "G711U", + "", + "AAC", + "Speex", + "", + "", + "MP3-8K", + "DeviceSpecific", + "Uncompressed" +}; + + +static const char * +video_codecs[] = { + "", + "Jpeg", + "Sorenson-H263", + "ScreenVideo", + "On2-VP6", + "On2-VP6-Alpha", + "ScreenVideo2", + "H264", + "", + "", + "", + "", + "H265" +}; + + +u_char * +ngx_rtmp_get_audio_codec_name(ngx_uint_t id) +{ + return (u_char *)(id < sizeof(audio_codecs) / sizeof(audio_codecs[0]) + ? audio_codecs[id] + : ""); +} + + +u_char * +ngx_rtmp_get_video_codec_name(ngx_uint_t id) +{ + return (u_char *)(id < sizeof(video_codecs) / sizeof(video_codecs[0]) + ? video_codecs[id] + : ""); +} + + +static ngx_uint_t +ngx_rtmp_codec_get_next_version() +{ + ngx_uint_t v; + static ngx_uint_t version; + + do { + v = ++version; + } while (v == 0); + + return v; +} + + +static ngx_int_t +ngx_rtmp_codec_disconnect(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_codec_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + if (ctx == NULL) { + return NGX_OK; + } + + if (ctx->avc_header) { + ngx_rtmp_shared_free_frame(ctx->avc_header); + ctx->avc_header = NULL; + } + + if (ctx->aac_header) { + ngx_rtmp_shared_free_frame(ctx->aac_header); + ctx->aac_header = NULL; + } + + if (ctx->meta) { + ngx_rtmp_shared_free_frame(ctx->meta); + ctx->meta = NULL; + } + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_codec_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_core_srv_conf_t *cscf; + ngx_rtmp_core_app_conf_t *cacf; + ngx_rtmp_codec_ctx_t *ctx; + ngx_rtmp_frame_t **header; + uint8_t fmt; + u_char frametype; + static ngx_uint_t sample_rates[] = + { 5512, 11025, 22050, 44100 }; + + if (h->type != NGX_RTMP_MSG_AUDIO && h->type != NGX_RTMP_MSG_VIDEO) { + return NGX_OK; + } + + if (h->type == NGX_RTMP_MSG_VIDEO) { + frametype = in->buf->pos[0] & 0xf0; + if (frametype != 0x10 && frametype != 0x20) { + ngx_log_error(NGX_LOG_ERR, s->log, 0, + "codec: receive unkwnon frametype %02xD", frametype); + return NGX_OK; + } + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + if (ctx == NULL) { + ctx = ngx_pcalloc(s->pool, sizeof(ngx_rtmp_codec_ctx_t)); + ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_codec_module); + } + + /* save codec */ + if (in->buf->last - in->buf->pos < 1) { + return NGX_OK; + } + + fmt = in->buf->pos[0]; + if (h->type == NGX_RTMP_MSG_AUDIO) { + ctx->audio_codec_id = (fmt & 0xf0) >> 4; + ctx->audio_channels = (fmt & 0x01) + 1; + ctx->sample_size = (fmt & 0x02) ? 2 : 1; + + if (ctx->sample_rate == 0) { + ctx->sample_rate = sample_rates[(fmt & 0x0c) >> 2]; + } + s->acodec = ctx->audio_codec_id; + } else { + ctx->video_codec_id = (fmt & 0x0f); + s->vcodec = ctx->video_codec_id; + } + + /* save AVC/AAC header */ + if (in->buf->last - in->buf->pos < 3) { + return NGX_OK; + } + + /* no conf */ + if (!ngx_rtmp_is_codec_header(in)) { + return NGX_OK; + } + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + cacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_core_module); + header = NULL; + + if (h->type == NGX_RTMP_MSG_AUDIO) { + if (ctx->audio_codec_id == NGX_RTMP_AUDIO_AAC) { + header = &ctx->aac_header; + ngx_rtmp_codec_parse_aac_header(s, in); + } + } else { + if (ctx->video_codec_id == NGX_RTMP_VIDEO_H264) { + header = &ctx->avc_header; + ngx_rtmp_codec_parse_avc_header(s, in); + } //else if (ctx->video_codec_id == cacf->hevc_codec) { + if (ctx->video_codec_id == NGX_RTMP_VIDEO_H265) { + header = &ctx->avc_header; + ngx_rtmp_codec_parse_hevc_header(s, in); + } + } + + if (header == NULL) { + return NGX_OK; + } + + if (*header) { + ngx_rtmp_shared_free_frame(*header); + } + + *header = ngx_rtmp_shared_alloc_frame(cscf->chunk_size, in, 0); + + return NGX_OK; +} + + +static void +ngx_rtmp_codec_parse_aac_header(ngx_rtmp_session_t *s, ngx_chain_t *in) +{ + ngx_uint_t idx; + ngx_rtmp_codec_ctx_t *ctx; + ngx_rtmp_bit_reader_t br; + + static ngx_uint_t aac_sample_rates[] = + { 96000, 88200, 64000, 48000, + 44100, 32000, 24000, 22050, + 16000, 12000, 11025, 8000, + 7350, 0, 0, 0 }; + +#if (NGX_DEBUG) + ngx_rtmp_codec_dump_header(s, "aac", in); +#endif + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + ngx_rtmp_bit_init_reader(&br, in->buf->pos, in->buf->last); + + ngx_rtmp_bit_read(&br, 16); + + ctx->aac_profile = (ngx_uint_t) ngx_rtmp_bit_read(&br, 5); + if (ctx->aac_profile == 31) { + ctx->aac_profile = (ngx_uint_t) ngx_rtmp_bit_read(&br, 6) + 32; + } + + idx = (ngx_uint_t) ngx_rtmp_bit_read(&br, 4); + if (idx == 15) { + ctx->sample_rate = (ngx_uint_t) ngx_rtmp_bit_read(&br, 24); + } else { + ctx->sample_rate = aac_sample_rates[idx]; + } + + ctx->aac_chan_conf = (ngx_uint_t) ngx_rtmp_bit_read(&br, 4); + + if (ctx->aac_profile == 5 || ctx->aac_profile == 29) { + + if (ctx->aac_profile == 29) { + ctx->aac_ps = 1; + } + + ctx->aac_sbr = 1; + + idx = (ngx_uint_t) ngx_rtmp_bit_read(&br, 4); + if (idx == 15) { + ctx->sample_rate = (ngx_uint_t) ngx_rtmp_bit_read(&br, 24); + } else { + ctx->sample_rate = aac_sample_rates[idx]; + } + + ctx->aac_profile = (ngx_uint_t) ngx_rtmp_bit_read(&br, 5); + if (ctx->aac_profile == 31) { + ctx->aac_profile = (ngx_uint_t) ngx_rtmp_bit_read(&br, 6) + 32; + } + } + + /* MPEG-4 Audio Specific Config + + 5 bits: object type + if (object type == 31) + 6 bits + 32: object type + 4 bits: frequency index + if (frequency index == 15) + 24 bits: frequency + 4 bits: channel configuration + + if (object_type == 5) + 4 bits: frequency index + if (frequency index == 15) + 24 bits: frequency + 5 bits: object type + if (object type == 31) + 6 bits + 32: object type + + var bits: AOT Specific Config + */ + + ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->log, 0, + "codec: aac header profile=%ui, " + "sample_rate=%ui, chan_conf=%ui", + ctx->aac_profile, ctx->sample_rate, ctx->aac_chan_conf); +} + + +/* + * ITU-T H.265 7.3.1 General NAL unit syntax + */ +static ngx_int_t +ngx_rtmp_codec_parse_hevc_nal_to_rbsp(ngx_rtmp_session_t *s, u_char *p, + ngx_rtmp_bit_reader_t *br, ngx_uint_t nal_unit_type, + ngx_uint_t nal_unit_len) +{ + ngx_uint_t i, count, rbsp_bytes; + + /* + * nal_unit + * nal_unit_header() + * NumBytesInRbsp = 0 + * for (i = 2; i < NumBytesInNalUnit; i++) + * if (i + 2 < NumBytesInNalUnit && next_bits(24) == 0x000003) { + * rbsp_byte[NumBytesInRbsp++] + * rbsp_byte[NumBytesInRbsp++] + * i += 2 + * emulation_prevention_three_byte // equal to 0x03 + * } else + * rbsp_byte[NumBytesInRbsp++] + * + * nal_unit_header + * forbidden_zero_bit 1 bit + * nal_unit_type 6 bits + * nuh_layer_id 6 bits + * nuh_temporal_id_plus1 3 bits + * + * ITU-T H.265 7.4.2.1 + * emulation_prevention_three_byte is a byte equal to 0x03. + * When an emulation_prevention_three_byte is present in the NAL unit, + * it shall be discarded by the decoding process + * Within the NAL unit, the following three-byte sequences shall not + * occur at any byte-aligned position: + * 0x000000 + * 0x000001 + * 0x000002 + * Within the NAL unit, any four-byte sequence that starts with + * 0x000003 other than the following sequences shall not occur at + * any byte-aligned position: + * 0x00000300 + * 0x00000301 + * 0x00000302 + * 0x00000303 + */ + + ngx_rtmp_bit_read(br, 1); + if (ngx_rtmp_bit_read(br, 6) != nal_unit_type) { + ngx_log_error(NGX_LOG_ERR, s->log, 0, + "nal_unit_type not expect %ui", nal_unit_type); + return NGX_ERROR; + } + ngx_rtmp_bit_read(br, 6); + ngx_rtmp_bit_read(br, 3); + + count = 0; + rbsp_bytes = 0; + for (i = 0; i < nal_unit_len; ++i) { + if (count == 2) { /* already 0x0000 */ + if (br->pos[i] < 0x03) { + ngx_log_error(NGX_LOG_ERR, s->log, 0, + "three bytes sequence error"); + return NGX_ERROR; + } + + if (br->pos[i] == 0x03 && br->pos[i + 1] > 0x03) { + ngx_log_error(NGX_LOG_ERR, s->log, 0, + "four bytes sequence error"); + return NGX_ERROR; + } + + if (br->pos[i] == 0x03) { + count = 0; + continue; + } + } + + *p++ = br->pos[i]; + ++rbsp_bytes; + if (br->pos[i] == 0x00) { + ++count; + } else { + count = 0; + } + } + + return rbsp_bytes; +} + +/* + * ITU-T H.265 7.3.3 Profile, tier and level syntax + */ +static void +ngx_rtmp_codec_parse_hevc_ptl(ngx_rtmp_session_t *s, ngx_rtmp_bit_reader_t *br, + ngx_flag_t profilePresentFlag, ngx_uint_t maxNumSubLayersMinus1) +{ + ngx_uint_t i, slppf[8], sllpf[8]; + + if (profilePresentFlag) { + /* + * profile_tier_level + * general_profile_space 2 bits + * general_tier_flag 1 bit + * general_profile_idc 5 bits + * for (j = 0; j < 32; j++) + * general_profile_compatibility_flag[j] 1 bit + * general_progressive_source_flag 1 bit + * general_interlaced_source_flag 1 bit + * general_non_packed_constraint_flag 1 bit + * general_frame_only_constraint_flag 1 bit + * + * general_max_12bit_constraint_flag 1 bit + * general_max_10bit_constraint_flag 1 bit + * general_max_8bit_constraint_flag 1 bit + * general_max_422chroma_constraint_flag 1 bit + * general_max_420chroma_constraint_flag 1 bit + * general_max_monochrome_constraint_flag 1 bit + * general_intra_constraint_flag 1 bit + * general_one_picture_only_constraint_flag 1 bit + * general_lower_bit_rate_constraint_flag 1 bit + * general_reserved_zero_34bits 34 bits + * + * general_inbld_flag 1 bit + */ + ngx_rtmp_bit_read(br, 88); + } + + /* + * profile_tier_level + * general_level_idc 8 bits + */ + ngx_rtmp_bit_read(br, 8); + + /* + * profile_tier_level + * for(i = 0; i < maxNumSubLayersMinus1; i++) { + * sub_layer_profile_present_flag[i] 1 bit + * sub_layer_level_present_flag[i] 1 bit + * } + * + * if (maxNumSubLayersMinus1 > 0) + * for(i = maxNumSubLayersMinus1; i < 8; i++) + * reserved_zero_2bits[i] 2 bits + */ + for (i = 0; i < maxNumSubLayersMinus1; ++i) { + slppf[i] = ngx_rtmp_bit_read(br, 1); + sllpf[i] = ngx_rtmp_bit_read(br, 1); + ngx_log_error(NGX_LOG_ERR, s->log, 0, + "%d sub_layer_profile_present_flag:%d, " + "sub_layer_level_present_flag:%d", i, slppf[i], sllpf[i]); + } + + if (maxNumSubLayersMinus1 > 0) { + for (i = maxNumSubLayersMinus1; i < 8; ++i) { + ngx_uint_t t = ngx_rtmp_bit_read(br, 2); + ngx_log_error(NGX_LOG_ERR, s->log, 0, "zero bit %d", t); + } + } + + /* + * profile_tier_level + * for (i = 0; i < maxNumSubLayersMinus1; i++) { + * if (sub_layer_profile_present_flag[i] { + * 44 bits + * } + * if (sub_layer_level_present_flag[i]) { + * sub_layer_level_idc[i] 8 bits + * } + * } + */ + for (i = 0; i < maxNumSubLayersMinus1; ++i) { + if (slppf[i]) { + ngx_rtmp_bit_read(br, 88); + } + + if (sllpf[i]) { + ngx_rtmp_bit_read(br, 8); + } + } +} + +/* + * ITU-T H.265 7.3.2.2 Sequence parameter set RBSP syntax + */ +static void +ngx_rtmp_codec_parse_hevc_sps(ngx_rtmp_session_t *s, ngx_rtmp_codec_ctx_t *ctx, + ngx_rtmp_bit_reader_t *pbr, ngx_uint_t nal_unit_len) +{ + ngx_uint_t mslm, psi, cfi, width, height, + subwidthC, subheightC, + cwlo, cwro, cwto, cwbo; + ngx_rtmp_bit_reader_t br; + u_char buf[4096]; + ngx_int_t rbsp_bytes; + + ngx_rtmp_bit_init_reader(&br, pbr->pos, pbr->pos + nal_unit_len); + rbsp_bytes = ngx_rtmp_codec_parse_hevc_nal_to_rbsp(s, buf, &br, NAL_SPS, + nal_unit_len); + if (rbsp_bytes == NGX_ERROR) { + return; + } + + ngx_rtmp_bit_init_reader(&br, buf, buf + rbsp_bytes); + + /* + * seq_parameter_set_rbsp + * sps_video_parameter_set_id 4 bits + * sps_max_sub_layers_minus1 3 bits + * sps_temporal_id_nesting_flag 1 bit + */ + ngx_rtmp_bit_read(&br, 4); + mslm = ngx_rtmp_bit_read(&br, 3); + ngx_rtmp_bit_read(&br, 1); + + /* + * seq_parameter_set_rbsp + * profile_tier_level(1, sps_max_sub_layers_minus1) + */ + ngx_rtmp_codec_parse_hevc_ptl(s, &br, 1, mslm); + + /* calc resolution */ + /* + * seq_parameter_set_rbsp + * sps_seq_parameter_set_id v + * chroma_format_idc v + * if (chroma_format_idc == 3) + * separate_colour_plane_flag 1 bit + * pic_width_in_luma_samples v + * pic_height_in_luma_samples v + * conformance_window_flag 1 bit + * if (conformance_window_flag) { + * conf_win_left_offset v + * conf_win_right_offset v + * conf_win_top_offset v + * conf_win_bottom_offset v + * } + */ + psi = ngx_rtmp_bit_read_golomb(&br); + if (psi > 16 || br.err) { + ngx_log_error(NGX_LOG_ERR, s->log, 0, + "read sps_seq_parameter_set_id error: %ui", psi); + return; + } + + cfi = ngx_rtmp_bit_read_golomb(&br); + if (cfi > 3 || br.err) { + ngx_log_error(NGX_LOG_ERR, s->log, 0, + "read chroma_format_idc error: %ui", cfi); + return; + } + + if (cfi == 3) { + ngx_rtmp_bit_read(&br, 1); + } + + width = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + if (br.err) { + ngx_log_error(NGX_LOG_ERR, s->log, 0, "read width error"); + return; + } + + height = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + if (br.err) { + ngx_log_error(NGX_LOG_ERR, s->log, 0, "read height error"); + return; + } + + if (ngx_rtmp_bit_read(&br, 1)) { + cwlo = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + cwro = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + cwto = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + cwbo = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + + /* + * ITU-T H.265 Table 6-1 + */ + if (cfi == 1) { /* 4:2:0 */ + subwidthC = 2; + subheightC = 2; + } else if (cfi == 2) { /* 4:2:2 */ + subwidthC = 2; + subheightC = 1; + } else { /* Monochrome or 4:4:4 */ + subwidthC = 1; + subheightC = 1; + } + + /* + * ITU-T H.265 7.4.3.2.1 + * + * horizontal picture coordinates from + * SubWidthC * conf_win_left_offset to + * pic_width_in_luma_samples - (SubWidthC * conf_win_right_offset + 1) + * vertical picture coordinates from + * SubHeightC * conf_win_top_offset to + * pic_height_in_luma_samples - + * (SubHeightC * conf_win_bottom_offset + 1) + */ + ctx->width = width - (subwidthC * cwro + 1) - (subwidthC * cwlo); + ctx->height = height - (subheightC * cwbo + 1) - (subheightC * cwto); + } else { + ctx->width = width; + ctx->height = height; + } + + return; +} + +static void +ngx_rtmp_codec_parse_hevc_header(ngx_rtmp_session_t *s, ngx_chain_t *in) +{ + ngx_uint_t i, j, num_arrays, nal_unit_type, num_nalus, + nal_unit_len; + ngx_rtmp_codec_ctx_t *ctx; + ngx_rtmp_bit_reader_t br; + +#if (NGX_DEBUG) + ngx_rtmp_codec_dump_header(s, "hevc", in); +#endif + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + ngx_rtmp_bit_init_reader(&br, in->buf->pos, in->buf->last); + + /* + * FrameType 4 bits + * CodecID 4 bits + * AVCPacketType 1 byte + * CompositionTime 3 bytes + * HEVCDecoderConfigurationRecord + * configurationVersion 1 byte + */ + ngx_rtmp_bit_read(&br, 48); + + /* + * HEVCDecoderConfigurationRecord + * general_profile_space 2 bits + * general_tier_flag 1 bit + * general_profile_idc 5 bits + * general_profile_compatibility_flags 4 bytes + * general_constraint_indicator_flags 6 bytes + * general_level_idc 1 byte + * min_spatial_segmentation_idc 4 bits reserved + 12 bits + * parallelismType 6 bits reserved + 2 bits + * chroma_format_idc 6 bits reserved + 2 bits + * bit_depth_luma_minus8 5 bits reserved + 3 bits + * bit_depth_chroma_minus8 5 bits reserved + 3 bits + * avgFrameRate 2 bytes + */ + ngx_rtmp_bit_read(&br, 160); + + /* + * HEVCDecoderConfigurationRecord + * constantFrameRate 2 bits + * numTemporalLayers 3 bits + * temporalIdNested 1 bit + * lengthSizeMinusOne 2 bits + */ + ctx->avc_nal_bytes = (ngx_uint_t) ((ngx_rtmp_bit_read_8(&br) & 0x03) + 1); + + /* + * HEVCDecoderConfigurationRecord + * numOfArrays 1 byte + */ + num_arrays = (ngx_uint_t) ngx_rtmp_bit_read_8(&br); + + for (i = 0; i < num_arrays; ++i) { + /* + * array_completeness 1 bit + * reserved 1 bit + * NAL_unit_type 6 bits + * numNalus 2 bytes + */ + nal_unit_type = (ngx_uint_t) (ngx_rtmp_bit_read_8(&br) & 0x3f); + num_nalus = (ngx_uint_t) ngx_rtmp_bit_read_16(&br); + + for (j = 0; j < num_nalus; ++j) { + /* + * nalUnitLength 2 bytes + */ + nal_unit_len = (ngx_uint_t) ngx_rtmp_bit_read_16(&br); + + switch (nal_unit_type) { + case NAL_SPS: + ngx_rtmp_codec_parse_hevc_sps(s, ctx, &br, nal_unit_len); + ngx_rtmp_bit_read(&br, nal_unit_len * 8); + break; + default: + ngx_rtmp_bit_read(&br, nal_unit_len * 8); + break; + } + } + } + + ngx_log_debug7(NGX_LOG_DEBUG_RTMP, s->log, 0, + "codec: hevc header " + "profile=%ui, compat=%ui, level=%ui, " + "nal_bytes=%ui, ref_frames=%ui, width=%ui, height=%ui", + ctx->avc_profile, ctx->avc_compat, ctx->avc_level, + ctx->avc_nal_bytes, ctx->avc_ref_frames, + ctx->width, ctx->height); +} + + +static void +ngx_rtmp_codec_parse_avc_header(ngx_rtmp_session_t *s, ngx_chain_t *in) +{ + ngx_uint_t profile_idc, width, height, crop_left, crop_right, + crop_top, crop_bottom, frame_mbs_only, n, cf_idc, + num_ref_frames; + ngx_rtmp_codec_ctx_t *ctx; + ngx_rtmp_bit_reader_t br; + +#if (NGX_DEBUG) + ngx_rtmp_codec_dump_header(s, "avc", in); +#endif + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + ngx_rtmp_bit_init_reader(&br, in->buf->pos, in->buf->last); + + ngx_rtmp_bit_read(&br, 48); + + ctx->avc_profile = (ngx_uint_t) ngx_rtmp_bit_read_8(&br); + ctx->avc_compat = (ngx_uint_t) ngx_rtmp_bit_read_8(&br); + ctx->avc_level = (ngx_uint_t) ngx_rtmp_bit_read_8(&br); + + /* nal bytes */ + ctx->avc_nal_bytes = (ngx_uint_t) ((ngx_rtmp_bit_read_8(&br) & 0x03) + 1); + + /* nnals */ + if ((ngx_rtmp_bit_read_8(&br) & 0x1f) == 0) { + return; + } + + /* nal size */ + ngx_rtmp_bit_read(&br, 16); + + /* nal type */ + if (ngx_rtmp_bit_read_8(&br) != 0x67) { + return; + } + + /* SPS */ + + /* profile idc */ + profile_idc = (ngx_uint_t) ngx_rtmp_bit_read(&br, 8); + + /* flags */ + ngx_rtmp_bit_read(&br, 8); + + /* level idc */ + ngx_rtmp_bit_read(&br, 8); + + /* SPS id */ + ngx_rtmp_bit_read_golomb(&br); + + if (profile_idc == 100 || profile_idc == 110 || + profile_idc == 122 || profile_idc == 244 || profile_idc == 44 || + profile_idc == 83 || profile_idc == 86 || profile_idc == 118) + { + /* chroma format idc */ + cf_idc = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + + if (cf_idc == 3) { + + /* separate color plane */ + ngx_rtmp_bit_read(&br, 1); + } + + /* bit depth luma - 8 */ + ngx_rtmp_bit_read_golomb(&br); + + /* bit depth chroma - 8 */ + ngx_rtmp_bit_read_golomb(&br); + + /* qpprime y zero transform bypass */ + ngx_rtmp_bit_read(&br, 1); + + /* seq scaling matrix present */ + if (ngx_rtmp_bit_read(&br, 1)) { + + for (n = 0; n < (cf_idc != 3 ? 8u : 12u); n++) { + + /* seq scaling list present */ + if (ngx_rtmp_bit_read(&br, 1)) { + + /* TODO: scaling_list() + if (n < 6) { + } else { + } + */ + } + } + } + } + + /* log2 max frame num */ + ngx_rtmp_bit_read_golomb(&br); + + /* pic order cnt type */ + switch (ngx_rtmp_bit_read_golomb(&br)) { + case 0: + + /* max pic order cnt */ + ngx_rtmp_bit_read_golomb(&br); + break; + + case 1: + + /* delta pic order alwys zero */ + ngx_rtmp_bit_read(&br, 1); + + /* offset for non-ref pic */ + ngx_rtmp_bit_read_golomb(&br); + + /* offset for top to bottom field */ + ngx_rtmp_bit_read_golomb(&br); + + /* num ref frames in pic order */ + num_ref_frames = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + + for (n = 0; n < num_ref_frames; n++) { + + /* offset for ref frame */ + ngx_rtmp_bit_read_golomb(&br); + } + } + + /* num ref frames */ + ctx->avc_ref_frames = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + + /* gaps in frame num allowed */ + ngx_rtmp_bit_read(&br, 1); + + /* pic width in mbs - 1 */ + width = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + + /* pic height in map units - 1 */ + height = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + + /* frame mbs only flag */ + frame_mbs_only = (ngx_uint_t) ngx_rtmp_bit_read(&br, 1); + + if (!frame_mbs_only) { + + /* mbs adaprive frame field */ + ngx_rtmp_bit_read(&br, 1); + } + + /* direct 8x8 inference flag */ + ngx_rtmp_bit_read(&br, 1); + + /* frame cropping */ + if (ngx_rtmp_bit_read(&br, 1)) { + + crop_left = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + crop_right = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + crop_top = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + crop_bottom = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br); + + } else { + + crop_left = 0; + crop_right = 0; + crop_top = 0; + crop_bottom = 0; + } + + ctx->width = (width + 1) * 16 - (crop_left + crop_right) * 2; + ctx->height = (2 - frame_mbs_only) * (height + 1) * 16 - + (crop_top + crop_bottom) * 2; + + ngx_log_debug7(NGX_LOG_DEBUG_RTMP, s->log, 0, + "codec: avc header " + "profile=%ui, compat=%ui, level=%ui, " + "nal_bytes=%ui, ref_frames=%ui, width=%ui, height=%ui", + ctx->avc_profile, ctx->avc_compat, ctx->avc_level, + ctx->avc_nal_bytes, ctx->avc_ref_frames, + ctx->width, ctx->height); +} + + +#if (NGX_DEBUG) +static void +ngx_rtmp_codec_dump_header(ngx_rtmp_session_t *s, const char *type, + ngx_chain_t *in) +{ + u_char buf[256], *p, *pp; + u_char hex[] = "0123456789abcdef"; + + for (pp = buf, p = in->buf->pos; + p < in->buf->last && pp < buf + sizeof(buf) - 1; + ++p) + { + *pp++ = hex[*p >> 4]; + *pp++ = hex[*p & 0x0f]; + } + + *pp = 0; + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0, + "codec: %s header %s", type, buf); +} +#endif + + +static ngx_int_t +ngx_rtmp_codec_reconstruct_meta(ngx_rtmp_session_t *s) +{ + ngx_rtmp_codec_ctx_t *ctx; + ngx_rtmp_core_srv_conf_t *cscf; + ngx_int_t rc; + + static struct { + double width; + double height; + double duration; + double frame_rate; + double video_data_rate; + double video_codec_id; + double audio_data_rate; + double audio_codec_id; + u_char profile[32]; + u_char level[32]; + } v; + + static ngx_rtmp_amf_elt_t out_inf[] = { + + { NGX_RTMP_AMF_STRING, + ngx_string("Server"), + "Pingo (https://github.com/im-pingo/nginx-rtmp-module)", 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("width"), + &v.width, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("height"), + &v.height, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("displayWidth"), + &v.width, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("displayHeight"), + &v.height, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("duration"), + &v.duration, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("framerate"), + &v.frame_rate, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("fps"), + &v.frame_rate, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("videodatarate"), + &v.video_data_rate, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("videocodecid"), + &v.video_codec_id, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("audiodatarate"), + &v.audio_data_rate, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("audiocodecid"), + &v.audio_codec_id, 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_string("profile"), + &v.profile, sizeof(v.profile) }, + + { NGX_RTMP_AMF_STRING, + ngx_string("level"), + &v.level, sizeof(v.level) }, + }; + + static ngx_rtmp_amf_elt_t out_elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + "onMetaData", 0 }, + + { NGX_RTMP_AMF_OBJECT, + ngx_null_string, + out_inf, sizeof(out_inf) }, + }; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + if (ctx == NULL) { + return NGX_OK; + } + + if (ctx->meta) { + ngx_rtmp_shared_free_frame(ctx->meta); + } + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + ctx->meta = ngx_rtmp_shared_alloc_frame(cscf->chunk_size, NULL, 1); + + v.width = ctx->width; + v.height = ctx->height; + v.duration = ctx->duration; + v.frame_rate = ctx->frame_rate; + v.video_data_rate = ctx->video_data_rate; + v.video_codec_id = ctx->video_codec_id; + v.audio_data_rate = ctx->audio_data_rate; + v.audio_codec_id = ctx->audio_codec_id; + ngx_memcpy(v.profile, ctx->profile, sizeof(ctx->profile)); + ngx_memcpy(v.level, ctx->level, sizeof(ctx->level)); + + rc = ngx_rtmp_append_amf(s, &ctx->meta->chain, &ctx->meta->chain, out_elts, + sizeof(out_elts) / sizeof(out_elts[0])); + if (rc != NGX_OK || ctx->meta == NULL) { + return NGX_ERROR; + } + + return ngx_rtmp_codec_prepare_meta(s, 0); +} + + +static ngx_int_t +ngx_rtmp_codec_copy_meta(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_codec_ctx_t *ctx; + ngx_rtmp_core_srv_conf_t *cscf; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + if (ctx->meta) { + ngx_rtmp_shared_free_frame(ctx->meta); + } + + ctx->meta = ngx_rtmp_shared_alloc_frame(cscf->chunk_size, in, 0); + + if (ctx->meta == NULL) { + return NGX_ERROR; + } + + return ngx_rtmp_codec_prepare_meta(s, h->timestamp); +} + + +static ngx_int_t +ngx_rtmp_codec_prepare_meta(ngx_rtmp_session_t *s, uint32_t timestamp) +{ + ngx_rtmp_codec_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + ctx->meta->hdr.csid = NGX_RTMP_CSID_AMF; + ctx->meta->hdr.msid = NGX_RTMP_MSID; + ctx->meta->hdr.type = NGX_RTMP_MSG_AMF_META; + ctx->meta->hdr.timestamp = timestamp; + + ctx->meta_version = ngx_rtmp_codec_get_next_version(); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_codec_meta_data(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_codec_app_conf_t *cacf; + ngx_rtmp_codec_ctx_t *ctx; + ngx_uint_t skip; + + static struct { + double width; + double height; + double duration; + double frame_rate; + double video_data_rate; + double video_codec_id_n; + u_char video_codec_id_s[32]; + double audio_data_rate; + double audio_codec_id_n; + u_char audio_codec_id_s[32]; + u_char profile[32]; + u_char level[32]; + } v; + + static ngx_rtmp_amf_elt_t in_video_codec_id[] = { + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &v.video_codec_id_n, 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + &v.video_codec_id_s, sizeof(v.video_codec_id_s) }, + }; + + static ngx_rtmp_amf_elt_t in_audio_codec_id[] = { + + { NGX_RTMP_AMF_NUMBER, + ngx_null_string, + &v.audio_codec_id_n, 0 }, + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + &v.audio_codec_id_s, sizeof(v.audio_codec_id_s) }, + }; + + static ngx_rtmp_amf_elt_t in_inf[] = { + + { NGX_RTMP_AMF_NUMBER, + ngx_string("width"), + &v.width, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("height"), + &v.height, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("duration"), + &v.duration, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("framerate"), + &v.frame_rate, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("fps"), + &v.frame_rate, 0 }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("videodatarate"), + &v.video_data_rate, 0 }, + + { NGX_RTMP_AMF_VARIANT, + ngx_string("videocodecid"), + in_video_codec_id, sizeof(in_video_codec_id) }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("audiodatarate"), + &v.audio_data_rate, 0 }, + + { NGX_RTMP_AMF_VARIANT, + ngx_string("audiocodecid"), + in_audio_codec_id, sizeof(in_audio_codec_id) }, + + { NGX_RTMP_AMF_STRING, + ngx_string("profile"), + &v.profile, sizeof(v.profile) }, + + { NGX_RTMP_AMF_STRING, + ngx_string("level"), + &v.level, sizeof(v.level) }, + }; + + static ngx_rtmp_amf_elt_t in_elts[] = { + + { NGX_RTMP_AMF_STRING, + ngx_null_string, + NULL, 0 }, + + { NGX_RTMP_AMF_OBJECT, + ngx_null_string, + in_inf, sizeof(in_inf) }, + }; + + cacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_codec_module); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + if (ctx == NULL) { + ctx = ngx_pcalloc(s->pool, sizeof(ngx_rtmp_codec_ctx_t)); + ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_codec_module); + } + + ngx_memzero(&v, sizeof(v)); + + /* use -1 as a sign of unchanged data; + * 0 is a valid value for uncompressed audio */ + v.audio_codec_id_n = -1; + + /* FFmpeg sends a string in front of actal metadata; ignore it */ + skip = !(in->buf->last > in->buf->pos + && *in->buf->pos == NGX_RTMP_AMF_STRING); + if (ngx_rtmp_receive_amf(s, in, in_elts + skip, + sizeof(in_elts) / sizeof(in_elts[0]) - skip)) + { + ngx_log_error(NGX_LOG_ERR, s->log, 0, + "codec: error parsing data frame"); + return NGX_OK; + } + + ctx->width = (ngx_uint_t) v.width; + ctx->height = (ngx_uint_t) v.height; + ctx->duration = (ngx_uint_t) v.duration; + ctx->frame_rate = v.frame_rate; + ctx->video_data_rate = (ngx_uint_t) v.video_data_rate; + ctx->video_codec_id = (ngx_uint_t) v.video_codec_id_n; + ctx->audio_data_rate = (ngx_uint_t) v.audio_data_rate; + ctx->audio_codec_id = (v.audio_codec_id_n == -1 + ? 0 : v.audio_codec_id_n == 0 + ? NGX_RTMP_AUDIO_UNCOMPRESSED : (ngx_uint_t) v.audio_codec_id_n); + ngx_memcpy(ctx->profile, v.profile, sizeof(v.profile)); + ngx_memcpy(ctx->level, v.level, sizeof(v.level)); + + ngx_log_debug8(NGX_LOG_DEBUG_RTMP, s->log, 0, + "codec: data frame: " + "width=%ui height=%ui duration=%ui frame_rate=%f " + "video=%s (%ui) audio=%s (%ui)", + ctx->width, ctx->height, ctx->duration, ctx->frame_rate, + ngx_rtmp_get_video_codec_name(ctx->video_codec_id), + ctx->video_codec_id, + ngx_rtmp_get_audio_codec_name(ctx->audio_codec_id), + ctx->audio_codec_id); + + switch (cacf->meta) { + case NGX_RTMP_CODEC_META_ON: + return ngx_rtmp_codec_reconstruct_meta(s); + case NGX_RTMP_CODEC_META_COPY: + return ngx_rtmp_codec_copy_meta(s, h, in); + } + + /* NGX_RTMP_CODEC_META_OFF */ + + return NGX_OK; +} + + +static void * +ngx_rtmp_codec_create_app_conf(ngx_conf_t *cf) +{ + ngx_rtmp_codec_app_conf_t *cacf; + + cacf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_codec_app_conf_t)); + if (cacf == NULL) { + return NULL; + } + + cacf->meta = NGX_CONF_UNSET_UINT; + + return cacf; +} + + +static char * +ngx_rtmp_codec_merge_app_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_rtmp_codec_app_conf_t *prev = parent; + ngx_rtmp_codec_app_conf_t *conf = child; + + ngx_conf_merge_uint_value(conf->meta, prev->meta, NGX_RTMP_CODEC_META_ON); + + return NGX_CONF_OK; +} + + +static ngx_int_t +ngx_rtmp_codec_postconfiguration(ngx_conf_t *cf) +{ + ngx_rtmp_core_main_conf_t *cmcf; + ngx_rtmp_handler_pt *h; + ngx_rtmp_amf_handler_t *ch; + + cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module); + + h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AUDIO]); + *h = ngx_rtmp_codec_av; + + h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_VIDEO]); + *h = ngx_rtmp_codec_av; + + h = ngx_array_push(&cmcf->events[NGX_RTMP_DISCONNECT]); + *h = ngx_rtmp_codec_disconnect; + + /* register metadata handler */ + ch = ngx_array_push(&cmcf->amf); + if (ch == NULL) { + return NGX_ERROR; + } + ngx_str_set(&ch->name, "@setDataFrame"); + ch->handler = ngx_rtmp_codec_meta_data; + + ch = ngx_array_push(&cmcf->amf); + if (ch == NULL) { + return NGX_ERROR; + } + ngx_str_set(&ch->name, "onMetaData"); + ch->handler = ngx_rtmp_codec_meta_data; + + + return NGX_OK; +} diff --git a/StreamMedia/flv_h265_patch/nginx_rtmp_module/ngx_rtmp_live_module.c b/StreamMedia/flv_h265_patch/nginx_rtmp_module/ngx_rtmp_live_module.c new file mode 100644 index 0000000..2f15e80 --- /dev/null +++ b/StreamMedia/flv_h265_patch/nginx_rtmp_module/ngx_rtmp_live_module.c @@ -0,0 +1,1108 @@ + +/* + * Copyright (C) Roman Arutyunyan + */ + + +#include +#include +#include "ngx_rtmp_live_module.h" +#include "ngx_rtmp_cmd_module.h" +#include "ngx_rtmp_codec_module.h" + + +static ngx_rtmp_publish_pt next_publish; +static ngx_rtmp_play_pt next_play; +static ngx_rtmp_close_stream_pt next_close_stream; +static ngx_rtmp_pause_pt next_pause; +static ngx_rtmp_stream_begin_pt next_stream_begin; +static ngx_rtmp_stream_eof_pt next_stream_eof; + + +static ngx_int_t ngx_rtmp_live_postconfiguration(ngx_conf_t *cf); +static void * ngx_rtmp_live_create_app_conf(ngx_conf_t *cf); +static char * ngx_rtmp_live_merge_app_conf(ngx_conf_t *cf, + void *parent, void *child); +static char *ngx_rtmp_live_set_msec_slot(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); +static void ngx_rtmp_live_start(ngx_rtmp_session_t *s); +static void ngx_rtmp_live_stop(ngx_rtmp_session_t *s); + + +static ngx_command_t ngx_rtmp_live_commands[] = { + + { ngx_string("live"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_live_app_conf_t, live), + NULL }, + + { ngx_string("buffer"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_msec_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_live_app_conf_t, buflen), + NULL }, + + { ngx_string("sync"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_rtmp_live_set_msec_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_live_app_conf_t, sync), + NULL }, + + { ngx_string("interleave"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_live_app_conf_t, interleave), + NULL }, + + { ngx_string("wait_key"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_live_app_conf_t, wait_key), + NULL }, + + { ngx_string("wait_video"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_live_app_conf_t, wait_video), + NULL }, + + { ngx_string("publish_notify"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_live_app_conf_t, publish_notify), + NULL }, + + { ngx_string("play_restart"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_live_app_conf_t, play_restart), + NULL }, + + { ngx_string("idle_streams"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_live_app_conf_t, idle_streams), + NULL }, + + { ngx_string("drop_idle_publisher"), + NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1, + ngx_rtmp_live_set_msec_slot, + NGX_RTMP_APP_CONF_OFFSET, + offsetof(ngx_rtmp_live_app_conf_t, idle_timeout), + NULL }, + + ngx_null_command +}; + + +static ngx_rtmp_module_t ngx_rtmp_live_module_ctx = { + NULL, /* preconfiguration */ + ngx_rtmp_live_postconfiguration, /* postconfiguration */ + NULL, /* create main configuration */ + NULL, /* init main configuration */ + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + ngx_rtmp_live_create_app_conf, /* create app configuration */ + ngx_rtmp_live_merge_app_conf /* merge app configuration */ +}; + + +ngx_module_t ngx_rtmp_live_module = { + NGX_MODULE_V1, + &ngx_rtmp_live_module_ctx, /* module context */ + ngx_rtmp_live_commands, /* module directives */ + NGX_RTMP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static void * +ngx_rtmp_live_create_app_conf(ngx_conf_t *cf) +{ + ngx_rtmp_live_app_conf_t *lacf; + + lacf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_live_app_conf_t)); + if (lacf == NULL) { + return NULL; + } + + lacf->live = NGX_CONF_UNSET; + lacf->buflen = NGX_CONF_UNSET_MSEC; + lacf->sync = NGX_CONF_UNSET_MSEC; + lacf->idle_timeout = NGX_CONF_UNSET_MSEC; + lacf->interleave = NGX_CONF_UNSET; + lacf->wait_key = NGX_CONF_UNSET; + lacf->wait_video = NGX_CONF_UNSET; + lacf->publish_notify = NGX_CONF_UNSET; + lacf->play_restart = NGX_CONF_UNSET; + lacf->idle_streams = NGX_CONF_UNSET; + + return lacf; +} + + +static char * +ngx_rtmp_live_merge_app_conf(ngx_conf_t *cf, void *parent, void *child) +{ + ngx_rtmp_live_app_conf_t *prev = parent; + ngx_rtmp_live_app_conf_t *conf = child; + + ngx_conf_merge_value(conf->live, prev->live, 0); + ngx_conf_merge_msec_value(conf->buflen, prev->buflen, 0); + ngx_conf_merge_msec_value(conf->sync, prev->sync, 300); + ngx_conf_merge_msec_value(conf->idle_timeout, prev->idle_timeout, 0); + ngx_conf_merge_value(conf->interleave, prev->interleave, 0); + ngx_conf_merge_value(conf->wait_key, prev->wait_key, 1); + ngx_conf_merge_value(conf->wait_video, prev->wait_video, 0); + ngx_conf_merge_value(conf->publish_notify, prev->publish_notify, 0); + ngx_conf_merge_value(conf->play_restart, prev->play_restart, 0); + ngx_conf_merge_value(conf->idle_streams, prev->idle_streams, 1); + + return NGX_CONF_OK; +} + + +static char * +ngx_rtmp_live_set_msec_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + char *p = conf; + ngx_str_t *value; + ngx_msec_t *msp; + + msp = (ngx_msec_t *) (p + cmd->offset); + + value = cf->args->elts; + + if (value[1].len == sizeof("off") - 1 && + ngx_strncasecmp(value[1].data, (u_char *) "off", value[1].len) == 0) + { + *msp = 0; + return NGX_CONF_OK; + } + + return ngx_conf_set_msec_slot(cf, cmd, conf); +} + + +static void +ngx_rtmp_live_idle(ngx_event_t *pev) +{ + ngx_connection_t *c; + ngx_rtmp_session_t *s; + + c = pev->data; + s = c->data; + + ngx_log_error(NGX_LOG_ERR, s->log, 0, + "live: drop idle publisher"); + + s->finalize_reason = NGX_LIVE_DROP_IDLE; + ngx_rtmp_finalize_session(s); +} + + +static void +ngx_rtmp_live_set_status(ngx_rtmp_session_t *s, ngx_rtmp_frame_t *control, + ngx_rtmp_frame_t **status, size_t nstatus, + unsigned active) +{ + ngx_rtmp_live_app_conf_t *lacf; + ngx_rtmp_live_ctx_t *ctx, *pctx; + ngx_rtmp_frame_t **frame; + ngx_event_t *e; + size_t n; + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0, + "live: set active=%ui", active); + + if (ctx->active == active) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0, + "live: unchanged active=%ui", active); + return; + } + + ctx->active = active; + + if (ctx->publishing) { + + /* publisher */ + + if (lacf->idle_timeout) { + e = &ctx->idle_evt; + + if (active && !ctx->idle_evt.timer_set) { + e->data = s->connection; + e->log = s->log; + e->handler = ngx_rtmp_live_idle; + + ngx_add_timer(e, lacf->idle_timeout); + + } else if (!active && ctx->idle_evt.timer_set) { + ngx_del_timer(e); + } + } + + ctx->stream->active = active; + + for (pctx = ctx->stream->ctx; pctx; pctx = pctx->next) { + if (pctx->publishing == 0) { + ngx_rtmp_live_set_status(pctx->session, control, status, + nstatus, active); + } + } + + return; + } + + /* subscriber */ + + if (control && ngx_rtmp_send_message(s, control, 0) != NGX_OK) { + ngx_rtmp_finalize_session(s); + return; + } + + if (!ctx->silent) { + frame = status; + + for (n = 0; n < nstatus; ++n, ++frame) { + if (*frame && ngx_rtmp_send_message(s, *frame, 0) != NGX_OK) { + ngx_rtmp_finalize_session(s); + return; + } + } + } + + ctx->cs[0].active = 0; + ctx->cs[0].dropped = 0; + + ctx->cs[1].active = 0; + ctx->cs[1].dropped = 0; +} + + +static void +ngx_rtmp_live_start(ngx_rtmp_session_t *s) +{ + ngx_rtmp_live_app_conf_t *lacf; + ngx_rtmp_frame_t *control; + ngx_rtmp_frame_t *status[3]; + size_t n, nstatus; + + if (s->live_type == NGX_HLS_LIVE) { + return; + } + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + + control = ngx_rtmp_create_stream_begin(s, NGX_RTMP_MSID); + + nstatus = 0; + + if (lacf->play_restart) { + status[nstatus++] = ngx_rtmp_create_status(s, "NetStream.Play.Start", + "status", "Start live"); + status[nstatus++] = ngx_rtmp_create_sample_access(s); + } + + if (lacf->publish_notify) { + status[nstatus++] = ngx_rtmp_create_status(s, + "NetStream.Play.PublishNotify", + "status", "Start publishing"); + } + + ngx_rtmp_live_set_status(s, control, status, nstatus, 1); + + if (control) { + ngx_rtmp_shared_free_frame(control); + } + + for (n = 0; n < nstatus; ++n) { + ngx_rtmp_shared_free_frame(status[n]); + } +} + + +static void +ngx_rtmp_live_stop(ngx_rtmp_session_t *s) +{ + ngx_rtmp_live_app_conf_t *lacf; + ngx_rtmp_frame_t *control; + ngx_rtmp_frame_t *status[3]; + size_t n, nstatus; + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + + control = ngx_rtmp_create_stream_eof(s, NGX_RTMP_MSID); + + nstatus = 0; + + if (lacf->play_restart) { + status[nstatus++] = ngx_rtmp_create_status(s, "NetStream.Play.Stop", + "status", "Stop live"); + } + + if (lacf->publish_notify) { + status[nstatus++] = ngx_rtmp_create_status(s, + "NetStream.Play.UnpublishNotify", + "status", "Stop publishing"); + } + + ngx_rtmp_live_set_status(s, control, status, nstatus, 0); + + if (control) { + ngx_rtmp_shared_free_frame(control); + } + + for (n = 0; n < nstatus; ++n) { + ngx_rtmp_shared_free_frame(status[n]); + } +} + + +static ngx_int_t +ngx_rtmp_live_stream_begin(ngx_rtmp_session_t *s, ngx_rtmp_stream_begin_t *v) +{ + ngx_rtmp_live_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + + if (ctx == NULL || ctx->stream == NULL || !ctx->publishing) { + goto next; + } + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0, + "live: stream_begin"); + + ngx_rtmp_live_start(s); + +next: + return next_stream_begin(s, v); +} + + +static ngx_int_t +ngx_rtmp_live_stream_eof(ngx_rtmp_session_t *s, ngx_rtmp_stream_eof_t *v) +{ + ngx_rtmp_live_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + + if (ctx == NULL || ctx->stream == NULL || !ctx->publishing) { + goto next; + } + + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0, + "live: stream_eof"); + + ngx_rtmp_live_stop(s); + +next: + return next_stream_eof(s, v); +} + + +static void +ngx_rtmp_live_join(ngx_rtmp_session_t *s, u_char *name, unsigned publisher) +{ + ngx_rtmp_live_ctx_t *ctx; + ngx_live_stream_t *st; + ngx_rtmp_live_app_conf_t *lacf; + ngx_str_t pubpri; + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + if (lacf == NULL) { + return; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + if (ctx && ctx->stream) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0, + "live: already joined"); + return; + } + + if (ctx == NULL) { + ctx = ngx_palloc(s->pool, sizeof(ngx_rtmp_live_ctx_t)); + ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_live_module); + } + + ngx_memzero(ctx, sizeof(*ctx)); + + ctx->session = s; + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0, + "live: join '%s'", name); + + st = s->live_stream; + + if (!(publisher || st->publish_ctx || lacf->idle_streams)) { + ngx_log_error(NGX_LOG_ERR, s->log, 0, + "live: stream not found"); + + s->status = 404; + ngx_rtmp_send_status(s, "NetStream.Play.StreamNotFound", "error", + "No such stream"); + + ngx_rtmp_finalize_session(s); + + return; + } + + if (publisher) { + // set publish priority + if (s->relay) { // relay pull + ctx->pubpri = -1; + } else { + if (ngx_rtmp_arg(s, (u_char *) "pubpri", 6, &pubpri) == NGX_OK) { + ctx->pubpri = ngx_atoi(pubpri.data, pubpri.len); + if (ctx->pubpri == NGX_ERROR) { // invalid publish priority + ctx->pubpri = 0; + } + } + } + + // duplicate publish priority + if (ngx_map_find(&st->pubctx, (intptr_t) ctx->pubpri)) { + ngx_log_error(NGX_LOG_ERR, s->log, 0, + "live: already publishing"); + + ngx_rtmp_send_status(s, "NetStream.Publish.BadName", "error", + "Already publishing"); + + return; + } + + ctx->node.raw_key = (intptr_t) ctx->pubpri; + ngx_map_insert(&st->pubctx, &ctx->node, 0); + + st->publishing = 1; + } + + ctx->stream = st; + ctx->publishing = publisher; + ctx->next = st->ctx; + + st->ctx = ctx; + + if (lacf->buflen) { + s->out_buffer = 1; + } + + ctx->cs[0].csid = NGX_RTMP_CSID_VIDEO; + ctx->cs[1].csid = NGX_RTMP_CSID_AUDIO; + + if (!ctx->publishing && ctx->stream->active) { + ngx_rtmp_live_start(s); + } +} + + +static ngx_int_t +ngx_rtmp_live_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v) +{ + ngx_rtmp_session_t *ss; + ngx_rtmp_live_ctx_t *ctx, **cctx, *pctx; + ngx_rtmp_live_app_conf_t *lacf; + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + if (lacf == NULL) { + goto next; + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + if (ctx == NULL) { + goto next; + } + + if (ctx->stream == NULL) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0, + "live: not joined"); + goto next; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0, + "live: leave '%s'", ctx->stream->name); + + if (s->publishing) { + ngx_map_delete(&s->live_stream->pubctx, (intptr_t) ctx->pubpri); + } + + if (ctx->stream->publishing && ctx->publishing) { + ctx->stream->publishing = 0; + } + + for (cctx = &ctx->stream->ctx; *cctx; cctx = &(*cctx)->next) { + if (*cctx == ctx) { + *cctx = ctx->next; + break; + } + } + + if (ctx->publishing || ctx->stream->active) { + ngx_rtmp_live_stop(s); + } + + if (ctx->publishing) { + ngx_rtmp_send_status(s, "NetStream.Unpublish.Success", + "status", "Stop publishing"); + if (!lacf->idle_streams) { + for (pctx = ctx->stream->ctx; pctx; pctx = pctx->next) { + if (pctx->publishing == 0) { + ss = pctx->session; + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, ss->log, 0, + "live: no publisher"); + ngx_rtmp_finalize_session(ss); + } + } + } + } + + if (ctx->stream->ctx) { + ctx->stream = NULL; + goto next; + } + + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0, + "live: delete empty stream '%s'", + ctx->stream->name); + + ctx->stream = NULL; + + if (!ctx->silent && !ctx->publishing && !lacf->play_restart) { + ngx_rtmp_send_status(s, "NetStream.Play.Stop", "status", "Stop live"); + } + +next: + return next_close_stream(s, v); +} + + +static ngx_int_t +ngx_rtmp_live_pause(ngx_rtmp_session_t *s, ngx_rtmp_pause_t *v) +{ + ngx_rtmp_live_ctx_t *ctx; + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + + if (ctx == NULL || ctx->stream == NULL) { + goto next; + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0, + "live: pause=%i timestamp=%f", + (ngx_int_t) v->pause, v->position); + + if (v->pause) { + if (ngx_rtmp_send_status(s, "NetStream.Pause.Notify", "status", + "Paused live") + != NGX_OK) + { + return NGX_ERROR; + } + + ctx->paused = 1; + + ngx_rtmp_live_stop(s); + + } else { + if (ngx_rtmp_send_status(s, "NetStream.Unpause.Notify", "status", + "Unpaused live") + != NGX_OK) + { + return NGX_ERROR; + } + + ctx->paused = 0; + + ngx_rtmp_live_start(s); + } + +next: + return next_pause(s, v); +} + +static ngx_int_t +ngx_rtmp_live_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_chain_t *in) +{ + ngx_rtmp_live_ctx_t *ctx, *pctx; + ngx_rtmp_codec_ctx_t *codec_ctx; + ngx_rtmp_frame_t *header, *coheader, *meta, *avframe, *dummy; + ngx_rtmp_core_srv_conf_t *cscf; + ngx_rtmp_live_app_conf_t *lacf; + ngx_rtmp_session_t *ss; + ngx_rtmp_header_t ch, lh, clh; + ngx_int_t rc, mandatory, dummy_audio; + ngx_uint_t prio; + ngx_uint_t peers; + ngx_uint_t meta_version; + ngx_uint_t csidx; + uint32_t delta; + ngx_rtmp_live_chunk_stream_t *cs; + u_char frametype; + +#define MSG_TYPE (h->type == NGX_RTMP_MSG_VIDEO ? "video" : "audio") + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + if (lacf == NULL) { + return NGX_ERROR; + } + + if (!lacf->live || in == NULL || in->buf == NULL || s->pause == 1) { + return NGX_OK; + } + + codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module); + + if (s->pause == 2) { + if ((codec_ctx && codec_ctx->video_codec_id == 0) || + (h->type == NGX_RTMP_MSG_VIDEO && + ngx_rtmp_get_video_frame_type(in) == NGX_RTMP_VIDEO_KEY_FRAME)) + { + s->pause = 0; + } else { + return NGX_OK; + } + } + + if (h->type == NGX_RTMP_MSG_VIDEO) { + frametype = in->buf->pos[0] & 0xf0; + if (frametype != 0x10 && frametype != 0x20) { + ngx_log_error(NGX_LOG_ERR, s->log, 0, + "codec: receive unkwnon frametype %02xD", frametype); + return NGX_OK; + } + } + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + if (ctx == NULL || ctx->stream == NULL) { + return NGX_OK; + } + + if (ctx->publishing == 0) { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0, + "live: %s from non-publisher", MSG_TYPE); + return NGX_OK; + } + + if (!ctx->stream->active) { + ngx_rtmp_live_start(s); + } + + if (ctx->idle_evt.timer_set) { + ngx_add_timer(&ctx->idle_evt, lacf->idle_timeout); + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0, + "live: %s packet timestamp=%uD", + MSG_TYPE, h->timestamp); + + s->current_time = h->timestamp; + + peers = 0; + header = NULL; + coheader = NULL; + meta = NULL; + dummy = NULL; + meta_version = 0; + mandatory = 0; + + prio = (h->type == NGX_RTMP_MSG_VIDEO ? + ngx_rtmp_get_video_frame_type(in) : 0); + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + csidx = !(lacf->interleave || h->type == NGX_RTMP_MSG_VIDEO); + + cs = &ctx->cs[csidx]; + + ngx_memzero(&ch, sizeof(ch)); + + ch.timestamp = h->timestamp; + ch.msid = NGX_RTMP_MSID; + ch.csid = cs->csid; + ch.type = h->type; + ch.mlen = h->mlen; + + lh = ch; + + if (cs->active) { + lh.timestamp = cs->timestamp; + } + + clh = lh; + clh.type = (h->type == NGX_RTMP_MSG_AUDIO ? NGX_RTMP_MSG_VIDEO : + NGX_RTMP_MSG_AUDIO); + + cs->active = 1; + cs->timestamp = ch.timestamp; + + delta = ch.timestamp - lh.timestamp; +/* + if (delta >> 31) { + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0, + "live: clipping non-monotonical timestamp %uD->%uD", + lh.timestamp, ch.timestamp); + + delta = 0; + + ch.timestamp = lh.timestamp; + } +*/ + avframe = ngx_rtmp_shared_alloc_frame(cscf->chunk_size, in, 0); + avframe->hdr = ch; + + if (codec_ctx) { + + if (h->type == NGX_RTMP_MSG_AUDIO) { + header = codec_ctx->aac_header; + + if (lacf->interleave) { + coheader = codec_ctx->avc_header; + } + + if (codec_ctx->audio_codec_id == NGX_RTMP_AUDIO_AAC && + ngx_rtmp_is_codec_header(in)) + { + prio = 0; + mandatory = 1; + } + + } else { + header = codec_ctx->avc_header; + + if (lacf->interleave) { + coheader = codec_ctx->aac_header; + } + + if ((codec_ctx->video_codec_id == NGX_RTMP_VIDEO_H264 || codec_ctx->video_codec_id == NGX_RTMP_VIDEO_H265) && + ngx_rtmp_is_codec_header(in)) + { + prio = 0; + mandatory = 1; + } + } + + if (codec_ctx->meta) { + meta = codec_ctx->meta; + meta_version = codec_ctx->meta_version; + } + } + + if (ngx_rtmp_gop_cache(s, avframe) == NGX_ERROR) { + return NGX_ERROR; + } + + /* broadcast to all subscribers */ + + for (pctx = ctx->stream->ctx; pctx; pctx = pctx->next) { + // not the highest priority + if (ngx_map_rbegin(&ctx->stream->pubctx) != &ctx->node) { + break; + } + + // do not send to publish session + if (pctx->publishing || pctx->paused || s->pause) { + continue; + } + + ss = pctx->session; + cs = &pctx->cs[csidx]; + + if (ss->live_type == NGX_MPEGTS_LIVE || ss->live_type == NGX_HLS_LIVE) { + continue; + } + + /* send gop cache is set */ + switch (ngx_rtmp_gop_send(s, ss)) { + case NGX_DECLINED: + break; + case NGX_ERROR: + ngx_rtmp_finalize_session(ss); + continue; + default: + peers++; + continue; + } + + /* send metadata */ + + if (meta && meta_version != pctx->meta_version) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, ss->log, 0, + "live: meta"); + + if (ngx_rtmp_send_message(ss, meta, 0) == NGX_OK) { + pctx->meta_version = meta_version; + } + } + + /* sync stream */ + + if (cs->active && (lacf->sync && cs->dropped > lacf->sync)) { + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, ss->log, 0, + "live: sync %s dropped=%uD", MSG_TYPE, cs->dropped); + + cs->active = 0; + cs->dropped = 0; + } + + /* absolute packet */ + + if (!cs->active) { + + if (mandatory) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, ss->log, 0, + "live: skipping header"); + continue; + } + + if (lacf->wait_video && h->type == NGX_RTMP_MSG_AUDIO && + !pctx->cs[0].active) + { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, ss->log, 0, + "live: waiting for video"); + continue; + } + + if (lacf->wait_key && prio != NGX_RTMP_VIDEO_KEY_FRAME && + (lacf->interleave || h->type == NGX_RTMP_MSG_VIDEO)) + { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, ss->log, 0, + "live: skip non-key"); + continue; + } + + dummy_audio = 0; + if (lacf->wait_video && h->type == NGX_RTMP_MSG_VIDEO && + !pctx->cs[1].active) + { + dummy_audio = 1; + if (dummy == NULL) { + dummy = ngx_rtmp_shared_alloc_frame(cscf->chunk_size, + NULL, 1); + dummy->hdr = clh; + } + } + + if (header || coheader) { + + /* send absolute codec header */ + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, ss->log, 0, + "live: abs %s header timestamp=%uD", + MSG_TYPE, lh.timestamp); + + if (header) { + header->hdr = lh; + rc = ngx_rtmp_send_message(ss, header, 0); + if (rc != NGX_OK) { + continue; + } + } + + if (coheader) { + coheader->hdr = clh; + rc = ngx_rtmp_send_message(ss, coheader, 0); + if (rc != NGX_OK) { + continue; + } + + } else if (dummy_audio) { + ngx_rtmp_send_message(ss, dummy, 0); + } + + cs->timestamp = lh.timestamp; + cs->active = 1; + ss->current_time = cs->timestamp; + + } + } + + /* send av packet */ + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, ss->log, 0, + "live: rel %s packet delta=%uD", + MSG_TYPE, delta); + + if (ngx_rtmp_send_message(ss, avframe, prio) != NGX_OK) { + ++pctx->ndropped; + + cs->dropped += delta; + + if (mandatory) { + ngx_log_debug0(NGX_LOG_DEBUG_RTMP, ss->log, 0, + "live: mandatory packet failed"); + ngx_rtmp_finalize_session(ss); + } + + continue; + } + + cs->timestamp += delta; + ++peers; + ss->current_time = cs->timestamp; + } + + if (avframe) { + ngx_rtmp_shared_free_frame(avframe); + } + + if (dummy) { + ngx_rtmp_shared_free_frame(dummy); + } + + ngx_rtmp_update_bandwidth(&ctx->stream->bw_in, h->mlen); + ngx_rtmp_update_bandwidth(&ctx->stream->bw_out, h->mlen * peers); + + ngx_rtmp_update_bandwidth(h->type == NGX_RTMP_MSG_AUDIO ? + &ctx->stream->bw_in_audio : + &ctx->stream->bw_in_video, + h->mlen); + + return NGX_OK; +} + + +static ngx_int_t +ngx_rtmp_live_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v) +{ + ngx_rtmp_live_app_conf_t *lacf; + ngx_rtmp_live_ctx_t *ctx; + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + + if (lacf == NULL || !lacf->live) { + goto next; + } + + ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0, + "live: publish: name='%s' type='%s'", + v->name, v->type); + + /* join stream as publisher */ + + ngx_rtmp_live_join(s, v->name, 1); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + if (ctx == NULL || !ctx->publishing) { + goto next; + } + + ctx->silent = v->silent; + + if (!ctx->silent) { + ngx_rtmp_send_status(s, "NetStream.Publish.Start", + "status", "Start publishing"); + } + +next: + return next_publish(s, v); +} + + +static ngx_int_t +ngx_rtmp_live_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v) +{ + ngx_rtmp_live_app_conf_t *lacf; + ngx_rtmp_live_ctx_t *ctx; + ngx_rtmp_session_t *ps; + + lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module); + + if (lacf == NULL || !lacf->live || + s->live_type == NGX_HLS_LIVE || s->live_type == NGX_MPEGTS_LIVE) + { + goto next; + } + + ngx_log_debug4(NGX_LOG_DEBUG_RTMP, s->log, 0, + "live: play: name='%s' start=%uD duration=%uD reset=%d", + v->name, (uint32_t) v->start, + (uint32_t) v->duration, (uint32_t) v->reset); + + /* join stream as subscriber */ + + ngx_rtmp_live_join(s, v->name, 0); + + ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); + if (ctx == NULL) { + goto next; + } + + ctx->silent = v->silent; + + if (!ctx->silent && !lacf->play_restart) { + ngx_rtmp_send_status(s, "NetStream.Play.Start", + "status", "Start live"); + ngx_rtmp_send_sample_access(s); + } + + if (s->live_stream->publish_ctx && s->live_stream->publish_ctx->session) { + ps = s->live_stream->publish_ctx->session; + ngx_rtmp_gop_send(ps, s); + } + +next: + return next_play(s, v); +} + + +static ngx_int_t +ngx_rtmp_live_postconfiguration(ngx_conf_t *cf) +{ + ngx_rtmp_core_main_conf_t *cmcf; + ngx_rtmp_handler_pt *h; + + cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module); + + /* register raw event handlers */ + + h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AUDIO]); + *h = ngx_rtmp_live_av; + + h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_VIDEO]); + *h = ngx_rtmp_live_av; + + /* chain handlers */ + + next_publish = ngx_rtmp_publish; + ngx_rtmp_publish = ngx_rtmp_live_publish; + + next_play = ngx_rtmp_play; + ngx_rtmp_play = ngx_rtmp_live_play; + + next_close_stream = ngx_rtmp_close_stream; + ngx_rtmp_close_stream = ngx_rtmp_live_close_stream; + + next_pause = ngx_rtmp_pause; + ngx_rtmp_pause = ngx_rtmp_live_pause; + + next_stream_begin = ngx_rtmp_stream_begin; + ngx_rtmp_stream_begin = ngx_rtmp_live_stream_begin; + + next_stream_eof = ngx_rtmp_stream_eof; + ngx_rtmp_stream_eof = ngx_rtmp_live_stream_eof; + + return NGX_OK; +} diff --git a/StreamMedia/流媒体测试服务器搭建.md b/StreamMedia/流媒体测试服务器搭建.md new file mode 100644 index 0000000..4db9328 --- /dev/null +++ b/StreamMedia/流媒体测试服务器搭建.md @@ -0,0 +1,39 @@ +# Nginx 搭建rtmp流媒体服务器 +## 1.源码下载(所有代码放一个路径) +### Nginx-1.17.6:https://nginx.org/en/download.html +### nginx-client-module:https://github.com/AlexWoo/nginx-client-module.git +### nginx-multiport-module:https://github.com/AlexWoo/nginx-multiport-module.git +### nginx-toolkit-module:https://github.com/AlexWoo/nginx-toolkit-module.git +### nginx-multiport-module:https://github.com/AlexWoo/nginx-multiport-module.git + +## 2.解压Nginx + tar -zxvf nginx-1.17.6.tar.gz + +## 3.配置 + 进入nginx-1.17.6路径,执行下面命令: + ./configure --prefix=/home/kelinlang/workspace/install/nginx_rtmp/nginx-1.17.6 --add-module=../nginx-client-module --add-module=../nginx-multiport-module --add-module=../nginx-toolkit-module --add-module=../nginx-rtmp-module --with-http_ssl_module --with-cc-opt="-Wno-error" + 备注:--prefix用于设置安装目录,根据实际情况设置路径 + +## 4.编译安装 + make && make install + +## 5.修改配置文件 + 配置文件路径:/home/kelinlang/workspace/install/nginx_rtmp/nginx-1.17.6/conf/nginx.conf +## 6.启动服务 + 进入安装目录sbin文件夹,执行nginx + 备注:启动服务后出现报端口号错误需要修改配置文件或者杀占用端口号的进程 + + +# ZLMeideaKit搭建rtsp服务器(开源库本身支持H265视频流) +## 1.源码下载 + git clone https://github.com/xiongziliang/ZLMediaKit.git +## 2.更新依赖库 + cd ZLMediaKit + git submodule update --init +## 3.编译 + cd ZLMediaKit + ./build_for_linux.sh +## 4.运行服务器 + 进入路径:/release/linux/Debug + 执行:./MediaServer + 备注:启动服务后会自动生成配置文件config.ini,如果运行服务打印log提示断开被占用需要修改对应端口号 diff --git a/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云.html b/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云.html new file mode 100644 index 0000000..3718082 --- /dev/null +++ b/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云.html @@ -0,0 +1,338 @@ + + +FFmpeg时间戳详解 - 云+社区 - 腾讯云

FFmpeg时间戳详解

1. I帧/P帧/B帧

I帧:I帧(Intra-coded picture, 帧内编码帧,常称为关键帧)包含一幅完整的图像信息,属于帧内编码图像,不含运动矢量,在解码时不需要参考其他帧图像。因此在I帧图像处可以切换频道,而不会导致图像丢失或无法解码。I帧图像用于阻止误差的累积和扩散。在闭合式GOP中,每个GOP的第一个帧一定是I帧,且当前GOP的数据不会参考前后GOP的数据。

P帧:P帧(Predictive-coded picture, 预测编码图像帧)是帧间编码帧,利用之前的I帧或P帧进行预测编码。

B帧:B帧(Bi-directionally predicted picture, 双向预测编码图像帧)是帧间编码帧,利用之前和(或)之后的I帧或P帧进行双向预测编码。B帧不可以作为参考帧。 + B帧具有更高的压缩率,但需要更多的缓冲时间以及更高的CPU占用率,因此B帧适合本地存储以及视频点播,而不适用对实时性要求较高的直播系统。

2. DTS和PTS

DTS(Decoding Time Stamp, 解码时间戳),表示压缩帧的解码时间。 + PTS(Presentation Time Stamp, 显示时间戳),表示将压缩帧解码后得到的原始帧的显示时间。 + 音频中DTS和PTS是相同的。视频中由于B帧需要双向预测,B帧依赖于其前和其后的帧,因此含B帧的视频解码顺序与显示顺序不同,即DTS与PTS不同。当然,不含B帧的视频,其DTS和PTS是相同的。下图以一个开放式GOP示意图为例,说明视频流的解码顺序和显示顺序 +

+ 采集顺序指图像传感器采集原始信号得到图像帧的顺序。 + 编码顺序指编码器编码后图像帧的顺序。存储到磁盘的本地视频文件中图像帧的顺序与编码顺序相同。 + 传输顺序指编码后的流在网络中传输过程中图像帧的顺序。 + 解码顺序指解码器解码图像帧的顺序。 + 显示顺序指图像帧在显示器上显示的顺序。 + 采集顺序与显示顺序相同。编码顺序、传输顺序和解码顺序相同。 + 以图中“B[1]”帧为例进行说明,“B[1]”帧解码时需要参考“I[0]”帧和“P[3]”帧,因此“P[3]”帧必须比“B[1]”帧先解码。这就导致了解码顺序和显示顺序的不一致,后显示的帧需要先解码。

3. FFmpeg中的时间基与时间戳

3.1 时间基与时间戳的概念

在FFmpeg中,时间基(time_base)是时间戳(timestamp)的单位,时间戳值乘以时间基,可以得到实际的时刻值(以秒等为单位)。例如,如果一个视频帧的dts是40,pts是160,其time_base是1/1000,那么可以计算出此视频帧的解码时刻是40毫秒(40/1000),显示时刻是160毫秒(160/1000)。FFmpeg中时间戳(pts/dts)的类型是int64_t类型,把一个time_base看作一个时钟脉冲,则可把dts/pts看作时钟脉冲的计数。

3.2 三种时间基tbr、tbn和tbc

不同的封装格式具有不同的时间基。在FFmpeg处理音视频过程中的不同阶段,也会采用不同的时间基。 + FFmepg中有三种时间基,命令行中tbr、tbn和tbc的打印值就是这三种时间基的倒数: + tbn:对应容器中的时间基。值是AVStream.time_base的倒数 + tbc:对应编解码器中的时间基。值是AVCodecContext.time_base的倒数 + tbr:从视频流中猜算得到,可能是帧率或场率(帧率的2倍)

测试文件下载:tnmil3.flv + 使用ffprobe探测媒体文件格式,如下:

think@opensuse> ffprobe tnmil3.flv 
+ffprobe version 4.1 Copyright (c) 2007-2018 the FFmpeg developers
+Input #0, flv, from 'tnmil3.flv':
+  Metadata:
+    encoder         : Lavf58.20.100
+  Duration: 00:00:03.60, start: 0.017000, bitrate: 513 kb/s
+    Stream #0:0: Video: h264 (High), yuv420p(progressive), 784x480, 25 fps, 25 tbr, 1k tbn, 50 tbc
+    Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp, 128 kb/s

关于tbr、tbn和tbc的说明,原文如下,来自FFmpeg邮件列表:

There are three different time bases for time stamps in FFmpeg. The + values printed are actually reciprocals of these, i.e. 1/tbr, 1/tbn and + 1/tbc. + tbn is the time base in AVStream that has come from the container, I + think. It is used for all AVStream time stamps. + tbc is the time base in AVCodecContext for the codec used for a + particular stream. It is used for all AVCodecContext and related time + stamps. + tbr is guessed from the video stream and is the value users want to see + when they look for the video frame rate, except sometimes it is twice + what one would expect because of field rate versus frame rate. +

3.3 内部时间基AV_TIME_BASE

除以上三种时间基外,FFmpeg还有一个内部时间基AV_TIME_BASE(以及分数形式的AV_TIME_BASE_Q)

// Internal time base represented as integer
+#define AV_TIME_BASE            1000000
+
+// Internal time base represented as fractional value
+#define AV_TIME_BASE_Q          (AVRational){1, AV_TIME_BASE}

AV_TIME_BASE及AV_TIME_BASE_Q用于FFmpeg内部函数处理,使用此时间基计算得到时间值表示的是微秒。

3.4 时间值形式转换

av_q2d()将时间从AVRational形式转换为double形式。AVRational是分数类型,double是双精度浮点数类型,转换的结果单位是秒。转换前后的值基于同一时间基,仅仅是数值的表现形式不同而已。

qv_q2d()实现如下:

/**
+ * Convert an AVRational to a `double`.
+ * @param a AVRational to convert
+ * @return `a` in floating-point form
+ * @see av_d2q()
+ */
+static inline double av_q2d(AVRational a){
+    return a.num / (double) a.den;
+}

qv_q2d()使用方法如下:

时刻值:timestamp(单位秒) = pts × av_q2d(stream->time_base);
+时长值:duration(单位秒) = stream->duration × av_q2d(stream->time_base);

3.5 时间基转换函数

av_rescale_q()用于不同时间基的转换,用于将时间值从一种时间基转换为另一种时间基。

/**
+ * Rescale a 64-bit integer by 2 rational numbers.
+ *
+ * The operation is mathematically equivalent to `a × bq / cq`.
+ *
+ * This function is equivalent to av_rescale_q_rnd() with #AV_ROUND_NEAR_INF.
+ *
+ * @see av_rescale(), av_rescale_rnd(), av_rescale_q_rnd()
+ */
+int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const;

av_packet_rescale_ts()用于将AVPacket中各种时间值从一种时间基转换为另一种时间基。

/**
+ * Convert valid timing fields (timestamps / durations) in a packet from one
+ * timebase to another. Timestamps with unknown values (AV_NOPTS_VALUE) will be
+ * ignored.
+ *
+ * @param pkt packet on which the conversion will be performed
+ * @param tb_src source timebase, in which the timing fields in pkt are
+ *               expressed
+ * @param tb_dst destination timebase, to which the timing fields will be
+ *               converted
+ */
+void av_packet_rescale_ts(AVPacket *pkt, AVRational tb_src, AVRational tb_dst);

3.6 转封装过程中的时间基转换

容器中的时间基(AVStream.time_base,3.2节中的tbn)定义如下:

typedef struct AVStream {
+    ......
+    /**
+     * This is the fundamental unit of time (in seconds) in terms
+     * of which frame timestamps are represented.
+     *
+     * decoding: set by libavformat
+     * encoding: May be set by the caller before avformat_write_header() to
+     *           provide a hint to the muxer about the desired timebase. In
+     *           avformat_write_header(), the muxer will overwrite this field
+     *           with the timebase that will actually be used for the timestamps
+     *           written into the file (which may or may not be related to the
+     *           user-provided one, depending on the format).
+     */
+    AVRational time_base;
+    ......
+}

AVStream.time_base是AVPacket中pts和dts的时间单位,输入流与输出流中time_base按如下方式确定: + 对于输入流:打开输入文件后,调用avformat_find_stream_info()可获取到每个流中的time_base + 对于输出流:打开输出文件后,调用avformat_write_header()可根据输出文件封装格式确定每个流的time_base并写入输出文件中

不同封装格式具有不同的时间基,在转封装(将一种封装格式转换为另一种封装格式)过程中,时间基转换相关代码如下:

av_read_frame(ifmt_ctx, &pkt);
+pkt.pts = av_rescale_q_rnd(pkt.pts, in_stream->time_base, out_stream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
+pkt.dts = av_rescale_q_rnd(pkt.dts, in_stream->time_base, out_stream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
+pkt.duration = av_rescale_q(pkt.duration, in_stream->time_base, out_stream->time_base);

下面的代码具有和上面代码相同的效果:

// 从输入文件中读取packet
+av_read_frame(ifmt_ctx, &pkt);
+// 将packet中的各时间值从输入流封装格式时间基转换到输出流封装格式时间基
+av_packet_rescale_ts(&pkt, in_stream->time_base, out_stream->time_base);

这里流里的时间基in_stream->time_baseout_stream->time_base,是容器中的时间基,就是3.2节中的tbn。

例如,flv封装格式的time_base为{1,1000},ts封装格式的time_base为{1,90000} + 我们编写程序将flv封装格式转换为ts封装格式,抓取原文件(flv)的前四帧显示时间戳:

think@opensuse> ffprobe -show_frames -select_streams v tnmil3.flv | grep pkt_pts  
+ffprobe version 4.1 Copyright (c) 2007-2018 the FFmpeg developers
+Input #0, flv, from 'tnmil3.flv':
+  Metadata:
+    encoder         : Lavf58.20.100
+  Duration: 00:00:03.60, start: 0.017000, bitrate: 513 kb/s
+    Stream #0:0: Video: h264 (High), yuv420p(progressive), 784x480, 25 fps, 25 tbr, 1k tbn, 50 tbc
+    Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp, 128 kb/s
+pkt_pts=80
+pkt_pts_time=0.080000
+pkt_pts=120
+pkt_pts_time=0.120000
+pkt_pts=160
+pkt_pts_time=0.160000
+pkt_pts=200
+pkt_pts_time=0.200000

再抓取转换的文件(ts)的前四帧显示时间戳:

think@opensuse> ffprobe -show_frames -select_streams v tnmil3.ts | grep pkt_pts  
+ffprobe version 4.1 Copyright (c) 2007-2018 the FFmpeg developers
+Input #0, mpegts, from 'tnmil3.ts':
+  Duration: 00:00:03.58, start: 0.017000, bitrate: 619 kb/s
+  Program 1 
+    Metadata:
+      service_name    : Service01
+      service_provider: FFmpeg
+    Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(progressive), 784x480, 25 fps, 25 tbr, 90k tbn, 50 tbc
+    Stream #0:1[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 127 kb/s
+pkt_pts=7200
+pkt_pts_time=0.080000
+pkt_pts=10800
+pkt_pts_time=0.120000
+pkt_pts=14400
+pkt_pts_time=0.160000
+pkt_pts=18000
+pkt_pts_time=0.200000

可以发现,对于同一个视频帧,它们时间基(tbn)不同因此时间戳(pkt_pts)也不同,但是计算出来的时刻值(pkt_pts_time)是相同的。 + 看第一帧的时间戳,计算关系:80×{1,1000} == 7200×{1,90000} == 0.080000

3.7 转码过程中的时间基转换

编解码器中的时间基(AVCodecContext.time_base,3.2节中的tbc)定义如下:

typedef struct AVCodecContext {
+    ......
+    
+    /**
+     * This is the fundamental unit of time (in seconds) in terms
+     * of which frame timestamps are represented. For fixed-fps content,
+     * timebase should be 1/framerate and timestamp increments should be
+     * identically 1.
+     * This often, but not always is the inverse of the frame rate or field rate
+     * for video. 1/time_base is not the average frame rate if the frame rate is not
+     * constant.
+     *
+     * Like containers, elementary streams also can store timestamps, 1/time_base
+     * is the unit in which these timestamps are specified.
+     * As example of such codec time base see ISO/IEC 14496-2:2001(E)
+     * vop_time_increment_resolution and fixed_vop_rate
+     * (fixed_vop_rate == 0 implies that it is different from the framerate)
+     *
+     * - encoding: MUST be set by user.
+     * - decoding: the use of this field for decoding is deprecated.
+     *             Use framerate instead.
+     */
+    AVRational time_base;
+    
+    ......
+}

上述注释指出,AVCodecContext.time_base是帧率(视频帧)的倒数,每帧时间戳递增1,那么tbc就等于帧率。编码过程中,应由用户设置好此参数。解码过程中,此参数已过时,建议直接使用帧率倒数用作时间基。 + 这里有一个问题:按照此处注释说明,帧率为25的视频流,tbc理应为25,但实际值却为50,不知作何解释?是否tbc已经过时,不具参考意义?

根据注释中的建议,实际使用时,在视频解码过程中,我们不使用AVCodecContext.time_base,而用帧率倒数作时间基,在视频编码过程中,我们将AVCodecContext.time_base设置为帧率的倒数。

3.7.1 视频流

视频按帧播放,所以解码后的原始视频帧时间基为 1/framerate。 + 视频解码过程中的时间基转换处理:

AVFormatContext *ifmt_ctx;
+AVStream *in_stream;
+AVCodecContext *dec_ctx;
+AVPacket packet;
+AVFrame *frame;
+
+// 从输入文件中读取编码帧
+av_read_frame(ifmt_ctx, &packet);
+
+// 时间基转换
+int raw_video_time_base = av_inv_q(dec_ctx->framerate);
+av_packet_rescale_ts(packet, in_stream->time_base, raw_video_time_base);
+
+// 解码
+avcodec_send_packet(dec_ctx, packet)
+avcodec_receive_frame(dec_ctx, frame);

视频编码过程中的时间基转换处理:

AVFormatContext *ofmt_ctx;
+AVStream *out_stream;
+AVCodecContext *dec_ctx;
+AVCodecContext *enc_ctx;
+AVPacket packet;
+AVFrame *frame;
+
+// 编码
+avcodec_send_frame(enc_ctx, frame);
+avcodec_receive_packet(enc_ctx, packet);
+
+// 时间基转换
+packet.stream_index = out_stream_idx;
+enc_ctx->time_base = av_inv_q(dec_ctx->framerate);
+av_packet_rescale_ts(&opacket, enc_ctx->time_base, out_stream->time_base);
+
+// 将编码帧写入输出媒体文件
+av_interleaved_write_frame(o_fmt_ctx, &packet);

3.7.2 音频流

音频按采样点播放,所以解码后的原始音频帧时间基为 1/sample_rate + 音频解码过程中的时间基转换处理:

AVFormatContext *ifmt_ctx;
+AVStream *in_stream;
+AVCodecContext *dec_ctx;
+AVPacket packet;
+AVFrame *frame;
+
+// 从输入文件中读取编码帧
+av_read_frame(ifmt_ctx, &packet);
+
+// 时间基转换
+int raw_audio_time_base = av_inv_q(dec_ctx->sample_rate);
+av_packet_rescale_ts(packet, in_stream->time_base, raw_audio_time_base);
+
+// 解码
+avcodec_send_packet(dec_ctx, packet)
+avcodec_receive_frame(dec_ctx, frame);

音频编码过程中的时间基转换处理:

AVFormatContext *ofmt_ctx;
+AVStream *out_stream;
+AVCodecContext *dec_ctx;
+AVCodecContext *enc_ctx;
+AVPacket packet;
+AVFrame *frame;
+
+// 编码
+avcodec_send_frame(enc_ctx, frame);
+avcodec_receive_packet(enc_ctx, packet);
+
+// 时间基转换
+packet.stream_index = out_stream_idx;
+enc_ctx->time_base = av_inv_q(dec_ctx->sample_rate);
+av_packet_rescale_ts(&opacket, enc_ctx->time_base, out_stream->time_base);
+
+// 将编码帧写入输出媒体文件
+av_interleaved_write_frame(o_fmt_ctx, &packet);

4. 参考资料

[1]. What does the output of ffmpeg mean? tbr tbn tbc etc? + [2]. 视频编解码基础概念, https://www.cnblogs.com/leisure_chn/p/10285829.html + [3]. 对ffmpeg的时间戳的理解笔记, https://blog.csdn.net/topsluo/article/details/76239136 + [4]. ffmpeg中的时间戳与时间基, http://www.imooc.com/article/91381 + [5]. ffmpeg编解码中涉及到的pts详解, http://www.52ffmpeg.com/article/353.html + [6]. 音视频录入的pts和dts问题, https://blog.csdn.net/zhouyongku/article/details/38510747

5. 修改记录

2019-03-16 V1.0 初稿 + 2019-03-23 V1.1 增加3.7节

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1ea9bosv4dy7r

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

扫码关注云+社区

领取腾讯云代金券

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券

\ No newline at end of file diff --git a/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云_files/AskDialog-201906131103.css b/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云_files/AskDialog-201906131103.css new file mode 100644 index 0000000..83ffdfb --- /dev/null +++ b/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云_files/AskDialog-201906131103.css @@ -0,0 +1,2 @@ +@charset "UTF-8";.qa-mask{left:0;top:0;z-index:9000;width:100%;height:100%;background-color:#000;opacity:.7;filter:alpha(opacity=70)}.qa-screenshot{position:fixed;z-index:9001}.qa-screenshot-tools{padding:0 10px;white-space:nowrap;height:40px;line-height:40px;background-color:#fff;border-radius:2px;font-size:0}.qa-screenshot-tools .image-edit-btn{box-sizing:border-box;display:inline-block;vertical-align:middle;margin:0 10px;padding:0;width:24px;height:24px;line-height:24px;text-align:center;border:none;background-color:transparent;font-size:0;cursor:pointer}.qa-screenshot-tools .image-edit-btn:after{content:'';display:inline-block;vertical-align:middle;width:100%;height:100%}.qa-screenshot-tools .image-edit-btn:focus{outline:0}.qa-screenshot-tools .image-edit-btn.rect:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:51.72% 67.22%;background-size:945.8333333333334% 850%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.rect.actived:after,.qa-screenshot-tools .image-edit-btn.rect:hover:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:72.91% 0.5599999999999999%;background-size:945.8333333333334% 850%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.round:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:26.11% 38.33%;background-size:945.8333333333334% 850%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.round.actived:after,.qa-screenshot-tools .image-edit-btn.round:hover:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:0.49% 38.33%;background-size:945.8333333333334% 850%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.arrow:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:38.92% 52.78%;background-size:945.8333333333334% 850%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.arrow.actived:after,.qa-screenshot-tools .image-edit-btn.arrow:hover:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:13.3% 52.78%;background-size:945.8333333333334% 850%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.brush:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:47.29% 15%;background-size:945.8333333333334% 850%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.brush.actived:after,.qa-screenshot-tools .image-edit-btn.brush:hover:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:47.29% 0.5599999999999999%;background-size:945.8333333333334% 850%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.text:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:60.099999999999994% 43.89%;background-size:945.8333333333334% 850%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.text.actived:after,.qa-screenshot-tools .image-edit-btn.text:hover:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:0.49% 52.78%;background-size:945.8333333333334% 850%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.revocation:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:72.91% 15%;background-size:945.8333333333334% 850%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.revocation.actived:after,.qa-screenshot-tools .image-edit-btn.revocation:hover:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:26.11% 52.78%;background-size:945.8333333333334% 850%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.cancle:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:47.29% 29.439999999999998%;background-size:945.8333333333334% 850%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.cancle.actived:after,.qa-screenshot-tools .image-edit-btn.cancle:hover:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:60.099999999999994% 0.5599999999999999%;background-size:945.8333333333334% 850%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.sure:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:38.92% 67.22%;background-size:945.8333333333334% 850%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.sure.actived:after,.qa-screenshot-tools .image-edit-btn.sure:hover:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:26.11% 67.22%;background-size:945.8333333333334% 850%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.mosaic:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:0.49% 67.22%;background-size:945.8333333333334% 850%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.mosaic.actived:after,.qa-screenshot-tools .image-edit-btn.mosaic:hover:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:13.3% 67.22%;background-size:945.8333333333334% 850%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.dot-small{margin:0 1px}.qa-screenshot-tools .image-edit-btn.dot-small:after{width:6px;height:6px;background-image:url(sprite/AskDialog-201906131103.svg);;background-position:95.02000000000001% 98.48%;background-size:3783.3333333333335% 3400%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.dot-small.actived:after,.qa-screenshot-tools .image-edit-btn.dot-small:hover:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:98.64% 98.48%;background-size:3783.3333333333335% 3400%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.dot-normal{margin:0 4px}.qa-screenshot-tools .image-edit-btn.dot-normal:after{width:12px;height:12px;background-image:url(sprite/AskDialog-201906131103.svg);;background-position:97.67% 94.27%;background-size:1891.6666666666667% 1700%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.dot-normal.actived:after,.qa-screenshot-tools .image-edit-btn.dot-normal:hover:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:97.67% 86.98%;background-size:1891.6666666666667% 1700%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.dot-large{width:auto}.qa-screenshot-tools .image-edit-btn.dot-large:after{width:20px;height:20px;background-image:url(sprite/AskDialog-201906131103.svg);;background-position:71.5% 28.799999999999997%;background-size:1135% 1019.9999999999999%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.dot-large.actived:after,.qa-screenshot-tools .image-edit-btn.dot-large:hover:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:11.110000000000001% 79.89%;background-size:1135% 1019.9999999999999%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.text-small{margin:0 2px}.qa-screenshot-tools .image-edit-btn.text-small:after{vertical-align:baseline;margin-top:10px;width:8px;height:10px;background-image:url(sprite/AskDialog-201906131103.svg);;background-position:59.81999999999999% 69.59%;background-size:2837.5% 2039.9999999999998%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.text-small.actived:after,.qa-screenshot-tools .image-edit-btn.text-small:hover:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:87.67% 90.21000000000001%;background-size:2837.5% 2039.9999999999998%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.text-normal{margin:0 3px}.qa-screenshot-tools .image-edit-btn.text-normal:after{vertical-align:baseline;margin-top:7px;width:10px;height:13px;background-image:url(sprite/AskDialog-201906131103.svg);;background-position:96.77% 79.58%;background-size:2270% 1569.230769230769%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.text-normal.actived:after,.qa-screenshot-tools .image-edit-btn.text-normal:hover:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:96.77% 71.73%;background-size:2270% 1569.230769230769%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.text-large{margin:0 5px}.qa-screenshot-tools .image-edit-btn.text-large:after{vertical-align:baseline;margin-top:3px;width:14px;height:17px;background-image:url(sprite/AskDialog-201906131103.svg);;background-position:37.09% 36.9%;background-size:1621.4285714285716% 1200%;;background-repeat:no-repeat}.qa-screenshot-tools .image-edit-btn.text-large.actived:after,.qa-screenshot-tools .image-edit-btn.text-large:hover:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:49.3% 50.8%;background-size:1621.4285714285716% 1200%;;background-repeat:no-repeat}.qa-screenshot-tools .split{display:inline-block;vertical-align:middle;margin:0 10px;width:1px;height:20px;background-color:#ddd}.qa-screenshot-tools [class*=' color-'],.qa-screenshot-tools [class^=color-]{margin:0 4px;border:1px solid #ccc;border-width:.5px}.qa-screenshot-tools .split+[class*=' color-'],.qa-screenshot-tools .split+[class^=color-]{margin-left:10px}.qa-screenshot-tools [class*=' color-']:last-child,.qa-screenshot-tools [class^=color-]:last-child{margin-right:10px}.qa-screenshot-tools [class*=' color-'].actived,.qa-screenshot-tools [class^=color-].actived{border-color:#888}.qa-screenshot-tools .image-edit-btn.color-red{background-color:#db4e33}.qa-screenshot-tools .image-edit-btn.color-yellow{background-color:#f9e96a}.qa-screenshot-tools .image-edit-btn.color-green{background-color:#9fe561}.qa-screenshot-tools .image-edit-btn.color-blue{background-color:#67b1f3}.qa-screenshot-tools .image-edit-btn.color-gray{background-color:#676767}.qa-screenshot-tools .image-edit-btn.color-white{background-color:#fff}.qa-screenshot-tools.sub{position:absolute;top:100%;margin-top:10px}.qa-screenshot-tools.sub:before{content:'';position:absolute;left:50%;bottom:100%;margin-left:-5px;border-style:solid;border-color:#fff transparent;border-width:0 5px 5px}.qa-r-editor-container{position:relative;padding-top:55px;border:1px solid #e5e5e5;background-color:#fff}.qa-r-editor-toolbar{position:absolute;left:0;top:0;z-index:100;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;padding:0 18px;height:54px;border-bottom:1px solid #e5e5e5;background-color:#f7f8fa;line-height:54px;font-size:0}.qa-r-editor-btns{overflow:hidden}.qa-r-editor-btns-inner{-webkit-transition:-webkit-transform .3s ease;transition:-webkit-transform .3s ease;transition:transform .3s ease;transition:transform .3s ease,-webkit-transform .3s ease;-webkit-transform:translate3d(-365px,0,0);transform:translate3d(-365px,0,0)}.qa-r-editor-btn-wrap{display:inline-block;vertical-align:middle;margin-right:11px}.qa-r-editor-btn{display:inline-block;vertical-align:middle;padding:0;width:20px;height:20px;border:none;background-color:transparent;cursor:pointer;text-align:center;line-height:20px}.qa-r-editor-btn i{display:inline-block;vertical-align:middle;width:16px;height:16px;font-size:0;font-style:normal}.qa-r-editor-btn.disabled{opacity:.5;cursor:not-allowed}.qa-ico-bold,.qa-r-editor-btn.disabled .qa-ico-bold,.qa-r-editor-btn.disabled:hover .qa-ico-bold{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:67.77% 78.19%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-bold,.qa-r-editor-btn:hover .qa-ico-bold{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:82.46% 0.53%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-ico-italic,.qa-r-editor-btn.disabled .qa-ico-italic,.qa-r-editor-btn.disabled:hover .qa-ico-italic{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:43.13% 89.89%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-italic,.qa-r-editor-btn:hover .qa-ico-italic{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:51.66% 89.89%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-ico-underline,.qa-r-editor-btn.disabled .qa-ico-underline,.qa-r-editor-btn.disabled:hover .qa-ico-underline{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:17.54% 99.47%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-underline,.qa-r-editor-btn:hover .qa-ico-underline{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:26.07% 99.47%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-ico-code,.qa-r-editor-btn.disabled .qa-ico-code,.qa-r-editor-btn.disabled:hover .qa-ico-code{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:82.46% 48.4%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-code,.qa-r-editor-btn:hover .qa-ico-code{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:82.46% 57.98%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-ico-h,.qa-r-editor-btn.disabled .qa-ico-h,.qa-r-editor-btn.disabled:hover .qa-ico-h{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:26.07% 89.89%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-h,.qa-r-editor-btn:hover .qa-ico-h{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:34.599999999999994% 89.89%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-ico-blockquote,.qa-r-editor-btn.disabled .qa-ico-blockquote,.qa-r-editor-btn.disabled:hover .qa-ico-blockquote{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:59.24% 78.19%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-blockquote,.qa-r-editor-btn:hover .qa-ico-blockquote{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:50.71% 78.19%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-ico-code-block,.qa-r-editor-btn.disabled .qa-ico-code-block,.qa-r-editor-btn.disabled:hover .qa-ico-code-block{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:82.46% 29.26%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-code-block,.qa-r-editor-btn:hover .qa-ico-code-block{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:82.46% 38.83%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-ico-ol,.qa-r-editor-btn.disabled .qa-ico-ol,.qa-r-editor-btn.disabled:hover .qa-ico-ol{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:91% 26.06%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-ol,.qa-r-editor-btn:hover .qa-ico-ol{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:91% 16.49%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-ico-ul,.qa-r-editor-btn.disabled .qa-ico-ul,.qa-r-editor-btn.disabled:hover .qa-ico-ul{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:9% 99.47%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-ul,.qa-r-editor-btn:hover .qa-ico-ul{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:0.47000000000000003% 99.47%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-ico-pic,.qa-r-editor-btn.disabled .qa-ico-pic,.qa-r-editor-btn.disabled:hover .qa-ico-pic{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:91% 45.21%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-pic,.qa-r-editor-btn:hover .qa-ico-pic{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:91% 35.64%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-ico-link,.qa-r-editor-btn.disabled .qa-ico-link,.qa-r-editor-btn.disabled:hover .qa-ico-link{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:91% 0.53%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-link,.qa-r-editor-btn:hover .qa-ico-link{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:77.25% 89.89%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-ico-delete-link,.qa-r-editor-btn.disabled .qa-ico-delete-link,.qa-r-editor-btn.disabled:hover .qa-ico-delete-link{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:82.46% 67.55%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-delete-link,.qa-r-editor-btn:hover .qa-ico-delete-link{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:82.46% 77.13%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-ico-arrow,.qa-r-editor-btn.disabled .qa-ico-arrow,.qa-r-editor-btn.disabled:hover .qa-ico-arrow{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:99.53% 29.26%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-arrow,.qa-r-editor-btn:hover .qa-ico-arrow{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:99.53% 10.11%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-r-editor-spliter{display:inline-block;vertical-align:middle;margin-right:11px;width:1px;height:16px;background-color:#ccc}.qa-r-editor{position:relative;padding:20px 15px;min-height:180px}.qa-r-editor-toolbar-more .qa-r-editor-btns-inner{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.qa-r-editor-toolbar-more .qa-r-editor-btn-trigger .qa-ico-arrow{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:99.53% 0.53%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-r-editor-toolbar-more .qa-r-editor-btn-trigger:hover .qa-ico-arrow{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:85.78% 99.47%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-r-editor-container.disabled .qa-r-editor-toolbar:after{content:'';position:absolute;left:0;top:0;width:100%;height:100%}.qa-r-editor-container.disabled .qa-r-editor-btn{opacity:.5}.qa-r-editor-tip{position:relative;height:180px;text-align:center;color:#888}.qa-r-editor-tip:before{content:'';display:inline-block;vertical-align:middle;width:0;height:100%}.qa-r-editor-tip .tip-cnt{display:inline-block;vertical-align:middle;max-width:98%}.qa-r-editor-bubble{position:absolute;left:18px;right:18px;top:100%;margin-top:-8px;color:#444;z-index:900}.qa-r-editor-bubble-inner{font-size:12px;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #e5e5e5;border-radius:2px;background-color:#fff;line-height:18px;position:static !important;left:310px;top:50%;padding:10px 100px 10px 10px;-webkit-box-shadow:0 1px 8px rgba(0,0,0,.1);box-shadow:0 1px 8px rgba(0,0,0,.1)}.qa-r-editor-bubble-inner:after,.qa-r-editor-bubble-inner:before{font-size:0;position:absolute;width:0;height:0;content:'';border:8px dashed transparent;bottom:100%;left:inherit;right:inherit;margin-bottom:-1px;border-bottom-style:solid}.qa-r-editor-bubble-inner:before{margin-left:-8px;border-bottom-color:#e5e5e5}.qa-r-editor-bubble-inner:after{margin-left:-7px;border-bottom-color:#fff}.qa-r-editor-bubble-input{font-size:14px;width:100%;height:30px;line-height:18px;display:inline-block;padding:5px 10px;border:1px solid #d1d2d3;border-radius:2px;color:#171d25;vertical-align:middle;-webkit-box-sizing:border-box;box-sizing:border-box;font-family:inherit}.qa-r-editor-bubble-input::-webkit-input-placeholder{color:#888}.qa-r-editor-bubble-input::-moz-placeholder{color:#888}.qa-r-editor-bubble-input:-ms-input-placeholder{color:#888}.qa-r-editor-bubble-input::placeholder{color:#888}.qa-r-editor-bubble-input.error{border:1px solid #e54545;color:#e54545}.qa-r-editor-bubble-btns{position:absolute;right:0;top:10px;width:100px;text-align:center;font-size:0}.qa-r-editor-bubble-btn{display:inline-block;vertical-align:middle;padding:0 8px;border:none;background-color:transparent;font-size:14px;line-height:30px;cursor:pointer;color:#00a4ff}.qa-r-editor-bubble-btn:hover{text-decoration:none;color:#0092ee}.qa-r-editor-bubble-btn-weak{color:#888}.qa-r-editor-bubble-btn-weak:hover{color:#0092ee}.qa-r-editor-bubble-tip.error{margin:5px 0 0;color:#e54545;font-size:14px}.qa-r-editor.draft-editor-host.c-markdown{white-space:normal;font-size:14px;line-height:1.5}.qa-r-editor.draft-editor-host.c-markdown h1:first-child,.qa-r-editor.draft-editor-host.c-markdown h2:first-child,.qa-r-editor.draft-editor-host.c-markdown h3:first-child,.qa-r-editor.draft-editor-host.c-markdown h4:first-child,.qa-r-editor.draft-editor-host.c-markdown h5:first-child,.qa-r-editor.draft-editor-host.c-markdown h6:first-child{margin-top:0}.qa-r-editor.draft-editor-host.c-markdown .public-DraftEditor-content{padding:15px}.qa-r-editor.draft-editor-host.c-markdown blockquote,.qa-r-editor.draft-editor-host.c-markdown div.paragraph,.qa-r-editor.draft-editor-host.c-markdown figure,.qa-r-editor.draft-editor-host.c-markdown img,.qa-r-editor.draft-editor-host.c-markdown p,.qa-r-editor.draft-editor-host.c-markdown pre{margin:0 0 10px}.qa-r-editor.draft-editor-host.c-markdown p{min-height:0}.qa-r-editor.draft-editor-host.c-markdown ol,.qa-r-editor.draft-editor-host.c-markdown ul{margin:0 0 15px}.qa-ani-loading{text-align:center}.qa-ani-loading>div{display:inline-block;width:8px;height:8px;border-radius:100%;background-color:#00a4ff;-webkit-animation:bouncedelay .7s infinite ease-in-out both;animation:bouncedelay .7s infinite ease-in-out both;text-align:center;margin-left:4px;margin-right:4px}.qa-ani-loading .one{-webkit-animation-delay:-.32s;animation-delay:-.32s}.qa-ani-loading .two{-webkit-animation-delay:-.16s;animation-delay:-.16s}@-webkit-keyframes bouncedelay{0%,100%,80%{-webkit-transform:scale(.5);opacity:1}40%{-webkit-transform:scale(1);opacity:.8}}@keyframes bouncedelay{0%,100%,80%{-webkit-transform:scale(.5);transform:scale(.5);opacity:1}40%{transform:scale(1);-webkit-transform:scale(1);opacity:.8}}.qa-notice-channel{margin-bottom:30px;padding:20px;border-radius:4px;background-color:#f7f8fa}.qa-notice-channel .c-input-list{display:inline-block;vertical-align:middle;padding-top:0}.qa-notice-channel .c-input-list label{margin-bottom:0;margin-right:20px;min-width:0;cursor:pointer}.qa-notice-channel .c-input-text{-webkit-box-sizing:border-box;box-sizing:border-box;margin-right:20px;width:150px;height:36px;line-height:24px}.qa-notice-channel .notice-channel-text{margin-bottom:10px;font-size:14px;color:#000}.qa-notice-channel .channel-setting{margin-top:10px;font-size:0}.qa-notice-channel .channel-setting .c-input-text{margin-right:10px}.qa-notice-channel .input-email{width:200px}.qa-notice-channel .input-code{width:120px}.qa-notice-channel .c-btn{margin-left:0;margin-right:10px;padding:0 10px;min-width:80px;height:36px;line-height:34px;vertical-align:middle}.qa-notice-channel .btn-counting{width:110px}.qa-notice-channel .channel-ft{margin-top:20px;padding-top:20px;border-top:1px solid #ddd}.qa-notice-channel .channel-ft .c-btn-link{min-width:0}.qa-notice-channel .c-f-tip-word.error{color:#e54545;font-size:14px}.qa-notice-channel p.c-f-tip-word.error{margin-top:5px}.qa-dialog{position:absolute;z-index:9001;background-color:#fff;padding:50px 0 30px;-webkit-box-sizing:border-box;box-sizing:border-box;width:560px;text-align:left;white-space:normal;border-radius:4px;font-family:PingFangSC-Light,'helvetica neue','hiragino sans gb',arial,'microsoft yahei ui','microsoft yahei',simsun,sans-serif;font-size:14px;line-height:1.5;color:#444}.qa-dialog :focus{outline:0}.qa-dialog-hd{margin-bottom:20px;padding:0 30px}.qa-dialog-title{margin:0;font-size:18px;font-weight:400;color:#000;line-height:1.1}.qa-dialog-close{position:absolute;right:27px;top:27px;font-size:0;text-align:center}.qa-dialog-close:before{content:'';display:inline-block;vertical-align:middle;width:16px;height:16px;background-image:url(sprite/AskDialog-201906131103.svg);;background-position:42.18% 78.19%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-dialog-close:hover:before{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:77.25% 99.47%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-dialog-bd{padding-left:30px;padding-right:30px}.qa-dialog-ft{padding-left:30px;padding-right:30px;margin-top:30px;text-align:center;font-size:0}.qa-dialog-ft .c-btn{margin:0 5px;padding:0 20px;min-width:0}.qa-dialog-btn .qa-ani-loading>div{background-color:#fff}.qa-dialog.small{width:360px}.qa-dialog.large{width:1000px}.qa-dialog.without-close{padding-top:30px}.qa-dialog-mask,.qa-mask{position:fixed;left:0;top:0;z-index:9000;width:100%;height:100%;background-color:#000;opacity:.7;filter:alpha(opacity=70)}.qa-dialog-container{position:fixed;left:0;top:0;z-index:9001;-webkit-box-sizing:border-box;box-sizing:border-box;padding:50px 0;width:100%;height:100%;overflow:auto;-webkit-overflow-scrolling:touch;text-align:center;white-space:nowrap}.qa-dialog-container:before{content:'';display:inline-block;vertical-align:middle;width:0;height:100%}.qa-dialog-container .qa-dialog{display:inline-block;vertical-align:middle;position:relative}.qa-dialog-confirm{width:auto;min-width:360px;max-width:560px}.qa-dialog-confirm .qa-dialog-hd{margin-bottom:12px}.qa-dialog-confirm-cnt{min-height:40px}.qa-dialog-confirm.error .qa-dialog-title,.qa-dialog-confirm.success .qa-dialog-title{position:relative;padding-left:42px}.qa-dialog-confirm.error .qa-dialog-title .icon,.qa-dialog-confirm.success .qa-dialog-title .icon{position:absolute;left:0;top:-7px;width:32px;height:32px;background-size:709.375% 637.5%;;background-image:url(sprite/AskDialog-201906131103.svg);;background-position:0.51% 0.58%;background-repeat:no-repeat}.qa-dialog-confirm.success .qa-dialog-title .icon{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:17.95% 0.58%;background-size:709.375% 637.5%;;background-repeat:no-repeat}.qa-dialog-confirm.error .qa-dialog-bd,.qa-dialog-confirm.success .qa-dialog-bd{padding-left:72px}.qa-dialog .c-btn{height:35px;border-radius:2px;color:#fff;font-size:14px;line-height:35px;text-align:center;display:inline-block;cursor:pointer;outline:0;box-sizing:border-box;padding:0 10px;min-width:90px;background-color:#00a4ff}.qa-dialog .c-btn:hover{text-decoration:none;background-color:#0092ee}.qa-dialog .c-btn-pay{background-color:#ff7200}.qa-dialog .c-btn-pay:hover{background-color:#f06c00}.qa-dialog .c-btn-disabled,.qa-dialog .c-btn-disabled:hover{background-color:#d5d7de;cursor:default}.qa-dialog .c-btn-hole{border:1px solid #00a4ff;background-color:#fff;color:#00a4ff;line-height:33px}.qa-dialog .c-btn-hole-white{border:1px solid #fff;background:0 0;color:#fff;line-height:33px}.qa-dialog .c-btn-hole:hover{background-color:#0092ee;border:1px solid #0092ee;color:#fff}.qa-dialog .c-btn-hole-white:hover{background-color:#fff;color:#0092ee}.qa-dialog .c-btn-weak{background:#fcfcfc;border:1px solid #d1d2d3;color:#00a4ff;line-height:33px}.qa-dialog .c-btn-weak:hover{background:#f2f2f2;border:1px solid #b4b7bf}.qa-dialog .c-btn-longer{width:220px}.qa-dialog .c-btn-big{height:45px;line-height:45px;font-size:16px}.qa-dialog .c-btn-small{height:30px;line-height:28px;min-width:100px;font-size:14px}.qa-dialog .c-link{color:#00a4ff;display:inline-block;margin:0 10px;font-size:14px}.qa-quickask-dialog .c-loading{text-align:center}.qa-quickask-dialog .c-loading .c-loading-inner>div{display:inline-block;width:10px;height:10px;border-radius:100%;background-color:#00a4ff;-webkit-animation:askBouncedelay .7s infinite ease-in-out both;animation:askBouncedelay .7s infinite ease-in-out both;text-align:center;margin-left:4px;margin-right:4px}.qa-quickask-dialog .c-loading .c-loading-inner .one{-webkit-animation-delay:-.32s;animation-delay:-.32s}.qa-quickask-dialog .c-loading .c-loading-inner .two{-webkit-animation-delay:-.16s;animation-delay:-.16s}@keyframes askBouncedelay{0%,100%,80%{-webkit-transform:scale(.5);transform:scale(.5);opacity:1}40%{transform:scale(1);-webkit-transform:scale(1);opacity:.8}}.qa-quickask-dialog .c-btn{height:36px;min-width:140px;padding:0 20px;background-color:#00a4ff;border:1px solid transparent;border:none;color:#fff;font-size:14px;line-height:34px;text-align:center;display:inline-block;cursor:pointer;outline:0;box-sizing:border-box}.qa-quickask-dialog .c-btn:hover{text-decoration:none;background-color:#0092ee}.qa-quickask-dialog .c-btn-weak{background:0 0;border:1px solid #DCDEE6;color:#666}.qa-quickask-dialog .c-btn-weak:hover{background:0 0;border:1px solid #999;color:#000}.qa-quickask-dialog .c-btn-hole{border:1px solid #00a4ff;background-color:transparent;color:#00a4ff}.qa-quickask-dialog .c-btn-hole:hover{background-color:rgba(0,164,255,.15);border:1px solid #00a4ff;color:#00a4ff}.qa-quickask-dialog .c-btn-disabled,.qa-quickask-dialog .c-btn-disabled:hover{background-color:#ddd;border-color:#ddd;color:#999;cursor:default}.qa-quickask-dialog .c-btn.loading{cursor:default}.qa-quickask-dialog .c-btn.loading .text{display:none}.qa-quickask-dialog .c-btn.loading .c-loading{display:block}.qa-quickask-dialog .c-btn .c-loading-inner>div{background-color:#fff;vertical-align:middle}.qa-quickask-dialog .c-btn.loading:hover{background-color:#00a4ff}.qa-quickask-dialog .c-btn-hole.loading:hover{background-color:#fff}.qa-quickask-dialog .c-btn-weak .c-loading-inner>div{background-color:#ddd}.qa-quickask-dialog .c-btn-weak.loading:hover{background-color:#fff;border-color:#ddd}.qa-quickask-dialog .c-btn-disabled .c-loading-inner>div{background-color:#fff}.qa-quickask-dialog .c-btn-disabled.loading:hover{background-color:#d5d7de}#qc-quickask-root .c-modal-mask{display:table-cell;vertical-align:middle;text-align:center;position:fixed;left:0;top:0;z-index:9000;width:100%;height:100%;background-color:#000;background-color:rgba(0,0,0,.7)}#qc-quickask-root .c-modal{position:fixed;z-index:9000;left:0;top:0;width:100%;height:100%}.qa-quickask-dialog-container.c-modal-visible{display:block;overflow-y:auto;text-align:center}.qa-quickask-dialog-container.c-modal-visible:before{content:' ';display:inline-block;vertical-align:middle;height:100%}.qa-quickask-dialog-container.c-modal-visible .c-modal-inner{display:inline-block;vertical-align:middle}.qa-quickask-dialog.c-dialog{display:block;padding-bottom:0;width:900px;max-width:99%;text-align:left;margin-left:auto;margin-right:auto;background-color:#fff}.qa-quickask-dialog .c-dialog-hd{position:relative;z-index:2}.qa-quickask-dialog .c-dialog-hd-title{font-size:16px;line-height:65px;font-weight:700;color:#333;padding-left:25px;display:block}.qa-quickask-dialog .c-dialog-hd-close{position:absolute;width:40px;height:40px;right:11px;top:50%;margin-top:-20px;background-color:transparent;font-size:0;text-align:center}.qa-quickask-dialog .c-dialog-hd-close span{display:none}.qa-quickask-dialog .c-dialog-hd-close:before{content:"";display:inline-block;vertical-align:middle;width:25px;height:25px;background-image:url(sprite/AskDialog-201906131103.svg);;background-size:908% 816%;;background-position:34.160000000000004% 0.5599999999999999%;background-repeat:no-repeat}.qa-quickask-dialog .c-dialog-hd-close:hover:before{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:34.160000000000004% 15.64%;background-size:908% 816%;;background-repeat:no-repeat}.qa-quickask-dialog .c-dialog-hd-close:after{content:"";display:inline-block;width:0;height:100%;vertical-align:middle}.qa-quickask-dialog .c-dialog-ft{text-align:center;padding:20px 25px 40px}.qa-quickask-dialog .c-dialog-ft .c-btn{margin:0 5px;padding-left:10px;padding-right:10px;min-width:100px;vertical-align:middle}.qa-quickask-dialog .c-dialog-bd{padding:0 25px;min-height:50px;max-height:inherit;overflow:hidden;overflow-y:auto;font-size:14px;color:#666;line-height:1.5;-webkit-overflow-scrolling:touch}.qa-quickask-form-item{margin-bottom:20px}.qa-quickask-form-item:last-child{margin-bottom:0}.qa-quickask-form-item.tag-item{margin-top:-10px}.qa-quickask-form-title{margin-bottom:10px;display:block;line-height:1.1;color:#000}.qa-quickask-dialog .qa-search-bar{width:100%;box-sizing:border-box}.qa-quickask-input{-webkit-box-sizing:border-box;box-sizing:border-box;padding:4px 15px;width:100%;height:45px;border:1px solid #e5e5e5;background-color:#fff;color:#444;line-height:35px;font-size:14px}.qa-quickask-input:focus,.qa-quickask-input:hover{border-color:#00a4ff;outline:0}.qa-quickask-input.error{border-color:#e54545}.qa-quickask-validate{margin-top:8px;margin-bottom:-10px;color:#e54545}.qa-quickask-count-validate{text-align:right}.qa-quickask-tip{margin-bottom:10px}.qa-quickask-dialog .com-2-tag-cont .com-2-text,.qa-quickask-dialog .qa-r-editor-container,.qa-quickask-dialog .qa-r-editor-container>.qa-r-editor-toolbar{border-radius:0}.qa-quickask-dialog .qa-r-editor-container .image-content img{max-height:200px}.qa-quickask-dialog .qa-r-editor.draft-editor-host.c-markdown .table-editor-context-menu ul{margin:0}.qa-quickask-dialog .qa-r-editor-container .image-block .image-block-actions{bottom:15px}.qa-quickask-dialog .inform-mode{padding-top:5px;padding-bottom:5px}.qa-ask-check-item{display:inline-block;vertical-align:top;position:relative;margin-right:10px;padding-left:21px;cursor:pointer;word-wrap:break-word;line-height:21px}.qa-ask-check-item.disabled{cursor:default;color:#999}.qa-ask-check-item.block{margin-right:0;display:block}.qa-ask-check-item span{vertical-align:middle}.qa-ask-check-item .weak-text{color:#999}.qa-ask-check-item .qa-ask-checkbox{position:absolute;left:0;top:3px}.qa-ask-checkbox{width:16px;height:16px;cursor:pointer;vertical-align:middle;outline:0;background:0 0\9;background-image:url(sprite/AskDialog-201906131103.svg);;-webkit-appearance:none;background-position:60.19% 89.89%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-ask-checkbox:focus,.qa-ask-checkbox:hover{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:60.19% 89.89%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-ask-checkbox:checked,.qa-ask-checkbox:checked:focus,.qa-ask-checkbox:checked:hover{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:68.72% 89.89%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-ask-checkbox[disabled]{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:91% 64.36%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-ask-checkbox[disabled]:checked{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:91% 54.790000000000006%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.form-ctrl-label.disabled,.qa-ask-checkbox-wrap.disabled,.qa-ask-checkbox[disabled],.qa-ask-checkbox[disabled]+label{cursor:default;cursor:not-allowed}.qa-modification a{color:#00a4ff}.qa-search-panel{box-sizing:border-box;background:url(src/projects/AskDialog/cssComponents/img/banner.png) center top no-repeat #1E232D;background-size:auto 100%;padding-top:90px;height:255px;min-width:1000px}.qa-search-panel .logo{margin-bottom:30px;font-size:24px;line-height:1.1;color:#000;text-align:center}.qa-search-panel .logo a{color:inherit}.qa-search-panel .logo a:hover{color:#00a4ff;text-decoration:none}.qa-search-panel .com-search-bar{display:block;margin:0 auto;width:650px}.qa-search-panel .com-search-bar .search-input{padding:10px 46px 10px 15px;height:40px}.qa-search-panel .com-search .search-btn{width:46px;line-height:40px;text-align:center}.qa-search-bar{position:relative;margin:0 auto;width:650px}.qa-search{position:relative;display:block}.qa-search .search-input{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;padding:10px 46px 10px 15px;width:100%;height:40px;border:none;border-radius:2px;font-size:14px;line-height:20px;color:#000;-webkit-box-shadow:0 1px 8px rgba(0,0,0,.1);box-shadow:0 1px 8px rgba(0,0,0,.1)}.qa-search input::-webkit-input-placeholder{color:#999}.qa-search input::-moz-placeholder{color:#999}.qa-search input:-ms-input-placeholder{color:#999}.qa-search input::placeholder{color:#999}.qa-search .search-btn{position:absolute;right:0;top:0;width:46px;height:100%;border:none;background-color:transparent;line-height:40px;font-size:0;text-align:center}.qa-search .search-btn:after{content:'';display:inline-block;vertical-align:middle;width:16px;height:16px;background-image:url(sprite/AskDialog-201906131103.svg);;background-position:91% 83.50999999999999%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-search .search-btn:hover:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:91% 73.94%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-search-bar.in-header{margin:0;width:auto;-webkit-transition:all .2s;transition:all .2s}.qa-search-bar.in-header .search-input{padding:7px 34px 7px 9px;height:34px;-webkit-box-shadow:none;box-shadow:none;background:#444}.qa-search-bar.in-header .search-input:focus{background:#fff}.qa-search-bar.in-header .search-btn{width:34px;line-height:34px}.qa-search-bar.in-header.hidden{opacity:0;visibility:hidden;pointer-events:none}.qa-search-bar.in-header.focus .search-input{background:#fff}.qa-search-bar.in-header.focus .search-btn:after{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:91% 73.94%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qc-header-search{position:absolute;left:50%;top:13px;box-sizing:border-box;margin-left:-500px;width:1000px;-webkit-transition:opacity .2s;transition:opacity .2s}.qc-header-search.hidden{opacity:0;visibility:hidden;pointer-events:none}.qc-header-search .qa-search-bar{width:650px}.qa-search-dropdown{display:none;position:absolute;left:0;top:100%;z-index:900;-webkit-box-sizing:border-box;box-sizing:border-box;margin-top:5px;width:100%;border-radius:2px;-webkit-box-shadow:0 2px 6px rgba(0,0,0,.3);box-shadow:0 2px 6px rgba(0,0,0,.3);background:#fff}.qa-search-bar.show .qa-search-dropdown{display:block}.qa-search-dropdown-bd{overflow-x:hidden;overflow-y:auto;max-height:400px;padding-top:10px}.qa-search-dropdown-group{margin-bottom:10px}.qa-search-dropdown-group dt{padding:0 20px;font-size:14px;line-height:35px;color:#888}.qa-search-dropdown-group .link{display:block;padding:10px 20px;font-size:14px;line-height:15px;color:#444;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-webkit-transition:all .2s;transition:all .2s}.qa-search-dropdown-group .link.hover,.qa-search-dropdown-group .link:hover{background-color:#f7f8fa;color:#00a4ff;text-decoration:none}.qa-search-dropdown-group .link .avatar,.qa-search-dropdown-group .link img{position:relative;top:-1px;vertical-align:middle;margin-right:9px;width:32px;height:32px;border-radius:50%}.qa-search-dropdown-group .link .avatar{display:inline-block;background-size:cover;background-position:center}.qa-search-dropdown-group .tag-icon{position:relative;top:-1px;display:inline-block;vertical-align:middle;margin-right:9px;width:32px;height:32px;background-image:url(sprite/AskDialog-201906131103.svg);;background-position:0.51% 20.349999999999998%;background-size:709.375% 637.5%;;background-repeat:no-repeat}.qa-search-dropdown-keywords{font-size:0;margin-left:20px}.qa-search-dropdown-keywords a{display:inline-block;vertical-align:middle;padding:5px 0;margin-right:20px;max-width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px;color:#444;line-height:24px}.qa-search-dropdown-keywords a:hover{color:#00a4ff;text-decoration:none}.qa-search-dropdown-history dt{position:relative;margin-bottom:10px;background-color:#f7f8fa}.qa-search-dropdown-history .link-clear{position:absolute;right:15px;top:0;padding:0 5px}.qa-search-dropdown-history .link-clear .qa-i-delete{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:0.47000000000000003% 89.89%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-search-dropdown-history .link-clear:hover .qa-i-delete{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:9% 89.89%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-search-dropdown-history .link{position:relative;padding-right:50px}.qa-search-dropdown-history .link-btn{position:absolute;right:15px;top:0;-webkit-box-sizing:border-box;box-sizing:border-box;padding:0 5px;height:100%;background-color:transparent;border:none;opacity:0;visibility:hidden;-webkit-transition:all .2s;transition:all .2s;cursor:pointer}.qa-search-dropdown-history .link-btn .qa-i-close{position:relative;top:-2px;background-image:url(sprite/AskDialog-201906131103.svg);;background-position:82.46% 19.68%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-search-dropdown-history .link-btn:hover .qa-i-close{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:82.46% 10.11%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.qa-search-dropdown-history .link:hover .link-btn{opacity:1;visibility:visible}.qa-search-dropdown-ft{-webkit-box-sizing:border-box;box-sizing:border-box;height:46px;background-color:#f7f8fa;border-top:1px solid #e5e5e5;line-height:45px;font-size:14px;overflow:hidden}.qa-search-dropdown-ft .link-more{display:block;color:#444;text-align:center}.qa-search-dropdown-ft .link-more:hover{color:#00a4ff;text-decoration:none}.qa-search-dropdown-ft .link-clear{float:right;margin-right:30px}.qa-search-dropdown.only-one-group .qa-search-dropdown-bd{max-height:none}.qa-search-dropdown.only-one-group .qa-search-dropdown-history dt{background-color:transparent}.qa-search-dropdown.only-one-group .qa-search-dropdown-history dd{max-height:300px;overflow-x:hidden;overflow-y:auto}.qa-search-keywords{margin:10px auto -5px;width:650px}.qa-search-keywords:after{content:'';display:table;clear:both}.qa-search-keywords a{float:left;margin-right:10px;font-size:14px;line-height:24px;color:#fff}.dialog-ask-finished .notice-channel-text{margin-bottom:10px;font-size:14px;color:#000}.dialog-ask-finished .channel-setting{margin-top:10px}.dialog-ask-finished .channel-setting .c-input-text{font-size:14px;line-height:23px;height:23px;display:inline-block;padding:5px 10px;border:1px solid #d1d2d3;border-radius:2px;color:#171d25;vertical-align:middle;box-sizing:content-box;margin-right:10px}.dialog-ask-finished .input-email{width:200px}.dialog-ask-finished .input-code{width:120px}.dialog-ask-finished .c-btn,.dialog-ask-finished .c-input-list input,.dialog-ask-finished .c-input-list span{vertical-align:middle}.com-tab-hd{position:relative;border-bottom:1px solid #e5e5e5}.com-tab-hd .com-tab-ctrl{border-bottom:none}.com-tab-hd-extra{position:absolute;right:0;top:0}.com-tab-ctrl{border-bottom:1px solid #e5e5e5;font-size:0}.com-tab-item{display:inline-block;vertical-align:middle;margin-right:10px}.com-tab-item:last-child{margin-right:0}.com-tab-item a{position:relative;display:block;padding:0 20px;height:32px;color:#999;font-size:12px;line-height:32px}.com-tab-item a:hover{color:#00a4ff}.com-tab-item.actived a,.com-tab-item.actived a:hover{color:#333;cursor:default;font-weight:700}.com-tab-item.actived a:after{content:'';position:absolute;left:0;right:0;bottom:-1px;height:2px;background-color:#00a4ff}.com-tab-panel{padding-top:20px}.com-tab-hd.large .com-tab-ctrl{border-bottom-color:#E1E3E9}.com-tab-hd.large .com-tab-item a{height:42px;font-size:16px;line-height:42px}.com-tab-hd.large .com-tab-item.actived a,.com-tab-hd.large .com-tab-item.actived a:hover{font-weight:400;color:#00a4ff}.com-tab-hd.large .com-tab-item.actived a:after{height:3px}.com-tab-hd.large .com-tab-item .num{margin-left:5px;font-size:12px}.com-tab-hd.large .com-tab-subctrl{padding-top:9px}.com-tab.large .com-tab-panel{padding-top:30px}.com-tab-subctrl{font-size:0}.com-tab-subctrl li{display:inline-block;vertical-align:middle}.com-tab-subctrl li:before{content:'';display:inline-block;vertical-align:middle;margin:0 15px;width:1px;height:18px;background:#D9D9D9}.com-tab-subctrl li:first-child:before{display:none}.com-tab-subctrl a{display:inline-block;vertical-align:middle;font-size:14px;line-height:24px;color:#333;text-align:center}.com-tab-subctrl a:hover{color:#00a4ff;text-decoration:none}.com-tab-subctrl .actived a{color:#00a4ff;font-weight:700;cursor:default}.com-tag-v2-list{font-size:0;margin-bottom:-10px}.com-tag-v2{box-sizing:border-box;display:inline-block;vertical-align:middle;margin-right:10px;margin-bottom:10px;max-width:calc(100% - 10px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:0 5px;height:18px;font-size:12px;line-height:16px;border-radius:2px;border:1px solid #E8ECF3;color:#666;background-color:#fff}a.com-tag-v2:hover{border-color:#FE7902;background-color:#FAECE0;color:#FE7902}.com-tag-v2-list.highlight .com-tag-v2{border-color:transparent;background-color:#FAECE0;color:#FE7902}.com-tag-v2-list.highlight a.com-tag-v2:hover{border-color:#FE7902;background-color:#FAECE0;color:#FE7902}.com-tag-v2-list.gray .com-tag-v2{border-color:transparent;background-color:#F3F5F9;color:#333}.com-tag-v2-list.gray a.com-tag-v2:hover{border-color:transparent;background-color:#d2d9e7}.com-tag-v2-list.gray .com-tag-v2.disabled,.com-tag-v2-list.gray .com-tag-v2.disabled:hover{color:#999;background-color:#F3F5F9;cursor:not-allowed}.com-tag-v2-list.gray .com-tag-v2.actived,.com-tag-v2-list.gray .com-tag-v2.actived:hover{background-color:#00a4ff;color:#fff}.com-tag-v2-list.large>li{display:inline-block;vertical-align:middle;max-width:100%}.com-tag-v2-list.large .com-tag-v2{padding:0 10px;height:26px;font-size:12px;line-height:24px;max-width:none;display:block}.com-tag-v2-list.large .com-tag-v2-icon{position:relative;top:-1px;vertical-align:middle;width:16px;height:16px;margin-right:10px;margin-left:-6px}.com-tag-v2-list.large.in-side{padding:15px 15px 5px;border-bottom:1px solid #D2D9E7}.com-2-tag-cont{padding:11px 5px 1px 15px;position:relative;z-index:1;min-height:45px;box-sizing:border-box;font-size:0}.com-2-tag-cont .com-2-tag-txt,.com-2-tagsinput-list dd a{display:inline-block;font-size:12px;line-height:22px;background-color:#F3F5F9;padding:0 8px;color:#333;margin-right:10px;margin-bottom:10px}.com-2-tag-cont .com-2-tag-txt span{display:inline-block;vertical-align:middle;max-width:10em;word-break:keep-all;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-tagsinput-list dd a:hover{border-color:#00a4ff}.com-2-tag-cont .com-2-tag-input{width:auto;max-width:10em;border:0;background:0 0;outline:0;line-height:22px;height:22px;font-size:12px;color:#333}.com-2-tag-cont .com-2-text{box-sizing:border-box;position:absolute;left:0;right:0;top:0;bottom:0;z-index:-1;border:1px solid #e5e5e5;border-radius:2px;padding:0 15px;font-size:14px;line-height:42px;color:#999}.com-2-tag-cont .com-2-text:hover,.com-2-tag-input:focus+.com-2-text,.com-2-tag-input:hover{border-color:#00a4ff}.com-2-tag-txt{cursor:default}.com-2-tag-txt .com-2-btn-close{cursor:pointer;display:inline-block;vertical-align:middle;width:16px;height:16px;background-image:url(sprite/AskDialog-201906131103.svg);;margin-right:-5px;margin-left:8px;background-position:99.53% 19.68%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.com-2-tagsinput-list{font-size:12px;padding-left:60px;margin-top:10px}.com-2-tagsinput-list dt{float:left;margin-left:-60px;color:#999;line-height:21px}.com-2-tagsinput-list dd{display:inline-block;vertical-align:middle}.com-2-tagsinput-list dd a{display:block;margin-right:10px;margin-bottom:5px;max-width:8em;word-break:keep-all;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none}.com-2-tagsinput-list dd a.disabled{background-color:#e5e5e5;color:#999;cursor:default}.com-2-tagsinput-bar{position:relative}.com-2-tagsinput-dropdown{display:none;position:absolute;top:100%;left:0;z-index:900;margin-top:5px;padding:15px;width:100%;font-size:12px;background:#fff;border:1px solid #e5e5e5;border-radius:2px;box-sizing:border-box}.com-2-tagsinput-dropdown.show{display:block}.com-2-tagsinput-dropdown-tit{font-size:12px;color:#999}.com-2-tagsinput-dropdown-tit em{padding:0 6px;color:#333}.com-2-tagsinput-dropdown-menu{height:180px;overflow-y:auto;overflow-x:hidden;box-sizing:border-box;margin:15px -15px 0}.com-2-tagsinput-dropdown-menu li{padding:6px 15px;cursor:pointer;font-size:12px;line-height:18px}.com-2-tagsinput-dropdown-menu li.hover,.com-2-tagsinput-dropdown-menu li:hover{color:#00a4ff;background-color:#F3F5F9}.com-2-tagsinput-dropdown-loading{display:none;position:relative;color:#999}.com-2-tagsinput-dropdown-menu+.com-2-tagsinput-dropdown-loading{margin-top:5px}.com-2-tagsinput-dropdown-loading .icon-loading{margin-right:10px}.com-2-tagsinput-dropdown-loading .icon-loading:before{content:'';width:16px;height:16px;display:inline-block;background-image:url(sprite/AskDialog-201906131103.svg);;-moz-animation:spin .6s infinite linear;-webkit-animation:spin .6s infinite linear;animation:spin .6s infinite linear;vertical-align:-3px;background-position:51.66% 99.47%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.com-2-tagsinput-dropdown.is-loading .com-2-tagsinput-dropdown-loading{display:block}.com-2-tagsinput-dropdown-tip{display:none;color:#999}.com-2-tagsinput-dropdown-tip a{color:#00a4ff}.com-2-tagsinput-dropdown-tip a:hover{text-decoration:underline}.com-2-tagsinput-dropdown.is-err .com-2-tagsinput-dropdown-tip{display:block}.com-2-tagsinput-tab{margin:0 5px 5px}.com-2-tagsinput-tab .com-tab-item{margin-right:20px}.com-2-tagsinput-tab .com-tab-item a{padding:0 5px;color:#666}.com-2-tagsinput-tab .com-tab-item a:hover{color:#00a4ff}.com-2-tagsinput-tab .com-tab-item.actived a,.com-2-tagsinput-tab .com-tab-item.actived a:hover{color:#00a4ff;font-weight:400}.com-2-tagsinput-tab .com-tab-panel{padding-top:10px;max-height:170px;overflow:auto}.com-2-tagsinput-tab .com-tag-v2-list.large .com-tag-v2{font-size:12px}@-moz-keyframes spin{0%{-moz-transform:rotate(0)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(359deg)}}.com-carousel{position:relative}.com-carousel-main{height:500px;overflow:hidden;background-color:#020B25}.com-carousel-item,.com-carousel-list{height:100%}.com-carousel-ctrl{position:absolute;left:50%;bottom:90px;z-index:3;text-align:center;font-size:0;white-space:nowrap;transform:translateX(-50%)}.com-carousel-ctrl-item{display:inline-block;vertical-align:middle;margin:0 3px;padding:10px 0;cursor:pointer}.com-carousel-ctrl-item.actived{cursor:default}.com-carousel-ctrl-item i{display:block;width:30px;height:3px;background:rgba(255,255,255,.3)}.com-carousel-ctrl-item:hover i{background:rgba(255,255,255,.5)}.com-carousel-ctrl-item.actived i{background-color:#fff}.com-carousel-pages{opacity:0;transition:opacity .2s}.com-carousel:hover .com-carousel-pages{opacity:1;filter:alpha(opacity=100)}.com-carousel-page{position:absolute;top:55%;font-size:0;width:60px;height:400px;line-height:400px;margin-top:-200px}.com-carousel-page.prev{left:20px;text-align:left}.com-carousel-page.next{right:20px;text-align:right}.com-carousel-page:before{content:'';display:inline-block;width:22px;height:41px;overflow:hidden;line-height:99;vertical-align:middle}.com-carousel-page.prev:before{background-image:url(sprite/AskDialog-201906131103.png);background-position:0px 0px}.com-carousel-page.next:before{background-image:url(sprite/AskDialog-201906131103.png);background-position:-24px 0px}.com-2-salon-panels{font-size:0}.com-2-salon-panels>.panel-cell{display:inline-block;vertical-align:top;margin-right:20px;margin-bottom:20px;width:calc((100% - 20px - 1px)/ 2)}.com-2-salon-panels>.panel-cell:nth-child(2n){margin-right:0}.com-2-salon-panel{box-sizing:border-box;position:relative;padding:20px;height:140px;background-color:#f7f8fa;transition:box-shadow .3s linear}.com-2-salon-panel:hover{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-2-salon-panel .panel-link{position:absolute;left:0;top:0;z-index:1;width:100%;height:100%}.com-2-salon-panel-img{position:absolute;left:0;top:0;width:100%;height:100%;background-size:auto 100%;background-position:center right;background-repeat:no-repeat;background-image:url(src/components/SalonPanels2/css/img/bg-demo.jpg)}.com-2-salon-panel-main{position:relative}.com-2-salon-panel-title{height:52px;font-size:18px;line-height:26px;font-weight:400;color:#000;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2}.com-2-salon-panel-infos{position:relative;margin-top:20px;padding-right:110px;line-height:26px}.com-2-salon-panel-infos .panel-btn{position:absolute;right:0;bottom:0}.com-2-salon-panel-loading{height:130px}.com-salon-specialist{width:440px;height:440px}.com-salon-specialist .com-carousel-main{height:100%;background-color:#E2E2E2}.com-salon-specialist-item{position:relative;height:100%}.com-salon-specialist-img{display:block;width:100%;height:100%;background-position:right center;background-size:cover;font-size:0}.com-salon-specialist-ft{box-sizing:border-box;position:absolute;left:0;bottom:0;padding:20px 20px 22px;width:100%}.com-salon-specialist-name{font-size:30px;line-height:42px;color:#000;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-salon-specialist-identity{font-size:14px;line-height:20px;color:#666;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-salon-specialist .com-carousel-ctrl{box-sizing:border-box;left:auto;right:20px;bottom:10px;transform:translateX(0)}.com-salon-specialist .com-carousel-ctrl-item i{box-sizing:border-box;width:8px;height:8px;background-color:#fff;border:1px solid #00a4ff;border-radius:50%}.com-salon-specialist .com-carousel-ctrl-item.actived i{background-color:#00a4ff}.com-salon-primary-specialist-img{width:100%;height:435px;background-color:#E2E2E2;background-size:auto 100%;background-position:right center}.com-salon-primary-specialist-text{width:100%;height:100%;background-size:auto 100%;background-position:left center}.com-salon-primary{box-sizing:border-box;position:relative;margin-bottom:20px;padding:20px;display:table;table-layout:fixed;width:100%;background-color:#fff;box-shadow:0 -1px 16px 0 rgba(0,0,0,.13)}.com-salon-primary-link{position:absolute;left:0;top:0;width:100%;height:100%;z-index:1}.com-salon-primary-specialist{display:table-cell;vertical-align:top}.com-salon-primary-specialist .com-salon-specialist{position:relative;width:100%;height:435px}.com-salon-primary-mark.com-mark-skew{position:absolute;left:100%;top:-3px;z-index:2;padding-left:0;margin-left:20px;min-width:72px;white-space:nowrap}.com-salon-primary-mark.com-mark-skew .mark-bg{margin-left:0;width:calc(100% - 18px)}.com-salon-primary-mark.com-mark-skew .mark-bg:before,.com-salon-primary-mark.com-mark-skew .mark-cnt:before{display:none}.com-salon-primary-main{position:relative;display:table-cell;vertical-align:top;width:287px;padding-left:35px;padding-top:20px}.com-salon-primary-bd{margin-bottom:10px;min-height:215px}.com-salon-primary-desc,.com-salon-primary-pretitle,.com-salon-primary-title{display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2}.com-salon-primary-pretitle{font-size:18px;line-height:25px;color:#999;max-height:50px}.com-salon-primary-title{margin-top:7px;font-size:30px;line-height:36px;color:#000;font-weight:400;max-height:72px}.com-salon-primary-desc{margin-top:20px;font-size:14px;line-height:24px;color:#999;-webkit-line-clamp:4;max-height:96px}.com-salon-primary-avatars.com-2-avatars-group{padding-bottom:25px;margin-bottom:20px;border-bottom:1px solid #D8D8D8}.com-salon-primary-avatars.com-2-avatars-group .group-text{color:#333}.com-salon-primary-ft{position:absolute;left:0;right:0;bottom:0;padding-left:35px;padding-bottom:20px}.com-salon-primary-datas .com-icon-data{display:block;margin-right:0;margin-bottom:10px}.com-salon-primary-datas .com-icon-data:last-child{margin-bottom:0}.com-salon-primary-btn.com-arrow-btn{margin-top:20px;width:100%;position:relative;z-index:2;padding-right:48px;height:36px;font-size:16px;line-height:34px}.com-salon-primary-btn .com-arrow-btn-text:after{border-width:17px 6px}.com-salon-primary-btn .com-arrow-btn-caret{width:36px;padding-left:12px}.com-salon-primary-btn .com-arrow-btn-caret:after{margin-left:-5px;width:10px;height:10px}.com-salon-primary.loading .com-loading-placeholder{height:437px;background-color:transparent}.com-salon-group{position:relative;z-index:100;margin-top:-90px}.com-salon-group.tile{margin-top:0}.com-salon-group.tile .com-salon-group-primary{display:block;font-size:0;padding:0;box-shadow:none;background-color:#F7F8FA;margin-bottom:10px;transition:box-shadow .3s linear}.com-salon-group.tile .com-salon-group-primary:hover{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-salon-group.tile .com-salon-primary-specialist{display:inline-block;vertical-align:top;width:calc((100% - 10px - 1px)/ 2)}.com-salon-group.tile .com-salon-primary-specialist-img,.com-salon-group.tile .com-salon-specialist{height:320px}.com-salon-group.tile .com-salon-specialist-img{background-position:right top}.com-salon-group.tile .com-salon-primary-main{display:inline-block;vertical-align:top;padding:20px 30px;box-sizing:border-box;width:calc((100% - 10px - 1px)/ 2 + 10px);height:320px}.com-salon-group.tile .com-salon-primary-mark{display:none}.com-salon-group.tile .com-salon-primary-bd{min-height:120px}.com-salon-group.tile .com-salon-primary-pretitle{font-size:14px;line-height:20px;display:block;white-space:nowrap}.com-salon-group.tile .com-salon-primary-title{margin-top:5px;font-size:24px;line-height:36px;display:block;white-space:nowrap}.com-salon-group.tile .com-salon-primary-desc{margin-top:10px;-webkit-line-clamp:3;max-height:72px}.com-salon-group.tile .com-salon-primary-avatars.com-2-avatars-group{border-bottom:none;padding-bottom:0;margin-bottom:20px}.com-salon-group.tile .com-2-avatars-group .group-text{font-size:12px;color:#999}.com-salon-group.tile .com-salon-primary-datas .com-icon-data{font-size:12px;margin-bottom:0}.com-salon-group.tile .com-salon-primary-datas .com-icon-data>div{display:block;display:-webkit-box;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis;max-height:48px}.com-salon-group.tile .com-icon-data [class*=com-i-],.com-salon-group.tile .com-icon-data [class^=com-i-]{width:14px;height:14px}.com-salon-group.tile .com-salon-primary-btn.com-arrow-btn{margin-top:10px;width:auto;padding-right:42px;height:32px;font-size:14px;line-height:30px;min-width:190px}.com-salon-group.tile .com-salon-primary-btn .com-arrow-btn-text:after{border-width:15px 5px}.com-salon-group.tile .com-salon-primary-btn .com-arrow-btn-caret{width:32px;padding-left:10px}.com-salon-group.tile .com-salon-primary-btn .com-arrow-btn-caret:after{margin-left:-5px;width:10px;height:10px}.com-salon-group.tile .com-2-salon-panels>.panel-cell{margin-right:10px;width:calc((100% - 10px - 1px)/ 2)}.com-salon-group.tile .com-2-salon-panels>.panel-cell:last-child{margin-right:0}.com-salon-group.tile .com-2-salon-panel{height:130px}.com-salon-group.tile .com-salon-primary.loading{background-color:#F3F5F9}.com-salon-group.tile .com-salon-primary.loading .com-loading-placeholder{height:320px}.com-salon-group.tile .com-salon-primary-ft{padding-bottom:20px;padding-left:30px;padding-right:30px}.com-2-activity-panels{font-size:0}.com-2-activity-panels>.panel-cell{display:inline-block;vertical-align:top;margin-right:20px;margin-bottom:25px}.com-2-activity-panels.list2>.panel-cell{width:calc((100% - 20px - 1px)/ 2)}.com-2-activity-panels.list2>.panel-cell:nth-child(2n){margin-right:0}.com-2-activity-panels.list3>.panel-cell{width:calc((100% - 20px * 2 - 1px)/ 3)}.com-2-activity-panels.list3>.panel-cell:nth-child(3n){margin-right:0}.com-2-activity-panels.list4>.panel-cell{width:calc((100% - 20px * 3 - 1px)/ 4)}.com-2-activity-panels.list4>.panel-cell:nth-child(4n){margin-right:0}.com-2-activity-panel{display:block;background-color:#fff;box-shadow:0 1px 3px 0 #E1E3E9;transition:box-shadow .3s linear}.com-2-activity-panel:hover{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-2-activity-panel-object{position:relative;padding-top:52.1052631579%;border-bottom:1px solid #eee;overflow:hidden}.com-2-activity-panel-img{position:absolute;left:0;top:0;width:100%;height:100%;background-position:center;background-size:cover}.com-2-activity-panel-time{position:absolute;right:10px;bottom:10px;padding:0 8px;height:24px;background-color:rgba(0,0,0,.8);color:#fff;font-size:14px;line-height:24px}.com-2-activity-panel-main{box-sizing:border-box;padding:20px}.com-2-activity-panel-bd{min-height:82px}.com-2-activity-panel-pretitle{margin-bottom:10px;font-size:14px;line-height:24px;color:#666}.com-2-activity-panel-title{height:48px;font-size:18px;line-height:24px;color:#000;font-weight:400;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2}.com-2-activity-panel-pretitle em,.com-2-activity-panel-title em{color:#ff7200}.com-2-activity-panel-ft{position:relative;margin-top:20px;padding-right:110px}.com-2-activity-panel-ft .panel-btn{position:absolute;right:0;top:0}.com-2-activity-panel.topic .com-2-activity-panel-bd{min-height:0;height:60px}.com-2-activity-panel.topic .com-2-activity-panel-pretitle{position:relative;box-sizing:border-box;display:inline-block;vertical-align:middle;padding-right:65px;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-activity-panel.topic .com-2-activity-panel-pretitle.without-order{padding-right:0}.com-2-activity-panel.topic .pretitle-order{position:absolute;left:100%;top:0;margin-left:-60px}.com-2-activity-panel.topic .com-2-activity-panel-title{height:24px;white-space:nowrap;display:block}.com-2-activity-panel.activity{box-shadow:none;background-color:transparent}.com-2-activity-panel.activity:hover{box-shadow:none}.com-2-activity-panel.activity .com-2-activity-panel-object{border:1px solid #E5E8ED;transition:box-shadow .3s linear}.com-2-activity-panel.activity:hover .com-2-activity-panel-object{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-2-activity-panel.activity .com-2-activity-panel-main{padding:15px 0 0}.com-2-activity-panel.activity .com-2-activity-panel-bd{min-height:0}.com-2-activity-panel.activity .com-2-activity-panel-pretitle{margin-bottom:0;color:#999}.com-2-activity-panel.activity .com-2-activity-panel-title{display:block;height:auto}.com-2-activity-panel-infos{margin-top:10px;font-size:0}.com-2-activity-panel-info{font-size:12px;line-height:18px;color:#999}.com-2-activity-panel-info:before{content:'';display:inline-block;vertical-align:middle;margin:0 5px;width:2px;height:2px;border-radius:2px;background-color:#666}.com-2-activity-panel-info:first-child:before{display:none}.com-teacher-panels{font-size:0;margin-bottom:-40px}.com-teacher-panels>.panel-cell{display:inline-block;vertical-align:top;margin-right:40px;margin-bottom:40px}.com-teacher-panels.list2>.panel-cell{width:calc((100% - 40px - 1px)/ 2)}.com-teacher-panels.list2>.panel-cell:nth-child(2n){margin-right:0}.com-teacher-panel{display:table;table-layout:fixed;width:100%}.com-teacher-panel-object{display:table-cell;vertical-align:top;padding-right:30px;width:190px}.com-teacher-panel-img{display:block;padding-top:137.5%;width:100%;background-size:cover;background-position:center}.com-teacher-panel-main{position:relative;box-sizing:border-box;display:table-cell;vertical-align:top}.com-teacher-panel-name{position:relative;display:inline-block;vertical-align:middle;box-sizing:border-box;max-width:100%;font-size:22px;line-height:32px;color:#000;font-weight:400}.com-teacher-panel-name.with-verify{padding-right:20px}.com-teacher-panel-name-inner{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:inherit}.com-teacher-panel-name .com-verification{position:absolute;right:0;top:8px;margin-right:0}.com-teacher-panel-identity{font-size:14px;line-height:24px;color:#000;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-teacher-panel-desc{margin-top:10px;font-size:14px;line-height:24px;color:#999;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:4;max-height:96px}.com-teacher-panel-links{position:absolute;left:0;bottom:0;width:100%}.com-teacher-panel-links .com-icon-disorder{padding-bottom:10px;margin-bottom:10px;border-bottom:1px solid #E1E3E9}.com-teacher-panel-links .com-icon-disorder:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.com-icon-disorder-link{box-sizing:border-box;display:inline-block;vertical-align:middle;position:relative;max-width:100%;padding-left:24px;font-size:14px;line-height:24px;color:#333;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-icon-disorder-link:hover{color:#00a4ff}.com-icon-disorder-icon{position:absolute;left:0;top:4px;width:16px;height:16px}.com-icon-disorder-icon.article{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:99.53% 48.4%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.com-icon-disorder-icon.video{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:43.13% 99.47%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.com-icon-disorder-link:hover .com-icon-disorder-icon.article{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:99.53% 57.98%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.com-icon-disorder-link:hover .com-icon-disorder-icon.video{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:34.599999999999994% 99.47%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.com-tags-bar{margin-bottom:60px;background-color:#f7f8fa;padding:20px 10px}.com-tags-bar>.com-inner{position:relative;padding-left:50px;min-height:24px}.com-tags-bar-title{position:absolute;left:10px;top:0;width:30px;height:24px;border-right:1px solid #E1E3E9;font-size:0;line-height:24px}.com-tags-bar-title:before{content:'';display:inline-block;vertical-align:middle;width:20px;height:20px;background-image:url(sprite/AskDialog-201906131103.svg);;background-position:32.37% 79.89%;background-size:1135% 1019.9999999999999%;;background-repeat:no-repeat}.com-tags-bar-main{font-size:0;white-space:nowrap;overflow:hidden}.com-tags-bar-item{display:inline-block;vertical-align:middle;margin-right:30px;font-size:14px;line-height:24px;color:#666}.com-tags-bar-item:hover{color:#00a4ff}.com-tags-bar-item:before{content:'#';margin-right:5px;color:#999}.com-activity-gallery{margin-bottom:20px;overflow:hidden}.com-activity-gallery-list{display:inline-block;vertical-align:middle;font-size:0;white-space:nowrap}.com-activity-gallery-list>li{display:inline-block;vertical-align:top;margin-right:20px}.com-activity-gallery-img{width:380px;height:194px;background-size:cover;background-position:center}.com-activity-gallery-title{margin-top:10px;font-size:14px;line-height:20px;font-weight:400;color:#666}.com-detail-timebar-item{position:relative;margin-left:70px;padding-bottom:40px;padding-left:35px;border-left:1px dashed #E1E3E9}.com-detail-timebar-item:first-child:before{content:'';position:absolute;left:-1px;top:0;width:1px;height:8px;background-color:#fff}.com-detail-timebar-item:last-child{padding-bottom:0}.com-detail-timebar-item:last-child:before{content:'';position:absolute;left:-1px;top:23px;bottom:0;width:1px;background-color:#fff}.com-detail-timebar-dot{box-sizing:border-box;position:absolute;left:-7px;top:8px;width:15px;height:15px;border:1px solid #00a4ff;border-radius:50%;background-color:#fff}.com-detail-timebar-time{position:absolute;right:100%;top:0;width:78px;font-size:24px;line-height:32px;color:#333;white-space:nowrap;font-weight:300}.com-detail-timebar-main{box-sizing:border-box;display:table;width:100%}.com-detail-timebar-hd{display:table-cell;padding-right:20px;width:240px;vertical-align:top}.com-detail-timebar-bd{display:table-cell;vertical-align:top;transition:all .3s ease-in-out}.com-detail-timebar-author{position:relative}.com-detail-timebar-author .com-2-avatar{position:absolute;left:0;top:0;width:42px;height:42px;transition:all .3s linear}.com-detail-timebar-author .author-main{margin-left:54px;transition:all .3s linear}.com-detail-timebar-author .author-name{position:relative;display:inline-block;vertical-align:middle;box-sizing:border-box;max-width:100%;font-size:18px;line-height:24px;color:#000;font-weight:400}.com-detail-timebar-author .author-name.with-verify{padding-right:17px}.com-detail-timebar-author .author-name-inner{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:inherit}.com-detail-timebar-author .com-verification{position:absolute;right:0;top:6px;margin-right:0}.com-detail-timebar-author .author-identity{margin-top:5px;font-size:14px;line-height:18px;color:#999}.com-detail-timebar-author-detail{box-sizing:border-box;position:absolute;left:295px;right:0;top:0;padding:20px;min-height:144px;background-color:#F3F5F9;border-radius:0 16px 16px;-ms-transform:scale(0);transform:scale(0);-ms-transform-origin:left top;transform-origin:left top;opacity:0;-ms-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.com-detail-timebar-author-detail-inner{display:table;table-layout:fixed;width:100%}.com-detail-timebar-author-detail .detail-desc-cnt{display:table-cell;vertical-align:top;padding-right:50px}.com-detail-timebar-author-detail .detail-desc{font-size:14px;line-height:24px;color:#666;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:3;max-height:72px}.com-detail-timebar-author-detail .detail-skills-cnt{display:table-cell;vertical-align:top;width:200px}.com-detail-timebar-author-detail .detail-skills-title{margin-bottom:10px;font-size:12px;line-height:18px;color:#999;font-weight:400}.com-detail-timebar-item.author-detail .com-detail-timebar-author .com-2-avatar{width:90px;height:90px}.com-detail-timebar-item.author-detail .com-detail-timebar-author .author-main{margin-left:0;padding-top:100px}.com-detail-timebar-item.author-detail .com-detail-timebar-author-detail{-ms-transform:scale(1);transform:scale(1);opacity:1;transition-delay:50ms}.com-detail-timebar-item.author-detail .com-detail-timebar-bd{opacity:0;transition-delay:50ms}.com-topic-resources-hd{margin-bottom:14px}.com-topic-resources-title{font-size:14px;line-height:24px;color:#000;font-weight:400}.com-topic-resource{margin-bottom:13px;background-color:#f3f5f9;transition:box-shadow .3s linear}.com-topic-resource:hover{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-topic-resource:last-child{margin-bottom:0}.com-topic-resource-video{box-sizing:border-box;display:table;width:100%}.com-topic-resource-video-object{display:table-cell;width:122px;height:66px;position:relative}.com-topic-resource-video-img{position:relative;display:block;width:100%;height:100%;background-size:cover;background-position:center}.com-topic-resource-video-img:before{content:'';position:absolute;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,.4)}.com-topic-resource-video-icon{box-sizing:border-box;position:absolute;left:50%;top:50%;margin:-13px 0 0 -13px;width:26px;height:26px;border-radius:50%;border:1px solid #fff}.com-topic-resource-video-icon:before{content:'';position:absolute;left:50%;top:50%;margin:-5px 0 0 -3px;width:0;height:0;border-style:solid;border-color:transparent #fff;border-width:5px 0 5px 9px}.com-topic-resource-video-main{display:table-cell;vertical-align:middle;padding:0 20px}.com-topic-resource-video-title{font-size:14px;line-height:14px;color:#333;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-topic-resource-video-desc{margin-top:8px;font-size:12px;line-height:18px;color:#999}.com-topic-resource-art{display:block;padding:15px 20px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px;line-height:18px;color:#333}.com-topic-resource-art-icon{position:relative;top:-1px;display:inline-block;vertical-align:middle;margin-right:10px;width:16px;height:16px;background-image:url(sprite/AskDialog-201906131103.svg);;background-position:99.53% 38.83%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.com-organizer{box-sizing:border-box;display:table;width:100%}.com-organizer-cell{display:table-cell;vertical-align:middle}.com-organizer-cell.avatar{padding-right:20px;width:120px}.com-organizer-cell.identity{padding-right:10px;width:140px}.com-organizer .com-2-avatar{width:120px;height:50px}.com-organizer .com-2-avatar-inner{background-size:contain;background-color:transparent;border-color:transparent;border-radius:0}.com-organizer-name{position:relative;display:inline-block;vertical-align:middle;box-sizing:border-box;max-width:12em;font-size:20px;line-height:24px;color:#000;font-weight:400;word-wrap:break-word}.com-organizer-name.with-verify{padding-right:17px}.com-organizer-name-inner{display:block;color:inherit}a.com-organizer-name-inner:hover{color:#00a4ff}.com-organizer-name .com-verification{position:absolute;right:0;top:6px;margin-right:0}.com-organizer-identity{margin-top:7px;font-size:14px;line-height:20px;color:#999}.com-organizer-desc{font-size:14px;line-height:28px;color:#666}.com-organizer.small{position:relative;display:block;padding-left:130px;min-height:45px}.com-organizer.small .com-organizer-cell{display:block;width:auto;padding-right:0}.com-organizer.small .com-organizer-cell.avatar{position:absolute;left:0;top:0}.com-organizer.small .com-organizer-identity{display:none}.com-organizer.small .com-organizer-name{max-width:100%}.com-organizer.small .com-organizer-name-inner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-organizer.small .com-organizer-desc{line-height:24px;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:48px}.com-organizer.person .com-organizer-cell.avatar{width:90px}.com-organizer.person .com-2-avatar{width:90px;height:90px}.com-organizer.person .com-2-avatar-inner{background-size:cover;background-color:#fff;border-color:#EFEFEF;border-radius:50% 50% 50% 0}.com-organizers{font-size:0}.com-organizers>.panel-cell{margin-bottom:20px;font-size:14px}.com-organizers[class*=list]>.panel-cell{display:inline-block;vertical-align:top;margin-right:20px}.com-organizers.list3>.panel-cell{width:calc((100% - 20px * 2 -1px)/ 3)}.com-organizers.list3>.panel-cell:nth-child(3n){margin-right:0}.com-video-player{position:relative;height:528px;background-color:#000}.com-video-player-img{height:100%;background-size:cover;background-position:center;margin:0 auto}.com-video-player-mask{position:absolute;left:0;top:0;width:100%;height:100%;background:rgba(0,0,0,.59)}.com-video-player-cnt{position:absolute;left:0;top:50%;transform:translateY(-50%);width:100%;text-align:center}.com-video-player-cnt.counting{color:#fff;font-size:16px;line-height:32px;text-align:center}.com-video-player-cnt.counting em{margin:0 5px;color:#F5A623}.com-video-player-play{position:relative;box-sizing:border-box;display:inline-block;vertical-align:middle;width:60px;height:60px;border-radius:50%;border:1px solid #fff;text-align:center;line-height:58px;cursor:pointer}.com-video-player-play:before{content:'';display:inline-block;vertical-align:middle;margin-left:5px;width:0;height:0;border-style:solid;border-width:15px 0 15px 24px;border-color:transparent #fff}.com-video-player-play.loading{animation:playLoading 2s linear infinite}.com-video-player-play.loading:before{position:absolute;left:-5px;top:50%;margin-top:-5px;margin-left:0;width:10px;height:10px;border:none;border-radius:50%;background-color:#fff}@keyframes playLoading{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.com-video-player-state{display:inline-block;vertical-align:middle;margin-top:15px;color:#fff;font-size:14px}.com-ani-playing{position:relative;top:-2px;display:inline-block;vertical-align:middle;font-size:0;margin-right:8px;height:16px}.com-ani-playing span{display:inline-block;vertical-align:bottom;width:2px;height:16px;background-color:#fff;-webkit-animation:playing 1.5s linear infinite;animation:playing 1.5s linear infinite;-webkit-transform-origin:center bottom;-webkit-transform:scaleY(.125);transform-origin:center bottom;transform:scaleY(.125)}.com-ani-playing span:nth-child(2){-webkit-animation-delay:.5s;-webkit-transform:scaleY(1);animation-delay:.5s;transform:scaleY(1)}.com-ani-playing span:nth-child(3){-webkit-animation-delay:1s;-webkit-transform:scaleY(.675);animation-delay:1s;transform:scaleY(.675)}.com-ani-playing span:nth-child(4){-webkit-animation-delay:1.5s;-webkit-transform:scaleY(.8);animation-delay:1.5s;transform:scaleY(.8)}.com-ani-playing span+span{margin-left:2px}@keyframes -webkit-playing{0%,100%{-webkit-transform:scaleY(1)}50%{-webkit-transform:scaleY(.125)}}@keyframes playing{0%,100%{transform:scaleY(1)}50%{transform:scaleY(.125)}}.com-video-player-tip{box-sizing:border-box;position:absolute;left:0;top:50%;width:100%;color:#fff;font-size:16px;line-height:32px;text-align:center;margin-top:-16px}.com-video-player-tip.counting em{margin:0 5px;color:#F5A623}.com-video-tab{position:relative;height:100%}.com-video-tab-hd{height:60px;border-bottom:1px solid #E1E3E9}.com-video-tab-ctrl{font-size:0;height:100%}.com-video-tab-item{position:relative;display:inline-block;vertical-align:middle;width:50%;height:100%;color:#000}.com-video-tab-item:before{content:'';position:absolute;left:0;top:50%;margin-top:-15px;width:1px;height:30px;background-color:#E1E3E9}.com-video-tab-item:first-child:before{display:none}.com-video-tab-item a{display:block;font-size:14px;line-height:60px;text-align:center;color:inherit}.com-video-tab-item a:hover{color:#00a4ff}.com-video-tab-item.actived a,.com-video-tab-item.actived a:hover{color:#00a4ff;cursor:default}.com-video-tab-bd{position:absolute;left:0;top:61px;bottom:0;width:100%}.com-video-tab-panel{height:100%}.com-video-tab-ctrl.one-tab .com-video-tab-item{width:100%}.com-video-tab-ctrl.one-tab .com-video-tab-item a{padding:0 20px;text-align:left}.com-video-tab-ctrl.one-tab .com-video-tab-item.actived a,.com-video-tab-ctrl.one-tab .com-video-tab-item.actived a:hover{color:#000}.com-video-comments{position:relative;height:100%}.com-video-comments-list{position:absolute;left:0;top:0;bottom:137px;width:100%;box-sizing:border-box;overflow-x:hidden;overflow-y:auto;padding:20px}.com-video-comment+.com-video-comment{margin-top:20px}.com-video-comment-cnt{font-size:14px;line-height:22px;color:#333;word-wrap:break-word}.com-video-comment-ft{position:relative;padding-right:70px;margin-top:3px;font-size:12px;line-height:18px;color:#999}.com-video-comment-user{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-video-comment-time{position:absolute;right:0;top:0}.com-video-comments-edit{box-sizing:border-box;position:absolute;left:0;bottom:0;width:100%;padding:20px}.com-video-comments-edit textarea{box-sizing:border-box;width:100%;height:55px;padding:10px;border:1px solid transparent;background-color:#F3F5F9;font-size:14px;line-height:22px;resize:none}.com-video-comments-edit textarea:focus{background-color:#fff;border-color:#00a4ff}.com-video-comments-edit textarea:disabled,.com-video-comments-edit textarea:disabled:focus{background-color:#F3F5F9;border-color:transparent}.com-video-comments-edit .edit-btns{margin-top:10px;text-align:right}.com-video-comments-edit .c-btn{height:28px;font-size:12px;line-height:26px}.com-video-nav{position:relative;height:100%}.com-video-nav .com-video-nav-list{box-sizing:border-box;position:absolute;left:0;right:0;top:0;bottom:61px;padding:10px 0;overflow-x:hidden;overflow-y:auto}.com-video-nav-item{box-sizing:border-box;display:table;table-layout:fixed;width:100%;padding:10px 20px}.com-video-nav-item .item-object{display:table-cell;vertical-align:top;width:134px;height:74px;position:relative}.com-video-nav-item .item-img{position:relative;display:block;width:100%;height:100%;background-size:cover;background-position:center}.com-video-nav-item .item-img:before{content:'';display:block;width:100%;height:100%;background-color:rgba(0,0,0,.4)}.com-video-nav-item .item-icon{display:none;box-sizing:border-box;position:absolute;left:50%;top:50%;margin:-12px 0 0 -12px;width:24px;height:24px;border:1px solid #fff;border-radius:50%}.com-video-nav-item .item-icon:before{content:'';position:absolute;left:50%;top:50%;margin:-5px 0 0 -4px;width:0;height:0;border-style:solid;border-color:transparent #fff;border-width:5px 0 5px 9px}.com-video-nav-item .item-status{position:absolute;right:8px;bottom:8px;width:12px;height:12px;background-image:url(sprite/AskDialog-201906131103.svg);;background-position:56.74% 54.690000000000005%;background-size:1891.6666666666667% 1700%;;background-repeat:no-repeat}.com-video-nav-item .com-ani-playing{position:absolute;right:8px;bottom:8px;top:auto}.com-video-nav-item .item-main{display:table-cell;vertical-align:top;padding-left:10px}.com-video-nav-item .item-title{font-size:12px;line-height:22px;color:#000;font-weight:400;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2}.com-video-nav-item .item-time{display:block;margin-top:13px;font-size:12px;line-height:18px;color:#999;text-align:right}.com-video-nav-item:hover .item-img:before{display:none}.com-video-nav-item:hover .item-title{color:#00a4ff}.com-video-nav-item.actived{cursor:default}.com-video-nav-item.actived .item-img:before{display:block}.com-video-nav-item.actived .item-title{color:#00a4ff}.com-video-nav-ft{box-sizing:border-box;position:absolute;left:0;right:0;bottom:0;border-top:1px solid #E1E3E9;height:60px;padding:10px 20px}.com-video-nav-link{display:block;font-size:14px;line-height:40px;color:#000}.com-video-nav-link:hover{color:#00a4ff}.com-video-section{position:relative;height:470px;background-color:#fff;overflow:hidden}.com-video-section-main{margin-right:330px;height:100%;transition:all .3s ease-in-out}.com-video-section-side{position:absolute;right:0;top:0;z-index:10;width:330px;height:100%;transition:all .3s ease-in-out}.com-video-section-toggle{position:absolute;right:100%;top:56px;width:18px;height:32px;background-color:#000;font-size:0}.com-video-section-toggle:before{content:'';position:absolute;left:50%;top:50%;margin:-5px 0 0 -4px;width:9px;height:11px;background-image:url(sprite/AskDialog-201906131103.svg);;transition:all .3s ease-in-out;background-position:38.07% 28.499999999999996%;background-size:2522.222222222222% 1854.5454545454547%;;background-repeat:no-repeat}.com-video-section .com-video-player{height:100%}.com-video-section.hide .com-video-section-main{margin-right:0}.com-video-section.hide .com-video-section-side{transform:translateX(100%)}.com-video-section.hide .com-video-section-toggle:before{transform:rotate(180deg)}.com-topic-panel-hd{position:relative;padding-right:100px;line-height:32px}.com-topic-panel-title{font-size:18px;line-height:32px;color:#000;font-weight:400}.com-topic-panel-extra{position:absolute;right:0;top:0}.com-topic-panel-desc{margin-top:10px;font-size:14px;line-height:24px;color:#999;word-wrap:break-word}.com-topic-panel-desc p+p{margin-top:10px}.com-topic-panel .com-topic-resources{margin-top:15px}.com-2-user-panels{font-size:0}.com-2-user-panels>.panel-cell{display:inline-block;vertical-align:top;margin-right:60px;margin-bottom:40px}.com-2-user-panels.list2>.panel-cell{width:calc((100% - 60px - 1px)/ 2)}.com-2-user-panels.list2>.panel-cell:nth-child(2n){margin-right:0}.com-2-user-panel{display:table;table-layout:fixed;box-sizing:border-box;width:100%}.com-2-user-panel-side{display:table-cell;vertical-align:top;padding-right:20px;width:110px}.com-2-user-panel-main{display:table-cell;vertical-align:top}.com-2-user-panel .com-2-avatar{margin-bottom:7px;width:90px;height:90px}.com-2-user-panel-name{position:relative;display:inline-block;vertical-align:middle;box-sizing:border-box;max-width:100%;font-size:18px;line-height:24px;color:#000;font-weight:400}.com-2-user-panel-name.with-verify{padding-right:17px}.com-2-user-panel-name-inner{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:inherit}.com-2-user-panel-name .com-verification{position:absolute;right:0;top:6px;margin-right:0}.com-2-user-panel-identity{margin-top:3px;font-size:12px;line-height:18px;color:#999}.com-2-user-panel-desc{box-sizing:border-box;margin-bottom:20px;padding:20px;background-color:#F3F5F9;border-radius:0 16px 16px;font-size:14px;line-height:24px;color:#666;height:144px}.com-2-user-panel-desc p{display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:4;max-height:96px}.com-2-user-panel-skills-title{margin-bottom:10px;font-size:12px;line-height:18px;color:#999}.com-partners-wrap{margin:60px 0;text-align:center;font-size:0}.com-partners{position:relative;display:inline-block;vertical-align:middle;max-width:100%;box-sizing:border-box;padding-left:140px}.com-partners dt{position:absolute;left:0;top:0;padding-right:30px;font-size:16px;line-height:40px;color:#666}.com-partners dt:after{content:'';position:absolute;right:0;top:50%;margin-top:-13px;width:1px;height:26px;background-color:#DFE4EE}.com-partners dd{padding-top:6px;text-align:left}.com-partner{vertical-align:middle;height:30px;margin-left:35px;margin-bottom:20px}.com-2-article-panel{position:relative;box-sizing:border-box;padding:35px 25px 38px;background-color:#F3F5F9;height:250px;transition:box-shadow .3s linear}.com-2-article-panel:hover{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-2-article-panel>.panel-link{position:absolute;left:0;top:0;z-index:1;width:100%;height:100%}.com-2-article-panel-author{position:relative;z-index:2;margin-bottom:11px;font-size:0}.com-2-article-panel-author .author-link{color:#333}.com-2-article-panel-author .author-name{display:inline-block;vertical-align:middle;margin-left:7px;max-width:20em;font-size:12px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.com-2-article-panel-author .author-link:hover{color:#00a4ff}.com-2-article-panel-author .com-verification{margin:0 0 0 5px}.com-2-article-panel-title{margin-bottom:10px;font-size:18px;line-height:27px;font-weight:400;color:#333;display:block;display:-webkit-box;display:block;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:54px;white-space:nowrap}.com-2-article-panel-cnt{margin-bottom:0}.com-2-article-panel-cnt .com-media-object{padding-right:0;padding-left:15px;width:106px;vertical-align:top;padding-top:6px}.com-2-article-panel-cnt .com-thumbnail{width:106px;height:80px}.com-2-article-panel-desc{font-size:14px;line-height:24px;color:#999;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:3;max-height:72px}.com-2-article-panel-opts{position:static;margin-top:13px}.com-2-article-panel.large{padding-left:293px}.com-2-article-panel.large.without-img{padding-left:25px}.com-2-article-panel.large .com-2-article-panel-title{display:block;white-space:nowrap}.com-2-article-panel.large .com-2-article-panel-cnt{display:block}.com-2-article-panel.large .com-2-article-panel-cnt .com-media-body{padding:0}.com-2-article-panel.large .com-2-article-panel-desc{-webkit-line-clamp:3;max-height:72px}.com-2-article-panel.large .com-2-article-panel-cnt .com-media-object{position:absolute;left:30px;top:35px;display:block;padding-left:0}.com-2-article-panel.large .com-thumbnail{width:236px;height:177px}.com-2-article-panels{font-size:0;margin-bottom:-15px}.com-2-article-panels>.panel-cell{display:inline-block;vertical-align:middle;margin-right:15px;margin-bottom:15px;width:calc((100% - 15px * 2)/ 3)}.com-2-article-panels>.panel-cell:first-child{width:calc(100% - 15px - (100% - 15px * 2)/ 3)}.com-2-article-panels>.panel-cell:nth-child(3n+2){margin-right:0;width:calc((100% - 15px * 2)/ 3 - 1px)\9}.com-loading-placeholder.com-2-article-panel-loading{height:250px}.com-sub-section{margin-bottom:30px}.com-sub-section-hd{position:relative;padding-bottom:6px;border-bottom:1px solid #000}.com-sub-section-hd:before{content:'';position:absolute;left:0;bottom:-1px;width:80px;height:1px;background-color:#00a4ff}.com-sub-section-title{font-size:14px;line-height:20px;color:#666;font-weight:400}.com-sub-section-bd{padding:15px}.com-sub-section.bg-color .com-sub-section-bd{background-color:#F3F5F9}.com-timebar{margin:10px 20px 20px}.com-timebar-item{position:relative;padding:0 20px 15px 22px;border-left:1px solid #E1E3E9}.com-timebar-item:last-child{padding-bottom:0}.com-timebar-dot{position:absolute;left:-5px;top:6px;box-sizing:border-box;width:9px;height:9px;border-radius:50%;border:1px solid #999;background-color:#EFEFEF}.com-timebar-item:hover .com-timebar-dot{left:-6px;top:5px;width:11px;height:11px;border:1px solid #00a4ff;background-color:#fff}.com-timebar-item:hover .com-timebar-dot:before{content:'';position:absolute;left:2px;top:2px;width:5px;height:5px;border-radius:50%;background-color:#00a4ff}.com-timebar-infos{font-size:0;font-size:12px;line-height:23px;color:#999}.com-timebar-info:before{content:'';display:inline-block;vertical-align:middle;margin:0 5px;width:2px;height:2px;border-radius:2px;background-color:#666}.com-timebar-info:first-child:before{display:none}.com-timebar-title{margin-top:4px;font-size:14px;line-height:26px;color:#333;font-weight:400}.com-timebar-item:hover .com-timebar-title{color:#00a4ff}.com-loading-placeholder.com-timebar-loading.small{height:440px}.com-scroll{position:relative;overflow:hidden;height:440px;padding-top:10px}.com-scroll:after{content:'';position:absolute;left:0;bottom:0;width:100%;height:65px;background:linear-gradient(to top,rgba(255,255,255,1),rgba(255,255,255,0));pointer-events:none}.com-scroll.hide-mask:after{display:none}.com-scroll-cnt{margin-right:-18px;height:100%;overflow-x:hidden;overflow-y:scroll}.com-4-article-panels{font-size:0;margin-bottom:-10px}.com-4-article-panels>.panel-cell{display:inline-block;vertical-align:middle;margin-right:10px;margin-bottom:10px;width:calc((100% - 10px * 2 - 1px)/ 3)}.com-4-article-panels>.panel-cell:first-child{width:calc(66.6666% - 3px)}.com-4-article-panels>.panel-cell:nth-child(3n+2){margin-right:0}.com-loading-placeholder.com-4-article-panel-loading{height:162px}.com-4-article-panel{position:relative;box-sizing:border-box;padding:26px 20px;background-color:#F7F8FA;height:164px;transition:box-shadow .3s linear}.com-4-article-panel:hover{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-4-article-panel>.panel-link{position:absolute;left:0;top:0;z-index:1;width:100%;height:100%}.com-4-article-panel-title{margin-bottom:10px;font-size:18px;line-height:26px;font-weight:400;color:#333;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-4-article-panel-cnt{margin-bottom:0}.com-4-article-panel-cnt .com-media-object{padding-right:0;padding-left:15px;width:83px;vertical-align:top;padding-top:5px}.com-4-article-panel-cnt .com-thumbnail{width:83px;height:63px}.com-4-article-panel-desc{font-size:14px;line-height:22px;color:#999;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:44px}.com-4-article-panel-infos{margin-top:10px;font-size:0;line-height:20px}.com-4-article-panel-info{display:inline-block;vertical-align:middle;font-size:12px;color:#999}.com-4-article-panel-info em{margin-right:5px}.com-4-article-panel-author{position:relative;z-index:2;display:inline-block;vertical-align:middle;margin-right:20px}.com-4-article-panel-author .author-link{color:#999}.com-4-article-panel-author .com-2-avatar{width:20px;height:20px}.com-4-article-panel-author .author-name{display:inline-block;vertical-align:middle;margin-left:10px;max-width:5em;font-size:12px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.panel-cell:nth-child(n+3) .com-4-article-panel-author .author-name{max-width:12em}.com-4-article-panel-author .author-link:hover{color:#00a4ff}.com-4-article-panel-author .com-verification{margin:0 0 0 5px}.com-4-article-panel.large{padding-left:190px}.com-4-article-panel.large.without-img{padding-left:20px}.com-4-article-panel.large .com-4-article-panel-title{margin-bottom:5px}.com-4-article-panel.large .com-4-article-panel-cnt{display:block}.com-4-article-panel.large .com-4-article-panel-cnt .com-media-body{padding:0}.com-4-article-panel.large .com-4-article-panel-cnt .com-media-object{position:absolute;left:20px;top:26px;display:block;padding-left:0;padding-top:0;width:auto}.com-4-article-panel.large .com-thumbnail{width:146px;height:109px}.com-4-article-panel.large .com-4-article-panel-infos{margin-top:12px}.com-4-article-panel.large .com-4-article-panel-author .author-name{max-width:15em}.com-salon-panel{position:relative;box-sizing:border-box;padding:56px 0 31px;height:230px;background-color:#F3F5F9;transition:box-shadow .3s linear}.com-salon-panel:hover{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-salon-panel .panel-link{position:absolute;left:0;top:0;z-index:1;width:100%;height:100%}.com-salon-panel-hd{box-sizing:border-box;position:absolute;left:0;top:0;padding:15px 25px 0;width:100%;height:56px;overflow:hidden;background-position:right -40px;background-repeat:no-repeat;background-size:220px auto}.com-salon-panel-city{font-size:40px;line-height:44px;font-weight:400;color:#E1E3E9;font-style:italic}.com-salon-panel-bd{box-sizing:border-box;height:100%;position:relative;background-color:#fff;padding:20px 25px;border:1px solid #F4F4F5}.com-salon-panel-title{position:relative;font-size:18px;line-height:27px;color:#333;font-weight:400;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:54px}.com-salon-panel-infos{margin-top:12px;font-size:0}.com-salon-panel-infos .com-icon-datas{display:inline-block;vertical-align:middle;margin-right:20px}.com-salon-panel-btns{margin-top:20px}.com-salon-panel-btns .panel-btn{position:absolute;right:25px;bottom:-13px}.com-salon-panel-btns .com-2-avatar:nth-child(n+4){display:none}.com-salon-panel.large{padding:28px 25px 25px;height:194px;overflow:hidden}.com-salon-panel.large .com-salon-panel-hd{display:none}.com-salon-panel.large .com-salon-panel-img{position:absolute;right:0;top:0;width:100%;height:100%;background-position:right bottom;background-repeat:no-repeat;background-size:auto 100%}.com-salon-panel.large .com-salon-panel-bd{position:static;padding:0;background-color:transparent;border:none}.com-salon-panel.large .com-salon-panel-title{max-width:270px}.com-salon-panel.large .com-mark-skew{position:absolute;right:25px;top:0}.com-salon-panel.large .com-salon-panel-btns{position:absolute;left:25px;right:25px;bottom:25px}.com-salon-panel.large .panel-btn{position:relative;left:0;top:0;margin-right:15px}.com-salon-panel.large .com-2-avatars-group{display:inline-block;vertical-align:middle}.com-salon-panel.large .com-2-avatars{display:none}.com-salon-panels{font-size:0;margin-bottom:-15px}.com-salon-panels>.panel-cell{display:inline-block;vertical-align:middle;margin-right:15px;margin-bottom:15px;width:calc((100% - 15px * 2)/ 3)}.com-salon-panels>.panel-cell:nth-child(1),.com-salon-panels>.panel-cell:nth-child(2){width:calc((100% - 15px)/ 2)}.com-salon-panels>.panel-cell:nth-child(3n+2){margin-right:0}.com-salon-panels>.panel-cell:nth-child(3n+5){width:calc((100% - 15px * 2)/ 3 - 1px)\9}.com-loading-placeholder.com-salon-panel-loading{height:230px}.com-loading-placeholder.com-salon-panel-loading.large{height:194px}.com-user-panel{position:relative;box-sizing:border-box;height:275px}.com-user-panel-summary{opacity:1;transition:all .3s linear;transition-delay:.2s}.com-user-panel:hover .com-user-panel-summary{opacity:0}.com-user-panel-hd{box-sizing:border-box;padding:0 20px;height:175px;border-bottom:1px solid #EEEEEF}.com-user-panel-hd .com-2-avatar{display:block;width:90px;height:90px}.com-user-panel-title{position:relative;box-sizing:border-box;display:inline-block;vertical-align:middle;max-width:100%;margin-top:16px;font-weight:400}.com-user-panel-title.with-verify{padding-right:17px}.com-user-panel-title-inner{font-size:18px;line-height:25px;color:#333;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-user-panel-title .com-verification{position:absolute;right:0;top:7px;margin-right:0;white-space:normal}.com-user-panel-title .com-verification .c-bubble-left,.com-user-panel-title .com-verification .c-bubble-right{width:160px}.com-user-panel-identity{position:relative;box-sizing:border-box;margin-top:8px;font-size:12px;line-height:18px;color:#999;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-user-panel-bd{padding:20px 20px 0}.com-user-panel-skills{margin-top:17px}.com-user-panel-skills>dt{font-size:12px;line-height:18px;color:#999}.com-user-panel-skills>dd{margin-top:8px}.com-user-panel-skills .com-tag-v2{margin-bottom:8px}.com-user-panel-detail{position:absolute;left:0;top:0;box-sizing:border-box;width:100%;height:100%;background-color:#fff;opacity:0;-ms-transform:translateY(10px);-webkit-transform:translateY(10px);transform:translateY(10px);transition:all .3s linear;transition-delay:.2s;border:1px solid #E1E3E9}.com-user-panel:hover .com-user-panel-detail{opacity:1;-ms-transform:translateY(0);-webkit-transform:translateY(0);transform:translateY(0);will-change:transform,opacity;z-index:900}.com-user-panel-detail>.panel-link{position:absolute;left:0;top:0;z-index:1;width:100%;height:100%}.com-user-panel-detail .com-user-panel-hd{position:relative;padding-top:20px;padding-left:82px;height:110px;background-color:#F3F5F9}.com-user-panel-detail .com-2-avatar{position:absolute;left:25px;top:26px;width:45px;height:45px}.com-user-panel-detail .com-user-panel-title{margin-top:0}.com-user-panel-detail:hover .com-user-panel-title-inner{color:#00a4ff}.com-user-panel-detail:hover .com-verification{z-index:900}.com-user-panel-detail .com-user-panel-identity{display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:36px;white-space:normal}.com-user-panel-detail .com-user-panel-bd{position:absolute;left:0;top:110px;right:0;bottom:0;box-sizing:border-box;background-color:#fff;padding:20px}.com-user-panel-detail .com-user-panel-desc{font-size:12px;line-height:21px;color:#000;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:4;max-height:84px}.com-user-panel-detail .com-user-panel-skills{margin-top:10px}.com-user-panel-btns{position:absolute;left:0;right:0;bottom:17px;z-index:2;text-align:center}.com-user-panel-btns .c-btn{padding:0 12px;min-width:80px;height:26px;font-size:12px;line-height:26px}.com-user-panel-btns .c-btn-hole{line-height:24px}.com-user-panels-wrap{position:relative;padding-left:40px;padding-right:40px}.com-user-panels-cnt{overflow:hidden}.com-user-panels{font-size:0;white-space:nowrap;text-align:center}.com-user-panels>.panel-cell{display:inline-block;vertical-align:top;margin-left:18px;margin-right:18px;width:213px;white-space:normal;text-align:left}.com-user-panels>.panel-cell:first-child{margin-left:0}.com-user-panels-pages .com-page-btn{position:absolute;top:50%;margin:-12px 0 0}.com-user-panels-pages .com-page-btn.prev{left:0}.com-user-panels-pages .com-page-btn.next{right:0}.com-loading-placeholder.com-user-panel-loading{height:275px}.com-special-list-wrap{position:relative;box-sizing:border-box;height:410px;padding:0 15px 0 30px;border:1px solid #E1E3E9}.com-special-thumbnail{position:absolute;right:15px;top:15px;width:382px;height:378px;background-size:cover;background-position:center;transition:background-image .2s linear}.com-special-list{margin-right:440px}.com-special{box-sizing:border-box;position:relative;display:block;padding:25px 0;height:72px;overflow:hidden;transition:height .5s}.com-special-title{font-size:16px;line-height:22px;font-weight:400;color:#666;cursor:pointer}.com-special-title-inner{box-sizing:border-box;position:relative;display:inline-block;vertical-align:middle;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-special-title.with-mark .com-special-title-inner{padding-right:60px}.com-special-title .com-mark-rec{position:absolute;right:0;top:0;font-weight:400}.com-special-detail{box-sizing:border-box;position:absolute;left:0;top:0;padding:25px 0;width:100%;height:100%;opacity:0;visibility:hidden}.com-special-detail .com-special-title{font-size:22px;line-height:30px;font-weight:400;color:#333;cursor:text}.com-special-detail .com-special-desc{margin-top:14px;font-size:14px;line-height:24px;color:#999;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:48px}.com-special-detail .com-arrow-btn{margin-top:15px}.com-special-process{position:absolute;left:0;bottom:0;width:100%;height:1px;background-color:#E1E3E9}.com-special-process .process-bar{position:absolute;left:0;bottom:0;height:1px;width:100%;background-color:#00a4ff;display:none;transform:scaleX(0);transform-origin:left}.com-special-list.ani .process-bar{animation:width 10s linear}.com-special.actived{height:193px}.com-special.actived .com-special-summary{opacity:0}.com-special.actived .com-special-detail{opacity:1;visibility:visible}.com-special.actived .com-special-process .process-bar{display:block}.com-loading-placeholder.com-special-list-loading{height:406px}.com-team-panel{position:relative;box-sizing:border-box;height:550px;border:1px solid #E1E3E9;background-color:#fff}.com-team-panel .com-mark-triangle{position:absolute;left:0;top:0}.com-team-panel-hd{padding:30px 0 20px;text-align:center}.com-team-panel-title{font-size:18px;line-height:24px;color:#333;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-team-panel .com-2-avatars{margin-top:15px}.com-team-panel .com-vertical-datas{margin-top:20px}.com-team-panel .com-vertical-data{width:33.3333%}.com-team-panel .com-vertical-data:last-child{text-align:center}.com-team-panel-bd{padding:0 15px}.com-team-panel-subtitle{position:relative;margin-bottom:20px;font-size:12px;line-height:18px;color:#00a4ff;font-weight:400}.com-team-panel-subtitle:before{content:'';position:absolute;left:0;top:50%;width:100%;height:1px;background-color:#00A4FF;background:linear-gradient(to left,rgba(0,209,255,0) 0,rgba(0,164,255,1) 72%)}.com-team-panel-subtitle .text{position:relative;box-sizing:border-box;display:inline-block;vertical-align:middle;padding-right:17px;background-color:#fff}.com-team-panel-articles>li{margin-bottom:10px}.com-team-panel-article{margin-bottom:15px}.com-team-panel-article-cat{font-size:12px;line-height:18px;color:#999}.com-team-panel-article-cat .icon{position:relative;top:-1px;display:inline-block;vertical-align:middle;width:16px;height:16px;margin-right:5px}.com-team-panel-article-cat .icon.article{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:17.54% 89.89%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.com-team-panel-article-cat .icon.ask{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:60.19% 99.47%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.com-team-panel-article-cat .icon.action{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:68.72% 99.47%;background-size:1418.75% 1275%;;background-repeat:no-repeat}.com-team-panel-article-title{margin-top:8px;font-size:14px;line-height:24px;color:#333;font-weight:400;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:48px}.com-team-panel-article:hover .com-team-panel-article-title{color:#00a4ff}.com-team-panel-article .com-media-object{padding-right:0;padding-left:15px;width:106px}.com-team-panel-article .com-thumbnail{width:106px;height:80px}.com-team-panel-ft{position:absolute;left:0;bottom:0;width:100%;background-color:#F3F5F9;font-size:0}.com-team-panel-ft .ft-btn{display:inline-block;vertical-align:middle;width:100%;font-size:14px;line-height:46px;height:46px;text-align:center;color:#333}.com-team-panel-ft .ft-btn:hover{background-color:#00a4ff;color:#fff}.com-team-panels{font-size:0}.com-team-panels>.panel-cell{display:inline-block;vertical-align:top;margin-right:20px;width:calc((100% - 1px - 20px * 2)/ 3)}.com-team-panels>.panel-cell:last-child{margin-right:0}.com-loading-placeholder.com-team-panel-loading{height:550px}.com-2-ask-panel{position:relative;margin-top:20px;padding:30px 30px 17px;border:1px solid #E1E3E9}.com-2-ask-panel:before{content:'';position:absolute;left:20px;top:-1px;width:47px;height:1px;background-color:#fff}.com-2-ask-panel:after{content:'';position:absolute;left:29px;top:-11px;width:28px;height:26px;background-image:url(sprite/AskDialog-201906131103.svg);;background-position:17.59% 19.66%;background-size:810.7142857142858% 784.6153846153845%;;background-repeat:no-repeat}.com-2-ask-panel-hd{position:relative;padding-right:200px}.com-2-ask-panel-title{font-size:18px;line-height:21px;font-weight:400;color:#333;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-ask-panel-title a{color:inherit}.com-2-ask-panel-title a:hover{color:#00a4ff}.com-2-ask-panel-hd-extra{position:absolute;right:0;top:0;font-size:12px;line-height:21px;color:#999}.com-2-ask-panel-bd{position:relative;margin-top:17px;padding-left:160px;min-height:150px}.com-2-ask-panel-author{position:absolute;left:0;top:0;width:150px}.com-2-ask-panel-author .com-2-avatar{display:block;width:90px;height:90px}.com-2-ask-panel-author-name{position:relative;display:inline-block;vertical-align:middle;max-width:100%;box-sizing:border-box;margin-top:14px;font-size:18px;line-height:25px;color:#333;font-weight:500}.com-2-ask-panel-author-name.with-verify{padding-right:20px}.com-2-ask-panel-author:hover .com-2-ask-panel-author-name{color:#00a4ff}.com-2-ask-panel-author-name .name{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-ask-panel-author-name .com-verification{position:absolute;right:0;top:7px}.com-2-ask-panel-identity{margin-top:3px;font-size:13px;line-height:18px;color:#999;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-ask-panel-answer{box-sizing:border-box;background-color:#F3F5F9;border-radius:0 18px 18px;padding:22px 19px;margin-bottom:0;border:1px solid transparent}.com-2-ask-panel-answer:hover{border-color:#D2D9E7}.com-2-ask-panel-answer .com-media-body{height:106px}.com-2-ask-panel-answer-cnt{margin-top:-5px;font-size:14px;line-height:24px;color:#666;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:3;max-height:72px}.com-2-ask-panel-answer-opts{margin-top:16px}.com-2-ask-panel-answer .com-media-object{padding-right:0;padding-left:40px;width:192px}.com-2-ask-panel-answer .com-thumbnail{width:192px;height:106px}.com-loading-placeholder.com-2-ask-panel-loading{margin-top:20px;height:239px}.com-2-ask-panels>.panel-cell+.panel-cell{margin-top:30px}.com-2-doc-panel{display:table;table-layout:fixed;width:100%;height:90px;background-color:#f7f8fa;transition:box-shadow .2s}.com-2-doc-panel:hover{box-shadow:0 0 6px rgba(0,0,0,.1),0 4px 6px rgba(0,0,0,.1)}.com-2-doc-panel-hd{position:relative;display:table-cell;vertical-align:middle;width:90px;height:90px;text-align:center;overflow:hidden}.com-2-doc-panel .com-mark-triangle{position:absolute;left:0;top:0;z-index:1;width:36px;height:36px}.com-2-doc-panel .com-mark-triangle:before{border-width:18px}.com-2-doc-panel .com-mark-triangle .mark-cnt{margin-top:-15px;margin-left:-7px;-webkit-transform:rotate(-45deg) scale(.8333);-ms-transform:rotate(-45deg) scale(.8333);transform:rotate(-45deg) scale(.8333)}.com-2-doc-panel-img{position:relative;top:-1px;vertical-align:middle;width:90px;height:90px}.com-2-doc-panel-bd{display:table-cell;vertical-align:middle;padding:15px}.com-2-doc-panel-title{font-size:16px;line-height:22px;font-weight:500;color:#333;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-doc-panel-desc{font-size:12px;line-height:18px;color:#999;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-doc-panel.large{display:block;height:307px}.com-2-doc-panel.large .com-2-doc-panel-hd{display:block;line-height:90px;width:auto}.com-2-doc-panel.large .com-2-doc-panel-bd{display:block;padding:15px 30px}.com-2-doc-panel-outline{margin-top:10px;font-size:14px;line-height:24px;color:#333}.com-2-doc-panel-outline li{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-doc-panel-outline li:last-child{margin-top:-4px}.com-2-doc-panels-wrap{font-size:0}.com-2-doc-panels-wrap>.wrap-cell{display:inline-block;vertical-align:top;box-sizing:border-box;margin-right:16px;width:calc((100% - 16px)/ 2)}.com-2-doc-panels-wrap>.wrap-cell:last-child{margin-right:0}.com-2-doc-panels-wrap .com-2-avatars-group{display:none;margin-top:13px}.com-2-doc-panels{margin-bottom:-18px}.com-2-doc-panels>.panel-cell{display:inline-block;vertical-align:top;margin-right:12px;margin-bottom:18px;width:calc((100% - 12px)/ 2)}.com-2-doc-panels>.panel-cell:nth-child(2n){margin-right:0}.com-2-doc-panels.large{margin-bottom:0}.com-2-doc-panels.large>.panel-cell{margin-bottom:0;margin-right:16px;width:calc((100% - 16px)/ 2)}.com-2-doc-panels.large>.panel-cell:nth-child(2n){margin-right:0}.com-2-doc-panels.cols-3>.panel-cell{margin-right:20px;margin-bottom:20px;width:calc((100% - 20px * 2)/ 3)}.com-2-doc-panels.cols-3>.panel-cell:nth-child(2n){margin-right:20px}.com-2-doc-panels.cols-3>.panel-cell:nth-child(3n){margin-right:0}.com-loading-placeholder.com-2-doc-panel-loading{height:90px}.com-loading-placeholder.com-2-doc-panel-loading.large{height:307px}.com-2-doc-panels-wrap.v2 .com-2-doc-panel{background-color:#f7f8fa;height:80px}.com-2-doc-panels-wrap.v2 .com-loading-placeholder.com-2-doc-panel-loading{height:80px}.com-2-doc-panels-wrap.v2 .com-2-doc-panel-hd{width:80px;height:80px;background-color:#eef1f5}.com-2-doc-panels-wrap.v2 .com-2-doc-panel-img{width:80px;height:80px}.com-2-doc-panels-wrap.v2 .com-2-doc-panel-bd{padding:10px 20px}.com-2-doc-panels-wrap.v2 .com-2-doc-panel.large{height:260px}.com-2-doc-panels-wrap.v2 .com-2-doc-panel.large .com-2-doc-panel-hd{width:auto}.com-2-doc-panels-wrap.v2 .com-loading-placeholder.com-2-doc-panel-loading.large{height:260px}.com-2-doc-panels-wrap.v2>.wrap-cell{margin-right:10px;width:calc((100% - 10px - 1px)/ 2)}.com-2-doc-panels-wrap.v2>.wrap-cell:last-child{margin-right:0}.com-2-doc-panels-wrap.v2 .com-2-doc-panels>.panel-cell{margin-right:10px;margin-bottom:10px}.com-2-doc-panels-wrap.v2 .com-2-doc-panels>.panel-cell:nth-child(2n){margin-right:0;width:calc((100% - 10px - 1px)/ 2)}.com-2-doc-panels-wrap.v2 .com-2-doc-panels.large>.panel-cell{margin-right:10px;width:calc((100% - 10px - 1px)/ 2)}.com-2-doc-panels-wrap.v2 .com-2-doc-panels.large>.panel-cell:last-child{margin-right:0}.com-owner-panel{margin-bottom:40px;padding-top:48px;width:330px;height:175px}.com-owner-panel-inner{position:relative;box-sizing:border-box;padding:12px 20px 0;width:100%;height:100%;background-color:#fff;border:1px solid #e5e5e5}.com-owner-panel .com-2-avatar{position:absolute;left:20px;top:-48px}.com-owner-panel-hd{padding-left:131px;min-height:66px}.com-owner-panel-title{font-size:18px;line-height:25px;color:#000;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-owner-panel-title a{color:inherit}.com-owner-panel-title a:hover{color:#00a4ff}.com-owner-panel-identity{font-size:14px;line-height:20px;color:#666;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:40px}.com-owner-panel .com-emblem-list{margin-top:5px}.com-owner-panel .com-emblem-list>li{margin-left:0;margin-right:5px}.com-owner-panel-level-title{display:inline-block;vertical-align:middle;font-size:12px;line-height:18px;color:#00a4ff}.com-owner-panel-level-infos{margin-top:10px}.com-owner-panel-process{display:inline-block;vertical-align:middle;margin-right:10px;width:220px}.com-owner-panel-datas{margin-top:20px;display:table;width:100%;padding:0 2px}.com-owner-panel-datas>li{display:table-cell;vertical-align:top;width:50%;text-align:left}.com-owner-panel-data{display:inline-block;vertical-align:top;text-align:center;white-space:nowrap;font-size:13px;line-height:18px;color:#333}.com-owner-panel-data:hover{color:#00a4ff}.com-owner-panel-data .icon{display:inline-block;vertical-align:middle;margin-right:10px;width:24px;height:24px}.com-owner-panel-data .icon.follow{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:60.099999999999994% 15%;background-size:945.8333333333334% 850%;;background-repeat:no-repeat}.com-owner-panel-data .icon.column{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:13.3% 38.33%;background-size:945.8333333333334% 850%;;background-repeat:no-repeat}.com-owner-panel-data .icon.activities{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:60.099999999999994% 29.439999999999998%;background-size:945.8333333333334% 850%;;background-repeat:no-repeat}.com-owner-panel-data .title{display:inline-block;vertical-align:middle;font-weight:400}.com-owner-panel-data.has-msg .title{position:relative}.com-owner-panel-data.has-msg .title:after{content:'';position:absolute;left:100%;top:50%;margin-top:-3px;margin-left:5px;width:6px;height:6px;border-radius:50%;background-color:#FF7800}.com-login-panel{box-sizing:border-box;margin-top:48px;margin-bottom:40px;padding:20px;width:330px;height:175px;background-color:#fff;border:1px solid #D2D9E7;font-size:18px;line-height:24px;color:#999;text-align:center}.com-login-panel .login-tip{margin-bottom:20px}.com-login-panel .c-btn{min-width:205px;height:40px;line-height:40px}.com-login-panel .c-btn-hole{margin-top:10px;line-height:38px}.com-hero-event{display:block;box-sizing:border-box;padding:10px 20px;margin-left:-1px;margin-right:-1px;height:134px;text-align:center;background-color:#fff;transition:box-shadow .3s linear}.com-hero-event-img{display:block;margin:0 auto;width:44px;height:44px}.com-hero-event-title{display:inline-block;vertical-align:middle;padding-bottom:2px;max-width:100%;margin-top:10px;font-size:18px;line-height:28px;font-weight:400;color:#333;border-bottom:1px solid #00a4ff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-hero-event-title em{color:#00a4ff;font-weight:500}.com-hero-event-title .tag{position:relative;top:-2px;display:inline-block;vertical-align:middle;box-sizing:border-box;margin-right:5px;padding:0 8px;height:20px;border-radius:2px;border:1px solid #FF7200;font-size:12px;line-height:18px;color:#FF7200}.com-hero-event-desc{margin-top:6px;font-size:12px;line-height:21px;color:#666;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-hero-event:hover{position:relative;z-index:2;box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-hero-events{margin-bottom:40px;display:table;table-layout:fixed;width:100%}.com-hero-events>.event-cell{position:relative;display:table-cell;vertical-align:top}.com-hero-events>.event-cell:first-child{padding-left:0}.com-hero-events>.event-cell:last-child{padding-right:0}.com-hero-events>.event-cell:before{content:'';position:absolute;left:0;top:50%;margin-top:-40px;width:1px;height:80px;background-color:#E1E3E9}.com-hero-events>.event-cell:first-child:before{display:none}.com-v2-multi-selector{position:relative;display:inline-block}.com-v2-multi-selector.block{display:block}.com-v2-dropdown-link{display:block;box-sizing:border-box;width:100%;height:44px;padding:0 40px 0 15px;background-color:#fff;border:1px solid #e5e5e5;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:left;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.65,.05,.36,1);font-size:14px;line-height:42px;color:#000}.com-v2-dropdown-link .caret{position:absolute;right:15px;top:50%;margin-top:-4px;width:15px;height:8px;background-image:url(sprite/AskDialog-201906131103.svg);;transition:all .2s linear;background-position:99.06% 64.8%;background-size:1513.3333333333333% 2550%;;background-repeat:no-repeat}.com-v2-multi-selector.opened .com-v2-dropdown-link .caret{transform:rotate(180deg)}.com-v2-dropdown-menu{width:100%;min-width:470px;border:1px solid #e5e5e5;background-color:#fff;position:absolute;top:100%;left:0;z-index:1;margin-top:5px;box-sizing:border-box}.com-v2-dropdown-menu .com-v2-dropdown-tab-hd .tab-btn{color:#444;height:52px;line-height:52px;padding:0 30px;border-right:1px solid #e5e5e5;display:inline-block;font-size:14px}.com-v2-dropdown-menu .com-v2-dropdown-tab-hd .tab-btn.cur{border-bottom:1px solid #fff}.com-v2-dropdown-menu .com-v2-dropdown-tab-hd{font-size:0;margin-bottom:-1px}.com-v2-dropdown-menu .com-v2-dropdown-tab-hd .tab-btn:hover{text-decoration:none}.com-v2-dropdown-menu .com-v2-dropdown-tab-hd+.com-v2-dropdown-tab-bd{border-top:1px solid #e5e5e5}.com-v2-dropdown-menu .com-v2-dropdown-tab-bd{padding:5px 15px;max-height:320px;overflow-x:hidden;overflow-y:auto}.com-v2-dropdown-menu .area-list{font-size:0}.com-v2-dropdown-menu .area-list li{display:inline-block;padding-right:10px;width:50%;font-size:12px;box-sizing:border-box;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.com-v2-dropdown-menu .area-list li a{height:44px;line-height:44px;box-sizing:border-box;display:block;padding:0 13px;color:#000}.com-v2-dropdown-menu .area-list+.area-list{border-top:1px solid #e5e5e5;padding-top:5px}.com-v2-dropdown-menu .area-list li a:hover{background-color:#F2F2F2;text-decoration:none}.com-v2-dropdown-menu .area-list li.cur a{color:#fff;background-color:#00a4ff}.com-full-layout{box-sizing:border-box;position:relative;min-width:1000px;background-color:#F3F5F9}.com-full-layout:before{content:'';position:absolute;left:50%;right:0;top:0;bottom:0;background-color:#fff}.com-full-layout>.layout-inner{box-sizing:border-box;position:relative;margin:0 auto;max-width:1200px;height:100%}.com-full-layout-aside{box-sizing:border-box;position:fixed;top:96px;bottom:0;z-index:300;padding:30px 10px;width:200px;background-color:#F3F5F9;overflow:auto}.com-full-layout-main{box-sizing:border-box;position:relative;margin-left:200px;min-height:100%;background-color:#fff;padding:20px 10px 20px 30px}.com-full-layout-hd{margin-bottom:20px}.com-full-layout-title{font-size:22px;line-height:45px;color:#000;font-weight:400}.com-full-layout-desc{margin-top:5px;font-size:14px;line-height:24px;color:#666}.com-crumb.com-full-layout-crumb{margin-top:0;margin-bottom:10px}.com-full-layout-crumb .com-inner{padding:0 0 0 20px}.com-full-layout-nav>li{position:relative;padding:20px;border-bottom:1px solid #D2D9E7}.com-full-layout-nav>li:last-child{border-bottom:none}.com-full-layout-nav .nav-item{display:block;font-size:14px;line-height:24px;color:#333;text-decoration:none}.com-full-layout-nav a.nav-item:hover{color:#00a4ff}.com-full-layout-nav>.actived:after{content:'';position:absolute;left:0;bottom:-1px;width:80px;height:1px;background-color:#00a4ff}.com-full-layout-nav>.actived .nav-item{color:#00a4ff;cursor:default}.com-full-layout-nav .nav-tags{margin-top:15px;margin-right:-30px;padding-right:30px;overflow-x:hidden;overflow-y:auto}.com-full-layout-nav .nav-tags>li{display:block;margin-bottom:15px}.com-full-layout-nav .nav-tags .com-tag-v2{display:inline-block;vertical-align:middle;max-width:100%;margin:0}.com-full-layout-nav .nav-tags-more{margin-top:10px}.com-full-layout-nav .nav-tags-more a{color:#999}.com-full-layout-nav .nav-tags-more a:hover{color:#00a4ff}.com-full-layout-search{margin-bottom:18px}.com-2-hero{padding-top:10px;margin-bottom:30px}.com-2-hero-inner{margin:0 auto}.com-2-hero-list{font-size:0}.com-2-hero-list>.hero-cell{box-sizing:border-box;display:inline-block;vertical-align:middle;width:33.33%}.com-2-hero-list>.hero-cell:nth-child(2){padding:0 10px}.com-2-hero-item{position:relative;box-sizing:border-box;display:block;height:280px;background-color:#79a8ff;background-position:center right;background-repeat:no-repeat;background-size:auto 100%;color:#fff;overflow:hidden}.com-2-hero-item-img{position:absolute;left:0;right:0;top:0;height:100%;background-position:center right;background-repeat:no-repeat;background-size:auto 100%;-webkit-transition:-webkit-transform .3s ease-in-out;transition:-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out;transition:transform .3s ease-in-out,-webkit-transform .3s ease-in-out}.com-2-hero-item:hover .com-2-hero-item-img{-webkit-transform:scale(1.025);transform:scale(1.025)}.com-2-hero-item-mark-wrap{margin-bottom:20px;min-height:20px}.com-2-hero-item-mark{display:inline-block;vertical-align:middle;padding:0 5px;height:20px;font-size:12px;line-height:20px;background-color:#00A4FF;border-radius:2px;color:#fff}.com-2-hero-item-mark.white{background-color:#fff;color:#00a4ff}.com-2-hero-item-cnt{position:relative;padding:60px 45px 0;height:187px}.com-2-hero-item-title{margin-bottom:20px;font-size:28px;line-height:36px;font-weight:400;max-width:350px;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:72px}.com-2-hero-item-desc{margin-top:4px;font-size:14px;line-height:24px;max-width:350px;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-hero-item-btns{display:none;position:absolute;left:45px;bottom:0;margin-top:20px}.com-2-hero-item.black{background-color:#e6e9ee;color:#000}.com-3-user-panel{position:relative;box-sizing:border-box;height:210px;text-align:center;padding:20px 10px}.com-3-user-panel .panel-link{position:absolute;left:0;top:0;z-index:1;width:100%;height:100%}.com-3-user-panel .com-2-avatar{display:block;margin:0 auto;width:80px;height:80px;transition:all .3s ease-in-out}.com-3-user-panel-title{position:relative;box-sizing:border-box;display:inline-block;vertical-align:middle;max-width:100%;margin-top:10px;font-weight:400}.com-3-user-panel-title.with-verify{padding-right:17px}.com-3-user-panel-title-inner{font-size:18px;line-height:25px;color:#333;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-3-user-panel-title .com-verification{position:absolute;right:0;top:7px;margin-right:0;white-space:normal}.com-3-user-panel:hover .com-verification{z-index:900}.com-3-user-panel-title .com-verification .c-bubble{width:160px;margin-left:-80px}.com-3-user-panel-identity{position:relative;box-sizing:border-box;margin-top:5px;font-size:12px;line-height:18px;color:#999;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-3-user-panel-skills{font-size:12px;line-height:18px;color:#999;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;height:0;transition:all .3s ease-in-out}.com-3-user-panel-btns{position:absolute;left:0;bottom:15px;z-index:2;width:100%}.com-3-user-panel-btns .c-btn{padding:0 12px;min-width:80px;height:28px;font-size:12px;line-height:26px}.com-3-user-panel:hover{padding-top:15px;background-color:#F7F8FA}.com-3-user-panel:hover .com-2-avatar{width:50px;height:50px}.com-3-user-panel:hover .com-3-user-panel-skills{height:36px}.com-3-user-panels-wrap{position:relative;padding-left:40px;padding-right:40px}.com-3-user-panels-cnt{height:210px;overflow:hidden}.com-3-user-panels{font-size:0}.com-3-user-panels>.panel-cell{display:inline-block;vertical-align:top;box-sizing:border-box;white-space:normal;text-align:left;margin-left:20px;width:calc((100% - 20px * 4 - 1px)/ 5)}.com-3-user-panels>.panel-cell:first-child{margin-left:0}.com-3-user-panels-pages .com-page-btn{position:absolute;top:50%;margin:-21px 0 0;width:42px;height:42px;text-align:center;line-height:42px}.com-3-user-panels-pages .com-page-btn .btn-icon{display:inline-block;vertical-align:middle;width:24px;height:24px}.com-3-user-panels-pages .com-page-btn.prev{left:0}.com-3-user-panels-pages .com-page-btn.next{right:0}.com-loading-placeholder.com-3-user-panel-loading{height:210px}.com-2-special-list-wrap{position:relative;box-sizing:border-box;height:294px;background-color:#F7F8FA}.com-2-special-thumbnail{position:absolute;left:0;top:0;width:280px;height:100%;background-size:cover;background-position:center;transition:background-image .2s linear}.com-2-special-list{margin-right:25px;margin-left:300px;padding-top:10px}.com-2-special{box-sizing:border-box;position:relative;display:block;padding:10px 0;height:41px;overflow:hidden;transition:height .5s}.com-2-special-title{font-size:14px;line-height:20px;font-weight:400;color:#666;cursor:pointer}.com-2-special-title-inner{box-sizing:border-box;position:relative;display:inline-block;vertical-align:middle;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-special-title.with-mark .com-2-special-title-inner{padding-right:60px}.com-2-special-title .com-mark-rec{position:absolute;right:0;top:-2px;font-weight:400}.com-2-special-detail{box-sizing:border-box;position:absolute;left:0;top:0;padding:10px 0 20px;width:100%;height:100%;opacity:0;visibility:hidden}.com-2-special-detail .com-2-special-title{font-size:24px;line-height:34px;font-weight:500;color:#000;cursor:text}.com-2-special-detail .com-mark-rec{top:5px}.com-2-special-detail .com-2-special-desc{margin-top:10px;font-size:12px;line-height:22px;color:#333;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:44px}.com-2-special-detail .com-arrow-btn{margin-top:10px}.com-2-special-process{position:absolute;left:0;bottom:0;width:100%;height:1px;background-color:#E1E3E9}.special-cell:last-child .com-2-special-process{background-color:transparent}.com-2-special-process .process-bar{position:absolute;left:0;bottom:0;height:1px;width:100%;background-color:#00a4ff;display:none;transform:scaleX(0);transform-origin:left}.com-2-special-list.ani .process-bar{animation:width 10s linear}@keyframes width{0%{transform:scaleX(0)}100%{transform:scaleX(1)}}.com-2-special.actived{height:154px}.com-2-special.actived .com-2-special-summary{opacity:0}.com-2-special.actived .com-2-special-detail{opacity:1;visibility:visible}.com-2-special.actived .com-2-special-process .process-bar{display:block}.com-loading-placeholder.com-2-special-list-loading{height:294px}.com-2-team-panel{position:relative;box-sizing:border-box;height:343px;background-color:#f7f8fa}.com-2-team-panel .com-mark-triangle{position:absolute;left:0;top:0}.com-2-team-panel-hd{padding:30px 20px 20px;text-align:center}.com-2-team-panel-title{font-size:18px;line-height:24px;color:#333;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-team-panel .com-2-avatars{margin-top:15px}.com-2-team-panel .com-2-avatar{width:32px;height:32px}.com-2-team-panel .com-datas{margin-top:20px}.com-2-team-panel-bd{padding:0 20px}.com-2-team-panel-subtitle{position:relative;margin-bottom:10px;font-size:12px;line-height:18px;color:#999;font-weight:400}.com-2-team-panel-subtitle:before{content:'';position:absolute;left:0;top:50%;width:100%;height:1px;background-color:#00A4FF;background:linear-gradient(to left,rgba(0,209,255,0) 0,rgba(0,164,255,1) 72%)}.com-2-team-panel-subtitle .text{position:relative;box-sizing:border-box;display:inline-block;vertical-align:middle;padding-right:17px;background-color:#f7f8fa}.com-2-team-panel-articles>li{margin-bottom:10px}.com-2-team-panel-article{display:inline-block;vertical-align:middle;max-width:100%;font-size:12px;line-height:24px;color:#666;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-team-panel-article .split{position:relative;top:-1px;display:inline-block;vertical-align:middle;margin:0 6px;width:2px;height:2px;background-color:#666;border-radius:50%}.com-2-team-panel-article:hover{color:#00a4ff}.com-2-team-panel-article:hover .split{background-color:#00a4ff}.com-2-team-panel-ft{position:absolute;left:0;bottom:0;width:100%;font-size:0;padding-bottom:20px;text-align:center}.com-2-team-panel:hover,.com-2-team-panel:hover .com-2-team-panel-subtitle .text{background-color:#eef1f5}.com-2-team-panel:hover .com-arrow-btn{background-color:#fff;color:#fff}.com-2-team-panel:hover .com-arrow-btn-text{background-color:#00a4ff}.com-2-team-panel:hover .com-arrow-btn-text:after{border-color:#00a4ff transparent transparent #00a4ff}.com-2-team-panel:hover .com-arrow-btn.actived,.com-2-team-panel:hover .com-arrow-btn:hover{box-shadow:0 4px 9px 0 rgba(0,164,255,.22)}.com-2-team-panels{font-size:0}.com-2-team-panels>.panel-cell{display:inline-block;vertical-align:top;margin-right:20px;width:calc((100% - 1px - 20px * 2)/ 3)}.com-2-team-panels>.panel-cell:last-child{margin-right:0}.com-loading-placeholder.com-2-team-panel-loading{height:343px}.com-simple-ask{position:relative;padding:10px 20px 10px 76px;box-sizing:border-box;height:70px}.com-simple-ask:hover{background-color:#F7F8FA}.com-simple-ask .panel-link{position:absolute;left:0;top:0;width:100%;height:100%;z-index:1}.com-simple-ask-answer{position:absolute;left:10px;top:10px;-webkit-box-sizing:border-box;box-sizing:border-box;padding:5px 5px 0;width:46px;height:46px;border-radius:2px;background-color:#E1EEFA;line-height:1.2;color:#00a4ff;text-align:center;cursor:pointer}.com-simple-ask-answer .num{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:16px}.com-simple-ask-answer .name{font-size:12px}.com-simple-ask-answer.none-answer{background-color:#F3F4F5;color:#444}.com-simple-ask-title{font-size:16px;line-height:28px;color:#000;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-simple-ask-tags{position:relative;z-index:2;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-simple-asks{font-size:0;margin-bottom:-10px}.com-simple-asks>.panel-cell{display:inline-block;vertical-align:top;width:100%}.com-simple-asks.list-2>.panel-cell{margin-right:20px;width:calc((100% - 20px - 1px)/ 2)}.com-simple-asks.list-2>.panel-cell:nth-child(2n){margin-right:0}.com-simple-ask-loading{height:60px;margin-bottom:10px}.com-2-login-panel{margin-bottom:20px;box-sizing:border-box;height:148px;padding-top:20px;text-align:center;background:url(src/components/LoginPanel2/css/img/bg.jpg) right top no-repeat #F7F8FA;background-size:auto 148px}.com-2-login-panel .login-tip{margin-bottom:20px;font-size:14px;line-height:24px;color:#999}.com-2-login-panel .login-tip-primary{font-size:18px}.com-2-login-panel .login-tip-primary em{color:#00a4ff}.com-2-login-panel .c-btn{margin:0 6px;width:110px;min-width:0}.com-2-login-panel .c-btn-hole{background-color:#fff}.com-2-login-panel .c-btn-hole:hover{background-color:#e8f1fb}.com-2-owner-panel{margin-bottom:20px;box-sizing:border-box;height:148px;padding:10px;background:url(src/components/LoginPanel2/css/img/bg.jpg) right top no-repeat #F7F8FA;background-size:auto 148px}.com-2-owner-panel-hd{position:relative;margin-bottom:18px;padding-left:100px}.com-2-owner-panel-hd .com-2-avatar{position:absolute;left:0;top:0;width:80px;height:80px}.com-2-owner-panel-main{min-height:61px}.com-2-owner-panel-title{font-size:16px;line-height:22px;color:#000;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-owner-panel-title a{color:inherit}.com-2-owner-panel-title a:hover{color:#00a4ff}.com-2-owner-panel-identity{margin-bottom:5px;font-size:12px;line-height:18px;color:#999;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-owner-panel .com-emblem-list{margin-top:0;margin-bottom:5px}.com-2-owner-panel .com-emblem{margin-left:0}.com-2-owner-panel .com-emblem:last-child{margin-right:0}.com-2-owner-panel-level-infos{position:relative;padding-right:55px}.com-2-owner-panel-level-title{position:absolute;left:100%;top:0;margin-left:-50px;font-size:12px;line-height:16px;color:#00a4ff;white-space:nowrap}.com-2-owner-panel-datas{font-size:0}.com-2-owner-panel-datas>li{display:inline-block;vertical-align:top;width:33.33%;box-sizing:border-box;padding-right:2px}.com-2-owner-panel-datas>li:last-child{padding-right:0}.com-2-owner-panel-data{display:block;height:20px;font-size:12px;line-height:20px;color:#666;text-align:center;background-color:#fff}.com-2-owner-panel-data:hover{color:#00a4ff}.com-2-owner-panel-data.has-msg:after{content:'';position:relative;top:-1px;display:inline-block;vertical-align:middle;margin-left:4px;width:6px;height:6px;border-radius:50%;background-color:#FF7800}.com-2-organizer{box-sizing:border-box;display:table;table-layout:fixed;padding:20px;width:100%;border:1px solid #E5E8ED;background-color:#fff;transition:box-shadow .3s linear}a.com-2-organizer:hover{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-2-organizer-img{display:table-cell;width:120px;vertical-align:middle}.com-2-organizer-img img{display:block;width:100%;max-height:50px}.com-2-organizer-bd{display:table-cell;vertical-align:middle;padding-left:20px;word-wrap:break-word;height:70px}.com-2-organizer-title{font-size:18px;line-height:24px;color:#000;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-organizer-desc{margin-top:2px;font-size:14px;line-height:22px;color:#666;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:44px}.com-2-organizer.small{display:block;text-align:center}.com-2-organizer.small .com-2-organizer-img{display:block;width:120px;height:50px;margin:0 auto}.com-2-organizer.small .com-2-organizer-bd{display:block;margin-top:20px;padding:0}.com-2-organizer.small .com-2-organizer-desc{margin-top:10px}.com-2-organizers{font-size:0}.com-2-organizers>.panel-cell{margin-bottom:20px;font-size:14px}.com-2-organizers[class*=list]>.panel-cell{display:inline-block;vertical-align:top;margin-right:20px}.com-2-organizers.list2>.panel-cell{width:calc((100% - 20px -1px)/ 2)}.com-2-organizers.list2>.panel-cell:nth-child(2n){margin-right:0}.com-2-organizers.list3>.panel-cell{width:calc((100% - 20px * 2 -1px)/ 3)}.com-2-organizers.list3>.panel-cell:nth-child(3n){margin-right:0}.com-2-organizers.list4>.panel-cell{width:calc((100% - 20px * 3 -1px)/ 4)}.com-2-organizers.list4>.panel-cell:nth-child(4n){margin-right:0}.com-action-panel{padding-top:30px;border-bottom:1px solid #E5E8ED}.com-action-panel-hd{position:relative;z-index:1;height:20px}.com-action-panel-action{font-size:14px;line-height:20px;color:#666}.com-action-panel-action-icon{display:inline-block;vertical-align:middle;position:relative;top:-1px;margin-right:5px;width:20px;height:20px}.com-action-panel-action-icon.answer,.com-action-panel-action-icon.ask{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:71.5% 40.760000000000005%;background-size:1135% 1019.9999999999999%;;background-repeat:no-repeat}.com-action-panel-action-icon.follow{top:-2px;background-image:url(sprite/AskDialog-201906131103.svg);;background-position:71.5% 52.72%;background-size:1135% 1019.9999999999999%;;background-repeat:no-repeat}.com-action-panel-action-icon.join{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:71.5% 64.67%;background-size:1135% 1019.9999999999999%;;background-repeat:no-repeat}.com-action-panel-action-icon.like{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:0.48% 79.89%;background-size:1135% 1019.9999999999999%;;background-repeat:no-repeat}.com-action-panel-action-icon.publish{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:21.740000000000002% 79.89%;background-size:1135% 1019.9999999999999%;;background-repeat:no-repeat}.com-action-panel-time{position:absolute;right:0;top:0;font-size:14px;line-height:20px;color:#999}.com-action-panel .com-3-article-panel,.com-action-panel .com-3-salon-panel,.com-action-panel .com-3-tag-panel,.com-action-panel .com-column-panel,.com-action-panel .coml-2-user-panel{margin-top:-50px;padding-top:70px;padding-bottom:30px;border-bottom:none}.com-action-panel .com-ask-panel{margin-top:24px;margin-bottom:0;padding-bottom:30px;border-bottom:none}.com-ask-action{padding-top:30px}.com-ask-action-hd{position:relative;z-index:1;height:16px}.com-ask-action-action{font-size:14px;line-height:16px;color:#666}.com-ask-action .com-ask-panel{margin-top:24px;margin-bottom:0;padding-bottom:30px}.com-2-tab-subctrl{margin-bottom:20px;font-size:0}.com-2-tab-subctrl-nav{display:inline-block;vertical-align:middle;font-size:0}.com-2-tab-subctrl-nav-item{display:inline-block;vertical-align:middle;margin-right:45px;font-size:16px;line-height:22px;color:#666}.com-2-tab-subctrl-nav-item a{color:inherit}.com-2-tab-subctrl-nav-item a:hover{color:#00a4ff}.com-2-tab-subctrl-nav-item.actived{font-weight:500;color:#000}.com-2-tab-subctrl-nav-item.actived a{cursor:default}.com-2-tab-subctrl-nav-item.actived a:hover{color:inherit}.com-2-tab-subctrl-drop .com-bubble-menu a{padding:0 15px;height:40px;line-height:40px}.com-2-tab-subctrl-drop .c-bubble-trigger-btn{font-size:16px;line-height:22px;height:22px}.com-2-tab-subctrl-drop.actived .c-bubble-trigger-btn{font-weight:500;color:#000}.com-2-tab-subctrl-drop.actived:hover .c-bubble-trigger-btn{color:#00a4ff}.com-2-tab-subctrl-drop:hover .c-bubble{pointer-events:auto;margin-top:0;padding-top:10px;width:120px}.com-weak-section{margin-bottom:25px}.com-weak-section-title{font-size:16px;line-height:22px;color:#000;font-weight:400}.com-rec-section-hd{position:relative;text-align:center}.com-rec-section-hd:before{content:'';position:absolute;left:0;top:50%;width:100%;height:1px;background-color:#D8D8D8}.com-rec-section-title{position:relative;z-index:1;top:-2px;display:inline-block;vertical-align:middle;padding:0 10px;font-size:16px;line-height:22px;color:#999;font-weight:400;background-color:#fff}.com-rec-section-bd{padding-top:35px}.com-rec-section-ft{margin-top:20px;text-align:center}.com-rec-section-ft .c-btn{min-width:130px;height:32px;line-height:32px;font-size:14px}.com-rec-section-ft .c-btn-hole,.com-rec-section-ft .c-btn-weak{line-height:30px}.com-dialog-level{box-sizing:border-box;min-height:460px;padding:20px 0;text-align:center}.com-dialog-level-bd{box-sizing:border-box;min-height:340px;padding-top:1px}.com-dialog-level-title{margin-bottom:15px;font-size:24px;line-height:36px;font-weight:400;color:#000}.com-dialog-level-title em{color:#FF7800}.com-dialog-level-desc{font-size:18px;line-height:26px;color:#666}.com-dialog-level-ft{margin-top:20px;font-size:14px;line-height:26px;color:#999}.com-dialog-level-now{position:relative;box-sizing:border-box;padding-top:130px;height:230px;width:330px;margin:50px auto 17px;background-image:url(src/components/DLevel/css/img/slice/icon-now.jpg);background-size:100% auto}.com-dialog-level-now .now-content{margin:0 auto;width:110px;height:48px;font-size:32px;line-height:48px;text-align:center;color:#fff;font-weight:700}.com-dialog-level-goal{box-sizing:border-box;margin:77px auto 20px;padding-top:13px;width:220px;height:160px;text-align:center;background-size:100% auto;background-image:url(src/components/DLevel/css/img/slice/icon-goal.jpg)}.com-dialog-level-goal .goal-content{margin:0 auto;width:122px;height:140px;font-size:60px;line-height:140px;color:#fff;text-shadow:0 4px 4px #FCB53B;font-weight:500}.com-dialog-level-goal .goal-action{position:relative;top:-5px;margin-right:3px}.com-dialog-level-gift{margin:88px auto 10px;box-sizing:border-box;padding-top:42px;width:330px;height:160px;background-size:100% auto;background-image:url(src/components/DLevel/css/img/slice/icon-gift.jpg)}.com-dialog-level-gift .gift-content{margin:0 auto;width:160px;height:82px;box-sizing:border-box;text-align:center;color:#fff;padding-top:10px;text-shadow:0 4px 4px #FCB53B;font-weight:500}.com-dialog-level-gift .gift-price{font-size:30px;line-height:42px}.com-dialog-level-gift .gift-name{font-size:14px;line-height:20px}.com-narrow-layout{margin:0 auto;padding:25px 0 50px;width:800px}.com-narrow-layout-pages{margin-bottom:25px}.com-narrow-layout-prev{font-size:12px;line-height:18px;color:#000}.com-narrow-layout-prev:before{content:'';display:inline-block;vertical-align:middle;width:7px;height:11px;background-image:url(sprite/AskDialog-201906131103.svg);;margin-right:10px;position:relative;top:-1px;background-position:61.82% 54.400000000000006%;background-size:3242.857142857143% 1854.5454545454547%;;background-repeat:no-repeat}.com-narrow-layout-prev:hover{color:#00a4ff}.com-narrow-layout-prev:hover:before{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:50% 40.93%;background-size:3242.857142857143% 1854.5454545454547%;;background-repeat:no-repeat}.com-third-section{padding-bottom:25px;margin-bottom:25px;border-bottom:1px solid #eee}.com-third-section.without-border{padding-bottom:0;border-bottom:none}.com-third-section-hd{margin-bottom:20px}.com-third-section-title{font-size:18px;line-height:18px;color:#000;font-weight:400}.com-layout-panel{padding:30px;background-color:#fff;border:1px solid #E5E8ED;box-shadow:0 2px 4px 0 rgba(3,27,78,.06)}.com-layout-panel-subtab{margin-bottom:30px}.com-btn-group{display:inline-block;vertical-align:middle;font-size:0}.com-btn-group .c-btn{vertical-align:middle;box-sizing:border-box;min-width:96px;height:44px;padding:0 15px;border:1px solid #E7EAED;background-color:transparent;font-size:14px;line-height:42px;color:#000;text-align:center}.com-btn-group .c-btn+.c-btn{margin-left:-1px}.com-btn-group .c-btn:hover{position:relative;z-index:2;border-color:#00a4ff;color:#00a4ff}.com-btn-group .c-btn.actived,.com-btn-group .c-btn.actived:hover{position:relative;z-index:1;background-color:rgba(0,154,255,.1);border-color:#00a4ff;color:#00a4ff;cursor:default}.com-form-lattice{font-size:0}.com-form-lattice>.com-form-lattice-cell{display:inline-block;vertical-align:top;width:100%;font-size:14px}.com-form-lattice.com-form-lattice-cols-1>.com-form-lattice-cell{width:100%}.com-form-lattice.com-form-lattice-cols-2>.com-form-lattice-cell{margin-right:10px;width:calc((100% - 10px * (2 - 1))/ 2)}.com-form-lattice.com-form-lattice-cols-2>.com-form-lattice-cell:nth-child(2n){margin-right:0}.com-form-lattice.com-form-lattice-cols-2>.com-form-lattice-cell:nth-child(2n):after{display:none}.com-form-lattice.com-form-lattice-cols-3>.com-form-lattice-cell{margin-right:10px;width:calc((100% - 10px * (3 - 1))/ 3)}.com-form-lattice.com-form-lattice-cols-3>.com-form-lattice-cell:nth-child(3n){margin-right:0}.com-form-lattice.com-form-lattice-cols-3>.com-form-lattice-cell:nth-child(3n):after{display:none}.com-form-lattice.com-form-lattice-cols-4>.com-form-lattice-cell{margin-right:10px;width:calc((100% - 10px * (4 - 1))/ 4)}.com-form-lattice.com-form-lattice-cols-4>.com-form-lattice-cell:nth-child(4n){margin-right:0}.com-form-lattice.com-form-lattice-cols-4>.com-form-lattice-cell:nth-child(4n):after{display:none}.com-form-lattice.com-form-lattice-cols-5>.com-form-lattice-cell{margin-right:10px;width:calc((100% - 10px * (5 - 1))/ 5)}.com-form-lattice.com-form-lattice-cols-5>.com-form-lattice-cell:nth-child(5n){margin-right:0}.com-form-lattice.com-form-lattice-cols-5>.com-form-lattice-cell:nth-child(5n):after{display:none}.com-form-lattice.com-form-lattice-cols-6>.com-form-lattice-cell{margin-right:10px;width:calc((100% - 10px * (6 - 1))/ 6)}.com-form-lattice.com-form-lattice-cols-6>.com-form-lattice-cell:nth-child(6n){margin-right:0}.com-form-lattice.com-form-lattice-cols-6>.com-form-lattice-cell:nth-child(6n):after{display:none}.com-3-sub-section{margin-bottom:20px}.com-3-sub-section-hd{position:relative;margin-bottom:30px;line-height:24px}.com-3-sub-section-title{font-size:24px;line-height:24px;font-weight:400;color:#000}.com-3-sub-section-extra{position:absolute;right:0;top:0}.com-event-panel{margin-bottom:20px}.com-event-panel-inner{box-sizing:border-box;display:table;width:100%;table-layout:fixed}.com-event-panel-object{display:table-cell;width:220px;vertical-align:middle}.com-event-panel-img{display:block;width:220px;height:118px}.com-event-panel-body{position:relative;display:table-cell;vertical-align:middle;border-width:1px 0;border-style:solid;border-color:#ddd transparent;padding:0 140px 0 15px}.com-event-panel-body:after{position:absolute;content:"";right:0;top:-1px;bottom:-1px;width:5px;background:#00A1FF}.com-event-panel-act{position:absolute;right:30px;top:50%;z-index:2;transform:translateY(-50%)}.com-event-panel-act .c-btn{min-width:auto}.com-event-panel-desc,.com-event-panel-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-event-panel-title{font-size:18px;font-weight:700;color:#333}.com-event-panel-desc{font-size:14px;color:#666;margin:10px 0 0}.com-event-panel-s .com-event-panel-object{display:block;width:auto}.com-event-panel-s .com-event-panel-img{width:46px;height:160px}.com-event-panel-l .com-event-panel-img{width:330px;height:160px}.com-event-panel-xl .com-event-panel-object{display:block;width:auto}.com-event-panel-xl .com-event-panel-img{width:700px;height:118px}.com-course-card-list>.card-item{margin-bottom:20px}.com-media-motion{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 2px 6px 0 rgba(0,0,0,.1);-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:transform .3s;-moz-transition:transform .3s;-ms-transition:transform .3s;-o-transition:transform .3s;transition:transform .3s}.com-media-motion:hover{-webkit-transform:translate3d(0,-3px,0);transform:translate3d(0,-3px,0)}.com-course-card .com-course-card-title{font-size:14px;color:#333;line-height:24px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.com-course-card .com-course-card-desc{font-size:14px;color:#666;line-height:24px;height:48px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;word-break:break-all;word-wrap:break-word;overflow:hidden;margin-top:10px}.com-course-card .com-course-card-money{font-size:16px;line-height:25px;color:#ff7200}.com-course-card .com-course-card-unit{color:#ff7200;font-size:14px;margin-left:5px}.com-course-card{position:relative;background-color:#fff;display:block}.com-course-card .com-course-card-free{font-size:16px;color:#0abf5b;line-height:25px}.com-course-card .col-star-rating .star-text-lt,.com-course-card .col-star-rating .star-text-rt{font-size:14px}.com-course-card .com-course-card-bd{padding:10px}.com-course-card .com-course-card-title{height:42px;line-height:21px;font-size:14px;color:#333;white-space:normal;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.com-course-card .com-course-card-detail{margin-top:6px}.com-course-card .com-course-card-detail-inner{display:table;width:100%;height:22px;box-sizing:border-box}.com-course-card .col-star-rating,.com-course-card .com-course-card-price{display:table-cell;vertical-align:middle}.com-course-card .com-course-card-price{right:10px;bottom:20px;position:static;line-height:22px}.com-course-card .com-course-card-price .com-course-card-free{line-height:22px;font-size:16px;color:#0abf5b}.com-course-card .com-course-card-price .com-course-card-load{line-height:22px;font-size:14px;color:#999}.com-course-card .com-course-card-price .com-course-card-money,.com-course-card .com-course-card-price .com-course-card-unit{line-height:1;font-size:16px;color:#ff7200}.com-course-card .com-course-card-price .com-course-card-unit{position:relative;top:-1px;font-size:14px}.com-course-card .com-course-card-price .com-course-card-origin{position:relative;top:-1px;margin-left:10px;font-size:14px;color:#999}.com-course-card .com-price{display:table-cell;vertical-align:middle;font-size:16px}.com-course-card .com-price-unit{margin-left:5px;font-size:14px}.com-course-card .com-price-origin{margin-left:10px;font-size:14px}.com-course-card .col-star-rating{margin-top:0;text-align:right}.com-course-card .col-star-rating .star-list{margin-left:0}.com-course-card .star-text-rt{margin-left:5px}.com-course-img{padding-top:50%;background-size:cover;background-position:center;position:relative;color:#fff;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;text-align:center;background-color:#00a4ff}.com-course-img .com-course-img-title{font-size:24px;color:#fff;line-height:48px;padding:0 50px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;word-break:break-all;word-wrap:break-word;overflow:hidden;text-align:left}.com-course-img.course-img-s .com-course-img-title{padding:0 20px}.com-course-img .com-course-img-desc{padding:0 15px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:16px;color:#fff;line-height:22px}.com-course-img::after{content:'';position:absolute;left:0;top:0;width:100%;height:100%;opacity:.9}.com-course-img.color1::after{background:linear-gradient(to right ,#0092ff ,#65c3ff)}.com-course-img.color2::after{background:linear-gradient(to right ,#00B7D6 ,#6ce7f3)}.com-course-img.color3::after{background:linear-gradient(to right ,#2059bf ,#4ba5ff)}.com-course-img .com-course-img-divider{width:220px;height:1px;background:#fff;margin:2px auto 5px}.com-course-img .com-course-img-con{left:0;top:50%;-webkit-transform:translate(0,-50%);-moz-transform:translate(0,-50%);-ms-transform:translate(0,-50%);-o-transform:translate(0,-50%);transform:translate(0,-50%);width:100%;z-index:1}.com-course-img.course-img-s .com-course-img-con{-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none;top:45px;left:0}.com-course-img.course-img-s{padding-top:50%}.com-course-img.course-img-s .com-course-img-title{line-height:30px;font-size:18px;text-align:left}.com-course-img.course-img-s .com-course-img-desc{font-size:12px;line-height:17px}.com-course-img.course-img-s .com-course-img-divider{width:141px;opacity:.6}.com-course-img .com-bar-tag{background-color:#fff;height:20px;border:none;line-height:20px;font-size:12px;margin-left:0}.com-course-img .com-course-img-tag-lt{position:absolute;top:0;z-index:2}.com-course-img .com-bar-tag.hot{color:#fff;background:#fd7822}.com-course-img .com-bar-tag.cur{background-color:#00a4ff;color:#fff;vertical-align:text-bottom}.com-course-img .com-bar-tag.done,.com-course-img .com-bar-tag.free,.com-course-img .com-bar-tag.live{color:#fff;background-color:rgba(0,0,0,.25)}.com-course-img .com-bar-tag.living,.com-course-img .com-bar-tag.new,.com-course-img .com-bar-tag.recommend,.com-course-img .com-bar-tag.update,.com-course-img .com-bar-tag.updating{color:#fff;background-color:#e1504a}.com-course-img .com-bar-tag.living .icon-live{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:91% 9.790000000000001%;background-size:1418.75% 2039.9999999999998%;;background-repeat:no-repeat}.com-course-img .com-course-img-con,.com-course-img.course-img-s .com-course-img-con{position:absolute;top:50%;margin-top:-30px;width:100%;height:60px;max-height:60px;overflow:hidden;box-sizing:border-box;transform:none;-ms-transform:none;-moz-transform:none;-webkit-transform:none;-o-transform:none}.com-course-img .com-course-img-con .com-course-img-title{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis}.com-course-img .com-bar-tag{padding:0 5px;height:18px;line-height:18px;font-size:0}.com-course-img .com-bar-tag+.com-bar-tag{margin-left:5px}.com-course-img .com-course-img-tag{position:absolute;font-size:0;z-index:2}.com-course-img .com-course-img-tag-lt{left:0;top:0}.com-course-img .com-course-img-tag-lb{left:0;bottom:0}.com-course-img .com-course-img-tag-rt{position:absolute;bottom:0;z-index:2;font-size:0;right:0;top:0}.com-course-img .com-course-img-tag-rb{right:0;bottom:0}.com-course-img .com-course-img-tag .com-bar-tag{vertical-align:top}.com-star-rating .star-text-lt,.com-star-rating .star-text-rt{font-size:14px;color:#666;line-height:22px;vertical-align:middle}.com-star-rating .star-text-rt{vertical-align:middle}.com-star-rating .star-list{font-size:0;display:inline-block;vertical-align:middle;margin-left:4px;line-height:1}.com-star-rating .star{width:12px;height:12px;background-image:url(sprite/AskDialog-201906131103.svg);;display:inline-block;margin:0 2px;background-position:44.65% 41.15%;background-size:1891.6666666666667% 1700%;;background-repeat:no-repeat}.com-star-rating .star.full{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:32.09% 28.65%;background-size:1891.6666666666667% 1700%;;background-repeat:no-repeat}.com-star-rating .star.part{background-image:url(sprite/AskDialog-201906131103.svg);;background-position:60.92999999999999% 63.019999999999996%;background-size:1891.6666666666667% 1700%;;background-repeat:no-repeat}.com-star-rating .error-tip{color:red}.com-price{line-height:1;font-size:30px;color:#ff7200}.com-price.free{color:#0abf5b}.com-price.loading,.com-price.paid{color:#999}.com-price .com-price-unit{position:relative;top:-1px;margin-left:14px;font-size:18px}.com-price .com-price-origin{position:relative;top:-1px;margin-left:22px;font-size:18px;color:#999}.com-bar-tag{font-size:0}.com-bar-tag.color-og{color:#fd7822;border-color:#fd7822}.com-bar-tag.color-rd{color:#e1504a;border-color:#e1504a}.com-bar-tag.fill{line-height:18px;color:#fff;background-color:rgba(0,0,0,.25);border:none}.com-bar-tag.fill.color-og{background-color:#fd7822}.com-bar-tag.fill.color-rd{background-color:#e1504a}.com-bar-tag i{display:inline-block;vertical-align:middle}.com-bar-tag span{font-size:12px;vertical-align:middle}.com-lattice{font-size:0}.com-lattice>.com-lattice-cell{display:inline-block;vertical-align:top;width:100%;font-size:14px;margin-bottom:40px}.com-lattice.com-lattice-cols-1>.com-lattice-cell{width:100%}.com-lattice.com-lattice-cols-2>.com-lattice-cell{margin-right:60px;width:calc((100% - 60px * (2 - 1))/ 2)}.com-lattice.com-lattice-cols-2>.com-lattice-cell:nth-child(2n){margin-right:0}.com-lattice.com-lattice-cols-2>.com-lattice-cell:nth-child(2n):after{display:none}.com-lattice.com-lattice-cols-3>.com-lattice-cell{margin-right:60px;width:calc((100% - 60px * (3 - 1))/ 3)}.com-lattice.com-lattice-cols-3>.com-lattice-cell:nth-child(3n){margin-right:0}.com-lattice.com-lattice-cols-3>.com-lattice-cell:nth-child(3n):after{display:none}.com-lattice.com-lattice-cols-4>.com-lattice-cell{margin-right:60px;width:calc((100% - 60px * (4 - 1))/ 4)}.com-lattice.com-lattice-cols-4>.com-lattice-cell:nth-child(4n){margin-right:0}.com-lattice.com-lattice-cols-4>.com-lattice-cell:nth-child(4n):after{display:none}.com-lattice.com-lattice-cols-5>.com-lattice-cell{margin-right:60px;width:calc((100% - 60px * (5 - 1))/ 5)}.com-lattice.com-lattice-cols-5>.com-lattice-cell:nth-child(5n){margin-right:0}.com-lattice.com-lattice-cols-5>.com-lattice-cell:nth-child(5n):after{display:none}.com-lattice.com-lattice-cols-6>.com-lattice-cell{margin-right:60px;width:calc((100% - 60px * (6 - 1))/ 6)}.com-lattice.com-lattice-cols-6>.com-lattice-cell:nth-child(6n){margin-right:0}.com-lattice.com-lattice-cols-6>.com-lattice-cell:nth-child(6n):after{display:none}.com-lattice-line{font-size:0}.com-lattice-line>.com-lattice-cell{display:inline-block;vertical-align:top;width:100%;font-size:14px;margin-bottom:20px;position:relative}.com-lattice-line.com-lattice-cols-1>.com-lattice-cell{width:100%}.com-lattice-line.com-lattice-cols-2>.com-lattice-cell{margin-right:80px;width:calc((100% - 80px * (2 - 1))/ 2)}.com-lattice-line.com-lattice-cols-2>.com-lattice-cell:nth-child(2n){margin-right:0}.com-lattice-line.com-lattice-cols-2>.com-lattice-cell:nth-child(2n):after{display:none}.com-lattice-line.com-lattice-cols-3>.com-lattice-cell{margin-right:80px;width:calc((100% - 80px * (3 - 1))/ 3)}.com-lattice-line.com-lattice-cols-3>.com-lattice-cell:nth-child(3n){margin-right:0}.com-lattice-line.com-lattice-cols-3>.com-lattice-cell:nth-child(3n):after{display:none}.com-lattice-line.com-lattice-cols-4>.com-lattice-cell{margin-right:80px;width:calc((100% - 80px * (4 - 1))/ 4)}.com-lattice-line.com-lattice-cols-4>.com-lattice-cell:nth-child(4n){margin-right:0}.com-lattice-line.com-lattice-cols-4>.com-lattice-cell:nth-child(4n):after{display:none}.com-lattice-line.com-lattice-cols-5>.com-lattice-cell{margin-right:80px;width:calc((100% - 80px * (5 - 1))/ 5)}.com-lattice-line.com-lattice-cols-5>.com-lattice-cell:nth-child(5n){margin-right:0}.com-lattice-line.com-lattice-cols-5>.com-lattice-cell:nth-child(5n):after{display:none}.com-lattice-line.com-lattice-cols-6>.com-lattice-cell{margin-right:80px;width:calc((100% - 80px * (6 - 1))/ 6)}.com-lattice-line.com-lattice-cols-6>.com-lattice-cell:nth-child(6n){margin-right:0}.com-lattice-line.com-lattice-cols-6>.com-lattice-cell:nth-child(6n):after{display:none}.com-lattice-line>.com-lattice-cell:after{content:'';position:absolute;right:-40px;top:20px;bottom:20px;width:1px;background-color:#e5e5e5}.com-lattice-line>.com-lattice-cell:last-child:after{display:none}.com-lattice-card{font-size:0}.com-lattice-card>.com-lattice-cell{display:inline-block;vertical-align:top;width:100%;font-size:14px;margin-bottom:20px}.com-lattice-card.com-lattice-cols-1>.com-lattice-cell{width:100%}.com-lattice-card.com-lattice-cols-2>.com-lattice-cell{margin-right:20px;width:calc((100% - 20px * (2 - 1))/ 2)}.com-lattice-card.com-lattice-cols-2>.com-lattice-cell:nth-child(2n){margin-right:0}.com-lattice-card.com-lattice-cols-2>.com-lattice-cell:nth-child(2n):after{display:none}.com-lattice-card.com-lattice-cols-3>.com-lattice-cell{margin-right:20px;width:calc((100% - 20px * (3 - 1))/ 3)}.com-lattice-card.com-lattice-cols-3>.com-lattice-cell:nth-child(3n){margin-right:0}.com-lattice-card.com-lattice-cols-3>.com-lattice-cell:nth-child(3n):after{display:none}.com-lattice-card.com-lattice-cols-4>.com-lattice-cell{margin-right:20px;width:calc((100% - 20px * (4 - 1))/ 4)}.com-lattice-card.com-lattice-cols-4>.com-lattice-cell:nth-child(4n){margin-right:0}.com-lattice-card.com-lattice-cols-4>.com-lattice-cell:nth-child(4n):after{display:none}.com-lattice-card.com-lattice-cols-5>.com-lattice-cell{margin-right:20px;width:calc((100% - 20px * (5 - 1))/ 5)}.com-lattice-card.com-lattice-cols-5>.com-lattice-cell:nth-child(5n){margin-right:0}.com-lattice-card.com-lattice-cols-5>.com-lattice-cell:nth-child(5n):after{display:none}.com-lattice-card.com-lattice-cols-6>.com-lattice-cell{margin-right:20px;width:calc((100% - 20px * (6 - 1))/ 6)}.com-lattice-card.com-lattice-cols-6>.com-lattice-cell:nth-child(6n){margin-right:0}.com-lattice-card.com-lattice-cols-6>.com-lattice-cell:nth-child(6n):after{display:none}@media all and (max-width:768px){.qa-ask-checkbox{background-image:none;-webkit-appearance:checkbox}.qa-ask-checkbox:checked,.qa-ask-checkbox:checked:focus,.qa-ask-checkbox:checked:hover,.qa-ask-checkbox:focus,.qa-ask-checkbox:hover,.qa-ask-checkbox[disabled],.qa-ask-checkbox[disabled]:checked{background-image:none}}@media screen and (max-width:1680px){.qc-header-search{left:330px;right:340px;margin-left:0;width:auto}}@media screen and (max-width:1340px){.qc-header-search .qa-search-bar{width:auto}}@media screen and (max-width:1200px){.com-salon-specialist-identity{display:none}}@media screen and (max-width:1440px){.com-2-article-panel{padding:30px 20px}.com-2-article-panel-author{margin-bottom:8px}.com-2-article-panel-title{display:block;display:-webkit-box;white-space:normal;height:54px}.com-2-article-panel .com-media-body{height:69px}.com-2-article-panel-cnt{position:relative}.com-2-article-panel-cnt .com-media-object{padding-left:20px;width:80px;height:63px}.com-2-article-panel-cnt .com-thumbnail{width:80px;height:60px}.com-2-article-panel-desc{line-height:21px;-webkit-line-clamp:3;max-height:63px}.com-2-article-panel-opts{position:absolute;left:0;bottom:-30px;width:100%}.com-2-article-panel.large{padding-left:250px}.com-2-article-panel.large.without-img{padding-left:20px}.com-2-article-panel.large .com-2-article-panel-title{white-space:normal}.com-2-article-panel.large .com-2-article-panel-cnt{position:static}.com-2-article-panel.large .com-2-article-panel-desc{line-height:24px}.com-2-article-panel.large .com-2-article-panel-cnt .com-media-object{left:20px;top:30px}.com-2-article-panel.large .com-thumbnail{width:200px;height:190px}.com-2-article-panel.large .com-2-article-panel-opts{position:static}.com-2-article-panels{margin-bottom:-20px}.com-2-article-panels>.panel-cell{margin-right:20px;margin-bottom:20px;width:calc((100% - 20px * 2)/ 3)}.com-2-article-panels>.panel-cell:first-child{width:calc(100% - 20px - (100% - 20px * 2)/ 3)}.com-2-article-panels>.panel-cell:nth-child(3n+2){margin-right:0;width:calc((100% - 20px * 2)/ 3 - 1px)}}@media screen and (max-width:1440px){.com-4-article-panels>.panel-cell,.com-4-article-panels>.panel-cell:first-child{width:calc((100% - 10px - 1px)/ 2)}.com-4-article-panels>.panel-cell:nth-child(2n){margin-right:0}.com-4-article-panels>.panel-cell:nth-child(n+5){display:none}.com-4-article-panel.large{padding-left:20px}.com-4-article-panel.large .com-4-article-panel-title{margin-bottom:10px}.com-4-article-panel.large .com-4-article-panel-cnt{display:table}.com-4-article-panel.large .com-4-article-panel-infos{margin-top:10px}.com-4-article-panel.large .com-4-article-panel-cnt .com-media-object{position:static;display:table-cell;width:83px;padding-top:5px}.com-4-article-panel.large .com-thumbnail{width:83px;height:63px}.com-4-article-panel-author .author-name,.com-4-article-panel.large .com-4-article-panel-author .author-name{max-width:8em}.panel-cell:nth-child(n+3) .com-4-article-panel-author .author-name{max-width:16em}}@media screen and (max-width:1440px){.com-salon-panel-hd{padding-left:20px;padding-right:20px}.com-salon-panel-bd{padding:20px}.com-salon-panel.large{padding:30px 20px 20px}.com-salon-panel.large .com-salon-panel-img{background-size:auto 70%}.com-salon-panel.large .com-salon-panel-title{max-width:250px}.com-salon-panel.large .com-salon-panel-infos{margin-top:9px}.com-salon-panel.large .com-salon-panel-btns{left:20px;bottom:20px}.com-salon-panel.large .panel-btn{position:relative;left:0;top:0;margin-right:0}.com-salon-panels{margin-bottom:-20px}.com-salon-panels>.panel-cell,.com-salon-panels>.panel-cell:nth-child(1),.com-salon-panels>.panel-cell:nth-child(2){margin-right:20px;margin-bottom:20px;width:calc((100% - 1px - 20px)/ 2)}.com-salon-panels>.panel-cell:nth-child(2n){margin-right:0}.com-salon-panels>.panel-cell:nth-child(n+5){display:none}}@media screen and (max-width:1440px){.com-user-panels>.panel-cell{width:202px}}@media screen and (max-width:1440px){.com-special-list-wrap{padding:0 20px}.com-special-thumbnail{right:20px;top:20px;width:366px;height:366px}.com-special-list{margin-right:386px}}@media screen and (max-width:1440px){.com-team-panel-bd{padding:0 20px}.com-team-panels>.panel-cell{display:inline-block;vertical-align:top;margin-right:20px;width:calc((100% - 1px - 20px)/ 2)}.com-team-panels>.panel-cell:nth-child(2){margin-right:0}.com-team-panels>.panel-cell:nth-child(n+3){display:none}}@media screen and (max-width:1440px){.com-2-ask-panel{padding-left:20px;padding-right:20px}.com-2-ask-panel-bd{min-height:143px}.com-2-ask-panel-author-name{margin-top:7px}.com-2-ask-panel-answer{padding-top:20px;padding-bottom:20px}.com-2-ask-panel-answer .com-media-body{height:100px}.com-2-ask-panel-answer-opts{margin-top:11px}.com-2-ask-panel-answer .com-media-object{padding-left:20px;width:150px}.com-2-ask-panel-answer .com-thumbnail{width:150px;height:100px}}@media screen and (max-width:1440px){.com-2-doc-panels-wrap>.wrap-cell:first-child{width:calc((100% - 20px * 2)/ 3 * 2 + 20px)}.com-2-doc-panels-wrap>.wrap-cell:last-child{width:calc((100% - 20px * 2)/ 3)}.com-2-doc-panels>.panel-cell{margin-right:0;width:100%}.com-2-doc-panels>.panel-cell:nth-child(n+4){display:none}.com-2-doc-panels.large>.panel-cell{margin-right:20px;width:calc((100% - 1px - 20px)/ 2)}}@media screen and (max-width:1440px){.com-2-doc-panels-wrap.v2>.wrap-cell:first-child{width:calc((100% - 10px * 2)/ 3 * 2 + 10px)}.com-2-doc-panels-wrap.v2>.wrap-cell:last-child{width:calc((100% - 10px * 2)/ 3)}.com-2-doc-panels-wrap.v2 .com-2-doc-panels>.panel-cell,.com-2-doc-panels-wrap.v2 .com-2-doc-panels>.panel-cell:nth-child(2n){margin-right:0;width:100%}.com-2-doc-panels-wrap.v2 .com-2-doc-panels>.panel-cell:nth-child(n+4){display:none}.com-2-doc-panels-wrap.v2 .com-2-doc-panels.large>.panel-cell{margin-right:10px;width:calc((100% - 1px - 10px)/ 2)}}@media screen and (max-width:1440px){.com-hero-events>.event-cell:nth-child(n+5){display:none}}@media (max-width:1200px){.com-full-layout-main{padding:20px}}@media screen and (max-width:1920px){.com-2-hero-item-img{right:-60px}.com-2-hero-item-cnt{padding-left:30px;padding-right:30px}.com-2-hero-item-btns{left:30px}}@media screen and (max-width:1440px){.com-2-hero-item-cnt{padding-left:20px;padding-right:20px;height:195px}.com-2-hero-item-btns{left:20px}.com-2-hero-item-title{font-size:22px;line-height:32px;max-height:64px}.com-2-hero-item-desc{font-size:12px;line-height:20px;white-space:normal;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;height:40px}.com-2-hero-item .com-2-hero-item-desc,.com-2-hero-item .com-2-hero-item-title{max-width:260px}}@media screen and (max-width:1440px){.com-3-user-panels>.panel-cell{width:calc((100% - 20px * 3 - 1px)/ 4)}.com-3-user-panels>.panel-cell:nth-child(n+5){display:none}}@media screen and (max-width:1440px){.com-2-team-panels>.panel-cell{width:calc((100% - 1px - 20px)/ 2)}.com-2-team-panels>.panel-cell:nth-child(2n){margin-right:0}.com-2-team-panels>.panel-cell:last-child{display:none}}@media (max-width:768px){.com-course-img.course-img-s{padding-top:23.188%}.com-course-img.course-img-s .com-course-img-con{top:50%;-webkit-transform:translate(0,-50%);-moz-transform:translate(0,-50%);-ms-transform:translate(0,-50%);-o-transform:translate(0,-50%);transform:translate(0,-50%)}}@media screen and (max-width:768px){.com-course-img .com-course-img-con{display:none}}@media screen and (max-width:600px){.com-star-rating .star-text-lt{vertical-align:2px}.com-star-rating .star-list,.com-star-rating .star-text-rt{vertical-align:1px}}@media (min-width:769px){.com-lattice-line.com-lattice-cols-1>.com-lattice-cell:after{display:none}} +#MAXIM{content:"weu20190613110403"} \ No newline at end of file diff --git a/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云_files/Column-20199161611.css b/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云_files/Column-20199161611.css new file mode 100644 index 0000000..dbc3759 --- /dev/null +++ b/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云_files/Column-20199161611.css @@ -0,0 +1,2 @@ +@charset "UTF-8";.col-hidden{display:none !important}.col-body{-webkit-box-sizing:border-box;box-sizing:border-box;margin:30px auto 60px;padding:0 10px;max-width:1200px}.col-body.full-screen{margin:0;padding:0;max-width:none}.col-body-main{-webkit-box-sizing:border-box;box-sizing:border-box;margin:30px auto;padding:0 10px;max-width:1200px}.pg-column .col-body-main,.pg-tag-articles .col-body-main,.pg-tag-articles .com-inner{max-width:830px}.col-body-hd{margin-top:30px;margin-bottom:35px;padding-bottom:30px;border-bottom:1px solid #e5e5e5}.col-body-hd .hd-title{font-size:30px;font-weight:400}.col-body-hd .hd-icon{display:inline-block;vertical-align:-5px;margin-right:10px;width:32px;height:32px}.col-body-hd .hd-icon.tag{background-image:url(sprite/Column-20199161611.svg);;background-position:0.48% 39.57%;background-size:756.25% 684.375%;;background-repeat:no-repeat}.com-sidebar-panel .col-tags{margin-top:0;margin-bottom:-10px}.col-tags{margin:30px -5px 0;font-size:0}.col-tag{display:inline-block;vertical-align:middle;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0 5px 10px;padding:0 10px;height:30px;max-width:90%;font-size:12px;line-height:28px;border:1px solid #e5e5e5;border-radius:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#000}.col-tag .tag-num{margin-left:10px;color:#999;font-weight:700}.col-tag.actived,.col-tag:hover{border-color:#00a4ff;color:#00a4ff}.col-tag.actived{cursor:default}.col-tag.actived .tag-num,.col-tag:hover .tag-num{color:#00a4ff}.col-tag-trigger{display:inline-block;vertical-align:middle;margin:0 5px 10px;width:24px;height:30px;line-height:30px;text-align:center;font-size:0}.col-tag-trigger:after{content:'';display:inline-block;vertical-align:middle;width:12px;height:7px;background-image:url(sprite/Column-20199161611.svg);;-webkit-transition:all .2s ease;transition:all .2s ease;background-position:97.83% 83.49%;background-size:2016.6666666666667% 3128.5714285714284%;;background-repeat:no-repeat}.col-tag-trigger.showed:after{-webkit-transform:rotate3d(0,0,1,-180deg);transform:rotate3d(0,0,1,-180deg)}.col-filter-bar{margin-bottom:25px;line-height:24px}.col-filter-bar:after,.col-filter-bar:before{content:'';display:table;clear:both}.col-filter-bar .filter-title{float:left;font-size:16px;font-weight:400;color:#999}.col-filter-bar .filter-title.primary{color:#000}.col-filter-bar .extra-part{float:right}.col-filter-tab{display:inline-block;vertical-align:middle;font-size:0}.col-filter-bar .filter-item{display:inline-block;vertical-align:middle;color:#333;font-size:14px}.col-filter-bar .filter-item:hover{color:#00a4ff}.col-filter-bar .filter-item.actived{color:#00a4ff;font-weight:700}.col-filter-bar .col-split{margin:0 15px}.col-datas{margin-top:24px;color:#999;font-size:0}.col-data{display:inline-block;vertical-align:middle;font-size:14px}.col-datas .col-split{width:auto;height:auto;background:0 0}.col-datas .col-split:before{content:'\B7';font-size:14px}.col-avatar{display:inline-block;vertical-align:middle;width:32px;height:32px;border-radius:50%;background-size:cover;background-position:center;background-repeat:no-repeat}.c-crumb{margin-bottom:20px;font-size:0}.c-crumb a{display:inline-block;vertical-align:middle;font-size:14px;color:#333}.c-crumb a:hover{color:#00a4ff}.c-crumb .crumb-split{position:relative;top:-1px;display:inline-block;vertical-align:middle;margin:0 10px;width:7px;height:11px;background-image:url(src/projects/Column/cssComponents/img/temp/group-trigger2bf83b8d97e800ee2d39d2f724abb7a6.svg)}.c-crumb .crumb-current{display:inline-block;vertical-align:middle;font-size:14px;color:#999}.c-textarea{-webkit-box-sizing:border-box;box-sizing:border-box;height:auto}.c-textarea.block{width:100%}.c-textarea:disabled{background:#f7f8fa}.c-input-text{-webkit-box-sizing:border-box;box-sizing:border-box;height:35px;width:280px;border-color:#e0e0e0}.c-input-text:focus,.c-input-text:hover{border-color:#00a4ff}.c-input-text:disabled{border-color:#e0e0e0;background:#f7f8fa}.c-input-text.block{width:100%}.c-input-text.small{height:30px;font-size:12px;line-height:18px}.c-dropdown.block{display:block;width:auto}.c-dropdown .c-dropdown-menu{max-height:none;z-index:900;overflow:visible}.c-dropdown-menu>ul{max-height:300px;overflow-y:auto;overflow-x:hidden}.c-dropdown-menu-ft{border-top:1px solid #e5e5e5}.c-dropdown-menu-ft a{display:block;padding:0 10px;line-height:35px;text-align:center}.c-dropdown-menu-ft .icon{display:inline-block;vertical-align:middle;position:relative;top:-1px;margin-right:5px}.c-dropdown-menu-ft .icon.edit{width:15px;height:15px;background-image:url(src/projects/Column/cssComponents/img/temp/sidebar-editd18d439a2ab2a83d3b74f09764552ecb.png)}.c-dropdown-menu-ft .edit-text{position:relative;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;padding:5px 10px;height:34px;width:100%;border:none;line-height:24px;-webkit-box-shadow:0 0 0 1px #e5e5e5;box-shadow:0 0 0 1px #e5e5e5}.c-dropdown-menu-ft .edit-text:focus{-webkit-box-shadow:0 0 0 1px #00a4ff;box-shadow:0 0 0 1px #00a4ff}.c-dropdown-menu-ft .edit-text.error{-webkit-box-shadow:0 0 0 1px #E54544;box-shadow:0 0 0 1px #E54544}.c-dropdown-menu-ft .edit-btns{border-top:1px solid #e5e5e5;font-size:0}.c-dropdown-menu-ft .edit-btn{-webkit-box-sizing:border-box;box-sizing:border-box;width:50%;background-color:transparent;border:none;border-right:1px solid #e5e5e5;font-size:12px;line-height:34px;text-align:center}.c-dropdown-menu-ft .edit-btn:hover{background-color:#f2f2f2}.c-dropdown-menu-ft .edit-btn:last-child{border-right:none}.c-dropdown-btn-style .c-dropdown-link,.c-dropdown-btn-style .c-dropdown-menu li a{color:#333}.c-dropdown-btn-style .c-dropdown-link.placeholder{color:#999}.c-dialog-form-control .col-lables{margin-bottom:-10px}.col-lables .c-form-ctrl-label{margin-right:10px;margin-bottom:10px}.c-f-list.vertical{padding:0}.c-f-list.vertical .f-list-item{margin:0 0 20px;padding:0}.c-f-list.vertical .c-f-list-tit{position:static;display:block;margin-bottom:10px;width:auto;color:#666;z-index:auto}.c-f-list.vertical .c-f-list-con{padding-left:0;z-index:auto}.public-DraftEditor-content{min-height:180px}.DraftEditor-editorContainer,.DraftEditor-root,.public-DraftEditor-content{height:inherit;text-align:initial}.public-DraftEditor-content[contenteditable=true]{-webkit-user-modify:read-write-plaintext-only}.DraftEditor-root{position:relative}.DraftEditor-editorContainer{background-color:rgba(255,255,255,0);border-left:.1px solid transparent;position:relative;z-index:1}.public-DraftEditor-block{position:relative}.DraftEditor-alignLeft .public-DraftStyleDefault-block{text-align:left}.DraftEditor-alignLeft .public-DraftEditorPlaceholder-root{left:0;text-align:left}.DraftEditor-alignCenter .public-DraftStyleDefault-block{text-align:center}.DraftEditor-alignCenter .public-DraftEditorPlaceholder-root{margin:0 auto;text-align:center;width:100%}.DraftEditor-alignRight .public-DraftStyleDefault-block{text-align:right}.DraftEditor-alignRight .public-DraftEditorPlaceholder-root{right:0;text-align:right}.public-DraftEditorPlaceholder-root{color:#9197a3;position:absolute;z-index:0}.public-DraftEditorPlaceholder-hasFocus{color:#bdc1c9}.DraftEditorPlaceholder-hidden{display:none}.public-DraftStyleDefault-block{position:relative;white-space:pre-wrap}.public-DraftStyleDefault-ltr{direction:ltr;text-align:left}.public-DraftStyleDefault-rtl{direction:rtl;text-align:right}.qa-r-editor-container{position:relative;padding-top:46px}.qa-r-editor-toolbar{position:absolute;left:0;top:0;z-index:100;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;height:46px;border-bottom:1px solid #e5e5e5;line-height:46px;font-size:0;background-color:#fff}.qa-r-editor-btns{overflow:hidden}.qa-r-editor-btn-wrap{display:inline-block;vertical-align:middle;margin-right:11px}.qa-r-editor-btn-wrap:last-child{margin-right:0}.qa-r-editor-btn{display:inline-block;vertical-align:middle;padding:0;border:none;background-color:transparent;cursor:pointer;text-align:center}[class*=' qa-ico-'],[class^=qa-ico-]{display:inline-block;vertical-align:middle;width:16px;height:16px;font-size:0;font-style:normal}.qa-r-editor-btn.disabled{opacity:.5;cursor:not-allowed}.qa-ico-bold,.qa-r-editor-btn.disabled .qa-ico-bold,.qa-r-editor-btn.disabled:hover .qa-ico-bold{background-image:url(sprite/Column-20199161611.svg);;background-position:75.66000000000001% 0.49%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-bold,.qa-r-editor-btn:hover .qa-ico-bold{background-image:url(sprite/Column-20199161611.svg);;background-position:65.03999999999999% 67%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-italic,.qa-r-editor-btn.disabled .qa-ico-italic,.qa-r-editor-btn.disabled:hover .qa-ico-italic{background-image:url(sprite/Column-20199161611.svg);;background-position:64.16% 84.73%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-italic,.qa-r-editor-btn:hover .qa-ico-italic{background-image:url(sprite/Column-20199161611.svg);;background-position:72.11999999999999% 84.73%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-underline,.qa-r-editor-btn.disabled .qa-ico-underline,.qa-r-editor-btn.disabled:hover .qa-ico-underline{background-image:url(sprite/Column-20199161611.svg);;background-position:48.230000000000004% 93.60000000000001%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-underline,.qa-r-editor-btn:hover .qa-ico-underline{background-image:url(sprite/Column-20199161611.svg);;background-position:72.11999999999999% 75.86%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-code,.qa-r-editor-btn.disabled .qa-ico-code,.qa-r-editor-btn.disabled:hover .qa-ico-code{background-image:url(sprite/Column-20199161611.svg);;background-position:75.66000000000001% 35.96%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-code,.qa-r-editor-btn:hover .qa-ico-code{background-image:url(sprite/Column-20199161611.svg);;background-position:75.66000000000001% 27.089999999999996%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-h,.qa-r-editor-btn.disabled .qa-ico-h,.qa-r-editor-btn.disabled:hover .qa-ico-h{background-image:url(sprite/Column-20199161611.svg);;background-position:83.63000000000001% 71.43%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-h,.qa-r-editor-btn:hover .qa-ico-h{background-image:url(sprite/Column-20199161611.svg);;background-position:83.63000000000001% 53.690000000000005%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-blockquote,.qa-r-editor-btn.disabled .qa-ico-blockquote,.qa-r-editor-btn.disabled:hover .qa-ico-blockquote{background-image:url(sprite/Column-20199161611.svg);;background-position:57.08% 67%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-blockquote,.qa-r-editor-btn:hover .qa-ico-blockquote{background-image:url(sprite/Column-20199161611.svg);;background-position:49.120000000000005% 67%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-code-block,.qa-r-editor-btn.disabled .qa-ico-code-block,.qa-r-editor-btn.disabled:hover .qa-ico-code-block{width:18px;background-image:url(sprite/Column-20199161611.svg);;background-position:57.589999999999996% 23.150000000000002%;background-size:1344.4444444444446% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-code-block,.qa-r-editor-btn:hover .qa-ico-code-block{background-image:url(sprite/Column-20199161611.svg);;background-position:0.44999999999999996% 67%;background-size:1344.4444444444446% 1368.75%;;background-repeat:no-repeat}.qa-ico-ol,.qa-r-editor-btn.disabled .qa-ico-ol,.qa-r-editor-btn.disabled:hover .qa-ico-ol{background-image:url(sprite/Column-20199161611.svg);;background-position:16.37% 93.60000000000001%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-ol,.qa-r-editor-btn:hover .qa-ico-ol{background-image:url(sprite/Column-20199161611.svg);;background-position:8.41% 93.60000000000001%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-ul,.qa-r-editor-btn.disabled .qa-ico-ul,.qa-r-editor-btn.disabled:hover .qa-ico-ul{background-image:url(sprite/Column-20199161611.svg);;background-position:40.27% 93.60000000000001%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-ul,.qa-r-editor-btn:hover .qa-ico-ul{background-image:url(sprite/Column-20199161611.svg);;background-position:99.56% 27.089999999999996%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-pic,.qa-r-editor-btn.disabled .qa-ico-pic,.qa-r-editor-btn.disabled:hover .qa-ico-pic{background-image:url(sprite/Column-20199161611.svg);;background-position:32.300000000000004% 93.60000000000001%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-pic,.qa-r-editor-btn:hover .qa-ico-pic{background-image:url(sprite/Column-20199161611.svg);;background-position:24.34% 93.60000000000001%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-link,.qa-r-editor-btn.disabled .qa-ico-link,.qa-r-editor-btn.disabled:hover .qa-ico-link{background-image:url(sprite/Column-20199161611.svg);;background-position:91.59% 44.83%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-link,.qa-r-editor-btn:hover .qa-ico-link{background-image:url(sprite/Column-20199161611.svg);;background-position:91.59% 35.96%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-delete-link,.qa-r-editor-btn.disabled .qa-ico-delete-link,.qa-r-editor-btn.disabled:hover .qa-ico-delete-link{background-image:url(sprite/Column-20199161611.svg);;background-position:32.300000000000004% 75.86%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-delete-link,.qa-r-editor-btn:hover .qa-ico-delete-link{background-image:url(sprite/Column-20199161611.svg);;background-position:40.27% 75.86%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-arrow,.qa-r-editor-btn.disabled .qa-ico-arrow,.qa-r-editor-btn.disabled:hover .qa-ico-arrow{background-image:url(sprite/Column-20199161611.svg);;background-position:57.96% 53.2%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-arrow,.qa-r-editor-btn:hover .qa-ico-arrow{background-image:url(sprite/Column-20199161611.svg);;background-position:9.29% 67%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-strike,.qa-r-editor-btn.disabled .qa-ico-strike,.qa-r-editor-btn.disabled:hover .qa-ico-strike{background-image:url(sprite/Column-20199161611.svg);;background-position:88.05% 93.60000000000001%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-strike,.qa-r-editor-btn:hover .qa-ico-strike{background-image:url(sprite/Column-20199161611.svg);;background-position:80.08999999999999% 93.60000000000001%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-h1,.qa-r-editor-btn.disabled .qa-ico-h1,.qa-r-editor-btn.disabled:hover .qa-ico-h1{background-image:url(sprite/Column-20199161611.svg);;background-position:83.63000000000001% 9.36%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-h1,.qa-r-editor-btn:hover .qa-ico-h1{background-image:url(sprite/Column-20199161611.svg);;background-position:83.63000000000001% 18.23%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-h2,.qa-r-editor-btn.disabled .qa-ico-h2,.qa-r-editor-btn.disabled:hover .qa-ico-h2{background-image:url(sprite/Column-20199161611.svg);;background-position:83.63000000000001% 27.089999999999996%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-h2,.qa-r-editor-btn:hover .qa-ico-h2{background-image:url(sprite/Column-20199161611.svg);;background-position:83.63000000000001% 35.96%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-h3,.qa-r-editor-btn.disabled .qa-ico-h3,.qa-r-editor-btn.disabled:hover .qa-ico-h3{background-image:url(sprite/Column-20199161611.svg);;background-position:83.63000000000001% 44.83%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-h3,.qa-r-editor-btn:hover .qa-ico-h3{background-image:url(sprite/Column-20199161611.svg);;background-position:57.96% 36.449999999999996%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-table,.qa-r-editor-btn.disabled .qa-ico-table,.qa-r-editor-btn.disabled:hover .qa-ico-table{background-image:url(sprite/Column-20199161611.svg);;background-position:99.56% 18.23%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-table,.qa-r-editor-btn:hover .qa-ico-table{background-image:url(sprite/Column-20199161611.svg);;background-position:99.56% 9.36%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-merge-cells,.qa-r-editor-btn.disabled .qa-ico-merge-cells,.qa-r-editor-btn.disabled:hover .qa-ico-merge-cells{background-image:url(sprite/Column-20199161611.svg);;background-position:91.59% 59.61%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-merge-cells,.qa-r-editor-btn:hover .qa-ico-merge-cells{background-image:url(sprite/Column-20199161611.svg);;background-position:91.59% 68.47%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-split-cells,.qa-r-editor-btn.disabled .qa-ico-split-cells,.qa-r-editor-btn.disabled:hover .qa-ico-split-cells{background-image:url(sprite/Column-20199161611.svg);;background-position:64.16% 93.60000000000001%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-split-cells,.qa-r-editor-btn:hover .qa-ico-split-cells{background-image:url(sprite/Column-20199161611.svg);;background-position:72.11999999999999% 93.60000000000001%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-del-table,.qa-r-editor-btn.disabled .qa-ico-del-table,.qa-r-editor-btn.disabled:hover .qa-ico-del-table{background-image:url(sprite/Column-20199161611.svg);;background-position:16.37% 75.86%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-del-table,.qa-r-editor-btn:hover .qa-ico-del-table{background-image:url(sprite/Column-20199161611.svg);;background-position:24.34% 75.86%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-del-col,.qa-r-editor-btn.disabled .qa-ico-del-col,.qa-r-editor-btn.disabled:hover .qa-ico-del-col{background-image:url(sprite/Column-20199161611.svg);;background-position:75.66000000000001% 53.690000000000005%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-del-col,.qa-r-editor-btn:hover .qa-ico-del-col{background-image:url(sprite/Column-20199161611.svg);;background-position:75.66000000000001% 62.56%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-del-row,.qa-r-editor-btn.disabled .qa-ico-del-row,.qa-r-editor-btn.disabled:hover .qa-ico-del-row{background-image:url(sprite/Column-20199161611.svg);;background-position:8.41% 75.86%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-del-row,.qa-r-editor-btn:hover .qa-ico-del-row{background-image:url(sprite/Column-20199161611.svg);;background-position:0.44% 75.86%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-align-left,.qa-r-editor-btn.disabled .qa-ico-align-left,.qa-r-editor-btn.disabled:hover .qa-ico-align-left{background-image:url(sprite/Column-20199161611.svg);;background-position:91.59% 18.23%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-align-left,.qa-r-editor-btn:hover .qa-ico-align-left{background-image:url(sprite/Column-20199161611.svg);;background-position:91.59% 9.36%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-align-center,.qa-r-editor-btn.disabled .qa-ico-align-center,.qa-r-editor-btn.disabled:hover .qa-ico-align-center{background-image:url(sprite/Column-20199161611.svg);;background-position:80.08999999999999% 84.73%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-align-center,.qa-r-editor-btn:hover .qa-ico-align-center{background-image:url(sprite/Column-20199161611.svg);;background-position:91.59% 0.49%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-align-right,.qa-r-editor-btn.disabled .qa-ico-align-right,.qa-r-editor-btn.disabled:hover .qa-ico-align-right{background-image:url(sprite/Column-20199161611.svg);;background-position:91.59% 27.089999999999996%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-align-right,.qa-r-editor-btn:hover .qa-ico-align-right{background-image:url(sprite/Column-20199161611.svg);;background-position:91.59% 77.34%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-insert-top,.qa-r-editor-btn.disabled .qa-ico-insert-top,.qa-r-editor-btn.disabled:hover .qa-ico-insert-top{background-image:url(sprite/Column-20199161611.svg);;background-position:48.230000000000004% 84.73%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-insert-top,.qa-r-editor-btn:hover .qa-ico-insert-top{background-image:url(sprite/Column-20199161611.svg);;background-position:56.19% 84.73%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-insert-bottom,.qa-r-editor-btn.disabled .qa-ico-insert-bottom,.qa-r-editor-btn.disabled:hover .qa-ico-insert-bottom{background-image:url(sprite/Column-20199161611.svg);;background-position:8.41% 84.73%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-insert-bottom,.qa-r-editor-btn:hover .qa-ico-insert-bottom{background-image:url(sprite/Column-20199161611.svg);;background-position:0.44% 84.73%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-insert-left,.qa-r-editor-btn.disabled .qa-ico-insert-left,.qa-r-editor-btn.disabled:hover .qa-ico-insert-left{background-image:url(sprite/Column-20199161611.svg);;background-position:16.37% 84.73%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-insert-left,.qa-r-editor-btn:hover .qa-ico-insert-left{background-image:url(sprite/Column-20199161611.svg);;background-position:24.34% 84.73%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-ico-insert-right,.qa-r-editor-btn.disabled .qa-ico-insert-right,.qa-r-editor-btn.disabled:hover .qa-ico-insert-right{background-image:url(sprite/Column-20199161611.svg);;background-position:40.27% 84.73%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-btn.actived .qa-ico-insert-right,.qa-r-editor-btn:hover .qa-ico-insert-right{background-image:url(sprite/Column-20199161611.svg);;background-position:32.300000000000004% 84.73%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.qa-r-editor-spliter{display:inline-block;vertical-align:middle;margin-right:11px;width:1px;height:16px;background-color:#ccc}.qa-r-editor{position:relative;padding:30px 0;min-height:180px}.qa-r-editor-btn-trigger{display:none}.qa-r-editor-toolbar-tip{position:absolute;right:0;top:0;font-size:14px;line-height:54px;color:#999}.qa-r-editor-container.disabled .qa-r-editor-toolbar:after{content:'';position:absolute;left:0;top:0;width:100%;height:100%}.qa-r-editor-container.disabled .qa-r-editor-btn{opacity:.5}.qa-r-editor-tip{position:relative;height:180px;text-align:center;color:#888}.qa-r-editor-tip:before{content:'';display:inline-block;vertical-align:middle;width:0;height:100%}.qa-r-editor-tip .tip-cnt{display:inline-block;vertical-align:middle;max-width:98%}.qa-r-editor-bubble{position:absolute;left:0;right:18px;top:100%;margin-top:-8px;color:#333;z-index:900}.qa-r-editor-bubble-inner{font-size:12px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #e5e5e5;border-radius:2px;background-color:#fff;line-height:18px;position:static !important;left:285px;top:50%;padding:10px 100px 10px 10px;-webkit-box-shadow:0 1px 8px rgba(0,0,0,.1);box-shadow:0 1px 8px rgba(0,0,0,.1)}.qa-r-editor-bubble-inner:after,.qa-r-editor-bubble-inner:before{font-size:0;position:absolute;width:0;height:0;content:'';border:8px dashed transparent;bottom:100%;left:inherit;right:inherit;margin-left:-7px;border-bottom-style:solid}.qa-r-editor-bubble-inner:before{border-bottom-color:#e5e5e5}.qa-r-editor-bubble-inner:after{margin-bottom:-1px;border-bottom-color:#fff}.qa-r-editor-bubble-input{font-size:14px;width:100%;height:30px;line-height:18px;display:inline-block;padding:5px 10px;border:1px solid #d1d2d3;border-radius:2px;color:#171d25;vertical-align:middle;-webkit-box-sizing:border-box;box-sizing:border-box;font-family:inherit}.qa-r-editor-bubble-input::-webkit-input-placeholder{color:#888}.qa-r-editor-bubble-input:-ms-input-placeholder{color:#888}.qa-r-editor-bubble-input::placeholder{color:#888}.qa-r-editor-bubble-input.error{border:1px solid #e54545;color:#e54545}.qa-r-editor-bubble-btns{position:absolute;right:0;top:10px;width:100px;text-align:center;font-size:0}.qa-r-editor-bubble-btn{display:inline-block;vertical-align:middle;padding:0 8px;border:none;background-color:transparent;font-size:14px;line-height:30px;cursor:pointer;color:#00a4ff}.qa-r-editor-bubble-btn:hover{text-decoration:none;color:#00a4ff}.qa-r-editor-bubble-btn-weak{color:#888}.qa-r-editor-bubble-btn-weak:hover{color:#00a4ff}.qa-r-editor-bubble-tip.error{margin:5px 0 0;color:#e54545;font-size:14px}.col-disorder-list{line-height:2;color:#666}.col-disorder-list li{position:relative;padding-left:10px}.col-disorder-list li:before{content:'';position:absolute;left:2px;top:13px;width:2px;height:2px;border-radius:50%;background-color:#666}.col-disorder-list a{color:inherit}.col-disorder-list a:hover{color:#00a4ff}.col-2-disorder-list{font-size:12px;line-height:20px;color:#666}.col-2-disorder-list li{position:relative;padding-left:15px}.col-2-disorder-list li+li{margin-top:10px}.col-2-disorder-list li:before{content:'';position:absolute;left:0;top:8px;width:4px;height:4px;border-radius:50%;background-color:#666}.col-2-disorder-list a{color:inherit}.col-2-disorder-list a:hover{color:#00a4ff}.col-column-media{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;margin-bottom:0;border:1px solid #e5e5e5}.col-column-media-hd{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;padding:20px 30px 20px 93px;height:88px;background-color:rgba(216,216,216,.1)}.col-column-media-hd .com-avatar{position:absolute;left:30px;top:20px;width:48px;height:48px;border:1px solid #e5e5e5}.col-column-media-hd .com-media-title{margin-bottom:4px;font-size:18px;line-height:25px;color:#000;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.col-column-media-datas{font-size:0;color:#999}.col-column-media-data{display:inline-block;vertical-align:middle;font-size:14px}.col-column-media-datas .com-split{background-color:#999}.col-column-media-bd{-webkit-box-sizing:border-box;box-sizing:border-box;padding:20px 30px 30px;height:215px}.col-column-media .list-title{line-height:2;color:#666;font-weight:400}.col-column-media-btn{position:absolute;left:50%;bottom:30px;margin-left:-60px;min-width:0;width:100px;height:28px;font-size:12px;line-height:26px;border:1px solid #DCDEE6;background-color:transparent;color:#666}.col-column-media-btn:hover{background:0 0;border:1px solid #999;color:#000}.col-column-media-btn .c-loading-inner>div{background-color:#ddd}.col-column-media-btn.loading:hover{background-color:transparent;border-color:#bbb}.col-column-media .col-disorder-list li{margin-bottom:0}.com-side-column-panels.recommend .com-side-column-panel-btns{opacity:0;-webkit-transition:opacity .3s;transition:opacity .3s}.com-side-column-panels.recommend .com-side-column-panel:hover .com-side-column-panel-btns{opacity:1}.col-column-media.shortcut{position:relative;margin:50px 0;min-height:0;background-color:#F3F5F9;border-color:rgba(157,157,157,.18)}.col-column-media.shortcut .col-column-media-hd{padding:20px 140px 20px 94px;height:auto;min-height:70px;background-color:transparent}.col-column-media.shortcut .com-avatar{left:20px;top:20px}.col-column-media.shortcut .col-column-media-datas{color:#666}.col-column-media.shortcut .col-column-media-datas .com-split{width:3px;height:3px;margin:0 10px}.col-column-media.shortcut .col-column-media-bd{height:auto;padding:0 20px 20px}.col-column-media.shortcut .col-column-media-desc{margin:20px 30px;color:#666}.col-column-media.shortcut .col-column-media-btn{position:absolute;left:auto;right:20px;top:25px;margin-top:0;margin-left:0;padding-left:10px;padding-right:10px;width:100px;font-size:12px}.col-column-media.recommend{border:none;border-bottom:1px solid rgba(229,229,229,.5)}.col-column-media.recommend .col-column-media-hd{-webkit-box-sizing:content-box;box-sizing:content-box;padding:0 0 20px 63px;height:auto;min-height:48px;background-color:transparent}.col-column-media.recommend .com-avatar{left:0;top:0}.col-column-media.recommend .com-media-title{box-sizing:border-box;position:relative;margin-bottom:7px;padding-right:56px;overflow:visible}.col-column-media.recommend .com-media-title a{display:block;overflow:hidden;text-overflow:ellipsis}.col-column-media.recommend .com-media-title .c-btn{position:absolute;right:0;top:1px;opacity:0;transition:opacity .3s}.col-column-media.recommend.hover .com-media-title .c-btn,.col-column-media.recommend:hover .com-media-title .c-btn{opacity:1}.col-more{margin-top:25px;text-align:center}.col-cat{margin-bottom:30px}.col-cat .com-media-object{padding-right:15px;width:48px}.col-cat .com-media-img{-webkit-box-sizing:border-box;box-sizing:border-box;width:48px;height:48px;border:1px solid #e5e5e5;background-size:32px 32px;background-repeat:no-repeat}.col-cat .com-media-title{margin-bottom:4px;font-size:16px;line-height:22px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.col-cat .com-media-desc{color:#999;font-size:0}.col-cat-data{display:inline-block;vertical-align:middle;font-size:14px}.col-cat:hover .com-media-title{color:#00a4ff}.pg-editor{position:relative}.col-editor-header{position:fixed;left:0;top:0;z-index:1000;width:100%;background-color:#fff;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #e5e5e5}.col-editor-header .header-inner{padding:16px 25px 18px;position:relative;font-size:0;line-height:28px}.col-editor-header .logo{position:relative;top:-1px;display:inline-block;vertical-align:middle}.col-editor-header .logo a{display:block}.col-editor-header .logo-img{display:block;width:100px;height:25px;background-image:url(sprite/Column-20199161611.svg);;background-position:0.7000000000000001% 0.52%;background-size:242% 876%;;background-repeat:no-repeat}.col-editor-header .header-split{display:inline-block;vertical-align:middle;margin:0 10px;width:1px;height:18px;background-color:#ccc}.col-editor-header .header-back{display:inline-block;vertical-align:middle;font-size:14px;color:#999}.col-editor-header .header-sub-title{display:inline-block;vertical-align:middle;font-size:18px;color:#ccc;-webkit-font-smoothing:auto}.col-editor-header .header-sub-title:hover{color:#00a4ff}.col-editor-header .header-back:before{content:'';position:relative;left:0;top:-1px;display:inline-block;vertical-align:middle;-webkit-box-sizing:border-box;box-sizing:border-box;width:10px;height:10px;border-left:2px solid #999;border-bottom:2px solid #999;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);-webkit-transition:left .4s;transition:left .4s}.col-editor-header .header-back:hover{color:#00a4ff}.col-editor-header .header-back:hover:before{border-left-color:#00a4ff;border-bottom-color:#00a4ff;left:-8px}.col-editor-header .header-title{-webkit-box-sizing:border-box;box-sizing:border-box;position:absolute;left:25%;top:16px;z-index:-1;width:50%;text-align:center;font-size:18px;color:#000;font-weight:400}.col-editor-header .header-title .icon{display:inline-block;vertical-align:middle;margin-right:10px}.col-editor-header .header-title .icon.edit{width:25px;height:24px;background-image:url(src/projects/Column/cssComponents/img/temp/header-edit087d027e2d31136e978edcb557fd37e1.png)}.col-editor-header .header-opts{position:absolute;right:0;top:0;padding:16px 25px}.col-editor-header .btn-icon-arrow{display:inline-block;vertical-align:middle;margin-left:5px;width:8px;height:5px;background-image:url(sprite/Column-20199161611.svg);;background-position:73.08% 67.75999999999999%;background-size:3025% 4380%;;background-repeat:no-repeat}.col-editor-header .c-btn{vertical-align:middle;margin-left:10px;min-width:80px;height:28px;line-height:26px;font-size:12px}.col-editor-header .c-btn-hole{border-color:#DCDEE6;color:#666}.col-editor-header .c-btn-hole:hover{border-color:#999;color:#000;background-color:transparent}.col-editor-header .c-btn-disabled,.col-editor-header .c-btn-disabled:hover{border-color:#d5d7de;background-color:#d5d7de;color:#fff}.col-editor-header .header-link{display:inline-block;vertical-align:middle;padding:0 10px;margin-left:10px;font-size:14px;color:#000}.col-editor-header .header-link .btn-icon-arrow{background-image:url(sprite/Column-20199161611.svg);;background-position:80.77% 76.17%;background-size:3025% 4380%;;background-repeat:no-repeat}.col-editor-header .header-link:hover{color:#00a4ff}.col-editor-header .header-link:hover .btn-icon-arrow{background-image:url(sprite/Column-20199161611.svg);;background-position:96.15% 93.46%;background-size:3025% 4380%;;background-repeat:no-repeat}.col-editor-header .header-link .com-avatar{width:24px;height:24px}.col-editor-header .header-link .icon{display:inline-block;vertical-align:middle}.col-editor-header .header-link .icon.person{width:29px;height:29px;background-image:url(src/projects/Column/cssComponents/img/temp/header-person787a3fd096119cc6b7b2869253799762.png)}.col-editor-header .user-center{padding:0}.col-editor-sidebar{-webkit-box-sizing:border-box;box-sizing:border-box;position:fixed;right:0;top:0;z-index:1000;width:240px;height:100%;background-color:#f7f8fa;-webkit-box-shadow:0 0 6px 0 rgba(0,0,0,.2);box-shadow:0 0 6px 0 rgba(0,0,0,.2)}.col-editor-sidebar.publish{width:430px}.col-editor-sidebar .sidebar-hd{-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;padding:0 25px;height:60px;line-height:60px}.col-editor-sidebar .sidebar-title{font-size:18px;font-weight:400;color:#000}.col-editor-sidebar .sidebar-trigger{position:absolute;right:10px;top:50%;margin-top:-15px;width:30px;height:30px;text-align:center;line-height:30px;font-size:0}.col-editor-sidebar .sidebar-trigger:before{content:'';display:inline-block;vertical-align:middle;width:16px;height:16px;background-image:url(sprite/Column-20199161611.svg);;background-position:83.63000000000001% 0.49%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.col-editor-sidebar .sidebar-trigger:hover:before{background-image:url(sprite/Column-20199161611.svg);;background-position:83.63000000000001% 62.56%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.col-editor-sidebar .sidebar-bd{position:absolute;left:0;right:0;top:56px;bottom:0;overflow-x:hidden;overflow-y:auto;padding:1px 25px 20px}.col-draft-list .draft-item{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;padding-bottom:12px;margin-bottom:12px;border-bottom:1px solid #e5e5e5;color:#333;-webkit-transition:all .2s ease;transition:all .2s ease}.col-draft-list .draft-item a{display:block;color:inherit}.col-draft-list .draft-title{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.col-draft-list .draft-time{display:block;margin-top:4px;color:#999;font-size:12px}.col-draft-list .draft-btns{position:absolute;right:-10px;bottom:12px;opacity:0;-webkit-transition:opacity .2s ease;transition:opacity .2s ease}.col-draft-list .draft-btn{display:inline-block;vertical-align:middle;padding:0 10px;border:none;background-color:transparent;cursor:pointer;font-size:0}.col-draft-list .draft-btn .icon{display:block}.col-draft-list .draft-btn .icon.delete{width:16px;height:16px;background-image:url(sprite/Column-20199161611.svg);;background-position:56.19% 75.86%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.col-draft-list .draft-btn:hover .icon.delete{background-image:url(sprite/Column-20199161611.svg);;background-position:48.230000000000004% 75.86%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.col-draft-list .draft-item.actived:before{content:'';position:absolute;left:-8px;top:3px;width:2px;height:14px;background-color:#00a4ff}.col-draft-list .draft-item.actived .draft-title,.col-draft-list .draft-item.hover .draft-title,.col-draft-list .draft-item:hover .draft-title{color:#00a4ff}.col-draft-list .draft-item.hover .draft-btns,.col-draft-list .draft-item:hover .draft-btns{opacity:1}.col-editor-switch{position:absolute;right:0;top:0;z-index:901;padding-right:20px;color:#999}.col-editor-switch a{color:inherit}.col-editor-switch a:hover{color:#00a4ff}.col-editor-body{margin:90px auto 20px;padding:0 20px;max-width:830px}.col-editor-body .article-title{-webkit-box-sizing:border-box;box-sizing:border-box;padding:5px 0;border:none;background:0 0;margin-bottom:20px;width:100%;height:50px;font-size:30px;font-weight:700;line-height:40px;color:#000}.col-editor-msg{position:relative;z-index:900}.col-editor-msg .msg-inner{position:absolute;right:0;top:30px;font-size:14px;line-height:48px;color:#999;white-space:nowrap}.col-editor-body.fixed-toolbar .col-editor-msg,.col-editor-body.fixed-toolbar .qa-r-editor-toolbar{position:fixed;left:auto;top:65px;width:830px}.col-editor-body.fixed-toolbar .col-editor-msg .msg-inner{top:0}.col-editor-body .qa-r-editor{padding-left:1px;padding-right:1px}.col-editor-body.markdown .qa-r-editor-container{padding-top:0}.col-editor-body.markdown .qa-r-editor-toolbar{display:none}.col-editor-body.markdown .col-editor-msg{z-index:1001}.col-editor-body.markdown .col-editor-msg .msg-inner{top:30px;line-height:48px}.col-editor-body.markdown.fixed-toolbar .col-editor-msg .msg-inner{top:0;width:100%;line-height:30px;background-color:#fff;text-align:center}.pg-editor.v2{position:absolute;left:0;top:65px;bottom:0;width:100%;overflow:auto}.pg-editor.v2 .col-editor-body{margin-top:25px}.col-editor-toolbar{overflow:hidden;margin-bottom:20px;color:#999}.col-editor-toolbar .editor-switch{float:left;color:inherit}.col-editor-toolbar .editor-switch:after{content:'';display:inline-block;vertical-align:middle;position:relative;top:-1px;margin-left:5px;width:13px;height:10px;background-image:url(sprite/Column-20199161611.svg);;background-position:98.25% 45.45%;background-size:1861.5384615384617% 2190%;;background-repeat:no-repeat}.col-editor-toolbar .editor-switch:hover{color:#00a4ff}.col-editor-toolbar .editor-switch:hover:after{background-image:url(sprite/Column-20199161611.svg);;background-position:98.25% 39.71%;background-size:1861.5384615384617% 2190%;;background-repeat:no-repeat}.col-editor-toolbar .editor-msg{float:right}.pg-editor.preview{width:50%}.pg-editor.preview .col-editor-body{box-sizing:border-box;padding-left:30px;padding-right:30px;width:100%;max-width:none}.pg-editor.preview .col-editor-body.fixed-toolbar .qa-r-editor-toolbar{right:50%;width:50%;padding:0 30px;box-sizing:border-box}.pg-editor.preview .col-article{box-sizing:border-box;position:fixed;left:50%;top:65px;bottom:0;width:50%;padding:66px 30px 30px;background-color:#F7F8FA;overflow:auto}.pg-editor.preview .col-article-title{padding:5px 0;line-height:40px}.pg-editor.preview .col-article-preview{position:absolute;left:0;top:50%;width:100%;transform:translateY(-50%);font-size:24px;color:#999;text-align:center}.qa-r-editor-container{border-top:2px solid #e5e5e5}.qa-r-editor-btns{white-space:nowrap;overflow:hidden}.pg-editor-translate .col-article{box-sizing:border-box;position:fixed;left:0;top:65px;bottom:0;width:50%;min-width:500px;padding:45px 30px 30px;background-color:#F7F8FA;overflow:auto}.pg-editor-translate .col-article-source{margin-top:-20px;margin-bottom:20px}.pg-editor-translate .col-editor-body{box-sizing:border-box;padding-left:30px;margin-left:50%;padding-right:30px;width:50%}.pg-editor-translate .col-editor-body.fixed-toolbar .col-editor-msg,.pg-editor-translate .col-editor-body.fixed-toolbar .qa-r-editor-toolbar{left:50%;width:50%;min-width:500px;padding:0 30px;box-sizing:border-box}.pg-editor-translate .col-editor-body.fixed-toolbar .col-editor-msg .msg-inner{right:30px}.pg-editor-translate .col-editor-switch{top:-20px}.pg-article{position:relative;margin-top:60px;width:720px}.col-article-author{position:relative;margin-bottom:30px;color:#999;line-height:32px}.col-article-author .author-avatar{display:inline-block;vertical-align:middle;margin-left:0;margin-right:10px;width:32px;height:32px;border-radius:50%;overflow:hidden;border:2px solid #e5e5e5}.col-article-author .author-avatar img{display:block;width:100%;height:100%;border-radius:50%}.col-article-author .author-name,.col-article-author .column-name{display:inline-block;vertical-align:middle;max-width:8em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.col-article-author>a,.col-article-author>span{margin:0 5px}.col-article-author .com-emblem-list,.col-article-author .com-verification{margin-left:0;margin-right:5px}.col-article-author a{color:#666}.col-article-author a:hover{color:#00a4ff}.col-article-author span{vertical-align:middle}.col-article-author .column-wrap{position:relative;top:-1px}.col-article-author .column-wrap .c-btn{opacity:0;margin-left:10px;transition:opacity .3s}.col-article-author .column-wrap.hover .c-btn,.col-article-author .column-wrap:hover .c-btn{opacity:1}.col-article-author .extra-part{position:absolute;right:0;top:0;line-height:32px}.col-article-author .com-operations{margin-top:0}.col-article-adpanel{margin-top:-10px;margin-bottom:20px;text-align:center}.col-article-adpanel img{max-width:100%}.col-article-title+.col-article-author{margin-top:-15px}.col-article-title{margin-bottom:30px;font-size:30px;color:#000}.col-article-title .com-article-tag-bubble{margin-right:10px;font-weight:400;top:-2px}.col-article-title .com-article-tag{font-size:14px;line-height:22px}.col-article-infos{margin-bottom:20px;font-size:0;color:#999;word-wrap:break-word;line-height:1.8}.col-article-infos+.col-article-infos{margin-top:-20px}.col-article-infos>li{display:inline-block;vertical-align:middle;max-width:100%;margin-right:20px;font-size:14px}.col-article-infos>li:last-child{margin-right:0}.col-article-blockquote{margin:0 0 20px;padding:0 15px;color:#999;border-left:4px solid #ddd}.col-article-source{margin-top:20px;color:#999;word-wrap:break-word}.col-article-source .weixin-mp{color:#000}.col-article-time{margin-top:10px;color:#999}.col-article-extra-opts{margin-top:-10px;margin-bottom:20px;font-size:0}.col-article-extra-opts .c-btn{margin-right:10px}.col-article-operations{margin-top:40px;text-align:center}.col-article-operations .col-opt-link{margin:0 10px}.col-article-operations .link-like{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;margin:0 auto 20px;width:68px;height:68px;border-radius:50%;font-size:24px;line-height:68px;white-space:nowrap;text-align:center;background-color:#00A4FF;color:#fff}.col-article-operations .link-like:hover{background-color:#0092ee}.col-article-operations .link-like .com-i-like{position:relative;top:-5px;margin-right:0;width:30px;height:30px;background-size:806.6666666666666% 730%;;background-position:46.7% 39.15%;background-image:url(sprite/Column-20199161611.svg);;background-repeat:no-repeat}.col-article-operations .link-like:hover .com-i-like{background-size:806.6666666666666% 730%;;background-position:46.7% 39.15%;background-image:url(sprite/Column-20199161611.svg);;background-repeat:no-repeat}.col-article-operations .link-like .text{position:absolute;left:100%;top:0;margin-left:8px;color:#00A4FF}.col-article-operations .link-like.actived{border:1px solid #00a4ff;background-color:#fff;line-height:66px}.col-article-operations .link-like.actived:hover{border-color:#0092ee}.col-article-operations .link-like.actived .com-i-like{background-image:url(sprite/Column-20199161611.svg);;background-position:16.509999999999998% 39.15%;background-size:806.6666666666666% 730%;;background-repeat:no-repeat}.col-article-operations .link-like.actived:hover .com-i-like{background-image:url(sprite/Column-20199161611.svg);;background-position:31.6% 39.15%;background-size:806.6666666666666% 730%;;background-repeat:no-repeat}.col-article-operations .com-split{margin:0 20px}.col-article-operations .link-share{margin-right:0}.col-article-operations .com-share-options{margin-left:0}.col-article-operations .com-share-options>li{margin-right:0;margin-left:10px}.col-weixin-mp{margin:15px 0;padding:20px 0;font-size:14px;color:#000;text-align:center;background:url(src/projects/Column/cssComponents/img/mp-bgc0295b601d238d185d568404156a6c49.svg) center bottom no-repeat}.col-weixin-mp .mp-qrcode{display:block;margin:10px auto;width:100px}.col-article-tags{position:relative;margin-top:30px;padding-right:150px;min-height:30px}.col-article-tags .col-tags{margin-top:0}.col-article-tags .extra-part{position:absolute;right:0;top:4px}.col-article-tags .com-operations{margin-top:0}.col-article-tags .com-operations .com-opt-link:last-child{margin-right:0}.col-column-shortcut{position:relative;margin:50px 0;padding:30px 160px 30px 30px;border:1px solid #e5e5e5;border-top:4px solid #00A4FF}.col-column-shortcut .column-title{margin-bottom:5px;font-size:18px}.col-column-shortcut .column-desc{color:#666}.col-column-shortcut .c-btn{position:absolute;right:30px;top:50%;margin-top:-17px;min-width:110px}.pg-article .group-comments .col-group-hd{padding-bottom:0;border-bottom:none}.pg-articles{max-width:1200px}.pg-articles .col-main{padding-right:50px;width:72.08333333%}.pg-articles .col-aside{width:27.91666667%}.pg-articles .col-aside-inner{padding:0 20px;border:1px solid #e5e5e5;background-color:rgba(215,216,217,.1)}.pg-articles .col-aside-inner .col-filter-bar{margin-bottom:0;padding:17px 0}.pg-articles .col-aside-inner [class*=' c-g-']:last-child,.pg-articles .col-aside-inner [class^=c-g-]:last-child{margin-bottom:19px}.col-markdown-nav{border-left:2px solid #e6e6e6;margin-bottom:24px;max-height:300px;overflow-y:auto;-webkit-overflow-scrolling:touch}.col-markdown-nav .nav-title{display:none;margin:0;padding-left:12px;padding-bottom:5px;font-size:14px;font-weight:400;line-height:2}.col-markdown-nav ul,.col-markdown-nav ul ul,.col-markdown-nav ul ul ul{padding-left:0;list-style:none;margin-bottom:0}.col-markdown-nav-list a{display:inline-block;padding-left:12px;font-size:14px;line-height:26px;color:#00a4ff}.col-markdown-nav-list ul a{padding-left:26px;font-size:12px}.col-markdown-nav-list ul ul a{padding-left:40px}.col-markdown-nav.absolute{position:absolute;left:100%;top:204px;margin-bottom:0;margin-left:20px;border-left:none;width:180px;max-height:none}.col-markdown-nav.absolute .nav-title{display:block;border-left:2px solid #e6e6e6}.col-markdown-nav.absolute .col-markdown-nav-list{border-left:2px solid #e6e6e6}.col-markdown-nav.absolute .col-markdown-nav-list a{display:block;position:relative;padding-top:6px;padding-bottom:6px;line-height:1.5;color:#999;word-wrap:break-word}.col-markdown-nav.absolute .col-markdown-nav-list a.active,.col-markdown-nav.absolute .col-markdown-nav-list a:hover{color:#00a4ff;text-decoration:none}.col-markdown-nav.absolute .col-markdown-nav-list a.active:before{content:'';position:absolute;left:-2px;top:6px;bottom:6px;border-left:2px solid #00a4ff}.col-markdown-nav.absolute .col-markdown-nav-list ul a{padding-top:4px;padding-bottom:4px}.col-markdown-nav.absolute .col-markdown-nav-list ul a.active:before{top:4px;bottom:4px}.pg-article .c-markdown p{min-height:0}.col-slibing-articles{margin:50px 0}.col-slibing-articles>li+li{margin-top:5px}.col-slibing-articles a{color:#00a4ff;word-wrap:break-word}.col-slibing-articles a:hover{text-decoration:underline}.col-column-intro{min-height:300px;background:url(src/projects/Column/cssComponents/img/banner-bg@2x2a65c04787b357ea563d917fd5983647.jpg) center no-repeat #1F2531;background-size:cover;color:#fff}.col-column-intro .column-inner{box-sizing:border-box;position:relative;margin:0 auto;padding:97px 10px 40px 140px;max-width:830px}.col-column-intro .column-avatar{box-sizing:border-box;position:absolute;left:10px;top:98px;width:110px;height:110px;border:2px solid #fff;background-color:#444}.col-column-intro .column-avatar .avatar-text{height:56px;font-size:12px;line-height:56px;opacity:0;transition:opactiy .3s linear}.col-column-intro .column-avatar.hover .avatar-text,.col-column-intro .column-avatar:hover .avatar-text{opacity:1}.col-column-intro .column-title{margin-top:-7px;margin-bottom:3px;font-size:30px;font-weight:400;line-height:1.5}.col-column-intro .column-desc{margin-bottom:17px;font-size:16px;color:rgba(255,255,255,.8);word-wrap:break-word}.col-column-intro .com-bubble-warning-wrap{position:relative;top:-2px;margin-left:5px}.col-column-intro .c-input-text:disabled,.col-column-intro .c-input-text:disabled:hover,.col-column-intro .c-textarea:disabled,.col-column-intro .c-textarea:disabled:hover{background-color:#f7f8fa;cursor:not-allowed}.col-column-intro .column-datas{margin-bottom:15px;font-size:0}.col-column-intro .column-data{display:inline-block;vertical-align:middle;font-size:14px;color:rgba(255,255,255,.5)}.col-column-intro .column-data-split{display:inline-block;vertical-align:middle;margin:0 10px;width:2px;height:2px;border-radius:50%;background-color:rgba(255,255,255,.5)}.col-column-intro .column-btns{font-size:0}.col-column-intro .c-btn{margin-right:20px;min-width:114px;height:28px;line-height:26px;font-size:12px;border-radius:0;vertical-align:middle}.col-column-intro .c-btn-weak{background-color:#fff;border-radius:0}.col-column-intro .c-btn-hole{border-color:#DCDEE6;color:#fff}.col-column-intro .c-btn-hole:hover{border-color:#fff;background-color:#fff;color:#000}.col-column-intro .invite-bubble .c-bubble{margin-left:13px}.col-column-intro .invite-bubble>.c-btn{margin-right:0}.col-column-intro .invite-bubble-inner{position:relative;padding-right:20px}.col-column-intro .invite-title{margin-bottom:5px;font-size:16px;font-weight:400;color:#000}.col-column-intro .invite-close{position:absolute;right:0;top:0;width:16px;height:16px;font-size:0}.col-column-intro .invite-close:after{content:'';position:absolute;left:50%;top:50%;margin:-6px 0 0 -6px;width:12px;height:12px;background-image:url(sprite/Column-20199161611.svg);;background-position:97.83% 51.690000000000005%;background-size:2016.6666666666667% 1825%;;background-repeat:no-repeat}.col-column-intro .invite-close:hover:after{background-image:url(sprite/Column-20199161611.svg);;background-position:97.83% 58.45%;background-size:2016.6666666666667% 1825%;;background-repeat:no-repeat}.col-column-intro .column-opts{position:absolute;right:0;top:94px;z-index:2;margin-top:0}.col-column-intro .column-opts .col-opt-link{font-size:14px}.col-column-intro .c-bubble-trigger-btn{color:#999}.col-column-intro .c-bubble-trigger-btn:after{background-position:0.44% 93.60000000000001%;background-size:1512.5% 1368.75%;;background-image:url(sprite/Column-20199161611.svg);;background-repeat:no-repeat}.col-column-intro .column-opts .c-bubble-top{width:150px}.col-column-intro.creator .column-title{margin-right:70px;word-wrap:break-word}.col-column-intro-form{position:relative;max-width:630px}.col-column-intro.editing .column-btns{max-width:630px;white-space:nowrap;text-align:center}.col-column-intro.editing .c-btn{min-width:0}.col-column-intro.editing .c-btn-weak{border-color:#DCDEE6;color:#fff;background-color:transparent}.col-column-intro.editing .c-btn-weak:hover{border-color:#fff;background-color:#fff;color:#000}.col-column-members{margin-bottom:15px;font-size:0}.col-column-member{position:relative;display:inline-block;vertical-align:middle;margin-right:10px;-webkit-box-sizing:border-box;box-sizing:border-box}.col-column-member .col-avatar{-webkit-box-sizing:border-box;box-sizing:border-box;display:block;width:24px;height:24px}.col-column-member img{display:block;width:100%;height:100%}.col-column-member .c-bubble{left:50%;bottom:100%;margin-left:-100px;margin-bottom:10px;width:200px}.col-column-member .c-bubble a{color:#00a4ff}.col-column-member .c-bubble a:hover{text-decoration:underline}.col-column-member.creator:before{content:'';position:absolute;right:-2px;bottom:-2px;z-index:2;width:10px;height:10px;border:2px solid #262936;background-image:url(sprite/Column-20199161611.svg);;border-radius:50%;background-position:0.43% 99.52%;background-size:2420% 2190%;;background-repeat:no-repeat}.col-column-member.creator .col-avatar{position:relative;margin-top:-1px;width:26px;height:26px}.col-column-member.add .col-avatar,.col-column-member.more .col-avatar{position:relative;border:1px solid #fff;text-align:center;line-height:22px;overflow:hidden}.col-column-member.add:hover .col-avatar,.col-column-member.more:hover .col-avatar{border-color:#00a4ff}.col-column-member.more .col-avatar:before{content:'';display:inline-block;vertical-align:middle;width:22px;height:22px;background-image:url(sprite/Column-20199161611.svg);;background-position:37.730000000000004% 54.82%;background-size:1100% 995.4545454545455%;;background-repeat:no-repeat}.col-column-member.more:hover .col-avatar:before{background-image:url(sprite/Column-20199161611.svg);;background-position:48.64% 54.82%;background-size:1100% 995.4545454545455%;;background-repeat:no-repeat}.col-column-member.add .col-avatar:after,.col-column-member.add .col-avatar:before{content:'';position:absolute;left:50%;top:50%;margin:-6px 0 0 -1px;width:2px;height:12px;background-color:#999}.col-column-member.add .col-avatar:after{margin:-1px 0 0 -6px;width:12px;height:2px}.col-column-member.add:hover .col-avatar:after,.col-column-member.add:hover .col-avatar:before{background-color:#00a4ff}.col-column-article-list{margin-top:26px}.col-column-article-list .col-group-hd{margin-bottom:23px}.col-search{position:relative;border-bottom:1px solid #e5e5e5}.col-search input{padding:5px 20px 5px 35px;border:none;background-color:transparent;line-height:25px;font-size:14px}.col-search button{position:absolute;left:0;top:0;width:30px;height:100%;background-color:transparent;text-align:center;line-height:35px;font-size:0}.col-search button:after{content:'';display:inline-block;vertical-align:middle;width:16px;height:16px;background-image:url(sprite/Column-20199161611.svg);;background-position:56.19% 93.60000000000001%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.col-search-dropdown{padding-top:10px;height:250px}.col-search-dropdown ::-webkit-scrollbar{width:16px;height:16px}.col-search-dropdown ::-webkit-scrollbar-corner{background-color:transparent}.col-search-dropdown ::-webkit-scrollbar-track{border-radius:8px}.col-search-dropdown ::-webkit-scrollbar-thumb{height:7px;border-radius:8px;border:5px solid transparent;background-color:#ddd;background-clip:padding-box}.col-search-members{overflow-x:hidden;overflow-y:auto;max-height:100%}.col-search-member{position:relative;padding:7px 50px 7px 42px;font-size:0;line-height:32px}.col-search-member .col-avatar{position:absolute;left:0;top:7px}.col-search-member .name{display:block;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:inherit}.col-search-member .name:hover{color:#00a4ff}.col-search-member .extra-link{position:absolute;right:0;top:7px;padding:0 10px;font-size:14px;color:#00a4ff;opacity:0;-webkit-transition:opacity .2s;transition:opacity .2s}.col-search-member .extra-link:hover{color:#0092ee}.col-search-member.hover .extra-link,.col-search-member:hover .extra-link{opacity:1}.col-search-member.hover,.col-search-member:hover{background-color:#f7f8fa}.modal-title{padding-top:45px;margin-bottom:10px;font-size:18px;font-weight:600;color:#000;text-align:center}.modal-invite .col-search input{width:100%}.modal-invite .invite-panel{position:relative;margin:0 -25px;padding:20px 0;text-align:center;color:#666;font-weight:500;overflow:hidden;background-color:#f7f8fa;box-shadow:0 -2px 6px rgba(0,0,0,.15)}.modal-invite .invite-primary-txt{margin-bottom:10px;font-size:16px;color:#333}.modal-invite .invite-url{display:inline-block;vertical-align:middle;margin-right:10px;max-width:280px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.modal-invite .invite-bubble{color:#333}.modal-invite .invite-bubble .icon{position:relative;top:-1px;display:inline-block;vertical-align:middle;margin-right:5px;width:16px;height:16px;background-image:url(sprite/Column-20199161611.svg);;background-position:99.56% 0.49%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.com-modal-join-column .slogan{margin-bottom:20px;color:#000}.com-modal-join-column .join-form-item{line-height:26px}.com-modal-join-column .join-form-item-title{display:inline}.com-modal-join-column .join-form-item-cnt{display:inline;color:#333}.com-modal-join-column .join-desc{margin-top:20px}.com-modal-join-column .join-desc .join-form-item-title{display:block;margin-bottom:10px;color:#333}.com-modal-join-column .join-desc .join-form-item-cnt{display:block}.pg-index{margin:0;padding:0;max-width:none}.com-hero-bar{background-image:url(src/projects/Column/cssComponents/img/bannerbb74fb8c8facd2fe8440b28035fecd73.jpg)}.pg-index .c-tab-cross:before{display:none}.pg-index .c-tab-btns a{border-bottom:none}.pg-index .col-group{margin-bottom:20px}.col-layout .col-main{width:73.3333%;padding-right:40px}.col-layout .col-aside{width:26.6667%}.com-carousel{position:relative}.com-carousel-main{height:500px;overflow:hidden;background-color:#020B25}.com-carousel-item,.com-carousel-list{height:100%}.com-carousel-ctrl{position:absolute;left:50%;bottom:90px;z-index:3;text-align:center;font-size:0;white-space:nowrap;transform:translateX(-50%)}.com-carousel-ctrl-item{display:inline-block;vertical-align:middle;margin:0 3px;padding:10px 0;cursor:pointer}.com-carousel-ctrl-item.actived{cursor:default}.com-carousel-ctrl-item i{display:block;width:30px;height:3px;background:rgba(255,255,255,.3)}.com-carousel-ctrl-item:hover i{background:rgba(255,255,255,.5)}.com-carousel-ctrl-item.actived i{background-color:#fff}.com-carousel-pages{opacity:0;transition:opacity .2s}.com-carousel:hover .com-carousel-pages{opacity:1;filter:alpha(opacity=100)}.com-carousel-page{position:absolute;top:55%;font-size:0;width:60px;height:400px;line-height:400px;margin-top:-200px}.com-carousel-page.prev{left:20px;text-align:left}.com-carousel-page.next{right:20px;text-align:right}.com-carousel-page:before{content:'';display:inline-block;width:22px;height:41px;overflow:hidden;line-height:99;vertical-align:middle}.com-carousel-page.prev:before{background-image:url(sprite/Column-20199161611.png);background-position:0px 0px}.com-carousel-page.next:before{background-image:url(sprite/Column-20199161611.png);background-position:-24px 0px}.com-2-salon-panels{font-size:0}.com-2-salon-panels>.panel-cell{display:inline-block;vertical-align:top;margin-right:20px;margin-bottom:20px;width:calc((100% - 20px - 1px)/ 2)}.com-2-salon-panels>.panel-cell:nth-child(2n){margin-right:0}.com-2-salon-panel{box-sizing:border-box;position:relative;padding:20px;height:140px;background-color:#f7f8fa;transition:box-shadow .3s linear}.com-2-salon-panel:hover{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-2-salon-panel .panel-link{position:absolute;left:0;top:0;z-index:1;width:100%;height:100%}.com-2-salon-panel-img{position:absolute;left:0;top:0;width:100%;height:100%;background-size:auto 100%;background-position:center right;background-repeat:no-repeat;background-image:url(src/components/SalonPanels2/css/img/bg-demoacdb255332e6059f2371149d291e9ef8.jpg)}.com-2-salon-panel-main{position:relative}.com-2-salon-panel-title{height:52px;font-size:18px;line-height:26px;font-weight:400;color:#000;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2}.com-2-salon-panel-infos{position:relative;margin-top:20px;padding-right:110px;line-height:26px}.com-2-salon-panel-infos .panel-btn{position:absolute;right:0;bottom:0}.com-2-salon-panel-loading{height:130px}.com-salon-specialist{width:440px;height:440px}.com-salon-specialist .com-carousel-main{height:100%;background-color:#E2E2E2}.com-salon-specialist-item{position:relative;height:100%}.com-salon-specialist-img{display:block;width:100%;height:100%;background-position:right center;background-size:cover;font-size:0}.com-salon-specialist-ft{box-sizing:border-box;position:absolute;left:0;bottom:0;padding:20px 20px 22px;width:100%}.com-salon-specialist-name{font-size:30px;line-height:42px;color:#000;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-salon-specialist-identity{font-size:14px;line-height:20px;color:#666;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-salon-specialist .com-carousel-ctrl{box-sizing:border-box;left:auto;right:20px;bottom:10px;transform:translateX(0)}.com-salon-specialist .com-carousel-ctrl-item i{box-sizing:border-box;width:8px;height:8px;background-color:#fff;border:1px solid #00a4ff;border-radius:50%}.com-salon-specialist .com-carousel-ctrl-item.actived i{background-color:#00a4ff}.com-salon-primary-specialist-img{width:100%;height:435px;background-color:#E2E2E2;background-size:auto 100%;background-position:right center}.com-salon-primary-specialist-text{width:100%;height:100%;background-size:auto 100%;background-position:left center}.com-salon-primary{box-sizing:border-box;position:relative;margin-bottom:20px;padding:20px;display:table;table-layout:fixed;width:100%;background-color:#fff;box-shadow:0 -1px 16px 0 rgba(0,0,0,.13)}.com-salon-primary-link{position:absolute;left:0;top:0;width:100%;height:100%;z-index:1}.com-salon-primary-specialist{display:table-cell;vertical-align:top}.com-salon-primary-specialist .com-salon-specialist{position:relative;width:100%;height:435px}.com-salon-primary-mark.com-mark-skew{position:absolute;left:100%;top:-3px;z-index:2;padding-left:0;margin-left:20px;min-width:72px;white-space:nowrap}.com-salon-primary-mark.com-mark-skew .mark-bg{margin-left:0;width:calc(100% - 18px)}.com-salon-primary-mark.com-mark-skew .mark-bg:before,.com-salon-primary-mark.com-mark-skew .mark-cnt:before{display:none}.com-salon-primary-main{position:relative;display:table-cell;vertical-align:top;width:287px;padding-left:35px;padding-top:20px}.com-salon-primary-bd{margin-bottom:10px;min-height:215px}.com-salon-primary-desc,.com-salon-primary-pretitle,.com-salon-primary-title{display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2}.com-salon-primary-pretitle{font-size:18px;line-height:25px;color:#999;max-height:50px}.com-salon-primary-title{margin-top:7px;font-size:30px;line-height:36px;color:#000;font-weight:400;max-height:72px}.com-salon-primary-desc{margin-top:20px;font-size:14px;line-height:24px;color:#999;-webkit-line-clamp:4;max-height:96px}.com-salon-primary-avatars.com-2-avatars-group{padding-bottom:25px;margin-bottom:20px;border-bottom:1px solid #D8D8D8}.com-salon-primary-avatars.com-2-avatars-group .group-text{color:#333}.com-salon-primary-ft{position:absolute;left:0;right:0;bottom:0;padding-left:35px;padding-bottom:20px}.com-salon-primary-datas .com-icon-data{display:block;margin-right:0;margin-bottom:10px}.com-salon-primary-datas .com-icon-data:last-child{margin-bottom:0}.com-salon-primary-btn.com-arrow-btn{margin-top:20px;width:100%;position:relative;z-index:2;padding-right:48px;height:36px;font-size:16px;line-height:34px}.com-salon-primary-btn .com-arrow-btn-text:after{border-width:17px 6px}.com-salon-primary-btn .com-arrow-btn-caret{width:36px;padding-left:12px}.com-salon-primary-btn .com-arrow-btn-caret:after{margin-left:-5px;width:10px;height:10px}.com-salon-primary.loading .com-loading-placeholder{height:437px;background-color:transparent}.com-salon-group{position:relative;z-index:100;margin-top:-90px}.com-salon-group.tile{margin-top:0}.com-salon-group.tile .com-salon-group-primary{display:block;font-size:0;padding:0;box-shadow:none;background-color:#F7F8FA;margin-bottom:10px;transition:box-shadow .3s linear}.com-salon-group.tile .com-salon-group-primary:hover{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-salon-group.tile .com-salon-primary-specialist{display:inline-block;vertical-align:top;width:calc((100% - 10px - 1px)/ 2)}.com-salon-group.tile .com-salon-primary-specialist-img,.com-salon-group.tile .com-salon-specialist{height:320px}.com-salon-group.tile .com-salon-specialist-img{background-position:right top}.com-salon-group.tile .com-salon-primary-main{display:inline-block;vertical-align:top;padding:20px 30px;box-sizing:border-box;width:calc((100% - 10px - 1px)/ 2 + 10px);height:320px}.com-salon-group.tile .com-salon-primary-mark{display:none}.com-salon-group.tile .com-salon-primary-bd{min-height:120px}.com-salon-group.tile .com-salon-primary-pretitle{font-size:14px;line-height:20px;display:block;white-space:nowrap}.com-salon-group.tile .com-salon-primary-title{margin-top:5px;font-size:24px;line-height:36px;display:block;white-space:nowrap}.com-salon-group.tile .com-salon-primary-desc{margin-top:10px;-webkit-line-clamp:3;max-height:72px}.com-salon-group.tile .com-salon-primary-avatars.com-2-avatars-group{border-bottom:none;padding-bottom:0;margin-bottom:20px}.com-salon-group.tile .com-2-avatars-group .group-text{font-size:12px;color:#999}.com-salon-group.tile .com-salon-primary-datas .com-icon-data{font-size:12px;margin-bottom:0}.com-salon-group.tile .com-salon-primary-datas .com-icon-data>div{display:block;display:-webkit-box;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis;max-height:48px}.com-salon-group.tile .com-icon-data [class*=com-i-],.com-salon-group.tile .com-icon-data [class^=com-i-]{width:14px;height:14px}.com-salon-group.tile .com-salon-primary-btn.com-arrow-btn{margin-top:10px;width:auto;padding-right:42px;height:32px;font-size:14px;line-height:30px;min-width:190px}.com-salon-group.tile .com-salon-primary-btn .com-arrow-btn-text:after{border-width:15px 5px}.com-salon-group.tile .com-salon-primary-btn .com-arrow-btn-caret{width:32px;padding-left:10px}.com-salon-group.tile .com-salon-primary-btn .com-arrow-btn-caret:after{margin-left:-5px;width:10px;height:10px}.com-salon-group.tile .com-2-salon-panels>.panel-cell{margin-right:10px;width:calc((100% - 10px - 1px)/ 2)}.com-salon-group.tile .com-2-salon-panels>.panel-cell:last-child{margin-right:0}.com-salon-group.tile .com-2-salon-panel{height:130px}.com-salon-group.tile .com-salon-primary.loading{background-color:#F3F5F9}.com-salon-group.tile .com-salon-primary.loading .com-loading-placeholder{height:320px}.com-salon-group.tile .com-salon-primary-ft{padding-bottom:20px;padding-left:30px;padding-right:30px}.com-2-activity-panels{font-size:0}.com-2-activity-panels>.panel-cell{display:inline-block;vertical-align:top;margin-right:20px;margin-bottom:25px}.com-2-activity-panels.list2>.panel-cell{width:calc((100% - 20px - 1px)/ 2)}.com-2-activity-panels.list2>.panel-cell:nth-child(2n){margin-right:0}.com-2-activity-panels.list3>.panel-cell{width:calc((100% - 20px * 2 - 1px)/ 3)}.com-2-activity-panels.list3>.panel-cell:nth-child(3n){margin-right:0}.com-2-activity-panels.list4>.panel-cell{width:calc((100% - 20px * 3 - 1px)/ 4)}.com-2-activity-panels.list4>.panel-cell:nth-child(4n){margin-right:0}.com-2-activity-panel{display:block;background-color:#fff;box-shadow:0 1px 3px 0 #E1E3E9;transition:box-shadow .3s linear}.com-2-activity-panel:hover{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-2-activity-panel-object{position:relative;padding-top:52.1052631579%;border-bottom:1px solid #eee;overflow:hidden}.com-2-activity-panel-img{position:absolute;left:0;top:0;width:100%;height:100%;background-position:center;background-size:cover}.com-2-activity-panel-time{position:absolute;right:10px;bottom:10px;padding:0 8px;height:24px;background-color:rgba(0,0,0,.8);color:#fff;font-size:14px;line-height:24px}.com-2-activity-panel-main{box-sizing:border-box;padding:20px}.com-2-activity-panel-bd{min-height:82px}.com-2-activity-panel-pretitle{margin-bottom:10px;font-size:14px;line-height:24px;color:#666}.com-2-activity-panel-title{height:48px;font-size:18px;line-height:24px;color:#000;font-weight:400;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2}.com-2-activity-panel-pretitle em,.com-2-activity-panel-title em{color:#ff7200}.com-2-activity-panel-ft{position:relative;margin-top:20px;padding-right:110px}.com-2-activity-panel-ft .panel-btn{position:absolute;right:0;top:0}.com-2-activity-panel.topic .com-2-activity-panel-bd{min-height:0;height:60px}.com-2-activity-panel.topic .com-2-activity-panel-pretitle{position:relative;box-sizing:border-box;display:inline-block;vertical-align:middle;padding-right:65px;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-activity-panel.topic .com-2-activity-panel-pretitle.without-order{padding-right:0}.com-2-activity-panel.topic .pretitle-order{position:absolute;left:100%;top:0;margin-left:-60px}.com-2-activity-panel.topic .com-2-activity-panel-title{height:24px;white-space:nowrap;display:block}.com-2-activity-panel.activity{box-shadow:none;background-color:transparent}.com-2-activity-panel.activity:hover{box-shadow:none}.com-2-activity-panel.activity .com-2-activity-panel-object{border:1px solid #E5E8ED;transition:box-shadow .3s linear}.com-2-activity-panel.activity:hover .com-2-activity-panel-object{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-2-activity-panel.activity .com-2-activity-panel-main{padding:15px 0 0}.com-2-activity-panel.activity .com-2-activity-panel-bd{min-height:0}.com-2-activity-panel.activity .com-2-activity-panel-pretitle{margin-bottom:0;color:#999}.com-2-activity-panel.activity .com-2-activity-panel-title{display:block;height:auto}.com-2-activity-panel-infos{margin-top:10px;font-size:0}.com-2-activity-panel-info{font-size:12px;line-height:18px;color:#999}.com-2-activity-panel-info:before{content:'';display:inline-block;vertical-align:middle;margin:0 5px;width:2px;height:2px;border-radius:2px;background-color:#666}.com-2-activity-panel-info:first-child:before{display:none}.com-teacher-panels{font-size:0;margin-bottom:-40px}.com-teacher-panels>.panel-cell{display:inline-block;vertical-align:top;margin-right:40px;margin-bottom:40px}.com-teacher-panels.list2>.panel-cell{width:calc((100% - 40px - 1px)/ 2)}.com-teacher-panels.list2>.panel-cell:nth-child(2n){margin-right:0}.com-teacher-panel{display:table;table-layout:fixed;width:100%}.com-teacher-panel-object{display:table-cell;vertical-align:top;padding-right:30px;width:190px}.com-teacher-panel-img{display:block;padding-top:137.5%;width:100%;background-size:cover;background-position:center}.com-teacher-panel-main{position:relative;box-sizing:border-box;display:table-cell;vertical-align:top}.com-teacher-panel-name{position:relative;display:inline-block;vertical-align:middle;box-sizing:border-box;max-width:100%;font-size:22px;line-height:32px;color:#000;font-weight:400}.com-teacher-panel-name.with-verify{padding-right:20px}.com-teacher-panel-name-inner{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:inherit}.com-teacher-panel-name .com-verification{position:absolute;right:0;top:8px;margin-right:0}.com-teacher-panel-identity{font-size:14px;line-height:24px;color:#000;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-teacher-panel-desc{margin-top:10px;font-size:14px;line-height:24px;color:#999;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:4;max-height:96px}.com-teacher-panel-links{position:absolute;left:0;bottom:0;width:100%}.com-teacher-panel-links .com-icon-disorder{padding-bottom:10px;margin-bottom:10px;border-bottom:1px solid #E1E3E9}.com-teacher-panel-links .com-icon-disorder:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.com-icon-disorder-link{box-sizing:border-box;display:inline-block;vertical-align:middle;position:relative;max-width:100%;padding-left:24px;font-size:14px;line-height:24px;color:#333;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-icon-disorder-link:hover{color:#00a4ff}.com-icon-disorder-icon{position:absolute;left:0;top:4px;width:16px;height:16px}.com-icon-disorder-icon.article{background-image:url(sprite/Column-20199161611.svg);;background-position:17.26% 67%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.com-icon-disorder-icon.video{background-image:url(sprite/Column-20199161611.svg);;background-position:75.66000000000001% 9.36%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.com-icon-disorder-link:hover .com-icon-disorder-icon.article{background-image:url(sprite/Column-20199161611.svg);;background-position:33.19% 67%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.com-icon-disorder-link:hover .com-icon-disorder-icon.video{background-image:url(sprite/Column-20199161611.svg);;background-position:64.16% 75.86%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.com-tags-bar{margin-bottom:60px;background-color:#f7f8fa;padding:20px 10px}.com-tags-bar>.com-inner{position:relative;padding-left:50px;min-height:24px}.com-tags-bar-title{position:absolute;left:10px;top:0;width:30px;height:24px;border-right:1px solid #E1E3E9;font-size:0;line-height:24px}.com-tags-bar-title:before{content:'';display:inline-block;vertical-align:middle;width:20px;height:20px;background-image:url(sprite/Column-20199161611.svg);;background-position:67.12% 22.61%;background-size:1210% 1095%;;background-repeat:no-repeat}.com-tags-bar-main{font-size:0;white-space:nowrap;overflow:hidden}.com-tags-bar-item{display:inline-block;vertical-align:middle;margin-right:30px;font-size:14px;line-height:24px;color:#666}.com-tags-bar-item:hover{color:#00a4ff}.com-tags-bar-item:before{content:'#';margin-right:5px;color:#999}.com-activity-gallery{margin-bottom:20px;overflow:hidden}.com-activity-gallery-list{display:inline-block;vertical-align:middle;font-size:0;white-space:nowrap}.com-activity-gallery-list>li{display:inline-block;vertical-align:top;margin-right:20px}.com-activity-gallery-img{width:380px;height:194px;background-size:cover;background-position:center}.com-activity-gallery-title{margin-top:10px;font-size:14px;line-height:20px;font-weight:400;color:#666}.com-detail-timebar-item{position:relative;margin-left:70px;padding-bottom:40px;padding-left:35px;border-left:1px dashed #E1E3E9}.com-detail-timebar-item:first-child:before{content:'';position:absolute;left:-1px;top:0;width:1px;height:8px;background-color:#fff}.com-detail-timebar-item:last-child{padding-bottom:0}.com-detail-timebar-item:last-child:before{content:'';position:absolute;left:-1px;top:23px;bottom:0;width:1px;background-color:#fff}.com-detail-timebar-dot{box-sizing:border-box;position:absolute;left:-7px;top:8px;width:15px;height:15px;border:1px solid #00a4ff;border-radius:50%;background-color:#fff}.com-detail-timebar-time{position:absolute;right:100%;top:0;width:78px;font-size:24px;line-height:32px;color:#333;white-space:nowrap;font-weight:300}.com-detail-timebar-main{box-sizing:border-box;display:table;width:100%}.com-detail-timebar-hd{display:table-cell;padding-right:20px;width:240px;vertical-align:top}.com-detail-timebar-bd{display:table-cell;vertical-align:top;transition:all .3s ease-in-out}.com-detail-timebar-author{position:relative}.com-detail-timebar-author .com-2-avatar{position:absolute;left:0;top:0;width:42px;height:42px;transition:all .3s linear}.com-detail-timebar-author .author-main{margin-left:54px;transition:all .3s linear}.com-detail-timebar-author .author-name{position:relative;display:inline-block;vertical-align:middle;box-sizing:border-box;max-width:100%;font-size:18px;line-height:24px;color:#000;font-weight:400}.com-detail-timebar-author .author-name.with-verify{padding-right:17px}.com-detail-timebar-author .author-name-inner{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:inherit}.com-detail-timebar-author .com-verification{position:absolute;right:0;top:6px;margin-right:0}.com-detail-timebar-author .author-identity{margin-top:5px;font-size:14px;line-height:18px;color:#999}.com-detail-timebar-author-detail{box-sizing:border-box;position:absolute;left:295px;right:0;top:0;padding:20px;min-height:144px;background-color:#F3F5F9;border-radius:0 16px 16px;-ms-transform:scale(0);transform:scale(0);-ms-transform-origin:left top;transform-origin:left top;opacity:0;-ms-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.com-detail-timebar-author-detail-inner{display:table;table-layout:fixed;width:100%}.com-detail-timebar-author-detail .detail-desc-cnt{display:table-cell;vertical-align:top;padding-right:50px}.com-detail-timebar-author-detail .detail-desc{font-size:14px;line-height:24px;color:#666;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:3;max-height:72px}.com-detail-timebar-author-detail .detail-skills-cnt{display:table-cell;vertical-align:top;width:200px}.com-detail-timebar-author-detail .detail-skills-title{margin-bottom:10px;font-size:12px;line-height:18px;color:#999;font-weight:400}.com-detail-timebar-item.author-detail .com-detail-timebar-author .com-2-avatar{width:90px;height:90px}.com-detail-timebar-item.author-detail .com-detail-timebar-author .author-main{margin-left:0;padding-top:100px}.com-detail-timebar-item.author-detail .com-detail-timebar-author-detail{-ms-transform:scale(1);transform:scale(1);opacity:1;transition-delay:50ms}.com-detail-timebar-item.author-detail .com-detail-timebar-bd{opacity:0;transition-delay:50ms}.com-topic-resources-hd{margin-bottom:14px}.com-topic-resources-title{font-size:14px;line-height:24px;color:#000;font-weight:400}.com-topic-resource{margin-bottom:13px;background-color:#f3f5f9;transition:box-shadow .3s linear}.com-topic-resource:hover{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-topic-resource:last-child{margin-bottom:0}.com-topic-resource-video{box-sizing:border-box;display:table;width:100%}.com-topic-resource-video-object{display:table-cell;width:122px;height:66px;position:relative}.com-topic-resource-video-img{position:relative;display:block;width:100%;height:100%;background-size:cover;background-position:center}.com-topic-resource-video-img:before{content:'';position:absolute;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,.4)}.com-topic-resource-video-icon{box-sizing:border-box;position:absolute;left:50%;top:50%;margin:-13px 0 0 -13px;width:26px;height:26px;border-radius:50%;border:1px solid #fff}.com-topic-resource-video-icon:before{content:'';position:absolute;left:50%;top:50%;margin:-5px 0 0 -3px;width:0;height:0;border-style:solid;border-color:transparent #fff;border-width:5px 0 5px 9px}.com-topic-resource-video-main{display:table-cell;vertical-align:middle;padding:0 20px}.com-topic-resource-video-title{font-size:14px;line-height:14px;color:#333;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-topic-resource-video-desc{margin-top:8px;font-size:12px;line-height:18px;color:#999}.com-topic-resource-art{display:block;padding:15px 20px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px;line-height:18px;color:#333}.com-topic-resource-art-icon{position:relative;top:-1px;display:inline-block;vertical-align:middle;margin-right:10px;width:16px;height:16px;background-image:url(sprite/Column-20199161611.svg);;background-position:25.22% 67%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.com-organizer{box-sizing:border-box;display:table;width:100%}.com-organizer-cell{display:table-cell;vertical-align:middle}.com-organizer-cell.avatar{padding-right:20px;width:120px}.com-organizer-cell.identity{padding-right:10px;width:140px}.com-organizer .com-2-avatar{width:120px;height:50px}.com-organizer .com-2-avatar-inner{background-size:contain;background-color:transparent;border-color:transparent;border-radius:0}.com-organizer-name{position:relative;display:inline-block;vertical-align:middle;box-sizing:border-box;max-width:12em;font-size:20px;line-height:24px;color:#000;font-weight:400;word-wrap:break-word}.com-organizer-name.with-verify{padding-right:17px}.com-organizer-name-inner{display:block;color:inherit}a.com-organizer-name-inner:hover{color:#00a4ff}.com-organizer-name .com-verification{position:absolute;right:0;top:6px;margin-right:0}.com-organizer-identity{margin-top:7px;font-size:14px;line-height:20px;color:#999}.com-organizer-desc{font-size:14px;line-height:28px;color:#666}.com-organizer.small{position:relative;display:block;padding-left:130px;min-height:45px}.com-organizer.small .com-organizer-cell{display:block;width:auto;padding-right:0}.com-organizer.small .com-organizer-cell.avatar{position:absolute;left:0;top:0}.com-organizer.small .com-organizer-identity{display:none}.com-organizer.small .com-organizer-name{max-width:100%}.com-organizer.small .com-organizer-name-inner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-organizer.small .com-organizer-desc{line-height:24px;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:48px}.com-organizer.person .com-organizer-cell.avatar{width:90px}.com-organizer.person .com-2-avatar{width:90px;height:90px}.com-organizer.person .com-2-avatar-inner{background-size:cover;background-color:#fff;border-color:#EFEFEF;border-radius:50% 50% 50% 0}.com-organizers{font-size:0}.com-organizers>.panel-cell{margin-bottom:20px;font-size:14px}.com-organizers[class*=list]>.panel-cell{display:inline-block;vertical-align:top;margin-right:20px}.com-organizers.list3>.panel-cell{width:calc((100% - 20px * 2 -1px)/ 3)}.com-organizers.list3>.panel-cell:nth-child(3n){margin-right:0}.com-video-player{position:relative;height:528px;background-color:#000}.com-video-player-img{height:100%;background-size:cover;background-position:center;margin:0 auto}.com-video-player-mask{position:absolute;left:0;top:0;width:100%;height:100%;background:rgba(0,0,0,.59)}.com-video-player-cnt{position:absolute;left:0;top:50%;transform:translateY(-50%);width:100%;text-align:center}.com-video-player-cnt.counting{color:#fff;font-size:16px;line-height:32px;text-align:center}.com-video-player-cnt.counting em{margin:0 5px;color:#F5A623}.com-video-player-play{position:relative;box-sizing:border-box;display:inline-block;vertical-align:middle;width:60px;height:60px;border-radius:50%;border:1px solid #fff;text-align:center;line-height:58px;cursor:pointer}.com-video-player-play:before{content:'';display:inline-block;vertical-align:middle;margin-left:5px;width:0;height:0;border-style:solid;border-width:15px 0 15px 24px;border-color:transparent #fff}.com-video-player-play.loading{animation:playLoading 2s linear infinite}.com-video-player-play.loading:before{position:absolute;left:-5px;top:50%;margin-top:-5px;margin-left:0;width:10px;height:10px;border:none;border-radius:50%;background-color:#fff}@keyframes playLoading{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.com-video-player-state{display:inline-block;vertical-align:middle;margin-top:15px;color:#fff;font-size:14px}.com-ani-playing{position:relative;top:-2px;display:inline-block;vertical-align:middle;font-size:0;margin-right:8px;height:16px}.com-ani-playing span{display:inline-block;vertical-align:bottom;width:2px;height:16px;background-color:#fff;-webkit-animation:playing 1.5s linear infinite;animation:playing 1.5s linear infinite;-webkit-transform-origin:center bottom;-webkit-transform:scaleY(.125);transform-origin:center bottom;transform:scaleY(.125)}.com-ani-playing span:nth-child(2){-webkit-animation-delay:.5s;-webkit-transform:scaleY(1);animation-delay:.5s;transform:scaleY(1)}.com-ani-playing span:nth-child(3){-webkit-animation-delay:1s;-webkit-transform:scaleY(.675);animation-delay:1s;transform:scaleY(.675)}.com-ani-playing span:nth-child(4){-webkit-animation-delay:1.5s;-webkit-transform:scaleY(.8);animation-delay:1.5s;transform:scaleY(.8)}.com-ani-playing span+span{margin-left:2px}@keyframes -webkit-playing{0%,100%{-webkit-transform:scaleY(1)}50%{-webkit-transform:scaleY(.125)}}@keyframes playing{0%,100%{transform:scaleY(1)}50%{transform:scaleY(.125)}}.com-video-player-tip{box-sizing:border-box;position:absolute;left:0;top:50%;width:100%;color:#fff;font-size:16px;line-height:32px;text-align:center;margin-top:-16px}.com-video-player-tip.counting em{margin:0 5px;color:#F5A623}.com-video-tab{position:relative;height:100%}.com-video-tab-hd{height:60px;border-bottom:1px solid #E1E3E9}.com-video-tab-ctrl{font-size:0;height:100%}.com-video-tab-item{position:relative;display:inline-block;vertical-align:middle;width:50%;height:100%;color:#000}.com-video-tab-item:before{content:'';position:absolute;left:0;top:50%;margin-top:-15px;width:1px;height:30px;background-color:#E1E3E9}.com-video-tab-item:first-child:before{display:none}.com-video-tab-item a{display:block;font-size:14px;line-height:60px;text-align:center;color:inherit}.com-video-tab-item a:hover{color:#00a4ff}.com-video-tab-item.actived a,.com-video-tab-item.actived a:hover{color:#00a4ff;cursor:default}.com-video-tab-bd{position:absolute;left:0;top:61px;bottom:0;width:100%}.com-video-tab-panel{height:100%}.com-video-tab-ctrl.one-tab .com-video-tab-item{width:100%}.com-video-tab-ctrl.one-tab .com-video-tab-item a{padding:0 20px;text-align:left}.com-video-tab-ctrl.one-tab .com-video-tab-item.actived a,.com-video-tab-ctrl.one-tab .com-video-tab-item.actived a:hover{color:#000}.com-video-comments{position:relative;height:100%}.com-video-comments-list{position:absolute;left:0;top:0;bottom:137px;width:100%;box-sizing:border-box;overflow-x:hidden;overflow-y:auto;padding:20px}.com-video-comment+.com-video-comment{margin-top:20px}.com-video-comment-cnt{font-size:14px;line-height:22px;color:#333;word-wrap:break-word}.com-video-comment-ft{position:relative;padding-right:70px;margin-top:3px;font-size:12px;line-height:18px;color:#999}.com-video-comment-user{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-video-comment-time{position:absolute;right:0;top:0}.com-video-comments-edit{box-sizing:border-box;position:absolute;left:0;bottom:0;width:100%;padding:20px}.com-video-comments-edit textarea{box-sizing:border-box;width:100%;height:55px;padding:10px;border:1px solid transparent;background-color:#F3F5F9;font-size:14px;line-height:22px;resize:none}.com-video-comments-edit textarea:focus{background-color:#fff;border-color:#00a4ff}.com-video-comments-edit textarea:disabled,.com-video-comments-edit textarea:disabled:focus{background-color:#F3F5F9;border-color:transparent}.com-video-comments-edit .edit-btns{margin-top:10px;text-align:right}.com-video-comments-edit .c-btn{height:28px;font-size:12px;line-height:26px}.com-video-nav{position:relative;height:100%}.com-video-nav .com-video-nav-list{box-sizing:border-box;position:absolute;left:0;right:0;top:0;bottom:61px;padding:10px 0;overflow-x:hidden;overflow-y:auto}.com-video-nav-item{box-sizing:border-box;display:table;table-layout:fixed;width:100%;padding:10px 20px}.com-video-nav-item .item-object{display:table-cell;vertical-align:top;width:134px;height:74px;position:relative}.com-video-nav-item .item-img{position:relative;display:block;width:100%;height:100%;background-size:cover;background-position:center}.com-video-nav-item .item-img:before{content:'';display:block;width:100%;height:100%;background-color:rgba(0,0,0,.4)}.com-video-nav-item .item-icon{display:none;box-sizing:border-box;position:absolute;left:50%;top:50%;margin:-12px 0 0 -12px;width:24px;height:24px;border:1px solid #fff;border-radius:50%}.com-video-nav-item .item-icon:before{content:'';position:absolute;left:50%;top:50%;margin:-5px 0 0 -4px;width:0;height:0;border-style:solid;border-color:transparent #fff;border-width:5px 0 5px 9px}.com-video-nav-item .item-status{position:absolute;right:8px;bottom:8px;width:12px;height:12px;background-image:url(sprite/Column-20199161611.svg);;background-position:97.83% 65.22%;background-size:2016.6666666666667% 1825%;;background-repeat:no-repeat}.com-video-nav-item .com-ani-playing{position:absolute;right:8px;bottom:8px;top:auto}.com-video-nav-item .item-main{display:table-cell;vertical-align:top;padding-left:10px}.com-video-nav-item .item-title{font-size:12px;line-height:22px;color:#000;font-weight:400;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2}.com-video-nav-item .item-time{display:block;margin-top:13px;font-size:12px;line-height:18px;color:#999;text-align:right}.com-video-nav-item:hover .item-img:before{display:none}.com-video-nav-item:hover .item-title{color:#00a4ff}.com-video-nav-item.actived{cursor:default}.com-video-nav-item.actived .item-img:before{display:block}.com-video-nav-item.actived .item-title{color:#00a4ff}.com-video-nav-ft{box-sizing:border-box;position:absolute;left:0;right:0;bottom:0;border-top:1px solid #E1E3E9;height:60px;padding:10px 20px}.com-video-nav-link{display:block;font-size:14px;line-height:40px;color:#000}.com-video-nav-link:hover{color:#00a4ff}.com-video-section{position:relative;height:470px;background-color:#fff;overflow:hidden}.com-video-section-main{margin-right:330px;height:100%;transition:all .3s ease-in-out}.com-video-section-side{position:absolute;right:0;top:0;z-index:10;width:330px;height:100%;transition:all .3s ease-in-out}.com-video-section-toggle{position:absolute;right:100%;top:56px;width:18px;height:32px;background-color:#000;font-size:0}.com-video-section-toggle:before{content:'';position:absolute;left:50%;top:50%;margin:-5px 0 0 -4px;width:9px;height:11px;background-image:url(sprite/Column-20199161611.svg);;transition:all .3s ease-in-out;background-position:56.220000000000006% 44.230000000000004%;background-size:2688.888888888889% 1990.909090909091%;;background-repeat:no-repeat}.com-video-section .com-video-player{height:100%}.com-video-section.hide .com-video-section-main{margin-right:0}.com-video-section.hide .com-video-section-side{transform:translateX(100%)}.com-video-section.hide .com-video-section-toggle:before{transform:rotate(180deg)}.com-topic-panel-hd{position:relative;padding-right:100px;line-height:32px}.com-topic-panel-title{font-size:18px;line-height:32px;color:#000;font-weight:400}.com-topic-panel-extra{position:absolute;right:0;top:0}.com-topic-panel-desc{margin-top:10px;font-size:14px;line-height:24px;color:#999;word-wrap:break-word}.com-topic-panel-desc p+p{margin-top:10px}.com-topic-panel .com-topic-resources{margin-top:15px}.com-2-user-panels{font-size:0}.com-2-user-panels>.panel-cell{display:inline-block;vertical-align:top;margin-right:60px;margin-bottom:40px}.com-2-user-panels.list2>.panel-cell{width:calc((100% - 60px - 1px)/ 2)}.com-2-user-panels.list2>.panel-cell:nth-child(2n){margin-right:0}.com-2-user-panel{display:table;table-layout:fixed;box-sizing:border-box;width:100%}.com-2-user-panel-side{display:table-cell;vertical-align:top;padding-right:20px;width:110px}.com-2-user-panel-main{display:table-cell;vertical-align:top}.com-2-user-panel .com-2-avatar{margin-bottom:7px;width:90px;height:90px}.com-2-user-panel-name{position:relative;display:inline-block;vertical-align:middle;box-sizing:border-box;max-width:100%;font-size:18px;line-height:24px;color:#000;font-weight:400}.com-2-user-panel-name.with-verify{padding-right:17px}.com-2-user-panel-name-inner{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:inherit}.com-2-user-panel-name .com-verification{position:absolute;right:0;top:6px;margin-right:0}.com-2-user-panel-identity{margin-top:3px;font-size:12px;line-height:18px;color:#999}.com-2-user-panel-desc{box-sizing:border-box;margin-bottom:20px;padding:20px;background-color:#F3F5F9;border-radius:0 16px 16px;font-size:14px;line-height:24px;color:#666;height:144px}.com-2-user-panel-desc p{display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:4;max-height:96px}.com-2-user-panel-skills-title{margin-bottom:10px;font-size:12px;line-height:18px;color:#999}.com-partners-wrap{margin:60px 0;text-align:center;font-size:0}.com-partners{position:relative;display:inline-block;vertical-align:middle;max-width:100%;box-sizing:border-box;padding-left:140px}.com-partners dt{position:absolute;left:0;top:0;padding-right:30px;font-size:16px;line-height:40px;color:#666}.com-partners dt:after{content:'';position:absolute;right:0;top:50%;margin-top:-13px;width:1px;height:26px;background-color:#DFE4EE}.com-partners dd{padding-top:6px;text-align:left}.com-partner{vertical-align:middle;height:30px;margin-left:35px;margin-bottom:20px}.com-2-article-panel{position:relative;box-sizing:border-box;padding:35px 25px 38px;background-color:#F3F5F9;height:250px;transition:box-shadow .3s linear}.com-2-article-panel:hover{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-2-article-panel>.panel-link{position:absolute;left:0;top:0;z-index:1;width:100%;height:100%}.com-2-article-panel-author{position:relative;z-index:2;margin-bottom:11px;font-size:0}.com-2-article-panel-author .author-link{color:#333}.com-2-article-panel-author .author-name{display:inline-block;vertical-align:middle;margin-left:7px;max-width:20em;font-size:12px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.com-2-article-panel-author .author-link:hover{color:#00a4ff}.com-2-article-panel-author .com-verification{margin:0 0 0 5px}.com-2-article-panel-title{margin-bottom:10px;font-size:18px;line-height:27px;font-weight:400;color:#333;display:block;display:-webkit-box;display:block;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:54px;white-space:nowrap}.com-2-article-panel-cnt{margin-bottom:0}.com-2-article-panel-cnt .com-media-object{padding-right:0;padding-left:15px;width:106px;vertical-align:top;padding-top:6px}.com-2-article-panel-cnt .com-thumbnail{width:106px;height:80px}.com-2-article-panel-desc{font-size:14px;line-height:24px;color:#999;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:3;max-height:72px}.com-2-article-panel-opts{position:static;margin-top:13px}.com-2-article-panel.large{padding-left:293px}.com-2-article-panel.large.without-img{padding-left:25px}.com-2-article-panel.large .com-2-article-panel-title{display:block;white-space:nowrap}.com-2-article-panel.large .com-2-article-panel-cnt{display:block}.com-2-article-panel.large .com-2-article-panel-cnt .com-media-body{padding:0}.com-2-article-panel.large .com-2-article-panel-desc{-webkit-line-clamp:3;max-height:72px}.com-2-article-panel.large .com-2-article-panel-cnt .com-media-object{position:absolute;left:30px;top:35px;display:block;padding-left:0}.com-2-article-panel.large .com-thumbnail{width:236px;height:177px}.com-2-article-panels{font-size:0;margin-bottom:-15px}.com-2-article-panels>.panel-cell{display:inline-block;vertical-align:middle;margin-right:15px;margin-bottom:15px;width:calc((100% - 15px * 2)/ 3)}.com-2-article-panels>.panel-cell:first-child{width:calc(100% - 15px - (100% - 15px * 2)/ 3)}.com-2-article-panels>.panel-cell:nth-child(3n+2){margin-right:0;width:calc((100% - 15px * 2)/ 3 - 1px)\9}.com-loading-placeholder.com-2-article-panel-loading{height:250px}.com-sub-section{margin-bottom:30px}.com-sub-section-hd{position:relative;padding-bottom:6px;border-bottom:1px solid #000}.com-sub-section-hd:before{content:'';position:absolute;left:0;bottom:-1px;width:80px;height:1px;background-color:#00a4ff}.com-sub-section-title{font-size:14px;line-height:20px;color:#666;font-weight:400}.com-sub-section-bd{padding:15px}.com-sub-section.bg-color .com-sub-section-bd{background-color:#F3F5F9}.com-timebar{margin:10px 20px 20px}.com-timebar-item{position:relative;padding:0 20px 15px 22px;border-left:1px solid #E1E3E9}.com-timebar-item:last-child{padding-bottom:0}.com-timebar-dot{position:absolute;left:-5px;top:6px;box-sizing:border-box;width:9px;height:9px;border-radius:50%;border:1px solid #999;background-color:#EFEFEF}.com-timebar-item:hover .com-timebar-dot{left:-6px;top:5px;width:11px;height:11px;border:1px solid #00a4ff;background-color:#fff}.com-timebar-item:hover .com-timebar-dot:before{content:'';position:absolute;left:2px;top:2px;width:5px;height:5px;border-radius:50%;background-color:#00a4ff}.com-timebar-infos{font-size:0;font-size:12px;line-height:23px;color:#999}.com-timebar-info:before{content:'';display:inline-block;vertical-align:middle;margin:0 5px;width:2px;height:2px;border-radius:2px;background-color:#666}.com-timebar-info:first-child:before{display:none}.com-timebar-title{margin-top:4px;font-size:14px;line-height:26px;color:#333;font-weight:400}.com-timebar-item:hover .com-timebar-title{color:#00a4ff}.com-loading-placeholder.com-timebar-loading.small{height:440px}.com-scroll{position:relative;overflow:hidden;height:440px;padding-top:10px}.com-scroll:after{content:'';position:absolute;left:0;bottom:0;width:100%;height:65px;background:linear-gradient(to top,rgba(255,255,255,1),rgba(255,255,255,0));pointer-events:none}.com-scroll.hide-mask:after{display:none}.com-scroll-cnt{margin-right:-18px;height:100%;overflow-x:hidden;overflow-y:scroll}.com-4-article-panels{font-size:0;margin-bottom:-10px}.com-4-article-panels>.panel-cell{display:inline-block;vertical-align:middle;margin-right:10px;margin-bottom:10px;width:calc((100% - 10px * 2 - 1px)/ 3)}.com-4-article-panels>.panel-cell:first-child{width:calc(66.6666% - 3px)}.com-4-article-panels>.panel-cell:nth-child(3n+2){margin-right:0}.com-loading-placeholder.com-4-article-panel-loading{height:162px}.com-4-article-panel{position:relative;box-sizing:border-box;padding:26px 20px;background-color:#F7F8FA;height:164px;transition:box-shadow .3s linear}.com-4-article-panel:hover{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-4-article-panel>.panel-link{position:absolute;left:0;top:0;z-index:1;width:100%;height:100%}.com-4-article-panel-title{margin-bottom:10px;font-size:18px;line-height:26px;font-weight:400;color:#333;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-4-article-panel-cnt{margin-bottom:0}.com-4-article-panel-cnt .com-media-object{padding-right:0;padding-left:15px;width:83px;vertical-align:top;padding-top:5px}.com-4-article-panel-cnt .com-thumbnail{width:83px;height:63px}.com-4-article-panel-desc{font-size:14px;line-height:22px;color:#999;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:44px}.com-4-article-panel-infos{margin-top:10px;font-size:0;line-height:20px}.com-4-article-panel-info{display:inline-block;vertical-align:middle;font-size:12px;color:#999}.com-4-article-panel-info em{margin-right:5px}.com-4-article-panel-author{position:relative;z-index:2;display:inline-block;vertical-align:middle;margin-right:20px}.com-4-article-panel-author .author-link{color:#999}.com-4-article-panel-author .com-2-avatar{width:20px;height:20px}.com-4-article-panel-author .author-name{display:inline-block;vertical-align:middle;margin-left:10px;max-width:5em;font-size:12px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.panel-cell:nth-child(n+3) .com-4-article-panel-author .author-name{max-width:12em}.com-4-article-panel-author .author-link:hover{color:#00a4ff}.com-4-article-panel-author .com-verification{margin:0 0 0 5px}.com-4-article-panel.large{padding-left:190px}.com-4-article-panel.large.without-img{padding-left:20px}.com-4-article-panel.large .com-4-article-panel-title{margin-bottom:5px}.com-4-article-panel.large .com-4-article-panel-cnt{display:block}.com-4-article-panel.large .com-4-article-panel-cnt .com-media-body{padding:0}.com-4-article-panel.large .com-4-article-panel-cnt .com-media-object{position:absolute;left:20px;top:26px;display:block;padding-left:0;padding-top:0;width:auto}.com-4-article-panel.large .com-thumbnail{width:146px;height:109px}.com-4-article-panel.large .com-4-article-panel-infos{margin-top:12px}.com-4-article-panel.large .com-4-article-panel-author .author-name{max-width:15em}.com-salon-panel{position:relative;box-sizing:border-box;padding:56px 0 31px;height:230px;background-color:#F3F5F9;transition:box-shadow .3s linear}.com-salon-panel:hover{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-salon-panel .panel-link{position:absolute;left:0;top:0;z-index:1;width:100%;height:100%}.com-salon-panel-hd{box-sizing:border-box;position:absolute;left:0;top:0;padding:15px 25px 0;width:100%;height:56px;overflow:hidden;background-position:right -40px;background-repeat:no-repeat;background-size:220px auto}.com-salon-panel-city{font-size:40px;line-height:44px;font-weight:400;color:#E1E3E9;font-style:italic}.com-salon-panel-bd{box-sizing:border-box;height:100%;position:relative;background-color:#fff;padding:20px 25px;border:1px solid #F4F4F5}.com-salon-panel-title{position:relative;font-size:18px;line-height:27px;color:#333;font-weight:400;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:54px}.com-salon-panel-infos{margin-top:12px;font-size:0}.com-salon-panel-infos .com-icon-datas{display:inline-block;vertical-align:middle;margin-right:20px}.com-salon-panel-btns{margin-top:20px}.com-salon-panel-btns .panel-btn{position:absolute;right:25px;bottom:-13px}.com-salon-panel-btns .com-2-avatar:nth-child(n+4){display:none}.com-salon-panel.large{padding:28px 25px 25px;height:194px;overflow:hidden}.com-salon-panel.large .com-salon-panel-hd{display:none}.com-salon-panel.large .com-salon-panel-img{position:absolute;right:0;top:0;width:100%;height:100%;background-position:right bottom;background-repeat:no-repeat;background-size:auto 100%}.com-salon-panel.large .com-salon-panel-bd{position:static;padding:0;background-color:transparent;border:none}.com-salon-panel.large .com-salon-panel-title{max-width:270px}.com-salon-panel.large .com-mark-skew{position:absolute;right:25px;top:0}.com-salon-panel.large .com-salon-panel-btns{position:absolute;left:25px;right:25px;bottom:25px}.com-salon-panel.large .panel-btn{position:relative;left:0;top:0;margin-right:15px}.com-salon-panel.large .com-2-avatars-group{display:inline-block;vertical-align:middle}.com-salon-panel.large .com-2-avatars{display:none}.com-salon-panels{font-size:0;margin-bottom:-15px}.com-salon-panels>.panel-cell{display:inline-block;vertical-align:middle;margin-right:15px;margin-bottom:15px;width:calc((100% - 15px * 2)/ 3)}.com-salon-panels>.panel-cell:nth-child(1),.com-salon-panels>.panel-cell:nth-child(2){width:calc((100% - 15px)/ 2)}.com-salon-panels>.panel-cell:nth-child(3n+2){margin-right:0}.com-salon-panels>.panel-cell:nth-child(3n+5){width:calc((100% - 15px * 2)/ 3 - 1px)\9}.com-loading-placeholder.com-salon-panel-loading{height:230px}.com-loading-placeholder.com-salon-panel-loading.large{height:194px}.com-user-panel{position:relative;box-sizing:border-box;height:275px}.com-user-panel-summary{opacity:1;transition:all .3s linear;transition-delay:.2s}.com-user-panel:hover .com-user-panel-summary{opacity:0}.com-user-panel-hd{box-sizing:border-box;padding:0 20px;height:175px;border-bottom:1px solid #EEEEEF}.com-user-panel-hd .com-2-avatar{display:block;width:90px;height:90px}.com-user-panel-title{position:relative;box-sizing:border-box;display:inline-block;vertical-align:middle;max-width:100%;margin-top:16px;font-weight:400}.com-user-panel-title.with-verify{padding-right:17px}.com-user-panel-title-inner{font-size:18px;line-height:25px;color:#333;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-user-panel-title .com-verification{position:absolute;right:0;top:7px;margin-right:0;white-space:normal}.com-user-panel-title .com-verification .c-bubble-left,.com-user-panel-title .com-verification .c-bubble-right{width:160px}.com-user-panel-identity{position:relative;box-sizing:border-box;margin-top:8px;font-size:12px;line-height:18px;color:#999;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-user-panel-bd{padding:20px 20px 0}.com-user-panel-skills{margin-top:17px}.com-user-panel-skills>dt{font-size:12px;line-height:18px;color:#999}.com-user-panel-skills>dd{margin-top:8px}.com-user-panel-skills .com-tag-v2{margin-bottom:8px}.com-user-panel-detail{position:absolute;left:0;top:0;box-sizing:border-box;width:100%;height:100%;background-color:#fff;opacity:0;-ms-transform:translateY(10px);-webkit-transform:translateY(10px);transform:translateY(10px);transition:all .3s linear;transition-delay:.2s;border:1px solid #E1E3E9}.com-user-panel:hover .com-user-panel-detail{opacity:1;-ms-transform:translateY(0);-webkit-transform:translateY(0);transform:translateY(0);will-change:transform,opacity;z-index:900}.com-user-panel-detail>.panel-link{position:absolute;left:0;top:0;z-index:1;width:100%;height:100%}.com-user-panel-detail .com-user-panel-hd{position:relative;padding-top:20px;padding-left:82px;height:110px;background-color:#F3F5F9}.com-user-panel-detail .com-2-avatar{position:absolute;left:25px;top:26px;width:45px;height:45px}.com-user-panel-detail .com-user-panel-title{margin-top:0}.com-user-panel-detail:hover .com-user-panel-title-inner{color:#00a4ff}.com-user-panel-detail:hover .com-verification{z-index:900}.com-user-panel-detail .com-user-panel-identity{display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:36px;white-space:normal}.com-user-panel-detail .com-user-panel-bd{position:absolute;left:0;top:110px;right:0;bottom:0;box-sizing:border-box;background-color:#fff;padding:20px}.com-user-panel-detail .com-user-panel-desc{font-size:12px;line-height:21px;color:#000;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:4;max-height:84px}.com-user-panel-detail .com-user-panel-skills{margin-top:10px}.com-user-panel-btns{position:absolute;left:0;right:0;bottom:17px;z-index:2;text-align:center}.com-user-panel-btns .c-btn{padding:0 12px;min-width:80px;height:26px;font-size:12px;line-height:26px}.com-user-panel-btns .c-btn-hole{line-height:24px}.com-user-panels-wrap{position:relative;padding-left:40px;padding-right:40px}.com-user-panels-cnt{overflow:hidden}.com-user-panels{font-size:0;white-space:nowrap;text-align:center}.com-user-panels>.panel-cell{display:inline-block;vertical-align:top;margin-left:18px;margin-right:18px;width:213px;white-space:normal;text-align:left}.com-user-panels>.panel-cell:first-child{margin-left:0}.com-user-panels-pages .com-page-btn{position:absolute;top:50%;margin:-12px 0 0}.com-user-panels-pages .com-page-btn.prev{left:0}.com-user-panels-pages .com-page-btn.next{right:0}.com-loading-placeholder.com-user-panel-loading{height:275px}.com-special-list-wrap{position:relative;box-sizing:border-box;height:410px;padding:0 15px 0 30px;border:1px solid #E1E3E9}.com-special-thumbnail{position:absolute;right:15px;top:15px;width:382px;height:378px;background-size:cover;background-position:center;transition:background-image .2s linear}.com-special-list{margin-right:440px}.com-special{box-sizing:border-box;position:relative;display:block;padding:25px 0;height:72px;overflow:hidden;transition:height .5s}.com-special-title{font-size:16px;line-height:22px;font-weight:400;color:#666;cursor:pointer}.com-special-title-inner{box-sizing:border-box;position:relative;display:inline-block;vertical-align:middle;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-special-title.with-mark .com-special-title-inner{padding-right:60px}.com-special-title .com-mark-rec{position:absolute;right:0;top:0;font-weight:400}.com-special-detail{box-sizing:border-box;position:absolute;left:0;top:0;padding:25px 0;width:100%;height:100%;opacity:0;visibility:hidden}.com-special-detail .com-special-title{font-size:22px;line-height:30px;font-weight:400;color:#333;cursor:text}.com-special-detail .com-special-desc{margin-top:14px;font-size:14px;line-height:24px;color:#999;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:48px}.com-special-detail .com-arrow-btn{margin-top:15px}.com-special-process{position:absolute;left:0;bottom:0;width:100%;height:1px;background-color:#E1E3E9}.com-special-process .process-bar{position:absolute;left:0;bottom:0;height:1px;width:100%;background-color:#00a4ff;display:none;transform:scaleX(0);transform-origin:left}.com-special-list.ani .process-bar{animation:width 10s linear}.com-special.actived{height:193px}.com-special.actived .com-special-summary{opacity:0}.com-special.actived .com-special-detail{opacity:1;visibility:visible}.com-special.actived .com-special-process .process-bar{display:block}.com-loading-placeholder.com-special-list-loading{height:406px}.com-team-panel{position:relative;box-sizing:border-box;height:550px;border:1px solid #E1E3E9;background-color:#fff}.com-team-panel .com-mark-triangle{position:absolute;left:0;top:0}.com-team-panel-hd{padding:30px 0 20px;text-align:center}.com-team-panel-title{font-size:18px;line-height:24px;color:#333;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-team-panel .com-2-avatars{margin-top:15px}.com-team-panel .com-vertical-datas{margin-top:20px}.com-team-panel .com-vertical-data{width:33.3333%}.com-team-panel .com-vertical-data:last-child{text-align:center}.com-team-panel-bd{padding:0 15px}.com-team-panel-subtitle{position:relative;margin-bottom:20px;font-size:12px;line-height:18px;color:#00a4ff;font-weight:400}.com-team-panel-subtitle:before{content:'';position:absolute;left:0;top:50%;width:100%;height:1px;background-color:#00A4FF;background:linear-gradient(to left,rgba(0,209,255,0) 0,rgba(0,164,255,1) 72%)}.com-team-panel-subtitle .text{position:relative;box-sizing:border-box;display:inline-block;vertical-align:middle;padding-right:17px;background-color:#fff}.com-team-panel-articles>li{margin-bottom:10px}.com-team-panel-article{margin-bottom:15px}.com-team-panel-article-cat{font-size:12px;line-height:18px;color:#999}.com-team-panel-article-cat .icon{position:relative;top:-1px;display:inline-block;vertical-align:middle;width:16px;height:16px;margin-right:5px}.com-team-panel-article-cat .icon.article{background-image:url(sprite/Column-20199161611.svg);;background-position:41.15% 67%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.com-team-panel-article-cat .icon.ask{background-image:url(sprite/Column-20199161611.svg);;background-position:75.66000000000001% 18.23%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.com-team-panel-article-cat .icon.action{background-image:url(sprite/Column-20199161611.svg);;background-position:75.66000000000001% 44.83%;background-size:1512.5% 1368.75%;;background-repeat:no-repeat}.com-team-panel-article-title{margin-top:8px;font-size:14px;line-height:24px;color:#333;font-weight:400;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:48px}.com-team-panel-article:hover .com-team-panel-article-title{color:#00a4ff}.com-team-panel-article .com-media-object{padding-right:0;padding-left:15px;width:106px}.com-team-panel-article .com-thumbnail{width:106px;height:80px}.com-team-panel-ft{position:absolute;left:0;bottom:0;width:100%;background-color:#F3F5F9;font-size:0}.com-team-panel-ft .ft-btn{display:inline-block;vertical-align:middle;width:100%;font-size:14px;line-height:46px;height:46px;text-align:center;color:#333}.com-team-panel-ft .ft-btn:hover{background-color:#00a4ff;color:#fff}.com-team-panels{font-size:0}.com-team-panels>.panel-cell{display:inline-block;vertical-align:top;margin-right:20px;width:calc((100% - 1px - 20px * 2)/ 3)}.com-team-panels>.panel-cell:last-child{margin-right:0}.com-loading-placeholder.com-team-panel-loading{height:550px}.com-2-ask-panel{position:relative;margin-top:20px;padding:30px 30px 17px;border:1px solid #E1E3E9}.com-2-ask-panel:before{content:'';position:absolute;left:20px;top:-1px;width:47px;height:1px;background-color:#fff}.com-2-ask-panel:after{content:'';position:absolute;left:29px;top:-11px;width:28px;height:26px;background-image:url(sprite/Column-20199161611.svg);;background-position:0.47000000000000003% 55.96%;background-size:864.2857142857142% 842.3076923076924%;;background-repeat:no-repeat}.com-2-ask-panel-hd{position:relative;padding-right:200px}.com-2-ask-panel-title{font-size:18px;line-height:21px;font-weight:400;color:#333;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-ask-panel-title a{color:inherit}.com-2-ask-panel-title a:hover{color:#00a4ff}.com-2-ask-panel-hd-extra{position:absolute;right:0;top:0;font-size:12px;line-height:21px;color:#999}.com-2-ask-panel-bd{position:relative;margin-top:17px;padding-left:160px;min-height:150px}.com-2-ask-panel-author{position:absolute;left:0;top:0;width:150px}.com-2-ask-panel-author .com-2-avatar{display:block;width:90px;height:90px}.com-2-ask-panel-author-name{position:relative;display:inline-block;vertical-align:middle;max-width:100%;box-sizing:border-box;margin-top:14px;font-size:18px;line-height:25px;color:#333;font-weight:500}.com-2-ask-panel-author-name.with-verify{padding-right:20px}.com-2-ask-panel-author:hover .com-2-ask-panel-author-name{color:#00a4ff}.com-2-ask-panel-author-name .name{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-ask-panel-author-name .com-verification{position:absolute;right:0;top:7px}.com-2-ask-panel-identity{margin-top:3px;font-size:13px;line-height:18px;color:#999;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-ask-panel-answer{box-sizing:border-box;background-color:#F3F5F9;border-radius:0 18px 18px;padding:22px 19px;margin-bottom:0;border:1px solid transparent}.com-2-ask-panel-answer:hover{border-color:#D2D9E7}.com-2-ask-panel-answer .com-media-body{height:106px}.com-2-ask-panel-answer-cnt{margin-top:-5px;font-size:14px;line-height:24px;color:#666;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:3;max-height:72px}.com-2-ask-panel-answer-opts{margin-top:16px}.com-2-ask-panel-answer .com-media-object{padding-right:0;padding-left:40px;width:192px}.com-2-ask-panel-answer .com-thumbnail{width:192px;height:106px}.com-loading-placeholder.com-2-ask-panel-loading{margin-top:20px;height:239px}.com-2-ask-panels>.panel-cell+.panel-cell{margin-top:30px}.com-2-doc-panel{display:table;table-layout:fixed;width:100%;height:90px;background-color:#f7f8fa;transition:box-shadow .2s}.com-2-doc-panel:hover{box-shadow:0 0 6px rgba(0,0,0,.1),0 4px 6px rgba(0,0,0,.1)}.com-2-doc-panel-hd{position:relative;display:table-cell;vertical-align:middle;width:90px;height:90px;text-align:center;overflow:hidden}.com-2-doc-panel .com-mark-triangle{position:absolute;left:0;top:0;z-index:1;width:36px;height:36px}.com-2-doc-panel .com-mark-triangle:before{border-width:18px}.com-2-doc-panel .com-mark-triangle .mark-cnt{margin-top:-15px;margin-left:-7px;-webkit-transform:rotate(-45deg) scale(.8333);-ms-transform:rotate(-45deg) scale(.8333);transform:rotate(-45deg) scale(.8333)}.com-2-doc-panel-img{position:relative;top:-1px;vertical-align:middle;width:90px;height:90px}.com-2-doc-panel-bd{display:table-cell;vertical-align:middle;padding:15px}.com-2-doc-panel-title{font-size:16px;line-height:22px;font-weight:500;color:#333;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-doc-panel-desc{font-size:12px;line-height:18px;color:#999;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-doc-panel.large{display:block;height:307px}.com-2-doc-panel.large .com-2-doc-panel-hd{display:block;line-height:90px;width:auto}.com-2-doc-panel.large .com-2-doc-panel-bd{display:block;padding:15px 30px}.com-2-doc-panel-outline{margin-top:10px;font-size:14px;line-height:24px;color:#333}.com-2-doc-panel-outline li{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-doc-panel-outline li:last-child{margin-top:-4px}.com-2-doc-panels-wrap{font-size:0}.com-2-doc-panels-wrap>.wrap-cell{display:inline-block;vertical-align:top;box-sizing:border-box;margin-right:16px;width:calc((100% - 16px)/ 2)}.com-2-doc-panels-wrap>.wrap-cell:last-child{margin-right:0}.com-2-doc-panels-wrap .com-2-avatars-group{display:none;margin-top:13px}.com-2-doc-panels{margin-bottom:-18px}.com-2-doc-panels>.panel-cell{display:inline-block;vertical-align:top;margin-right:12px;margin-bottom:18px;width:calc((100% - 12px)/ 2)}.com-2-doc-panels>.panel-cell:nth-child(2n){margin-right:0}.com-2-doc-panels.large{margin-bottom:0}.com-2-doc-panels.large>.panel-cell{margin-bottom:0;margin-right:16px;width:calc((100% - 16px)/ 2)}.com-2-doc-panels.large>.panel-cell:nth-child(2n){margin-right:0}.com-2-doc-panels.cols-3>.panel-cell{margin-right:20px;margin-bottom:20px;width:calc((100% - 20px * 2)/ 3)}.com-2-doc-panels.cols-3>.panel-cell:nth-child(2n){margin-right:20px}.com-2-doc-panels.cols-3>.panel-cell:nth-child(3n){margin-right:0}.com-loading-placeholder.com-2-doc-panel-loading{height:90px}.com-loading-placeholder.com-2-doc-panel-loading.large{height:307px}.com-2-doc-panels-wrap.v2 .com-2-doc-panel{background-color:#f7f8fa;height:80px}.com-2-doc-panels-wrap.v2 .com-loading-placeholder.com-2-doc-panel-loading{height:80px}.com-2-doc-panels-wrap.v2 .com-2-doc-panel-hd{width:80px;height:80px;background-color:#eef1f5}.com-2-doc-panels-wrap.v2 .com-2-doc-panel-img{width:80px;height:80px}.com-2-doc-panels-wrap.v2 .com-2-doc-panel-bd{padding:10px 20px}.com-2-doc-panels-wrap.v2 .com-2-doc-panel.large{height:260px}.com-2-doc-panels-wrap.v2 .com-2-doc-panel.large .com-2-doc-panel-hd{width:auto}.com-2-doc-panels-wrap.v2 .com-loading-placeholder.com-2-doc-panel-loading.large{height:260px}.com-2-doc-panels-wrap.v2>.wrap-cell{margin-right:10px;width:calc((100% - 10px - 1px)/ 2)}.com-2-doc-panels-wrap.v2>.wrap-cell:last-child{margin-right:0}.com-2-doc-panels-wrap.v2 .com-2-doc-panels>.panel-cell{margin-right:10px;margin-bottom:10px}.com-2-doc-panels-wrap.v2 .com-2-doc-panels>.panel-cell:nth-child(2n){margin-right:0;width:calc((100% - 10px - 1px)/ 2)}.com-2-doc-panels-wrap.v2 .com-2-doc-panels.large>.panel-cell{margin-right:10px;width:calc((100% - 10px - 1px)/ 2)}.com-2-doc-panels-wrap.v2 .com-2-doc-panels.large>.panel-cell:last-child{margin-right:0}.com-owner-panel{margin-bottom:40px;padding-top:48px;width:330px;height:175px}.com-owner-panel-inner{position:relative;box-sizing:border-box;padding:12px 20px 0;width:100%;height:100%;background-color:#fff;border:1px solid #e5e5e5}.com-owner-panel .com-2-avatar{position:absolute;left:20px;top:-48px}.com-owner-panel-hd{padding-left:131px;min-height:66px}.com-owner-panel-title{font-size:18px;line-height:25px;color:#000;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-owner-panel-title a{color:inherit}.com-owner-panel-title a:hover{color:#00a4ff}.com-owner-panel-identity{font-size:14px;line-height:20px;color:#666;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:40px}.com-owner-panel .com-emblem-list{margin-top:5px}.com-owner-panel .com-emblem-list>li{margin-left:0;margin-right:5px}.com-owner-panel-level-title{display:inline-block;vertical-align:middle;font-size:12px;line-height:18px;color:#00a4ff}.com-owner-panel-level-infos{margin-top:10px}.com-owner-panel-process{display:inline-block;vertical-align:middle;margin-right:10px;width:220px}.com-owner-panel-datas{margin-top:20px;display:table;width:100%;padding:0 2px}.com-owner-panel-datas>li{display:table-cell;vertical-align:top;width:50%;text-align:left}.com-owner-panel-data{display:inline-block;vertical-align:top;text-align:center;white-space:nowrap;font-size:13px;line-height:18px;color:#333}.com-owner-panel-data:hover{color:#00a4ff}.com-owner-panel-data .icon{display:inline-block;vertical-align:middle;margin-right:10px;width:24px;height:24px}.com-owner-panel-data .icon.follow{background-image:url(sprite/Column-20199161611.svg);;background-position:47.25% 24.099999999999998%;background-size:1008.3333333333334% 912.5%;;background-repeat:no-repeat}.com-owner-panel-data .icon.column{background-image:url(sprite/Column-20199161611.svg);;background-position:26.150000000000002% 55.379999999999995%;background-size:1008.3333333333334% 912.5%;;background-repeat:no-repeat}.com-owner-panel-data .icon.activities{background-image:url(sprite/Column-20199161611.svg);;background-position:14.219999999999999% 55.379999999999995%;background-size:1008.3333333333334% 912.5%;;background-repeat:no-repeat}.com-owner-panel-data .title{display:inline-block;vertical-align:middle;font-weight:400}.com-owner-panel-data.has-msg .title{position:relative}.com-owner-panel-data.has-msg .title:after{content:'';position:absolute;left:100%;top:50%;margin-top:-3px;margin-left:5px;width:6px;height:6px;border-radius:50%;background-color:#FF7800}.com-login-panel{box-sizing:border-box;margin-top:48px;margin-bottom:40px;padding:20px;width:330px;height:175px;background-color:#fff;border:1px solid #D2D9E7;font-size:18px;line-height:24px;color:#999;text-align:center}.com-login-panel .login-tip{margin-bottom:20px}.com-login-panel .c-btn{min-width:205px;height:40px;line-height:40px}.com-login-panel .c-btn-hole{margin-top:10px;line-height:38px}.com-hero-event{display:block;box-sizing:border-box;padding:10px 20px;margin-left:-1px;margin-right:-1px;height:134px;text-align:center;background-color:#fff;transition:box-shadow .3s linear}.com-hero-event-img{display:block;margin:0 auto;width:44px;height:44px}.com-hero-event-title{display:inline-block;vertical-align:middle;padding-bottom:2px;max-width:100%;margin-top:10px;font-size:18px;line-height:28px;font-weight:400;color:#333;border-bottom:1px solid #00a4ff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-hero-event-title em{color:#00a4ff;font-weight:500}.com-hero-event-title .tag{position:relative;top:-2px;display:inline-block;vertical-align:middle;box-sizing:border-box;margin-right:5px;padding:0 8px;height:20px;border-radius:2px;border:1px solid #FF7200;font-size:12px;line-height:18px;color:#FF7200}.com-hero-event-desc{margin-top:6px;font-size:12px;line-height:21px;color:#666;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-hero-event:hover{position:relative;z-index:2;box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-hero-events{margin-bottom:40px;display:table;table-layout:fixed;width:100%}.com-hero-events>.event-cell{position:relative;display:table-cell;vertical-align:top}.com-hero-events>.event-cell:first-child{padding-left:0}.com-hero-events>.event-cell:last-child{padding-right:0}.com-hero-events>.event-cell:before{content:'';position:absolute;left:0;top:50%;margin-top:-40px;width:1px;height:80px;background-color:#E1E3E9}.com-hero-events>.event-cell:first-child:before{display:none}.com-v2-multi-selector{position:relative;display:inline-block}.com-v2-multi-selector.block{display:block}.com-v2-dropdown-link{display:block;box-sizing:border-box;width:100%;height:44px;padding:0 40px 0 15px;background-color:#fff;border:1px solid #e5e5e5;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:left;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.65,.05,.36,1);font-size:14px;line-height:42px;color:#000}.com-v2-dropdown-link .caret{position:absolute;right:15px;top:50%;margin-top:-4px;width:15px;height:8px;background-image:url(sprite/Column-20199161611.svg);;transition:all .2s linear;background-position:99.11999999999999% 34.599999999999994%;background-size:1613.3333333333333% 2737.5%;;background-repeat:no-repeat}.com-v2-multi-selector.opened .com-v2-dropdown-link .caret{transform:rotate(180deg)}.com-v2-dropdown-menu{width:100%;min-width:470px;border:1px solid #e5e5e5;background-color:#fff;position:absolute;top:100%;left:0;z-index:1;margin-top:5px;box-sizing:border-box}.com-v2-dropdown-menu .com-v2-dropdown-tab-hd .tab-btn{color:#444;height:52px;line-height:52px;padding:0 30px;border-right:1px solid #e5e5e5;display:inline-block;font-size:14px}.com-v2-dropdown-menu .com-v2-dropdown-tab-hd .tab-btn.cur{border-bottom:1px solid #fff}.com-v2-dropdown-menu .com-v2-dropdown-tab-hd{font-size:0;margin-bottom:-1px}.com-v2-dropdown-menu .com-v2-dropdown-tab-hd .tab-btn:hover{text-decoration:none}.com-v2-dropdown-menu .com-v2-dropdown-tab-hd+.com-v2-dropdown-tab-bd{border-top:1px solid #e5e5e5}.com-v2-dropdown-menu .com-v2-dropdown-tab-bd{padding:5px 15px;max-height:320px;overflow-x:hidden;overflow-y:auto}.com-v2-dropdown-menu .area-list{font-size:0}.com-v2-dropdown-menu .area-list li{display:inline-block;padding-right:10px;width:50%;font-size:12px;box-sizing:border-box;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.com-v2-dropdown-menu .area-list li a{height:44px;line-height:44px;box-sizing:border-box;display:block;padding:0 13px;color:#000}.com-v2-dropdown-menu .area-list+.area-list{border-top:1px solid #e5e5e5;padding-top:5px}.com-v2-dropdown-menu .area-list li a:hover{background-color:#F2F2F2;text-decoration:none}.com-v2-dropdown-menu .area-list li.cur a{color:#fff;background-color:#00a4ff}.com-full-layout{box-sizing:border-box;position:relative;min-width:1000px;background-color:#F3F5F9}.com-full-layout:before{content:'';position:absolute;left:50%;right:0;top:0;bottom:0;background-color:#fff}.com-full-layout>.layout-inner{box-sizing:border-box;position:relative;margin:0 auto;max-width:1200px;height:100%}.com-full-layout-aside{box-sizing:border-box;position:fixed;top:96px;bottom:0;z-index:300;padding:30px 10px;width:200px;background-color:#F3F5F9;overflow:auto}.com-full-layout-main{box-sizing:border-box;position:relative;margin-left:200px;min-height:100%;background-color:#fff;padding:20px 10px 20px 30px}.com-full-layout-hd{margin-bottom:20px}.com-full-layout-title{font-size:22px;line-height:45px;color:#000;font-weight:400}.com-full-layout-desc{margin-top:5px;font-size:14px;line-height:24px;color:#666}.com-crumb.com-full-layout-crumb{margin-top:0;margin-bottom:10px}.com-full-layout-crumb .com-inner{padding:0 0 0 20px}.com-full-layout-nav>li{position:relative;padding:20px;border-bottom:1px solid #D2D9E7}.com-full-layout-nav>li:last-child{border-bottom:none}.com-full-layout-nav .nav-item{display:block;font-size:14px;line-height:24px;color:#333;text-decoration:none}.com-full-layout-nav a.nav-item:hover{color:#00a4ff}.com-full-layout-nav>.actived:after{content:'';position:absolute;left:0;bottom:-1px;width:80px;height:1px;background-color:#00a4ff}.com-full-layout-nav>.actived .nav-item{color:#00a4ff;cursor:default}.com-full-layout-nav .nav-tags{margin-top:15px;margin-right:-30px;padding-right:30px;overflow-x:hidden;overflow-y:auto}.com-full-layout-nav .nav-tags>li{display:block;margin-bottom:15px}.com-full-layout-nav .nav-tags .com-tag-v2{display:inline-block;vertical-align:middle;max-width:100%;margin:0}.com-full-layout-nav .nav-tags-more{margin-top:10px}.com-full-layout-nav .nav-tags-more a{color:#999}.com-full-layout-nav .nav-tags-more a:hover{color:#00a4ff}.com-full-layout-search{margin-bottom:18px}.com-2-hero{padding-top:10px;margin-bottom:30px}.com-2-hero-inner{margin:0 auto}.com-2-hero-list{font-size:0}.com-2-hero-list>.hero-cell{box-sizing:border-box;display:inline-block;vertical-align:middle;width:33.33%}.com-2-hero-list>.hero-cell:nth-child(2){padding:0 10px}.com-2-hero-item{position:relative;box-sizing:border-box;display:block;height:280px;background-color:#79a8ff;background-position:center right;background-repeat:no-repeat;background-size:auto 100%;color:#fff;overflow:hidden}.com-2-hero-item-img{position:absolute;left:0;right:0;top:0;height:100%;background-position:center right;background-repeat:no-repeat;background-size:auto 100%;-webkit-transition:-webkit-transform .3s ease-in-out;transition:-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out;transition:transform .3s ease-in-out,-webkit-transform .3s ease-in-out}.com-2-hero-item:hover .com-2-hero-item-img{-webkit-transform:scale(1.025);transform:scale(1.025)}.com-2-hero-item-mark-wrap{margin-bottom:20px;min-height:20px}.com-2-hero-item-mark{display:inline-block;vertical-align:middle;padding:0 5px;height:20px;font-size:12px;line-height:20px;background-color:#00A4FF;border-radius:2px;color:#fff}.com-2-hero-item-mark.white{background-color:#fff;color:#00a4ff}.com-2-hero-item-cnt{position:relative;padding:60px 45px 0;height:187px}.com-2-hero-item-title{margin-bottom:20px;font-size:28px;line-height:36px;font-weight:400;max-width:350px;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:72px}.com-2-hero-item-desc{margin-top:4px;font-size:14px;line-height:24px;max-width:350px;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-hero-item-btns{display:none;position:absolute;left:45px;bottom:0;margin-top:20px}.com-2-hero-item.black{background-color:#e6e9ee;color:#000}.com-3-user-panel{position:relative;box-sizing:border-box;height:210px;text-align:center;padding:20px 10px}.com-3-user-panel .panel-link{position:absolute;left:0;top:0;z-index:1;width:100%;height:100%}.com-3-user-panel .com-2-avatar{display:block;margin:0 auto;width:80px;height:80px;transition:all .3s ease-in-out}.com-3-user-panel-title{position:relative;box-sizing:border-box;display:inline-block;vertical-align:middle;max-width:100%;margin-top:10px;font-weight:400}.com-3-user-panel-title.with-verify{padding-right:17px}.com-3-user-panel-title-inner{font-size:18px;line-height:25px;color:#333;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-3-user-panel-title .com-verification{position:absolute;right:0;top:7px;margin-right:0;white-space:normal}.com-3-user-panel:hover .com-verification{z-index:900}.com-3-user-panel-title .com-verification .c-bubble{width:160px;margin-left:-80px}.com-3-user-panel-identity{position:relative;box-sizing:border-box;margin-top:5px;font-size:12px;line-height:18px;color:#999;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-3-user-panel-skills{font-size:12px;line-height:18px;color:#999;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;height:0;transition:all .3s ease-in-out}.com-3-user-panel-btns{position:absolute;left:0;bottom:15px;z-index:2;width:100%}.com-3-user-panel-btns .c-btn{padding:0 12px;min-width:80px;height:28px;font-size:12px;line-height:26px}.com-3-user-panel:hover{padding-top:15px;background-color:#F7F8FA}.com-3-user-panel:hover .com-2-avatar{width:50px;height:50px}.com-3-user-panel:hover .com-3-user-panel-skills{height:36px}.com-3-user-panels-wrap{position:relative;padding-left:40px;padding-right:40px}.com-3-user-panels-cnt{height:210px;overflow:hidden}.com-3-user-panels{font-size:0}.com-3-user-panels>.panel-cell{display:inline-block;vertical-align:top;box-sizing:border-box;white-space:normal;text-align:left;margin-left:20px;width:calc((100% - 20px * 4 - 1px)/ 5)}.com-3-user-panels>.panel-cell:first-child{margin-left:0}.com-3-user-panels-pages .com-page-btn{position:absolute;top:50%;margin:-21px 0 0;width:42px;height:42px;text-align:center;line-height:42px}.com-3-user-panels-pages .com-page-btn .btn-icon{display:inline-block;vertical-align:middle;width:24px;height:24px}.com-3-user-panels-pages .com-page-btn.prev{left:0}.com-3-user-panels-pages .com-page-btn.next{right:0}.com-loading-placeholder.com-3-user-panel-loading{height:210px}.com-2-special-list-wrap{position:relative;box-sizing:border-box;height:294px;background-color:#F7F8FA}.com-2-special-thumbnail{position:absolute;left:0;top:0;width:280px;height:100%;background-size:cover;background-position:center;transition:background-image .2s linear}.com-2-special-list{margin-right:25px;margin-left:300px;padding-top:10px}.com-2-special{box-sizing:border-box;position:relative;display:block;padding:10px 0;height:41px;overflow:hidden;transition:height .5s}.com-2-special-title{font-size:14px;line-height:20px;font-weight:400;color:#666;cursor:pointer}.com-2-special-title-inner{box-sizing:border-box;position:relative;display:inline-block;vertical-align:middle;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-special-title.with-mark .com-2-special-title-inner{padding-right:60px}.com-2-special-title .com-mark-rec{position:absolute;right:0;top:-2px;font-weight:400}.com-2-special-detail{box-sizing:border-box;position:absolute;left:0;top:0;padding:10px 0 20px;width:100%;height:100%;opacity:0;visibility:hidden}.com-2-special-detail .com-2-special-title{font-size:24px;line-height:34px;font-weight:500;color:#000;cursor:text}.com-2-special-detail .com-mark-rec{top:5px}.com-2-special-detail .com-2-special-desc{margin-top:10px;font-size:12px;line-height:22px;color:#333;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:44px}.com-2-special-detail .com-arrow-btn{margin-top:10px}.com-2-special-process{position:absolute;left:0;bottom:0;width:100%;height:1px;background-color:#E1E3E9}.special-cell:last-child .com-2-special-process{background-color:transparent}.com-2-special-process .process-bar{position:absolute;left:0;bottom:0;height:1px;width:100%;background-color:#00a4ff;display:none;transform:scaleX(0);transform-origin:left}.com-2-special-list.ani .process-bar{animation:width 10s linear}@keyframes width{0%{transform:scaleX(0)}100%{transform:scaleX(1)}}.com-2-special.actived{height:154px}.com-2-special.actived .com-2-special-summary{opacity:0}.com-2-special.actived .com-2-special-detail{opacity:1;visibility:visible}.com-2-special.actived .com-2-special-process .process-bar{display:block}.com-loading-placeholder.com-2-special-list-loading{height:294px}.com-2-team-panel{position:relative;box-sizing:border-box;height:345px;background-color:#f7f8fa}.com-2-team-panel .com-mark-triangle{position:absolute;left:0;top:0}.com-2-team-panel-hd{padding:30px 20px 20px;text-align:center}.com-2-team-panel-title{font-size:18px;line-height:24px;color:#333;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-team-panel .com-2-avatars{margin-top:15px}.com-2-team-panel .com-2-avatar{width:32px;height:32px}.com-2-team-panel .com-datas{margin-top:20px}.com-2-team-panel-bd{padding:0 20px}.com-2-team-panel-subtitle{position:relative;margin-bottom:10px;font-size:12px;line-height:18px;color:#999;font-weight:400}.com-2-team-panel-subtitle:before{content:'';position:absolute;left:0;top:50%;width:100%;height:1px;background-color:#00A4FF;background:linear-gradient(to left,rgba(0,209,255,0) 0,rgba(0,164,255,1) 72%)}.com-2-team-panel-subtitle .text{position:relative;box-sizing:border-box;display:inline-block;vertical-align:middle;padding-right:17px;background-color:#f7f8fa}.com-2-team-panel-articles>li{margin-bottom:10px}.com-2-team-panel-article{display:inline-block;vertical-align:middle;max-width:100%;font-size:12px;line-height:24px;color:#666;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-team-panel-article .split{position:relative;top:-1px;display:inline-block;vertical-align:middle;margin:0 6px;width:2px;height:2px;background-color:#666;border-radius:50%}.com-2-team-panel-article:hover{color:#00a4ff}.com-2-team-panel-article:hover .split{background-color:#00a4ff}.com-2-team-panel-ft{position:absolute;left:0;bottom:0;width:100%;font-size:0;padding-bottom:20px;text-align:center}.com-2-team-panel:hover,.com-2-team-panel:hover .com-2-team-panel-subtitle .text{background-color:#eef1f5}.com-2-team-panel:hover .com-arrow-btn{background-color:#fff;color:#fff}.com-2-team-panel:hover .com-arrow-btn-text{background-color:#00a4ff}.com-2-team-panel:hover .com-arrow-btn-text:after{border-color:#00a4ff transparent transparent #00a4ff}.com-2-team-panel:hover .com-arrow-btn.actived,.com-2-team-panel:hover .com-arrow-btn:hover{box-shadow:0 4px 9px 0 rgba(0,164,255,.22)}.com-2-team-panels{font-size:0}.com-2-team-panels>.panel-cell{display:inline-block;vertical-align:top;margin-right:20px;width:calc((100% - 1px - 20px * 2)/ 3)}.com-2-team-panels>.panel-cell:last-child{margin-right:0}.com-loading-placeholder.com-2-team-panel-loading{height:343px}.com-simple-ask{position:relative;padding:10px 20px 10px 76px;box-sizing:border-box;height:70px}.com-simple-ask:hover{background-color:#F7F8FA}.com-simple-ask .panel-link{position:absolute;left:0;top:0;width:100%;height:100%;z-index:1}.com-simple-ask-answer{position:absolute;left:10px;top:10px;-webkit-box-sizing:border-box;box-sizing:border-box;padding:5px 5px 0;width:46px;height:46px;border-radius:2px;background-color:#E1EEFA;line-height:1.2;color:#00a4ff;text-align:center;cursor:pointer}.com-simple-ask-answer .num{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:16px}.com-simple-ask-answer .name{font-size:12px}.com-simple-ask-answer.none-answer{background-color:#F3F4F5;color:#444}.com-simple-ask-title{font-size:16px;line-height:28px;color:#000;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-simple-ask-tags{position:relative;z-index:2;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-simple-asks{font-size:0;margin-bottom:-10px}.com-simple-asks>.panel-cell{display:inline-block;vertical-align:top;width:100%}.com-simple-asks.list-2>.panel-cell{margin-right:20px;width:calc((100% - 20px - 1px)/ 2)}.com-simple-asks.list-2>.panel-cell:nth-child(2n){margin-right:0}.com-simple-ask-loading{height:60px;margin-bottom:10px}.com-2-login-panel{margin-bottom:20px;box-sizing:border-box;height:148px;padding-top:20px;text-align:center;background:url(src/components/LoginPanel2/css/img/bg8ef57356e417423d49700e1964c9d3c3.jpg) right top no-repeat #F7F8FA;background-size:auto 148px}.com-2-login-panel .login-tip{margin-bottom:20px;font-size:14px;line-height:24px;color:#999}.com-2-login-panel .login-tip-primary{font-size:18px}.com-2-login-panel .login-tip-primary em{color:#00a4ff}.com-2-login-panel .c-btn{margin:0 6px;width:110px;min-width:0}.com-2-login-panel .c-btn-hole{background-color:#fff}.com-2-login-panel .c-btn-hole:hover{background-color:#e8f1fb}.com-2-owner-panel{margin-bottom:20px;box-sizing:border-box;height:148px;padding:10px;background:url(src/components/LoginPanel2/css/img/bg8ef57356e417423d49700e1964c9d3c3.jpg) right top no-repeat #F7F8FA;background-size:auto 148px}.com-2-owner-panel-hd{position:relative;margin-bottom:18px;padding-left:100px}.com-2-owner-panel-hd .com-2-avatar{position:absolute;left:0;top:0;width:80px;height:80px}.com-2-owner-panel-main{min-height:61px}.com-2-owner-panel-title{font-size:16px;line-height:22px;color:#000;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-owner-panel-title a{color:inherit}.com-2-owner-panel-title a:hover{color:#00a4ff}.com-2-owner-panel-identity{margin-bottom:5px;font-size:12px;line-height:18px;color:#999;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-owner-panel .com-emblem-list{margin-top:0;margin-bottom:5px}.com-2-owner-panel .com-emblem{margin-left:0}.com-2-owner-panel .com-emblem:last-child{margin-right:0}.com-2-owner-panel-level-infos{position:relative;padding-right:55px}.com-2-owner-panel-level-title{position:absolute;left:100%;top:0;margin-left:-50px;font-size:12px;line-height:16px;color:#00a4ff;white-space:nowrap}.com-2-owner-panel-datas{font-size:0}.com-2-owner-panel-datas>li{display:inline-block;vertical-align:top;width:33.33%;box-sizing:border-box;padding-right:2px}.com-2-owner-panel-datas>li:last-child{padding-right:0}.com-2-owner-panel-data{display:block;height:20px;font-size:12px;line-height:20px;color:#666;text-align:center;background-color:#fff}.com-2-owner-panel-data:hover{color:#00a4ff}.com-2-owner-panel-data.has-msg:after{content:'';position:relative;top:-1px;display:inline-block;vertical-align:middle;margin-left:4px;width:6px;height:6px;border-radius:50%;background-color:#FF7800}.com-2-organizer{box-sizing:border-box;display:table;table-layout:fixed;padding:20px;width:100%;border:1px solid #E5E8ED;background-color:#fff;transition:box-shadow .3s linear}a.com-2-organizer:hover{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-2-organizer-img{display:table-cell;width:120px;vertical-align:middle}.com-2-organizer-img img{display:block;width:100%;max-height:50px}.com-2-organizer-bd{display:table-cell;vertical-align:middle;padding-left:20px;word-wrap:break-word;height:70px}.com-2-organizer-title{font-size:18px;line-height:24px;color:#000;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-organizer-desc{margin-top:2px;font-size:14px;line-height:22px;color:#666;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:44px}.com-2-organizer.small{display:block;text-align:center}.com-2-organizer.small .com-2-organizer-img{display:block;width:120px;height:50px;margin:0 auto}.com-2-organizer.small .com-2-organizer-bd{display:block;margin-top:20px;padding:0}.com-2-organizer.small .com-2-organizer-desc{margin-top:10px}.com-2-organizers{font-size:0}.com-2-organizers>.panel-cell{margin-bottom:20px;font-size:14px}.com-2-organizers[class*=list]>.panel-cell{display:inline-block;vertical-align:top;margin-right:20px}.com-2-organizers.list2>.panel-cell{width:calc((100% - 20px -1px)/ 2)}.com-2-organizers.list2>.panel-cell:nth-child(2n){margin-right:0}.com-2-organizers.list3>.panel-cell{width:calc((100% - 20px * 2 -1px)/ 3)}.com-2-organizers.list3>.panel-cell:nth-child(3n){margin-right:0}.com-2-organizers.list4>.panel-cell{width:calc((100% - 20px * 3 -1px)/ 4)}.com-2-organizers.list4>.panel-cell:nth-child(4n){margin-right:0}.com-action-panel{padding-top:30px;border-bottom:1px solid #E5E8ED}.com-action-panel-hd{position:relative;z-index:1;height:20px}.com-action-panel-action{font-size:14px;line-height:20px;color:#666}.com-action-panel-action-icon{display:inline-block;vertical-align:middle;position:relative;top:-1px;margin-right:5px;width:20px;height:20px}.com-action-panel-action-icon.answer,.com-action-panel-action-icon.ask{background-image:url(sprite/Column-20199161611.svg);;background-position:67.12% 44.72%;background-size:1210% 1095%;;background-repeat:no-repeat}.com-action-panel-action-icon.follow{top:-2px;background-image:url(sprite/Column-20199161611.svg);;background-position:67.12% 33.67%;background-size:1210% 1095%;;background-repeat:no-repeat}.com-action-panel-action-icon.join{background-image:url(sprite/Column-20199161611.svg);;background-position:67.12% 11.559999999999999%;background-size:1210% 1095%;;background-repeat:no-repeat}.com-action-panel-action-icon.like{background-image:url(sprite/Column-20199161611.svg);;background-position:67.12% 55.779999999999994%;background-size:1210% 1095%;;background-repeat:no-repeat}.com-action-panel-action-icon.publish{background-image:url(sprite/Column-20199161611.svg);;background-position:67.12% 0.5%;background-size:1210% 1095%;;background-repeat:no-repeat}.com-action-panel-time{position:absolute;right:0;top:0;font-size:14px;line-height:20px;color:#999}.com-action-panel .com-3-article-panel,.com-action-panel .com-3-salon-panel,.com-action-panel .com-3-tag-panel,.com-action-panel .com-column-panel,.com-action-panel .coml-2-user-panel{margin-top:-50px;padding-top:70px;padding-bottom:30px;border-bottom:none}.com-action-panel .com-ask-panel{margin-top:24px;margin-bottom:0;padding-bottom:30px;border-bottom:none}.com-ask-action{padding-top:30px}.com-ask-action-hd{position:relative;z-index:1;height:16px}.com-ask-action-action{font-size:14px;line-height:16px;color:#666}.com-ask-action .com-ask-panel{margin-top:24px;margin-bottom:0;padding-bottom:30px}.com-2-tab-subctrl{margin-bottom:20px;font-size:0}.com-2-tab-subctrl-nav{display:inline-block;vertical-align:middle;font-size:0}.com-2-tab-subctrl-nav-item{display:inline-block;vertical-align:middle;margin-right:45px;font-size:16px;line-height:22px;color:#666}.com-2-tab-subctrl-nav-item a{color:inherit}.com-2-tab-subctrl-nav-item a:hover{color:#00a4ff}.com-2-tab-subctrl-nav-item.actived{font-weight:500;color:#000}.com-2-tab-subctrl-nav-item.actived a{cursor:default}.com-2-tab-subctrl-nav-item.actived a:hover{color:inherit}.com-2-tab-subctrl-drop .com-bubble-menu a{padding:0 15px;height:40px;line-height:40px}.com-2-tab-subctrl-drop .c-bubble-trigger-btn{font-size:16px;line-height:22px;height:22px}.com-2-tab-subctrl-drop.actived .c-bubble-trigger-btn{font-weight:500;color:#000}.com-2-tab-subctrl-drop.actived:hover .c-bubble-trigger-btn{color:#00a4ff}.com-2-tab-subctrl-drop:hover .c-bubble{pointer-events:auto;margin-top:0;padding-top:10px;width:120px}.com-weak-section{margin-bottom:25px}.com-weak-section-title{font-size:16px;line-height:22px;color:#000;font-weight:400}.com-rec-section-hd{position:relative;text-align:center}.com-rec-section-hd:before{content:'';position:absolute;left:0;top:50%;width:100%;height:1px;background-color:#D8D8D8}.com-rec-section-title{position:relative;z-index:1;top:-2px;display:inline-block;vertical-align:middle;padding:0 10px;font-size:16px;line-height:22px;color:#999;font-weight:400;background-color:#fff}.com-rec-section-bd{padding-top:35px}.com-rec-section-ft{margin-top:20px;text-align:center}.com-rec-section-ft .c-btn{min-width:130px;height:32px;line-height:32px;font-size:14px}.com-rec-section-ft .c-btn-hole,.com-rec-section-ft .c-btn-weak{line-height:30px}.com-dialog-level{box-sizing:border-box;min-height:460px;padding:20px 0;text-align:center}.com-dialog-level-bd{box-sizing:border-box;min-height:340px;padding-top:1px}.com-dialog-level-title{margin-bottom:15px;font-size:24px;line-height:36px;font-weight:400;color:#000}.com-dialog-level-title em{color:#FF7800}.com-dialog-level-desc{font-size:18px;line-height:26px;color:#666}.com-dialog-level-ft{margin-top:20px;font-size:14px;line-height:26px;color:#999}.com-dialog-level-now{position:relative;box-sizing:border-box;padding-top:130px;height:230px;width:330px;margin:50px auto 17px;background-image:url(src/components/DLevel/css/img/slice/icon-nowe3def2c9508bbebaa2c39b54b1987ba2.jpg);background-size:100% auto}.com-dialog-level-now .now-content{margin:0 auto;width:110px;height:48px;font-size:32px;line-height:48px;text-align:center;color:#fff;font-weight:700}.com-dialog-level-goal{box-sizing:border-box;margin:77px auto 20px;padding-top:13px;width:220px;height:160px;text-align:center;background-size:100% auto;background-image:url(src/components/DLevel/css/img/slice/icon-goal8d7f10701e337690af4bf724ae9844de.jpg)}.com-dialog-level-goal .goal-content{margin:0 auto;width:122px;height:140px;font-size:60px;line-height:140px;color:#fff;text-shadow:0 4px 4px #FCB53B;font-weight:500}.com-dialog-level-goal .goal-action{position:relative;top:-5px;margin-right:3px}.com-dialog-level-gift{margin:88px auto 10px;box-sizing:border-box;padding-top:42px;width:330px;height:160px;background-size:100% auto;background-image:url(src/components/DLevel/css/img/slice/icon-gift3d5b3dbf3180de3ff8ca462f608d8e28.jpg)}.com-dialog-level-gift .gift-content{margin:0 auto;width:160px;height:82px;box-sizing:border-box;text-align:center;color:#fff;padding-top:10px;text-shadow:0 4px 4px #FCB53B;font-weight:500}.com-dialog-level-gift .gift-price{font-size:30px;line-height:42px}.com-dialog-level-gift .gift-name{font-size:14px;line-height:20px}.com-narrow-layout{margin:0 auto;padding:25px 0 50px;width:800px}.com-narrow-layout-pages{margin-bottom:25px}.com-narrow-layout-prev{font-size:12px;line-height:18px;color:#000}.com-narrow-layout-prev:before{content:'';display:inline-block;vertical-align:middle;width:7px;height:11px;background-image:url(sprite/Column-20199161611.svg);;margin-right:10px;position:relative;top:-1px;background-position:39.57% 19.71%;background-size:3457.142857142857% 1990.909090909091%;;background-repeat:no-repeat}.com-narrow-layout-prev:hover{color:#00a4ff}.com-narrow-layout-prev:hover:before{background-image:url(sprite/Column-20199161611.svg);;background-position:39.57% 13.459999999999999%;background-size:3457.142857142857% 1990.909090909091%;;background-repeat:no-repeat}.com-third-section{padding-bottom:25px;margin-bottom:25px;border-bottom:1px solid #eee}.com-third-section.without-border{padding-bottom:0;border-bottom:none}.com-third-section-hd{margin-bottom:20px}.com-third-section-title{font-size:18px;line-height:18px;color:#000;font-weight:400}.com-layout-panel{padding:30px;background-color:#fff;border:1px solid #E5E8ED;box-shadow:0 2px 4px 0 rgba(3,27,78,.06)}.com-layout-panel-subtab{margin-bottom:30px}.com-btn-group{display:inline-block;vertical-align:middle;font-size:0}.com-btn-group .c-btn{vertical-align:middle;box-sizing:border-box;min-width:96px;height:44px;padding:0 15px;border:1px solid #E7EAED;background-color:transparent;font-size:14px;line-height:42px;color:#000;text-align:center}.com-btn-group .c-btn+.c-btn{margin-left:-1px}.com-btn-group .c-btn:hover{position:relative;z-index:2;border-color:#00a4ff;color:#00a4ff}.com-btn-group .c-btn.actived,.com-btn-group .c-btn.actived:hover{position:relative;z-index:1;background-color:rgba(0,154,255,.1);border-color:#00a4ff;color:#00a4ff;cursor:default}.com-form-lattice{font-size:0}.com-form-lattice>.com-form-lattice-cell{display:inline-block;vertical-align:top;width:100%;font-size:14px}.com-form-lattice.com-form-lattice-cols-1>.com-form-lattice-cell{width:100%}.com-form-lattice.com-form-lattice-cols-2>.com-form-lattice-cell{margin-right:10px;width:calc((100% - 10px * (2 - 1))/ 2)}.com-form-lattice.com-form-lattice-cols-2>.com-form-lattice-cell:nth-child(2n){margin-right:0}.com-form-lattice.com-form-lattice-cols-2>.com-form-lattice-cell:nth-child(2n):after{display:none}.com-form-lattice.com-form-lattice-cols-3>.com-form-lattice-cell{margin-right:10px;width:calc((100% - 10px * (3 - 1))/ 3)}.com-form-lattice.com-form-lattice-cols-3>.com-form-lattice-cell:nth-child(3n){margin-right:0}.com-form-lattice.com-form-lattice-cols-3>.com-form-lattice-cell:nth-child(3n):after{display:none}.com-form-lattice.com-form-lattice-cols-4>.com-form-lattice-cell{margin-right:10px;width:calc((100% - 10px * (4 - 1))/ 4)}.com-form-lattice.com-form-lattice-cols-4>.com-form-lattice-cell:nth-child(4n){margin-right:0}.com-form-lattice.com-form-lattice-cols-4>.com-form-lattice-cell:nth-child(4n):after{display:none}.com-form-lattice.com-form-lattice-cols-5>.com-form-lattice-cell{margin-right:10px;width:calc((100% - 10px * (5 - 1))/ 5)}.com-form-lattice.com-form-lattice-cols-5>.com-form-lattice-cell:nth-child(5n){margin-right:0}.com-form-lattice.com-form-lattice-cols-5>.com-form-lattice-cell:nth-child(5n):after{display:none}.com-form-lattice.com-form-lattice-cols-6>.com-form-lattice-cell{margin-right:10px;width:calc((100% - 10px * (6 - 1))/ 6)}.com-form-lattice.com-form-lattice-cols-6>.com-form-lattice-cell:nth-child(6n){margin-right:0}.com-form-lattice.com-form-lattice-cols-6>.com-form-lattice-cell:nth-child(6n):after{display:none}.com-3-sub-section{margin-bottom:20px}.com-3-sub-section-hd{position:relative;margin-bottom:30px;line-height:24px}.com-3-sub-section-title{font-size:24px;line-height:24px;font-weight:400;color:#000}.com-3-sub-section-extra{position:absolute;right:0;top:0}.com-event-panel{margin-bottom:20px}.com-event-panel-inner{box-sizing:border-box;display:table;width:100%;table-layout:fixed}.com-event-panel-object{display:table-cell;width:220px;vertical-align:middle;position:relative}.com-event-panel-img{display:block;width:220px;height:118px}.com-event-panel-body{position:relative;display:table-cell;vertical-align:middle;border-width:1px 0;border-style:solid;border-color:#ddd transparent;padding:0 140px 0 15px}.com-event-panel-body:after{position:absolute;content:"";right:0;top:-1px;bottom:-1px;width:5px;background:#00A1FF}.com-event-panel-act{position:absolute;right:30px;top:50%;z-index:2;transform:translateY(-50%)}.com-event-panel-act .c-btn{min-width:auto}.com-event-panel-desc,.com-event-panel-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-event-panel-title{font-size:18px;font-weight:700;color:#333}.com-event-panel-desc{font-size:14px;color:#666;margin:10px 0 0}.com-event-panel-sign-wrap{position:absolute;right:4px;top:10px;font-size:0}.com-event-panel-sign{display:inline-block;vertical-align:middle;padding:0 6px;height:20px;box-sizing:border-box;border:1px solid #fff;font-size:12px;line-height:18px;color:#fff;opacity:.5}.com-event-panel-close{display:inline-block;vertical-align:middle;margin-left:5px;width:20px;height:20px;text-align:center;line-height:20px}.com-event-panel-close:before{content:'';display:inline-block;vertical-align:middle;width:12px;height:12px;background-image:url(sprite/Column-20199161611.svg);;background-position:97.83% 71.98%;background-size:2016.6666666666667% 1825%;;background-repeat:no-repeat}.com-event-panel-s .com-event-panel-object{display:block;width:auto}.com-event-panel-s .com-event-panel-img{width:46px;height:160px}.com-event-panel-s .com-event-panel-sign-wrap{display:none}.com-event-panel-l .com-event-panel-object{display:block;width:auto}.com-event-panel-l .com-event-panel-img{width:330px;height:160px}.com-event-panel-xl .com-event-panel-object{display:block;width:auto}.com-event-panel-xl .com-event-panel-img{width:700px;height:118px}.com-course-card-list>.card-item{margin-bottom:20px}.com-media-motion{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 2px 6px 0 rgba(0,0,0,.1);-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:transform .3s;-moz-transition:transform .3s;-ms-transition:transform .3s;-o-transition:transform .3s;transition:transform .3s}.com-media-motion:hover{-webkit-transform:translate3d(0,-3px,0);transform:translate3d(0,-3px,0)}.com-course-card .com-course-card-title{font-size:14px;color:#333;line-height:24px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.com-course-card .com-course-card-desc{font-size:14px;color:#666;line-height:24px;height:48px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;word-break:break-all;word-wrap:break-word;overflow:hidden;margin-top:10px}.com-course-card .com-course-card-money{font-size:16px;line-height:25px;color:#ff7200}.com-course-card .com-course-card-unit{color:#ff7200;font-size:14px;margin-left:5px}.com-course-card{position:relative;background-color:#fff;display:block}.com-course-card .com-course-card-free{font-size:16px;color:#0abf5b;line-height:25px}.com-course-card .col-star-rating .star-text-lt,.com-course-card .col-star-rating .star-text-rt{font-size:14px}.com-course-card .com-course-card-bd{padding:10px}.com-course-card .com-course-card-title{height:42px;line-height:21px;font-size:14px;color:#333;white-space:normal;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.com-course-card .com-course-card-detail{margin-top:6px}.com-course-card .com-course-card-detail-inner{display:table;width:100%;height:22px;box-sizing:border-box}.com-course-card .col-star-rating,.com-course-card .com-course-card-price{display:table-cell;vertical-align:middle}.com-course-card .com-course-card-price{right:10px;bottom:20px;position:static;line-height:22px}.com-course-card .com-course-card-price .com-course-card-free{line-height:22px;font-size:16px;color:#0abf5b}.com-course-card .com-course-card-price .com-course-card-load{line-height:22px;font-size:14px;color:#999}.com-course-card .com-course-card-price .com-course-card-money,.com-course-card .com-course-card-price .com-course-card-unit{line-height:1;font-size:16px;color:#ff7200}.com-course-card .com-course-card-price .com-course-card-unit{position:relative;top:-1px;font-size:14px}.com-course-card .com-course-card-price .com-course-card-origin{position:relative;top:-1px;margin-left:10px;font-size:14px;color:#999}.com-course-card .com-price{display:table-cell;vertical-align:middle;font-size:16px}.com-course-card .com-price-unit{margin-left:5px;font-size:14px}.com-course-card .com-price-origin{margin-left:10px;font-size:14px}.com-course-card .col-star-rating{margin-top:0;text-align:right}.com-course-card .col-star-rating .star-list{margin-left:0}.com-course-card .star-text-rt{margin-left:5px}.com-course-img{padding-top:50%;background-size:cover;background-position:center;position:relative;color:#fff;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;text-align:center;background-color:#00a4ff}.com-course-img .com-course-img-title{font-size:24px;color:#fff;line-height:48px;padding:0 50px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;word-break:break-all;word-wrap:break-word;overflow:hidden;text-align:left}.com-course-img.course-img-s .com-course-img-title{padding:0 20px}.com-course-img .com-course-img-desc{padding:0 15px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:16px;color:#fff;line-height:22px}.com-course-img::after{content:'';position:absolute;left:0;top:0;width:100%;height:100%;opacity:.9}.com-course-img.color1::after{background:linear-gradient(to right ,#0092ff ,#65c3ff)}.com-course-img.color2::after{background:linear-gradient(to right ,#00B7D6 ,#6ce7f3)}.com-course-img.color3::after{background:linear-gradient(to right ,#2059bf ,#4ba5ff)}.com-course-img .com-course-img-divider{width:220px;height:1px;background:#fff;margin:2px auto 5px}.com-course-img .com-course-img-con{left:0;top:50%;-webkit-transform:translate(0,-50%);-moz-transform:translate(0,-50%);-ms-transform:translate(0,-50%);-o-transform:translate(0,-50%);transform:translate(0,-50%);width:100%;z-index:1}.com-course-img.course-img-s .com-course-img-con{-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none;top:45px;left:0}.com-course-img.course-img-s{padding-top:42.8571%}.com-course-img.course-img-s .com-course-img-title{line-height:30px;font-size:18px;text-align:left}.com-course-img.course-img-s .com-course-img-desc{font-size:12px;line-height:17px}.com-course-img.course-img-s .com-course-img-divider{width:141px;opacity:.6}.com-course-img .com-bar-tag{background-color:#fff;height:20px;border:none;line-height:20px;font-size:12px;margin-left:0}.com-course-img .com-course-img-tag-lt{position:absolute;top:0;z-index:2}.com-course-img .com-bar-tag.hot{color:#fff;background:#fd7822}.com-course-img .com-bar-tag.cur{background-color:#00a4ff;color:#fff;vertical-align:text-bottom}.com-course-img .com-bar-tag.done,.com-course-img .com-bar-tag.free,.com-course-img .com-bar-tag.live{color:#fff;background-color:rgba(0,0,0,.25)}.com-course-img .com-bar-tag.living,.com-course-img .com-bar-tag.new,.com-course-img .com-bar-tag.recommend,.com-course-img .com-bar-tag.update,.com-course-img .com-bar-tag.updating{color:#fff;background-color:#e1504a}.com-course-img .com-bar-tag.living .icon-live{background-image:url(sprite/Column-20199161611.svg);;background-position:91.59% 52.15%;background-size:1512.5% 2190%;;background-repeat:no-repeat}.com-course-img .com-course-img-con,.com-course-img.course-img-s .com-course-img-con{position:absolute;top:50%;margin-top:-30px;width:100%;height:60px;max-height:60px;overflow:hidden;box-sizing:border-box;transform:none;-ms-transform:none;-moz-transform:none;-webkit-transform:none;-o-transform:none}.com-course-img .com-course-img-con .com-course-img-title{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis}.com-course-img .com-bar-tag{padding:0 5px;height:18px;line-height:18px;font-size:0}.com-course-img .com-bar-tag+.com-bar-tag{margin-left:5px}.com-course-img .com-course-img-tag{position:absolute;font-size:0;z-index:2}.com-course-img .com-course-img-tag-lt{left:0;top:0}.com-course-img .com-course-img-tag-lb{left:0;bottom:0}.com-course-img .com-course-img-tag-rt{position:absolute;bottom:0;z-index:2;font-size:0;right:0;top:0}.com-course-img .com-course-img-tag-rb{right:0;bottom:0}.com-course-img .com-course-img-tag .com-bar-tag{vertical-align:top}.com-star-rating .star-text-lt,.com-star-rating .star-text-rt{font-size:14px;color:#666;line-height:22px;vertical-align:middle}.com-star-rating .star-text-rt{vertical-align:middle}.com-star-rating .star-list{font-size:0;display:inline-block;vertical-align:middle;margin-left:4px;line-height:1}.com-star-rating .star{width:12px;height:12px;background-image:url(sprite/Column-20199161611.svg);;display:inline-block;margin:0 2px;background-position:97.83% 78.74%;background-size:2016.6666666666667% 1825%;;background-repeat:no-repeat}.com-star-rating .star.full{background-image:url(sprite/Column-20199161611.svg);;background-position:90% 84.54%;background-size:2016.6666666666667% 1825%;;background-repeat:no-repeat}.com-star-rating .star.part{background-image:url(sprite/Column-20199161611.svg);;background-position:97.83% 89.86%;background-size:2016.6666666666667% 1825%;;background-repeat:no-repeat}.com-star-rating .error-tip{color:red}.com-price{line-height:1;font-size:30px;color:#ff7200}.com-price.free{color:#0abf5b}.com-price.loading,.com-price.paid{color:#999}.com-price .com-price-unit{position:relative;top:-1px;margin-left:14px;font-size:18px}.com-price .com-price-origin{position:relative;top:-1px;margin-left:22px;font-size:18px;color:#999}.com-bar-tag{font-size:0}.com-bar-tag.color-og{color:#fd7822;border-color:#fd7822}.com-bar-tag.color-rd{color:#e1504a;border-color:#e1504a}.com-bar-tag.fill{line-height:18px;color:#fff;background-color:rgba(0,0,0,.25);border:none}.com-bar-tag.fill.color-og{background-color:#fd7822}.com-bar-tag.fill.color-rd{background-color:#e1504a}.com-bar-tag i{display:inline-block;vertical-align:middle}.com-bar-tag span{font-size:12px;vertical-align:middle}.rno-grid-layout{overflow:hidden}.rno-grid-row{display:block;margin-right:0;margin-left:0;font-size:0;-webkit-box-sizing:border-box;box-sizing:border-box}.rno-grid-row-split-line .rno-grid-col{position:relative}.rno-grid-row-split-line .rno-grid-col::before{content:"";position:absolute;top:0;bottom:0;left:0;display:block;width:1px;background-color:#e8e8e8}.rno-grid-row-mlr0{margin-left:0 !important;margin-right:0 !important}.rno-grid-col{display:inline-block;vertical-align:top;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:14px}[class*=rno-grid-col-pull-],[class*=rno-grid-col-push-]{position:relative}.rno-grid-col-0{display:none}.rno-grid-col-offset-0{margin-left:0}.rno-grid-col-pull-0{right:auto}.rno-grid-col-push-0{left:auto}.rno-grid-col-order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.rno-grid-col-1{display:inline-block;width:4.1666666667%}.rno-grid-col-offset-1{margin-left:4.1666666667%}.rno-grid-col-pull-1{right:4.1666666667%}.rno-grid-col-push-1{left:4.1666666667%}.rno-grid-col-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.rno-grid-col-2{display:inline-block;width:8.3333333333%}.rno-grid-col-offset-2{margin-left:8.3333333333%}.rno-grid-col-pull-2{right:8.3333333333%}.rno-grid-col-push-2{left:8.3333333333%}.rno-grid-col-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.rno-grid-col-3{display:inline-block;width:12.5%}.rno-grid-col-offset-3{margin-left:12.5%}.rno-grid-col-pull-3{right:12.5%}.rno-grid-col-push-3{left:12.5%}.rno-grid-col-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.rno-grid-col-4{display:inline-block;width:16.6666666667%}.rno-grid-col-offset-4{margin-left:16.6666666667%}.rno-grid-col-pull-4{right:16.6666666667%}.rno-grid-col-push-4{left:16.6666666667%}.rno-grid-col-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.rno-grid-col-5{display:inline-block;width:20%}.rno-grid-col-offset-5{margin-left:20%}.rno-grid-col-pull-5{right:20%}.rno-grid-col-push-5{left:20%}.rno-grid-col-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.rno-grid-col-6{display:inline-block;width:25%}.rno-grid-col-offset-6{margin-left:25%}.rno-grid-col-pull-6{right:25%}.rno-grid-col-push-6{left:25%}.rno-grid-col-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.rno-grid-col-7{display:inline-block;width:29.1666666667%}.rno-grid-col-offset-7{margin-left:29.1666666667%}.rno-grid-col-pull-7{right:29.1666666667%}.rno-grid-col-push-7{left:29.1666666667%}.rno-grid-col-order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.rno-grid-col-8{display:inline-block;width:33.3333333333%}.rno-grid-col-offset-8{margin-left:33.3333333333%}.rno-grid-col-pull-8{right:33.3333333333%}.rno-grid-col-push-8{left:33.3333333333%}.rno-grid-col-order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.rno-grid-col-9{display:inline-block;width:37.5%}.rno-grid-col-offset-9{margin-left:37.5%}.rno-grid-col-pull-9{right:37.5%}.rno-grid-col-push-9{left:37.5%}.rno-grid-col-order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.rno-grid-col-10{display:inline-block;width:41.6666666667%}.rno-grid-col-offset-10{margin-left:41.6666666667%}.rno-grid-col-pull-10{right:41.6666666667%}.rno-grid-col-push-10{left:41.6666666667%}.rno-grid-col-order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.rno-grid-col-11{display:inline-block;width:45.8333333333%}.rno-grid-col-offset-11{margin-left:45.8333333333%}.rno-grid-col-pull-11{right:45.8333333333%}.rno-grid-col-push-11{left:45.8333333333%}.rno-grid-col-order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.rno-grid-col-12{display:inline-block;width:50%}.rno-grid-col-offset-12{margin-left:50%}.rno-grid-col-pull-12{right:50%}.rno-grid-col-push-12{left:50%}.rno-grid-col-order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.rno-grid-col-13{display:inline-block;width:54.1666666667%}.rno-grid-col-offset-13{margin-left:54.1666666667%}.rno-grid-col-pull-13{right:54.1666666667%}.rno-grid-col-push-13{left:54.1666666667%}.rno-grid-col-order-13{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.rno-grid-col-14{display:inline-block;width:58.3333333333%}.rno-grid-col-offset-14{margin-left:58.3333333333%}.rno-grid-col-pull-14{right:58.3333333333%}.rno-grid-col-push-14{left:58.3333333333%}.rno-grid-col-order-14{-webkit-box-ordinal-group:15;-webkit-order:14;-ms-flex-order:14;order:14}.rno-grid-col-15{display:inline-block;width:62.5%}.rno-grid-col-offset-15{margin-left:62.5%}.rno-grid-col-pull-15{right:62.5%}.rno-grid-col-push-15{left:62.5%}.rno-grid-col-order-15{-webkit-box-ordinal-group:16;-webkit-order:15;-ms-flex-order:15;order:15}.rno-grid-col-16{display:inline-block;width:66.6666666667%}.rno-grid-col-offset-16{margin-left:66.6666666667%}.rno-grid-col-pull-16{right:66.6666666667%}.rno-grid-col-push-16{left:66.6666666667%}.rno-grid-col-order-16{-webkit-box-ordinal-group:17;-webkit-order:16;-ms-flex-order:16;order:16}.rno-grid-col-17{display:inline-block;width:70.8333333333%}.rno-grid-col-offset-17{margin-left:70.8333333333%}.rno-grid-col-pull-17{right:70.8333333333%}.rno-grid-col-push-17{left:70.8333333333%}.rno-grid-col-order-17{-webkit-box-ordinal-group:18;-webkit-order:17;-ms-flex-order:17;order:17}.rno-grid-col-18{display:inline-block;width:75%}.rno-grid-col-offset-18{margin-left:75%}.rno-grid-col-pull-18{right:75%}.rno-grid-col-push-18{left:75%}.rno-grid-col-order-18{-webkit-box-ordinal-group:19;-webkit-order:18;-ms-flex-order:18;order:18}.rno-grid-col-19{display:inline-block;width:79.1666666667%}.rno-grid-col-offset-19{margin-left:79.1666666667%}.rno-grid-col-pull-19{right:79.1666666667%}.rno-grid-col-push-19{left:79.1666666667%}.rno-grid-col-order-19{-webkit-box-ordinal-group:20;-webkit-order:19;-ms-flex-order:19;order:19}.rno-grid-col-20{display:inline-block;width:83.3333333333%}.rno-grid-col-offset-20{margin-left:83.3333333333%}.rno-grid-col-pull-20{right:83.3333333333%}.rno-grid-col-push-20{left:83.3333333333%}.rno-grid-col-order-20{-webkit-box-ordinal-group:21;-webkit-order:20;-ms-flex-order:20;order:20}.rno-grid-col-21{display:inline-block;width:87.5%}.rno-grid-col-offset-21{margin-left:87.5%}.rno-grid-col-pull-21{right:87.5%}.rno-grid-col-push-21{left:87.5%}.rno-grid-col-order-21{-webkit-box-ordinal-group:22;-webkit-order:21;-ms-flex-order:21;order:21}.rno-grid-col-22{display:inline-block;width:91.6666666667%}.rno-grid-col-offset-22{margin-left:91.6666666667%}.rno-grid-col-pull-22{right:91.6666666667%}.rno-grid-col-push-22{left:91.6666666667%}.rno-grid-col-order-22{-webkit-box-ordinal-group:23;-webkit-order:22;-ms-flex-order:22;order:22}.rno-grid-col-23{display:inline-block;width:95.8333333333%}.rno-grid-col-offset-23{margin-left:95.8333333333%}.rno-grid-col-pull-23{right:95.8333333333%}.rno-grid-col-push-23{left:95.8333333333%}.rno-grid-col-order-23{-webkit-box-ordinal-group:24;-webkit-order:23;-ms-flex-order:23;order:23}.rno-grid-col-24{display:inline-block;width:100%}.rno-grid-col-offset-24{margin-left:100%}.rno-grid-col-pull-24{right:100%}.rno-grid-col-push-24{left:100%}.rno-grid-col-order-24{-webkit-box-ordinal-group:25;-webkit-order:24;-ms-flex-order:24;order:24}.col-user-panels{padding:20px 0;font-size:0;border-bottom:1px solid #E1E3E9}.col-user-panels>.panel-cell{display:inline-block;vertical-align:top;width:100%}.col-user-panels.col-4>.panel-cell{margin-right:20px;width:calc((100% - 1px - 20px * 3)/ 4)}.col-user-panels.col-4>.panel-cell:nth-child(4n){margin-right:0}.col-user-panel{position:relative;text-align:center;padding:20px 10px;transition:box-shadow .3s linear}.col-user-panel:hover{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.col-user-panel .panel-link{position:absolute;left:0;top:0;z-index:1;width:100%;height:100%}.col-user-panel-avatar{display:block;margin:0 auto 12px;width:90px;height:90px}.col-user-panel-name{box-sizing:border-box;position:relative;display:inline-block;vertical-align:middle;max-width:100%;font-size:18px;line-height:26px;color:#000;font-weight:400}.col-user-panel-name.with-verify{padding-right:20px}.col-user-panel-name .com-verification{position:absolute;right:0;top:8px}.col-user-panel-name-inner{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:inherit}.col-user-panel-identity{margin-top:6px;font-size:14px;line-height:20px;color:#999;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.col-user-panel-btns{position:relative;z-index:2;margin-top:20px}.col-user-panel-btn{padding:0 10px;min-width:0;width:80px;height:28px;line-height:26px;font-size:12px}.col-column-panels{padding:20px 0;font-size:0;border-bottom:1px solid #E1E3E9}.col-column-panels>.panel-cell{display:inline-block;vertical-align:top;width:100%}.col-column-panels.col-4>.panel-cell{margin-right:20px;width:calc((100% - 1px - 20px * 3)/ 4)}.col-column-panels.col-4>.panel-cell:nth-child(4n){margin-right:0}.col-column-panel{position:relative;text-align:center;padding:20px 10px;transition:box-shadow .3s linear}.col-column-panel:hover{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.col-column-panel .panel-link{position:absolute;left:0;top:0;z-index:1;width:100%;height:100%}.col-column-panel-avatar{display:block;margin:0 auto 12px;width:90px;height:90px}.col-column-panel-title{box-sizing:border-box;position:relative;display:inline-block;vertical-align:middle;max-width:100%;font-size:18px;line-height:26px;color:#000;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.col-column-panel-datas{margin-top:6px;font-size:0}.col-column-panel-data{display:inline-block;vertical-align:middle;font-size:14px;line-height:20px;color:#999}.col-column-panel-data:before{content:'';position:relative;top:-1px;display:inline-block;vertical-align:middle;margin:0 10px;width:2px;height:2px;background-color:#999;border-radius:50%}.col-column-panel-data:first-child:before{display:none}.col-column-panel-btns{position:relative;z-index:2;margin-top:20px}.col-column-panel-btn{padding:0 10px;min-width:0;width:80px;height:28px;line-height:26px;font-size:12px}.col-side-mine{margin-bottom:40px}.col-side-mine-list{margin-bottom:20px;border:1px solid #EAEAEA;font-size:0}.col-side-mine-list>.item{position:relative;display:inline-block;vertical-align:middle;width:50%;height:110px}.col-side-mine-list>.item:before{content:'';position:absolute;left:0;top:50%;margin-top:-33px;width:1px;height:66px;background-color:#EAEAEA}.col-side-mine-list>.item:first-child:before{display:none}.col-side-mine-list a{display:block;box-sizing:border-box;padding-top:25px;height:100%;text-align:center;font-size:14px;line-height:20px;color:#333}.col-side-mine-list a:hover{background-color:#F3F5F9}.col-side-mine-list h4{margin-top:7px;font-weight:400}.col-side-mine-list .icon{display:inline-block;vertical-align:middle;width:44px;height:44px}.col-side-mine-list .icon.column{background-image:url(sprite/Column-20199161611.svg);;background-position:52.019999999999996% 0.5700000000000001%;background-size:550% 497.72727272727275%;;background-repeat:no-repeat}.col-side-mine-list .icon.followed-column{background-image:url(sprite/Column-20199161611.svg);;background-position:23.74% 16%;background-size:550% 497.72727272727275%;;background-repeat:no-repeat}.col-side-mine-list .icon.draft{background-image:url(sprite/Column-20199161611.svg);;background-position:0.51% 16%;background-size:550% 497.72727272727275%;;background-repeat:no-repeat}.col-side-mine .com-ico-btn{width:100%;min-width:0;height:36px;line-height:34px}.col-index-header .com-sticky-header-extra{width:352px}.col-index-header .header-btn{margin-left:0;min-width:80px;font-size:14px;height:36px;line-height:34px}.col-index-header .header-search-box{display:inline-block;vertical-align:middle;margin-right:10px;position:relative;text-align:left}.col-index-header .header-search-btn{background-color:#F3F5F9;display:block;font-size:14px;color:#999;position:relative;cursor:pointer;width:260px}.col-index-header .header-search-btn .search-input{border-color:transparent;box-shadow:none;background:0 0;font-size:12px;height:36px;padding-top:8px;padding-bottom:8px;cursor:pointer}.col-index-header .header-search-btn input::-webkit-input-placeholder{color:#999}.col-index-header .header-search-btn input:-ms-input-placeholder{color:#999}.col-index-header .header-search-btn input::placeholder{color:#999}.col-index-header .com-3-nav-search-wrap{margin-top:-3px}.col-index-header .com-tab-hd{border-bottom:none}.col-index-header .com-tab.dropdown .com-tab-item a{padding-bottom:0;height:36px;line-height:36px}.col-index-header .com-tab.dropdown .com-tab-item a:after{display:none}.col-index-header .com-tab-dropdown-trigger{line-height:36px}.col-multi-articles{margin-top:-20px}.col-multi-articles .last-article-panels>li:last-child .com-3-article-panel{border-bottom:none}.col-sticky-header>.com-inner{max-width:1116px}.col-sticky-header .com-sticky-header-main{padding-left:200px}.pg-article .article-event-panel{margin-top:20px}.col-editor-tagsinput .com-tab-panel{max-height:200px}.col-editor-tagsinput .com-tag-v2-list{margin-bottom:0}@media screen and (max-width:1200px){.col-body-main{padding-left:20px;padding-right:20px}.pg-column .col-body-main,.pg-tag-articles .col-body-main,.pg-tag-articles .com-inner{padding-left:10px;padding-right:10px}}@media screen and (max-width:800px){.pg-editor.preview .col-editor-toolbar .editor-switch{float:none}.pg-editor.preview .col-editor-toolbar .editor-msg{float:none;display:block;margin-top:5px}}@media screen and (max-width:1240px){.pg-editor-translate .col-editor-msg .msg-inner{top:116px;left:0;background-color:#fff;text-align:center}.pg-editor-translate .col-editor-body.fixed-toolbar .col-editor-msg{top:111px;text-align:center}}@media screen and (max-width:1000px){.pg-editor-translate .col-editor-body.fixed-toolbar .col-editor-msg,.pg-editor-translate .col-editor-body.fixed-toolbar .qa-r-editor-toolbar{left:500px}}@media screen and (max-width:1200px){.pg-articles .col-aside{display:none}.pg-articles .col-layout .col-main{width:100%;padding-right:10px}}@media screen\0{.qa-ico-strike,.qa-r-editor-btn.disabled .qa-ico-strike,.qa-r-editor-btn.disabled:hover .qa-ico-strike{background-size:auto auto;background-position:-18px 0px;background-image:url(sprite/Column-media6-20199161611.png)}.qa-r-editor-btn.actived .qa-ico-strike,.qa-r-editor-btn:hover .qa-ico-strike{background-size:auto auto;background-position:-36px -18px;background-image:url(sprite/Column-media6-20199161611.png)}.qa-ico-table,.qa-r-editor-btn.disabled .qa-ico-table,.qa-r-editor-btn.disabled:hover .qa-ico-table{background-size:auto auto;background-position:0px -18px;background-image:url(sprite/Column-media6-20199161611.png)}.qa-r-editor-btn.actived .qa-ico-table,.qa-r-editor-btn:hover .qa-ico-table{background-size:auto auto;background-position:-18px -18px;background-image:url(sprite/Column-media6-20199161611.png)}.qa-ico-ol,.qa-r-editor-btn.disabled .qa-ico-ol,.qa-r-editor-btn.disabled:hover .qa-ico-ol{background-size:auto auto;background-position:-36px 0px;background-image:url(sprite/Column-media6-20199161611.png)}.qa-r-editor-btn.actived .qa-ico-ol,.qa-r-editor-btn:hover .qa-ico-ol{background-size:auto auto;background-position:0px 0px;background-image:url(sprite/Column-media6-20199161611.png)}.qa-ico-ul,.qa-r-editor-btn.disabled .qa-ico-ul,.qa-r-editor-btn.disabled:hover .qa-ico-ul{background-size:auto auto;background-position:0px -36px;background-image:url(sprite/Column-media6-20199161611.png)}.qa-r-editor-btn.actived .qa-ico-ul,.qa-r-editor-btn:hover .qa-ico-ul{background-size:auto auto;background-position:-18px -36px;background-image:url(sprite/Column-media6-20199161611.png)}.qa-ico-pic,.qa-r-editor-btn.disabled .qa-ico-pic,.qa-r-editor-btn.disabled:hover .qa-ico-pic{background-size:auto auto;background-position:-36px -36px;background-image:url(sprite/Column-media6-20199161611.png)}.qa-r-editor-btn.actived .qa-ico-pic,.qa-r-editor-btn:hover .qa-ico-pic{background-size:auto auto;background-position:-54px 0px;background-image:url(sprite/Column-media6-20199161611.png)}.col-search button:after{background-size:auto auto;background-position:-54px -18px;background-image:url(sprite/Column-media6-20199161611.png)}}@media screen and (max-width:1200px){.com-salon-specialist-identity{display:none}}@media screen and (max-width:1440px){.com-2-article-panel{padding:30px 20px}.com-2-article-panel-author{margin-bottom:8px}.com-2-article-panel-title{display:block;display:-webkit-box;white-space:normal;height:54px}.com-2-article-panel .com-media-body{height:69px}.com-2-article-panel-cnt{position:relative}.com-2-article-panel-cnt .com-media-object{padding-left:20px;width:80px;height:63px}.com-2-article-panel-cnt .com-thumbnail{width:80px;height:60px}.com-2-article-panel-desc{line-height:21px;-webkit-line-clamp:3;max-height:63px}.com-2-article-panel-opts{position:absolute;left:0;bottom:-30px;width:100%}.com-2-article-panel.large{padding-left:250px}.com-2-article-panel.large.without-img{padding-left:20px}.com-2-article-panel.large .com-2-article-panel-title{white-space:normal}.com-2-article-panel.large .com-2-article-panel-cnt{position:static}.com-2-article-panel.large .com-2-article-panel-desc{line-height:24px}.com-2-article-panel.large .com-2-article-panel-cnt .com-media-object{left:20px;top:30px}.com-2-article-panel.large .com-thumbnail{width:200px;height:190px}.com-2-article-panel.large .com-2-article-panel-opts{position:static}.com-2-article-panels{margin-bottom:-20px}.com-2-article-panels>.panel-cell{margin-right:20px;margin-bottom:20px;width:calc((100% - 20px * 2)/ 3)}.com-2-article-panels>.panel-cell:first-child{width:calc(100% - 20px - (100% - 20px * 2)/ 3)}.com-2-article-panels>.panel-cell:nth-child(3n+2){margin-right:0;width:calc((100% - 20px * 2)/ 3 - 1px)}}@media screen and (max-width:1440px){.com-4-article-panels>.panel-cell,.com-4-article-panels>.panel-cell:first-child{width:calc((100% - 10px - 1px)/ 2)}.com-4-article-panels>.panel-cell:nth-child(2n){margin-right:0}.com-4-article-panels>.panel-cell:nth-child(n+5){display:none}.com-4-article-panel.large{padding-left:20px}.com-4-article-panel.large .com-4-article-panel-title{margin-bottom:10px}.com-4-article-panel.large .com-4-article-panel-cnt{display:table}.com-4-article-panel.large .com-4-article-panel-infos{margin-top:10px}.com-4-article-panel.large .com-4-article-panel-cnt .com-media-object{position:static;display:table-cell;width:83px;padding-top:5px}.com-4-article-panel.large .com-thumbnail{width:83px;height:63px}.com-4-article-panel-author .author-name,.com-4-article-panel.large .com-4-article-panel-author .author-name{max-width:8em}.panel-cell:nth-child(n+3) .com-4-article-panel-author .author-name{max-width:16em}}@media screen and (max-width:1440px){.com-salon-panel-hd{padding-left:20px;padding-right:20px}.com-salon-panel-bd{padding:20px}.com-salon-panel.large{padding:30px 20px 20px}.com-salon-panel.large .com-salon-panel-img{background-size:auto 70%}.com-salon-panel.large .com-salon-panel-title{max-width:250px}.com-salon-panel.large .com-salon-panel-infos{margin-top:9px}.com-salon-panel.large .com-salon-panel-btns{left:20px;bottom:20px}.com-salon-panel.large .panel-btn{position:relative;left:0;top:0;margin-right:0}.com-salon-panels{margin-bottom:-20px}.com-salon-panels>.panel-cell,.com-salon-panels>.panel-cell:nth-child(1),.com-salon-panels>.panel-cell:nth-child(2){margin-right:20px;margin-bottom:20px;width:calc((100% - 1px - 20px)/ 2)}.com-salon-panels>.panel-cell:nth-child(2n){margin-right:0}.com-salon-panels>.panel-cell:nth-child(n+5){display:none}}@media screen and (max-width:1440px){.com-user-panels>.panel-cell{width:202px}}@media screen and (max-width:1440px){.com-special-list-wrap{padding:0 20px}.com-special-thumbnail{right:20px;top:20px;width:366px;height:366px}.com-special-list{margin-right:386px}}@media screen and (max-width:1440px){.com-team-panel-bd{padding:0 20px}.com-team-panels>.panel-cell{display:inline-block;vertical-align:top;margin-right:20px;width:calc((100% - 1px - 20px)/ 2)}.com-team-panels>.panel-cell:nth-child(2){margin-right:0}.com-team-panels>.panel-cell:nth-child(n+3){display:none}}@media screen and (max-width:1440px){.com-2-ask-panel{padding-left:20px;padding-right:20px}.com-2-ask-panel-bd{min-height:143px}.com-2-ask-panel-author-name{margin-top:7px}.com-2-ask-panel-answer{padding-top:20px;padding-bottom:20px}.com-2-ask-panel-answer .com-media-body{height:100px}.com-2-ask-panel-answer-opts{margin-top:11px}.com-2-ask-panel-answer .com-media-object{padding-left:20px;width:150px}.com-2-ask-panel-answer .com-thumbnail{width:150px;height:100px}}@media screen and (max-width:1440px){.com-2-doc-panels-wrap>.wrap-cell:first-child{width:calc((100% - 20px * 2)/ 3 * 2 + 20px)}.com-2-doc-panels-wrap>.wrap-cell:last-child{width:calc((100% - 20px * 2)/ 3)}.com-2-doc-panels>.panel-cell{margin-right:0;width:100%}.com-2-doc-panels>.panel-cell:nth-child(n+4){display:none}.com-2-doc-panels.large>.panel-cell{margin-right:20px;width:calc((100% - 1px - 20px)/ 2)}}@media screen and (max-width:1440px){.com-2-doc-panels-wrap.v2>.wrap-cell:first-child{width:calc((100% - 10px * 2)/ 3 * 2 + 10px)}.com-2-doc-panels-wrap.v2>.wrap-cell:last-child{width:calc((100% - 10px * 2)/ 3)}.com-2-doc-panels-wrap.v2 .com-2-doc-panels>.panel-cell,.com-2-doc-panels-wrap.v2 .com-2-doc-panels>.panel-cell:nth-child(2n){margin-right:0;width:100%}.com-2-doc-panels-wrap.v2 .com-2-doc-panels>.panel-cell:nth-child(n+4){display:none}.com-2-doc-panels-wrap.v2 .com-2-doc-panels.large>.panel-cell{margin-right:10px;width:calc((100% - 1px - 10px)/ 2)}}@media screen and (max-width:1440px){.com-hero-events>.event-cell:nth-child(n+5){display:none}}@media (max-width:1200px){.com-full-layout-main{padding:20px}}@media screen and (max-width:1920px){.com-2-hero-item-img{right:-60px}.com-2-hero-item-cnt{padding-left:30px;padding-right:30px}.com-2-hero-item-btns{left:30px}}@media screen and (max-width:1440px){.com-2-hero-item-cnt{padding-left:20px;padding-right:20px;height:195px}.com-2-hero-item-btns{left:20px}.com-2-hero-item-title{font-size:22px;line-height:32px;max-height:64px}.com-2-hero-item-desc{font-size:12px;line-height:20px;white-space:normal;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;height:40px}.com-2-hero-item .com-2-hero-item-desc,.com-2-hero-item .com-2-hero-item-title{max-width:260px}}@media screen and (max-width:1440px){.com-3-user-panels>.panel-cell{width:calc((100% - 20px * 3 - 1px)/ 4)}.com-3-user-panels>.panel-cell:nth-child(n+5){display:none}}@media screen and (max-width:1440px){.com-2-team-panels>.panel-cell{width:calc((100% - 1px - 20px)/ 2)}.com-2-team-panels>.panel-cell:nth-child(2n){margin-right:0}.com-2-team-panels>.panel-cell:last-child{display:none}}@media (max-width:768px){.com-course-img.course-img-s{padding-top:23.188%}.com-course-img.course-img-s .com-course-img-con{top:50%;-webkit-transform:translate(0,-50%);-moz-transform:translate(0,-50%);-ms-transform:translate(0,-50%);-o-transform:translate(0,-50%);transform:translate(0,-50%)}}@media screen and (max-width:768px){.com-course-img .com-course-img-con{display:none}}@media screen and (max-width:600px){.com-star-rating .star-text-lt{vertical-align:2px}.com-star-rating .star-list,.com-star-rating .star-text-rt{vertical-align:1px}}@media screen and (max-width:1200px){.col-column-panel-data{font-size:12px}.col-column-panel-data:before{margin:0 5px}}@media screen and (max-width:1136px){.col-sticky-header>.com-inner{max-width:1000px}.col-sticky-header .com-sticky-header-main{padding-left:120px}.col-sticky-header .com-sticky-header-extra{text-align:left;width:100px}} +#MAXIM{content:"weu2019916161146"} \ No newline at end of file diff --git a/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云_files/MathJax.js.下载 b/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云_files/MathJax.js.下载 new file mode 100644 index 0000000..792f7e4 --- /dev/null +++ b/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云_files/MathJax.js.下载 @@ -0,0 +1,19 @@ +/* + * /MathJax.js + * + * Copyright (c) 2009-2017 The MathJax Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +if(document.getElementById&&document.childNodes&&document.createElement){if(!(window.MathJax&&MathJax.Hub)){if(window.MathJax){window.MathJax={AuthorConfig:window.MathJax}}else{window.MathJax={}}MathJax.isPacked=true;MathJax.version="2.7.2";MathJax.fileversion="2.7.2";MathJax.cdnVersion="2.7.2";MathJax.cdnFileVersions={};(function(d){var b=window[d];if(!b){b=window[d]={}}var e=[];var c=function(f){var g=f.constructor;if(!g){g=function(){}}for(var h in f){if(h!=="constructor"&&f.hasOwnProperty(h)){g[h]=f[h]}}return g};var a=function(){return function(){return arguments.callee.Init.call(this,arguments)}};b.Object=c({constructor:a(),Subclass:function(f,h){var g=a();g.SUPER=this;g.Init=this.Init;g.Subclass=this.Subclass;g.Augment=this.Augment;g.protoFunction=this.protoFunction;g.can=this.can;g.has=this.has;g.isa=this.isa;g.prototype=new this(e);g.prototype.constructor=g;g.Augment(f,h);return g},Init:function(f){var g=this;if(f.length===1&&f[0]===e){return g}if(!(g instanceof f.callee)){g=new f.callee(e)}return g.Init.apply(g,f)||g},Augment:function(f,g){var h;if(f!=null){for(h in f){if(f.hasOwnProperty(h)){this.protoFunction(h,f[h])}}if(f.toString!==this.prototype.toString&&f.toString!=={}.toString){this.protoFunction("toString",f.toString)}}if(g!=null){for(h in g){if(g.hasOwnProperty(h)){this[h]=g[h]}}}return this},protoFunction:function(g,f){this.prototype[g]=f;if(typeof f==="function"){f.SUPER=this.SUPER.prototype}},prototype:{Init:function(){},SUPER:function(f){return f.callee.SUPER},can:function(f){return typeof(this[f])==="function"},has:function(f){return typeof(this[f])!=="undefined"},isa:function(f){return(f instanceof Object)&&(this instanceof f)}},can:function(f){return this.prototype.can.call(this,f)},has:function(f){return this.prototype.has.call(this,f)},isa:function(g){var f=this;while(f){if(f===g){return true}else{f=f.SUPER}}return false},SimpleSUPER:c({constructor:function(f){return this.SimpleSUPER.define(f)},define:function(f){var h={};if(f!=null){for(var g in f){if(f.hasOwnProperty(g)){h[g]=this.wrap(g,f[g])}}if(f.toString!==this.prototype.toString&&f.toString!=={}.toString){h.toString=this.wrap("toString",f.toString)}}return h},wrap:function(i,h){if(typeof(h)!=="function"||!h.toString().match(/\.\s*SUPER\s*\(/)){return h}var g=function(){this.SUPER=g.SUPER[i];try{var f=h.apply(this,arguments)}catch(j){delete this.SUPER;throw j}delete this.SUPER;return f};g.toString=function(){return h.toString.apply(h,arguments)};return g}})});b.Object.isArray=Array.isArray||function(f){return Object.prototype.toString.call(f)==="[object Array]"};b.Object.Array=Array})("MathJax");(function(BASENAME){var BASE=window[BASENAME];if(!BASE){BASE=window[BASENAME]={}}var isArray=BASE.Object.isArray;var CALLBACK=function(data){var cb=function(){return arguments.callee.execute.apply(arguments.callee,arguments)};for(var id in CALLBACK.prototype){if(CALLBACK.prototype.hasOwnProperty(id)){if(typeof(data[id])!=="undefined"){cb[id]=data[id]}else{cb[id]=CALLBACK.prototype[id]}}}cb.toString=CALLBACK.prototype.toString;return cb};CALLBACK.prototype={isCallback:true,hook:function(){},data:[],object:window,execute:function(){if(!this.called||this.autoReset){this.called=!this.autoReset;return this.hook.apply(this.object,this.data.concat([].slice.call(arguments,0)))}},reset:function(){delete this.called},toString:function(){return this.hook.toString.apply(this.hook,arguments)}};var ISCALLBACK=function(f){return(typeof(f)==="function"&&f.isCallback)};var EVAL=function(code){return eval.call(window,code)};var TESTEVAL=function(){EVAL("var __TeSt_VaR__ = 1");if(window.__TeSt_VaR__){try{delete window.__TeSt_VaR__}catch(error){window.__TeSt_VaR__=null}}else{if(window.execScript){EVAL=function(code){BASE.__code=code;code="try {"+BASENAME+".__result = eval("+BASENAME+".__code)} catch(err) {"+BASENAME+".__result = err}";window.execScript(code);var result=BASE.__result;delete BASE.__result;delete BASE.__code;if(result instanceof Error){throw result}return result}}else{EVAL=function(code){BASE.__code=code;code="try {"+BASENAME+".__result = eval("+BASENAME+".__code)} catch(err) {"+BASENAME+".__result = err}";var head=(document.getElementsByTagName("head"))[0];if(!head){head=document.body}var script=document.createElement("script");script.appendChild(document.createTextNode(code));head.appendChild(script);head.removeChild(script);var result=BASE.__result;delete BASE.__result;delete BASE.__code;if(result instanceof Error){throw result}return result}}}TESTEVAL=null};var USING=function(args,i){if(arguments.length>1){if(arguments.length===2&&!(typeof arguments[0]==="function")&&arguments[0] instanceof Object&&typeof arguments[1]==="number"){args=[].slice.call(args,i)}else{args=[].slice.call(arguments,0)}}if(isArray(args)&&args.length===1&&typeof(args[0])==="function"){args=args[0]}if(typeof args==="function"){if(args.execute===CALLBACK.prototype.execute){return args}return CALLBACK({hook:args})}else{if(isArray(args)){if(typeof(args[0])==="string"&&args[1] instanceof Object&&typeof args[1][args[0]]==="function"){return CALLBACK({hook:args[1][args[0]],object:args[1],data:args.slice(2)})}else{if(typeof args[0]==="function"){return CALLBACK({hook:args[0],data:args.slice(1)})}else{if(typeof args[1]==="function"){return CALLBACK({hook:args[1],object:args[0],data:args.slice(2)})}}}}else{if(typeof(args)==="string"){if(TESTEVAL){TESTEVAL()}return CALLBACK({hook:EVAL,data:[args]})}else{if(args instanceof Object){return CALLBACK(args)}else{if(typeof(args)==="undefined"){return CALLBACK({})}}}}}throw Error("Can't make callback from given data")};var DELAY=function(time,callback){callback=USING(callback);callback.timeout=setTimeout(callback,time);return callback};var WAITFOR=function(callback,signal){callback=USING(callback);if(!callback.called){WAITSIGNAL(callback,signal);signal.pending++}};var WAITEXECUTE=function(){var signals=this.signal;delete this.signal;this.execute=this.oldExecute;delete this.oldExecute;var result=this.execute.apply(this,arguments);if(ISCALLBACK(result)&&!result.called){WAITSIGNAL(result,signals)}else{for(var i=0,m=signals.length;i0&&priority=0;i--){this.hooks.splice(i,1)}this.remove=[]}});var EXECUTEHOOKS=function(hooks,data,reset){if(!hooks){return null}if(!isArray(hooks)){hooks=[hooks]}if(!isArray(data)){data=(data==null?[]:[data])}var handler=HOOKS(reset);for(var i=0,m=hooks.length;ig){g=document.styleSheets.length}if(!i){i=document.head||((document.getElementsByTagName("head"))[0]);if(!i){i=document.body}}return i};var f=[];var c=function(){for(var k=0,j=f.length;k=this.timeout){i(this.STATUS.ERROR);return 1}return 0},file:function(j,i){if(i<0){a.Ajax.loadTimeout(j)}else{a.Ajax.loadComplete(j)}},execute:function(){this.hook.call(this.object,this,this.data[0],this.data[1])},checkSafari2:function(i,j,k){if(i.time(k)){return}if(document.styleSheets.length>j&&document.styleSheets[j].cssRules&&document.styleSheets[j].cssRules.length){k(i.STATUS.OK)}else{setTimeout(i,i.delay)}},checkLength:function(i,l,n){if(i.time(n)){return}var m=0;var j=(l.sheet||l.styleSheet);try{if((j.cssRules||j.rules||[]).length>0){m=1}}catch(k){if(k.message.match(/protected variable|restricted URI/)){m=1}else{if(k.message.match(/Security error/)){m=1}}}if(m){setTimeout(a.Callback([n,i.STATUS.OK]),0)}else{setTimeout(i,i.delay)}}},loadComplete:function(i){i=this.fileURL(i);var j=this.loading[i];if(j&&!j.preloaded){a.Message.Clear(j.message);clearTimeout(j.timeout);if(j.script){if(f.length===0){setTimeout(c,0)}f.push(j.script)}this.loaded[i]=j.status;delete this.loading[i];this.addHook(i,j.callback)}else{if(j){delete this.loading[i]}this.loaded[i]=this.STATUS.OK;j={status:this.STATUS.OK}}if(!this.loadHooks[i]){return null}return this.loadHooks[i].Execute(j.status)},loadTimeout:function(i){if(this.loading[i].timeout){clearTimeout(this.loading[i].timeout)}this.loading[i].status=this.STATUS.ERROR;this.loadError(i);this.loadComplete(i)},loadError:function(i){a.Message.Set(["LoadFailed","File failed to load: %1",i],null,2000);a.Hub.signal.Post(["file load error",i])},Styles:function(k,l){var i=this.StyleString(k);if(i===""){l=a.Callback(l);l()}else{var j=document.createElement("style");j.type="text/css";this.head=h(this.head);this.head.appendChild(j);if(j.styleSheet&&typeof(j.styleSheet.cssText)!=="undefined"){j.styleSheet.cssText=i}else{j.appendChild(document.createTextNode(i))}l=this.timer.create.call(this,l,j)}return l},StyleString:function(n){if(typeof(n)==="string"){return n}var k="",o,m;for(o in n){if(n.hasOwnProperty(o)){if(typeof n[o]==="string"){k+=o+" {"+n[o]+"}\n"}else{if(a.Object.isArray(n[o])){for(var l=0;l="0"&&q<="9"){f[j]=p[f[j]-1];if(typeof f[j]==="number"){f[j]=this.number(f[j])}}else{if(q==="{"){q=f[j].substr(1);if(q>="0"&&q<="9"){f[j]=p[f[j].substr(1,f[j].length-2)-1];if(typeof f[j]==="number"){f[j]=this.number(f[j])}}else{var k=f[j].match(/^\{([a-z]+):%(\d+)\|(.*)\}$/);if(k){if(k[1]==="plural"){var d=p[k[2]-1];if(typeof d==="undefined"){f[j]="???"}else{d=this.plural(d)-1;var h=k[3].replace(/(^|[^%])(%%)*%\|/g,"$1$2%\uEFEF").split(/\|/);if(d>=0&&d=3){c.push([f[0],f[1],this.processSnippet(g,f[2])])}else{c.push(e[d])}}}}else{c.push(e[d])}}return c},markdownPattern:/(%.)|(\*{1,3})((?:%.|.)+?)\2|(`+)((?:%.|.)+?)\4|\[((?:%.|.)+?)\]\(([^\s\)]+)\)/,processMarkdown:function(b,h,d){var j=[],e;var c=b.split(this.markdownPattern);var g=c[0];for(var f=1,a=c.length;f1?d[1]:""));f=null}if(e&&(!b.preJax||d)){c.nodeValue=c.nodeValue.replace(b.postJax,(e.length>1?e[1]:""))}if(f&&!f.nodeValue.match(/\S/)){f=f.previousSibling}}if(b.preRemoveClass&&f&&f.className===b.preRemoveClass){a.MathJax.preview=f}a.MathJax.checked=1},processInput:function(a){var b,i=MathJax.ElementJax.STATE;var h,e,d=a.scripts.length;try{while(a.ithis.processUpdateTime&&a.i1){d.jax[a.outputJax].push(b)}b.MathJax.state=c.OUTPUT},prepareOutput:function(c,f){while(c.jthis.processUpdateTime&&h.i=0;q--){if((b[q].src||"").match(f)){s.script=b[q].innerHTML;if(RegExp.$2){var t=RegExp.$2.substr(1).split(/\&/);for(var p=0,l=t.length;p=parseInt(y[z])}}return true},Select:function(j){var i=j[d.Browser];if(i){return i(d.Browser)}return null}};var e=k.replace(/^Mozilla\/(\d+\.)+\d+ /,"").replace(/[a-z][-a-z0-9._: ]+\/\d+[^ ]*-[^ ]*\.([a-z][a-z])?\d+ /i,"").replace(/Gentoo |Ubuntu\/(\d+\.)*\d+ (\([^)]*\) )?/,"");d.Browser=d.Insert(d.Insert(new String("Unknown"),{version:"0.0"}),a);for(var v in a){if(a.hasOwnProperty(v)){if(a[v]&&v.substr(0,2)==="is"){v=v.slice(2);if(v==="Mac"||v==="PC"){continue}d.Browser=d.Insert(new String(v),a);var r=new RegExp(".*(Version/| Trident/.*; rv:)((?:\\d+\\.)+\\d+)|.*("+v+")"+(v=="MSIE"?" ":"/")+"((?:\\d+\\.)*\\d+)|(?:^|\\(| )([a-z][-a-z0-9._: ]+|(?:Apple)?WebKit)/((?:\\d+\\.)+\\d+)");var u=r.exec(e)||["","","","unknown","0.0"];d.Browser.name=(u[1]!=""?v:(u[3]||u[5]));d.Browser.version=u[2]||u[4]||u[6];break}}}try{d.Browser.Select({Safari:function(j){var i=parseInt((String(j.version).split("."))[0]);if(i>85){j.webkit=j.version}if(i>=538){j.version="8.0"}else{if(i>=537){j.version="7.0"}else{if(i>=536){j.version="6.0"}else{if(i>=534){j.version="5.1"}else{if(i>=533){j.version="5.0"}else{if(i>=526){j.version="4.0"}else{if(i>=525){j.version="3.1"}else{if(i>500){j.version="3.0"}else{if(i>400){j.version="2.0"}else{if(i>85){j.version="1.0"}}}}}}}}}}j.webkit=(navigator.appVersion.match(/WebKit\/(\d+)\./))[1];j.isMobile=(navigator.appVersion.match(/Mobile/i)!=null);j.noContextMenu=j.isMobile},Firefox:function(j){if((j.version==="0.0"||k.match(/Firefox/)==null)&&navigator.product==="Gecko"){var m=k.match(/[\/ ]rv:(\d+\.\d.*?)[\) ]/);if(m){j.version=m[1]}else{var i=(navigator.buildID||navigator.productSub||"0").substr(0,8);if(i>="20111220"){j.version="9.0"}else{if(i>="20111120"){j.version="8.0"}else{if(i>="20110927"){j.version="7.0"}else{if(i>="20110816"){j.version="6.0"}else{if(i>="20110621"){j.version="5.0"}else{if(i>="20110320"){j.version="4.0"}else{if(i>="20100121"){j.version="3.6"}else{if(i>="20090630"){j.version="3.5"}else{if(i>="20080617"){j.version="3.0"}else{if(i>="20061024"){j.version="2.0"}}}}}}}}}}}}j.isMobile=(navigator.appVersion.match(/Android/i)!=null||k.match(/ Fennec\//)!=null||k.match(/Mobile/)!=null)},Chrome:function(i){i.noContextMenu=i.isMobile=!!navigator.userAgent.match(/ Mobile[ \/]/)},Opera:function(i){i.version=opera.version()},Edge:function(i){i.isMobile=!!navigator.userAgent.match(/ Phone/)},MSIE:function(j){j.isMobile=!!navigator.userAgent.match(/ Phone/);j.isIE9=!!(document.documentMode&&(window.performance||window.msPerformance));MathJax.HTML.setScriptBug=!j.isIE9||document.documentMode<9;MathJax.Hub.msieHTMLCollectionBug=(document.documentMode<9);if(document.documentMode<10&&!s.params.NoMathPlayer){try{new ActiveXObject("MathPlayer.Factory.1");j.hasMathPlayer=true}catch(m){}try{if(j.hasMathPlayer){var i=document.createElement("object");i.id="mathplayer";i.classid="clsid:32F66A20-7614-11D4-BD11-00104BD3F987";g.appendChild(i);document.namespaces.add("m","http://www.w3.org/1998/Math/MathML");j.mpNamespace=true;if(document.readyState&&(document.readyState==="loading"||document.readyState==="interactive")){document.write('');j.mpImported=true}}else{document.namespaces.add("mjx_IE_fix","http://www.w3.org/1999/xlink")}}catch(m){}}}})}catch(c){console.error(c.message)}d.Browser.Select(MathJax.Message.browsers);if(h.AuthorConfig&&typeof h.AuthorConfig.AuthorInit==="function"){h.AuthorConfig.AuthorInit()}d.queue=h.Callback.Queue();d.queue.Push(["Post",s.signal,"Begin"],["Config",s],["Cookie",s],["Styles",s],["Message",s],function(){var i=h.Callback.Queue(s.Jax(),s.Extensions());return i.Push({})},["Menu",s],s.onLoad(),function(){MathJax.isReady=true},["Typeset",s],["Hash",s],["MenuZoom",s],["Post",s.signal,"End"])})("MathJax")}}; diff --git a/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云_files/analytics.js.下载 b/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云_files/analytics.js.下载 new file mode 100644 index 0000000..7f246ca --- /dev/null +++ b/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云_files/analytics.js.下载 @@ -0,0 +1,42 @@ +(function(){var $c=function(a){this.w=a||[]};$c.prototype.set=function(a){this.w[a]=!0};$c.prototype.encode=function(){for(var a=[],b=0;b=b.length)wc(a,b,c);else if(8192>=b.length)x(a,b,c)||wd(a,b,c)||wc(a,b,c);else throw ge("len",b.length),new Da(b.length);},wc=function(a,b,c){var d=ta(a+"?"+b);d.onload=d.onerror=function(){d.onload=null;d.onerror=null;c()}},wd=function(a,b,c){var d=O.XMLHttpRequest;if(!d)return!1;var e=new d;if(!("withCredentials"in e))return!1; +e.open("POST",a,!0);e.withCredentials=!0;e.setRequestHeader("Content-Type","text/plain");e.onreadystatechange=function(){4==e.readyState&&(c(),e=null)};e.send(b);return!0},x=function(a,b,c){return O.navigator.sendBeacon?O.navigator.sendBeacon(a,b)?(c(),!0):!1:!1},ge=function(a,b,c){1<=100*Math.random()||Aa("?")||(a=["t=error","_e="+a,"_v=j39","sr=1"],b&&a.push("_f="+b),c&&a.push("_m="+K(c.substring(0,100))),a.push("aip=1"),a.push("z="+fe()),wc(oc()+"/collect",a.join("&"),ua))};var Ha=function(){this.M=[]};Ha.prototype.add=function(a){this.M.push(a)};Ha.prototype.D=function(a){try{for(var b=0;b=100*R(a,Ka))throw"abort";}function Ma(a){if(Aa(P(a,Na)))throw"abort";}function Oa(){var a=M.location.protocol;if("http:"!=a&&"https:"!=a)throw"abort";} +function Pa(a){try{O.navigator.sendBeacon?J(42):O.XMLHttpRequest&&"withCredentials"in new O.XMLHttpRequest&&J(40)}catch(b){}a.set(ld,Td(a),!0);a.set(Ac,R(a,Ac)+1);var c=[];Qa.map(function(b,e){if(e.F){var g=a.get(b);void 0!=g&&g!=e.defaultValue&&("boolean"==typeof g&&(g*=1),c.push(e.F+"="+K(""+g)))}});c.push("z="+Bd());a.set(Ra,c.join("&"),!0)} +function Sa(a){var b=P(a,gd)||oc()+"/collect",c=P(a,fa);!c&&a.get(Vd)&&(c="beacon");if(c){var d=P(a,Ra),e=a.get(Ia),e=e||ua;"image"==c?wc(b,d,e):"xhr"==c&&wd(b,d,e)||"beacon"==c&&x(b,d,e)||ba(b,d,e)}else ba(b,P(a,Ra),a.get(Ia));a.set(Ia,ua,!0)}function Hc(a){var b=O.gaData;b&&(b.expId&&a.set(Nc,b.expId),b.expVar&&a.set(Oc,b.expVar))}function cd(){if(O.navigator&&"preview"==O.navigator.loadPurpose)throw"abort";}function yd(a){var b=O.gaDevIds;ka(b)&&0!=b.length&&a.set("&did",b.join(","),!0)} +function vb(a){if(!a.get(Na))throw"abort";};var hd=function(){return Math.round(2147483647*Math.random())},Bd=function(){try{var a=new Uint32Array(1);O.crypto.getRandomValues(a);return a[0]&2147483647}catch(b){return hd()}},fe=hd;function Ta(a){var b=R(a,Ua);500<=b&&J(15);var c=P(a,Va);if("transaction"!=c&&"item"!=c){var c=R(a,Wa),d=(new Date).getTime(),e=R(a,Xa);0==e&&a.set(Xa,d);e=Math.round(2*(d-e)/1E3);0=c)throw"abort";a.set(Wa,--c)}a.set(Ua,++b)};var Ya=function(){this.data=new ee},Qa=new ee,Za=[];Ya.prototype.get=function(a){var b=$a(a),c=this.data.get(a);b&&void 0==c&&(c=ea(b.defaultValue)?b.defaultValue():b.defaultValue);return b&&b.Z?b.Z(this,a,c):c};var P=function(a,b){var c=a.get(b);return void 0==c?"":""+c},R=function(a,b){var c=a.get(b);return void 0==c||""===c?0:1*c};Ya.prototype.set=function(a,b,c){if(a)if("object"==typeof a)for(var d in a)a.hasOwnProperty(d)&&ab(this,d,a[d],c);else ab(this,a,b,c)}; +var ab=function(a,b,c,d){if(void 0!=c)switch(b){case Na:wb.test(c)}var e=$a(b);e&&e.o?e.o(a,b,c,d):a.data.set(b,c,d)},bb=function(a,b,c,d,e){this.name=a;this.F=b;this.Z=d;this.o=e;this.defaultValue=c},$a=function(a){var b=Qa.get(a);if(!b)for(var c=0;c=b)){var c=(new Date).getHours(),d=[Bd(),Bd(),Bd()].join(".");a=(3==b||5==b?"https:":"http:")+"//www.google-analytics.com/collect?z=br.";a+=[b,"A",c,d].join(".");var e=1!=b%3?"https:":"http:",e=e+"//www.google-analytics.com/collect?z=br.",e=e+[b,"B",c,d].join(".");7==b&&(e=e.replace("//www.","//ssl."));c=function(){4<=b&&6>=b?O.navigator.sendBeacon(e,""):ta(e)};Bd()%2?(ta(a),c()):(c(),ta(a))}}};function fc(){var a,b,c;if((c=(c=O.navigator)?c.plugins:null)&&c.length)for(var d=0;d=c)&&(c={},Ec(c)||Fc(c))){var d=c[Eb];void 0==d||Infinity==d||isNaN(d)||(0c)a[b]=void 0},Fd=function(a){return function(b){"pageview"!=b.get(Va)||a.I||(a.I=!0,gc(b,function(b){a.send("timing",b)}))}};var hc=!1,mc=function(a){if("cookie"==P(a,ac)){var b=P(a,U),c=nd(a),d=kc(P(a,Yb)),e=lc(P(a,W)),g=1E3*R(a,Zb),ca=P(a,Na);if("auto"!=e)zc(b,c,d,e,ca,g)&&(hc=!0);else{J(32);var l;a:{c=[];e=xa().split(".");if(4==e.length&&(l=e[e.length-1],parseInt(l,10)==l)){l=["none"];break a}for(l=e.length-2;0<=l;l--)c.push(e.slice(l).join("."));c.push("none");l=c}for(var k=0;k=a&&d.push({hash:ca[0],R:e[g],O:ca})}return 0==d.length?void 0:1==d.length?d[0]:Zc(b,d)||Zc(c,d)||Zc(null,d)||d[0]}function Zc(a,b){var c,d;null==a?c=d=1:(c=La(a),d=La(D(a,".")?a.substring(1):"."+a));for(var e=0;ed.length)){c=[];for(var e=0;e=ca[0]||0>=ca[1]?"":ca.join("x");a.set(rb,c);a.set(tb,fc());a.set(ob,M.characterSet||M.charset);a.set(sb,b&&"function"===typeof b.javaEnabled&&b.javaEnabled()||!1);a.set(nb, +(b&&(b.language||b.browserLanguage)||"").toLowerCase());if(d&&a.get(cc)&&(b=M.location.hash)){b=b.split(/[?&#]+/);d=[];for(c=0;carguments.length)){var b,c;"string"===typeof arguments[0]?(b=arguments[0],c=[].slice.call(arguments,1)):(b=arguments[0]&&arguments[0][Va],c=arguments);b&&(c=za(qc[b]||[],c),c[Va]=b,this.b.set(c,void 0,!0),this.filters.D(this.b),this.b.data.m={},je(this.b))}};var rc=function(a){if("prerender"==M.visibilityState)return!1;a();return!0};var td=/^(?:(\w+)\.)?(?:(\w+):)?(\w+)$/,sc=function(a){if(ea(a[0]))this.u=a[0];else{var b=td.exec(a[0]);null!=b&&4==b.length&&(this.c=b[1]||"t0",this.K=b[2]||"",this.C=b[3],this.a=[].slice.call(a,1),this.K||(this.A="create"==this.C,this.i="require"==this.C,this.g="provide"==this.C,this.ba="remove"==this.C),this.i&&(3<=this.a.length?(this.X=this.a[1],this.W=this.a[2]):this.a[1]&&(qa(this.a[1])?this.X=this.a[1]:this.W=this.a[1])));b=a[1];a=a[2];if(!this.C)throw"abort";if(this.i&&(!qa(b)||""==b))throw"abort"; +if(this.g&&(!qa(b)||""==b||!ea(a)))throw"abort";if(ud(this.c)||ud(this.K))throw"abort";if(this.g&&"t0"!=this.c)throw"abort";}};function ud(a){return 0<=a.indexOf(".")||0<=a.indexOf(":")};var Yd,Zd,$d;Yd=new ee;$d=new ee;Zd={ec:45,ecommerce:46,linkid:47}; +var ae=function(a){function b(a){var b=(a.hostname||"").split(":")[0].toLowerCase(),c=(a.protocol||"").toLowerCase(),c=1*a.port||("http:"==c?80:"https:"==c?443:"");a=a.pathname||"";D(a,"/")||(a="/"+a);return[b,""+c,a]}var c=M.createElement("a");c.href=M.location.href;var d=(c.protocol||"").toLowerCase(),e=b(c),g=c.search||"",ca=d+"//"+e[0]+(e[1]?":"+e[1]:"");D(a,"//")?a=d+a:D(a,"/")?a=ca+a:!a||D(a,"?")?a=ca+e[2]+(a||g):0>a.split("/")[0].indexOf(":")&&(a=ca+e[2].substring(0,e[2].lastIndexOf("/"))+ +"/"+a);c.href=a;d=b(c);return{protocol:(c.protocol||"").toLowerCase(),host:d[0],port:d[1],path:d[2],G:c.search||"",url:a||""}};var Z={ga:function(){Z.f=[]}};Z.ga();Z.D=function(a){var b=Z.J.apply(Z,arguments),b=Z.f.concat(b);for(Z.f=[];0c;c++){var d=b[c].src;if(d&&0==d.indexOf("https://www.google-analytics.com/analytics")){J(33);b=!0;break a}}b= +!1}b&&(Ba=!0)}Ud()||Ba||!Ed(new Od)||(J(36),Ba=!0);(O.gaplugins=O.gaplugins||{}).Linker=Dc;b=Dc.prototype;Yd.set("linker",Dc);X("decorate",b,b.ca,20);X("autoLink",b,b.S,25);Yd.set("displayfeatures",fd);Yd.set("adfeatures",fd);a=a&&a.q;ka(a)?Z.D.apply(N,a):J(50)}};N.da=function(){for(var a=N.getAll(),b=0;b>21:b;return b};})(window); +/* |xGv00|ef935f82729173a4fe6ff3177be1e6cc */ \ No newline at end of file diff --git a/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云_files/api.js.下载 b/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云_files/api.js.下载 new file mode 100644 index 0000000..c95b7d3 --- /dev/null +++ b/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云_files/api.js.下载 @@ -0,0 +1,19 @@ +var QCLogin=function(t){function e(n){if(i[n])return i[n].exports;var o=i[n]={exports:{},id:n,loaded:!1};return t[n].call(o.exports,o,o.exports,e),o.loaded=!0,o.exports}var i={};return e.m=t,e.c=i,e.p="//<%=CSS_DOMAIN%>/qcloud/main/scripts/",e(0)}({0:function(t,e,i){"use strict";t.exports=i("YIfu")},"+dHT":function(t,e,i){"use strict";var n=i("WPtr"),o=n.get("language")||"zh";"zh"!=o&&(o="en");var s="https://ssl.captcha.qq.com/TCaptcha.js",r=function(t){if(window.TencentCaptcha)return t();var e=document.createElement("script"),i=!1,n=function(e){var n=setInterval(function(){if(window.TencentCaptcha){if(clearInterval(n),i)return;i=!0,t(e)}},50)};e.addEventListener?e.addEventListener("load",function(){n()},!1):e.attachEvent&&e.attachEvent("onreadystatechange",function(){4!=e.readyState&&"complete"!=e.readyState&&"loaded"!=e.readyState||n()}),e.src=s,document.head.appendChild(e),setTimeout(function(){i||(i=!0,n({ret:9999}))},8e3)};t.exports={getAppid:function(){return location.host.indexOf("qcloud.com")>-1?"en"==o?"2067090065":"2042382584":location.host.indexOf("cloud.tencent.com")>-1?"en"==o?"2009899766":"2006043797":void 0},verify:function(t){var e=$.Deferred(),i=this.getAppid(),n={};"zh"!=o&&""!=o&&(n={needFeedBack:!1,forceLang:"en"});var s=function(t){if(t&&0==t.ret){var n={ticket:t.ticket,captchaAppId:i,randstr:t.randstr};e.resolve(n)}else e.reject(t)},a=function(){t?(n.type="embed",new TencentCaptcha(t,i,s,n).show()):new TencentCaptcha(i,s,n).show()};return window.TencentCaptcha?a(e):r(function(t){t?e.resolve(t):a(e)}),e.promise()}}},WPtr:function(t,e,i){var n,o;"function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};!function(s){n=s,o="function"==typeof n?n.call(e,i,e,t):n,!(void 0!==o&&(t.exports=o))}(function(){function t(){for(var t=0,e={};t1){if(s=t({path:"/"},n.defaults,s),"number"==typeof s.expires){var a=new Date;a.setMilliseconds(a.getMilliseconds()+864e5*s.expires),s.expires=a}try{r=JSON.stringify(o),/^[\{\[]/.test(r)&&(o=r)}catch(t){}return o=i.write?i.write(o,e):encodeURIComponent(String(o)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),e=encodeURIComponent(String(e)),e=e.replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent),e=e.replace(/[\(\)]/g,escape),document.cookie=[e,"=",o,s.expires&&"; expires="+s.expires.toUTCString(),s.path&&"; path="+s.path,s.domain&&"; domain="+s.domain,s.secure?"; secure":""].join("")}e||(r={});for(var c=document.cookie?document.cookie.split("; "):[],h=/(%[0-9A-Z]{2})+/g,l=0;linternational<%}%> <% if(isThirdParty) {%>outside<%}%>">\n\t<% if (!hide_close_icon) { %>\n\t\n\t<% } %>\n\t
\n\t\t\n\n\t\t\n\n\t\t\n\n\t\t
\n\t\t\t<% if (!isIntl) { %>\n\t\t\t
<%=__("\u5176\u4ed6\u767b\u5f55\u65b9\u5f0f")%>
\n\t\t\t\n\t\t\t<%}%>\n\t\t\t
style="text-align: center"<%}%>>\n\t\t\t\t<% if (!hide_register) { %>\n\t\t\t\t\n\t\t\t\t<%}%>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<% if (!isThirdParty && !hideQQ && !hideMP) {%>\n\t\t\t\t\n\t\t\t\t<%}%>\n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t
<%=__("\u5df2\u767b\u5f55\u8d26\u53f7")%>
\n\t\t\t
\n\t\t\t\t
    \n\t\t\t\t\t
    \n\t\t\t\t
\n\n\t\t\t\t\n\t\t\t
\n\t\t\t\n\t\t
\n\n\t
\n\n\n\n\n'},sdDX:function(t,e,i){"use strict";var n=i("WPtr"),o=i("HbSM"),s=i("rCGI"),r=i("h97R"),a=i("4G7m"),c=i("M34W"),h=i("5zD2"),l=new h(navigator.userAgent).getResult(),u=new o;u.setPublicKey(a.encryptPublicKey);var d=n.get("language"),p={loadCss:function(){var t=this,e=$.Deferred();return t.cssLoaded?e.resolve():r(a.login_css,function(){t.cssLoaded=!0,e.resolve()}),e},showInputErrorTip:function(t,e,i){t=$(t),this.hideInputErrorTip(),this.hidePromptTip(t),i=i||{},$(".J-loginTip").html(this.__(e)).show(),t.addClass("error").focus(),this.notifyResize()},hideInputErrorTip:function(t){t?$(t).removeClass("error").parent().find(".J-errorTip").hide():$(".J-errorTip").hide().parent().find("input").removeClass("error"),this.notifyResize()},showPromptTip:function(t,e,i){t=$(t),this.hidePromptTip();var n=t.closest(".clg-form-input");if(!n.find(".J-errorTip:visible").length){var o=n.find(".J-promptTip");i=i||{},o.length||(o=n.append('
\t
\t
').find(".J-promptTip")),o.show().find(".clg-bubble-inner").html(this.__(e)),this.notifyResize()}},hidePromptTip:function(t){t?$(t).parent().find(".J-promptTip").hide():$(".J-promptTip").hide(),this.notifyResize()},checkLoginForm:function(){var t=$(".J-commonLoginContent"),e=t.find(".J-username"),i=$.trim(e.val()),n=t.find(".J-password"),o=$.trim(n.val()),s=t.find(".J-vcodeArea"),r=t.find(".J-vcodeInput"),c=$.trim(r.val()),h={},l=this;if(""==i)return l.showInputErrorTip(e,"\u8bf7\u8f93\u5165\u90ae\u7bb1"),!1;if(i.indexOf("@")==-1)return l.showInputErrorTip(e,"\u90ae\u7bb1\u683c\u5f0f\u6709\u8bef\uff0c\u8bf7\u4fee\u6539"),!1;if(h.username=i,""==o)return l.showInputErrorTip(n,"\u8bf7\u8f93\u5165\u5bc6\u7801"),!1;if(h.password=a.encrypt?u.encrypt(o):o,s.is(":visible")){if(""==c)return l.showInputErrorTip(r,"\u8bf7\u8f93\u5165\u9a8c\u8bc1\u7801"),!1;h.vcode=c}return h},query:function(t){return t=String(t).replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1"),location.search.slice(1).match(RegExp("(?:^|&)"+t+"(?:=([^&#]*)?|[&#]|$)"))?String(RegExp.$1||"").replace(/\+/g," "):void 0},__:function(t,e){var e=e||d;return e&&"en"==e&&s&&s[t]?s[t]:t},getTranslator:function(t){var e=this;return function(i){return e.__(i,t)}},capslock:function(t){if(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent))return!1;var e=t.keyCode||t.which,i=t.shiftKey||16==e||!1;return e>=65&&e<=90&&!i||e>=97&&e<=122&&i},tmpl:function(){var t={},e=function(t){return 0==t?t:(t=(t||"").toString(),t.replace(/&(?!\w+;)/g,"&").replace(//g,">").replace(/\"/g,"""))},i=function(t,e){if(e)for(var i in e){var n=new RegExp("<%#\\s?"+i+"%>","g");t=t.replace(n,e[i])}return t};return function n(o,s,r){var a=!/\W/.test(o);!a&&(o=i(o,r));var c=a?t[o]=t[o]||n(i(document.getElementById(o).innerHTML,r)):new Function("obj","_escape","var _p='';with(obj){_p+='"+o.replace(/[\r\t\n]/g," ").split("\\'").join("\\\\'").split("'").join("\\'").split("<%").join("\t").replace(/\t-(.*?)%>/g,"'+$1+'").replace(/\t=(.*?)%>/g,"'+_escape($1)+'").split("\t").join("';").split("%>").join("_p+='")+"';} return _p;"),h=function(t){return c(t,e)};return s?h(s):h}}(),loadProxyFrame:function(t){var e=this;if(e.loadProxyFrameDfd)return e.loadProxyFrameDfd;e.loadProxyFrameDfd=$.Deferred();var i=document.createElement("iframe");return i.style.display="none",i.src=t,i.onload=function(){e.loadProxyFrameDfd.resolve(i),i.onload=null},document.body.appendChild(i),e.loadProxyFrameDfd},proxyPost:function(t,e){var i=this,n="callback"+Math.floor(1e7*Math.random());window[n]=function(t){e(t);try{delete window[n]}catch(t){window[n]=null}};var o=function e(o){try{o.contentWindow.postSend(t.url,t.data,n)}catch(s){"TypeError"!==s.name||o.contentWindow?o.contentWindow.postMessage(JSON.stringify({url:t.url,data:t.data,requestType:n}),"*"):(i.loadProxyFrameDfd=null,i.loadProxyFrame(a.qcloud_post_proxy).done(e))}};i.loadProxyFrame(a.qcloud_post_proxy).done(o)},isMobile:function(){var t=(navigator.userAgent||"").toLowerCase(),e=["android","iphone","windows phone","ipad"];if(a.isThirdParty)return!1;for(var i=0;i-1},getWechatLoginUrl:function(){return this.isMobile()?a.mWechatLoginUrl:a.wechatLoginUrl},saveLoginTypeInLocal:function(t){var e=180;n.set("lastLoginType",t,{domain:c.getCookieDomain(),path:"/",expires:e})},getLastLoginType:function(){return n.get("lastLoginType")||""},notifyResize:function(){top.postMessage(JSON.stringify({action:"resize",width:$(".J-loginMainContent").width()+80,height:$(".J-loginMainContent").height()+100}),"*")},isSupportWxLoginInMobile:function(){var t=l&&l.browser&&l.browser.name?l.browser.name:"",e=l&&l.os&&l.os.name?l.os.name:"";t=t.toLowerCase(),e=e.toLowerCase();var i=this.isMobile()&&("ucbrowser"==t||"qqbrowser"==t||"mobile safari"==t&&"ios"==e);return this.isInWeapp()||this.isWechat()||i},isInMQQ:function(){var t=navigator.userAgent,e=this.isMobile()&&/qqbrowser/i.test(t)&&/\bQQ\/[\d\.]+/i.test(t);return e},isInWeapp:function(){return this.isMobile()&&"miniprogram"===window.__wxjs_environment},isPad:function(){var t=window.screen.width||0;return this.isMobile()&&t>=601},isInConsole:function(){var t=location.hostname;return"console.cloud.tencent.com"==t||"console.qcloud.com"==t},requireSeajsModule:function(t){if(window.seajs){var e=window.seajs.Module.get(window.seajs.Module.resolve(t));return e.exports||e.exec()}},htmlEncode:function(t){var e="";return null==t||"undefined"==typeof t||0==t.length?"":(e=t.replace(/&/g,"&"),e=e.replace(//g,">"),e=e.replace(/ /g," "),e=e.replace(/\'/g,"'"),e=e.replace(/\"/g,"""),e=e.replace(/\n/g,"
"))},detectWxDomain:function(){if(!this.wxDomainDetected&&window.$){this.wxDomainDetected=!0;var t=!1,e="https://long.open.weixin.qq.com/connect/l/qrconnect?uuid=0213Kqcw8dy8ul5L&_t="+(new Date).getTime();$.getScript(e,function(){t=!0}),setTimeout(function(){t||$.getScript("https://"+c.getRealHostname()+"/services/ajax/empty_return/wxDomainNotResponse5?t="+(new Date).getTime())},5e3),setTimeout(function(){t||$.getScript("https://"+c.getRealHostname()+"/services/ajax/empty_return/wxDomainNotResponse10?t="+(new Date).getTime())},1e4)}}};t.exports=p},HbSM:function(t,e){"use strict";function i(t,e,i){null!=t&&("number"==typeof t?this.fromNumber(t,e,i):null==e&&"string"!=typeof t?this.fromString(t,256):this.fromString(t,e))}function n(){return new i(null)}function o(t,e,i,n,o,s){for(;--s>=0;){var r=e*this[t++]+i[n]+o;o=Math.floor(r/67108864),i[n++]=67108863&r}return o}function s(t,e,i,n,o,s){for(var r=32767&e,a=e>>15;--s>=0;){var c=32767&this[t],h=this[t++]>>15,l=a*c+h*r;c=r*c+((32767&l)<<15)+i[n]+(1073741823&o),o=(c>>>30)+(l>>>15)+a*h+(o>>>30),i[n++]=1073741823&c}return o}function r(t,e,i,n,o,s){for(var r=16383&e,a=e>>14;--s>=0;){var c=16383&this[t],h=this[t++]>>14,l=a*c+h*r;c=r*c+((16383&l)<<14)+i[n]+o,o=(c>>28)+(l>>14)+a*h,i[n++]=268435455&c}return o}function a(t){return Ce.charAt(t)}function c(t,e){var i=De[t.charCodeAt(e)];return null==i?-1:i}function h(t){for(var e=this.t-1;e>=0;--e)t[e]=this[e];t.t=this.t,t.s=this.s}function l(t){this.t=1,this.s=t<0?-1:0,t>0?this[0]=t:t<-1?this[0]=t+this.DV:this.t=0}function u(t){var e=n();return e.fromInt(t),e}function d(t,e){var n;if(16==e)n=4;else if(8==e)n=3;else if(256==e)n=8;else if(2==e)n=1;else if(32==e)n=5;else{if(4!=e)return void this.fromRadix(t,e);n=2}this.t=0,this.s=0;for(var o=t.length,s=!1,r=0;--o>=0;){var a=8==n?255&t[o]:c(t,o);a<0?"-"==t.charAt(o)&&(s=!0):(s=!1,0==r?this[this.t++]=a:r+n>this.DB?(this[this.t-1]|=(a&(1<>this.DB-r):this[this.t-1]|=a<=this.DB&&(r-=this.DB))}8==n&&0!=(128&t[0])&&(this.s=-1,r>0&&(this[this.t-1]|=(1<0&&this[this.t-1]==t;)--this.t}function f(t){if(this.s<0)return"-"+this.negate().toString(t);var e;if(16==t)e=4;else if(8==t)e=3;else if(2==t)e=1;else if(32==t)e=5;else{if(4!=t)return this.toRadix(t);e=2}var i,n=(1<0)for(c>c)>0&&(o=!0,s=a(i));r>=0;)c>(c+=this.DB-e)):(i=this[r]>>(c-=e)&n,c<=0&&(c+=this.DB,--r)),i>0&&(o=!0),o&&(s+=a(i));return o?s:"0"}function g(){var t=n();return i.ZERO.subTo(this,t),t}function m(){return this.s<0?this.negate():this}function w(t){var e=this.s-t.s;if(0!=e)return e;var i=this.t;if(e=i-t.t,0!=e)return this.s<0?-e:e;for(;--i>=0;)if(0!=(e=this[i]-t[i]))return e;return 0}function b(t){var e,i=1;return 0!=(e=t>>>16)&&(t=e,i+=16),0!=(e=t>>8)&&(t=e,i+=8),0!=(e=t>>4)&&(t=e,i+=4),0!=(e=t>>2)&&(t=e,i+=2),0!=(e=t>>1)&&(t=e,i+=1),i}function y(){return this.t<=0?0:this.DB*(this.t-1)+b(this[this.t-1]^this.s&this.DM)}function x(t,e){var i;for(i=this.t-1;i>=0;--i)e[i+t]=this[i];for(i=t-1;i>=0;--i)e[i]=0;e.t=this.t+t,e.s=this.s}function T(t,e){for(var i=t;i=0;--i)e[i+r+1]=this[i]>>o|a,a=(this[i]&s)<=0;--i)e[i]=0;e[r]=a,e.t=this.t+r+1,e.s=this.s,e.clamp()}function _(t,e){e.s=this.s;var i=Math.floor(t/this.DB);if(i>=this.t)return void(e.t=0);var n=t%this.DB,o=this.DB-n,s=(1<>n;for(var r=i+1;r>n;n>0&&(e[this.t-i-1]|=(this.s&s)<>=this.DB;if(t.t>=this.DB;n+=this.s}else{for(n+=this.s;i>=this.DB;n-=t.s}e.s=n<0?-1:0,n<-1?e[i++]=this.DV+n:n>0&&(e[i++]=n),e.t=i,e.clamp()}function R(t,e){var n=this.abs(),o=t.abs(),s=n.t;for(e.t=s+o.t;--s>=0;)e[s]=0;for(s=0;s=0;)t[i]=0;for(i=0;i=e.DV&&(t[i+e.t]-=e.DV,t[i+e.t+1]=1)}t.t>0&&(t[t.t-1]+=e.am(i,e[i],t,2*i,0,1)),t.s=0,t.clamp()}function L(t,e,o){var s=t.abs();if(!(s.t<=0)){var r=this.abs();if(r.t0?(s.lShiftTo(l,a),r.lShiftTo(l,o)):(s.copyTo(a),r.copyTo(o));var u=a.t,d=a[u-1];if(0!=d){var p=d*(1<1?a[u-2]>>this.F2:0),f=this.FV/p,g=(1<=0&&(o[o.t++]=1,o.subTo(y,o)),i.ONE.dlShiftTo(u,y),y.subTo(a,a);a.t=0;){var x=o[--v]==d?this.DM:Math.floor(o[v]*f+(o[v-1]+m)*g);if((o[v]+=a.am(0,x,o,w,0,u))0&&o.rShiftTo(l,o),c<0&&i.ZERO.subTo(o,o)}}}function C(t){var e=n();return this.abs().divRemTo(t,null,e),this.s<0&&e.compareTo(i.ZERO)>0&&t.subTo(e,e),e}function D(t){this.m=t}function J(t){return t.s<0||t.compareTo(this.m)>=0?t.mod(this.m):t}function I(t){return t}function A(t){t.divRemTo(this.m,null,t)}function U(t,e,i){t.multiplyTo(e,i),this.reduce(i)}function B(t,e){t.squareTo(e),this.reduce(e)}function O(){if(this.t<1)return 0;var t=this[0];if(0==(1&t))return 0;var e=3&t;return e=e*(2-(15&t)*e)&15,e=e*(2-(255&t)*e)&255,e=e*(2-((65535&t)*e&65535))&65535,e=e*(2-t*e%this.DV)%this.DV,e>0?this.DV-e:-e}function M(t){this.m=t,this.mp=t.invDigit(),this.mpl=32767&this.mp,this.mph=this.mp>>15,this.um=(1<0&&this.m.subTo(e,e),e}function P(t){var e=n();return t.copyTo(e),this.reduce(e),e}function $(t){for(;t.t<=this.mt2;)t[t.t++]=0;for(var e=0;e>15)*this.mpl&this.um)<<15)&t.DM;for(i=e+this.m.t,t[i]+=this.m.am(0,n,t,e,0,this.m.t);t[i]>=t.DV;)t[i]-=t.DV,t[++i]++}t.clamp(),t.drShiftTo(this.m.t,t),t.compareTo(this.m)>=0&&t.subTo(this.m,t)}function N(t,e){t.squareTo(e),this.reduce(e)}function K(t,e,i){t.multiplyTo(e,i),this.reduce(i)}function V(){return 0==(this.t>0?1&this[0]:this.s)}function j(t,e){if(t>4294967295||t<1)return i.ONE;var o=n(),s=n(),r=e.convert(this),a=b(t)-1;for(r.copyTo(o);--a>=0;)if(e.sqrTo(o,s),(t&1<0)e.mulTo(s,r,o);else{var c=o;o=s,s=c}return e.revert(o)}function Q(t,e){var i;return i=t<256||e.isEven()?new D(e):new M(e),this.exp(t,i)}function W(){var t=n();return this.copyTo(t),t}function F(){if(this.s<0){if(1==this.t)return this[0]-this.DV;if(0==this.t)return-1}else{if(1==this.t)return this[0];if(0==this.t)return 0}return(this[1]&(1<<32-this.DB)-1)<>24}function z(){return 0==this.t?this.s:this[0]<<16>>16}function G(t){return Math.floor(Math.LN2*this.DB/Math.log(t))}function X(){return this.s<0?-1:this.t<=0||1==this.t&&this[0]<=0?0:1}function Y(t){if(null==t&&(t=10),0==this.signum()||t<2||t>36)return"0";var e=this.chunkSize(t),i=Math.pow(t,e),o=u(i),s=n(),r=n(),a="";for(this.divRemTo(o,s,r);s.signum()>0;)a=(i+r.intValue()).toString(t).substr(1)+a,s.divRemTo(o,s,r);return r.intValue().toString(t)+a}function Z(t,e){this.fromInt(0),null==e&&(e=10);for(var n=this.chunkSize(e),o=Math.pow(e,n),s=!1,r=0,a=0,h=0;h=n&&(this.dMultiply(o),this.dAddOffset(a,0),r=0,a=0))}r>0&&(this.dMultiply(Math.pow(e,r)),this.dAddOffset(a,0)),s&&i.ZERO.subTo(this,this)}function tt(t,e,n){if("number"==typeof e)if(t<2)this.fromInt(1);else for(this.fromNumber(t,n),this.testBit(t-1)||this.bitwiseTo(i.ONE.shiftLeft(t-1),ct,this),this.isEven()&&this.dAddOffset(1,0);!this.isProbablePrime(e);)this.dAddOffset(2,0),this.bitLength()>t&&this.subTo(i.ONE.shiftLeft(t-1),this);else{var o=new Array,s=7&t; +o.length=(t>>3)+1,e.nextBytes(o),s>0?o[0]&=(1<0)for(n>n)!=(this.s&this.DM)>>n&&(e[o++]=i|this.s<=0;)n<8?(i=(this[t]&(1<>(n+=this.DB-8)):(i=this[t]>>(n-=8)&255,n<=0&&(n+=this.DB,--t)),0!=(128&i)&&(i|=-256),0==o&&(128&this.s)!=(128&i)&&++o,(o>0||i!=this.s)&&(e[o++]=i);return e}function it(t){return 0==this.compareTo(t)}function nt(t){return this.compareTo(t)<0?this:t}function ot(t){return this.compareTo(t)>0?this:t}function st(t,e,i){var n,o,s=Math.min(t.t,this.t);for(n=0;n>=16,e+=16),0==(255&t)&&(t>>=8,e+=8),0==(15&t)&&(t>>=4,e+=4),0==(3&t)&&(t>>=2,e+=2),0==(1&t)&&++e,e}function wt(){for(var t=0;t=this.t?0!=this.s:0!=(this[e]&1<>=this.DB;if(t.t>=this.DB;n+=this.s}else{for(n+=this.s;i>=this.DB;n+=t.s}e.s=n<0?-1:0,n>0?e[i++]=n:n<-1&&(e[i++]=this.DV+n),e.t=i,e.clamp()}function kt(t){var e=n();return this.addTo(t,e),e}function Lt(t){var e=n();return this.subTo(t,e),e}function Ct(t){var e=n();return this.multiplyTo(t,e),e}function Dt(){var t=n();return this.squareTo(t),t}function Jt(t){var e=n();return this.divRemTo(t,e,null),e}function It(t){var e=n();return this.divRemTo(t,null,e),e}function At(t){var e=n(),i=n();return this.divRemTo(t,e,i),new Array(e,i)}function Ut(t){this[this.t]=this.am(0,t-1,this,0,0,this.t),++this.t,this.clamp()}function Bt(t,e){if(0!=t){for(;this.t<=e;)this[this.t++]=0;for(this[e]+=t;this[e]>=this.DV;)this[e]-=this.DV,++e>=this.t&&(this[this.t++]=0),++this[e]}}function Ot(){}function Mt(t){return t}function qt(t,e,i){t.multiplyTo(e,i)}function Pt(t,e){t.squareTo(e)}function $t(t){return this.exp(t,new Ot)}function Nt(t,e,i){var n=Math.min(this.t+t.t,e);for(i.s=0,i.t=n;n>0;)i[--n]=0;var o;for(o=i.t-this.t;n=0;)i[n]=0;for(n=Math.max(e-this.t,0);n2*this.m.t)return t.mod(this.m);if(t.compareTo(this.m)<0)return t;var e=n();return t.copyTo(e),this.reduce(e),e}function Qt(t){return t}function Wt(t){for(t.drShiftTo(this.m.t-1,this.r2),t.t>this.m.t+1&&(t.t=this.m.t+1,t.clamp()),this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3),this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);t.compareTo(this.r2)<0;)t.dAddOffset(1,this.m.t+1);for(t.subTo(this.r2,t);t.compareTo(this.m)>=0;)t.subTo(this.m,t)}function Ft(t,e){t.squareTo(e),this.reduce(e)}function Ht(t,e,i){t.multiplyTo(e,i),this.reduce(i)}function zt(t,e){var i,o,s=t.bitLength(),r=u(1);if(s<=0)return r;i=s<18?1:s<48?3:s<144?4:s<768?5:6,o=s<8?new D(e):e.isEven()?new Vt(e):new M(e);var a=new Array,c=3,h=i-1,l=(1<1){var d=n();for(o.sqrTo(a[1],d);c<=l;)a[c]=n(),o.mulTo(d,a[c-2],a[c]),c+=2}var p,f,g=t.t-1,m=!0,v=n();for(s=b(t[g])-1;g>=0;){for(s>=h?p=t[g]>>s-h&l:(p=(t[g]&(1<0&&(p|=t[g-1]>>this.DB+s-h)),c=i;0==(1&p);)p>>=1,--c;if((s-=c)<0&&(s+=this.DB,--g),m)a[p].copyTo(r),m=!1;else{for(;c>1;)o.sqrTo(r,v),o.sqrTo(v,r),c-=2;c>0?o.sqrTo(r,v):(f=r,r=v,v=f),o.mulTo(v,a[p],r)}for(;g>=0&&0==(t[g]&1<0&&(e.rShiftTo(s,e),i.rShiftTo(s,i));e.signum()>0;)(o=e.getLowestSetBit())>0&&e.rShiftTo(o,e),(o=i.getLowestSetBit())>0&&i.rShiftTo(o,i),e.compareTo(i)>=0?(e.subTo(i,e),e.rShiftTo(1,e)):(i.subTo(e,i),i.rShiftTo(1,i));return s>0&&i.lShiftTo(s,i),i}function Xt(t){if(t<=0)return 0;var e=this.DV%t,i=this.s<0?t-1:0;if(this.t>0)if(0==e)i=this[0]%t;else for(var n=this.t-1;n>=0;--n)i=(e*i+this[n])%t;return i}function Yt(t){var e=t.isEven();if(this.isEven()&&e||0==t.signum())return i.ZERO;for(var n=t.clone(),o=this.clone(),s=u(1),r=u(0),a=u(0),c=u(1);0!=n.signum();){for(;n.isEven();)n.rShiftTo(1,n),e?(s.isEven()&&r.isEven()||(s.addTo(this,s),r.subTo(t,r)),s.rShiftTo(1,s)):r.isEven()||r.subTo(t,r),r.rShiftTo(1,r);for(;o.isEven();)o.rShiftTo(1,o),e?(a.isEven()&&c.isEven()||(a.addTo(this,a),c.subTo(t,c)),a.rShiftTo(1,a)):c.isEven()||c.subTo(t,c),c.rShiftTo(1,c);n.compareTo(o)>=0?(n.subTo(o,n),e&&s.subTo(a,s),r.subTo(c,r)):(o.subTo(n,o),e&&a.subTo(s,a),c.subTo(r,c))}return 0!=o.compareTo(i.ONE)?i.ZERO:c.compareTo(t)>=0?c.subtract(t):c.signum()<0?(c.addTo(t,c),c.signum()<0?c.add(t):c):c}function Zt(t){var e,i=this.abs();if(1==i.t&&i[0]<=Je[Je.length-1]){for(e=0;e>1,t>Je.length&&(t=Je.length);for(var r=n(),a=0;a=0&&e>0;){var s=t.charCodeAt(o--);s<128?n[--e]=s:s>127&&s<2048?(n[--e]=63&s|128,n[--e]=s>>6|192):(n[--e]=63&s|128,n[--e]=s>>6&63|128,n[--e]=s>>12|224)}n[--e]=0;for(var r=new ae,a=new Array;e>2;){for(a[0]=0;0==a[0];)r.nextBytes(a);n[--e]=a[0]}return n[--e]=2,n[--e]=0,new i(n)}function le(){this.n=null,this.e=0,this.d=null,this.p=null,this.q=null,this.dmp1=null,this.dmq1=null,this.coeff=null}function ue(t,e){null!=t&&null!=e&&t.length>0&&e.length>0?(this.n=ce(t,16),this.e=parseInt(e,16)):console.error("Invalid RSA public key")}function de(t){return t.modPowInt(this.e,this.n)}function pe(t){var e=he(t,this.n.bitLength()+7>>3);if(null==e)return null;var i=this.doPublic(e);if(null==i)return null;var n=i.toString(16);return 0==(1&n.length)?n:"0"+n}function fe(t,e){for(var i=t.toByteArray(),n=0;n=i.length)return null;for(var o="";++n191&&s<224?(o+=String.fromCharCode((31&s)<<6|63&i[n+1]),++n):(o+=String.fromCharCode((15&s)<<12|(63&i[n+1])<<6|63&i[n+2]),n+=2)}return o}function ge(t,e,i){null!=t&&null!=e&&t.length>0&&e.length>0?(this.n=ce(t,16),this.e=parseInt(e,16),this.d=ce(i,16)):console.error("Invalid RSA private key")}function me(t,e,i,n,o,s,r,a){null!=t&&null!=e&&t.length>0&&e.length>0?(this.n=ce(t,16),this.e=parseInt(e,16),this.d=ce(i,16),this.p=ce(n,16),this.q=ce(o,16),this.dmp1=ce(s,16),this.dmq1=ce(r,16),this.coeff=ce(a,16)):console.error("Invalid RSA private key")}function ve(t,e){var n=new ae,o=t>>1;this.e=parseInt(e,16);for(var s=new i(e,16);;){for(;this.p=new i(t-o,1,n),0!=this.p.subtract(i.ONE).gcd(s).compareTo(i.ONE)||!this.p.isProbablePrime(10););for(;this.q=new i(o,1,n),0!=this.q.subtract(i.ONE).gcd(s).compareTo(i.ONE)||!this.q.isProbablePrime(10););if(this.p.compareTo(this.q)<=0){var r=this.p;this.p=this.q,this.q=r}var a=this.p.subtract(i.ONE),c=this.q.subtract(i.ONE),h=a.multiply(c);if(0==h.gcd(s).compareTo(i.ONE)){this.n=this.p.multiply(this.q),this.d=s.modInverse(h),this.dmp1=this.d.mod(a),this.dmq1=this.d.mod(c),this.coeff=this.q.modInverse(this.p);break}}}function we(t){if(null==this.p||null==this.q)return t.modPow(this.d,this.n);for(var e=t.mod(this.p).modPow(this.dmp1,this.p),i=t.mod(this.q).modPow(this.dmq1,this.q);e.compareTo(i)<0;)e=e.add(this.p);return e.subtract(i).multiply(this.coeff).mod(this.p).multiply(this.q).add(i)}function be(t){var e=ce(t,16),i=this.doPrivate(e);return null==i?null:fe(i,this.n.bitLength()+7>>3)}function ye(t){var e,i,n="";for(e=0;e+3<=t.length;e+=3)i=parseInt(t.substring(e,e+3),16),n+=$e.charAt(i>>6)+$e.charAt(63&i);for(e+1==t.length?(i=parseInt(t.substring(e,e+1),16),n+=$e.charAt(i<<2)):e+2==t.length&&(i=parseInt(t.substring(e,e+2),16),n+=$e.charAt(i>>2)+$e.charAt((3&i)<<4));(3&n.length)>0;)n+=Ne;return n}function xe(t){var e,i,n="",o=0;for(e=0;e>2),i=3&v,o=1):1==o?(n+=a(i<<2|v>>4),i=15&v,o=2):2==o?(n+=a(i),n+=a(v>>2),i=3&v,o=3):(n+=a(i<<2|v>>4),n+=a(15&v),o=0));return 1==o&&(n+=a(i<<2)),n}var Te,Se="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},_e=0xdeadbeefcafe,Ee=15715070==(16777215&_e);Ee&&"Microsoft Internet Explorer"==navigator.appName?(i.prototype.am=s,Te=30):Ee&&"Netscape"!=navigator.appName?(i.prototype.am=o,Te=26):(i.prototype.am=r,Te=28),i.prototype.DB=Te,i.prototype.DM=(1<=256||Be>=Oe)return void(window.removeEventListener?window.removeEventListener("mousemove",t,!1):window.detachEvent&&window.detachEvent("onmousemove",t));try{var i=e.x+e.y;Ue[Be++]=255&i,this.count+=1}catch(t){}};window.addEventListener?window.addEventListener("mousemove",Pe,!1):window.attachEvent&&window.attachEvent("onmousemove",Pe)}ae.prototype.nextBytes=re,le.prototype.doPublic=de,le.prototype.setPublic=ue,le.prototype.encrypt=pe,le.prototype.doPrivate=we,le.prototype.setPrivate=ge,le.prototype.setPrivateEx=me,le.prototype.generate=ve,le.prototype.decrypt=be,function(){var t=function(t,e,o){var s=new ae,r=t>>1;this.e=parseInt(e,16);var a=new i(e,16),c=this,h=function e(){var h=function(){if(c.p.compareTo(c.q)<=0){var t=c.p;c.p=c.q,c.q=t}var n=c.p.subtract(i.ONE),s=c.q.subtract(i.ONE),r=n.multiply(s);0==r.gcd(a).compareTo(i.ONE)?(c.n=c.p.multiply(c.q),c.d=a.modInverse(r),c.dmp1=c.d.mod(n),c.dmq1=c.d.mod(s),c.coeff=c.q.modInverse(c.p),setTimeout(function(){o()},0)):setTimeout(e,0)},l=function t(){c.q=n(),c.q.fromNumberAsync(r,1,s,function(){c.q.subtract(i.ONE).gcda(a,function(e){0==e.compareTo(i.ONE)&&c.q.isProbablePrime(10)?setTimeout(h,0):setTimeout(t,0)})})},u=function e(){c.p=n(),c.p.fromNumberAsync(t-r,1,s,function(){c.p.subtract(i.ONE).gcda(a,function(t){0==t.compareTo(i.ONE)&&c.p.isProbablePrime(10)?setTimeout(l,0):setTimeout(e,0)})})};setTimeout(u,0)};setTimeout(h,0)};le.prototype.generateAsync=t;var e=function(t,e){var i=this.s<0?this.negate():this.clone(),n=t.s<0?t.negate():t.clone();if(i.compareTo(n)<0){var o=i;i=n,n=o}var s=i.getLowestSetBit(),r=n.getLowestSetBit();if(r<0)return void e(i);s0&&(i.rShiftTo(r,i),n.rShiftTo(r,n));var a=function t(){(s=i.getLowestSetBit())>0&&i.rShiftTo(s,i),(s=n.getLowestSetBit())>0&&n.rShiftTo(s,n),i.compareTo(n)>=0?(i.subTo(n,i),i.rShiftTo(1,i)):(n.subTo(i,n),n.rShiftTo(1,n)),i.signum()>0?setTimeout(t,0):(r>0&&n.lShiftTo(r,n),setTimeout(function(){e(n)},0))};setTimeout(a,10)};i.prototype.gcda=e;var o=function(t,e,n,o){if("number"==typeof e)if(t<2)this.fromInt(1);else{this.fromNumber(t,n),this.testBit(t-1)||this.bitwiseTo(i.ONE.shiftLeft(t-1),ct,this),this.isEven()&&this.dAddOffset(1,0);var s=this,r=function n(){s.dAddOffset(2,0),s.bitLength()>t&&s.subTo(i.ONE.shiftLeft(t-1),s),s.isProbablePrime(e)?setTimeout(function(){o()},0):setTimeout(n,0)};setTimeout(r,0)}else{var a=new Array,c=7&t;a.length=(t>>3)+1,e.nextBytes(a),c>0?a[0]&=(1<MIT License + */ +"undefined"!=typeof KJUR&&window.KJUR||(window.KJUR={}),"undefined"!=typeof KJUR.asn1&&KJUR.asn1||(KJUR.asn1={}),KJUR.asn1.ASN1Util=new function(){this.integerToByteHex=function(t){var e=t.toString(16);return e.length%2==1&&(e="0"+e),e},this.bigIntToMinTwosComplementsHex=function(t){var e=t.toString(16);if("-"!=e.substr(0,1))e.length%2==1?e="0"+e:e.match(/^[0-7]/)||(e="00"+e);else{var n=e.substr(1),o=n.length;o%2==1?o+=1:e.match(/^[0-7]/)||(o+=2);for(var s="",r=0;r15)throw"ASN.1 length too long to represent by 8x: n = "+e.toString(16);var o=128+n;return o.toString(16)+i},this.getEncodedHex=function(){return(null==this.hTLV||this.isModified)&&(this.hV=this.getFreshValueHex(),this.hL=this.getLengthHexFromValue(),this.hTLV=this.hT+this.hL+this.hV,this.isModified=!1),this.hTLV},this.getValueHex=function(){return this.getEncodedHex(),this.hV},this.getFreshValueHex=function(){return""}},KJUR.asn1.DERAbstractString=function(t){KJUR.asn1.DERAbstractString.superclass.constructor.call(this);this.getString=function(){return this.s},this.setString=function(t){this.hTLV=null,this.isModified=!0,this.s=t,this.hV=stohex(this.s)},this.setStringHex=function(t){this.hTLV=null,this.isModified=!0,this.s=null,this.hV=t},this.getFreshValueHex=function(){return this.hV},"undefined"!=typeof t&&("undefined"!=typeof t.str?this.setString(t.str):"undefined"!=typeof t.hex&&this.setStringHex(t.hex))},Ke.extend(KJUR.asn1.DERAbstractString,KJUR.asn1.ASN1Object),KJUR.asn1.DERAbstractTime=function(t){KJUR.asn1.DERAbstractTime.superclass.constructor.call(this);this.localDateToUTC=function(t){utc=t.getTime()+6e4*t.getTimezoneOffset();var e=new Date(utc);return e},this.formatDate=function(t,e){var i=this.zeroPadding,n=this.localDateToUTC(t),o=String(n.getFullYear());"utc"==e&&(o=o.substr(2,2));var s=i(String(n.getMonth()+1),2),r=i(String(n.getDate()),2),a=i(String(n.getHours()),2),c=i(String(n.getMinutes()),2),h=i(String(n.getSeconds()),2);return o+s+r+a+c+h+"Z"},this.zeroPadding=function(t,e){return t.length>=e?t:new Array(e-t.length+1).join("0")+t},this.getString=function(){return this.s},this.setString=function(t){this.hTLV=null,this.isModified=!0,this.s=t,this.hV=stohex(this.s)},this.setByDateValue=function(t,e,i,n,o,s){var r=new Date(Date.UTC(t,e-1,i,n,o,s,0));this.setByDate(r)},this.getFreshValueHex=function(){return this.hV}},Ke.extend(KJUR.asn1.DERAbstractTime,KJUR.asn1.ASN1Object),KJUR.asn1.DERAbstractStructured=function(t){KJUR.asn1.DERAbstractString.superclass.constructor.call(this);this.setByASN1ObjectArray=function(t){this.hTLV=null,this.isModified=!0,this.asn1Array=t},this.appendASN1Object=function(t){this.hTLV=null,this.isModified=!0,this.asn1Array.push(t)},this.asn1Array=new Array,"undefined"!=typeof t&&"undefined"!=typeof t.array&&(this.asn1Array=t.array)},Ke.extend(KJUR.asn1.DERAbstractStructured,KJUR.asn1.ASN1Object),KJUR.asn1.DERBoolean=function(){KJUR.asn1.DERBoolean.superclass.constructor.call(this),this.hT="01",this.hTLV="0101ff"},Ke.extend(KJUR.asn1.DERBoolean,KJUR.asn1.ASN1Object),KJUR.asn1.DERInteger=function(t){KJUR.asn1.DERInteger.superclass.constructor.call(this),this.hT="02",this.setByBigInteger=function(t){this.hTLV=null,this.isModified=!0,this.hV=KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(t)},this.setByInteger=function(t){var e=new i(String(t),10);this.setByBigInteger(e)},this.setValueHex=function(t){this.hV=t},this.getFreshValueHex=function(){return this.hV},"undefined"!=typeof t&&("undefined"!=typeof t.bigint?this.setByBigInteger(t.bigint):"undefined"!=typeof t.int?this.setByInteger(t.int):"undefined"!=typeof t.hex&&this.setValueHex(t.hex))},Ke.extend(KJUR.asn1.DERInteger,KJUR.asn1.ASN1Object),KJUR.asn1.DERBitString=function(t){KJUR.asn1.DERBitString.superclass.constructor.call(this),this.hT="03",this.setHexValueIncludingUnusedBits=function(t){this.hTLV=null,this.isModified=!0,this.hV=t},this.setUnusedBitsAndHexValue=function(t,e){if(t<0||7=2?(r[r.length]=a,a=0,c=0):a<<=4}}if(c)throw"Hex encoding incomplete: 4 bits missing";return r},window.Hex=i}(),function(t){var e,i={};i.decode=function(i){var n;if(e===t){var o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s="= \f\n\r\t\xa0\u2028\u2029";for(e=[],n=0;n<64;++n)e[o.charAt(n)]=n;for(n=0;n=4?(r[r.length]=a>>16,r[r.length]=a>>8&255,r[r.length]=255&a,a=0,c=0):a<<=6}}switch(c){case 1:throw"Base64 encoding incomplete: at least 2 bits missing";case 2:r[r.length]=a>>10;break;case 3:r[r.length]=a>>16,r[r.length]=a>>8&255}return r},i.re=/-----BEGIN [^-]+-----([A-Za-z0-9+\/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+\/=\s]+)====/,i.unarmor=function(t){var e=i.re.exec(t);if(e)if(e[1])t=e[1];else{if(!e[2])throw"RegExp out of sync";t=e[2]}return i.decode(t)},window.Base64=i}(),function(t){function e(t,i){t instanceof e?(this.enc=t.enc,this.pos=t.pos):(this.enc=t,this.pos=i)}function i(t,e,i,n,o){this.stream=t,this.header=e,this.length=i,this.tag=n,this.sub=o}var n=100,o="\u2026",s={tag:function(t,e){var i=document.createElement(t);return i.className=e,i},text:function(t){return document.createTextNode(t)}};e.prototype.get=function(e){if(e===t&&(e=this.pos++),e>=this.enc.length)throw"Requesting byte offset "+e+" on a stream of length "+this.enc.length;return this.enc[e]},e.prototype.hexDigits="0123456789ABCDEF",e.prototype.hexByte=function(t){return this.hexDigits.charAt(t>>4&15)+this.hexDigits.charAt(15&t)},e.prototype.hexDump=function(t,e,i){for(var n="",o=t;o191&&o<224?String.fromCharCode((31&o)<<6|63&this.get(n++)):String.fromCharCode((15&o)<<12|(63&this.get(n++))<<6|63&this.get(n++))}return i},e.prototype.parseStringBMP=function(t,e){for(var i="",n=t;n4){i<<=3;var n=this.get(t);if(0===n)i-=8;else for(;n<128;)n<<=1,--i;return"("+i+" bit)"}for(var o=0,s=t;st;--r){for(var a=this.get(r),c=s;c<8;++c)o+=a>>c&1?"1":"0";s=0}}return o},e.prototype.parseOctetString=function(t,e){var i=e-t,s="("+i+" byte) ";i>n&&(e=t+n);for(var r=t;rn&&(s+=o),s},e.prototype.parseOID=function(t,e){for(var i="",n=0,o=0,s=t;s=31?"bigint":n);n=o=0}}return i},i.prototype.typeName=function(){if(this.tag===t)return"unknown";var e=this.tag>>6,i=(this.tag>>5&1,31&this.tag);switch(e){case 0:switch(i){case 0:return"EOC";case 1:return"BOOLEAN";case 2:return"INTEGER";case 3:return"BIT_STRING";case 4:return"OCTET_STRING";case 5:return"NULL";case 6:return"OBJECT_IDENTIFIER";case 7:return"ObjectDescriptor";case 8:return"EXTERNAL";case 9:return"REAL";case 10:return"ENUMERATED";case 11:return"EMBEDDED_PDV";case 12:return"UTF8String";case 16:return"SEQUENCE";case 17:return"SET";case 18:return"NumericString";case 19:return"PrintableString";case 20:return"TeletexString";case 21:return"VideotexString";case 22:return"IA5String";case 23:return"UTCTime";case 24:return"GeneralizedTime";case 25:return"GraphicString";case 26:return"VisibleString";case 27:return"GeneralString";case 28:return"UniversalString";case 30:return"BMPString";default:return"Universal_"+i.toString(16)}case 1:return"Application_"+i.toString(16);case 2:return"["+i+"]";case 3:return"Private_"+i.toString(16)}},i.prototype.reSeemsASCII=/^[ -~]+$/,i.prototype.content=function(){if(this.tag===t)return null;var e=this.tag>>6,i=31&this.tag,s=this.posContent(),r=Math.abs(this.length);if(0!==e){if(null!==this.sub)return"("+this.sub.length+" elem)";var a=this.stream.parseStringISO(s,s+Math.min(r,n));return this.reSeemsASCII.test(a)?a.substring(0,2*n)+(a.length>2*n?o:""):this.stream.parseOctetString(s,s+r)}switch(i){case 1:return 0===this.stream.get(s)?"false":"true";case 2:return this.stream.parseInteger(s,s+r);case 3:return this.sub?"("+this.sub.length+" elem)":this.stream.parseBitString(s,s+r);case 4:return this.sub?"("+this.sub.length+" elem)":this.stream.parseOctetString(s,s+r);case 6:return this.stream.parseOID(s,s+r);case 16:case 17:return"("+this.sub.length+" elem)";case 12:return this.stream.parseStringUTF(s,s+r);case 18:case 19:case 20:case 21:case 22:case 26:return this.stream.parseStringISO(s,s+r);case 30:return this.stream.parseStringBMP(s,s+r);case 23:case 24:return this.stream.parseTime(s,s+r)}return null},i.prototype.toString=function(){return this.typeName()+"@"+this.stream.pos+"[header:"+this.header+",length:"+this.length+",sub:"+(null===this.sub?"null":this.sub.length)+"]"},i.prototype.print=function(e){if(e===t&&(e=""),document.writeln(e+this),null!==this.sub){e+=" ";for(var i=0,n=this.sub.length;i=0&&(i+="+"),i+=this.length,32&this.tag?i+=" (constructed)":3!=this.tag&&4!=this.tag||null===this.sub||(i+=" (encapsulates)"),i+="\n",null!==this.sub){e+=" ";for(var n=0,o=this.sub.length;n",i+="Length: "+this.header+"+",i+=this.length>=0?this.length:-this.length+" (undefined)",32&this.tag?i+="
(constructed)":3!=this.tag&&4!=this.tag||null===this.sub||(i+="
(encapsulates)"),null!==n&&(i+="
Value:
"+n+"","object"===("undefined"==typeof oids?"undefined":Se(oids))&&6==this.tag)){var a=oids[n];a&&(a.d&&(i+="
"+a.d),a.c&&(i+="
"+a.c),a.w&&(i+="
(warning!)"))}r.innerHTML=i,t.appendChild(r);var c=s.tag("div","sub");if(null!==this.sub)for(var h=0,l=this.sub.length;h=o)){var r=s.tag("span",e);r.appendChild(s.text(i.hexDump(n,o))),t.appendChild(r)}},i.prototype.toHexDOM=function(e){var i=s.tag("span","hex");if(e===t&&(e=i),this.head.hexNode=i,this.head.onmouseover=function(){this.hexNode.className="hexCurrent"},this.head.onmouseout=function(){this.hexNode.className="hex"},i.asn1=this,i.onmouseover=function(){var t=!e.selected;t&&(e.selected=this.asn1,this.className="hexCurrent"),this.asn1.fakeHover(t)},i.onmouseout=function(){var t=e.selected==this.asn1;this.asn1.fakeOut(t),t&&(e.selected=null,this.className="hex")},this.toHexDOM_sub(i,"tag",this.stream,this.posStart(),this.posStart()+1),this.toHexDOM_sub(i,this.length>=0?"dlen":"ulen",this.stream,this.posStart()+1,this.posContent()),null===this.sub)i.appendChild(s.text(this.stream.hexDump(this.posContent(),this.posEnd())));else if(this.sub.length>0){var n=this.sub[0],o=this.sub[this.sub.length-1];this.toHexDOM_sub(i,"intro",this.stream,this.posContent(),n.posStart());for(var r=0,a=this.sub.length;r3)throw"Length over 24 bits not supported at position "+(t.pos-1);if(0===i)return-1;e=0;for(var n=0;n4)return!1;var s=new e(o);3==t&&s.get();var r=s.get();if(r>>6&1)return!1;try{var a=i.decodeLength(s);return s.pos-o.pos+a==n}catch(t){return!1}},i.decode=function(t){t instanceof e||(t=new e(t,0));var n=new e(t),o=t.get(),s=i.decodeLength(t),r=t.pos-n.pos,a=null;if(i.hasContent(o,s,t)){var c=t.pos;if(3==o&&t.get(),a=[],s>=0){for(var h=c+s;t.pos\u8054\u7cfb\u6211\u4eec'):void(t.captchaAppId&&o.sendLoginRequest(t))})},loginReturnHandle:function(t){var e=this;switch(t=t||{},0!=t.code&&e.$loginbox.find(".J-loginBtn").show().next("a").hide(),+t.code){case 0:e._redirect(e.opts.login_forward_url+"?s_url="+encodeURIComponent(e.opts.s_url)+"&fwd_flag="+encodeURIComponent(this.opts.fwd_flag));break;case 70002:a.showInputErrorTip(e.$loginbox.find(".J-username"),"\u53c2\u6570\u9519\u8bef\uff0c\u8bf7\u91cd\u65b0\u8f93\u5165");break;case 70006:case 70008:a.showInputErrorTip(e.$loginbox.find(".J-password"),"\u8d26\u53f7\u4e0d\u5b58\u5728\u6216\u5bc6\u7801\u9519\u8bef\uff0c\u8bf7\u91cd\u65b0\u8f93\u5165");break;case 70007:e.$loginbox.find(".J-password").val(""),a.showInputErrorTip(e.$loginbox.find(".J-password"),"\u8d26\u53f7\u4e0d\u5b58\u5728\u6216\u5bc6\u7801\u9519\u8bef\uff0c\u8bf7\u91cd\u65b0\u8f93\u5165");break;case 70010:a.showInputErrorTip(null,f('\u8d26\u53f7\u5bc6\u7801\u9519\u8bef\u6b21\u6570\u8d85\u8fc7\u5f53\u65e5\u6700\u5927\u6b21\u6570\uff0c\u5efa\u8bae\u60a8\u901a\u8fc7 \u5fd8\u8bb0\u5bc6\u7801 \u6216 \u5fd8\u8bb0\u8d26\u53f7 \u627e\u56de\u8d26\u53f7\u5bc6\u7801\uff0c\u6b21\u65e5\u518d\u5c1d\u8bd5\u767b\u5f55'));break;case 310001:e.showCaptcha();break;case 310002:a.showInputErrorTip(null,"\u9a8c\u8bc1\u7801\u9519\u8bef\uff0c\u8bf7\u91cd\u65b0\u8f93\u5165");break;case 70024:e.opts.isIntl?a.showInputErrorTip(null,'Your account is for Tencent Cloud China\uff0cLog in now'):a.showInputErrorTip(null,f("\u8be5\u8d26\u53f7\u5c5e\u4e8e\u56fd\u9645\u7ad9\u8d26\u53f7\uff0c")+''+f("\u524d\u5f80\u767b\u5f55")+"");break;case 30301:a.isInWeapp()?a.showInputErrorTip(e.$loginbox.find(".J-password"),"\u8d26\u53f7\u4e0d\u5b58\u5728\u6216\u5bc6\u7801\u9519\u8bef\uff0c\u8bf7\u91cd\u65b0\u8f93\u5165"):a.showInputErrorTip(null,f('\u8be5\u8d26\u53f7\u53ef\u80fd\u662f\u901a\u8fc7QQ\u5feb\u6377\u6ce8\u518c\uff0c\u8bf7\u5207\u6362\u81f3QQ\u767b\u5f55'));break;case 20003:e.showMailActivationTip();break;case 30007:a.showInputErrorTip(null,f('\u8d26\u53f7\u5bc6\u7801\u8f93\u5165\u5f53\u65e5\u4ec5\u52691\u6b21\u673a\u4f1a\uff0c\u662f\u5426 \u5fd8\u8bb0\u5bc6\u7801 \u6216 \u5fd8\u8bb0\u8d26\u53f7'));break;default:a.showInputErrorTip(e.$loginbox.find(".J-username"),"\u767b\u5f55\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5")}},showMailActivationTip:function(){var t=this,e={"qq.com":"qq.com","163.com":"163.com","sina.com":"sina.com","gmail.com":"google.com","126.com":"126.com","hotmail.com":"live.com","21cn.com":"21cn.com","yahoo.com":"yahoo.com","yahoo.com.cn":"yahoo.com.cn","live.com":"live.com","sohu.com":"sohu.com","sina.com.cn":"sina.com.cn","tencent.com":"tencent.com","msn.com":"msn.com","tom.com":"tom.com"},i=t.$loginbox.find(".J-username"),n=$.trim(i.val()),o=n.split("@")[1];e[o]?(a.showInputErrorTip(i,'\u6b64\u90ae\u7bb1\u5730\u5740\u5c1a\u672a\u6fc0\u6d3b\uff0c\u8bf7\u67e5\u770b\u6fc0\u6d3b\u90ae\u4ef6\uff0c\u5b8c\u6210\u6fc0\u6d3b\u540e\u91cd\u65b0\u767b\u5f55\u3002'),$(".J-loginTip a").attr("href","http://mail."+e[o])):a.showInputErrorTip(i,"\u6b64\u90ae\u7bb1\u5730\u5740\u5c1a\u672a\u6fc0\u6d3b\uff0c\u8bf7\u67e5\u770b\u6fc0\u6d3b\u90ae\u4ef6\uff0c\u5b8c\u6210\u6fc0\u6d3b\u540e\u91cd\u65b0\u767b\u5f55\u3002")},switchLoginType:function(t,e){var i=this;switch(t){default:case"email":$("#loginAbout").hide(),i._currentLoginType=t,i._enterEmailMod(),a.saveLoginTypeInLocal("email");break;case"qq":a.saveLoginTypeInLocal("qq"),i.redirectToQQConnect();break;case"wx":$("#loginAbout").show(),i.opts.enableIframeWechatLogin?(i._currentLoginType=t,i._leaveEmailMod(),i.$loginbox.find("#wxFrame").attr("src")||(i.$loginbox.find("#wxFrame").hide().attr("src",i._getWXQrcodeUrl()),setTimeout(function(){i.$loginbox.find("#wxFrame").show()},400)),a.saveLoginTypeInLocal(t)):i._redirect(i._getWXLoginUrl());break;case"wework":i._leaveEmailMod(),i.$loginbox.find("#weworkFrame").hide().attr("src",i._getWeworkLoginUrl()),setTimeout(function(){i.$loginbox.find("#weworkFrame").show()},400);break;case"wework-m":a.saveLoginTypeInLocal("wework"),i.redirectToWeworkSubaccount();break;case"wxmp":window.wxmpBreak?window.wxmpBreak(function(){i._redirect(i._getWXMPLoginUrl())}):i._redirect(i._getWXMPLoginUrl())}a.notifyResize()},isDialogScene:function(){return this.opts&&!this.opts.container},isIframeScene:function(){try{return window.top!=window.self}catch(t){return!0}},hideLoginBox:function(){this.$loginbox&&this.$loginbox.empty().hide(),this.$loginmask&&this.$loginmask.hide(),this.isDialogScene()&&$('[data-name="loginApiCss"]').attr("disabled",!0).prop("disabled",!0)},logout:function(){this._clearLoginState()},_getLoginBox:function(){var t=$("#"+this._loginboxId);return t.length||(t=$("
").css({position:"fixed",left:0,top:0,width:"460px",height:"534px","background-color":"transparent","z-index":9001,"border-radius":"4px"}).attr("id",this._loginboxId).appendTo("body")),this.$loginbox=t},_getLoginMask:function(){var t=$("#"+this._loginmaskId);return t.length||(t=$("
").css({position:"fixed",left:0,top:0,right:0,bottom:0,background:"#000",opacity:".75","z-index":9e3}).attr("id",this._loginmaskId).appendTo("body")),this.$loginmask=t},_getPtloginUrl:function(t){var e=this.opts.qqLoginUrl,i={};return i.s_url=this.opts.s_url,"undefined"!=typeof this.opts.fwd_flag&&(i.fwd_flag=this.opts.fwd_flag),e+$.param(i)},_getWXLoginUrl:function(t){var e=this.opts.wechatLoginUrl+"s_url="+encodeURIComponent(this.opts.s_url);return t&&(e+="&theme=simple"),e+="&t="+(new Date).getTime(),"undefined"!=typeof this.opts.fwd_flag&&(e+="&fwd_flag="+encodeURIComponent(this.opts.fwd_flag)),e},_getWXQrcodeUrl:function(){var t=s.wechatLoginUrl;return this.opts.skipRegisterCompletion||(t+="action=associate&"),t+="s_url="+encodeURIComponent(this.opts.s_url),t+="&theme=simple&t="+(new Date).getTime(),"undefined"!=typeof this.opts.fwd_flag&&(t+="&fwd_flag="+encodeURIComponent(this.opts.fwd_flag)),t},_getWXMPLoginUrl:function(){var t=this.opts.mpLoginUrl+"s_url="+encodeURIComponent(this.opts.s_url);return"undefined"!=this.opts.fwd_flag&&(t+="&fwd_flag="+encodeURIComponent(this.opts.fwd_flag)),t},_getWeworkLoginUrl:function(){var t=s.weworkLoginUrl+"?s_url="+encodeURIComponent(this.opts.s_url);"undefined"!=this.opts.fwd_flag&&(t+="&fwd_flag="+encodeURIComponent(this.opts.fwd_flag));var e=s.weworkQrcodeUrl+"?s_url="+encodeURIComponent(t);return e},_getForwardDirectiveFlag:function(t){var e=1,i=2,n=4,o=0;return t.shallowLogin||t.skipRegisterCompletion||(o+=e),t.shallowLogin||t.skipLoginProtect||(o+=i),t.shallowLogin||t.skipOwnerSelection||(o+=n),o},_getLanguage:function(t){return(t||{}).language||n.get("language")||""},_getVCodeUrl:function(){return this.opts.vcode_url+"?t="+(new Date).getTime()},_setVCodeImgUrl:function(){this.$loginbox.find(".J-vcodeImg").attr("src",this._getVCodeUrl()),a.notifyResize()},_clearLoginState:function(){var t={domain:h.getCookieDomain(),path:"/"};n.remove("uin",t),n.remove("skey",t),n.remove("p_skey",t),n.remove("nick",t),n.remove("tinyid",t),this.updateCsrfCode()},_messageCallback:function(t){var e=this,i={},n=t.origin||t.originalEvent.origin;if(n&&(n=n.replace(/(:\d+)/g,"")),/\.(tencent\.com|qcloud\.com|qq\.com|dnspod\.cn|dnspod\.com)$/i.test(n)){try{i=JSON.parse(t.data||"")}catch(t){}switch(i.action){case"redirect":i&&i.url&&!/^http/i.test(i.url)&&(i.url=""),e._redirect(i.url||top.location.href);break;case"loginReturnHandle":e.loginReturnHandle(i.resp);break;case"loginCompletion":e._loginCompletionCallback()}}},_redirect:function(t){this.stopCheckLogin=!0,window.LOGIN_API_COMPLETE=!0;try{var e=top.location.href;t.indexOf("#")!=-1&&e.split("#")[0]==t.split("#")[0]?top.location.reload():top.location.href=t}catch(e){top.postMessage(JSON.stringify({action:"redirect",url:t}),"*")}},_loginCompletionCallback:function(){this.hideLoginBox(),this.opts.completionCallback&&this.opts.completionCallback()},_getLoginPage:function(){var t="https://"+l+"/login";t+="?s_url="+encodeURIComponent(this.opts.s_url),this.opts.skipRegisterCompletion&&(t+="&rc=0"),this.opts.skipLoginProtect&&(t+="&vf=0"),this.opts.skipOwnerSelection&&(t+="&sc=0"),"undefined"!=typeof this.opts.fwd_flag&&(t+="&fwd_flag="+this.opts.fwd_flag),this._clearLoginState(),location.href=t},_enterEmailMod:function(){var t=this;t.$loginbox.find(".J-loginContentBox").hide(),t.opts.isIntl?(t.$loginbox.find(".J-backToMainMod").hide(),t.$loginbox.find(".J-switchLoginTypeArea").show()):(t.$loginbox.find(".J-backToMainMod").show(),t.$loginbox.find(".J-switchLoginTypeArea").hide(),t.$loginbox.find(".J-footerLinkArea").hide());var e=t.$loginbox.find(".J-qcloginBox"),i=e.find(".J-username"),n=e.find(".J-password");e.show(),$.trim(i.val())?n.focus():i.focus()},_leaveEmailMod:function(){var t=this;t.$loginbox.find(".J-loginContentBox").hide(),t.$loginbox.find(".J-switchLoginTypeArea").show(),t.$loginbox.find(".J-mainloginBox").show(),t.$loginbox.find(".J-backToMainMod").hide(),t.$loginbox.find(".J-footerLinkArea").show()}};window.addEventListener&&window.addEventListener("message",function(t){g._messageCallback(t)},!1),t.exports=g.init()},h97R:function(t,e){"use strict";function i(t,e,i){var o=h.test(t),l=r.createElement(o?"link":"script");if(i){var u=isFunction(i)?i(t):i;u&&(l.charset=u)}n(l,e,o,t),o?(l.rel="stylesheet",l.href=t,l.setAttribute("data-role","global"),l.setAttribute("data-name","loginApiCss")):(l.async=!0,l.src=t),s=l,c?a.insertBefore(l,c):a.appendChild(l),s=null}function n(t,e,i,n){function s(){t.onload=t.onerror=t.onreadystatechange=null,t=null,e()}var r="onload"in t;return!i||!l&&r?void(r?(t.onload=s,t.onerror=function(){s()}):t.onreadystatechange=function(){/loaded|complete/.test(t.readyState)&&s()}):void setTimeout(function(){o(t,e)},1)}function o(t,e){var i,n=t.sheet;if(l)n&&(i=!0);else if(n)try{n.cssRules&&(i=!0)}catch(t){"NS_ERROR_DOM_SECURITY_ERR"===t.name&&(i=!0)}setTimeout(function(){i?e():o(t,e)},20)}var s,r=document,a=r.head||r.getElementsByTagName("head")[0]||r.documentElement,c=a.getElementsByTagName("base")[0],h=/\.css(?:\?|$)/i,l=+navigator.userAgent.replace(/.*(?:AppleWebKit|AndroidWebKit)\/(\d+).*/,"$1")<536;t.exports=i},"5zD2":function(t,e,i){var n;(function(t){"use strict";var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};/*! + * UAParser.js v0.7.19 + * Lightweight JavaScript-based User-Agent string parser + * https://github.com/faisalman/ua-parser-js + * + * Copyright © 2012-2016 Faisal Salman + * Dual licensed under GPLv2 or MIT + */ +!function(s,r){var a="0.7.19",c="",h="?",l="function",u="undefined",d="object",p="string",f="major",g="model",m="name",v="type",w="vendor",b="version",y="architecture",x="console",T="mobile",S="tablet",_="smarttv",E="wearable",R="embedded",k={extend:function(t,e){var i={};for(var n in t)e[n]&&e[n].length%2===0?i[n]=e[n].concat(t[n]):i[n]=t[n];return i},has:function(t,e){return"string"==typeof t&&e.toLowerCase().indexOf(t.toLowerCase())!==-1},lowerize:function(t){return t.toLowerCase()},major:function(t){return("undefined"==typeof t?"undefined":o(t))===p?t.replace(/[^\d\.]/g,"").split(".")[0]:r},trim:function(t){return t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}},L={rgx:function(t,e){for(var i,n,s,a,c,h,u=0;u0?2==a.length?o(a[1])==l?this[a[0]]=a[1].call(this,h):this[a[0]]=a[1]:3==a.length?o(a[1])!==l||a[1].exec&&a[1].test?this[a[0]]=h?h.replace(a[1],a[2]):r:this[a[0]]=h?a[1].call(this,h,a[2]):r:4==a.length&&(this[a[0]]=h?a[3].call(this,h.replace(a[1],a[2])):r):this[a]=h?h:r;u+=2}},str:function(t,e){for(var i in e)if(o(e[i])===d&&e[i].length>0){for(var n=0;n2)return void this.hideSuggest();var i=this.suggestSuffix.slice();if(1==e.length)return void this.hideSuggest();if(!this.canSuggest(e[1])||""==e[0])return void this.hideSuggest();if(t=e[0]+"@",""!=e[1])for(var n=i.length-1;n>=0;n--)0==!i[n].indexOf(e[1])&&i.splice(n,1);for(var o=[],n=0;n'+this.htmlEncode(t)+i[n]+"");this.suggestList.html(o.join("")),this.showSuggest()},showSuggest:function(){this.suggestList.show()},hideSuggest:function(){this.suggestList.hide()},switchSuggestList:function(t){if(this.suggestList.is(":visible")){var e=this.suggestList.find("li.tip-hover").index()||0,i=this.suggestList.find("li").length;"down"==t?e==i-1?e=0:e++:"up"==t&&(0==e?e=i-1:e--),this.suggestList.find("li").eq(e).addClass("tip-hover").siblings().removeClass("tip-hover"),this.inputElem.val(this.suggestList.find("li").eq(e).text())}},suggestEnterHandle:function(){var t=this.suggestList.find("li.tip-hover");t.length&&this.inputElem.val(t.text()),this.hideSuggest()},suggestClickHandle:function(t){var e=$(t.target);this.inputElem.val(e.text()),this.hideSuggest()},htmlEncode:function(t){var e="";return null==t||"undefined"==typeof t||0==t.length?"":(e=t.replace(/&/g,"&"),e=e.replace(//g,">"),e=e.replace(/ /g," "),e=e.replace(/\'/g,"'"),e=e.replace(/\"/g,"""),e=e.replace(/\n/g,"
"))},bindEvent:function(){var t=this;this.inputElem.off("keyup.loginInput focus.loginInput keydown.loginInput blur.loginInput").on("keyup.loginInput focus.loginInput",function(e){var i=e.which||e.keyCode;switch(i){case 38:return!1;case 40:return}var n=t.getInputVal();t.htmlEncode(n)!=n?t.hideSuggest():n.length>0&&n.length<30&&n.split("@").length<=2?t.updateSuggestList():t.hideSuggest()}).on("keydown.loginInput",function(e){var i=e.which||e.keyCode;switch(i){case 27:return void t.hideSuggest();case 38:return t.switchSuggestList("up"),!1;case 40:return void t.switchSuggestList("down");case 13:return void t.suggestEnterHandle()}}).on("blur.loginInput",function(){t.hideSuggest()}),this.suggestList.off().on("mousedown","li",function(e){t.suggestClickHandle(e)})}},t.exports=i},N7Fw:function(t,e,i){var n,o;!function(s,r){"use strict";n=r,o="function"==typeof n?n.call(e,i,e,t):n,!(void 0!==o&&(t.exports=o))}(void 0,function(){var t=14603328e5,e=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"],i=62,n=function(t,e){return(t+e).slice(-t.length)},o=function(t){this._opt=t||{}};return o.prototype={_toBase:function(t,i){var n=this._opt,o=n.symbols||e,s="";if(i>o.length||i<=1)return!1;for(;t>=1;)s=o[t-i*Math.floor(t/i)]+s,t=Math.floor(t/i);return i<11?parseInt(s):s},_salts:function(){for(var t=this,e=t._opt,o=e.salts||2,s="",r=0;r0?Math.floor(((new Date).getTime()-s)/o):0,a=e._salts();return 0===r?a:e._toBase(r,i)+a}},{inst:function(t){return new o(t)},gen:function(t){return new o(t).gen()},uuid:function(){return new o({salts:4}).gen()}}})},wohU:function(t,e,i){"use strict";var n=i("sdDX"),o=(i("M34W"),i("3but").getCDNDomain()),s={config:function(t){this.options=t||{}},inited:!1,init:function(){return this.inited?this:(this.inited=!0,this.$guideWrapper=$(".J-deviceNotSupportGuide"),this.$guideWrapper.length?(this.$title=this.$guideWrapper.find(".J-title"),this.$detail=this.$guideWrapper.find(".J-detail"),this.$copyUrlContent=this.$guideWrapper.find(".J-copyUrlContent"),this.$copyUrlBtn=this.$guideWrapper.find(".J-copyUrlBtn"),this.$qqBtn=this.$guideWrapper.find(".J-qqBtn"),this.$wxBtn=this.$guideWrapper.find(".J-wxBtn"),this.$emailBtn=this.$guideWrapper.find(".J-emailBtn"),this.$copyTip=this.$guideWrapper.find(".J-copyTip"),this.bindEvents(),this.bindCopyEvent(),this.$copyUrlContent.html(n.htmlEncode(location.href)),this):void 0)},bindEvents:function(){var t=this;this.$qqBtn.off("click").on("click",function(){t.hide(),t.options.switchToQQ()}),this.$wxBtn.off("click").on("click",function(){t.hide(),t.options.switchToWX()}),this.$emailBtn.off("click").on("click",function(){t.hide(),t.options.switchToEmail()})},isIpad:function(){var t=navigator.userAgent||"";return/ipad/i.test(t)},isSupportWxOauth:function(){return null==window.G_isSupportWxOauth||window.G_isSupportWxOauth},isSupportQQOauth:function(){return null==window.G_isSupportQQOauth||window.G_isSupportQQOauth},showWxNotSupportGuide:function(){return this.init(),this.$guideWrapper.length?(this.$wxBtn.hide(),this.$copyTip.hide(),this.isSupportQQOauth()?this.$qqBtn.show():this.$qqBtn.hide(),this.$title.html("\u5fae\u4fe1\u5feb\u901f\u767b\u5f55\u5931\u8d25"),this.isIpad()?this.$detail.html("\u5f53\u524d\u5e94\u7528\u4e0d\u652f\u6301\u5fae\u4fe1\u5feb\u901f\u767b\u5f55\uff0c\u8bf7\u4f7f\u7528Safari\u3001UC\u6216\u5728\u5fae\u4fe1\u5185\u6253\u5f00\u9875\u9762\u6216\u4f7f\u7528\u5176\u4ed6\u65b9\u5f0f\u8fdb\u884c\u767b\u5f55\u3002"):this.$detail.html("\u5f53\u524d\u5e94\u7528\u4e0d\u652f\u6301\u5fae\u4fe1\u5feb\u901f\u767b\u5f55\uff0c\u8bf7\u4f7f\u7528Safari\u3001UC\u3001QQ\u6d4f\u89c8\u5668\u6216\u5728\u5fae\u4fe1\u5185\u6253\u5f00\u9875\u9762\u6216\u4f7f\u7528\u5176\u4ed6\u65b9\u5f0f\u8fdb\u884c\u767b\u5f55\u3002"),void this.$guideWrapper.show()):this.options.switchToWX()},showQQNotSupportGuide:function(){return this.init(),this.$guideWrapper.length?(this.$qqBtn.hide(),this.$copyTip.hide(),this.isSupportWxOauth()?this.$wxBtn.show():this.$wxBtn.hide(),this.$title.html("QQ\u5feb\u901f\u767b\u5f55\u5931\u8d25"),this.$detail.html("\u5f53\u524d\u5e94\u7528\u4e0d\u652f\u6301QQ\u5feb\u901f\u767b\u5f55\uff0c\u8bf7\u4f7f\u7528Safari\u3001Chrome\u3001QQ\u6d4f\u89c8\u5668\u6216\u5728QQ\u5185\u6253\u5f00\u9875\u9762\u6216\u4f7f\u7528\u5176\u4ed6\u65b9\u5f0f\u8fdb\u884c\u767b\u5f55\u3002"),void this.$guideWrapper.show()):this.options.switchToQQ()},hide:function(){this.$guideWrapper&&this.$guideWrapper.hide()},bindCopyEvent:function(){var t=this,e=function(t){$.getScript("https://"+o+"/qcloud/main/scripts/release/common/vendors/clipboard.min.js",function(){setTimeout(function(){t()},200)})};e(function(){if(window.Clipboard)try{var e=new Clipboard(t.$copyUrlBtn[0],{text:function(){return location.href}});e.on("success",function(e){t.$copyTip.html(' \u590d\u5236\u6210\u529f').fadeIn(),setTimeout(function(){t.$copyTip.fadeOut()},3e3)}),e.on("error",function(e){t.$copyTip.html(' \u60a8\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u4e00\u952e\u590d\u5236\uff0c\u8bf7\u957f\u6309\u590d\u5236\u5185\u5bb9\uff1a'+n.htmlEncode(location.href)+"").fadeIn()})}catch(t){}})}};t.exports=s},rCGI:function(t,e){"use strict";t.exports={"\u767b\u5f55":"Sign In","\u90ae\u7bb1":"Email","\u90ae\u7bb1\u767b\u5f55":"Sign In with Email","\u90ae\u7bb1\u624b\u673a\u767b\u5f55":"Email/Phone","QQ\u767b\u5f55":"Sign In with QQ","\u5fae\u4fe1\u767b\u5f55":"Sign In with WeChat","\u90ae\u7bb1\u5730\u5740":"Email address","\u90ae\u7bb1\u5730\u5740/\u624b\u673a\u53f7\u7801":"Email address or Phone number","\u90ae\u7bb1\u5730\u5740/DNSPod\u8d26\u53f7":"Email address or DNSPod account","\u5bc6\u7801":"Password","\u9a8c\u8bc1\u7801":"Verifiy Code","\u5fd8\u8bb0\u5bc6\u7801":"Forgot password","\u5fd8\u8bb0\u5bc6\u7801\uff1f":"Forgot password?","\u767b \u5f55":"Sign In","\u8fd8\u6ca1\u6709\u8d26\u53f7\uff1f":"No account ?","\u7acb\u5373\u6ce8\u518c":"Sign up now","\u53c2\u6570\u9519\u8bef\uff0c\u8bf7\u91cd\u65b0\u8f93\u5165":"Param error,Please enter again","\u8d26\u53f7\u4e0d\u5b58\u5728\u6216\u5bc6\u7801\u9519\u8bef\uff0c\u8bf7\u91cd\u65b0\u8f93\u5165":"Account does not exist or password error , please re-enter","\u9a8c\u8bc1\u7801\u9519\u8bef\uff0c\u8bf7\u91cd\u65b0\u8f93\u5165":"Verification code error. Please enter again","\u767b\u5f55\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5":"Login failed. Please enter again","\u8bf7\u8f93\u5165\u90ae\u7bb1":"Please enter email","\u8bf7\u8f93\u5165\u90ae\u7bb1\u6216\u8005\u624b\u673a\u53f7\u7801":"Please enter email or phone number","\u8bf7\u8f93\u5165\u5bc6\u7801":"Please enter your password","\u8bf7\u8f93\u5165\u9a8c\u8bc1\u7801":"Please enter the verification code","\u8d26\u53f7\u5bc6\u7801\u9519\u8bef\u6b21\u6570\u8fbe\u5230\u4e0a\u9650\uff0c\u5f53\u65e5\u4e0d\u53ef\u767b\u5f55":"Too many password errors today , to ensure account security , please try tomorrow","\u5fae\u4fe1\u516c\u4f17\u53f7":"WeChat OA","\u5fae\u4fe1\u8d26\u53f7":"WeChat","QQ\u8d26\u53f7":"QQ","\u90ae\u7bb1\u8d26\u53f7":"Email","\u767b\u5f55\u817e\u8baf\u4e91":"Sign in Tencent Cloud","\u5176\u4ed6\u767b\u5f55\u65b9\u5f0f":"More","\u4f7f\u7528\u90ae\u7bb1\u8d26\u53f7\u767b\u5f55":"Sign in using your email account","\u8bf7\u4f7f\u7528\u5fae\u4fe1\u626b\u63cf\u4e8c\u7ef4\u7801\u767b\u5f55":"Scan QR-code in WeChat to login","\u201c\u817e\u8baf\u4e91\u201d":'"Tencent Cloud"',"\u8bf7\u8f93\u5165\u6b63\u786e\u7684\u90ae\u7bb1":"Please enter a correct email","\u90ae\u7bb1\u683c\u5f0f\u6709\u8bef\uff0c\u8bf7\u4fee\u6539":"Email format error , please re-edit","\u8be5\u8d26\u53f7\u5c5e\u4e8e\u56fd\u9645\u7ad9\u8d26\u53f7\uff0c":"Your account is for Tencent Cloud International\uff0c","\u524d\u5f80\u767b\u5f55":"Log in now","\u952e\u76d8\u5927\u5199\u9501\u5b9a\u5df2\u6253\u5f00\uff0c\u8bf7\u6ce8\u610f":"CapsLock On","\u5feb\u6377\u767b\u5f55":"More","\u5fd8\u8bb0\u8d26\u53f7\u6216\u5bc6\u7801\uff1f":"Forgot account or password?",'\u8be5\u8d26\u53f7\u53ef\u80fd\u662f\u901a\u8fc7QQ\u5feb\u6377\u6ce8\u518c\uff0c\u8bf7\u5207\u6362\u81f3QQ\u767b\u5f55':'Your account was signed in with QQ , please switch to QQ login window',"\u8fd8\u6ca1\u6709\u6ce8\u518c\u817e\u8baf\u4e91\u8d26\u53f7\uff1f":"No account ?","\u5fd8\u8bb0\u8d26\u53f7":"Forgot account","\u8fd4\u56de\u817e\u8baf\u4e91\u767b\u5f55":"Back to Tencent Cloud login","\u6b64\u90ae\u7bb1\u5730\u5740\u5c1a\u672a\u6fc0\u6d3b\uff0c\u8bf7\u67e5\u770b\u6fc0\u6d3b\u90ae\u4ef6\uff0c\u5b8c\u6210\u6fc0\u6d3b\u540e\u91cd\u65b0\u767b\u5f55\u3002":"This email account has not been activated on Tencent Cloud. Please check your email to activate it and log in again.",'\u6b64\u90ae\u7bb1\u5730\u5740\u5c1a\u672a\u6fc0\u6d3b\uff0c\u8bf7\u67e5\u770b\u6fc0\u6d3b\u90ae\u4ef6\uff0c\u5b8c\u6210\u6fc0\u6d3b\u540e\u91cd\u65b0\u767b\u5f55\u3002':'This email account has not been activated on Tencent Cloud. Please check your email to activate it and log in again.',"\u5207\u6362\u5176\u4ed6\u767b\u5f55\u65b9\u5f0f":"Log in via other methods","\u5fae\u4fe1\u626b\u7801\u767b\u5f55":"Sign In with WeChat","\u53bb\u5fae\u4fe1\u6388\u6743":"Authorize on WeChat","\u4f7f\u7528\u5fae\u4fe1\u767b\u5f55":"Sign In with WeChat","\u5b50\u7528\u6237\u767b\u5f55":"CAM user sign in","\u5df2\u767b\u5f55\u8d26\u53f7":"Signed in account","\u5feb\u901f\u767b\u5f55":"Quick Login","\u767b\u5f55\u5176\u4ed6\u8d26\u53f7":"Log in to another account","\u8d26\u53f7":"The account","\u5df2\u767b\u5f55\uff0c\u53ef\u4ee5\u9009\u62e9\u76f4\u63a5\u767b\u5f55\u7ee7\u7eed\u4f7f\u7528\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55":"is logged in. You can choose to log in directly to continue using it, or you can log in with another account.",'\u8d26\u53f7\u5bc6\u7801\u8f93\u5165\u5f53\u65e5\u4ec5\u52691\u6b21\u673a\u4f1a\uff0c\u662f\u5426 \u5fd8\u8bb0\u5bc6\u7801 \u6216 \u5fd8\u8bb0\u8d26\u53f7':'Only 1 chance left to input account and password today. Forget password or forget account?','\u8d26\u53f7\u5bc6\u7801\u9519\u8bef\u6b21\u6570\u8d85\u8fc7\u5f53\u65e5\u6700\u5927\u6b21\u6570\uff0c\u5efa\u8bae\u60a8\u901a\u8fc7 \u5fd8\u8bb0\u5bc6\u7801 \u6216 \u5fd8\u8bb0\u8d26\u53f7 \u627e\u56de\u8d26\u53f7\u5bc6\u7801\uff0c\u6b21\u65e5\u518d\u5c1d\u8bd5\u767b\u5f55':'Account and password errors exceed the maximum number today. Forget password or forget account?',"\u8bf7\u4f7f\u7528\u5fae\u4fe1\u626b\u4e00\u626b\u767b\u5f55":"Scan code with WeChat to log in","\u5237\u65b0":"Refresh"}}}); \ No newline at end of file diff --git a/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云_files/article-detail.74aef85e22.js.下载 b/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云_files/article-detail.74aef85e22.js.下载 new file mode 100644 index 0000000..8e48933 --- /dev/null +++ b/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云_files/article-detail.74aef85e22.js.下载 @@ -0,0 +1 @@ +!function(n){var r={};function o(e){if(r[e])return r[e].exports;var t=r[e]={i:e,l:!1,exports:{}};return n[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=n,o.c=r,o.i=function(e){return e},o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="//imgcache.qq.com/qcloud/developer/scripts/",o(o.s=12)}({"+AS+":function(e,t,n){"use strict"},"+kzo":function(e,t,n){"use strict"},"+moQ":function(e,t,n){"use strict";var r;function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var i="book",a="peripheral",u="keyboard",c="mystery";o(r={},"voucher",{label:function(e){var t=e.amount,n=void 0===t?0:t,r=e.count,o=void 0===r?1:r;return n/100+" \u5143\u4ee3\u91d1\u5238"+(1'+n/100+" \u5143

\u817e\u8baf\u4e91\u4ee3\u91d1\u5238"+(1Date.now();return F.a.createElement(U.Fragment,null,m&&O===B.ArticleState.REJECTED&&F.a.createElement(q.Alert,{type:"danger"},"\u4f60\u7684\u6587\u7ae0\u88ab\u5c0f\u7f16\u9a73\u56de\u4e86\uff0c\u8bf7\u4fee\u6539\u540e\u518d\u91cd\u65b0\u53d1\u5e03\u5427\uff01"),m&&r&&r.status===B.ArticleState.REJECTED&&F.a.createElement(q.Alert,{type:"danger"},"\u4f60\u63d0\u4ea4\u7684\u6587\u7ae0\u4fee\u6539\u5185\u5bb9\u88ab\u5c0f\u7f16\u9a73\u56de\u4e86\uff0c\u8bf7\u4fee\u6539\u540e\u518d\u91cd\u65b0\u53d1\u5e03\u5427\uff01"),m&&O===B.ArticleState.PENDING_APPROVAL&&F.a.createElement(q.Alert,{type:"warning"},"\u5c0f\u7f16\u5728\u6293\u7d27\u5ba1\u6838\u4e2d\uff0c\u7a0d\u5b89\u52ff\u8e81\u3002"),m&&r&&r.status===B.ArticleState.PENDING_APPROVAL&&F.a.createElement(q.Alert,{type:"warning"},"\u5c0f\u7f16\u6b63\u5728\u6293\u7d27\u5ba1\u6838\u4f60\u63d0\u4ea4\u7684\u6587\u7ae0\u4fee\u6539\u5185\u5bb9\uff0c\u7a0d\u5b89\u52ff\u8e81\u3002"),F.a.createElement("h1",{className:"col-article-title J-articleTitle"},m&&O===B.ArticleState.PENDING_APPROVAL&&F.a.createElement(q.SimpleBubble,{className:"com-article-tag-bubble",content:"\u6587\u7ae0\u6b63\u5728\u5ba1\u6838\u4e2d\uff0c\u5ba1\u6838\u901a\u8fc7\u540e\u5c06\u5f00\u653e\u9605\u8bfb"},F.a.createElement("span",{className:"com-article-tag"},"\u5ba1\u6838\u4e2d")),m&&r&&r.status===B.ArticleState.PENDING_APPROVAL&&F.a.createElement(q.SimpleBubble,{className:"com-article-tag-bubble",content:"\u6587\u7ae0\u5df2\u88ab\u4fee\u6539\uff0c\u6b63\u5728\u5ba1\u6838\u4e2d\uff0c\u5185\u5bb9\u5c06\u5728\u5ba1\u6838\u540e\u66f4\u65b0"},F.a.createElement("span",{className:"com-article-tag"},"\u5ba1\u6838\u4e2d")),O===B.ArticleState.REJECTED&&(m||i)&&F.a.createElement(q.SimpleBubble,{className:"com-article-tag-bubble",content:"\u6587\u7ae0\u5df2\u88ab\u9a73\u56de"},F.a.createElement("span",{className:"com-article-tag"},"\u5df2\u9a73\u56de")),m&&r&&r.status===B.ArticleState.REJECTED&&F.a.createElement(q.SimpleBubble,{className:"com-article-tag-bubble",content:"\u4f60\u63d0\u4ea4\u7684\u6587\u7ae0\u4fee\u6539\u5185\u5bb9\u5df2\u88ab\u9a73\u56de"},F.a.createElement("span",{className:"com-article-tag"},"\u5df2\u9a73\u56de")),y),F.a.createElement("div",{className:"col-article-author"},Boolean(h)&&F.a.createElement(U.Fragment,null,F.a.createElement(q.UserCard,{userId:h.id,showFollowUserButton:!0},F.a.createElement(q.Link,{to:"/user/"+h.id,className:"col-avatar author-avatar",style:{backgroundImage:"url("+D.i(z.getThumbnailUrl)(h.avatar,36)+")"}})),F.a.createElement(q.Link,{to:"/user/"+h.id,className:"author-name"},h.name),F.a.createElement(q.ProfessionVerifiedBadge,{user:h}),F.a.createElement(q.UserBadges,{badge:h.badgeInfo,inline:!0})),Boolean(k)&&F.a.createElement(U.Fragment,null,F.a.createElement("span",null,"\u53d1\u8868\u4e8e"),F.a.createElement("span",{className:"column-wrap"},F.a.createElement(q.Link,{to:"/column/"+k.id,className:"column-name"},k.name),F.a.createElement(q.FollowColumnButton,{columnId:k.id,unfollowClassName:"c-btn c-btn-hole smaller",followClassName:"c-btn c-btn-hole smaller",tinyLoading:!0}))),F.a.createElement("div",{className:"extra-part"},F.a.createElement("div",{className:"com-operations"},F.a.createElement("span",{className:"com-opt-link dark",title:"\u6d4f\u89c8\u6b21\u6570"},F.a.createElement("i",{className:"com-i-view"}),F.a.createElement("span",{className:"text"},D.i(z.abbrNum)(w))),I&&F.a.createElement(q.ArticleEditButton,{article:n,className:"link-edit"},F.a.createElement("i",{className:"com-i-edit"}),"\u7f16\u8f91"),j&&F.a.createElement(q.ArticleDeleteButton,{className:"link-delete",article:n,onDeleted:this.onArticleDeleted},F.a.createElement("i",{className:"com-i-delete"}),"\u5220\u9664"),Boolean(m&&O===B.ArticleState.NORMAL&&!a&&!R)&&F.a.createElement(U.Fragment,null,[B.ArticleSelfRecommendStatus.NOT_APPLY,B.ArticleSelfRecommendStatus.REJECT].includes(s)&&!f&&L&&F.a.createElement(q.Link,{className:"com-opt-link actived",onClick:this.handleSelfRecommendArticle},F.a.createElement("i",{className:"com-i-recommend"}),"\u81ea\u8350\u672c\u6587\u4e0a\u9996\u9875"),f&&F.a.createElement(q.LoadingBar,{tiny:!0,style:{display:"inline-block"}}),s===B.ArticleSelfRecommendStatus.APPLYING&&!f&&F.a.createElement("span",{className:"com-opt-text"},"\u81ea\u8350\u5ba1\u6838\u4e2d"))))),Boolean(S)&&F.a.createElement("div",{className:"col-article-adpanel"},F.a.createElement(q.Link,{to:S.spreadUrl,target:"_blank",title:S.desc,hotrep:"community.column.article-detail.adpanel"},F.a.createElement("img",{src:S.imageUrl,alt:""}))),Boolean(T&&!M.a.isEmpty(T)&&T.spreadUrl)&&F.a.createElement(q.DeveloperSpreadBanner,{item:T}),O===B.ArticleState.PENDING_APPROVAL&&i&&F.a.createElement("div",{style:{textAlign:"right",marginTop:"-15px"}},F.a.createElement(q.ArticleAuditButton,{action:"pass",article:n,onSuccess:function(){return window.location.reload()}}),F.a.createElement("span",{style:{margin:"0 3px"}}),F.a.createElement(q.ArticleAuditButton,{action:"reject",article:n,onSuccess:function(){return window.location.reload()}})),O===B.ArticleState.NORMAL&&a&&F.a.createElement("div",{style:{textAlign:"right",marginTop:"-15px"}},F.a.createElement(q.ArticleRecommendButton,{article:n,onRecommendArticle:this.handleRecommendArticle})),F.a.createElement("section",{className:"col-article"},F.a.createElement(G.a,{raw:D.i(z.unpackRawContent)(g),contentSelector:".J-articleContent"}),F.a.createElement(q.RichContent,{className:"J-articleContent",content:l||g,findScrollParent:function(){return null},from:d,source:"article-detail"}),F.a.createElement(K.a,{article:n,hasUpdateWeChatRight:u}),F.a.createElement("div",{className:"col-article-time"},A===C&&F.a.createElement("span",null,"\u53d1\u8868\u4e8e ",F.a.createElement(q.TimeAgo,{time:C})),A!==C&&F.a.createElement("span",null,"\u7f16\u8f91\u4e8e ",F.a.createElement(q.TimeAgo,{time:A}))),F.a.createElement("div",{className:"col-article-tags"},F.a.createElement(V.a,{tags:b}),F.a.createElement("div",{className:"extra-part"},F.a.createElement("div",{className:"com-operations"},P&&F.a.createElement(q.ArticleReportButton,{article:n,className:"link-warn"},F.a.createElement("i",{className:"com-i-warn"}),"\u4e3e\u62a5")))),F.a.createElement(q.WidgetOperationBar,null,F.a.createElement("div",{className:"main-cnt"},F.a.createElement(q.ArticleLikeButton,{className:"link-like",articleId:v,likeCount:_||0}),O===B.ArticleState.NORMAL&&F.a.createElement(q.ArticleFavorButton,{className:"link-bookmark",articleId:v,favorCount:E||0})),F.a.createElement("div",{className:"extra-cnt"},F.a.createElement("span",{className:"com-opt-text share-text"},"\u5206\u4eab"),F.a.createElement(q.ArticleSharing,{shareTitle:n.title,shareSummary:encodeURIComponent(n.summary||""),shareUrl:D.i(z.getAbsoluteRouteUrl)("/article/"+n.id+(m?"?s=original-sharing":"")),qrCodeSize:100,containerSelector:".extra-cnt",bubblePlacement:"left"}),F.a.createElement(W.a,{className:"com-widget-qr",bubblePlacement:"left"})))),k&&F.a.createElement(H.a,{column:k,sameColumnArticles:o}))}},{key:"componentDidMount",value:function(){this.setupTextLinks(),this.reportArticleFrom()}},{key:"reportArticleFrom",value:function(){var e=this.props.article,t=e.author,n=e.articleId;if((t&&t.fromInfo||{}).from)try{D.i(a.reportFrom)({articleId:n,event:i.a.VIEW}),c()(".J-articleContent").on("click","[data-from]",function(e){D.i(a.reportFrom)({articleId:n,event:i.a.CLICK})})}catch(e){}}},{key:"setupTextLinks",value:(t=h(regeneratorRuntime.mark(function e(){var t,n,r,o,i,a,u=this;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if((t=this.props.article).textLinks.length){e.next=3;break}return e.abrupt("return");case 3:return n=D.i(l.a)(D.i(z.unpackRawContent)(t.content),t.textLinks),r=f(n,2),o=r[0],i=r[1],e.next=6,new Promise(function(e){return u.setState({articleRaw:o},e)});case 6:0<(a=i.map(function(e){return e.mark})).length&&(D.i(s.reportTextLinksView)({marks:a}),c()(".J-articleContent").on("click","[data-text-link]",function(e){var t=c()(e.currentTarget);D.i(s.reportTextLinksClick)({marks:[t.data("text-link")]})}));case 8:case"end":return e.stop()}},e,this)})),function(){return t.apply(this,arguments)})}]),n}())||n},"2h0h":function(e,t,n){"use strict";var r=n("nPs6");n.d(t,"a",function(){return r.a})},"2xpJ":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n("31QT");n.d(t,"updateUserProfile",function(){return r.b}),n.d(t,"getUserProfile",function(){return r.c}),n.d(t,"batchFetchUserDetailInfo",function(){return r.d}),n.d(t,"fetchDeliveryAddress",function(){return r.e}),n.d(t,"updateDeliveryAddress",function(){return r.f}),n.d(t,"fetchUserProfessonVerifyInfo",function(){return r.g}),n.d(t,"submitUserProfessionVerifyInfo",function(){return r.h}),n.d(t,"fetchUploadWorkCardCredentials",function(){return r.i}),n.d(t,"searchUsers",function(){return r.a}),n.d(t,"handleFollow",function(){return r.j}),n.d(t,"setNotifyType",function(){return r.k}),n.d(t,"getUserInfo",function(){return r.l}),n.d(t,"getQcloudUserInfo",function(){return r.m}),n.d(t,"fetchProfessionVerifyJobTitles",function(){return r.n})},"2xrq":function(e,t,n){"use strict";n.d(t,"a",function(){return r}),n.d(t,"b",function(){return o}),n.d(t,"c",function(){return i}),n.d(t,"d",function(){return a});var r={RECOMMEND:1,CANCEL:2},o=121,i=1e9,a={NOT_APPLY:1,APPLYING:0,PASS:2,REJECT:3}},"2z2P":function(e,t,n){"use strict"},3:function(e,t){e.exports=Commons.helpers},"31QT":function(e,t,n){"use strict";t.b=function(e){var t=e.name,n=e.label,r=e.avatar,o=e.province,i=e.city,a=e.company,u=e.title,c=e.school,l=e.major,s=e.homePage,f=e.specialityIds,p=e.jobType,h=e.graduationDate,m=e.region,d=e.education,v={name:t,label:n,avatar:r,province:o,city:i,company:a,title:u,school:c,major:l,homePage:s,specialityIds:f,jobType:p,graduationDate:h,region:m,education:d};return y.call("UpdateUserProfile",v)},t.c=function(e){var t={uid:e.uid};return y.cache("GetUserProfile",t)},t.d=function(e){var t={uids:e.uids};return y.call("BatchFetchUserDetailInfo",t)},t.e=function(){return y.call("FetchDeliveryAddress")},t.f=function(e){var t=e.name,n=e.provinceId,r=e.cityId,o=e.addressDetail,i={name:t,provinceId:n,cityId:r,addressDetail:o};return y.call("UpdateDeliveryAddress",i)},t.g=function(){return y.call("FetchUserProfessonVerifyInfo")},t.h=function(e){var t=e.verifyType,n=e.realname,r=e.company,o=e.title,i=e.province,a=e.city,u=e.cardUrl,c={verifyType:t,realname:n,company:r,title:o,province:i,city:a,cardUrl:u};return y.call("SubmitUserProfessionVerifyInfo",c)},t.i=function(){return y.call("FetchUploadWorkCardCredentials")},t.a=function(e){var t=e.pageNumber,n=e.pageSize,r=e.keyword;return y.call("SearchUsers",{pageNumber:t,pageSize:n,keyword:r})},t.j=function(e){var t=e.uid,n=e.action;return y.call("HandleFollow",{followedUid:t,action:n})},t.k=function(e){var t=e.notifyType,n=e.notifyAction;return y.call("SetNotifyType",{notifyType:t,notifyAction:n})},t.l=function(){return y.call("GetUserInfo")},t.m=function(){return y.call("GetQcloudUserInfo")},t.n=function(){return y.call("FetchProfessionVerifyJobTitles")};var r=n(0),y=(n.n(r),new r.Service("user"))},"3IRH":function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},4:function(e,t){e.exports=ReduxSaga},"4Dyh":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n("w0uY");n.d(t,"fetchArticleList",function(){return r.a}),n.d(t,"applyOriginalSharing",function(){return r.b}),n.d(t,"applyAward",function(){return r.c}),n.d(t,"markOriginalRead",function(){return r.d}),n.d(t,"fetchFeatureArticles",function(){return r.e}),n.d(t,"quickVerifyProfession",function(){return r.f}),n.d(t,"reportFrom",function(){return r.g})},"4GeK":function(e,t,n){"use strict"},"4g09":function(e,t,n){"use strict";n("5idK"),n("iimR"),n("v413"),n("r+5c"),n("vAnb")},"4jRL":function(e,t,n){"use strict";var r,o,i,l=n(1),s=n.n(l),a=n(6),u=(n.n(a),n("KSGD")),c=n.n(u),f=n("HW6M"),p=n.n(f),h=n("nfin"),m=function(){function r(e,t){for(var n=0;nt.bottom)return!1;if(e===A){if(_.bottom>k||_.top<0)return!1;if(_.left>O||_.right<0)return!1}return!0}))return[];return m.map(function(e){var t=e.getBoundingClientRect(),n=getComputedStyle(e),r=parseInt(n.borderLeftWidth,10),o=parseInt(n.borderTopWidth,10),i=parseInt(n.borderRightWidth,10),a=parseInt(n.borderBottomWidth,10),u=0,c=0;if("start"===b)if(E||(E=_.top),A===e)u=T+E;else{var l=Math.min(E-t.top,e.scrollHeight-e.clientHeight-e.scrollTop);u=e.scrollTop+l-o}if("center"===b)if(E||(E=_.top+_.height/2),A===e)u=T+E-k/2;else{var s=0-Math.min(t.top+t.height/2-E,e.scrollTop);u=e.scrollTop+s}if("end"===b)if(E||(E=_.bottom),A===e)u=T+E-k;else{var f=0-Math.min(t.bottom-E,e.scrollTop);u=e.scrollTop+f+a}if("nearest"===b)if(E||(E=_.top),A===e){var p=N(T,T+k,k,o,a,T+E,T+E+_.height,_.height);u=T+p}else{var h=N(t.top,t.bottom,t.height,o,a,E,E+_.height,_.height);u=e.scrollTop+h}if("start"===w)if(C||(C=_.left),A===e)c=S+C;else{var m=Math.min(C-t.left,e.scrollHeight-e.clientLeft-e.scrollLeft);c=e.scrollLeft+m-r}if("center"===w)if(C||(C=_.left+_.width/2),A===e)c=S+C-O/2;else{var d=0-Math.min(t.left+t.width/2-C,e.scrollLeft);c=e.scrollLeft+d}if("end"===w)if(C||(C=_.right),A===e)c=S+C-O;else{var v=0-Math.min(t.right-C,e.scrollLeft);c=e.scrollLeft+v+i}if("nearest"===w)if(C||(C=_.left),A===e){var y=N(S,S+O,O,r,i,S+C,S+C+_.width,_.width);c=S+y}else{var g=N(t.left,t.right,t.width,r,i,C,C+_.width,_.width);c=e.scrollLeft+g}return E+=e.scrollTop-u,C+=e.scrollLeft-c,{el:e,top:u,left:c}})}},"9uWT":function(e,t,n){"use strict";var r;function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var i="default",a="created";r={},o(r,i,{id:i,name:"\u70ed\u95e8\u6392\u5e8f"}),o(r,a,{id:a,name:"\u65f6\u95f4\u6392\u5e8f"})},"9zzJ":function(e,t,n){"use strict";n("sefv")},A4of:function(e,t,n){"use strict";e.exports=function(e,t){e.classList?e.classList.remove(t):e.className=e.className.replace(new RegExp("(^|\\s)"+t+"(?:\\s|$)","g"),"$1").replace(/\s+/g," ").replace(/^\s*|\s*$/g,"")}},AixO:function(e,t,n){"use strict";t.a=function(e){var t=e.page,n=e.pageSize,r={pageNumber:t,pageSize:n};return o.call("FetchCategory",r)},t.b=function(e){var t=e.pageNumber,n=e.pageSize,r={pageNumber:t,pageSize:n};return o.call("FetchCategoiesWithMap",r)};var r=n(0),o=(n.n(r),new r.Service("column/category"))},AoEa:function(e,t,l){"use strict";(function(r){l.d(t,"a",function(){return e});var o=l(7),i=(l.n(o),l(3)),a=(l.n(i),l("27+6")),u=l("glze"),c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e=function(e){var t=l.i(i.createDevTools)({actionsBlacklist:[]}),n=l.i(o.createStore)(a.a,e,l.i(o.compose)(l.i(o.applyMiddleware)(u.a),t));return l.i(u.b)(),"object"===c(r)&&r.hot&&r.hot.accept("./articleDetailReducer",function(){return n.replaceReducer(a.a)}),n}}).call(t,l("f1Eh")(e))},AuSE:function(e,t,n){"use strict"},B0y3:function(e,t,n){"use strict";var r=n(0);n.n(r),n("u8nw");var i=new r.Service("team/post");var o,a;o=regeneratorRuntime.mark(function e(t){var n,r,o=t.postId;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,n={postIds:o},e.next=4,i.accumulate("BatchCheckPostsLike",n);case 4:return r=e.sent,e.abrupt("return",r.includes(o));case 8:return e.prev=8,e.t0=e.catch(0),e.abrupt("return",!1);case 11:case"end":return e.stop()}},e,this,[[0,8]])}),a=function(){var u=o.apply(this,arguments);return new Promise(function(i,a){return function t(e,n){try{var r=u[e](n),o=r.value}catch(e){return void a(e)}if(!r.done)return Promise.resolve(o).then(function(e){t("next",e)},function(e){t("throw",e)});i(o)}("next")})}},BO10:function(e,l,s){"use strict";(function(e){s.d(l,"a",function(){return c});var t=s(1),n=s.n(t),r=s(3),o=(s.n(r),s("AoEa")),i=s("kYCk"),a=s("rGbO"),u=(s.n(a),"function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e}),c=s.i(r.createEntry)({component:function(){return n.a.createElement(a.AppContainer,{warnings:!1},n.a.createElement(i.a,null))},createStore:o.a});"object"===u(e)&&e.hot&&e.hot.accept("./ArticleDetailPage",function(){return c.render()})}).call(l,s("f1Eh")(e))},Cwth:function(e,t,n){"use strict"},DHb2:function(e,t,n){"use strict";var r=n(0);n.n(r),new r.Service("inbox")},DOvb:function(e,t,T){"use strict";t.a=function(e,t){var n=e.blocks,a=e.entityMap,r=Object.keys(a).length,o=function(){return r++},i=function(o,i,e){return e.some(function(e){var t=e.key,n=e.offset,r=e.length;return"LINK"===a[t].type&&!(n+r<=o||i<=n)})},u=function(o,i,e){return e.some(function(e){var t=e.style,n=e.offset,r=e.length;return"CODE"===t&&!(n+r<=o||i<=n)})};t=t.slice(0);var c=[],l=!0,s=!1,f=void 0;try{for(var p,h=n[Symbol.iterator]();!(l=(p=h.next()).done);l=!0){var m=p.value;if(!t.length)break;if(["unstyled","paragraph","header-two","header-three","header-four","header-five","header-six","unordered-list-item","ordered-list-item","blockquote"].includes(m.type))for(var d=String(m.text),v=0,y=null;v>16&255,i[u++]=r>>8&255,i[u++]=255&r;2===o?(r=l[e.charCodeAt(t)]<<2|l[e.charCodeAt(t+1)]>>4,i[u++]=255&r):1===o&&(r=l[e.charCodeAt(t)]<<10|l[e.charCodeAt(t+1)]<<4|l[e.charCodeAt(t+2)]>>2,i[u++]=r>>8&255,i[u++]=255&r);return i},t.fromByteArray=function(e){for(var t,n=e.length,r=n%3,o="",i=[],a=0,u=n-r;a>2],o+=c[t<<4&63],o+="=="):2===r&&(t=(e[n-2]<<8)+e[n-1],o+=c[t>>10],o+=c[t>>4&63],o+=c[t<<2&63],o+="=");return i.push(o),i.join("")};for(var c=[],l=[],s="undefined"!=typeof Uint8Array?Uint8Array:Array,r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0,i=r.length;o>18&63]+c[o>>12&63]+c[o>>6&63]+c[63&o]);return i.join("")}l["-".charCodeAt(0)]=62,l["_".charCodeAt(0)]=63},EQLI:function(e,t,n){"use strict";var r;function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var i=0,a=1,u=2,c=3;o(r={},i,{id:i,title:"\u5168\u90e8"}),o(r,a,{id:a,title:"\u4e13\u680f"}),o(r,u,{id:u,title:"\u95ee\u7b54"}),o(r,c,{id:c,title:"\u5f00\u53d1\u8005\u624b\u518c"})},EaKe:function(e,t,r){"use strict";t.a=function(e){var t=o.d+"/services/ajax/ask/people?"+r.i(a.a)({action:"UploadAvatar",uin:u.a.getUin(),csrfCode:u.a.getCsrfCode()});return r.i(i.a)(t,e,"avatar")},t.b=function(e){var t=o.d+"/services/ajax/image?"+r.i(a.a)({action:"UploadImage",uin:u.a.getUin(),csrfCode:u.a.getCsrfCode()});return r.i(i.a)(t,e,"image")},t.c=function(e,t){var n=o.d+"/services/ajax/image?"+r.i(a.a)({action:"UploadAttachment",uin:u.a.getUin(),csrfCode:u.a.getCsrfCode()});return r.i(i.a)(n,e,"attachment",t)},t.d=function(e){return c.call("SaveHttpImage",{url:e})};var o=r("nfin"),i=r("gv2m"),a=r("bA4d"),n=r(0),u=(r.n(n),r("QNU9")),c=new n.Service("image")},EuP9:function(e,U,t){"use strict";(function(e){var r=t("EKta"),i=t("ujcs"),a=t("sOR5");function n(){return f.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function u(e,t){if(n()=n())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+n().toString(16)+" bytes");return 0|e}function h(e,t){if(f.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var n=e.length;if(0===n)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return L(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return D(e).length;default:if(r)return L(e).length;t=(""+t).toLowerCase(),r=!0}}function m(e,t,n){var r=e[t];e[t]=e[n],e[n]=r}function d(e,t,n,r,o){if(0===e.length)return-1;if("string"==typeof n?(r=n,n=0):2147483647=e.length){if(o)return-1;n=e.length-1}else if(n<0){if(!o)return-1;n=0}if("string"==typeof t&&(t=f.from(t,r)),f.isBuffer(t))return 0===t.length?-1:v(e,t,n,r,o);if("number"==typeof t)return t&=255,f.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):v(e,[t],n,r,o);throw new TypeError("val must be string, number or Buffer")}function v(e,t,n,r,o){var i,a=1,u=e.length,c=t.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(e.length<2||t.length<2)return-1;u/=a=2,c/=2,n/=2}function l(e,t){return 1===a?e[t]:e.readUInt16BE(t*a)}if(o){var s=-1;for(i=n;i>>10&1023|55296),s=56320|1023&s),r.push(s),o+=f}return function(e){var t=e.length;if(t<=_)return String.fromCharCode.apply(String,e);var n="",r=0;for(;rthis.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return A(this,t,n);case"utf8":case"utf-8":return w(this,t,n);case"ascii":return E(this,t,n);case"latin1":case"binary":return C(this,t,n);case"base64":return b(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return O(this,t,n);default:if(r)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),r=!0}}.apply(this,arguments)},f.prototype.equals=function(e){if(!f.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e||0===f.compare(this,e)},f.prototype.inspect=function(){var e="",t=U.INSPECT_MAX_BYTES;return 0t&&(e+=" ... ")),""},f.prototype.compare=function(e,t,n,r,o){if(!f.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),t<0||n>e.length||r<0||o>this.length)throw new RangeError("out of range index");if(o<=r&&n<=t)return 0;if(o<=r)return-1;if(n<=t)return 1;if(this===e)return 0;for(var i=(o>>>=0)-(r>>>=0),a=(n>>>=0)-(t>>>=0),u=Math.min(i,a),c=this.slice(r,o),l=e.slice(t,n),s=0;sthis.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");for(var i,a,u,c,l,s,f,p,h,m=!1;;)switch(r){case"hex":return y(this,e,t,n);case"utf8":case"utf-8":return p=t,h=n,M(L(e,(f=this).length-p),f,p,h);case"ascii":return g(this,e,t,n);case"latin1":case"binary":return g(this,e,t,n);case"base64":return c=this,l=t,s=n,M(D(e),c,l,s);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return a=t,u=n,M(function(e,t){for(var n,r,o,i=[],a=0;a>8,o=n%256,i.push(o),i.push(r);return i}(e,(i=this).length-a),i,a,u);default:if(m)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),m=!0}},f.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var _=4096;function E(e,t,n){var r="";n=Math.min(e.length,n);for(var o=t;oe.length)throw new RangeError("Index out of range")}function T(e,t,n,r){t<0&&(t=65535+t+1);for(var o=0,i=Math.min(e.length-n,2);o>>8*(r?o:1-o)}function R(e,t,n,r){t<0&&(t=4294967295+t+1);for(var o=0,i=Math.min(e.length-n,4);o>>8*(r?o:3-o)&255}function N(e,t,n,r,o,i){if(n+r>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function x(e,t,n,r,o){return o||N(e,0,n,4),i.write(e,t,n,r,23,4),n+4}function I(e,t,n,r,o){return o||N(e,0,n,8),i.write(e,t,n,r,52,8),n+8}f.prototype.slice=function(e,t){var n,r=this.length;if((e=~~e)<0?(e+=r)<0&&(e=0):r>>8):T(this,e,t,!0),t+2},f.prototype.writeUInt16BE=function(e,t,n){return e=+e,t|=0,n||S(this,e,t,2,65535,0),f.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):T(this,e,t,!1),t+2},f.prototype.writeUInt32LE=function(e,t,n){return e=+e,t|=0,n||S(this,e,t,4,4294967295,0),f.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):R(this,e,t,!0),t+4},f.prototype.writeUInt32BE=function(e,t,n){return e=+e,t|=0,n||S(this,e,t,4,4294967295,0),f.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},f.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);S(this,e,t,n,o-1,-o)}var i=0,a=1,u=0;for(this[t]=255&e;++i>0)-u&255;return t+n},f.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t|=0,!r){var o=Math.pow(2,8*n-1);S(this,e,t,n,o-1,-o)}var i=n-1,a=1,u=0;for(this[t+i]=255&e;0<=--i&&(a*=256);)e<0&&0===u&&0!==this[t+i+1]&&(u=1),this[t+i]=(e/a>>0)-u&255;return t+n},f.prototype.writeInt8=function(e,t,n){return e=+e,t|=0,n||S(this,e,t,1,127,-128),f.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},f.prototype.writeInt16LE=function(e,t,n){return e=+e,t|=0,n||S(this,e,t,2,32767,-32768),f.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):T(this,e,t,!0),t+2},f.prototype.writeInt16BE=function(e,t,n){return e=+e,t|=0,n||S(this,e,t,2,32767,-32768),f.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):T(this,e,t,!1),t+2},f.prototype.writeInt32LE=function(e,t,n){return e=+e,t|=0,n||S(this,e,t,4,2147483647,-2147483648),f.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):R(this,e,t,!0),t+4},f.prototype.writeInt32BE=function(e,t,n){return e=+e,t|=0,n||S(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),f.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):R(this,e,t,!1),t+4},f.prototype.writeFloatLE=function(e,t,n){return x(this,e,t,!0,n)},f.prototype.writeFloatBE=function(e,t,n){return x(this,e,t,!1,n)},f.prototype.writeDoubleLE=function(e,t,n){return I(this,e,t,!0,n)},f.prototype.writeDoubleBE=function(e,t,n){return I(this,e,t,!1,n)},f.prototype.copy=function(e,t,n,r){if(n||(n=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),0=this.length)throw new RangeError("sourceStart out of bounds");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),"number"==typeof e)for(i=t;i>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;i.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;i.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return i}function D(e){return r.toByteArray(function(e){var t;if((e=(t=e,t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")).replace(j,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function M(e,t,n,r){for(var o=0;o=t.length||o>=e.length);++o)t[o+n]=e[o];return o}}).call(U,t("DuR2"))},"F+6q":function(e,t,n){"use strict";n.d(t,"a",function(){return r});var r={ALL:{id:0,name:"\u5168\u90e8"},SUBSCRIPTIONS:{id:"subscriptions",name:"\u8ba2\u9605"},QUALITY:{id:"top",name:"\u63a8\u8350"}}},F7Wl:function(e,t,n){"use strict";n.d(t,"a",function(){return m});var r,o,i=n(1),a=n.n(i),u=n("KSGD"),c=n.n(u),l=n("HW6M"),s=n.n(l),f=n(2),p=(n.n(f),function(){function r(e,t){for(var n=0;n"']/g,qa=RegExp(Ba.source),Wa=RegExp(za.source),Ga=/<%-([\s\S]+?)%>/g,Va=/<%([\s\S]+?)%>/g,Ka=/<%=([\s\S]+?)%>/g,Ha=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Ya=/^\w*$/,Ja=/^\./,Qa=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,$a=/[\\^$.*+?()[\]{}|]/g,Xa=RegExp($a.source),Za=/^\s+|\s+$/g,eu=/^\s+/,tu=/\s+$/,nu=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,ru=/\{\n\/\* \[wrapped with (.+)\] \*/,ou=/,? & /,iu=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,au=/\\(\\)?/g,uu=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,cu=/\w*$/,lu=/^[-+]0x[0-9a-f]+$/i,su=/^0b[01]+$/i,fu=/^\[object .+?Constructor\]$/,pu=/^0o[0-7]+$/i,hu=/^(?:0|[1-9]\d*)$/,mu=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,du=/($^)/,vu=/['\n\r\u2028\u2029\\]/g,e="\\ud800-\\udfff",t="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",n="\\u2700-\\u27bf",r="a-z\\xdf-\\xf6\\xf8-\\xff",o="A-Z\\xc0-\\xd6\\xd8-\\xde",i="\\ufe0e\\ufe0f",a="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",u="['\u2019]",c="["+e+"]",l="["+a+"]",s="["+t+"]",f="\\d+",p="["+n+"]",h="["+r+"]",m="[^"+e+a+f+n+r+o+"]",d="\\ud83c[\\udffb-\\udfff]",v="[^"+e+"]",y="(?:\\ud83c[\\udde6-\\uddff]){2}",g="[\\ud800-\\udbff][\\udc00-\\udfff]",b="["+o+"]",w="\\u200d",_="(?:"+h+"|"+m+")",E="(?:"+b+"|"+m+")",C="(?:['\u2019](?:d|ll|m|re|s|t|ve))?",A="(?:['\u2019](?:D|LL|M|RE|S|T|VE))?",O="(?:"+s+"|"+d+")"+"?",k="["+i+"]?",S=k+O+("(?:"+w+"(?:"+[v,y,g].join("|")+")"+k+O+")*"),T="(?:"+[p,y,g].join("|")+")"+S,R="(?:"+[v+s+"?",s,y,g,c].join("|")+")",yu=RegExp(u,"g"),gu=RegExp(s,"g"),N=RegExp(d+"(?="+d+")|"+R+S,"g"),bu=RegExp([b+"?"+h+"+"+C+"(?="+[l,b,"$"].join("|")+")",E+"+"+A+"(?="+[l,b+_,"$"].join("|")+")",b+"?"+_+"+"+C,b+"+"+A,"\\d*(?:(?:1ST|2ND|3RD|(?![123])\\dTH)\\b)","\\d*(?:(?:1st|2nd|3rd|(?![123])\\dth)\\b)",f,T].join("|"),"g"),x=RegExp("["+w+e+t+i+"]"),wu=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,_u=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Eu=-1,Cu={};Cu[Ta]=Cu[Ra]=Cu[Na]=Cu[xa]=Cu[Ia]=Cu[ja]=Cu[Pa]=Cu[La]=Cu[Da]=!0,Cu[sa]=Cu[fa]=Cu[ka]=Cu[pa]=Cu[Sa]=Cu[ha]=Cu[ma]=Cu[da]=Cu[ya]=Cu[ga]=Cu[ba]=Cu[_a]=Cu[Ea]=Cu[Ca]=Cu[Oa]=!1;var Au={};Au[sa]=Au[fa]=Au[ka]=Au[Sa]=Au[pa]=Au[ha]=Au[Ta]=Au[Ra]=Au[Na]=Au[xa]=Au[Ia]=Au[ya]=Au[ga]=Au[ba]=Au[_a]=Au[Ea]=Au[Ca]=Au[Aa]=Au[ja]=Au[Pa]=Au[La]=Au[Da]=!0,Au[ma]=Au[da]=Au[Oa]=!1;var I={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Ou=parseFloat,ku=parseInt,j="object"==typeof z&&z&&z.Object===Object&&z,P="object"==typeof self&&self&&self.Object===Object&&self,Su=j||P||Function("return this")(),L="object"==typeof G&&G&&!G.nodeType&&G,D=L&&"object"==typeof q&&q&&!q.nodeType&&q,Tu=D&&D.exports===L,M=Tu&&j.process,U=function(){try{return M&&M.binding&&M.binding("util")}catch(e){}}(),Ru=U&&U.isArrayBuffer,Nu=U&&U.isDate,xu=U&&U.isMap,Iu=U&&U.isRegExp,ju=U&&U.isSet,Pu=U&&U.isTypedArray;function Lu(e,t){return e.set(t[0],t[1]),e}function Du(e,t){return e.add(t),e}function Mu(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}function Uu(e,t,n,r){for(var o=-1,i=null==e?0:e.length;++o":">",'"':""","'":"'"});function hc(e){return"\\"+I[e]}function mc(e){return x.test(e)}function dc(e){var n=-1,r=Array(e.size);return e.forEach(function(e,t){r[++n]=[t,e]}),r}function vc(t,n){return function(e){return t(n(e))}}function yc(e,t){for(var n=-1,r=e.length,o=0,i=[];++n",""":'"',"'":"'"});var Ec=function e(t){var n,T=(t=null==t?Su:Ec.defaults(Su.Object(),t,Ec.pick(Su,_u))).Array,r=t.Date,o=t.Error,v=t.Function,i=t.Math,A=t.Object,y=t.RegExp,s=t.String,R=t.TypeError,a=T.prototype,u=v.prototype,c=A.prototype,l=t["__core-js_shared__"],f=u.toString,O=c.hasOwnProperty,p=0,h=(n=/[^.]+$/.exec(l&&l.keys&&l.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"",m=c.toString,d=f.call(A),g=Su._,b=y("^"+f.call(O).replace($a,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),w=Tu?t.Buffer:ta,_=t.Symbol,E=t.Uint8Array,C=w?w.allocUnsafe:ta,k=vc(A.getPrototypeOf,A),S=A.create,N=c.propertyIsEnumerable,x=a.splice,I=_?_.isConcatSpreadable:ta,j=_?_.iterator:ta,P=_?_.toStringTag:ta,L=function(){try{var e=Bn(A,"defineProperty");return e({},"",{}),e}catch(e){}}(),D=t.clearTimeout!==Su.clearTimeout&&t.clearTimeout,M=r&&r.now!==Su.Date.now&&r.now,U=t.setTimeout!==Su.setTimeout&&t.setTimeout,F=i.ceil,B=i.floor,z=A.getOwnPropertySymbols,q=w?w.isBuffer:ta,W=t.isFinite,G=a.join,V=vc(A.keys,A),K=i.max,H=i.min,Y=r.now,J=t.parseInt,Q=i.random,$=a.reverse,X=Bn(t,"DataView"),Z=Bn(t,"Map"),ee=Bn(t,"Promise"),te=Bn(t,"Set"),ne=Bn(t,"WeakMap"),re=Bn(A,"create"),oe=ne&&new ne,ie={},ae=hr(X),ue=hr(Z),ce=hr(ee),le=hr(te),se=hr(ne),fe=_?_.prototype:ta,pe=fe?fe.valueOf:ta,he=fe?fe.toString:ta;function me(e){if(xo(e)&&!wo(e)&&!(e instanceof ge)){if(e instanceof ye)return e;if(O.call(e,"__wrapped__"))return mr(e)}return new ye(e)}var de=function(){function n(){}return function(e){if(!No(e))return{};if(S)return S(e);n.prototype=e;var t=new n;return n.prototype=ta,t}}();function ve(){}function ye(e,t){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=ta}function ge(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=ca,this.__views__=[]}function be(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t>>0,t>>>=0;for(var i=T(o);++r>>1,a=e[i];null!==a&&!Uo(a)&&(n?a<=t:a>>0)?(e=Yo(e))&&("string"==typeof t||null!=t&&!Lo(t))&&!(t=Mt(t))&&mc(e)?Jt(wc(e),0,n):e.split(t,n):[]},me.spread=function(r,o){if("function"!=typeof r)throw new R(na);return o=null==o?0:K(Go(o),0),At(function(e){var t=e[o],n=Jt(e,0,o);return t&&Ku(n,t),Mu(r,this,n)})},me.tail=function(e){var t=null==e?0:e.length;return t?xt(e,1,t):[]},me.take=function(e,t,n){return e&&e.length?xt(e,0,(t=n||t===ta?1:Go(t))<0?0:t):[]},me.takeRight=function(e,t,n){var r=null==e?0:e.length;return r?xt(e,(t=r-(t=n||t===ta?1:Go(t)))<0?0:t,r):[]},me.takeRightWhile=function(e,t){return e&&e.length?zt(e,Mn(t,3),!1,!0):[]},me.takeWhile=function(e,t){return e&&e.length?zt(e,Mn(t,3)):[]},me.tap=function(e,t){return t(e),e},me.throttle=function(e,t,n){var r=!0,o=!0;if("function"!=typeof e)throw new R(na);return No(n)&&(r="leading"in n?!!n.leading:r,o="trailing"in n?!!n.trailing:o),ao(e,t,{leading:r,maxWait:t,trailing:o})},me.thru=qr,me.toArray=qo,me.toPairs=mi,me.toPairsIn=di,me.toPath=function(e){return wo(e)?Vu(e,pr):Uo(e)?[e]:rn(fr(Yo(e)))},me.toPlainObject=Ho,me.transform=function(e,r,o){var t=wo(e),n=t||Ao(e)||Fo(e);if(r=Mn(r,4),null==o){var i=e&&e.constructor;o=n?t?new i:[]:No(e)&&So(i)?de(k(e)):{}}return(n?Fu:Ye)(e,function(e,t,n){return r(o,e,t,n)}),o},me.unary=function(e){return no(e,1)},me.union=Nr,me.unionBy=xr,me.unionWith=Ir,me.uniq=function(e){return e&&e.length?Ut(e):[]},me.uniqBy=function(e,t){return e&&e.length?Ut(e,Mn(t,2)):[]},me.uniqWith=function(e,t){return t="function"==typeof t?t:ta,e&&e.length?Ut(e,ta,t):[]},me.unset=function(e,t){return null==e||Ft(e,t)},me.unzip=jr,me.unzipWith=Pr,me.update=function(e,t,n){return null==e?e:Bt(e,t,Kt(n))},me.updateWith=function(e,t,n,r){return r="function"==typeof r?r:ta,null==e?e:Bt(e,t,Kt(n),r)},me.values=vi,me.valuesIn=function(e){return null==e?[]:uc(e,ci(e))},me.without=Lr,me.words=Si,me.wrap=function(e,t){return po(Kt(t),e)},me.xor=Dr,me.xorBy=Mr,me.xorWith=Ur,me.zip=Fr,me.zipObject=function(e,t){return Gt(e||[],t||[],Re)},me.zipObjectDeep=function(e,t){return Gt(e||[],t||[],St)},me.zipWith=Br,me.entries=mi,me.entriesIn=di,me.extend=Qo,me.extendWith=$o,Mi(me,me),me.add=Hi,me.attempt=Ti,me.camelCase=yi,me.capitalize=gi,me.ceil=Yi,me.clamp=function(e,t,n){return n===ta&&(n=t,t=ta),n!==ta&&(n=(n=Ko(n))==n?n:0),t!==ta&&(t=(t=Ko(t))==t?t:0),Le(Ko(e),t,n)},me.clone=function(e){return De(e,4)},me.cloneDeep=function(e){return De(e,5)},me.cloneDeepWith=function(e,t){return De(e,5,t="function"==typeof t?t:ta)},me.cloneWith=function(e,t){return De(e,4,t="function"==typeof t?t:ta)},me.conformsTo=function(e,t){return null==t||Me(e,t,ui(t))},me.deburr=bi,me.defaultTo=function(e,t){return null==e||e!=e?t:e},me.divide=Ji,me.endsWith=function(e,t,n){e=Yo(e),t=Mt(t);var r=e.length,o=n=n===ta?r:Le(Go(n),0,r);return 0<=(n-=t.length)&&e.slice(n,o)==t},me.eq=vo,me.escape=function(e){return(e=Yo(e))&&Wa.test(e)?e.replace(za,pc):e},me.escapeRegExp=function(e){return(e=Yo(e))&&Xa.test(e)?e.replace($a,"\\$&"):e},me.every=function(e,t,n){var r=wo(e)?zu:qe;return n&&Yn(e,t,n)&&(t=ta),r(e,Mn(t,3))},me.find=Vr,me.findIndex=gr,me.findKey=function(e,t){return Qu(e,Mn(t,3),Ye)},me.findLast=Kr,me.findLastIndex=br,me.findLastKey=function(e,t){return Qu(e,Mn(t,3),Je)},me.floor=Qi,me.forEach=Hr,me.forEachRight=Yr,me.forIn=function(e,t){return null==e?e:Ke(e,Mn(t,3),ci)},me.forInRight=function(e,t){return null==e?e:He(e,Mn(t,3),ci)},me.forOwn=function(e,t){return e&&Ye(e,Mn(t,3))},me.forOwnRight=function(e,t){return e&&Je(e,Mn(t,3))},me.get=ni,me.gt=yo,me.gte=go,me.has=function(e,t){return null!=e&&Gn(e,t,tt)},me.hasIn=ri,me.head=_r,me.identity=ji,me.includes=function(e,t,n,r){e=Eo(e)?e:vi(e),n=n&&!r?Go(n):0;var o=e.length;return n<0&&(n=K(o+n,0)),Mo(e)?n<=o&&-1=H(o=t,i=n)&&r=this.__values__.length;return{done:e,value:e?ta:this.__values__[this.__index__++]}},me.prototype.plant=function(e){for(var t,n=this;n instanceof ve;){var r=mr(n);r.__index__=0,r.__values__=ta,t?o.__wrapped__=r:t=r;var o=r;n=n.__wrapped__}return o.__wrapped__=e,t},me.prototype.reverse=function(){var e=this.__wrapped__;if(e instanceof ge){var t=e;return this.__actions__.length&&(t=new ge(this)),(t=t.reverse()).__actions__.push({func:qr,args:[Rr],thisArg:ta}),new ye(t,this.__chain__)}return this.thru(Rr)},me.prototype.toJSON=me.prototype.valueOf=me.prototype.value=function(){return qt(this.__wrapped__,this.__actions__)},me.prototype.first=me.prototype.head,j&&(me.prototype[j]=function(){return this}),me}();Su._=Ec,(W=function(){return Ec}.call(G,V,G,q))===ta||(q.exports=W)}).call(this)}).call(G,V("DuR2"),V("3IRH")(e))},MCil:function(e,t,n){"use strict";n("Mn5R");var r=n("vn+0"),o=(n("hV2o"),n("4g09"),n("xrIa")),i=(n("LuWy"),n("JT/b"),n("4Dyh")),a=(n("NrQd"),n("utCt"),n("zhX3"),n("kcTp"),n("GOkv"),n("ojaj"),n("wa6R"),n("/1wQ"),n("9zzJ"),n("2xpJ"));n.d(t,"a",function(){return r}),n.d(t,"b",function(){return o}),n.d(t,"c",function(){return i}),n.d(t,"d",function(){return a})},MiDW:function(e,t,n){"use strict";var r=n("PyKb");n.d(t,"a",function(){return r.a}),n.d(t,"b",function(){return r.b});n("e/rV");var o=n("h9oW");n.d(t,"c",function(){return o.a})},Mn5R:function(e,t,n){"use strict";n("s7MI"),n("dWZv"),n("nHvv"),n("N9S7"),n("jBnt"),n("Sa9u"),n("DjDL"),n("WmqB"),n("vUpg"),n("/fND")},N9S7:function(e,t,n){"use strict";var r=n(0);n.n(r),new r.Service("ask/invitation")},NrQd:function(e,t,n){"use strict";var r=n("imFM");n.d(t,"a",function(){return r.a})},Otc0:function(e,t,n){"use strict";var r;function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var i=1,a=2,u=3,c=4,l=5;o(r={},i,{iconClass:"translate",desc:"\u4e91+\u793e\u533a\u7ffb\u8bd1\u793e\u52cb\u7ae0",link:"/translation"}),o(r,a,{iconClass:"propagandist",desc:"\u4e91+\u793e\u533a\u5ba3\u4f20\u5458\u4e13\u5c5e\u52cb\u7ae0",link:"/support-plan-invitation"}),o(r,u,{iconClass:"microapp",desc:"\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u8fbe\u4eba\u52cb\u7ae0",link:"/article/1149965"}),o(r,c,{iconClass:"medal-1",desc:"\u539f\u521b\u5206\u4eab\u4f5c\u8005\u52cb\u7ae0",link:"/original-sharing"}),o(r,l,{iconClass:"tvp",desc:"\u817e\u8baf\u4e91 TVP \u6210\u5458",link:"~/tvp"})},PNCo:function(e,t,n){"use strict";t.a=function(e){var t=e.articleId,n=e.pageNumber,r=e.pageSize,o={articleId:t,pageNumber:n,pageSize:r};return i.call("FetchArticleComments",o)},t.b=function(e){var t=e.articleId,n=e.pageNumber,r=e.pageSize,o={articleId:t,pageNumber:n,pageSize:r};return i.call("FetchMobileArticleComments",o)},t.c=function(e){var t=e.articleId,n=e.parentCommentId,r=e.content,o={articleId:t,parentCommentId:n,content:r};return i.call("AddComment",o)},t.d=function(e){var t={commentId:e.commentId};return i.call("DeleteComment",t)};var r=n(0),i=(n.n(r),new r.Service("column/comment"))},PyKb:function(e,t,n){"use strict";var r;function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,"a",function(){return f}),n.d(t,"b",function(){return p});var i="product",a="service",u="tech",c="activity",l="solution",s="other",f=[i,l,a,u],p=(o(r={},i,{id:1,name:"\u4e91\u4ea7\u54c1"}),o(r,a,{id:2,name:"\u5e73\u53f0\u670d\u52a1"}),o(r,u,{id:3,name:"\u901a\u7528\u6280\u672f"}),o(r,c,{id:4,name:"\u6d3b\u52a8\u6807\u7b7e"}),o(r,l,{id:5,name:"\u89e3\u51b3\u65b9\u6848"}),o(r,s,{id:99,name:"\u5176\u4ed6"}),r)},Q4WQ:function(e,t,n){"use strict";var r=n("e6+Q"),a=n("cxPT"),u=n("gt/O");e.exports=function(){function e(e,t,n,r,o,i){i!==u&&a(!1,"Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types")}function t(){return e}var n={array:e.isRequired=e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t};return n.checkPropTypes=r,n.PropTypes=n}},QGLn:function(e,t,n){"use strict";var r=n(1),o=n.n(r),i=function(){function r(e,t){for(var n=0;n":">",'"':""","'":"'","`":"`"},P=m.invert(j),L=function(t){var n=function(e){return t[e]},e="(?:"+m.keys(t).join("|")+")",r=RegExp(e),o=RegExp(e,"g");return function(e){return e=null==e?"":""+e,r.test(e)?e.replace(o,n):e}};m.escape=L(j),m.unescape=L(P),m.result=function(e,t,n){var r=null==e?void 0:e[t];return void 0===r&&(r=n),m.isFunction(r)?r.call(e):r};var D=0;m.uniqueId=function(e){var t=++D+"";return e?e+t:t},m.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var M=/(.)^/,U={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},F=/\\|'|\r|\n|\u2028|\u2029/g,B=function(e){return"\\"+U[e]};m.template=function(i,e,t){!e&&t&&(e=t),e=m.defaults({},e,m.templateSettings);var n=RegExp([(e.escape||M).source,(e.interpolate||M).source,(e.evaluate||M).source].join("|")+"|$","g"),a=0,u="__p+='";i.replace(n,function(e,t,n,r,o){return u+=i.slice(a,o).replace(F,B),a=o+e.length,t?u+="'+\n((__t=("+t+"))==null?'':_.escape(__t))+\n'":n?u+="'+\n((__t=("+n+"))==null?'':__t)+\n'":r&&(u+="';\n"+r+"\n__p+='"),e}),u+="';\n",e.variable||(u="with(obj||{}){\n"+u+"}\n"),u="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+u+"return __p;\n";try{var r=new Function(e.variable||"obj","_",u)}catch(e){throw e.source=u,e}var o=function(e){return r.call(this,e,m)},c=e.variable||"obj";return o.source="function("+c+"){\n"+u+"}",o},m.chain=function(e){var t=m(e);return t._chain=!0,t};var z=function(e,t){return e._chain?m(t).chain():t};m.mixin=function(n){m.each(m.functions(n),function(e){var t=m[e]=n[e];m.prototype[e]=function(){var e=[this._wrapped];return o.apply(e,arguments),z(this,t.apply(m,e))}})},m.mixin(m),m.each(["pop","push","reverse","shift","sort","splice","unshift"],function(t){var n=r[t];m.prototype[t]=function(){var e=this._wrapped;return n.apply(e,arguments),"shift"!==t&&"splice"!==t||0!==e.length||delete e[0],z(this,e)}}),m.each(["concat","join","slice"],function(e){var t=r[e];m.prototype[e]=function(){return z(this,t.apply(this._wrapped,arguments))}}),m.prototype.value=function(){return this._wrapped},m.prototype.valueOf=m.prototype.toJSON=m.prototype.value,m.prototype.toString=function(){return""+this._wrapped},void 0===(G=function(){return m}.apply(W,[]))||(q.exports=G)}).call(this)},s7MI:function(e,t,n){"use strict";n("euci"),n("u8nw");var r=n(0);n.n(r);function o(e){return function(){var u=e.apply(this,arguments);return new Promise(function(i,a){return function t(e,n){try{var r=u[e](n),o=r.value}catch(e){return void a(e)}if(!r.done)return Promise.resolve(o).then(function(e){t("next",e)},function(e){t("throw",e)});i(o)}("next")})}}var i=new r.Service("ask/answer");var a;a=o(regeneratorRuntime.mark(function e(t){var n,r=t.answerId;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,i.accumulate("CheckAnswerVote",{answerIds:r});case 3:return n=e.sent,e.abrupt("return",-1>1,s=-7,f=n?o-1:0,p=n?-1:1,h=e[t+f];for(f+=p,i=h&(1<<-s)-1,h>>=-s,s+=u;0>=-s,s+=r;0>1,p=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:i-1,m=r?1:-1,d=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(u=isNaN(t)?1:0,a=s):(a=Math.floor(Math.log(t)/Math.LN2),t*(c=Math.pow(2,-a))<1&&(a--,c*=2),2<=(t+=1<=a+f?p/c:p*Math.pow(2,1-f))*c&&(a++,c/=2),s<=a+f?(u=0,a=s):1<=a+f?(u=(t*c-1)*Math.pow(2,o),a+=f):(u=t*Math.pow(2,f-1)*Math.pow(2,o),a=0));8<=o;e[n+h]=255&u,h+=m,u/=256,o-=8);for(a=a<div{background-color:#00a4ff}.c-loading-tip .c-loading-inner>div{background-color:#888}.c-loading-tip .loading-more{display:block;border:1px solid #e5e5e5;background-color:#f7f8fa;color:#333}.c-loading-tip .loading-more:hover{color:#00a4ff;text-decoration:none}.c-margin-b20-grid+.c-loading{margin-top:20px}.col-group{margin:50px auto}.col-group.no-mt{margin-top:0}.com-section .section-inner{-webkit-box-sizing:border-box;box-sizing:border-box;margin:50px auto;padding:0 10px;max-width:1200px}.col-group-hd,.com-section .section-hd{position:relative;margin-bottom:40px;line-height:1.2}.com-section .section-title{font-size:30px;font-weight:400;color:#000}.col-group-title{height:36px;font-size:30px;line-height:36px;font-weight:400;color:#000}.col-group-extra,.com-section .section-extra{position:absolute;right:0;bottom:0}.col-group-extra .extra-link,.com-section .section-extra-link{color:#666}.com-section .section-extra-split{position:relative;display:inline-block;vertical-align:middle;margin:0 10px;width:1px;height:18px;background-color:#d9d9d9}.col-group-extra .extra-link:after,.com-section .section-extra-link:after{background-size:7200% 3784.6153846153848%;;background-position:0.2% 99.79%;background-image:url(sprite/base-201911131148.svg);;background-repeat:no-repeat}.col-group-extra .extra-link:hover,.com-section .section-extra-link:hover{color:#00a4ff}.col-group-extra .extra-link:hover:after,.com-section .section-extra-link:hover:after{background-image:url(sprite/base-201911131148.svg);;background-position:69.42% 34.449999999999996%;background-size:7200% 3784.6153846153848%;;background-repeat:no-repeat}.col-group-title.small{height:auto;line-height:1.2;font-size:16px;color:#999}.com-section.with-bg{background-color:#f7f8fa}.com-section.with-bg .section-inner{margin-top:0;margin-bottom:0;padding-top:50px;padding-bottom:50px}.com-section.only-extra .section-hd{margin-bottom:30px;padding:0 15px 20px;border-bottom:1px solid #e5e5e5}.com-section.only-extra .section-hd:after{content:'';display:table;clear:both;height:0;overflow:hidden;visibility:hidden}.com-section.only-extra .section-extra{position:static;float:right}.com-sub-section{margin-bottom:30px}.com-sub-section-hd .section-title{margin-bottom:17px;font-size:14px;font-weight:400}.com-avatar{vertical-align:middle;width:32px;height:32px;border-radius:50%;background-size:cover;background-position:center}.com-disorder-list{line-height:2;color:#666}.com-disorder-list li{position:relative;padding-left:10px}.com-disorder-list li:before{content:'';position:absolute;left:2px;top:13px;width:2px;height:2px;border-radius:50%;background-color:#666}.com-disorder-list a{color:inherit}.com-disorder-list a:hover{color:#00a4ff}.com-disorder-list.large{line-height:24px;color:#333}.com-disorder-list.large li{margin-bottom:8px;padding-left:15px}.com-disorder-list.large li:last-child{margin-bottom:0}.com-disorder-list.large li:before{left:0;top:10px;width:4px;height:4px;background-color:#888}.com-disorder-list.large a{display:block}.com-members{margin-bottom:-10px;font-size:0}.com-member{position:relative;display:inline-block;vertical-align:middle;margin-right:10px;margin-bottom:10px;-webkit-box-sizing:border-box;box-sizing:border-box}.com-member .com-avatar{-webkit-box-sizing:border-box;box-sizing:border-box;display:block;width:24px;height:24px}.com-member img{display:block;width:100%;height:100%}.com-member.creator:before{content:'';position:absolute;right:-2px;bottom:-2px;z-index:2;width:10px;height:10px;border:2px solid #fff;background-image:url(sprite/base-201911131148.svg);;border-radius:50%;background-position:66.19% 52.28%;background-size:5040% 4920%;;background-repeat:no-repeat}.com-member.creator .com-avatar{position:relative;margin-top:-1px;width:26px;height:26px}.com-member.add .com-avatar,.com-member.more .com-avatar{position:relative;border:1px solid #bbb;text-align:center;line-height:22px;overflow:hidden}.com-member.add:hover .com-avatar,.com-member.more:hover .com-avatar{border-color:#00a4ff}.com-member.more .com-avatar:before{content:'';display:inline-block;vertical-align:middle;width:22px;height:22px;background-image:url(sprite/base-201911131148.svg);;background-position:87.76% 10.43%;background-size:2290.909090909091% 2236.3636363636365%;;background-repeat:no-repeat}.com-member.more:hover .com-avatar:before{background-image:url(sprite/base-201911131148.svg);;background-position:87.76% 15.53%;background-size:2290.909090909091% 2236.3636363636365%;;background-repeat:no-repeat}.com-member.add .com-avatar:after,.com-member.add .com-avatar:before{content:'';position:absolute;left:50%;top:50%;margin:-6px 0 0 -1px;width:2px;height:12px;background-color:#999}.com-member.add .com-avatar:after{margin:-1px 0 0 -6px;width:12px;height:2px}.com-member.add:hover .com-avatar:after,.com-member.add:hover .com-avatar:before{background-color:#00a4ff}.com-sidebar-panel{margin-bottom:20px;padding:20px;border:1px solid #e5e5e5}.com-sidebar-panel:last-child{margin-bottom:0}.com-sidebar-panel .panel-hd{margin-bottom:20px;padding-bottom:15px;border-bottom:1px solid #e5e5e5;overflow:hidden}.com-sidebar-panel .panel-title{float:left;font-size:14px;color:#444;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-sidebar-panel .panel-extra{float:right}.com-sidebar-panel .panel-extra-link{color:#999}.com-sidebar-panel .panel-extra-link:active,.com-sidebar-panel .panel-extra-link:hover{color:#00a4ff}.com-sidebar-wechat .qr-img{display:table-cell;vertical-align:middle;width:60px}.com-sidebar-wechat .qr-img img{display:block;width:100%}.com-sidebar-wechat .qr-cnt{display:table-cell;vertical-align:middle;padding-left:10px}.com-sidebar-wechat .qr-title{margin-bottom:5px;font-weight:700;color:#333}.com-sidebar-wechat .qr-desc{color:#666}.com-wechat-panel{padding:20px;border:1px solid #e5e5e5}.com-wechat-panel .qr-img{display:table-cell;vertical-align:middle;width:76px}.com-wechat-panel .qr-img img{display:block;width:100%}.com-wechat-panel .qr-cnt{display:table-cell;vertical-align:middle;padding-left:10px;font-size:14px;line-height:24px}.com-wechat-panel .qr-title{font-weight:700;color:#333}.com-wechat-panel .qr-desc{color:#666}.com-wechat-panel .qr-img-full{display:none}.c-media-shadow{-webkit-font-smoothing:antialiased}.com-share-options{display:inline-block;vertical-align:middle;position:relative;top:-1px;font-size:0}.com-share-options>li{position:relative;display:inline-block;vertical-align:middle;margin-right:10px}.com-share-options .opt-item{position:relative;display:block;z-index:900}.com-share-options .c-bubble-trigger:hover .opt-item{position:relative;z-index:901}.com-share-options .opt-icon{position:relative;display:block;width:20px;height:20px}.com-share-options .opt-icon:after{content:'';position:absolute;left:2px;right:2px;top:2px;bottom:2px;border-radius:50%;background-color:#fff}.com-share-options .opt-icon:before{content:'';position:absolute;left:0;top:0;z-index:1;width:100%;height:100%;-webkit-background-size:100% auto;background-size:100% auto}.com-share-options .opt-icon.wechat:before{background-image:url(sprite/base-201911131148.svg);;background-position:13.84% 88.98%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-share-options>li:hover .opt-icon.wechat:before{background-image:url(sprite/base-201911131148.svg);;background-position:9.3% 88.98%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-share-options .opt-icon.qq:before{background-image:url(sprite/base-201911131148.svg);;background-position:87.4% 37.71%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-share-options>li:hover .opt-icon.qq:before{background-image:url(sprite/base-201911131148.svg);;background-position:87.4% 33.050000000000004%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-share-options .opt-icon.qzone:before{background-image:url(sprite/base-201911131148.svg);;background-position:87.4% 28.389999999999997%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-share-options>li:hover .opt-icon.qzone:before{background-image:url(sprite/base-201911131148.svg);;background-position:18.39% 88.98%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-share-options .opt-icon.weibo:before{background-image:url(sprite/base-201911131148.svg);;background-position:4.75% 88.98%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-share-options>li:hover .opt-icon.weibo:before{background-image:url(sprite/base-201911131148.svg);;background-position:0.21% 88.98%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-share-options .opt-icon.copy:before{background-image:url(sprite/base-201911131148.svg);;background-position:87.4% 74.15%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-share-options>li:hover .opt-icon.copy:before{background-image:url(sprite/base-201911131148.svg);;background-position:87.4% 50.849999999999994%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-share-options.light .opt-icon.copy:after{display:none}.com-share-options.light .opt-icon.copy:before,.com-share-options.light>li:hover .opt-icon.copy:before{background-image:url(sprite/base-201911131148.svg);;background-position:87.4% 42.370000000000005%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-share-options .c-bubble-inner{font-size:12px}.com-share-options .qr-img img{margin-top:5px;width:100px;height:100px}.com-share-options.blue .opt-icon.wechat:before{background-image:url(sprite/base-201911131148.svg);;background-position:86.57000000000001% 88.98%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-share-options.blue>li:hover .opt-icon.wechat:before{background-image:url(sprite/base-201911131148.svg);;background-position:92.36% 0.21%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-share-options.blue .opt-icon.qq:before{background-image:url(sprite/base-201911131148.svg);;background-position:87.4% 55.510000000000005%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-share-options.blue>li:hover .opt-icon.qq:before{background-image:url(sprite/base-201911131148.svg);;background-position:87.4% 69.49%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-share-options.blue .opt-icon.weibo:before{background-image:url(sprite/base-201911131148.svg);;background-position:92.36% 14.19%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-share-options.blue>li:hover .opt-icon.weibo:before{background-image:url(sprite/base-201911131148.svg);;background-position:92.36% 18.86%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-share-options.blue .opt-icon.copy:before{background-image:url(sprite/base-201911131148.svg);;background-position:77.48% 88.98%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-share-options.blue>li:hover .opt-icon.copy:before{background-image:url(sprite/base-201911131148.svg);;background-position:82.02000000000001% 88.98%;background-size:2520% 2460%;;background-repeat:no-repeat}[class*=com-i-],[class^=com-i-]{display:inline-block;vertical-align:middle;width:16px;height:16px;-webkit-background-size:100% auto;background-size:100% auto}.com-i-share{background-image:url(sprite/base-201911131148.svg);;background-position:85.04% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-i-warn{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 15.340000000000002%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-i-warn-circle{background-image:url(sprite/base-201911131148.svg);;background-position:14.96% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-i-like{background-image:url(sprite/base-201911131148.svg);;background-position:3.8899999999999997% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-i-edit{background-image:url(sprite/base-201911131148.svg);;background-position:40.78% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-i-edit-2{background-image:url(sprite/base-201911131148.svg);;background-position:33.4% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-i-dialog{background-image:url(sprite/base-201911131148.svg);;background-position:48.16% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-i-delete{background-image:url(sprite/base-201911131148.svg);;background-position:59.21999999999999% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-i-close{background-image:url(sprite/base-201911131148.svg);;background-position:81.35% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-i-view{background-image:url(sprite/base-201911131148.svg);;background-position:18.65% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-i-report{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 15.340000000000002%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-i-recommend{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 75.84%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-i-add{width:20px;height:20px;background-image:url(sprite/base-201911131148.svg);;background-position:87.4% 83.47%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-i-bookmark{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-i-loading{height:16px;width:16px;background-image:url(sprite/base-201911131148.svg);;-moz-animation:spin .6s infinite linear;-webkit-animation:spin .6s infinite linear;animation:spin .6s infinite linear;background-position:0.2% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}@-moz-keyframes spin{0%{-moz-transform:rotate(0)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(359deg)}}.com-i-adopt{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 30.459999999999997%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-i-arrow-circle{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 15.340000000000002%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-i-arrow-circle-gray{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 7.7700000000000005%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-i-refresh{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 68.28%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-i-time{background-image:url(sprite/base-201911131148.svg);;background-position:62.91% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-i-address{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 34.239999999999995%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-i-qq{width:20px;height:20px;background-image:url(sprite/base-201911131148.svg);;background-position:87.4% 60.17%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-i-wechat{width:20px;height:20px;background-image:url(sprite/base-201911131148.svg);;background-position:87.4% 78.81%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-i-weibo{width:20px;height:20px;background-image:url(sprite/base-201911131148.svg);;background-position:92.36% 4.87%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-i-link{width:20px;height:20px;background-image:url(sprite/base-201911131148.svg);;background-position:68.39% 88.98%;background-size:2520% 2460%;;background-repeat:no-repeat}.c-bubble{color:#444;z-index:900}.c-bubble-inner{border:none;border:1px solid #E7E8F1;border-radius:0;-webkit-box-shadow:0 10px 20px rgba(3,27,78,.1);box-shadow:0 10px 20px rgba(3,27,78,.1)}.c-bubble-top .c-bubble-inner:before{border-top-width:0;border-bottom-width:11px;border-bottom-color:#E7E8F1}.c-bubble-bottom .c-bubble-inner:before{border-top-width:11px;border-bottom-width:0;border-top-color:#E7E8F1}.c-bubble-top .c-bubble-inner:after{border-top-width:0;border-bottom-width:9px}.c-bubble-bottom .c-bubble-inner:after{border-top-width:9px;border-bottom-width:0}.c-bubble-left .c-bubble-inner:before{border-left-width:0;border-right-width:11px;border-right-color:#E7E8F1}.c-bubble-right .c-bubble-inner:before{border-left-width:11px;border-right-width:0;border-left-color:#E7E8F1}.c-bubble-left .c-bubble-inner:after{border-left-width:0;border-right-width:9px}.c-bubble-right .c-bubble-inner:after{border-left-width:9px;border-right-width:0}.c-bubble-trigger{font-size:0;position:relative;display:inline-block;vertical-align:middle}.c-bubble-trigger-icon{display:inline-block;width:16px;height:16px;vertical-align:middle}.c-bubble-trigger-text{font-size:12px;cursor:pointer}.c-bubble-trigger-btn{position:relative;display:block;padding:0 20px 0 10px;height:21px;font-size:14px;line-height:21px;color:#444}.c-bubble-trigger-btn:after{content:'';position:absolute;right:0;top:3px;width:16px;height:16px;background-image:url(sprite/base-201911131148.svg);;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;background-position:99.8% 19.12%;background-size:3150% 3075%;;background-repeat:no-repeat}.c-bubble-trigger.hover .c-bubble-trigger-btn,.c-bubble-trigger.show-bubble .c-bubble-trigger-btn,.c-bubble-trigger:hover .c-bubble-trigger-btn{color:#00a4ff;text-decoration:none}.c-bubble-trigger.disable-hover.show-bubble:hover .c-bubble-trigger-btn:after,.c-bubble-trigger.hover .c-bubble-trigger-btn:after,.c-bubble-trigger.show-bubble .c-bubble-trigger-btn:after,.c-bubble-trigger:hover .c-bubble-trigger-btn:after{background-image:url(sprite/base-201911131148.svg);;-webkit-transform:rotate3d(0,0,1,-180deg);transform:rotate3d(0,0,1,-180deg);background-position:99.8% 22.900000000000002%;background-size:3150% 3075%;;background-repeat:no-repeat}.c-bubble-trigger.disable-hover:hover .c-bubble-trigger-btn:after{-webkit-transform:rotate3d(0,0,1,0);transform:rotate3d(0,0,1,0)}.c-bubble-trigger .c-bubble{visibility:hidden;width:300px;-webkit-transition:.3s ease;transition:.3s ease;-webkit-transition-delay:0s;transition-delay:0s;text-align:center;pointer-events:none;opacity:0}.c-bubble-trigger.hover .c-bubble,.c-bubble-trigger.show-bubble .c-bubble,.c-bubble-trigger:hover .c-bubble{visibility:visible;-webkit-transition-delay:.1s;transition-delay:.1s;opacity:1}.c-bubble-trigger .c-bubble .c-bubble-inner{display:inline-block;overflow-y:auto;max-width:100%;max-height:100%;text-align:left;vertical-align:middle;pointer-events:auto}.c-bubble-trigger .c-bubble-bottom,.c-bubble-trigger .c-bubble-top{left:50%;margin-left:-150px}.c-bubble-trigger .c-bubble-top{top:100%;margin-top:11px;-webkit-transform:translateY(-11px);transform:translateY(-11px)}.c-bubble-trigger .c-bubble-bottom{bottom:100%;margin-bottom:11px;-webkit-transform:translateY(11px);transform:translateY(11px)}.c-bubble-trigger.hover .c-bubble-bottom,.c-bubble-trigger.hover .c-bubble-top,.c-bubble-trigger.show-bubble .c-bubble-bottom,.c-bubble-trigger.show-bubble .c-bubble-top,.c-bubble-trigger:hover .c-bubble-bottom,.c-bubble-trigger:hover .c-bubble-top{-webkit-transform:translateY(0);transform:translateY(0)}.c-bubble-trigger .c-bubble-left,.c-bubble-trigger .c-bubble-right{top:50%;height:300px;margin-top:-150px}.c-bubble-trigger .c-bubble-left:before,.c-bubble-trigger .c-bubble-right:before{font-size:0;display:inline-block;width:0;height:100%;content:'';vertical-align:middle}.c-bubble-trigger .c-bubble-left{text-align:left;left:100%;margin-left:11px;-webkit-transform:translateX(-11px);transform:translateX(-11px)}.c-bubble-trigger .c-bubble-right{text-align:right;right:100%;margin-right:11px;-webkit-transform:translateX(11px);transform:translateX(11px)}.c-bubble-trigger.hover .c-bubble-left,.c-bubble-trigger.hover .c-bubble-right,.c-bubble-trigger.show-bubble .c-bubble-left,.c-bubble-trigger.show-bubble .c-bubble-right,.c-bubble-trigger:hover .c-bubble-left,.c-bubble-trigger:hover .c-bubble-right{-webkit-transform:translateX(0);transform:translateX(0)}.c-bubble-trigger.c-triangle-align-start .c-bubble.c-bubble-bottom,.c-bubble-trigger.c-triangle-align-start .c-bubble.c-bubble-top{text-align:left;margin-left:-32px}.c-triangle-align-start .c-bubble-bottom .c-bubble-inner,.c-triangle-align-start .c-bubble-top .c-bubble-inner{left:32px}.c-triangle-align-start .c-bubble-left,.c-triangle-align-start .c-bubble-right{margin-top:-18px}.c-triangle-align-start .c-bubble-left .c-bubble-inner,.c-triangle-align-start .c-bubble-right .c-bubble-inner{top:18px;vertical-align:top}.c-triangle-align-end .c-bubble-bottom,.c-triangle-align-end .c-bubble-top{text-align:right;left:auto;right:0;margin-right:-24px}.c-triangle-align-end .c-bubble-bottom .c-bubble-inner,.c-triangle-align-end .c-bubble-top .c-bubble-inner{left:auto;right:24px}.c-triangle-align-end .c-bubble-bottom .c-bubble-inner:after,.c-triangle-align-end .c-bubble-top .c-bubble-inner:after{margin-right:1px}.c-triangle-align-end .c-bubble-left,.c-triangle-align-end .c-bubble-right{top:auto;bottom:-24px;margin-top:0}.c-triangle-align-end .c-bubble-left .c-bubble-inner,.c-triangle-align-end .c-bubble-right .c-bubble-inner{vertical-align:bottom;top:auto;bottom:24px}.c-triangle-align-end .c-bubble-left .c-bubble-inner:after,.c-triangle-align-end .c-bubble-right .c-bubble-inner:after{margin-bottom:1px}.c-bubble-trigger.disable-hover .c-bubble-bottom,.c-bubble-trigger.disable-hover .c-bubble-top{-webkit-transform:translateY(0);transform:translateY(0)}.c-bubble-trigger.disable-hover .c-bubble-left,.c-bubble-trigger.disable-hover .c-bubble-right{-webkit-transform:translateX(0);transform:translateX(0)}.c-bubble-trigger.disable-hover:hover .c-bubble{visibility:hidden;opacity:0}.c-bubble-trigger.show-bubble .c-bubble,.c-bubble-trigger.show-bubble:hover .c-bubble{z-index:900;visibility:visible;opacity:1}.c-bubble-trigger-icon.what{background-image:url(sprite/base-201911131148.svg);;cursor:pointer;background-position:91.60000000000001% 54.83%;background-size:3150% 3075%;;background-repeat:no-repeat}.c-bubble-trigger-icon.info{background-image:url(sprite/base-201911131148.png);cursor:pointer;background-position:-68px 0px}.com-bubble-confirm{min-width:170px;max-width:300px}.com-bubble-confirm .c-bubble-inner{padding:18px 20px}.com-bubble-confirm .confirm-title{font-size:14px;color:#000;font-weight:400}.com-bubble-confirm .confirm-btns{margin-top:14px}.com-bubble-confirm .confirm-btn{min-width:60px;border:none;background-color:transparent;color:#00a4ff;text-align:center;cursor:pointer;font-size:14px}.com-bubble-confirm .confirm-btn:hover{color:#0092ee}.com-bubble-confirm .confirm-btn.weak{color:#000}.com-bubble-confirm .confirm-btn.weak:hover{color:#00a4ff;text-decoration:none}.com-bubble-confirm.align-right .confirm-btns{text-align:right}.com-bubble-operations .c-bubble-trigger-btn{color:#666}.com-bubble-operations .c-bubble{left:auto;right:0;margin-left:0;margin-top:3px;text-align:right}.com-bubble-operations .c-bubble-inner{min-width:80px}.com-bubble-operations .c-bubble-inner:after,.com-bubble-operations .c-bubble-inner:before{display:none}.com-bubble-operations .com-bubble-menu a{font-size:14px;text-align:center}.c-bubble-trigger.has-menu .c-bubble-inner{padding:0}.c-bubble-trigger.has-menu .com-bubble-menu{margin:0}.c-bubble-inner>.com-bubble-menu{margin:-8px -10px}.com-bubble-menu a{display:block;padding:0 10px;font-size:12px;line-height:32px;text-align:left;color:#333}.com-bubble-menu a:hover{color:#00a4ff;background-color:#F2F2F2}.com-bubble-menu li.actived a,.com-bubble-menu li.actived a:hover{color:#00a4ff;background-color:transparent;cursor:default}.c-bubble-msg{color:#333}.c-bubble-msg .icon{position:relative;top:-1px;display:inline-block;vertical-align:middle;margin-right:5px;width:16px;height:16px;background-image:url(sprite/base-201911131148.svg);;background-position:73.98% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-bubble-warning-txt{font-size:12px;color:#ff7800;border-bottom:1px dashed #ff7800}.com-comment-edit{position:relative;margin-bottom:20px}.com-comment-edit .edit-body{position:relative;padding-left:34px;padding-right:110px}.com-comment-edit .com-avatar{position:absolute;left:0;top:5px;width:24px;height:24px;box-sizing:border-box;border:1px solid #e5e5e5}.com-comment-edit .edit-tip{position:absolute;left:34px;right:0;top:0;bottom:0;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #e5e5e5;border-radius:2px;background-color:#f7f8fa;text-align:center;font-size:14px;line-height:35px;color:#888}.com-comment-edit .edit-textarea{-webkit-box-sizing:border-box;box-sizing:border-box;padding:6px 8px;width:100%;height:36px;border:1px solid #e5e5e5;border-radius:2px;background:#fff;font-size:14px;line-height:22px;resize:none;vertical-align:top;-webkit-appearance:none}.com-comment-edit .edit-textarea:hover{border-color:#00a4ff}.com-comment-edit .edit-textarea:focus{border-color:#00a4ff;background-color:#fff}.com-comment-edit .edit-btns{text-align:right;text-align:right;position:absolute;right:0;top:0}.com-comment-edit .edit-btns .c-btn{height:36px;line-height:34px;min-width:100px}.com-comment-edit .edit-btns .c-btn-link{min-width:0}.com-comment-edit .edit-text a{margin-right:5px}.com-comment-edit.hide-avatar .com-avatar{display:none}.com-comment-edit.hide-avatar .edit-body{padding-left:0}.com-comment-panel{padding:20px 0 20px 34px;border-bottom:1px solid #eee;position:relative}.com-comment-panel:first-child{padding-top:0}.com-comment-panel:first-child .com-comment-panel-author{top:0}.com-comment-panel-author{margin-bottom:10px;position:absolute;left:0;top:20px}.com-comment-panel-author.com-media{width:auto}.com-comment-panel-author .com-media-object{padding-right:10px;width:24px}.com-comment-panel-author .com-media-img{width:24px;height:24px;box-sizing:border-box;border:1px solid #e5e5e5}.com-comment-panel-author .com-media-body{width:auto}.com-comment-panel-author .com-media-title{margin-bottom:0;line-height:24px;color:#666}.com-comment-panel-author .com-media-title .weak-text{display:inline-block;vertical-align:middle;margin:0 5px;color:#999}.com-comment-panel-author .com-media-title .split{margin:0 10px}.com-comment-panel-author .com-media-title .split+.weak-text{margin-left:0}.com-comment-panel-author .com-media-title .split:before{content:'·'}.com-comment-panel-author .name{display:inline-block;vertical-align:middle;max-width:12em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.com-comment-panel .com-comment-panel-markdown{margin-top:0;line-height:24px;word-wrap:break-word;color:#333}.com-comment-panel .com-comment-panel-markdown p,.com-comment-panel .com-comment-panel-markdown.style-small p{margin-top:0}.com-comment-panel .com-comment-panel-markdown p:last-child,.com-comment-panel .com-comment-panel-markdown.style-small p:last-child{margin-bottom:0}.com-comment-panel-deleted-text{color:#999}.com-comment-panel-bd{position:relative}.com-comment-panel-time{position:absolute;right:0;top:0;font-size:12px;line-height:24px;color:#999}.com-comment-panel-operations{margin-top:15px}.com-comment-panel .com-opt-link{font-size:12px}.com-comment-panel .link-hidden{opacity:0;visibility:hidden;-webkit-transition:all .3s;transition:all .3s}.com-comment-panel-bd:hover .link-hidden,.com-comment-panel.editting>.com-comment-panel-bd .link-hidden{opacity:1;visibility:visible}.com-comment-panel .com-comment-edit{margin-bottom:0;margin-top:20px}.com-comment-panel-replies{margin-top:15px;padding:15px;background-color:#F7F8FA}.com-comment-panel.is-reply{margin-bottom:15px;padding:0 0 15px}.com-comment-panel.is-reply:last-child{margin-bottom:0;padding-bottom:0;border-bottom:none}.com-comment-panel.is-reply .com-comment-panel-markdown{color:#666}.com-comment-popup .c-pages-wrap{margin-top:15px}.com-comment-popup .com-none{margin:20px auto}.com-comment-popup .com-none.with-bg{margin-bottom:0}.com-comment-popup .popup-hd{position:relative;margin-bottom:20px;margin-top:-30px;border-bottom:1px solid #e5e5e5;line-height:52px}.com-comment-popup .popup-title{font-size:16px;font-weight:400}.com-comment-popup .popup-extra{position:absolute;right:0;top:0;font-size:0}.com-comment-popup .popup-opt{display:inline-block;vertical-align:middle;color:#666;font-size:14px}.com-comment-popup .popup-opt .icon{position:relative;top:-1px;display:inline-block;vertical-align:middle;margin-right:5px;width:16px;height:16px;background-image:url(sprite/base-201911131148.svg);;background-position:69.88% 55.669999999999995%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-comment-popup .popup-opt:hover{color:#00a4ff}.com-comment-popup .popup-hd:hover .icon{background-image:url(sprite/base-201911131148.svg);;background-position:3.8899999999999997% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-comment-panel-names .name{color:#00a4ff}.com-comment-panel-names .name:hover{text-decoration:underline}.com-comment-panel-names .weak-text{margin:0 5px}.com-comment-popup .popup-ft{text-align:center}.com-comment-popup .popup-ft a{display:inline-block;vertical-align:middle;line-height:52px;color:#333}.com-comment-popup .popup-ft a:hover{color:#00a4ff}.com-answer-panel .com-comment-popup{padding:30px}.com-answer-panel .com-comment-popup .popup-ft{margin-bottom:-20px}.com-comment-single-edit{margin:60px 0 44px}.com-comment-single-edit .edit-hd{position:relative;margin-bottom:10px;line-height:30px}.com-comment-single-edit .edit-title{font-size:20px;color:#999;font-weight:400}.com-comment-single-edit .edit-icon{display:inline-block;vertical-align:middle;position:relative;top:-1px;margin-right:10px;width:22px;height:22px;background-image:url(sprite/base-201911131148.svg);;background-position:75.31% 83.62%;background-size:2290.909090909091% 2236.3636363636365%;;background-repeat:no-repeat}.com-comment-single-edit .edit-count{position:absolute;right:0;top:0;font-size:20px;color:#000}.com-comment-single-edit .edit-count-num{color:#00a4ff}.com-comment-single-edit .edit-body{position:relative}.com-comment-single-edit .edit-textarea{box-sizing:border-box;padding:10px;width:100%;height:90px;border:1px solid #e5e5e5;background-color:#fff;resize:vertical;font-size:14px;line-height:1.5}.com-comment-single-edit .edit-textarea:focus{border-color:#00a4ff}.com-comment-single-edit .edit-tip{position:absolute;left:0;top:0;box-sizing:border-box;width:100%;height:100%;border:1px solid rgba(157,157,157,.18);background-color:#f7f8fa;font-size:16px;line-height:22px;text-align:center;color:#999}.com-comment-single-edit .edit-tip:before{content:'';display:inline-block;vertical-align:middle;width:0;height:100%}.com-comment-single-edit .edit-tip a{color:#00a4ff;font-weight:600}.com-comment-single-edit .edit-btns{text-align:right;margin-top:13px}.c-msg.com-comment-msg{margin-bottom:40px;margin-top:-10px}.com-avatar{display:inline-block;vertical-align:middle;width:32px;height:32px;border-radius:50%;background-size:cover;background-position:center;overflow:hidden}.com-avatar .avatar-text{position:absolute;left:0;bottom:0;width:100%;height:100%;background-color:rgba(0,0,0,.6);font-size:14px;line-height:32px;color:#fff;text-align:center}.com-avatar .avatar-file{position:absolute;left:0;top:0;width:100%;height:100%;cursor:pointer;opacity:0}.com-media{margin-bottom:20px;display:table;table-layout:fixed;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.com-media-object{display:table-cell;vertical-align:top;padding-right:20px;-webkit-box-sizing:content-box;box-sizing:content-box;width:40px}.com-media-img{display:block;width:40px;height:40px;border-radius:50%}span.com-media-img{background-size:cover;background-position:center center}.com-media-body{display:table-cell;vertical-align:top;-webkit-box-sizing:border-box;box-sizing:border-box}.com-media-title{font-size:14px;font-weight:400;line-height:18px;color:#000;margin-bottom:2px}.com-media-title a{color:inherit}.com-media-title a:hover{color:#00a4ff;text-decoration:none}.com-media-desc{font-size:12px;line-height:20px;color:#888}.com-media-desc-item{margin-right:25px;color:inherit}a.com-media-desc-item:hover{color:#00a4ff;text-decoration:none}.com-article-media{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;margin-bottom:0;height:255px;border:1px solid #e5e5e5;overflow:hidden}.com-article-media-object{padding:0;height:auto;width:170px}.com-article-media-object .com-media-img{width:100%;height:253px;border-radius:0}.com-article-media-body{position:relative;padding:25px 30px}.com-article-media-body>.com-media-title{margin-bottom:10px;font-size:18px;line-height:1.5;color:#000}.com-article-media-body>.com-media-title a{display:block;display:-webkit-box;max-height:54px;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;-webkit-box-orient:vertical;color:inherit}.com-article-media-body>.com-media-title a:hover{color:#00a4ff}.com-article-media-body>.com-media-desc{font-size:14px;line-height:24px;color:#666}.com-article-media-body>.com-media-desc,.com-article-media-body>.com-media-desc a{display:block;display:-webkit-box;max-height:72px;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:3;-webkit-box-orient:vertical;color:inherit}.com-article-media-body>.com-media-desc a:hover{color:#00a4ff}.com-article-media-source{position:absolute;left:20px;right:20px;bottom:20px;font-size:0}.com-article-media-source .com-avatar{margin-right:15px}.com-article-media-source .source-content{display:inline-block;vertical-align:middle;color:#999;line-height:20px;white-space:nowrap}.com-article-media-source .source-content a{display:inline-block;vertical-align:middle;color:#666}.com-article-media-source .source-content a:hover{color:#00a4ff}.com-article-media-source .source-content p{margin-top:2px}.com-article-media-source .author-name{max-width:12em;overflow:hidden;text-overflow:ellipsis;cursor:pointer;font-size:14px}.com-article-media-source .author-name:hover{color:#00a4ff}.com-article-media-source .com-verification{top:-1px;margin-left:5px;margin-right:0}.com-article-media-source .com-emblem-list{margin-left:5px}.com-article-media-source p{font-size:14px}.com-article-media-source .column-name{position:relative;top:-1px;max-width:14em;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.com-article-media-source .column-name:hover{color:#00a4ff}.com-article-media-source .com-operations{position:absolute;right:0;bottom:0;white-space:nowrap}.com-article-media-source .com-opt-link{margin-right:0;margin-left:20px}.com-article-media.without-object{height:215px}.com-article-media.without-object .com-media-body{padding:20px}.com-article-media.without-object .com-opt-link{color:#666}.com-article-media.without-object .com-i-view{background-image:url(sprite/base-201911131148.svg);;background-position:26.02% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-article-media.without-object .column-name{color:#00a4ff}.com-article-media.without-object .column-name:hover{-webkit-box-shadow:inset 0 -1px #00a4ff;box-shadow:inset 0 -1px #00a4ff}.com-column-media{position:relative;display:block;-webkit-box-sizing:border-box;box-sizing:border-box;padding:17px 30px 0 84px;height:88px;border:1px solid #e5e5e5;background-color:rgba(215,216,217,.1);-webkit-transition:-webkit-box-shadow .2s ease,-webkit-transform .2s ease;transition:-webkit-box-shadow .2s ease,-webkit-transform .2s ease;transition:box-shadow .2s ease,transform .2s ease;transition:box-shadow .2s ease,transform .2s ease,-webkit-box-shadow .2s ease,-webkit-transform .2s ease}.com-column-media:hover{-webkit-transform:translateY(-2px);transform:translateY(-2px);-webkit-box-shadow:0 0 6px 0 rgba(0,0,0,.08),0 4px 6px 0 rgba(0,0,0,.1);box-shadow:0 0 6px 0 rgba(0,0,0,.08),0 4px 6px 0 rgba(0,0,0,.1)}.com-column-media .com-avatar{-webkit-box-sizing:border-box;box-sizing:border-box;position:absolute;left:20px;top:50%;margin-top:-24px;width:48px;height:48px}.com-column-media-title{margin-bottom:4px;font-size:18px;font-weight:400;color:#000;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-column-media-desc{font-size:0;color:#999;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-column-media-desc .data{display:inline-block;vertical-align:middle;font-size:14px}.com-column-media-tag{position:absolute;right:0;top:0;z-index:2;width:54px;height:54px;font-size:0;background-image:url(sprite/base-201911131148.svg);;background-position:67.33% 0.22999999999999998%;background-size:933.3333333333334% 911.1111111111111%;;background-repeat:no-repeat}.com-column-media2{position:relative;padding-bottom:30px;margin-bottom:30px;border-bottom:1px solid #e5e5e5}.com-column-media2 .com-media-object{vertical-align:middle;width:48px;padding-right:15px}.com-column-media2 .com-media-img{width:48px;height:48px}.com-column-media2 .com-media-body{position:relative;padding-right:180px;vertical-align:middle}.com-column-media2 .com-column-media-title{margin-bottom:2px}.com-column-media2 .com-column-media-title a{display:block;color:inherit;overflow:hidden;text-overflow:ellipsis}.com-column-media2 .com-column-media-title em{font-weight:400;color:#ff7200}.com-column-media2 .com-column-media-title a:hover{color:#00a4ff}.com-column-media2 .com-column-media-desc{font-size:0}.com-column-media2 .com-column-media-desc .data{display:inline-block;vertical-align:middle;font-size:14px}.com-column-media2 .btn-follow,.com-column-media2 .c-dropdown-link{padding:0 10px;min-width:80px;height:28px;line-height:26px;font-size:12px;vertical-align:middle}.com-column-media2 .c-dropdown{margin-left:5px}.com-column-media2 .c-dropdown-link{min-width:0;-webkit-box-sizing:border-box;box-sizing:border-box}.com-column-media2 .c-dropdown-link .caret{top:50%;margin-top:-8px}.com-column-media2 .com-column-media-opt{position:absolute;right:0;top:50%;margin-top:-18px}.com-column-media2.without-opts .com-media-body{padding-right:0}.com-q-a-list{margin-bottom:-15px}.com-q-a-media{display:block;position:relative;margin-bottom:15px;padding-left:60px;color:#333}.com-q-a-media .media-type{position:absolute;left:0;top:0;width:45px;height:30px;background-color:#EDEFF2;border-radius:2px;text-align:center;line-height:30px;font-size:12px;color:#666}.com-q-a-media .media-type.answer{background-color:rgba(0,164,255,.15);color:#00a4ff}.com-q-a-media .media-title{font-size:18px;line-height:30px;font-weight:400;color:#000}.com-q-a-media .media-title-text{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.com-q-a-media:hover .media-title{color:#00a4ff}.com-article-panel{-webkit-box-sizing:border-box;box-sizing:border-box;display:table;table-layout:fixed;width:100%;border-bottom:1px solid #e5e5e5;padding-bottom:20px;margin-bottom:20px}.com-article-panel.first{padding-top:0}.com-article-panel-body{position:relative;display:table-cell;vertical-align:middle}.com-article-panel-object{display:table-cell;vertical-align:middle;padding-left:30px;width:160px}.com-article-panel-object .com-media-img{display:block;width:160px;height:120px;border-radius:0;background-size:cover;background-position:center}.com-article-panel-author{margin-bottom:10px;color:#999;font-size:0}.com-article-panel-author .column-name,.com-article-panel-author>a{display:inline-block;vertical-align:middle;margin:0 5px;color:inherit;font-size:14px}.com-article-panel-author>span{display:inline-block;vertical-align:middle;font-size:14px}.com-article-panel-author>a:first-child{margin-left:0}.com-article-panel-author a:hover{color:#00a4ff}.com-article-panel-author .com-verification{margin-left:-2px;margin-right:5px;font-size:14px}.com-article-panel-author .column-wrap{font-size:0}.com-article-panel-author .author-name,.com-article-panel-author .column-name{max-width:16em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-article-panel-author .subscibe-btn{margin:0 5px;vertical-align:middle;transition:opacity .3s;opacity:0}.column-wrap.hover .subscibe-btn,.column-wrap:hover .subscibe-btn{opacity:1}.com-article-panel-time{position:absolute;right:0;top:0;color:#999}.com-article-panel-title{margin-bottom:10px;font-size:18px;line-height:27px;color:#000;font-weight:400}.com-article-panel-title a{display:block;color:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-article-panel-desc em,.com-article-panel-title em{font-weight:inherit;color:#ff7200}.com-article-panel-title a:hover{color:#00a4ff}.com-article-panel-title.with-tag{box-sizing:border-box;position:relative;display:inline-block;vertical-align:middle;max-width:100%;padding-left:60px}.com-article-panel-title.with-tag .com-article-tag-bubble{position:absolute;left:0;top:1px}.com-article-tag{display:inline-block;vertical-align:middle;padding:0 5px;font-size:12px;line-height:16px;border:1px solid #00a4ff;border-radius:2px;color:#00a4ff}.com-article-panel-desc{line-height:24px;color:#666;word-wrap:break-word}.com-article-panel-desc a{color:inherit}.com-article-panel-desc a:hover{color:#00a4ff}.com-article-panel-operations{margin-top:10px}.com-article-panel-operations .extra-part{display:none}.com-article-panel:hover .com-article-panel-operations .extra-part{display:block}.com-article-panel-extra-opts{display:table-cell;width:0;position:relative}.com-article-panel-extra-opts .opt-inner{position:absolute;left:0;top:0}.com-article-panel-extra-opts .c-btn{margin-bottom:10px;margin-left:20px}.com-article-panel-infos{margin-top:20px;font-size:0}.com-article-panel-info{display:inline-block;vertical-align:middle;font-size:14px;line-height:1.1;color:#999}.com-article-panel-info:before{content:'';display:inline-block;vertical-align:middle;position:relative;top:-1px;margin:0 10px;width:3px;height:3px;border-radius:50%;background-color:#999}.com-article-panel-info:first-child:before{display:none}.com-article-panel-order{position:relative;display:table-cell;padding-top:3px;width:100px}.com-ranking-order{display:inline-block;vertical-align:middle;width:64px;height:64px;font-size:0}.com-ranking-order.order-1{background-image:url(sprite/base-201911131148.svg);;background-position:15.229999999999999% 46.5%;background-size:787.5% 768.75%;;background-repeat:no-repeat}.com-ranking-order.order-2{background-image:url(sprite/base-201911131148.svg);;background-position:53.86% 31.069999999999997%;background-size:787.5% 768.75%;;background-repeat:no-repeat}.com-ranking-order.order-3{background-image:url(sprite/base-201911131148.svg);;background-position:53.86% 15.65%;background-size:787.5% 768.75%;;background-repeat:no-repeat}.com-ranking-order.order-4{background-image:url(sprite/base-201911131148.svg);;background-position:53.86% 0.22999999999999998%;background-size:787.5% 768.75%;;background-repeat:no-repeat}.com-ranking-order.order-5{background-image:url(sprite/base-201911131148.svg);;background-position:0.22999999999999998% 31.069999999999997%;background-size:787.5% 768.75%;;background-repeat:no-repeat}.com-ranking-order.order-6{background-image:url(sprite/base-201911131148.svg);;background-position:38.86% 0.22999999999999998%;background-size:787.5% 768.75%;;background-repeat:no-repeat}.com-ranking-order.order-7{background-image:url(sprite/base-201911131148.svg);;background-position:15.229999999999999% 15.65%;background-size:787.5% 768.75%;;background-repeat:no-repeat}.com-ranking-order.order-8{background-image:url(sprite/base-201911131148.svg);;background-position:0.22999999999999998% 15.65%;background-size:787.5% 768.75%;;background-repeat:no-repeat}.com-ranking-order.order-9{background-image:url(sprite/base-201911131148.svg);;background-position:15.229999999999999% 31.069999999999997%;background-size:787.5% 768.75%;;background-repeat:no-repeat}.com-ranking-order.order-10{background-image:url(sprite/base-201911131148.svg);;background-position:0.22999999999999998% 46.5%;background-size:787.5% 768.75%;;background-repeat:no-repeat}.com-tag-media{position:relative;padding-bottom:30px;margin-bottom:30px;border-bottom:1px solid #e5e5e5}.com-tag-media .com-media-object{padding-right:10px;width:48px}.com-tag-media .com-media-img{width:48px;height:48px}.com-tag-media .com-media-title{margin-bottom:2px;font-size:18px;line-height:25px}.com-tag-media .com-media-title a{display:block}.com-tag-media .com-media-body{position:relative}.com-tag-media .com-media-desc{font-size:14px}.com-tag-media .com-tag-media-opt{position:absolute;right:0;top:50%;margin-top:-18px}.com-tag-media .c-btn{padding:0 10px;min-width:90px;height:30px;line-height:30px;font-size:12px}.com-tag-media .c-btn-hole,.com-tag-media .c-btn-weak{line-height:28px}.com-lab-gallery{display:block;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;height:278px;min-width:240px;font-size:14px;color:#444;line-height:24px}.com-lab-gallery .inner{position:absolute;width:100%;background:#fff;border-radius:4px;height:278px;-webkit-box-shadow:0 1px 3px rgba(0,0 ,0,.1),0 2px 2px rgba(0,0 ,0,.2);box-shadow:0 1px 3px rgba(0,0 ,0,.1),0 2px 2px rgba(0,0 ,0,.2)}.com-lab-gallery:hover{text-decoration:none;-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}.com-lab-gallery:hover .inner{-webkit-box-shadow:0 3px 6px rgba(0,0 ,0,.2);box-shadow:0 3px 6px rgba(0,0 ,0,.2)}.com-lab-gallery-summary{-webkit-box-sizing:border-box;box-sizing:border-box;height:100%;overflow:hidden;position:relative}.com-lab-gallery-summary .logo-bg{position:absolute;width:100%;height:144px;background:url(cssComponents/img/card-bg.png) no-repeat;background-size:cover;border-radius:4px 4px 0 0}.com-lab-gallery-summary .logo-mask{position:absolute;height:144px;width:100%;top:0;border-radius:4px 4px 0 0}.com-lab-gallery-summary .logo-container{position:absolute;height:144px;width:100%;top:0}.com-lab-gallery-summary .logo-container .logo{width:56%;height:80px;margin:32px 22%;text-align:center;background-repeat:no-repeat;background-size:contain;background-position:center}.com-lab-gallery-summary .logo-container img{height:80px;width:auto;max-width:56%}.com-lab-gallery-summary .info-container{margin-top:144px;padding:18px;height:100px;line-height:26px}.com-lab-gallery-summary .hint{width:100%;height:24px;background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.8)),to(rgba(0,0,0,0)));background-image:linear-gradient(90deg,rgba(0,0,0,.8),rgba(0,0,0,0));position:absolute;top:120px;color:#fff;padding:0 20px;font-size:12px;line-height:24px}.com-lab-gallery-summary .title{font-size:16px;font-weight:500;line-height:22px}.com-lab-gallery-summary .owner{color:rgba(0,0,0,.54)}.com-lab-gallery-summary .desc{position:absolute;bottom:18px;line-height:16px;color:rgba(0,0,0,.54);overflow:hidden;white-space:nowrap}.com-lab-gallery-summary .desc-item{display:inline-block;padding-right:14px;color:rgba(0,0,0,.54)}.com-lab-gallery-summary .desc-item span{margin-left:20px;line-height:16px}.com-lab-gallery-summary .desc-item i{display:inline-block;position:absolute;line-height:16px;width:16px;height:16px}.com-lab-gallery,.com-lab-gallery .inner,.com-lab-gallery-summary{-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}.com-lab-i-level{background-image:url(sprite/base-201911131148.svg);;background-position:18.65% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-lab-i-duration{background-image:url(sprite/base-201911131148.svg);;background-position:66.60000000000001% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-lab-i-user{background-image:url(sprite/base-201911131148.svg);;background-position:40.78% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-datas{color:#999;font-size:0}.com-data{display:inline-block;vertical-align:middle;font-size:12px}.com-user-media{padding-bottom:30px;margin-bottom:30px;border-bottom:1px solid #e5e5e5}.com-user-media .com-media-object{padding-right:15px;width:48px;vertical-align:middle}.com-user-media .com-media-img{width:48px;height:48px}.com-user-media .com-media-title{position:relative;box-sizing:border-box;display:inline-block;vertical-align:middle;padding-right:20px;margin-bottom:3px;max-width:100%;font-size:18px;line-height:1.5}.com-user-media .com-media-title>a{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-user-media .com-media-title .com-verification{position:absolute;right:0;top:50%;margin-top:-9px;margin-right:0}.com-user-media .com-media-title em{font-weight:inherit;color:#ff7200}.com-user-media .com-media-desc{margin-bottom:4px;color:#666;font-size:14px;word-wrap:break-word;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:3em}.com-user-media .com-media-body{position:relative;padding-right:180px}.com-user-media-opts{position:absolute;right:0;top:50%;margin-top:-17px;font-size:0}.com-user-media-opts .c-btn{padding:0 10px;margin-left:10px;min-width:80px;height:28px;line-height:26px;font-size:12px}.com-lab-media{margin-bottom:0;padding:20px;background-color:#f7f8fa}.com-lab-media .com-media-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-lab-honor{background:#f7f8fa}.com-lab-honor .com-media-object{padding-right:0;width:40px;height:40px;background-color:grey;vertical-align:middle}.com-lab-honor .com-media-img{width:auto;height:auto;max-width:100%;max-height:100%}.com-lab-honor .com-media-body{padding:0 10px;vertical-align:middle}.com-lab-honor .com-media-title{font-size:14px;color:#333;margin-bottom:0}.com-lab-with-status{-webkit-box-sizing:border-box;box-sizing:border-box;display:table;table-layout:fixed;width:100%;padding-bottom:20px;margin-bottom:20px;border-bottom:1px solid #e5e5e5}.com-lab-with-status .lab-cell{display:table-cell;vertical-align:middle;padding-left:20px}.com-lab-with-status .lab-cell:first-child{padding-left:0}.com-lab-with-status .lab-cell.img{width:48px}.com-lab-with-status .lab-img{width:48px;height:48px;background-size:contain;background-position:center}.com-lab-with-status .lab-title{font-size:18px;font-weight:400;color:#000;word-wrap:break-word}.com-lab-with-status .lab-cell.process{width:180px}.com-lab-with-status .lab-cell.operation{width:80px}.com-lab-with-status a{color:#00A4FF}.com-lab-with-status a:hover{border-bottom:1px solid #00A4FF}.com-process{position:relative;height:18px;background-color:#9B9B9B;border-radius:9px}.com-process .process-bar{display:block;background-color:#00A4FF;border-radius:9px;height:100%}.com-process .process-text{position:absolute;left:0;top:0;width:100%;font-size:12px;line-height:18px;color:#fff;text-align:center}.com-level-details>li{position:relative;padding:0 140px 0 60px;line-height:30px}.com-level-details>li+li{margin-top:15px}.com-level-details .detail-score{position:absolute;left:0;top:50%;margin-top:-15px;width:45px;height:30px;border-radius:2px;background-color:rgba(0,164,255,.15);font-size:14px;font-weight:700;text-align:center;color:#00a4ff}.com-level-details .detail-score.deduct{background-color:#fcecec;color:#b43537}.com-level-details .detail-action{padding:3px 0;color:#999;line-height:24px}.com-level-details .detail-action-target{margin:0 5px;color:#000}.com-level-details .detail-action-target:hover{color:#00a4ff}.com-level-details .detail-action .ellipsis{position:relative;top:-1px;display:inline-block;vertical-align:middle;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:12em}.com-level-details .detail-action .ellipsis.post{max-width:22em}.com-level-details .detail-action .ellipsis.post-recom{max-width:14em}.com-level-details .detail-action .ellipsis.post-original{max-width:12em}.com-level-details .detail-action .ellipsis.post-delete{max-width:19em}.com-level-details .detail-action .ellipsis.post-admin-delete,.com-level-details .detail-action .ellipsis.post-reject{max-width:16em}.com-level-details .detail-action .ellipsis.post-pass{max-width:18em}.com-level-details .detail-action .ellipsis.translate-accept{max-width:17em}.com-level-details .detail-time{position:absolute;right:0;top:50%;margin-top:-15px;color:#999}.com-adpanel.small{height:60px;font-size:16px}.com-adpanel.in-sidebar{margin-bottom:15px;height:auto;padding-top:35.48387097%}.com-adpanel.in-sidebar .text,.com-adpanel.in-sidebar:before{display:none}.com-author-panel{-webkit-box-sizing:border-box;box-sizing:border-box;padding:20px;height:242px;border:1px solid #e5e5e5;text-align:center}.com-author-panel .com-avatar{display:block;margin:0 auto 15px;width:80px;height:80px}.com-author-panel .author-name{margin-bottom:6px;font-size:18px;font-weight:400}.com-author-panel .author-name a{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#333}.com-author-panel .author-name a:hover{color:#00a4ff}.com-author-panel .author-desc{margin-bottom:17px;color:#666;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-author-panel .follow-btn{display:block;margin:0 auto;padding:0 10px;min-width:90px;height:30px;line-height:28px;border:1px solid #e5e5e5;color:#333;background-color:transparent}.com-author-panel .follow-btn .icon{position:relative;top:-1px;display:inline-block;vertical-align:middle;margin-right:9px;width:10px;height:10px;background-image:url(sprite/base-201911131148.svg);;background-position:61.339999999999996% 52.28%;background-size:5040% 4920%;;background-repeat:no-repeat}.com-author-panel .follow-btn:hover{background-color:#00a4ff;color:#fff;border-color:#00a4ff}.com-author-panel .follow-btn:hover .icon{background-image:url(sprite/base-201911131148.svg);;background-position:63.77% 52.28%;background-size:5040% 4920%;;background-repeat:no-repeat}.com-author-panel .follow-btn.c-btn-disabled,.com-author-panel .follow-btn.c-btn-disabled:hover{border-color:#d5d7de;background-color:#d5d7de;color:#fff}.com-author-panel .follow-btn.c-btn-disabled .icon,.com-author-panel .follow-btn.c-btn-disabled:hover .icon{background-image:url(sprite/base-201911131148.svg);;background-position:63.77% 52.28%;background-size:5040% 4920%;;background-repeat:no-repeat}[class*=' c-media-bg'],[class^=c-media-bg]{display:block;background-repeat:no-repeat;background-position:center;background-size:contain}.c-media-bg32{height:32px}.c-media-bg48{height:48px}.c-media-bg64{height:64px}.c-media-bg144{height:144px}.c-media-topicon-alignleft [class*=' c-media-bg'],.c-media-topicon-alignleft [class^=c-media-bg]{background-position:left center}.c-media-extra-infos{margin-bottom:-20px;border-top:1px solid #e5e5e5;font-size:0;height:54px;line-height:54px}.c-media-extra-info{display:inline-block;margin-left:20px;color:#666;font-size:14px}.c-media-extra-info:first-child{margin-left:0}.c-media-extra-info .icon{position:relative;top:-1px;display:inline-block;vertical-align:middle;margin-right:8px;width:16px;height:16px}.c-media-extra-info .icon.step{background-size:3150% 3075%;;background-position:77.66% 92.86%;background-image:url(sprite/base-201911131148.svg);;background-repeat:no-repeat}.c-media-extra-info .icon.time{background-size:3150% 3075%;;background-position:66.60000000000001% 92.86%;background-image:url(sprite/base-201911131148.svg);;background-repeat:no-repeat}.c-media-extra-info .icon.video{background-size:3150% 3075%;;background-position:44.47% 92.86%;background-image:url(sprite/base-201911131148.svg);;background-repeat:no-repeat}.c-media-extra-info .icon.level{background-size:3150% 3075%;;background-position:18.65% 96.64%;background-image:url(sprite/base-201911131148.svg);;background-repeat:no-repeat}.c-media-extra-info .icon.view{background-size:3150% 3075%;;background-position:40.78% 92.86%;background-image:url(sprite/base-201911131148.svg);;background-repeat:no-repeat}.c-media-skin-lab{padding:25px}.c-media-skin-lab .c-media-body{height:118px}.c-media-skin-lab .c-media-heading,.c-media-skin-lab .c-media-info{word-wrap:break-word;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:3em}.c-media-skin-lab:hover .c-media-heading{color:#333}.c-media-skin-lab .c-media-extra-infos{margin-bottom:-25px}.c-media-skin-lab .c-media-extra-info{margin-left:15px}.c-media-skin-lab .c-media-extra-info:first-child{margin-left:0}.com-media-ask{-webkit-box-sizing:border-box;box-sizing:border-box;padding:30px;height:230px;border:1px solid #e5e5e5}.com-media-ask-title{margin-bottom:30px;font-size:18px;line-height:1.5;font-weight:400;color:#000}.com-media-ask-title a{display:block;color:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-media-ask-title a:hover{color:#00a4ff}.com-media-ask-author{margin-bottom:15px}.com-media-ask-author .com-media-object{padding-right:13px;width:32px}.com-media-ask-author .com-media-img{width:32px;height:32px}.com-media-ask-author .com-media-body{vertical-align:middle}.com-media-ask-author .com-media-title{box-sizing:border-box;position:relative;display:inline-block;vertical-align:middle;padding-right:15px;max-width:100%;margin-bottom:0}.com-media-ask-author .com-verification{position:absolute;right:0;top:3px;margin-right:0}.com-media-ask-author .com-media-title a{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-media-ask-desc{margin-bottom:10px;font-size:14px;line-height:24px;color:#666;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;height:48px;word-wrap:break-word}.com-media-ask-desc a{color:inherit}.com-media-ask-desc a:hover{color:#00a4ff}.com-doc-panels{margin-bottom:-10px;margin-left:-5px;margin-right:-5px}.com-doc-panels [class*=c-g-]{margin-bottom:10px;padding-left:5px;padding-right:5px}.com-doc-panel{display:block;position:relative;box-sizing:border-box;padding:15px;height:80px;border:1px solid #e5e5e5;font-size:0}.com-doc-panel:after{content:'';display:inline-block;vertical-align:middle;width:0;height:100%}.com-doc-panel .panel-title{box-sizing:border-box;padding-left:75px;display:inline-block;vertical-align:middle;max-width:98%;font-size:16px;line-height:22px;color:#000;word-wrap:break-word}.com-doc-panel em{color:#ff7200}.com-doc-panel .panel-title .ellipsis{display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:44px}.com-doc-panel .icon{position:absolute;left:15px;top:50%;margin-top:-15px;width:60px;height:30px;background-position:center;background-size:contain;background-repeat:no-repeat}li:last-child>.com-related-doc{margin-bottom:0;padding-bottom:0;border-bottom:none}.com-related-doc{margin-bottom:20px;padding-bottom:20px;border-bottom:1px solid #e5e5e5;word-wrap:break-word}.com-doc-crumb{margin-bottom:15px;font-size:0}.com-doc-crumb .crumb-icon{display:inline-block;vertical-align:middle;margin-right:10px;width:16px;height:16px;background-size:contain;background-position:center center;background-repeat:no-repeat}.com-doc-crumb .crumb-item{display:inline-block;vertical-align:middle;color:#999;font-size:12px}.com-doc-crumb a.crumb-item:hover{color:#00a4ff}.com-doc-crumb .crumb-split{display:inline-block;vertical-align:middle;margin:0 10px;width:0;height:0;border-style:solid;border-color:transparent #999;border-width:3px 0 3px 4px}.com-related-doc .doc-title{margin-bottom:10px;font-size:18px;font-weight:400;color:#000}.com-related-doc .doc-desc a,.com-related-doc .doc-title a{color:inherit}.com-related-doc .doc-desc a:hover,.com-related-doc .doc-title a:hover{color:#00a4ff}.com-related-doc .doc-desc{font-size:14px}.com-related-doc em{color:#ff7200}.com-activity-panel{-webkit-box-sizing:border-box;box-sizing:border-box;display:table;table-layout:fixed;width:100%;border-bottom:1px solid #e5e5e5;padding-bottom:20px;margin-bottom:20px}.com-activity-panel-body{position:relative;display:table-cell;vertical-align:top}.com-activity-panel-object{display:table-cell;vertical-align:top;padding-left:30px;width:160px}.com-activity-panel-object .com-media-img{display:block;width:160px;height:120px;border-radius:0;background-size:cover;background-position:center}.com-activity-panel-title{font-size:18px;line-height:1.5;color:#000;font-weight:400;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;height:54px}.com-activity-panel-title a{display:block;color:inherit}.com-activity-panel-title em{font-weight:inherit;color:#00a4ff}.com-activity-panel-title a:hover{color:#00a4ff}.com-activity-panel-infos{margin-top:15px;color:#666;word-wrap:break-word}.com-activity-panel-infos li+li{margin-top:5px}.com-activity-panel.simple .com-activity-panel-title{height:auto;max-height:54px}.com-intro-infos{margin-top:15px}.com-intro-infos .intro-info{margin-bottom:10px}.com-intro-infos .intro-info-inner{position:relative;padding-left:21px}.com-intro-infos .intro-info-icon{position:absolute;left:0;top:1px;width:16px;height:16px}.com-intro-infos .intro-info-icon.address{background-image:url(sprite/base-201911131148.svg);;background-position:91.60000000000001% 62.39%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-intro-infos .intro-info-icon.job{background-image:url(sprite/base-201911131148.svg);;background-position:91.60000000000001% 73.74000000000001%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-intro-infos .intro-info-icon.education{background-image:url(sprite/base-201911131148.svg);;background-position:91.60000000000001% 69.96%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-intro-infos .intro-info-icon.blog{background-image:url(sprite/base-201911131148.svg);;background-position:91.60000000000001% 66.18%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-intro-infos .intro-info-icon.skill{background-image:url(sprite/base-201911131148.svg);;background-position:91.60000000000001% 77.52%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-intro-infos .intro-info-text{display:block;font-size:12px;vertical-align:middle;word-wrap:break-word;color:#888}.com-intro-infos .com-verification{top:-2px;margin:0 0 0 5px}.com-ranking-group{position:relative;margin-bottom:60px;padding:30px 0;font-size:0;background-color:#fff}.com-ranking-group-hd{box-sizing:border-box;display:inline-block;vertical-align:top;padding:0 30px;width:28%;text-align:center}.com-ranking-group-bd{box-sizing:border-box;display:inline-block;vertical-align:top;padding-right:30px;width:72%}.com-ranking-group .com-ranking-order{position:absolute;left:0;top:0}.com-ranking-owner{text-align:center}.com-ranking-owner .com-avatar{box-sizing:border-box;display:block;margin:0 auto 25px;width:80px;height:80px;border:2px solid #e5e5e5}.com-ranking-owner .owner-name{margin-bottom:25px;font-size:18px;color:#000;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-ranking-owner .owner-name a{color:inherit}.com-ranking-owner .owner-name a:hover{color:#00a4ff;text-decoration:none}.com-ranking-owner .owner-infos{margin-bottom:15px;font-size:0}.com-ranking-owner .owner-infos>li{display:inline-block;vertical-align:middle;font-size:14px;line-height:1.1;color:#4a4a4a}.com-ranking-owner .owner-infos>li:before{content:'';display:inline-block;vertical-align:middle;position:relative;top:-1px;margin:0 5px;width:3px;height:3px;border-radius:50%;background-color:#4A4A4A}.com-ranking-owner .owner-infos>li:first-child:before{display:none}.com-ranking-owner .com-tag-links{display:inline-block;vertical-align:middle;margin-bottom:12px;min-height:36px}.com-ranking-owner .c-btn{display:block;margin:0 auto;width:100%;max-width:200px}.com-ranking-owner .c-btn+.c-btn{margin-top:15px}.com-ranking-owner.author .com-avatar{position:relative;overflow:visible;margin-bottom:30px}.com-ranking-owner.author .author-level{position:absolute;left:50%;bottom:-5px;-webkit-box-sizing:border-box;box-sizing:border-box;padding:0 8px;height:16px;background-color:#FC3;border-radius:8px;text-align:center;line-height:16px;font-size:12px;font-weight:700;color:#99661F;-ms-transform:translateX(-50%);transform:translateX(-50%)}.com-ranking-owner.author .owner-name{margin-bottom:10px}.com-ranking-owner.author .owner-infos{margin-bottom:30px}.com-ranking-owner.author .owner-infos>li{line-height:24px}.com-ranking-owner.author .com-intro-infos{margin-bottom:10px;min-height:73px}.com-ranking-owner.author .com-intro-infos .intro-info-inner{display:inline-block;vertical-align:middle}.com-ranking-owner.author .com-intro-infos .intro-info-text{text-align:left}.com-ranking-article-media{display:block;box-sizing:border-box;height:326px;border:1px solid #e5e5e5;background-color:#fff;overflow:hidden}.com-ranking-article-media .media-img{display:block;height:130px;background-repeat:no-repeat;background-position:center;background-size:cover}.com-ranking-article-media .media-body{padding:30px}.com-ranking-article-media .media-title{margin-bottom:10px;font-size:16px;line-height:27px;color:#000;font-weight:500;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:54px}.com-ranking-article-media:hover .media-title{color:#00a4ff}.com-ranking-article-media .media-desc{font-size:14px;line-height:24px;color:#999;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:3;max-height:72px}.com-tag-list{margin-right:-10px;margin-bottom:-10px;font-size:0}.com-tag{display:inline-block;vertical-align:middle;margin-right:10px;margin-bottom:10px;padding:0 10px;-webkit-box-sizing:border-box;box-sizing:border-box;max-width:100%;height:30px;border-radius:15px;font-size:12px;line-height:28px;color:#444;border:1px solid #e5e5e5;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}a.com-tag:hover{text-decoration:none;color:#00a4ff;border-color:#00a4ff}.com-tag-group{margin-bottom:50px}.com-tag-group-hd{position:relative;padding-bottom:15px;border-bottom:1px solid #e5e5e5}.com-tag-group-icon{position:absolute;left:0;top:0;width:32px;height:32px}.com-tag-group-title{font-size:18px;line-height:1.5;font-weight:400;color:#000;word-wrap:break-word}.com-tag-group-icon~.com-tag-group-title{margin-bottom:5px;padding-left:42px;line-height:32px}.com-tag-group-bd{padding-top:20px}.com-grid-table{box-sizing:border-box;font-size:0}.com-grid-table-cell{display:inline-block;vertical-align:top;margin-right:50px;width:calc((100% - 101px)/ 3)}.com-grid-table-cell:last-child{margin-right:0}.com-media-service .c-media-body{margin-top:0}.com-media-service .c-media-heading{text-align:left}.com-media-service .c-media-info{height:3em}.com-media-service:hover{text-decoration:none}.com-media-service:hover .c-media-heading{color:#00a4ff}.com-none{margin:50px 0;text-align:center;color:#999}.com-none a{color:#00A4FF}.com-none a:hover{border-bottom:1px solid #00A4FF}.com-none [class*=com-i-],.com-none [class^=com-i-]{position:relative;top:-1px;margin-right:5px}.com-none.with-bg{padding:30px;background-color:#f7f8fa}.com-none.page{margin:100px auto;width:700px;background-color:transparent;text-align:center;color:#999}.com-none.page .none-icon{display:block;margin:0 auto 20px;width:64px;height:64px;background-image:url(sprite/base-201911131148.svg);;background-position:30.23% 31.069999999999997%;background-size:787.5% 768.75%;;background-repeat:no-repeat}.com-none.page .primary-text{margin-bottom:10px;font-size:18px;color:#333}.com-none.page a{margin:0 5px;color:#00a4ff}.com-tag-links{position:relative;margin-bottom:17px;padding-left:20px;font-size:12px;color:#888}.com-tag-links .tag-icon{position:absolute;left:0;top:2px}.com-tag-links .com-i-tag{width:12px;height:12px;background-image:url(sprite/base-201911131148.svg);;background-position:11.59% 99.58%;background-size:4200% 4100%;;background-repeat:no-repeat}.com-tag-links a{color:#999}.com-tag-links a:hover{color:#00a4ff;text-decoration:none}.com-edit-operations{position:absolute;right:0;top:0;font-size:0;-webkit-transition:all .3s;transition:all .3s}.com-edit-operations .com-opt-link{font-size:12px}.com-edit-operations .ope-btn{display:inline-block;vertical-align:middle;border:none;background-color:transparent;margin-left:20px;font-size:14px;line-height:24px;color:#000;cursor:pointer}.com-edit-operations .ope-btn:hover{text-decoration:none;color:#00a4ff}.com-answer-panel{position:relative;padding-top:5px;padding-bottom:27px;margin-bottom:25px;border-bottom:1px solid #e5e5e5}.com-answer-panel.without-border{padding-bottom:0;border-bottom:none}.c-markdown-trigger{margin-top:20px;margin-bottom:17px}.c-markdown-trigger a:after{content:'';display:inline-block;vertical-align:middle;position:relative;top:-1px;margin-left:3px;width:16px;height:16px;background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 3.9899999999999998%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-answer-panel-top-ope,.com-answer-panel-top-ope.com-operations{position:absolute;right:0;top:0;margin-top:0}.com-answer-panel-top-ope .com-opt-link{margin-right:0;margin-left:20px}.com-answer-panel-top-ope .c-bubble-trigger.com-operations-dropdown{position:relative}.c-markdown.com-answer-panel-markdown{color:#666}.com-answer-panel-operations{margin-top:15px;line-height:20px}.com-answer-panel-operations .link-trigger{font-size:14px;color:#00a4ff}.com-answer-panel-operations .link-trigger:hover{text-decoration:underline}.com-answer-panel-operations .link-trigger:after{content:'';display:inline-block;vertical-align:middle;position:relative;top:-1px;margin-left:3px;width:16px;height:16px;background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 3.9899999999999998%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-answer-panel-operations .com-opt-link{font-size:12px}.com-answer-panel .com-answer-edit{margin-top:0}.com-answer-panel .com-comment-popup{margin-top:16px;padding:20px;border:1px solid #e5e5e5;background-color:#fff;border-radius:4px}.com-answer-panel-author,.com-answer-panel-author:last-child{float:left;width:auto;margin-bottom:10px}.com-answer-panel-author .com-media-object{padding-right:10px;width:24px}.com-answer-panel-author .com-media-img{width:24px;height:24px}.com-answer-panel-author .com-media-body{vertical-align:middle;font-size:0}.com-answer-panel-author .author-info{display:inline-block;vertical-align:middle;font-size:12px;color:#444}.com-answer-panel-author .author-info:before{content:'·';margin:0 3px}.com-answer-panel-author a.author-info:hover{text-decoration:none;color:#00a4ff}.com-answer-panel-author .author-info.name{max-width:110px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-answer-panel-author .author-info.identity{max-width:302px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-answer-panel-author .author-info.time{color:#888}.com-answer-panel-author .author-info:first-child:before{display:none}.com-answer-panel .answer-tag{display:inline-block;vertical-align:middle;-webkit-box-sizing:border-box;box-sizing:border-box;margin-top:1px;padding:0 4px;margin-left:10px;height:18px;font-size:12px;line-height:16px;border:1px solid #FF7200;border-radius:2px;color:#FF7200}.com-answer-panel .answer-tag.adopt{border-color:#00a4ff;color:#00a4ff}.com-answer-panel .answer-tag+.answer-tag{margin-left:5px}.com-answer-panel.with-bg{padding:15px;background-color:#f7f8fa;border-bottom:none;margin-bottom:0;margin-top:20px}.com-answer-panel.with-bg .com-media-summary .com-media-object{padding-right:0}.com-answer-panel.with-bg .rich-editor-toolbar{background-color:#fff}.com-answer-panel.with-bg .com-answer-edit .edit-btns{background-color:#f7f8fa}.com-answer-panel.with-bg .com-answer-panel-top-ope{right:20px;top:20px}.com-answer-panel.with-bg .com-answer-panel-top-ope .c-btn{font-size:12px;line-height:28px;height:30px;min-width:0}.com-answer-panel.with-bg .com-comment-panel-replies{background:0 0;padding:15px 0 0;border-top:1px solid #eee}.com-ask-panel{margin-bottom:25px;padding-bottom:25px;border-bottom:1px solid #f1f1ff}.com-ask-panel-hd{position:relative}.com-ask-panel-hd .ask-title{font-size:20px;color:#333;line-height:26px;font-weight:500}.com-ask-panel-hd .ask-title a{display:block;display:-webkit-box;color:inherit;max-height:54px;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;-webkit-box-orient:vertical}.com-ask-panel-hd .ask-title em{font-weight:inherit;color:#ff7200}.com-ask-panel-hd .ask-title a:hover,.com-ask-panel-hd .ask-title a:hover .com-text-highlight{color:#00a4ff;text-decoration:none}.com-ask-panel-infos{position:relative;margin-top:5px}.com-ask-panel-infos.with-extra{padding-right:280px}.com-ask-panel-infos .com-tag-links{margin-bottom:0}.com-ask-panel-infos .extra-part{position:absolute;right:0;top:0;font-size:0}.com-ask-panel-infos .com-text-info{display:inline-block;vertical-align:middle;font-size:12px}.com-ask-panel-infos .ask-author{display:inline-block;vertical-align:middle;max-width:130px;color:#000;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px}.com-ask-panel-infos .ask-author:hover{text-decoration:none;color:#00a4ff}.com-ask-panel-infos .ask-split{display:inline-block;vertical-align:middle;margin:0 10px;width:4px;height:4px;background-color:#888;border-radius:50%}.c-markdown.com-ask-panel-markdown{margin-top:10px;margin-bottom:0}.com-ask-panel-operations{margin-top:10px}.com-ask-panel-follow{position:absolute;right:0;top:10px}.com-ask-panel-follow .c-btn{padding:0 10px;min-width:90px}.com-ask-panel.has-follow .com-ask-panel-hd{padding-right:100px}.com-ask-panel-hd .forbidden-tip{font-size:14px;color:#666;font-weight:400}.com-ask-panel-update{display:inline-block;vertical-align:0;font-size:14px;line-height:20px;color:#00a4ff;font-weight:500}.com-ask-panel-update:before{content:'';display:inline-block;vertical-align:1px;margin:0 10px;width:6px;height:6px;background-color:#00a4ff;border-radius:50%}.com-ask-panel-hd{padding-left:61px;min-height:46px}.com-ask-panel-hd .ask-operations{display:block;position:absolute;left:0;top:3px}.com-ask-panel-hd .answer-btn{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;padding:5px 5px 0;width:46px;height:46px;border-radius:2px;background-color:#E1EEFA;line-height:1.2;color:#00a4ff;text-align:center;cursor:pointer}.com-ask-panel-hd .answer-btn:hover{text-decoration:none}.com-ask-panel-hd .answer-btn .num{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:16px}.com-ask-panel-hd .answer-btn .name{font-size:12px}.com-ask-panel-hd .answer-btn.none-answer{background-color:#F3F4F5;color:#444}.com-ask-panel-hd.without-panel-infos .ask-title{display:table-cell;vertical-align:middle;height:54px}.com-ask-panel-hd.without-panel-infos+.com-answer-panel.with-bg{margin-top:15px}.com-ask-panel.without-operations .com-ask-panel-hd{padding-left:0;min-height:0}.com-ask-panel.without-operations .com-ask-panel-hd .ask-title{display:block;height:auto}.com-ask-panel-author{margin-top:10px;margin-bottom:0}.com-ask-panel-author .com-media-object{padding-right:10px;width:24px}.com-ask-panel-author .com-media-img{width:24px;height:24px}.com-ask-panel-author .com-media-body{vertical-align:middle;font-size:0}.com-ask-panel-author .author-info{display:inline-block;vertical-align:middle;font-size:12px;color:#444}.com-ask-panel-author .author-info:before{content:'·';margin:0 3px}.com-ask-panel-author a.author-info:hover{text-decoration:none;color:#00a4ff}.com-ask-panel-author .author-info.name{max-width:110px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-ask-panel-author .author-info.identity{max-width:302px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-ask-panel-author .author-info.time{color:#888}.com-ask-panel-author .author-info:first-child:before{display:none}.com-log-panel-hd{margin-bottom:15px;color:#888}.com-log-panel-hd:after{content:'';display:table;clear:both}.com-log-panel-hd .log-detail{float:left;width:70%}.com-log-panel-hd .log-time{float:right;max-width:30%}.com-log-panel-hd .log-time.fl{float:left}.com-forbidden{margin:0 auto;padding:20px;background-color:#f7f8fa;text-align:center}.com-forbidden-cnt{position:relative;display:inline-block;vertical-align:middle;padding-left:34px;max-width:100%;text-align:left}.com-forbidden .forbidden-icon{position:absolute;top:-1px;left:0;width:24px;height:24px;background-image:url(sprite/base-201911131148.svg);;background-position:56.04% 83.97%;background-size:2100% 2050%;;background-repeat:no-repeat}.com-forbidden a{margin:0 5px;color:#00a4ff}.com-forbidden.page{margin:100px auto;width:700px;background-color:transparent}.com-forbidden.page .com-forbidden-cnt{text-align:center;color:#999}.com-forbidden.page .forbidden-icon{position:static;display:block;margin:0 auto 20px;width:64px;height:64px;background-image:url(sprite/base-201911131148.svg);;background-position:38.86% 15.65%;background-size:787.5% 768.75%;;background-repeat:no-repeat}.com-forbidden.page .primary-text{margin-bottom:10px;font-size:18px;color:#333}.c-bubble-trigger.com-operations-dropdown{position:absolute}.c-bubble-trigger.com-operations-dropdown .c-bubble-trigger-btn{-webkit-box-sizing:border-box;box-sizing:border-box;width:60px;font-size:0;color:#fff}.c-bubble-trigger.com-operations-dropdown .c-bubble-trigger-btn:after{right:0}.c-bubble-trigger.com-operations-dropdown .c-bubble{left:auto;right:0;margin-left:0;margin-top:3px;text-align:right}.c-bubble-trigger.com-operations-dropdown .c-bubble-inner{min-width:80px}.c-bubble-trigger.com-operations-dropdown .c-bubble-inner:after,.c-bubble-trigger.com-operations-dropdown .c-bubble-inner:before{display:none}.c-bubble-trigger.com-operations-dropdown .com-bubble-menu a,.c-bubble-trigger.com-operations-dropdown .menu-link{text-align:center}.com-tag-panel{-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;margin-bottom:20px;padding:20px;height:127px;border:1px solid #eee}.com-tag-panel .tag-hd{padding-right:40px;margin-bottom:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-tag-panel .tag-icon{position:relative;top:-1px;display:inline-block;vertical-align:middle;width:32px;height:32px;margin-right:10px}.com-tag-panel i.tag-icon{background-image:url(sprite/base-201911131148.svg);;background-position:76.06% 37.169999999999995%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-tag-panel .tag-title{display:inline;font-size:18px;font-weight:400;line-height:32px;color:#444}.com-tag-panel a:hover{text-decoration:none}.com-tag-panel a:hover .tag-title{color:#00a4ff}.com-tag-panel .desc{max-height:42px;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.com-tag-panel .desc a{display:block;color:inherit}.com-tag-panel .desc a:hover{color:#00a4ff}.com-tag-panel .btn{position:absolute;right:20px;top:20px;-webkit-box-sizing:border-box;box-sizing:border-box;width:32px;height:32px;border-radius:2px;border:1px solid transparent;background-color:#00a4ff;text-align:center;line-height:30px;font-size:0}.com-tag-panel .btn:after{content:'';position:absolute;left:50%;top:50%;margin:-1px 0 0 -7px;width:14px;height:2px;background-color:#fff}.com-tag-panel .btn:before{content:'';position:absolute;left:50%;top:50%;margin:-7px 0 0 -1px;width:2px;height:14px;background-color:#fff}.com-tag-panel.checked{background-color:#f7f8fa}.com-tag-panel.checked .btn{border-color:#e5e5e5;background-color:#fff}.com-tag-panel.checked .btn:after{-webkit-box-sizing:border-box;box-sizing:border-box;margin:-3px 0 0;position:static;display:inline-block;vertical-align:middle;width:8px;height:14px;border-right:2px solid #00a4ff;border-bottom:2px solid #00a4ff;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);background:0 0}.com-tag-panel.checked .btn:before{display:none}.com-line-loading{position:relative;margin:30px 0}.com-line-loading .loading-avatar{display:block;margin-bottom:20px;width:40px;height:40px;border-radius:50%;background-color:#eeeef0}.com-line-loading .loading-line{margin-bottom:10px;height:12px;background:#edeef0;background:linear-gradient(to right,#edefef,#f7f8fa)}.com-line-loading .loading-line:last-child{margin-bottom:0}.com-line-loading .loading-line:nth-child(2){position:absolute;left:56px;top:4px;width:43.53846154%}.com-line-loading .loading-line:nth-child(3){position:absolute;left:56px;top:24px;width:26.15384615%}.com-author-bubble{width:290px}.com-author-bubble>.c-bubble-inner{padding:20px;min-height:180px;border:1px solid #e5e5e5;-webkit-box-shadow:0 1px 8px rgba(0,0,0,.1);box-shadow:0 1px 8px rgba(0,0,0,.1)}.com-author-bubble.c-bubble-top .c-bubble-inner:before{border-bottom-color:#e5e5e5}.com-author-bubble-hd{position:relative;margin-bottom:10px;padding-bottom:20px;padding-left:80px;border-bottom:1px solid #eee;min-height:64px}.com-author-bubble .author-avatar{position:absolute;left:0;top:0;box-sizing:border-box;width:64px;height:64px;border-radius:50%;border:2px solid #e5e5e5}.com-author-bubble .author-avatar .img,.com-author-bubble .author-avatar img{display:block;width:100%;height:100%;border-radius:50%;overflow:hidden}.com-author-bubble .author-avatar .img{background-size:cover;background-position:center}.com-author-bubble .author-level{position:absolute;left:50%;bottom:-6px;padding:0 3px;background-color:#F5A623;font-size:12px;line-height:14px;white-space:nowrap;color:#fff;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.com-author-bubble .author-name{position:relative;display:inline-block;vertical-align:middle;margin-bottom:5px;max-width:100%;font-size:16px;line-height:21px;color:#000}.com-author-bubble .author-name .text{display:block;padding-right:20px;-webkit-box-sizing:border-box;box-sizing:border-box;text-overflow:ellipsis;white-space:nowrap;color:inherit;overflow:hidden}.com-author-bubble .author-name .text:hover{color:#00a4ff;text-decoration:none}.com-author-bubble .com-verification{position:absolute;right:0;top:3px}.com-author-bubble .author-identity{line-height:20px;color:#888}.com-author-bubble .com-emblem-list{margin-top:5px;margin-bottom:-5px}.com-author-bubble .com-emblem-list>li:first-child{margin-left:0}.com-author-bubble .c-bubble-inner .c-bubble-bottom .c-bubble-inner:after,.com-author-bubble .c-bubble-inner .c-bubble-bottom .c-bubble-inner:before{border-bottom-color:transparent}.com-author-bubble .author-times-list{font-size:0}.com-author-bubble .author-times-list>li{-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;vertical-align:middle;width:33.33%;text-align:center;font-size:14px;line-height:18px;white-space:nowrap}.com-author-bubble .author-times-list>li:first-child{padding-left:10px;text-align:left}.com-author-bubble .author-times-list>li:last-child{padding-right:10px;text-align:right}.com-author-bubble .author-times-list a{display:block;color:inherit}.com-author-bubble .author-times-list span{display:inline-block;vertical-align:middle;width:40px;text-align:center}.com-author-bubble .author-times-list .num{color:#00a4ff;font-size:18px;line-height:21px}.com-author-bubble .author-times-list .title{font-weight:400}.com-author-bubble .author-times-list a:hover,.com-author-bubble .author-times-list a:hover .num{text-decoration:none}.com-author-bubble-ft{margin-top:20px}.com-author-bubble-ft .c-btn{width:100%;min-width:0}.com-author-bubble-ft .split{margin:5px 0;border:none}.com-author-bubble-ft .c-btn-hole{border-color:#00a4ff;color:#00a4ff}.com-author-bubble-ft .c-btn-hole:hover{background-color:#00a4ff;color:#fff}.com-author-bubble-ft .c-btn-link{border:none;background-color:transparent;color:#333}.com-author-bubble-ft .c-btn-link:hover{color:#00a4ff}.com-author-bubble .com-line-loading{margin:0}.com-author-bubble .com-line-loading .loading-avatar{margin-bottom:30px;width:64px;height:64px}.com-author-bubble .com-line-loading .loading-line{height:14px}.com-author-bubble .com-line-loading .loading-line:nth-child(2){left:80px;width:90px;height:20px}.com-author-bubble .com-line-loading .loading-line:nth-child(3){left:80px;right:0;top:40px;width:auto}.com-author-bubble .com-line-loading .loading-line:nth-child(4){position:absolute;left:80px;right:0;top:62px;width:auto}.com-author-bubble .com-line-loading .loading-line:nth-child(5){margin-bottom:15px}.com-verification{position:relative;top:-1px;display:inline-block;width:12px;height:12px;font-size:0;margin:-1px 3px 0;vertical-align:middle;line-height:12px}.com-verification.large{width:16px;height:16px;line-height:16px}.com-verification.person-center{margin-left:7px}.com-verification.vertical-baseline{vertical-align:baseline}.com-verification.person-center .verified{background-image:url(sprite/base-201911131148.svg);;background-position:48.16% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-verification>a:hover{position:relative;z-index:901}.com-verification .verified{display:inline-block;width:100%;height:100%;background-image:url(sprite/base-201911131148.svg);;background-position:20.119999999999997% 99.58%;background-size:4200% 4100%;;background-repeat:no-repeat}.com-verification.large .verified{background-image:url(sprite/base-201911131148.svg);;background-position:51.839999999999996% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-verification.large.disabled .verified{background-image:url(sprite/base-201911131148.svg);;background-position:59.21999999999999% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-verification .popup{display:none;position:absolute;left:0;top:20px;padding:2px 5px;line-height:20px;font-size:12px;font-weight:400;color:#444;background-color:#fefbd2;white-space:nowrap}.com-verification:hover .popup{display:block}.com-author-bubble.v2{width:410px}.com-author-bubble.v2>.c-bubble-content>.c-bubble-inner,.com-author-bubble.v2>.c-bubble-inner{padding:0;width:100%;max-height:none;box-shadow:0 2px 3px rgba(0,0,0,.08);border-color:#c9cbce;font-size:14px;line-height:1.5;overflow:visible;border-radius:0}.com-author-bubble.v2>.c-bubble-inner:before{border-bottom-color:#c9cbce}.com-author-bubble.v2>.c-bubble-inner:after{border-bottom-color:#f7f8fa}.com-author-bubble.v2 .com-author-bubble-hd{display:table;table-layout:fixed;width:100%;box-sizing:border-box;margin-bottom:0;padding:25px 0;background-color:#f7f8fa}.com-author-bubble.v2 .author-avatar-cell{display:table-cell;vertical-align:middle;width:110px}.com-author-bubble.v2 .author-avatar{display:block;margin:0 auto;position:relative;left:auto;top:auto}.com-author-bubble.v2 .author-main-cell{display:table-cell;vertical-align:middle}.com-author-bubble.v2 .author-name{margin-bottom:3px;color:#333}.com-author-bubble.v2 .author-name .text{padding-right:0}.com-author-bubble.v2 .com-verification{position:relative;right:auto;top:auto;margin-left:5px}.com-author-bubble.v2 .author-identity{color:#666}.com-author-bubble.v2 .com-emblem-list{margin-top:7px}.com-author-bubble.v2 .author-btns{display:table-cell;vertical-align:middle;width:100px;padding-right:30px;text-align:right;-webkit-box-sizing:content-box;box-sizing:content-box}.com-author-bubble.v2 .author-btn{padding:0 10px;min-width:0;width:80px;height:30px;line-height:30px}.com-author-bubble.v2 .author-btn .c-loading-inner>div{width:8px;height:8px;margin-left:1px;margin-right:1px}.com-author-bubble.v2 .com-author-bubble-bd{padding-top:22px;padding-bottom:22px}.com-author-bubble.v2 .author-intro{margin:0 30px 30px;line-height:24px;color:#666;display:block;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;max-height:48px}.com-author-bubble.v2 .author-times-list>li{position:relative;font-size:14px;line-height:1.5;color:#333}.com-author-bubble.v2 .author-times-list>li:before{content:'';position:absolute;left:0;top:50%;margin-top:-8px;width:1px;height:16px;background-color:#ccc}.com-author-bubble.v2 .author-times-list>li:first-child:before{display:none}.com-author-bubble.v2 .author-times-list>li:first-child,.com-author-bubble.v2 .author-times-list>li:last-child{padding-left:0;padding-right:0;text-align:center}.com-author-bubble.v2 .author-times-list span{width:auto}.com-author-bubble.v2 .author-times-list .num{margin-left:5px;font-size:inherit;line-height:inherit;color:inherit}.com-author-bubble.v2 .author-times-list a:hover{color:#00a4ff}.com-author-bubble.v2 .com-load-more{margin:20px}.com-author-bubble.v2 .com-tooltip-inner{padding:0;width:100%;max-height:none;box-shadow:0 2px 3px rgba(0,0,0,.08);border-color:#c9cbce;font-size:14px;line-height:1.5;overflow:visible;border-radius:0}.com-author-bubble.v2 .com-tooltip-inner:before{border-bottom-color:#c9cbce}.com-author-bubble.v2 .com-tooltip-inner:after{border-bottom-color:#f7f8fa}.com-author-bubble.com-tooltip-placement-bottom .com-tooltip-inner:before,.com-author-bubble.com-tooltip-placement-bottomLeft .com-tooltip-inner:before,.com-author-bubble.com-tooltip-placement-bottomRight .com-tooltip-inner:before{border-bottom-color:#c9cbce}.com-author-bubble.com-tooltip-placement-bottom .com-tooltip-inner:after,.com-author-bubble.com-tooltip-placement-bottomLeft .com-tooltip-inner:after,.com-author-bubble.com-tooltip-placement-bottomRight .com-tooltip-inner:after{border-bottom-color:#f7f8fa}.c-msg{border-style:solid;border-width:1px}.c-msg-error{color:#e54545;background-color:#fcecec;border-color:#f6b5b5}.c-msg-error .c-msg-info{position:relative;padding-left:30px}.c-msg-error .c-msg-info:before{content:'';position:absolute;left:8px;top:13px;width:16px;height:16px;background-image:url(sprite/base-201911131148.svg);;background-position:91.60000000000001% 51.05%;background-size:3150% 3075%;;background-repeat:no-repeat}.c-msg-success{color:#007E3B;background-color:#E6F8EE;border-color:#9CE4BC}.c-msg.inline-block{box-sizing:border-box;display:inline-block;vertical-align:middle;max-width:100%}.c-msg-fixed-wrap{position:fixed;left:0;top:70px;z-index:9100;width:100%;text-align:center;pointer-events:none}.c-msg-fixed-wrap .c-msg{display:inline-block;vertical-align:middle;max-width:80%;text-align:left;pointer-events:auto;border-radius:4px}.c-msg-fixed-wrap .c-msg-error .c-msg-info{padding-left:20px}.c-msg-fixed-wrap .c-msg-error .c-msg-info:before{display:none}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}input::-moz-placeholder,textarea::-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::placeholder,textarea::placeholder{color:#999}.c-input-text{-webkit-box-sizing:border-box;box-sizing:border-box;height:36px;width:280px;line-height:24px}.c-input-text:focus,.c-input-text:hover{border-color:#00a4ff}.c-input-text.err-style,.c-input-text.error{border-color:#E54545;color:#e54545}.c-input-text[disabled],.c-input-text[disabled]:hover,.c-textarea[disabled],.c-textarea[disabled]:hover{cursor:default;background-color:#f0f1f2;border-color:#d5d5d5;color:#a2a2a2}.c-input-text.small{-webkit-box-sizing:border-box;box-sizing:border-box;height:30px;width:180px;line-height:18px;font-size:12px}.c-textarea.small{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;height:auto;font-size:12px;line-height:18px}.c-input-text.large{-webkit-box-sizing:border-box;box-sizing:border-box;height:44px;width:280px;line-height:32px;font-size:14px}.c-input-text.full{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.c-textarea.large{-webkit-box-sizing:border-box;box-sizing:border-box;width:472px;line-height:32px;font-size:14px}.c-textarea.full{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.c-select:hover{border-color:#00a4ff}.c-select.small{padding-top:5px;padding-bottom:5px;height:30px;width:180px;font-size:12px;line-height:18px}.c-select[disabled]:hover{border-color:#d5d5d5}.c-select.large{padding-top:5px;padding-bottom:5px;padding-left:10px;height:44px;width:280px;font-size:14px;line-height:32px}.c-select.full{width:100%}.c-dropdown-btn-style .c-dropdown-link{padding-right:30px}.c-dropdown.width-auto{width:auto}.com-check-list>li{margin-bottom:10px}.com-check-item{display:inline-block;vertical-align:middle;position:relative;margin-right:10px;padding-left:25px;cursor:pointer;word-wrap:break-word;line-height:21px}.com-check-item.disabled{cursor:default;color:#999}.com-check-item.block{margin-right:0;display:block}.com-check-item span{vertical-align:middle}.com-check-item .weak-text{color:#999}.com-check-cnt .weak-text.email,.com-check-item .weak-text.email{word-break:break-all}.com-check-item .c-checkbox,.com-check-item .c-radio{position:absolute;left:0;top:3px}.com-check-item+a{vertical-align:middle}.com-check-list .com-code-form{margin-top:10px}.com-check-cnt{display:inline-block;vertical-align:middle}.com-check-cnt.block{display:block;margin-top:5px;padding-left:25px}.com-check-cnt .weak-text{color:#999}.com-check-cnt .com-link{margin-left:10px}.c-form-ctrl-label{cursor:pointer;min-width:0}.com-check-list .com-qr-code{margin-top:10px;padding:10px;background-color:#f5f6f7}.com-check-list .com-2-wechat-panel{margin-top:10px;padding:10px;max-width:310px}.com-check-list .com-2-wechat-panel .qr-img{width:102px}.com-check-list .com-2-wechat-panel .qr-cnt{max-width:calc(100% - 10px * 2 - 102px)}.com-check-list.cols-2{font-size:0}.com-check-list.cols-2>li{font-size:14px;display:inline-block;vertical-align:top;width:50%;box-sizing:border-box;padding-right:10px}.com-check-add{display:block;color:#999}.com-check-add .icon-add{position:relative;top:-2px;display:inline-block;vertical-align:middle;margin-right:6px;margin-left:3px;width:11px;height:11px}.com-check-add .icon-add:after,.com-check-add .icon-add:before{content:'';position:absolute;left:0;top:5px;width:100%;height:1px;background-color:#979797}.com-check-add .icon-add:after{left:5px;top:0;width:1px;height:100%}.com-check-add:hover{color:#00a4ff}.com-check-add:hover .icon-add:after,.com-check-add:hover .icon-add:before{background-color:#00a4ff}.com-check-create .com-check-item{position:relative;padding-left:21px;margin-right:0;display:block}.com-check-create .c-radio{position:absolute;left:0;top:7px}.com-check-btns{margin-top:20px;text-align:right;font-size:0}.com-check-btn{margin-left:15px;color:#666;font-size:14px;background-color:transparent}.com-check-btn.primary,.com-check-btn:hover{color:#00a4ff}.com-check-btn.primary:hover{color:#0092ee}.com-check-list.side{padding:10px 0;border-bottom:1px solid #E1E3E9}.com-check-list.side>li{margin-bottom:0;padding:10px 0}.com-code-form .c-input-text{margin-right:10px;width:150px}.com-code-form .c-input-text.code{width:90px}.com-code-form .c-btn{margin-right:10px;padding:0 20px;min-width:0}.com-f-list-vertical{padding:0}.com-f-list-vertical .f-list-item{margin:25px 0 0;padding:25px 0 0;border-top:1px solid #e5e5e5}.com-f-list-vertical .f-list-btns,.com-f-list-vertical .f-list-item:first-child{margin-top:0;padding-top:0;border-top:none}.com-f-list-vertical .f-list-btns{margin-top:45px}.com-f-list-vertical .c-f-list-tit{position:static;display:block;margin-bottom:10px;width:auto;color:#666;z-index:auto}.com-f-list-vertical .c-f-list-con{padding-left:0;z-index:auto}.c-f-list-con .c-f-tip-word.err-style,.c-f-list-con .c-f-tip-word.error{color:#e54545}.com-step-process{position:relative;padding-top:40px}.com-step-process .process-steps{display:table;table-layout:fixed;width:100%}.com-step-process .process-step{display:table-cell;border-left:1px solid #fff;height:16px;background-color:#EDEFF2}.com-step-process .process-step:first-child{border-left:none;border-top-left-radius:8px;border-bottom-left-radius:8px}.com-step-process .process-step:last-child{border-top-right-radius:8px;border-bottom-right-radius:8px}.com-step-process .process-step.finished{background-color:#00a4ff}.com-step-process .process-tips{position:absolute;bottom:0;height:16px}.com-step-process .process-dot{-webkit-box-sizing:border-box;box-sizing:border-box;position:absolute;left:-8px;top:0;width:16px;height:16px;border:2px solid #00a4ff;background-color:#fff;border-radius:50%;text-align:center;line-height:12px}.com-step-process .process-dot:after{content:'';-webkit-box-sizing:border-box;box-sizing:border-box;position:absolute;left:50%;top:50%;margin:-6px 0 0 -6px;width:12px;height:12px;background-image:url(sprite/base-201911131148.svg);;background-position:14.430000000000001% 99.58%;background-size:4200% 4100%;;background-repeat:no-repeat}.com-step-process .process-bubble{-webkit-box-sizing:border-box;box-sizing:border-box;position:absolute;left:-27px;bottom:100%;margin-bottom:9px;width:54px;height:32px;border:1px solid #e5e5e5;border-radius:2px;background-color:#fff;font-size:12px;line-height:30px;text-align:center;color:#00a4ff}.com-step-process .process-bubble-inner{position:static !important;left:50%}.com-step-process .process-bubble-inner:after,.com-step-process .process-bubble-inner:before{content:'';position:absolute;left:inherit;top:100%;margin-left:-4px;width:0;height:0;border-style:solid;border-color:#fff transparent;border-width:4px 4px 0}.com-step-process .process-bubble-inner:before{margin-top:1px;border-color:#e5e5e5 transparent}.com-level-wrap{margin-bottom:20px;padding-top:1px;padding-bottom:1px;position:relative}.com-level-wrap .level-tip{margin-bottom:17px;font-size:16px}.com-level-wrap .level-tip em{margin:0 5px;color:#00a4ff}.com-level-wrap .level-tip .weak-text{margin-top:5px;font-size:14px;color:#999}.com-level-bar{position:relative;padding-top:180px;padding-bottom:20px}.com-level-bar .level-process{position:absolute;left:0;bottom:20px;z-index:1;width:100%;height:16px;background-color:#00a4ff;border-radius:8px;transition:width .3s ease}.com-level-bar .level-items{display:table;table-layout:fixed;width:100%}.com-level-bar .level-item{position:relative;display:table-cell;height:16px;background-color:#EDEFF2}.com-level-bar .level-item:first-child{width:20px;border-top-left-radius:8px;border-bottom-left-radius:8px}.com-level-bar .level-item:last-child{border-top-right-radius:8px;border-bottom-right-radius:8px}.com-level-bar .level-dot{-webkit-box-sizing:border-box;box-sizing:border-box;position:absolute;right:-8px;top:0;z-index:2;width:16px;height:16px;border-radius:50%;border:2px solid #EDEFF2;background-color:#fff;cursor:pointer}.com-level-bar .level-item:first-child .level-dot{right:auto;left:0}.com-level-bar .level-item:last-child .level-dot{right:0}.com-level-bar .level-dot:after{content:'';-webkit-box-sizing:border-box;box-sizing:border-box;position:absolute;left:0;top:0;width:12px;height:12px;background-image:url(sprite/base-201911131148.svg);;opacity:0;background-position:14.430000000000001% 99.58%;background-size:4200% 4100%;;background-repeat:no-repeat}.com-level-bar .level-text{position:absolute;right:0;top:0;margin-top:16px;font-size:14px;white-space:nowrap;-webkit-transform:translateX(50%);-ms-transform:translateX(50%);transform:translateX(50%)}.com-level-bar .level-item:first-child .level-text{right:auto;left:8px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.com-level-bar .level-item:last-child .level-text{right:8px}.com-level-bubble{visibility:hidden;-webkit-transition:.3s ease;transition:.3s ease;-webkit-transition-delay:0s;transition-delay:0s;pointer-events:none;opacity:0;right:-70px;bottom:0;margin-bottom:26px;width:140px;text-align:center}.com-level-bar .level-item:first-child .com-level-bubble{right:auto;left:-70px;margin-left:8px}.com-level-bar .level-item:last-child .com-level-bubble{margin-right:8px}.com-level-bar .show-bubble .com-level-bubble{visibility:visible;-webkit-transition-delay:.1s;transition-delay:.1s;opacity:1;pointer-events:auto}.com-level-bubble .c-bubble-inner{display:inline-block;vertical-align:middle;padding-top:10px;padding-bottom:10px;min-width:120px;-webkit-box-shadow:none;box-shadow:none;background-color:#F7F8FA;color:#999;font-size:12px}.com-level-bubble .c-bubble-inner:after{border-top-color:#F7F8FA}.com-level-bubble .level-title{margin-bottom:2px;font-size:14px}.com-level-bubble .weak-text{margin:10px 0 13px;color:#999}.com-level-bubble .award-img{position:relative;margin:0 auto;padding:0 10px;height:68px;border-radius:2px;background-color:#EDEFF2;color:#999;overflow:hidden;text-align:center}.com-level-bubble .award-img:before{content:'';position:absolute;right:-10px;bottom:-8px;width:66px;height:60px;background-image:url(sprite/base-201911131148.svg);;background-position:23.52% 0.22999999999999998%;background-size:763.6363636363636% 819.9999999999999%;;background-repeat:no-repeat}.com-level-bubble .award-img:after{content:'';display:inline-block;vertical-align:middle;width:0;height:100%}.com-level-bubble .award-img-inner{position:relative;display:inline-block;vertical-align:middle;max-width:98%;font-size:12px}.com-level-bubble .award-img .price{margin-bottom:3px}.com-level-bubble .award-img .num{margin-right:2px;font-size:20px;line-height:24px;font-weight:700}.com-level-bar .level-item.actived .level-dot{border-color:#00a4ff}.com-level-bar .level-item.actived .level-dot:after{opacity:1}.com-level-bubble.actived .c-bubble-inner{background-color:#fff;cursor:pointer;color:#333}.com-level-bubble.actived .c-bubble-inner:after{border-top-color:#fff}.com-level-bubble.actived .award-img{background-color:#F7F8FA;color:#666;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.24),0 1px 3px rgba(0,0,0,.16);box-shadow:0 1px 3px rgba(0,0,0,.24),0 1px 3px rgba(0,0,0,.16)}.com-level-bubble.actived .award-img .price{color:#00a4ff}.com-form{display:table;table-layout:fixed;width:100%}.com-form-item{display:table-row}.com-form-title{display:table-cell;vertical-align:top;padding:5px 10px 15px 0;width:70px;font-size:12px;line-height:20px;color:#666}.com-form-title em{color:#E54545}.com-form-cnt{display:table-cell;vertical-align:top;padding-bottom:15px;font-size:12px;color:#333}.com-form-text{line-height:20px}.com-form-btns{display:table-row;font-size:0}.com-form-btns .com-form-cnt{padding-top:5px}.com-form-btns .c-btn{margin-right:10px}.com-form-btns.center .com-form-cnt{text-align:center}.com-form-validate{margin-top:5px;color:#999}span.com-form-validate{margin-left:5px}.com-form-validate.error{color:#E54545}.com-form-validate.success{color:#00c8dc}.com-form-item.pure-text .com-form-title{padding-top:0;padding-bottom:10px}.com-form-item.pure-text .com-form-cnt{padding-bottom:10px}.com-form-item.pure-text+.com-form-btns .com-form-cnt{padding-top:15px}.com-form-item.address-row .c-select{display:inline-block;vertical-align:middle;margin-left:10px}.com-form-item.address-row .c-select:first-child{margin-left:0}.com-form-vertical{display:block;box-sizing:border-box}.com-form-vertical .com-form-item{display:block;margin-bottom:20px}.com-form-vertical .com-form-title{display:block;padding:0;margin-bottom:5px;width:auto;line-height:18px;color:#000}.com-form-vertical .com-form-item.pure-text .com-form-title{padding-bottom:0}.com-form-vertical .com-form-item.pure-text .com-form-cnt{margin-bottom:10px;padding-bottom:0}.com-form-vertical .com-form-cnt{display:block;padding-bottom:0}.com-form-vertical .com-form-btns{display:block;margin-top:50px}.com-form-vertical .com-form-btns .com-form-title{display:none}.com-form-vertical .com-form-btns .com-form-cnt,.com-form-vertical .com-form-item.pure-text+.com-form-btns .com-form-cnt{padding-top:0}.c-dialog-form-control .col-lables{margin-bottom:-10px}.col-lables .c-form-ctrl-label{margin-right:10px;margin-bottom:10px}.c-modal-mask{position:fixed;left:0;top:0;z-index:9000;width:100%;height:100%;background-color:#000;background-color:rgba(0,0,0,.7)}.c-modal{z-index:9000;font-size:0;text-align:center;overflow:auto}.c-modal-visible{display:block}.c-modal:before{content:'';display:inline-block;vertical-align:middle;width:0;height:100%}.c-modal-inner{display:inline-block;vertical-align:middle;max-width:99%;font-size:14px}.c-dialog{max-width:900px}.c-dialog-hd-title{font-size:16px}.c-dialog-hd-close{top:12px;margin-top:0}.c-dialog-hd-close:only-child{top:12px}.c-dialog-hd-close:before{width:25px;height:25px;background-image:url(sprite/base-201911131148.svg);;background-size:2016% 1968%;;background-position:46.35% 42.61%;background-repeat:no-repeat}.c-dialog-hd-close:hover:before{background-image:url(sprite/base-201911131148.svg);;background-position:82.05% 78.36999999999999%;background-size:2016% 1968%;;background-repeat:no-repeat}.c-dialog-bd{max-height:none;overflow:visible}.c-dialog-ft .c-btn{margin:0 5px;min-width:100px}.c-dialog-ft-validate{margin-top:10px;margin-bottom:-15px;color:#e54545}.com-modal-tip{padding-top:55px;text-align:center;min-height:42px;min-width:200px;font-size:14px;line-height:24px}.com-modal-bg-set .bg-item{position:relative;display:block;margin-bottom:10px;height:100px;background-color:#666;background-size:cover;opacity:1;border:2px solid transparent}.com-modal-bg-set .bg-item.actived,.com-modal-bg-set .bg-item:hover{border-color:#00a4ff}.com-modal-bg-set .bg-item.actived:before{content:'';position:absolute;right:0;bottom:0;width:0;height:0;border-style:solid;border-width:8px;border-color:transparent #00a4ff #00a4ff transparent}.com-modal-bg-set .bg-item.actived:after{content:'';position:absolute;right:2px;bottom:2px;width:7px;height:5px;background-image:url(sprite/base-201911131148.svg);;background-position:68.41000000000001% 42.92%;background-size:7200% 9840%;;background-repeat:no-repeat}.com-gift-intro .intro-item{margin-bottom:10px;font-size:14px;line-height:1.5;color:#333}.com-gift-intro .intro-img{margin-bottom:14px;text-align:center;height:120px}.com-gift-intro .com-award-img,.com-gift-intro .intro-img img{position:relative;top:50%;vertical-align:middle;max-width:100%;max-height:100%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.com-gift-intro .intro-item-title{color:#666}.com-gift-intro .intro-item-highlight{color:#00a4ff;font-weight:700}.com-gift-intro .gift-list .intro-img{-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;margin:0 auto;width:82px;height:120px;background-color:#d8d8d8;border:1px solid #d8d8d8;cursor:pointer}.com-gift-intro .gift-list .intro-img.actived{border-color:#00a4ff}.com-gift-intro .gift-list .intro-img.actived:before{content:'';position:absolute;right:0;bottom:0;width:0;height:0;border-style:solid;border-width:8px;border-color:transparent #00a4ff #00a4ff transparent}.com-gift-intro .gift-list .intro-img.actived:after{content:'';position:absolute;right:2px;bottom:2px;width:7px;height:5px;background-image:url(sprite/base-201911131148.svg);;background-position:68.41000000000001% 42.92%;background-size:7200% 9840%;;background-repeat:no-repeat}.com-award-img{position:relative;display:inline-block;vertical-align:middle;margin:0 auto;padding:0 10px;min-width:98px;height:68px;border-radius:2px;background-color:#F7F8FA;color:#666;overflow:hidden;text-align:center;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.24),0 1px 3px rgba(0,0,0,.16);box-shadow:0 1px 3px rgba(0,0,0,.24),0 1px 3px rgba(0,0,0,.16)}.com-award-img:before{content:'';position:absolute;right:-10px;bottom:-8px;width:66px;height:60px;background-image:url(sprite/base-201911131148.svg);;background-position:23.52% 0.22999999999999998%;background-size:763.6363636363636% 819.9999999999999%;;background-repeat:no-repeat}.com-award-img:after{content:'';display:inline-block;vertical-align:middle;width:0;height:100%}.com-award-img .award-img-inner{position:relative;display:inline-block;vertical-align:middle;max-width:98%;font-size:12px}.com-award-img .price{margin-bottom:3px;color:#00a4ff}.com-award-img .num{margin-right:2px;font-size:20px;line-height:24px;font-weight:700}.com-modal-invite{text-align:center}.com-modal-invite .invite-author{display:inline-table;width:auto;max-width:100%}.com-modal-invite .invite-author .com-media-object{padding-right:10px;width:32px}.com-modal-invite .invite-author .com-media-img{width:32px;height:32px}.com-modal-invite .invite-author .com-media-body{vertical-align:middle}.com-modal-invite .invite-author .com-media-title{margin-bottom:0}.com-modal-column-members{padding-bottom:20px;height:330px;overflow-x:hidden;overflow-y:auto}.com-modal-column-members .com-user-media{padding-bottom:0;margin-bottom:20px;border-bottom:none}.com-modal-column-members .com-media-object{width:40px}.com-modal-column-members .com-media-img{width:40px;height:40px}.com-modal-column-members .com-media-title{font-size:14px;padding-right:15px}.com-modal-column-members .com-media-desc{margin-bottom:0}.com-modal-column-members .com-media-title .com-verification{margin-top:-8px}.c-modal-gift-form .address-row .c-select{display:inline-block;vertical-align:middle;margin-left:10px;width:160px}.c-modal-gift-form .address-row .c-select:first-child{margin-left:0}.c-modal-gift-form .address-row .c-select+.c-select{margin-top:0}.c-modal-gift-form .address-row .c-textarea{margin-top:10px;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;font-size:12px}.com-modal-choose-cover .c-mini-step{margin-left:-25px;margin-right:-25px;padding-left:25px;padding-right:25px}.com-modal-choose-cover .gallery-tip{margin-bottom:15px;color:#999}.com-modal-choose-cover .com-gallery{margin-left:-25px;margin-right:-25px;padding-left:20px;padding-right:13px}.com-modal-choose-cover .c-mini-step+.com-tab{margin-top:-15px}.com-doc-members{min-height:200px;max-height:300px;overflow:auto}.com-doc-user{margin-bottom:10px}.com-doc-user .com-media-object{width:32px;padding-right:10px}.com-doc-user .com-media-img{width:32px;height:32px}.com-doc-user .com-media-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-modal-update-log{margin-bottom:20px;min-height:200px;max-height:300px;line-height:1.7;color:#333;overflow:auto;word-wrap:break-word}.com-modal-update-log .log-item{margin-bottom:10px}.com-modal-update-log .log-time{font-size:12px;color:#666}.com-modal-avatar-setting{border-top:1px solid #D2D9E7;border-bottom:1px solid #D2D9E7;margin-left:-25px;margin-right:-25px;margin-bottom:10px}.com-modal-avatar-setting .com-tab-ctrl{background-color:#F3F5F9;text-align:center;border-bottom:0 none}.com-modal-avatar-setting .com-tab-item{margin-right:50px}.com-modal-avatar-setting .com-tab-item a{height:50px;line-height:50px;font-size:14px;color:#4A4A4A;padding-left:30px;padding-right:30px}.com-modal-avatar-setting .com-tab-item.disabled a,.com-modal-avatar-setting .com-tab-item.disabled a:hover{color:#4a4a4a;cursor:not-allowed}.com-modal-avatar-setting .com-tab-item.actived a,.com-modal-avatar-setting .com-tab-item.actived a:hover{color:#00A4FF}.com-modal-avatar-setting .com-tab-item.actived a:after{height:3px}.com-avatar-setting{margin-top:10px;margin-bottom:20px;padding-left:30px;padding-right:30px;text-align:center}.com-avatar-setting .setting-tip{font-size:14px;color:#4A4A4A;line-height:20px;margin-bottom:20px}.com-avatar-setting .setting-img{display:block;margin-left:auto;margin-right:auto;width:266px;height:266px;overflow:hidden;border:1px solid #D2D9E7;box-sizing:border-box;position:relative}.com-avatar-setting .setting-img:before{content:"";position:absolute;width:200px;height:200px;background-color:#F3F5F9;top:50%;left:50%;margin-left:-100px;margin-top:-100px;border-top-left-radius:50%;border-top-right-radius:50%;border-bottom-right-radius:50%}.com-avatar-setting .setting-img .figure{position:relative;width:100%;height:100%;background-position:50% 50%;background-repeat:no-repeat}.com-avatar-setting .setting-img .figure-img{position:relative}.com-avatar-setting .setting-img-txt{position:absolute;left:0;top:0;display:table;width:100%;height:100%;font-size:12px;color:#4A4A4A;line-height:18px;text-align:center}.com-avatar-setting .setting-img-txt-inner{display:table-cell;vertical-align:middle}.com-avatar-setting .setting-icon-loading{width:30px;height:30px;display:inline-block;vertical-align:top;background-image:url(sprite/base-201911131148.svg);;-webkit-animation:galleryLoading 1.2s linear infinite;animation:galleryLoading 1.2s linear infinite;background-position:75.74% 59.089999999999996%;background-size:1680% 1639.9999999999998%;;background-repeat:no-repeat}.com-avatar-setting .setting-icon-img{width:48px;height:48px;display:inline-block;vertical-align:top;background-image:url(sprite/base-201911131148.svg);;background-position:66.45% 12.839999999999998%;background-size:1050% 1025%;;background-repeat:no-repeat}.com-avatar-setting .setting-img-txt p{margin-top:10px}.com-avatar-setting .setting-img-mask{position:absolute;left:50%;top:50%;z-index:2;pointer-events:none;box-sizing:border-box;margin-left:-266px;margin-top:-266px;width:532px;height:532px;border:1px solid rgba(0,0,0,.5);border-width:166px;border-radius:50% 50% 50% 0}.com-avatar-setting .setting-img.random .figure-img{position:absolute;left:50%;top:50%;margin:-100px 0 0 -100px;width:200px;height:200px;border-radius:50% 50% 50% 0}.com-avatar-setting .setting-img.random .setting-img-mask{display:none}.com-avatar-setting .setting-gender{margin:20px auto 0;width:265px;font-size:0}.com-avatar-setting .setting-gender .com-check-item{margin-right:30px;font-size:14px}.com-avatar-setting .setting-gender .com-check-item:last-child{margin-right:0}.com-avatar-setting .setting-toolbar{width:265px;margin-left:auto;margin-right:auto;margin-top:20px}.com-avatar-setting .toolbar-btn{display:inline-block;vertical-align:middle;cursor:pointer}.com-avatar-setting .toolbar-btn+.toolbar-btn{margin-left:35px}.com-avatar-setting [class*=toolbar-icon],.com-avatar-setting [class^=toolbar-icon]{vertical-align:top;vertical-align:middle;width:20px;height:20px;display:inline-block}.com-avatar-setting .toolbar-btn.disabled{cursor:default}.com-avatar-setting .toolbar-btn.disabled .c-bubble{display:none}.com-avatar-setting .toolbar-icon-reset{background-image:url(sprite/base-201911131148.svg);;background-position:27.48% 88.98%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-avatar-setting .toolbar-btn:hover .toolbar-icon-reset{background-image:url(sprite/base-201911131148.svg);;background-position:36.57% 88.98%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-avatar-setting .toolbar-btn.disabled .toolbar-icon-reset,.com-avatar-setting .toolbar-btn.disabled:hover .toolbar-icon-reset{background-image:url(sprite/base-201911131148.svg);;background-position:32.019999999999996% 88.98%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-avatar-setting .toolbar-icon-zoomin{background-image:url(sprite/base-201911131148.svg);;background-position:92.36% 28.18%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-avatar-setting .toolbar-btn:hover .toolbar-icon-zoomin{background-image:url(sprite/base-201911131148.svg);;background-position:92.36% 37.5%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-avatar-setting .toolbar-btn.disabled .toolbar-icon-zoomin,.com-avatar-setting .toolbar-btn.disabled:hover .toolbar-icon-zoomin{background-image:url(sprite/base-201911131148.svg);;background-position:92.36% 32.84%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-avatar-setting .toolbar-icon-zoomout{background-image:url(sprite/base-201911131148.svg);;background-position:92.36% 42.16%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-avatar-setting .toolbar-btn:hover .toolbar-icon-zoomout{background-image:url(sprite/base-201911131148.svg);;background-position:92.36% 23.52%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-avatar-setting .toolbar-btn.disabled .toolbar-icon-zoomout,.com-avatar-setting .toolbar-btn.disabled:hover .toolbar-icon-zoomout{background-image:url(sprite/base-201911131148.svg);;background-position:92.36% 46.82%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-avatar-setting .toolbar-icon-rotate-right{background-image:url(sprite/base-201911131148.svg);;background-position:54.75% 88.98%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-avatar-setting .toolbar-btn:hover .toolbar-icon-rotate-right{background-image:url(sprite/base-201911131148.svg);;background-position:63.839999999999996% 88.98%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-avatar-setting .toolbar-btn.disabled .toolbar-icon-rotate-right,.com-avatar-setting .toolbar-btn.disabled:hover .toolbar-icon-rotate-right{background-image:url(sprite/base-201911131148.svg);;background-position:59.3% 88.98%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-avatar-setting .toolbar-icon-rotate-left{background-image:url(sprite/base-201911131148.svg);;background-position:41.120000000000005% 88.98%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-avatar-setting .toolbar-btn:hover .toolbar-icon-rotate-left{background-image:url(sprite/base-201911131148.svg);;background-position:50.21% 88.98%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-avatar-setting .toolbar-btn.disabled .toolbar-icon-rotate-left,.com-avatar-setting .toolbar-btn.disabled:hover .toolbar-icon-rotate-left{background-image:url(sprite/base-201911131148.svg);;background-position:45.660000000000004% 88.98%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-avatar-setting .setting-btn{display:block;margin-left:auto;margin-right:auto;width:265px;height:40px;line-height:38px;margin-top:20px;position:relative;overflow:hidden}.com-avatar-setting .setting-btn .upload-file{position:absolute;right:0;top:0;font-size:300px;cursor:pointer}.com-avatar-setting .c-msg{margin-bottom:0;margin-top:20px}.com-2-nav{display:block;position:relative;min-width:1000px}.c-nav-mod-pc{display:block}.c-nav-bottom{transition:background-color .4s cubic-bezier(.67,0,.33,1)}.c-nav-mod.c-nav-white .c-nav-bm-right{background-color:transparent}.c-nav-mod .c-nav-bottom .c-nav-project-logo{padding-top:16px}.c-nav-mod .c-nav-bottom .c-nav-project-logo .c-nav-project-bg-logo{display:inline-block;vertical-align:middle;width:53px;height:18px;font-size:0;background:url(components/Header2/css/img/c-nav-logo-icon-white.svg) no-repeat;background-size:100% auto}.c-nav-mod.c-nav-white .c-nav-bottom .c-nav-project-logo .c-nav-project-bg-logo{background-image:url(components/Header2/css/img/c-nav-logo-icon.svg)}.com-2-nav .dropdown-mini-inner .dropdown-mini-list{padding-top:10px;padding-bottom:10px}.com-2-nav .dropdown-mini-inner .dropdown-mini-item{line-height:32px}.com-2-nav .dropdown-mini-inner .dropdown-mini-item a{color:#333}.com-2-nav .dropdown-mini-inner .dropdown-mini-item a:hover{color:#00a4ff}.com-2-nav .nav-dropdown-btn-txt{vertical-align:middle}.com-2-nav .c-nav-bm-categories .split-item{margin:0 10px;height:54px;line-height:54px}.com-2-nav .c-nav-bm-categories .split-item:before{content:'';display:inline-block;vertical-align:middle;height:16px;width:1px;background:rgba(255,255,255,.2)}.c-nav-mod.c-nav-white .c-nav-bm-categories .split-item:before{background:#ddd}.com-2-nav .c-nav-img-user{box-sizing:border-box;border:1px solid #EFEFEF;background-repeat:no-repeat}.c-nav-mod.c-nav-white .c-nav-img-user{border-color:#EFEFEF}.com-2-nav .c-nav-dropdown-btn .c-bubble{right:0}.com-2-nav .nav-user-bubble{width:auto}.com-2-nav .nav-user-bubble .dropdown-mini-item a{white-space:nowrap;min-width:0}.com-2-nav .nav-user-bubble .dropdown-mini-list{padding:0}.com-2-nav .nav-user-bubble .nav-drop-action{padding-top:10px;padding-bottom:10px}.com-2-nav .nav-user-bubble.c-bubble .c-bubble-inner{right:10px}.com-2-nav .c-nav-dropdown-btn .c-bubble-inner{border:1px solid #E7E8F1;-webkit-box-shadow:0 10px 20px rgba(3,27,78,.1);box-shadow:0 10px 20px rgba(3,27,78,.1);left:auto;right:22px}.com-2-nav .c-nav-dropdown-btn .c-bubble.c-bubble-top .c-bubble-inner:before{border-width:0 8px 11px;border-bottom-color:#E7E8F1}.com-2-nav .c-nav-dropdown-btn .c-bubble.c-bubble-top .c-bubble-inner:after{border-width:0 7px 9px;margin-bottom:-1px;margin-right:1px;border-bottom-color:#fff}.com-2-nav .nav-dropdown-msg{margin-right:10px}.com-2-nav .nav-dropdown-msg .c-nav-dropdown-btn-inner{display:block;padding:0 10px;line-height:54px}.com-2-nav .c-nav-icon-msg{display:inline-block;vertical-align:middle;width:18px;height:22px;background-image:url(sprite/base-201911131148.svg);;background-position:69.34% 46.379999999999995%;background-size:2800% 2236.3636363636365%;;background-repeat:no-repeat}.c-nav-mod.c-nav-white .c-nav-icon-msg{background-image:url(sprite/base-201911131148.svg);;background-position:70.58% 83.62%;background-size:2800% 2236.3636363636365%;;background-repeat:no-repeat}.com-2-nav .c-nav-dropdown-btn.actived .c-nav-icon-msg,.com-2-nav .c-nav-dropdown-btn:hover .c-nav-icon-msg{background-image:url(sprite/base-201911131148.svg);;background-position:87.03999999999999% 5.319999999999999%;background-size:2800% 2236.3636363636365%;;background-repeat:no-repeat}.com-2-nav .badge{position:absolute;left:50%;top:12px;z-index:2;box-sizing:border-box;padding:0 5px;min-width:16px;height:16px;border-radius:8px;font-size:12px;line-height:16px;text-align:center;color:#fff;background-color:#00a4ff;font-weight:500;font-family:Helvetica Neue}.com-2-nav .com-msg-popup{right:-20px;background-color:#fff;box-shadow:0 10px 20px rgba(3,27,78,.1);border:1px solid #E7E8F1;white-space:normal}.com-2-nav .com-msg-popup:after,.com-2-nav .com-msg-popup:before{content:'';position:absolute;right:30px;bottom:100%;border-style:solid;border-width:0 8px 11px;border-color:#E7E8F1 transparent}.com-2-nav .com-msg-popup:after{margin-right:1px;margin-bottom:-1px;border-width:0 7px 9px;border-color:#fff transparent}.com-2-nav .searchbar-show .com-search-dropdown{display:block}.com-2-nav .com-search-dropdown{margin-top:10px;text-align:left}.com-2-nav.fixed .c-nav-bottom{position:fixed;left:0;top:0;z-index:1000;box-sizing:border-box;width:100%;min-width:1000px}.com-2-nav.fixed .c-nav-dark .c-nav-bottom{border-top-color:transparent}.c-nav-mod .c-nav-bm-search.search-icon-rt>input{width:260px}.com-msg-popup{position:absolute;right:-45px;top:100%;z-index:9001;width:300px;background:#F7F8FA;border-radius:2px;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.3);box-shadow:0 2px 4px rgba(0,0,0,.3);font-size:14px;color:#333}.com-msg-popup:before{content:'';position:absolute;right:60px;bottom:100%;border-style:solid;border-width:0 6px 6px;border-color:#F7F8FA transparent}.com-msg-popup-hd{-webkit-box-sizing:border-box;box-sizing:border-box;height:38px;border-bottom:1px solid #e5e5e5;font-size:0}.com-msg-popup-ctrl li{position:relative;display:inline-block;vertical-align:middle;width:50%}.com-msg-popup-ctrl a{display:block;padding:0 10px;font-size:12px;line-height:38px;color:#333;text-align:center}.com-msg-popup-ctrl a:hover{color:#00a4ff;text-decoration:none}.com-msg-popup-ctrl .actived a{color:#00a4ff;text-decoration:none;font-weight:700}.com-msg-popup-ctrl .text{position:relative;display:inline-block;vertical-align:middle}.com-msg-popup-ctrl .text:after{content:'';position:absolute;left:0;bottom:0;width:100%;height:2px;background-color:transparent}.com-msg-popup-ctrl .actived .text:after{background-color:#00a4ff}.com-msg-popup-ctrl .num{position:relative;top:-1px;display:inline-block;vertical-align:middle;-webkit-box-sizing:border-box;box-sizing:border-box;margin-left:5px;padding:0 5px;min-width:18px;height:16px;border-radius:8px;background-color:#e54545;font-size:12px;line-height:16px;color:#fff;text-align:center}.com-msg-popup-bd{padding:10px 0;max-height:380px;overflow:auto;-webkit-overflow-scrolling:touch}.com-msg-popup-item{position:relative;padding:13px 20px;font-size:14px;line-height:24px;-webkit-transition:all .2s;transition:all .2s;color:#999;word-wrap:break-word}.com-msg-popup-item:after{content:'';position:absolute;left:20px;right:20px;bottom:0;height:1px;background-color:#e5e5e5}.com-msg-popup-item:last-child:after{display:none}.com-msg-popup-item .unread-icon{position:absolute;left:0;top:16px;-webkit-box-sizing:border-box;box-sizing:border-box;width:20px;height:18px;background-color:transparent;border:none;font-size:0}.com-msg-popup-item .unread-icon:before{content:'';display:inline-block;vertical-align:middle;width:4px;height:4px;border-radius:50%;background-color:#00a4ff}.com-msg-popup-item a{color:#333}.com-msg-popup-item a:hover{color:#00a4ff}.com-msg-popup-item .btns{margin-top:5px}.com-msg-popup-item .c-btn{vertical-align:middle}.com-msg-popup-item .c-btn-hole:hover{color:#00a4ff}.com-msg-popup .com-msg-popup-item .c-loading{margin:0}.com-msg-popup-ft{border-top:1px solid #e5e5e5;height:38px;line-height:38px}.com-msg-popup-ft .link-more{display:block;padding:0 10px;color:#00a4ff;text-align:center;font-size:12px}.com-msg-popup-ft .link-more:hover{color:#0092ee}.com-msg-popup-none{height:100px;text-align:center;font-size:0}.com-msg-popup-none:after{content:'';display:inline-block;vertical-align:middle;width:0;height:100%}.com-msg-popup-none p{display:inline-block;vertical-align:middle;max-width:98%;font-size:14px;color:#888}.com-msg-popup-none [class*=com-i-],.com-msg-popup-none [class^=com-i-]{position:relative;top:-1px;margin-right:5px}.com-msg-popup-letter{position:relative;display:block;padding:7px 20px 7px 30px;-webkit-transition:all .2s;transition:all .2s;font-size:12px}.com-msg-popup-letter .com-media{margin-bottom:0}.com-msg-popup-letter .com-media-object{padding-right:15px;width:32px}.com-msg-popup-letter .com-media-img{width:32px;height:32px}.com-msg-popup-letter .com-media-body{padding-top:2px}.com-msg-popup-letter .com-media-title{position:relative;margin-bottom:5px;padding-right:60px;font-size:12px;line-height:1;font-weight:700;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.com-msg-popup-letter .letter-time{position:absolute;right:0;top:0;color:#999;line-height:1}.com-msg-popup-letter .com-media-desc{color:#666;line-height:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.com-msg-popup-letter .unread-icon{position:absolute;left:0;top:13px;-webkit-box-sizing:border-box;box-sizing:border-box;width:30px;height:20px;line-height:20px;background-color:transparent;border:none;font-size:0}.com-msg-popup-letter .unread-icon:before{content:'';display:inline-block;vertical-align:middle;width:4px;height:4px;border-radius:50%;background-color:#00a4ff}.com-msg-popup .c-loading{margin:10px 0}.com-msg-tab-ctrl .msg-num{position:relative;top:-2px;display:inline-block;vertical-align:middle;-webkit-box-sizing:border-box;box-sizing:border-box;margin-left:5px;padding:0 5px;min-width:18px;height:16px;border-radius:8px;background-color:#e54545;font-size:12px;line-height:16px;color:#fff;text-align:center}.com-search-bar{position:relative;display:inline-block;vertical-align:middle;width:300px}.com-search-bar.focus,.com-search-bar.show{z-index:1002}.com-search{position:relative;display:block}.com-search .search-input{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;padding:5px 36px 5px 10px;width:100%;height:30px;border:none;border-radius:2px;font-size:14px;line-height:20px;color:#000;-webkit-box-shadow:0 1px 8px rgba(0,0,0,.1);box-shadow:0 1px 8px rgba(0,0,0,.1)}.com-search input::-webkit-input-placeholder{color:#75787d}.com-search input:-ms-input-placeholder{color:#75787d}.com-search input::placeholder{color:#999}.com-search .search-btn,.com-search .search-clear{position:absolute;right:0;top:0;width:26px;height:100%;border:none;background-color:transparent;line-height:30px;font-size:0;text-align:left}.com-search .search-clear{right:30px;width:16px}.com-search .search-btn:after,.com-search .search-clear:after{content:'';display:inline-block;vertical-align:middle;width:16px;height:16px;background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 7.7700000000000005%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-search .com-search-bar.focus .search-btn:after,.com-search .search-input:focus+.search-btn:after{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 7.7700000000000005%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-search .com-search-bar.focus .search-btn:hover:after,.com-search .search-btn:hover:after,.com-search .search-input:focus+.search-btn:hover:after{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 11.55%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-search .search-clear:after{background-image:url(sprite/base-201911131148.svg);;background-color:#fff;border-radius:50%;background-position:85.04% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-search .search-clear:hover:after{background-image:url(sprite/base-201911131148.svg);;background-position:88.73% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-search .close-btn{display:none}.com-search-bar.in-header{position:absolute;right:340px;top:18px;margin:0;-webkit-transition:all .2s;transition:all .2s}.com-search-bar.in-header .search-input{-webkit-box-shadow:none;box-shadow:none;background:#373E4D;color:#fff}.com-search-bar.in-header .search-input:focus,.com-search-bar.in-header.focus .search-input{background:#f7f8fa;color:#333}.com-search-bar.in-header.hidden{opacity:0;visibility:hidden;pointer-events:none}.com-nav-search-wrap{display:inline-block}.com-nav-search-wrap.align-center{position:absolute;left:328px;right:0;top:0;z-index:-1;height:65px;background-color:#2a303c;opacity:0}.com-nav-search-wrap.align-center .com-search-bar{position:relative;left:-165px;right:auto;top:18px;display:block;margin:0 auto;max-width:620px;width:auto}.com-nav-search-wrap.align-center .com-search .search-input{position:relative;left:200px;opacity:0;padding-left:30px;background-color:transparent;color:#fff;transition:all .4s cubic-bezier(.11393,.8644,.14684,1)}.com-nav-search-wrap.align-center .com-search .search-input:focus{color:#fff}.com-nav-search-wrap.align-center .com-search .search-btn{left:0;right:auto}.com-nav-search-wrap.align-center .com-search .search-btn:after{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 3.9899999999999998%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-nav-search-wrap.align-center .com-search .close-btn{display:block;position:absolute;right:0;top:0;width:26px;height:100%;border:none;background-color:transparent;line-height:30px;font-size:0;text-align:right}.com-nav-search-wrap.align-center .com-search .close-btn:after{content:'';display:inline-block;vertical-align:middle;width:16px;height:16px;background-image:url(sprite/base-201911131148.svg);;background-position:15.78% 9.66%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-nav-search-wrap.align-center .com-search .close-btn:hover:after{background-image:url(sprite/base-201911131148.svg);;background-position:91.60000000000001% 81.3%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-nav-search-wrap.align-center .com-search-dropdown{margin-top:18px}.com-nav-search-wrap.align-center.show-search{z-index:1000;opacity:1;transition:all .4s cubic-bezier(.67,0,.33,1)}.com-nav-search-wrap.align-center.show-search .search-input{left:0;opacity:1}.com-nav-search-wrap.align-center .com-search-dropdown-bd{padding:20px 30px}.com-nav-search-wrap.align-center .com-search-dropdown-group .link,.com-nav-search-wrap.align-center .com-search-dropdown-keywords a{margin-left:-30px;margin-right:-30px;padding-left:30px;padding-right:30px}.com-nav-search-wrap.align-center .com-search-dropdown-group .link.with-img{margin:0 5px 10px;padding-left:0;padding-right:0}.com-nav-search-wrap.align-center .com-search-dropdown-history .link{padding-right:56px}.com-nav-search-wrap.align-center .com-search-dropdown-history .link-btn{right:30px}.com-nav-search-wrap.align-center .com-search-dropdown.only-one-group .com-search-dropdown-history dd{margin-left:-30px;margin-right:-30px}.com-2-nav-search-wrap{background-color:#2b303b;position:absolute;top:0;left:0;width:100%;padding:10px 0;z-index:-1;opacity:0;overflow:hidden;transition:all .4s;border-top:solid 1px rgba(255,255,255,.08)}.c-nav-white .com-2-nav-search-wrap{background-color:#fff}.com-2-nav-search-wrap.show-search{overflow:visible;z-index:1000;opacity:1;transition:all .4s cubic-bezier(.67,0,.33,1)}.com-2-nav-search-wrap .com-search-bar{display:block;margin:0 auto;max-width:620px;width:auto}.com-2-nav-search-wrap .com-search .search-input{position:relative;left:200px;opacity:0;padding-left:30px;background-color:transparent;box-shadow:none;transition:all .4s cubic-bezier(.11393,.8644,.14684,1);height:34px;line-height:24px;color:#fff}.c-nav-white .com-2-nav-search-wrap .com-search .search-input{color:#000}.com-2-nav-search-wrap.show-search .search-input{left:0;opacity:1}.com-2-nav-search-wrap .com-search .search-btn{left:0;right:auto}.com-2-nav-search-wrap .com-search .search-btn:after{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 7.7700000000000005%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-2-nav-search-wrap .com-search .close-btn{display:block;position:absolute;right:0;top:0;width:26px;height:100%;border:none;background-color:transparent;line-height:30px;font-size:0;text-align:right}.com-2-nav-search-wrap .com-search .close-btn:after{content:'';display:inline-block;vertical-align:middle;width:16px;height:16px;background-image:url(sprite/base-201911131148.svg);;background-position:91.60000000000001% 85.08%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-2-nav-search-wrap .com-search .close-btn:hover:after{background-image:url(sprite/base-201911131148.svg);;background-position:91.60000000000001% 81.3%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-2-nav-search-wrap .com-search-dropdown{margin-top:10px}.com-3-nav-search-wrap{position:absolute;top:0;right:0;width:580px;margin-top:7px;z-index:-1;opacity:0;overflow:hidden;visibility:hidden}.com-3-nav-search-wrap .com-search-bar{padding:3px 0;background-color:#fff;border-top:solid 1px rgba(255,255,255,.08)}.com-3-nav-search-wrap.show-search{overflow:visible;z-index:1003;opacity:1;visibility:visible}.com-3-nav-search-wrap .com-search-bar:after{content:"";position:absolute;left:10px;bottom:0;width:calc(100% - 20px);background-color:rgba(124,132,142,.3);height:1px}.com-3-nav-search-wrap .com-search-bar{display:block;margin:0 auto;max-width:620px;width:auto}.com-3-nav-search-wrap .com-search .search-input{display:inline-block;vertical-align:middle;position:relative;left:200px;opacity:0;padding-left:20px;padding-right:5px;width:calc(100% - 69px);background-color:transparent;box-shadow:none;transition:all .4s cubic-bezier(.11393,.8644,.14684,1);height:34px;line-height:24px;color:#000}.com-3-nav-search-wrap.show-search .search-input{left:0;opacity:1}.com-3-nav-search-wrap .com-search .search-clear{display:none}.com-3-nav-search-wrap .com-search .search-btn{display:inline-block;vertical-align:middle;position:static;left:0;right:auto;width:34px;text-align:center}.com-3-nav-search-wrap .com-search .search-btn:after{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 7.7700000000000005%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-3-nav-search-wrap .com-search .search-btn:hover:after{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 11.55%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-3-nav-search-wrap .com-search .close-btn{display:inline-block;vertical-align:middle;position:relative;width:34px;height:100%;border:none;background-color:transparent;line-height:30px;font-size:0;text-align:center}.com-3-nav-search-wrap .com-search .close-btn:before{content:'';position:absolute;right:100%;top:8px;width:1px;height:14px;background-color:#E5E5E5}.com-3-nav-search-wrap .com-search .close-btn:after{content:'';display:inline-block;vertical-align:middle;width:16px;height:16px;background-image:url(sprite/base-201911131148.svg);;background-position:91.60000000000001% 85.08%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-3-nav-search-wrap .com-search .close-btn:hover:after{background-image:url(sprite/base-201911131148.svg);;background-position:91.60000000000001% 81.3%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-3-nav-search-wrap .com-search-dropdown{margin-top:0;box-shadow:none;border:none}.com-search-bar.normal .search-input{box-shadow:none;border:1px solid #D2D9E7;font-size:12px}.com-search-bar.normal .search-input:focus,.com-search-bar.normal.focus .search-input{border-color:#00a4ff}.com-search-bar.normal .search-btn:after,.com-search-bar.normal .search-clear:after{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 7.7700000000000005%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-search-bar.normal .search-btn:hover:after,.com-search-bar.normal .search-input:focus+.search-btn:hover:after,.com-search-bar.normal.focus .search-btn:hover:after{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 11.55%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-search-bar.normal .search-clear:after{background-image:url(sprite/base-201911131148.svg);;background-position:85.04% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-search-bar.normal .search-clear:hover:after{background-image:url(sprite/base-201911131148.svg);;background-position:88.73% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-search-mask{background-color:rgba(0,0,0,.4);position:fixed;top:0;left:0;right:0;bottom:0;z-index:1001;display:none}.com-search-mask.show{display:block}.com-search-dropdown{display:none;position:absolute;right:0;top:100%;z-index:900;-webkit-box-sizing:border-box;box-sizing:border-box;margin-top:5px;width:100%;background-color:#fff;box-shadow:0 10px 20px rgba(3,27,78,.1);border:1px solid #E7E8F1}.com-search-bar.show .com-search-dropdown{display:block}.com-search-dropdown-bd{overflow-x:hidden;overflow-y:auto;max-height:400px;padding:15px 20px}.com-search-dropdown-group{margin-bottom:15px;padding-bottom:15px;border-bottom:1px solid #D2D9E7}.com-search-dropdown-group:last-child{margin-bottom:0;padding-bottom:0;border-bottom:none}.com-search-dropdown-group dt{font-size:14px;line-height:30px;color:#999}.com-search-dropdown-group .link{display:block;margin:0 -20px;padding:0 20px 0 40px;font-size:14px;line-height:30px;color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-webkit-transition:all .2s;transition:all .2s}.com-search-dropdown-group .link.hover,.com-search-dropdown-group .link:hover{color:#00a4ff;text-decoration:none;background-color:#F3F5F9}.com-search-dropdown-group .link.with-img{display:inline-block;vertical-align:middle;margin:0 5px 10px;padding:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:center;width:100px}.com-search-dropdown-group .link.with-img:hover{background-color:transparent}.com-search-dropdown-group .link.with-img .link-text{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-search-dropdown-group .link .avatar,.com-search-dropdown-group .link img{display:block;margin:0 auto 5px;width:32px;height:32px;border-radius:50%}.com-search-dropdown-group .link .avatar{background-size:cover;background-position:center}.com-search-dropdown-group .tag-icon{display:block;margin:0 auto 5px;width:32px;height:32px;background-image:url(sprite/base-201911131148.svg);;background-position:76.06% 22.39%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-search-dropdown-group.dir-horizontal dd{font-size:0}.com-search-dropdown-group.dir-horizontal .link{display:inline-block;vertical-align:middle;margin:0 5px 10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:center;width:50px}.com-search-dropdown-group.dir-horizontal .link .avatar{display:block;margin:0 auto 5px}.com-search-dropdown-keywords{font-size:0}.com-search-dropdown-keywords a{display:block;margin:0 -20px;padding:0 20px 0 40px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px;line-height:30px;color:#333}.com-search-dropdown-keywords a:hover{color:#00a4ff;text-decoration:none;background-color:#F3F5F9}.com-search-dropdown-history dt{position:relative}.com-search-dropdown-history .link-clear{position:absolute;right:-5px;top:0;padding:0 5px}.com-search-dropdown-history .link-clear .com-i-delete{background-image:url(sprite/base-201911131148.svg);;background-position:62.91% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-search-dropdown-history .link-clear:hover .com-i-delete{background-image:url(sprite/base-201911131148.svg);;background-position:70.28999999999999% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-search-dropdown-history .link{position:relative;padding-right:40px}.com-search-dropdown-history .link-btn{position:absolute;right:15px;top:0;-webkit-box-sizing:border-box;box-sizing:border-box;padding:0 5px;height:100%;background-color:transparent;border:none;opacity:0;visibility:hidden;-webkit-transition:all .2s;transition:all .2s;cursor:pointer}.com-search-dropdown-history .link-btn .com-i-close{position:relative;top:-2px;background-image:url(sprite/base-201911131148.svg);;background-position:73.98% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-search-dropdown-history .link-btn:hover .com-i-close{background-image:url(sprite/base-201911131148.svg);;background-position:77.66% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-search-dropdown-history .link.hover .link-btn,.com-search-dropdown-history .link:hover .link-btn{opacity:1;visibility:visible}.com-search-dropdown-ft{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0 20px;height:37px;border-top:1px solid #D2D9E7;line-height:36px;font-size:12px}.com-search-dropdown-ft .link-more{display:block;margin:0 -20px;color:#00a4ff;text-align:center}.com-search-dropdown-ft .link-more:hover{color:#00a4ff;text-decoration:none;background-color:#F3F5F9}.com-search-dropdown-ft .link-clear{float:right;margin-right:30px}.com-search-dropdown.only-one-group .com-search-dropdown-bd{max-height:none}.com-search-dropdown.only-one-group .com-search-dropdown-history dt{background-color:transparent}.com-search-dropdown.only-one-group .com-search-dropdown-history dd{margin:0 -20px;max-height:300px;overflow-x:hidden;overflow-y:auto}.com-search-dropdown.only-one-group .com-search-dropdown-history .link{margin:0}.com-search-keywords{margin:10px auto -5px;width:650px}.com-search-keywords:after{content:'';display:table;clear:both}.com-search-keywords a{float:left;margin-right:10px;font-size:14px;line-height:24px;color:#fff}.com-search-result-item{display:block;margin:0 -20px;padding:0 20px;font-size:14px;line-height:34px;color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-webkit-transition:all .2s;transition:all .2s}.com-search-result-item.hover,.com-search-result-item:hover{color:#00a4ff;text-decoration:none;background-color:#F3F5F9}.com-search-result-icon{display:inline-block;vertical-align:middle;width:16px;height:16px;margin-right:5px}.com-search-result-icon.article{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 45.59%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-search-result-icon.column{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 53.15%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-search-result-icon.ask{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 49.370000000000005%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-search-result-icon.salon{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 60.709999999999994%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-search-result-icon.devdoc{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 56.93%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-search-result-icon.user{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 64.5%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-search-result-type{margin-right:5px;color:#999;font-size:12px;vertical-align:middle}.com-search-result-text{vertical-align:middle}.com-search-result-item em{color:#ff7200}.com-search-result-item.hover em,.com-search-result-item:hover em{color:#00a4ff}.com-search-panel{padding:40px 0 10px;background-color:#f7f8fa}.com-search-panel .com-search-bar{width:840px}.com-search-panel .com-search .search-input{padding-right:90px;height:46px;font-size:16px;line-height:34px;box-shadow:none;border:1px solid #ddd;border-radius:0}.com-search-panel .com-search .search-input:focus,.com-search-panel .com-search-bar.focus .search-input{border-color:#00a4ff}.com-search-panel .com-search .search-btn{width:80px;background-color:#00a4ff;text-align:center}.com-search-panel .com-search .search-btn:hover{background-color:#0092ee}.com-search-panel .com-search .com-search-bar.focus .search-btn:after,.com-search-panel .com-search .search-btn:after,.com-search-panel .com-search .search-input:focus+.search-btn:after{width:24px;height:24px;background-image:url(sprite/base-201911131148.svg);;background-position:45.21% 83.97%;background-size:2100% 2050%;;background-repeat:no-repeat}.com-search-panel .com-search .search-clear{right:90px}.com-search-panel .com-search-dropdown{margin-top:0;border:1px solid #e5e5e5;background-color:#fff}.com-search-panel-keywords{margin-top:10px;font-size:0}.com-search-panel-keywords a{margin-right:15px;font-size:14px;color:#666;word-wrap:break-word}.com-search-panel-keywords a:hover{color:#00a4ff;text-decoration:none}.qc-footer{min-width:1000px}.qc-footer-service .fs-list{-webkit-box-sizing:border-box;box-sizing:border-box;display:table;table-layout:fixed;width:100%}.qc-footer-service .fs-ct{display:table-cell;width:auto}.qc-footer-service .fs-ct.item-last{width:120px;white-space:nowrap;text-align:right}.qc-footer-service .fs-ct .item:hover{color:#00a4ff}.qc-footer-service .fs-ct .item.disabled{opacity:.5;cursor:default}.qc-footer-service .fs-ct .item.disabled [class*=icon-],.qc-footer-service .fs-ct .item.disabled [class^=icon-]{opacity:.5}.qc-footer-service .fs-ct .item.disabled:hover{color:#fff}.qc-footer-service .fs-ct .item .icon{background-repeat:no-repeat}.qc-footer-service .fs-ct .item .icon-disclaimer,.qc-footer-service .fs-ct .item.disabled .icon-disclaimer,.qc-footer-service .fs-ct .item.disabled:hover .icon-disclaimer{background-image:url(sprite/base-201911131148.svg);;background-position:65.03999999999999% 65%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.qc-footer-service .fs-ct .item:hover .icon-disclaimer{background-image:url(sprite/base-201911131148.svg);;background-position:76.06% 0.22%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.qc-footer-service .fs-ct .item .icon-standard,.qc-footer-service .fs-ct .item.disabled .icon-standard,.qc-footer-service .fs-ct .item.disabled:hover .icon-standard{background-image:url(sprite/base-201911131148.svg);;background-position:0.21% 57.60999999999999%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.qc-footer-service .fs-ct .item:hover .icon-standard{background-image:url(sprite/base-201911131148.svg);;background-position:65.03999999999999% 57.60999999999999%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.qc-footer-service .fs-ct .item .icon-support,.qc-footer-service .fs-ct .item.disabled .icon-support,.qc-footer-service .fs-ct .item.disabled:hover .icon-support{background-image:url(sprite/base-201911131148.svg);;background-position:0.21% 65%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.qc-footer-service .fs-ct .item:hover .icon-support{background-image:url(sprite/base-201911131148.svg);;background-position:76.06% 7.61%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.qc-footer-service .fs-ct .item .icon-contact,.qc-footer-service .fs-ct .item.disabled .icon-contact,.qc-footer-service .fs-ct .item.disabled:hover .icon-contact{background-image:url(sprite/base-201911131148.svg);;background-position:50.63999999999999% 65%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.qc-footer-service .fs-ct .item:hover .icon-contact{background-image:url(sprite/base-201911131148.svg);;background-position:57.84% 65%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.qc-footer-service .fs-ct .item .icon-translate,.qc-footer-service .fs-ct .item.disabled .icon-translate,.qc-footer-service .fs-ct .item.disabled:hover .icon-translate{background-image:url(sprite/base-201911131148.svg);;background-position:76.06% 15%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.qc-footer-service .fs-ct .item:hover .icon-translate{background-image:url(sprite/base-201911131148.svg);;background-position:76.06% 44.57%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.qc-footer-blogroll{background:#2e3033;text-align:left;padding-top:25px;padding-bottom:35px}.qc-footer-blogroll .blogroll-inner{margin:0 auto;max-width:1180px;position:relative;padding-left:10px;padding-right:10px}.qc-footer-blogroll .link-set{display:inline-block}.qc-footer-blogroll .department{line-height:32px}.qc-footer-blogroll .slide{color:#bbb;font-size:12px;margin-right:10px;word-wrap:break-word}.qc-footer-blogroll a.slide:hover{color:#00a4ff}.qc-footer-blogroll .department .icon-tc{display:inline-block;width:91px;height:16px;background-size:553.8461538461538% 3075%;;background-position:0.24% 5.88%;background-image:url(sprite/base-201911131148.svg);;margin-right:20px;background-repeat:no-repeat}.qc-footer-blogroll .links{line-height:20px}.qc-footer-blogroll .locale{position:absolute;bottom:0;right:10px}.qc-footer-blogroll .locale .locale-link{color:#ccc;font-size:12px}.qc-footer-blogroll .locale .locale-link.selected,.qc-footer-blogroll .locale .locale-link:hover{color:#00a4ff}.qc-footer-blogroll .locale .stick{color:#ccc;font-size:10px;vertical-align:middle;margin-left:5px;margin-right:5px}.c-footer-service-list{table-layout:fixed}.c-footer-service-list>li{width:auto}.c-footer-service-list>li:last-child{width:120px;white-space:nowrap;text-align:right}.c-footer-service-item.disabled{opacity:.5;cursor:default}.c-footer-service-item.disabled [class*=icon-],.c-footer-service-item.disabled [class^=icon-]{opacity:.5}.c-footer-service-item.disabled:hover{color:#fff}.c-footer-service-item .icon{background-repeat:no-repeat}.c-footer-service-item .icon-disclaimer,.c-footer-service-item.disabled .icon-disclaimer,.c-footer-service-item.disabled:hover .icon-disclaimer{background-image:url(sprite/base-201911131148.svg);;background-position:65.03999999999999% 65%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.c-footer-service-item:hover .icon-disclaimer{background-image:url(sprite/base-201911131148.svg);;background-position:76.06% 0.22%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.c-footer-service-item .icon-standard,.c-footer-service-item.disabled .icon-standard,.c-footer-service-item.disabled:hover .icon-standard{background-image:url(sprite/base-201911131148.svg);;background-position:0.21% 57.60999999999999%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.c-footer-service-item:hover .icon-standard{background-image:url(sprite/base-201911131148.svg);;background-position:65.03999999999999% 57.60999999999999%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.c-footer-service-item .icon-support,.c-footer-service-item.disabled .icon-support,.c-footer-service-item.disabled:hover .icon-support{background-image:url(sprite/base-201911131148.svg);;background-position:0.21% 65%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.c-footer-service-item:hover .icon-support{background-image:url(sprite/base-201911131148.svg);;background-position:76.06% 7.61%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.c-footer-service-item .icon-contact,.c-footer-service-item.disabled .icon-contact,.c-footer-service-item.disabled:hover .icon-contact{background-image:url(sprite/base-201911131148.svg);;background-position:50.63999999999999% 65%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.c-footer-service-item:hover .icon-contact{background-image:url(sprite/base-201911131148.svg);;background-position:57.84% 65%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.c-footer-service-item .icon-translate,.c-footer-service-item.disabled .icon-translate,.c-footer-service-item.disabled:hover .icon-translate{background-image:url(sprite/base-201911131148.svg);;background-position:76.06% 15%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.c-footer-service-item:hover .icon-translate{background-image:url(sprite/base-201911131148.svg);;background-position:76.06% 44.57%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.c-footer-blogroll-extra{width:auto;font-size:0}.c-footer-blogroll-extra .c-footer-select{display:inline-block;vertical-align:middle;width:190px}.c-footer .wechat-bubble{margin-right:20px}.c-footer .wechat-bubble-btn{box-sizing:border-box;width:35px;height:35px;border:1px solid rgba(255,255,255,.3);background-color:transparent;border-radius:2px;text-align:center;line-height:33px;cursor:pointer}.c-footer .wechat-bubble-btn .icon{position:relative;top:-2px;display:inline-block;vertical-align:middle;width:16px;height:16px;background-image:url(sprite/base-201911131148.svg);;background-size:3150% 3075%;;background-position:7.580000000000001% 92.86%;background-repeat:no-repeat}.c-footer .wechat-bubble .c-bubble-inner{width:130px;text-align:center}.c-footer .wechat-bubble .qr-img{width:100%}.c-footer .wechat-bubble .qr-txt{margin-top:5px}.com-simple-footer{width:100%;text-align:center;padding-bottom:50px;margin-top:45px}.com-simple-footer .copyright,.com-simple-footer a{color:#999}.com-simple-footer a{color:#00a4ff}.c-tab-cross:before{background-color:#D9D9D9}.c-tab-cross .c-tab-hd{padding:0;text-align:left}.c-tab-cross .c-tab-simple,.c-tab-cross.scrolling .c-tab-simple{margin-left:0;margin-right:20px}.c-tab-cross .c-tab-simple:last-child{margin-right:0}.c-tab-btns a:after{width:7px;height:13px;border:none}.c-tab-btns .prev:after{margin-right:0;-webkit-transform:rotate3d(0,0,1,0);transform:rotate3d(0,0,1,0);background-image:url(sprite/base-201911131148.svg);;background-position:2.01% 99.79%;background-size:7200% 3784.6153846153848%;;background-repeat:no-repeat}.c-tab-btns .next:after{margin-right:0;-webkit-transform:rotate3d(0,0,1,0);transform:rotate3d(0,0,1,0);background-image:url(sprite/base-201911131148.svg);;background-position:6.84% 99.79%;background-size:7200% 3784.6153846153848%;;background-repeat:no-repeat}.c-tab-simple a:hover{text-decoration:none}.c-tab-cross.with-bg,.c-tab-cross.with-bg .c-tab-btns a{background-color:#F7F8FA}.c-tab-cross.h-p .c-tab-simple a{padding:0;height:41px;line-height:40px;font-size:14px}.c-tab-cross.h-p .c-tab-simple .c-tab-tit{padding:0 15px}.c-tab-cross-wrap.fixed{height:41px}.c-tab-cross-wrap.fixed .c-tab-cross{position:fixed;top:54px;z-index:1000;background-color:#fff;box-shadow:rgba(0,0,0,.22) 0 5px 10px -5px}.com-tab-hd{position:relative;border-bottom:1px solid #e5e5e5}.com-tab-hd .com-tab-ctrl{border-bottom:none}.com-tab-hd-extra{position:absolute;right:0;top:0}.com-tab-ctrl{border-bottom:1px solid #e5e5e5;font-size:0}.com-tab-item{display:inline-block;vertical-align:middle;margin-right:10px}.com-tab-item:last-child{margin-right:0}.com-tab-item a{position:relative;display:block;padding:0 20px;height:32px;color:#000;font-size:12px;line-height:32px}.com-tab-item a:hover{color:#00a4ff}.com-tab-item.actived a,.com-tab-item.actived a:hover{color:#333;cursor:default;font-weight:700}.com-tab-item.actived a:after{content:'';position:absolute;left:0;right:0;bottom:-1px;height:2px;background-color:#00a4ff}.com-tab-panel{padding-top:20px}.com-tab-hd.large .com-tab-ctrl{border-bottom-color:#E5E8ED}.com-tab-hd.large .com-tab-item{margin-right:60px}.com-tab-hd.large .com-tab-item a{padding:0 0 16px;font-size:16px;line-height:22px;height:auto}.com-tab-hd.large .com-tab-item.actived a,.com-tab-hd.large .com-tab-item.actived a:hover{font-weight:500;color:#00a4ff}.com-tab-hd.large .com-tab-item.actived a:after{height:3px}.com-tab-hd.large .com-tab-item .num{margin-left:5px;font-size:12px}.com-tab-hd.large .com-tab-subctrl{padding-top:9px}.com-tab.large .com-tab-panel{padding-top:30px}.com-tab-hd.side .com-tab-ctrl{background-color:#F3F5F9;border-bottom-color:#D2D9E7}.com-tab-hd.side .com-tab-item{margin-right:0;width:33.3333%}.com-tab-hd.side .com-tab-item a{padding:0 10px;height:60px;font-size:14px;line-height:60px;text-align:center}.com-tab-hd.side .com-tab-item.actived a,.com-tab-hd.side .com-tab-item.actived a:hover{font-weight:400;color:#00a4ff}.com-tab-hd.side .com-tab-item.actived a:after{display:none}.com-tab-hd.side .com-tab-item .num{position:relative;top:-1px;display:inline-block;vertical-align:middle;margin-left:5px;padding:0 5px;height:16px;font-size:12px;line-height:16px;border-radius:8px;color:#fff;background-color:#FF7800}.com-tab.side .com-tab-panel{padding-top:0}.com-tab.dropdown .com-tab-ctrl{margin-bottom:-1px;padding-bottom:1px;margin-right:60px;white-space:nowrap;overflow:hidden}.com-tab.dropdown .com-tab-item{margin-right:40px}.com-tab.dropdown .com-tab-item a{height:22px;padding-left:0;padding-right:0;padding-bottom:18px;line-height:22px;font-size:16px;color:#333}.com-tab.dropdown .com-tab-item a:hover,.com-tab.dropdown .com-tab-item.actived a{color:#00a4ff}.com-tab.dropdown .com-tab-item.actived a:after{height:3px}.com-tab-dropdown-wrap{position:relative;display:inline-block;vertical-align:middle}.com-tab-dropdown-trigger{display:block;font-size:16px;line-height:22px;color:#333}.com-tab-dropdown-trigger:after{content:'';display:inline-block;vertical-align:middle;position:relative;top:-1px;width:0;height:0;margin-left:5px;border-style:solid;border-width:6px 5px 0;border-color:#333 transparent;-ms-transition:transform .3s;-webkit-transition:transform .3s;transition:transform .3s}.com-tab-dropdown-wrap.show .com-tab-dropdown-trigger:after{-ms-transform:rotate(-180deg);-webkit-transform:rotate(-180deg);transform:rotate(-180deg)}.com-tab-dropdown{display:none;position:absolute;right:0;top:100%;z-index:300;margin-top:10px;border:1px solid #E7E8F1;box-shadow:0 10px 20px rgba(3,27,78,.1);background-color:#fff;min-width:80px;max-height:300px;overflow-x:hidden;overflow-y:auto}.com-tab-dropdown-wrap.show .com-tab-dropdown{display:block}.com-tab-dropdown a{display:block;padding:0 10px;font-size:14px;line-height:32px;text-align:left;text-align:center;color:#333;white-space:nowrap}.com-tab-dropdown a:hover{color:#00a4ff;background-color:#F2F2F2}.com-tab-dropdown li.actived a,.com-tab-dropdown li.actived a:hover{color:#00a4ff;background-color:transparent;cursor:default}.com-tab-subctrl{font-size:0}.com-tab-subctrl li{display:inline-block;vertical-align:middle}.com-tab-subctrl li:before{content:'';display:inline-block;vertical-align:middle;margin:0 15px;width:1px;height:18px;background:#D9D9D9}.com-tab-subctrl li:first-child:before{display:none}.com-tab-subctrl a{display:inline-block;vertical-align:middle;font-size:14px;line-height:24px;color:#333;text-align:center}.com-tab-subctrl a:hover{color:#00a4ff;text-decoration:none}.com-tab-subctrl .actived a{color:#00a4ff;font-weight:700;cursor:default}.com-order-list{line-height:24px;color:#333;counter-reset:order}.com-order-list li{position:relative;margin-bottom:8px;padding-left:24px}.com-order-list li:last-child{margin-bottom:0}.com-order-list li:before{position:absolute;left:0;top:4px;counter-increment:order;content:counter(order);width:16px;height:16px;font-size:0}.com-order-list li:nth-child(n+4):before{font-size:12px;line-height:16px;font-weight:700;text-align:center;color:#999}.com-order-list li:nth-child(1):before{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 94.75%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-order-list li:nth-child(2):before{background-image:url(sprite/base-201911131148.svg);;background-position:11.27% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-order-list li:nth-child(3):before{background-image:url(sprite/base-201911131148.svg);;background-position:91.60000000000001% 58.60999999999999%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-order-list a{display:block;color:inherit}.com-order-list a:hover{text-decoration:none;color:#00a4ff}.com-order-medias{counter-reset:order}.com-order-medias .com-media{margin-bottom:0}.com-order-medias>li{margin-bottom:15px}.com-order-medias>li:last-child{margin-bottom:0}.com-order-medias .com-media-object{padding-right:10px;width:32px}.com-order-medias .com-media-img{position:relative;width:32px;height:32px}.com-order-medias .com-media-img:before{counter-increment:order;content:counter(order);position:absolute;right:-5px;bottom:-5px;width:16px;height:16px;border:2px solid #fff;border-radius:50%;font-size:0}.com-order-medias>li:nth-child(n+4) .com-media-img:before{display:none}.com-order-medias>li:nth-child(1) .com-media-img:before{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 94.75%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-order-medias>li:nth-child(2) .com-media-img:before{background-image:url(sprite/base-201911131148.svg);;background-position:11.27% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-order-medias>li:nth-child(3) .com-media-img:before{background-image:url(sprite/base-201911131148.svg);;background-position:91.60000000000001% 58.60999999999999%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-order-medias .com-media-body{vertical-align:middle}.com-order-medias .com-media-title{margin-bottom:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-order-medias .com-media:hover .com-media-title{color:#00a4ff}.com-vh-box{position:fixed;left:-1px;top:-1px;width:1px;height:1px;overflow:hidden;visibility:hidden}.com-v-box{position:fixed;left:0;top:-1px;width:1px;height:1px;overflow:hidden}.c-mini-step{box-sizing:border-box;margin-bottom:25px;padding-bottom:15px;border-bottom:1px solid #e5e5e5;color:#999;-webkit-user-select:none;counter-reset:step;font-size:0}.c-mini-step li{position:relative;display:inline-block;vertical-align:middle;color:#999;line-height:22px;font-size:0}.c-mini-step-num{box-sizing:border-box;display:inline-block;vertical-align:middle;margin-top:-1px;width:22px;height:22px;line-height:18px;border:2px solid #d4d5d7;border-radius:50%;margin-right:10px;text-align:center;color:#999;font-size:16px;font-weight:500}.c-mini-step-num:before{counter-increment:step;content:counter(step)}.c-mini-step-name{display:inline-block;vertical-align:middle;font-size:16px}.c-mini-step-arrow{height:16px;width:16px;display:inline-block;vertical-align:middle;margin-left:25px;margin-right:25px;background-image:url(sprite/base-201911131148.svg);;background-position:55.53% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.c-mini-step li:first-child .c-mini-step-arrow{display:none}.c-mini-step li.actived{color:#333}.c-mini-step li.actived .c-mini-step-num{color:#fff;background-color:#00a4ff;border-color:#00a4ff}.c-mini-step li.actived .c-mini-step-arrow{background-image:url(sprite/base-201911131148.svg);;background-position:22.34% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.c-mini-step li.finished{color:#666}.c-mini-step li.finished .c-mini-step-num{border-width:0;font-size:0}.c-mini-step li.finished .c-mini-step-num:after{content:'';display:inline-block;vertical-align:middle;width:22px;height:22px;background-image:url(sprite/base-201911131148.svg);;background-position:66.18% 83.62%;background-size:2290.909090909091% 2236.3636363636365%;;background-repeat:no-repeat}.c-mini-step li.finished .c-mini-step-arrow{background-image:url(sprite/base-201911131148.svg);;background-position:22.34% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-gallery{margin:0 -5px;height:410px;overflow:auto;font-size:0}.com-gallery>li{display:inline-block;vertical-align:middle;padding-left:5px;padding-right:5px;margin-bottom:10px}.com-gallery::-webkit-scrollbar{width:16px;height:16px}.com-gallery::-webkit-scrollbar-corner{background-color:transparent}.com-gallery::-webkit-scrollbar-track{border-radius:8px}.com-gallery::-webkit-scrollbar-thumb{height:7px;border-radius:8px;border:5px solid transparent;background-color:#ddd;background-clip:padding-box}.com-gallery-item{position:relative;display:block;box-sizing:border-box;width:160px;height:160px;border:1px solid #e5e5e5}.com-gallery-img{display:block;width:100%;height:100%;background-size:cover;background-position:center center;background-color:#f2f2f2}.com-gallery-mask{position:absolute;left:0;top:0;width:100%;height:100%;background-color:#000;opacity:.6;filter:alpha(opacity=60)}.com-gallery-icon{position:absolute;left:50%;top:50%;margin:-12px 0 0 -12px;width:24px;height:24px}.com-gallery-item.loading .com-gallery-icon{background-image:url(sprite/base-201911131148.png);-webkit-animation:galleryLoading 1.2s linear infinite;animation:galleryLoading 1.2s linear infinite;background-position:-42px 0px}@-webkit-keyframes galleryLoading{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@keyframes galleryLoading{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.com-gallery-item.success .com-gallery-icon{background-image:url(sprite/base-201911131148.png);background-position:0px -42px}.com-gallery-item.success .com-gallery-mask{display:none}.com-gallery-item.error .com-gallery-icon{background-image:url(sprite/base-201911131148.png);background-position:-26px -42px}.com-gallery-item.error .com-gallery-mask{display:none}.com-gallery-item.checked{border:2px solid #00a4ff}.com-gallery-item.checked:after{content:'';position:absolute;right:-2px;bottom:-2px;width:40px;height:40px;background-image:url(sprite/base-201911131148.png);background-position:0px 0px}.com-gallery.clickable .com-gallery-item{cursor:pointer}.com-gallery.clickable .com-gallery-item:hover{border:2px solid #00a4ff}.com-gallery-item.upload,.com-gallery-item.upload:hover,.com-gallery.clickable .com-gallery-item.upload:hover{border:none}.com-gallery-item.upload .com-gallery-mask{display:none}.com-gallery-item.upload.loading .com-gallery-mask{display:block}.com-gallery-upload-area{position:relative;display:block;width:100%;height:100%;background-color:#f2f2f2;overflow:hidden}.com-gallery-upload-area .upload-area-img{display:block;width:100%;height:100%;background-size:cover;background-position:center}.com-gallery-upload-area .upload-area-txt{position:absolute;left:0;top:50%;width:100%;-ms-transform:translateY(-50%);transform:translateY(-50%);text-align:center;font-size:14px;color:#666;transition:all .3s ease-in-out}.com-gallery-upload-area .upload-area-icon{display:block;margin:0 auto 7px;width:16px;height:16px;background-image:url(sprite/base-201911131148.svg);;background-position:69.67% 40.129999999999995%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-gallery-upload-area .upload-file{position:absolute;right:0;top:0;font-size:300px;cursor:pointer}.com-gallery-upload-area:hover .upload-area-txt{color:#00a4ff}.com-gallery-upload-area:hover .upload-area-icon{background-image:url(sprite/base-201911131148.svg);;background-position:91.60000000000001% 88.87%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-upload-box{overflow:hidden}.com-upload-box .upload-img{float:left;margin-right:20px;width:200px;height:130px;border:1px solid #e5e5e5;line-height:130px;text-align:center}.com-upload-box img{max-width:100%;max-height:100%;vertical-align:middle}.com-upload-box .upload-tip{padding-left:240px}.com-upload-box .c-btn{margin-top:10px;vertical-align:middle}.com-upload-box .c-btn+.com-form-validate{margin-top:10px;display:inline-block;vertical-align:middle}.com-upload-file{margin:50px 0;text-align:center}.com-upload-file .upload-area{position:relative;display:block;margin:0 auto 15px;width:260px;height:260px;background-color:#f2f2f2;overflow:hidden}.com-upload-file .upload-area-img{display:block;width:100%;height:100%;background-size:cover;background-position:center}.com-upload-file .upload-area-txt{position:absolute;left:0;top:50%;width:100%;-ms-transform:translateY(-50%);transform:translateY(-50%);text-align:center;font-size:14px;color:#666}.com-upload-file .upload-area-icon{display:block;margin:0 auto 7px;width:16px;height:16px;background-image:url(sprite/base-201911131148.svg);;background-position:69.67% 40.129999999999995%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-upload-file .upload-file{position:absolute;right:0;top:0;font-size:300px;cursor:pointer}.com-upload-file .upload-link{position:relative;display:inline-block;vertical-align:middle;color:#00a4ff;overflow:hidden}.com-upload-file .upload-link:hover{text-decoration:underline}.com-upload-file .upload-area:hover .upload-area-txt{color:#00a4ff}.com-upload-file .upload-area:hover .upload-area-icon{background-image:url(sprite/base-201911131148.svg);;background-position:91.60000000000001% 88.87%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-upload-file .c-msg{margin-bottom:0;margin-top:5px}.com-qr-code{text-align:center;width:140px;font-size:12px}.com-qr-code .code-img{box-sizing:border-box;width:100%}.com-ranking-list{counter-reset:ranking}.com-ranking-list>li{position:relative;margin-bottom:15px;padding-left:28px;counter-increment:ranking}.com-ranking-list>li:last-child{margin-bottom:0}.com-ranking-list>li:before{content:counter(ranking);position:absolute;left:0;top:1px;width:18px;height:18px;text-align:center;font-size:16px;line-height:18px;color:#ccc;font-weight:700;border-radius:2px}.com-ranking-list>li:nth-child(1):before,.com-ranking-list>li:nth-child(2):before,.com-ranking-list>li:nth-child(3):before{background:#FFE28C;background:-webkit-gradient(linear,0 0,0 100%,from(#FA0),to(#FFE28C));background:-moz-linear-gradient(to bottom,#FA0,#FFE28C);background:-ms-linear-gradient(to bottom,#FA0,#FFE28C);background:-o-linear-gradient(to bottom,#FA0,#FFE28C);background:linear-gradient(to bottom,#FA0,#FFE28C);color:#fff;font-size:14px}.com-ranking-list a{display:block;color:#333}.com-ranking-list a:hover{color:#00a4ff}.com-widget-qr .scan-btn{box-sizing:border-box;border:1px solid #D2D9E7;background:#F3F5F9;cursor:pointer;font-size:0;width:46px;height:44px;line-height:44px;text-align:center}.com-widget-qr .scan-btn:after{content:'';display:inline-block;vertical-align:middle;width:21px;height:21px;background-image:url(sprite/base-201911131148.svg);;background-position:87.58% 23.57%;background-size:2400% 2342.8571428571427%;;background-repeat:no-repeat}.com-widget-qr .com-wechat-panel{border:none;padding:0}.com-widget-qr .c-bubble{width:150px}.com-widget-qr .c-bubble-inner{padding:12px 10px 10px}.com-widget-qr .qr-img{display:block;margin:0 auto;width:108px;height:auto}.com-widget-qr .qr-img img{display:block;width:100%;height:auto}.com-widget-qr .qr-txt{margin-top:10px;text-align:center;font-size:14px;color:#666}.com-article-panel-v2-list{margin-bottom:40px}.com-article-panel-v2{position:relative;display:block;padding:25px 20px;text-align:left;border-bottom:1px solid #eee;cursor:pointer}.com-article-panel-v2-link{position:absolute;left:0;top:0;z-index:1;width:100%;height:100%}.com-article-panel-v2:hover{background-color:#f7f8fa}.com-article-panel-v2-title{font-size:18px;line-height:28px;font-weight:500;color:#000}.com-article-panel-v2-title a{color:#000}.com-article-panel-v2-title a:hover{color:#00a4ff}.com-article-panel-v2-tags.com-tag-v2-list{position:relative;z-index:2;margin-top:10px;margin-bottom:-15px}.com-article-panel-v2-bd{margin-top:20px;display:table;table-layout:fixed;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.com-article-panel-v2-object{display:table-cell;vertical-align:middle;padding-right:22px;width:200px}.com-article-panel-v2-object a{display:block}.com-article-panel-v2-object img{display:block;width:100%;height:auto}.com-article-panel-v2-object .com-article-panel-v2-img{display:block;width:200px;height:110px;border-radius:0;background-repeat:no-repeat;background-size:contain;background-position:center}.com-article-panel-v2-cnt{display:table-cell;vertical-align:middle}.com-article-panel-v2-des{font-size:14px;color:#666;line-height:24px;max-height:48px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.com-article-panel-v2-des a{color:#000}.com-article-panel-v2-des a:hover{color:#00a4ff}.com-article-panel-v2-opt{z-index:2;margin-top:20px;line-height:20px}.com-article-panel-v2:hover .com-article-panel-v2-opt{z-index:900}.com-article-panel-v2-opt .com-opt-link,.com-article-panel-v2-opt .com-opt-text{margin-right:16px;font-size:12px}.com-article-panel-v2-opt .com-opt-link .name{margin-right:0}.com-article-panel-v2.dot-list{padding-left:0;padding-right:0}.com-article-panel-v2.dot-list .com-article-panel-v2-title{position:relative;padding:0 20px}.com-article-panel-v2.dot-list .com-article-panel-v2-title:after{content:"";position:absolute;top:10px;left:7px;display:block;width:5px;height:5px;background-color:#00a4ff;border-radius:50%}.com-article-panel-v2.dot-list .com-article-panel-v2-bd{padding:0 20px}.com-article-panel-v2-user-wrap{position:relative;min-height:18px;z-index:2;margin-bottom:10px}.com-article-panel-v2:hover .com-article-panel-v2-user-wrap{z-index:900}.com-article-panel-v2-user-wrap .com-user-infos{font:none;margin-top:0;margin-bottom:0}.com-article-panel-v2-user-wrap .com-user-infos .com-media-object{width:24px}.com-article-panel-v2-user-wrap .com-user-infos .com-media-img{width:24px;height:24px}.com-article-panel-v2-user-wrap .com-tag-v2-list{position:absolute;right:0;white-space:nowrap;top:6px}.com-article-panel-v2-user-wrap .com-tag-v2{max-width:8em}.com-article-panel-v2.higher .com-article-panel-v2-object{vertical-align:top}.com-article-panel-v2.higher .com-article-panel-v2-opt{margin-top:10px}.com-article-panel-v2.higher .com-article-panel-v2-opt .com-opt-link,.com-article-panel-v2.higher .com-article-panel-v2-opt .com-opt-text{margin-right:20px}.com-user-infos{margin-top:10px}.com-user-infos .com-media-object{width:30px;padding-right:10px}.com-user-infos .com-media-img{box-sizing:border-box;width:30px;height:30px;border:1px solid #e5e5e5}.com-user-infos .com-media-body{vertical-align:middle;font-size:0}.com-user-infos .author-info{display:inline-block;vertical-align:middle;font-size:14px;line-height:20px;color:#999}.com-user-infos .author-info:before{content:'\B7';margin:0 5px}.com-user-infos a.author-info:hover{text-decoration:none;color:#00a4ff}.com-user-infos .author-info.name{max-width:110px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-user-infos .author-info:first-child:before{display:none}.com-header{box-sizing:border-box;padding:0 15px;min-width:320px;height:56px;line-height:56px;background-color:#fff;text-align:center;position:absolute;left:0;top:0;right:0;z-index:auto;border-bottom:0;box-shadow:inset 0 -1px 0 0 rgba(210,217,231,.71)}.com-header .header-title{color:#000;vertical-align:middle;font-weight:600;font-weight:400;font-size:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin:0 40px}.com-header .header-title .com-2-avatar{margin:0 5px 0 0}.com-header .logo{color:#000;font-size:16px;display:inline-block}.com-special-header .logo{width:100px;height:25px;position:absolute;left:15px;top:50%;transform:translate(0,-50%);background-image:url(sprite/base-201911131148.svg);;background-position:0.25% 0.21%;background-size:504% 1968%;;background-repeat:no-repeat}.com-header .logo .header-title{color:#000;display:inline-block;text-overflow:initial;white-space:initial;margin:0;font-weight:400}.com-special-header .logo .header-title{display:none}.com-header .logo-icon{display:none;display:none;width:21px;height:14.9px;vertical-align:middle;background-color:#212121}.com-header .header-extra{position:absolute;right:15px;top:0}.com-header .header-extra a{display:inline-block;vertical-align:middle;color:#333;font-size:14px}.com-header .header-extra a:active{color:#00a4ff}.com-header .header-back{display:inline-block;text-align:center;padding:0 15px;position:absolute;left:0;top:0;font-size:0}.com-header .header-back-icon{width:9px;height:14px;display:inline-block;vertical-align:middle;background-image:url(sprite/base-201911131148.svg);;background-repeat:no-repeat;background-size:5600% 3514.2857142857147%;;background-position:69.69999999999999% 25.94%}.com-header .header-home-icon{width:25px;height:25px;display:inline-block;vertical-align:middle;background-image:url(sprite/base-201911131148.svg);;background-position:82.05% 72.59%;background-size:2016% 1968%;;background-repeat:no-repeat}.com-header .header-extra-icon{display:inline-block;width:25px;height:25px;vertical-align:middle}.com-header .header-extra-icon+.header-extra-icon{margin-left:20px}.com-header .header-extra-icon.ask{width:24px;height:24px;background-image:url(sprite/base-201911131148.svg);;background-position:50.62% 83.97%;background-size:2100% 2050%;;background-repeat:no-repeat}.com-header .search-entry{position:relative;top:-1px;background-image:url(sprite/base-201911131148.svg);;background-position:5.8500000000000005% 84.15%;background-size:2016% 1968%;;background-repeat:no-repeat}.com-header .com-dropdown-menu .menu-link{color:#444}.com-special-header{text-align:left}.com-special-header .header-back{display:none}.com-header .header-extra-back{position:absolute;left:20px;top:0}.com-header .header-extra-back a{color:#333;font-size:14px}.com-header .header-extra-back a:active{color:#00a4ff}.header-logo-wrap{display:inline-block;vertical-align:middle;font-size:0}.header-logo-wrap .header-logo{display:inline-block;vertical-align:middle;position:relative;top:-1px}.header-logo-wrap .header-logo .header-title{display:none}.header-logo-wrap .header-logo .logo-icon{background:0 0}.header-logo-wrap .header-logo .logo-index{display:block;width:35px;height:25px;background-image:url(sprite/base-201911131148.svg);;background-position:64.61% 40.9%;background-size:1440% 1968%;;background-repeat:no-repeat}.header-logo-wrap .split{display:inline-block;vertical-align:middle;margin:0 5px;width:4px;height:4px;background:#000;border-radius:50%}.header-logo-wrap .header-logo .logo-community{display:block;width:60px;height:25px;background-image:url(sprite/base-201911131148.svg);;background-position:29.95% 42.61%;background-size:840% 1968%;;background-repeat:no-repeat}.com-header .header-main{position:absolute;left:15px;top:0;text-align:left;font-size:0}.com-header .header-menu-trigger{display:inline-block;vertical-align:middle;margin-right:10px}.com-header .header-menu-trigger:before{content:'';display:inline-block;vertical-align:middle;width:20px;height:16px;background-image:url(sprite/base-201911131148.svg);;background-position:87.4% 46.64%;background-size:2520% 3075%;;background-repeat:no-repeat}.com-header .header-main-title{display:inline-block;vertical-align:middle;font-size:16px;color:#333;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:6em}.com-header .header-extra a+a{margin-left:10px}.com-header .header-extra .header-msg{position:relative;padding:0 5px;font-size:0}.com-header .header-i-msg{display:inline-block;vertical-align:middle;width:22px;height:22px;background-image:url(sprite/base-201911131148.svg);;background-position:61.199999999999996% 83.62%;background-size:2290.909090909091% 2236.3636363636365%;;background-repeat:no-repeat}.com-header .header-msg .header-badge{position:absolute;left:100%;top:16px;padding:0 3px;margin-left:-15px;min-width:10px;height:14px;font-size:12px;line-height:14px;text-align:center;background-color:#00a4ff;color:#fff;border-radius:7px}.com-header .header-extra .c-bubble-trigger{margin-left:13px}.com-header .header-user{position:relative;margin-right:-5px;padding:0 5px}.com-header .header-btn{height:28px;line-height:28px}.com-header .header-btn .btn-text{font-size:12px;display:block;color:#fff}.com-header .header-btn.c-btn-weak .btn-text{color:#999}.com-header .header-extra .header-user-name{display:none}.com-header .header-user-avatar{display:inline-block;vertical-align:middle;box-sizing:border-box;margin-top:-3px;width:26px;height:26px;border:2px solid #e5e5e5;background-size:cover;background-position:center;border-radius:50%}.com-m-side-mask{position:absolute;left:0;top:0;width:100%;height:100%;z-index:1000;background-color:#000;opacity:.7;transition:all .3s ease-in-out}.com-m-side-mask.hidden{opacity:0;visibility:hidden}.com-m-side{position:absolute;left:0;top:0;z-index:1001;width:300px;height:100%;background-color:#fff;box-shadow:4px 2px 4px 0 rgba(0,0,0,.2);transition:all .3s ease}.com-m-side.hidden{left:-330px}.com-m-side-hd{position:relative;padding:0 15px;height:56px;border-bottom:1px solid #e5e5e5;line-height:56px}.com-m-side-hd .header-logo-wrap{position:relative;top:-1px}.com-m-side-hd-extra{position:absolute;right:10px;top:0;font-size:0}.com-m-side-link{display:inline-block;vertical-align:middle;padding:0 5px;font-size:14px;color:#999}.com-m-side-link [class*=icon-],.com-m-side-link [class^=icon-]{position:relative;top:-1px;display:inline-block;vertical-align:middle;margin-left:5px;width:16px;height:16px}.com-m-side-link .icon-back{width:9px;height:15px;background-image:url(sprite/base-201911131148.svg);;background-position:69.69999999999999% 22.43%;background-size:5600% 3279.9999999999995%;;background-repeat:no-repeat}.com-m-side-link .icon-logout{top:-2px;width:13px;height:13px;background-image:url(sprite/base-201911131148.svg);;background-position:3.8699999999999997% 99.79%;background-size:3876.9230769230767% 3784.6153846153848%;;background-repeat:no-repeat}.com-m-side-link [class*=icon-]:only-child,.com-m-side-link [class^=icon-]:only-child{margin-right:5px}.com-m-side-bd{position:absolute;left:0;top:57px;right:0;bottom:0;overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch}.com-m-side-ft{position:absolute;left:0;right:0;bottom:0;padding:0 15px 15px}.com-m-side-ft .com-m-side-link{line-height:36px}.com-m-side-nav{padding:8px 0}.com-m-side-nav-item.split{margin:5px 20px;border-top:1px solid #e5e5e5}.com-m-side-nav-link{display:block;position:relative;padding-left:62px;padding-right:20px;font-size:15px;line-height:48px;height:48px;color:#333}.com-m-side-nav-link [class*=icon-],.com-m-side-nav-link [class^=icon-]{position:absolute;left:15px;top:8px;width:32px;height:32px}.com-m-side-nav-link .icon-home{background-image:url(sprite/base-201911131148.svg);;background-position:56.989999999999995% 49.13%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-item.actived>.com-m-side-nav-link .icon-home{background-image:url(sprite/base-201911131148.svg);;background-position:49.79% 49.13%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-link .icon-column{background-image:url(sprite/base-201911131148.svg);;background-position:21.82% 57.60999999999999%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-item.actived>.com-m-side-nav-link .icon-column{background-image:url(sprite/base-201911131148.svg);;background-position:14.62% 57.60999999999999%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-link .icon-ask{background-image:url(sprite/base-201911131148.svg);;background-position:50.63999999999999% 57.60999999999999%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-item.actived>.com-m-side-nav-link .icon-ask{background-image:url(sprite/base-201911131148.svg);;background-position:43.43% 57.60999999999999%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-link .icon-more{background-image:url(sprite/base-201911131148.svg);;background-position:28.18% 49.13%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-item.actived>.com-m-side-nav-link .icon-more{background-image:url(sprite/base-201911131148.svg);;background-position:42.16% 28.910000000000004%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-link .icon-me{background-image:url(sprite/base-201911131148.svg);;background-position:42.58% 49.13%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-item.actived>.com-m-side-nav-link .icon-me{background-image:url(sprite/base-201911131148.svg);;background-position:35.38% 49.13%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-link .icon-salon{background-image:url(sprite/base-201911131148.svg);;background-position:29.03% 65%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-item.actived>.com-m-side-nav-link .icon-salon{background-image:url(sprite/base-201911131148.svg);;background-position:21.82% 65%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-link .icon-nonstop{background-image:url(sprite/base-201911131148.svg);;background-position:43.43% 65%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-item.actived>.com-m-side-nav-link .icon-nonstop{background-image:url(sprite/base-201911131148.svg);;background-position:36.230000000000004% 65%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-link .icon-news{background-image:url(sprite/base-201911131148.svg);;background-position:28.18% 14.57%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-item.actived>.com-m-side-nav-link .icon-news{background-image:url(sprite/base-201911131148.svg);;background-position:76.06% 29.78%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-link .icon-devdoc{background-image:url(sprite/base-201911131148.svg);;background-position:7.42% 57.60999999999999%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-item.actived>.com-m-side-nav-link .icon-devdoc{background-image:url(sprite/base-201911131148.svg);;background-position:76.06% 51.959999999999994%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-link .icon-college{background-image:url(sprite/base-201911131148.svg);;background-position:36.230000000000004% 57.60999999999999%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-item.actived>.com-m-side-nav-link .icon-college{background-image:url(sprite/base-201911131148.svg);;background-position:29.03% 57.60999999999999%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-link .icon-tvp{background-image:url(sprite/base-201911131148.svg);;background-position:57.84% 57.60999999999999%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-item.actived>.com-m-side-nav-link .icon-tvp{background-image:url(sprite/base-201911131148.svg);;background-position:64.19% 47.39%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-link .icon-ai{background-image:url(sprite/base-201911131148.svg);;background-position:14.62% 65%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.com-m-side-nav-item.actived>.com-m-side-nav-link .icon-ai{background-image:url(sprite/base-201911131148.svg);;background-position:7.42% 65%;background-size:1575% 1537.5%;;background-repeat:no-repeat}.has-subnav>.com-m-side-nav-link:after{content:'';position:absolute;right:15px;top:50%;margin-top:-3px;width:14px;height:8px;background-image:url(sprite/base-201911131148.svg);;transition:all .3s linear;background-position:68.78% 50%;background-size:3600% 6150%;;background-repeat:no-repeat}.com-m-side-nav-item.actived>.com-m-side-nav-link{background-color:#EBEBEB;color:#00a4ff}.com-m-side-nav-item.opened>.com-m-side-nav-link:after{transform:rotate3d(0,0,1,180deg)}.com-m-side-nav-second{display:none}.com-m-side-nav-item.opened>.com-m-side-nav-second{display:block}.com-m-side-nav-second .com-m-side-nav-link:after,.com-m-side-nav-second>li:first-child>.com-m-side-nav-link:before{content:'';position:absolute;left:62px;right:0;bottom:0;height:1px;background-color:#e5e5e5}.com-m-side-nav-second>li:first-child>.com-m-side-nav-link:before{top:0;bottom:auto}.com-2-header-common{font-size:0;text-align:left;overflow:hidden}.com-2-header-search{display:none;opacity:0;visibility:hidden}.com-2-header-search-link{display:block;padding:0 7px;height:33px;line-height:33px;font-size:0;background-color:#f4f5f9;box-sizing:border-box}.com-2-header-search-link .com-2-header-search-text{margin-left:7px;vertical-align:middle;font-size:14px;color:#666}.com-2-m-side .com-m-side-bd{display:-webkit-box;display:flex;flex-flow:column nowrap;-webkit-box-orient:vertical;overflow-x:hidden;overflow-y:auto}.com-2-m-side .com-m-side-nav{flex:1;-webkit-box-flex:1;box-sizing:border-box}.com-2-m-side .com-m-side-idx-link-wrap{padding:20px;width:100%;box-sizing:border-box}.com-2-m-side .com-m-side-idx-link{line-height:30px;font-size:14px;color:#9b9b9b}.com-2-header .com-2-tab{padding:0 20px;background:0 0}.com-2-header .com-2-tab .com-2-tab-ctrl-item,.com-2-header .com-2-tab .com-2-tab-ctrl-item a,.com-2-header .com-2-tab .com-2-tab-hd{height:56px}.com-2-header .com-2-tab .com-2-tab-hd{padding:0}.com-2-header .com-2-tab .com-2-tab-hd:before{display:none}.com-2-header .com-2-tab .com-2-tab-ctrl-item{padding:0 5px}.com-2-header .com-2-tab .com-2-tab-ctrl{height:68px}.com-2-header .com-2-tab .com-2-tab-ctrl-item a{line-height:56px;padding:0;font-size:16px;color:#999}.com-2-header .com-2-tab .com-2-tab-ctrl-item.actived a{color:#00a4ff}.com-2-header .com-2-tab .com-2-tab-ctrl-item.actived a:before{display:none}.com-2-header .logo{display:inline-block;vertical-align:top;padding:0 20px;max-width:100%;font-size:0;box-sizing:border-box}.com-2-header .logo .header-title{max-width:100%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;font-size:16px;color:#333}.com-header.subsite .header-logo{top:-2px}.com-header-air{background:0 0;z-index:1;box-shadow:none;color:#fff}.com-header-air .header-extra a,.com-header-air .header-title{color:#fff}.com-header-air .header-back-icon{background-image:url(sprite/base-201911131148.svg);;background-position:69.69999999999999% 31.169999999999998%;background-size:5600% 3514.2857142857147%;;background-repeat:no-repeat}.com-header-air .header-i-msg{display:inline-block;vertical-align:middle;width:22px;height:22px;background-image:url(sprite/base-201911131148.svg);;background-position:80.28999999999999% 83.62%;background-size:2290.909090909091% 2236.3636363636365%;;background-repeat:no-repeat}.com-header-air .c-bubble-trigger.com-operations-dropdown .c-bubble-trigger-btn:after{background-image:url(sprite/base-201911131148.svg);;background-position:87.76% 0.21%;background-size:2290.909090909091% 2236.3636363636365%;;background-repeat:no-repeat}.com-m-footer{box-sizing:border-box;position:absolute;z-index:6;left:0;bottom:0;right:0;width:100%;height:50px;border-top:1px solid #eee;background-color:#fff}.com-m-footer .nav-inner{display:-webkit-box;display:-ms-flexbox;display:flex}.com-m-footer .nav-dropdown-wrap,.com-m-footer .nav-item{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-ms-flex:1;flex:1;padding-top:4px;height:49px;color:#000;text-align:center}.com-m-footer .nav-item.actived{color:#00a4ff}.com-m-footer .nav-inner .icon{display:inline-block;vertical-align:middle;width:25px;height:25px}.com-m-footer .nav-inner .home{background-image:url(sprite/base-201911131148.svg);;background-position:40.71% 42.61%;background-size:2016% 1968%;;background-repeat:no-repeat}.com-m-footer .nav-inner .column{background-image:url(sprite/base-201911131148.svg);;background-position:82.05% 61.029999999999994%;background-size:2016% 1968%;;background-repeat:no-repeat}.com-m-footer .nav-inner .ask{background-image:url(sprite/base-201911131148.svg);;background-position:17.119999999999997% 84.15%;background-size:2016% 1968%;;background-repeat:no-repeat}.com-m-footer .nav-inner .lab{background-image:url(sprite/base-201911131148.svg);;background-position:57.620000000000005% 42.61%;background-size:2016% 1968%;;background-repeat:no-repeat}.com-m-footer .nav-inner .me{background-image:url(sprite/base-201911131148.svg);;background-position:22.759999999999998% 84.15%;background-size:2016% 1968%;;background-repeat:no-repeat}.com-m-footer .nav-inner .more{background-image:url(sprite/base-201911131148.svg);;background-position:28.389999999999997% 84.15%;background-size:2016% 1968%;;background-repeat:no-repeat}.com-m-footer .nav-inner .actived .home{background-image:url(sprite/base-201911131148.svg);;background-position:51.980000000000004% 42.61%;background-size:2016% 1968%;;background-repeat:no-repeat}.com-m-footer .nav-inner .actived .column{background-image:url(sprite/base-201911131148.svg);;background-position:82.05% 66.81%;background-size:2016% 1968%;;background-repeat:no-repeat}.com-m-footer .nav-inner .actived .ask{background-image:url(sprite/base-201911131148.svg);;background-position:39.67% 84.15%;background-size:2016% 1968%;;background-repeat:no-repeat}.com-m-footer .nav-inner .actived .lab{background-image:url(sprite/base-201911131148.svg);;background-position:0.21% 84.15%;background-size:2016% 1968%;;background-repeat:no-repeat}.com-m-footer .nav-inner .actived .me{background-image:url(sprite/base-201911131148.svg);;background-position:34.03% 84.15%;background-size:2016% 1968%;;background-repeat:no-repeat}.com-m-footer .nav-inner .actived .more{background-image:url(sprite/base-201911131148.svg);;background-position:11.48% 84.15%;background-size:2016% 1968%;;background-repeat:no-repeat}.com-m-footer .nav-inner .title{margin:-2px 0 0;font-weight:400;font-size:12px;-webkit-transform:scale(.83,.83);transform:scale(.83,.83)}.com-m-footer .nav-inner .actived .title{color:#00a4ff}.com-m-footer .nav-dropdown-wrap{position:relative;white-space:nowrap}.com-m-footer .nav-dropdown-wrap .nav-item{display:block;padding-top:0}.com-m-footer .nav-dropdown-wrap .c-bubble{left:50%;bottom:100%;margin-left:-73px;margin-bottom:2px}.com-m-footer-menu li{border-bottom:1px solid #e5e5e5}.com-m-footer-menu li:last-child{border-bottom:none}.com-m-footer-menu .menu-link{display:block;margin:0 -20px;padding:0 30px;height:44px;font-size:14px;line-height:44px;color:#444;white-space:nowrap;-webkit-transition:all .2s;transition:all .2s}.com-m-footer-menu .menu-link.actived,.com-m-footer-menu .menu-link:active{color:#00a4ff;text-decoration:none}.c-bubble .com-m-footer-menu{margin:-8px -10px;padding:0 20px}.com-2-m-footer{margin-top:20px;padding:30px 15px;text-align:center;background-color:#2e3033}.com-2-m-footer .footer-qr{margin-bottom:14px}.com-2-m-footer .footer-qr-object{display:inline-block;vertical-align:top;padding:8px;background-color:#fff;width:108px;height:108px}.com-2-m-footer .footer-qr-image{display:block;width:100%;height:100%}.com-2-m-footer .footer-qr-info{margin-top:6px}.com-2-m-footer .footer-qr-text{display:block;line-height:20px;font-size:14px;color:#999}.com-2-m-footer .footer-copyright-text{line-height:18px;font-size:12px;color:#999}.com-2-m-footer .footer-copyright-text+.footer-copyright-text{margin-left:10px}.com-2-m-footer.only-copyright{text-align:left}.com-2-m-footer.only-copyright .footer-copyright-text{display:inline}.com-2-m-footer,.com-header,.com-m-footer{display:none}.com-nav-Links{font-size:0}.com-nav-Links>li{display:inline-block;vertical-align:middle}.com-nav-Links>li:before{content:'';display:inline-block;vertical-align:middle;margin:0 10px;width:2px;height:2px;border-radius:50%;background-color:#333}.com-nav-Links>li:first-child:before{display:none}.com-nav-Link{display:inline-block;vertical-align:middle;font-size:14px;line-height:30px;color:#333;white-space:nowrap}.com-nav-Link.highlight{color:#FF7800;font-weight:600}.com-nav-Link:hover{color:#00a4ff}.com-page-btns{text-align:center;font-size:0}.com-page-btn{position:relative;display:inline-block;vertical-align:middle;margin:0 15px;width:24px;height:24px}.com-page-btn .btn-icon{display:block;box-sizing:border-box;width:100%;height:100%;border:1px solid #D2D9E7;border-radius:50%;text-align:center;line-height:22px}.com-page-btn:hover .btn-icon{border-color:#00a4ff}.com-page-btn .btn-icon:before{content:'';position:relative;display:inline-block;vertical-align:middle;width:11px;height:11px}.com-page-btn.prev .btn-icon:before{background:url(components/PageBtns/css/img/slice/left.svg) no-repeat}.com-page-btn.prev:hover .btn-icon:before{background:url(components/PageBtns/css/img/slice/left-hover.svg) no-repeat}.com-page-btn.next .btn-icon:before{background:url(components/PageBtns/css/img/slice/right.svg) no-repeat}.com-page-btn.next:hover .btn-icon:before{background:url(components/PageBtns/css/img/slice/right-hover.svg) no-repeat}.com-page-btn.disabled{cursor:default}.com-page-btn.disabled:hover .btn-icon{border-color:#D2D9E7}.com-page-btn.prev.disabled:hover .btn-icon:before{background:url(components/PageBtns/css/img/slice/left.svg) no-repeat}.com-page-btn.next.disabled:hover .btn-icon:before{background:url(components/PageBtns/css/img/slice/right.svg) no-repeat}.com-page-btn .btn-timer-wrap{position:absolute;left:-1px;right:-1px;top:-1px;bottom:-1px}.com-page-btn .btn-timer{width:100%;height:100%}.com-page-btn .btn-timer-path{fill:none;stroke:#00a4ff;stroke-width:2px;opacity:0;transition:opacity 10ms linear 10ms}.com-arrow-btn{position:relative;display:inline-block;vertical-align:middle;box-sizing:border-box;min-width:102px;padding-right:38px;height:28px;border:1px solid #00a4ff;text-align:center;font-size:12px;line-height:26px;color:#00a4ff;overflow:hidden;background-color:#fff}.com-arrow-btn-text{position:relative;display:block;padding:0 10px}.com-arrow-btn-text:after{content:'';position:absolute;left:100%;top:0;width:0;height:0;border-style:solid;border-width:13px 5px;border-color:transparent}.com-arrow-btn-caret{position:absolute;right:0;top:0;width:28px;padding-left:10px;height:100%;text-align:center}.com-arrow-btn-caret:before{content:'';position:absolute;right:100%;bottom:0;width:1px;height:150%;background-color:#00a4ff;-ms-transform:skewX(-20deg);-webkit-transform:skewX(-20deg);transform:skewX(-20deg);-ms-transform-origin:left bottom;-webkit-transform-origin:left bottom;transform-origin:left bottom}.com-arrow-btn-caret:after{content:'';display:inline-block;vertical-align:middle;position:relative;box-sizing:border-box;width:8px;height:8px;border-top:1px solid #00a4ff;border-right:1px solid #00a4ff;-ms-transform:rotate(45deg);transform:rotate(45deg);margin-left:-4px}.com-arrow-btn.actived .com-arrow-btn-text,.com-arrow-btn:hover .com-arrow-btn-text{background-color:rgba(0,146,238,.15)}.com-arrow-btn.actived .com-arrow-btn-text:after,.com-arrow-btn:hover .com-arrow-btn-text:after{border-color:rgba(0,146,238,.15) transparent transparent rgba(0,146,238,.15)}.com-arrow-btn.disabled,.com-arrow-btn.disabled:hover{border-color:#ddd;color:#999;cursor:default}.com-arrow-btn.disabled .com-arrow-btn-caret:before,.com-arrow-btn.disabled .com-arrow-btn-text,.com-arrow-btn.disabled:hover .com-arrow-btn-caret:before,.com-arrow-btn.disabled:hover .com-arrow-btn-text{background-color:#ddd}.com-arrow-btn.disabled .com-arrow-btn-text:after,.com-arrow-btn.disabled:hover .com-arrow-btn-text:after{border-color:#ddd transparent transparent #ddd}.com-arrow-btn.disabled .com-arrow-btn-caret:after,.com-arrow-btn.disabled:hover .com-arrow-btn-caret:after{border-top-color:#ddd;border-right-color:#ddd}.com-arrow-btn.white-hole{background-color:transparent;border-color:#fff;color:#fff}.com-arrow-btn.white-hole .com-arrow-btn-caret:before{background-color:#fff}.com-arrow-btn.white-hole .com-arrow-btn-caret:after{border-color:#fff}.com-arrow-btn.white-hole.actived,.com-arrow-btn.white-hole:hover{color:#000}.com-arrow-btn.white-hole.actived .com-arrow-btn-text,.com-arrow-btn.white-hole:hover .com-arrow-btn-text{background-color:#fff}.com-arrow-btn.white-hole.actived .com-arrow-btn-text:after,.com-arrow-btn.white-hole:hover .com-arrow-btn-text:after{border-color:#fff transparent transparent #fff}.com-arrow-btn.white-hole.disabled,.com-arrow-btn.white-hole.disabled:hover{border-color:#ddd;color:#999}.com-arrow-btn.white-hole.disabled .com-arrow-btn-caret:before,.com-arrow-btn.white-hole.disabled .com-arrow-btn-text,.com-arrow-btn.white-hole.disabled:hover .com-arrow-btn-caret:before,.com-arrow-btn.white-hole.disabled:hover .com-arrow-btn-text{background-color:#ddd}.com-arrow-btn.white-hole.disabled .com-arrow-btn-text:after,.com-arrow-btn.white-hole.disabled:hover .com-arrow-btn-text:after{border-color:#ddd transparent transparent #ddd}.com-arrow-btn.white-hole.disabled .com-arrow-btn-caret:after,.com-arrow-btn.white-hole.disabled:hover .com-arrow-btn-caret:after{border-top-color:#ddd;border-right-color:#ddd}.com-arrow-btn.primary{background-color:#fff;color:#fff}.com-arrow-btn.primary .com-arrow-btn-text{background-color:#00a4ff}.com-arrow-btn.primary .com-arrow-btn-text:after{border-color:#00a4ff transparent transparent #00a4ff}.com-arrow-btn.primary.actived,.com-arrow-btn.primary:hover{border-color:#0092EE}.com-arrow-btn.primary.actived .com-arrow-btn-text,.com-arrow-btn.primary:hover .com-arrow-btn-text{background-color:#0092EE}.com-arrow-btn.primary.actived .com-arrow-btn-text:after,.com-arrow-btn.primary:hover .com-arrow-btn-text:after{border-color:#0092EE transparent transparent #0092EE}.com-arrow-btn.primary.actived .com-arrow-btn-caret:after,.com-arrow-btn.primary:hover .com-arrow-btn-caret:after{border-top-color:#0092EE;border-right-color:#0092EE}.com-arrow-btn.primary.disabled,.com-arrow-btn.primary.disabled:hover{border-color:#ddd;color:#999;cursor:default}.com-arrow-btn.primary.disabled .com-arrow-btn-caret:before,.com-arrow-btn.primary.disabled .com-arrow-btn-text,.com-arrow-btn.primary.disabled:hover .com-arrow-btn-caret:before,.com-arrow-btn.primary.disabled:hover .com-arrow-btn-text{background-color:#ddd}.com-arrow-btn.primary.disabled .com-arrow-btn-text:after,.com-arrow-btn.primary.disabled:hover .com-arrow-btn-text:after{border-color:#ddd transparent transparent #ddd}.com-arrow-btn.primary.disabled .com-arrow-btn-caret:after,.com-arrow-btn.primary.disabled:hover .com-arrow-btn-caret:after{border-top-color:#ddd;border-right-color:#ddd}.com-arrow-btn.blue-hole{background-color:transparent}.com-arrow-btn.l{padding-right:42px;height:32px;font-size:14px;line-height:30px;min-width:190px}.com-arrow-btn.l .com-arrow-btn-text{padding:0 20px}.com-arrow-btn.l .com-arrow-btn-text:after{border-width:15px 5px}.com-arrow-btn.l .com-arrow-btn-caret{width:32px}.com-arrow-btn.l .com-arrow-btn-caret:after{width:10px;height:10px;margin-left:-5px}.com-arrow-btn.xl{padding-right:48px;height:36px;font-size:16px;line-height:34px;min-width:280px}.com-arrow-btn.xl .com-arrow-btn-text{padding:0 30px}.com-arrow-btn.xl .com-arrow-btn-text:after{border-width:17px 6px}.com-arrow-btn.xl .com-arrow-btn-caret{width:36px;padding-left:12px}.com-arrow-btn.xl .com-arrow-btn-caret:after{width:10px;height:10px;margin-left:-5px}.com-2-arrow-link{font-size:14px;color:#00a4ff;text-decoration:none}.com-2-arrow-link:hover{color:#00a4ff}.com-2-arrow-link [class*=com-i-],.com-2-arrow-link [class^=com-i-]{position:relative;top:-1px;margin-left:5px}.com-2-arrow-link.gray{color:#999}.com-2-arrow-link.gray:hover{color:#00a4ff}.com-2-arrow-link.gray:hover .com-i-arrow-circle-gray{background-image:url(sprite/base-201911131148.svg);;background-position:69.59% 59.209999999999994%;background-size:3600% 3514.2857142857147%;;background-repeat:no-repeat}.com-icon-link{font-size:14px;color:#999;text-decoration:none}.com-icon-link:hover{text-decoration:none;color:#00a4ff}.com-icon-link [class*=com-i-],.com-icon-link [class^=com-i-]{position:relative;top:-1px;margin-right:5px}.com-icon-link [class*=com-i-]:last-child,.com-icon-link [class^=com-i-]:last-child{margin-left:10px;margin-right:0}.com-icon-link.refreshing [class*=com-i-],.com-icon-link.refreshing [class^=com-i-]{-moz-animation:spin .6s infinite linear;-webkit-animation:spin .6s infinite linear;animation:spin .6s infinite linear}.com-icon-link:hover .com-i-edit-2{background-image:url(sprite/base-201911131148.svg);;background-position:37.09% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-opt-link,.com-opt-text{display:inline-block;vertical-align:middle;color:#999;font-size:12px}.com-opt-link .name,.com-opt-text .name{margin-right:5px}.com-opt-link [class*=com-i-],.com-opt-link [class^=com-i-],.com-opt-text [class*=com-i-],.com-opt-text [class^=com-i-]{position:relative;top:-1px;margin-right:5px}.com-opt-link .com-i-share:last-child,.com-opt-text .com-i-share:last-child{margin-right:0}.com-opt-text.actived,a.com-opt-link.actived,a.com-opt-link:hover{color:#00a4ff;text-decoration:none}.com-split{display:inline-block;vertical-align:middle;margin:0 15px;width:1px;height:18px;background-color:#d9d9d9;overflow:hidden}.com-split.dot{margin:0 8px;width:2px;height:2px;border-radius:50%;background:#999}.com-h-split{display:block;margin:20px auto;height:1px;border:none;background-color:#e5e5e5}a.com-opt-link:hover .com-i-share{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 0.21%;background-size:3150% 3075%;;background-repeat:no-repeat}a.com-opt-link:hover .com-i-warn{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 30.459999999999997%;background-size:3150% 3075%;;background-repeat:no-repeat}a.com-opt-link:hover .com-i-dialog{background-image:url(sprite/base-201911131148.svg);;background-position:55.53% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-opt-link.actived .com-i-edit,a.com-opt-link:hover .com-i-edit{background-image:url(sprite/base-201911131148.svg);;background-position:44.47% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}a.com-opt-link:hover .com-i-delete{background-image:url(sprite/base-201911131148.svg);;background-position:66.60000000000001% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-opt-link .com-i-like,.com-opt-text .com-i-like{top:-2px}a.com-opt-link:hover .com-i-like{background-image:url(sprite/base-201911131148.svg);;background-position:14.96% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-opt-link.actived .com-i-like,.com-opt-link.actived:hover .com-i-like,.com-opt-text.actived .com-i-like{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 90.97%;background-size:3150% 3075%;;background-repeat:no-repeat}a.com-opt-link:hover .com-i-view{background-image:url(sprite/base-201911131148.svg);;background-position:37.09% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}a.com-opt-link:hover .com-i-report{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 30.459999999999997%;background-size:3150% 3075%;;background-repeat:no-repeat}a.com-opt-link:hover .com-i-bookmark{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 0.21%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-opt-link.actived .com-i-bookmark,.com-opt-link.actived:hover .com-i-bookmark,.com-opt-link.text .com-i-bookmark{background-image:url(sprite/base-201911131148.svg);;background-position:92.42% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-opt-text.actived .com-i-adopt,a.com-opt-link.actived .com-i-adopt,a.com-opt-link.actived:hover .com-i-adopt,a.com-opt-link:hover .com-i-adopt{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 26.68%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-opt-text.actived .com-i-recommend,a.com-opt-link.actived .com-i-recommend,a.com-opt-link:hover .com-i-recommend{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 79.62%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-opt-link.dark,.com-opt-text.dark{color:#666}.com-opt-link.dark .com-i-view,.com-opt-text.dark .com-i-view{background-image:url(sprite/base-201911131148.svg);;background-position:29.709999999999997% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-opt-link.dark .com-i-report,.com-opt-text.dark .com-i-report{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 19.12%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-opt-link.darker,.com-opt-text.darker{color:#333}.com-opt-link.darker .com-i-view,.com-opt-text.darker .com-i-view{background-image:url(sprite/base-201911131148.svg);;background-position:33.4% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-opt-link.darker .com-i-like,.com-opt-text.darker .com-i-like{background-image:url(sprite/base-201911131148.svg);;background-position:7.580000000000001% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-opt-link.darker.actived .com-i-like,.com-opt-link.darker.actived:hover .com-i-like,.com-opt-text.darker.actived .com-i-like{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 90.97%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-opt-link.darker .com-i-dialog,.com-opt-text.darker .com-i-dialog{background-image:url(sprite/base-201911131148.svg);;background-position:51.839999999999996% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-opt-link.darker .com-i-share,.com-opt-text.darker .com-i-share{background-image:url(sprite/base-201911131148.svg);;background-position:88.73% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-opt-link.darker .com-i-report,.com-opt-link.darker .com-i-warn,.com-opt-text.darker .com-i-report,.com-opt-text.darker .com-i-warn{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 22.900000000000002%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-opt-link.white{color:#fff}.com-opt-link.white .com-i-share{background-image:url(sprite/base-201911131148.svg);;background-position:81.35% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-operations{position:relative;font-size:0;margin-top:15px}.com-operations .com-opt-link,.com-operations .com-opt-text{margin-right:20px}.com-operations .com-opt-link:last-child,.com-operations .com-opt-text:last-child{margin-right:0}.com-operations .extra-part{position:absolute;right:0;top:0}.com-operations .extra-part .com-opt-link,.com-operations .extra-part .com-opt-text{margin-right:0;margin-left:20px}.com-operations .com-share-options{margin-left:-10px}.com-mark-text.apply{color:#FF7800}.com-mark-text.starting{color:#00C8DC}.com-mark-text.end{color:#666}.com-mark-skew{position:relative;display:inline-block;vertical-align:middle;box-sizing:border-box;padding:0 18px;height:26px;min-width:90px;font-size:12px;line-height:26px;font-weight:500;text-align:center;color:#fff}.com-mark-skew .mark-cnt{display:block;position:relative}.com-mark-skew .mark-bg{position:absolute;left:2px;top:3px;margin-left:18px;width:calc(100% - 18px * 2);height:100%;opacity:.4}.com-mark-skew .mark-bg:after,.com-mark-skew .mark-bg:before,.com-mark-skew .mark-cnt:after,.com-mark-skew .mark-cnt:before{content:'';position:absolute;top:0;width:0;height:0;border-style:solid;border-width:13px 9px}.com-mark-skew .mark-bg:before,.com-mark-skew .mark-cnt:before{right:100%}.com-mark-skew .mark-bg:after,.com-mark-skew .mark-cnt:after{left:100%}.com-mark-skew.small{padding:0 14px;min-width:70px;height:22px;line-height:22px}.com-mark-skew.small .mark-bg{margin-left:14px;width:calc(100% - 14px * 2)}.com-mark-skew.small .mark-bg:after,.com-mark-skew.small .mark-bg:before,.com-mark-skew.small .mark-cnt:after,.com-mark-skew.small .mark-cnt:before{border-width:11px 7px}.com-mark-skew.apply .mark-bg,.com-mark-skew.apply .mark-cnt{background-color:#FF7800}.com-mark-skew.apply .mark-bg:before,.com-mark-skew.apply .mark-cnt:before{border-color:transparent #FF7800 #FF7800 transparent}.com-mark-skew.apply .mark-bg:after,.com-mark-skew.apply .mark-cnt:after{border-color:#FF7800 transparent transparent #FF7800}.com-mark-skew.starting .mark-bg,.com-mark-skew.starting .mark-cnt{background-color:#00C8DC}.com-mark-skew.starting .mark-bg:before,.com-mark-skew.starting .mark-cnt:before{border-color:transparent #00C8DC #00C8DC transparent}.com-mark-skew.starting .mark-bg:after,.com-mark-skew.starting .mark-cnt:after{border-color:#00C8DC transparent transparent #00C8DC}.com-mark-skew.end{color:#666}.com-mark-skew.end .mark-bg,.com-mark-skew.end .mark-cnt{background-color:#E1E3E9}.com-mark-skew.end .mark-bg:before,.com-mark-skew.end .mark-cnt:before{border-color:transparent #E1E3E9 #E1E3E9 transparent}.com-mark-skew.end .mark-bg:after,.com-mark-skew.end .mark-cnt:after{border-color:#E1E3E9 transparent transparent #E1E3E9}.com-mark-rec{display:inline-block;vertical-align:middle;padding:0 10px;height:24px;font-size:12px;line-height:24px;text-align:center;color:#fff;background-color:#FF7800}.com-mark-triangle{display:inline-block;vertical-align:middle;position:relative;width:46px;height:46px;font-size:12px;line-height:18px;color:#fff}.com-mark-triangle:before{content:'';position:absolute;left:0;top:0;width:0;height:0;border-style:solid;border-color:transparent;border-width:20px}.com-mark-triangle.hot:before{border-color:#FF7800 transparent transparent #FF7800}.com-mark-triangle.new:before{border-color:#00a4ff transparent transparent #00a4ff}.com-mark-triangle .mark-cnt{position:absolute;left:0;top:50%;z-index:2;margin-top:-17px;margin-left:-10px;width:100%;text-align:center;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.com-tag-v2-list{font-size:0;margin-bottom:-10px}.com-tag-v2{box-sizing:border-box;display:inline-block;vertical-align:middle;margin-right:10px;margin-bottom:10px;max-width:calc(100% - 10px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:0 5px;height:18px;font-size:12px;line-height:16px;border-radius:2px;border:1px solid #ddd;color:#666;background-color:#fff}a.com-tag-v2:hover{border-color:#FE7902;background-color:#FAECE0;color:#FE7902}.com-tag-v2-list.highlight .com-tag-v2{border-color:transparent;background-color:#FAECE0;color:#FE7902}.com-tag-v2-list.highlight a.com-tag-v2:hover{border-color:#FE7902;background-color:#FAECE0;color:#FE7902}.com-tag-v2-list.gray .com-tag-v2{border-color:transparent;background-color:#F3F5F9;color:#333}.com-tag-v2-list.gray a.com-tag-v2:hover{border-color:transparent;background-color:#d2d9e7}.com-tag-v2-list.gray .com-tag-v2.disabled,.com-tag-v2-list.gray .com-tag-v2.disabled:hover{color:#999;background-color:#F3F5F9;cursor:not-allowed}.com-tag-v2-list.gray .com-tag-v2.actived,.com-tag-v2-list.gray .com-tag-v2.actived:hover{background-color:#00a4ff;color:#fff}.com-tag-v2.hole{background-color:transparent}.com-tag-v2-list.large>li{display:inline-block;vertical-align:middle;max-width:100%}.com-tag-v2-list.large .com-tag-v2{padding:0 10px;height:26px;font-size:12px;line-height:24px;max-width:none;display:block}.com-tag-v2-list.large .com-tag-v2-icon{position:relative;top:-1px;vertical-align:middle;width:16px;height:16px;margin-right:10px;margin-left:-6px}.com-tag-v2-list.large.in-side{margin-bottom:0;padding:15px 0 5px;border-bottom:1px solid #E1E3E9}.com-thumbnail{display:block;width:236px;height:177px;background-size:cover;background-repeat:no-repeat;background-position:center}.com-2-avatar{display:inline-block;vertical-align:middle;position:relative;width:28px;height:28px}.com-2-avatar-inner{box-sizing:border-box;display:block;width:100%;height:100%;border-radius:50% 50% 50% 0;border:1px solid #e5e8ed;background-color:#E5EEF8;background-position:center;background-size:cover;background-repeat:no-repeat;text-align:center;font-size:14px;line-height:26px;overflow:hidden}.com-2-avatar .com-2-level-bubble-trigger{position:absolute;right:0;bottom:0}.com-2-avatar.large{width:42px;height:42px}.com-2-avatar.large .com-2-avatar-inner{font-size:20px;line-height:40px}.com-2-avatar.xlarge{width:90px;height:90px}.com-2-avatar.xlarge .com-2-avatar-inner{font-size:44px;line-height:88px}.com-2-avatar.xxlarge{width:120px;height:120px}.com-2-avatar.xxlarge .com-2-avatar-inner{font-size:58px;line-height:118px}.com-2-avatar.font-color .com-2-avatar-inner{border-color:#E1E3E9;background-color:#F0F5FF}.com-2-avatar.bg-color .com-2-avatar-inner{border-color:transparent;color:#fff}.com-2-avatars{font-size:0}.com-2-avatars .com-2-avatar{margin-right:5px}.com-2-avatars .com-2-avatar:last-child{margin-right:0}.com-2-avatars-group{font-size:0}.com-2-avatars-group .com-2-avatars{display:inline-block;vertical-align:middle}.com-2-avatars-group .com-2-avatar{margin-right:2px}.com-2-avatars-group .group-text{display:inline-block;vertical-align:middle;margin-left:10px;font-size:14px;line-height:28px;color:#999}.com-2-avatars-group .group-text em{font-weight:400}.com-2-level{display:inline-block;vertical-align:middle;box-sizing:border-box;width:30px;height:30px;border:2px solid #fff;border-radius:50%;background-color:#FF7800;font-size:12px;text-align:center;line-height:26px;color:#fff;font-family:Helvetica,Arial,sans-serif;font-style:oblique;font-weight:700}.com-2-level .text{position:relative;top:1px;display:block;-ms-transform:scale(.8);-webkit-transform:scale(.8);transform:scale(.8)}.com-2-level.skin-2{width:auto;height:18px;border:none;border-radius:9px;padding:0 5px;font-size:14px;line-height:18px;font-weight:700;font-style:normal}.com-2-level.skin-2 .text{top:0;-ms-transform:none;-webkit-transform:none;transform:none}.com-2-level-bubble .c-bubble-inner{padding:0;width:342px}.com-2-level-bubble.c-bubble-top .c-bubble-inner:after{border-bottom-color:#F3F5F9}.com-2-level-bubble-hd{padding:18px 30px 16px;background-color:#F3F5F9;font-size:14px;line-height:28px}.com-2-level-bubble-hd .user-level{float:left;margin-bottom:10px;color:#333}.com-2-level-bubble-hd .com-2-level{position:relative;top:-1px;margin-left:5px}.com-2-level-bubble-hd .user-extra{float:right;color:#999}.com-2-level-bubble-hd .user-extra strong{margin:0 5px;color:#00a4ff;font-weight:500}.com-2-level-bubble-hd .com-2-process{clear:both}.com-2-level-bubble-bd{padding:20px 30px;font-size:14px;line-height:20px;color:#000}.com-2-level-bubble-disorder{margin-top:15px;font-size:14px;line-height:26px;color:#666}.com-2-level-bubble-disorder a{position:relative;display:inline-block;vertical-align:middle;padding-left:13px;color:inherit}.com-2-level-bubble-disorder a:hover{color:#00a4ff}.com-2-level-bubble-disorder a:before{content:'';position:absolute;left:0;top:11px;width:4px;height:4px;background-color:#666;border-radius:50%}.com-2-level-bubble-disorder a:hover:before{background-color:#00a4ff}.com-2-level-bubble-ft{padding:0 30px 18px;text-align:center}.com-2-level-bubble-trigger>.c-bubble-bottom,.com-2-level-bubble-trigger>.c-bubble-top{left:-75px;margin-left:0}.com-2-process{position:relative;display:block;box-sizing:border-box;height:16px;border-radius:8px;border:1px solid #00a4ff;font-size:12px;line-height:14px;font-family:Helvetica,Arial,sans-serif;color:#00a4ff}.com-2-process .process-bar{display:block;position:relative;background-color:#00a4ff;height:100%;border-radius:14px;min-width:15px}.com-2-process .process-bar-icon{position:absolute;right:2px;top:1px;width:12px;height:12px;background-color:#fff;border-radius:50%;text-align:center;line-height:12px}.com-2-process .process-bar-icon:before{content:'';position:relative;top:-1px;display:inline-block;vertical-align:middle;box-sizing:border-box;height:7px;width:5px;border-right:2px solid #00a4ff;border-bottom:2px solid #00a4ff;transform:rotate(45deg)}.com-2-process .process-text{position:absolute;right:3px;top:0}.com-2-process.left .process-text{left:5px;right:auto;color:#fff}.com-2-process.ant .process-bar,.com-2-process.ant .process-text{transition:all .3s ease-in-out}.com-datas>.com-split{display:none}.com-data:before{content:'';position:relative;top:-1px;display:inline-block;vertical-align:middle;overflow:hidden;margin:0 8px;width:2px;height:2px;border-radius:50%;background:#999}.com-data:first-child:before{display:none}.com-datas.dark{color:#333}.com-datas.dark .com-data:before{background-color:#333}.com-icon-datas{font-size:0}.com-icon-data{display:inline-block;vertical-align:middle;margin-right:15px;font-size:14px;line-height:24px;color:#333}.com-icon-data:last-child{margin-right:0}.com-icon-data [class*=com-i-],.com-icon-data [class^=com-i-]{position:relative;top:-1px;margin-right:5px}.com-icon-data a{display:inline-block;color:inherit}.com-icon-data a:hover{color:#00a4ff}.com-icon-datas.vertical .com-icon-data{position:relative;display:block;margin-right:0;margin-bottom:10px;padding-left:24px}.com-icon-datas.vertical .com-icon-data:last-child{margin-bottom:0}.com-icon-datas.vertical [class*=com-i-],.com-icon-datas.vertical [class^=com-i-]{position:absolute;left:0;top:4px}.com-icon-datas.dark .com-i-time{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 83.39999999999999%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-icon-datas.dark .com-i-address{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 26.68%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-vertical-datas{display:table;width:100%}.com-vertical-data{display:table-cell;vertical-align:top;width:50%;white-space:nowrap;color:#999}.com-vertical-data:last-child{width:1px}.com-vertical-data .data-inner{display:inline-block;vertical-align:middle;max-width:100%;text-align:center;color:inherit;text-decoration:none}.com-vertical-data a.data-inner:hover{color:inherit;text-decoration:none}.com-vertical-data .data-name{font-size:12px;line-height:18px;font-weight:400}.com-vertical-data .data-num{font-size:18px;line-height:26px;height:26px;font-weight:400}.com-emblem-list{margin-top:20px;font-size:0}.com-emblem-list>li{display:inline-block;vertical-align:middle;margin:0 5px;line-height:16px}.com-emblem .c-bubble a{color:#00a4ff}.com-emblem .c-bubble a:hover{text-decoration:underline}.com-emblem-list.inline{margin-top:0;display:inline-block;vertical-align:middle}.com-emblem-list.inline>li{margin-left:0;margin-right:5px}.com-emblem-list.inline>li:last-child{margin-right:0}.com-emblem-list .c-bubble-trigger:hover>a{position:relative;z-index:901}.com-emblem-icon{display:inline-block;vertical-align:middle;width:20px;height:20px;background-size:100% auto}.com-emblem-icon.translate{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 56.93%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-emblem-icon.article{background-image:url(sprite/base-201911131148.svg);;background-position:22.34% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-emblem-icon.column{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 41.81%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-emblem-icon.propagandist{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 64.5%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-emblem-icon.evangelist{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 53.15%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-emblem-icon.microapp{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 72.06%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-emblem-icon.authorship{background-image:url(sprite/base-201911131148.svg);;background-position:26.02% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-emblem-icon.medal-gold{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 83.39999999999999%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-emblem-icon.medal-silver{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 79.62%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-emblem-icon.medal-bronze{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 87.18%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-emblem-icon.tvp{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 49.370000000000005%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-emblem.disabled .com-emblem-icon.translate{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 60.709999999999994%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-emblem.disabled .com-emblem-icon.article{background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 87.18%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-emblem.disabled .com-emblem-icon.column{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 38.03%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-emblem.disabled .com-emblem-icon.propagandist{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 68.28%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-emblem.disabled .com-emblem-icon.evangelist{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 45.59%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-emblem.disabled .com-emblem-icon.microapp{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 75.84%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-emblem.disabled .com-emblem-icon.authorship{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 11.55%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-emblem.disabled .com-emblem-icon.medal-bronze,.com-emblem.disabled .com-emblem-icon.medal-gold,.com-emblem.disabled .com-emblem-icon.medal-silver{background-image:url(sprite/base-201911131148.svg);;background-position:99.8% 90.97%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-2-tag-panel{position:relative;box-sizing:border-box;height:93px;padding:20px 15px;border:1px solid #E1E3E9;background-color:#fff}.com-2-tag-panel .panel-link{position:absolute;left:0;top:0;width:100%;height:100%}.com-2-tag-panel-title{max-width:100%;position:relative;font-weight:400}.com-2-tag-panel-title .title-cnt{display:block;font-size:16px;line-height:22px;color:#000;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-tag-panel-title .title-icon{position:relative;top:-1px;vertical-align:middle;width:22px;height:22px;margin-right:10px}.com-2-tag-panel-infos{margin-top:12px}.com-2-tag-panel-infos .com-data:before{margin:0 6px}.com-2-tag-panel .com-tag-bubble.c-bubble{left:0;margin-left:0}.com-2-tag-panels{font-size:0}.com-2-tag-panels>.panel-cell{display:inline-block;vertical-align:middle;margin-right:15px;margin-bottom:15px;width:calc((100% - 15px * 2)/ 3)}.com-2-tag-panels>.panel-cell:nth-child(3n){margin-right:0}.com-tag-bubble.c-bubble-top .c-bubble-inner,.com-tag-bubble.c-bubble-top .com-tooltip-inner{left:30px}.com-tag-bubble .c-bubble-inner,.com-tag-bubble .com-tooltip-inner{width:330px;padding:30px 25px}.com-tag-bubble-title{font-size:16px;line-height:22px;color:#000;font-weight:500}.com-tag-bubble-desc{margin-top:15px;font-size:14px;line-height:24px;color:#999}.com-tag-bubble .com-datas{margin-top:15px}.com-tag-bubble-btns{margin-top:22px;font-size:0}.com-tag-bubble-btns .c-btn{padding:0 10px;min-width:70px;font-size:12px;line-height:26px;height:28px}.com-tag-bubble-btns .followed-num{margin-left:20px;font-size:14px;line-height:20px;color:#999}.com-2-section+.com-2-section{margin-top:40px}.com-2-section-hd{position:relative;padding-bottom:10px;border-bottom:1px solid #e5e8ed;font-size:0;line-height:30px}.com-2-section-hd:before{content:'';position:absolute;left:0;bottom:-1px;width:80px;height:1px;background-color:#00a4ff}.com-2-section-title{position:relative;display:inline-block;vertical-align:middle;padding-left:38px;height:28px;font-size:20px;line-height:28px;font-weight:400;color:#333;-webkit-font-smoothing:antialiased}.com-2-section-title.without-icon{padding-left:0}.com-2-section-title-icon{position:absolute;left:0;top:0;width:28px;height:28px}.com-2-section-title-icon.article{background-image:url(sprite/base-201911131148.svg);;background-position:69.54% 78.23%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-2-section-title-icon.column{background-image:url(sprite/base-201911131148.svg);;background-position:75.84% 71.77%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-2-section-title-icon.salon{background-image:url(sprite/base-201911131148.svg);;background-position:82.56% 6.68%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-2-section-title-icon.calendar{background-image:url(sprite/base-201911131148.svg);;background-position:6.510000000000001% 78.23%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-2-section-title-icon.specialist{background-image:url(sprite/base-201911131148.svg);;background-position:63.239999999999995% 71.77%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-2-section-title-icon.activities{background-image:url(sprite/base-201911131148.svg);;background-position:75.84% 78.23%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-2-section-title-icon.special{background-image:url(sprite/base-201911131148.svg);;background-position:44.330000000000005% 78.23%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-2-section-title-icon.news{background-image:url(sprite/base-201911131148.svg);;background-position:50.629999999999995% 71.77%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-2-section-title-icon.team{background-image:url(sprite/base-201911131148.svg);;background-position:0.21% 71.77%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-2-section-title-icon.team-article{background-image:url(sprite/base-201911131148.svg);;background-position:56.93% 71.77%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-2-section-title-icon.ask{background-image:url(sprite/base-201911131148.svg);;background-position:56.93% 78.23%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-2-section-title-icon.ask-team{background-image:url(sprite/base-201911131148.svg);;background-position:12.82% 78.23%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-2-section-title-icon.dev{background-image:url(sprite/base-201911131148.svg);;background-position:25.419999999999998% 71.77%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-2-section-title-icon.contributor{background-image:url(sprite/base-201911131148.svg);;background-position:38.03% 71.77%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-2-section-title-icon.product{background-image:url(sprite/base-201911131148.svg);;background-position:6.510000000000001% 71.77%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-2-section-hd-extra{position:absolute;right:0;top:0}.com-2-section-hd .com-2-arrow-link{display:inline-block;margin-left:20px;line-height:30px;vertical-align:middle}.com-2-section-hd .com-icon-link{margin-left:20px;line-height:30px;vertical-align:middle}.com-2-section-tab{position:absolute;left:0;bottom:-1px;width:100%;text-align:center;font-size:0}.com-2-section-tab-item{display:inline-block;vertical-align:middle;margin:0 15px}.com-2-section-tab-item a{display:block;box-sizing:border-box;padding:0 30px 1px;font-size:16px;line-height:38px;color:#999;border-bottom:2px solid transparent}.com-2-section-tab-item a:hover{color:#00a4ff}.com-2-section-tab-item.actived a{color:#00a4ff;border-bottom-color:#00a4ff;cursor:default}.com-2-section.without-border .com-2-section-hd{border-bottom:none}.com-2-section.without-border .com-2-section-hd:before{display:none}.com-2-section-hd .com-nav-Links{position:relative;display:inline-block;vertical-align:middle;margin-left:20px;padding-left:20px}.com-2-section-hd .com-nav-Links:before{content:'';position:absolute;left:0;top:50%;margin-top:-8px;width:1px;height:16px;background-color:#D2D9E7}.com-2-section-hd.control-bar{cursor:pointer}.com-2-section-hd.control-bar:after{content:'';position:absolute;right:0;top:11px;width:12px;height:7px;background-image:url(sprite/base-201911131148.svg);;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;-webkit-transform:rotate3d(0,0,1,-180deg);transform:rotate3d(0,0,1,-180deg);background-position:70.12% 28.87%;background-size:4200% 7028.571428571429%;;background-repeat:no-repeat}.com-2-section-hd.control-bar:hover:after{background-image:url(sprite/base-201911131148.svg);;background-position:95.33% 92.99%;background-size:4200% 7028.571428571429%;;background-repeat:no-repeat}.com-2-section-hd.hide:after{-webkit-transform:rotate3d(0,0,1,0);transform:rotate3d(0,0,1,0)}.com-2-section-hd.hide+.com-2-section-bd{display:none}.com-2-section.pt .com-2-section-bd{padding-top:30px}.comp-section-user .com-2-section-bd{padding-top:20px}.comp-section-ask .com-2-section-hd{padding-bottom:10px}.com-2-layout{display:table;table-layout:fixed;margin-bottom:60px;box-sizing:border-box;width:100%}.com-2-layout>.layout-main{display:table-cell;vertical-align:top;padding-left:50px}.com-2-layout>.layout-main:first-child{padding-right:50px;padding-left:0}.com-2-layout>.layout-side{display:table-cell;vertical-align:top;width:330px}.com-widget-global{position:fixed;right:40px;bottom:60px;z-index:300;width:46px;padding-bottom:50px}.com-widget-global .widget-btn{box-sizing:border-box;margin-top:-1px;width:46px;height:44px;border:1px solid #D2D9E7;text-align:center;background-color:#fff;font-size:12px;line-height:42px;color:#999}.com-widget-global .widget-btn:hover{color:#999;background-color:#F3F5F9}.com-widget-global .widget-btn:first-child{margin-top:0}.com-widget-global .widget-btn.actived,.com-widget-global .widget-btn.actived:hover{background-color:#F3F5F9;color:#00a4ff;cursor:default}.com-widget-global .com-widget-qr{margin-top:-1px}.com-widget-global .widget-back2top{position:absolute;left:0;bottom:0;font-size:0;border-color:transparent;background-color:#F3F5F9;transition:all .2s ease-in-out}.com-widget-global .widget-back2top:hover{background-color:#e1eefa}.com-widget-global .widget-back2top:before{content:'';display:inline-block;vertical-align:middle;width:22px;height:12px;background-image:url(sprite/base-201911131148.svg);;background-position:87.76% 20.21%;background-size:2290.909090909091% 4100%;;background-repeat:no-repeat}.com-widget-global .com-widget-qr .c-bubble-inner{margin-top:-15px}.com-widget-global .widget-navs-wrap{position:relative;background-color:#fff}.com-widget-global .widget-navs-wrap .widget-navs{position:absolute;left:0;bottom:0;width:100%}.com-widget-global .widget-navs{position:relative;z-index:1;transition:opacity .3s linear;transition-delay:.1s}.com-widget-global .widget-btn.collapse-btn{margin-top:0;opacity:0;transition:opacity .3s linear;transition-delay:.1s}.com-widget-global .widget-btn.collapse-btn .btn-text{position:relative;top:2px;display:inline-block;vertical-align:middle;line-height:24px}.com-widget-global .widget-btn.collapse-btn .btn-text:before{content:'';display:block;margin:0 auto;width:0;height:0;border-style:solid;border-width:0 4px 5px;border-color:#999 transparent}.widget-navs-wrap.collapsed{overflow:hidden}.widget-navs-wrap.collapsed .widget-navs{opacity:0}.widget-navs-wrap.collapsed .widget-btn.collapse-btn{opacity:1}.widget-navs-wrap.collapsed:hover{overflow:visible}.widget-navs-wrap.collapsed:hover .widget-navs{opacity:1}.widget-navs-wrap.collapsed:hover .widget-btn.collapse-btn{opacity:0}.com-widget-global.has-share .com-widget-qr{margin-top:4px}.com-widget-global.has-share .com-widget-qr .scan-btn{border-color:transparent}.com-widget-global .com-widget-shares{position:relative;background-color:#fff}.com-widget-global .com-widget-shares .shares-wrap{position:absolute;left:0;bottom:0;width:100%}.com-widget-global .shares-wrap{position:relative;z-index:1;transition:opacity .3s linear;transition-delay:.1s}.com-widget-shares.collapsed{overflow:hidden}.com-widget-shares.collapsed .shares-wrap{opacity:0}.com-widget-shares.collapsed .widget-btn.collapse-btn{opacity:1}.com-widget-shares.collapsed:hover{overflow:visible}.com-widget-shares.collapsed:hover .shares-wrap{opacity:1}.com-widget-shares.collapsed:hover .widget-btn.collapse-btn{opacity:0}.com-mark-hero{display:inline-block;vertical-align:middle;padding:0 5px;height:20px;font-size:12px;line-height:20px;background-color:#00A4FF;border-radius:2px;color:#fff}.com-2-footer{background:#2e3033;box-sizing:border-box}.com-2-footer-inner{box-sizing:border-box;margin:0 auto;max-width:1200px;padding:0 10px;-webkit-font-smoothing:antialiased}.com-2-footer.large-width .com-2-footer-inner{max-width:1440px}.com-2-footer-main{padding:40px 0 32px}.com-2-footer-main-ctn{position:relative}.com-2-footer-main-inner{display:table;width:100%;table-layout:fixed;box-sizing:border-box}.com-2-footer-website{display:table-cell;vertical-align:top;margin-right:0}.com-2-footer-website-group{font-size:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%}.com-2-footer-website-group .com-2-footer-website-column{display:inline-block;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:14px;vertical-align:top;width:25%;padding-left:0;padding-right:20px}.com-2-footer-website-title{margin-bottom:22px;font-weight:400;line-height:22px;font-size:16px;color:#fff}.com-2-footer-website-title a{display:inline-block;vertical-align:top;max-width:100%;color:#fff}.com-2-footer-website-list{margin-top:15px}.com-2-footer-website-item a{display:inline-block;vertical-align:top;max-width:100%;padding:5px 0;font-size:12px;line-height:18px;color:#999}.com-2-footer-website-item a:hover{color:#00a4ff}.com-2-footer-copyright{display:table-cell;vertical-align:top;width:120px;box-sizing:border-box}.com-2-footer-copyright-title{font-size:16px;line-height:22px;color:#fff;font-weight:400;margin-bottom:28px}.com-2-footer-copyright-text{margin-top:10px;line-height:20px;font-size:12px;color:#ccc}.com-2-footer-copyright-text a{color:inherit}.com-2-footer-copyright-text a:hover{color:#00a4ff}.com-2-footer-copyright-text span{display:block}.com-2-footer-logo{margin-bottom:20px}.com-2-footer-logo .com-2-footer-logo-icon{display:block;width:74px;height:19px;background-image:url(sprite/base-201911131148.svg);;background-position:0.22999999999999998% 9.73%;background-size:681.081081081081% 2589.4736842105262%;;background-repeat:no-repeat}.com-2-footer-qr-object{margin-bottom:10px;width:90px;height:90px;box-sizing:border-box;border:7px solid #fff}.com-2-footer .com-2-footer-qr-image{display:block;width:100%;height:100%}.com-2-footer-qr-info{white-space:nowrap}.com-2-footer-qr-text{line-height:18px;font-size:12px;color:#fff}.com-2-footer-copyright-cnt{padding:0 20px;font-size:12px;line-height:20px;color:#999;text-align:center}.com-2-footer-copyright-cnt .com-2-footer-inner{border-top:1px solid #45484c;padding:20px 0;max-width:1180px}.com-2-footer-copyright-cnt a{color:inherit}.com-2-footer-copyright-cnt a:hover{color:#00a4ff}.com-2-footer-recommend{background:#2e3033}.com-2-footer-recommend-rows{padding:30px 0;border-top:1px solid #45484c}.com-2-footer-recommend-cell{position:relative;padding-left:100px;min-height:14px}.com-2-footer-recommend-cell+.com-2-footer-recommend-cell{margin-top:15px}.com-2-footer-recommend-tit{position:absolute;left:0;top:0;width:100px;line-height:14px;font-size:14px;color:#FFF;font-weight:400;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.com-2-footer-recommend-list-wrap{padding-left:20px;overflow:hidden}.com-2-footer-recommend-list{margin-left:-10px;margin-right:-10px;margin-bottom:-15px;font-size:0}.com-2-footer-recommend-item{display:inline-block;vertical-align:top;margin-bottom:15px;padding:0 10px;width:100px}.com-2-footer-recommend-link{line-height:14px;font-size:12px;color:#999}.com-2-footer-recommend-link:hover{color:#00a4ff}.com-loading-placeholder{display:block;position:relative;height:300px;background-color:#F3F5F9;font-size:0;line-height:30px;text-align:center;color:#999}.com-loading-placeholder .placeholder-text{position:absolute;left:0;top:50%;width:100%;margin-top:-22px;opacity:.5}.com-loading-placeholder .placeholder-text:before{content:'';display:inline-block;vertical-align:middle;width:60px;height:44px;background-image:url(sprite/base-201911131148.svg);;background-size:1680% 2236.3636363636365%;;background-position:75.74% 64.89%;background-repeat:no-repeat}.com-loading-placeholder.small{height:88px;background-color:transparent;border-bottom:1px solid #eee}.com-loading-placeholder.small .placeholder-text{margin-top:-11px}.com-loading-placeholder.small .placeholder-text:before{width:30px;height:22px}.com-growup-mod{padding-top:55px;min-width:430px}.com-growup-mod-tit{font-size:20px;line-height:23px;color:#000;text-align:center}.com-growup-mod-con{text-align:center;margin-top:20px}.com-growup-mod-lv{display:inline-block;font-size:16px;line-height:22px;color:#00a4ff;vertical-align:middle;width:30px}.com-growup-data-list{border-top:#e5e5e5 1px solid;border-bottom:#e5e5e5 1px solid;max-width:320px;margin:30px auto 0;padding:5px 0 15px}.com-growup-data-item{position:relative;padding-left:15px;margin-top:10px}.com-growup-data-item:after{content:'';position:absolute;width:4px;height:4px;border-radius:3px;background:#00a4ff;left:0;top:7px}.com-growup-data-item-txt{color:#666}.com-growup-data-item-em{position:absolute;right:0;top:0;color:#ff7800}.com-growup-data-after{padding:20px 0;text-align:center}.com-growup-data-after a{color:#9c9c9c}.com-growup-data-after a:hover{color:#00a4ff}.com-growup-mod-bar{display:inline-block;vertical-align:middle;margin:0 10px;background-color:#e6e6e6;width:240px;height:16px;border-radius:8px;position:relative}.com-growup-mod-bar-inner{position:absolute;height:100%;background-color:#00a4ff;border-radius:8px;left:0;top:0}.com-growup-mod-num{color:#fff;background-color:#57C2FA;position:absolute;right:-10px;animation:com-growup-mod-num-up 3s ease-in;animation-fill-mode:forwards;animation-delay:.2s;top:0;opacity:0;box-sizing:border-box;padding:2px 10px}.com-growup-mod-num:after{content:'';width:0;height:0;border:8px solid transparent;border-top:#57C2FA 8px solid;position:absolute;bottom:-12px;left:50%;margin-left:-6px}@keyframes com-growup-mod-num-up{10%,50%{top:-30px;opacity:1}100%{top:-30px;opacity:0}}.com-growup-mod-animate{height:100%;width:0;position:absolute;left:0;top:0;background:linear-gradient(to right,#00a4ff,#0ee1eb);animation:com-growup-mod-animate-bar .2s ease-out;animation-fill-mode:forwards;animation-delay:0s;border-radius:8px}@keyframes com-growup-mod-animate-bar{to{width:100%}}.com-crumb{margin-top:30px;margin-bottom:30px;font-size:0}.com-crumb .crumb-item{display:inline-block;vertical-align:middle;font-size:14px;color:#333}.com-crumb .crumb-item:hover{color:#00a4ff}.com-crumb .crumb-item.current,.com-crumb .crumb-item.current:hover{color:#999}.com-crumb .crumb-split{display:inline-block;vertical-align:middle;margin:0 5px;width:16px;height:16px;background-image:url(sprite/base-201911131148.svg);;background-position:70.28999999999999% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-crumb.no-pb .com-inner,.com-crumb.no-pd .com-inner{padding-left:0;padding-right:0}.com-2-simple-footer{box-sizing:border-box;min-width:1000px;background-color:#F7F8FA;font-size:12px;line-height:22px;color:#999;padding:0 10px}.com-2-simple-footer-inner{position:relative;box-sizing:border-box;margin:0 auto;padding:15px 10px;max-width:1200px}.com-2-simple-footer .footer-link{color:#999;text-decoration:none}.com-2-simple-footer .footer-link:hover{color:#00a4ff}.com-2-simple-footer .footer-link+.footer-link{margin-left:10px}.com-2-simple-footer-extra{position:absolute;right:10px;top:50%;margin-top:-18px}.com-2-simple-footer-select{position:relative;display:inline-block;vertical-align:middle}.com-2-simple-footer-select-trigger{box-sizing:border-box;display:block;padding:0 30px 0 9px;width:190px;height:36px;border-radius:2px;border:1px solid #E5E5E5;background-color:transparent;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:12px;line-height:34px;color:#999;cursor:pointer}.com-2-simple-footer-select-trigger:after{content:'';position:absolute;right:10px;top:50%;margin-top:-2px;width:0;height:0;border-style:solid;border-width:4px 4px 0;border-color:#999 transparent;-webkit-transition:transform .2s ease,-webkit-transform .2s ease;transition:transform .2s ease,-webkit-transform .2s ease}.com-2-simple-footer-select-trigger .icon{position:relative;top:-1px;display:inline-block;vertical-align:middle;margin-right:5px;width:16px;height:16px;background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 38.03%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-2-simple-footer-select .com-2-simple-footer-dropdown{display:none}.com-2-simple-footer-select.hover .com-2-simple-footer-dropdown,.com-2-simple-footer-select:hover .com-2-simple-footer-dropdown{display:block}.com-2-simple-footer-select.hover .com-2-simple-footer-select-trigger:after,.com-2-simple-footer-select:hover .com-2-simple-footer-select-trigger:after{transform:rotate(180deg)}.com-2-simple-footer-dropdown{box-sizing:border-box;position:absolute;left:0;bottom:100%;z-index:999;padding-bottom:4px;width:100%}.com-2-simple-footer-dropdown-menu{background-color:#fff;border-radius:2px;padding:5px 0;border:1px solid #e5e5e5}.com-2-simple-footer-dropdown-menu a{display:block;padding:0 10px;height:30px;font-size:14px;line-height:30px;color:#999}.com-2-simple-footer-dropdown-menu a:hover{color:#00a4ff}.com-2-simple-footer-dropdown-menu .actived a,.com-2-simple-footer-dropdown-menu .actived a:hover{color:#00a4ff;cursor:default}.com-2-simple-footer.layout{position:relative;background-color:#F3F5F9;padding:0}.com-2-simple-footer.layout:before{content:'';position:absolute;left:50%;right:0;top:0;height:100%;background-color:#F7F8FA}.com-2-simple-footer.layout .com-2-simple-footer-inner{padding-left:30px;background-color:#F7F8FA}.com-2-simple-footer.layout .com-2-simple-footer-copyright{margin-left:200px}.com-none-panel{text-align:center}.com-none-panel+.com-none-panel{margin-top:50px;padding-top:50px;border-top:1px solid #d8d8d8}.com-none-panel-icon{display:inline-block;vertical-align:middle;margin-bottom:10px;width:169px;height:94px;background-image:url(components/NonePanel/css/img/tag-img.svg);background-repeat:no-repeat;background-size:100% auto}.com-none-panel-icon.error{width:248px;height:180px;background-image:url(components/NonePanel/css/img/icon-error.svg)}.com-none-panel-icon.search{width:220px;height:220px;background-image:url(components/NonePanel/css/img/icon-search.svg)}.com-none-panel-icon.column{width:220px;height:220px;background-image:url(components/NonePanel/css/img/icon-column.svg)}.com-none-panel-icon.network{width:220px;height:220px;background-image:url(components/NonePanel/css/img/icon-network.svg)}.com-none-panel-title{margin-bottom:8px;font-size:16px;line-height:22px;font-weight:400;color:#000}.com-none-panel-desc{font-size:14px;line-height:24px;color:#999}.com-none-panel-btns{margin-top:30px}.com-none-panel-btns .c-btn{margin:0 5px;min-width:160px;height:36px;line-height:34px;vertical-align:middle;font-size:14px}.com-none-panel-btns .com-arrow-btn{margin:0 5px;min-width:160px;padding-right:48px;height:36px;font-size:16px;line-height:34px}.com-none-panel-btns .com-arrow-btn .com-arrow-btn-text{padding:0 30px}.com-none-panel-btns .com-arrow-btn .com-arrow-btn-text:after{border-width:17px 6px}.com-none-panel-btns .com-arrow-btn .com-arrow-btn-caret{width:36px;padding-left:12px}.com-none-panel-btns .com-arrow-btn .com-arrow-btn-caret:after{width:10px;height:10px;margin-left:-5px}.com-none-panel-link{margin:0 5px;color:#00a4ff}.com-none-panel-link:after{content:'';display:inline-block;vertical-align:-2px;margin-left:5px;width:7px;height:13px;overflow:hidden;background-image:url(sprite/base-201911131148.svg);;-webkit-transition:-webkit-transform .4s;transition:-webkit-transform .4s;transition:transform .4s;transition:transform .4s,-webkit-transform .4s;background-position:68.61% 66.18%;background-size:7200% 3784.6153846153848%;;background-repeat:no-repeat}.com-none-panel-pre{border-top:1px dashed #e5e5e5;margin-top:30px;padding-top:15px;text-align:left;color:#666;word-break:break-all;white-space:pre-wrap;overflow:auto}.com-none-panel.page{margin:0 auto;padding:120px 0;max-width:730px}.com-none-panel.page+.com-none-panel.page{border-top:1px solid #D8D8D8}.com-none-panel.page .com-none-panel-icon{margin-bottom:20px}.com-none-panel-icon[class*=error-],.com-none-panel-icon[class^=error-]{width:560px;height:250px}.com-none-panel-icon.error-404{background-image:url(components/NonePanel/css/img/icon-404.svg)}.com-none-panel-icon.error-503{background-image:url(components/NonePanel/css/img/icon-503.svg)}.com-none-panel-icon.error-504{background-image:url(components/NonePanel/css/img/icon-504.svg)}.com-none-panel-icon.error-403{background-image:url(components/NonePanel/css/img/icon-403.svg)}.com-none-panel-icon.error-500{background-image:url(components/NonePanel/css/img/icon-500.svg)}.com-none-panel.page .com-none-panel-title{margin-bottom:20px}.com-none-panel.page .com-none-panel-btns{margin-top:40px}.com-widget-operations{position:fixed;top:154px;margin-left:-97px;text-align:center;width:46px;z-index:300}.com-widget-operations .main-cnt{margin-bottom:30px}.com-widget-operations .link-bookmark,.com-widget-operations .link-like{position:relative;display:block;box-sizing:border-box;margin:0 auto 14px;width:40px;height:40px;border:1px solid #00a4ff;line-height:38px;text-align:center;border-radius:50%}.com-widget-operations .link-bookmark{border:none;line-height:40px}.com-widget-operations .link-like .com-i-like,.com-widget-operations .link-like:hover .com-i-like{margin-right:0;width:18px;height:18px;background-image:url(sprite/base-201911131148.svg);;background-position:11.27% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-widget-operations .link-like.actived .com-i-like,.com-widget-operations .link-like.actived:hover .com-i-like{background-image:url(sprite/base-201911131148.svg);;background-position:0.2% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-widget-operations .link-bookmark .text,.com-widget-operations .link-like .text{position:absolute;left:24px;top:-3px;padding:0 5px;height:16px;border-radius:8px;background-color:#00a4ff;font-size:12px;line-height:16px;text-align:center;color:#fff;font-weight:600}.com-widget-operations .link-bookmark .com-i-bookmark,.com-widget-operations .link-bookmark:hover .com-i-bookmark{margin-right:0;width:40px;height:40px;background-image:url(sprite/base-201911131148.svg);;background-position:65.3% 23.669999999999998%;background-size:1260% 1230%;;background-repeat:no-repeat}.com-widget-operations .link-bookmark.actived .com-i-bookmark,.com-widget-operations .link-bookmark.actived:hover .com-i-bookmark{background-image:url(sprite/base-201911131148.svg);;background-position:65.3% 32.96%;background-size:1260% 1230%;;background-repeat:no-repeat}.com-widget-operations .com-widget-qr{margin-top:8px}.com-widget-operations .com-widget-qr .scan-btn{border-color:transparent}.com-widget-shares{text-align:center}.com-widget-operations .com-opt-text,.com-widget-shares .com-opt-text{margin-bottom:10px;font-size:14px;line-height:20px}.com-widget-operations .com-share-options>li,.com-widget-shares .com-share-options>li{margin-right:0;margin-bottom:2px}.com-widget-operations .com-share-options .opt-item,.com-widget-shares .com-share-options .opt-item{width:46px;height:44px;text-align:center;line-height:44px}.com-widget-operations .com-share-options .opt-icon,.com-widget-shares .com-share-options .opt-icon{width:100%;height:100%;background-color:#F3F5F9}.com-widget-operations .com-share-options .opt-icon:before,.com-widget-shares .com-share-options .opt-icon:before{position:static;display:inline-block;vertical-align:middle;width:26px;height:26px}.com-widget-operations .com-share-options .opt-icon:after,.com-widget-shares .com-share-options .opt-icon:after{display:none}.com-widget-operations .com-share-options .opt-icon.wechat:before,.com-widget-shares .com-share-options .opt-icon.wechat:before{background-image:url(sprite/base-201911131148.svg);;background-position:82.22% 55.15%;background-size:1938.4615384615383% 1892.3076923076924%;;background-repeat:no-repeat}.com-widget-operations .com-share-options>li:hover .opt-icon.wechat,.com-widget-shares .com-share-options>li:hover .opt-icon.wechat{background-color:#30CC04}.com-widget-operations .com-share-options>li:hover .opt-icon.wechat:before,.com-widget-shares .com-share-options>li:hover .opt-icon.wechat:before{background-image:url(sprite/base-201911131148.svg);;background-position:82.22% 31.119999999999997%;background-size:1938.4615384615383% 1892.3076923076924%;;background-repeat:no-repeat}.com-widget-operations .com-share-options .opt-icon.qq:before,.com-widget-shares .com-share-options .opt-icon.qq:before{background-image:url(sprite/base-201911131148.svg);;background-position:82.22% 49.14%;background-size:1938.4615384615383% 1892.3076923076924%;;background-repeat:no-repeat}.com-widget-operations .com-share-options>li:hover .opt-icon.qq,.com-widget-shares .com-share-options>li:hover .opt-icon.qq{background-color:#00a4ff}.com-widget-operations .com-share-options>li:hover .opt-icon.qq:before,.com-widget-shares .com-share-options>li:hover .opt-icon.qq:before{background-image:url(sprite/base-201911131148.svg);;background-position:82.22% 13.089999999999998%;background-size:1938.4615384615383% 1892.3076923076924%;;background-repeat:no-repeat}.com-widget-operations .com-share-options .opt-icon.weibo:before,.com-widget-shares .com-share-options .opt-icon.weibo:before{background-image:url(sprite/base-201911131148.svg);;background-position:82.22% 25.11%;background-size:1938.4615384615383% 1892.3076923076924%;;background-repeat:no-repeat}.com-widget-operations .com-share-options>li:hover .opt-icon.weibo,.com-widget-shares .com-share-options>li:hover .opt-icon.weibo{background-color:#F43B51}.com-widget-operations .com-share-options>li:hover .opt-icon.weibo:before,.com-widget-shares .com-share-options>li:hover .opt-icon.weibo:before{background-image:url(sprite/base-201911131148.svg);;background-position:82.22% 19.1%;background-size:1938.4615384615383% 1892.3076923076924%;;background-repeat:no-repeat}.com-widget-operations .com-share-options .opt-icon.copy:before,.com-widget-shares .com-share-options .opt-icon.copy:before{background-image:url(sprite/base-201911131148.svg);;background-position:82.22% 43.13%;background-size:1938.4615384615383% 1892.3076923076924%;;background-repeat:no-repeat}.com-widget-operations .com-share-options>li:hover .opt-icon.copy,.com-widget-shares .com-share-options>li:hover .opt-icon.copy{background-color:#5F5D5D}.com-widget-operations .com-share-options>li:hover .opt-icon.copy:before,.com-widget-shares .com-share-options>li:hover .opt-icon.copy:before{background-image:url(sprite/base-201911131148.svg);;background-position:82.22% 37.12%;background-size:1938.4615384615383% 1892.3076923076924%;;background-repeat:no-repeat}.com-widget-operations .com-share-options .com-widget-qr,.com-widget-shares .com-share-options .com-widget-qr{margin-top:0}.com-widget-operations .com-event-panel{margin-top:8px}.com-side-articles{padding:10px 0;border-bottom:1px solid #E1E3E9}.com-side-article{display:block;position:relative;padding:10px 15px 0}.com-side-article.actived{background-color:#f7f8fa}.com-side-article:before{content:'';position:absolute;left:6px;top:20px;width:4px;height:4px;border-radius:50%;background-color:#00a4ff}.com-side-article-title{margin-bottom:10px;font-size:14px;line-height:24px;font-weight:400;color:#333;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-side-article-bd{box-sizing:border-box;padding-bottom:15px}.com-side-article-bd .com-media{margin-bottom:0}.com-side-article-bd .com-media-object{padding-right:15px;width:82px}.com-side-article-bd .com-thumbnail{width:82px;height:62px}.com-side-article-desc{font-size:12px;line-height:21px;color:#666;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:42px}.com-side-article-source{display:inline-block;vertical-align:middle;position:relative;margin-top:8px;padding-right:20px;font-size:12px;line-height:18px;color:#999}.com-side-article-source .source-inner{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-side-article-source .com-verification{position:absolute;right:0;top:3px}.com-side-article.ani .com-side-article-title{white-space:normal;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:48px}.com-side-article.ani .com-side-article-bd{overflow:hidden;height:0;transition:height .2s ease-in-out;padding-bottom:0}.com-side-article.ani.actived .com-side-article-bd{height:77px}.com-side-article.ani .com-side-article-time{display:block;margin-top:8px;font-size:12px;line-height:18px;color:#999}.com-loading-placeholder.com-side-article-loading.small{height:138px}.com-loading-placeholder.com-side-article-loading.ani.small{height:68px}.com-loading-placeholder.com-side-article-loading.ani.actived{height:145px}li:last-child>.com-loading-placeholder.com-side-article-loading.ani.small{border-bottom:none}.com-side-activities{padding:10px 0;border-bottom:1px solid #E1E3E9}.com-side-activity{margin-bottom:0;padding:10px 0}.com-side-activity:hover{background:linear-gradient(to right,rgba(243,245,249,0),rgba(243,245,249,100) 15%,rgba(243,245,249,100) 85%,rgba(243,245,249,0))}.com-side-activity .com-media-object{padding-right:20px;width:100px}.com-side-activity .com-thumbnail{width:100px;height:76px}.com-side-activity-title{font-size:14px;line-height:25px;color:#333;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-side-activity-desc{font-size:12px;line-height:18px;color:#999;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-side-activity .com-arrow-btn{margin-top:4px}.com-side-activity.special .com-media-body{vertical-align:middle}.com-side-activity.special .com-side-activity-title{font-size:16px;line-height:22px;white-space:nowrap}.com-side-activity-title-main{display:block;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis;max-height:44px;font-weight:500}.com-side-activity-title-special{margin-top:4px;font-size:14px;line-height:20px;color:#999;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-side-activity.special .com-side-activity-title-main{white-space:normal}.com-side-activity.salon .com-thumbnail{height:105px}.com-side-activity-title-series{font-size:12px;line-height:22px;color:#666;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:400}.com-side-activity.salon .com-side-activity-title{line-height:22px}.com-side-activity.salon .com-side-activity-title-main{padding-right:0}.com-side-activity-datas{margin-top:2px;font-size:0}.com-side-activity-data{display:inline-block;vertical-align:middle;font-size:12px;line-height:22px;color:#999}.com-side-activity-data:before{content:'';display:inline-block;vertical-align:middle;margin:0 5px;width:2px;height:2px;border-radius:50%;background-color:#999}.com-side-activity-data:first-child:before{display:none}.com-loading-placeholder.com-side-activity-loading.small{height:96px}li:last-child>.com-side-activity-loading.small{border-bottom:none}.com-side-user-panels{padding:10px 0;border-bottom:1px solid #E1E3E9}.com-side-user-panel{position:relative;padding:10px 0}.com-side-user-panel:hover{background:linear-gradient(to right,rgba(243,245,249,0),rgba(243,245,249,100) 15%,rgba(243,245,249,100) 85%,rgba(243,245,249,0))}.com-side-user-panel>.panel-link{position:absolute;left:0;top:0;z-index:1;width:100%;height:100%}.com-side-user-panel-main{margin-bottom:0}.com-side-user-panel-main .com-media-object{padding-right:20px;width:38px}.com-side-user-panel-main .com-2-avatar{width:38px;height:38px}.com-side-user-panel-title{position:relative;display:inline-block;vertical-align:middle;box-sizing:border-box;max-width:100%;font-size:16px;line-height:22px;color:#000;font-weight:400}.com-side-user-panel-title.with-verify{padding-right:20px}.com-side-user-panel-title-inner{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-side-user-panel-title .com-verification{position:absolute;right:0;top:6px;z-index:2}.com-side-user-panel-title .com-verification:hover{z-index:900}.com-side-user-panel-identity{margin-top:3px;font-size:14px;line-height:20px;color:#999;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-side-user-panel-datas{margin-top:4px}.com-side-user-panel-skills{position:relative;margin-top:15px;padding-left:68px}.com-side-user-panel-skills>dt{position:absolute;left:0;top:0;font-size:12px;line-height:18px;color:#999}.com-side-user-panel-skills>dd{position:relative;z-index:2}.com-side-user-panel.has-skills .com-side-user-panel-datas{margin-top:3px}.com-side-user-panel.has-btns .com-media-body{position:relative}.com-side-user-panel.has-btns .com-side-user-panel-hd,.com-side-user-panel.has-btns .com-side-user-panel-identity{margin-right:80px}.com-side-user-panel-btns{position:absolute;right:0;top:0;z-index:2}.com-side-user-panel-btns .c-btn{padding:0 10px;min-width:56px;width:70px;height:28px;font-size:12px;line-height:26px}.com-side-user-panel-btns .ask-btn{width:auto}.com-loading-placeholder.com-side-user-panel-loading.small{height:64px}li:last-child>.com-loading-placeholder.com-side-user-panel-loading.small{border-bottom:none}.com-side-contributors{padding:10px 0;border-bottom:1px solid #E1E3E9}.com-side-user-panel.contributor .com-side-user-panel-hd{position:relative}.com-side-user-panel-info{margin-top:4px;font-size:12px;line-height:18px;color:#999}.com-side-user-panel-info em{margin:0 5px}.com-side-user-ranks{padding:10px 0;border-bottom:1px solid #E1E3E9}.com-side-user-panel.rank{padding:10px 0;border-bottom:none}.com-side-user-panel-rank{display:table-cell;vertical-align:middle;width:35px}.com-side-user-panel-order{display:inline-block;vertical-align:middle;min-width:24px;text-align:center;font-size:14px;color:#999;line-height:20px}.com-side-user-ranks>li:nth-child(1) .com-side-user-panel-order,.com-side-user-ranks>li:nth-child(2) .com-side-user-panel-order,.com-side-user-ranks>li:nth-child(3) .com-side-user-panel-order{color:#EE7F31}.com-side-user-panel.rank .com-side-user-panel-datas{margin-top:3px}.com-side-user-panel.intro{padding-top:20px;padding-bottom:20px;border-bottom:1px solid #E1E3E9}.com-side-user-panel.intro .com-media-body{padding-right:80px}.com-side-user-panel.intro .com-side-user-panel-btns{top:20px}.com-side-user-panel.intro .com-side-user-panel-datas{position:relative;z-index:2;margin-top:20px}.com-side-user-panel.intro .com-side-user-panel-datas .com-data{width:33.33%;color:#999;font-size:14px;line-height:20px}.com-side-user-panel.intro .com-side-user-panel-datas .com-data:before{display:none}.com-side-user-panel.intro .com-side-user-panel-datas .com-data em,.com-side-user-panel.intro .com-side-user-panel-datas .com-data:hover{color:#00a4ff}.com-side-column-panels{padding:10px 0;border-bottom:1px solid #E1E3E9}.com-side-column-panel{margin-bottom:0;padding:10px 0}.com-side-column-panel:hover{background:linear-gradient(to right,rgba(243,245,249,0),rgba(243,245,249,100) 15%,rgba(243,245,249,100) 85%,rgba(243,245,249,0))}.com-side-column-panel .com-media-object{padding-right:20px;width:38px}.com-side-column-panel .com-2-avatar{width:38px;height:38px}.com-side-column-panel-title{font-size:16px;line-height:22px;color:#000;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-side-column-panel-infos{position:relative;margin-top:4px}.com-side-column-panel-author{position:relative;display:inline-block;vertical-align:middle;box-sizing:border-box;max-width:110px;font-size:14px;line-height:20px;color:#999}.com-side-column-panel-author.with-verify{padding-right:17px}.com-side-column-panel-author .name{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-side-column-panel-author .com-verification{position:absolute;right:0;top:4px}.com-side-column-panel .com-datas{margin-top:4px}.com-side-column-panel.has-btns .com-media-body{position:relative}.com-side-column-panel.has-btns .com-side-column-panel-title{margin-right:80px}.com-side-column-panel-btns{position:absolute;right:0;top:-2px;z-index:2}.com-side-column-panel-btns .c-btn{padding:0 10px;min-width:0;width:70px;height:28px;font-size:12px;line-height:26px}.com-side-column-panel.with-author .com-media-body{position:relative}.com-side-column-panel.with-author .com-side-column-panel-infos{margin-top:3px;line-height:18px}.com-side-column-panel.with-author .com-side-column-panel-author{font-size:12px;line-height:18px}.com-side-column-panel.with-author .com-datas{position:absolute;right:0;bottom:0;margin-top:0}.com-side-column-panel-loading.com-loading-placeholder{height:64px}.panel-cell:last-child .com-side-column-panel-loading{border-bottom:none}.com-side-column-panels-wrap .com-page-btns{margin-top:15px}.com-side-column-ranks{padding:10px 0;border-bottom:1px solid #E1E3E9}.com-side-column-panel.rank{padding:10px 0;border-bottom:none}.com-side-column-panel-rank{display:table-cell;vertical-align:middle;width:35px}.com-side-column-panel-order{display:inline-block;vertical-align:middle;min-width:24px;text-align:center;font-size:14px;color:#999;line-height:20px}.com-side-column-ranks>li:nth-child(1) .com-side-column-panel-order,.com-side-column-ranks>li:nth-child(2) .com-side-column-panel-order,.com-side-column-ranks>li:nth-child(3) .com-side-column-panel-order{color:#EE7F31}.com-side-column-panel.rank .com-side-column-panel-datas{margin-top:3px}.com-2-wechat-panel{display:table;table-layout:fixed;width:100%}.com-2-section+.com-2-wechat-panel{margin-top:30px}.com-2-wechat-panel .qr-img{display:table-cell;padding:5px;width:90px;height:90px;border:1px solid #ddd}.com-2-wechat-panel .qr-img img{display:block;width:100%}.com-2-wechat-panel .qr-cnt{box-sizing:border-box;display:table-cell;vertical-align:middle;padding-left:15px;font-size:14px;line-height:24px;text-align:left}.com-2-wechat-panel .qr-title{font-size:16px;color:#333;font-weight:500;line-height:22px}.com-2-wechat-panel .qr-desc{margin-top:6px;font-size:14px;line-height:20px;color:#999}.com-2-wechat-panel .qr-img-full{display:none}.com-2-wechat-panel.without-cnt{width:90px}.com-tooltip{position:absolute;color:#444;z-index:900}.com-tooltip-hidden{display:none}.com-tooltip-content{position:relative}.com-tooltip-inner{font-size:12px;-moz-box-sizing:border-box;box-sizing:border-box;padding:8px 10px;border:1px solid #e7e8f1;background-color:#fff;line-height:18px;-webkit-box-shadow:0 10px 20px rgba(3,27,78,.1);box-shadow:0 10px 20px rgba(3,27,78,.1);position:static !important}.com-tooltip-inner:after,.com-tooltip-inner:before{font-size:0;position:absolute;width:0;height:0;content:'';border:8px dashed transparent}.com-tooltip-inner:after{border:7px dashed transparent}.com-tooltip-placement-top,.com-tooltip-placement-topLeft,.com-tooltip-placement-topRight{padding-bottom:8px}.com-tooltip-placement-top .com-tooltip-inner{left:50%}.com-tooltip-placement-topLeft .com-tooltip-inner{left:15px}.com-tooltip-placement-topRight .com-tooltip-inner{right:15px}.com-tooltip-placement-top .com-tooltip-inner:after,.com-tooltip-placement-top .com-tooltip-inner:before,.com-tooltip-placement-topLeft .com-tooltip-inner:after,.com-tooltip-placement-topLeft .com-tooltip-inner:before,.com-tooltip-placement-topRight .com-tooltip-inner:after,.com-tooltip-placement-topRight .com-tooltip-inner:before{top:100%;left:inherit;right:inherit;margin-top:-1px;border-top-style:solid}.com-tooltip-placement-top .com-tooltip-inner:before,.com-tooltip-placement-topLeft .com-tooltip-inner:before,.com-tooltip-placement-topRight .com-tooltip-inner:before{margin-left:-8px;border-top-width:11px;border-bottom-width:0;border-top-color:#e7e8f1}.com-tooltip-placement-topRight .com-tooltip-inner:before{margin-right:-8px}.com-tooltip-placement-top .com-tooltip-inner:after,.com-tooltip-placement-topLeft .com-tooltip-inner:after,.com-tooltip-placement-topRight .com-tooltip-inner:after{margin-left:-7px;border-top-color:#fff;border-top-width:9px;border-bottom-width:0}.com-tooltip-placement-topRight .com-tooltip-inner:after{margin-right:-7px}.com-tooltip-placement-bottom,.com-tooltip-placement-bottomLeft,.com-tooltip-placement-bottomRight{padding-top:8px}.com-tooltip-placement-bottom .com-tooltip-inner{left:50%}.com-tooltip-placement-bottomLeft .com-tooltip-inner{left:15px}.com-tooltip-placement-bottomRight .com-tooltip-inner{right:15px}.com-tooltip-placement-bottom .com-tooltip-inner:after,.com-tooltip-placement-bottom .com-tooltip-inner:before,.com-tooltip-placement-bottomLeft .com-tooltip-inner:after,.com-tooltip-placement-bottomLeft .com-tooltip-inner:before,.com-tooltip-placement-bottomRight .com-tooltip-inner:after,.com-tooltip-placement-bottomRight .com-tooltip-inner:before{bottom:100%;left:inherit;right:inherit;margin-bottom:-1px;border-bottom-style:solid}.com-tooltip-placement-bottom .com-tooltip-inner:before,.com-tooltip-placement-bottomLeft .com-tooltip-inner:before,.com-tooltip-placement-bottomRight .com-tooltip-inner:before{margin-left:-8px;border-top-width:0;border-bottom-width:11px;border-bottom-color:#e7e8f1}.com-tooltip-placement-bottomRight .com-tooltip-inner:before{margin-right:-8px}.com-tooltip-placement-bottom .com-tooltip-inner:after,.com-tooltip-placement-bottomLeft .com-tooltip-inner:after,.com-tooltip-placement-bottomRight .com-tooltip-inner:after{margin-left:-7px;border-bottom-color:#fff;border-top-width:0;border-bottom-width:9px}.com-tooltip-placement-bottomRight .com-tooltip-inner:after{margin-right:-7px}.com-tooltip-placement-left,.com-tooltip-placement-leftBottom,.com-tooltip-placement-leftTop{padding-right:8px}.com-tooltip-placement-left .com-tooltip-inner{top:50%}.com-tooltip-placement-leftTop .com-tooltip-inner{top:15px}.com-tooltip-placement-leftBottom .com-tooltip-inner{bottom:15px}.com-tooltip-placement-left .com-tooltip-inner:after,.com-tooltip-placement-left .com-tooltip-inner:before,.com-tooltip-placement-leftBottom .com-tooltip-inner:after,.com-tooltip-placement-leftBottom .com-tooltip-inner:before,.com-tooltip-placement-leftTop .com-tooltip-inner:after,.com-tooltip-placement-leftTop .com-tooltip-inner:before{top:inherit;bottom:inherit;left:100%;margin-left:-1px;border-left-style:solid}.com-tooltip-placement-left .com-tooltip-inner:before,.com-tooltip-placement-leftBottom .com-tooltip-inner:before,.com-tooltip-placement-leftTop .com-tooltip-inner:before{margin-top:-8px;border-left-width:11px;border-right-width:0;border-left-color:#e7e8f1}.com-tooltip-placement-leftBottom .com-tooltip-inner:before{margin-bottom:-8px}.com-tooltip-placement-left .com-tooltip-inner:after,.com-tooltip-placement-leftBottom .com-tooltip-inner:after,.com-tooltip-placement-leftTop .com-tooltip-inner:after{margin-top:-7px;border-left-color:#fff;border-left-width:9px;border-right-width:0}.com-tooltip-placement-leftBottom .com-tooltip-inner:after{margin-bottom:-7px}.com-tooltip-placement-right,.com-tooltip-placement-rightBottom,.com-tooltip-placement-rightTop{padding-left:8px}.com-tooltip-placement-right .com-tooltip-inner{top:50%}.com-tooltip-placement-rightTop .com-tooltip-inner{top:15px}.com-tooltip-placement-rightBottom .com-tooltip-inner{bottom:15px}.com-tooltip-placement-right .com-tooltip-inner:after,.com-tooltip-placement-right .com-tooltip-inner:before,.com-tooltip-placement-rightBottom .com-tooltip-inner:after,.com-tooltip-placement-rightBottom .com-tooltip-inner:before,.com-tooltip-placement-rightTop .com-tooltip-inner:after,.com-tooltip-placement-rightTop .com-tooltip-inner:before{top:inherit;bottom:inherit;right:100%;margin-right:-1px;border-right-style:solid}.com-tooltip-placement-right .com-tooltip-inner:before,.com-tooltip-placement-rightBottom .com-tooltip-inner:before,.com-tooltip-placement-rightTop .com-tooltip-inner:before{margin-top:-8px;border-left-width:0;border-right-width:11px;border-right-color:#e7e8f1}.com-tooltip-placement-rightBottom .com-tooltip-inner:before{margin-bottom:-8px}.com-tooltip-placement-right .com-tooltip-inner:after,.com-tooltip-placement-rightBottom .com-tooltip-inner:after,.com-tooltip-placement-rightTop .com-tooltip-inner:after{margin-top:-7px;border-right-color:#fff;border-left-width:0;border-right-width:9px}.com-tooltip-placement-rightBottom .com-tooltip-inner:after{margin-bottom:-7px}.com-tooltip-warning span{vertical-align:middle;margin-left:5px;color:#e29e35}.com-tooltip-warning.com-tooltip-placement-bottom .com-tooltip-inner:before{border-bottom-color:#ffc533}.com-tooltip-warning.com-tooltip-placement-bottom .com-tooltip-inner:after{border-bottom-color:#fff5db}.com-tooltip-warning.com-tooltip-placement-left .com-tooltip-inner:before{border-left-color:#ffc533}.com-tooltip-warning.com-tooltip-placement-left .com-tooltip-inner:after{border-left-color:#fff5db}.com-tooltip-warning.com-tooltip-placement-top .com-tooltip-inner:before{border-top-color:#ffc533}.com-tooltip-warning.com-tooltip-placement-top .com-tooltip-inner:after{border-top-color:#fff5db}.com-tooltip-warning.com-tooltip-placement-right .com-tooltip-inner:before{border-right-color:#ffc533}.com-tooltip-warning.com-tooltip-placement-right .com-tooltip-inner:after{border-right-color:#fff5db}.com-tooltip-warning .com-tooltip-inner{border:1px solid #ffc533;background-color:#fff5db;color:#e29e35}.com-tooltip-warning .com-tooltip-inner em{color:#b27700;font-weight:700}.com-tooltip-warning.m .com-tooltip-inner{padding:4px 10px}.com-tooltip-err span{vertical-align:middle;margin-left:5px;color:red}.com-tooltip-err.com-tooltip-placement-bottom .com-tooltip-inner:before{border-bottom-color:#e7736e}.com-tooltip-err.com-tooltip-placement-bottom .com-tooltip-inner:after{border-bottom-color:#f9dcdb}.com-tooltip-err.com-tooltip-placement-left .com-tooltip-inner:before{border-left-color:#e7736e}.com-tooltip-err.com-tooltip-placement-left .com-tooltip-inner:after{border-left-color:#f9dcdb}.com-tooltip-err.com-tooltip-placement-top .com-tooltip-inner:before{border-top-color:#e7736e}.com-tooltip-err.com-tooltip-placement-top .com-tooltip-inner:after{border-top-color:#f9dcdb}.com-tooltip-err.com-tooltip-placement-right .com-tooltip-inner:before{border-right-color:#e7736e}.com-tooltip-err.com-tooltip-placement-right .com-tooltip-inner:after{border-right-color:#f9dcdb}.com-tooltip-err .com-tooltip-inner{border:1px solid #e7736e;background-color:#f9dcdb;color:#e1504a}.com-tooltip-confirm{min-width:170px;max-width:300px}.com-tooltip-confirm .com-tooltip-inner{padding:18px 20px}.com-tooltip-confirm .confirm-title{font-size:14px;color:#000;font-weight:400}.com-tooltip-confirm .confirm-btns{margin-top:14px;text-align:right}.com-tooltip-confirm .confirm-btn{min-width:60px;border:none;background-color:transparent;color:#00a4ff;text-align:center;cursor:pointer;font-size:14px}.com-tooltip-confirm .confirm-btn:hover{color:#0092ee}.com-tooltip-confirm .confirm-btn.weak{color:#000}.com-tooltip-confirm .confirm-btn.weak:hover{color:#00a4ff;text-decoration:none}.com-side-products{padding:10px 0;border-bottom:1px solid #E1E3E9}.com-side-product{box-sizing:border-box;position:relative;padding:8px 0}.com-side-product:hover{background:linear-gradient(to right,rgba(243,245,249,0),rgba(243,245,249,100) 15%,rgba(243,245,249,100) 85%,rgba(243,245,249,0))}.com-side-product>.panel-link{position:absolute;left:0;top:0;z-index:1;width:100%;height:100%}.com-side-product-hd{position:relative;padding-left:42px}.com-side-product-object{position:absolute;left:0;top:0}.com-side-product-object img{display:block;width:32px;height:32px}.com-side-product-title{box-sizing:border-box;font-size:16px;line-height:32px;font-weight:400;color:#000;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-side-product-desc{margin-top:5px;font-size:12px;line-height:18px;color:#999;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:36px}.com-side-products.col3{font-size:0;padding:0;border-bottom:none}.com-side-products.col3>.panel-cell{display:inline-block;vertical-align:top;margin-right:20px;margin-bottom:20px;width:calc((100% - 20px * 2 - 1px)/ 3)}.com-side-products.col3 .com-side-product{border-bottom:none;padding:0}.com-side-products.col3 .com-side-product:hover{background:0 0}.com-side-products.col3 .com-side-product:hover .com-side-product-title{color:#00a4ff}.com-side-products.col3>.panel-cell:nth-child(3n){margin-right:0}.c-hero-bar{-webkit-font-smoothing:auto}.c-hero-bar-tit{font-weight:400;-webkit-font-smoothing:antialiased}.c-hero-bar-desc{-webkit-font-smoothing:antialiased}.c-hero-bar.air .c-hero-bar-inner{padding-top:45px;height:300px}.c-hero-bar.air .c-hero-bar-tit{margin-bottom:10px;font-size:40px;line-height:60px}.c-hero-bar.air .c-hero-bar-desc{line-height:1.7}.c-hero-section.air .c-hero-section-tit{font-weight:400;-webkit-font-smoothing:antialiased}.c-hero-section.air .c-hero-section-btn .c-btn,.c-hero-section.air .c-hero-section-des{-webkit-font-smoothing:antialiased}.com-hero-bar{background-color:#1F2531;background-position:center center;background-repeat:no-repeat;background-size:cover;color:#fff}.com-hero-bar-inner{display:table;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0 auto;width:100%;max-width:1200px}.com-hero-bar-ct{display:table-cell;vertical-align:middle;padding:0 20px;height:255px}.com-hero-bar-tit{font-size:40px;line-height:60px;font-weight:400;-webkit-font-smoothing:antialiased}.com-hero-bar-desc{margin-top:6px;font-size:16px;line-height:1.7;-webkit-font-smoothing:antialiased}.com-hero-bar-btns{margin-top:26px}.com-hero-bar .c-btn{padding:0 10px;min-width:90px;height:28px;line-height:28px;font-size:12px}.com-hero-bar .c-btn-hole{border-color:#fff;color:#fff}.com-hero-bar .c-btn-hole:hover{border-color:#00a4ff;color:#00a4ff;background-color:transparent}.com-hero-share{margin-top:15px}.com-hero-bar.align-center{text-align:center}.com-hero-bar.air .com-hero-bar-ct{box-sizing:border-box;padding-top:45px;height:300px}.com-side-article-ranks{padding:10px 0;border-bottom:1px solid #D2D9E7}.com-side-article-rank-item{display:block;position:relative;padding:10px 0 10px 30px;color:#333}.com-side-article-rank-item:hover{background:linear-gradient(to right,rgba(243,245,249,0),rgba(243,245,249,100) 15%,rgba(243,245,249,100) 85%,rgba(243,245,249,0))}.com-side-article-rank-order{position:absolute;top:10px;left:0;display:block;min-width:24px;text-align:center;font-size:14px;color:#999;line-height:20px}.com-side-article-rank-tit{font-size:14px;line-height:20px;font-weight:400;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:40px}.com-side-article-rank-extra{margin-top:5px;line-height:14px;font-size:12px;color:#999}.com-side-article-ranks>li:nth-child(1) .com-side-article-rank-order,.com-side-article-ranks>li:nth-child(2) .com-side-article-rank-order,.com-side-article-ranks>li:nth-child(3) .com-side-article-rank-order{color:#EE7F31}.com-side-disorder-list{padding:15px 0;border-bottom:1px solid #E1E3E9}.com-side-disorder-list li{position:relative}.com-side-disorder-list li:before{content:'';position:absolute;left:6px;top:14px;width:4px;height:4px;border-radius:50%;background-color:#00a4ff}.com-side-disorder-list a{display:block;padding:5px 15px;font-size:14px;line-height:22px;color:#333;word-wrap:break-word}.com-side-disorder-text{display:block}.com-side-disorder-list a:hover{text-decoration:none;background:linear-gradient(to right,rgba(243,245,249,0),rgba(243,245,249,100) 15%,rgba(243,245,249,100) 85%,rgba(243,245,249,0))}.com-side-disorder-list.loading{height:270px}.com-side-disorder-list.loading .com-loading-placeholder{height:100%;background-color:transparent}.com-side-doc-panels{padding:10px 0;border-bottom:1px solid #E1E3E9}.com-side-doc-panel{position:relative;padding:10px 0}.com-side-doc-panel:hover{background:linear-gradient(to right,rgba(243,245,249,0),rgba(243,245,249,100) 15%,rgba(243,245,249,100) 85%,rgba(243,245,249,0))}.com-side-doc-panel>.panel-link{position:absolute;left:0;top:0;z-index:1;width:100%;height:100%}.com-side-doc-panel-main{margin-bottom:0}.com-side-doc-panel-main .com-media-object{padding-right:20px;width:42px}.com-side-doc-panel-img{display:block;width:42px;height:42px}.com-side-doc-panel-title{position:relative;box-sizing:border-box;font-size:16px;line-height:22px;color:#000;font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.com-side-doc-panel-datas{margin-top:3px}.com-loading-placeholder.com-side-doc-panel-loading.small{height:103px}.com-2-tag-cont{padding:11px 5px 1px 15px;position:relative;z-index:1;min-height:45px;box-sizing:border-box;font-size:0;border-radius:2px}.com-2-tag-cont .com-2-tag-txt,.com-2-tagsinput-list dd a{display:inline-block;font-size:12px;line-height:22px;background-color:#F3F5F9;padding:0 8px;color:#333;margin-right:10px;margin-bottom:10px}.com-2-tag-cont .com-2-tag-txt span{display:inline-block;vertical-align:middle;max-width:10em;word-break:keep-all;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-tagsinput-list dd a:hover{border-color:#00a4ff}.com-2-tag-cont .com-2-tag-input{width:auto;max-width:10em;border:0;background:0 0;outline:0;line-height:22px;height:22px;font-size:12px;color:#333;margin-bottom:10px}.com-2-tag-cont .com-2-text{box-sizing:border-box;position:absolute;left:0;right:0;top:0;bottom:0;z-index:-1;border:1px solid #e5e5e5;border-radius:2px;padding:0 15px;font-size:14px;line-height:42px;color:#999;background-color:#fff}.com-2-tag-cont .com-2-text:hover,.com-2-tag-input:focus+.com-2-text,.com-2-tag-input:hover,.com-2-tag-input:hover+.com-2-text{border-color:#00a4ff}.com-2-tag-txt{cursor:default}.com-2-tag-txt .com-2-btn-close{cursor:pointer;display:inline-block;vertical-align:middle;width:16px;height:16px;background-image:url(sprite/base-201911131148.svg);;margin-right:-5px;margin-left:8px;background-position:96.11% 41.81%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-2-tagsinput-list{font-size:12px;padding-left:60px;margin-top:10px}.com-2-tagsinput-list dt{float:left;margin-left:-60px;color:#999;line-height:21px}.com-2-tagsinput-list dd{display:inline-block;vertical-align:middle}.com-2-tagsinput-list dd a{display:block;margin-right:10px;margin-bottom:5px;max-width:8em;word-break:keep-all;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none}.com-2-tagsinput-list dd a.disabled{background-color:#e5e5e5;color:#999;cursor:default}.com-2-tagsinput-bar{position:relative}.com-2-tagsinput-dropdown{display:none;position:absolute;top:100%;left:0;z-index:900;margin-top:5px;padding:15px;width:100%;font-size:12px;background:#fff;border:1px solid #e5e5e5;border-radius:2px;box-sizing:border-box}.com-2-tagsinput-dropdown.show{display:block}.com-2-tagsinput-dropdown-tit{font-size:12px;color:#999}.com-2-tagsinput-dropdown-tit em{padding:0 6px;color:#333}.com-2-tagsinput-dropdown-menu{height:180px;overflow-y:auto;overflow-x:hidden;box-sizing:border-box;margin:15px -15px 0}.com-2-tagsinput-dropdown-menu li{padding:6px 15px;cursor:pointer;font-size:12px;line-height:18px;color:#333}.com-2-tagsinput-dropdown-menu li.hover,.com-2-tagsinput-dropdown-menu li:hover{color:#00a4ff;background-color:#F3F5F9}.com-2-tagsinput-dropdown-loading{display:none;position:relative;color:#999}.com-2-tagsinput-dropdown-menu+.com-2-tagsinput-dropdown-loading{margin-top:5px}.com-2-tagsinput-dropdown-loading .icon-loading{margin-right:10px}.com-2-tagsinput-dropdown-loading .icon-loading:before{content:'';width:16px;height:16px;display:inline-block;background-image:url(sprite/base-201911131148.svg);;-moz-animation:spin .6s infinite linear;-webkit-animation:spin .6s infinite linear;animation:spin .6s infinite linear;vertical-align:-3px;background-position:69.88% 62.82%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-2-tagsinput-dropdown.is-loading .com-2-tagsinput-dropdown-loading{display:block}.com-2-tagsinput-dropdown-tip{display:none;color:#999}.com-2-tagsinput-dropdown-tip a{color:#00a4ff}.com-2-tagsinput-dropdown-tip a:hover{text-decoration:underline}.com-2-tagsinput-dropdown.is-err .com-2-tagsinput-dropdown-tip{display:block}.com-2-tagsinput-tab{margin:0 5px 5px}.com-2-tagsinput-tab .com-tab-item{margin-right:20px}.com-2-tagsinput-tab .com-tab-item a{padding:0 5px;color:#666}.com-2-tagsinput-tab .com-tab-item a:hover{color:#00a4ff}.com-2-tagsinput-tab .com-tab-item.actived a,.com-2-tagsinput-tab .com-tab-item.actived a:hover{color:#00a4ff;font-weight:400}.com-2-tagsinput-tab .com-tab-panel{padding-top:10px;max-height:170px;overflow:auto}.com-2-tagsinput-tab .com-tag-v2-list.large .com-tag-v2{font-size:12px}.com-2-tagsinput-recommends{margin-top:10px}.com-2-tagsinput-recommends>.recommend-title{margin-bottom:10px;font-size:12px;color:#666}.c-btn{height:32px;min-width:88px;padding:0 16px;background-color:#00a4ff;border:1px solid transparent;color:#fff;font-size:14px;line-height:30px;text-align:center;display:inline-block;cursor:pointer;outline:0;box-sizing:border-box}.c-btn:hover{text-decoration:none;background-color:#0092ee}.c-btn-pay{background-color:#ff7200}.c-btn-pay:hover{background-color:#f06c00}.c-btn-hole{border:1px solid #00a4ff;background-color:transparent;color:#00a4ff;line-height:30px}.c-btn-hole:hover{background-color:rgba(0,164,255,.15);border:1px solid #00a4ff;color:#00a4ff}.c-btn-hole-white{border:1px solid #DCDEE6;background:0 0;color:#fff;line-height:30px}.c-btn-hole-white:hover{background-color:#fff;color:#000}.c-btn-weak{background:0 0;border:1px solid #DCDEE6;color:#666;line-height:30px}.c-btn-weak:hover{background:0 0;border:1px solid #999;color:#000}.c-btn-link{min-width:0;border:none;background-color:transparent;color:#333}.c-btn-link:hover{color:#00a4ff;border:none;background-color:transparent}.c-btn-disabled,.c-btn-disabled:hover{background-color:#ddd;border-color:#ddd;color:#999;cursor:default}.c-btn.xl{height:40px;line-height:38px;font-size:16px}.c-btn.l{height:36px;line-height:34px}.c-btn-small,.c-btn.s,.c-btn.small{height:28px;line-height:26px;min-width:80px;padding:0 10px;font-size:12px}.c-btn-smaller,.c-btn.smaller,.c-btn.xs{padding:0 10px;min-width:0;height:24px;font-size:12px;line-height:22px}.c-btn.block,.c-btn.full-width{min-width:0;display:block;width:100%}.c-btn.auto-width{min-width:0}.c-btn .c-loading{display:none}.c-btn.loading{cursor:default}.c-btn.loading .text{display:none}.c-btn.loading .c-loading{display:block}.c-btn .c-loading-inner>div{background-color:#fff;vertical-align:middle}.c-btn.loading:hover{background-color:#00a4ff}.c-btn-pay.loading:hover{background-color:#ff7200}.c-btn-hole .c-loading-inner>div{background-color:#00a4ff}.c-btn-hole.loading:hover{background-color:#fff}.c-btn-hole-white.loading:hover{background-color:transparent}.c-btn-weak .c-loading-inner>div{background-color:#ddd}.c-btn-weak.loading:hover{background-color:#fff;border-color:#ddd}.c-btn-link .c-loading-inner>div{background-color:#ddd}.c-btn-link.loading:hover{background-color:transparent;border-color:#ddd}.c-btn-disabled .c-loading-inner>div{background-color:#fff}.c-btn-disabled.loading:hover{background-color:#d5d7de}.c-btn.btn-upload{position:relative;overflow:hidden}.c-btn.btn-upload input[type=file]{position:absolute;right:0;top:0;width:100%;height:100%;opacity:0;cursor:pointer;font-size:200px}.com-ico-btn .icon{position:relative;top:-1px;margin-right:6px;display:inline-block;vertical-align:middle;width:16px;height:16px}.com-ico-btn .icon.write{top:-2px;background-image:url(sprite/base-201911131148.svg);;background-position:29.709999999999997% 96.64%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-ico-btn .icon.follow{top:-2px;width:12px;height:12px;background-image:url(sprite/base-201911131148.svg);;background-position:17.28% 99.58%;background-size:4200% 4100%;;background-repeat:no-repeat}.com-ico-btn.c-btn-weak .icon.refresh{top:-2px;background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 72.06%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-ico-btn.c-btn-weak:hover .icon.refresh{top:-2px;background-image:url(sprite/base-201911131148.svg);;background-position:96.11% 34.239999999999995%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-comment-section .com-comment-single-edit{margin-top:0;margin-bottom:20px}.com-ani-hero{position:relative;overflow:hidden;padding:0 10px}.com-ani-hero-inner{box-sizing:border-box;position:relative;z-index:2;max-width:1200px;height:280px;margin:0 auto;padding:55px 10px 0;font-size:0}.com-ani-hero-inner:before{content:'';display:inline-block;vertical-align:middle;width:0;height:100%}.com-ani-hero-cnt{display:inline-block;vertical-align:middle;color:#fff}.com-ani-hero-title{margin-top:-20px;font-size:44px;line-height:70px;font-weight:400}.com-ani-hero-desc{margin-top:5px;font-size:18px;line-height:25px;opacity:.8}.com-ani-hero-imgs{position:absolute;left:0;top:0;width:100%;height:100%;overflow:hidden}.com-ani-hero-bg{height:100%;background-position:center;background-repeat:no-repeat}.com-ani-hero-breath,.com-ani-hero-canvas,.com-ani-hero-foreground{position:absolute;left:0;top:0;width:100%;height:100%}.com-ani-hero-breath{-webkit-animation:aniHeroBreath 3s ease-in-out infinite;animation:aniHeroBreath 3s ease-in-out infinite}@-webkit-keyframes aniHeroBreath{0%,100%{opacity:0}50%{opacity:1}}@keyframes aniHeroBreath{0%,100%{opacity:0}50%{opacity:1}}.com-ani-hero-breath-img{height:100%;background-position:center;background-repeat:no-repeat}.com-ani-hero-canvas canvas{position:absolute;top:0;left:50%}.com-ani-hero-foreground,.com-ani-hero-foreground-breath{background-position:center;background-repeat:no-repeat}.com-share-bubble .com-tooltip-inner{padding:20px}.com-share-bubble-opts>li{margin-bottom:15px}.com-share-bubble-opts>li:last-child{margin-bottom:0}.com-share-bubble-link,.com-share-bubble-text{display:block;color:#333;font-size:12px}.com-share-bubble-link:hover{color:#00a4ff;text-decoration:none}.com-share-bubble-icon{position:relative;top:-1px;margin-right:5px;display:inline-block;vertical-align:middle;width:20px;height:20px}.com-share-bubble-icon.qq{background-image:url(sprite/base-201911131148.svg);;background-position:87.4% 64.83%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-share-bubble-icon.wechat{background-image:url(sprite/base-201911131148.svg);;background-position:72.92999999999999% 88.98%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-share-bubble-icon.weibo{background-image:url(sprite/base-201911131148.svg);;background-position:92.36% 9.53%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-share-bubble-icon.link{background-image:url(sprite/base-201911131148.svg);;background-position:22.93% 88.98%;background-size:2520% 2460%;;background-repeat:no-repeat}.com-share-bubble-code{margin-top:10px;width:110px;height:110px}.com-share-bubble-code img{display:block;width:100%}.com-share-bubble .c-bubble-trigger{display:block}.com-share-bubble-trigger{color:#00a4ff;font-size:14px}.com-share-bubble-trigger .com-i-share{background-image:url(sprite/base-201911131148.svg);;background-position:92.42% 92.86%;background-size:3150% 3075%;;background-repeat:no-repeat}.com-2-sub-section{margin-bottom:30px}.com-2-sub-section-hd{margin-bottom:20px}.com-2-sub-section-title{font-size:18px;line-height:26px;color:#999;font-weight:400}.com-radio-blocks{font-size:0}.com-radio-block{box-sizing:border-box;padding:0 10px;min-width:80px;height:30px;line-height:28px;border:1px solid #ddd;font-size:14px;color:#333;text-align:center;position:relative;display:inline-block;margin-right:10px;margin-bottom:10px;cursor:pointer;background-color:#fff}.com-radio-block img{position:relative;top:-1px;vertical-align:middle;margin-right:5px;width:16px;height:16px}.com-radio-block:hover{background-color:#f7f8fa;border:1px solid #b3b3b3}.com-radio-block.actived,.com-radio-block.actived:hover{background-color:#eff9ff;border:1px solid #00a4ff;color:#00a4ff;cursor:default}.com-form-ctrl{position:relative;padding-right:50px;overflow:hidden;transition:max-height .3s ease-in-out}.com-form-ctrl.fold{max-height:40px}.com-form-ctrl-btn{position:absolute;right:10px;top:5px;font-size:14px;text-align:left;cursor:pointer;color:#00a4ff}.com-form-ctrl-icon{width:10px;height:9px;display:inline-block;vertical-align:middle;background-image:url(sprite/base-201911131148.svg);;transform:rotate(180deg);background-position:69.84% 37.269999999999996%;background-size:5040% 5466.666666666666%;;background-repeat:no-repeat}.com-form-ctrl-btn.fold .com-form-ctrl-icon{transform:rotate(0)}.com-filter-form{padding:30px 10px 10px;background-color:#F3F5F9}.com-filter-form .com-form-title{font-size:14px;color:#666}.com-filter-form .com-form-cnt{padding-bottom:10px}.com-3-article-panel{position:relative;padding:25px 0;border-bottom:1px solid #E1E3E9;cursor:pointer}.com-3-article-panel:hover{background:linear-gradient(to right,rgba(243,245,249,0),rgba(243,245,249,100) 15%,rgba(243,245,249,100) 85%,rgba(243,245,249,0))}.com-3-article-panel>.panel-link{position:absolute;left:0;top:0;width:100%;height:100%}.com-3-article-panel-media{display:table;table-layout:fixed;width:100%}.com-3-article-panel-body{display:table-cell;vertical-align:top}.com-3-article-panel-object{display:table-cell;vertical-align:top;padding-left:30px;width:150px}.com-3-article-panel-title{font-size:20px;line-height:26px;color:#333;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-3-article-panel-desc{margin-top:10px;font-size:14px;line-height:24px;color:#666;word-wrap:break-word;display:block;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:2;max-height:48px}.com-3-article-panel-infos{position:relative;z-index:2;margin-top:10px;font-size:0}.com-3-article-panel-mark{display:inline-block;vertical-align:middle;box-sizing:border-box;margin-top:5px;margin-right:15px;padding:0 5px;height:18px;border:1px solid #ddd;background-color:#fff;color:#666;font-size:12px;line-height:16px}.com-3-article-panel-mark.sticky{position:relative;top:-2px;margin-top:0;border-color:#FFC693;color:#FF7800;background-color:#FDF7F2}.com-3-article-panel-source{display:inline-block;vertical-align:middle;margin-top:5px;margin-right:15px;font-size:12px;line-height:18px;color:#999}.com-3-article-panel-source .item{display:inline-block;vertical-align:middle;vertical-align:middle;color:inherit}.com-3-article-panel-source .author{max-width:16em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-3-article-panel-source .item:before{content:'';position:relative;top:-1px;display:inline-block;vertical-align:middle;margin:0 5px;width:2px;height:2px;background-color:#999;border-radius:50%}.com-3-article-panel-source .item:first-child:before{display:none}.com-3-article-panel-source a.item:hover{color:#00a4ff}.com-3-article-panel-tags{display:inline;vertical-align:middle;position:relative;top:3px}.com-3-article-panel-thumbnail{width:150px;height:112px}.com-3-article-panel.special .com-3-article-panel-object{width:200px;padding-left:0;padding-right:24px}.com-3-article-panel.special .com-3-article-panel-thumbnail{position:relative;width:200px;height:150px}.com-3-article-panel-special{position:absolute;right:0;top:0;padding:0 8px;height:28px;background-color:#FF7800;font-size:14px;line-height:28px;font-weight:500;color:#fff}.com-side-ranks .rank-more{padding-bottom:20px;border-bottom:1px solid #eee;text-align:center}.com-side-ranks .com-side-article-ranks,.com-side-ranks .com-side-column-ranks,.com-side-ranks .com-side-user-ranks{border-bottom:none}.com-modal-set-name .set-form{margin-top:20px}.com-modal-set-name .com-form-title{font-size:14px;width:60px}.com-modal-set-name .c-input-text{width:100%}.com-modal-set-name .c-textarea{box-sizing:border-box;width:100%}.com-modal-set-name .set-tip{margin-top:10px;color:#999}.com-sticky-header{position:fixed;left:0;top:0;z-index:1001;-webkit-box-sizing:border-box;box-sizing:border-box;padding-left:10px;padding-right:10px;width:100%;min-width:1000px;background:#fff;-webkit-box-shadow:0 2px 2px 0 rgba(207,216,221,.7);box-shadow:0 2px 2px 0 rgba(207,216,221,.7);-webkit-transition:-webkit-transform .3s,opacity .3s,visibility .3s;transition:transform .3s,opacity .3s,visibility .3s}.com-sticky-header.hidden{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:hidden;opacity:0;pointer-events:none}.com-sticky-header>.com-inner{position:relative;padding-top:10px;padding-bottom:10px;display:table;table-layout:fixed;width:100%}.com-sticky-header-main{display:table-cell;vertical-align:middle}.com-sticky-header-title{font-size:16px;line-height:36px;color:#000;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-sticky-header-extra{display:table-cell;vertical-align:middle;padding-left:20px;width:200px;text-align:right;line-height:36px}.com-sticky-header .c-btn{vertical-align:middle;margin-left:10px;min-width:80px}.com-text-collapse{overflow:hidden;font-size:14px;line-height:26px;text-align:left}.com-text-collapse-inner{box-sizing:border-box;margin-left:-60px;width:calc(100% + 60px);overflow:hidden;max-height:156px}.com-text-collapse-cnt{position:relative;float:right;box-sizing:border-box;padding-left:60px;margin-left:calc(60px - 100%);width:100%}.com-text-collapse-cnt-all-text{color:transparent}.com-text-collapse-cnt-begin-text{position:absolute;left:60px;right:0;top:0;max-height:130px;overflow:hidden}.com-text-collapse-cnt-last-line{position:absolute;left:60px;right:60px;top:130px;overflow:hidden}.com-text-collapse-cnt-last-line>.last-line-inner{margin-top:-130px;width:calc(100% + 60px)}.com-text-collapse-cnt-last-line:after{content:'';position:absolute;right:0;top:0;width:15px;height:100%;background:linear-gradient(to right,rgba(255,255,255,0),rgba(255,255,255,1))}.com-text-collapse-placeholder{float:right;width:calc(100% - 60px);max-height:156px;overflow:hidden;color:transparent}.com-text-collapse-ctrl{position:relative;float:right;height:auto;background-color:transparent;width:60px}.com-text-collapse-ctrl a{position:absolute;left:100%;bottom:0;text-align:right;width:60px;color:#00a4ff;text-decoration:none;line-height:26px}.com-text-collapse-ctrl a:after{position:relative;content:'';display:inline-block;vertical-align:middle;top:-1px;margin-left:5px;width:13px;height:7px;background-image:url(sprite/base-201911131148.svg);;transition:transform .2s ease-in-out;background-position:99.19% 96.7%;background-size:3876.9230769230767% 7028.571428571429%;;background-repeat:no-repeat}.com-text-collapse.show .com-text-collapse-inner{max-height:none}.com-text-collapse.show .com-text-collapse-ctrl{float:none;clear:both;height:26px;width:auto}.com-text-collapse.show .com-text-collapse-cnt-all-text{color:inherit}.com-text-collapse.show .com-text-collapse-cnt-begin-text,.com-text-collapse.show .com-text-collapse-cnt-last-line{display:none}.com-text-collapse.show .com-text-collapse-ctrl a{left:auto;right:0;background:0 0}.com-text-collapse.show .com-text-collapse-ctrl a:after{transform:rotate3d(0,0,1,180deg)}.com-column-panel{position:relative;padding:30px 0;border-bottom:1px solid #E5E8ED;cursor:pointer}.com-column-panel:hover{background:linear-gradient(to right,rgba(243,245,249,0),rgba(243,245,249,100) 15%,rgba(243,245,249,100) 85%,rgba(243,245,249,0))}.com-column-panel-link{position:absolute;left:0;top:0;width:100%;height:100%;z-index:1}.com-column-panel-inner{box-sizing:border-box;display:table;width:100%;table-layout:fixed}.com-column-panel-object{display:table-cell;width:90px;padding-right:15px;vertical-align:middle}.com-column-panel-avatar{width:90px;height:90px}.com-column-panel-avatar .com-2-avatar-inner{border-radius:50%}.com-column-panel-body{display:table-cell;vertical-align:top;padding-top:4px}.com-column-panel-title{font-size:20px;line-height:26px;color:#333;font-weight:500;position:relative;display:inline-block;vertical-align:middle;box-sizing:border-box;padding-right:80px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.com-column-panel-mark{position:absolute;right:0;top:3px;box-sizing:border-box;display:inline-block;vertical-align:3px;margin-left:10px;height:20px;padding:0 10px;font-size:12px;line-height:20px;color:#666;border-radius:10px;background-color:#EFEFEF;font-weight:400}.com-column-panel-update{display:inline-block;vertical-align:2px;font-size:14px;line-height:20px;color:#00a4ff;font-weight:500}.com-column-panel-update:before{content:'';display:inline-block;vertical-align:2px;margin:0 10px;width:6px;height:6px;background-color:#00a4ff;border-radius:50%}.com-column-panel-desc{margin-top:7px;font-size:14px;line-height:20px;color:#666;word-wrap:break-word}.com-column-panel-infos{margin-top:9px}.com-column-panel-infos .com-data{font-size:14px;line-height:20px}.com-column-panel.has-btns .com-column-panel-body{position:relative;padding-right:100px}.com-column-panel-btns{position:absolute;right:0;top:50%;z-index:2;margin-top:-16px}.com-column-panel-btns .c-btn{padding:0 10px}.coml-2-user-panel{position:relative;padding:30px 0;border-bottom:1px solid #E5E8ED;cursor:pointer}.coml-2-user-panel:hover{background:linear-gradient(to right,rgba(243,245,249,0),rgba(243,245,249,100) 15%,rgba(243,245,249,100) 85%,rgba(243,245,249,0))}.coml-2-user-panel-link{position:absolute;left:0;top:0;width:100%;height:100%;z-index:1}.coml-2-user-panel-inner{box-sizing:border-box;display:table;width:100%;table-layout:fixed}.coml-2-user-panel-object{display:table-cell;width:90px;padding-right:15px;vertical-align:middle}.coml-2-user-panel-avatar{width:90px;height:90px}.coml-2-user-panel-body{display:table-cell;vertical-align:top;padding-top:4px}.coml-2-user-panel-title{position:relative;display:inline-block;vertical-align:middle;font-size:20px;line-height:26px;color:#333;font-weight:500;box-sizing:border-box;padding-right:20px;max-width:100%}.coml-2-user-panel-title .name{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.coml-2-user-panel-title .com-verification{position:absolute;right:0;top:7px;z-index:2}.coml-2-user-panel-desc{margin-top:7px;font-size:14px;line-height:20px;color:#666;word-wrap:break-word}.coml-2-user-panel-infos{margin-top:9px}.coml-2-user-panel-infos .com-data{font-size:14px;line-height:20px}.coml-2-user-panel.has-btns .coml-2-user-panel-body{position:relative;padding-right:100px}.coml-2-user-panel-btns{position:absolute;right:0;top:50%;z-index:2;margin-top:-16px}.coml-2-user-panel-btns .c-btn{padding:0 10px}.com-3-salon-panel{position:relative;padding:30px 0;border-bottom:1px solid #E5E8ED;cursor:pointer}.com-3-salon-panel:hover{background:linear-gradient(to right,rgba(243,245,249,0),rgba(243,245,249,100) 15%,rgba(243,245,249,100) 85%,rgba(243,245,249,0))}.com-3-salon-panel-link{position:absolute;left:0;top:0;width:100%;height:100%;z-index:1}.com-3-salon-panel-inner{box-sizing:border-box;display:table;width:100%;table-layout:fixed}.com-3-salon-panel-object{display:table-cell;width:150px;padding-right:20px;vertical-align:middle}.com-3-salon-panel-img{box-sizing:border-box;width:150px;height:112px;border:1px solid #E5E8ED;background-color:#D8D8D8;background-position:right -66px center;background-repeat:no-repeat;background-size:cover}.com-3-salon-panel-body{display:table-cell;vertical-align:middle}.com-3-salon-panel-title{font-size:20px;line-height:32px;color:#333;font-weight:500;word-wrap:break-word}.com-3-salon-panel-infos{margin-top:8px;font-size:0}.com-3-salon-panel-info{font-size:14px;line-height:24px;color:#999}.com-3-salon-panel-info:before{content:'';display:inline-block;vertical-align:3px;margin:0 8px;width:2px;height:2px;background-color:#999;border-radius:50%}.com-3-salon-panel-info:first-child:before{display:none}.com-3-salon-panel-info.end{color:#999}.com-3-team-panel{position:relative;padding:30px 0;border-bottom:1px solid #E5E8ED;cursor:pointer}.com-3-team-panel:hover{background:linear-gradient(to right,rgba(243,245,249,0),rgba(243,245,249,100) 15%,rgba(243,245,249,100) 85%,rgba(243,245,249,0))}.com-3-team-panel-link{position:absolute;left:0;top:0;width:100%;height:100%;z-index:1}.com-3-team-panel-inner{box-sizing:border-box;display:table;width:100%;table-layout:fixed}.com-3-team-panel-object{display:table-cell;width:80px;padding-right:15px;vertical-align:middle}.com-3-team-panel-members{box-sizing:border-box;width:82px;height:82px;border:1px solid #DDD;background-color:#ddd;border-radius:2px;overflow:hidden}.com-3-team-panel-members-inner{overflow:hidden;zoom:1}.com-3-team-panel-member{float:left;box-sizing:border-box;width:40px;height:40px;border:1px solid #DDD;background-size:cover;background-position:center;background-repeat:no-repeat}.com-3-team-panel-body{display:table-cell;vertical-align:middle}.com-3-team-panel-title{font-size:22px;line-height:30px;color:#000;font-weight:400;position:relative;display:inline-block;vertical-align:middle;box-sizing:border-box;padding-right:70px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.com-3-team-panel-update{position:absolute;right:0;top:5px;display:inline-block;vertical-align:3px;font-size:14px;line-height:20px;color:#00a4ff;font-weight:500}.com-3-team-panel-update:before{content:'';display:inline-block;vertical-align:1px;margin:0 10px;width:6px;height:6px;background-color:#00a4ff;border-radius:50%}.com-3-team-panel-desc{margin-top:7px;font-size:14px;line-height:20px;color:#666;word-wrap:break-word}.com-3-team-panel-infos{margin-top:9px}.com-3-team-panel-infos .com-data{font-size:14px;line-height:20px}.com-3-team-panel.has-btns .com-3-team-panel-body{position:relative;padding-right:100px}.com-3-team-panel-btns{position:absolute;right:0;top:50%;z-index:2;margin-top:-16px}.com-3-team-panel-btns .c-btn{padding:0 10px}.com-3-tag-panel{position:relative;padding:30px 0;border-bottom:1px solid #E5E8ED;cursor:pointer}.com-3-tag-panel:hover{background:linear-gradient(to right,rgba(243,245,249,0),rgba(243,245,249,100) 15%,rgba(243,245,249,100) 85%,rgba(243,245,249,0))}.com-3-tag-panel-link{position:absolute;left:0;top:0;width:100%;height:100%;z-index:1}.com-3-tag-panel-inner{box-sizing:border-box}.com-3-tag-panel-title{font-size:20px;line-height:26px;color:#333;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-3-tag-panel-img{display:inline-block;vertical-align:middle;margin-right:5px;position:relative;top:-1px;width:20px;height:20px;background-size:100% auto;background-repeat:no-repeat}.com-3-tag-panel-desc{margin-top:7px;font-size:14px;line-height:20px;color:#666;word-wrap:break-word}.com-3-tag-panel-infos{margin-top:9px}.com-3-tag-panel.has-btns .com-3-tag-panel-inner{position:relative;padding-right:100px}.com-3-tag-panel-btns{position:absolute;right:0;top:50%;z-index:2;margin-top:-16px}.com-3-tag-panel-btns .c-btn{padding:0 10px}.com-team-card{position:relative;box-sizing:border-box;height:220px;padding:30px 20px 0;cursor:pointer;transition:box-shadow .3s linear;border:1px solid #E5E8ED;text-align:center}.com-team-card:hover{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-team-card-link{position:absolute;left:0;top:0;width:100%;height:100%;z-index:1}.com-team-card-title{font-size:16px;line-height:22px;color:#333;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-team-card-infos,.com-team-card-members{margin-top:20px}.com-team-card-btns{position:relative;z-index:2;text-align:center;margin-top:20px;pointer-events:none}.com-team-card-btns .c-btn{pointer-events:auto;padding:0 10px;min-width:0;width:80px;height:28px;line-height:26px;font-size:12px}.com-lattice{font-size:0}.com-lattice>.com-lattice-cell{display:inline-block;vertical-align:top;width:100%;font-size:14px;text-align:left;margin-bottom:40px}.com-lattice.com-lattice-cols-1>.com-lattice-cell{width:100%}.com-lattice.com-lattice-cols-2>.com-lattice-cell{margin-right:60px;width:calc((100% - 60px * (2 - 1) - 1px)/ 2)}.com-lattice.com-lattice-cols-2>.com-lattice-cell:nth-child(2n){margin-right:0}.com-lattice.com-lattice-cols-2>.com-lattice-cell:nth-child(2n):after{display:none}.com-lattice.com-lattice-cols-3>.com-lattice-cell{margin-right:60px;width:calc((100% - 60px * (3 - 1) - 1px)/ 3)}.com-lattice.com-lattice-cols-3>.com-lattice-cell:nth-child(3n){margin-right:0}.com-lattice.com-lattice-cols-3>.com-lattice-cell:nth-child(3n):after{display:none}.com-lattice.com-lattice-cols-4>.com-lattice-cell{margin-right:60px;width:calc((100% - 60px * (4 - 1) - 1px)/ 4)}.com-lattice.com-lattice-cols-4>.com-lattice-cell:nth-child(4n){margin-right:0}.com-lattice.com-lattice-cols-4>.com-lattice-cell:nth-child(4n):after{display:none}.com-lattice.com-lattice-cols-5>.com-lattice-cell{margin-right:60px;width:calc((100% - 60px * (5 - 1) - 1px)/ 5)}.com-lattice.com-lattice-cols-5>.com-lattice-cell:nth-child(5n){margin-right:0}.com-lattice.com-lattice-cols-5>.com-lattice-cell:nth-child(5n):after{display:none}.com-lattice.com-lattice-cols-6>.com-lattice-cell{margin-right:60px;width:calc((100% - 60px * (6 - 1) - 1px)/ 6)}.com-lattice.com-lattice-cols-6>.com-lattice-cell:nth-child(6n){margin-right:0}.com-lattice.com-lattice-cols-6>.com-lattice-cell:nth-child(6n):after{display:none}.com-lattice.com-lattice-without-margin{margin-bottom:-40px}.com-lattice-line{font-size:0}.com-lattice-line>.com-lattice-cell{display:inline-block;vertical-align:top;width:100%;font-size:14px;text-align:left;margin-bottom:20px;position:relative}.com-lattice-line.com-lattice-cols-1>.com-lattice-cell{width:100%}.com-lattice-line.com-lattice-cols-2>.com-lattice-cell{margin-right:80px;width:calc((100% - 80px * (2 - 1) - 1px)/ 2)}.com-lattice-line.com-lattice-cols-2>.com-lattice-cell:nth-child(2n){margin-right:0}.com-lattice-line.com-lattice-cols-2>.com-lattice-cell:nth-child(2n):after{display:none}.com-lattice-line.com-lattice-cols-3>.com-lattice-cell{margin-right:80px;width:calc((100% - 80px * (3 - 1) - 1px)/ 3)}.com-lattice-line.com-lattice-cols-3>.com-lattice-cell:nth-child(3n){margin-right:0}.com-lattice-line.com-lattice-cols-3>.com-lattice-cell:nth-child(3n):after{display:none}.com-lattice-line.com-lattice-cols-4>.com-lattice-cell{margin-right:80px;width:calc((100% - 80px * (4 - 1) - 1px)/ 4)}.com-lattice-line.com-lattice-cols-4>.com-lattice-cell:nth-child(4n){margin-right:0}.com-lattice-line.com-lattice-cols-4>.com-lattice-cell:nth-child(4n):after{display:none}.com-lattice-line.com-lattice-cols-5>.com-lattice-cell{margin-right:80px;width:calc((100% - 80px * (5 - 1) - 1px)/ 5)}.com-lattice-line.com-lattice-cols-5>.com-lattice-cell:nth-child(5n){margin-right:0}.com-lattice-line.com-lattice-cols-5>.com-lattice-cell:nth-child(5n):after{display:none}.com-lattice-line.com-lattice-cols-6>.com-lattice-cell{margin-right:80px;width:calc((100% - 80px * (6 - 1) - 1px)/ 6)}.com-lattice-line.com-lattice-cols-6>.com-lattice-cell:nth-child(6n){margin-right:0}.com-lattice-line.com-lattice-cols-6>.com-lattice-cell:nth-child(6n):after{display:none}.com-lattice-line.com-lattice-without-margin{margin-bottom:-20px}.com-lattice-line>.com-lattice-cell:after{content:'';position:absolute;right:-40px;top:50%;margin-top:-70px;width:1px;height:140px;background-color:#e5e5e5}.com-lattice-line.com-lattice-cols-1>.com-lattice-cell:after,.com-lattice-line>.com-lattice-cell:last-child:after{display:none}.com-lattice-card{font-size:0}.com-lattice-card>.com-lattice-cell{display:inline-block;vertical-align:top;width:100%;font-size:14px;text-align:left;margin-bottom:20px}.com-lattice-card.com-lattice-cols-1>.com-lattice-cell{width:100%}.com-lattice-card.com-lattice-cols-2>.com-lattice-cell{margin-right:20px;width:calc((100% - 20px * (2 - 1) - 1px)/ 2)}.com-lattice-card.com-lattice-cols-2>.com-lattice-cell:nth-child(2n){margin-right:0}.com-lattice-card.com-lattice-cols-2>.com-lattice-cell:nth-child(2n):after{display:none}.com-lattice-card.com-lattice-cols-3>.com-lattice-cell{margin-right:20px;width:calc((100% - 20px * (3 - 1) - 1px)/ 3)}.com-lattice-card.com-lattice-cols-3>.com-lattice-cell:nth-child(3n){margin-right:0}.com-lattice-card.com-lattice-cols-3>.com-lattice-cell:nth-child(3n):after{display:none}.com-lattice-card.com-lattice-cols-4>.com-lattice-cell{margin-right:20px;width:calc((100% - 20px * (4 - 1) - 1px)/ 4)}.com-lattice-card.com-lattice-cols-4>.com-lattice-cell:nth-child(4n){margin-right:0}.com-lattice-card.com-lattice-cols-4>.com-lattice-cell:nth-child(4n):after{display:none}.com-lattice-card.com-lattice-cols-5>.com-lattice-cell{margin-right:20px;width:calc((100% - 20px * (5 - 1) - 1px)/ 5)}.com-lattice-card.com-lattice-cols-5>.com-lattice-cell:nth-child(5n){margin-right:0}.com-lattice-card.com-lattice-cols-5>.com-lattice-cell:nth-child(5n):after{display:none}.com-lattice-card.com-lattice-cols-6>.com-lattice-cell{margin-right:20px;width:calc((100% - 20px * (6 - 1) - 1px)/ 6)}.com-lattice-card.com-lattice-cols-6>.com-lattice-cell:nth-child(6n){margin-right:0}.com-lattice-card.com-lattice-cols-6>.com-lattice-cell:nth-child(6n):after{display:none}.com-lattice-card.com-lattice-without-margin{margin-bottom:-20px}.com-lattice-center{text-align:center}.com-tag-card{position:relative;box-sizing:border-box;height:210px;padding:20px 20px 0;cursor:pointer;transition:box-shadow .3s linear;border:1px solid #E5E8ED}.com-tag-card:hover{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-tag-card-link{position:absolute;left:0;top:0;width:100%;height:100%;z-index:1}.com-tag-card-title{font-size:16px;line-height:32px;color:#333;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-tag-card-img{display:inline-block;vertical-align:middle;position:relative;top:-1px;margin-right:10px;width:32px;height:32px;background-repeat:no-repeat}.com-tag-card-desc{margin-top:10px;font-size:14px;line-height:20px;color:#666;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;max-height:40px}.com-tag-card-infos{margin-top:10px;text-align:center}.com-tag-card-btns{position:relative;z-index:2;text-align:center;text-align:center;margin-top:17px;pointer-events:none}.com-tag-card-btns .c-btn{pointer-events:auto;padding:0 10px;min-width:0;width:80px;height:28px;line-height:26px;font-size:12px}.com-3-ask-panel{position:relative;box-sizing:border-box;padding:30px 0;border-bottom:1px solid #E5E8ED;cursor:pointer}.com-3-ask-panel-inner{position:relative}.com-3-ask-panel:hover{background:linear-gradient(to right,rgba(243,245,249,0),rgba(243,245,249,100) 15%,rgba(243,245,249,100) 85%,rgba(243,245,249,0))}.com-3-ask-panel-link{position:absolute;left:0;top:0;width:100%;height:100%;z-index:1}.com-3-ask-panel-title{font-size:20px;line-height:28px;color:#333;font-weight:700}.com-3-ask-panel-tags{position:relative;z-index:2;margin-top:5px;margin-bottom:0}.com-3-ask-panel.has-num .com-3-ask-panel-inner{padding-left:66px;min-height:46px}.com-3-ask-panel-answer{position:absolute;left:0;top:0;-webkit-box-sizing:border-box;box-sizing:border-box;padding:5px 5px 0;width:46px;height:46px;border-radius:2px;background-color:#E1EEFA;line-height:1.2;color:#00a4ff;text-align:center;cursor:pointer}.com-3-ask-panel-answer .num{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:16px}.com-3-ask-panel-answer .name{font-size:12px}.com-3-ask-panel-answer.none-answer{background-color:#F3F4F5;color:#444}.com-3-ask-panel.has-num .com-3-ask-panel-inner{padding-right:100px}.com-3-ask-panel-btns{position:absolute;right:0;top:50%;z-index:2;margin-top:-16px}.com-3-ask-panel-btns .c-btn{padding:0 10px}.com-4-user-panel{position:relative;text-align:center;padding:20px 10px;transition:box-shadow .3s linear}.com-4-user-panel:hover{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-4-user-panel .panel-link{position:absolute;left:0;top:0;z-index:1;width:100%;height:100%}.com-4-user-panel-avatar{display:block;margin:0 auto 12px;width:90px;height:90px}.com-4-user-panel-name{box-sizing:border-box;position:relative;display:inline-block;vertical-align:middle;max-width:100%;font-size:18px;line-height:26px;color:#000;font-weight:400}.com-4-user-panel-name.with-verify{padding-right:20px}.com-4-user-panel-name .com-verification{position:absolute;right:0;top:8px;z-index:2}.com-4-user-panel-name-inner{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:inherit}.com-4-user-panel-identity{margin-top:6px;font-size:14px;line-height:20px;color:#999;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-4-user-panel-btns{position:relative;z-index:2;margin-top:20px;pointer-events:none}.com-4-user-panel-btn{padding:0 10px;min-width:0;width:80px;height:28px;line-height:26px;font-size:12px;pointer-events:auto}.com-2-column-panel{position:relative;text-align:center;padding:20px 10px;transition:box-shadow .3s linear}.com-2-column-panel:hover{box-shadow:0 0 6px rgba(207,216,221,.63),0 4px 6px rgba(207,216,221,.63)}.com-2-column-panel .panel-link{position:absolute;left:0;top:0;z-index:1;width:100%;height:100%}.com-2-column-panel-avatar{display:block;margin:0 auto 12px;width:90px;height:90px}.com-2-column-panel-avatar .com-2-avatar-inner{border-radius:50%}.com-2-column-panel-title{box-sizing:border-box;position:relative;display:inline-block;vertical-align:middle;max-width:100%;font-size:18px;line-height:26px;color:#000;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.com-2-column-panel-infos{margin-top:6px;font-size:0}.com-2-column-panel-info{display:inline-block;vertical-align:middle;font-size:14px;line-height:20px;color:#999}.com-2-column-panel-info:before{content:'';position:relative;top:-1px;display:inline-block;vertical-align:middle;margin:0 10px;width:2px;height:2px;background-color:#999;border-radius:50%}.com-2-column-panel-info:first-child:before{display:none}.com-2-column-panel-btns{position:relative;z-index:2;margin-top:20px;pointer-events:none}.com-2-column-panel-btn{padding:0 10px;min-width:0;width:80px;height:28px;line-height:26px;font-size:12px;pointer-events:auto}.com-arrow-link{color:#00a4ff}.com-arrow-link:after{content:'';display:inline-block;vertical-align:-2px;margin-left:5px;width:7px;height:13px;overflow:hidden;background-image:url(sprite/base-201911131148.svg);;-webkit-transition:-webkit-transform .4s;transition:-webkit-transform .4s;transition:transform .4s;transition:transform .4s,-webkit-transform .4s;background-position:82.69999999999999% 82.05%;background-size:7200% 3784.6153846153848%;;background-repeat:no-repeat}.com-arrow-link:hover:after{-webkit-transform:translateX(8px);transform:translateX(8px)}.com-arrow-link.gray{color:#666}.com-arrow-link.gray:hover{color:#00a4ff}.com-arrow-link.gray:after{background-image:url(sprite/base-201911131148.svg);;background-position:70.42% 66.18%;background-size:7200% 3784.6153846153848%;;background-repeat:no-repeat}.com-arrow-link.gray:hover:after{background-image:url(sprite/base-201911131148.svg);;background-position:18.91% 5.8500000000000005%;background-size:7200% 3784.6153846153848%;;background-repeat:no-repeat}.com-adpanel{display:block;height:100px;font-size:0;background:url(components/Adpanel/css/img/adbg1@2x.jpg) center no-repeat;background-size:cover;text-align:center;color:#fff;-webkit-transition:-webkit-box-shadow .2s ease,-webkit-transform .2s ease;transition:-webkit-box-shadow .2s ease,-webkit-transform .2s ease;transition:box-shadow .2s ease,transform .2s ease;transition:box-shadow .2s ease,transform .2s ease,-webkit-box-shadow .2s ease,-webkit-transform .2s ease;-webkit-font-smoothing:antialiased}.com-adpanel:hover{-webkit-transform:translateY(-2px);transform:translateY(-2px)}.com-adpanel:before{content:'';width:0;height:100%;display:inline-block;vertical-align:middle}.com-adpanel .text{display:inline-block;vertical-align:middle;max-width:99%;font-size:18px}.com-switch{position:relative;display:inline-block;vertical-align:middle;width:35px;height:20px}.com-switch-input{position:absolute;top:0;left:0;opacity:0}.com-switch-toggle{position:absolute;top:0;left:0;display:inline-block;width:100%;height:100%;border-radius:26px;overflow:hidden;background-color:#999;padding:0;transition-duration:.4s;transition-property:background-color;font-size:0;cursor:pointer}.com-switch-toggle:before{content:'';position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:100%;background-color:#fff;pointer-events:none;transition-timing-function:cubic-bezier(.54,1.85,.5,1);transition-duration:.4s;transition-property:left;box-shadow:0 2px 4px rgba(0,0,0,.3)}.com-switch:hover .com-switch-toggle:before{background-color:#f2f2f2}.com-switch-toggle:after{position:absolute;top:4px;left:20px;display:none;content:"";width:12px;height:12px;background-image:url(sprite/base-201911131148.svg);;-moz-animation:spin .6s infinite linear;-webkit-animation:spin .6s infinite linear;animation:spin .6s infinite linear;background-position:8.74% 99.58%;background-size:4200% 4100%;;background-repeat:no-repeat}.com-switch-loading .com-switch-input:disabled+.com-switch-toggle:after{display:block}.com-switch-loading .com-switch-input:checked:disabled+.com-switch-toggle:after{left:4px}.com-switch-loading:hover .com-switch-toggle:before{background-color:#fff}.com-switch-checked .com-switch-toggle:before,.com-switch-input:checked+.com-switch-toggle:before{left:17px}.com-switch-checked .com-switch-toggle,.com-switch-input:checked+.com-switch-toggle{background-color:#00a4ff}.com-switch-disabled .com-switch-toggle,.com-switch-input:disabled+.com-switch-toggle{background-color:#e5e5e5;cursor:not-allowed}.com-switch-checked.com-switch-disabled .com-switch-toggle,.com-switch-input:checked:disabled+.com-switch-toggle{background-color:#79b0f9;cursor:not-allowed}.com-switch-disabled:hover .com-switch-toggle:before{background-color:#fff}.com-switch-wrap{display:inline-block;vertical-align:middle;font-size:0}.com-switch-text{margin-left:10px;font-size:12px;color:#000;line-height:20px;display:inline-block;vertical-align:middle}.com-3-section-mb{margin-bottom:50px}.com-3-section-hd{position:relative;margin-bottom:24px;font-size:0;line-height:36px}.com-3-section-title{position:relative;display:inline-block;vertical-align:middle;padding-left:38px;height:36px;font-size:24px;line-height:36px;font-weight:500;color:#000;-webkit-font-smoothing:antialiased}.com-3-section-title-icon{position:absolute;left:0;top:50%;margin-top:-14px;width:28px;height:28px}.com-3-section-title-icon.article{background-image:url(sprite/base-201911131148.svg);;background-position:63.239999999999995% 78.23%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-3-section-title-icon.column{background-image:url(sprite/base-201911131148.svg);;background-position:69.54% 71.77%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-3-section-title-icon.salon{background-image:url(sprite/base-201911131148.svg);;background-position:50.629999999999995% 78.23%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-3-section-title-icon.calendar{background-image:url(sprite/base-201911131148.svg);;background-position:0.21% 78.23%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-3-section-title-icon.specialist{background-image:url(sprite/base-201911131148.svg);;background-position:31.72% 78.23%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-3-section-title-icon.activities{background-image:url(sprite/base-201911131148.svg);;background-position:82.56% 0.22%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-3-section-title-icon.special{background-image:url(sprite/base-201911131148.svg);;background-position:38.03% 78.23%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-3-section-title-icon.news{background-image:url(sprite/base-201911131148.svg);;background-position:19.12% 71.77%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-3-section-title-icon.team{background-image:url(sprite/base-201911131148.svg);;background-position:12.82% 71.77%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-3-section-title-icon.team-article{background-image:url(sprite/base-201911131148.svg);;background-position:41.81% 35.99%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-3-section-title-icon.ask{background-image:url(sprite/base-201911131148.svg);;background-position:25.419999999999998% 78.23%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-3-section-title-icon.ask-team{background-image:url(sprite/base-201911131148.svg);;background-position:19.12% 78.23%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-3-section-title-icon.dev{background-image:url(sprite/base-201911131148.svg);;background-position:31.72% 71.77%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-3-section-title-icon.contributor{background-image:url(sprite/base-201911131148.svg);;background-position:44.330000000000005% 71.77%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-3-section-title-icon.product{background-image:url(sprite/base-201911131148.svg);;background-position:27.939999999999998% 21.77%;background-size:1800% 1757.1428571428573%;;background-repeat:no-repeat}.com-3-section-hd-extra{position:absolute;right:0;top:0}.com-3-section-hd-extra .com-arrow-link{font-size:14px;line-height:36px}.rno-grid-layout{overflow:hidden}.rno-grid-row{display:block;margin-right:0;margin-left:0;font-size:0;-webkit-box-sizing:border-box;box-sizing:border-box}.rno-grid-row-split-line .rno-grid-col{position:relative}.rno-grid-row-split-line .rno-grid-col::before{content:"";position:absolute;top:0;bottom:0;left:0;display:block;width:1px;background-color:#e8e8e8}.rno-grid-row-mlr0{margin-left:0 !important;margin-right:0 !important}.rno-grid-col{display:inline-block;vertical-align:top;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:14px}[class*=rno-grid-col-pull-],[class*=rno-grid-col-push-]{position:relative}.rno-grid-col-0{display:none}.rno-grid-col-offset-0{margin-left:0}.rno-grid-col-pull-0{right:auto}.rno-grid-col-push-0{left:auto}.rno-grid-col-order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.rno-grid-col-1{display:inline-block;width:4.1666666667%}.rno-grid-col-offset-1{margin-left:4.1666666667%}.rno-grid-col-pull-1{right:4.1666666667%}.rno-grid-col-push-1{left:4.1666666667%}.rno-grid-col-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.rno-grid-col-2{display:inline-block;width:8.3333333333%}.rno-grid-col-offset-2{margin-left:8.3333333333%}.rno-grid-col-pull-2{right:8.3333333333%}.rno-grid-col-push-2{left:8.3333333333%}.rno-grid-col-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.rno-grid-col-3{display:inline-block;width:12.5%}.rno-grid-col-offset-3{margin-left:12.5%}.rno-grid-col-pull-3{right:12.5%}.rno-grid-col-push-3{left:12.5%}.rno-grid-col-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.rno-grid-col-4{display:inline-block;width:16.6666666667%}.rno-grid-col-offset-4{margin-left:16.6666666667%}.rno-grid-col-pull-4{right:16.6666666667%}.rno-grid-col-push-4{left:16.6666666667%}.rno-grid-col-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.rno-grid-col-5{display:inline-block;width:20%}.rno-grid-col-offset-5{margin-left:20%}.rno-grid-col-pull-5{right:20%}.rno-grid-col-push-5{left:20%}.rno-grid-col-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.rno-grid-col-6{display:inline-block;width:25%}.rno-grid-col-offset-6{margin-left:25%}.rno-grid-col-pull-6{right:25%}.rno-grid-col-push-6{left:25%}.rno-grid-col-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.rno-grid-col-7{display:inline-block;width:29.1666666667%}.rno-grid-col-offset-7{margin-left:29.1666666667%}.rno-grid-col-pull-7{right:29.1666666667%}.rno-grid-col-push-7{left:29.1666666667%}.rno-grid-col-order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.rno-grid-col-8{display:inline-block;width:33.3333333333%}.rno-grid-col-offset-8{margin-left:33.3333333333%}.rno-grid-col-pull-8{right:33.3333333333%}.rno-grid-col-push-8{left:33.3333333333%}.rno-grid-col-order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.rno-grid-col-9{display:inline-block;width:37.5%}.rno-grid-col-offset-9{margin-left:37.5%}.rno-grid-col-pull-9{right:37.5%}.rno-grid-col-push-9{left:37.5%}.rno-grid-col-order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.rno-grid-col-10{display:inline-block;width:41.6666666667%}.rno-grid-col-offset-10{margin-left:41.6666666667%}.rno-grid-col-pull-10{right:41.6666666667%}.rno-grid-col-push-10{left:41.6666666667%}.rno-grid-col-order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.rno-grid-col-11{display:inline-block;width:45.8333333333%}.rno-grid-col-offset-11{margin-left:45.8333333333%}.rno-grid-col-pull-11{right:45.8333333333%}.rno-grid-col-push-11{left:45.8333333333%}.rno-grid-col-order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.rno-grid-col-12{display:inline-block;width:50%}.rno-grid-col-offset-12{margin-left:50%}.rno-grid-col-pull-12{right:50%}.rno-grid-col-push-12{left:50%}.rno-grid-col-order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.rno-grid-col-13{display:inline-block;width:54.1666666667%}.rno-grid-col-offset-13{margin-left:54.1666666667%}.rno-grid-col-pull-13{right:54.1666666667%}.rno-grid-col-push-13{left:54.1666666667%}.rno-grid-col-order-13{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.rno-grid-col-14{display:inline-block;width:58.3333333333%}.rno-grid-col-offset-14{margin-left:58.3333333333%}.rno-grid-col-pull-14{right:58.3333333333%}.rno-grid-col-push-14{left:58.3333333333%}.rno-grid-col-order-14{-webkit-box-ordinal-group:15;-webkit-order:14;-ms-flex-order:14;order:14}.rno-grid-col-15{display:inline-block;width:62.5%}.rno-grid-col-offset-15{margin-left:62.5%}.rno-grid-col-pull-15{right:62.5%}.rno-grid-col-push-15{left:62.5%}.rno-grid-col-order-15{-webkit-box-ordinal-group:16;-webkit-order:15;-ms-flex-order:15;order:15}.rno-grid-col-16{display:inline-block;width:66.6666666667%}.rno-grid-col-offset-16{margin-left:66.6666666667%}.rno-grid-col-pull-16{right:66.6666666667%}.rno-grid-col-push-16{left:66.6666666667%}.rno-grid-col-order-16{-webkit-box-ordinal-group:17;-webkit-order:16;-ms-flex-order:16;order:16}.rno-grid-col-17{display:inline-block;width:70.8333333333%}.rno-grid-col-offset-17{margin-left:70.8333333333%}.rno-grid-col-pull-17{right:70.8333333333%}.rno-grid-col-push-17{left:70.8333333333%}.rno-grid-col-order-17{-webkit-box-ordinal-group:18;-webkit-order:17;-ms-flex-order:17;order:17}.rno-grid-col-18{display:inline-block;width:75%}.rno-grid-col-offset-18{margin-left:75%}.rno-grid-col-pull-18{right:75%}.rno-grid-col-push-18{left:75%}.rno-grid-col-order-18{-webkit-box-ordinal-group:19;-webkit-order:18;-ms-flex-order:18;order:18}.rno-grid-col-19{display:inline-block;width:79.1666666667%}.rno-grid-col-offset-19{margin-left:79.1666666667%}.rno-grid-col-pull-19{right:79.1666666667%}.rno-grid-col-push-19{left:79.1666666667%}.rno-grid-col-order-19{-webkit-box-ordinal-group:20;-webkit-order:19;-ms-flex-order:19;order:19}.rno-grid-col-20{display:inline-block;width:83.3333333333%}.rno-grid-col-offset-20{margin-left:83.3333333333%}.rno-grid-col-pull-20{right:83.3333333333%}.rno-grid-col-push-20{left:83.3333333333%}.rno-grid-col-order-20{-webkit-box-ordinal-group:21;-webkit-order:20;-ms-flex-order:20;order:20}.rno-grid-col-21{display:inline-block;width:87.5%}.rno-grid-col-offset-21{margin-left:87.5%}.rno-grid-col-pull-21{right:87.5%}.rno-grid-col-push-21{left:87.5%}.rno-grid-col-order-21{-webkit-box-ordinal-group:22;-webkit-order:21;-ms-flex-order:21;order:21}.rno-grid-col-22{display:inline-block;width:91.6666666667%}.rno-grid-col-offset-22{margin-left:91.6666666667%}.rno-grid-col-pull-22{right:91.6666666667%}.rno-grid-col-push-22{left:91.6666666667%}.rno-grid-col-order-22{-webkit-box-ordinal-group:23;-webkit-order:22;-ms-flex-order:22;order:22}.rno-grid-col-23{display:inline-block;width:95.8333333333%}.rno-grid-col-offset-23{margin-left:95.8333333333%}.rno-grid-col-pull-23{right:95.8333333333%}.rno-grid-col-push-23{left:95.8333333333%}.rno-grid-col-order-23{-webkit-box-ordinal-group:24;-webkit-order:23;-ms-flex-order:23;order:23}.rno-grid-col-24{display:inline-block;width:100%}.rno-grid-col-offset-24{margin-left:100%}.rno-grid-col-pull-24{right:100%}.rno-grid-col-push-24{left:100%}.rno-grid-col-order-24{-webkit-box-ordinal-group:25;-webkit-order:24;-ms-flex-order:24;order:24}.com-modal-mp-edit{padding-top:65px}.com-modal-mp-edit .com-form-title{font-size:14px;width:120px}.com-modal-salon-apply{margin-bottom:20px}.com-modal-salon-apply .apply-checkbox-list{margin-top:20px}.com-modal-salon-apply .com-check-item{margin-right:20px}@media screen and (max-width:1200px){.com-body-main,.com-body.max-width,.com-inner{padding-left:20px;padding-right:20px}}@media screen and (max-width:1200px){.com-section .section-inner{padding-left:20px;padding-right:20px}}@media screen and (max-width:768px){.s-4{width:16.6667%}}@media (max-width:600px){.c-g-12{width:50%}.xs-4{width:16.6667%}}@media (max-width:768px){.com-wechat-panel .qr-img{display:block;overflow:hidden;width:auto}.com-wechat-panel .qr-img>img{display:none}.com-wechat-panel .qr-img-full{display:block}.com-wechat-panel .qr-img-full img{display:block;width:414px}.com-wechat-panel .qr-cnt{display:none}}@media screen and (max-width:1200px){.com-article-media-source .column-name{max-width:8em}}@media screen and (max-width:1200px){.c-media-skin-lab{padding:20px}.c-media-skin-lab .c-media-extra-infos{margin-bottom:-20px}.c-media-skin-lab .c-media-extra-info{margin-left:10px;font-size:12px}.c-media-extra-info .icon{margin-right:5px}.c-media-skin-lab .c-media-extra-info:first-child{margin-left:0}}@media screen and (max-width:768px){.nav-dropdown-btn-txt{padding:0}}@media screen and (max-width:1280px){.com-nav-search-wrap.align-center .com-search-bar{max-width:350px;transition:all .4s}}@media screen and (max-width:1000px){.com-2-nav-search-wrap .com-search-bar{max-width:450px;transition:all .4s}}@media screen and (max-width:1200px){.com-3-nav-search-wrap{width:460px}}@media screen and (min-width:1001px){.com-search-dropdown.col2{font-size:0}.com-search-dropdown.col2 .com-search-dropdown-bd{padding-left:0;padding-right:0}.com-search-dropdown.col2 .com-search-dropdown-group{display:inline-block;vertical-align:top;margin-bottom:0;padding-bottom:0;border-bottom:none;width:50%}.com-search-dropdown.col2 .com-search-dropdown-group dt{padding-left:20px;padding-right:20px}.com-search-dropdown.col2 .com-search-dropdown-history .link-clear{right:15px}.com-search-dropdown.col2 .com-search-dropdown-group .link,.com-search-dropdown.col2 .com-search-dropdown-keywords a{margin:0}}@media screen and (max-width:1200px){.qc-footer-blogroll .blogroll-inner,.qc-footer-service .fs-ct{text-align:left}.c-footer-inner{margin-left:20px;margin-right:20px}}@media screen and (max-width:768px){.com-simple-footer .copyright{margin-left:20px;margin-right:20px;line-height:1.8;font-size:12px}.com-simple-footer .copyright span{display:inline-block}.c-tab-cross .c-tab-ctrl{display:block}}@media screen and (max-width:1200px){.c-tab-cross .c-tab-scroll{padding-left:10px;padding-right:10px}}@media screen\0{.com-check-item .c-checkbox,.com-check-item .c-radio{position:absolute;left:0;top:6px}.c-footer-blogroll-links .icon-tc{background-size:auto auto;background-position:0px 0px;background-image:url(sprite/base-media16-201911131148.png)}.c-logo-icon{background-size:102.17391304347827% 108%;;background-position:50% 50%;background-image:url(sprite/base-media16-201911131148.svg);;background-repeat:no-repeat}}@media screen and (min-width:601px){.com-header .header-main-title{max-width:12em}}@media screen and (max-width:320px){.com-header .header-main-title{max-width:5em}}@media screen and (max-width:768px){.com-2-m-footer .footer-copyright-text{display:block}.com-2-m-footer .footer-copyright-text+.footer-copyright-text{margin:0}}@media screen and (max-width:1000px){.com-responsive .c-nav .com-search-bar{display:none}.com-responsive .c-nav,.com-responsive .com-2-nav.fixed .c-nav-bottom,.com-responsive .qc-footer{min-width:320px}.com-responsive .com-2-nav .com-search-bar{display:block}}@media screen and (min-width:769px){.com-m-side,.com-m-side-mask{display:none}.com-responsive .c-nav-mod-pc,.com-responsive .c-nav-wrap{display:block}}@media screen and (max-width:768px){.com-responsive .c-nav,.com-responsive .com-2-footer,.com-responsive .qc-footer{display:none}.com-responsive .com-2-m-footer,.com-responsive .com-header,.com-responsive .com-m-footer{display:block}::-webkit-scrollbar{width:4px;height:0}::-webkit-scrollbar-track{background-color:transparent}::-webkit-scrollbar-thumb{height:4px;background-color:#bfbfbf;border-radius:4px}::-webkit-scrollbar-button{background-color:transparent}::-webkit-scrollbar-corner{background-color:transparent}.com-mobile-layout{position:absolute;left:0;top:0;min-width:320px;width:100%;height:100%;background-color:#f2f2f2;overflow:hidden;z-index:1}.com-mobile-body{position:absolute;left:0;right:0;top:56px;bottom:0;min-width:320px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch}.com-mobile-body.without-ft{bottom:0}.com-mobile-body.bg-white{background-color:#fff}.miniprogram .com-header{display:none}.miniprogram .com-mobile-body{top:0}}@media (max-width:1440px){.com-widget-global{right:10px}}@media (max-width:768px){.com-widget-global{display:none !important}}@media screen and (max-width:1200px){.com-2-footer-inner{padding:0 20px}}@media screen and (max-width:1440px){.com-2-footer.large-width .com-2-footer-inner{max-width:1180px}}@media screen and (max-width:768px){.com-2-footer-recommend{display:none}}@media (max-width:1200px){.com-2-simple-footer.layout .com-2-simple-footer-inner{padding-left:20px;padding-right:20px}}@media (min-width:769px){.com-none-panel-link:hover:after{-webkit-transform:translateX(8px);transform:translateX(8px)}}@media (min-width:601px){.com-none-panel.horizontal{margin:0 auto;max-width:770px}.com-none-panel.horizontal .com-none-panel-object{display:table-cell;vertical-align:middle;padding-right:60px;width:220px}.com-none-panel.horizontal .com-none-panel-main{display:table-cell;vertical-align:middle;text-align:left}.com-none-panel.horizontal .com-none-panel-btns{margin-top:20px;margin-left:-5px}}@media (max-width:768px){.com-none-panel{padding:50px 15px}.com-none-panel-icon.error{margin-bottom:20px;width:156px;height:99px}.com-none-panel-icon.column,.com-none-panel-icon.network,.com-none-panel-icon.search{width:180px;height:180px}.com-none-panel-title{margin-bottom:10px;font-size:18px;line-height:26px}.com-none-panel-btns{margin:30px -5px 0}.com-none-panel-btns .c-btn{height:40px;line-height:38px;font-size:16px}.com-none-panel-link:active:after{-webkit-transform:translateX(8px);transform:translateX(8px)}.com-none-panel-btns .c-btn-hole,.com-none-panel-btns .c-btn-hole:hover{color:#00a4ff;border-color:#00a4ff;background-color:transparent}.com-none-panel.page{padding:50px 15px;background-color:#fff}.com-none-panel.page+.com-none-panel.page{margin-top:10px;border-top:none}.com-none-panel-icon[class*=error-],.com-none-panel-icon[class^=error-]{width:300px;height:130px}}@media (max-width:600px){.com-none-panel-btns{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center}.com-none-panel-btns .c-btn{-webkit-box-flex:1;flex:1;min-width:0}.com-none-panel-link{-webkit-box-flex:1;flex:1}}@media (max-width:768px){.com-2-wechat-panel{background-color:transparent}.com-2-wechat-panel .qr-img{display:block;overflow:hidden;width:auto;height:auto;border:none;padding:0}.com-2-wechat-panel .qr-img>img{display:none}.com-2-wechat-panel .qr-img-full{display:block}.com-2-wechat-panel .qr-img-full img{display:block;width:414px}.com-2-wechat-panel .qr-cnt{display:none}}@media screen and (max-width:768px){.c-hero-bar.air .c-hero-bar-inner{padding:40px 15px;height:auto}.c-hero-bar.air .c-hero-bar-tit{font-size:24px;line-height:36px}.c-hero-bar.air .c-hero-bar-desc{font-size:14px;line-height:24px}}@media screen and (min-width:1367px) and (min-height:769px){.c-hero-section.air{height:460px}.c-hero-section.air .c-hero-section-inner{padding-top:135px}.c-hero-section.air .c-hero-section-tit{font-size:46px;line-height:65px}.c-hero-section.air .c-hero-section-des{margin-top:16px}}@media screen and (max-width:768px){.com-hero-bar.responsive .com-hero-bar-ct{padding:20px;height:160px}.com-hero-bar.responsive .com-hero-bar-tit{font-size:24px}.com-hero-bar.responsive .com-hero-bar-desc{font-size:14px}.com-hero-share{display:none}}@media screen and (max-width:1280px){.com-ani-hero-inner{padding-left:9%}}@media screen and (max-width:1200px){.com-2-column-panel-info{font-size:12px}.com-2-column-panel-info:before{margin:0 5px}} +#MAXIM{content:"weu20191113114906"} \ No newline at end of file diff --git a/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云_files/base.18719486f5.js.下载 b/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云_files/base.18719486f5.js.下载 new file mode 100644 index 0000000..b1a3ff4 --- /dev/null +++ b/直播工具包/FFmpeg时间戳详解 - 云+社区 - 腾讯云_files/base.18719486f5.js.下载 @@ -0,0 +1 @@ +!function(n){var r={};function o(e){if(r[e])return r[e].exports;var t=r[e]={i:e,l:!1,exports:{}};return n[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=n,o.c=r,o.i=function(e){return e},o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="//imgcache.qq.com/qcloud/developer/scripts/",o(o.s=0)}({"+2+s":function(e,t,n){"use strict";var r=n("Ds5P"),o=n("49qz")(!0);r(r.P,"String",{at:function(e){return o(this,e)}})},"+CM9":function(e,t,n){"use strict";var r=n("Ds5P"),o=n("ot5s")(!1),i=[].indexOf,a=!!i&&1/[1].indexOf(1,-0)<0;r(r.P+r.F*(a||!n("NNrz")(i)),"Array",{indexOf:function(e){return a?i.apply(this,arguments)||0:o(this,e,arguments[1])}})},"+Mt+":function(e,t,n){"use strict";var r=n("Ds5P"),o=n("7gX0"),i=n("OzIq"),a=n("7O1s"),u=n("nphH");r(r.P+r.R,"Promise",{finally:function(t){var n=a(this,o.Promise||i.Promise),e="function"==typeof t;return this.then(e?function(e){return u(n,t()).then(function(){return e})}:t,e?function(e){return u(n,t()).then(function(){throw e})}:t)}})},"+vXH":function(e,t,n){n("77Ug")("Float64",8,function(r){return function(e,t,n){return r(this,e,t,n)}})},"+yjc":function(e,t,n){var r=n("UKM+");n("3i66")("isSealed",function(t){return function(e){return!r(e)||!!t&&t(e)}})},"/OLF":function(e,t,n){"use strict";var o=n("cxPT"),i=n("GiK3"),r=n("czSA"),s=n("BEQ0"),l=n("e6+Q"),M=n("9U7y"),u=n("sgb3"),L=n("2B9T"),d=n("TJez");function U(e){for(var t=arguments.length-1,n="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=0;r