[
  {
    "path": ".travis.yml",
    "content": "sudo: false\nlanguage: node_js\n\nos:\n  - linux\n\nbefore_install:\n  - nvm install 8.7.0\n  - nvm use 8.7.0\n  - npm i electron-builder"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2018 CoNET Technology Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "README.md",
    "content": "### This is the beginning of CoNET project\n### now migrate to\n## The new era of CoNET\n\n### New Link here:\n\nhttps://bitbucket.org/matheus_moraes_pinheiro/conet\n\n## Homepage\n\nhttps://conet.network\n\n[![Build Status](https://travis-ci.org/QTGate/QTGate-Desktop-Client.svg?branch=master)](https://travis-ci.org/QTGate/QTGate-Desktop-Client)\n[![Gitter](https://img.shields.io/badge/chat-on%20gitter-blue.svg)](https://gitter.im/QTGate/Lobby)\n[![Known Vulnerabilities](https://snyk.io/test/github/qtgate/qtgate-desktop-client/badge.svg)](https://snyk.io/test/github/qtgate/qtgate-desktop-client)\n[![Telegram](https://img.shields.io/badge/telebot-community%20group-blue.svg)](https://t.me/joinchat/IpX64hGK_95XDTXit42vOg)\n\n![http protocol](/resources/CoPlatform4.png?raw=true)\n"
  },
  {
    "path": "app/CoNET.d.ts",
    "content": "/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n\ninterface ReadonlyArray<T> {\n    /**\n     * Returns the value of the first element in the array where predicate is true, and undefined\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found, find\n     * immediately returns that element value. Otherwise, find returns undefined.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    find<S extends T>(predicate: (this: void, value: T, index: number, obj: ReadonlyArray<T>) => value is S, thisArg?: any): S | undefined;\n    find(predicate: (value: T, index: number, obj: ReadonlyArray<T>) => boolean, thisArg?: any): T | undefined;\n\n    /**\n     * Returns the index of the first element in the array where predicate is true, and -1\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found,\n     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    findIndex(predicate: (value: T, index: number, obj: ReadonlyArray<T>) => boolean, thisArg?: any): number;\n}\n\n\ninterface Map<K, V> {\n    clear(): void;\n    delete(key: K): boolean;\n    forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void, thisArg?: any): void;\n    get(key: K): V | undefined;\n    has(key: K): boolean;\n    set(key: K, value: V): this;\n    readonly size: number;\n}\n\ninterface MapConstructor {\n    new (): Map<any, any>;\n    new <K, V>(entries?: ReadonlyArray<[K, V]>): Map<K, V>;\n    readonly prototype: Map<any, any>;\n}\ndeclare var Map: MapConstructor;\n\ninterface ReadonlyMap<K, V> {\n    forEach(callbackfn: (value: V, key: K, map: ReadonlyMap<K, V>) => void, thisArg?: any): void;\n    get(key: K): V | undefined;\n    has(key: K): boolean;\n    readonly size: number;\n}\n\ninterface WeakMap<K extends object, V> {\n    delete(key: K): boolean;\n    get(key: K): V | undefined;\n    has(key: K): boolean;\n    set(key: K, value: V): this;\n}\n\ninterface WeakMapConstructor {\n    new (): WeakMap<object, any>;\n    new <K extends object, V>(entries?: ReadonlyArray<[K, V]>): WeakMap<K, V>;\n    readonly prototype: WeakMap<object, any>;\n}\ndeclare var WeakMap: WeakMapConstructor;\n\ninterface Set<T> {\n    add(value: T): this;\n    clear(): void;\n    delete(value: T): boolean;\n    forEach(callbackfn: (value: T, value2: T, set: Set<T>) => void, thisArg?: any): void;\n    has(value: T): boolean;\n    readonly size: number;\n}\n\ninterface SetConstructor {\n    new (): Set<any>;\n    new <T>(values?: ReadonlyArray<T>): Set<T>;\n    readonly prototype: Set<any>;\n}\ndeclare var Set: SetConstructor;\n\ninterface ReadonlySet<T> {\n    forEach(callbackfn: (value: T, value2: T, set: ReadonlySet<T>) => void, thisArg?: any): void;\n    has(value: T): boolean;\n    readonly size: number;\n}\n\ninterface WeakSet<T extends object> {\n    add(value: T): this;\n    delete(value: T): boolean;\n    has(value: T): boolean;\n}\n\ninterface WeakSetConstructor {\n    new (): WeakSet<object>;\n    new <T extends object>(values?: ReadonlyArray<T>): WeakSet<T>;\n    readonly prototype: WeakSet<object>;\n}\ndeclare var WeakSet: WeakSetConstructor;\n\ninterface imapConnect {\n    imapServer: string\n    imapUserName: string\n    imapUserPassword: string\n    imapPortNumber: number|number[]\n    imapSsl: boolean\n    imapIgnoreCertificate: boolean\n}\n\ninterface keypair {\n\tpublicKey?: string\n\tprivateKey?: string\n\tkeyLength: number\n\tnikeName: string\n\tcreateDate: string\n\temail: string\n\tpasswordOK: boolean\n    verified: boolean\n    publicKeyID: string\n    showLoginPasswordField?: KnockoutObservable < boolean >\n    delete_btn_view?: KnockoutObservable < boolean >\n    delete_btn_click?: () => void\n    showConform?: KnockoutObservable < boolean >\n    deleteKeyPairNext?: () => void\n\t_password: string\n\tCoNET_publicKey?: string \n    keyPairPassword?: KnockoutObservable < keyPairPassword >\n    showDeleteKeyPairNoite?: KnockoutObservable < boolean >\n}\n\n\ninterface StringValidator {\n    isAcceptable(s: string): boolean;\n}\ninterface INewKeyPair {\n    email: string\n    nikeName: string\n    password: string\n}\n\ninterface keyPair {\n    publicKey: string;\n    privateKey: string;\n}\n\ninterface imapData {\n    email: string\n}\n\ninterface requestPoolData {\n    \n    timeout: any\n}\n\ninterface regionV1 {\n    regionName: string\n    testHostIp: string\n    testUrl: string\n    testHost: string\n    freeUser: boolean\n    VoE: boolean\n}\n\ninterface IinputData extends imapConnect {\n    account:string\n    email: string\n    smtpServer:string\n    smtpUserName:string\n    smtpUserPassword:string\n    smtpPortNumber:number|number[]\n    smtpSsl:boolean\n    smtpIgnoreCertificate: boolean\n    imapTestResult: boolean\n    language: string\n    clientFolder: string\n    serverFolder: string\n    timeZoneOffset: number\n    randomPassword: string\n    uuid: string\n    clientIpAddress: string\n    ciphers: string\n    confirmRisk: boolean\n    sendToQTGate: boolean\n}\n\ninterface CoPromo {\n    datePromo: number\n    pricePromo: number\n    promoDetail: string[]\n    promoFor: string[]\n}\n\ninterface iTransferData {\n    startDate: string\n    transferDayLimit: number\n    transferMonthly: number\n    account: string\n    resetTime: string\n    usedDayTransfer: number\n    productionPackage: string\n    usedMonthlyTransfer: number\n    availableDayTransfer: number\n    availableMonthlyTransfer: number\n    usedMonthlyOverTransfer: number\n    uploaded?: number\n    downloaded?: number\n    power: number\n    timeZoneOffset: number\n    expire: string\n    isAnnual: boolean\n    paidID: string[]\n    totalMonth: number\n    paidAmount: number\n    automatically: boolean\n    promo: CoPromo[]\n}\n\ninterface multipleGateway {\n    gateWayIpAddress: string\n    gateWayPort: number\n    dockerName: string\n    password: string\n}\n\n\ninterface QTGate_DnsAddress {\n\tdnsName: string,\n\tipv4: string,\n\turl: string\n}\n\ninterface IConnectCommand {\n    region: string\n    account: string\n    imapData: IinputData\n    connectType: number\n    transferData?: iTransferData\n    error?: number\n    dockerName?: string\n    randomPassword?: string\n    runningDocker?: string\n    AllDataToGateway?: boolean\n    fingerprint: string\n    gateWayIpAddress: string\n    gateWayPort?: number\n    totalUserPower?: number\n    requestContainerEachPower?: number\n    connectPeer?: string\n    requestRegions?: string[]\n    multipleGateway?: multipleGateway[]\n    requestMultipleGateway?: number\n    containerUUID?: string\n    peerUuid?: string\n    localServerIp?: string[]\n    localServerPort: string\n    webWrt?: boolean\n    requestPortNumber: string\n    globalIpAddress: string\n}\n\ninterface QTGateAPIRequestCommand {\n    command: string\n    subCom: string\n    myIpServer?: QTGate_DnsAddress []\n    account?: string\n\terror: number\n\trequestSerial?: string\n    Args: any\n    fingerprint?: string\n    dataTransfer?: iTransferData\n    requestTimes?: number\n\tregion?: string\n\tCallBack?: any\n    \n}\n\ninterface QTGateCommand {\n    account: string\n    QTGateVersion: string\n    command: string\n    imapData?: IinputData\n    language: string\n    error: Error\n    callback: any\n    publicKey: string\n}\n\ninterface IQTGateRegionsSetup {\n    title: string\n}\n\ninterface QTGateRegions {\n    icon: string\n    content: string[]\n    description: string[]\n    meta: string[]\n    canVoe: KnockoutObservable < boolean >\n    canVoH: KnockoutObservable < boolean >\n    available: KnockoutObservable < boolean >\n    selected: KnockoutObservable < boolean >\n    showExtraContent: KnockoutObservable < boolean >\n    QTGateRegionsSetup: IQTGateRegionsSetup[]\n    qtRegion: string\n    error: KnockoutObservable<number >\n    showRegionConnectProcessBar: KnockoutObservable < boolean >\n    showConnectedArea: KnockoutObservable < boolean >\n    ping: KnockoutObservable <number >\n    downloadSpeed: KnockoutObservable <number >\n    freeUser: KnockoutObservable < boolean >\n}\n\ninterface domainData {\n\tdns: dnsAddress[]\n\texpire: number\n}\ninterface dnsAddress {\n\taddress: string\n\tfamily: number\n\texpire: Date\n\tconnect: Date []\n}\n\ninterface VE_IPptpStream1 {\n    type?: string;\n    buffer: string;\n    host: string;\n    port: number;\n    cmd: number;\n    ATYP: number;\n    uuid?: string;\n    length?:number;\n    randomBuffer?: any\n    ssl: boolean\n}\n\ninterface proxyServerInfo {\n    serverAddress: string\n    serverPort: number\n    password: string\n    allToGateway: boolean\n    localPort: number\n}\ninterface iQTGatePayment {\n    cardNumber?: string\n    cardExpirationYear?: string\n    cardPostcode?: string\n    cardcvc?: string\n    tokenID?: string\n    isAnnual: boolean\n    plan: string\n    Amount: number\n    autoRenew: boolean\n}\ninterface twitter_entities_media {\n\n}\ninterface twitter_entities_urls {\n    display_url: string\n    expanded_url: string\n    indices: string[]\n    url: string\n}\ninterface twitter_entities {\n    hashtags: any[]\n    media: twitter_entities_media[]\n    symbols: any[]\n    urls: twitter_entities_urls[]\n}\ninterface tweetCountSummary {\n\n}\ninterface twitter_post {\n    order: number\n    contributors: any\n    coordinates: any\n    created_at: string\n    QTGate_created_at: KnockoutComputed< string >\n    entities: any\n    favorite_count:  number\n    favorite_count_ko : KnockoutObservable < number >\n    favorited_ko: KnockoutObservable < boolean >\n    favoritedLoader_ko: KnockoutObservable < boolean >\n    favorited:  boolean\n    geo: any\n    id: number\n    id_str: string\n    in_reply_to_screen_name: any\n    in_reply_to_status_id: any\n    in_reply_to_status_id_str: any\n    in_reply_to_user_id: any\n    in_reply_to_user_id_str: any\n    is_quote_status: boolean\n    quoted_status: twitter_post\n    lang: string\n    full_text: string\n    full_text_split_line: string\n    retweeted_status: twitter_post\n    place: any\n    possibly_sensitive: boolean\n    possibly_sensitive_appealable: boolean\n    retweet_count: number\n    retweeted: twitter_post\n    extended_entities: twitter_extended_entities\n    source: string\n    text: string\n    truncated: boolean\n    user: Twitter_verify_credentials\n    tweetCountSummary: tweetCountSummary\n    showUser: KnockoutObservable < boolean >\n    CoNET_totalTwitter: number\n    CoNET_currentTwitter: number\n}\n\n\ninterface twitter_size {\n    h: number\n    resize: string\n    w: number\n}\n\n\ninterface twitter_media_video_info_variants {\n    bitrate: number\n    content_type: string\n    url: string\n}\n\n\ninterface twitter_media_video_info {\n    aspect_ratio: number []\n    duration_millis: number\n    variants: twitter_media_video_info_variants[]\n    QTDownload: string\n}\n\ninterface twitter_media {\n    display_url?: string\n    expanded_url?: string\n    id?: number\n    id_str?: string\n    indices?: number []\n    media_url?: string\n    media_url_https?: string\n    sizes?: {\n        large: twitter_size\n        medium: twitter_size\n        small: twitter_size\n        thumb: twitter_size\n    }\n    type?: string        //  photo\n    url?: string\n    video_info: twitter_media_video_info\n}\n\ninterface twitter_extended_entities extends twitter_post {\n    media: twitter_media[]\n}\n\ninterface twitter_mediaData {\n\ttotal_bytes: number\n\tmedia_type: string\n    rawData: string\n    media_id_string: string\n}\n\ninterface twitter_postData {\n    text: string\n    images: string[]\n    media_data: twitter_mediaData[]\n    videoSize: number\n    videoFileName: string\n    uuid: string\n}\n\n\ninterface twitter_uploadImageInitData_imageObj {\n\timage_type: string\n\tw: number\n\th: number\n}\n\ninterface twitter_uploadImageInitData {\n\tmedia_id: number\n\tmedia_id_string: string\n\tsize: number\n\texpires_after_secs: number\n\timage: twitter_uploadImageInitData_imageObj\n}\n\ninterface twitter_uploadImageInitData_status_processing_info {\n\tstate: string\t\t\t\t\t//\t\t\t\tin_progress, failed, succeeded\n\tcheck_after_secs: number\n\tprogress_percent: number\n\terror?: {\n\t\tcode: number\n\t\tname: string\n\t\tmessage: string\n\t}\n}\n\ninterface twitter_uploadImageInitData_status {\n\tmedia_id: number\n\tmedia_id_string: string\n\texpires_after_secs: number\n\tprocessing_info: twitter_uploadImageInitData_status_processing_info\n}\n\ninterface TwitterAccount {\n    consumer_key: string\n    consumer_secret: string\n    access_token_key: string\n    access_token_secret: string\n    twitter_verify_credentials?: Twitter_verify_credentials\n}\n\ninterface Twitter_verify_credentials {\n    id: number\n    id_str: string\n    name: string\n    screen_name: string\n    location: string\n    description: string\n    url: string\n    entities: any\n    protected: boolean\n    followers_count: number\n    friends_count: number\n    listed_count: number\n    created_at: string\n    favourites_count: number\n    utc_offset: number\n    time_zone: string\n    geo_enabled: boolean\n    verified: boolean\n    statuses_count: number\n    lang: string\n    status: Titter_status\n    contributors_enabled: boolean\n    is_translator: boolean\n    is_translation_enabled: boolean\n    profile_background_color: string\n    profile_background_image_url: string\n    profile_background_image_url_https: string\n    profile_background_tile: boolean\n    profile_image_url: string\n    profile_image_url_https: string\n    profile_banner_url: string\n    profile_link_color: string\n    profile_sidebar_border_color: string\n    profile_sidebar_fill_color: string\n    profile_text_color: string\n    profile_use_background_image: boolean\n    has_extended_profile: boolean\n    default_profile: boolean\n    default_profile_image: boolean\n    following: boolean\n    follow_request_sent: boolean\n    notifications: boolean\n    translator_type: string\n\n}\n\ninterface Titter_status {\n    created_at: string\n    id: number\n    id_str: string\n    text: string\n    truncated: boolean\n    entities: any\n    source: string\n    in_reply_to_status_id: any\n    in_reply_to_status_id_str: any\n    in_reply_to_user_id: any\n    in_reply_to_user_id_str: any\n    in_reply_to_screen_name: any\n    geo: any\n    coordinates: any\n    place: any\n    contributors: any\n    retweeted_status: Titter_status\n    is_quote_status: boolean\n    retweet_count: number\n    favorite_count: number\n    favorited: boolean\n    retweeted: boolean\n    possibly_sensitive: boolean\n    lang: string\n\n}\n\n\ninterface twitter_text_parseTweet {\n    weightedLength: number\n    valid: boolean\n    permillage: number\n    validRangeStart: number\n    validRangeEnd: number\n    displayRangeStart: number\n    displayRangeEnd: number\n}\n\ninterface install_config {\n    alreadyInit: boolean\n    multiLogin: boolean\n    firstRun: boolean\n    version: string\n    newVersion?: string\n    newVersionCheckFault?: boolean\n    newVersionDownloadFault?: number\n    newVerReady?: boolean\n    keypair: keypair\n    iterations: number\n    salt?: any\n    keylen?: number\n    digest?: string\n    freeUser: boolean\n    connectedImapDataUuid: string\n    account: string\n    serverGlobalIpAddress: string\n    serverPort: number\n    connectedQTGateServer: boolean          //      true when connect to QTGate network\n    lastConnectType: number\n    localIpAddress: any[]\n    \n}\n\ninterface Jimp {\n    read( ...args: any): any\n}\n\ndeclare namespace SemanticUI {\n\n}\n\ndeclare namespace SocketIOClient {\n    interface Emitter {\n        emit11\n        emit22\n    }\n}\n\ninterface DateConstructor {\n    isLeapYear: ( year: number ) => boolean\n    getDaysInMonth: (year: number, month: number ) => number\n    \n    \n}\n\ninterface Date {\n    isLeapYear: ()=> boolean\n    getDaysInMonth: () => number\n    addMonths: ( n: number ) => Date\n}\n\ninterface coSearch_Object {\n    command: string\n    args: string[]\n    screenSize_x: number\n    screenSize_y: number\n}\n\ninterface JQuery<TElement extends Node = HTMLElement> extends Iterable<TElement> {\n    //css(properties: JQuery.PlainObject<string | number | ((this: TElement, index: number, value: string) => string | number | void | undefined)>): this;\n    /**\n     * Get the computed style properties for the first element in the set of matched elements.\n     *\n     * @param propertyName A CSS property.\n     *                     An array of one or more CSS properties.\n     * @see {@link https://api.jquery.com/css/}\n     * @since 1.0\n     */\n    //css(propertyName: string): string;\n    /**\n     * Get the computed style properties for the first element in the set of matched elements.\n     *\n     * @param propertyNames An array of one or more CSS properties.\n     * @see {@link https://api.jquery.com/css/}\n     * @since 1.9\n     */\n    //css(propertyNames: string[]): JQuery.PlainObject<string>;\n\n    progress(k?:any ): any\n    transition(k?:any): any\n    dropdown(k?:any):any\n    popup(k?:any): any\n    shape(k?:any):any\n    dimmer(k?:any):any\n    checkbox(k?:any): any\n    \n}\ninterface JQueryStatic<TElement extends Node = HTMLElement> {\n    //'langEH', this.tLang(), { expires: 180, path: '/' }\n    cookie( ...obj:any): any\n}"
  },
  {
    "path": "app/localWebServer.js",
    "content": "\"use strict\";\n/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Express = require(\"express\");\nconst Path = require(\"path\");\nconst HTTP = require(\"http\");\nconst SocketIo = require(\"socket.io\");\nconst Tool = require(\"./tools/initSystem\");\nconst Async = require(\"async\");\nconst Fs = require(\"fs\");\nconst Util = require(\"util\");\nconst Uuid = require(\"node-uuid\");\nconst Imap = require(\"./tools/imap\");\nconst coNETConnect_1 = require(\"./tools/coNETConnect\");\nconst Crypto = require(\"crypto\");\nconst mime = require(\"mime-types\");\nExpress.static.mime.define({ 'multipart/related': ['mht'] });\n//Express.static.mime.define({ 'message/rfc822' : ['mhtml','mht'] })\nExpress.static.mime.define({ 'application/x-mimearchive': ['mhtml', 'mht'] });\nExpress.static.mime.define({ 'multipart/related': ['mhtml', 'mht'] });\nlet logFileFlag = 'w';\nconst conetImapAccount = /^qtgate_test\\d\\d?@icloud.com$/i;\nconst saveLog = (err) => {\n    if (!err) {\n        return;\n    }\n    const data = `${new Date().toUTCString()}: ${typeof err === 'object' ? (err['message'] ? err['message'] : '') : err}\\r\\n`;\n    console.log(data);\n    return Fs.appendFile(Tool.ErrorLogFile, data, { flag: logFileFlag }, () => {\n        return logFileFlag = 'a';\n    });\n};\nconst saveServerStartup = (localIpaddress) => {\n    const info = `\\n*************************** CoNET Platform [ ${Tool.CoNET_version} ] server start up *****************************\\n` +\n        `Access url: http://${localIpaddress}:${Tool.LocalServerPortNumber}\\n`;\n    saveLog(info);\n};\nconst saveServerStartupError = (err) => {\n    const info = `\\n*************************** CoNET Platform [ ${Tool.CoNET_version} ] server startup falied *****************************\\n` +\n        `platform ${process.platform}\\n` +\n        `${err['message']}\\n`;\n    saveLog(info);\n};\nconst imapErrorCallBack = (message) => {\n    if (message && message.length) {\n        if (/auth|login|log in|Too many simultaneous|UNAVAILABLE/i.test(message)) {\n            return 1;\n        }\n        if (/ECONNREFUSED/i.test(message)) {\n            return 5;\n        }\n        if (/OVERQUOTA/i.test(message)) {\n            return 6;\n        }\n        if (/certificate/i.test(message)) {\n            return 2;\n        }\n        if (/timeout|ENOTFOUND/i.test(message)) {\n            return 0;\n        }\n        return 5;\n    }\n    return -1;\n};\nclass localServer {\n    constructor(cmdResponse, test) {\n        this.cmdResponse = cmdResponse;\n        this.expressServer = Express();\n        this.httpServer = HTTP.createServer(this.expressServer);\n        this.socketServer = SocketIo(this.httpServer);\n        this.socketServer_CoSearch = this.socketServer.of('/CoSearch');\n        this.config = null;\n        this.keyPair = null;\n        this.savedPasswrod = '';\n        this.imapConnectData = null;\n        this.localConnected = new Map();\n        this.CoNETConnectCalss = null;\n        this.openPgpKeyOption = null;\n        this.sessionHashPool = [];\n        this.Pbkdf2Password = null;\n        this.nodeList = [{\n                email: 'node@Kloak.app',\n                keyID: '',\n                key: ''\n            }];\n        this.requestPool = new Map();\n        //Express.static.mime.define({ 'message/rfc822' : ['mhtml','mht'] })\n        //Express.static.mime.define ({ 'multipart/related' : ['mhtml','mht'] })\n        Express.static.mime.define({ 'application/x-mimearchive': ['mhtml', 'mht'] });\n        this.expressServer.set('views', Path.join(__dirname, 'views'));\n        this.expressServer.set('view engine', 'pug');\n        this.expressServer.use(Express.static(Tool.QTGateFolder));\n        this.expressServer.use(Express.static(Path.join(__dirname, 'public')));\n        this.expressServer.use(Express.static(Path.join(__dirname, 'html')));\n        this.expressServer.get('/', (req, res) => {\n            res.render('home', { title: 'home', proxyErr: false });\n        });\n        this.socketServer.on('connection', socker => {\n            return this.socketServerConnected(socker);\n        });\n        this.httpServer.once('error', err => {\n            console.log(`httpServer error`, err);\n            saveServerStartupError(err);\n            return process.exit(1);\n        });\n        Async.series([\n            next => Tool.checkSystemFolder(next),\n            next => Tool.checkConfig(next)\n        ], (err, data) => {\n            if (err) {\n                return saveServerStartupError(err);\n            }\n            this.config = data['1'];\n            if (!test) {\n                this.httpServer.listen(Tool.LocalServerPortNumber, () => {\n                    return saveServerStartup(`localhost`);\n                });\n            }\n        });\n    }\n    catchCmd(mail, uuid) {\n        if (!this.imapConnectData.sendToQTGate) {\n            this.imapConnectData.sendToQTGate = true;\n            Tool.saveEncryptoData(Tool.imapDataFileName1, this.imapConnectData, this.config, this.savedPasswrod, err => {\n            });\n        }\n        console.log(`Get response from CoNET uuid [${uuid}] length [${mail.length}]`);\n        const socket = this.requestPool.get(uuid);\n        if (!socket) {\n            return console.log(`Get cmd that have no matched socket \\n\\n`, mail);\n        }\n        socket.emit('doingRequest', mail, uuid);\n    }\n    tryConnectCoNET(socket, sessionHash) {\n        console.log(`doing tryConnectCoNET`);\n        //\t\thave CoGate connect\n        if (this.CoNETConnectCalss) {\n            return this.CoNETConnectCalss.Ping();\n        }\n        let sendMail = false;\n        const _exitFunction = err => {\n            console.trace(`makeConnect on _exitFunction err this.CoNETConnectCalss destroy!`, err);\n            this.CoNETConnectCalss = null;\n        };\n        const makeConnect = () => {\n            return this.CoNETConnectCalss = new coNETConnect_1.default(this.imapConnectData, this.socketServer, !this.imapConnectData.sendToQTGate, this.nodeList[0].email, this.openPgpKeyOption, this.keyPair.publicKey, (mail, uuid) => {\n                return this.catchCmd(mail, uuid);\n            }, _exitFunction);\n        };\n        return makeConnect();\n    }\n    listenAfterPassword(socket, sessionHash) {\n        socket.on('checkImap', (emailAddress, password, timeZone, tLang, CallBack1) => {\n            CallBack1();\n            console.log(`localServer on checkImap!`);\n            const imapServer = Tool.getImapSmtpHost(emailAddress);\n            this.imapConnectData = {\n                email: this.config.account,\n                account: this.config.account,\n                smtpServer: imapServer.smtp,\n                smtpUserName: emailAddress,\n                smtpPortNumber: imapServer.SmtpPort,\n                smtpSsl: imapServer.smtpSsl,\n                smtpIgnoreCertificate: false,\n                smtpUserPassword: password,\n                imapServer: imapServer.imap,\n                imapPortNumber: imapServer.ImapPort,\n                imapSsl: imapServer.imapSsl,\n                imapUserName: emailAddress,\n                imapIgnoreCertificate: false,\n                imapUserPassword: password,\n                timeZoneOffset: timeZone,\n                language: tLang,\n                imapTestResult: null,\n                clientFolder: Uuid.v4(),\n                serverFolder: Uuid.v4(),\n                randomPassword: Uuid.v4(),\n                uuid: Uuid.v4(),\n                confirmRisk: false,\n                clientIpAddress: null,\n                ciphers: null,\n                sendToQTGate: false\n            };\n            return this.doingCheckImap(socket);\n        });\n        socket.on('tryConnectCoNET', CallBack1 => {\n            const uuid = Uuid.v4();\n            CallBack1(uuid);\n            const _callBack = (...data) => {\n                socket.emit(uuid, ...data);\n            };\n            console.log(`socket on tryConnectCoNET!\\n\\n`);\n            if (!this.imapConnectData) {\n                console.log(`socket.on ( 'tryConnectCoNET') !this.imapConnectData \\n\\n `);\n                return _callBack('systemError');\n            }\n            if (!this.imapConnectData.confirmRisk) {\n                this.imapConnectData.confirmRisk = true;\n                return Tool.saveEncryptoData(Tool.imapDataFileName1, this.imapConnectData, this.config, this.savedPasswrod, err => {\n                    return this.tryConnectCoNET(socket, sessionHash);\n                });\n            }\n            return this.tryConnectCoNET(socket, sessionHash);\n        });\n        socket.on('sendRequestMail', CallBack1 => {\n            CallBack1();\n            if (!this.CoNETConnectCalss) {\n                return console.log(`localServer on sendRequestMail Error! have no this.CoNETConnectCalss!`);\n            }\n            socket.emit('tryConnectCoNETStage', null, 2, false);\n            if (this.CoNETConnectCalss) {\n                console.log(`localWebServer on sendRequestMail !`);\n                return this.CoNETConnectCalss.sendRequestMail();\n            }\n            console.log(`localWebServer on sendRequestMail have no CoNETConnectCalss create CoNETConnectCalss`);\n            return this.tryConnectCoNET(socket, sessionHash);\n        });\n        socket.on('checkActiveEmailSubmit', (text, CallBack1) => {\n            const uuid = Uuid.v4();\n            CallBack1(uuid);\n            const _callBack = (...data) => {\n                socket.emit(uuid, ...data);\n            };\n            const key = Buffer.from(text, 'base64').toString();\n            console.log(`checkActiveEmailSubmit`, key);\n            if (key && key.length) {\n                console.log(`active key success! \\n[${key}]`);\n                this.keyPair.publicKey = this.config.keypair.publicKey = key;\n                this.keyPair.verified = this.config.keypair.verified = true;\n                this.imapConnectData.sendToQTGate = true;\n                _callBack();\n                Tool.saveEncryptoData(Tool.imapDataFileName1, this.imapConnectData, this.config, this.savedPasswrod, err => {\n                    if (err) {\n                        saveLog(`Tool.saveConfig return Error: [${err.message}]`);\n                    }\n                });\n                return Tool.saveConfig(this.config, err => {\n                    if (err) {\n                        saveLog(`Tool.saveConfig return Error: [${err.message}]`);\n                    }\n                });\n            }\n        });\n        socket.on('doingRequest', (uuid, request, CallBack1) => {\n            const _uuid = Uuid.v4();\n            CallBack1(_uuid);\n            const _callBack = (...data) => {\n                socket.emit(_uuid, ...data);\n            };\n            this.requestPool.set(uuid, socket);\n            console.log(`on doingRequest uuid = [${uuid}]\\n${request}\\n`);\n            if (this.CoNETConnectCalss) {\n                saveLog(`doingRequest on ${uuid}`);\n                return this.CoNETConnectCalss.requestCoNET_v1(uuid, request, _callBack);\n            }\n            saveLog(`doingRequest on ${uuid} but have not CoNETConnectCalss need restart! socket.emit ( 'systemErr' )`);\n            socket.emit('systemErr');\n        });\n        socket.on('getFilesFromImap', (files, CallBack1) => {\n            const uuid = Uuid.v4();\n            CallBack1(uuid);\n            const _callBack = (...data) => {\n                socket.emit(uuid, ...data);\n            };\n            if (typeof files !== 'string' || !files.length) {\n                return _callBack(new Error('invalidRequest'));\n            }\n            const _files = files.split(',');\n            console.log(`socket.on ('getFilesFromImap') _files = [${_files}] _files.length = [${_files.length}]`);\n            let ret = '';\n            return Async.eachSeries(_files, (n, next) => {\n                console.log(`Async.eachSeries _files[${n}]`);\n                return this.CoNETConnectCalss.getFile(n, (err, data) => {\n                    if (err) {\n                        return next(err);\n                    }\n                    ret += data.toString();\n                    return next();\n                });\n            }, err => {\n                if (err) {\n                    return _callBack(err);\n                }\n                //console.log (`******************** getFilesFromImap success all [${ ret.length }] fies!\\n\\n${ ret }\\n\\n`)\n                return _callBack(null, ret);\n            });\n        });\n        socket.on('sendMedia', (uuid, rawData, CallBack1) => {\n            const _uuid = Uuid.v4();\n            CallBack1(_uuid);\n            const _callBack = (...data) => {\n                socket.emit(_uuid, ...data);\n            };\n            return this.CoNETConnectCalss.sendDataToANewUuidFolder(Buffer.from(rawData).toString('base64'), uuid, uuid, _callBack);\n        });\n        socket.on('mime', (_mime, CallBack1) => {\n            const _uuid = Uuid.v4();\n            CallBack1(_uuid);\n            const _callBack = (...data) => {\n                socket.emit(_uuid, ...data);\n            };\n            let y = mime.lookup(_mime);\n            if (!y) {\n                return _callBack(new Error('no mime'));\n            }\n            return _callBack(null, y);\n        });\n        /*\n                socket.on ('getUrl', ( url: string, CallBack ) => {\n                    const uu = new URLSearchParams ( url )\n                    if ( !uu || typeof uu.get !== 'function' ) {\n                        console.log (`getUrl [${ url }] have not any URLSearchParams`)\n                        return CallBack ()\n                    }\n                    \n                    return CallBack ( null, uu.get('imgrefurl'), uu.get('/imgres?imgurl'))\n                })\n        */\n    }\n    doingCheckImap(socket) {\n        this.imapConnectData.imapTestResult = false;\n        return Async.series([\n            next => Imap.imapAccountTest(this.imapConnectData, err => {\n                if (err) {\n                    return next(err);\n                }\n                console.log(`imapAccountTest success!`, typeof next);\n                socket.emit('imapTest');\n                return next();\n            }),\n            next => Tool.smtpVerify(this.imapConnectData, next)\n        ], (err) => {\n            if (err) {\n                console.log(`doingCheckImap Async.series Error!`, err);\n                return socket.emit('smtpTest', imapErrorCallBack(err.message));\n            }\n            this.imapConnectData.imapTestResult = true;\n            return Tool.saveEncryptoData(Tool.imapDataFileName1, this.imapConnectData, this.config, this.savedPasswrod, err => {\n                console.log(`socket.emit ( 'imapTestFinish' )`);\n                socket.emit('imapTestFinish', this.imapConnectData);\n            });\n        });\n    }\n    socketServerConnected(socket) {\n        const clientName = `[${socket.id}][ ${socket.conn.remoteAddress}]`;\n        let sessionHash = '';\n        const clientObj = {\n            listenAfterPasswd: false,\n            socket: socket,\n            login: false\n        };\n        saveLog(`socketServerConnected ${clientName} connect ${this.localConnected.size}`);\n        socket.once('init', Callback1 => {\n            const uuid = Uuid.v4();\n            Callback1(uuid);\n            const ret = Tool.emitConfig(this.config, false);\n            //console.log ( Util.inspect( ret, false, 3, true  ))\n            //console.log ( `typeof Callback1 [${ typeof Callback1 }]`)\n            return socket.emit(uuid, null, ret);\n        });\n        socket.once('agreeClick', () => {\n            this.config.firstRun = false;\n            return Tool.saveConfig(this.config, saveLog);\n        });\n        socket.on('checkPemPassword', (password, CallBack1) => {\n            const uuid = Uuid.v4();\n            CallBack1(uuid);\n            this.sessionHashPool.push(sessionHash = Crypto.randomBytes(10).toString('hex'));\n            const passwordFail = (imap) => {\n                //onsole.log (`passwordFail this.Pbkdf2Password = [${ this.Pbkdf2Password }]`)\n                return socket.emit(uuid, null, imap, this.Pbkdf2Password, sessionHash);\n            };\n            if (!this.config.keypair || !this.config.keypair.publicKey) {\n                console.log(`checkPemPassword !this.config.keypair`);\n                return passwordFail(true);\n            }\n            if (!password || password.length < 5) {\n                console.log(`! password `);\n                return passwordFail(true);\n            }\n            if (this.savedPasswrod && this.savedPasswrod.length) {\n                if (this.savedPasswrod !== password) {\n                    console.log(`savedPasswrod !== password `);\n                    return passwordFail(true);\n                }\n                this.listenAfterPassword(socket, sessionHash);\n                return passwordFail(this.imapConnectData);\n            }\n            return Async.waterfall([\n                next => Tool.getPbkdf2(this.config, password, next),\n                (Pbkdf2Password, next) => {\n                    this.Pbkdf2Password = Pbkdf2Password.toString('hex');\n                    Tool.getKeyPairInfo(this.config.keypair.publicKey, this.config.keypair.privateKey, this.Pbkdf2Password, next);\n                },\n                (key, next) => {\n                    //console.log ( `checkPemPassword Tool.getKeyPairInfo success!`)\n                    if (!key.passwordOK) {\n                        this.Pbkdf2Password = null;\n                        saveLog(`[${clientName}] on checkPemPassword had try password! [${password}]`);\n                        return passwordFail(true);\n                    }\n                    //console.log (`checkPemPassword this.Pbkdf2Password = [${ this.Pbkdf2Password}]`)\n                    this.savedPasswrod = password;\n                    this.keyPair = key;\n                    clientObj.listenAfterPasswd = clientObj.login = true;\n                    this.localConnected.set(clientName, clientObj);\n                    return Tool.makeGpgKeyOption(this.config, this.savedPasswrod, next);\n                },\n                (option_KeyOption, next) => {\n                    console.log(`checkPemPassword Tool.makeGpgKeyOption success!`);\n                    this.openPgpKeyOption = option_KeyOption;\n                    return Tool.readEncryptoFile(Tool.imapDataFileName1, password, this.config, next);\n                }\n            ], (err, data) => {\n                console.log(`checkPemPassword Async.waterfall success!`);\n                if (err) {\n                    if (!(err.message && /no such file/i.test(err.message))) {\n                        passwordFail(err);\n                        return saveLog(`Tool.makeGpgKeyOption return err [${err && err.message ? err.message : null}]`);\n                    }\n                }\n                // console.log (`this.sessionHashPool.push!\\n${ this.sessionHashPool }\\n${ this.sessionHashPool.length }`)\n                this.listenAfterPassword(socket, sessionHash);\n                try {\n                    this.imapConnectData = JSON.parse(data);\n                }\n                catch (ex) {\n                    return passwordFail(ex);\n                }\n                this.localConnected.set(clientName, clientObj);\n                return passwordFail(this.imapConnectData);\n            });\n        });\n        socket.on('deleteKeyPairNext', CallBack1 => {\n            CallBack1();\n            console.log(`on deleteKeyPairNext`);\n            const thisConnect = this.localConnected.get(clientName);\n            if (this.localConnected.size > 1 && thisConnect && !thisConnect.login) {\n                console.log(`this.localConnected = [${Util.inspect(this.localConnected, false, 2, true)}], thisConnect.login = [${thisConnect.login}]`);\n                return this.socketServer.emit('deleteKeyPairNoite');\n            }\n            const info = `socket on deleteKeyPairNext, delete key pair now.`;\n            saveLog(info);\n            this.config = Tool.InitConfig();\n            this.config.firstRun = false;\n            this.keyPair = null;\n            Tool.saveConfig(this.config, saveLog);\n            if (this.CoNETConnectCalss) {\n                this.CoNETConnectCalss.destroy(2);\n                this.CoNETConnectCalss = null;\n            }\n            sessionHash = '';\n            Tool.deleteImapFile();\n            return this.socketServer.emit('init', null, this.config);\n        });\n        socket.on('NewKeyPair', (preData, CallBack1) => {\n            const uuid = Uuid.v4();\n            CallBack1(uuid);\n            const _callBack = (...data) => {\n                socket.emit(uuid, ...data);\n            };\n            //\t\talready have key pair\n            if (this.config.keypair && this.config.keypair.createDate) {\n                return saveLog(`[${clientName}] on NewKeyPair but system already have keypair: ${this.config.keypair.publicKeyID} stop and return keypair.`);\n            }\n            this.savedPasswrod = preData.password;\n            return Tool.getPbkdf2(this.config, this.savedPasswrod, (err, Pbkdf2Password) => {\n                if (err) {\n                    saveLog(`NewKeyPair getPbkdf2 Error: [${err.message}]`);\n                    return _callBack('systemError');\n                }\n                preData.password = Pbkdf2Password.toString('hex');\n                //console.log (`preData.password = [${ preData.password }]`)\n                return Tool.newKeyPair(preData.email, preData.nikeName, preData.password, (err, retData) => {\n                    if (err) {\n                        console.log(err);\n                        _callBack();\n                        return saveLog(`CreateKeyPairProcess return err: [${err.message}]`);\n                    }\n                    if (!retData) {\n                        const info = `newKeyPair return null key!`;\n                        saveLog(info);\n                        console.log(info);\n                        return _callBack();\n                    }\n                    if (!clientObj.listenAfterPasswd) {\n                        clientObj.listenAfterPasswd = clientObj.login = true;\n                        this.localConnected.set(clientName, clientObj);\n                        this.sessionHashPool.push(sessionHash = Crypto.randomBytes(10).toString('hex'));\n                        //console.log ( `this.sessionHashPool.push!\\n${ this.sessionHashPool }\\n${ this.sessionHashPool.length }`)\n                        this.listenAfterPassword(socket, sessionHash);\n                    }\n                    return Tool.getKeyPairInfo(retData.publicKey, retData.privateKey, preData.password, (err, key) => {\n                        if (err) {\n                            const info = `Tool.getKeyPairInfo Error [${err.message ? err.message : 'null err message '}]`;\n                            return _callBack('systemError');\n                        }\n                        this.keyPair = this.config.keypair = key;\n                        this.config.account = this.config.keypair.email;\n                        return Tool.makeGpgKeyOption(this.config, this.savedPasswrod, (err, data) => {\n                            if (err) {\n                                return saveLog(err.message);\n                            }\n                            this.openPgpKeyOption = data;\n                            Tool.saveConfig(this.config, saveLog);\n                            return _callBack(null, this.config.keypair, sessionHash);\n                        });\n                    });\n                });\n            });\n        });\n    }\n}\nexports.default = localServer;\n"
  },
  {
    "path": "app/localWebServer.ts",
    "content": "/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as Express from 'express'\nimport * as Path from 'path'\nimport * as HTTP from 'http'\nimport * as SocketIo from 'socket.io'\nimport * as Tool from './tools/initSystem'\nimport * as Async from 'async'\nimport * as Fs from 'fs'\nimport * as Util from 'util'\nimport * as Uuid from 'node-uuid'\nimport * as Imap from './tools/imap'\nimport CoNETConnectCalss from './tools/coNETConnect'\nimport * as Crypto from 'crypto'\nimport * as mime from 'mime-types'\n\nExpress.static.mime.define({ 'multipart/related': ['mht'] })\n//Express.static.mime.define({ 'message/rfc822' : ['mhtml','mht'] })\nExpress.static.mime.define({ 'application/x-mimearchive' : ['mhtml','mht'] })\nExpress.static.mime.define({ 'multipart/related' : ['mhtml','mht'] })\n\ninterface localConnect {\n\tsocket: SocketIO.Socket\n\tlogin: boolean\n\tlistenAfterPasswd: boolean\n}\n\nlet logFileFlag = 'w'\nconst conetImapAccount = /^qtgate_test\\d\\d?@icloud.com$/i\n\nconst saveLog = ( err: {} | string ) => {\n\tif ( !err ) {\n\t\treturn \n\t}\n\tconst data = `${ new Date().toUTCString () }: ${ typeof err === 'object' ? ( err['message'] ? err['message'] : '' ) : err }\\r\\n`\n\tconsole.log ( data )\n\treturn Fs.appendFile ( Tool.ErrorLogFile, data, { flag: logFileFlag }, () => {\n\t\treturn logFileFlag = 'a'\n\t})\n}\n\nconst saveServerStartup = ( localIpaddress: string ) => {\n\tconst info = `\\n*************************** CoNET Platform [ ${ Tool.CoNET_version } ] server start up *****************************\\n` +\n\t\t\t`Access url: http://${localIpaddress}:${ Tool.LocalServerPortNumber }\\n`\n\tsaveLog ( info )\n}\n\nconst saveServerStartupError = ( err: {} ) => {\n\tconst info = `\\n*************************** CoNET Platform [ ${ Tool.CoNET_version } ] server startup falied *****************************\\n` +\n\t\t\t`platform ${ process.platform }\\n` +\n\t\t\t`${ err['message'] }\\n`\n\tsaveLog ( info )\n}\n\nconst imapErrorCallBack = ( message: string ) => {\n\tif ( message && message.length ) {\n\t\tif ( /auth|login|log in|Too many simultaneous|UNAVAILABLE/i.test( message )) {\n\t\t\treturn 1\n\t\t}\n\t\t\t\n\t\tif ( /ECONNREFUSED/i.test ( message )) {\n\t\t\treturn 5\n\t\t}\n\n\t\tif (/OVERQUOTA/i.test ( message )) {\n\t\t\treturn 6\n\t\t}\n\t\t\t\n\t\tif ( /certificate/i.test ( message )) {\n\t\t\treturn 2\n\t\t}\n\t\t\t\n\t\tif ( /timeout|ENOTFOUND/i.test ( message )) {\n\t\t\treturn 0\n\t\t}\n\n\t\treturn 5\n\t}\n\t\n\treturn -1\n\n}\n\n\nexport default class localServer {\n\tprivate expressServer = Express()\n\tprivate httpServer = HTTP.createServer ( this.expressServer )\n\tprivate socketServer = SocketIo ( this.httpServer )\n\tprivate socketServer_CoSearch = this.socketServer.of ('/CoSearch')\n\tpublic config: install_config  = null\n\tpublic keyPair: keypair = null\n\tpublic savedPasswrod: string = ''\n\tpublic imapConnectData: IinputData = null\n\tpublic localConnected: Map < string, localConnect > = new Map ()\n\tprivate CoNETConnectCalss: CoNETConnectCalss = null\n\tprivate openPgpKeyOption = null\n\tprivate sessionHashPool = []\n\tprivate Pbkdf2Password = null\n\tprivate nodeList = [{\n\t\temail: 'node@Kloak.app',\n\t\tkeyID:'',\n\t\tkey: ''\n\t}]\n\n\tprivate requestPool: Map < string, SocketIO.Socket > = new Map()\n\n\n\tprivate catchCmd ( mail: string, uuid: string ) {\n\t\tif ( !this.imapConnectData.sendToQTGate ) {\n\t\t\tthis.imapConnectData.sendToQTGate = true\n\t\t\tTool.saveEncryptoData (  Tool.imapDataFileName1, this.imapConnectData, this.config, this.savedPasswrod, err => {\n\n\t\t\t})\n\t\t}\n\t\tconsole.log ( `Get response from CoNET uuid [${ uuid }] length [${ mail.length }]`)\n\t\tconst socket = this.requestPool.get ( uuid )\n\t\tif ( !socket ) {\n\t\t\treturn console.log (`Get cmd that have no matched socket \\n\\n`, mail )\n\t\t}\n\n\t\tsocket.emit ( 'doingRequest', mail, uuid )\n\t}\n\t\n\tprivate tryConnectCoNET ( socket: SocketIO.Socket, sessionHash: string ) {\n\t\tconsole.log (`doing tryConnectCoNET`)\n\t\t//\t\thave CoGate connect\n\n\t\tif ( this.CoNETConnectCalss ) {\n\t\t\treturn this.CoNETConnectCalss.Ping()\n\t\t}\n\n\t\tlet sendMail = false\n\t\tconst _exitFunction = err => {\n\t\t\tconsole.trace ( `makeConnect on _exitFunction err this.CoNETConnectCalss destroy!`, err )\n\t\t\tthis.CoNETConnectCalss = null\n\t\t\t\n\t\t}\n\n\t\tconst makeConnect = () => {\n\t\t\t\n\t\t\treturn this.CoNETConnectCalss = new CoNETConnectCalss ( this.imapConnectData, this.socketServer, !this.imapConnectData.sendToQTGate, this.nodeList[0].email,\n\t\t\t\tthis.openPgpKeyOption, this.keyPair.publicKey, ( mail, uuid ) => {\n\t\t\t\treturn this.catchCmd ( mail, uuid )\n\t\t\t}, _exitFunction )\n\t\t\t\n\t\t}\n\t\t\n\t\treturn makeConnect ()\n\t\t\n\t}\n\n\tprivate listenAfterPassword ( socket: SocketIO.Socket, sessionHash: string ) {\n\t\t\n\t\tsocket.on ( 'checkImap', ( emailAddress: string, password: string, timeZone, tLang, CallBack1 ) => {\n\t\t\tCallBack1()\n\t\t\tconsole.log (`localServer on checkImap!`)\n\t\t\tconst imapServer = Tool.getImapSmtpHost( emailAddress )\n\t\t\tthis.imapConnectData = {\n\t\t\t\temail: this.config.account,\n\t\t\t\taccount: this.config.account,\n\t\t\t\tsmtpServer: imapServer.smtp,\n\t\t\t\tsmtpUserName: emailAddress,\n\t\t\t\tsmtpPortNumber: imapServer.SmtpPort,\n\t\t\t\tsmtpSsl: imapServer.smtpSsl,\n\t\t\t\tsmtpIgnoreCertificate: false,\n\t\t\t\tsmtpUserPassword: password,\n\t\t\t\timapServer: imapServer.imap,\n\t\t\t\timapPortNumber: imapServer.ImapPort,\n\t\t\t\timapSsl: imapServer.imapSsl,\n\t\t\t\timapUserName: emailAddress,\n\t\t\t\timapIgnoreCertificate: false,\n\t\t\t\timapUserPassword: password,\n\t\t\t\ttimeZoneOffset: timeZone,\n\t\t\t\tlanguage: tLang,\n\t\t\t\timapTestResult: null,\n\t\t\t\tclientFolder: Uuid.v4(),\n\t\t\t\tserverFolder: Uuid.v4(),\n\t\t\t\trandomPassword: Uuid.v4(),\n\t\t\t\tuuid: Uuid.v4(),\n\t\t\t\tconfirmRisk: false,\n\t\t\t\tclientIpAddress: null,\n\t\t\t\tciphers: null,\n\t\t\t\tsendToQTGate: false\n\n\t\t\t}\n\n\t\t\treturn this.doingCheckImap ( socket )\n\t\t})\n\n\t\tsocket.on ( 'tryConnectCoNET', CallBack1 => {\n\t\t\tconst uuid = Uuid.v4()\n\t\t\tCallBack1( uuid )\n\n\t\t\tconst _callBack = ( ...data ) => {\n\t\t\t\tsocket.emit ( uuid, ...data )\n\t\t\t}\n\t\t\tconsole.log (`socket on tryConnectCoNET!\\n\\n`)\n\t\t\tif ( !this.imapConnectData ) {\n\t\t\t\tconsole.log (`socket.on ( 'tryConnectCoNET') !this.imapConnectData \\n\\n `)\n\t\t\t\treturn _callBack ( 'systemError' )\n\t\t\t\t\n\t\t\t}\n\t\t\tif ( !this.imapConnectData.confirmRisk ) {\n\t\t\t\tthis.imapConnectData.confirmRisk = true\n\t\t\t\t\n\t\t\t\treturn Tool.saveEncryptoData (  Tool.imapDataFileName1, this.imapConnectData, this.config, this.savedPasswrod, err => {\n\t\t\t\t\treturn this.tryConnectCoNET ( socket, sessionHash )\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn this.tryConnectCoNET ( socket, sessionHash )\n\t\t\t\n\t\t})\n\n\t\tsocket.on ( 'sendRequestMail', CallBack1 => {\n\n\t\t\t\n\t\t\tCallBack1 ()\n\t\t\tif ( !this.CoNETConnectCalss ) {\n\t\t\t\treturn console.log (`localServer on sendRequestMail Error! have no this.CoNETConnectCalss!`)\n\t\t\t}\n\t\t\tsocket.emit ( 'tryConnectCoNETStage', null, 2, false )\n\t\t\tif ( this.CoNETConnectCalss ) {\n\t\t\t\tconsole.log (`localWebServer on sendRequestMail !`)\n\t\t\t\treturn this.CoNETConnectCalss.sendRequestMail ()\n\t\t\t}\n\t\t\tconsole.log (`localWebServer on sendRequestMail have no CoNETConnectCalss create CoNETConnectCalss`)\n\t\t\treturn this.tryConnectCoNET ( socket, sessionHash )\n\t\t\t\n\t\t})\n\n\t\tsocket.on ( 'checkActiveEmailSubmit', ( text, CallBack1 ) => {\n\t\t\tconst uuid = Uuid.v4()\n\t\t\tCallBack1( uuid )\n\t\t\t\n\t\t\tconst _callBack = ( ...data ) => {\n\t\t\t\tsocket.emit ( uuid, ...data )\n\t\t\t}\n\n\t\t\tconst key = Buffer.from ( text, 'base64' ).toString ()\n\t\t\tconsole.log (`checkActiveEmailSubmit`, key )\n\t\t\tif ( key && key.length ) {\n\t\t\t\tconsole.log ( `active key success! \\n[${ key }]`)\n\t\t\t\t\n\t\t\t\tthis.keyPair.publicKey = this.config.keypair.publicKey = key\n\t\t\t\tthis.keyPair.verified = this.config.keypair.verified = true\n\t\t\t\tthis.imapConnectData.sendToQTGate = true\n\t\t\t\t_callBack ()\n\t\t\t\tTool.saveEncryptoData ( Tool.imapDataFileName1, this.imapConnectData, this.config, this.savedPasswrod, err => {\n\t\t\t\t\tif ( err ) {\n\t\t\t\t\t\tsaveLog (`Tool.saveConfig return Error: [${ err.message }]`)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\treturn Tool.saveConfig ( this.config, err => {\n\t\t\t\t\tif ( err ) {\n\t\t\t\t\t\tsaveLog (`Tool.saveConfig return Error: [${ err.message }]`)\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t})\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t})\n\n\t\tsocket.on ( 'doingRequest', ( uuid, request, CallBack1 ) => {\n\t\t\tconst _uuid = Uuid.v4()\n\t\t\tCallBack1 ( _uuid )\n\n\t\t\tconst _callBack = ( ...data ) => {\n\t\t\t\tsocket.emit ( _uuid, ...data )\n\t\t\t}\n\t\t\tthis.requestPool.set ( uuid, socket )\n\t\t\t\n\t\t\tconsole.log (`on doingRequest uuid = [${ uuid }]\\n${ request }\\n`)\n\n\t\t\tif ( this.CoNETConnectCalss ) {\n\t\t\t\tsaveLog (`doingRequest on ${ uuid }`)\n\t\t\t\treturn this.CoNETConnectCalss.requestCoNET_v1 ( uuid, request, _callBack )\n\t\t\t}\n\t\t\tsaveLog ( `doingRequest on ${ uuid } but have not CoNETConnectCalss need restart! socket.emit ( 'systemErr' )`)\n\t\t\tsocket.emit ( 'systemErr' )\n\t\t})\n\n\t\tsocket.on ( 'getFilesFromImap', ( files: string, CallBack1 ) => {\n\t\t\tconst uuid = Uuid.v4()\n\t\t\tCallBack1( uuid )\n\n\t\t\tconst _callBack = ( ...data ) => {\n\t\t\t\tsocket.emit ( uuid, ...data )\n\t\t\t}\n\t\t\t\n\t\t\tif ( typeof files !== 'string' || !files.length ) {\n\t\t\t\treturn _callBack ( new Error ('invalidRequest'))\n\t\t\t}\n\t\t\tconst _files = files.split (',')\n\t\t\tconsole.log (`socket.on ('getFilesFromImap') _files = [${ _files }] _files.length = [${ _files.length }]`  )\n\t\t\t\n\t\t\tlet ret = ''\n\t\t\treturn Async.eachSeries ( _files, ( n, next ) => {\n\t\t\t\tconsole.log (`Async.eachSeries _files[${ n }]`)\n\t\t\t\treturn this.CoNETConnectCalss.getFile ( n, ( err, data ) => {\n\t\t\t\t\tif ( err ) {\n\t\t\t\t\t\treturn next ( err )\n\t\t\t\t\t}\n\t\t\t\t\tret += data.toString ()\n\t\t\t\t\treturn next ()\n\t\t\t\t})\n\t\t\t}, err => {\n\t\t\t\tif ( err ) {\n\t\t\t\t\treturn _callBack ( err )\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t//console.log (`******************** getFilesFromImap success all [${ ret.length }] fies!\\n\\n${ ret }\\n\\n`)\n\n\t\t\t\t\n\t\t\t\treturn _callBack ( null, ret )\n\t\t\t})\n\t\t\t\n\t\t})\n\n\t\tsocket.on ( 'sendMedia', ( uuid, rawData, CallBack1 ) => {\n\t\t\tconst _uuid = Uuid.v4()\n\t\t\tCallBack1( _uuid )\n\n\t\t\tconst _callBack = ( ...data ) => {\n\t\t\t\tsocket.emit ( _uuid, ...data )\n\t\t\t}\n\t\t\treturn this.CoNETConnectCalss.sendDataToANewUuidFolder ( Buffer.from ( rawData ).toString ( 'base64' ), uuid, uuid, _callBack )\n\t\t})\n\n\t\tsocket.on ( 'mime', ( _mime, CallBack1 ) => {\n\t\t\tconst _uuid = Uuid.v4()\n\t\t\tCallBack1( _uuid )\n\n\t\t\tconst _callBack = ( ...data ) => {\n\t\t\t\tsocket.emit ( _uuid, ...data )\n\t\t\t}\n\t\t\tlet y = mime.lookup( _mime )\n\t\t\tif ( !y ) {\n\t\t\t\treturn _callBack ( new Error ('no mime'))\n\t\t\t}\n\t\t\treturn _callBack ( null, y )\n\t\t})\n/*\n\t\tsocket.on ('getUrl', ( url: string, CallBack ) => {\n\t\t\tconst uu = new URLSearchParams ( url )\n\t\t\tif ( !uu || typeof uu.get !== 'function' ) {\n\t\t\t\tconsole.log (`getUrl [${ url }] have not any URLSearchParams`)\n\t\t\t\treturn CallBack ()\n\t\t\t}\n\t\t\t\n\t\t\treturn CallBack ( null, uu.get('imgrefurl'), uu.get('/imgres?imgurl'))\n\t\t})\n*/\n\t}\n\n\tprivate doingCheckImap ( socket: SocketIO.Socket ) {\n\t\tthis.imapConnectData.imapTestResult = false\n\t\treturn Async.series ([\n\t\t\tnext => Imap.imapAccountTest ( this.imapConnectData, err => {\n\t\t\t\tif ( err ) {\n\t\t\t\t\t\n\t\t\t\t\treturn next ( err )\n\t\t\t\t}\n\t\t\t\tconsole.log (`imapAccountTest success!`, typeof next )\n\t\t\t\tsocket.emit ( 'imapTest' )\n\t\t\t\treturn next ()\n\t\t\t}),\n\t\t\tnext => Tool.smtpVerify ( this.imapConnectData, next )\n\t\t], ( err: Error ) => {\n\t\t\t\n\t\t\tif ( err ) {\n\t\t\t\tconsole.log (`doingCheckImap Async.series Error!`, err )\n\t\t\t\treturn socket.emit ( 'smtpTest', imapErrorCallBack ( err.message ))\n\t\t\t}\n\n\t\t\tthis.imapConnectData.imapTestResult = true\n\t\t\treturn Tool.saveEncryptoData ( Tool.imapDataFileName1, this.imapConnectData, this.config, this.savedPasswrod, err => {\n\t\t\t\tconsole.log (`socket.emit ( 'imapTestFinish' )`)\n\t\t\t\tsocket.emit ( 'imapTestFinish' , this.imapConnectData )\n\t\t\t})\n\t\t\t\n\t\t})\n\t\t\t\n\t\t\n\t}\n\n\tprivate socketServerConnected ( socket: SocketIO.Socket ) {\n\t\tconst clientName = `[${ socket.id }][ ${ socket.conn.remoteAddress }]`\n\t\tlet sessionHash = ''\n\t\tconst clientObj: localConnect = {\n\t\t\tlistenAfterPasswd: false,\n\t\t\tsocket: socket,\n\t\t\tlogin: false\n\t\t}\n\n\t\tsaveLog ( `socketServerConnected ${ clientName } connect ${ this.localConnected.size }`)\n\n\n\t\tsocket.once ( 'init', Callback1 => {\n\t\t\tconst uuid = Uuid.v4()\n\t\t\tCallback1 ( uuid )\n\t\t\tconst ret = Tool.emitConfig ( this.config, false )\n\t\t\t//console.log ( Util.inspect( ret, false, 3, true  ))\n\t\t\t//console.log ( `typeof Callback1 [${ typeof Callback1 }]`)\n\t\t\treturn socket.emit ( uuid, null, ret )\n\t\t})\n\n\t\tsocket.once ( 'agreeClick', () => {\n\t\t\tthis.config.firstRun = false\n\t\t\treturn Tool.saveConfig ( this.config, saveLog )\n\t\t})\n\n\t\tsocket.on ( 'checkPemPassword', ( password: string, CallBack1 ) => {\n\n\t\t\tconst uuid = Uuid.v4()\n\t\t\tCallBack1 ( uuid )\n\n\t\t\tthis.sessionHashPool.push ( sessionHash = Crypto.randomBytes ( 10 ).toString ('hex'))\n\n\t\t\tconst passwordFail = ( imap ) => {\n\n\t\t\t\t//onsole.log (`passwordFail this.Pbkdf2Password = [${ this.Pbkdf2Password }]`)\n\t\t\t\treturn socket.emit ( uuid, null, imap, this.Pbkdf2Password, sessionHash )\n\t\t\t\t\n\t\t\t}\n\n\t\t\tif ( !this.config.keypair || !this.config.keypair.publicKey ) {\n\t\t\t\tconsole.log ( `checkPemPassword !this.config.keypair` )\n\t\t\t\treturn passwordFail ( true )\n\t\t\t}\n\n\t\t\tif ( !password || password.length < 5 ) {\n\t\t\t\tconsole.log (`! password `)\n\t\t\t\treturn passwordFail ( true )\n\t\t\t}\n\t\t\t\n\t\t\tif ( this.savedPasswrod && this.savedPasswrod.length ) {\n\t\t\t\tif ( this.savedPasswrod !== password ) {\n\t\t\t\t\tconsole.log ( `savedPasswrod !== password `)\n\t\t\t\t\treturn passwordFail ( true )\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.listenAfterPassword ( socket, sessionHash )\n\t\t\t\treturn passwordFail ( this.imapConnectData )\n\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\treturn Async.waterfall ([\n\t\t\t\tnext => Tool.getPbkdf2 ( this.config, password, next ),\n\t\t\t\t( Pbkdf2Password: Buffer, next ) => {\n\t\t\t\t\tthis.Pbkdf2Password = Pbkdf2Password.toString ( 'hex' )\n\t\t\t\t\t\n\t\t\t\t\tTool.getKeyPairInfo ( this.config.keypair.publicKey, this.config.keypair.privateKey, this.Pbkdf2Password, next )\n\t\t\t\t},\n\t\t\t\t( key, next ) => {\n\t\t\t\t\t//console.log ( `checkPemPassword Tool.getKeyPairInfo success!`)\n\t\t\t\t\tif ( ! key.passwordOK ) {\n\t\t\t\t\t\tthis.Pbkdf2Password = null\n\t\t\t\t\t\tsaveLog ( `[${ clientName }] on checkPemPassword had try password! [${ password }]` )\n\t\t\t\t\t\treturn passwordFail ( true )\n\t\t\t\t\t}\n\t\t\t\t\t//console.log (`checkPemPassword this.Pbkdf2Password = [${ this.Pbkdf2Password}]`)\n\t\t\t\t\tthis.savedPasswrod = password\n\t\t\t\t\t\n\t\t\t\t\tthis.keyPair = key\n\t\t\t\t\tclientObj.listenAfterPasswd = clientObj.login = true\n\t\t\t\t\tthis.localConnected.set ( clientName, clientObj )\n\t\t\t\t\treturn Tool.makeGpgKeyOption ( this.config, this.savedPasswrod, next )\n\t\t\t\t},\n\t\t\t\t( option_KeyOption, next ) => {\n\t\t\t\t\tconsole.log (`checkPemPassword Tool.makeGpgKeyOption success!`)\n\t\t\t\t\tthis.openPgpKeyOption = option_KeyOption\n\n\t\t\t\t\treturn Tool.readEncryptoFile ( Tool.imapDataFileName1, password, this.config, next )\n\t\t\t}], ( err: Error, data: string ) => {\n\t\t\t\tconsole.log (`checkPemPassword Async.waterfall success!`)\n\t\t\t\tif ( err ) {\n\t\t\t\t\tif ( !( err.message && /no such file/i.test( err.message ))) {\n\t\t\t\t\t\tpasswordFail ( err )\n\t\t\t\t\t\treturn saveLog ( `Tool.makeGpgKeyOption return err [${ err && err.message ? err.message : null }]` )\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t\n\t\t\t\t// console.log (`this.sessionHashPool.push!\\n${ this.sessionHashPool }\\n${ this.sessionHashPool.length }`)\n\t\t\t\tthis.listenAfterPassword ( socket, sessionHash )\n\n\t\t\t\ttry {\n\t\t\t\t\tthis.imapConnectData = JSON.parse ( data )\n\t\t\t\t\t\n\t\t\t\t} catch ( ex ) {\n\t\t\t\t\treturn passwordFail ( ex )\n\t\t\t\t}\n\t\t\t\tthis.localConnected.set ( clientName, clientObj )\n\t\t\t\t\t\n\t\t\t\treturn passwordFail ( this.imapConnectData )\n\t\t\t})\n\t\t\t\n\t\t})\n\n\t\tsocket.on ( 'deleteKeyPairNext', CallBack1 => {\n\t\t\tCallBack1()\n\t\t\tconsole.log ( `on deleteKeyPairNext` )\n\t\t\tconst thisConnect = this.localConnected.get ( clientName )\n\n\t\t\tif ( this.localConnected.size > 1 && thisConnect && ! thisConnect.login ) {\n\t\t\t\tconsole.log (`this.localConnected = [${ Util.inspect( this.localConnected, false, 2, true )}], thisConnect.login = [${ thisConnect.login }]`)\n\t\t\t\treturn this.socketServer.emit ( 'deleteKeyPairNoite' )\n\t\t\t}\n\t\t\tconst info = `socket on deleteKeyPairNext, delete key pair now.`\n\t\t\t\n\t\t\tsaveLog ( info )\n\t\t\tthis.config = Tool.InitConfig ()\n\t\t\tthis.config.firstRun = false\n\t\t\tthis.keyPair = null\n\t\t\tTool.saveConfig ( this.config, saveLog )\n\t\t\tif ( this.CoNETConnectCalss ) {\n\t\t\t\tthis.CoNETConnectCalss.destroy ( 2 )\n\t\t\t\tthis.CoNETConnectCalss = null\n\t\t\t}\n\t\t\tsessionHash = ''\n\t\t\tTool.deleteImapFile ()\n\t\t\treturn this.socketServer.emit ( 'init', null, this.config )\n\t\t})\n\n\t\tsocket.on ( 'NewKeyPair', ( preData: INewKeyPair, CallBack1 ) => {\n\t\t\tconst uuid = Uuid.v4()\n\t\t\tCallBack1( uuid )\n\n\t\t\tconst _callBack = ( ...data ) => {\n\t\t\t\tsocket.emit ( uuid, ...data )\n\t\t\t}\n\t\t\t//\t\talready have key pair\n\n\t\t\tif ( this.config.keypair && this.config.keypair.createDate ) {\n\t\t\t\treturn saveLog (`[${ clientName }] on NewKeyPair but system already have keypair: ${ this.config.keypair.publicKeyID } stop and return keypair.`)\n\t\t\t}\n\n\t\t\tthis.savedPasswrod = preData.password\n\t\t\treturn Tool.getPbkdf2 ( this.config, this.savedPasswrod, ( err, Pbkdf2Password: Buffer ) => {\n\t\t\t\tif ( err ) {\n\t\t\t\t\tsaveLog ( `NewKeyPair getPbkdf2 Error: [${ err.message }]`)\n\t\t\t\t\treturn _callBack ('systemError')\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tpreData.password = Pbkdf2Password.toString ( 'hex' )\n\t\t\t\t//console.log (`preData.password = [${ preData.password }]`)\n\t\t\t\treturn Tool.newKeyPair( preData.email, preData.nikeName, preData.password, ( err, retData )=> {\n\t\t\t\t\tif ( err ) {\n\t\t\t\t\t\tconsole.log ( err )\n\t\t\t\t\t\t_callBack ()\n\t\t\t\t\t\treturn saveLog (`CreateKeyPairProcess return err: [${ err.message }]`)\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tif ( ! retData ) {\n\t\t\t\t\t\tconst info = `newKeyPair return null key!`\n\t\t\t\t\t\tsaveLog ( info )\n\t\t\t\t\t\tconsole.log ( info )\n\t\t\t\t\t\treturn _callBack ( )\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif ( !clientObj.listenAfterPasswd ) {\n\t\t\t\t\t\tclientObj.listenAfterPasswd = clientObj.login = true\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.localConnected.set ( clientName, clientObj )\n\t\t\t\t\t\tthis.sessionHashPool.push ( sessionHash = Crypto.randomBytes (10).toString ('hex'))\n\t\t\t\t\t\t//console.log ( `this.sessionHashPool.push!\\n${ this.sessionHashPool }\\n${ this.sessionHashPool.length }`)\n\t\t\t\t\t\tthis.listenAfterPassword ( socket, sessionHash )\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn Tool.getKeyPairInfo ( retData.publicKey, retData.privateKey, preData.password, ( err, key ) => {\n\t\t\t\t\t\tif ( err ) {\n\t\t\t\t\t\t\tconst info = `Tool.getKeyPairInfo Error [${ err.message ? err.message : 'null err message '}]`\n\t\t\t\t\t\t\treturn _callBack ( 'systemError' )\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.keyPair = this.config.keypair = key\n\t\t\t\t\t\tthis.config.account = this.config.keypair.email\n\t\t\t\t\t\treturn Tool.makeGpgKeyOption ( this.config, this.savedPasswrod, ( err, data ) => {\n\t\t\t\t\t\t\tif ( err ) {\n\t\t\t\t\t\t\t\treturn saveLog ( err.message )\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.openPgpKeyOption = data\n\t\t\t\t\t\t\tTool.saveConfig ( this.config, saveLog )\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\treturn _callBack ( null, this.config.keypair, sessionHash )\n\t\t\t\t\t\t})\n\t\t\t\t\t\t\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t\t\t\t\t\n\t\t\t})\n\t\t\t\n\t\t})\n\n\n\t}\n\n\tconstructor( private cmdResponse: ( cmd: QTGateAPIRequestCommand ) => void, test: boolean ) {\n\t\t//Express.static.mime.define({ 'message/rfc822' : ['mhtml','mht'] })\n\t\t//Express.static.mime.define ({ 'multipart/related' : ['mhtml','mht'] })\n\t\tExpress.static.mime.define ({ 'application/x-mimearchive' : ['mhtml','mht'] })\n\t\tthis.expressServer.set ( 'views', Path.join ( __dirname, 'views' ))\n\t\tthis.expressServer.set ( 'view engine', 'pug' )\n\t\tthis.expressServer.use ( Express.static ( Tool.QTGateFolder ))\n\t\tthis.expressServer.use ( Express.static ( Path.join ( __dirname, 'public' )))\n\t\tthis.expressServer.use ( Express.static ( Path.join ( __dirname, 'html' )))\n\t\n\t\t\n\t\t\n\t\tthis.expressServer.get ( '/', ( req, res ) => {\n\n            res.render( 'home', { title: 'home', proxyErr: false  })\n\t\t})\n\n\t\tthis.socketServer.on ( 'connection', socker => {\n\t\t\treturn this.socketServerConnected ( socker )\n\t\t})\n\t\t\n\n\t\tthis.httpServer.once ( 'error', err => {\n\t\t\tconsole.log (`httpServer error`, err )\n\t\t\tsaveServerStartupError ( err )\n\t\t\treturn process.exit (1)\n\t\t})\n\n\t\t\n\n\t\tAsync.series ([\n\t\t\tnext => Tool.checkSystemFolder ( next ),\n\t\t\tnext => Tool.checkConfig ( next )\t\n\t\t], ( err, data ) => {\n\t\t\tif ( err ) {\n\t\t\t\treturn saveServerStartupError ( err )\n\t\t\t}\n\t\t\t\n\t\t\tthis.config = data['1']\n\t\t\tif ( !test ) {\n\t\t\t\tthis.httpServer.listen ( Tool.LocalServerPortNumber, () => {\n\t\t\t\t\treturn saveServerStartup ( `localhost`)\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t\t\n\t}\n}\n"
  },
  {
    "path": "app/main.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst localWebServer_1 = require(\"./localWebServer\");\nconst test = /^true$/.test(process.argv[2]) ? true : false;\nconst _start = process.argv[3] || false;\nexports.start = (cmd, _test) => {\n    const localServer = new localWebServer_1.default(cmd, _test);\n};\nif (_start) {\n    exports.start(null, false);\n}\n"
  },
  {
    "path": "app/main.ts",
    "content": "/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\ndeclare const process: any\nimport LocalServer from './localWebServer'\nconst test = /^true$/.test ( process.argv[2] ) ? true : false\nconst _start = process.argv [3] || false\nexport const start = ( cmd: () => void, _test ) => {\n\tconst localServer = new LocalServer ( cmd, _test )\n}\nif ( _start ) {\n\tstart ( null, false )\n}"
  },
  {
    "path": "app/package.json.npm",
    "content": "{\n  \"name\": \"conet\",\n  \"version\": \"3.0.20\",\n  \"license\": \"MIT\",\n  \"description\": \"CoNET\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/QTGate/CoNET.git\"\n  },\n  \"author\": {\n    \"name\": \"CoNET Technology Inc.\",\n    \"email\": \"info@CoNETTech.ca\"\n  },\n  \"main\": \"./main\",\n  \"bugs\": {\n    \"url\": \"https://github.com/QTGate/CoNET/issues\"\n  },\n  \"homepage\": \"https://www.CoNETTech.ca\",\n  \"dependencies\": {\n    \"async\": \"^3.1.0\",\n    \"cookie-parser\": \"^1.4.4\",\n    \"express\": \"^4.17.1\",\n    \"jimp\": \"^0.8.5\",\n    \"jszip\": \"^3.2.2\",\n    \"mime-types\": \"^2.1.24\",\n    \"node-uuid\": \"^1.4.8\",\n    \"nodemailer\": \"^6.3.1\",\n    \"openpgp\": \"^4.6.2\",\n    \"pug\": \"^2.0.4\",\n    \"socket.io\": \"^2.3.0\",\n    \"socket.io-client\": \"^2.3.0\"\n  },\n  \"scripts\": {\n    \"start\": \"node main false true\"\n  },\n  \"devDependencies\": {\n    \"@types/async\": \"^3.0.3\",\n    \"@types/cleave.js\": \"^1.4.1\",\n    \"@types/cookie-parser\": \"^1.4.2\",\n    \"@types/express\": \"^4.17.1\",\n    \"@types/jcanvas\": \"^15.2.2\",\n    \"@types/jquery\": \"^3.3.31\",\n    \"@types/jquery.cookie\": \"^1.4.31\",\n    \"@types/knockout\": \"^3.4.66\",\n    \"@types/openpgp\": \"^4.4.7\",\n    \"@types/semantic-ui\": \"^2.2.7\",\n    \"@types/socket.io\": \"^2.1.4\",\n    \"@types/socket.io-client\": \"^1.4.32\",\n    \"source-map-support\": \"^0.5.16\"\n  }\n}\n"
  },
  {
    "path": "app/public/css/c3.css",
    "content": ".c3 svg{font:10px sans-serif;-webkit-tap-highlight-color:transparent}.c3 line,.c3 path{fill:none;stroke:#000}.c3 text{-webkit-user-select:none;-moz-user-select:none;user-select:none}.c3-bars path,.c3-event-rect,.c3-legend-item-tile,.c3-xgrid-focus,.c3-ygrid{shape-rendering:crispEdges}.c3-chart-arc path{stroke:#fff}.c3-chart-arc text{fill:#fff;font-size:13px}.c3-grid line{stroke:#aaa}.c3-grid text{fill:#aaa}.c3-xgrid,.c3-ygrid{stroke-dasharray:3 3}.c3-text.c3-empty{fill:grey;font-size:2em}.c3-line{stroke-width:1px}.c3-circle._expanded_{stroke-width:1px;stroke:#fff}.c3-selected-circle{fill:#fff;stroke-width:2px}.c3-bar{stroke-width:0}.c3-bar._expanded_{fill-opacity:1;fill-opacity:.75}.c3-target.c3-focused{opacity:1}.c3-target.c3-focused path.c3-line,.c3-target.c3-focused path.c3-step{stroke-width:2px}.c3-target.c3-defocused{opacity:.3!important}.c3-region{fill:#4682b4;fill-opacity:.1}.c3-brush .extent{fill-opacity:.1}.c3-legend-item{font-size:12px}.c3-legend-item-hidden{opacity:.15}.c3-legend-background{opacity:.75;fill:#fff;stroke:#d3d3d3;stroke-width:1}.c3-title{font:14px sans-serif}.c3-tooltip-container{z-index:10}.c3-tooltip{border-collapse:collapse;border-spacing:0;background-color:#fff;empty-cells:show;-webkit-box-shadow:7px 7px 12px -9px #777;-moz-box-shadow:7px 7px 12px -9px #777;box-shadow:7px 7px 12px -9px #777;opacity:.9}.c3-tooltip tr{border:1px solid #ccc}.c3-tooltip th{background-color:#aaa;font-size:14px;padding:2px 5px;text-align:left;color:#fff}.c3-tooltip td{font-size:13px;padding:3px 6px;background-color:#fff;border-left:1px dotted #999}.c3-tooltip td>span{display:inline-block;width:10px;height:10px;margin-right:6px}.c3-tooltip td.value{text-align:right}.c3-area{stroke-width:0;opacity:.2}.c3-chart-arcs-title{dominant-baseline:middle;font-size:1.3em}.c3-chart-arcs .c3-chart-arcs-background{fill:#e0e0e0;stroke:none}.c3-chart-arcs .c3-chart-arcs-gauge-unit{fill:#000;font-size:16px}.c3-chart-arcs .c3-chart-arcs-gauge-max{fill:#777}.c3-chart-arcs .c3-chart-arcs-gauge-min{fill:#777}.c3-chart-arc .c3-gauge-value{fill:#000}.c3-chart-arc.c3-target g path{opacity:1}.c3-chart-arc.c3-target.c3-focused g path{opacity:1}"
  },
  {
    "path": "app/public/css/page.css",
    "content": "\n\n.bodyCoNETBlue {\n\tbackground: rgba(101,226,245,1);\n\tbackground: -moz-linear-gradient(left, rgba(101,226,245,1) 0%, rgba(125,175,250,1) 100%);\n\tbackground: -webkit-gradient(left top, right top, color-stop(0%, rgba(101,226,245,1)), color-stop(100%, rgba(125,175,250,1)));\n\tbackground: -webkit-linear-gradient(left, rgba(101,226,245,1) 0%, rgba(125,175,250,1) 100%);\n\tbackground: -o-linear-gradient(left, rgba(101,226,245,1) 0%, rgba(125,175,250,1) 100%);\n\tbackground: -ms-linear-gradient(left, rgba(101,226,245,1) 0%, rgba(125,175,250,1) 100%);\n\tbackground: linear-gradient(to right, rgba(101,226,245,1) 0%, rgba(125,175,250,1) 100%);\n\tfilter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#65e2f5', endColorstr='#7daffa', GradientType=1 );\n\theight: unset!important;\n}\n\n.bodyWhite {\n\tbackground: white\n}\n\n.welcome-bg {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\tz-index: 9;\n\tdisplay: -webkit-box;\n\tdisplay: -ms-flexbox;\n\tdisplay: flex;\n\t\n\t-ms-flex-pack: center;\n\t\tjustify-content: center;\n\n\t-ms-flex-align: center;\n\t\t\talign-items: center;\n  }\n\n.fade-up {\n\topacity: 0;\n\t-webkit-animation: fade-up 1s forwards cubic-bezier(0.2, 2, 0.4, 1);\n\t\t\tanimation: fade-up 1s forwards cubic-bezier(0.2, 2, 0.4, 1);\n}\n  \n.languageText {\n\twidth: 100%;\n\t-webkit-transition: opacity 0.4s ease-in-out;\n\t-moz-transition: opacity 0.4s ease-in-out;\n\t-ms-transition: opacity 0.4s ease-in-out;\n\t-o-transition: opacity 0.4s ease-in-out;\n\ttransition: opacity 0.4s ease-in-out;\n\topacity: 0.6;\n}\n#languageArea {\n\tz-index: 100;\n\twidth: 160px;\n\ttop: 15px;\n\tleft: 20px;\n\tposition: fixed;\n}\n.languageItem {\n\tcursor: pointer;\n\tcolor: white!important;\n}\n.languageText:hover {\n\ttext-shadow: 1px 1px 1px rgba(0, 0, 0, 0.4);\n\topacity: 1;\n}\n.welcome {\n\twidth: 100%;\n\theight: 100%;\n\tmargin-bottom: 10em;\n\tdisplay: -webkit-box;\n\tdisplay: -ms-flexbox;\n\tdisplay: flex;\n\t\n\t\t-ms-flex-pack: center;\n\t\t\tjustify-content: center;\n\t\n\t\t-ms-flex-align: center;\n\t\t\talign-items: center;\n\t\n\t\t-ms-flex-direction: column;\n\t\t\tflex-direction: column;\n}\n.welcome h1.fade-up {\n\tfont-weight: 300;\n\tfont-size: 40px;\n\t-webkit-animation-delay: .25s;\n\t\t\tanimation-delay: .25s;\n}\n.welcome h2.fade-up {\n\tfont-weight: 400;\n\tcolor: rgba(255, 255, 255, 0.5);\n\t-webkit-animation-delay: .5s;\n\t\t\tanimation-delay: .5s;\n}\n#agreement{\n\tbackground-color: #d3d9db;\n\twidth: 100%;\n\tposition: absolute;\n\ttransition: opacity 0.4s ease-in;\n\ttop: 0px;\n}\n#agreement .firstNodeContent {\n\tmargin: 0px auto;\n\tmargin-top: 5em;\n\tmax-width: 50em;\n\n}\n.detailSegment {\n\tmargin: 3em;\n}\n.agreementButtom {\n\tmargin: 3em;\n}\n.CoContent {\n    width: 95%;\n    position: relative;\n\t\ttransition: opacity 0.4s ease-in;\n\t\tmargin: auto;\n}\n.loginCards {\n\tmargin: 0px auto!important;\n    margin-top: 5em!important;\n    max-width: 50em;\n}\n.CoGateCards {\n\tmargin: 0px auto!important;\n    margin-top: 1em!important;\n    max-width: 45em;\n}\n.searchItems {\n\tmargin: 0px auto!important;\n    margin-top: 1em!important;\n    max-width: 40em;\n}\n.background-clolr-white {\n    background-color: transparent!important;\n}\n.displayNono {\n\tdisplay: none;\n}\n\n.iconButton {\n\tcursor: pointer;\n\t-webkit-transition: opacity 0.2s ease-in-out;\n\t-moz-transition: opacity 0.2s ease-in-out;\n\t-ms-transition: opacity 0.2s ease-in-out;\n\t-o-transition: opacity 0.2s ease-in-out;\n\ttransition: opacity 0.2s ease-in-out;\n\topacity: 0.6!important;\n}\n\n.iconButton:hover {\n\ttext-shadow: 1px 1px 1px rgba(0, 0, 0, 0.4);\n\topacity: 1!important;\n}\n\n.CoNET_info {\n\ttext-shadow: 1px 1px 1px rgba(0, 0, 0, 0.4);\n\topacity: 0.7;\n\t\n\tpadding-right: 1em;\n}\n.green {\n\t color: green!important;\n}\n.white {\n\tcolor: white;\n}\n.red {\n\tcolor: brown;\n}\n.yellow {\n\tcolor: yellow;\n}\n.grey {\n\tcolor: gray!important;\n}\n.QTGateGatewayCardHeader.active {\n\tcolor: yellowgreen!important;\n }\n .QTGateGatewayCardHeader {\n\tcolor: rgba(255,0,0,0.2)!important;\n \n }\n .plans {\n\tmargin: 20px auto;\n\twidth: 48em;\n\tzoom: 1;\n  }\n  .plans:before, .plans:after {\n\tcontent: '';\n\tdisplay: table;\n  }\n  .plans:after {\n\tclear: both;\n  }\n  .plan {\n\t\tfloat: left;\n\t\twidth: 16em;\n\t\tmargin: 10px 0;\n\t\tpadding: 20px;\n\t\ttext-align: center;\n\t\tbackground: #fafafa;\n\t\tbackground-clip: padding-box;\n\t\tborder: solid #453b5d;\n\t\tborder-width: 2px 0 2px 2px;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t\t-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);\n\t\tbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);\n  }\n\n  .plan:first-child {\n\t\tborder-top-left-radius: 7px;\n\t\tborder-bottom-left-radius: 7px;\n  }\n.shadowText {\n\ttext-shadow: 10px 10px 30px rgba(0, 0, 0, 0.4);\n}\n\n.shadowText1 {\n\ttext-shadow: 2px 2px 5px rgba(0, 0, 0, 0.4);\n}\n\n  .plan:last-child {\n\t\tborder-width: 2px;\n\t\tborder-top-right-radius: 7px;\n\t\tborder-bottom-right-radius: 7px;\n  }\n  \n  .plan-title {\n\t\tposition: relative;\n\t\tmargin: -20px -10px 20px;\n\t\tpadding: 20px;\n\t\tline-height: 1;\n\t\tfont-size: 16px;\n\t\tfont-weight: bold;\n\t\tcolor: #595f6b;\n\t\tborder-bottom: 1px dashed #d2d2d2;\n  }\n  \n  .plan-title:before {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\tbottom: -1px;\n\t\tleft: 0;\n\t\tright: 0;\n\t\theight: 1px;\n\t\tbackground-size: 3px 1px;\n\t\tbackground-image: -webkit-linear-gradient(left, white, white 33%, #d2d2d2 34%, #d2d2d2);\n\t\tbackground-image: -moz-linear-gradient(left, white, white 33%, #d2d2d2 34%, #d2d2d2);\n\t\tbackground-image: -o-linear-gradient(left, white, white 33%, #d2d2d2 34%, #d2d2d2);\n\t\tbackground-image: linear-gradient(to right, white, white 33%, #d2d2d2 34%, #d2d2d2);\n  }\n  \n  .plan-price {\n\t\tmargin: 0 auto 20px;\n\t\twidth: 90px;\n\t\theight: 90px;\n\t\tline-height: 90px;\n\t\tfont-size: 19px;\n\t\tfont-weight: bold;\n\t\tcolor: white;\n\t\tbackground: #595f6b;\n\t\tborder-radius: 45px;\n  }\n  \n  .plan-price > span {\n\t\tfont-size: 12px;\n\t\tfont-weight: normal;\n\t\tcolor: rgba(255, 255, 255, 0.9);\n  }\n  \n  .plan-features {\n\t\tmargin-bottom: 20px;\n\t\tline-height: 2;\n\t\tfont-size: 12px;\n\t\tcolor: #999;\n\t\ttext-align: center;\n  }\n.plan-tall {\n\t\tmargin: 0;\n\t\tbackground-color: white;\n\t\tborder-width: 2px;\n\t\tborder-radius: 7px;\n}\n  \n.plan-tall > .plan-title {\n\t\tfont-size: 18px;\n}\n  \n.plan-tall > .plan-price {\n\t\twidth: 100px;\n\t\theight: 100px;\n\t\tline-height: 100px;\n\t\tfont-size: 21px;\n\t\tborder-radius: 50px;\n}\n  \n.plan-tall > .plan-features {\n\tfont-size: 13px;\n}\n  \n.plan-tall > .plan-button {\n\t\tpadding: 0 16px;\n\t\tline-height: 32px;\n}\n  \n.plan-tall + .plan {\n\t\tborder-left: 0;\n}\n  \n.plan-features > li > strong {\n\t\tfont-weight: bold;\n\t\tcolor: #888;\n\t\tpadding-right: 1em;\n}\nul.plan-features {\n\t\tlist-style-type: none;\n\t\tpadding: 0px;\n}\n\t\n.AppCardTop {\n\t\tmax-width: 11em!important;\n}\n\n.AppCardImageArea {\n  background: white!important;\n}\n.AppCardImage {\n    max-width: 6em!important;\n}\n.AppListHeader {\n\ttext-shadow: 1px 1px 1px rgba(0, 0, 0, 0.4);\n}\n.hideCardImage {\n  opacity: 0.2\n}\n.usDollar {\n\tfont-weight: lighter;\n\tfont-style: italic;\n\tpadding-left: 0.5em;\n\tfont-size: smaller;\n}\n.amount {\n\tfont-size: large;\n\tfont-weight: bold;\n\tcolor: darkslategray;\n}\n.unavailable {\n\tbackground-color: rgba(0,0,0,.03)!important;\n\topacity: 0.4\n }\n\n@media only screen and ( max-width: 1144px ) {\n\t.TimelinesView {\n\t background-color: white;\n\t padding: 0em;\n\t padding-top: 4em;\n\t}\n\t#QTGateStartScreen {\n\t display: block;\n   }\n\t#QTGateStartScreen-Device {\n\t  display: none;\n\t}\n\t#TimelinesView {\n\t max-width:100%;\n\t margin: 0px auto;\n\t}\n\t.itemContent {\n\t max-width: 90%;\n\t}\n }\n @media only screen and (min-width: 992px) {\n   \n }\n \n @media screen and ( max-width: 801px ) {\n   .TimelinesView {\n\tbackground-color: white;\n\tpadding: 0em;\n\tpadding-top: 4em;\n   }\n   #QTGateStartScreen-Device {\n\t display: block;\n   }\n   #QTGateStartScreen {\n\t display: none;\n   }\n   #TimelinesView {\n\tmax-width:100%;\n\tmargin: 0px auto;\n   }\n   .itemContent {\n\tmax-width: 90%;\n   }\n }\n \n @media screen and ( min-width: 800px ) {\n   #QTGateStartScreen {\n\t display: block;\n   }\n   #QTGateStartScreen-Device {\n\t display: none;\n   }\n   .TimelinesView {\n\t background-color: #e6ecf0;\n\t padding: 4em;\n   }\n   #TimelinesView {\n\t max-width:590px;\n\t margin: 0px auto;\n   }\n   .itemContent {\n\t max-width:530px;\n   }\n }\n\n\n\n\n .flapLeft, .flapeRight {\n   position: relative;\n   cursor: pointer;\n }\n \n .flapLeft i:hover, .flapeRight i:hover {\n   background: rgba(255,255,255,0.4);\n }\n .flapLeft i, .flapeRight i {\n   color:grey;\n   position: absolute;\n   margin-top: -1em;\n }\n .tweetTrashButton {\n\tcursor: pointer;\n\t color: grey;\n }\n .tweetTrashButton:hover {\n   color: red;\n }\n .tweetPhotoButton{\n\t background: transparent!important;\n\t color: rgba(0, 0, 0, 0.2);\n\t cursor: pointer;\n\t right: 0.5em;\n\t margin-top: 2.5em;\n }\n .tweetPhotoButton:hover {\n   color: rgba(0, 0, 0, 0.6);\n \n }\n .newTweetCloseButton{\n   color: rgba(0, 0, 0, 0.2)!important;\n   cursor: pointer;\n   position: absolute;\n   top: 0.3em;\n   right: 0.3em;\n }\n .newTweetCloseButton:hover {\n color: rgba(0, 0, 0, 0.6)!important;\n \n }\n .approveButtons {\n   position: absolute;\n }\n .ui.modal {\n   top: 15em;\n   width: 600px;\n }\n #QTGateStartScreen{\n   height: 100%;\n }\n #QTGateStartScreen .VideoBox{\n   display: block;\n   width: 600px;\n }\n #QTGateStartScreen .VideoBox .iframe {\n   width: 550px;\n   height: 310px;\n   overflow: hidden;\n   border-radius: 25px;\n }\n #QTGateStartScreen-Drive{\n   height: 100%;\n }\n #QTGateStartScreen-Drive .VideoBox{\n   display: block;\n \n }\n #QTGateStartScreen-Drive .VideoBox .iframe {\n   overflow: hidden;\n   border-radius: 25px;\n }\n .AppCardTop {\n\tmax-width: 11em!important;\n }\n .AppCardImageArea {\n   background: white!important;\n }\n .AppCardImage {\n\t max-width: 6em!important;\n }\n .templateImapAccount {\n\tcolor: blue;\n }\n .closeIcon {\n\tposition: absolute;\n    top: 1em;\n    right: 1em;\n }\n\n .localIP {\n\tposition: relative;\n\tleft: 19em;\n\ttop: 7.8em;\n\tcolor: blue;\n  \n  }\n  \n  .localIPPort {\n\tposition: relative;\n\tleft: 3.9em;\n\ttop: 8.8em;\n\tcolor: blue;\n  \n  }\n  .localNetwork {\n\tposition: relative;\n\tleft: 3.9em;\n\ttop: 8.8em;\n\tcolor: blue;\n  }\n\n\n.WindowsUseInfoLocalServerIp {\n\tposition: relative;\n\tleft: 10.4em;\n\ttop: 12.5em;\n\tcolor: blue;\n  }\n  .WindowsUseInfoPort{\n\tposition: relative;\n\tleft: -1.9em;\n\ttop: 16.5em;\n\tcolor: blue;\n  }\n  .firefoxUseLocalIp{\n\tposition: relative;\n\tleft: 4.5em;\n\ttop: 32.2em;\n\tcolor: blue;\n  }\n  .firefoxUseLocalPort{\n\tposition: relative;\n\tleft: -10.6em;\n\ttop: 33.3em;\n\tcolor: blue;\n  }\n  \n  \n  .iOSUseInfoLocalServerIp{\n\tposition: relative;\n\tleft: 2em;\n\ttop: 12.6em;\n\tcolor: blue;\n  }\n  .iOSUseInfoPort{\n\tposition: relative;\n\tleft: -13.1em;\n\ttop: 13.7em;\n\tcolor: blue;\n  }\n  .androidUseInfoLocalServerIp{\n\tposition: relative;\n\tleft: 6em;\n\ttop: 7.7em;\n\tcolor: blue;\n  }\n  .androidUseInfoPort{\n\tposition: relative;\n\tleft: -9.1em;\n\ttop: 8.8em;;\n\tcolor: blue;\n  }\n  .videoBackground{\n\t\tposition: absolute;\n  top: 50%; \n  left: 50%;\n  -webkit-transform: translateX(-50%) translateY(-50%);\n  transform: translateX(-50%) translateY(-50%);\n  min-width: 100%; \n  min-height: 100%; \n  width: auto; \n  height: auto;\n  z-index: -1000; \n  overflow: hidden;\n\t}\n\t.startupView {\n\t\tposition: fixed; \n\t\ttop: 0; \n\t\twidth: 100%; \n\t\theight: 100%; \n\t\tz-index: -1;\n\t}\n\t.loading {\n\t\tz-index: 9999;\n\t}\n\n\n\t.loaderCoNET {\n\t\toverflow: hidden;\n\t\tpadding: 2em;\n\t\tposition: relative;\n\t}\n\t\n\t.loaderCoNET-div {\n\t\twidth: 20px;\n\t\theight: 20px;\n\t\tposition: absolute;\n\t\tbackground-color: #ccc;\n\t\ttop: 45%;\n\t\tborder-radius: 50%;\n\t}\n\t\n\t.loaderCoNET-div:nth-child(1) {\n\t\tbackground-color: rgba(255, 84, 95, 0.274);\n\t\t-webkit-animation: move 2s infinite cubic-bezier(0.2, 0.64, 0.81, 0.23);\n\t\t\t\t\t\tanimation: move 2s infinite cubic-bezier(0.2, 0.64, 0.81, 0.23);\n\t}\n\t\n\t.loaderCoNET-div:nth-child(2) {\n\t\tbackground-color: rgba(255, 157, 132, 0.315);\n\t\t-webkit-animation: move 2s 150ms infinite cubic-bezier(0.2, 0.64, 0.81, 0.23);\n\t\t\t\t\t\tanimation: move 2s 150ms infinite cubic-bezier(0.2, 0.64, 0.81, 0.23);\n\t}\n\t\n\t.loaderCoNET-div:nth-child(3) {\n\t\tbackground-color: rgba(240, 231, 151, 0.356);\n\t\t-webkit-animation: move 2s 300ms infinite cubic-bezier(0.2, 0.64, 0.81, 0.23);\n\t\t\t\t\t\tanimation: move 2s 300ms infinite cubic-bezier(0.2, 0.64, 0.81, 0.23);\n\t}\n\t\n\t.loaderCoNET-div:nth-child(4) {\n\t\tbackground-color: rgba(117, 176, 138, 0.377);\n\t\t-webkit-animation: move 2s 450ms infinite cubic-bezier(0.2, 0.64, 0.81, 0.23);\n\t\t\t\t\t\tanimation: move 2s 450ms infinite cubic-bezier(0.2, 0.64, 0.81, 0.23);\n\t}\n\t\n\t@-webkit-keyframes move {\n\t\t0% {\n\t\t\tleft: 0%;\n\t\t}\n\t\t100% {\n\t\t\tleft: 90%;\n\t\t}\n\t}\n\t\n\t@keyframes move {\n\t\t0% {\n\t\t\tleft: 0%;\n\t\t}\n\t\t100% {\n\t\t\tleft: 90%;\n\t\t}\n\t}\n\n\tplay-btn {\n\t\twidth: 5em;\n\t\theight: 5em;\n\t\tbackground: radial-gradient( rgba(140, 0, 255, 0.87) 60%, rgba(140, 0, 255, 0.87) 62%);\n\t\tborder-radius: 50%;\n\t\tposition: relative;\n\t\tdisplay: block;\n\t\tmargin: 100px auto;\n\t\tbox-shadow: 0px 0px 25px 3px rgba(140, 0, 255, 0.87);\n\t}\n\t\n\t/* triangle */\n\t.play-btn::after {\n\t\tcontent: \"\";\n\t\tposition: absolute;\n\t\tleft: 50%;\n\t\ttop: 50%;\n\t\t-webkit-transform: translateX(-40%) translateY(-50%);\n\t\ttransform: translateX(-40%) translateY(-50%);\n\t\ttransform-origin: center center;\n\t\twidth: 0;\n\t\theight: 0;\n\t\tborder-top: 15px solid transparent;\n\t\tborder-bottom: 15px solid transparent;\n\t\tborder-left: 25px solid rgba(227, 196, 252, 0.616);\n\t\tz-index: 100;\n\t\t-webkit-transition: all 400ms cubic-bezier(0.55, 0.055, 0.675, 0.19);\n\t\ttransition: all 400ms cubic-bezier(0.55, 0.055, 0.675, 0.19);\n\t}\n\t\n\t/* pulse wave */\n\t.play-btn:before {\n\t\tcontent: \"\";\n\t\tposition: absolute;\n\t\twidth: 150%;\n\t\theight: 150%;\n\t\t-webkit-animation-delay: 0s;\n\t\tanimation-delay: 0s;\n\t\t-webkit-animation: pulsate1 2s;\n\t\tanimation: pulsate1 2s;\n\t\t-webkit-animation-direction: forwards;\n\t\tanimation-direction: forwards;\n\t\t-webkit-animation-iteration-count: infinite;\n\t\tanimation-iteration-count: infinite;\n\t\t-webkit-animation-timing-function: steps;\n\t\tanimation-timing-function: steps;\n\t\topacity: 1;\n\t\tborder-radius: 50%;\n\t\tborder: 5px solid rgba(216, 119, 211, 0.75);\n\t\ttop: -30%;\n\t\tleft: -30%;\n\t\tbackground: rgba(216, 119, 211, 0.75);\n\t}\n\t\n\t@-webkit-keyframes pulsate1 {\n\t\t0% {\n\t\t\t-webkit-transform: scale(0.6);\n\t\t\ttransform: scale(0.6);\n\t\t\topacity: 1;\n\t\t\tbox-shadow: inset 0px 0px 25px 3px rgba(140, 0, 255, 0.87), 0px 0px 25px 10px rgba(140, 0, 255, 0.87);\n\t\t}\n\t\t100% {\n\t\t\t-webkit-transform: scale(1);\n\t\t\ttransform: scale(1);\n\t\t\topacity: 0;\n\t\t\tbox-shadow: none;\n\t\n\t\t}\n\t}\n\t\n\t@keyframes pulsate1 {\n\t\t0% {\n\t\t\t-webkit-transform: scale(0.6);\n\t\t\ttransform: scale(0.6);\n\t\t\topacity: 1;\n\t\t\tbox-shadow: inset 0px 0px 25px 3px rgba(140, 0, 255, 0.87), 0px 0px 25px 10px rgba(140, 0, 255, 0.87);\n\t\t}\n\t\t100% {\n\t\t\t-webkit-transform: scale(1, 1);\n\t\t\ttransform: scale(1);\n\t\t\topacity: 0;\n\t\t\tbox-shadow: none;\n\t\n\t\t}\n\t}\n.coSearchBackGroumd {\n\tbackground: #B4E4ED!important;\n}\n\n@keyframes BlurAnimation {\n\tto { filter: blur(3px);}\n\t\n}\n\n@keyframes coSearchInputAnimation {\n\tto { background: white ;}\n\tto { box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.2);}\n}\n\n.animationSearchInput {\n\t-webkit-animation-name: coSearchInputAnimation;\n\t-webkit-animation-duration: 0.5s;\n\tanimation-name: coSearchInputAnimation;\n\tanimation-duration: 0.5s;\n\tanimation-timing-function: ease-in;\n\tanimation-fill-mode: forwards;\n}\t\n\n.animationBlur {\n\t-webkit-animation-name: BlurAnimation;\n\t-webkit-animation-duration: 0.5s;\n\tanimation-name: BlurAnimation;\n\tanimation-duration: 0.5s;\n\tanimation-timing-function: ease-in;\n\tanimation-fill-mode: forwards;\n}\n\n\n\n.backgroundTransparent {\n  background: rgba(255,255,255,0.01)!important;\n}\n\n\n#coSearchForm {\n\tposition: absolute;\n\tmargin-top: -30%;\n\twidth: 100%;\n\tpadding: 2em;\n}\n#coSearchForm input::-webkit-input-placeholder {\n\t\tcolor: rgba(0,0,0,0.3)\n}\n#coSearchForm input:-moz-placeholder {\n\tcolor: rgba(0,0,0,0.3)\n}\n#coSearchForm input::-moz-placeholder  {\n\tcolor: rgba(0,0,0,0.3)\n}\n#coSearchForm input:-ms-input-placeholder {\n\tcolor: rgba(0,0,0,0.3)\n}\n#itemList{\n\tposition: absolute;\n\tmargin-top: -25%;\n\twidth: 90%;\n\tpadding: 2em;\n}\n\n#coTranslateForm {\n\tposition: absolute;\n\tmargin-top: -10%;\n\twidth: 90%;\n\tpadding: 2em;\n}\n.space {\n\tmargin: 1em;\n}\n\n.ui.input.error>input {\n\tbackground-color: #fff6f6!important;\n\tborder-color: #e0b4b4!important;\n\tcolor: #9f3a38!important;\n\n}\n.ui.input.error>input::-webkit-input-placeholder\n{\n\tcolor:#e7bdbc!important;\n}\n.ui.input.error>input:focus::-moz-placeholder\n{\n\tcolor:#da9796!important;\n}\n.ui.input.error>input:-ms-input-placeholder\n{\n\tcolor:#e7bdbc!important\n}\n\n\n.loadingGetResponse::after {\n\tborder-color: #ab9420d9 transparent transparent!important;\n}\n\n.loadingGetResponse {\n\tcolor: #ab9420d9!important;\n}\n.conetResponse {\n\tcolor: #36c576d9!important;\n}\n\n.conetResponse::after {\n\tborder-color: #36c576d9 transparent transparent!important;\n}\n\n.buttonUnActive {\n\tbackground: #e0e1e288 none!important;\n}\n\n@keyframes svg_Background {\n\tto { filter: blur(3px);}\n\tto { background: black ;}\n}\n\n.svgBackground_Animation {\n\t-webkit-animation-name: svg_Background;\n\t-webkit-animation-duration: 0.5s;\n\tanimation-name: svg_Background;\n\tanimation-duration: 0.5s;\n\tanimation-timing-function: ease-in;\n\tanimation-fill-mode: forwards;\n}\n.terminalText { \n\tposition: relative;\n\tdisplay: inline-block;\n\tmin-width: 360px;\n  }\n  \n  .terminalText::after {\n\tcontent: \"\";\n\tposition: absolute;\n\t/* Remove display: inline-block if not required to be on the same line as text etc */\n\tdisplay: inline-block;\n\tbackground-color:grey;\n\ttop: 14px;\n\tmargin-left: 2px;\n\twidth: 10px;\n\t/* Set height to the line height of .text */\n\theight: 2px;\n\t/* \n\tAnimation paramaters:\n\tblink = animation-name, \n\t1s = animation-duration, \n\tstep-end = animation-timing-function,\n\tinfinite = animation-iteration-count\n\t*/\n\t-webkit-animation: blink 1s step-end infinite;\n\tanimation: blink 1s step-end infinite;\n  }\n  \n  @-webkit-keyframes blink {\n\t0% { opacity: 1.0; }\n\t50% { opacity: 0.0; }\n\t100% { opacity: 1.0; }\n  }\n  \n  @keyframes blink {\n\t0% { opacity: 1.0; }\n\t50% { opacity: 0.0; }\n\t100% { opacity: 1.0; }\n  }"
  },
  {
    "path": "app/public/scripts/CanadaSvg.js",
    "content": "/* Day */\nvar dayGroup = document.getElementById(\"DayGroup\");\n/* Canoe */\nvar canoe = document.getElementsByClassName(\"canoe\");\nvar canoeReflection = document.getElementsByClassName(\"canoeReflection\");\n/* Island */\nvar treesPink = document.getElementsByClassName(\"treesPink\");\nvar treesOrange = document.getElementsByClassName(\"treesOrange\");\nvar CoralTriangle1 = document.getElementsByClassName(\"CoralTriangle1\");\nvar CoralTriangle2 = document.getElementsByClassName(\"CoralTriangle2\");\nvar CoralTriangle3 = document.getElementsByClassName(\"CoralTriangle3\");\n/*Sea */\nvar waveRight = document.getElementsByClassName(\"waveRight\");\nvar waveLeft = document.getElementsByClassName(\"waveLeft\");\n/* Sky */\nvar blueCloudLeft = document.getElementsByClassName(\"blueCloudLeft\");\nvar blueCloudRight = document.getElementsByClassName(\"blueCloudRight\");\nvar pinkCloud = document.getElementsByClassName(\"pinkCloud\");\nvar sunRayLeft = document.getElementsByClassName(\"sunRayLeft\");\nvar sunRayRight = document.getElementsByClassName(\"sunRayRight\");\n/*Rflection*/\nvar treesPinkR = document.getElementsByClassName(\"treesPinkR\");\nvar treesOrangeR = document.getElementsByClassName(\"treesOrangeR\");\nvar RCoralTriangle1 = document.getElementsByClassName(\"RCoralTriangle1\");\nvar RCoralTriangle2 = document.getElementsByClassName(\"RCoralTriangle2\");\nvar RCoralTriangle3 = document.getElementsByClassName(\"RCoralTriangle3\");\n/* --------------------------- */\n/* Animation */\n//canoe\nvar tlCanoe = new TimelineMax({\nrepeat:-1,\nyoyo:true,\nease: \"easeInOut\"\n});\ntlCanoe.fromTo(canoe, 1.5, {\ny:0\n}, {\ny:4\n})\ntlCanoe.fromTo(canoeReflection, 1.5, {\ny:0\n}, {\ny:-4\n}, \"-=1.5\")\n//Sea\nvar tlwaveLeft = new TimelineMax({\nrepeat:-1,\nyoyo:true,\nease: \"easeInOut\"\n});\ntlwaveLeft.fromTo(waveLeft, 5, {\nx:0\n}, {\nx:35\n})\ntlwaveLeft.fromTo(waveRight, 5, {\nx:0\n}, {\nx:-35\n}, \"-=5\")\n//tree\nvar tlswingingTree = new TimelineMax({\nrepeat:-1,\nyoyo:true,\nease: \"easeInOut\"\n});\ntlswingingTree.staggerFromTo(treesPink, 2, {\ntransformOrigin:\"50% 0%\",\nrotation:\"5deg\",\n}, {\nrotation:\"-5deg\",\n}, .2);\nvar ReflectswingingTree = new TimelineMax({\nrepeat:-1,\nyoyo:true,\n});\nReflectswingingTree.staggerFromTo(treesPinkR, 2, {\ntransformOrigin:\"50% 0%\",\nrotation:\"-5deg\",\n}, {\nrotation:\"5deg\",\n}, .2);\nvar tlOrangeTrees = new TimelineMax({\nrepeat:-1,\nyoyo:true,\nease: \"easeInOut\"\n});\ntlOrangeTrees.fromTo(treesOrange, 2, {\ntransformOrigin:\"50% 100%\",\nrotation:\"1deg\",\n}, {\nrotation:\"-1deg\",\n}, .2);\nvar ReflectOrangeTrees = new TimelineMax({\nrepeat:-1,\nyoyo:true});\nReflectOrangeTrees.fromTo(treesOrangeR, 2, {\ntransformOrigin:\"50% 0%\",\nrotation:\"-1deg\",\n}, {\nrotation:\"1deg\",\n}, .2);\nvar tlCoralTrees = new TimelineMax({repeat:-1});\ntlCoralTrees.set([CoralTriangle1, CoralTriangle3], {\ntransformOrigin: \"50% 20%\",\nrotation: \"0deg\",\nrepeatDelay:2\n})\ntlCoralTrees.to([CoralTriangle1, CoralTriangle3], 1, {\nrotation: \"6deg\",\nease: \"easeInOut\"\n})\ntlCoralTrees.to([CoralTriangle1, CoralTriangle3], 1, {\nrotation: \"-6deg\",\nease: \"easeInOut\"\n})\ntlCoralTrees.to([CoralTriangle1, CoralTriangle3], .5, {\nrotation: \"3deg\",\nease: \"easeInOut\"\n})\ntlCoralTrees.to([CoralTriangle1, CoralTriangle3], .5, {\nrotation: \"-3deg\",\nease: \"easeInOut\"\n})\ntlCoralTrees.to([CoralTriangle1, CoralTriangle3], .4, {\nrotation: \"2.5deg\",\nease: \"easeInOut\"\n})\ntlCoralTrees.to([CoralTriangle1, CoralTriangle3], .4, {\nrotation: \"-2.5deg\",\nease: \"easeInOut\"\n})\ntlCoralTrees.to([CoralTriangle1, CoralTriangle3], .4, {\nrotation: \"0deg\",\nease: \"easeInOut\"\n})\nvar tlCoralTree2 = new TimelineMax({repeat:-1});\ntlCoralTree2.set(CoralTriangle2, {\ntransformOrigin: \"50% 20%\",\nrotation: \"0deg\",\ndelay:.5,\nrepeatDelay:2.2\n})\ntlCoralTree2.to(CoralTriangle2, .85, {\nrotation: \"6deg\",\nease: \"easeInOut\"\n})\ntlCoralTree2.to(CoralTriangle2, .85, {\nrotation: \"-6deg\",\nease: \"easeInOut\"\n})\ntlCoralTree2.to(CoralTriangle2, .5, {\nrotation: \"3deg\",\nease: \"easeInOut\"\n})\ntlCoralTree2.to(CoralTriangle2, .5, {\nrotation: \"-3deg\",\nease: \"easeInOut\"\n})\ntlCoralTree2.to(CoralTriangle2, .4, {\nrotation: \"2.5deg\",\nease: \"easeInOut\"\n})\ntlCoralTree2.to(CoralTriangle2, .4, {\nrotation: \"-2.5deg\",\nease: \"easeInOut\"\n})\ntlCoralTree2.to(CoralTriangle2, .4, {\nrotation: \"0deg\",\nease: \"easeInOut\"\n})\n//Coral Tirangles Reflection\nvar ReflectCoralTrees = new TimelineMax({repeat:-1});\nReflectCoralTrees.set([RCoralTriangle1, RCoralTriangle3], {\ntransformOrigin: \"50% 80%\",\nrotation: \"0deg\",\nrepeatDelay:2\n})\nReflectCoralTrees.to([RCoralTriangle1, RCoralTriangle3], 1, {\nrotation: \"-6deg\",\nease: \"easeInOut\"\n})\nReflectCoralTrees.to([RCoralTriangle1, RCoralTriangle3], 1, {\nrotation: \"6deg\",\nease: \"easeInOut\"\n})\nReflectCoralTrees.to([RCoralTriangle1, RCoralTriangle3], .5, {\nrotation: \"-3deg\",\nease: \"easeInOut\"\n})\nReflectCoralTrees.to([RCoralTriangle1, RCoralTriangle3], .5, {\nrotation: \"3deg\",\nease: \"easeInOut\"\n})\nReflectCoralTrees.to([RCoralTriangle1, RCoralTriangle3], .4, {\nrotation: \"-2.5deg\",\nease: \"easeInOut\"\n})\nReflectCoralTrees.to([RCoralTriangle1, RCoralTriangle3], .4, {\nrotation: \"2.5deg\",\nease: \"easeInOut\"\n})\nReflectCoralTrees.to([RCoralTriangle1, RCoralTriangle3], .4, {\nrotation: \"0deg\",\nease: \"easeInOut\"\n})\nvar ReflectCoralTree2 = new TimelineMax({repeat:-1});\nReflectCoralTree2.set(CoralTriangle2, {\ntransformOrigin: \"50% 80%\",\nrotation: \"0deg\",\ndelay:.5,\nrepeatDelay:2.2\n})\nReflectCoralTree2.to(RCoralTriangle2, .85, {\nrotation: \"-6deg\",\nease: \"easeInOut\"\n})\nReflectCoralTree2.to(RCoralTriangle2, .85, {\nrotation: \"6deg\",\nease: \"easeInOut\"\n})\nReflectCoralTree2.to(RCoralTriangle2, .5, {\nrotation: \"-3deg\",\nease: \"easeInOut\"\n})\nReflectCoralTree2.to(RCoralTriangle2, .5, {\nrotation: \"3deg\",\nease: \"easeInOut\"\n})\nReflectCoralTree2.to(RCoralTriangle2, .4, {\nrotation: \"-2.5deg\",\nease: \"easeInOut\"\n})\nReflectCoralTree2.to(RCoralTriangle2, .4, {\nrotation: \"2.5deg\",\nease: \"easeInOut\"\n})\nReflectCoralTree2.to(RCoralTriangle2, .4, {\nrotation: \"0deg\",\nease: \"easeInOut\"\n})\n//sky\nvar tlblueCloud = new TimelineMax({\nrepeat:-1,\nyoyo:true,\n});\ntlblueCloud.fromTo(blueCloudLeft, 5.5, {\nx:0\n}, {\nx:55,\nease: \"linear\"\n})\ntlblueCloud.fromTo(blueCloudRight, 5.5, {\nx:0\n}, {\nx:-55,\nease: \"linear\"\n}, \"-=5\")\nvar tlpinkCloud = new TimelineMax({\nrepeat:-1,\nyoyo:true,\nease: \"easeInOut\"\n});\ntlpinkCloud.staggerFromTo(pinkCloud, 20, {\nx:0\n}, {\nx:300\n}, 1.5)\nvar tlsunRays = new TimelineMax({\nrepeat:-1,\nyoyo:true,\n});\ntlsunRays.fromTo(sunRayLeft, 4.5, {\nx:0\n}, {\nx:25,\nease:\"linear\"\n})\ntlsunRays.fromTo(sunRayRight, 4.5, {\nx:0\n}, {\nx:-25,\nease:\"linear\"\n}, \"-=5\");"
  },
  {
    "path": "app/public/scripts/Cleave.js",
    "content": "/*!\n * cleave.js - 1.3.8\n * https://github.com/nosir/cleave.js\n * Apache License Version 2.0\n *\n * Copyright (C) 2012-2018 Max Huang https://github.com/nosir/\n */\n!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.Cleave=t():e.Cleave=t()}(this,function(){return function(e){function t(n){if(r[n])return r[n].exports;var i=r[n]={exports:{},id:n,loaded:!1};return e[n].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var r={};return t.m=e,t.c=r,t.p=\"\",t(0)}([function(e,t,r){(function(t){\"use strict\";var n=function(e,t){var r=this;if(\"string\"==typeof e?r.element=document.querySelector(e):r.element=\"undefined\"!=typeof e.length&&e.length>0?e[0]:e,!r.element)throw new Error(\"[cleave.js] Please check the element\");t.initValue=r.element.value,r.properties=n.DefaultProperties.assign({},t),r.init()};n.prototype={init:function(){var e=this,t=e.properties;return t.numeral||t.phone||t.creditCard||t.date||0!==t.blocksLength||t.prefix?(t.maxLength=n.Util.getMaxLength(t.blocks),e.isAndroid=n.Util.isAndroid(),e.lastInputValue=\"\",e.onChangeListener=e.onChange.bind(e),e.onKeyDownListener=e.onKeyDown.bind(e),e.onFocusListener=e.onFocus.bind(e),e.onCutListener=e.onCut.bind(e),e.onCopyListener=e.onCopy.bind(e),e.element.addEventListener(\"input\",e.onChangeListener),e.element.addEventListener(\"keydown\",e.onKeyDownListener),e.element.addEventListener(\"focus\",e.onFocusListener),e.element.addEventListener(\"cut\",e.onCutListener),e.element.addEventListener(\"copy\",e.onCopyListener),e.initPhoneFormatter(),e.initDateFormatter(),e.initNumeralFormatter(),void((t.initValue||t.prefix&&!t.noImmediatePrefix)&&e.onInput(t.initValue))):void e.onInput(t.initValue)},initNumeralFormatter:function(){var e=this,t=e.properties;t.numeral&&(t.numeralFormatter=new n.NumeralFormatter(t.numeralDecimalMark,t.numeralIntegerScale,t.numeralDecimalScale,t.numeralThousandsGroupStyle,t.numeralPositiveOnly,t.stripLeadingZeroes,t.delimiter))},initDateFormatter:function(){var e=this,t=e.properties;t.date&&(t.dateFormatter=new n.DateFormatter(t.datePattern),t.blocks=t.dateFormatter.getBlocks(),t.blocksLength=t.blocks.length,t.maxLength=n.Util.getMaxLength(t.blocks))},initPhoneFormatter:function(){var e=this,t=e.properties;if(t.phone)try{t.phoneFormatter=new n.PhoneFormatter(new t.root.Cleave.AsYouTypeFormatter(t.phoneRegionCode),t.delimiter)}catch(r){throw new Error(\"[cleave.js] Please include phone-type-formatter.{country}.js lib\")}},onKeyDown:function(e){var t=this,r=t.properties,i=e.which||e.keyCode,a=n.Util,o=t.element.value;return a.isAndroidBackspaceKeydown(t.lastInputValue,o)&&(i=8),t.lastInputValue=o,8===i&&a.isDelimiter(o.slice(-r.delimiterLength),r.delimiter,r.delimiters)?void(r.backspace=!0):void(r.backspace=!1)},onChange:function(){this.onInput(this.element.value)},onFocus:function(){var e=this,t=e.properties;n.Util.fixPrefixCursor(e.element,t.prefix,t.delimiter,t.delimiters)},onCut:function(e){this.copyClipboardData(e),this.onInput(\"\")},onCopy:function(e){this.copyClipboardData(e)},copyClipboardData:function(e){var t=this,r=t.properties,i=n.Util,a=t.element.value,o=\"\";o=r.copyDelimiter?a:i.stripDelimiters(a,r.delimiter,r.delimiters);try{e.clipboardData?e.clipboardData.setData(\"Text\",o):window.clipboardData.setData(\"Text\",o),e.preventDefault()}catch(l){}},onInput:function(e){var t=this,r=t.properties,i=n.Util;return r.numeral||!r.backspace||i.isDelimiter(e.slice(-r.delimiterLength),r.delimiter,r.delimiters)||(e=i.headStr(e,e.length-r.delimiterLength)),r.phone?(!r.prefix||r.noImmediatePrefix&&!e.length?r.result=r.phoneFormatter.format(e):r.result=r.prefix+r.phoneFormatter.format(e).slice(r.prefix.length),void t.updateValueState()):r.numeral?(!r.prefix||r.noImmediatePrefix&&!e.length?r.result=r.numeralFormatter.format(e):r.result=r.prefix+r.numeralFormatter.format(e),void t.updateValueState()):(r.date&&(e=r.dateFormatter.getValidatedDate(e)),e=i.stripDelimiters(e,r.delimiter,r.delimiters),e=i.getPrefixStrippedValue(e,r.prefix,r.prefixLength,r.result),e=r.numericOnly?i.strip(e,/[^\\d]/g):e,e=r.uppercase?e.toUpperCase():e,e=r.lowercase?e.toLowerCase():e,!r.prefix||r.noImmediatePrefix&&!e.length||(e=r.prefix+e,0!==r.blocksLength)?(r.creditCard&&t.updateCreditCardPropsByValue(e),e=i.headStr(e,r.maxLength),r.result=i.getFormattedValue(e,r.blocks,r.blocksLength,r.delimiter,r.delimiters,r.delimiterLazyShow),void t.updateValueState()):(r.result=e,void t.updateValueState()))},updateCreditCardPropsByValue:function(e){var t,r=this,i=r.properties,a=n.Util;a.headStr(i.result,4)!==a.headStr(e,4)&&(t=n.CreditCardDetector.getInfo(e,i.creditCardStrictMode),i.blocks=t.blocks,i.blocksLength=i.blocks.length,i.maxLength=a.getMaxLength(i.blocks),i.creditCardType!==t.type&&(i.creditCardType=t.type,i.onCreditCardTypeChanged.call(r,i.creditCardType)))},updateValueState:function(){var e=this,t=n.Util,r=e.properties;if(e.element){var i=e.element.selectionEnd,a=e.element.value,o=r.result;if(i=t.getNextCursorPosition(i,a,o,r.delimiter,r.delimiters),e.isAndroid)return void window.setTimeout(function(){e.element.value=o,t.setSelection(e.element,i,r.document,!1),e.callOnValueChanged()},1);e.element.value=o,t.setSelection(e.element,i,r.document,!1),e.callOnValueChanged()}},callOnValueChanged:function(){var e=this,t=e.properties;t.onValueChanged.call(e,{target:{value:t.result,rawValue:e.getRawValue()}})},setPhoneRegionCode:function(e){var t=this,r=t.properties;r.phoneRegionCode=e,t.initPhoneFormatter(),t.onChange()},setRawValue:function(e){var t=this,r=t.properties;e=void 0!==e&&null!==e?e.toString():\"\",r.numeral&&(e=e.replace(\".\",r.numeralDecimalMark)),r.backspace=!1,t.element.value=e,t.onInput(e)},getRawValue:function(){var e=this,t=e.properties,r=n.Util,i=e.element.value;return t.rawValueTrimPrefix&&(i=r.getPrefixStrippedValue(i,t.prefix,t.prefixLength,t.result)),i=t.numeral?t.numeralFormatter.getRawValue(i):r.stripDelimiters(i,t.delimiter,t.delimiters)},getISOFormatDate:function(){var e=this,t=e.properties;return t.date?t.dateFormatter.getISOFormatDate():\"\"},getFormattedValue:function(){return this.element.value},destroy:function(){var e=this;e.element.removeEventListener(\"input\",e.onChangeListener),e.element.removeEventListener(\"keydown\",e.onKeyDownListener),e.element.removeEventListener(\"focus\",e.onFocusListener),e.element.removeEventListener(\"cut\",e.onCutListener),e.element.removeEventListener(\"copy\",e.onCopyListener)},toString:function(){return\"[Cleave Object]\"}},n.NumeralFormatter=r(1),n.DateFormatter=r(2),n.PhoneFormatter=r(3),n.CreditCardDetector=r(4),n.Util=r(5),n.DefaultProperties=r(6),(\"object\"==typeof t&&t?t:window).Cleave=n,e.exports=n}).call(t,function(){return this}())},function(e,t){\"use strict\";var r=function(e,t,n,i,a,o,l){var s=this;s.numeralDecimalMark=e||\".\",s.numeralIntegerScale=t>0?t:0,s.numeralDecimalScale=n>=0?n:2,s.numeralThousandsGroupStyle=i||r.groupStyle.thousand,s.numeralPositiveOnly=!!a,s.stripLeadingZeroes=o!==!1,s.delimiter=l||\"\"===l?l:\",\",s.delimiterRE=l?new RegExp(\"\\\\\"+l,\"g\"):\"\"};r.groupStyle={thousand:\"thousand\",lakh:\"lakh\",wan:\"wan\",none:\"none\"},r.prototype={getRawValue:function(e){return e.replace(this.delimiterRE,\"\").replace(this.numeralDecimalMark,\".\")},format:function(e){var t,n,i=this,a=\"\";switch(e=e.replace(/[A-Za-z]/g,\"\").replace(i.numeralDecimalMark,\"M\").replace(/[^\\dM-]/g,\"\").replace(/^\\-/,\"N\").replace(/\\-/g,\"\").replace(\"N\",i.numeralPositiveOnly?\"\":\"-\").replace(\"M\",i.numeralDecimalMark),i.stripLeadingZeroes&&(e=e.replace(/^(-)?0+(?=\\d)/,\"$1\")),n=e,e.indexOf(i.numeralDecimalMark)>=0&&(t=e.split(i.numeralDecimalMark),n=t[0],a=i.numeralDecimalMark+t[1].slice(0,i.numeralDecimalScale)),i.numeralIntegerScale>0&&(n=n.slice(0,i.numeralIntegerScale+(\"-\"===e.slice(0,1)?1:0))),i.numeralThousandsGroupStyle){case r.groupStyle.lakh:n=n.replace(/(\\d)(?=(\\d\\d)+\\d$)/g,\"$1\"+i.delimiter);break;case r.groupStyle.wan:n=n.replace(/(\\d)(?=(\\d{4})+$)/g,\"$1\"+i.delimiter);break;case r.groupStyle.thousand:n=n.replace(/(\\d)(?=(\\d{3})+$)/g,\"$1\"+i.delimiter)}return n.toString()+(i.numeralDecimalScale>0?a.toString():\"\")}},e.exports=r},function(e,t){\"use strict\";var r=function(e){var t=this;t.date=[],t.blocks=[],t.datePattern=e,t.initBlocks()};r.prototype={initBlocks:function(){var e=this;e.datePattern.forEach(function(t){\"Y\"===t?e.blocks.push(4):e.blocks.push(2)})},getISOFormatDate:function(){var e=this,t=e.date;return t[2]?t[2]+\"-\"+e.addLeadingZero(t[1])+\"-\"+e.addLeadingZero(t[0]):\"\"},getBlocks:function(){return this.blocks},getValidatedDate:function(e){var t=this,r=\"\";return e=e.replace(/[^\\d]/g,\"\"),t.blocks.forEach(function(n,i){if(e.length>0){var a=e.slice(0,n),o=a.slice(0,1),l=e.slice(n);switch(t.datePattern[i]){case\"d\":\"00\"===a?a=\"01\":parseInt(o,10)>3?a=\"0\"+o:parseInt(a,10)>31&&(a=\"31\");break;case\"m\":\"00\"===a?a=\"01\":parseInt(o,10)>1?a=\"0\"+o:parseInt(a,10)>12&&(a=\"12\")}r+=a,e=l}}),this.getFixedDateString(r)},getFixedDateString:function(e){var t,r,n,i=this,a=i.datePattern,o=[],l=0,s=0,u=0,c=0,d=0,m=0,p=!1;return 4===e.length&&\"y\"!==a[0].toLowerCase()&&\"y\"!==a[1].toLowerCase()&&(c=\"d\"===a[0]?0:2,d=2-c,t=parseInt(e.slice(c,c+2),10),r=parseInt(e.slice(d,d+2),10),o=this.getFixedDate(t,r,0)),8===e.length&&(a.forEach(function(e,t){switch(e){case\"d\":l=t;break;case\"m\":s=t;break;default:u=t}}),m=2*u,c=l<=u?2*l:2*l+2,d=s<=u?2*s:2*s+2,t=parseInt(e.slice(c,c+2),10),r=parseInt(e.slice(d,d+2),10),n=parseInt(e.slice(m,m+4),10),p=4===e.slice(m,m+4).length,o=this.getFixedDate(t,r,n)),i.date=o,0===o.length?e:a.reduce(function(e,t){switch(t){case\"d\":return e+i.addLeadingZero(o[0]);case\"m\":return e+i.addLeadingZero(o[1]);default:return e+(p?i.addLeadingZeroForYear(o[2]):\"\")}},\"\")},getFixedDate:function(e,t,r){return e=Math.min(e,31),t=Math.min(t,12),r=parseInt(r||0,10),(t<7&&t%2===0||t>8&&t%2===1)&&(e=Math.min(e,2===t?this.isLeapYear(r)?29:28:30)),[e,t,r]},isLeapYear:function(e){return e%4===0&&e%100!==0||e%400===0},addLeadingZero:function(e){return(e<10?\"0\":\"\")+e},addLeadingZeroForYear:function(e){return(e<10?\"000\":e<100?\"00\":e<1e3?\"0\":\"\")+e}},e.exports=r},function(e,t){\"use strict\";var r=function(e,t){var r=this;r.delimiter=t||\"\"===t?t:\" \",r.delimiterRE=t?new RegExp(\"\\\\\"+t,\"g\"):\"\",r.formatter=e};r.prototype={setFormatter:function(e){this.formatter=e},format:function(e){var t=this;t.formatter.clear(),e=e.replace(/[^\\d+]/g,\"\"),e=e.replace(t.delimiterRE,\"\");for(var r,n=\"\",i=!1,a=0,o=e.length;a<o;a++)r=t.formatter.inputDigit(e.charAt(a)),/[\\s()-]/g.test(r)?(n=r,i=!0):i||(n=r);return n=n.replace(/[()]/g,\"\"),n=n.replace(/[\\s-]/g,t.delimiter)}},e.exports=r},function(e,t){\"use strict\";var r={blocks:{uatp:[4,5,6],amex:[4,6,5],diners:[4,6,4],discover:[4,4,4,4],mastercard:[4,4,4,4],dankort:[4,4,4,4],instapayment:[4,4,4,4],jcb15:[4,6,5],jcb:[4,4,4,4],maestro:[4,4,4,4],visa:[4,4,4,4],mir:[4,4,4,4],unionPay:[4,4,4,4],general:[4,4,4,4],generalStrict:[4,4,4,7]},re:{uatp:/^(?!1800)1\\d{0,14}/,amex:/^3[47]\\d{0,13}/,discover:/^(?:6011|65\\d{0,2}|64[4-9]\\d?)\\d{0,12}/,diners:/^3(?:0([0-5]|9)|[689]\\d?)\\d{0,11}/,mastercard:/^(5[1-5]\\d{0,2}|22[2-9]\\d{0,1}|2[3-7]\\d{0,2})\\d{0,12}/,dankort:/^(5019|4175|4571)\\d{0,12}/,instapayment:/^63[7-9]\\d{0,13}/,jcb15:/^(?:2131|1800)\\d{0,11}/,jcb:/^(?:35\\d{0,2})\\d{0,12}/,maestro:/^(?:5[0678]\\d{0,2}|6304|67\\d{0,2})\\d{0,12}/,mir:/^220[0-4]\\d{0,12}/,visa:/^4\\d{0,15}/,unionPay:/^62\\d{0,14}/},getInfo:function(e,t){var n=r.blocks,i=r.re;t=!!t;for(var a in i)if(i[a].test(e)){var o;return o=t?n.generalStrict:n[a],{type:a,blocks:o}}return{type:\"unknown\",blocks:t?n.generalStrict:n.general}}};e.exports=r},function(e,t){\"use strict\";var r={noop:function(){},strip:function(e,t){return e.replace(t,\"\")},isDelimiter:function(e,t,r){return 0===r.length?e===t:r.some(function(t){if(e===t)return!0})},getDelimiterREByDelimiter:function(e){return new RegExp(e.replace(/([.?*+^$[\\]\\\\(){}|-])/g,\"\\\\$1\"),\"g\")},getNextCursorPosition:function(e,t,r,n,i){return t.length===e?r.length:e+this.getPositionOffset(e,t,r,n,i)},getPositionOffset:function(e,t,r,n,i){var a,o,l;return a=this.stripDelimiters(t.slice(0,e),n,i),o=this.stripDelimiters(r.slice(0,e),n,i),l=a.length-o.length,0!==l?l/Math.abs(l):0},stripDelimiters:function(e,t,r){var n=this;if(0===r.length){var i=t?n.getDelimiterREByDelimiter(t):\"\";return e.replace(i,\"\")}return r.forEach(function(t){e=e.replace(n.getDelimiterREByDelimiter(t),\"\")}),e},headStr:function(e,t){return e.slice(0,t)},getMaxLength:function(e){return e.reduce(function(e,t){return e+t},0)},getPrefixStrippedValue:function(e,t,r,n){if(e.slice(0,r)!==t)if(e.length<n.length)e=e.length>r?n:t;else{var i=this.getFirstDiffIndex(t,e.slice(0,r));e=t+e.slice(i,i+1)+e.slice(r+1)}return e.slice(r)},getFirstDiffIndex:function(e,t){for(var r=0;e.charAt(r)===t.charAt(r);)if(\"\"===e.charAt(r++))return-1;return r},getFormattedValue:function(e,t,r,n,i,a){var o,l=\"\",s=i.length>0;return 0===r?e:(t.forEach(function(t,u){if(e.length>0){var c=e.slice(0,t),d=e.slice(t);o=s?i[a?u-1:u]||o:n,a?(u>0&&(l+=o),l+=c):(l+=c,c.length===t&&u<r-1&&(l+=o)),e=d}}),l)},fixPrefixCursor:function(e,t,r,n){if(e){var i=e.value,a=r||n[0]||\" \";if(e.setSelectionRange&&t&&!(t.length+a.length<i.length)){var o=2*i.length;setTimeout(function(){e.setSelectionRange(o,o)},1)}}},setSelection:function(e,t,r){if(e===r.activeElement&&!(e&&e.value.length<=t))if(e.createTextRange){var n=e.createTextRange();n.move(\"character\",t),n.select()}else try{e.setSelectionRange(t,t)}catch(i){console.warn(\"The input element type does not support selection\")}},isAndroid:function(){return navigator&&/android/i.test(navigator.userAgent)},isAndroidBackspaceKeydown:function(e,t){return!!(this.isAndroid()&&e&&t)&&t===e.slice(0,-1)}};e.exports=r},function(e,t){(function(t){\"use strict\";var r={assign:function(e,r){return e=e||{},r=r||{},e.creditCard=!!r.creditCard,e.creditCardStrictMode=!!r.creditCardStrictMode,e.creditCardType=\"\",e.onCreditCardTypeChanged=r.onCreditCardTypeChanged||function(){},e.phone=!!r.phone,e.phoneRegionCode=r.phoneRegionCode||\"AU\",e.phoneFormatter={},e.date=!!r.date,e.datePattern=r.datePattern||[\"d\",\"m\",\"Y\"],e.dateFormatter={},e.numeral=!!r.numeral,e.numeralIntegerScale=r.numeralIntegerScale>0?r.numeralIntegerScale:0,e.numeralDecimalScale=r.numeralDecimalScale>=0?r.numeralDecimalScale:2,e.numeralDecimalMark=r.numeralDecimalMark||\".\",e.numeralThousandsGroupStyle=r.numeralThousandsGroupStyle||\"thousand\",e.numeralPositiveOnly=!!r.numeralPositiveOnly,e.stripLeadingZeroes=r.stripLeadingZeroes!==!1,e.numericOnly=e.creditCard||e.date||!!r.numericOnly,e.uppercase=!!r.uppercase,e.lowercase=!!r.lowercase,e.prefix=e.creditCard||e.date?\"\":r.prefix||\"\",e.noImmediatePrefix=!!r.noImmediatePrefix,e.prefixLength=e.prefix.length,e.rawValueTrimPrefix=!!r.rawValueTrimPrefix,e.copyDelimiter=!!r.copyDelimiter,e.initValue=void 0!==r.initValue&&null!==r.initValue?r.initValue.toString():\"\",e.delimiter=r.delimiter||\"\"===r.delimiter?r.delimiter:r.date?\"/\":r.numeral?\",\":(r.phone,\" \"),e.delimiterLength=e.delimiter.length,e.delimiterLazyShow=!!r.delimiterLazyShow,e.delimiters=r.delimiters||[],e.blocks=r.blocks||[],e.blocksLength=e.blocks.length,e.root=\"object\"==typeof t&&t?t:window,e.document=r.document||e.root.document,e.maxLength=0,e.backspace=!1,e.result=\"\",e.onValueChanged=r.onValueChanged||function(){},e}};e.exports=r}).call(t,function(){return this}())}])});"
  },
  {
    "path": "app/public/scripts/CoNETConnect.js",
    "content": "/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nclass CoNETConnect {\n    constructor(email, isKeypairBeSign, confirmRisk, account, ready) {\n        this.email = email;\n        this.isKeypairBeSign = isKeypairBeSign;\n        this.account = account;\n        this.ready = ready;\n        this.showSendImapDataWarning = ko.observable(false);\n        this.showConnectCoNETProcess = ko.observable(true);\n        this.connectStage = ko.observable(0);\n        this.connetcError = ko.observable(-1);\n        this.connectedCoNET = ko.observable(false);\n        this.maynotConnectConet = ko.observable(false);\n        this.Loading = ko.observable(false);\n        this.listenFun = null;\n        this.showTryAgain = ko.observable(false);\n        this.showSendConnectMail = ko.observable(false);\n        this.showNetworkError = ko.observable(false);\n        this.infoTextArray = ko.observableArray([]);\n        this.keyPairSign = ko.observable(null);\n        const self = this;\n        if (!confirmRisk) {\n            this.showSendImapDataWarning(true);\n        }\n        else {\n            this.imapConform();\n            this.Loading(true);\n        }\n    }\n    listingConnectStage(err, stage, publicKeyMessage) {\n        const self = this;\n        this.showConnectCoNETProcess(true);\n        switch (stage) {\n            case 1: {\n                const index = this.infoTextArray()[this.infoTextArray().length - 1];\n                if (!index) {\n                    return;\n                }\n                index.text('connectedMailServer');\n                return index.err(false);\n            }\n            /**\n             * \twaiting pong\n             */\n            case 2: {\n                return this.infoTextArray.push({ text: ko.observable('waitingPong'), err: ko.observable(null) });\n            }\n            /**\n             * \tsendConnectRequestMail\n             */\n            case 3: {\n                return this.infoTextArray.push({ text: ko.observable('sendConnectRequestMail'), err: ko.observable(null) });\n            }\n            /**\n             * \ttimeOut error!\n             */\n            case 0: {\n                self.Loading(false);\n                self.showSendConnectMail(true);\n                return self.infoTextArray.push({ text: ko.observable('timeOut'), err: ko.observable(true) });\n            }\n            /**\n             * \tconnected node\n             */\n            case 4: {\n                this.Loading(false);\n                this.showConnectCoNETProcess(false);\n                this.connectedCoNET(true);\n                _view.connectInformationMessage.socketIo.removeListener('tryConnectCoNETStage', this.listenFun);\n                return _view.keyPairCalss.decryptMessage(publicKeyMessage, (err, data) => {\n                    if (err) {\n                        return self.infoTextArray.push({ text: ko.observable('unKnowError'), err: ko.observable(true) });\n                    }\n                    if (!this.isKeypairBeSign) {\n                        if (!this.keyPairSign()) {\n                            let u = null;\n                            return this.keyPairSign(u = new keyPairSign((function () {\n                                self.keyPairSign(u = null);\n                                self.ready(null);\n                            })));\n                        }\n                        return;\n                    }\n                    _view.showIconBar(true);\n                    return this.ready(null);\n                });\n            }\n            /**\n             * \tconnectToMailServer\n             */\n            case 5: {\n                return this.infoTextArray.push({ text: ko.observable('connectToMailServer'), err: ko.observable(null) });\n            }\n            /**\n             * \tClient error!\n             */\n            case -1: {\n                this.Loading(false);\n                _view.connectInformationMessage.socketIo.removeListener('tryConnectCoNETStage', this.listenFun);\n                return this.infoTextArray.push({ text: ko.observable('systemError'), err: ko.observable(true) });\n            }\n            /**\n             * \tnetwork error!\n             */\n            case -2: {\n                this.Loading(false);\n                this.showNetworkError(true);\n                return this.infoTextArray.push({ text: ko.observable('offline'), err: ko.observable(true) });\n            }\n        }\n    }\n    returnToImapSetup() {\n        return this.ready(0);\n    }\n    sendConnectMail() {\n        this.Loading(true);\n        this.showTryAgain(false);\n        _view.connectInformationMessage.sockEmit('sendRequestMail', err => {\n            if (err) {\n                return this.listingConnectStage(null, -1, null);\n            }\n        });\n    }\n    tryAgain() {\n        this.resetAll();\n        this.infoTextArray([]);\n        return this.imapConform();\n    }\n    resetAll() {\n        this.showNetworkError(false);\n        this.showSendConnectMail(false);\n        this.showSendImapDataWarning(false);\n        this.showTryAgain(false);\n    }\n    imapConform() {\n        const self = this;\n        this.showSendImapDataWarning(false);\n        this.connetcError(-1);\n        this.Loading(true);\n        //return this.test ()\n        this.listenFun = (err, stage, message) => {\n            return self.listingConnectStage(err, stage, message);\n        };\n        _view.connectInformationMessage.socketIo.on('tryConnectCoNETStage', this.listenFun);\n        _view.connectInformationMessage.sockEmit('tryConnectCoNET', err => {\n            if (err) {\n                return this.listingConnectStage(null, -1, null);\n            }\n        });\n    }\n    /**\n     * \t\t\ttest unit\n     */\n    test() {\n        /**\n         * \t\tlocalServerError\n         */\n        /*\n        this.listingConnectStage ( null, 5 )\n        setTimeout (() => {\n            this.listingConnectStage ( null, -1 )\n        }, 3000 )\n        /** */\n        /**\n         * \t\tconnect to mail server error\n         */\n        /*\n        this.listingConnectStage ( null, 5 )\n        setTimeout (() => {\n            this.listingConnectStage ( null, -2 )\n        }, 3000 )\n        /** */\n        /**\n         * \t\twaiting pong\n         */\n        /*\n        this.listingConnectStage ( null, 5 )\n        setTimeout (() => {\n            this.listingConnectStage ( null, 1 )\n            this.listingConnectStage ( null, 2 )\n        }, 3000 )\n        /** */\n        /**\n         * \t\twaiting pong error automatic send request mail\n         */\n        /*\n        this.listingConnectStage ( null, 5 )\n        setTimeout (() => {\n            this.listingConnectStage ( null, 1 )\n            this.listingConnectStage ( null, 2 )\n            setTimeout (() => {\n                this.listingConnectStage ( null, 3 )\n            })\n        }, 3000 )\n        /** */\n        /**\n         * \t\twaiting pong error automatic send request mail and timeout error\n         */\n        /*\n        this.listingConnectStage ( null, 5 )\n        setTimeout (() => {\n            this.listingConnectStage ( null, 1 )\n            this.listingConnectStage ( null, 2 )\n            setTimeout (() => {\n                this.listingConnectStage ( null, 3 )\n                setTimeout (() => {\n                    this.listingConnectStage ( null, 0 )\n                }, 2000 )\n            })\n        }, 3000 )\n        /** */\n    }\n}\n"
  },
  {
    "path": "app/public/scripts/CoNETConnect.ts",
    "content": "/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\ninterface connectInfo {\n\ttext: KnockoutObservable < string >\n\terr: KnockoutObservable < boolean >\n}\n\nclass CoNETConnect {\n\tpublic showSendImapDataWarning = ko.observable ( false )\n\tpublic showConnectCoNETProcess = ko.observable ( true )\n\tpublic connectStage = ko.observable ( 0 )\n\tpublic connetcError = ko.observable ( -1 )\n\tpublic connectedCoNET = ko.observable ( false )\n\tpublic maynotConnectConet = ko.observable ( false )\n\tpublic Loading = ko.observable ( false )\n\tpublic listenFun = null\n\tpublic showTryAgain = ko.observable ( false )\n\tpublic showSendConnectMail = ko.observable ( false )\n\tpublic showNetworkError = ko.observable ( false )\n\tpublic infoTextArray: KnockoutObservableArray < connectInfo > = ko.observableArray ([])\n\tpublic keyPairSign: KnockoutObservable< keyPairSign > = ko.observable ( null )\n\tconstructor ( public email: string, private isKeypairBeSign: boolean, confirmRisk: boolean, public account: string, private ready: ( err ) => void ) {\n\t\tconst self = this\n\t\tif ( !confirmRisk ) {\n\t\t\tthis.showSendImapDataWarning ( true )\n\t\t} else {\n\t\t\tthis.imapConform ()\n\t\t\tthis.Loading ( true )\n\t\t}\n\t}\n\n\n\tpublic listingConnectStage ( err, stage, publicKeyMessage ) {\n\t\tconst self = this\n\t\tthis.showConnectCoNETProcess ( true )\n\t\t\n\n\t\tswitch ( stage ) {\n\t\t\tcase 1: {\n\t\t\t\tconst index = this.infoTextArray ()[ this.infoTextArray ().length -1 ]\n\t\t\t\tif ( !index ) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tindex.text ( 'connectedMailServer' )\n\t\t\t\treturn index.err ( false )\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * \twaiting pong\n\t\t\t */\n\n\t\t\tcase 2: {\n\t\t\t\treturn this.infoTextArray.push ({ text: ko.observable ('waitingPong'), err: ko.observable ( null )})\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * \tsendConnectRequestMail\n\t\t\t */\n\t\t\tcase 3: {\n\t\t\t\t\n\t\t\t\treturn this.infoTextArray.push ({ text: ko.observable ('sendConnectRequestMail'), err: ko.observable ( null )})\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * \ttimeOut error!\n\t\t\t */\n\t\t\tcase 0: {\n\t\t\t\tself.Loading ( false )\n\t\t\t\tself.showSendConnectMail ( true )\n\t\t\t\treturn self.infoTextArray.push ({ text: ko.observable ( 'timeOut' ), err: ko.observable ( true )})\n\t\t\t}\n\n\n\t\t\t/**\n\t\t\t * \tconnected node\n\t\t\t */\n\t\t\tcase 4: {\n\t\t\t\tthis.Loading ( false )\n\t\t\t\tthis.showConnectCoNETProcess ( false )\n\t\t\t\tthis.connectedCoNET ( true )\n\t\t\t\t_view.connectInformationMessage.socketIo.removeListener ( 'tryConnectCoNETStage', this.listenFun )\n\n\t\t\t\treturn _view.keyPairCalss.decryptMessage ( publicKeyMessage, ( err, data ) => {\n\t\t\t\t\tif ( err ) {\n\t\t\t\t\t\treturn self.infoTextArray.push ({ text: ko.observable ( 'unKnowError' ), err: ko.observable ( true )})\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif ( ! this.isKeypairBeSign ) {\n\t\t\t\t\t\tif ( ! this.keyPairSign ()) {\n\t\t\t\t\t\t\tlet u = null\n\t\t\t\t\t\t\treturn this.keyPairSign ( u = new keyPairSign (( function () {\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tself.keyPairSign ( u = null )\n\t\t\t\t\t\t\t\tself.ready ( null )\n\t\t\t\t\t\t\t})))\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\t_view.showIconBar ( true )\n\t\t\t\t\treturn this.ready ( null )\n\t\t\t\t})\n\n\t\t\t\t\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * \tconnectToMailServer\n\t\t\t */\n\t\t\tcase 5: {\n\t\t\t\treturn this.infoTextArray.push ({ text: ko.observable ( 'connectToMailServer' ), err: ko.observable ( null ) })\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * \tClient error!\n\t\t\t */\n\t\t\tcase -1: {\n\t\t\t\tthis.Loading ( false )\n\t\t\t\t_view.connectInformationMessage.socketIo.removeListener ( 'tryConnectCoNETStage', this.listenFun )\n\t\t\t\treturn this.infoTextArray.push ({ text: ko.observable ( 'systemError' ), err: ko.observable ( true ) })\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * \tnetwork error!\n\t\t\t */\n\t\t\tcase -2: {\n\t\t\t\tthis.Loading ( false )\n\t\t\t\tthis.showNetworkError ( true )\n\t\t\t\treturn this.infoTextArray.push ({ text: ko.observable ( 'offline' ), err: ko.observable ( true ) })\n\t\t\t}\n\n\t\t}\n\t\t\n\t}\n\n\n\tpublic returnToImapSetup () {\n\t\treturn this.ready ( 0 )\n\t}\n\n\n\tpublic sendConnectMail () {\n\t\t\n\t\tthis.Loading ( true )\n\t\tthis.showTryAgain ( false )\n\t\t_view.connectInformationMessage.sockEmit ( 'sendRequestMail', err => {\n\t\t\tif ( err ) {\n\t\t\t\treturn this.listingConnectStage ( null, -1, null )\n\t\t\t}\n\t\t})\n\t}\n\n\tpublic tryAgain () {\n\t\tthis.resetAll ()\n\t\tthis.infoTextArray ([])\n\t\treturn this.imapConform ()\n\t}\n\n\tprivate resetAll () {\n\t\tthis.showNetworkError ( false )\n\t\tthis.showSendConnectMail ( false )\n\t\tthis.showSendImapDataWarning ( false )\n\t\tthis.showTryAgain ( false )\n\t}\n\n\n\n\tpublic imapConform () {\n\t\tconst self = this\n\t\tthis.showSendImapDataWarning ( false )\n\t\tthis.connetcError ( -1 )\n\t\tthis.Loading ( true )\n\n\t\t//return this.test ()\n\n\n\t\tthis.listenFun = (  err, stage, message  ) => {\n\t\t\treturn self.listingConnectStage ( err, stage, message )\n\t\t}\n\n\t\t_view.connectInformationMessage.socketIo.on ( 'tryConnectCoNETStage', this.listenFun )\n\t\t\n\t\t_view.connectInformationMessage.sockEmit ( 'tryConnectCoNET', err => {\n\t\t\tif ( err ) {\n\t\t\t\treturn this.listingConnectStage ( null, -1, null )\n\t\t\t}\n\t\t})\n\n\t}\n\n\t/**\n\t * \t\t\ttest unit\n\t */\n\tprivate test () {\n\t\t/**\n\t\t * \t\tlocalServerError\n\t\t */\n\t\t/*\n\t\tthis.listingConnectStage ( null, 5 )\n\t\tsetTimeout (() => {\n\t\t\tthis.listingConnectStage ( null, -1 )\n\t\t}, 3000 )\n\t\t/** */\n\n\t\t/**\n\t\t * \t\tconnect to mail server error\n\t\t */\n\t\t/*\n\t\tthis.listingConnectStage ( null, 5 )\n\t\tsetTimeout (() => {\n\t\t\tthis.listingConnectStage ( null, -2 )\n\t\t}, 3000 )\n\t\t/** */\n\n\t\t/**\n\t\t * \t\twaiting pong\n\t\t */\n\t\t/*\n\t\tthis.listingConnectStage ( null, 5 )\n\t\tsetTimeout (() => {\n\t\t\tthis.listingConnectStage ( null, 1 )\n\t\t\tthis.listingConnectStage ( null, 2 )\n\t\t}, 3000 )\n\t\t/** */\n\n\t\t/**\n\t\t * \t\twaiting pong error automatic send request mail\n\t\t */\n\t\t/*\n\t\tthis.listingConnectStage ( null, 5 )\n\t\tsetTimeout (() => {\n\t\t\tthis.listingConnectStage ( null, 1 )\n\t\t\tthis.listingConnectStage ( null, 2 )\n\t\t\tsetTimeout (() => {\n\t\t\t\tthis.listingConnectStage ( null, 3 )\n\t\t\t})\n\t\t}, 3000 )\n\t\t/** */\n\n\t\t/**\n\t\t * \t\twaiting pong error automatic send request mail and timeout error\n\t\t */\n\t\t/*\n\t\tthis.listingConnectStage ( null, 5 )\n\t\tsetTimeout (() => {\n\t\t\tthis.listingConnectStage ( null, 1 )\n\t\t\tthis.listingConnectStage ( null, 2 )\n\t\t\tsetTimeout (() => {\n\t\t\t\tthis.listingConnectStage ( null, 3 )\n\t\t\t\tsetTimeout (() => {\n\t\t\t\t\tthis.listingConnectStage ( null, 0 )\n\t\t\t\t}, 2000 )\n\t\t\t})\n\t\t}, 3000 )\n\t\t/** */\n\n\t}\n\n\t\n}\n\n"
  },
  {
    "path": "app/public/scripts/appCosearch.js",
    "content": "let appScript = {\n    info: {\n        totalResults: ['大约有', '約', 'About', '大約有'],\n        totalResults1: ['条记录', '件', 'results', '條記錄'],\n        moreResults: ['更多结果', '結果をさらに表示', 'More Results', '更多結果'],\n        searchToolBarMenu: [\n            [\n                '网站', 'ウェイブ', 'Website', '網頁'\n            ], [\n                '新闻', 'ニュース', 'News', '新聞'\n            ], [\n                '图片', '画像', 'Picture', '圖片'\n            ], [\n                '视频', 'ビデオ', 'Video', '視頻'\n            ]\n        ]\n    },\n    showMain: ko.observable(true),\n    showWebPage: ko.observable(null),\n    htmlIframe: ko.observable(false),\n    showSnapshop: ko.observable(false),\n    searchItemsArray: ko.observable(),\n    hasFocusShowTool: ko.observable(false),\n    backGroundBlue: ko.observable(false),\n    searchItem: ko.observable(null),\n    showMainSearchForm: ko.observable(true),\n    showSearchSetupForm: ko.observable(false),\n    showSearchError: ko.observable(false),\n    showInputLoading: ko.observable(false),\n    errorMessageIndex: ko.observable(-1),\n    searchInputText: ko.observable(''),\n    hasFocus: ko.observable(false),\n    passwordError: ko.observable(false),\n    searchSetupIcon: ko.observable(bingIcon),\n    password: ko.observable(''),\n    searchInputTextActionShow: ko.observable(false),\n    SearchInputNextHasFocus: ko.observable(false),\n    showSearchesRelated: ko.observable(false),\n    searchItemList: ko.observableArray([]),\n    loadingGetResponse: ko.observable(false),\n    conetResponse: ko.observable(false),\n    searchInputTextShow: ko.observable(''),\n    currentlyShowItems: ko.observable(0),\n    newsButtonShowLoading: ko.observable(false),\n    newsItemsArray: ko.observable(),\n    newsButtonShowError: ko.observable(false),\n    newsButtonErrorIndex: ko.observable(null),\n    newsLoadingGetResponse: ko.observable(false),\n    newsConetResponse: ko.observable(false),\n    nextButtonShowError: ko.observable(false),\n    moreResultsButtomLoading: ko.observable(false),\n    imageButtonShowLoading: ko.observable(false),\n    imageButtonShowError: ko.observable(false),\n    imageButtonErrorIndex: ko.observable(-1),\n    imageLoadingGetResponse: ko.observable(false),\n    imageConetResponse: ko.observable(false),\n    imageItemsArray: ko.observable(),\n    searchSimilarImagesList: ko.observableArray([]),\n    showSearchSimilarImagesResult: ko.observable(false),\n    imageSearchItemArray: ko.observable(),\n    videoButtonShowLoading: ko.observable(false),\n    videoItemsArray: ko.observable(),\n    videoButtonShowError: ko.observable(false),\n    videoButtonErrorIndex: ko.observable(-1),\n    videoLoadingGetResponse: ko.observable(false),\n    videoConetResponse: ko.observable(false),\n    nextButtonErrorIndex: ko.observable(false),\n    nextButtonConetResponse: ko.observable(false),\n    nextButtonLoadingGetResponse: ko.observable(false),\n    //\t['originImage']\n    initSearchData: (self) => {\n        self.searchItem(null);\n        self.searchItemList([]);\n        self.showInputLoading(true);\n        self.showSearchesRelated(false);\n        self.newsItemsArray(null);\n        self.imageItemsArray(null);\n        self.showSearchesRelated(null);\n        self.videoItemsArray(null);\n        self.imageSearchItemArray(null);\n    },\n    showResultItems: (self, items) => {\n        self.searchItem(items);\n        self.searchItemList(items.Result);\n        $('.selection.dropdown').dropdown();\n    },\n    searchSetupClick: (self, event) => {\n        self.showSearchSetupForm(true);\n        self.backGroundBlue(true);\n        /*\n        $('#coSearchBackGround').one ( 'click', function() {\n            self.backGroundClick ()\n            $('#coSearchForm').off ('click')\n        })\n        $('#coSearchForm').one ( 'click', function() {\n            self.backGroundClick ()\n            $('#coSearchBackGround').off ('click')\n        })\n        */\n        return false;\n    },\n    searchInputCloseError: (self, event) => {\n        self.showSearchError(false);\n        self.errorMessageIndex(null);\n    },\n    returnSearchResultItemsInit: (items) => {\n        let i = 0;\n        const y = [];\n        items.Result.forEach(n => {\n            i++;\n            n['showLoading'] = ko.observable(false);\n            n['conetResponse'] = ko.observable(false);\n            n['loadingGetResponse'] = ko.observable(false);\n            n['snapshotReady'] = ko.observable(false);\n            n['snapshotClass'] = null;\n            n['snapshotData'] = null;\n            n['snapshotUuid'] = null;\n            n['id'] = uuid_generate();\n            n['showError'] = ko.observable(false);\n            n['errorIndex'] = ko.observable(-1);\n            if (!n['newsBrand']) {\n                n['newsBrand'] = null;\n            }\n            if (n.imageInfo) {\n                if (!n.imageInfo['videoTime']) {\n                    n.imageInfo['videoTime'] = null;\n                }\n            }\n            n['webUrlHref'] = n.clickUrl;\n            n['imgUrlHref'] = n.imgSrc;\n            n['showImageLoading'] = ko.observable(false);\n            n['showImageError'] = ko.observable(false);\n            n['snapshotImageReady'] = ko.observable(false);\n            n['loadingImageGetResponse'] = ko.observable(false);\n            n['conetImageResponse'] = ko.observable(false);\n            n['imageErrorIndex'] = ko.observable(-1);\n        });\n    },\n    search_form: (self, event) => {\n        if (self.showInputLoading()) {\n            return;\n        }\n        if (!_view.CanadaBackground()) {\n            _view.CanadaBackground(true);\n        }\n        if (!self.showMainSearchForm()) {\n            self.showMainSearchForm(true);\n        }\n        const search_text = self.searchInputText();\n        const width = window.innerWidth;\n        const height = window.outerHeight;\n        self.initSearchData(self);\n        const com = {\n            command: 'CoSearch',\n            Args: null,\n            error: null,\n            subCom: null\n        };\n        /**\n         * \t\t\tweb page address\n         */\n        if (/^http[s]?:\\/\\//.test(search_text)) {\n            com.Args = [search_text, width, height];\n            com.subCom = 'getSnapshop';\n        }\n        else {\n            com.Args = ['google', search_text];\n            com.subCom = 'webSearch';\n        }\n        const errorProcess = (err) => {\n            self.showInputLoading(false);\n            self.searchInputText('');\n            self.errorMessageIndex(_view.connectInformationMessage.getErrorIndex(err));\n            return self.showSearchError(true);\n        };\n        /**\n         *\n         * \t\ttest Unit\n         */\n        return _view.keyPairCalss.emitRequest(com, (err, com) => {\n            if (err) {\n                return errorProcess(err);\n            }\n            if (!com) {\n                return self.loadingGetResponse(true);\n            }\n            if (com.error === -1) {\n                self.loadingGetResponse(false);\n                return self.conetResponse(true);\n            }\n            if (com.error) {\n                return errorProcess(com.error);\n            }\n            if (com.subCom === 'webSearch') {\n                self.showInputLoading(false);\n                const args = com.Args;\n                self.searchInputTextShow(search_text);\n                self.returnSearchResultItemsInit(args.param);\n                self.searchItemsArray(args.param);\n                self.showResultItems(self, args.param);\n                _view.CanadaBackground(false);\n                return self.showMainSearchForm(false);\n            }\n            const arg = com.Args[0];\n            const uuid = arg.split(',')[0].split('.')[0];\n            return _view.connectInformationMessage.sockEmit('getFilesFromImap', arg, (err, buffer) => {\n                if (err) {\n                    return errorProcess(err);\n                }\n                return _view.keyPairCalss.decryptMessageToZipStream(buffer, (err, data) => {\n                    if (err) {\n                        return errorProcess(err);\n                    }\n                    self.showInputLoading(false);\n                    _view.CanadaBackground(false);\n                    self.showMainSearchForm(false);\n                    self.showMain(false);\n                    self.showSnapshop(true);\n                    let y = null;\n                    self.showWebPage(y = new showWebPageClass(search_text, buffer, uuid, () => {\n                        self.showWebPage(y = null);\n                        self.showMain(true);\n                        self.showSnapshop(false);\n                        _view.CanadaBackground(true);\n                        self.showMainSearchForm(true);\n                    }));\n                });\n            });\n        });\n    },\n    searchSetup: (key, self, event) => {\n        self.showSearchSetupForm(false);\n        self.backGroundBlue(false);\n        switch (key) {\n            case 'b': {\n                return self.searchSetupIcon(bingIcon);\n            }\n            case 'd': {\n                return self.searchSetupIcon(duckduckgoIcon);\n            }\n            case 'y': {\n                return self.searchSetupIcon(YahooIcon);\n            }\n            default: {\n                self.searchSetupIcon(googleIcon);\n            }\n        }\n    },\n    startup: (self) => {\n        self.password.subscribe((_text) => {\n            self.passwordError(false);\n        });\n        self.hasFocus.subscribe((_result) => {\n            if (_result) {\n                self.hasFocusShowTool(true);\n                return self.backGroundBlue(true);\n            }\n            /*\n            if ( self.showMain () ) {\n                if ( !self.searchInputText().length ) {\n                    self.searchInputTextActionShow ( false )\n                    return self.backGroundBlue ( _result )\n                }\n                self.searchInputTextActionShow ( true )\n                _result = false\n                return true\n            }\n            if ( !_result ) {\n                return true\n            }\n            if ( _result ) {\n                if ( !self.showSubViewToolBar ()) {\n                    self.showSubViewToolBar ( true )\n                }\n            }\n            return true\n            */\n        });\n        self.searchInputText.subscribe((_text) => {\n            self.searchInputTextActionShow(_text.length > 0);\n        });\n        self.SearchInputNextHasFocus.subscribe((hasFocus) => {\n            if (hasFocus) {\n                self.showSearchesRelated(true);\n            }\n        });\n        _view.showIconBar(false);\n        _view.CanadaBackground(true);\n    },\n    nextButtonErrorClick: (self) => {\n        self.nextButtonShowError(false);\n        self.nextButtonErrorIndex(null);\n    },\n    webItemsClick: (self, event) => {\n        self.currentlyShowItems(0);\n        self.showResultItems(self, self.searchItemsArray());\n    },\n    searchNext: (self, event) => {\n        const nextLink = self.searchItem().nextPage;\n        if (self.moreResultsButtomLoading() || !nextLink) {\n            return;\n        }\n        self.moreResultsButtomLoading(true);\n        function showError(err) {\n            self.moreResultsButtomLoading(false);\n            self.nextButtonErrorIndex(_view.connectInformationMessage.getErrorIndex(err));\n            self.nextButtonShowError(true);\n        }\n        let currentArray = null;\n        const com = {\n            command: 'CoSearch',\n            Args: ['google', nextLink],\n            error: null,\n            subCom: null\n        };\n        switch (self.currentlyShowItems()) {\n            //      google search\n            case 0: {\n                com.subCom = 'searchNext';\n                currentArray = self.searchItemsArray();\n                break;\n            }\n            //      news\n            case 1: {\n                com.subCom = 'newsNext';\n                currentArray = self.newsItemsArray();\n                break;\n            }\n            case 2: {\n                com.subCom = 'imageSearchNext';\n                currentArray = self.imageSearchItemArray();\n                break;\n            }\n            default: {\n                com.subCom = 'videoNext';\n                currentArray = self.videoItemsArray();\n                break;\n            }\n        }\n        /** */\n        return _view.keyPairCalss.emitRequest(com, (err, com) => {\n            if (err) {\n                return showError(err);\n            }\n            if (!com) {\n                return self.nextButtonLoadingGetResponse(true);\n            }\n            if (com.error === -1) {\n                self.nextButtonLoadingGetResponse(false);\n                return self.nextButtonConetResponse(true);\n            }\n            if (com.error) {\n                return showError(com.error);\n            }\n            self.moreResultsButtomLoading(false);\n            self.nextButtonLoadingGetResponse(false);\n            self.nextButtonConetResponse(false);\n            const args = com.Args;\n            self.returnSearchResultItemsInit(args.param);\n            currentArray.Result.push(...args.param.Result);\n            currentArray.nextPage = args.param.nextPage;\n            return self.showResultItems(self, currentArray);\n        });\n    },\n    createNewsResult: (self, newsResult) => {\n        const newsItems = JSON.parse(JSON.stringify(self.searchItemsArray()));\n        newsItems.Result = newsResult.Result;\n        newsItems.nextPage = newsResult.nextPage;\n        newsItems.totalResults = newsResult.totalResults;\n        return newsItems;\n    },\n    newsButtonClick: (self, event) => {\n        if (self.newsButtonShowLoading()) {\n            return;\n        }\n        if (self.newsButtonShowError()) {\n            self.newsButtonShowError(false);\n            return self.newsButtonErrorIndex(null);\n        }\n        self.newsButtonShowLoading(true);\n        const errorProcess = (err) => {\n            self.newsButtonShowLoading(false);\n            self.newsLoadingGetResponse(false);\n            self.newsConetResponse(false);\n            self.newsButtonErrorIndex(_view.connectInformationMessage.getErrorIndex(err));\n            return self.newsButtonShowError(true);\n        };\n        if (!self.newsItemsArray()) {\n            if (!self.searchItemsArray().action || !self.searchItemsArray().action.news) {\n                return errorProcess('invalidRequest');\n            }\n            const com = {\n                command: 'CoSearch',\n                Args: ['google', self.searchItemsArray().action.news],\n                error: null,\n                subCom: 'newsNext'\n            };\n            return _view.keyPairCalss.emitRequest(com, (err, com) => {\n                if (err) {\n                    return errorProcess(err);\n                }\n                if (!com) {\n                    return self.newsLoadingGetResponse(true);\n                }\n                if (com.error === -1) {\n                    self.newsLoadingGetResponse(false);\n                    return self.newsConetResponse(true);\n                }\n                if (com.error) {\n                    return errorProcess(com.error);\n                }\n                self.newsButtonShowLoading(false);\n                self.newsConetResponse(false);\n                self.newsLoadingGetResponse(false);\n                const args = com.Args;\n                self.newsItemsArray(self.createNewsResult(self, args.param));\n                self.returnSearchResultItemsInit(self.newsItemsArray());\n            });\n        }\n        self.currentlyShowItems(1);\n        self.newsButtonShowLoading(false);\n        return self.showResultItems(self, self.newsItemsArray());\n    },\n    imageButtonClick: (self, event) => {\n        if (self.imageButtonShowLoading()) {\n            return;\n        }\n        if (self.imageButtonShowError()) {\n            self.imageButtonShowError(false);\n            return self.imageButtonErrorIndex(null);\n        }\n        const errorProcess = (err) => {\n            self.imageButtonShowLoading(false);\n            self.imageLoadingGetResponse(false);\n            self.imageConetResponse(false);\n            self.imageButtonErrorIndex(_view.connectInformationMessage.getErrorIndex(err));\n            return self.imageButtonShowError(true);\n        };\n        if (!self.imageItemsArray()) {\n            const imageLink = self.searchItemsArray() && self.searchItemsArray().action && self.searchItemsArray().action.image ? self.searchItemsArray().action.image : self.imageSearchItemArray().searchesRelated[1];\n            const com = {\n                command: 'CoSearch',\n                Args: ['google', imageLink],\n                error: null,\n                subCom: 'imageNext'\n            };\n            self.imageButtonShowLoading(true);\n            return _view.keyPairCalss.emitRequest(com, (err, com) => {\n                if (err) {\n                    return errorProcess(err);\n                }\n                if (!com) {\n                    self.imageConetResponse(false);\n                    return self.imageLoadingGetResponse(true);\n                }\n                if (com.error === -1) {\n                    self.imageLoadingGetResponse(false);\n                    return self.imageConetResponse(true);\n                }\n                const args = com.Args;\n                if (com.error) {\n                    return errorProcess(com.error);\n                }\n                if (!args.param || !args.param.Result || !args.param.Result.length) {\n                    return errorProcess('timeOut');\n                }\n                self.imageButtonShowLoading(false);\n                self.imageConetResponse(false);\n                self.imageLoadingGetResponse(false);\n                self.imageItemsArray(args.param);\n                self.returnSearchResultItemsInit(self.imageItemsArray());\n            });\n            /** */\n        }\n        self.searchSimilarImagesList(self.imageItemsArray().Result);\n        self.showMain(false);\n        self.showSearchSimilarImagesResult(true);\n    },\n    getSnapshotClick: (self, index) => {\n        const currentItem = self.searchItemList()[index];\n        currentItem.showLoading(true);\n        const showError = err => {\n            currentItem.showLoading(false);\n            currentItem.loadingGetResponse(false);\n            currentItem.conetResponse(false);\n            currentItem.errorIndex(_view.connectInformationMessage.getErrorIndex(err));\n            currentItem.showError(true);\n            const currentElm = $(`#${currentItem.id}`);\n            return currentElm.popup({\n                on: 'click',\n                inline: true,\n                onHidden: function () {\n                    currentItem.showError(false);\n                    currentItem.errorIndex(null);\n                }\n            });\n        };\n        const callBack = (err, com) => {\n            if (err) {\n                return showError(err);\n            }\n            if (!com) {\n                currentItem.loadingGetResponse(true);\n                return currentItem.conetResponse(false);\n            }\n            if (com.error === -1) {\n                currentItem.loadingGetResponse(false);\n                return currentItem.conetResponse(true);\n            }\n            if (com.error) {\n                return showError(com.error);\n            }\n            const arg = com.Args[0];\n            currentItem.snapshotUuid = arg.split(',')[0].split('.')[0];\n            return _view.connectInformationMessage.sockEmit('getFilesFromImap', arg, (err, buffer) => {\n                if (err) {\n                    return showError(err);\n                }\n                return _view.keyPairCalss.decryptMessageToZipStream(buffer, (err, data) => {\n                    if (err) {\n                        return showError(err);\n                    }\n                    currentItem.snapshotReady(true);\n                    currentItem.showLoading(false);\n                    currentItem.loadingGetResponse(false);\n                    currentItem.conetResponse(false);\n                    return currentItem.snapshotData = buffer;\n                });\n            });\n        };\n        const url = currentItem.url;\n        const width = $(window).width();\n        const height = $(window).height();\n        const com = {\n            command: 'CoSearch',\n            Args: [url, width, height],\n            error: null,\n            subCom: 'getSnapshop'\n        };\n        return _view.keyPairCalss.emitRequest(com, callBack);\n    },\n    showSnapshotClick: (self, index) => {\n        self.showMain(false);\n        self.showSnapshop(true);\n        const currentItem = self.searchItemList()[index];\n        let y = null;\n        self.showWebPage(y = new showWebPageClass(currentItem.url, currentItem.snapshotData, currentItem.snapshotUuid, () => {\n            self.showWebPage(y = null);\n            self.showMain(true);\n            self.showSnapshop(false);\n        }));\n    },\n    searchesRelatedSelect: (self, index) => {\n        self.searchInputText(self.searchItem().searchesRelated[index].text);\n        self.showSearchesRelated(false);\n    },\n    closeSimilarImagesResult: (self) => {\n        self.searchSimilarImagesList([]);\n        self.showMain(true);\n        self.showSearchSimilarImagesResult(false);\n    },\n    videoButtonClick: (self) => {\n        if (self.videoButtonShowLoading()) {\n            return;\n        }\n        if (self.videoButtonShowError()) {\n            self.videoButtonShowError(false);\n            return self.imageButtonErrorIndex(null);\n        }\n        const errorProcess = (err) => {\n            self.videoButtonShowLoading(false);\n            self.videoLoadingGetResponse(false);\n            self.videoConetResponse(false);\n            self.videoButtonErrorIndex(_view.connectInformationMessage.getErrorIndex(err));\n            return self.videoButtonShowError(true);\n        };\n        if (!self.videoItemsArray()) {\n            if (!self.searchItemsArray().action || !self.searchItemsArray().action.video) {\n                return errorProcess('invalidRequest');\n            }\n            const com = {\n                command: 'CoSearch',\n                Args: ['google', self.searchItemsArray().action.video],\n                error: null,\n                subCom: 'videoNext'\n            };\n            self.videoButtonShowLoading(true);\n            return _view.keyPairCalss.emitRequest(com, (err, com) => {\n                if (err) {\n                    return errorProcess(err);\n                }\n                if (!com) {\n                    self.videoConetResponse(false);\n                    return self.videoLoadingGetResponse(true);\n                }\n                if (com.error === -1) {\n                    self.videoLoadingGetResponse(false);\n                    return self.videoConetResponse(true);\n                }\n                if (com.error) {\n                    return errorProcess(com.error);\n                }\n                self.videoButtonShowLoading(false);\n                self.videoLoadingGetResponse(false);\n                self.videoConetResponse(false);\n                const args = com.Args;\n                self.videoItemsArray(self.createNewsResult(self, args.param));\n                self.returnSearchResultItemsInit(self.videoItemsArray());\n            });\n            /** */\n        }\n        self.currentlyShowItems(3);\n        return self.showResultItems(self, self.videoItemsArray());\n    },\n    getPictureBase64MaxSize_mediaData: (mediaData, imageMaxWidth, imageMaxHeight, CallBack) => {\n        const media = mediaData.split(',');\n        const type = media[0].split(';')[0].split(':')[1];\n        const _media = Buffer.from(media[1], 'base64');\n        const ret = {\n            total_bytes: media[1].length,\n            media_type: 'image/png',\n            rawData: media[1],\n            media_id_string: null\n        };\n        //if ( mediaData.length > maxImageLength) {\n        const exportImage = (_type, img) => {\n            return img.getBuffer(_type, (err, _buf) => {\n                if (err) {\n                    return CallBack(err);\n                }\n                ret.rawData = _buf.toString('base64');\n                ret.total_bytes = _buf.length;\n                return CallBack(null, ret);\n            });\n        };\n        return Jimp.read(_media, (err, image) => {\n            if (err) {\n                return CallBack(err);\n            }\n            const uu = image.bitmap;\n            if (uu.height + uu.width > imageMaxHeight + imageMaxWidth) {\n                if (uu.height > uu.widt) {\n                    image.resize(Jimp.AUTO, imageMaxHeight);\n                }\n                else {\n                    image.resize(imageMaxWidth, Jimp.AUTO);\n                }\n            }\n            //\t\tto PNG\n            return image.deflateStrategy(2, () => {\n                return exportImage(ret.media_type, image);\n            });\n        });\n        //}\n        //return CallBack ( null, ret )\n    },\n    imageSearch: (ee) => {\n        const self = _view.appsManager().appScript();\n        const errorProcess = (err) => {\n            self.showInputLoading(false);\n            self.searchInputText('');\n            self.errorMessageIndex(_view.connectInformationMessage.getErrorIndex(err));\n            return self.showSearchError(true);\n        };\n        const showItems = (iResult) => {\n            self.showInputLoading(false);\n            self.currentlyShowItems(2);\n            self.returnSearchResultItemsInit(iResult);\n            self.imageSearchItemArray(iResult);\n            self.searchInputText(iResult.searchesRelated[0]);\n            self.showResultItems(self, self.imageSearchItemArray());\n        };\n        if (!ee || !ee.files || !ee.files.length) {\n            return;\n        }\n        const file = ee.files[0];\n        if (!file || !file.type.match(/^image.(png$|jpg$|jpeg$|gif$)/)) {\n            return;\n        }\n        const reader = new FileReader();\n        reader.onload = e => {\n            const rawData = reader.result.toString();\n            self.showInputLoading(true);\n            self.searchInputText(' ');\n            self.searchItem(null);\n            self.searchItemList([]);\n            return self.getPictureBase64MaxSize_mediaData(rawData, 1024, 1024, (err, data) => {\n                if (err) {\n                    return errorProcess(err);\n                }\n                const uuid = uuid_generate() + '.png';\n                return _view.keyPairCalss.encrypt(data.rawData, (err, textData) => {\n                    if (err) {\n                        return errorProcess(err);\n                    }\n                    self.initSearchData(self);\n                    return _view.connectInformationMessage.sockEmit('sendMedia', uuid, textData, err => {\n                        if (err) {\n                            return errorProcess(err);\n                        }\n                        const com = {\n                            command: 'CoSearch',\n                            Args: ['google', uuid],\n                            error: null,\n                            subCom: 'imageSearch'\n                        };\n                        return _view.keyPairCalss.emitRequest(com, (err, com) => {\n                            if (err) {\n                                return errorProcess(err);\n                            }\n                            if (!com) {\n                                return self.loadingGetResponse(true);\n                            }\n                            if (com.error === -1) {\n                                self.loadingGetResponse(false);\n                                return self.conetResponse(true);\n                            }\n                            if (com.error) {\n                                return errorProcess(com.error);\n                            }\n                            _view.CanadaBackground(false);\n                            self.showMainSearchForm(false);\n                            return showItems(com.Args.param);\n                        });\n                    });\n                });\n            });\n        };\n        if (!_view.CanadaBackground()) {\n            _view.CanadaBackground(true);\n        }\n        if (!self.showMainSearchForm()) {\n            self.showMainSearchForm(true);\n        }\n        return reader.readAsDataURL(file);\n    },\n    imagesResultClick: (self, index, image) => {\n        const _img = self.searchSimilarImagesList()[index];\n        const currentElm = $(`#${_img.id}-1`);\n        /**\n         *\n         * \t\t\tget web side\n         *\n         */\n        if (_img.showError()) {\n            return _img.showError(false);\n        }\n        if (_img.showImageError()) {\n            return _img.showImageError(false);\n        }\n        if (image === 'link') {\n            if (_img.showLoading()) {\n                return;\n            }\n            const url = _img.webUrlHref;\n            if (_img['snapshotData']) {\n                self.showMain(false);\n                self.showSnapshop(true);\n                self.showSearchSimilarImagesResult(false);\n                let y = null;\n                return self.showWebPage(y = new showWebPageClass(url, _img['snapshotData'], _img['snapshotUuid'], () => {\n                    self.showWebPage(y = null);\n                    self.showMain(true);\n                    self.showSnapshop(false);\n                    self.showSearchSimilarImagesResult(true);\n                }));\n            }\n            const errorProcess = (err) => {\n                _img.errorIndex(_view.connectInformationMessage.getErrorIndex(err));\n                _img.showLoading(false);\n                _img.snapshotReady(false);\n                _img.loadingGetResponse(false);\n                _img.conetResponse(false);\n                const currentElm = $(`#${_img.id}`);\n                currentElm.popup({\n                    on: 'click',\n                    inline: true,\n                    onHidden: function () {\n                        _img.showError(false);\n                        _img.errorIndex(null);\n                    }\n                });\n                return _img.showError(true);\n            };\n            _img.showLoading(true);\n            const callBack = (err, com) => {\n                if (err) {\n                    return errorProcess(err);\n                }\n                if (!com) {\n                    _img.loadingGetResponse(true);\n                    return _img.conetResponse(false);\n                }\n                if (com.error === -1) {\n                    _img.loadingGetResponse(false);\n                    return _img.conetResponse(true);\n                }\n                if (com.error) {\n                    return errorProcess(com.error);\n                }\n                const arg = com.Args[0];\n                _img['snapshotUuid'] = arg.split(',')[0].split('.')[0];\n                return _view.connectInformationMessage.sockEmit('getFilesFromImap', arg, (err, buffer) => {\n                    if (err) {\n                        return errorProcess(err);\n                    }\n                    return _view.keyPairCalss.decryptMessageToZipStream(buffer, (err, data) => {\n                        if (err) {\n                            return errorProcess(err);\n                        }\n                        _img.snapshotReady(true);\n                        _img.showLoading(false);\n                        _img.loadingGetResponse(false);\n                        _img.conetResponse(false);\n                        return _img['snapshotData'] = buffer;\n                    });\n                });\n            };\n            const width = $(window).width();\n            const height = $(window).height();\n            const com = {\n                command: 'CoSearch',\n                Args: [url, width, height],\n                error: null,\n                subCom: 'getSnapshop'\n            };\n            return _view.keyPairCalss.emitRequest(com, callBack);\n        }\n        /**\n         * n['showImageLoading'] = ko.observable ( false )\n            n['snapshotImageReady'] = ko.observable ( false )\n            n['loadingImageGetResponse'] = ko.observable ( false )\n            n['conetImageResponse'] = ko.observable ( false )\n            n['showImageError'] = ko.observable ( false )\n            n['imageErrorIndex'] = ko.observable (-1)\n         */\n        if (image === 'img') {\n            if (_img.showImageLoading()) {\n                return;\n            }\n            if (_img['imgOriginalData']) {\n                const uu = 1;\n                return;\n            }\n            const errorProcess = (err) => {\n                _img.imageErrorIndex(_view.connectInformationMessage.getErrorIndex(err));\n                _img.showImageLoading(false);\n                _img.snapshotImageReady(false);\n                _img.loadingImageGetResponse(false);\n                _img.conetImageResponse(false);\n                _img.showImageError(true);\n                currentElm.popup({\n                    inline: true,\n                    onHidden: function () {\n                        _img.showImageError(false);\n                    }\n                });\n                return;\n            };\n            const callBack = (err, com) => {\n                if (err) {\n                    return errorProcess(err);\n                }\n                if (!com) {\n                    _img.loadingGetResponse(true);\n                    return _img.conetResponse(false);\n                }\n                if (com.error === -1) {\n                    _img.loadingGetResponse(false);\n                    return _img.conetResponse(true);\n                }\n                if (com.error) {\n                    return errorProcess(com.error);\n                }\n                const arg = com.Args[0];\n                _img['snapshotUuid'] = arg.split(',')[0].split('.')[0];\n                return _view.connectInformationMessage.sockEmit('getFilesFromImap', arg, (err, buffer) => {\n                    if (err) {\n                        return errorProcess(err);\n                    }\n                    return _view.keyPairCalss.decryptMessageToZipStream(buffer, (err, data) => {\n                        if (err) {\n                            return errorProcess(err);\n                        }\n                        _img.snapshotReady(true);\n                        _img.showLoading(false);\n                        _img.loadingGetResponse(false);\n                        _img.conetResponse(false);\n                        return _img['snapshotData'] = buffer;\n                    });\n                });\n            };\n            const com = {\n                command: 'CoSearch',\n                Args: [_img.imgUrlHref],\n                error: null,\n                subCom: 'getFile'\n            };\n            return _view.keyPairCalss.emitRequest(com, callBack);\n            setTimeout(() => {\n                _img.loadingImageGetResponse(true);\n                setTimeout(() => {\n                    _img.loadingImageGetResponse(false);\n                    _img.conetImageResponse(true);\n                    setTimeout(() => {\n                        _img.loadingImageGetResponse(false);\n                        _img.conetImageResponse(false);\n                        _img.snapshotImageReady(true);\n                        _img.showImageLoading(false);\n                    }, 1000);\n                }, 1000);\n            }, 1000);\n            _img.showImageLoading(true);\n        }\n    }\n};\n"
  },
  {
    "path": "app/public/scripts/appCosearch.ts",
    "content": "\n\n\nlet appScript = {\n\tinfo: {\n\t\ttotalResults: ['大约有','約','About','大約有'],\n\t\ttotalResults1: ['条记录','件','results','條記錄'],\n\t\tmoreResults: ['更多结果','結果をさらに表示','More Results','更多結果'],\n\t\tsearchToolBarMenu: [\n\t\t\t[\n\t\t\t\t'网站','ウェイブ','Website','網頁'\n\t\t\t],[\n\t\t\t\t'新闻','ニュース','News','新聞'\n\t\t\t],[\n\t\t\t\t'图片','画像','Picture','圖片'\n\t\t\t],[\n\t\t\t\t'视频','ビデオ','Video','視頻'\n\t\t\t]\n\t\t]\n\t},\n\n\tshowMain: ko.observable ( true ),\n\tshowWebPage: ko.observable ( null ), \n\thtmlIframe: ko.observable ( false ),\n\tshowSnapshop: ko.observable ( false ),\n\tsearchItemsArray: ko.observable (),\n\thasFocusShowTool: ko.observable ( false ),\n\tbackGroundBlue: ko.observable ( false ),\n\tsearchItem: ko.observable ( null ),\n\tshowMainSearchForm: ko.observable ( true ),\n\tshowSearchSetupForm: ko.observable ( false ),\n\tshowSearchError: ko.observable ( false ),\n\tshowInputLoading: ko.observable ( false ),\n\terrorMessageIndex: ko.observable ( -1 ),\n\tsearchInputText: ko.observable (''),\n\thasFocus: ko.observable ( false ),\n\tpasswordError: ko.observable ( false ),\n\tsearchSetupIcon: ko.observable ( bingIcon ),\n\tpassword: ko.observable (''),\n\tsearchInputTextActionShow: ko.observable ( false ),\n\tSearchInputNextHasFocus: ko.observable ( false ),\n\tshowSearchesRelated: ko.observable ( false ),\n\tsearchItemList: ko.observableArray ([]),\n\tloadingGetResponse: ko.observable ( false ),\n\tconetResponse: ko.observable ( false ),\n\tsearchInputTextShow: ko.observable (''),\n\tcurrentlyShowItems: ko.observable ( 0 ),\n\tnewsButtonShowLoading: ko.observable ( false ),\n\n\tnewsItemsArray: ko.observable (),\n\tnewsButtonShowError: ko.observable ( false ),\n\tnewsButtonErrorIndex: ko.observable ( null ),\n\tnewsLoadingGetResponse: ko.observable ( false ),\n\tnewsConetResponse: ko.observable ( false ), \n\n\tnextButtonShowError: ko.observable ( false ),\n\tmoreResultsButtomLoading: ko.observable ( false ),\n\n\timageButtonShowLoading: ko.observable ( false ),\n\timageButtonShowError: ko.observable ( false ),\n\timageButtonErrorIndex: ko.observable ( -1 ),\n\timageLoadingGetResponse: ko.observable ( false ),\n\timageConetResponse: ko.observable ( false ),\n\timageItemsArray: ko.observable (),\n\tsearchSimilarImagesList: ko.observableArray ([]),\n\tshowSearchSimilarImagesResult: ko.observable ( false ),\n\timageSearchItemArray: ko.observable (),\n\n\tvideoButtonShowLoading: ko.observable ( false ),\n\tvideoItemsArray: ko.observable (),\n\tvideoButtonShowError: ko.observable ( false ),\n\tvideoButtonErrorIndex: ko.observable ( -1 ),\n\tvideoLoadingGetResponse: ko.observable ( false ),\n\tvideoConetResponse: ko.observable ( false ),\n\n\tnextButtonErrorIndex: ko.observable ( false ),\n\tnextButtonConetResponse: ko.observable ( false ),\n\tnextButtonLoadingGetResponse: ko.observable ( false ),\n\n\n\t//\t['originImage']\n\n\tinitSearchData: ( self ) => {\n\t\tself.searchItem ( null )\n\t\tself.searchItemList ([])\n\t\tself.showInputLoading ( true )\n\t\tself.showSearchesRelated ( false )\n\t\tself.newsItemsArray ( null )\n\t\tself.imageItemsArray ( null )\n\t\tself.showSearchesRelated ( null )\n\t\tself.videoItemsArray ( null )\n\t\tself.imageSearchItemArray ( null )\n\t\t\n\t},\n\n\tshowResultItems: ( self, items ) => {\n\t\tself.searchItem ( items )\n\t\tself.searchItemList ( items.Result )\n\t\t$('.selection.dropdown').dropdown()\n\t},\n\n\tsearchSetupClick: ( self, event ) => {\n\t\tself.showSearchSetupForm ( true )\n\t\tself.backGroundBlue ( true )\n\t\t\n\t\t/*\n\t\t$('#coSearchBackGround').one ( 'click', function() {\n\t\t\tself.backGroundClick ()\n\t\t\t$('#coSearchForm').off ('click')\n\t\t})\n\t\t$('#coSearchForm').one ( 'click', function() {\n\t\t\tself.backGroundClick ()\n\t\t\t$('#coSearchBackGround').off ('click')\n\t\t})\n\t\t*/\n\t\treturn false\n\t},\n\n\tsearchInputCloseError: ( self, event ) => {\n\t\tself.showSearchError ( false )\n\t\tself.errorMessageIndex (null)\n\t\t\n\t},\n\n\treturnSearchResultItemsInit: ( items ) => {\n\t\tlet i = 0\n\t\tconst y = []\n\t\titems.Result.forEach ( n => {\n\t\t\ti++\n\t\t\t\n\t\t\t\n\t\t\tn['showLoading'] = ko.observable ( false )\n\t\t\tn['conetResponse'] = ko.observable ( false )\n\t\t\tn['loadingGetResponse'] = ko.observable ( false )\n\t\t\tn['snapshotReady'] = ko.observable ( false )\n\t\t\tn['snapshotClass'] = null\n\t\t\tn['snapshotData'] = null\n\t\t\tn['snapshotUuid'] = null\n\t\t\tn['id'] = uuid_generate ()\n\t\t\tn['showError'] = ko.observable ( false )\n\t\t\tn['errorIndex'] = ko.observable ( -1 )\n\t\t\tif ( !n['newsBrand'] ) {\n\t\t\t\tn['newsBrand'] = null\n\t\t\t}\n\t\t\tif ( n.imageInfo ) {\n\t\t\t\tif ( !n.imageInfo['videoTime'] ) {\n\t\t\t\t\tn.imageInfo['videoTime'] = null\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tn['webUrlHref'] = n.clickUrl\n\t\t\tn['imgUrlHref'] = n.imgSrc\n\t\t\t\n\t\t\t\n\t\t\tn['showImageLoading'] = ko.observable ( false )\n\t\t\tn['showImageError'] = ko.observable ( false )\n\t\t\tn['snapshotImageReady'] = ko.observable ( false )\n\t\t\tn['loadingImageGetResponse'] = ko.observable ( false )\n\t\t\tn['conetImageResponse'] = ko.observable ( false )\n\t\t\tn['imageErrorIndex'] = ko.observable (-1)\n\t\t})\n\t\t\n\t},\n\n\tsearch_form: ( self, event ) => {\n\n\t\tif ( self.showInputLoading()) {\n\t\t\treturn \n\t\t}\n\t\t\n\t\tif ( !_view.CanadaBackground ()) {\n\t\t\t_view.CanadaBackground ( true )\n\t\t}\n\t\tif ( !self.showMainSearchForm()) {\n\t\t\tself.showMainSearchForm( true )\n\t\t}\n\t\tconst search_text = self.searchInputText ()\n\t\t\n\t\tconst width = window.innerWidth\n\t\tconst height = window.outerHeight\n\t\t\n\t\tself.initSearchData ( self )\n\n\t\tconst com: QTGateAPIRequestCommand = {\n\t\t\tcommand: 'CoSearch',\n\t\t\tArgs: null,\n\t\t\terror: null,\n\t\t\tsubCom: null\n\t\t}\n\t\t/**\n\t\t * \t\t\tweb page address\n\t\t */\n\n\t\tif ( /^http[s]?:\\/\\//.test( search_text )) {\n\t\t\tcom.Args = [ search_text, width, height ]\n\t\t\tcom.subCom = 'getSnapshop'\n\t\t\t\n\t\t} else {\n\t\t\tcom.Args = [ 'google', search_text ]\n\t\t\tcom.subCom = 'webSearch'\n\t\t}\n\n\t\tconst errorProcess = ( err ) => {\n\t\t\tself.showInputLoading ( false )\n\t\t\tself.searchInputText ( '' )\n\t\t\tself.errorMessageIndex ( _view.connectInformationMessage.getErrorIndex( err ))\n\t\t\treturn self.showSearchError ( true )\n\t\t}\n\n\t\t/**\n\t\t * \n\t\t * \t\ttest Unit\n\t\t */\n\n\t\t\n\n\t\treturn _view.keyPairCalss.emitRequest ( com, ( err, com: QTGateAPIRequestCommand ) => {\n\t\t\t\n\t\t\tif ( err ) {\n\t\t\t\treturn errorProcess ( err )\n\t\t\t}\n\n\t\t\tif ( !com ) {\n\t\t\t\treturn self.loadingGetResponse ( true )\n\t\t\t}\n\n\t\t\tif ( com.error === -1 ) {\n\t\t\t\tself.loadingGetResponse ( false )\n\t\t\t\treturn self.conetResponse ( true )\n\t\t\t}\n\n\t\t\t\n\n\t\t\tif ( com.error ) {\n\t\t\t\treturn errorProcess ( com.error )\n\t\t\t}\n\n\t\t\tif ( com.subCom === 'webSearch') {\n\t\t\t\tself.showInputLoading ( false )\n\t\t\t\t\n\t\t\t\tconst args = com.Args\n\t\t\t\tself.searchInputTextShow ( search_text )\n\t\t\t\t\n\t\t\t\tself.returnSearchResultItemsInit ( args.param )\n\t\t\t\tself.searchItemsArray ( args.param )\n\t\t\t\tself.showResultItems ( self, args.param )\n\t\t\t\t_view.CanadaBackground ( false )\n\t\t\t\treturn self.showMainSearchForm ( false )\n\t\t\t}\n\t\t\t\n\t\t\tconst arg: string = com.Args[0]\n\t\t\tconst uuid = arg.split(',')[0].split ('.')[0]\n\t\t\treturn _view.connectInformationMessage.sockEmit ( 'getFilesFromImap', arg, ( err, buffer: string ) => {\n\t\t\t\tif ( err ) {\n\t\t\t\t\treturn errorProcess ( err )\n\t\t\t\t}\n\t\t\t\treturn _view.keyPairCalss.decryptMessageToZipStream ( buffer, ( err, data ) => {\n\t\t\t\t\tif ( err ) {\n\t\t\t\t\t\treturn errorProcess ( err )\n\t\t\t\t\t}\n\t\t\t\t\tself.showInputLoading ( false )\n\t\t\t\t\t_view.CanadaBackground ( false )\n\t\t\t\t\tself.showMainSearchForm ( false )\n\t\t\t\t\tself.showMain ( false )\n\t\t\t\t\tself.showSnapshop ( true )\n\t\t\t\t\tlet y = null\n\t\t\t\t\tself.showWebPage ( y = new showWebPageClass ( search_text, buffer, uuid , () => {\n\t\t\t\t\t\tself.showWebPage ( y = null )\n\t\t\t\t\t\tself.showMain ( true )\n\t\t\t\t\t\tself.showSnapshop ( false )\n\t\t\t\t\t\t_view.CanadaBackground ( true )\n\t\t\t\t\t\tself.showMainSearchForm ( true )\n\t\t\t\t\t}))\n\t\t\t\t})\n\t\t\t\t\n\t\t\t})\n\t\t\t\n\t\t})\n\t\t\n\n\t},\n\n\tsearchSetup: ( key: string, self, event ) => {\n\t\tself.showSearchSetupForm ( false )\n\t\tself.backGroundBlue ( false )\n\t\tswitch ( key ) {\n\t\t\tcase 'b': {\n\t\t\t\treturn self.searchSetupIcon ( bingIcon )\n\t\t\t}\n\t\t\tcase 'd': {\n\t\t\t\treturn self.searchSetupIcon ( duckduckgoIcon )\n\t\t\t}\n\t\t\tcase 'y': {\n\t\t\t\treturn self.searchSetupIcon ( YahooIcon )\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tself.searchSetupIcon ( googleIcon )\n\t\t\t}\n\t\t}\n\t},\n\n\tstartup: ( self ) => {\n\t\tself.password.subscribe (( _text: string ) => {\n\t\t\tself.passwordError ( false )\n\t\t})\n\n\t\tself.hasFocus.subscribe (( _result: boolean ) => {\n\t\t\t\n\t\t\t\n\t\t\tif ( _result ) {\n\t\t\t\tself.hasFocusShowTool ( true )\n\t\t\t\treturn self.backGroundBlue ( true )\n\t\t\t} \n\t\t\t\n\t\t\t/*\n\t\t\tif ( self.showMain () ) {\n\t\t\t\tif ( !self.searchInputText().length ) {\n\t\t\t\t\tself.searchInputTextActionShow ( false )\n\t\t\t\t\treturn self.backGroundBlue ( _result )\n\t\t\t\t}\n\t\t\t\tself.searchInputTextActionShow ( true )\n\t\t\t\t_result = false\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tif ( !_result ) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tif ( _result ) {\n\t\t\t\tif ( !self.showSubViewToolBar ()) {\n\t\t\t\t\tself.showSubViewToolBar ( true )\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\t\t*/\n\t\t\t\n\t\t})\n\t\t\n\t\tself.searchInputText.subscribe (( _text: string ) => {\n\t\t\t\n\t\t\tself.searchInputTextActionShow ( _text.length > 0 )\n\t\t\t\n\t\t})\n\n\t\tself.SearchInputNextHasFocus.subscribe (( hasFocus: boolean ) => {\n\t\t\tif ( hasFocus ) {\n\t\t\t\tself.showSearchesRelated ( true )\n\t\t\t}\n\t\t})\n\t\t\n\t\t_view.showIconBar ( false )\n\t\t_view.CanadaBackground ( true )\n\t},\n\n\tnextButtonErrorClick: ( self ) => {\n\t\t\n\t\tself.nextButtonShowError ( false )\n\t\tself.nextButtonErrorIndex ( null )\n\t},\n\n\twebItemsClick: ( self, event ) => {\n\t\tself.currentlyShowItems ( 0 )\n\t\tself.showResultItems ( self, self.searchItemsArray ())\n\t},\n\n\tsearchNext: ( self, event ) => {\n\t\tconst nextLink = self.searchItem().nextPage\n\t\tif ( self.moreResultsButtomLoading () || !nextLink ) {\n\t\t\treturn\n\t\t}\n\n\t\t\n\t\tself.moreResultsButtomLoading ( true )\n\t\t\n\n\t\tfunction showError ( err ) {\n\t\t\tself.moreResultsButtomLoading ( false )\n\t\t\tself.nextButtonErrorIndex (  _view.connectInformationMessage.getErrorIndex ( err ))\n\t\t\tself.nextButtonShowError ( true )\n\t\t\t\n\t\t}\n\n\t\t\n\n\t\tlet currentArray = null\n\t\tconst com: QTGateAPIRequestCommand = {\n\t\t\tcommand: 'CoSearch',\n\t\t\tArgs: [ 'google', nextLink ],\n\t\t\terror: null,\n\t\t\tsubCom: null\n\t\t}\n\n\t\tswitch ( self.currentlyShowItems ()) {\n\t\t\t  //      google search\n\t\t\tcase 0: {\n\t\t\t\tcom.subCom = 'searchNext'\n\t\t\t\tcurrentArray = self.searchItemsArray()\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t//      news\n\t\t\tcase 1: {\n\t\t\t\tcom.subCom = 'newsNext'\n\t\t\t\tcurrentArray = self.newsItemsArray()\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tcase 2: {\n\t\t\t\tcom.subCom = 'imageSearchNext'\n\t\t\t\tcurrentArray = self.imageSearchItemArray()\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tcom.subCom = 'videoNext'\n\t\t\t\tcurrentArray = self.videoItemsArray()\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\t/** */\n\t\t\n\t\t\n\t\treturn _view.keyPairCalss.emitRequest ( com, ( err, com: QTGateAPIRequestCommand ) => {\n\t\t\t\n\t\t\tif ( err ) {\n\t\t\t\treturn showError ( err )\n\t\t\t}\n\n\t\t\tif ( !com ) {\n\t\t\t\treturn self.nextButtonLoadingGetResponse ( true )\n\t\t\t}\n\n\t\t\tif ( com.error === -1 ) {\n\t\t\t\tself.nextButtonLoadingGetResponse ( false )\n\t\t\t\treturn self.nextButtonConetResponse ( true )\n\t\t\t}\n\n\t\t\tif ( com.error ) {\n\t\t\t\treturn showError ( com.error  )\n\t\t\t}\n\t\t\tself.moreResultsButtomLoading ( false )\n\t\t\tself.nextButtonLoadingGetResponse ( false )\n\t\t\tself.nextButtonConetResponse ( false )\n\t\t\tconst args = com.Args\n\t\t\tself.returnSearchResultItemsInit ( args.param )\n\t\t\tcurrentArray.Result.push ( ...args.param.Result )\n\t\t\tcurrentArray.nextPage = args.param.nextPage\n\t\t\treturn self.showResultItems ( self, currentArray )\n\n\t\t})\n\t\t\n\t},\n\n\tcreateNewsResult: ( self, newsResult ) => {\n\t\tconst newsItems = JSON.parse ( JSON.stringify ( self.searchItemsArray ()))\n\t\tnewsItems.Result = newsResult.Result\n\t\tnewsItems.nextPage = newsResult.nextPage\n\t\tnewsItems.totalResults = newsResult.totalResults\n\t\treturn newsItems\n\t},\n\n\tnewsButtonClick: ( self, event ) => {\n\n\t\tif ( self.newsButtonShowLoading ()) {\n\t\t\treturn \n\t\t}\n\t\t\n\t\tif ( self.newsButtonShowError ()) {\n\t\t\tself.newsButtonShowError( false )\n\t\t\treturn self.newsButtonErrorIndex ( null )\n\t\t}\n\n\t\tself.newsButtonShowLoading ( true )\n\n\t\tconst errorProcess = ( err ) => {\n\t\t\tself.newsButtonShowLoading ( false )\n\t\t\tself.newsLoadingGetResponse ( false )\n\t\t\tself.newsConetResponse ( false )\n\t\t\tself.newsButtonErrorIndex ( _view.connectInformationMessage.getErrorIndex( err ))\n\t\t\treturn self.newsButtonShowError ( true )\n\t\t}\n\t\tif ( ! self.newsItemsArray() ) {\n\n\t\t\tif ( !self.searchItemsArray().action || !self.searchItemsArray().action.news ) {\n\t\t\t\treturn errorProcess ('invalidRequest')\n\t\t\t}\n\t\t\t\n\n\n\t\t\tconst com: QTGateAPIRequestCommand = {\n\t\t\t\tcommand: 'CoSearch',\n\t\t\t\tArgs: [ 'google', self.searchItemsArray().action.news ],\n\t\t\t\terror: null,\n\t\t\t\tsubCom: 'newsNext'\n\t\t\t}\n\n\t\t\treturn _view.keyPairCalss.emitRequest ( com,( err, com: QTGateAPIRequestCommand ) => {\n\t\t\t\n\t\t\t\tif ( err ) {\n\n\t\t\t\t\treturn errorProcess ( err )\n\t\t\t\t}\n\t\n\t\t\t\tif ( !com ) {\n\t\t\t\t\treturn self.newsLoadingGetResponse ( true )\n\t\t\t\t}\n\t\n\t\t\t\tif ( com.error === -1 ) {\n\t\t\t\t\tself.newsLoadingGetResponse ( false )\n\t\t\t\t\treturn self.newsConetResponse ( true )\n\t\t\t\t}\n\t\n\t\t\t\tif ( com.error ) {\n\t\t\t\t\treturn errorProcess ( com.error  )\n\t\t\t\t}\n\n\n\t\t\t\tself.newsButtonShowLoading ( false )\n\t\t\t\tself.newsConetResponse ( false )\n\t\t\t\tself.newsLoadingGetResponse ( false )\n\n\t\t\t\tconst args = com.Args\n\t\t\t\tself.newsItemsArray ( self.createNewsResult( self, args.param ))\n\t\t\t\tself.returnSearchResultItemsInit ( self.newsItemsArray () )\n\t\n\t\t\t})\n\n\t\t}\n\n\t\tself.currentlyShowItems(1)\n\t\tself.newsButtonShowLoading ( false )\n\t\treturn self.showResultItems ( self, self.newsItemsArray() )\n\n\t},\n\n\timageButtonClick: ( self, event ) => {\n\n\t\tif ( self.imageButtonShowLoading ()) {\n\t\t\treturn \n\t\t}\n\t\t\n\t\tif ( self.imageButtonShowError ()) {\n\t\t\tself.imageButtonShowError ( false )\n\t\t\treturn self.imageButtonErrorIndex ( null )\n\t\t}\n\n\t\tconst errorProcess = ( err ) => {\n\t\t\tself.imageButtonShowLoading ( false )\n\t\t\tself.imageLoadingGetResponse ( false )\n\t\t\tself.imageConetResponse ( false )\n\t\t\tself.imageButtonErrorIndex ( _view.connectInformationMessage.getErrorIndex( err ))\n\t\t\treturn self.imageButtonShowError ( true )\n\t\t}\n\n\t\tif ( ! self.imageItemsArray() ) {\n\t\t\tconst imageLink =  self.searchItemsArray() && self.searchItemsArray().action && self.searchItemsArray().action.image ? self.searchItemsArray().action.image : self.imageSearchItemArray().searchesRelated[1]\n\t\t\tconst com: QTGateAPIRequestCommand = {\n\t\t\t\tcommand: 'CoSearch',\n\t\t\t\tArgs: [ 'google', imageLink ],\n\t\t\t\terror: null,\n\t\t\t\tsubCom: 'imageNext'\n\t\t\t}\n\t\t\tself.imageButtonShowLoading ( true )\n\t\t\t\n\t\t\t\n\t\t\treturn _view.keyPairCalss.emitRequest ( com,( err, com: QTGateAPIRequestCommand ) => {\n\t\t\t\t\n\t\t\t\tif ( err ) {\n\t\t\t\t\treturn errorProcess ( err )\n\t\t\t\t}\n\n\t\t\t\tif ( !com ) {\n\t\t\t\t\tself.imageConetResponse ( false )\n\t\t\t\t\treturn self.imageLoadingGetResponse ( true )\n\t\t\t\t}\n\n\t\t\t\tif ( com.error === -1 ) {\n\t\t\t\t\tself.imageLoadingGetResponse ( false )\n\t\t\t\t\treturn self.imageConetResponse ( true )\n\t\t\t\t}\n\t\t\t\tconst args = com.Args\n\n\t\t\t\tif ( com.error ) {\n\t\t\t\t\treturn errorProcess ( com.error )\n\t\t\t\t}\n\n\t\t\t\tif ( !args.param || !args.param.Result || !args.param.Result.length ) {\n\t\t\t\t\treturn errorProcess ( 'timeOut' )\n\t\t\t\t}\n\n\t\t\t\tself.imageButtonShowLoading ( false )\n\t\t\t\tself.imageConetResponse ( false )\n\t\t\t\tself.imageLoadingGetResponse ( false )\n\n\t\t\t\t\n\t\t\t\tself.imageItemsArray ( args.param )\n\t\t\t\tself.returnSearchResultItemsInit ( self.imageItemsArray () )\n\n\t\t\t})\n\t\t\t/** */\n\n\t\t}\n\n\n\t\t\n\t\tself.searchSimilarImagesList( self.imageItemsArray().Result  )\n\t\tself.showMain ( false )\n\t\tself.showSearchSimilarImagesResult ( true )\n\t\t\n\t},\n\n\tgetSnapshotClick: ( self, index ) => {\n\t\tconst currentItem = self.searchItemList()[ index ]\n\t\tcurrentItem.showLoading ( true )\n\t\tconst showError = err => {\n\t\t\tcurrentItem.showLoading ( false )\n\t\t\tcurrentItem.loadingGetResponse ( false )\n\t\t\tcurrentItem.conetResponse ( false )\n\t\t\tcurrentItem.errorIndex ( _view.connectInformationMessage.getErrorIndex ( err ))\n\t\t\tcurrentItem.showError ( true )\n\t\t\tconst currentElm = $(`#${ currentItem.id }`)\n\t\t\treturn currentElm.popup ({\n\t\t\t\ton: 'click',\n\t\t\t\tinline: true,\n\t\t\t\tonHidden: function () {\n\t\t\t\t\tcurrentItem.showError ( false )\n\t\t\t\t\tcurrentItem.errorIndex ( null )\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\tconst callBack = ( err?, com?: QTGateAPIRequestCommand ) => {\n\t\t\tif ( err ) {\n\t\t\t\treturn showError ( err )\n\t\t\t}\n\t\t\tif ( !com ) {\n\t\t\t\tcurrentItem.loadingGetResponse ( true )\n\t\t\t\treturn currentItem.conetResponse ( false )\n\t\t\t}\n\t\t\tif ( com.error === -1 ) {\n\t\t\t\tcurrentItem.loadingGetResponse ( false )\n\t\t\t\treturn currentItem.conetResponse ( true )\n\t\t\t}\n\t\t\tif ( com.error ) {\n\t\t\t\treturn showError ( com.error )\n\t\t\t}\n\t\t\t\n\t\t\tconst arg: string = com.Args[0]\n\t\t\tcurrentItem.snapshotUuid = arg.split(',')[0].split ('.')[0]\n\t\t\treturn _view.connectInformationMessage.sockEmit ( 'getFilesFromImap', arg, ( err, buffer: string ) => {\n\t\t\t\tif ( err ) {\n\t\t\t\t\treturn showError ( err )\n\t\t\t\t}\n\t\t\t\treturn _view.keyPairCalss.decryptMessageToZipStream ( buffer, ( err, data ) => {\n\t\t\t\t\tif ( err ) {\n\t\t\t\t\t\treturn showError ( err )\n\t\t\t\t\t}\n\t\t\t\t\tcurrentItem.snapshotReady ( true )\n\t\t\t\t\tcurrentItem.showLoading ( false )\n\t\t\t\t\tcurrentItem.loadingGetResponse ( false )\n\t\t\t\t\tcurrentItem.conetResponse ( false )\n\t\t\t\t\treturn currentItem.snapshotData = buffer\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\t\n\t\t}\n\n\t\tconst url = currentItem.url\n\t\tconst width = $(window).width()\n\t\tconst height = $(window).height()\n\t\t\n\t\tconst com: QTGateAPIRequestCommand = {\n\t\t\tcommand: 'CoSearch',\n\t\t\tArgs: [ url, width, height ],\n\t\t\terror: null,\n\t\t\tsubCom: 'getSnapshop'\n\t\t}\n\n\t\treturn _view.keyPairCalss.emitRequest ( com, callBack )\n\t},\n\n\tshowSnapshotClick: ( self, index ) => {\n\t\tself.showMain ( false )\n\t\tself.showSnapshop ( true )\n\t\tconst currentItem = self.searchItemList()[ index ]\n\t\tlet y = null\n\t\t\n\n\t\tself.showWebPage ( y = new showWebPageClass ( currentItem.url, currentItem.snapshotData, currentItem.snapshotUuid , () => {\n\t\t\tself.showWebPage ( y = null )\n\t\t\tself.showMain ( true )\n\t\t\tself.showSnapshop ( false )\n\t\t\t\n\t\t}))\n\t},\n\n\tsearchesRelatedSelect: ( self, index ) => {\n\n\t\tself.searchInputText ( self.searchItem().searchesRelated[index].text )\n\t\tself.showSearchesRelated ( false )\n\t},\n\n\tcloseSimilarImagesResult: ( self ) => {\n\t\tself.searchSimilarImagesList ([])\n\t\tself.showMain ( true )\n\t\tself.showSearchSimilarImagesResult ( false )\n\t},\n\n\tvideoButtonClick: ( self ) => {\n\n\t\tif ( self.videoButtonShowLoading ()) {\n\t\t\treturn \n\t\t}\n\t\t\n\t\tif ( self.videoButtonShowError ()) {\n\t\t\tself.videoButtonShowError ( false )\n\t\t\treturn self.imageButtonErrorIndex ( null )\n\t\t}\n\n\t\tconst errorProcess = ( err ) => {\n\t\t\tself.videoButtonShowLoading ( false )\n\t\t\tself.videoLoadingGetResponse ( false )\n\t\t\tself.videoConetResponse ( false )\n\t\t\tself.videoButtonErrorIndex ( _view.connectInformationMessage.getErrorIndex ( err ))\n\t\t\treturn self.videoButtonShowError ( true )\n\t\t}\n\n\t\tif ( ! self.videoItemsArray() ) {\n\n\t\t\tif ( !self.searchItemsArray().action || !self.searchItemsArray().action.video ) {\n\t\t\t\treturn errorProcess ('invalidRequest')\n\t\t\t}\n\n\t\t\tconst com: QTGateAPIRequestCommand = {\n\t\t\t\tcommand: 'CoSearch',\n\t\t\t\tArgs: [ 'google', self.searchItemsArray().action.video ],\n\t\t\t\terror: null,\n\t\t\t\tsubCom: 'videoNext'\n\t\t\t}\n\n\t\t\tself.videoButtonShowLoading ( true )\n\t\t\t\n\t\t\t\n\t\t\treturn _view.keyPairCalss.emitRequest ( com,( err, com: QTGateAPIRequestCommand ) => {\n\t\t\t\t\n\t\t\t\tif ( err ) {\n\t\t\t\t\treturn errorProcess ( err )\n\t\t\t\t}\n\n\t\t\t\tif ( !com ) {\n\t\t\t\t\tself.videoConetResponse ( false )\n\t\t\t\t\treturn self.videoLoadingGetResponse ( true )\n\t\t\t\t}\n\n\t\t\t\tif ( com.error === -1 ) {\n\t\t\t\t\tself.videoLoadingGetResponse ( false )\n\t\t\t\t\treturn self.videoConetResponse ( true )\n\t\t\t\t}\n\n\t\t\t\tif ( com.error ) {\n\t\t\t\t\treturn errorProcess ( com.error  )\n\t\t\t\t}\n\n\n\t\t\t\tself.videoButtonShowLoading ( false )\n\t\t\t\tself.videoLoadingGetResponse ( false )\n\t\t\t\tself.videoConetResponse ( false )\n\n\t\t\t\tconst args = com.Args\n\t\t\t\tself.videoItemsArray ( self.createNewsResult( self, args.param ))\n\t\t\t\tself.returnSearchResultItemsInit ( self.videoItemsArray () )\n\n\t\t\t})\n\t\t\t/** */\n\n\t\t\n\t\t}\n\t\tself.currentlyShowItems(3)\n\t\t\n\t\treturn self.showResultItems ( self, self.videoItemsArray() )\n\n\t},\n\n\tgetPictureBase64MaxSize_mediaData: ( mediaData: string, imageMaxWidth: number, imageMaxHeight: number, CallBack ) => {\n\t\t\n\t\tconst media = mediaData.split(',')\n\t\tconst type = media[0].split(';')[0].split (':')[1]\n\t\tconst _media = Buffer.from ( media[1], 'base64')\n\t\t\n\t\tconst ret: twitter_mediaData = {\n\t\t\ttotal_bytes: media[1].length,\n\t\t\tmedia_type: 'image/png',\n\t\t\trawData: media[1],\n\t\t\tmedia_id_string: null\n\t\t}\n\t\t\n\t\t\n\t\t//if ( mediaData.length > maxImageLength) {\n\t\tconst exportImage = ( _type, img ) => {\n\t\t\treturn img.getBuffer ( _type, ( err, _buf: Buffer ) => {\n\t\t\t\tif ( err ) {\n\t\t\t\t\treturn CallBack ( err )\n\t\t\t\t}\n\t\t\t\tret.rawData = _buf.toString( 'base64' )\n\t\t\t\tret.total_bytes = _buf.length\n\n\t\t\t\treturn CallBack ( null, ret )\n\t\t\t})\n\t\t}\n\n\t\treturn Jimp.read ( _media, ( err, image ) => {\n\t\t\tif ( err ) {\n\t\t\t\treturn CallBack ( err )\n\t\t\t}\n\t\t\tconst uu = image.bitmap\n\n\t\t\tif ( uu.height +  uu.width > imageMaxHeight + imageMaxWidth ) {\n\t\t\t\tif ( uu.height > uu.widt ) {\n\t\t\t\t\timage.resize ( Jimp.AUTO, imageMaxHeight )\n\t\t\t\t} else {\n\t\t\t\t\timage.resize ( imageMaxWidth, Jimp.AUTO )\n\t\t\t\t}\n\t\t\t\n\t\t\t}\n\t\t\t//\t\tto PNG\n\n\t\t\treturn image.deflateStrategy ( 2, () => {\n\t\t\t\treturn exportImage ( ret.media_type, image )\n\t\t\t})\n\t\t\t\n\n\t\t})\n\t\t//}\n\t\t\n\t\t//return CallBack ( null, ret )\n\t\t\n\t},\n\n\timageSearch: ( ee ) => {\n\t\t\n\t\t\t\n\t\t\tconst self = _view.appsManager().appScript()\n\n\t\t\tconst errorProcess = ( err ) => {\n\t\t\t\tself.showInputLoading ( false )\n\t\t\t\tself.searchInputText ( '' )\n\t\t\t\tself.errorMessageIndex ( _view.connectInformationMessage.getErrorIndex( err ))\n\t\t\t\treturn self.showSearchError ( true )\n\t\t\t}\n\n\t\t\tconst showItems = ( iResult ) => {\n\t\t\t\tself.showInputLoading ( false )\n\t\t\t\tself.currentlyShowItems ( 2 )\n\t\t\t\tself.returnSearchResultItemsInit ( iResult )\n\t\t\t\tself.imageSearchItemArray ( iResult )\n\t\t\t\tself.searchInputText ( iResult.searchesRelated[0])\n\t\t\t\tself.showResultItems ( self, self.imageSearchItemArray ())\n\t\t\t}\n\n\t\t\tif ( !ee || !ee.files || !ee.files.length ) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst file = ee.files[0]\n\n\t\t\tif ( !file || !file.type.match ( /^image.(png$|jpg$|jpeg$|gif$)/ )) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst reader = new FileReader()\n\n\t\t\treader.onload = e => {\n\t\t\t\t\n\t\t\t\tconst rawData = reader.result.toString()\n\t\t\t\tself.showInputLoading ( true )\n\t\t\t\tself.searchInputText (' ')\n\t\t\t\tself.searchItem ( null )\n\t\t\t\t\n\t\t\t\tself.searchItemList ([])\n\n\t\t\t\treturn self.getPictureBase64MaxSize_mediaData ( rawData, 1024, 1024, ( err, data ) => {\n\t\t\t\t\tif ( err ) {\n\t\t\t\t\t\treturn errorProcess ( err )\n\t\t\t\t\t}\n\n\t\t\t\t\tconst uuid = uuid_generate() + '.png'\n\n\t\t\t\t\treturn _view.keyPairCalss.encrypt ( data.rawData, ( err, textData ) => {\n\n\t\t\t\t\t\tif ( err ) {\n\t\t\t\t\t\t\treturn errorProcess ( err )\n\t\t\t\t\t\t}\n\t\t\t\t\t\tself.initSearchData ( self )\n\n\t\t\t\t\t\treturn _view.connectInformationMessage.sockEmit ( 'sendMedia', uuid, textData, err => {\n\n\t\t\t\t\t\t\tif ( err ) {\n\t\t\t\t\t\t\t\treturn errorProcess ( err )\n\t\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t\tconst com: QTGateAPIRequestCommand = {\n\t\t\t\t\t\t\t\tcommand: 'CoSearch',\n\t\t\t\t\t\t\t\tArgs: [ 'google', uuid ],\n\t\t\t\t\t\t\t\terror: null,\n\t\t\t\t\t\t\t\tsubCom: 'imageSearch'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\treturn _view.keyPairCalss.emitRequest ( com, ( err, com: QTGateAPIRequestCommand ) => {\n\n\t\t\t\t\t\t\t\tif ( err ) {\n\t\t\t\t\t\t\t\t\treturn errorProcess ( err )\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( !com ) {\n\t\t\t\t\t\t\t\t\treturn self.loadingGetResponse ( true )\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( com.error === -1 ) {\n\t\t\t\t\t\t\t\t\tself.loadingGetResponse ( false )\n\t\t\t\t\t\t\t\t\treturn self.conetResponse ( true )\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\t\t\tif ( com.error ) {\n\t\t\t\t\t\t\t\t\treturn errorProcess ( com.error  )\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t_view.CanadaBackground ( false )\n\t\t\t\t\t\t\t\tself.showMainSearchForm( false )\n\t\t\t\t\t\t\t\treturn showItems ( com.Args.param )\n\t\t\t\t\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t})\n\t\t\t\t\t\t\n\t\t\t\t\t})\n\t\t\t\t\t\n\t\t\t\t})\n\t\t\t\t\n\t\t\t}\n\n\t\t\tif ( !_view.CanadaBackground ()) {\n\t\t\t\t_view.CanadaBackground ( true )\n\t\t\t}\n\t\t\tif ( !self.showMainSearchForm()) {\n\t\t\t\tself.showMainSearchForm( true )\n\t\t\t}\n\t\t\treturn reader.readAsDataURL ( file )\n\t\t\n\t},\n\n\timagesResultClick: ( self, index: number, image: string ) => {\n\t\tconst _img = self.searchSimilarImagesList ()[ index ]\n\t\tconst currentElm = $(`#${ _img.id }-1`)\n\t\t/**\n\t\t * \n\t\t * \t\t\tget web side\n\t\t * \n\t\t */\n\t\t\n\t\tif ( _img.showError()) {\n\t\t\treturn _img.showError ( false )\n\t\t}\n\n\t\tif ( _img.showImageError ()) {\n\t\t\treturn _img.showImageError ( false )\n\t\t}\n\n\t\tif ( image === 'link' ) {\n\t\t\tif ( _img.showLoading() ) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst url = _img.webUrlHref\n\n\t\t\tif ( _img['snapshotData'] ) {\n\t\t\t\tself.showMain ( false )\n\t\t\t\tself.showSnapshop ( true )\n\t\t\t\tself.showSearchSimilarImagesResult  ( false )\n\n\t\t\t\tlet y = null\n\t\t\t\t\n\n\t\t\t\treturn self.showWebPage ( y = new showWebPageClass ( url, _img['snapshotData'], _img['snapshotUuid'] , () => {\n\t\t\t\t\tself.showWebPage ( y = null )\n\t\t\t\t\tself.showMain ( true )\n\t\t\t\t\tself.showSnapshop ( false )\n\t\t\t\t\tself.showSearchSimilarImagesResult  ( true )\n\t\t\t\t}))\n\t\t\t}\n\n\t\t\tconst errorProcess = ( err ) => {\n\t\t\t\t_img.errorIndex ( _view.connectInformationMessage.getErrorIndex( err ))\n\t\t\t\t_img.showLoading ( false )\n\t\t\t\t_img.snapshotReady ( false )\n\t\t\t\t_img.loadingGetResponse ( false )\n\t\t\t\t_img.conetResponse ( false )\n\t\t\t\t\n\t\t\t\tconst currentElm = $(`#${ _img.id }`)\n\t\t\t\tcurrentElm.popup ({\n\t\t\t\t\ton: 'click',\n\t\t\t\t\tinline: true,\n\t\t\t\t\tonHidden: function () {\n\t\t\t\t\t\t_img.showError ( false )\n\t\t\t\t\t\t_img.errorIndex ( null )\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\treturn _img.showError ( true )\n\t\t\t}\n\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t_img.showLoading ( true )\n\n\t\t\tconst callBack = ( err?, com?: QTGateAPIRequestCommand ) => {\n\t\t\t\tif ( err ) {\n\t\t\t\t\treturn errorProcess ( err )\n\t\t\t\t}\n\t\t\t\tif ( !com ) {\n\t\t\t\t\t_img.loadingGetResponse ( true )\n\t\t\t\t\treturn _img.conetResponse ( false )\n\t\t\t\t}\n\t\t\t\tif ( com.error === -1 ) {\n\t\t\t\t\t_img.loadingGetResponse ( false )\n\t\t\t\t\treturn _img.conetResponse ( true )\n\t\t\t\t}\n\t\t\t\tif ( com.error ) {\n\t\t\t\t\treturn errorProcess ( com.error )\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tconst arg: string = com.Args[0]\n\t\t\t\t_img['snapshotUuid'] = arg.split(',')[0].split ('.')[0]\n\t\t\t\treturn _view.connectInformationMessage.sockEmit ( 'getFilesFromImap', arg, ( err, buffer: string ) => {\n\t\t\t\t\tif ( err ) {\n\t\t\t\t\t\treturn errorProcess ( err )\n\t\t\t\t\t}\n\n\t\t\t\t\treturn _view.keyPairCalss.decryptMessageToZipStream ( buffer, ( err, data ) => {\n\t\t\t\t\t\tif ( err ) {\n\t\t\t\t\t\t\treturn errorProcess ( err )\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_img.snapshotReady ( true )\n\t\t\t\t\t\t_img.showLoading ( false )\n\t\t\t\t\t\t_img.loadingGetResponse ( false )\n\t\t\t\t\t\t_img.conetResponse ( false )\n\t\t\t\t\t\treturn _img['snapshotData'] = buffer\n\t\t\t\t\t\t\n\t\t\t\t\t})\n\t\n\t\t\t\t\t\n\t\t\t\t})\n\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\t\n\t\t\t\n\t\t\tconst width = $(window).width()\n\t\t\tconst height = $(window).height()\n\t\t\t\n\t\t\tconst com: QTGateAPIRequestCommand = {\n\t\t\t\tcommand: 'CoSearch',\n\t\t\t\tArgs: [ url, width, height ],\n\t\t\t\terror: null,\n\t\t\t\tsubCom: 'getSnapshop'\n\t\t\t}\n\t\n\t\t\treturn _view.keyPairCalss.emitRequest ( com, callBack )\n\t\t}\n\n\n\n\t\t/**\n\t\t * n['showImageLoading'] = ko.observable ( false )\n\t\t\tn['snapshotImageReady'] = ko.observable ( false )\n\t\t\tn['loadingImageGetResponse'] = ko.observable ( false )\n\t\t\tn['conetImageResponse'] = ko.observable ( false )\n\t\t\tn['showImageError'] = ko.observable ( false )\n\t\t\tn['imageErrorIndex'] = ko.observable (-1)\n\t\t */\n\t\tif ( image === 'img') {\n\t\t\tif ( _img.showImageLoading() ) {\n\t\t\t\treturn \n\t\t\t}\n\t\t\tif ( _img['imgOriginalData'] ) {\n\t\t\t\tconst uu = 1\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst errorProcess = ( err ) => {\n\t\t\t\t_img.imageErrorIndex (_view.connectInformationMessage.getErrorIndex( err ))\n\t\t\t\t\n\t\t\t\t_img.showImageLoading ( false )\n\t\t\t\t_img.snapshotImageReady ( false )\n\t\t\t\t_img.loadingImageGetResponse ( false )\n\t\t\t\t_img.conetImageResponse ( false )\n\t\t\t\t_img.showImageError ( true )\n\t\t\t\t\n\t\t\t\tcurrentElm.popup ({\t\n\t\t\t\t\tinline: true,\n\t\t\t\t\tonHidden: function () {\n\t\t\t\t\t\t_img.showImageError ( false )\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst callBack = ( err?, com?: QTGateAPIRequestCommand ) => {\n\t\t\t\tif ( err ) {\n\t\t\t\t\treturn errorProcess ( err )\n\t\t\t\t}\n\t\t\t\tif ( !com ) {\n\t\t\t\t\t_img.loadingGetResponse ( true )\n\t\t\t\t\treturn _img.conetResponse ( false )\n\t\t\t\t}\n\t\t\t\tif ( com.error === -1 ) {\n\t\t\t\t\t_img.loadingGetResponse ( false )\n\t\t\t\t\treturn _img.conetResponse ( true )\n\t\t\t\t}\n\t\t\t\tif ( com.error ) {\n\t\t\t\t\treturn errorProcess ( com.error )\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tconst arg: string = com.Args[0]\n\t\t\t\t_img['snapshotUuid'] = arg.split(',')[0].split ('.')[0]\n\t\t\t\treturn _view.connectInformationMessage.sockEmit ( 'getFilesFromImap', arg, ( err, buffer: string ) => {\n\t\t\t\t\tif ( err ) {\n\t\t\t\t\t\treturn errorProcess ( err )\n\t\t\t\t\t}\n\n\t\t\t\t\treturn _view.keyPairCalss.decryptMessageToZipStream ( buffer, ( err, data ) => {\n\t\t\t\t\t\tif ( err ) {\n\t\t\t\t\t\t\treturn errorProcess ( err )\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_img.snapshotReady ( true )\n\t\t\t\t\t\t_img.showLoading ( false )\n\t\t\t\t\t\t_img.loadingGetResponse ( false )\n\t\t\t\t\t\t_img.conetResponse ( false )\n\t\t\t\t\t\treturn _img['snapshotData'] = buffer\n\t\t\t\t\t\t\n\t\t\t\t\t})\n\t\n\t\t\t\t\t\n\t\t\t\t})\n\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\n\t\t\tconst com: QTGateAPIRequestCommand = {\n\t\t\t\tcommand: 'CoSearch',\n\t\t\t\tArgs: [ _img.imgUrlHref ],\n\t\t\t\terror: null,\n\t\t\t\tsubCom: 'getFile'\n\t\t\t}\n\t\n\t\t\treturn _view.keyPairCalss.emitRequest ( com, callBack )\n\n\n\t\t\tsetTimeout (() => {\n\t\t\t\t_img.loadingImageGetResponse ( true )\n\t\t\t\tsetTimeout (() => {\n\t\t\t\t\t_img.loadingImageGetResponse ( false )\n\t\t\t\t\t_img.conetImageResponse ( true )\n\t\t\t\t\tsetTimeout (() => {\n\t\t\t\t\t\t_img.loadingImageGetResponse ( false )\n\t\t\t\t\t\t_img.conetImageResponse ( false )\n\t\t\t\t\t\t_img.snapshotImageReady ( true )\n\t\t\t\t\t\t_img.showImageLoading ( false )\n\t\t\t\t\t}, 1000 )\n\t\t\t\t}, 1000 )\n\t\t\t}, 1000 )\n\n\t\t\t_img.showImageLoading ( true )\n\n\t\t}\n\n\n\t\t\n\t}\n\n\n}\n\ndeclare const TimelineMax\n"
  },
  {
    "path": "app/public/scripts/appsManager.js",
    "content": "const _mainMenuObj111 = {\n    nodeName: ['CoNET官方节点', 'CoNET公式パブリックノード', 'CoNET official public node', 'CoNET官方節點'],\n    nodeAddress: 'QTGate@CoNETTech.ca',\n    mainMenuItem: [\n        /*\n        , {\n            imgSrc: 'data:image/png;base64,',\n            headerText: ['','','',''],\n\n            headerTextColor: '',\n            textColor: '',\n            meta: ['','','',''],\n            description: [\n                '','','',''\n            ],\n            extra: [\n                '','','',''\n            ]\n            \n        },\n        */\n        {\n            imgSrc: 'data:image/png;base64,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',\n            headerText: [\n                'CoSearch', 'CoSearch', 'CoSearch', 'CoSearch'\n            ],\n            headerTextColor: '',\n            textColor: '',\n            meta: [\n                '网站图片检索，任意网页快照，谷歌翻译，多媒体下载链接',\n                'ウェブと画像検索、ページのスクリーンショット、メディアファイルのダウンロードリンク、Google通訳',\n                'Web or images search. Web page screenshot. Media file download link, Google translate.',\n                '網站圖片檢索，任意網頁快照，谷歌翻譯，多媒體下載鏈接'\n            ],\n            description: [\n                '当前为Bate版，检索引擎只能选择Google，无翻译和多媒体下载链接功能',\n                'ベータバージョン、検索エンジンはGoogleオンリー、通訳とマルチメディアファイルダウンロードリンクはまだです',\n                'This is beta version, earch engine Google only, Google translate and media file download link coming soon.',\n                '當前為Bate版，檢索引擎只能選擇Google，無翻譯和多媒體下載連接功能'\n            ],\n            extra: [\n                '', '', '', ''\n            ],\n            \"active\": true\n        }, {\n            imgSrc: '',\n            headerText: [\n                'CoMSG', 'CoMSG', 'CoMSG', 'CoMSG'\n            ],\n            headerTextColor: '',\n            textColor: '',\n            meta: [\n                '点对点私密信息，支持多媒体及文件推送，会议室无上限设置',\n                'ポイントツーポイント暗号化メッセージ、マルチメディアとファイルの転送ができます、無制限のグループ会話',\n                'End to End encrypted message. Support for multimedia and all other type files, unlimit group message.',\n                '點對點私密信息，支持多媒體及文件推送，會議室無上限設置'\n            ],\n            description: [\n                '敬请期待', '準備中', 'Coming soon.', '敬請期待'\n            ],\n            extra: [\n                '', '', '', ''\n            ],\n            \"active\": false\n        }, {\n            imgSrc: '',\n            headerText: [\n                'CoBox', 'CoBox', 'CoBox', 'CoBox'\n            ],\n            headerTextColor: '',\n            textColor: '',\n            meta: [\n                '文件加密后打成碎片，分别存放到多个免费邮箱，高隐私无限量存储',\n                'ファイルを暗号化して破砕して、多数のフリーEmailにそれぞれを保存する強いプライバシーストレージ',\n                \"Encrypted and split a file to multiple parts, append to multiple email's draft. High privacy and security storage system.\",\n                '使用綑綁多個免費郵箱剩餘容量，存儲加密後打成碎片，高隱私無限量文件存儲'\n            ],\n            description: [\n                '敬请期待', '準備中', 'Coming soon.', '敬請期待'\n            ],\n            extra: [\n                '', '', '', ''\n            ],\n            \"active\": false\n        }\n    ]\n};\nconst appHtml = `<div id=\"CoSearch\"><!-- ko with: appScript --><div class=\"backGroundSetup\" data-bind=\" style: { background: searchItem() ? 'white' : '#B4E4ED' }\" style=\"height: 100em; \"><!-- ko if: showMain() --><div class=\"main\"><!-- ko if: showMainSearchForm() --><form class=\"ui form\" id=\"coSearchForm\" data-bind=\" style: { 'margin-top': showSearchSetupForm() ? '15em' : '25em' }, event: { 'submit': search_form }, submitBubble: false\" style=\"100%;\"><!-- ko if: !showSearchSetupForm() --><div class=\"field\"><div class=\"ui search\"><div class=\"ui input huge icon\" data-bind=\"css : { animationSearchInput: hasFocus, 'error': showSearchError(), 'loading disabled': showInputLoading }\" style=\"width: 100%;border-radius: 500rem;\"><input style=\"color:rgba(0,0,0,0.5); border-radius: 500rem; width: 100%;\" type=\"text\" data-bind=\"attr: { placeholder: showSearchError() ? ( messageBoxDefine [ errorMessageIndex() ][ $root.languageIndex() ]): infoDefine[ $root.languageIndex() ].coSearch.searchInputPlaceholder }, css : { backgroundTransparent: ! backGroundBlue ()}, textInput: searchInputText, hasFocus: hasFocus\"><!-- ko if: !showSearchError() -->\n<!-- ko if : !hasFocusShowTool() --><i class=\"icon link circular\" data-bind=\" html: searchSetupIcon (), click: searchSetupClick \" style=\"box-shadow: 0 0 0 0.1em ; color: #42c8f4!important;\"></i><!-- /ko -->\n<!-- ko if : hasFocusShowTool -->\n<!-- ko if: !searchInputText().length --><i class=\"icon image outline link circular\" data-bind=\" click: function (){ document.getElementById('imageInput1').click() }, style: { 'margin-top' : hasFocus ? '2px' : '0px' }\" style=\"box-shadow: 0 0 0 0.1em; color: #42c8f4!important;\"></i><input onchange=\"_view.appsManager().appScript().imageSearch( this )\" id=\"imageInput1\" type=\"file\" accept=\"image/gif,image/jpeg,image/jpg,image/png\" style=\"opacity:0\"><!-- /ko -->\n<!-- ko if: searchInputText().length --><i class=\"icon search link circular\" style=\"box-shadow: 0 0 0 0.1em; color: #4285f4!important;\" data-bind=\"click: search_form, css: { 'loadingGetResponse': loadingGetResponse, 'conetResponse': conetResponse } \"></i><!-- ko if : !showInputLoading() --><i class=\"icon language circular link\" style=\"box-shadow: 0 0 0 0.1em;color: #7742b9!important;margin-right: 2.5em\"></i><!-- /ko -->\n<!-- /ko -->\n<!-- /ko -->\n<!-- /ko -->\n<!-- ko if: showSearchError --><i class=\"icon link circular red close\" data-bind=\" click: searchInputCloseError \"></i><!-- /ko --></div></div></div><!-- /ko -->\n<!-- ko if: showSearchSetupForm() --><div class=\"SetupForm\" style=\"margin: 5em;\"><div class=\"ui link cards\"><div class=\"card AppCardTop\" data-bind=\" click: function( self, event ) { searchSetup ('g', self, event )} \" style=\" background: #ffffff82;\"><div class=\"content\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -70 270 180\">\n<path fill=\"#EA4335\" d=\"M115.75 47.18c0 12.77-9.99 22.18-22.25 22.18s-22.25-9.41-22.25-22.18C71.25 34.32 81.24 25 93.5 25s22.25 9.32 22.25 22.18zm-9.74 0c0-7.98-5.79-13.44-12.51-13.44S80.99 39.2 80.99 47.18c0 7.9 5.79 13.44 12.51 13.44s12.51-5.55 12.51-13.44z\"/>\n<path fill=\"#FBBC05\" d=\"M163.75 47.18c0 12.77-9.99 22.18-22.25 22.18s-22.25-9.41-22.25-22.18c0-12.85 9.99-22.18 22.25-22.18s22.25 9.32 22.25 22.18zm-9.74 0c0-7.98-5.79-13.44-12.51-13.44s-12.51 5.46-12.51 13.44c0 7.9 5.79 13.44 12.51 13.44s12.51-5.55 12.51-13.44z\"/>\n<path fill=\"#4285F4\" d=\"M209.75 26.34v39.82c0 16.38-9.66 23.07-21.08 23.07-10.75 0-17.22-7.19-19.66-13.07l8.48-3.53c1.51 3.61 5.21 7.87 11.17 7.87 7.31 0 11.84-4.51 11.84-13v-3.19h-.34c-2.18 2.69-6.38 5.04-11.68 5.04-11.09 0-21.25-9.66-21.25-22.09 0-12.52 10.16-22.26 21.25-22.26 5.29 0 9.49 2.35 11.68 4.96h.34v-3.61h9.25zm-8.56 20.92c0-7.81-5.21-13.52-11.84-13.52-6.72 0-12.35 5.71-12.35 13.52 0 7.73 5.63 13.36 12.35 13.36 6.63 0 11.84-5.63 11.84-13.36z\"/>\n<path fill=\"#34A853\" d=\"M225 3v65h-9.5V3h9.5z\"/>\n<path fill=\"#EA4335\" d=\"M262.02 54.48l7.56 5.04c-2.44 3.61-8.32 9.83-18.48 9.83-12.6 0-22.01-9.74-22.01-22.18 0-13.19 9.49-22.18 20.92-22.18 11.51 0 17.14 9.16 18.98 14.11l1.01 2.52-29.65 12.28c2.27 4.45 5.8 6.72 10.75 6.72 4.96 0 8.4-2.44 10.92-6.14zm-23.27-7.98l19.82-8.23c-1.09-2.77-4.37-4.7-8.23-4.7-4.95 0-11.84 4.37-11.59 12.93z\"/>\n<path fill=\"#4285F4\" d=\"M35.29 41.41V32H67c.31 1.64.47 3.58.47 5.68 0 7.06-1.93 15.79-8.15 22.01-6.05 6.3-13.78 9.66-24.02 9.66C16.32 69.35.36 53.89.36 34.91.36 15.93 16.32.47 35.3.47c10.5 0 17.98 4.12 23.6 9.49l-6.64 6.64c-4.03-3.78-9.49-6.72-16.97-6.72-13.86 0-24.7 11.17-24.7 25.03 0 13.86 10.84 25.03 24.7 25.03 8.99 0 14.11-3.61 17.39-6.89 2.66-2.66 4.41-6.46 5.1-11.65l-22.49.01z\"/>\n</svg></div></div><div class=\"card AppCardTop\" data-bind=\" click: function( self, event ) { searchSetup ('b', self, event )} \" style=\" background: #ffffff82;\"><div class=\"content\"><svg viewBox=\"0 -170 1000 600\">\n<g inkscape:label=\"Layer 1\" inkscape:groupmode=\"layer\" id=\"layer1\" transform=\"translate(312,-795.66903)\">\n<path style=\"fill:#008373;fill-opacity:1;stroke:none\" d=\"m -311.5,796.16903 80.6273,28.36401 0,283.80836 113.56729,-65.5599 -55.67962,-26.1246 -35.12739,-87.43067 178.939297,62.86452 0,91.39515 -201.653597,116.3102 -80.67328,-44.875 z\" />\n<g transform=\"matrix(8.653063,0,0,8.653063,-2616.6875,-11921.907)\" style=\"font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#008373;fill-opacity:1;stroke:none;font-family:Sans\" id=\"flowRoot3000\">\n<path d=\"m 313.01562,1507.0953 0,-28.0078 7.96875,0 c 2.42187,10e-5 4.34244,0.5925 5.76172,1.7774 1.41926,1.1849 2.12889,2.7279 2.12891,4.6289 -2e-5,1.5885 -0.42971,2.9688 -1.28906,4.1406 -0.85939,1.1719 -2.04429,2.0052 -3.55469,2.5 l 0,0.078 c 1.888,0.2214 3.39842,0.9343 4.53125,2.1387 1.13279,1.2044 1.6992,2.7702 1.69922,4.6973 -2e-5,2.3958 -0.8594,4.3359 -2.57813,5.8203 -1.71876,1.4844 -3.88673,2.2265 -6.5039,2.2265 z m 3.28125,-25.039 0,9.043 3.35938,0 c 1.79686,0 3.20962,-0.433 4.23828,-1.2989 1.02863,-0.8658 1.54295,-2.0865 1.54297,-3.6621 -2e-5,-2.7213 -1.79038,-4.082 -5.37109,-4.082 z m 0,11.9922 0,10.0781 4.45313,0 c 1.92707,0 3.42121,-0.4557 4.48242,-1.3672 1.06118,-0.9114 1.59178,-2.1614 1.5918,-3.75 -2e-5,-3.3073 -2.25262,-4.9609 -6.75781,-4.9609 z\" style=\"font-variant:normal;font-stretch:normal;fill:#008373;fill-opacity:1;stroke:none;font-family:Segoe UI;-inkscape-font-specification:Segoe UI\" id=\"path3009\" inkscape:connector-curvature=\"0\"/>\n<path d=\"m 336.08002,1482.6479 c -0.57292,0 -1.0612,-0.1953 -1.46484,-0.5859 -0.40365,-0.3906 -0.60547,-0.8854 -0.60547,-1.4844 0,-0.5989 0.20182,-1.097 0.60547,-1.4941 0.40364,-0.3971 0.89192,-0.5957 1.46484,-0.5957 0.58593,0 1.08398,0.1986 1.49414,0.5957 0.41015,0.3971 0.61523,0.8952 0.61524,1.4941 -10e-6,0.573 -0.20509,1.0612 -0.61524,1.4649 -0.41016,0.4036 -0.90821,0.6054 -1.49414,0.6054 z m 1.5625,24.4474 -3.20312,0 0,-19.8474 3.20312,0 z\" style=\"font-variant:normal;font-stretch:normal;fill:#008373;fill-opacity:1;stroke:none;font-family:Segoe UI;-inkscape-font-specification:Segoe UI\" id=\"path3011\" inkscape:connector-curvature=\"0\" sodipodi:nodetypes=\"ssssssccsccccc\"/>\n<path d=\"m 359.4053,1507.0953 -3.20313,0 0,-11.2601 c 0,-4.2448 -1.42999,-6.3672 -4.52893,-6.3672 -1.60158,0 -2.92644,0.6022 -3.97461,1.8066 -1.04819,1.2045 -1.57227,2.7247 -1.57227,4.5606 l 0,11.2601 -3.20312,0 0,-19.8473 3.20312,0 0,3.2522 0.0781,0 c 1.51041,-2.5261 3.6629,-3.7275 6.443,-3.7275 2.18748,0 3.86066,0.7064 5.01953,2.1191 1.15883,1.4128 1.73828,3.4538 1.73828,6.1231 z\" style=\"font-variant:normal;font-stretch:normal;fill:#008373;fill-opacity:1;stroke:none;font-family:Segoe UI;-inkscape-font-specification:Segoe UI\" id=\"path3013\" inkscape:connector-curvature=\"0\" sodipodi:nodetypes=\"ccsscsccccccscsc\"/>\n<path d=\"m 381.85178,1505.4046 c 0,7.3437 -3.51564,11.0156 -10.54688,11.0156 -2.47396,0 -4.51337,-0.4405 -6.36232,-1.378 l 0.84027,-2.7464 c 0,0 2.17127,1.4431 5.48299,1.4431 4.92186,0 7.38281,-2.5703 7.38281,-7.8046 l 0,-2.1654 -0.0781,0 c -1.52345,2.5521 -3.66907,3.7952 -6.72895,3.7952 -2.48699,0 -4.48894,-0.7493 -6.00586,-2.5266 -1.51693,-1.7774 -2.27539,-4.1634 -2.27539,-7.1582 0,-3.3984 0.81705,-6.1003 2.45117,-8.1055 1.63411,-2.0052 3.87044,-3.0078 6.70899,-3.0078 2.6953,0 4.54794,1.0807 5.85004,3.2422 l 0.0781,0 0,-2.7602 3.20313,0 z m -3.20313,-7.3522 0,-2.7899 c 0,-1.5886 -0.53712,-2.9492 -1.61132,-4.0821 -1.07424,-1.1328 -2.31919,-1.6992 -3.92074,-1.6992 -1.97917,0 -3.52865,0.7194 -4.64843,2.1582 -1.1198,1.4388 -1.6797,3.4538 -1.67969,6.0449 -1e-5,2.2266 0.5371,3.8479 1.61133,5.1825 1.07421,1.3347 2.49673,2.002 4.26758,2.002 1.79686,0 3.16551,-0.638 4.29182,-1.9141 1.12629,-1.276 1.68945,-2.9101 1.68945,-4.9023 z\" style=\"font-variant:normal;font-stretch:normal;fill:#008373;fill-opacity:1;stroke:none;font-family:Segoe UI;-inkscape-font-specification:Segoe UI\" id=\"path3015\" inkscape:connector-curvature=\"0\" sodipodi:nodetypes=\"ssccssccscsssccccssscssscscs\"/>\n</g>\n</g>\n</svg></div></div><div class=\"card AppCardTop\" data-bind=\" click: function( self, event ) { searchSetup ('y', self, event )} \" style=\" background: #ffffff82;\"><div class=\"content\"><svg xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" viewBox=\"0 -150 500 280\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n<defs>\n<radialGradient id=\"c\" gradientUnits=\"userSpaceOnUse\" cy=\"1680.7\" cx=\"1214.2\" gradientTransform=\"matrix(-1.223 -.23720 .15644 -.94671 2438.6 3564.7)\" r=\"22.495\">\n<stop stop-color=\"#6700e8\" offset=\"0\"/>\n<stop stop-color=\"#5c00ce\" offset=\".39936\"/>\n<stop stop-color=\"#5600bf\" stop-opacity=\".045045\" offset=\".70124\"/>\n<stop stop-color=\"#220047\" stop-opacity=\"0\" offset=\"1\"/>\n</radialGradient>\n<linearGradient id=\"j\" y2=\"1916\" gradientUnits=\"userSpaceOnUse\" x2=\"397.81\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1916\" x1=\"372.77\">\n<stop stop-color=\"#5500bd\" offset=\"0\"/>\n<stop stop-color=\"#5200b2\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"e\" y2=\"1704.2\" gradientUnits=\"userSpaceOnUse\" x2=\"1198.6\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1962.9\" x1=\"1161.2\">\n<stop stop-color=\"#47008d\" offset=\"0\"/>\n<stop stop-color=\"#5100b3\" offset=\"1\"/>\n</linearGradient>\n<radialGradient id=\"b\" gradientUnits=\"userSpaceOnUse\" cy=\"2013.9\" cx=\"1159.1\" gradientTransform=\"matrix(-.21925 .74474 -.78219 -.23028 1523.9 90.984)\" r=\"24.948\">\n<stop stop-color=\"#6000d8\" offset=\"0\"/>\n<stop stop-color=\"#5c00cd\" offset=\".20886\"/>\n<stop stop-color=\"#5500be\" offset=\".37415\"/>\n<stop stop-color=\"#2d0062\" offset=\"0.721\"/>\n<stop stop-color=\"#210045\" offset=\"1\"/>\n</radialGradient>\n<linearGradient id=\"g\" y2=\"1699.4\" xlink:href=\"#a\" gradientUnits=\"userSpaceOnUse\" x2=\"1020.9\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"2003.7\" x1=\"829.87\"/>\n<linearGradient id=\"a\">\n<stop stop-color=\"#1b0041\" offset=\"0\"/>\n<stop stop-color=\"#1b0041\" offset=\".10005\"/>\n<stop stop-color=\"#1b0041\" offset=\".20479\"/>\n<stop stop-color=\"#240052\" offset=\"0.3\"/>\n<stop stop-color=\"#32006a\" offset=\"0.4\"/>\n<stop stop-color=\"#3d007d\" offset=\".5\"/>\n<stop stop-color=\"#490098\" offset=\"0.6\"/>\n<stop stop-color=\"#4f00a8\" offset=\".70026\"/>\n<stop stop-color=\"#5500bc\" offset=\".80312\"/>\n<stop stop-color=\"#5700c2\" offset=\"0.9\"/>\n<stop stop-color=\"#6000da\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"f\" y2=\"1983.8\" gradientUnits=\"userSpaceOnUse\" x2=\"829.28\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1699.3\" x1=\"979.93\">\n<stop stop-color=\"#1e0046\" offset=\"0\"/>\n<stop stop-color=\"#2d0061\" offset=\".10005\"/>\n<stop stop-color=\"#33006b\" offset=\".20479\"/>\n<stop stop-color=\"#400082\" offset=\"0.3\"/>\n<stop stop-color=\"#490096\" offset=\"0.4\"/>\n<stop stop-color=\"#5000ac\" offset=\".5\"/>\n<stop stop-color=\"#5500bd\" offset=\"0.6\"/>\n<stop stop-color=\"#4f00a8\" offset=\".70026\"/>\n<stop stop-color=\"#5500bc\" offset=\".80312\"/>\n<stop stop-color=\"#5700c2\" offset=\"0.9\"/>\n<stop stop-color=\"#6000da\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"i\" y2=\"1725.7\" xlink:href=\"#a\" gradientUnits=\"userSpaceOnUse\" x2=\"664.27\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1978\" x1=\"462.79\"/>\n<linearGradient id=\"h\" y2=\"1962.4\" gradientUnits=\"userSpaceOnUse\" x2=\"471.28\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1725.4\" x1=\"632.18\">\n<stop stop-color=\"#1c0044\" offset=\"0\"/>\n<stop stop-color=\"#2f0065\" offset=\".10005\"/>\n<stop stop-color=\"#34006d\" offset=\".20479\"/>\n<stop stop-color=\"#3b007a\" offset=\"0.3\"/>\n<stop stop-color=\"#3c007a\" offset=\"0.4\"/>\n<stop stop-color=\"#490096\" offset=\".5\"/>\n<stop stop-color=\"#5000ab\" offset=\"0.6\"/>\n<stop stop-color=\"#5400ba\" offset=\".70026\"/>\n<stop stop-color=\"#5500bc\" offset=\".80312\"/>\n<stop stop-color=\"#5700c2\" offset=\"0.9\"/>\n<stop stop-color=\"#5c00ce\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"l\" y2=\"1856.8\" gradientUnits=\"userSpaceOnUse\" x2=\"372.85\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1856.8\" x1=\"163.23\">\n<stop stop-color=\"#6700e8\" offset=\"0\"/>\n<stop stop-color=\"#6700e8\" offset=\".5\"/>\n<stop stop-color=\"#6700e8\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"k\" y2=\"1999.1\" gradientUnits=\"userSpaceOnUse\" x2=\"373.36\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1999.1\" x1=\"347.46\">\n<stop stop-color=\"#3f008b\" offset=\"0\"/>\n<stop stop-color=\"#220050\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"n\" y2=\"1713.2\" gradientUnits=\"userSpaceOnUse\" x2=\"163.25\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1713.2\" x1=\"138.23\">\n<stop stop-color=\"#390080\" offset=\"0\"/>\n<stop stop-color=\"#31006e\" offset=\".5\"/>\n<stop stop-color=\"#250056\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"m\" y2=\"1838.2\" gradientUnits=\"userSpaceOnUse\" x2=\"187.85\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1838.2\" x1=\"162.66\">\n<stop stop-color=\"#5a00c9\" offset=\"0\"/>\n<stop stop-color=\"#4f00a8\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"q\" y2=\"1909.6\" gradientUnits=\"userSpaceOnUse\" x2=\"51.417\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1909.6\" x1=\"-103.64\">\n<stop stop-color=\"#6700e8\" offset=\"0\"/>\n<stop stop-color=\"#6700e8\" offset=\".50604\"/>\n<stop stop-color=\"#6700e8\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"s\" y2=\"1718.5\" gradientUnits=\"userSpaceOnUse\" x2=\"-26.132\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"2005.1\" x1=\"-169.29\">\n<stop stop-color=\"#4d00a1\" offset=\"0\"/>\n<stop stop-color=\"#5200b4\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"y\" y2=\"2047\" gradientUnits=\"userSpaceOnUse\" x2=\"-253.6\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1878.8\" x1=\"-253.6\">\n<stop stop-color=\"#210045\" offset=\"0\"/>\n<stop stop-color=\"#25004d\" offset=\".25\"/>\n<stop stop-color=\"#2b005c\" offset=\".5\"/>\n<stop stop-color=\"#340071\" offset=\".74854\"/>\n<stop stop-color=\"#3e0088\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"x\" y2=\"2047.3\" gradientUnits=\"userSpaceOnUse\" x2=\"-227.23\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1877.2\" x1=\"-248.82\">\n<stop stop-color=\"#5500bd\" offset=\"0\"/>\n<stop stop-color=\"#5300b5\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"w\" y2=\"1838.7\" gradientUnits=\"userSpaceOnUse\" x2=\"-273.09\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1850.7\" x1=\"-291.09\">\n<stop stop-color=\"#27005d\" stop-opacity=\".98039\" offset=\"0\"/>\n<stop stop-color=\"#2b005d\" offset=\".31767\"/>\n<stop stop-color=\"#280055\" offset=\".59756\"/>\n<stop stop-color=\"#24004d\" offset=\".80878\"/>\n<stop stop-color=\"#230049\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"v\" y2=\"1877.6\" gradientUnits=\"userSpaceOnUse\" x2=\"-250.33\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1669.7\" x1=\"-349.94\">\n<stop stop-color=\"#5100b2\" offset=\"0\"/>\n<stop stop-color=\"#5500bd\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"u\" y2=\"1877.2\" gradientUnits=\"userSpaceOnUse\" x2=\"-249.85\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1667.8\" x1=\"-149.7\">\n<stop stop-color=\"#5500bd\" offset=\"0\"/>\n<stop stop-color=\"#47008d\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"t\" y2=\"1819.8\" gradientUnits=\"userSpaceOnUse\" x2=\"-190.68\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1808.7\" x1=\"-209.43\">\n<stop stop-color=\"#1b0041\" offset=\"0\"/>\n<stop stop-color=\"#21004f\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"r\" y2=\"1759.1\" gradientUnits=\"userSpaceOnUse\" x2=\"-26.7\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"2007.7\" x1=\"-122.89\">\n<stop stop-color=\"#21004e\" offset=\"0\"/>\n<stop stop-color=\"#39007f\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"p\" y2=\"1938.5\" gradientUnits=\"userSpaceOnUse\" x2=\"63.199\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1945.5\" x1=\"44.989\">\n<stop stop-color=\"#2a005a\" offset=\"0\"/>\n<stop stop-color=\"#210046\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"o\" y2=\"2003.3\" gradientUnits=\"userSpaceOnUse\" x2=\"115.15\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1718.1\" x1=\"-24.637\">\n<stop stop-color=\"#5500bd\" offset=\"0\"/>\n<stop stop-color=\"#5000ac\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"d\" y2=\"1701.9\" gradientUnits=\"userSpaceOnUse\" y1=\"1962.2\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" x2=\"1225\" x1=\"1177.8\">\n<stop stop-color=\"#210045\" offset=\"0\"/>\n<stop stop-color=\"#430085\" offset=\".59416\"/>\n<stop stop-color=\"#5000b2\" offset=\"1\"/>\n</linearGradient>\n</defs>\n<g transform=\"translate(1009.8 -337.49)\">\n<g transform=\"matrix(.5 0 0 .5 -379.18 197.8)\">\n<g>\n<path d=\"m-272.82 284.69c7.6616 1.281 12.78 5.9708 12.78 14.045 0 2.6723-1.101 6.435-1.8373 9.6153-5.1337 22.63-25.182 102.59-33.623 155.96l-7.7668-7.7668 24.719-164.16z\" fill=\"url(#d)\"/>\n<path d=\"m-772.42 306.42c-10.347 2.4776-20.506 2.4096-30.493 0l15.856 16.466z\" fill=\"#6700e8\"/>\n<path d=\"m-930.94 306.42c10.347 2.4776 20.506 2.4096 30.493 0l-15.856 16.466z\" fill=\"#6700e8\"/>\n<path d=\"m-1020.4 306.36c23.383 59.178 60.182 148.75 78.517 182.98l-27.144-8.2945-67.165-167.97z\" fill=\"url(#o)\"/>\n<path d=\"m-1041.7 306.35c7.4678 2.5018 13.662 2.6552 21.264 0l-15.113 9.2837z\" fill=\"#6700e8\"/>\n<path d=\"m-1031 312.81 68.439 167.85c-4.0492 4.3854-5.855 6.6864-9.792 8.7379-19.836-51.091-41.139-102.2-59.186-152.63l-8.9087-15.103z\" fill=\"url(#p)\"/>\n<path d=\"m-1089.8 489.33-20.204-7.1558 71.141-166.91 7.9282-2.4512v24.711c-11.062 31.919-39.135 101.95-58.866 151.81z\" fill=\"url(#r)\"/>\n<path d=\"m-1106.6 282.03 6.7084 15.246 17.076-7.9282 6.9443-7.3183c-10.985 2.4918-20.893 2.5746-30.729 0z\" fill=\"#6700e8\"/>\n<path d=\"m-1154.8 414.97-11.587 4.269-7.3183-12.807 72.573-115.87 5.1886-1.7772c7.1618-1.6184 14.973-3.354 20.061-6.7608-11.525 15.569-53.493 88.344-78.917 132.95z\" fill=\"url(#t)\"/>\n<path d=\"m-1170.6 413.15 3.0493-3.0493 71.795-121.34-10.809-6.7347c-8.6682 16.146-40.638 68.392-60.986 101.85l-9.7578 18.296z\" fill=\"url(#u)\"/>\n<path d=\"m-1228.5 282.03c15.916 28.207 40.349 67.667 60.986 101.85v26.224l-4.8789 4.8789-71.354-126.85z\" fill=\"url(#v)\"/>\n<path d=\"m-1240.3 289.7 11.761-7.6717c-12.62 2.6914-17.899 2.8627-30.493 0l4.8789 5.4887z\" fill=\"#6700e8\"/>\n<path d=\"m-1167.6 410.1-5.4887 7.9282-7.3184-3.0493c-13.625-23.55-53.678-95.287-78.672-132.95 5.0665 3.6714 11.911 5.686 19.817 6.9699z\" fill=\"url(#w)\"/>\n<path fill=\"url(#x)\" d=\"m-1152.9 513.16-20.735-9.7578 1.8296-86.6 4.269-6.7085 12.807 4.8789z\"/>\n<path d=\"m-1167.6 506.45-14.637 6.7085 1.8295-98.187 12.807-4.8789z\" fill=\"url(#y)\"/>\n<path d=\"m-1120 489.38c25.444-51.864 53.737-121.41 78.294-183.04l10.746 6.4742-69.462 169.92-14.089 4.8122z\" fill=\"url(#s)\"/>\n<path d=\"m-963.25 480.35 21.352 8.9925c-8.1908-2.0649-19.278-2.8566-30.42 0.0524l4.1688-10.267z\" fill=\"#200045\"/>\n<path d=\"m-1078.5 429.38 15.012-6.4416c21.625 0.76013 43.249 0.74922 64.874 0l15.228 6.6302-14.177 3.0996h-70.184z\" fill=\"url(#q)\"/>\n<path d=\"m-1068.5 435.71-10.08-6.3338c31.673-0.48441 63.394-0.44495 95.168 0.18863l-10.08 6.1451c-25.003-0.8102-50.005-0.71317-75.008 0z\" fill=\"#200045\"/>\n<path d=\"m-900.44 489.38-21.345-7.3183v-164.05l6.0986-3.0493 15.246-8.538c-3.1637 60.878-3.233 121.86 0 182.96z\" fill=\"url(#m)\"/>\n<path d=\"m-915.69 480.84v4.269l-15.247 4.269c2.4244-60.889 2.6556-121.87 0-182.96l15.247 8.538z\" fill=\"url(#n)\"/>\n<path d=\"m-802.92 489.38 21.345-7.3183v-164.05l-6.0986-3.0493-15.247-8.538c3.1637 60.878 3.233 121.86 0 182.96z\" fill=\"url(#k)\"/>\n<path d=\"m-915.63 397.52 12.816-5.7139c34.057 0.85838 68.155 0.79423 102.28 0l12.856 5.7139-15.902 3.8002h-99.346z\" fill=\"url(#l)\"/>\n</g>\n<path fill=\"url(#h)\" d=\"m-664.79 306.35c-59.895 0-89.783 37.447-89.783 91.898 0 68.197 45.237 91.822 89.001 91.822 51.983 0 89.249-29.249 89.249-91.65 0-60.057-35.275-92.07-88.468-92.07zm-1.7915 8.6905c0.56294-0.0116 1.1312 0 1.6962 0 39.558 0 68.609 26.944 68.609 83.246 0 56.231-29.013 83.17-68.533 83.17-43.12 0-68.457-30.899-68.457-83.017 0-58.944 31.219-82.672 66.684-83.398z\"/>\n<path d=\"m-665 303.95c-64.688 0-98.626 41.016-98.626 94.185 0 58.196 37.05 93.69 98.531 93.69 66.468 0 98.931-40.001 98.931-93.08 0-59.18-38.768-94.795-98.835-94.795zm0.19058 6.0605c51.075 0 84.942 30.726 84.942 88.392 0 59.917-35.791 88.01-85.704 88.01-42.022 0-85.457-22.681-85.457-88.163 0-52.283 28.708-88.239 86.219-88.239z\" fill=\"url(#i)\"/>\n<path fill=\"url(#f)\" d=\"m-441.28 296.99c-60.789 0-102.44 34.367-102.44 101.35 0 65.71 38.747 102.42 102.69 102.42 48.426 0 101.48-24.872 101.48-101.48 0-82.684-57.955-102.28-101.73-102.28zm-0.32402 7.3183c48.376 0 84.008 29.388 84.008 94.204 0 70.459-43.103 93.309-83.932 93.309-43.622 0-83.36-25.6-83.36-94.7 0-71.621 44.046-92.813 83.284-92.813z\"/>\n<path fill=\"url(#g)\" d=\"m-441.68 292.93c-64.42 0-113.66 36.579-113.66 104.59 0 56.035 32.755 105.35 114.2 105.35 68.949 0 113.97-37.907 113.97-104.36 0-62.667-41.996-105.58-114.5-105.58zm0.40025 6.8228c42.587 0 98.969 19.086 98.969 99.522 0 74.529-51.631 98.721-98.74 98.721-62.2 0-99.884-35.712-99.884-99.636 0-65.163 40.519-98.607 99.655-98.607z\"/>\n<path d=\"m-322.2 499.84c0-7.8687 4.7851-15.186 14.378-15.186 9.1817 0 16.052 5.4912 16.052 14.262 0 10.928-7.2317 14.955-13.858 14.955-9.1617 0-16.572-4.7539-16.572-14.031z\" fill=\"url(#b)\"/>\n<path d=\"m-306.88 462.57c7.4355-52.557 11.958-107.79 16.301-162.87 0-10.977 7.2554-15.27 14.576-15.27 1.283 0 3.1753 0.2673 3.1753 0.2673l-1.9912 13.166-26.08 163.25z\" fill=\"url(#e)\"/>\n<g fill=\"#200045\">\n<path d=\"m-1182.2 513.16 14.664-10.743 14.609 10.743s-8.0987-1.4737-14.61-1.4737c-5.8748 0-14.664 1.4737-14.664 1.4737z\"/>\n<path d=\"m-1120 489.4 20.456-8.8436c3.1211 3.742 5.8977 6.913 9.7311 8.7897-7.3639-1.9927-18.512-2.8867-30.184 0.0311z\"/>\n<path d=\"m-930.94 489.38c9.903-2.3864 20.044-2.492 30.455 0l-15.208-8.538z\"/>\n<path d=\"m-902.81 404.29-12.843-6.765c42.66 0.44483 85.32 0.5196 127.98 0l-12.826 6.725c-34.104-0.45812-68.208-0.43623-102.31 0.0402z\"/>\n</g>\n<g>\n<path d=\"m-787.67 480.84v4.269l15.246 4.269c-2.4244-60.889-2.6556-121.87 0-182.96l-15.246 8.538z\" fill=\"url(#j)\"/>\n<path d=\"m-772.42 489.38c-9.903-2.3864-20.044-2.492-30.455 0l15.208-8.538z\" fill=\"#200045\"/>\n<path d=\"m-300.16 456.4-6.7572 6.1652c4.5277-0.79745 8.0291 0.38427 11.432 1.7557z\" fill=\"#200045\"/>\n<ellipse fill-rule=\"evenodd\" rx=\"22.495\" transform=\"matrix(.66068 0 0 .60986 -1078 -734.79)\" ry=\"21.29\" cy=\"1693.1\" cx=\"1215\" fill=\"url(#c)\"/>\n</g>\n</g>\n</g>\n</svg></div></div><div class=\"card AppCardTop\" data-bind=\" click: function( self, event ) { searchSetup ('d', self, event)} \" style=\" background: #ffffff82;\"><div class=\"content\"><svg viewBox=\"0 0 207.70001 163.80001\" xmlns=\"http://www.w3.org/2000/svg\">\n<g transform=\"translate(-24.5 -19)\">\n<circle cx=\"127\" cy=\"79\" fill=\"#de5833\" r=\"60\"/>\n<path d=\"m177.8 57.5c-2.8-6.6-6.8-12.5-11.8-17.5-5.1-5.1-11-9-17.5-11.8-6.8-2.9-14-4.3-21.5-4.3-7.4 0-14.7 1.5-21.5 4.3-6.6 2.7-12.5 6.7-17.5 11.8-5.1 5.1-9 11-11.8 17.5-2.9 6.8-4.3 14-4.3 21.5 0 7.5 1.5 14.7 4.3 21.5 2.8 6.6 6.8 12.5 11.8 17.5 5.1 5.1 11 9 17.5 11.8 6.8 2.9 14 4.3 21.5 4.3 7.4 0 14.7-1.5 21.5-4.3 6.5-2.8 12.4-6.8 17.5-11.8 5.1-5.1 9-11 11.8-17.5 2.9-6.8 4.3-14 4.3-21.5 0-7.5-1.4-14.7-4.3-21.5zm-38.8 71c-3.2-5.4-11.6-20.5-11.6-31.7 0-25.8 17.3-3.7 17.3-24.3 0-4.9-2.4-22.1-17.4-25.7-3.7-4.9-12.4-9.6-26.2-7.7 0 0 2.3.7 4.9 2 0 0-5 .7-5.2 4.1 0 0 9.9-.5 15.5 1.3-12.9 1.7-19.5 8.5-18.3 20.8 1.7 17.5 9.1 48.7 11.7 59.6-19.6-7-33.7-25.8-33.7-47.9 0-28.1 22.8-51 51-51 28.2 0 51 22.8 51 51-.1 24-16.7 44.1-39 49.5z\" fill=\"#fff\"/>\n<path clip-rule=\"evenodd\" d=\"m124.2 87.3c0-6.6 9-8.7 12.4-8.7 9.2 0 22.2-5.9 25.4-5.8 3.3.1 5.4 1.4 5.4 2.9 0 2.2-18.4 10.5-25.5 9.8-6.8-.6-8.4.1-8.4 2.9 0 2.4 4.9 4.6 10.3 4.6 8.1 0 16-3.6 18.4-1.9 2.1 1.5-5.5 6.9-14.2 6.9-8.7 0-23.8-4.1-23.8-10.7z\" fill=\"#fed30a\" fill-rule=\"evenodd\"/>\n<path d=\"m140.2 59.3c-2.4-3.1-6.7-3.2-8.2.4 2.3-1.8 5.1-2.2 8.2-.4z\" fill=\"#2d4f8d\"/>\n<path d=\"m113.5 59.4c-3.3-2-8.8-2.2-8.5 4.1 1.6-3.9 3.8-4.6 8.5-4.1z\" fill=\"#2d4f8d\"/>\n<path d=\"m138.2 65.2c-1.8 0-3.3 1.5-3.3 3.3 0 1.8 1.5 3.3 3.3 3.3 1.8 0 3.3-1.5 3.3-3.3 0-1.8-1.5-3.3-3.3-3.3zm1.2 3.1c-.5 0-1-.4-1-1 0-.5.4-1 1-1 .6 0 1 .4 1 1-.1.5-.5 1-1 1z\" fill=\"#2d4f8d\"/>\n<path d=\"m112.6 67c-2.1 0-3.8 1.7-3.8 3.8 0 2.1 1.7 3.8 3.8 3.8 2.1 0 3.8-1.7 3.8-3.8 0-2.1-1.7-3.8-3.8-3.8zm1.4 3.5c-.6 0-1.1-.5-1.1-1.1 0-.6.5-1.1 1.1-1.1.6 0 1.1.5 1.1 1.1 0 .6-.5 1.1-1.1 1.1z\" fill=\"#2d4f8d\"/>\n<path d=\"m104.3 50.8c-4.8 3.5-7 8.9-6.3 16.5 1.7 17.5 9.1 48.8 11.7 59.7.9.3 1.8.6 2.7.9-1.6-6.6-9.3-38.8-12.7-63.5-.9-6.6 1.7-10.5 4.6-13.6z\" fill=\"#d5d7d8\"/>\n<path d=\"m116.2 46.5c.4 0 .7-.1.7-.1-5.2-2.5-13.4-2.6-15.6-2.6-.2.4-.4.9-.4 1.4-.1.1 9.6-.5 15.3 1.3z\" fill=\"#d5d7d8\"/>\n<path d=\"m106.8 41.1c-1.6-1.1-2.9-1.8-3.7-2.2-.7.1-1.3.1-2 .2 0 0 2.3.7 4.9 2 0 0-.1 0-.2 0 .7 0 1 0 1 0z\" fill=\"#d5d7d8\"/>\n<path d=\"m147.1 107.6c-1.7-.4-8.3 4.3-10.8 6.1-.1-.5-.2-.9-.3-1.1-.3-1-6.7-.4-8.2 1.2-4-1.9-12-5.6-12.1-3.3-.3 3 0 15.5 1.6 16.4 1.2.7 8-3 11.4-4.9 0 0 0 0 .1 0 2.1.5 6 0 7.4-.9.2-.1.3-.3.4-.5 3.1 1.2 9.8 3.6 11.2 3.1 1.8-.5 1.4-15.6-.7-16.1z\" fill=\"#67bd47\"/>\n<path d=\"m128.8 122c-2.1-.4-1.4-2.5-1.4-7.4 0 0 0 0 0 0-.5.3-.9.7-.9 1.1 0 4.9-.8 7.1 1.4 7.4 2.1.5 6 0 7.6-.9.3-.2.4-.5.5-1-1.5.9-5.2 1.3-7.2.8z\" fill=\"#43a347\"/>\n<path d=\"m24.5 180.6v-24.6h8.9c8.5 0 12.4 6.2 12.4 12 0 6.3-3.8 12.6-12.4 12.6zm2.8-2.9h6.1c6.6 0 9.5-4.9 9.5-9.8 0-4.5-3-9.3-9.5-9.3h-6.1z\" fill=\"#4c4c4c\"/>\n<path d=\"m57 180.9c-4.6 0-7.5-3.1-7.5-8v-9.6h2.7v9.5c0 3.5 2 5.6 5.4 5.6 3.2 0 5.5-2.5 5.5-5.8v-9.3h2.7v17.3h-2.4l-.2-3-.4.5c-1.5 1.8-3.4 2.7-5.8 2.8z\" fill=\"#4c4c4c\"/>\n<path d=\"m78.7 180.9c-4.5 0-9-2.8-9-8.9 0-5.4 3.6-8.9 9-8.9 2.4 0 4.4.8 6.2 2.5l-1.7 1.7c-1.2-1.1-2.8-1.7-4.4-1.7-3.8 0-6.4 2.6-6.4 6.4 0 4.4 3.2 6.4 6.4 6.4 1.8 0 3.4-.6 4.6-1.8l1.7 1.7c-1.8 1.7-4 2.6-6.4 2.6z\" fill=\"#4c4c4c\"/>\n<polygon fill=\"#4c4c4c\" points=\"91.1 180.6 88.5 180.6 88.5 156 91.1 156 91.1 170.9 98.5 163.3 102 163.3 93.8 171.4 103 180.5 103 180.6 99.6 180.6 91.1 172.1\"/>\n<path d=\"m106.2 180.6v-24.6h8.9c8.5 0 12.4 6.2 12.4 12 0 6.3-3.8 12.6-12.4 12.6zm2.9-2.9h6.1c6.6 0 9.5-4.9 9.5-9.8 0-4.5-3-9.3-9.5-9.3h-6.1z\" fill=\"#4c4c4c\"/>\n<path d=\"m138.7 180.9c-4.6 0-7.5-3.1-7.5-8v-9.6h2.7v9.5c0 3.5 2 5.6 5.4 5.6 3.2 0 5.5-2.5 5.5-5.8v-9.3h2.7v17.3h-2.4l-.1-3-.4.5c-1.5 1.8-3.5 2.7-5.9 2.8z\" fill=\"#4c4c4c\"/>\n<path d=\"m160.4 180.9c-4.5 0-9-2.8-9-8.9 0-5.4 3.6-8.9 9-8.9 2.4 0 4.4.8 6.2 2.5l-1.7 1.7c-1.2-1.1-2.8-1.7-4.4-1.7-3.8 0-6.4 2.6-6.4 6.4 0 4.4 3.2 6.4 6.4 6.4 1.8 0 3.4-.6 4.6-1.8l1.7 1.7-.1.1v0c-1.7 1.7-3.8 2.5-6.3 2.5z\" fill=\"#4c4c4c\"/>\n<polygon fill=\"#4c4c4c\" points=\"172.9 180.6 170.3 180.6 170.3 156 172.9 156 172.9 170.9 180.3 163.3 183.7 163.3 175.6 171.4 184.7 180.5 184.7 180.6 181.3 180.6 172.9 172.1\"/>\n<path d=\"m198.6 181c-9.5 0-12.8-6.8-12.8-12.5 0-3.8 1.3-7.1 3.6-9.5 2.3-2.3 5.5-3.5 9.2-3.5 3.4 0 6.5 1.3 8.9 3.6l-1.6 1.9c-1.9-1.8-4.7-2.9-7.3-2.9-6.9 0-10 5.4-10 10.4 0 4.9 3.1 9.9 10.1 9.9 2.5 0 4.9-.9 6.8-2.5l.1-.1v-6.1h-7.7v-2.5h10.3v9.6c-2.7 2.9-5.8 4.2-9.6 4.2z\" fill=\"#4c4c4c\"/>\n<path d=\"m220.4 180.9c-5.2 0-8.9-3.7-8.9-8.9 0-5.2 3.8-9.1 8.9-9.1 5.3 0 9 3.7 9 9.1-.1 5.1-3.8 8.9-9 8.9zm0-15.6c-3.7 0-6.3 2.7-6.3 6.6 0 3.7 2.6 6.4 6.3 6.4 3.7 0 6.3-2.6 6.4-6.4-.1-3.8-2.7-6.6-6.4-6.6z\" fill=\"#4c4c4c\"/>\n<path d=\"m230.9 181.2v0c .2-.1.3-.2.3-.4 0-.2-.1-.3-.2-.4-.1-.1-.3-.1-.6-.1-.3 0-.5 0-.6.1v1.6h.4v-.7h.2c.2 0 .3.1.3.3.1.2.1.3.1.4h.4c0-.1-.1-.2-.1-.4 0-.2-.1-.3-.2-.4zm-.5-.1h-.2v-.5c0 0 .1 0 .2 0 .2 0 .3.1.3.2.1.2 0 .3-.3.3z\" fill=\"#4c4c4c\"/>\n<path d=\"m230.5 179.5c-.9 0-1.7.7-1.7 1.6 0 .9.7 1.7 1.7 1.7.9 0 1.7-.7 1.7-1.7 0-.9-.7-1.6-1.7-1.6zm0 3c-.7 0-1.3-.6-1.3-1.3 0-.7.5-1.3 1.3-1.3.7 0 1.3.6 1.3 1.3 0 .7-.6 1.3-1.3 1.3z\" fill=\"#4c4c4c\"/>\n</g>\n</svg></div></div></div></div><!-- /ko --></form><!-- /ko -->\n<!-- ko if: searchItem() --><div class=\"listItems\" style=\"margin:1em;\"><div class=\"ui top fixed menu borderless\"><div class=\"item\" style=\"width: 90%;\"><form class=\"ui form\" data-bind=\"event: { 'submit': search_form }\" style=\"width: 100%;\"><div class=\"field\"><div class=\"ui search\"><div class=\"ui input icon\" data-bind=\"css : { 'error': showSearchError(), 'loading disabled': showInputLoading }\"><input style=\"color:rgba(0,0,0,0.5);border-radius: 500rem!important;\" type=\"text\" data-bind=\" textInput: searchInputText, hasFocus: SearchInputNextHasFocus, attr: { placeholder: showSearchError() ? ( messageBoxDefine [ errorMessageIndex() ][ $root.languageIndex() ]): infoDefine[ $root.languageIndex() ].coSearch.searchInputPlaceholder }\"><!-- ko if: searchInputText().length --><i class=\"icon circular search link icon\" data-bind=\"click: search_form\" style=\"color: #4285f4!important;\"></i><!-- /ko -->\n<!-- ko if: !searchInputText().length --><i class=\"icon image outline link circular\" data-bind=\" click: function (){ document.getElementById('imageInput1').click() } \" style=\"color: #4285f4!important;\"></i><div class=\"hideInput\" style=\"position: absolute;\"><input onchange=\"_view.appsManager().appScript().imageSearch( this )\" id=\"imageInput1\" type=\"file\" accept=\"image/gif,image/jpeg,image/jpg,image/png\" style=\"opacity:0;width: 0px;height: 0px;\"></div><!-- /ko -->\n<!-- ko if: showSearchError --><i class=\"icon link circular red close\" data-bind=\" click: searchInputCloseError \"></i><!-- /ko --></div></div></div><!-- ko if: searchItem().action --><div class=\"field\" style=\"margin-left: 1em;\"><!-- ko if: currentlyShowItems() !== 0 --><a class=\"basic ui label yellow small\" data-bind=\" click: webItemsClick \" style=\"padding-right: 1em;\"><i class=\"icon rss\"></i><span data-bind=\"text: info.searchToolBarMenu[0][ $root.languageIndex() ] \"></span></a><!-- /ko -->\n<!-- ko if: searchItem().action.news && currentlyShowItems() !== 1 --><a class=\"basic ui label small\" style=\"padding-right: 1em;\" data-bind=\" click: newsButtonClick , style: {  cursor: newsButtonShowLoading() ? 'unset' : 'pointer' }, css: { 'disabled': newsButtonShowLoading(), 'olive': newsItemsArray() &amp;&amp; !newsButtonShowLoading(), 'grey': !newsItemsArray() &amp;&amp; !newsButtonShowError(), 'red': newsButtonShowError() }\"><!-- ko if: newsButtonShowError --><i class=\"icon info red\"></i><span data-bind=\" text: messageBoxDefine[ newsButtonErrorIndex()][ $root.languageIndex() ] \"></span><!-- /ko -->\n<!-- ko ifnot: newsButtonShowError -->\n<!-- ko ifnot: newsButtonShowLoading --><i class=\"icon newspaper outline\"></i><!-- /ko -->\n<!-- ko if: newsButtonShowLoading --><i class=\"icon notched circle loading\" data-bind=\" css: { 'loadingGetResponse': newsLoadingGetResponse, 'conetResponse': newsConetResponse }\"></i><!-- /ko --><span data-bind=\"text: info.searchToolBarMenu[1][ $root.languageIndex() ] \"></span><!-- /ko --></a><!-- /ko -->\n<!-- ko if: searchItem().action.image && currentlyShowItems() !== 2 --><a class=\"basic ui label small\" data-bind=\"click: imageButtonClick, style: {  cursor: imageButtonShowLoading() ? 'unset' : 'pointer' }, css: { teal: imageItemsArray() &amp;&amp; !imageButtonShowLoading(), grey: !imageItemsArray() &amp;&amp; !imageButtonShowError(), red: imageButtonShowError() }\" style=\"padding-right: 1em;\"><!-- ko if: imageButtonShowError() --><i class=\"icon info red\"></i><span data-bind=\" text: messageBoxDefine [ imageButtonErrorIndex()][ $root.languageIndex() ] \"></span><!-- /ko -->\n<!-- ko ifnot: imageButtonShowError() -->\n<!-- ko if: !imageButtonShowLoading() --><i class=\"icon image outline\"></i><!-- /ko -->\n<!-- ko if: imageButtonShowLoading() --><i class=\"icon notched circle loading\" data-bind=\" css: { 'loadingGetResponse': imageLoadingGetResponse, 'conetResponse': imageConetResponse }\"></i><!-- /ko -->\n<!-- /ko --><span data-bind=\"text: info.searchToolBarMenu[2][ $root.languageIndex() ] \"></span></a><!-- /ko -->\n<!-- ko if: searchItem().action.video && currentlyShowItems() !== 3 --><a class=\"basic ui label blue small\" data-bind=\"click: videoButtonClick,style: {  cursor: videoButtonShowLoading() ? 'unset' : 'pointer' }, css: { blue: videoItemsArray() &amp;&amp; !videoButtonShowLoading(), grey: !videoItemsArray() &amp;&amp; !videoButtonShowError(), red: videoButtonShowError() }\" style=\"padding-right: 1em;\"><!-- ko if: videoButtonShowError() --><i class=\"icon info red\"></i><span data-bind=\" text: messageBoxDefine [ videoButtonErrorIndex()] [ $root.languageIndex() ]\"></span><!-- /ko -->\n<!-- ko ifnot: videoButtonShowError() -->\n<!-- ko if: !videoButtonShowLoading() --><i class=\"icon video\"></i><!-- /ko -->\n<!-- ko if: videoButtonShowLoading() --><i class=\"icon notched circle loading\"></i><!-- /ko -->\n<!-- /ko --><span data-bind=\"text: info.searchToolBarMenu[3][ $root.languageIndex() ]  \"></span></a><!-- /ko --></div><!-- /ko -->\n<!-- ko if: !searchItem()['originImage'] && showSearchesRelated() --><div class=\"field\" style=\"margin-left: 1em;\"><div class=\"ui grey header\" data-bind=\"text: infoDefine[ $root.languageIndex() ].coSearch.SearchesRelated[0] + searchInputTextShow() + infoDefine[ $root.languageIndex() ].coSearch.SearchesRelated[1]\" style=\"margin-bottom: 1em;\"></div><div class=\"related ui grid\" style=\"padding-bottom: 1em;\"><!-- ko foreach: searchItem().searchesRelated --><a class=\"five wide column\" href=\"#\" data-bind=\"text: text, click: function () { $parents[0].searchesRelatedSelect ( $parents[0], $index())}\" style=\"padding-top: 0.2rem;padding-bottom: 0.2rem;\"></a><!-- /ko --></div></div><!-- /ko --></form></div></div><div class=\"items\" data-bind=\" style: { 'margin-top': showSearchesRelated() &amp;&amp; !searchItem()['originImage'] ? '15.5em' : '7.5em', 'padding-top': showSearchesRelated() &amp;&amp; !searchItem()['originImage'] ? '1em': '1em' }, click: function () { showSearchesRelated ( false ); return true;}\"><div class=\"AppList CoContent content\"><div class=\"ui items searchItems\"><div class=\"totalResults ui grey header\"><div class=\"sub header\"><span class=\"totalResults1\" data-bind=\" text: info.totalResults[ $root.languageIndex() ]\"></span><span class=\"totalResults2\" data-bind=\" text: searchItem().totalResults\" style=\"margin: 0.5em;\"></span><span class=\"totalResults3\" data-bind=\" text: info.totalResults1[ $root.languageIndex() ]\"></span></div></div><!-- ko if: searchItem()['originImage'] --><div class=\"imageResultInfo item\"><!-- ko with: searchItem()['originImage'] --><div class=\"image\"><img data-bind=\" attr: { src: img }\"></div><div class=\"content\"><div class=\"meta\" data-bind=\" text: infoDefine[ $root.languageIndex() ].coSearch.imageSize \"></div><div class=\"description\" data-bind=\" text: size\" style=\"color: gray;\"></div><div class=\"meta\"><!-- ko ifnot: $parents[0].imageButtonShowError --><div class=\"notSimilarImagesShowError\"><!-- ko if: $parents[0].imageButtonShowLoading --><i class=\"icon notched circle loading\" data-bind=\" css: { 'loadingGetResponse': $parents[0].imageLoadingGetResponse, 'conetResponse': $parents[0].imageConetResponse }\"></i><!-- /ko -->\n<!-- ko if: $parents[0].imageItemsArray() && $parents[0].imageItemsArray().Result --><i class=\"icon file image outline orange link\" data-bind=\"click: function () { $parents[0].imageButtonClick ( $parents[0] )}\"></i><!-- /ko --><a class=\"ui\" data-bind=\"style: { 'color': $parents[0].imageItemsArray() &amp;&amp; $parents[0].imageItemsArray().Result ? '#f2711c': '#4183c4'}, text: infoDefine[ $root.languageIndex() ].coSearch.similarImages, click: function () { $parents[0].imageButtonClick( $parents[0] )}\"></a></div><!-- /ko -->\n<!-- ko if: $parents[0].imageButtonShowError --><span><i class=\"icon info circle red link\" data-bind=\"click: function () { $parents[0].imageButtonClick( $parents[0] )}\"></i><a class=\"ui\" data-bind=\"text: messageBoxDefine [ $parents[0].imageButtonErrorIndex()][ $root.languageIndex() ], click: function () { $parents[0].imageButtonClick( $parents[0] )} \" style=\"color: #990000a8!important;\"></a></span><!-- /ko --></div></div><!-- /ko --></div><!-- /ko --><div class=\"space\"></div><div class=\"space\"></div><!-- ko foreach: searchItemList --><div class=\"item\"><!-- ko if: imageInfo && imageInfo['img'] --><div class=\"image ui top aligned\" data-bind=\"style: { height: imageInfo['videoTime'] ? '90px' : 'auto' }\" style=\" width:150px \"><img data-bind=\"attr: { src: imageInfo.img }\"><!-- ko if: imageInfo['videoTime'] --><div class=\"ui bottom right attached label tiny\" data-bind=\"text: imageInfo['videoTime'] \" style=\" background-color: #3130307a!important;; color: rgba(255, 252, 252, 0.77)!important;;\"></div><!-- /ko --></div><!-- /ko --><div class=\"content\"><div class=\"header\"><a data-bind=\"text: title, attr: { href: url } \" style=\"font-weight: normal;font-size: medium;\" target=\"_blank\"></a></div><!-- ko ifnot: newsBrand --><div class=\"meta\" style=\"margin:unset;\"><span><!-- ko if: !showLoading() && ! snapshotReady() && !showError() --><i class=\"icon object group grey link\" data-bind=\"click: function() { $parents[0].getSnapshotClick( $parents[0], $index ())}\"></i><!-- /ko -->\n<!-- ko if: showLoading --><i class=\"icon notched circle loading\" data-bind=\"css: { 'loadingGetResponse': loadingGetResponse, 'conetResponse': conetResponse }\"></i><!-- /ko -->\n<!-- ko if: snapshotReady --><i class=\"icon file image outline olive link\" data-bind=\"click: function() { $parents[0].showSnapshotClick( $parents[0], $index())}\"></i><!-- /ko -->\n<!-- ko if: showError --><i class=\"icon info circle red link\" data-bind=\"attr: { id: id, 'data-content': messageBoxDefine [ errorIndex()] [ $root.languageIndex() ]}\"></i><!-- /ko --></span><span data-bind=\"text: urlShow, style: { color: snapshotReady() ? 'orange' : ( showError() ? 'red' : 'green') } \" style=\"margin-top: 0.5em; margin-bottom: 0.5em; font-size: small;\"></span></div><!-- /ko --><div class=\"description\" style=\" color: grey; \"><!-- ko if: newsBrand --><p><span><!-- ko if: !showLoading() && ! snapshotReady() && !showError() --><a class=\"ui image mini\" data-bind=\"click: function() { $parents[0].getSnapshotClick( $parents[0], $index ())}\" href=\"#\"><img data-bind=\"attr: { src: newsBrandImg }\"></a><!-- /ko -->\n<!-- ko if: showLoading --><i class=\"icon notched circle loading\" data-bind=\"css: { 'loadingGetResponse': loadingGetResponse, 'conetResponse': conetResponse }\"></i><!-- /ko -->\n<!-- ko if: snapshotReady --><i class=\"icon file image outline olive link\" data-bind=\"click: function() { $parents[0].showSnapshotClick( $parents[0], $index())}\"></i><!-- /ko -->\n<!-- ko if: showError --><i class=\"icon info circle red link\" data-bind=\"attr: { id: id, 'data-content': messageBoxDefine [ errorIndex()] [ $root.languageIndex()]}\"></i><!-- /ko --></span><span data-bind=\" text: newsBrand \" style=\"font-weight: bolder; color: #906363db;\"></span><!-- ko if: beforeTime -->\n<!-- ko with: beforeTime -->\n<!-- ko if: timeNumber --><span data-bind=\"text: ' - ' + timeNumber + ' ' + infoDefine[ $root.languageIndex() ].coSearch.timeUnit[ timeUnit ]\" style=\"font-weight: bolder; color: #906363db;\"></span><!-- /ko -->\n<!-- ko if: time --><span data-bind=\"text: ' - ' + infoDefine[ $root.languageIndex() ].coSearch.TimeTolocalTime ( time )\" style=\"font-weight: bolder; color: #906363db;\"></span><!-- /ko -->\n<!-- /ko -->\n<!-- /ko --></p><!-- /ko -->\n<!-- ko ifnot: newsBrand -->\n<!-- ko if: beforeTime -->\n<!-- ko with: beforeTime -->\n<!-- ko if: timeNumber --><span data-bind=\"text: timeNumber + ' ' + infoDefine[ $root.languageIndex() ].coSearch.timeUnit[ timeUnit ] + ' - '\" style=\"font-weight: bolder; color: #906363db;\"></span><!-- /ko -->\n<!-- ko if: time --><span data-bind=\"text: infoDefine[ $root.languageIndex() ].coSearch.TimeTolocalTime ( time ) + ' - '\" style=\"font-weight: bolder; color: #906363db;\"></span><!-- /ko -->\n<!-- /ko -->\n<!-- /ko -->\n<!-- /ko --><span data-bind=\"text: description\" style=\"color: grey\"></span></div></div></div><div class=\"space\"></div><div class=\"space\"></div><!-- /ko -->\n<!-- ko if: !nextButtonShowError() && searchItem().nextPage --><button class=\"ui large button\" data-bind=\"css: { 'loading buttonUnActive': moreResultsButtomLoading,  negative: nextButtonShowError, 'loadingGetResponse': nextButtonLoadingGetResponse, 'conetResponse': nextButtonConetResponse },text: info.moreResults[ $root.languageIndex() ], click: searchNext\" style=\"margin-top: 1em;margin-bottom: 2em;\"></button><!-- /ko -->\n<!-- ko if: nextButtonShowError --><button class=\"ui large button negative\" data-bind=\"text: messageBoxDefine [ nextButtonErrorIndex()][ $root.languageIndex() ], click: nextButtonErrorClick \" style=\"background-color: #b94835e3;margin-top: 1em;margin-bottom: 2em;\"></button><!-- /ko --><div class=\"space\"></div><div class=\"space\"></div></div></div></div></div><!-- /ko --></div><!-- /ko -->\n<!-- ko if: !showMain() && showSnapshop () --><div id=\"subPage\" data-bind=\" with: showWebPage \"><div class=\"ui top fixed menu borderless\"><div class=\"item\" style=\"width: 90%;\"><form class=\"ui form\" style=\"width: 100%;\" data-bind=\"css: { 'error': showErrorMessage }\"><div class=\"field\" style=\"width: 100%;\"><div class=\"ui left icon input\" data-bind=\"css : { 'loading': showLoading }\" style=\"width: 100%;\"><i class=\"icon close link circular\" data-bind=\"click: close \" style=\"color: #4285f4!important;\"></i><input style=\"color: rgba ( 0,0,0,0.5 );\" readonly data-bind=\"value: showUrl\"><!-- ko if: showHtmlCodePage() && ! showLoading() --><i class=\"icon link image circular\" data-bind=\" click: imgClick \" style=\"left: auto; right: .5em; color:#947b66!important;\"></i><!-- /ko -->\n<!-- ko if: showImgPage() && ! showLoading() --><i class=\"icon link code circular\" data-bind=\" click: htmlClick \" style=\"left: auto; right: .5em; color:#346b0b!important;\"></i><!-- /ko --></div></div><!-- ko if: showLoading --><div class=\"field\"><p data-bind=\" text: messageBoxDefine ['LoadingPage'][$root.languageIndex()]\" style=\"color: grey;\"></p></div><div class=\"field\"><div class=\"loaderCoNET\" style=\" margin-top: 3em;\"><div class=\"loaderCoNET-div\"></div><div class=\"loaderCoNET-div\"></div><div class=\"loaderCoNET-div\"></div><div class=\"loaderCoNET-div\"></div></div></div><!-- /ko -->\n<!-- ko if: showErrorMessage --><div class=\"ui error message\"><span><i class=\"icon exclamation triangle red link\"></i><span data-bind=\" text: messageBoxDefine ['pageLoadingError'][$root.languageIndex()]\"></span></span></div><!-- /ko --></form></div></div><!-- ko if: showHtmlCodePage --><iframe data-bind=\" attr: { src: htmlIframe() } \" style=\"border: none;width: 100%; height: -webkit-fill-available;margin-top: 7em;\" sandbox=\"allow-forms\"></iframe><!-- /ko -->\n<!-- ko if: showImgPage --><img data-bind=\" attr: { src: png }\" style=\"border: none;margin: 7em 1em 1em 1em;\"><!-- /ko --></div><!-- /ko -->\n<!-- ko if: !showMain() && showSearchSimilarImagesResult () --><div class=\"closeButton\" style=\"z-index: 999;top: 1.3em; left: 1em; position: fixed; width: 2em;\"><i class=\"icon left chevron link circular teal\" data-bind=\"click: closeSimilarImagesResult \"></i></div><div class=\"ui six doubling cards\" data-bind=\" foreach: searchSimilarImagesList \" style=\"margin: 2em; margin-top: 3em;\"><div class=\"card\"><a class=\"ui right corner label\" data-bind=\"click: function() { return $parents[0].imagesResultClick( $parents[0], $index (), 'img')},  class: showImageError() ? 'red' : ( snapshotImageReady() ? 'teal': 'grey')\"><!-- ko if: !showImageLoading() && !showImageError() --><i class=\"icon object group link\"></i><!-- /ko -->\n<!-- ko if: showImageLoading --><i class=\"icon notched circle loading\" data-bind=\"css: { 'loadingGetResponse': loadingImageGetResponse, 'conetResponse': conetImageResponse }\"></i><!-- /ko -->\n<!-- ko if: showImageError --><i class=\"icon info circle link\" data-bind=\"attr: { id: id + '-1', 'data-content': messageBoxDefine [ imageErrorIndex()] [ $root.languageIndex() ] }\"></i><!-- /ko --></a><a class=\"ui image\" data-bind=\"attr: { 'href': imgUrlHref }\" target=\"_blank\"><img data-bind=\"attr: { src: imgSrc }\"></a><div class=\"content\"><div class=\"meta\"><span class=\"data\" data-bind=\"text: infoDefine[ $root.languageIndex() ].coSearch.imageSize\"></span><span class=\"data\" data-bind=\"text: size\"></span></div><div class=\"description\" data-bind=\"text: description \"></div></div><div class=\"extra content\"><span><!-- ko if: !showLoading() && !showError() --><i class=\"icon object group link\" data-bind=\"class: snapshotReady() ? 'olive': 'grey', click: function() { return $parents[0].imagesResultClick( $parents[0], $index (), 'link')}\"></i><!-- /ko -->\n<!-- ko if: showLoading --><i class=\"icon notched circle loading\" data-bind=\"css: { 'loadingGetResponse': loadingGetResponse, 'conetResponse': conetResponse }\"></i><!-- /ko -->\n<!-- ko if: showError --><i class=\"icon info circle red link\" data-bind=\"attr: { id: id, 'data-content': messageBoxDefine [ errorIndex()] [ $root.languageIndex() ]}\"></i><!-- /ko --></span><a data-bind=\"text: webUrl, attr: { 'href': webUrlHref }\" target=\"_blank\"></a></div></div></div><!-- /ko --></div><!-- /ko --></div>`;\nconst appMenuData = 'appmenu';\nclass appsManager {\n    constructor(exit) {\n        this.exit = exit;\n        this.mainPages = ko.observable(null);\n        this.mainLoading = ko.observable(true);\n        this.loadingError = ko.observable(null);\n        this.mainHtml = ko.observable('');\n        this.appHtml = ko.observable(false);\n        this.appScript = ko.observable();\n        this.showMain = ko.observable(false);\n        this.showMainMenu = ko.observable(true);\n        this.loadingGetResponse = ko.observable(false);\n        this.conetResponse = ko.observable(false);\n        this.showSnapshop = ko.observable(false);\n        this.appMenu = this.getAppMenu();\n        this.runningAppHtml = ko.observable(null);\n        this.showAppMain = ko.observable(false);\n        this.AppObj = {};\n        this.appLoadingError = ko.observable(false);\n        this.appLoadingErrorIndex = ko.observable(null);\n        /***\n         *\n         * \t\tdebug temp\n        */\n        this.showTempMain = ko.observable(false);\n        this.tempAppHtml = ko.observable(false);\n        /**\n         *\n         */\n        this.mainScript = ko.observable(null);\n        _view.sectionLogin(false);\n        this.updateAppsManu();\n    }\n    getAppMenu() {\n        const uu = window.localStorage.getItem(appMenuData);\n        try {\n            return JSON.parse(uu);\n        }\n        catch (ex) {\n            return null;\n        }\n    }\n    initMenuArray(mainMenuArray) {\n        mainMenuArray.forEach(n => {\n            n['loading'] = ko.observable(false);\n            n['loadingGetResponse'] = ko.observable(false);\n            n['conetResponse'] = ko.observable(false);\n        });\n    }\n    showLoadingGetResponse(item) {\n        item.loadingGetResponse(true);\n        item.conetResponse(false);\n    }\n    showConetResponse(item) {\n        item.loadingGetResponse(false);\n        item.conetResponse(true);\n    }\n    getAppObject(mainMenuItem) {\n        for (let i = 0; i < mainMenuItem.length; i++) {\n            const uu = mainMenuItem[i];\n            if (uu.active) {\n                const objName = `APP-${i}`;\n                const kk = window.localStorage.getItem(objName);\n                try {\n                    this.AppObj[objName] = JSON.parse(kk);\n                }\n                catch (ex) {\n                }\n            }\n        }\n    }\n    updateAppsManu(_self = null) {\n        const self = _self || this;\n        self.appLoadingError(false);\n        /**\n         *\n         * \t\tDEBUG use Temp Pug\n         *\n         */\n        const _mainMenuObj = _mainMenuObj111;\n        self.initMenuArray(_mainMenuObj.mainMenuItem);\n        _mainMenuObj['_mainMenuItem'] = ko.observableArray(_mainMenuObj.mainMenuItem);\n        self.mainLoading(false);\n        self.showTempMain(true);\n        return self.mainScript(_mainMenuObj);\n        /** */\n        const viewMainMenuu = () => {\n            self.mainHtml(self.appMenu[1]);\n            const _mainMenuObj = JSON.parse(self.appMenu[2]);\n            self.initMenuArray(_mainMenuObj.mainMenuItem);\n            _mainMenuObj['_mainMenuItem'] = ko.observableArray(_mainMenuObj.mainMenuItem);\n            self.mainScript(_mainMenuObj);\n            self.showMain(true);\n            self.mainLoading(false);\n            self.mainLoading(false);\n            self.conetResponse(false);\n            _view.connectInformationMessage.hideMessage();\n            this.getAppObject(_mainMenuObj.mainMenuItem);\n        };\n        if (this.appMenu && this.appMenu.length) {\n            viewMainMenuu();\n        }\n        const showError = (err) => {\n            self.mainLoading(false);\n            //_view.connectInformationMessage.hideMessage()\n            self.loadingError(_view.connectInformationMessage.getErrorIndex(err));\n            self.loadingGetResponse(false);\n            return self.conetResponse(false);\n        };\n        const com = {\n            command: 'mainMenu',\n            Args: this.appMenu && this.appMenu[0] ? this.appMenu[0] : null,\n            error: null,\n            subCom: null\n        };\n        return _view.keyPairCalss.emitRequest(com, (err, com) => {\n            if (err) {\n                return showError(err);\n            }\n            if (!com) {\n                self.conetResponse(false);\n                return self.loadingGetResponse(true);\n            }\n            if (com.error === -1) {\n                self.loadingGetResponse(false);\n                return self.conetResponse(true);\n            }\n            if (com.error) {\n                return showError(com.error);\n            }\n            _view.connectInformationMessage.hideMessage();\n            if (!com.Args || !com.Args.length) {\n                return;\n            }\n            this.appMenu = com.Args;\n            if (typeof Storage !== \"undefined\") {\n                window.localStorage.setItem(appMenuData, JSON.stringify(com.Args));\n            }\n            return viewMainMenuu();\n        });\n    }\n    mainNemuError() {\n        this.exit();\n    }\n    appClick(appIndex) {\n        const self = this;\n        const item = self.mainScript().mainMenuItem[appIndex];\n        self.mainScript()._mainMenuItem([item]);\n        item.loading(true);\n        const runningApp = (obj) => {\n            _view.bodyBlue(false);\n            _view.showIconBar(false);\n            this.showMainMenu(false);\n            /**\n             *\n             * \t\t\tDEBUG APP use Temp pug\n             *\n             */\n            this.tempAppHtml(true);\n            appScript.startup(appScript);\n            this.appScript(appScript);\n            _view.CanadaBackground(true);\n            return;\n            /** */\n            /**\n             *\n             * \t\t\tUse appHtml\n             */\n            /*\n            this.runningAppHtml ( appHtml )\n            this.appHtml ( true )\n            \n            this.showAppMain ( true )\n            appScript.startup ( appScript )\n            \n            this.appScript ( appScript )\n\n            /** */\n            this.runningAppHtml(obj[1]);\n            this.appHtml(true);\n            eval(obj[2]);\n            appScript.startup(appScript);\n            this.appScript(appScript);\n            this.showAppMain(true);\n        };\n        const AppName = `APP-${appIndex}`;\n        let obj = this.AppObj[AppName];\n        /**\n         *\n         * \t\tuse Debug\n         *\n         */\n        return runningApp(null);\n        /** end Debug */\n        if (obj) {\n            runningApp(obj);\n        }\n        const com = {\n            command: AppName,\n            Args: obj && obj[0] ? obj[0] : null,\n            error: null,\n            subCom: null\n        };\n        const showError = (err) => {\n            item.loading(false);\n            self.appLoadingErrorIndex(_view.connectInformationMessage.getErrorIndex(err));\n            return self.appLoadingError(true);\n        };\n        return _view.keyPairCalss.emitRequest(com, (err, com) => {\n            if (err) {\n                return showError(err);\n            }\n            if (!com) {\n                self.conetResponse(false);\n                return self.loadingGetResponse(true);\n            }\n            if (com.error === -1) {\n                self.loadingGetResponse(false);\n                return self.conetResponse(true);\n            }\n            if (com.error) {\n                return showError(com.error);\n            }\n            _view.connectInformationMessage.hideMessage();\n            if (!com.Args || !com.Args.length) {\n                return;\n            }\n            obj = com.Args;\n            if (typeof Storage !== \"undefined\") {\n                window.localStorage.setItem(AppName, JSON.stringify(com.Args));\n            }\n            return runningApp(obj);\n        });\n    }\n}\n"
  },
  {
    "path": "app/public/scripts/appsManager.ts",
    "content": "\nconst _mainMenuObj111 = {\n\tnodeName: ['CoNET官方节点','CoNET公式パブリックノード','CoNET official public node','CoNET官方節點'],\n\tnodeAddress: 'QTGate@CoNETTech.ca',\n\tmainMenuItem :[\n\t\t/*\n\t\t, {\n\t\t\timgSrc: 'data:image/png;base64,',\n\t\t\theaderText: ['','','',''],\n\n\t\t\theaderTextColor: '',\n\t\t\ttextColor: '',\n\t\t\tmeta: ['','','',''],\n\t\t\tdescription: [\n\t\t\t\t'','','',''\n\t\t\t],\n\t\t\textra: [\n\t\t\t\t'','','',''\n\t\t\t]\n\t\t\t\n\t\t},\n\t\t*/\n\t\t{\n\t\timgSrc:\n\t\t\t'data:image/png;base64,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',\n\t\theaderText: [\n\t\t\t'CoSearch','CoSearch','CoSearch','CoSearch'\n\t\t],\n\n\t\theaderTextColor: '',\n\t\ttextColor: '',\n\t\tmeta: [\n\t\t\t'网站图片检索，任意网页快照，谷歌翻译，多媒体下载链接',\n\t\t\t'ウェブと画像検索、ページのスクリーンショット、メディアファイルのダウンロードリンク、Google通訳',\n\t\t\t'Web or images search. Web page screenshot. Media file download link, Google translate.',\n\t\t\t'網站圖片檢索，任意網頁快照，谷歌翻譯，多媒體下載鏈接'\n\t\t],\n\t\tdescription: [\n\t\t\t'当前为Bate版，检索引擎只能选择Google，无翻译和多媒体下载链接功能',\n\t\t\t'ベータバージョン、検索エンジンはGoogleオンリー、通訳とマルチメディアファイルダウンロードリンクはまだです',\n\t\t\t'This is beta version, earch engine Google only, Google translate and media file download link coming soon.',\n\t\t\t'當前為Bate版，檢索引擎只能選擇Google，無翻譯和多媒體下載連接功能'\n\t\t],\n\t\textra: [\n\t\t\t'','','',''\n\t\t],\n\t\t\"active\": true\n\t\t\n\t\t},{\n\t\t\timgSrc: '',\n\t\t\theaderText: [\n\t\t\t\t'CoMSG','CoMSG','CoMSG','CoMSG'\n\t\t\t],\n\t\t\theaderTextColor: '',\n\t\t\ttextColor: '',\n\t\t\tmeta: [\n\t\t\t\t'点对点私密信息，支持多媒体及文件推送，会议室无上限设置',\n\t\t\t\t'ポイントツーポイント暗号化メッセージ、マルチメディアとファイルの転送ができます、無制限のグループ会話',\n\t\t\t\t'End to End encrypted message. Support for multimedia and all other type files, unlimit group message.',\n\t\t\t\t'點對點私密信息，支持多媒體及文件推送，會議室無上限設置'\n\t\t\t],\n\t\t\tdescription: [\n\t\t\t\t'敬请期待','準備中','Coming soon.','敬請期待'\n\t\t\t],\n\t\t\textra: [\n\t\t\t\t'','','',''\n\t\t\t],\n\t\t\t\"active\": false\n\t\t},{\n\t\t\timgSrc: '',\n\t\t\theaderText: [\n\t\t\t\t'CoBox','CoBox','CoBox','CoBox'\n\t\t\t],\n\t\t\theaderTextColor: '',\n\t\t\ttextColor: '',\n\t\t\tmeta: [\n\t\t\t\t'文件加密后打成碎片，分别存放到多个免费邮箱，高隐私无限量存储',\n\t\t\t\t'ファイルを暗号化して破砕して、多数のフリーEmailにそれぞれを保存する強いプライバシーストレージ',\n\t\t\t\t\"Encrypted and split a file to multiple parts, append to multiple email's draft. High privacy and security storage system.\",\n\t\t\t\t'使用綑綁多個免費郵箱剩餘容量，存儲加密後打成碎片，高隱私無限量文件存儲'\n\t\t\t],\n\t\t\tdescription: [\n\t\t\t\t'敬请期待','準備中','Coming soon.','敬請期待'\n\t\t\t],\n\t\t\textra: [\n\t\t\t\t'','','',''\n\t\t\t],\n\t\t\t\"active\": false\n\t\t}\n\n\t]\n\n}\n\nconst appHtml = `<div id=\"CoSearch\"><!-- ko with: appScript --><div class=\"backGroundSetup\" data-bind=\" style: { background: searchItem() ? 'white' : '#B4E4ED' }\" style=\"height: 100em; \"><!-- ko if: showMain() --><div class=\"main\"><!-- ko if: showMainSearchForm() --><form class=\"ui form\" id=\"coSearchForm\" data-bind=\" style: { 'margin-top': showSearchSetupForm() ? '15em' : '25em' }, event: { 'submit': search_form }, submitBubble: false\" style=\"100%;\"><!-- ko if: !showSearchSetupForm() --><div class=\"field\"><div class=\"ui search\"><div class=\"ui input huge icon\" data-bind=\"css : { animationSearchInput: hasFocus, 'error': showSearchError(), 'loading disabled': showInputLoading }\" style=\"width: 100%;border-radius: 500rem;\"><input style=\"color:rgba(0,0,0,0.5); border-radius: 500rem; width: 100%;\" type=\"text\" data-bind=\"attr: { placeholder: showSearchError() ? ( messageBoxDefine [ errorMessageIndex() ][ $root.languageIndex() ]): infoDefine[ $root.languageIndex() ].coSearch.searchInputPlaceholder }, css : { backgroundTransparent: ! backGroundBlue ()}, textInput: searchInputText, hasFocus: hasFocus\"><!-- ko if: !showSearchError() -->\n<!-- ko if : !hasFocusShowTool() --><i class=\"icon link circular\" data-bind=\" html: searchSetupIcon (), click: searchSetupClick \" style=\"box-shadow: 0 0 0 0.1em ; color: #42c8f4!important;\"></i><!-- /ko -->\n<!-- ko if : hasFocusShowTool -->\n<!-- ko if: !searchInputText().length --><i class=\"icon image outline link circular\" data-bind=\" click: function (){ document.getElementById('imageInput1').click() }, style: { 'margin-top' : hasFocus ? '2px' : '0px' }\" style=\"box-shadow: 0 0 0 0.1em; color: #42c8f4!important;\"></i><input onchange=\"_view.appsManager().appScript().imageSearch( this )\" id=\"imageInput1\" type=\"file\" accept=\"image/gif,image/jpeg,image/jpg,image/png\" style=\"opacity:0\"><!-- /ko -->\n<!-- ko if: searchInputText().length --><i class=\"icon search link circular\" style=\"box-shadow: 0 0 0 0.1em; color: #4285f4!important;\" data-bind=\"click: search_form, css: { 'loadingGetResponse': loadingGetResponse, 'conetResponse': conetResponse } \"></i><!-- ko if : !showInputLoading() --><i class=\"icon language circular link\" style=\"box-shadow: 0 0 0 0.1em;color: #7742b9!important;margin-right: 2.5em\"></i><!-- /ko -->\n<!-- /ko -->\n<!-- /ko -->\n<!-- /ko -->\n<!-- ko if: showSearchError --><i class=\"icon link circular red close\" data-bind=\" click: searchInputCloseError \"></i><!-- /ko --></div></div></div><!-- /ko -->\n<!-- ko if: showSearchSetupForm() --><div class=\"SetupForm\" style=\"margin: 5em;\"><div class=\"ui link cards\"><div class=\"card AppCardTop\" data-bind=\" click: function( self, event ) { searchSetup ('g', self, event )} \" style=\" background: #ffffff82;\"><div class=\"content\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -70 270 180\">\n<path fill=\"#EA4335\" d=\"M115.75 47.18c0 12.77-9.99 22.18-22.25 22.18s-22.25-9.41-22.25-22.18C71.25 34.32 81.24 25 93.5 25s22.25 9.32 22.25 22.18zm-9.74 0c0-7.98-5.79-13.44-12.51-13.44S80.99 39.2 80.99 47.18c0 7.9 5.79 13.44 12.51 13.44s12.51-5.55 12.51-13.44z\"/>\n<path fill=\"#FBBC05\" d=\"M163.75 47.18c0 12.77-9.99 22.18-22.25 22.18s-22.25-9.41-22.25-22.18c0-12.85 9.99-22.18 22.25-22.18s22.25 9.32 22.25 22.18zm-9.74 0c0-7.98-5.79-13.44-12.51-13.44s-12.51 5.46-12.51 13.44c0 7.9 5.79 13.44 12.51 13.44s12.51-5.55 12.51-13.44z\"/>\n<path fill=\"#4285F4\" d=\"M209.75 26.34v39.82c0 16.38-9.66 23.07-21.08 23.07-10.75 0-17.22-7.19-19.66-13.07l8.48-3.53c1.51 3.61 5.21 7.87 11.17 7.87 7.31 0 11.84-4.51 11.84-13v-3.19h-.34c-2.18 2.69-6.38 5.04-11.68 5.04-11.09 0-21.25-9.66-21.25-22.09 0-12.52 10.16-22.26 21.25-22.26 5.29 0 9.49 2.35 11.68 4.96h.34v-3.61h9.25zm-8.56 20.92c0-7.81-5.21-13.52-11.84-13.52-6.72 0-12.35 5.71-12.35 13.52 0 7.73 5.63 13.36 12.35 13.36 6.63 0 11.84-5.63 11.84-13.36z\"/>\n<path fill=\"#34A853\" d=\"M225 3v65h-9.5V3h9.5z\"/>\n<path fill=\"#EA4335\" d=\"M262.02 54.48l7.56 5.04c-2.44 3.61-8.32 9.83-18.48 9.83-12.6 0-22.01-9.74-22.01-22.18 0-13.19 9.49-22.18 20.92-22.18 11.51 0 17.14 9.16 18.98 14.11l1.01 2.52-29.65 12.28c2.27 4.45 5.8 6.72 10.75 6.72 4.96 0 8.4-2.44 10.92-6.14zm-23.27-7.98l19.82-8.23c-1.09-2.77-4.37-4.7-8.23-4.7-4.95 0-11.84 4.37-11.59 12.93z\"/>\n<path fill=\"#4285F4\" d=\"M35.29 41.41V32H67c.31 1.64.47 3.58.47 5.68 0 7.06-1.93 15.79-8.15 22.01-6.05 6.3-13.78 9.66-24.02 9.66C16.32 69.35.36 53.89.36 34.91.36 15.93 16.32.47 35.3.47c10.5 0 17.98 4.12 23.6 9.49l-6.64 6.64c-4.03-3.78-9.49-6.72-16.97-6.72-13.86 0-24.7 11.17-24.7 25.03 0 13.86 10.84 25.03 24.7 25.03 8.99 0 14.11-3.61 17.39-6.89 2.66-2.66 4.41-6.46 5.1-11.65l-22.49.01z\"/>\n</svg></div></div><div class=\"card AppCardTop\" data-bind=\" click: function( self, event ) { searchSetup ('b', self, event )} \" style=\" background: #ffffff82;\"><div class=\"content\"><svg viewBox=\"0 -170 1000 600\">\n<g inkscape:label=\"Layer 1\" inkscape:groupmode=\"layer\" id=\"layer1\" transform=\"translate(312,-795.66903)\">\n<path style=\"fill:#008373;fill-opacity:1;stroke:none\" d=\"m -311.5,796.16903 80.6273,28.36401 0,283.80836 113.56729,-65.5599 -55.67962,-26.1246 -35.12739,-87.43067 178.939297,62.86452 0,91.39515 -201.653597,116.3102 -80.67328,-44.875 z\" />\n<g transform=\"matrix(8.653063,0,0,8.653063,-2616.6875,-11921.907)\" style=\"font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#008373;fill-opacity:1;stroke:none;font-family:Sans\" id=\"flowRoot3000\">\n<path d=\"m 313.01562,1507.0953 0,-28.0078 7.96875,0 c 2.42187,10e-5 4.34244,0.5925 5.76172,1.7774 1.41926,1.1849 2.12889,2.7279 2.12891,4.6289 -2e-5,1.5885 -0.42971,2.9688 -1.28906,4.1406 -0.85939,1.1719 -2.04429,2.0052 -3.55469,2.5 l 0,0.078 c 1.888,0.2214 3.39842,0.9343 4.53125,2.1387 1.13279,1.2044 1.6992,2.7702 1.69922,4.6973 -2e-5,2.3958 -0.8594,4.3359 -2.57813,5.8203 -1.71876,1.4844 -3.88673,2.2265 -6.5039,2.2265 z m 3.28125,-25.039 0,9.043 3.35938,0 c 1.79686,0 3.20962,-0.433 4.23828,-1.2989 1.02863,-0.8658 1.54295,-2.0865 1.54297,-3.6621 -2e-5,-2.7213 -1.79038,-4.082 -5.37109,-4.082 z m 0,11.9922 0,10.0781 4.45313,0 c 1.92707,0 3.42121,-0.4557 4.48242,-1.3672 1.06118,-0.9114 1.59178,-2.1614 1.5918,-3.75 -2e-5,-3.3073 -2.25262,-4.9609 -6.75781,-4.9609 z\" style=\"font-variant:normal;font-stretch:normal;fill:#008373;fill-opacity:1;stroke:none;font-family:Segoe UI;-inkscape-font-specification:Segoe UI\" id=\"path3009\" inkscape:connector-curvature=\"0\"/>\n<path d=\"m 336.08002,1482.6479 c -0.57292,0 -1.0612,-0.1953 -1.46484,-0.5859 -0.40365,-0.3906 -0.60547,-0.8854 -0.60547,-1.4844 0,-0.5989 0.20182,-1.097 0.60547,-1.4941 0.40364,-0.3971 0.89192,-0.5957 1.46484,-0.5957 0.58593,0 1.08398,0.1986 1.49414,0.5957 0.41015,0.3971 0.61523,0.8952 0.61524,1.4941 -10e-6,0.573 -0.20509,1.0612 -0.61524,1.4649 -0.41016,0.4036 -0.90821,0.6054 -1.49414,0.6054 z m 1.5625,24.4474 -3.20312,0 0,-19.8474 3.20312,0 z\" style=\"font-variant:normal;font-stretch:normal;fill:#008373;fill-opacity:1;stroke:none;font-family:Segoe UI;-inkscape-font-specification:Segoe UI\" id=\"path3011\" inkscape:connector-curvature=\"0\" sodipodi:nodetypes=\"ssssssccsccccc\"/>\n<path d=\"m 359.4053,1507.0953 -3.20313,0 0,-11.2601 c 0,-4.2448 -1.42999,-6.3672 -4.52893,-6.3672 -1.60158,0 -2.92644,0.6022 -3.97461,1.8066 -1.04819,1.2045 -1.57227,2.7247 -1.57227,4.5606 l 0,11.2601 -3.20312,0 0,-19.8473 3.20312,0 0,3.2522 0.0781,0 c 1.51041,-2.5261 3.6629,-3.7275 6.443,-3.7275 2.18748,0 3.86066,0.7064 5.01953,2.1191 1.15883,1.4128 1.73828,3.4538 1.73828,6.1231 z\" style=\"font-variant:normal;font-stretch:normal;fill:#008373;fill-opacity:1;stroke:none;font-family:Segoe UI;-inkscape-font-specification:Segoe UI\" id=\"path3013\" inkscape:connector-curvature=\"0\" sodipodi:nodetypes=\"ccsscsccccccscsc\"/>\n<path d=\"m 381.85178,1505.4046 c 0,7.3437 -3.51564,11.0156 -10.54688,11.0156 -2.47396,0 -4.51337,-0.4405 -6.36232,-1.378 l 0.84027,-2.7464 c 0,0 2.17127,1.4431 5.48299,1.4431 4.92186,0 7.38281,-2.5703 7.38281,-7.8046 l 0,-2.1654 -0.0781,0 c -1.52345,2.5521 -3.66907,3.7952 -6.72895,3.7952 -2.48699,0 -4.48894,-0.7493 -6.00586,-2.5266 -1.51693,-1.7774 -2.27539,-4.1634 -2.27539,-7.1582 0,-3.3984 0.81705,-6.1003 2.45117,-8.1055 1.63411,-2.0052 3.87044,-3.0078 6.70899,-3.0078 2.6953,0 4.54794,1.0807 5.85004,3.2422 l 0.0781,0 0,-2.7602 3.20313,0 z m -3.20313,-7.3522 0,-2.7899 c 0,-1.5886 -0.53712,-2.9492 -1.61132,-4.0821 -1.07424,-1.1328 -2.31919,-1.6992 -3.92074,-1.6992 -1.97917,0 -3.52865,0.7194 -4.64843,2.1582 -1.1198,1.4388 -1.6797,3.4538 -1.67969,6.0449 -1e-5,2.2266 0.5371,3.8479 1.61133,5.1825 1.07421,1.3347 2.49673,2.002 4.26758,2.002 1.79686,0 3.16551,-0.638 4.29182,-1.9141 1.12629,-1.276 1.68945,-2.9101 1.68945,-4.9023 z\" style=\"font-variant:normal;font-stretch:normal;fill:#008373;fill-opacity:1;stroke:none;font-family:Segoe UI;-inkscape-font-specification:Segoe UI\" id=\"path3015\" inkscape:connector-curvature=\"0\" sodipodi:nodetypes=\"ssccssccscsssccccssscssscscs\"/>\n</g>\n</g>\n</svg></div></div><div class=\"card AppCardTop\" data-bind=\" click: function( self, event ) { searchSetup ('y', self, event )} \" style=\" background: #ffffff82;\"><div class=\"content\"><svg xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" viewBox=\"0 -150 500 280\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n<defs>\n<radialGradient id=\"c\" gradientUnits=\"userSpaceOnUse\" cy=\"1680.7\" cx=\"1214.2\" gradientTransform=\"matrix(-1.223 -.23720 .15644 -.94671 2438.6 3564.7)\" r=\"22.495\">\n<stop stop-color=\"#6700e8\" offset=\"0\"/>\n<stop stop-color=\"#5c00ce\" offset=\".39936\"/>\n<stop stop-color=\"#5600bf\" stop-opacity=\".045045\" offset=\".70124\"/>\n<stop stop-color=\"#220047\" stop-opacity=\"0\" offset=\"1\"/>\n</radialGradient>\n<linearGradient id=\"j\" y2=\"1916\" gradientUnits=\"userSpaceOnUse\" x2=\"397.81\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1916\" x1=\"372.77\">\n<stop stop-color=\"#5500bd\" offset=\"0\"/>\n<stop stop-color=\"#5200b2\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"e\" y2=\"1704.2\" gradientUnits=\"userSpaceOnUse\" x2=\"1198.6\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1962.9\" x1=\"1161.2\">\n<stop stop-color=\"#47008d\" offset=\"0\"/>\n<stop stop-color=\"#5100b3\" offset=\"1\"/>\n</linearGradient>\n<radialGradient id=\"b\" gradientUnits=\"userSpaceOnUse\" cy=\"2013.9\" cx=\"1159.1\" gradientTransform=\"matrix(-.21925 .74474 -.78219 -.23028 1523.9 90.984)\" r=\"24.948\">\n<stop stop-color=\"#6000d8\" offset=\"0\"/>\n<stop stop-color=\"#5c00cd\" offset=\".20886\"/>\n<stop stop-color=\"#5500be\" offset=\".37415\"/>\n<stop stop-color=\"#2d0062\" offset=\"0.721\"/>\n<stop stop-color=\"#210045\" offset=\"1\"/>\n</radialGradient>\n<linearGradient id=\"g\" y2=\"1699.4\" xlink:href=\"#a\" gradientUnits=\"userSpaceOnUse\" x2=\"1020.9\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"2003.7\" x1=\"829.87\"/>\n<linearGradient id=\"a\">\n<stop stop-color=\"#1b0041\" offset=\"0\"/>\n<stop stop-color=\"#1b0041\" offset=\".10005\"/>\n<stop stop-color=\"#1b0041\" offset=\".20479\"/>\n<stop stop-color=\"#240052\" offset=\"0.3\"/>\n<stop stop-color=\"#32006a\" offset=\"0.4\"/>\n<stop stop-color=\"#3d007d\" offset=\".5\"/>\n<stop stop-color=\"#490098\" offset=\"0.6\"/>\n<stop stop-color=\"#4f00a8\" offset=\".70026\"/>\n<stop stop-color=\"#5500bc\" offset=\".80312\"/>\n<stop stop-color=\"#5700c2\" offset=\"0.9\"/>\n<stop stop-color=\"#6000da\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"f\" y2=\"1983.8\" gradientUnits=\"userSpaceOnUse\" x2=\"829.28\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1699.3\" x1=\"979.93\">\n<stop stop-color=\"#1e0046\" offset=\"0\"/>\n<stop stop-color=\"#2d0061\" offset=\".10005\"/>\n<stop stop-color=\"#33006b\" offset=\".20479\"/>\n<stop stop-color=\"#400082\" offset=\"0.3\"/>\n<stop stop-color=\"#490096\" offset=\"0.4\"/>\n<stop stop-color=\"#5000ac\" offset=\".5\"/>\n<stop stop-color=\"#5500bd\" offset=\"0.6\"/>\n<stop stop-color=\"#4f00a8\" offset=\".70026\"/>\n<stop stop-color=\"#5500bc\" offset=\".80312\"/>\n<stop stop-color=\"#5700c2\" offset=\"0.9\"/>\n<stop stop-color=\"#6000da\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"i\" y2=\"1725.7\" xlink:href=\"#a\" gradientUnits=\"userSpaceOnUse\" x2=\"664.27\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1978\" x1=\"462.79\"/>\n<linearGradient id=\"h\" y2=\"1962.4\" gradientUnits=\"userSpaceOnUse\" x2=\"471.28\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1725.4\" x1=\"632.18\">\n<stop stop-color=\"#1c0044\" offset=\"0\"/>\n<stop stop-color=\"#2f0065\" offset=\".10005\"/>\n<stop stop-color=\"#34006d\" offset=\".20479\"/>\n<stop stop-color=\"#3b007a\" offset=\"0.3\"/>\n<stop stop-color=\"#3c007a\" offset=\"0.4\"/>\n<stop stop-color=\"#490096\" offset=\".5\"/>\n<stop stop-color=\"#5000ab\" offset=\"0.6\"/>\n<stop stop-color=\"#5400ba\" offset=\".70026\"/>\n<stop stop-color=\"#5500bc\" offset=\".80312\"/>\n<stop stop-color=\"#5700c2\" offset=\"0.9\"/>\n<stop stop-color=\"#5c00ce\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"l\" y2=\"1856.8\" gradientUnits=\"userSpaceOnUse\" x2=\"372.85\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1856.8\" x1=\"163.23\">\n<stop stop-color=\"#6700e8\" offset=\"0\"/>\n<stop stop-color=\"#6700e8\" offset=\".5\"/>\n<stop stop-color=\"#6700e8\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"k\" y2=\"1999.1\" gradientUnits=\"userSpaceOnUse\" x2=\"373.36\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1999.1\" x1=\"347.46\">\n<stop stop-color=\"#3f008b\" offset=\"0\"/>\n<stop stop-color=\"#220050\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"n\" y2=\"1713.2\" gradientUnits=\"userSpaceOnUse\" x2=\"163.25\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1713.2\" x1=\"138.23\">\n<stop stop-color=\"#390080\" offset=\"0\"/>\n<stop stop-color=\"#31006e\" offset=\".5\"/>\n<stop stop-color=\"#250056\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"m\" y2=\"1838.2\" gradientUnits=\"userSpaceOnUse\" x2=\"187.85\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1838.2\" x1=\"162.66\">\n<stop stop-color=\"#5a00c9\" offset=\"0\"/>\n<stop stop-color=\"#4f00a8\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"q\" y2=\"1909.6\" gradientUnits=\"userSpaceOnUse\" x2=\"51.417\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1909.6\" x1=\"-103.64\">\n<stop stop-color=\"#6700e8\" offset=\"0\"/>\n<stop stop-color=\"#6700e8\" offset=\".50604\"/>\n<stop stop-color=\"#6700e8\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"s\" y2=\"1718.5\" gradientUnits=\"userSpaceOnUse\" x2=\"-26.132\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"2005.1\" x1=\"-169.29\">\n<stop stop-color=\"#4d00a1\" offset=\"0\"/>\n<stop stop-color=\"#5200b4\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"y\" y2=\"2047\" gradientUnits=\"userSpaceOnUse\" x2=\"-253.6\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1878.8\" x1=\"-253.6\">\n<stop stop-color=\"#210045\" offset=\"0\"/>\n<stop stop-color=\"#25004d\" offset=\".25\"/>\n<stop stop-color=\"#2b005c\" offset=\".5\"/>\n<stop stop-color=\"#340071\" offset=\".74854\"/>\n<stop stop-color=\"#3e0088\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"x\" y2=\"2047.3\" gradientUnits=\"userSpaceOnUse\" x2=\"-227.23\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1877.2\" x1=\"-248.82\">\n<stop stop-color=\"#5500bd\" offset=\"0\"/>\n<stop stop-color=\"#5300b5\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"w\" y2=\"1838.7\" gradientUnits=\"userSpaceOnUse\" x2=\"-273.09\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1850.7\" x1=\"-291.09\">\n<stop stop-color=\"#27005d\" stop-opacity=\".98039\" offset=\"0\"/>\n<stop stop-color=\"#2b005d\" offset=\".31767\"/>\n<stop stop-color=\"#280055\" offset=\".59756\"/>\n<stop stop-color=\"#24004d\" offset=\".80878\"/>\n<stop stop-color=\"#230049\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"v\" y2=\"1877.6\" gradientUnits=\"userSpaceOnUse\" x2=\"-250.33\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1669.7\" x1=\"-349.94\">\n<stop stop-color=\"#5100b2\" offset=\"0\"/>\n<stop stop-color=\"#5500bd\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"u\" y2=\"1877.2\" gradientUnits=\"userSpaceOnUse\" x2=\"-249.85\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1667.8\" x1=\"-149.7\">\n<stop stop-color=\"#5500bd\" offset=\"0\"/>\n<stop stop-color=\"#47008d\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"t\" y2=\"1819.8\" gradientUnits=\"userSpaceOnUse\" x2=\"-190.68\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1808.7\" x1=\"-209.43\">\n<stop stop-color=\"#1b0041\" offset=\"0\"/>\n<stop stop-color=\"#21004f\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"r\" y2=\"1759.1\" gradientUnits=\"userSpaceOnUse\" x2=\"-26.7\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"2007.7\" x1=\"-122.89\">\n<stop stop-color=\"#21004e\" offset=\"0\"/>\n<stop stop-color=\"#39007f\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"p\" y2=\"1938.5\" gradientUnits=\"userSpaceOnUse\" x2=\"63.199\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1945.5\" x1=\"44.989\">\n<stop stop-color=\"#2a005a\" offset=\"0\"/>\n<stop stop-color=\"#210046\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"o\" y2=\"2003.3\" gradientUnits=\"userSpaceOnUse\" x2=\"115.15\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1718.1\" x1=\"-24.637\">\n<stop stop-color=\"#5500bd\" offset=\"0\"/>\n<stop stop-color=\"#5000ac\" offset=\"1\"/>\n</linearGradient>\n<linearGradient id=\"d\" y2=\"1701.9\" gradientUnits=\"userSpaceOnUse\" y1=\"1962.2\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" x2=\"1225\" x1=\"1177.8\">\n<stop stop-color=\"#210045\" offset=\"0\"/>\n<stop stop-color=\"#430085\" offset=\".59416\"/>\n<stop stop-color=\"#5000b2\" offset=\"1\"/>\n</linearGradient>\n</defs>\n<g transform=\"translate(1009.8 -337.49)\">\n<g transform=\"matrix(.5 0 0 .5 -379.18 197.8)\">\n<g>\n<path d=\"m-272.82 284.69c7.6616 1.281 12.78 5.9708 12.78 14.045 0 2.6723-1.101 6.435-1.8373 9.6153-5.1337 22.63-25.182 102.59-33.623 155.96l-7.7668-7.7668 24.719-164.16z\" fill=\"url(#d)\"/>\n<path d=\"m-772.42 306.42c-10.347 2.4776-20.506 2.4096-30.493 0l15.856 16.466z\" fill=\"#6700e8\"/>\n<path d=\"m-930.94 306.42c10.347 2.4776 20.506 2.4096 30.493 0l-15.856 16.466z\" fill=\"#6700e8\"/>\n<path d=\"m-1020.4 306.36c23.383 59.178 60.182 148.75 78.517 182.98l-27.144-8.2945-67.165-167.97z\" fill=\"url(#o)\"/>\n<path d=\"m-1041.7 306.35c7.4678 2.5018 13.662 2.6552 21.264 0l-15.113 9.2837z\" fill=\"#6700e8\"/>\n<path d=\"m-1031 312.81 68.439 167.85c-4.0492 4.3854-5.855 6.6864-9.792 8.7379-19.836-51.091-41.139-102.2-59.186-152.63l-8.9087-15.103z\" fill=\"url(#p)\"/>\n<path d=\"m-1089.8 489.33-20.204-7.1558 71.141-166.91 7.9282-2.4512v24.711c-11.062 31.919-39.135 101.95-58.866 151.81z\" fill=\"url(#r)\"/>\n<path d=\"m-1106.6 282.03 6.7084 15.246 17.076-7.9282 6.9443-7.3183c-10.985 2.4918-20.893 2.5746-30.729 0z\" fill=\"#6700e8\"/>\n<path d=\"m-1154.8 414.97-11.587 4.269-7.3183-12.807 72.573-115.87 5.1886-1.7772c7.1618-1.6184 14.973-3.354 20.061-6.7608-11.525 15.569-53.493 88.344-78.917 132.95z\" fill=\"url(#t)\"/>\n<path d=\"m-1170.6 413.15 3.0493-3.0493 71.795-121.34-10.809-6.7347c-8.6682 16.146-40.638 68.392-60.986 101.85l-9.7578 18.296z\" fill=\"url(#u)\"/>\n<path d=\"m-1228.5 282.03c15.916 28.207 40.349 67.667 60.986 101.85v26.224l-4.8789 4.8789-71.354-126.85z\" fill=\"url(#v)\"/>\n<path d=\"m-1240.3 289.7 11.761-7.6717c-12.62 2.6914-17.899 2.8627-30.493 0l4.8789 5.4887z\" fill=\"#6700e8\"/>\n<path d=\"m-1167.6 410.1-5.4887 7.9282-7.3184-3.0493c-13.625-23.55-53.678-95.287-78.672-132.95 5.0665 3.6714 11.911 5.686 19.817 6.9699z\" fill=\"url(#w)\"/>\n<path fill=\"url(#x)\" d=\"m-1152.9 513.16-20.735-9.7578 1.8296-86.6 4.269-6.7085 12.807 4.8789z\"/>\n<path d=\"m-1167.6 506.45-14.637 6.7085 1.8295-98.187 12.807-4.8789z\" fill=\"url(#y)\"/>\n<path d=\"m-1120 489.38c25.444-51.864 53.737-121.41 78.294-183.04l10.746 6.4742-69.462 169.92-14.089 4.8122z\" fill=\"url(#s)\"/>\n<path d=\"m-963.25 480.35 21.352 8.9925c-8.1908-2.0649-19.278-2.8566-30.42 0.0524l4.1688-10.267z\" fill=\"#200045\"/>\n<path d=\"m-1078.5 429.38 15.012-6.4416c21.625 0.76013 43.249 0.74922 64.874 0l15.228 6.6302-14.177 3.0996h-70.184z\" fill=\"url(#q)\"/>\n<path d=\"m-1068.5 435.71-10.08-6.3338c31.673-0.48441 63.394-0.44495 95.168 0.18863l-10.08 6.1451c-25.003-0.8102-50.005-0.71317-75.008 0z\" fill=\"#200045\"/>\n<path d=\"m-900.44 489.38-21.345-7.3183v-164.05l6.0986-3.0493 15.246-8.538c-3.1637 60.878-3.233 121.86 0 182.96z\" fill=\"url(#m)\"/>\n<path d=\"m-915.69 480.84v4.269l-15.247 4.269c2.4244-60.889 2.6556-121.87 0-182.96l15.247 8.538z\" fill=\"url(#n)\"/>\n<path d=\"m-802.92 489.38 21.345-7.3183v-164.05l-6.0986-3.0493-15.247-8.538c3.1637 60.878 3.233 121.86 0 182.96z\" fill=\"url(#k)\"/>\n<path d=\"m-915.63 397.52 12.816-5.7139c34.057 0.85838 68.155 0.79423 102.28 0l12.856 5.7139-15.902 3.8002h-99.346z\" fill=\"url(#l)\"/>\n</g>\n<path fill=\"url(#h)\" d=\"m-664.79 306.35c-59.895 0-89.783 37.447-89.783 91.898 0 68.197 45.237 91.822 89.001 91.822 51.983 0 89.249-29.249 89.249-91.65 0-60.057-35.275-92.07-88.468-92.07zm-1.7915 8.6905c0.56294-0.0116 1.1312 0 1.6962 0 39.558 0 68.609 26.944 68.609 83.246 0 56.231-29.013 83.17-68.533 83.17-43.12 0-68.457-30.899-68.457-83.017 0-58.944 31.219-82.672 66.684-83.398z\"/>\n<path d=\"m-665 303.95c-64.688 0-98.626 41.016-98.626 94.185 0 58.196 37.05 93.69 98.531 93.69 66.468 0 98.931-40.001 98.931-93.08 0-59.18-38.768-94.795-98.835-94.795zm0.19058 6.0605c51.075 0 84.942 30.726 84.942 88.392 0 59.917-35.791 88.01-85.704 88.01-42.022 0-85.457-22.681-85.457-88.163 0-52.283 28.708-88.239 86.219-88.239z\" fill=\"url(#i)\"/>\n<path fill=\"url(#f)\" d=\"m-441.28 296.99c-60.789 0-102.44 34.367-102.44 101.35 0 65.71 38.747 102.42 102.69 102.42 48.426 0 101.48-24.872 101.48-101.48 0-82.684-57.955-102.28-101.73-102.28zm-0.32402 7.3183c48.376 0 84.008 29.388 84.008 94.204 0 70.459-43.103 93.309-83.932 93.309-43.622 0-83.36-25.6-83.36-94.7 0-71.621 44.046-92.813 83.284-92.813z\"/>\n<path fill=\"url(#g)\" d=\"m-441.68 292.93c-64.42 0-113.66 36.579-113.66 104.59 0 56.035 32.755 105.35 114.2 105.35 68.949 0 113.97-37.907 113.97-104.36 0-62.667-41.996-105.58-114.5-105.58zm0.40025 6.8228c42.587 0 98.969 19.086 98.969 99.522 0 74.529-51.631 98.721-98.74 98.721-62.2 0-99.884-35.712-99.884-99.636 0-65.163 40.519-98.607 99.655-98.607z\"/>\n<path d=\"m-322.2 499.84c0-7.8687 4.7851-15.186 14.378-15.186 9.1817 0 16.052 5.4912 16.052 14.262 0 10.928-7.2317 14.955-13.858 14.955-9.1617 0-16.572-4.7539-16.572-14.031z\" fill=\"url(#b)\"/>\n<path d=\"m-306.88 462.57c7.4355-52.557 11.958-107.79 16.301-162.87 0-10.977 7.2554-15.27 14.576-15.27 1.283 0 3.1753 0.2673 3.1753 0.2673l-1.9912 13.166-26.08 163.25z\" fill=\"url(#e)\"/>\n<g fill=\"#200045\">\n<path d=\"m-1182.2 513.16 14.664-10.743 14.609 10.743s-8.0987-1.4737-14.61-1.4737c-5.8748 0-14.664 1.4737-14.664 1.4737z\"/>\n<path d=\"m-1120 489.4 20.456-8.8436c3.1211 3.742 5.8977 6.913 9.7311 8.7897-7.3639-1.9927-18.512-2.8867-30.184 0.0311z\"/>\n<path d=\"m-930.94 489.38c9.903-2.3864 20.044-2.492 30.455 0l-15.208-8.538z\"/>\n<path d=\"m-902.81 404.29-12.843-6.765c42.66 0.44483 85.32 0.5196 127.98 0l-12.826 6.725c-34.104-0.45812-68.208-0.43623-102.31 0.0402z\"/>\n</g>\n<g>\n<path d=\"m-787.67 480.84v4.269l15.246 4.269c-2.4244-60.889-2.6556-121.87 0-182.96l-15.246 8.538z\" fill=\"url(#j)\"/>\n<path d=\"m-772.42 489.38c-9.903-2.3864-20.044-2.492-30.455 0l15.208-8.538z\" fill=\"#200045\"/>\n<path d=\"m-300.16 456.4-6.7572 6.1652c4.5277-0.79745 8.0291 0.38427 11.432 1.7557z\" fill=\"#200045\"/>\n<ellipse fill-rule=\"evenodd\" rx=\"22.495\" transform=\"matrix(.66068 0 0 .60986 -1078 -734.79)\" ry=\"21.29\" cy=\"1693.1\" cx=\"1215\" fill=\"url(#c)\"/>\n</g>\n</g>\n</g>\n</svg></div></div><div class=\"card AppCardTop\" data-bind=\" click: function( self, event ) { searchSetup ('d', self, event)} \" style=\" background: #ffffff82;\"><div class=\"content\"><svg viewBox=\"0 0 207.70001 163.80001\" xmlns=\"http://www.w3.org/2000/svg\">\n<g transform=\"translate(-24.5 -19)\">\n<circle cx=\"127\" cy=\"79\" fill=\"#de5833\" r=\"60\"/>\n<path d=\"m177.8 57.5c-2.8-6.6-6.8-12.5-11.8-17.5-5.1-5.1-11-9-17.5-11.8-6.8-2.9-14-4.3-21.5-4.3-7.4 0-14.7 1.5-21.5 4.3-6.6 2.7-12.5 6.7-17.5 11.8-5.1 5.1-9 11-11.8 17.5-2.9 6.8-4.3 14-4.3 21.5 0 7.5 1.5 14.7 4.3 21.5 2.8 6.6 6.8 12.5 11.8 17.5 5.1 5.1 11 9 17.5 11.8 6.8 2.9 14 4.3 21.5 4.3 7.4 0 14.7-1.5 21.5-4.3 6.5-2.8 12.4-6.8 17.5-11.8 5.1-5.1 9-11 11.8-17.5 2.9-6.8 4.3-14 4.3-21.5 0-7.5-1.4-14.7-4.3-21.5zm-38.8 71c-3.2-5.4-11.6-20.5-11.6-31.7 0-25.8 17.3-3.7 17.3-24.3 0-4.9-2.4-22.1-17.4-25.7-3.7-4.9-12.4-9.6-26.2-7.7 0 0 2.3.7 4.9 2 0 0-5 .7-5.2 4.1 0 0 9.9-.5 15.5 1.3-12.9 1.7-19.5 8.5-18.3 20.8 1.7 17.5 9.1 48.7 11.7 59.6-19.6-7-33.7-25.8-33.7-47.9 0-28.1 22.8-51 51-51 28.2 0 51 22.8 51 51-.1 24-16.7 44.1-39 49.5z\" fill=\"#fff\"/>\n<path clip-rule=\"evenodd\" d=\"m124.2 87.3c0-6.6 9-8.7 12.4-8.7 9.2 0 22.2-5.9 25.4-5.8 3.3.1 5.4 1.4 5.4 2.9 0 2.2-18.4 10.5-25.5 9.8-6.8-.6-8.4.1-8.4 2.9 0 2.4 4.9 4.6 10.3 4.6 8.1 0 16-3.6 18.4-1.9 2.1 1.5-5.5 6.9-14.2 6.9-8.7 0-23.8-4.1-23.8-10.7z\" fill=\"#fed30a\" fill-rule=\"evenodd\"/>\n<path d=\"m140.2 59.3c-2.4-3.1-6.7-3.2-8.2.4 2.3-1.8 5.1-2.2 8.2-.4z\" fill=\"#2d4f8d\"/>\n<path d=\"m113.5 59.4c-3.3-2-8.8-2.2-8.5 4.1 1.6-3.9 3.8-4.6 8.5-4.1z\" fill=\"#2d4f8d\"/>\n<path d=\"m138.2 65.2c-1.8 0-3.3 1.5-3.3 3.3 0 1.8 1.5 3.3 3.3 3.3 1.8 0 3.3-1.5 3.3-3.3 0-1.8-1.5-3.3-3.3-3.3zm1.2 3.1c-.5 0-1-.4-1-1 0-.5.4-1 1-1 .6 0 1 .4 1 1-.1.5-.5 1-1 1z\" fill=\"#2d4f8d\"/>\n<path d=\"m112.6 67c-2.1 0-3.8 1.7-3.8 3.8 0 2.1 1.7 3.8 3.8 3.8 2.1 0 3.8-1.7 3.8-3.8 0-2.1-1.7-3.8-3.8-3.8zm1.4 3.5c-.6 0-1.1-.5-1.1-1.1 0-.6.5-1.1 1.1-1.1.6 0 1.1.5 1.1 1.1 0 .6-.5 1.1-1.1 1.1z\" fill=\"#2d4f8d\"/>\n<path d=\"m104.3 50.8c-4.8 3.5-7 8.9-6.3 16.5 1.7 17.5 9.1 48.8 11.7 59.7.9.3 1.8.6 2.7.9-1.6-6.6-9.3-38.8-12.7-63.5-.9-6.6 1.7-10.5 4.6-13.6z\" fill=\"#d5d7d8\"/>\n<path d=\"m116.2 46.5c.4 0 .7-.1.7-.1-5.2-2.5-13.4-2.6-15.6-2.6-.2.4-.4.9-.4 1.4-.1.1 9.6-.5 15.3 1.3z\" fill=\"#d5d7d8\"/>\n<path d=\"m106.8 41.1c-1.6-1.1-2.9-1.8-3.7-2.2-.7.1-1.3.1-2 .2 0 0 2.3.7 4.9 2 0 0-.1 0-.2 0 .7 0 1 0 1 0z\" fill=\"#d5d7d8\"/>\n<path d=\"m147.1 107.6c-1.7-.4-8.3 4.3-10.8 6.1-.1-.5-.2-.9-.3-1.1-.3-1-6.7-.4-8.2 1.2-4-1.9-12-5.6-12.1-3.3-.3 3 0 15.5 1.6 16.4 1.2.7 8-3 11.4-4.9 0 0 0 0 .1 0 2.1.5 6 0 7.4-.9.2-.1.3-.3.4-.5 3.1 1.2 9.8 3.6 11.2 3.1 1.8-.5 1.4-15.6-.7-16.1z\" fill=\"#67bd47\"/>\n<path d=\"m128.8 122c-2.1-.4-1.4-2.5-1.4-7.4 0 0 0 0 0 0-.5.3-.9.7-.9 1.1 0 4.9-.8 7.1 1.4 7.4 2.1.5 6 0 7.6-.9.3-.2.4-.5.5-1-1.5.9-5.2 1.3-7.2.8z\" fill=\"#43a347\"/>\n<path d=\"m24.5 180.6v-24.6h8.9c8.5 0 12.4 6.2 12.4 12 0 6.3-3.8 12.6-12.4 12.6zm2.8-2.9h6.1c6.6 0 9.5-4.9 9.5-9.8 0-4.5-3-9.3-9.5-9.3h-6.1z\" fill=\"#4c4c4c\"/>\n<path d=\"m57 180.9c-4.6 0-7.5-3.1-7.5-8v-9.6h2.7v9.5c0 3.5 2 5.6 5.4 5.6 3.2 0 5.5-2.5 5.5-5.8v-9.3h2.7v17.3h-2.4l-.2-3-.4.5c-1.5 1.8-3.4 2.7-5.8 2.8z\" fill=\"#4c4c4c\"/>\n<path d=\"m78.7 180.9c-4.5 0-9-2.8-9-8.9 0-5.4 3.6-8.9 9-8.9 2.4 0 4.4.8 6.2 2.5l-1.7 1.7c-1.2-1.1-2.8-1.7-4.4-1.7-3.8 0-6.4 2.6-6.4 6.4 0 4.4 3.2 6.4 6.4 6.4 1.8 0 3.4-.6 4.6-1.8l1.7 1.7c-1.8 1.7-4 2.6-6.4 2.6z\" fill=\"#4c4c4c\"/>\n<polygon fill=\"#4c4c4c\" points=\"91.1 180.6 88.5 180.6 88.5 156 91.1 156 91.1 170.9 98.5 163.3 102 163.3 93.8 171.4 103 180.5 103 180.6 99.6 180.6 91.1 172.1\"/>\n<path d=\"m106.2 180.6v-24.6h8.9c8.5 0 12.4 6.2 12.4 12 0 6.3-3.8 12.6-12.4 12.6zm2.9-2.9h6.1c6.6 0 9.5-4.9 9.5-9.8 0-4.5-3-9.3-9.5-9.3h-6.1z\" fill=\"#4c4c4c\"/>\n<path d=\"m138.7 180.9c-4.6 0-7.5-3.1-7.5-8v-9.6h2.7v9.5c0 3.5 2 5.6 5.4 5.6 3.2 0 5.5-2.5 5.5-5.8v-9.3h2.7v17.3h-2.4l-.1-3-.4.5c-1.5 1.8-3.5 2.7-5.9 2.8z\" fill=\"#4c4c4c\"/>\n<path d=\"m160.4 180.9c-4.5 0-9-2.8-9-8.9 0-5.4 3.6-8.9 9-8.9 2.4 0 4.4.8 6.2 2.5l-1.7 1.7c-1.2-1.1-2.8-1.7-4.4-1.7-3.8 0-6.4 2.6-6.4 6.4 0 4.4 3.2 6.4 6.4 6.4 1.8 0 3.4-.6 4.6-1.8l1.7 1.7-.1.1v0c-1.7 1.7-3.8 2.5-6.3 2.5z\" fill=\"#4c4c4c\"/>\n<polygon fill=\"#4c4c4c\" points=\"172.9 180.6 170.3 180.6 170.3 156 172.9 156 172.9 170.9 180.3 163.3 183.7 163.3 175.6 171.4 184.7 180.5 184.7 180.6 181.3 180.6 172.9 172.1\"/>\n<path d=\"m198.6 181c-9.5 0-12.8-6.8-12.8-12.5 0-3.8 1.3-7.1 3.6-9.5 2.3-2.3 5.5-3.5 9.2-3.5 3.4 0 6.5 1.3 8.9 3.6l-1.6 1.9c-1.9-1.8-4.7-2.9-7.3-2.9-6.9 0-10 5.4-10 10.4 0 4.9 3.1 9.9 10.1 9.9 2.5 0 4.9-.9 6.8-2.5l.1-.1v-6.1h-7.7v-2.5h10.3v9.6c-2.7 2.9-5.8 4.2-9.6 4.2z\" fill=\"#4c4c4c\"/>\n<path d=\"m220.4 180.9c-5.2 0-8.9-3.7-8.9-8.9 0-5.2 3.8-9.1 8.9-9.1 5.3 0 9 3.7 9 9.1-.1 5.1-3.8 8.9-9 8.9zm0-15.6c-3.7 0-6.3 2.7-6.3 6.6 0 3.7 2.6 6.4 6.3 6.4 3.7 0 6.3-2.6 6.4-6.4-.1-3.8-2.7-6.6-6.4-6.6z\" fill=\"#4c4c4c\"/>\n<path d=\"m230.9 181.2v0c .2-.1.3-.2.3-.4 0-.2-.1-.3-.2-.4-.1-.1-.3-.1-.6-.1-.3 0-.5 0-.6.1v1.6h.4v-.7h.2c.2 0 .3.1.3.3.1.2.1.3.1.4h.4c0-.1-.1-.2-.1-.4 0-.2-.1-.3-.2-.4zm-.5-.1h-.2v-.5c0 0 .1 0 .2 0 .2 0 .3.1.3.2.1.2 0 .3-.3.3z\" fill=\"#4c4c4c\"/>\n<path d=\"m230.5 179.5c-.9 0-1.7.7-1.7 1.6 0 .9.7 1.7 1.7 1.7.9 0 1.7-.7 1.7-1.7 0-.9-.7-1.6-1.7-1.6zm0 3c-.7 0-1.3-.6-1.3-1.3 0-.7.5-1.3 1.3-1.3.7 0 1.3.6 1.3 1.3 0 .7-.6 1.3-1.3 1.3z\" fill=\"#4c4c4c\"/>\n</g>\n</svg></div></div></div></div><!-- /ko --></form><!-- /ko -->\n<!-- ko if: searchItem() --><div class=\"listItems\" style=\"margin:1em;\"><div class=\"ui top fixed menu borderless\"><div class=\"item\" style=\"width: 90%;\"><form class=\"ui form\" data-bind=\"event: { 'submit': search_form }\" style=\"width: 100%;\"><div class=\"field\"><div class=\"ui search\"><div class=\"ui input icon\" data-bind=\"css : { 'error': showSearchError(), 'loading disabled': showInputLoading }\"><input style=\"color:rgba(0,0,0,0.5);border-radius: 500rem!important;\" type=\"text\" data-bind=\" textInput: searchInputText, hasFocus: SearchInputNextHasFocus, attr: { placeholder: showSearchError() ? ( messageBoxDefine [ errorMessageIndex() ][ $root.languageIndex() ]): infoDefine[ $root.languageIndex() ].coSearch.searchInputPlaceholder }\"><!-- ko if: searchInputText().length --><i class=\"icon circular search link icon\" data-bind=\"click: search_form\" style=\"color: #4285f4!important;\"></i><!-- /ko -->\n<!-- ko if: !searchInputText().length --><i class=\"icon image outline link circular\" data-bind=\" click: function (){ document.getElementById('imageInput1').click() } \" style=\"color: #4285f4!important;\"></i><div class=\"hideInput\" style=\"position: absolute;\"><input onchange=\"_view.appsManager().appScript().imageSearch( this )\" id=\"imageInput1\" type=\"file\" accept=\"image/gif,image/jpeg,image/jpg,image/png\" style=\"opacity:0;width: 0px;height: 0px;\"></div><!-- /ko -->\n<!-- ko if: showSearchError --><i class=\"icon link circular red close\" data-bind=\" click: searchInputCloseError \"></i><!-- /ko --></div></div></div><!-- ko if: searchItem().action --><div class=\"field\" style=\"margin-left: 1em;\"><!-- ko if: currentlyShowItems() !== 0 --><a class=\"basic ui label yellow small\" data-bind=\" click: webItemsClick \" style=\"padding-right: 1em;\"><i class=\"icon rss\"></i><span data-bind=\"text: info.searchToolBarMenu[0][ $root.languageIndex() ] \"></span></a><!-- /ko -->\n<!-- ko if: searchItem().action.news && currentlyShowItems() !== 1 --><a class=\"basic ui label small\" style=\"padding-right: 1em;\" data-bind=\" click: newsButtonClick , style: {  cursor: newsButtonShowLoading() ? 'unset' : 'pointer' }, css: { 'disabled': newsButtonShowLoading(), 'olive': newsItemsArray() &amp;&amp; !newsButtonShowLoading(), 'grey': !newsItemsArray() &amp;&amp; !newsButtonShowError(), 'red': newsButtonShowError() }\"><!-- ko if: newsButtonShowError --><i class=\"icon info red\"></i><span data-bind=\" text: messageBoxDefine[ newsButtonErrorIndex()][ $root.languageIndex() ] \"></span><!-- /ko -->\n<!-- ko ifnot: newsButtonShowError -->\n<!-- ko ifnot: newsButtonShowLoading --><i class=\"icon newspaper outline\"></i><!-- /ko -->\n<!-- ko if: newsButtonShowLoading --><i class=\"icon notched circle loading\" data-bind=\" css: { 'loadingGetResponse': newsLoadingGetResponse, 'conetResponse': newsConetResponse }\"></i><!-- /ko --><span data-bind=\"text: info.searchToolBarMenu[1][ $root.languageIndex() ] \"></span><!-- /ko --></a><!-- /ko -->\n<!-- ko if: searchItem().action.image && currentlyShowItems() !== 2 --><a class=\"basic ui label small\" data-bind=\"click: imageButtonClick, style: {  cursor: imageButtonShowLoading() ? 'unset' : 'pointer' }, css: { teal: imageItemsArray() &amp;&amp; !imageButtonShowLoading(), grey: !imageItemsArray() &amp;&amp; !imageButtonShowError(), red: imageButtonShowError() }\" style=\"padding-right: 1em;\"><!-- ko if: imageButtonShowError() --><i class=\"icon info red\"></i><span data-bind=\" text: messageBoxDefine [ imageButtonErrorIndex()][ $root.languageIndex() ] \"></span><!-- /ko -->\n<!-- ko ifnot: imageButtonShowError() -->\n<!-- ko if: !imageButtonShowLoading() --><i class=\"icon image outline\"></i><!-- /ko -->\n<!-- ko if: imageButtonShowLoading() --><i class=\"icon notched circle loading\" data-bind=\" css: { 'loadingGetResponse': imageLoadingGetResponse, 'conetResponse': imageConetResponse }\"></i><!-- /ko -->\n<!-- /ko --><span data-bind=\"text: info.searchToolBarMenu[2][ $root.languageIndex() ] \"></span></a><!-- /ko -->\n<!-- ko if: searchItem().action.video && currentlyShowItems() !== 3 --><a class=\"basic ui label blue small\" data-bind=\"click: videoButtonClick,style: {  cursor: videoButtonShowLoading() ? 'unset' : 'pointer' }, css: { blue: videoItemsArray() &amp;&amp; !videoButtonShowLoading(), grey: !videoItemsArray() &amp;&amp; !videoButtonShowError(), red: videoButtonShowError() }\" style=\"padding-right: 1em;\"><!-- ko if: videoButtonShowError() --><i class=\"icon info red\"></i><span data-bind=\" text: messageBoxDefine [ videoButtonErrorIndex()] [ $root.languageIndex() ]\"></span><!-- /ko -->\n<!-- ko ifnot: videoButtonShowError() -->\n<!-- ko if: !videoButtonShowLoading() --><i class=\"icon video\"></i><!-- /ko -->\n<!-- ko if: videoButtonShowLoading() --><i class=\"icon notched circle loading\"></i><!-- /ko -->\n<!-- /ko --><span data-bind=\"text: info.searchToolBarMenu[3][ $root.languageIndex() ]  \"></span></a><!-- /ko --></div><!-- /ko -->\n<!-- ko if: !searchItem()['originImage'] && showSearchesRelated() --><div class=\"field\" style=\"margin-left: 1em;\"><div class=\"ui grey header\" data-bind=\"text: infoDefine[ $root.languageIndex() ].coSearch.SearchesRelated[0] + searchInputTextShow() + infoDefine[ $root.languageIndex() ].coSearch.SearchesRelated[1]\" style=\"margin-bottom: 1em;\"></div><div class=\"related ui grid\" style=\"padding-bottom: 1em;\"><!-- ko foreach: searchItem().searchesRelated --><a class=\"five wide column\" href=\"#\" data-bind=\"text: text, click: function () { $parents[0].searchesRelatedSelect ( $parents[0], $index())}\" style=\"padding-top: 0.2rem;padding-bottom: 0.2rem;\"></a><!-- /ko --></div></div><!-- /ko --></form></div></div><div class=\"items\" data-bind=\" style: { 'margin-top': showSearchesRelated() &amp;&amp; !searchItem()['originImage'] ? '15.5em' : '7.5em', 'padding-top': showSearchesRelated() &amp;&amp; !searchItem()['originImage'] ? '1em': '1em' }, click: function () { showSearchesRelated ( false ); return true;}\"><div class=\"AppList CoContent content\"><div class=\"ui items searchItems\"><div class=\"totalResults ui grey header\"><div class=\"sub header\"><span class=\"totalResults1\" data-bind=\" text: info.totalResults[ $root.languageIndex() ]\"></span><span class=\"totalResults2\" data-bind=\" text: searchItem().totalResults\" style=\"margin: 0.5em;\"></span><span class=\"totalResults3\" data-bind=\" text: info.totalResults1[ $root.languageIndex() ]\"></span></div></div><!-- ko if: searchItem()['originImage'] --><div class=\"imageResultInfo item\"><!-- ko with: searchItem()['originImage'] --><div class=\"image\"><img data-bind=\" attr: { src: img }\"></div><div class=\"content\"><div class=\"meta\" data-bind=\" text: infoDefine[ $root.languageIndex() ].coSearch.imageSize \"></div><div class=\"description\" data-bind=\" text: size\" style=\"color: gray;\"></div><div class=\"meta\"><!-- ko ifnot: $parents[0].imageButtonShowError --><div class=\"notSimilarImagesShowError\"><!-- ko if: $parents[0].imageButtonShowLoading --><i class=\"icon notched circle loading\" data-bind=\" css: { 'loadingGetResponse': $parents[0].imageLoadingGetResponse, 'conetResponse': $parents[0].imageConetResponse }\"></i><!-- /ko -->\n<!-- ko if: $parents[0].imageItemsArray() && $parents[0].imageItemsArray().Result --><i class=\"icon file image outline orange link\" data-bind=\"click: function () { $parents[0].imageButtonClick ( $parents[0] )}\"></i><!-- /ko --><a class=\"ui\" data-bind=\"style: { 'color': $parents[0].imageItemsArray() &amp;&amp; $parents[0].imageItemsArray().Result ? '#f2711c': '#4183c4'}, text: infoDefine[ $root.languageIndex() ].coSearch.similarImages, click: function () { $parents[0].imageButtonClick( $parents[0] )}\"></a></div><!-- /ko -->\n<!-- ko if: $parents[0].imageButtonShowError --><span><i class=\"icon info circle red link\" data-bind=\"click: function () { $parents[0].imageButtonClick( $parents[0] )}\"></i><a class=\"ui\" data-bind=\"text: messageBoxDefine [ $parents[0].imageButtonErrorIndex()][ $root.languageIndex() ], click: function () { $parents[0].imageButtonClick( $parents[0] )} \" style=\"color: #990000a8!important;\"></a></span><!-- /ko --></div></div><!-- /ko --></div><!-- /ko --><div class=\"space\"></div><div class=\"space\"></div><!-- ko foreach: searchItemList --><div class=\"item\"><!-- ko if: imageInfo && imageInfo['img'] --><div class=\"image ui top aligned\" data-bind=\"style: { height: imageInfo['videoTime'] ? '90px' : 'auto' }\" style=\" width:150px \"><img data-bind=\"attr: { src: imageInfo.img }\"><!-- ko if: imageInfo['videoTime'] --><div class=\"ui bottom right attached label tiny\" data-bind=\"text: imageInfo['videoTime'] \" style=\" background-color: #3130307a!important;; color: rgba(255, 252, 252, 0.77)!important;;\"></div><!-- /ko --></div><!-- /ko --><div class=\"content\"><div class=\"header\"><a data-bind=\"text: title, attr: { href: url } \" style=\"font-weight: normal;font-size: medium;\" target=\"_blank\"></a></div><!-- ko ifnot: newsBrand --><div class=\"meta\" style=\"margin:unset;\"><span><!-- ko if: !showLoading() && ! snapshotReady() && !showError() --><i class=\"icon object group grey link\" data-bind=\"click: function() { $parents[0].getSnapshotClick( $parents[0], $index ())}\"></i><!-- /ko -->\n<!-- ko if: showLoading --><i class=\"icon notched circle loading\" data-bind=\"css: { 'loadingGetResponse': loadingGetResponse, 'conetResponse': conetResponse }\"></i><!-- /ko -->\n<!-- ko if: snapshotReady --><i class=\"icon file image outline olive link\" data-bind=\"click: function() { $parents[0].showSnapshotClick( $parents[0], $index())}\"></i><!-- /ko -->\n<!-- ko if: showError --><i class=\"icon info circle red link\" data-bind=\"attr: { id: id, 'data-content': messageBoxDefine [ errorIndex()] [ $root.languageIndex() ]}\"></i><!-- /ko --></span><span data-bind=\"text: urlShow, style: { color: snapshotReady() ? 'orange' : ( showError() ? 'red' : 'green') } \" style=\"margin-top: 0.5em; margin-bottom: 0.5em; font-size: small;\"></span></div><!-- /ko --><div class=\"description\" style=\" color: grey; \"><!-- ko if: newsBrand --><p><span><!-- ko if: !showLoading() && ! snapshotReady() && !showError() --><a class=\"ui image mini\" data-bind=\"click: function() { $parents[0].getSnapshotClick( $parents[0], $index ())}\" href=\"#\"><img data-bind=\"attr: { src: newsBrandImg }\"></a><!-- /ko -->\n<!-- ko if: showLoading --><i class=\"icon notched circle loading\" data-bind=\"css: { 'loadingGetResponse': loadingGetResponse, 'conetResponse': conetResponse }\"></i><!-- /ko -->\n<!-- ko if: snapshotReady --><i class=\"icon file image outline olive link\" data-bind=\"click: function() { $parents[0].showSnapshotClick( $parents[0], $index())}\"></i><!-- /ko -->\n<!-- ko if: showError --><i class=\"icon info circle red link\" data-bind=\"attr: { id: id, 'data-content': messageBoxDefine [ errorIndex()] [ $root.languageIndex()]}\"></i><!-- /ko --></span><span data-bind=\" text: newsBrand \" style=\"font-weight: bolder; color: #906363db;\"></span><!-- ko if: beforeTime -->\n<!-- ko with: beforeTime -->\n<!-- ko if: timeNumber --><span data-bind=\"text: ' - ' + timeNumber + ' ' + infoDefine[ $root.languageIndex() ].coSearch.timeUnit[ timeUnit ]\" style=\"font-weight: bolder; color: #906363db;\"></span><!-- /ko -->\n<!-- ko if: time --><span data-bind=\"text: ' - ' + infoDefine[ $root.languageIndex() ].coSearch.TimeTolocalTime ( time )\" style=\"font-weight: bolder; color: #906363db;\"></span><!-- /ko -->\n<!-- /ko -->\n<!-- /ko --></p><!-- /ko -->\n<!-- ko ifnot: newsBrand -->\n<!-- ko if: beforeTime -->\n<!-- ko with: beforeTime -->\n<!-- ko if: timeNumber --><span data-bind=\"text: timeNumber + ' ' + infoDefine[ $root.languageIndex() ].coSearch.timeUnit[ timeUnit ] + ' - '\" style=\"font-weight: bolder; color: #906363db;\"></span><!-- /ko -->\n<!-- ko if: time --><span data-bind=\"text: infoDefine[ $root.languageIndex() ].coSearch.TimeTolocalTime ( time ) + ' - '\" style=\"font-weight: bolder; color: #906363db;\"></span><!-- /ko -->\n<!-- /ko -->\n<!-- /ko -->\n<!-- /ko --><span data-bind=\"text: description\" style=\"color: grey\"></span></div></div></div><div class=\"space\"></div><div class=\"space\"></div><!-- /ko -->\n<!-- ko if: !nextButtonShowError() && searchItem().nextPage --><button class=\"ui large button\" data-bind=\"css: { 'loading buttonUnActive': moreResultsButtomLoading,  negative: nextButtonShowError, 'loadingGetResponse': nextButtonLoadingGetResponse, 'conetResponse': nextButtonConetResponse },text: info.moreResults[ $root.languageIndex() ], click: searchNext\" style=\"margin-top: 1em;margin-bottom: 2em;\"></button><!-- /ko -->\n<!-- ko if: nextButtonShowError --><button class=\"ui large button negative\" data-bind=\"text: messageBoxDefine [ nextButtonErrorIndex()][ $root.languageIndex() ], click: nextButtonErrorClick \" style=\"background-color: #b94835e3;margin-top: 1em;margin-bottom: 2em;\"></button><!-- /ko --><div class=\"space\"></div><div class=\"space\"></div></div></div></div></div><!-- /ko --></div><!-- /ko -->\n<!-- ko if: !showMain() && showSnapshop () --><div id=\"subPage\" data-bind=\" with: showWebPage \"><div class=\"ui top fixed menu borderless\"><div class=\"item\" style=\"width: 90%;\"><form class=\"ui form\" style=\"width: 100%;\" data-bind=\"css: { 'error': showErrorMessage }\"><div class=\"field\" style=\"width: 100%;\"><div class=\"ui left icon input\" data-bind=\"css : { 'loading': showLoading }\" style=\"width: 100%;\"><i class=\"icon close link circular\" data-bind=\"click: close \" style=\"color: #4285f4!important;\"></i><input style=\"color: rgba ( 0,0,0,0.5 );\" readonly data-bind=\"value: showUrl\"><!-- ko if: showHtmlCodePage() && ! showLoading() --><i class=\"icon link image circular\" data-bind=\" click: imgClick \" style=\"left: auto; right: .5em; color:#947b66!important;\"></i><!-- /ko -->\n<!-- ko if: showImgPage() && ! showLoading() --><i class=\"icon link code circular\" data-bind=\" click: htmlClick \" style=\"left: auto; right: .5em; color:#346b0b!important;\"></i><!-- /ko --></div></div><!-- ko if: showLoading --><div class=\"field\"><p data-bind=\" text: messageBoxDefine ['LoadingPage'][$root.languageIndex()]\" style=\"color: grey;\"></p></div><div class=\"field\"><div class=\"loaderCoNET\" style=\" margin-top: 3em;\"><div class=\"loaderCoNET-div\"></div><div class=\"loaderCoNET-div\"></div><div class=\"loaderCoNET-div\"></div><div class=\"loaderCoNET-div\"></div></div></div><!-- /ko -->\n<!-- ko if: showErrorMessage --><div class=\"ui error message\"><span><i class=\"icon exclamation triangle red link\"></i><span data-bind=\" text: messageBoxDefine ['pageLoadingError'][$root.languageIndex()]\"></span></span></div><!-- /ko --></form></div></div><!-- ko if: showHtmlCodePage --><iframe data-bind=\" attr: { src: htmlIframe() } \" style=\"border: none;width: 100%; height: -webkit-fill-available;margin-top: 7em;\" sandbox=\"allow-forms\"></iframe><!-- /ko -->\n<!-- ko if: showImgPage --><img data-bind=\" attr: { src: png }\" style=\"border: none;margin: 7em 1em 1em 1em;\"><!-- /ko --></div><!-- /ko -->\n<!-- ko if: !showMain() && showSearchSimilarImagesResult () --><div class=\"closeButton\" style=\"z-index: 999;top: 1.3em; left: 1em; position: fixed; width: 2em;\"><i class=\"icon left chevron link circular teal\" data-bind=\"click: closeSimilarImagesResult \"></i></div><div class=\"ui six doubling cards\" data-bind=\" foreach: searchSimilarImagesList \" style=\"margin: 2em; margin-top: 3em;\"><div class=\"card\"><a class=\"ui right corner label\" data-bind=\"click: function() { return $parents[0].imagesResultClick( $parents[0], $index (), 'img')},  class: showImageError() ? 'red' : ( snapshotImageReady() ? 'teal': 'grey')\"><!-- ko if: !showImageLoading() && !showImageError() --><i class=\"icon object group link\"></i><!-- /ko -->\n<!-- ko if: showImageLoading --><i class=\"icon notched circle loading\" data-bind=\"css: { 'loadingGetResponse': loadingImageGetResponse, 'conetResponse': conetImageResponse }\"></i><!-- /ko -->\n<!-- ko if: showImageError --><i class=\"icon info circle link\" data-bind=\"attr: { id: id + '-1', 'data-content': messageBoxDefine [ imageErrorIndex()] [ $root.languageIndex() ] }\"></i><!-- /ko --></a><a class=\"ui image\" data-bind=\"attr: { 'href': imgUrlHref }\" target=\"_blank\"><img data-bind=\"attr: { src: imgSrc }\"></a><div class=\"content\"><div class=\"meta\"><span class=\"data\" data-bind=\"text: infoDefine[ $root.languageIndex() ].coSearch.imageSize\"></span><span class=\"data\" data-bind=\"text: size\"></span></div><div class=\"description\" data-bind=\"text: description \"></div></div><div class=\"extra content\"><span><!-- ko if: !showLoading() && !showError() --><i class=\"icon object group link\" data-bind=\"class: snapshotReady() ? 'olive': 'grey', click: function() { return $parents[0].imagesResultClick( $parents[0], $index (), 'link')}\"></i><!-- /ko -->\n<!-- ko if: showLoading --><i class=\"icon notched circle loading\" data-bind=\"css: { 'loadingGetResponse': loadingGetResponse, 'conetResponse': conetResponse }\"></i><!-- /ko -->\n<!-- ko if: showError --><i class=\"icon info circle red link\" data-bind=\"attr: { id: id, 'data-content': messageBoxDefine [ errorIndex()] [ $root.languageIndex() ]}\"></i><!-- /ko --></span><a data-bind=\"text: webUrl, attr: { 'href': webUrlHref }\" target=\"_blank\"></a></div></div></div><!-- /ko --></div><!-- /ko --></div>`\nconst appMenuData = 'appmenu'\n\ndeclare const Jimp\n\nclass appsManager {\n\tpublic mainPages = ko.observable( null )\n\tpublic mainLoading = ko.observable ( true )\n\tpublic loadingError = ko.observable ( null )\n\tpublic mainHtml = ko.observable ( '' )\n\tpublic appHtml = ko.observable ( false )\n\tpublic appScript = ko.observable ()\n\tpublic showMain = ko.observable ( false )\n\tpublic showMainMenu = ko.observable ( true )\n\tpublic loadingGetResponse = ko.observable ( false )\n\tpublic conetResponse = ko.observable ( false )\n\tpublic showSnapshop = ko.observable ( false )\n\tprivate appMenu = this.getAppMenu ()\n\tpublic runningAppHtml = ko.observable ( null )\n\tpublic showAppMain = ko.observable ( false )\n\tpublic AppObj = {}\n\tpublic appLoadingError = ko.observable ( false )\n\tpublic appLoadingErrorIndex = ko.observable (null)\n\t/***\n\t * \n\t * \t\tdebug temp \n\t*/\n\n\tpublic showTempMain = ko.observable ( false )\n\tpublic tempAppHtml = ko.observable ( false )\n\n\t/**\n\t * \t\t\n\t */\n\n\tpublic mainScript = ko.observable (null)\n\n\tprivate getAppMenu () {\n\n\t\tconst uu = window.localStorage.getItem ( appMenuData )\n\t\ttry {\n\t\t\treturn JSON.parse ( uu )\n\t\t} catch ( ex ) {\n\t\t\treturn null\n\t\t}\n\t}\n\n\tprivate initMenuArray ( mainMenuArray ) {\n\t\tmainMenuArray.forEach ( n => {\n\t\t\tn['loading'] = ko.observable ( false )\n\t\t\tn['loadingGetResponse'] = ko.observable ( false )\n\t\t\tn['conetResponse'] = ko.observable ( false )\n\t\t\t\n\t\t})\n\n\t}\n\n\tprivate showLoadingGetResponse ( item ) {\n\t\titem.loadingGetResponse ( true )\n\t\titem.conetResponse ( false )\n\t}\n\n\tprivate showConetResponse ( item ) {\n\t\titem.loadingGetResponse ( false )\n\t\titem.conetResponse ( true )\n\t}\n\n\tprivate getAppObject ( mainMenuItem ) {\n\t\tfor ( let i = 0; i < mainMenuItem.length; i ++ ) {\n\t\t\tconst uu = mainMenuItem[i]\n\t\t\tif ( uu.active ) {\n\t\t\t\tconst objName = `APP-${ i }`\n\t\t\t\tconst kk = window.localStorage.getItem ( objName )\n\t\t\t\ttry {\n\t\t\t\t\tthis.AppObj[ objName ] = JSON.parse ( kk )\n\t\t\t\t} catch ( ex ) {\n\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic updateAppsManu ( _self = null ) {\n\t\tconst self = _self || this\n\t\tself.appLoadingError ( false )\n\t\t/**\n\t\t * \n\t\t * \t\tDEBUG use Temp Pug\n\t\t * \n\t\t */\n\t\t\n\t\tconst _mainMenuObj = _mainMenuObj111\n\t\tself.initMenuArray ( _mainMenuObj.mainMenuItem )\n\t\t_mainMenuObj['_mainMenuItem'] = ko.observableArray ( _mainMenuObj.mainMenuItem )\n\t\tself.mainLoading ( false )\n\t\tself.showTempMain ( true )\n\t\treturn self.mainScript ( _mainMenuObj )\n\t\t/** */\n\t\t\n\t\tconst viewMainMenuu = () => {\n\t\t\t\n\t\t\tself.mainHtml ( self.appMenu [1] )\n\t\t\t\n\t\t\tconst _mainMenuObj = JSON.parse ( self.appMenu [2] )\n\t\t\tself.initMenuArray ( _mainMenuObj.mainMenuItem )\n\n\t\t\t_mainMenuObj['_mainMenuItem'] = ko.observableArray ( _mainMenuObj.mainMenuItem )\n\n\t\t\tself.mainScript ( _mainMenuObj )\n\t\t\tself.showMain ( true )\n\t\t\tself.mainLoading ( false )\n\t\t\tself.mainLoading ( false )\n\t\t\tself.conetResponse ( false )\n\t\t\t_view.connectInformationMessage.hideMessage()\n\t\t\tthis.getAppObject ( _mainMenuObj.mainMenuItem )\n\t\t}\n\n\t\tif ( this.appMenu && this.appMenu.length ) {\n\n\t\t\tviewMainMenuu ()\n\t\t\t\n\t\t}\n\n\t\tconst showError = ( err ) => {\n\t\t\tself.mainLoading ( false )\n\t\t\t//_view.connectInformationMessage.hideMessage()\n\t\t\tself.loadingError ( _view.connectInformationMessage.getErrorIndex ( err ) )\n\t\t\tself.loadingGetResponse ( false )\n\t\t\treturn self.conetResponse ( false )\n\t\t}\n\t\t\n\t\tconst com: QTGateAPIRequestCommand = {\n\t\t\tcommand: 'mainMenu',\n\t\t\tArgs: this.appMenu && this.appMenu[0] ? this.appMenu[0]: null ,\n\t\t\terror: null,\n\t\t\tsubCom: null\n\t\t}\n\n\t\treturn _view.keyPairCalss.emitRequest ( com,( err, com: QTGateAPIRequestCommand ) => {\n\t\t\n\t\t\tif ( err ) {\n\t\t\t\treturn showError ( err )\n\t\t\t}\n\n\t\t\tif ( !com ) {\n\t\t\t\tself.conetResponse ( false )\n\t\t\t\treturn self.loadingGetResponse ( true )\n\t\t\t}\n\n\t\t\tif ( com.error === -1 ) {\n\t\t\t\tself.loadingGetResponse ( false )\n\t\t\t\treturn self.conetResponse ( true )\n\t\t\t}\n\n\t\t\tif ( com.error ) {\n\t\t\t\treturn showError ( com.error  )\n\t\t\t}\n\t\t\t_view.connectInformationMessage.hideMessage ()\n\t\t\tif ( !com.Args || !com.Args.length ) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.appMenu = com.Args\n\t\t\t\n\t\t\tif ( typeof Storage !== \"undefined\" ) {\n\t\t\t\t\n\t\t\t\twindow.localStorage.setItem ( appMenuData, JSON.stringify ( com.Args ))\n\t\t\t}\n\n\t\t\t\n\t\t\t\n\t\t\treturn viewMainMenuu ()\n\n\t\t})\n\t\t\n\t}\n\n\tpublic mainNemuError () {\n\t\tthis.exit ()\n\t}\n\n\n\n\n\tpublic appClick ( appIndex: number ) {\n\n\t\tconst self = this\n\t\tconst item = self.mainScript().mainMenuItem[ appIndex ]\n\t\tself.mainScript()._mainMenuItem ([ item ])\n\t\titem.loading ( true )\n\n\t\tconst runningApp = ( obj ) => {\n\t\t\t_view.bodyBlue ( false )\n\t\t\t_view.showIconBar ( false )\n\t\t\tthis.showMainMenu ( false )\n\n\t\t\t/**\n\t\t\t * \n\t\t\t * \t\t\tDEBUG APP use Temp pug\n\t\t\t * \n\t\t\t */\n\n\t\t\t\n\t\t\t\n\t\t\tthis.tempAppHtml ( true )\n\t\t\t\n\t\t\tappScript.startup ( appScript )\n\t\t\t\n\t\t\tthis.appScript ( appScript )\n\t\t\t_view.CanadaBackground ( true )\n\t\t\treturn \n\t\t\t/** */\n\n\n\t\t\t/**\n\t\t\t * \n\t\t\t * \t\t\tUse appHtml \n\t\t\t */\n\n\t\t\t\n\n\t\t\t/*\n\t\t\tthis.runningAppHtml ( appHtml )\n\t\t\tthis.appHtml ( true )\n\t\t\t\n\t\t\tthis.showAppMain ( true )\n\t\t\tappScript.startup ( appScript )\n\t\t\t\n\t\t\tthis.appScript ( appScript )\n\n\t\t\t/** */\n\n\t\t\tthis.runningAppHtml ( obj[1] )\n\t\t\tthis.appHtml ( true )\n\t\t\t\n\t\t\teval ( obj[2])\n\t\t\tappScript.startup ( appScript )\n\t\t\tthis.appScript ( appScript )\n\t\t\tthis.showAppMain ( true )\n\t\t}\n\n\t\tconst AppName = `APP-${ appIndex }`\n\t\tlet obj = this.AppObj[ AppName ]\n\n\t\t/**\n\t\t * \n\t\t * \t\tuse Debug \n\t\t * \n\t\t */\n\t\t\n\t\treturn runningApp ( null )\n\n\t\t/** end Debug */\n\n\n\n\t\tif ( obj ) {\n\t\t\trunningApp ( obj )\n\t\t}\n\n\t\tconst com: QTGateAPIRequestCommand = {\n\t\t\tcommand: AppName,\n\t\t\tArgs: obj && obj[0] ? obj[0]: null,\n\t\t\terror: null,\n\t\t\tsubCom: null\n\t\t}\n\n\t\tconst showError = ( err ) => {\n\t\t\titem.loading ( false )\n\t\t\tself.appLoadingErrorIndex ( _view.connectInformationMessage.getErrorIndex ( err ))\n\t\t\treturn self.appLoadingError ( true )\n\t\t\t\n\t\t}\n\n\t\treturn _view.keyPairCalss.emitRequest ( com, ( err, com: QTGateAPIRequestCommand ) => {\n\t\t\n\t\t\tif ( err ) {\n\t\t\t\treturn showError ( err )\n\t\t\t}\n\n\t\t\tif ( !com ) {\n\t\t\t\tself.conetResponse ( false )\n\t\t\t\treturn self.loadingGetResponse ( true )\n\t\t\t}\n\n\t\t\tif ( com.error === -1 ) {\n\t\t\t\tself.loadingGetResponse ( false )\n\t\t\t\treturn self.conetResponse ( true )\n\t\t\t}\n\n\t\t\tif ( com.error ) {\n\t\t\t\treturn showError ( com.error  )\n\t\t\t}\n\t\t\t_view.connectInformationMessage.hideMessage ()\n\t\t\tif ( !com.Args || !com.Args.length ) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tobj = com.Args\n\t\t\t\n\t\t\tif ( typeof Storage !== \"undefined\" ) {\n\t\t\t\t\n\t\t\t\twindow.localStorage.setItem ( AppName, JSON.stringify ( com.Args ))\n\t\t\t}\n\n\t\t\t\n\t\t\t\n\t\t\treturn runningApp ( obj )\n\n\t\t})\n\n\n\t\t\n\t\t\n\t\t\n\t}\n\n\tconstructor ( private exit: () => void ) {\n\n\t\t_view.sectionLogin ( false )\n\t\tthis.updateAppsManu()\n\n\t}\n}"
  },
  {
    "path": "app/public/scripts/connectInformationMessage.js",
    "content": "/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst messageBoxDefine = {\n    LoadingPage: ['正在解密数据和加载页面', '暗号化したデータを復号化とページの読み込み中。', 'Decrypting data and loading page.', '正在解密数据和加载頁面'],\n    offline: ['无互联网，邮件服务器无法到达！', 'インターネットがないか、メールサーバーへ接続ができません！', 'Have no Internet, can not connect to mail server!', '無互聯網，郵件伺服器無法到達！'],\n    systemError: ['CoNET客户端故障，请重启后再试', '端末故障です、CoNETを再起動してください', 'CoNET client error! Restart CoNET please!', 'CoNET客戶端故障，請重啟後再試'],\n    reConnectCoNET: ['CoNET链接已中断', 'CoNETとの接続が中断され', 'CoNET connection lost.', 'CoNET的鏈接已中斷'\n    ],\n    connectingToCoNET: ['正在连接CoNET...', 'CoNETへ接続中...', 'Connecting to CoNET...', '正在連結CoNET...'\n    ],\n    connectedToCoNET: ['无IP地址成功连接CoNET', 'IPなしでCoNETに接続しました', 'Success to connect CoNET without IP address.', '無IP地址成功連結CoNET'\n    ],\n    maximumRequest: [\n        '您的请求已达最大值，请稍后再试',\n        'レクエスト回数は制限にかかった、後ほど改めてお試しください',\n        'Request maximum error. Try again later.',\n        '您的請求已達最大值，請稍後再試'\n    ],\n    invalidRequest: [\n        '无效请求',\n        '無効なレクエスト',\n        'Invalid request.',\n        '無效請求'\n    ],\n    unKnowError: [\n        '未知错误，请再试！如果持续发生请重启CoNET客户端或重新安装',\n        '不明なエラーが発生、もしこんな状況が続くであれば、CoNET端末を再起動するか、CoNET端末を再インストールしてください。',\n        'Oops. Unknown error. Try again or restart CoNET client, if still same error please re-install CoNET.',\n        '未知错误，请再试！如果持续发生请重启CoNET客户端或重新安装'\n    ],\n    NodeInBusy: [\n        '节点目前繁忙，请稍后再试', 'ノードは忙しいです。しばらくしてからもう一度お試しください', 'Node is currently busy, please try again later', '节点目前繁忙，请稍后再试'\n    ],\n    PgpMessageFormatError: [\n        '内容格式错误，请复制从“-----BEGIN PGP MESSAGE----- （开始，一直到）-----END PGP MESSAGE-----” 结束的完整内容，粘贴在此输入框中。',\n        'フォーマットエラー、コピーするのは「-----BEGIN PGP MESSAGE-----」から「-----END PGP MESSAGE-----」まで全ての内容をしてください。',\n        'Format error! Copy all content from [-----BEGIN PGP MESSAGE-----] ... to [-----END PGP MESSAGE-----]. Paste into this text box.',\n        '內容格式錯誤，請複制從“-----BEGIN PGP MESSAGE----- （開始，一直到）-----END PGP MESSAGE-----” 結束的完整內容，粘貼在此輸入框中。'\n    ],\n    PgpDecryptError: [\n        '提供的内容不能被解密，请确认这是在您收到的最后一封从CoNET发送过来的激活信。如果还是没法完成激活，请删除您的密钥重新生成和设定。',\n        'この内容で暗号化解除ができませんでした。鍵ペアEmailアカンウトメールボックス再検査し、CoNETから最後のを選んでください。または鍵ペアを削除して、鍵ペア再発行してください。',\n        'Decrypt message failed. Find the lasest mail from CoNET in your key pair email mailbox. Or delete this key pair and rebuild new key pair please.',\n        '提供的內容不能被解密，請確認這是在您收到的最後一封從CoNET發送過來的激活信。如果還是沒法完成激活，請刪除您的密鑰重新生成和設定。'\n    ],\n    pageLoadingError: [\n        '页面加载发生错误', 'エラーが発生してページの読み込みが完了できません', 'Loading page has error.', '頁面加載發生錯誤'\n    ],\n    connectToMailServer: [\n        '正在连接邮件服务器: ',\n        'メールサーバーへ接続をしています: ',\n        'Connect to mail server: ',\n        '正在連接郵件伺服器: '\n    ],\n    connectedMailServer: [\n        '正在连接邮件服务器: 完成',\n        'メールサーバーへ接続をしています: 完成',\n        'Connect to mail server: success.',\n        '正在連接郵件伺服器: 完成'\n    ],\n    waitingPong: [\n        '正在等待节点响应: ',\n        'ノートのレスポンスを待っています: ',\n        'Waiting for a response from node: ',\n        '正在等待節點響應: '\n    ],\n    waitingPongTimeOver: [\n        '正在等待节点响应: 超时错误！',\n        'ノートのレスポンスを待っています: タイムオーバーエラー！',\n        'Waiting for a response from node: Over time error!',\n        '正在等待節點響應: 響應超時錯誤！'\n    ],\n    sendConnectRequestMail: [\n        '客户端向节点发出联机请求邮件，完成需要额外的时间，请耐心等待',\n        '接続メールをノートへ送信しました、完了まで時間がかかります、しばらくお待ち下さい',\n        'Sending connection request email to node. Please wait a moment',\n        '客戶端向節點發出聯機請求郵件，完成需要額外的時間，請耐心等待'\n    ],\n    timeOut: [\n        '节点无响应，可能正在忙碌中，请稍后再试',\n        'ノートの応答がなかったです、忙しいかもしれませんが、後ほどもう一度してみてください。',\n        'Node have not responding to requests, try again later.',\n        '節點無響應，可能正在忙碌中，請稍後再試'\n    ],\n};\nclass connectInformationMessage {\n    constructor(url = \"/\") {\n        this.url = url;\n        this.offlineInfo = ko.observable(false);\n        this.showNegative = ko.observable(false);\n        this.showGreen = ko.observable(false);\n        this.messageArray = ko.observable(null);\n        this.socketIoOnline = true;\n        this.socketIo = io(`${this.url}`, { reconnectionAttempts: 5, timeout: 500, autoConnect: true });\n        this.first = true;\n        const self = this;\n        this.offlineInfo.subscribe(function (vv) {\n            if (this.first) {\n                return;\n            }\n            const div = $('#offlineInfo');\n            if (vv) {\n                return div.transition('fly down');\n            }\n            div.transition('fly down');\n        });\n        this.first = false;\n        this.socketIo.on('reconnect_failed', () => {\n            this.socketIoOnline = false;\n            self.showErrorMessage('systemError');\n        });\n        this.socketIo.on('reconnect', attempt => {\n            this.socketIoOnline = true;\n            this.hideMessage();\n        });\n        this.socketIo.on('systemErr', err => {\n            self.showErrorMessage(err);\n        });\n    }\n    sockEmit(eventName, ...args) {\n        const self = this;\n        if (!this.socketIoOnline) {\n            return this.showErrorMessage('systemError');\n        }\n        const argLength = args.length - 1;\n        let _CallBack = null;\n        if (argLength > -1 && typeof (args[argLength]) === 'function') {\n            _CallBack = args.pop();\n        }\n        const _timeout = setTimeout(() => {\n            if (_CallBack) {\n                _CallBack(new Error('systemErr'));\n                return _CallBack = null;\n            }\n            return this.showSystemError();\n        }, 3000);\n        return this.socketIo.emit(eventName, ...args, uuid => {\n            clearTimeout(_timeout);\n            return this.socketIo.once(uuid, (err, ...data) => {\n                if (err) {\n                    self.showErrorMessage(err);\n                }\n                if (_CallBack) {\n                    return _CallBack(err, ...data);\n                }\n            });\n        });\n    }\n    showErrorMessage(err) {\n        if (!err) {\n            return;\n        }\n        const errMes = (typeof err === \"string\") ? messageBoxDefine[err] : messageBoxDefine[err.message] || err.message;\n        if (!errMes) {\n            return;\n        }\n        this.hideMessage();\n        this.messageArray(errMes);\n        this.showNegative(true);\n        this.offlineInfo(true);\n    }\n    showSystemError() {\n        return this.showErrorMessage('systemError');\n    }\n    showRestartCoNET_Connect() {\n        this.showErrorMessage('reConnectCoNET');\n    }\n    hideMessage() {\n        this.offlineInfo(false);\n        this.messageArray(null);\n        this.showNegative(false);\n    }\n    getErrorIndex(err) {\n        if (!err) {\n            return 'unKnowError';\n        }\n        if (typeof err !== 'object') {\n            return messageBoxDefine[err] ? err : 'unKnowError';\n        }\n        return messageBoxDefine[err['message']] ? err['message'] : 'unKnowError';\n    }\n}\n"
  },
  {
    "path": "app/public/scripts/connectInformationMessage.ts",
    "content": "/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst messageBoxDefine = {\n\tLoadingPage: ['正在解密数据和加载页面','暗号化したデータを復号化とページの読み込み中。','Decrypting data and loading page.','正在解密数据和加载頁面'],\n\toffline:\n\t\t['无互联网，邮件服务器无法到达！','インターネットがないか、メールサーバーへ接続ができません！','Have no Internet, can not connect to mail server!','無互聯網，郵件伺服器無法到達！'],\n\tsystemError:\n\t\t['CoNET客户端故障，请重启后再试','端末故障です、CoNETを再起動してください','CoNET client error! Restart CoNET please!','CoNET客戶端故障，請重啟後再試'],\n\treConnectCoNET:\n\t\t['CoNET链接已中断','CoNETとの接続が中断され','CoNET connection lost.','CoNET的鏈接已中斷'\n\t],\n\tconnectingToCoNET:\n\t\t['正在连接CoNET...','CoNETへ接続中...','Connecting to CoNET...','正在連結CoNET...'\n\t],\n\tconnectedToCoNET:\n\t\t['无IP地址成功连接CoNET','IPなしでCoNETに接続しました','Success to connect CoNET without IP address.','無IP地址成功連結CoNET'\n\t],\n\t\n\tmaximumRequest: [\n\t\t'您的请求已达最大值，请稍后再试',\n\t\t'レクエスト回数は制限にかかった、後ほど改めてお試しください',\n\t\t'Request maximum error. Try again later.',\n\t\t'您的請求已達最大值，請稍後再試'\n\t],\n\tinvalidRequest: [\n\t\t'无效请求',\n\t\t'無効なレクエスト',\n\t\t'Invalid request.',\n\t\t'無效請求'\n\t],\n\tunKnowError: [\n\t\t'未知错误，请再试！如果持续发生请重启CoNET客户端或重新安装',\n\t\t'不明なエラーが発生、もしこんな状況が続くであれば、CoNET端末を再起動するか、CoNET端末を再インストールしてください。',\n\t\t'Oops. Unknown error. Try again or restart CoNET client, if still same error please re-install CoNET.',\n\t\t'未知错误，请再试！如果持续发生请重启CoNET客户端或重新安装'\n\n\t],\n\tNodeInBusy: [\n\t\t'节点目前繁忙，请稍后再试','ノードは忙しいです。しばらくしてからもう一度お試しください','Node is currently busy, please try again later','节点目前繁忙，请稍后再试'\n\t],\n\tPgpMessageFormatError: [\n\t\t'内容格式错误，请复制从“-----BEGIN PGP MESSAGE----- （开始，一直到）-----END PGP MESSAGE-----” 结束的完整内容，粘贴在此输入框中。',\n\t\t'フォーマットエラー、コピーするのは「-----BEGIN PGP MESSAGE-----」から「-----END PGP MESSAGE-----」まで全ての内容をしてください。',\n\t\t'Format error! Copy all content from [-----BEGIN PGP MESSAGE-----] ... to [-----END PGP MESSAGE-----]. Paste into this text box.',\n\t\t'內容格式錯誤，請複制從“-----BEGIN PGP MESSAGE----- （開始，一直到）-----END PGP MESSAGE-----” 結束的完整內容，粘貼在此輸入框中。'\n\t],\n\tPgpDecryptError: [\n\t\t'提供的内容不能被解密，请确认这是在您收到的最后一封从CoNET发送过来的激活信。如果还是没法完成激活，请删除您的密钥重新生成和设定。',\n\t\t'この内容で暗号化解除ができませんでした。鍵ペアEmailアカンウトメールボックス再検査し、CoNETから最後のを選んでください。または鍵ペアを削除して、鍵ペア再発行してください。',\n\t\t'Decrypt message failed. Find the lasest mail from CoNET in your key pair email mailbox. Or delete this key pair and rebuild new key pair please.',\n\t\t'提供的內容不能被解密，請確認這是在您收到的最後一封從CoNET發送過來的激活信。如果還是沒法完成激活，請刪除您的密鑰重新生成和設定。'\n\t],\n\tpageLoadingError: [\n\t\t'页面加载发生错误','エラーが発生してページの読み込みが完了できません','Loading page has error.','頁面加載發生錯誤'\n\t],\n\tconnectToMailServer: [\n\t\t'正在连接邮件服务器: ',\n\t\t'メールサーバーへ接続をしています: ',\n\t\t'Connect to mail server: ',\n\t\t'正在連接郵件伺服器: '\n\t],\n\tconnectedMailServer: [\n\t\t'正在连接邮件服务器: 完成',\n\t\t'メールサーバーへ接続をしています: 完成',\n\t\t'Connect to mail server: success.',\n\t\t'正在連接郵件伺服器: 完成'\n\t],\n\twaitingPong :[\n\t\t'正在等待节点响应: ',\n\t\t'ノートのレスポンスを待っています: ',\n\t\t'Waiting for a response from node: ',\n\t\t'正在等待節點響應: '\n\t],\n\twaitingPongTimeOver :[\n\t\t'正在等待节点响应: 超时错误！',\n\t\t'ノートのレスポンスを待っています: タイムオーバーエラー！',\n\t\t'Waiting for a response from node: Over time error!',\n\t\t'正在等待節點響應: 響應超時錯誤！'\n\t],\n\tsendConnectRequestMail :[\n\t\t'客户端向节点发出联机请求邮件，完成需要额外的时间，请耐心等待',\n\t\t'接続メールをノートへ送信しました、完了まで時間がかかります、しばらくお待ち下さい',\n\t\t'Sending connection request email to node. Please wait a moment',\n\t\t'客戶端向節點發出聯機請求郵件，完成需要額外的時間，請耐心等待'\n\t],\n\ttimeOut: [\n\t\t'节点无响应，可能正在忙碌中，请稍后再试',\n\t\t'ノートの応答がなかったです、忙しいかもしれませんが、後ほどもう一度してみてください。',\n\t\t'Node have not responding to requests, try again later.',\n\t\t'節點無響應，可能正在忙碌中，請稍後再試'\n\t],\n\n\n\n}\n\n\nclass connectInformationMessage {\n\tpublic offlineInfo = ko.observable ( false )\n\tpublic showNegative = ko.observable ( false )\n\tpublic showGreen = ko.observable ( false )\n\tpublic messageArray = ko.observable ( null )\n\tpublic socketIoOnline = true\n\tpublic socketIo =  io ( `${ this.url }`, { reconnectionAttempts: 5, timeout: 500, autoConnect: true })\n\n\tprivate first = true\n\tconstructor ( private url: string = \"/\") {\n\n\t\tconst self = this\n\n\t\tthis.offlineInfo.subscribe ( function (vv) {\n\t\t\tif ( this.first ) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst div =  $('#offlineInfo')\n\t\t\tif ( vv ) {\n\t\t\t\treturn div.transition('fly down')\n\t\t\t}\n\t\t\tdiv.transition('fly down')\n\t\t})\n\n\t\tthis.first = false\n\n\t\tthis.socketIo.on ( 'reconnect_failed', () => {\n\t\t\tthis.socketIoOnline = false\n\t\t\tself.showErrorMessage ( 'systemError' )\n\t\t})\n\n\t\tthis.socketIo.on ( 'reconnect', attempt => {\n\t\t\tthis.socketIoOnline = true\n\t\t\tthis.hideMessage ()\n\t\t})\n\n\t\tthis.socketIo.on ( 'systemErr', err => {\n\t\t\tself.showErrorMessage ( err )\n\t\t})\n\n\n\t\t\n\t}\n\n\tpublic sockEmit ( eventName: string, ...args ) {\n\t\tconst self = this\n\t\tif ( ! this.socketIoOnline ) {\n\t\t\treturn this.showErrorMessage ( 'systemError' )\n\t\t}\n\n\n\n\t\tconst argLength = args.length - 1\n\t\tlet _CallBack = null\n\t\n\t\tif ( argLength > -1 && typeof ( args[ argLength ]) === 'function' ) {\n\t\t\t_CallBack = args.pop ()\n\t\t}\n\n\t\tconst _timeout = setTimeout(() => {\n\t\t\tif ( _CallBack ) {\n\t\t\t\t_CallBack( new Error ('systemErr'))\n\t\t\t\treturn _CallBack = null\n\t\t\t}\n\t\t\treturn this.showSystemError()\n\t\t}, 3000 )\n\t\t\n\t\treturn this.socketIo.emit ( eventName, ...args, uuid => {\n\t\t\tclearTimeout ( _timeout )\n\t\t\treturn this.socketIo.once ( uuid, ( err, ...data ) => {\n\t\t\t\tif ( err ) {\n\t\t\t\t\tself.showErrorMessage ( err )\n\t\t\t\t}\n\t\n\t\t\t\tif ( _CallBack ) {\n\t\t\t\t\treturn _CallBack ( err, ...data )\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n\n\tpublic showErrorMessage ( err ) {\n\t\tif ( !err ) {\n\t\t\treturn\n\t\t}\n\n\t\tconst errMes = ( typeof err === \"string\" ) ? messageBoxDefine[ err ] : messageBoxDefine[ err.message ] || err.message\n\t\tif ( !errMes ) {\n\t\t\treturn\n\t\t}\n\t\tthis.hideMessage()\n\t\tthis.messageArray ( errMes )\n\t\tthis.showNegative ( true )\n\t\tthis.offlineInfo ( true )\n\t}\n\n\tpublic showSystemError () {\n\t\treturn this.showErrorMessage ( 'systemError' )\n\t}\n\n\tpublic showRestartCoNET_Connect () {\n\t\tthis.showErrorMessage ( 'reConnectCoNET' )\n\t}\n\t\n\tpublic hideMessage() {\n\t\tthis.offlineInfo ( false )\n\t\tthis.messageArray ( null )\n\t\tthis.showNegative ( false )\n\n\t}\n\n\tpublic getErrorIndex ( err ) {\n \n\t\tif ( ! err ) {\n\t\t\treturn 'unKnowError'\n\t\t}\n\t\t\n\t\tif ( typeof err !== 'object' ) {\n\t\t\treturn messageBoxDefine [ err ] ? err : 'unKnowError'\n\t\t}\n\t\t\n\t\treturn messageBoxDefine [ err['message']] ? err['message'] : 'unKnowError'\n\t}\n}\n\n"
  },
  {
    "path": "app/public/scripts/encryptoClass.js",
    "content": "const requestTimeOut = 1000 * 180;\nclass encryptoClass {\n    constructor(_keypair) {\n        this._keypair = _keypair;\n        this.requestPool = new Map();\n        this.makeKeyReady = async () => {\n            //this.CoNET_publicKey = ( await openpgp.key.readArmored ( CoNET_publicKey )).keys\n            this._privateKey = (await openpgp.key.readArmored(this._keypair.privateKey)).keys;\n            await this._privateKey[0].decrypt(this._keypair._password);\n        };\n        this.decryptMessage = (encryptoText, CallBack) => {\n            return this.decryptMessageToZipStream(encryptoText, async (err, _data) => {\n                if (err) {\n                    return CallBack(err);\n                }\n                let ret = null;\n                const data = Buffer.from(_data, 'base64').toString();\n                if (/^-----BEGIN PGP/i.test(data)) {\n                    CallBack();\n                    return this.CoNET_publicKey = (await openpgp.key.readArmored(data)).keys;\n                }\n                try {\n                    ret = JSON.parse(data);\n                }\n                catch (ex) {\n                    return CallBack(ex);\n                }\n                return CallBack(null, ret);\n            });\n        };\n        this.onDoingRequest = async (encryptoText, uuid) => {\n            const request = this.requestPool.get(uuid);\n            if (!request) {\n                return;\n            }\n            return this.decryptMessage(encryptoText, (err, obj) => {\n                if (err) {\n                    return _view.connectInformationMessage.showErrorMessage(err);\n                }\n                if (obj.error !== -1) {\n                    clearTimeout(request.timeOut);\n                }\n                return request.CallBack(null, obj);\n            });\n        };\n        this.makeKeyReady();\n        _view.connectInformationMessage.socketIo.on('doingRequest', (encryptoText, uuid) => {\n            return this.onDoingRequest(encryptoText, uuid);\n        });\n    }\n    decryptMessageToZipStream(encryptoText, CallBack) {\n        const option = {\n            privateKeys: this._privateKey,\n            publicKeys: this.CoNET_publicKey,\n            message: null\n        };\n        let ret = null;\n        return openpgp.message.readArmored(encryptoText).then(data => {\n            option.message = data;\n            return openpgp.decrypt(option);\n        }).then(_plaintext => {\n            return CallBack(null, _plaintext.data);\n        })\n            .catch(ex => {\n            return CallBack(ex);\n        });\n    }\n    encrypt(message, CallBack) {\n        const option = {\n            privateKeys: this._privateKey,\n            publicKeys: this.CoNET_publicKey,\n            message: openpgp.message.fromText(message),\n            compression: openpgp.enums.compression.zip\n        };\n        const self = this;\n        return openpgp.encrypt(option).then(ciphertext => {\n            return CallBack(null, ciphertext.data);\n        }).catch(err => {\n            return CallBack('systemError');\n        });\n    }\n    emitRequest(cmd, CallBack) {\n        const uuid = cmd.requestSerial = uuid_generate();\n        const self = this;\n        const option = {\n            privateKeys: this._privateKey,\n            publicKeys: this.CoNET_publicKey,\n            message: openpgp.message.fromText(JSON.stringify(cmd)),\n            compression: openpgp.enums.compression.zip\n        };\n        this.requestPool.set(uuid, { CallBack: CallBack, cmd: cmd, timeOut: setTimeout(() => {\n                self.requestPool.delete(uuid);\n                return CallBack(new Error('timeOut'));\n            }, requestTimeOut) });\n        return openpgp.encrypt(option).then(ciphertext => {\n            return _view.connectInformationMessage.sockEmit('doingRequest', uuid, ciphertext.data, err => {\n                return CallBack(err);\n            });\n        }).catch(err => {\n            return CallBack('systemError');\n        });\n    }\n}\n"
  },
  {
    "path": "app/public/scripts/encryptoClass.ts",
    "content": "declare const openpgp: any \n\nconst requestTimeOut = 1000 * 180\nclass encryptoClass {\n\tprivate _privateKey\n\tprivate CoNET_publicKey\n\n\tprivate requestPool: Map < string, { CallBack: ( err?: Error, cmd?: QTGateAPIRequestCommand ) => void, cmd: QTGateAPIRequestCommand, timeOut: NodeJS.Timeout } > = new Map ()\n\n\tprivate makeKeyReady = async() => {\n\t\t//this.CoNET_publicKey = ( await openpgp.key.readArmored ( CoNET_publicKey )).keys\n\t\tthis._privateKey = ( await openpgp.key.readArmored ( this._keypair.privateKey )).keys\n\t\tawait this._privateKey[0].decrypt ( this._keypair._password )\n\t}\n\n\tpublic decryptMessage =  ( encryptoText: string, CallBack ) => {\n\t\treturn this.decryptMessageToZipStream ( encryptoText, async ( err, _data ) => {\n\t\t\tif ( err ) {\n\t\t\t\treturn CallBack ( err )\n\t\t\t}\n\t\t\tlet ret = null\n\t\t\tconst data = Buffer.from ( _data, 'base64').toString ()\n\t\t\tif ( /^-----BEGIN PGP/i.test ( data )) {\n\t\t\t\tCallBack ()\n\t\t\t\treturn this.CoNET_publicKey = ( await openpgp.key.readArmored( data )).keys\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tret = JSON.parse ( data )\n\t\t\t} catch ( ex ) {\n\t\t\t\treturn CallBack ( ex )\n\t\t\t}\n\t\t\treturn CallBack ( null, ret )\n\t\t})\n\t\t\n\t}\n\n\tpublic decryptMessageToZipStream ( encryptoText: string, CallBack ) {\n\t\tconst option = {\n\t\t\tprivateKeys: this._privateKey,\n\t\t\tpublicKeys: this.CoNET_publicKey,\n\t\t\tmessage: null\n\t\t}\n\n\n\t\tlet ret = null\n\t\treturn openpgp.message.readArmored ( encryptoText ).then ( data => {\n\t\t\toption.message = data\n\t\t\treturn openpgp.decrypt( option )\n\t\t}).then ( _plaintext => {\n\t\t\t\n\t\t\treturn CallBack ( null, _plaintext.data )\n\t\t})\n\t\t.catch ( ex => {\n\t\t\treturn CallBack ( ex )\n\t\t})\n\n\t}\n\n\tprivate onDoingRequest = async ( encryptoText: string, uuid: string ) => {\n\t\t\n\t\tconst request = this.requestPool.get ( uuid )\n\t\tif ( !request ) {\n\t\t\treturn \n\t\t}\n\t\t\n\t\t\n\t\treturn this.decryptMessage ( encryptoText, ( err, obj: QTGateAPIRequestCommand ) => {\n\n\t\t\tif ( err ) {\n\t\t\t\treturn _view.connectInformationMessage.showErrorMessage ( err )\n\t\t\t}\n\t\t\tif ( obj.error !== -1 ) {\n\t\t\t\tclearTimeout ( request.timeOut )\n\t\t\t}\n\t\t\t\n\t\t\treturn request.CallBack ( null, obj )\n\t\t})\n\t\t\n\t\t\n\n\t}\n\n\tconstructor ( private _keypair: keypair ) {\n\t\tthis.makeKeyReady ()\n\t\t_view.connectInformationMessage.socketIo.on ( 'doingRequest', ( encryptoText: string, uuid: string ) => {\n\t\t\t return this.onDoingRequest ( encryptoText, uuid )\n\t\t})\n\t}\n\n\tpublic encrypt ( message, CallBack ) {\n\t\t\n\t\tconst option = {\n\t\t\tprivateKeys: this._privateKey,\n\t\t\tpublicKeys: this.CoNET_publicKey,\n\t\t\tmessage: openpgp.message.fromText ( message ),\n\t\t\tcompression: openpgp.enums.compression.zip\n\t\t}\n\t\tconst  self = this\n\t\treturn openpgp.encrypt ( option ).then ( ciphertext => {\n\t\t\treturn CallBack ( null, ciphertext.data )\n\t\t\t\n\t\t}).catch ( err => {\n\t\t\treturn CallBack ( 'systemError' )\n\t\t})\n\n\t}\n\n\n\n\tpublic emitRequest ( cmd: QTGateAPIRequestCommand, CallBack ) {\n\t\tconst uuid = cmd.requestSerial = uuid_generate()\n\t\tconst self = this\n\t\tconst option = {\n\t\t\tprivateKeys: this._privateKey,\n\t\t\tpublicKeys: this.CoNET_publicKey,\n\t\t\tmessage: openpgp.message.fromText ( JSON.stringify ( cmd )),\n\t\t\tcompression: openpgp.enums.compression.zip\n\t\t}\n\t\t\n\t\tthis.requestPool.set ( uuid, { CallBack: CallBack, cmd: cmd, timeOut: setTimeout(() => {\n\t\t\tself.requestPool.delete ( uuid )\n\t\t\treturn CallBack ( new Error ( 'timeOut' ))\n\t\t}, requestTimeOut )})\n\n\t\t\n\t\treturn openpgp.encrypt ( option ).then ( ciphertext => {\n\t\t\treturn _view.connectInformationMessage.sockEmit ( 'doingRequest' , uuid, ciphertext.data, err => {\n\t\t\t\treturn CallBack ( err )\n\t\t\t})\n\t\t\t\n\t\t}).catch ( err => {\n\t\t\treturn CallBack ( 'systemError' )\n\t\t})\n\t\t\n\t\t\n\t}\n\n}"
  },
  {
    "path": "app/public/scripts/home.js",
    "content": "/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst InitKeyPair = function () {\n    const keyPair = {\n        publicKey: null,\n        privateKey: null,\n        keyLength: null,\n        nikeName: null,\n        createDate: null,\n        email: null,\n        passwordOK: false,\n        verified: false,\n        publicKeyID: null,\n        _password: null\n    };\n    return keyPair;\n};\nconst makeKeyPairData = function (view, keypair) {\n    const length = keypair.publicKeyID.length;\n    keypair.publicKeyID = keypair.publicKeyID.substr(length - 16);\n    let keyPairPasswordClass = new keyPairPassword(function (_imapData, passwd, sessionHash) {\n        //      password OK\n        keypair.keyPairPassword(keyPairPasswordClass = null);\n        keypair.passwordOK = true;\n        keypair._password = passwd;\n        keypair.showLoginPasswordField(false);\n        view.keyPairCalss = new encryptoClass(keypair);\n        view.showKeyPair(false);\n        if (_imapData && _imapData.imapTestResult) {\n            return view.imapSetupClassExit(_imapData, sessionHash);\n        }\n        let uu = null;\n        return view.imapSetup(uu = new imapForm(keypair.email, _imapData, function (imapData) {\n            view.imapSetup(uu = null);\n            view.imapSetupClassExit(imapData, sessionHash);\n        }));\n    });\n    keypair.keyPairPassword = ko.observable(keyPairPasswordClass);\n    keypair.showLoginPasswordField = ko.observable(false);\n    keypair.delete_btn_view = ko.observable(true);\n    keypair.showConform = ko.observable(false);\n    keypair['showDeleteKeyPairNoite'] = ko.observable(false);\n    keypair.delete_btn_click = function () {\n        keypair.delete_btn_view(false);\n        return keypair.showConform(true);\n    };\n    keypair.deleteKeyPairNext = function () {\n        view.connectInformationMessage.sockEmit('deleteKeyPairNext', () => {\n            view.showIconBar(false);\n            view.connectedCoNET(false);\n            view.connectToCoNET(false);\n            view.CoNETConnect(view.CoNETConnectClass = null);\n            view.imapSetup(view.imapFormClass = null);\n            keypair.showDeleteKeyPairNoite(false);\n            return keypair.delete_btn_view(false);\n        });\n    };\n};\nconst initPopupArea = function () {\n    const popItem = $('.activating.element').popup('hide');\n    const inline = popItem.hasClass('inline');\n    return popItem.popup({\n        on: 'focus',\n        movePopup: false,\n        position: 'top left',\n        inline: inline\n    });\n};\nclass showWebPageClass {\n    constructor(showUrl, zipBase64Stream, zipBase64StreamUuid, exit) {\n        this.showUrl = showUrl;\n        this.zipBase64Stream = zipBase64Stream;\n        this.zipBase64StreamUuid = zipBase64StreamUuid;\n        this.exit = exit;\n        this.showLoading = ko.observable(true);\n        this.htmlIframe = ko.observable(null);\n        this.showErrorMessage = ko.observable(false);\n        this.showHtmlCodePage = ko.observable(false);\n        this.showImgPage = ko.observable(true);\n        this.png = ko.observable('');\n        const self = this;\n        _view.showIconBar(false);\n        _view.keyPairCalss.decryptMessageToZipStream(zipBase64Stream, (err, data) => {\n            if (err) {\n                return self.showErrorMessageProcess();\n            }\n            showHTMLComplete(zipBase64StreamUuid, data, (err, data) => {\n                if (err) {\n                    return self.showErrorMessageProcess();\n                }\n                _view.bodyBlue(false);\n                const getData = (filename, _data) => {\n                    const regex = new RegExp(`${filename}`, 'g');\n                    const index = html.indexOf(`${filename}`);\n                    if (index > -1) {\n                        if (/js$/.test(filename)) {\n                            _data = _data.replace(/^data:text\\/plain;/, 'data:application/javascript;');\n                        }\n                        else if (/css$/.test(filename)) {\n                            _data = _data.replace(/^data:text\\/plain;/, 'data:text/css;');\n                        }\n                        else if (/html$|htm$/.test(filename)) {\n                            _data = _data.replace(/^data:text\\/plain;/, 'data:text/html;');\n                        }\n                        else if (/pdf$/.test(filename)) {\n                            _data = _data.replace(/^data:text\\/plain;/, 'data:text/html;');\n                        }\n                        else {\n                            const kkk = _data;\n                        }\n                        html = html.replace(regex, _data);\n                    }\n                };\n                let html = data.html;\n                data.folder.forEach(n => {\n                    getData(n.filename, n.data);\n                });\n                self.png(data.img);\n                const htmlBolb = new Blob([html], { type: 'text/html' });\n                const _url = window.URL.createObjectURL(htmlBolb);\n                const fileReader = new FileReader();\n                fileReader.onloadend = evt => {\n                    return window.URL.revokeObjectURL(_url);\n                };\n                self.showLoading(false);\n                self.htmlIframe(_url);\n            });\n        });\n    }\n    showErrorMessageProcess() {\n        this.showLoading(false);\n        this.showErrorMessage(true);\n    }\n    close() {\n        this.showImgPage(false);\n        this.showHtmlCodePage(false);\n        this.png(null);\n        this.exit();\n    }\n    imgClick() {\n        this.showHtmlCodePage(false);\n        this.showImgPage(true);\n    }\n    htmlClick() {\n        this.showHtmlCodePage(true);\n        this.showImgPage(false);\n    }\n}\nvar view_layout;\n(function (view_layout) {\n    class view {\n        constructor() {\n            this.connectInformationMessage = new connectInformationMessage('/');\n            this.sectionLogin = ko.observable(false);\n            this.sectionAgreement = ko.observable(false);\n            this.sectionWelcome = ko.observable(true);\n            this.isFreeUser = ko.observable(true);\n            this.QTTransferData = ko.observable(false);\n            this.LocalLanguage = 'up';\n            this.menu = Menu;\n            this.modalContent = ko.observable('');\n            this.keyPairGenerateForm = ko.observable();\n            this.tLang = ko.observable(initLanguageCookie());\n            this.languageIndex = ko.observable(lang[this.tLang()]);\n            this.localServerConfig = ko.observable();\n            this.keyPair = ko.observable(InitKeyPair());\n            this.hacked = ko.observable(false);\n            this.imapSetup = ko.observable();\n            this.showIconBar = ko.observable(false);\n            this.connectToCoNET = ko.observable(false);\n            this.connectedCoNET = ko.observable(false);\n            this.showKeyPair = ko.observable(false);\n            this.CoNETConnectClass = null;\n            this.imapFormClass = null;\n            this.CoNETConnect = ko.observable(null);\n            this.bodyBlue = ko.observable(true);\n            this.CanadaBackground = ko.observable(false);\n            this.keyPairCalss = null;\n            this.appsManager = ko.observable(null);\n            this.AppList = ko.observable(false);\n            this.imapData = null;\n            this.newVersion = ko.observable(null);\n            this.sessionHash = '';\n            this.showLanguageSelect = ko.observable(true);\n            this.socketListen();\n            this.CanadaBackground.subscribe(val => {\n                if (val) {\n                    $.ajax({\n                        url: '/scripts/CanadaSvg.js'\n                    }).done(data => {\n                        eval(data);\n                    });\n                }\n            });\n        }\n        afterInitConfig() {\n            this.keyPair(this.localServerConfig().keypair);\n            if (this.keyPair() && this.keyPair().keyPairPassword() && typeof this.keyPair().keyPairPassword().inputFocus === 'function') {\n                this.keyPair().keyPairPassword().inputFocus(true);\n                this.sectionLogin(false);\n            }\n        }\n        initConfig(config) {\n            const self = this;\n            this.showKeyPair(true);\n            if (config.keypair && config.keypair.publicKeyID) {\n                /**\n                 *\n                 *      Key pair ready\n                 *\n                 */\n                makeKeyPairData(this, config.keypair);\n                if (!config.keypair.passwordOK) {\n                    config.keypair.showLoginPasswordField(true);\n                }\n            }\n            else {\n                /**\n                 *\n                 *      No key pair\n                 *\n                 */\n                this.svgDemo_showLanguage();\n                this.clearImapData();\n                config.keypair = null;\n                let _keyPairGenerateForm = new keyPairGenerateForm(function (_keyPair, sessionHash) {\n                    /**\n                     *      key pair ready\n                     */\n                    makeKeyPairData(self, _keyPair);\n                    _keyPair.passwordOK = true;\n                    let keyPairPassword = _keyPair.keyPairPassword();\n                    _keyPair.keyPairPassword(keyPairPassword = null);\n                    config.keypair = _keyPair;\n                    self.keyPair(_keyPair);\n                    self.showKeyPair(false);\n                    initPopupArea();\n                    let uu = null;\n                    self.keyPairCalss = new encryptoClass(self.keyPair());\n                    self.imapSetup(uu = new imapForm(config.account, null, function (imapData) {\n                        self.imapSetup(uu = null);\n                        return self.imapSetupClassExit(imapData, sessionHash);\n                    }));\n                    return self.keyPairGenerateForm(_keyPairGenerateForm = null);\n                });\n                this.keyPairGenerateForm(_keyPairGenerateForm);\n            }\n            this.localServerConfig(config);\n            this.afterInitConfig();\n        }\n        clearImapData() {\n            let imap = this.imapSetup();\n            this.imapSetup(imap = null);\n        }\n        socketListen() {\n            let self = this;\n            this.connectInformationMessage.sockEmit('init', (err, config) => {\n                if (err) {\n                    return;\n                }\n                return self.initConfig(config);\n            });\n            this.connectInformationMessage.socketIo.on('init', (err, config) => {\n                if (err) {\n                    return;\n                }\n                return self.initConfig(config);\n            });\n        }\n        //          change language\n        selectItem(that, site) {\n            const tindex = lang[this.tLang()];\n            let index = tindex + 1;\n            if (index > 3) {\n                index = 0;\n            }\n            this.languageIndex(index);\n            this.tLang(lang[index]);\n            $.cookie('langEH', this.tLang(), { expires: 180, path: '/' });\n            const obj = $(\"span[ve-data-bind]\");\n            obj.each(function (index, element) {\n                const ele = $(element);\n                const data = ele.attr('ve-data-bind');\n                if (data && data.length) {\n                    ele.text(eval(data));\n                }\n            });\n            $('.languageText').shape(`flip ${this.LocalLanguage}`);\n            $('.KnockoutAnimation').transition('jiggle');\n            return initPopupArea();\n        }\n        //          start click\n        openClick() {\n            clearTimeout(this.demoTimeout);\n            if (this.demoMainElm && typeof this.demoMainElm.remove === 'function') {\n                this.demoMainElm.remove();\n                this.demoMainElm = null;\n            }\n            if (!this.connectInformationMessage.socketIoOnline) {\n                return this.connectInformationMessage.showSystemError();\n            }\n            this.sectionWelcome(false);\n            /*\n            if ( this.localServerConfig().firstRun ) {\n                return this.sectionAgreement ( true )\n            }\n            */\n            this.sectionLogin(true);\n            return initPopupArea();\n        }\n        deletedKeypairResetView() {\n            this.imapSetup(null);\n        }\n        agreeClick() {\n            this.connectInformationMessage.sockEmit('agreeClick');\n            this.sectionAgreement(false);\n            this.localServerConfig().firstRun = false;\n            return this.openClick();\n        }\n        refresh() {\n            if (typeof require === 'undefined') {\n                this.modalContent(infoDefine[this.languageIndex()].emailConform.formatError[11]);\n                return this.hacked(true);\n            }\n            const { remote } = require('electron');\n            if (remote && remote.app && typeof remote.app.quit === 'function') {\n                return remote.app.quit();\n            }\n        }\n        showKeyInfoClick() {\n            this.sectionLogin(true);\n            this.showKeyPair(true);\n            this.AppList(false);\n            this.appsManager(null);\n        }\n        imapSetupClassExit(_imapData, sessionHash) {\n            const self = this;\n            this.imapData = _imapData;\n            this.sessionHash = sessionHash;\n            return this.CoNETConnect(this.CoNETConnectClass = new CoNETConnect(_imapData.imapUserName, this.keyPair().verified, _imapData.confirmRisk, this.keyPair().email, function ConnectReady(err) {\n                if (typeof err === 'number' && err > -1) {\n                    self.CoNETConnect(this.CoNETConnectClass = null);\n                    return self.imapSetup(this.imapFormClass = new imapForm(_imapData.account, null, function (imapData) {\n                        self.imapSetup(this.imapFormClass = null);\n                        return self.imapSetupClassExit(imapData, sessionHash);\n                    }));\n                }\n                self.connectedCoNET(true);\n                self.homeClick();\n            }));\n        }\n        reFreshLocalServer() {\n            location.reload();\n        }\n        homeClick() {\n            this.AppList(true);\n            this.sectionLogin(false);\n            const connectMainMenu = () => {\n                let am = null;\n                this.appsManager(am = new appsManager(() => {\n                    am = null;\n                    return connectMainMenu();\n                }));\n            };\n            connectMainMenu();\n            this.showKeyPair(false);\n            $('.dimmable').dimmer({ on: 'hover' });\n            $('.comeSoon').popup({\n                on: 'focus',\n                movePopup: false,\n                position: 'top left',\n                inline: true\n            });\n            _view.connectInformationMessage.socketIo.removeEventListener('tryConnectCoNETStage', this.CoNETConnectClass.listenFun);\n        }\n        /**\n         *\n         * \t\tT/t = Translate (t is relative, T is absolute) R/r = rotate(r is relative, R is absolute) S/s = scale(s is relative, S is absolute)\n         */\n        svgDemo_showLanguage() {\n            if (!this.sectionWelcome()) {\n                return;\n            }\n            let i = 0;\n            const changeLanguage = () => {\n                if (++i === 1) {\n                    backGround_mask_circle.attr({\n                        stroke: \"#FF000090\",\n                    });\n                    return setTimeout(() => {\n                        changeLanguage();\n                    }, 1000);\n                }\n                if (i > 5 || !this.sectionWelcome()) {\n                    main.remove();\n                    return this.demoMainElm = main = null;\n                }\n                this.selectItem();\n                this.demoTimeout = setTimeout(() => {\n                    changeLanguage();\n                }, 2000);\n            };\n            const width = window.innerWidth;\n            const height = window.outerHeight;\n            let main = this.demoMainElm = Snap(width, height);\n            const backGround_mask_circle = main.circle(width / 2, height / 2, width / 1.7).attr({\n                fill: '#00000000',\n                stroke: \"#FF000020\",\n                strokeWidth: 5,\n            });\n            const wT = width / 2 - 35;\n            const wY = 30 - height / 2;\n            backGround_mask_circle.animate({\n                transform: `t${wT} ${wY}`,\n                r: 60\n            }, 3000, mina.easeout, changeLanguage);\n        }\n    }\n    view_layout.view = view;\n})(view_layout || (view_layout = {}));\nconst _view = new view_layout.view();\nko.applyBindings(_view, document.getElementById('body'));\n$(`.${_view.tLang()}`).addClass('active');\n"
  },
  {
    "path": "app/public/scripts/home.ts",
    "content": "/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nconst InitKeyPair = function () {\n\tconst keyPair: keypair = {\n\t\tpublicKey: null,\n\t\tprivateKey: null,\n\t\tkeyLength: null,\n\t\tnikeName: null,\n\t\tcreateDate: null,\n\t\temail: null,\n\t\tpasswordOK: false,\n\t\tverified: false,\n\t\tpublicKeyID: null,\n\t\t_password: null\n\t}\n\treturn keyPair\n}\n\nconst makeKeyPairData = function ( view: view_layout.view, keypair: keypair ) {\n    const length = keypair.publicKeyID.length\n    keypair.publicKeyID = keypair.publicKeyID.substr ( length - 16 )\n        \n    let keyPairPasswordClass = new keyPairPassword ( function ( _imapData: IinputData, passwd: string, sessionHash: string ) {\n        //      password OK\n\n        keypair.keyPairPassword ( keyPairPasswordClass = null )\n\t\tkeypair.passwordOK = true\n\t\tkeypair._password = passwd\n        keypair.showLoginPasswordField ( false )\n        view.keyPairCalss = new encryptoClass ( keypair )\n        view.showKeyPair ( false )\n        if ( _imapData && _imapData.imapTestResult ) {\n            return view.imapSetupClassExit ( _imapData, sessionHash )\n        }\n        let uu = null\n        return view.imapSetup ( uu = new imapForm ( keypair.email, _imapData, function ( imapData: IinputData ) {\n            view.imapSetup ( uu = null )\n            view.imapSetupClassExit ( imapData, sessionHash )\n        }))\n        \n    })\n    \n    keypair.keyPairPassword = ko.observable( keyPairPasswordClass )\n    keypair.showLoginPasswordField = ko.observable ( false )\n    keypair.delete_btn_view = ko.observable ( true )\n    keypair.showConform = ko.observable ( false )\n    keypair['showDeleteKeyPairNoite'] = ko.observable ( false )\n    keypair.delete_btn_click = function () {\n        keypair.delete_btn_view ( false )\n        return keypair.showConform ( true )\n    }\n    \n    \n    keypair.deleteKeyPairNext = function () {\n        \n        view.connectInformationMessage.sockEmit ( 'deleteKeyPairNext', () => {\n            view.showIconBar ( false )\n            view.connectedCoNET ( false )\n            view.connectToCoNET ( false )\n            view.CoNETConnect (view.CoNETConnectClass = null)\n            view.imapSetup ( view.imapFormClass = null )\n            keypair.showDeleteKeyPairNoite ( false )\n            return keypair.delete_btn_view ( false )\n        })\n        \n        \n        \n    }\n\n    \n}\n\nconst initPopupArea = function () {\n    const popItem = $( '.activating.element' ).popup('hide')\n    const inline = popItem.hasClass ('inline')\n    return popItem.popup({\n        on: 'focus',\n        movePopup: false,\n        position: 'top left',\n        inline: inline\n    })\n}\n\nclass showWebPageClass {\n\tpublic showLoading = ko.observable ( true )\n\tpublic htmlIframe = ko.observable ( null )\n\tpublic showErrorMessage = ko.observable ( false )\n\tpublic showHtmlCodePage = ko.observable ( false )\n\tpublic showImgPage = ko.observable ( true )\n\tpublic showErrorMessageProcess () {\n\t\tthis.showLoading ( false )\n\t\tthis.showErrorMessage ( true )\n\t}\n\tpublic png = ko.observable ('')\n\t\n\tpublic close () {\n\t\tthis.showImgPage ( false )\n\t\tthis.showHtmlCodePage ( false )\n\t\tthis.png ( null )\n\t\tthis.exit ()\n\t}\n\n\tpublic imgClick () {\n\t\tthis.showHtmlCodePage ( false )\n\t\tthis.showImgPage ( true )\n\t}\n\t\n\tpublic htmlClick () {\n\t\tthis.showHtmlCodePage ( true )\n\t\tthis.showImgPage ( false )\n\t}\n\n\tconstructor ( public showUrl: string, private zipBase64Stream: string, private zipBase64StreamUuid: string, private exit: ()=> void ) {\n\t\tconst self = this\n\t\t_view.showIconBar ( false )\n\t\t\n\t\t_view.keyPairCalss.decryptMessageToZipStream ( zipBase64Stream, ( err, data ) => {\n\t\t\tif ( err ) {\n\t\t\t\treturn self.showErrorMessageProcess ()\n\t\t\t}\n\t\t\tshowHTMLComplete ( zipBase64StreamUuid, data, ( err, data: { img: string, html: string, folder: [ { filename: string, data: string }]} ) => {\n\t\t\t\tif ( err ) {\n\t\t\t\t\treturn self.showErrorMessageProcess ()\n\t\t\t\t}\n\t\t\t\t_view.bodyBlue ( false )\n\t\t\t\tconst getData =  ( filename: string, _data: string ) => {\n\t\t\t\t\t\n\t\t\t\t\tconst regex = new RegExp (`${ filename }`,'g')\n\t\t\t\t\t\n\t\t\t\t\tconst index = html.indexOf ( `${ filename }` )\n\t\t\t\t\t\n\t\t\t\t\tif ( index > -1 ) {\n\t\t\t\t\t\tif ( /js$/.test ( filename )) {\n\t\t\t\t\t\t\t_data = _data.replace ( /^data:text\\/plain;/, 'data:application/javascript;')\n\t\t\t\t\t\t} else if ( /css$/.test ( filename )) {\n\t\t\t\t\t\t\t_data = _data.replace ( /^data:text\\/plain;/, 'data:text/css;')\n\t\t\t\t\t\t} else if ( /html$|htm$/.test ( filename )) {\n\t\t\t\t\t\t\t_data = _data.replace ( /^data:text\\/plain;/, 'data:text/html;')\n\t\t\t\t\t\t} else if ( /pdf$/.test ( filename )) {\n\t\t\t\t\t\t\t_data = _data.replace ( /^data:text\\/plain;/, 'data:text/html;')\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst kkk = _data\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thtml = html.replace ( regex, _data )\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\tlet html = data.html\n\t\t\t\t\n\t\t\t\tdata.folder.forEach ( n => {\n\t\t\t\t\tgetData ( n.filename, n.data )\n\t\t\t\t})\n\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tself.png ( data.img )\n\t\t\t\t\n\t\t\t\tconst htmlBolb = new Blob ([ html ], { type: 'text/html'})\n\t\t\t\tconst _url = window.URL.createObjectURL ( htmlBolb )\n\t\t\t\tconst fileReader = new FileReader()\n\t\t\t\tfileReader.onloadend = evt => {\n\t\t\t\t\treturn window.URL.revokeObjectURL ( _url )\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tself.showLoading ( false )\n\t\t\t\tself.htmlIframe ( _url )\n\t\t\t\t\n\t\t\t})\n\t\t})\n\t\t\n\t}\n}\n\nmodule view_layout {\n    export class view {\n        public connectInformationMessage = new connectInformationMessage( '/' )\n        public sectionLogin = ko.observable ( false )\n        public sectionAgreement = ko.observable ( false )\n        public sectionWelcome = ko.observable ( true )\n        public isFreeUser = ko.observable ( true )\n        public QTTransferData = ko.observable ( false )\n        public LocalLanguage = 'up'\n        public menu = Menu\n        public modalContent = ko.observable ('')\n        public keyPairGenerateForm: KnockoutObservable< keyPairGenerateForm> = ko.observable ()\n        public tLang = ko.observable ( initLanguageCookie ())\n        public languageIndex = ko.observable ( lang [ this.tLang() ])\n        public localServerConfig: KnockoutObservable < install_config > = ko.observable ()\n        public keyPair: KnockoutObservable < keypair > = ko.observable ( InitKeyPair ())\n        public hacked = ko.observable ( false )\n        public imapSetup: KnockoutObservable < imapForm > = ko.observable ()\n        public showIconBar = ko.observable ( false )\n        public connectToCoNET = ko.observable ( false )\n        public connectedCoNET = ko.observable ( false )\n        public showKeyPair = ko.observable ( false )\n        public CoNETConnectClass: CoNETConnect = null\n        public imapFormClass: imapForm = null\n        public CoNETConnect: KnockoutObservable < CoNETConnect > = ko.observable ( null )\n\t\tpublic bodyBlue = ko.observable ( true )\n\t\tpublic CanadaBackground = ko.observable ( false )\n\t\t\n\t\tpublic keyPairCalss: encryptoClass = null\n\n        public appsManager: KnockoutObservable< appsManager > = ko.observable ( null )\n        public AppList = ko.observable ( false )\n\n        public imapData: IinputData = null\n        public newVersion = ko.observable ( null )\n\t\tpublic sessionHash = ''\n\t\tpublic showLanguageSelect = ko.observable ( true )\n\t\tprivate demoTimeout\n\t\tprivate demoMainElm\n\n\t\t\n        private afterInitConfig ( ) {\n            \n            this.keyPair ( this.localServerConfig ().keypair )\n            if ( this.keyPair() && this.keyPair().keyPairPassword() &&  typeof this.keyPair().keyPairPassword().inputFocus ==='function' ) {\n\t\t\t\tthis.keyPair().keyPairPassword().inputFocus( true )\n\t\t\t\tthis.sectionLogin ( false )\n            }\n        }\n    \n        private initConfig ( config: install_config ) {\n            const self = this\n            this.showKeyPair ( true )\n            if ( config.keypair && config.keypair.publicKeyID ) {\n                /**\n                 * \n                 *      Key pair ready\n                 * \n                 */\n\t\t\t\t\n                makeKeyPairData ( this, config.keypair )\n                if ( ! config.keypair.passwordOK ) {\n                    config.keypair.showLoginPasswordField ( true )\n                }\n                \n                \n            } else {\n                /**\n                 * \n                 *      No key pair\n                 * \n                 */\n                this.svgDemo_showLanguage ()\n                this.clearImapData ()\n                config.keypair = null\n                let _keyPairGenerateForm =  new keyPairGenerateForm ( function ( _keyPair: keypair, sessionHash: string ) {\n                    /**\n                     *      key pair ready\n                     */\n                    makeKeyPairData ( self, _keyPair )\n                    _keyPair.passwordOK = true\n                    let keyPairPassword = _keyPair.keyPairPassword ()\n                    _keyPair.keyPairPassword ( keyPairPassword = null )\n                    config.keypair = _keyPair\n                    \n                    self.keyPair ( _keyPair )\n                \n                    self.showKeyPair ( false )\n                    initPopupArea ()\n\t\t\t\t\tlet uu = null\n\t\t\t\t\tself.keyPairCalss = new encryptoClass ( self.keyPair () )\n                    self.imapSetup ( uu = new imapForm ( config.account, null, function ( imapData: IinputData ) {\n                        self.imapSetup ( uu = null )\n                        return self.imapSetupClassExit ( imapData, sessionHash )\n                    }))\n                    return self.keyPairGenerateForm ( _keyPairGenerateForm = null )\n\n                })\n                this.keyPairGenerateForm ( _keyPairGenerateForm )\n            }\n            this.localServerConfig ( config )\n            this.afterInitConfig ()\n            \n        }\n\n        private clearImapData () {\n            \n            let imap = this.imapSetup()\n            this.imapSetup( imap = null )\n        }\n    \n        private socketListen () {\n            let self = this\n\n            \n            this.connectInformationMessage.sockEmit ( 'init', ( err, config: install_config) => {\n                if ( err ) {\n                    return\n                }\n                return self.initConfig ( config )\n            })\n\n            this.connectInformationMessage.socketIo.on ('init', ( err, config: install_config ) => {\n                if ( err ) {\n                    return\n                }\n                return self.initConfig ( config )\n            })\n        }\n    \n        constructor () {\n            this.socketListen ()\n            this.CanadaBackground.subscribe ( val => {\n\t\t\t\tif ( val ) {\n\t\t\t\t\t$.ajax ({\n\t\t\t\t\t\turl:'/scripts/CanadaSvg.js'\n\n\t\t\t\t\t}).done ( data => {\n\t\t\t\t\t\teval ( data )\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\t\t\t\n        }\n        \n        //          change language\n        public selectItem ( that?: any, site?: () => number ) {\n\t\t\t\n            const tindex = lang [ this.tLang ()]\n            let index =  tindex + 1\n            if ( index > 3 ) {\n                index = 0\n            }\n    \n            this.languageIndex ( index )\n            this.tLang( lang [ index ])\n            $.cookie ( 'langEH', this.tLang(), { expires: 180, path: '/' })\n            const obj = $( \"span[ve-data-bind]\" )\n            \n            obj.each ( function ( index, element ) {\n                \n                const ele = $( element )\n                const data = ele.attr ( 've-data-bind' )\n                if ( data && data.length ) {\n                    ele.text ( eval ( data ))\n                }\n            })\n            \n            $('.languageText').shape (`flip ${ this.LocalLanguage }`)\n            $('.KnockoutAnimation').transition('jiggle')\n            return initPopupArea()\n        }\n        //          start click\n        public openClick () {\n\n\t\t\tclearTimeout ( this.demoTimeout )\n\t\t\tif ( this.demoMainElm && typeof this.demoMainElm.remove === 'function' ) {\n\t\t\t\tthis.demoMainElm.remove()\n\t\t\t\tthis.demoMainElm = null\n\t\t\t}\n            if ( !this.connectInformationMessage.socketIoOnline ) {\n                return this.connectInformationMessage.showSystemError ()\n            }\n            \n\t\t\tthis.sectionWelcome ( false )\n\t\t\t/*\n            if ( this.localServerConfig().firstRun ) {\n                return this.sectionAgreement ( true )\n\t\t\t}\n\t\t\t*/\n            this.sectionLogin ( true )\n            return initPopupArea ()\n            \n        }\n\n        public deletedKeypairResetView () {\n            this.imapSetup (null)\n            \n        }\n    \n        public agreeClick () {\n            \n            this.connectInformationMessage.sockEmit ( 'agreeClick' )\n            this.sectionAgreement ( false )\n            this.localServerConfig().firstRun = false\n            return this.openClick()\n            \n        }\n\n        public refresh () {\n            if ( typeof require === 'undefined' ) {\n                this.modalContent ( infoDefine[ this.languageIndex() ].emailConform.formatError [ 11 ] )\n                return this.hacked ( true )\n            }\n            const { remote } = require ('electron')\n            if ( remote && remote.app && typeof remote.app.quit === 'function' ) {\n                return remote.app.quit()\n            }\n            \n        }\n\n        public showKeyInfoClick () {\n            this.sectionLogin ( true )\n            this.showKeyPair ( true )\n            this.AppList ( false )\n            this.appsManager ( null )\n        }\n\n        public imapSetupClassExit ( _imapData: IinputData, sessionHash: string ) {\n            const self = this\n            this.imapData = _imapData\n            this.sessionHash = sessionHash\n            return this.CoNETConnect ( this.CoNETConnectClass = new CoNETConnect ( _imapData.imapUserName, this.keyPair().verified, _imapData.confirmRisk, this.keyPair().email, \n            function ConnectReady ( err ) {\n                if ( typeof err ==='number' && err > -1 ) {\n                    self.CoNETConnect ( this.CoNETConnectClass = null )\n                    return self.imapSetup ( this.imapFormClass = new imapForm ( _imapData.account, null, function ( imapData: IinputData ) {\n                        self.imapSetup ( this.imapFormClass = null )\n                        return self.imapSetupClassExit ( imapData, sessionHash )\n                    }))\n                    \n                    \n                    \n                }\n                self.connectedCoNET ( true )\n\t\t\t\tself.homeClick ()\n\t\t\t\t\n            }))\n\n        }\n\n        public reFreshLocalServer () {\n            location.reload()\n\n        }\n\n        public homeClick () {\n\t\t\tthis.AppList ( true )\n\t\t\tthis.sectionLogin ( false )\n\t\t\tconst connectMainMenu = () => {\n\t\t\t\tlet am = null\n\t\t\t\tthis.appsManager ( am = new appsManager (() => {\n\t\t\t\t\tam = null\n\t\t\t\t\treturn connectMainMenu ()\n\t\t\t\t}))\n\t\t\t\t\n\t\t\t}\n            connectMainMenu ()\n            this.showKeyPair ( false )\n            $('.dimmable').dimmer ({ on: 'hover' })\n            $('.comeSoon').popup ({\n                on: 'focus',\n                movePopup: false,\n                position: 'top left',\n                inline: true\n\t\t\t})\n\t\t\t_view.connectInformationMessage.socketIo.removeEventListener ('tryConnectCoNETStage', this.CoNETConnectClass.listenFun )\n\t\t}\n\n\t\t/**\n\t\t * \n\t\t * \t\tT/t = Translate (t is relative, T is absolute) R/r = rotate(r is relative, R is absolute) S/s = scale(s is relative, S is absolute)\n\t\t */\n\t\t\n\t\tprivate svgDemo_showLanguage () {\n\t\t\tif ( !this.sectionWelcome()) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tlet i = 0\n\t\t\tconst changeLanguage = () => {\n\t\t\t\tif ( ++i === 1 ) {\n\t\t\t\t\tbackGround_mask_circle.attr ({\n\t\t\t\t\t\tstroke: \"#FF000090\",\n\t\t\t\t\t})\n\t\t\t\t\treturn setTimeout (() => {\n\t\t\t\t\t\tchangeLanguage()\n\t\t\t\t\t}, 1000 )\n\t\t\t\t}\n\t\t\t\tif ( i > 5 || !this.sectionWelcome() ) {\n\t\t\t\t\tmain.remove()\n\t\t\t\t\treturn this.demoMainElm = main = null\n\t\t\t\t}\n\t\t\t\tthis.selectItem ()\n\t\t\t\tthis.demoTimeout = setTimeout (() => {\n\t\t\t\t\tchangeLanguage ()\n\t\t\t\t}, 2000 )\n\t\t\t}\n\n\t\t\tconst width = window.innerWidth\n\t\t\tconst height = window.outerHeight\n\t\t\tlet main = this.demoMainElm = Snap( width, height )\n\t\t\t\n\t\t\tconst backGround_mask_circle = main.circle( width / 2, height / 2, width / 1.7 ).attr({\n\t\t\t\tfill:'#00000000',\n\t\t\t\tstroke: \"#FF000020\",\n\t\t\t\tstrokeWidth: 5,\n\t\t\t})\n\n\t\t\tconst wT = width/2 - 35\n\t\t\tconst wY = 30 - height / 2\n\t\t\tbackGround_mask_circle.animate ({\n\t\t\t\ttransform: `t${ wT } ${ wY }`,\n\t\t\t\tr: 60\n\t\t\t}, 3000, mina.easeout, changeLanguage )\n\n\t\t}\n    }\n}\n\nconst _view = new view_layout.view ()\n\nko.applyBindings ( _view , document.getElementById ( 'body' ))\n$(`.${ _view.tLang()}`).addClass('active')\n"
  },
  {
    "path": "app/public/scripts/imapForm.js",
    "content": "/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst availableImapServer = /imap\\-mail\\.outlook\\.com$|imap\\.mail\\.yahoo\\.(com|co\\.jp|co\\.uk|au)$|imap\\.mail\\.me\\.com$|imap\\.gmail\\.com$|gmx\\.(com|us|net)$|imap\\.zoho\\.com$/i;\n/**\n * \t\t\tgetImapSmtpHost\n * \t\t@param email <string>\n * \t\t@return Imap & Smtp info\n */\nconst getImapSmtpHost = function (_email) {\n    const email = _email.toLowerCase();\n    const yahoo = function (domain) {\n        if (/yahoo.co.jp$/i.test(domain))\n            return 'yahoo.co.jp';\n        if (/((.*\\.){0,1}yahoo|yahoogroups|yahooxtra|yahoogruppi|yahoogrupper)(\\..{2,3}){1,2}$/.test(domain))\n            return 'yahoo.com';\n        if (/(^hotmail|^outlook|^live|^msn)(\\..{2,3}){1,2}$/.test(domain))\n            return 'hotmail.com';\n        if (/^(me|^icould|^mac)\\.com/.test(domain))\n            return 'me.com';\n        return domain;\n    };\n    const emailSplit = email.split('@');\n    if (emailSplit.length !== 2)\n        return null;\n    const domain = yahoo(emailSplit[1]);\n    const ret = {\n        imap: 'imap.' + domain,\n        smtp: 'smtp.' + domain,\n        SmtpPort: [465, 587, 994],\n        ImapPort: 993,\n        imapSsl: true,\n        smtpSsl: true,\n        haveAppPassword: false,\n        ApplicationPasswordInformationUrl: ['']\n    };\n    switch (domain) {\n        //\t\tyahoo domain have two different \n        //\t\tthe yahoo.co.jp is different other yahoo.*\n        case 'yahoo.co.jp':\n            {\n                ret.imap = 'imap.mail.yahoo.co.jp';\n                ret.smtp = 'smtp.mail.yahoo.co.jp';\n            }\n            break;\n        //\t\t\tgmail\n        case 'google.com':\n        case 'googlemail.com':\n        case 'gmail':\n            {\n                ret.haveAppPassword = true;\n                ret.ApplicationPasswordInformationUrl = [\n                    'https://support.google.com/accounts/answer/185833?hl=zh-Hans',\n                    'https://support.google.com/accounts/answer/185833?hl=ja',\n                    'https://support.google.com/accounts/answer/185833?hl=en'\n                ];\n            }\n            break;\n        case 'gandi.net':\n            ret.imap = ret.smtp = 'mail.gandi.net';\n            break;\n        //\t\t\t\tyahoo.com\n        case 'rocketmail.com':\n        case 'y7mail.com':\n        case 'ymail.com':\n        case 'yahoo.com':\n            {\n                ret.imap = 'imap.mail.yahoo.com';\n                ret.smtp = (/^bizmail.yahoo.com$/.test(emailSplit[1]))\n                    ? 'smtp.bizmail.yahoo.com'\n                    : 'smtp.mail.yahoo.com';\n                ret.haveAppPassword = true;\n                ret.ApplicationPasswordInformationUrl = [\n                    'https://help.yahoo.com/kb/SLN15241.html',\n                    'https://help.yahoo.com/kb/SLN15241.html',\n                    'https://help.yahoo.com/kb/SLN15241.html'\n                ];\n            }\n            break;\n        case 'mail.ee':\n            ret.smtp = 'mail.ee';\n            ret.imap = 'mail.inbox.ee';\n            break;\n        //\t\tgmx.com\n        case 'gmx.co.uk':\n        case 'gmx.de':\n        case 'gmx.us':\n        case 'gmx.com':\n            {\n                ret.smtp = 'mail.gmx.com';\n                ret.imap = 'imap.gmx.com';\n            }\n            break;\n        //\t\taim.com\n        case 'aim.com':\n            {\n                ret.imap = 'imap.aol.com';\n            }\n            break;\n        //\toutlook.com\n        case 'windowslive.com':\n        case 'hotmail.com':\n        case 'outlook.com':\n            {\n                ret.imap = 'imap-mail.outlook.com';\n                ret.smtp = 'smtp-mail.outlook.com';\n            }\n            break;\n        //\t\t\tapple mail\n        case 'icloud.com':\n        case 'mac.com':\n        case 'me.com':\n            {\n                ret.imap = 'imap.mail.me.com';\n                ret.smtp = 'smtp.mail.me.com';\n            }\n            break;\n        //\t\t\t163.com\n        case '126.com':\n        case '163.com':\n            {\n                ret.imap = 'appleimap.' + domain;\n                ret.smtp = 'applesmtp.' + domain;\n            }\n            break;\n        case 'sina.com':\n        case 'yeah.net':\n            {\n                ret.smtpSsl = false;\n            }\n            break;\n    }\n    return ret;\n};\nclass keyPairSign {\n    constructor(exit) {\n        this.exit = exit;\n        this.signError = ko.observable(false);\n        this.conformButtom = ko.observable(false);\n        this.requestActivEmailrunning = ko.observable(false);\n        this.showSentActivEmail = ko.observable(-1);\n        this.conformText = ko.observable('');\n        this.conformTextError = ko.observable(false);\n        this.requestError = ko.observable(-1);\n        this.conformTextErrorNumber = ko.observable(-1);\n        this.activeing = ko.observable(false);\n        this.showRequestActivEmailButtonError = ko.observable(false);\n        const self = this;\n        this.conformText.subscribe(function (newValue) {\n            if (!newValue || !newValue.length) {\n                self.conformButtom(false);\n            }\n            else {\n                self.conformButtom(true);\n            }\n        });\n    }\n    checkActiveEmailSubmit() {\n        const self = this;\n        this.conformTextError(false);\n        this.activeing(true);\n        let text = this.conformText();\n        const showFromatError = (err) => {\n            self.activeing(false);\n            self.conformTextErrorNumber(_view.connectInformationMessage.getErrorIndex(err));\n            self.conformTextError(true);\n            return $('.activating.element1').popup({\n                on: 'click',\n                onHidden: function () {\n                    self.conformTextError(false);\n                }\n            });\n        };\n        if (!text || !text.length || !/^-+BEGIN PGP MESSAGE-+\\n/.test(text)) {\n            return showFromatError('PgpMessageFormatError');\n        }\n        //\t\tsupport Outlook mail\n        /*\n        if ( / /.test ( text )) {\n            text = text.replace ( / PGP MESSAGE/g, '__PGP__MESSAGE').replace (/ /g, '\\r\\n').replace (/__/g, ' ' )\n            text = text.replace ( / MESSAGE-----/,' MESSAGE-----\\r\\n' )\n        }\n        /** */\n        return _view.keyPairCalss.decryptMessage(text, (err, obj) => {\n            if (err) {\n                return showFromatError('PgpDecryptError');\n            }\n            const com = {\n                command: 'activePassword',\n                Args: [obj],\n                error: null,\n                subCom: null\n            };\n            return _view.keyPairCalss.emitRequest(com, (err, com) => {\n                if (err) {\n                    return showFromatError(err);\n                }\n                if (com) {\n                    if (com.error) {\n                        return showFromatError(com.error);\n                    }\n                    return _view.connectInformationMessage.sockEmit('checkActiveEmailSubmit', com.Args[0], (err, data) => {\n                        const config = _view.localServerConfig();\n                        config.keypair.verified = true;\n                        _view.keyPair(config.keypair);\n                        _view.sectionLogin(false);\n                        self.exit();\n                    });\n                }\n            });\n        });\n        /*\n        return _view.connectInformationMessage.sockEmit ( 'checkActiveEmailSubmit', text, function ( err, req: QTGateAPIRequestCommand ) {\n            self.activeing ( false )\n            if ( err !== null && err > -1 || req && req.error != null && req.error > -1 ) {\n                self.conformTextErrorNumber ( err !== null && err > -1 ? err : req.error )\n                self.conformTextError ( true )\n                \n            }\n            if (!req ) {\n                const config =  _view.localServerConfig()\n                config.keypair.verified = true\n                _view.localServerConfig ( config )\n                _view.keyPair ( config.keypair )\n                _view.sectionLogin ( false )\n                self.exit ()\n            }\n            \n        })\n        */\n    }\n    clearError() {\n        _view.connectInformationMessage.hideMessage();\n        this.showRequestActivEmailButtonError(false);\n    }\n    requestActivEmail() {\n        const self = this;\n        this.requestActivEmailrunning(true);\n        const com = {\n            command: 'requestActivEmail',\n            Args: [],\n            error: null,\n            subCom: null\n        };\n        const errorProcess = (err) => {\n            this.requestActivEmailrunning(false);\n            this.showRequestActivEmailButtonError(true);\n            _view.connectInformationMessage.showErrorMessage(err);\n        };\n        _view.keyPairCalss.emitRequest(com, (err, com) => {\n            if (err) {\n                return errorProcess(err);\n            }\n            if (!com) {\n                return;\n            }\n            if (com.error) {\n                return errorProcess(err);\n            }\n            if (com.Args[0] && com.Args[0].length) {\n                return _view.connectInformationMessage.sockEmit('checkActiveEmailSubmit', com.Args[0], () => {\n                    const config = _view.localServerConfig();\n                    config.keypair.verified = true;\n                    _view.keyPair(config.keypair);\n                    _view.sectionLogin(false);\n                    self.exit();\n                });\n            }\n            self.conformButtom(false);\n            self.showSentActivEmail(1);\n            const u = self.showSentActivEmail();\n        });\n        /*\n        return _view.connectInformationMessage.sockEmit ( 'requestActivEmail', function ( err ) {\n            self.requestActivEmailrunning ( false )\n            if ( err !== null && err > -1 ) {\n                return self.requestError ( err )\n            }\n            self.conformButtom ( false ),[h]\n            self.showSentActivEmail (1)\n            const u = self.showSentActivEmail()\n        })\n        */\n    }\n}\nclass imapForm {\n    constructor(account, imapData, exit) {\n        this.account = account;\n        this.exit = exit;\n        this.emailAddress = ko.observable('');\n        this.password = ko.observable('');\n        this.emailAddressShowError = ko.observable(false);\n        this.passwordShowError = ko.observable(false);\n        this.EmailAddressErrorType = ko.observable(0);\n        this.showForm = ko.observable(true);\n        this.checkProcessing = ko.observable(false);\n        this.checkImapError = ko.observable(-1);\n        this.showCheckProcess = ko.observable(false);\n        this.checkImapStep = ko.observable(0);\n        const self = this;\n        if (imapData) {\n            this.emailAddress(imapData.imapUserName);\n            this.password(imapData.imapUserPassword);\n        }\n        this.emailAddress.subscribe(function (newValue) {\n            return self.checkEmailAddress(newValue);\n        });\n        this.password.subscribe(function (newValue) {\n            return self.clearError();\n        });\n    }\n    clearError() {\n        this.emailAddressShowError(false);\n        this.EmailAddressErrorType(0);\n        this.passwordShowError(false);\n    }\n    checkImapSetup() {\n        let self = this;\n        this.checkProcessing(true);\n        this.checkImapStep(0);\n        const imapTest = function (err) {\n            if (err !== null && err > -1) {\n                return errorProcess(err);\n            }\n            self.checkImapStep(5);\n        };\n        const smtpTest = function (err) {\n            if (err !== null && err > -1) {\n                return errorProcess(err);\n            }\n            self.checkImapStep(2);\n        };\n        const imapTestFinish = function (IinputData) {\n            removeAllListen();\n            return self.exit(IinputData);\n        };\n        const removeAllListen = function () {\n            _view.connectInformationMessage.socketIo.removeEventListener('smtpTest', smtpTest);\n            _view.connectInformationMessage.socketIo.removeEventListener('imapTest', imapTest);\n            _view.connectInformationMessage.socketIo.removeEventListener('imapTestFinish', imapTestFinish);\n        };\n        const errorProcess = function (err) {\n            removeAllListen();\n            return self.checkImapError(err);\n        };\n        _view.connectInformationMessage.socketIo.once('smtpTest', smtpTest);\n        _view.connectInformationMessage.socketIo.once('imapTest', imapTest);\n        _view.connectInformationMessage.socketIo.once('imapTestFinish', imapTestFinish);\n        _view.connectInformationMessage.sockEmit('checkImap', self.emailAddress(), self.password(), new Date().getTimezoneOffset(), _view.tLang());\n    }\n    checkEmailAddress(email) {\n        this.clearError();\n        if (checkEmail(email).length) {\n            this.EmailAddressErrorType(0);\n            this.emailAddressShowError(true);\n            return initPopupArea();\n        }\n        const imapServer = getImapSmtpHost(email);\n        if (!availableImapServer.test(imapServer.imap)) {\n            this.EmailAddressErrorType(2);\n            this.emailAddressShowError(true);\n            return initPopupArea();\n        }\n    }\n    imapAccountGoCheckClick() {\n        const self = this;\n        this.checkEmailAddress(this.emailAddress());\n        if (this.emailAddressShowError() || !this.password().length) {\n            return;\n        }\n        this.showForm(false);\n        this.showCheckProcess(true);\n        this.checkImapError(-1);\n        return this.checkImapSetup();\n    }\n    returnImapSetup() {\n        this.showForm(true);\n        this.showCheckProcess(false);\n        this.checkImapError(-1);\n    }\n}\n"
  },
  {
    "path": "app/public/scripts/imapForm.ts",
    "content": "/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst availableImapServer = /imap\\-mail\\.outlook\\.com$|imap\\.mail\\.yahoo\\.(com|co\\.jp|co\\.uk|au)$|imap\\.mail\\.me\\.com$|imap\\.gmail\\.com$|gmx\\.(com|us|net)$|imap\\.zoho\\.com$/i\n/**\n * \t\t\tgetImapSmtpHost\n * \t\t@param email <string>\n * \t\t@return Imap & Smtp info\n */\n\nconst getImapSmtpHost = function ( _email: string ) {\n\tconst email = _email.toLowerCase()\n\tconst yahoo = function ( domain: string ) {\n\t\t\n\t\tif ( /yahoo.co.jp$/i.test ( domain ))\n\t\t\treturn 'yahoo.co.jp';\n\t\t\t\n\t\tif ( /((.*\\.){0,1}yahoo|yahoogroups|yahooxtra|yahoogruppi|yahoogrupper)(\\..{2,3}){1,2}$/.test ( domain ))\n\t\t\treturn 'yahoo.com';\n\t\t\n\t\tif ( /(^hotmail|^outlook|^live|^msn)(\\..{2,3}){1,2}$/.test ( domain ))\n\t\t\treturn 'hotmail.com';\n\t\t\t\n\t\tif ( /^(me|^icould|^mac)\\.com/.test ( domain ))\n\t\t\treturn 'me.com'\n\n\t\treturn domain\n\t}\n\n\tconst emailSplit = email.split ( '@' )\n\t\n\tif ( emailSplit.length !== 2 ) \n\t\treturn null\n\t\t\n\tconst domain = yahoo ( emailSplit [1] )\n\t\n\tconst ret = {\n\t\timap: 'imap.' + domain,\n\t\tsmtp: 'smtp.' + domain,\n\t\tSmtpPort: [465,587,994],\n\t\tImapPort: 993,\n\t\timapSsl: true,\n\t\tsmtpSsl: true,\n\t\thaveAppPassword: false,\n\t\tApplicationPasswordInformationUrl: ['']\n\t}\n\t\n\tswitch ( domain ) {\n\t\t//\t\tyahoo domain have two different \n\t\t//\t\tthe yahoo.co.jp is different other yahoo.*\n\t\tcase 'yahoo.co.jp': {\n\t\t\tret.imap = 'imap.mail.yahoo.co.jp';\n\t\t\tret.smtp = 'smtp.mail.yahoo.co.jp'\n\t\t}\n\t\tbreak;\n\n\t\t//\t\t\tgmail\n\t\tcase 'google.com':\n\t\tcase 'googlemail.com':\n\t\tcase 'gmail': {\n\t\t\tret.haveAppPassword = true;\n\t\t\tret.ApplicationPasswordInformationUrl = [\n\t\t\t\t'https://support.google.com/accounts/answer/185833?hl=zh-Hans',\n\t\t\t\t'https://support.google.com/accounts/answer/185833?hl=ja',\n\t\t\t\t'https://support.google.com/accounts/answer/185833?hl=en'\n\t\t\t]\n\t\t}\n\t\tbreak;\n\n        case 'gandi.net':\n            ret.imap = ret.smtp = 'mail.gandi.net'\n        break\n\t\t\n\t\t//\t\t\t\tyahoo.com\n\t\tcase 'rocketmail.com':\n\t\tcase 'y7mail.com':\n\t\tcase 'ymail.com':\n\t\tcase 'yahoo.com': {\n\t\t\tret.imap = 'imap.mail.yahoo.com'\n\t\t\tret.smtp = (/^bizmail.yahoo.com$/.test(emailSplit[1]))\n\t\t\t\t? 'smtp.bizmail.yahoo.com'\n\t\t\t\t: 'smtp.mail.yahoo.com'\n\t\t\tret.haveAppPassword = true;\n\t\t\tret.ApplicationPasswordInformationUrl = [\n\t\t\t\t'https://help.yahoo.com/kb/SLN15241.html',\n\t\t\t\t'https://help.yahoo.com/kb/SLN15241.html',\n\t\t\t\t'https://help.yahoo.com/kb/SLN15241.html'\n\t\t\t]\n\t\t}\n\t\tbreak;\n\n        case 'mail.ee':\n            ret.smtp = 'mail.ee'\n            ret.imap = 'mail.inbox.ee'\n        break\n\n\t\t\n        //\t\tgmx.com\n        case 'gmx.co.uk':\n        case 'gmx.de':\n\t\tcase 'gmx.us':\n\t\tcase 'gmx.com' : {\n            ret.smtp = 'mail.gmx.com'\n            ret.imap = 'imap.gmx.com'\n        }\n        \n\t\tbreak;\n\t\t\n\t\t//\t\taim.com\n\t\tcase 'aim.com': {\n\t\t\tret.imap = 'imap.aol.com'\n\t\t}\n\t\tbreak;\n\t\t\n\t\t//\toutlook.com\n\t\tcase 'windowslive.com':\n\t\tcase 'hotmail.com': \n\t\tcase 'outlook.com': {\n\t\t\tret.imap = 'imap-mail.outlook.com'\n            ret.smtp = 'smtp-mail.outlook.com'\n\t\t}\n\t\tbreak;\n\t\t\n\t\t//\t\t\tapple mail\n        case 'icloud.com':\n        case 'mac.com':\n\t\tcase 'me.com': {\n\t\t\tret.imap = 'imap.mail.me.com'\n            ret.smtp = 'smtp.mail.me.com'\n\t\t}\n\t\tbreak;\n\t\t\n\t\t//\t\t\t163.com\n\t\tcase '126.com':\n\t\tcase '163.com': {\n\t\t\tret.imap = 'appleimap.' + domain\n\t\t\tret.smtp = 'applesmtp.' + domain\n\t\t}\n\t\tbreak;\n\t\t\n\t\tcase 'sina.com':\n\t\tcase 'yeah.net': {\n\t\t\tret.smtpSsl = false\n\t\t}\n\t\tbreak;\n\t\t\n\t}\n\t\n\treturn ret\n\t\n}\n\nclass keyPairSign {\n\tpublic signError = ko.observable ( false )\n\tpublic conformButtom = ko.observable ( false )\n\tpublic requestActivEmailrunning = ko.observable ( false )\n\tpublic showSentActivEmail = ko.observable ( -1 )\n\tpublic conformText = ko.observable ('')\n\tpublic conformTextError = ko.observable ( false )\n\tpublic requestError = ko.observable (-1)\n\tpublic conformTextErrorNumber = ko.observable ( -1 )\n\tpublic activeing = ko.observable ( false )\n\tpublic showRequestActivEmailButtonError = ko.observable ( false )\n\t\n\tconstructor ( private exit: () => void ) {\n\t\tconst self = this\n\t\tthis.conformText.subscribe ( function ( newValue ) {\n\t\t\tif ( !newValue || !newValue.length ) {\n\t\t\t\tself.conformButtom ( false )\n\t\t\t} else {\n\t\t\t\tself.conformButtom ( true )\n\t\t\t}\n\t\t})\n\t}\n\n\tpublic checkActiveEmailSubmit () {\n\t\tconst self = this\n\t\tthis.conformTextError ( false )\n\t\tthis.activeing ( true )\n\t\t\n\t\tlet text = this.conformText()\n\n\t\tconst showFromatError = ( err ) => {\n\t\t\tself.activeing ( false )\n\t\t\tself.conformTextErrorNumber ( _view.connectInformationMessage.getErrorIndex ( err ))\n\t\t\tself.conformTextError ( true )\n\t\t\treturn $( '.activating.element1' ).popup({\n\t\t\t\ton: 'click',\n\t\t\t\tonHidden: function () {\n\t\t\t\t\tself.conformTextError ( false )\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\t\n\n\t\tif ( ! text || ! text.length || !/^-+BEGIN PGP MESSAGE-+\\n/.test ( text )) {\n\t\t\treturn showFromatError ( 'PgpMessageFormatError' )\n\t\t}\n\n\t\t//\t\tsupport Outlook mail\n\t\t/*\n\t\tif ( / /.test ( text )) {\n\t\t\ttext = text.replace ( / PGP MESSAGE/g, '__PGP__MESSAGE').replace (/ /g, '\\r\\n').replace (/__/g, ' ' )\n\t\t\ttext = text.replace ( / MESSAGE-----/,' MESSAGE-----\\r\\n' )\n\t\t}\n\t\t/** */\n\n\t\treturn _view.keyPairCalss.decryptMessage ( text, ( err, obj ) => {\n\t\t\tif ( err ) {\n\t\t\t\treturn showFromatError ( 'PgpDecryptError' )\n\t\t\t}\n\t\t\tconst com: QTGateAPIRequestCommand = {\n\t\t\t\tcommand: 'activePassword',\n\t\t\t\tArgs: [ obj ],\n\t\t\t\terror: null,\n\t\t\t\tsubCom: null\n\t\t\t}\n\n\t\t\treturn _view.keyPairCalss.emitRequest ( com, ( err, com: QTGateAPIRequestCommand ) => {\n\t\t\t\tif ( err ) {\n\t\t\t\t\treturn showFromatError ( err )\n\t\t\t\t}\n\n\t\t\t\tif ( com ) {\n\t\t\t\t\tif ( com.error ) {\n\t\t\t\t\t\treturn showFromatError ( com.error )\n\t\t\t\t\t}\n\t\t\t\t\treturn _view.connectInformationMessage.sockEmit ('checkActiveEmailSubmit', com.Args [0], ( err, data ) => {\n\t\t\t\t\t\tconst config =  _view.localServerConfig()\n\t\t\t\t\t\tconfig.keypair.verified = true\n\t\t\t\t\t\t\n\t\t\t\t\t\t_view.keyPair ( config.keypair )\n\t\t\t\t\t\t_view.sectionLogin ( false )\n\t\t\t\t\t\tself.exit ()\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\n\t\t})\n\t\t/*\n\t\treturn _view.connectInformationMessage.sockEmit ( 'checkActiveEmailSubmit', text, function ( err, req: QTGateAPIRequestCommand ) {\n\t\t\tself.activeing ( false )\n\t\t\tif ( err !== null && err > -1 || req && req.error != null && req.error > -1 ) {\n\t\t\t\tself.conformTextErrorNumber ( err !== null && err > -1 ? err : req.error )\n\t\t\t\tself.conformTextError ( true )\n\t\t\t\t\n\t\t\t}\n\t\t\tif (!req ) {\n\t\t\t\tconst config =  _view.localServerConfig()\n\t\t\t\tconfig.keypair.verified = true\n\t\t\t\t_view.localServerConfig ( config )\n\t\t\t\t_view.keyPair ( config.keypair )\n\t\t\t\t_view.sectionLogin ( false )\n\t\t\t\tself.exit ()\n\t\t\t}\n\t\t\t\n\t\t})\n\t\t*/\n\t\t\n\t}\n\n\tpublic clearError () {\n\t\t_view.connectInformationMessage.hideMessage()\n\t\tthis.showRequestActivEmailButtonError ( false )\n\t\t\n\t}\n\n\tpublic requestActivEmail () {\n\t\tconst self = this\n\t\tthis.requestActivEmailrunning ( true )\n\t\tconst com: QTGateAPIRequestCommand = {\n\t\t\tcommand: 'requestActivEmail',\n\t\t\tArgs: [],\n\t\t\terror: null,\n\t\t\tsubCom: null\n\t\t}\n\n\t\tconst errorProcess = ( err ) => {\n\t\t\tthis.requestActivEmailrunning ( false )\n\t\t\tthis.showRequestActivEmailButtonError ( true )\n\t\t\t_view.connectInformationMessage.showErrorMessage ( err )\n\t\t}\n\n\t\t\n\t\t\n\t\t_view.keyPairCalss.emitRequest ( com,( err, com: QTGateAPIRequestCommand ) => {\n\t\t\tif ( err ) {\n\t\t\t\treturn errorProcess ( err )\n\t\t\t}\n\t\t\tif ( !com ) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif ( com.error ) {\n\t\t\t\treturn errorProcess ( err )\n\t\t\t}\n\n\t\t\tif ( com.Args[0] && com.Args[0].length ) {\n\t\t\t\treturn _view.connectInformationMessage.sockEmit ('checkActiveEmailSubmit', com.Args [0], () => {\n\t\t\t\t\tconst config =  _view.localServerConfig()\n\t\t\t\t\tconfig.keypair.verified = true\n\t\t\t\t\t\n\t\t\t\t\t_view.keyPair ( config.keypair )\n\t\t\t\t\t_view.sectionLogin ( false )\n\t\t\t\t\tself.exit ()\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tself.conformButtom ( false )\n\t\t\tself.showSentActivEmail (1)\n\t\t\tconst u = self.showSentActivEmail()\n\t\t})\n\t\t\n\t\t/*\n\t\treturn _view.connectInformationMessage.sockEmit ( 'requestActivEmail', function ( err ) {\n\t\t\tself.requestActivEmailrunning ( false )\n\t\t\tif ( err !== null && err > -1 ) {\n\t\t\t\treturn self.requestError ( err )\n\t\t\t}\n\t\t\tself.conformButtom ( false ),[h]\n\t\t\tself.showSentActivEmail (1)\n\t\t\tconst u = self.showSentActivEmail()\n\t\t})\n\t\t*/\n\t}\n}\n\nclass imapForm {\n\tpublic emailAddress = ko.observable ('')\n\tpublic password = ko.observable ('')\n\tpublic emailAddressShowError = ko.observable ( false )\n\tpublic passwordShowError = ko.observable ( false )\n\tpublic EmailAddressErrorType = ko.observable ( 0 )\n\tpublic showForm = ko.observable ( true )\n\tpublic checkProcessing = ko.observable ( false )\n\tpublic checkImapError = ko.observable (-1)\n\tpublic showCheckProcess = ko.observable ( false )\n\tpublic checkImapStep = ko.observable (0)\n\t\n\t\n\tprivate clearError () {\n\t\tthis.emailAddressShowError ( false )\n\t\tthis.EmailAddressErrorType (0)\n\t\tthis.passwordShowError ( false )\n\t}\n\t\n\tprivate checkImapSetup () {\n\t\t\n\t\tlet self = this\n\t\tthis.checkProcessing ( true )\n\t\tthis.checkImapStep (0)\n\t\t\n\t\tconst imapTest = function ( err ) {\n\t\t\tif ( err !== null && err > -1 ) {\n\t\t\t\treturn errorProcess ( err )\n\t\t\t}\n\t\t\tself.checkImapStep (5)\n\t\t\t\n\t\t}\n\n\t\tconst smtpTest = function ( err ) {\n\t\t\t\n\t\t\tif ( err !== null && err > -1 ) {\n\t\t\t\treturn errorProcess ( err )\n\t\t\t}\n\t\t\tself.checkImapStep (2)\n\t\t\t\n\t\t}\n\n\t\tconst imapTestFinish = function ( IinputData: IinputData ) {\n\t\t\tremoveAllListen ()\n\t\t\treturn self.exit ( IinputData )\n\t\t}\n\n\t\tconst removeAllListen = function () {\n\t\t\t_view.connectInformationMessage.socketIo.removeEventListener ( 'smtpTest', smtpTest )\n\t\t\t_view.connectInformationMessage.socketIo.removeEventListener ( 'imapTest', imapTest )\n\t\t\t_view.connectInformationMessage.socketIo.removeEventListener ( 'imapTestFinish', imapTestFinish )\n\t\t}\n\n\t\tconst errorProcess = function ( err ) {\n\t\t\tremoveAllListen ()\n\t\t\treturn self.checkImapError ( err )\n\t\t}\n\n\t\t_view.connectInformationMessage.socketIo.once ( 'smtpTest', smtpTest )\n\t\t_view.connectInformationMessage.socketIo.once ( 'imapTest', imapTest )\n\t\t_view.connectInformationMessage.socketIo.once ( 'imapTestFinish', imapTestFinish )\n\t\t_view.connectInformationMessage.sockEmit ( 'checkImap', self.emailAddress (), self.password (), new Date ().getTimezoneOffset (), _view.tLang ())\n\t}\n\n\tprivate checkEmailAddress ( email: string ) {\n\t\tthis.clearError ()\n\t\tif ( checkEmail ( email ).length ) {\n\t\t\tthis.EmailAddressErrorType (0)\n\t\t\tthis.emailAddressShowError ( true )\n\t\t\treturn initPopupArea ()\n\t\t}\n\t\tconst imapServer = getImapSmtpHost ( email )\n\t\tif ( !availableImapServer.test ( imapServer.imap )) {\n\t\t\tthis.EmailAddressErrorType (2)\n\t\t\tthis.emailAddressShowError ( true )\n\t\t\treturn initPopupArea ()\n\t\t}\n\t}\n\n\tconstructor ( private account: string, imapData: IinputData, private exit: ( IinputData: IinputData ) => void ) {\n\t\tconst self = this\n\t\tif ( imapData ) {\n\t\t\tthis.emailAddress ( imapData.imapUserName )\n\t\t\tthis.password ( imapData.imapUserPassword )\n\t\t}\n\n\t\tthis.emailAddress.subscribe ( function ( newValue ) {\n\t\t\treturn self.checkEmailAddress ( newValue )\n\t\t})\n\n\t\tthis.password.subscribe ( function ( newValue ) {\n\t\t\treturn self.clearError ()\n\t\t})\n\t}\n\n\tpublic imapAccountGoCheckClick () {\n\t\tconst self = this\n\t\tthis.checkEmailAddress ( this.emailAddress() )\n\t\t\n\t\tif ( this.emailAddressShowError() || !this.password().length ) {\n\t\t\treturn\n\t\t}\n\t\tthis.showForm ( false )\n\t\tthis.showCheckProcess ( true )\n\t\tthis.checkImapError ( -1 )\n\t\t\n\t\treturn this.checkImapSetup ()\n\t\t\n\t}\n\n\tpublic returnImapSetup () {\n\t\tthis.showForm ( true )\n\t\tthis.showCheckProcess ( false )\n\t\tthis.checkImapError ( -1 )\n\t}\n}"
  },
  {
    "path": "app/public/scripts/jquery.cookie.js",
    "content": "/*!\n * jQuery Cookie Plugin v1.4.1\n * https://github.com/carhartl/jquery-cookie\n *\n * Copyright 2013 Klaus Hartl\n * Released under the MIT license\n */\n(function (factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\t// AMD\n\t\tdefine(['jquery'], factory);\n\t} else if (typeof exports === 'object') {\n\t\t// CommonJS\n\t\tfactory(require('jquery'));\n\t} else {\n\t\t// Browser globals\n\t\tfactory(jQuery);\n\t}\n}(function ($) {\n\n\tvar pluses = /\\+/g;\n\n\tfunction encode(s) {\n\t\treturn config.raw ? s : encodeURIComponent(s);\n\t}\n\n\tfunction decode(s) {\n\t\treturn config.raw ? s : decodeURIComponent(s);\n\t}\n\n\tfunction stringifyCookieValue(value) {\n\t\treturn encode(config.json ? JSON.stringify(value) : String(value));\n\t}\n\n\tfunction parseCookieValue(s) {\n\t\tif (s.indexOf('\"') === 0) {\n\t\t\t// This is a quoted cookie as according to RFC2068, unescape...\n\t\t\ts = s.slice(1, -1).replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, '\\\\');\n\t\t}\n\n\t\ttry {\n\t\t\t// Replace server-side written pluses with spaces.\n\t\t\t// If we can't decode the cookie, ignore it, it's unusable.\n\t\t\t// If we can't parse the cookie, ignore it, it's unusable.\n\t\t\ts = decodeURIComponent(s.replace(pluses, ' '));\n\t\t\treturn config.json ? JSON.parse(s) : s;\n\t\t} catch(e) {}\n\t}\n\n\tfunction read(s, converter) {\n\t\tvar value = config.raw ? s : parseCookieValue(s);\n\t\treturn $.isFunction(converter) ? converter(value) : value;\n\t}\n\n\tvar config = $.cookie = function (key, value, options) {\n\n\t\t// Write\n\n\t\tif (value !== undefined && !$.isFunction(value)) {\n\t\t\toptions = $.extend({}, config.defaults, options);\n\n\t\t\tif (typeof options.expires === 'number') {\n\t\t\t\tvar days = options.expires, t = options.expires = new Date();\n\t\t\t\tt.setTime(+t + days * 864e+5);\n\t\t\t}\n\n\t\t\treturn (document.cookie = [\n\t\t\t\tencode(key), '=', stringifyCookieValue(value),\n\t\t\t\toptions.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE\n\t\t\t\toptions.path    ? '; path=' + options.path : '',\n\t\t\t\toptions.domain  ? '; domain=' + options.domain : '',\n\t\t\t\toptions.secure  ? '; secure' : ''\n\t\t\t].join(''));\n\t\t}\n\n\t\t// Read\n\n\t\tvar result = key ? undefined : {};\n\n\t\t// To prevent the for loop in the first place assign an empty array\n\t\t// in case there are no cookies at all. Also prevents odd result when\n\t\t// calling $.cookie().\n\t\tvar cookies = document.cookie ? document.cookie.split('; ') : [];\n\n\t\tfor (var i = 0, l = cookies.length; i < l; i++) {\n\t\t\tvar parts = cookies[i].split('=');\n\t\t\tvar name = decode(parts.shift());\n\t\t\tvar cookie = parts.join('=');\n\n\t\t\tif (key && key === name) {\n\t\t\t\t// If second argument (value) is a function it's a converter...\n\t\t\t\tresult = read(cookie, value);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Prevent storing a cookie that we couldn't decode.\n\t\t\tif (!key && (cookie = read(cookie)) !== undefined) {\n\t\t\t\tresult[name] = cookie;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\tconfig.defaults = {};\n\n\t$.removeCookie = function (key, options) {\n\t\tif ($.cookie(key) === undefined) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Must not alter options, thus extending a fresh object...\n\t\t$.cookie(key, '', $.extend({}, options, { expires: -1 }));\n\t\treturn !$.cookie(key);\n\t};\n\n}));\n"
  },
  {
    "path": "app/public/scripts/keyPairGenerateForm.js",
    "content": "/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n *      check email address\n *      @param email <string>\n *      @param return <string>  Valid = '' Err = errorMessage\n */\nconst insideChinaEmail = /(\\@|\\.)(sina|sohu|qq|126|163|tom)\\.com|(\\.|\\@)yeah\\.net/i;\nconst getNickName = function (email) {\n    var ret = '';\n    if (email.length) {\n        ret = email.split('@')[0];\n        ret = ret.charAt(0).toUpperCase() + ret.slice(1);\n    }\n    return ret;\n};\nclass IsNullValidator {\n    isAcceptable(s) {\n        if (s === undefined) {\n            return true;\n        }\n        if (s === null) {\n            return true;\n        }\n        if (s.length == 0) {\n            return true;\n        }\n    }\n}\nclass EmailValidator {\n    isAcceptable(s) {\n        return EmailRegexp.test(s);\n    }\n}\nconst testVal = new IsNullValidator();\nconst testEmail = new EmailValidator();\nconst checkEmail = function (email) {\n    if (testVal.isAcceptable(email)) {\n        return 'required';\n    }\n    if (!testEmail.isAcceptable(email)) {\n        return 'EmailAddress';\n    }\n    return '';\n};\nclass keyPairGenerateForm {\n    constructor(exit) {\n        this.exit = exit;\n        this.EmailAddressError = ko.observable(false);\n        this.SystemAdministratorEmailAddress = ko.observable('');\n        this.showInsideFireWallEmail = ko.observable(false);\n        this.NickNameError = ko.observable(false);\n        this.passwordError = ko.observable(false);\n        this.SystemAdministratorNickName = ko.observable('');\n        this.systemSetup_systemPassword = ko.observable('');\n        this.showKeyPairPorcess = ko.observable(false);\n        this.delete_btn_view = ko.observable(false);\n        this.doingProcessBarTime = null;\n        this.keyPairGenerateFormMessage = ko.observable(false);\n        this.message_cancel = ko.observable(false);\n        this.message_keyPairGenerateError = ko.observable(false);\n        this.message_keyPairGenerateSuccess = ko.observable(false);\n        this.showKeyPairForm = ko.observable(true);\n        this.showKeyInfomation = ko.observable(false);\n        const self = this;\n        this.SystemAdministratorEmailAddress.subscribe(function (newValue) {\n            return self.checkEmailAddress(newValue);\n        });\n        this.SystemAdministratorNickName.subscribe(function (newValue) {\n            return self.checkNickname(newValue);\n        });\n        /*\n        this.systemSetup_systemPassword.subscribe ( function ( newValue ) {\n            return self.checkPassword ( newValue )\n        })\n        */\n    }\n    checkEmailAddress(email) {\n        $('.ui.checkbox').checkbox();\n        this.EmailAddressError(false);\n        this.NickNameError(false);\n        if (!email || !email.length) {\n            this.EmailAddressError(true);\n            return initPopupArea();\n        }\n        if (conetImapAccount.test(email)) {\n            this.EmailAddressError(true);\n            return initPopupArea();\n        }\n        if (checkEmail(email).length) {\n            this.EmailAddressError(true);\n            return initPopupArea();\n        }\n        if (!this.SystemAdministratorNickName().length) {\n            this.SystemAdministratorNickName(getNickName(email));\n        }\n        if (insideChinaEmail.test(email)) {\n            this.showInsideFireWallEmail(true);\n        }\n        return true;\n    }\n    checkNickname(nickname) {\n        this.NickNameError(false);\n        if (!nickname || !nickname.length) {\n            initPopupArea();\n            this.NickNameError(true);\n        }\n        return true;\n    }\n    checkPassword(password) {\n        this.passwordError(false);\n        if (!password || password.length < 5) {\n            this.passwordError(true);\n            initPopupArea();\n        }\n        return true;\n    }\n    stopDoingProcessBar() {\n        clearTimeout(this.doingProcessBarTime);\n        this.showKeyPairPorcess(false);\n        return $('.keyPairProcessBar').progress({\n            percent: 0\n        });\n    }\n    form_AdministratorEmail_submit() {\n        const self = this;\n        this.checkEmailAddress(this.SystemAdministratorEmailAddress());\n        this.checkNickname(this.SystemAdministratorNickName());\n        this.checkPassword(this.systemSetup_systemPassword());\n        if (this.passwordError() || this.EmailAddressError() || this.NickNameError()) {\n            return false;\n        }\n        this.showKeyPairPorcess(true);\n        this.showKeyPairForm(false);\n        const email = this.SystemAdministratorEmailAddress();\n        const sendData = {\n            password: this.systemSetup_systemPassword(),\n            nikeName: this.SystemAdministratorNickName(),\n            email: email\n        };\n        let percent = 1;\n        $('.keyPairProcessBar').progress('reset');\n        const timeSet = 10000;\n        const doingProcessBar = function () {\n            clearTimeout(self.doingProcessBarTime);\n            self.doingProcessBarTime = setTimeout(function () {\n                $('.keyPairProcessBar').progress({\n                    percent: percent++\n                });\n                if (percent < 100)\n                    return doingProcessBar();\n            }, timeSet);\n        };\n        _view.connectInformationMessage.sockEmit('NewKeyPair', sendData, function (err, keyPair, newKeyPairCallBack) {\n            self.stopDoingProcessBar();\n            self.keyPairGenerateFormMessage(true);\n            if (!keyPair) {\n                return self.message_keyPairGenerateError(true);\n            }\n            self.exit(keyPair, newKeyPairCallBack);\n            return self.message_keyPairGenerateSuccess(true);\n        });\n        return doingProcessBar();\n    }\n    CloseKeyPairGenerateFormMessage() {\n        this.message_cancel(false);\n        this.message_keyPairGenerateError(false);\n        this.message_keyPairGenerateSuccess(false);\n        this.keyPairGenerateFormMessage(false);\n        return this.showKeyPairForm(true);\n    }\n}\n"
  },
  {
    "path": "app/public/scripts/keyPairGenerateForm.ts",
    "content": "/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n *      check email address\n *      @param email <string>\n *      @param return <string>  Valid = '' Err = errorMessage\n */\nconst insideChinaEmail = /(\\@|\\.)(sina|sohu|qq|126|163|tom)\\.com|(\\.|\\@)yeah\\.net/i\n\nconst getNickName = function ( email: string ) {\n    var ret = ''\n    if ( email.length ){\n        ret = email.split ('@')[0]\n        ret = ret.charAt (0).toUpperCase () + ret.slice(1)\n    }\n    return ret\n}\n\nclass IsNullValidator implements StringValidator {\n    isAcceptable ( s: string ) {\n        if ( s === undefined ) {\n            return true\n        }\n        if ( s === null ) {\n            return true\n        }\n        if ( s.length == 0 ) {\n            return true\n        }\n    }\n}\nclass EmailValidator implements StringValidator {\n    isAcceptable ( s: string ) {\n        return EmailRegexp.test( s )\n    }\n}\n\nconst testVal = new IsNullValidator()\nconst testEmail = new EmailValidator()\nconst checkEmail = function ( email: string ) {\n    \n    if ( testVal.isAcceptable ( email )) {\n       return 'required'\n    } \n    \n    if ( ! testEmail.isAcceptable ( email ))\n    {\n        return 'EmailAddress'\n    }\n    \n    return ''\n}\n\nclass keyPairGenerateForm {\n\tpublic EmailAddressError = ko.observable ( false )\n\tpublic SystemAdministratorEmailAddress = ko.observable ('')\n\tpublic showInsideFireWallEmail = ko.observable ( false )\n\tpublic NickNameError = ko.observable ( false )\n\tpublic passwordError = ko.observable ( false )\n\tpublic SystemAdministratorNickName = ko.observable ('')\n\tpublic systemSetup_systemPassword = ko.observable ('')\n\tpublic showKeyPairPorcess = ko.observable ( false )\n\tpublic delete_btn_view = ko.observable ( false )\n\tpublic doingProcessBarTime = null\n\tpublic keyPairGenerateFormMessage = ko.observable ( false )\n\tpublic message_cancel = ko.observable ( false )\n\tpublic message_keyPairGenerateError = ko.observable ( false )\n\tpublic message_keyPairGenerateSuccess = ko.observable ( false )\n\tpublic showKeyPairForm = ko.observable ( true )\n\tpublic showKeyInfomation = ko.observable ( false )\n\t\n\tprivate checkEmailAddress ( email: string ) {\n\t\t$ ('.ui.checkbox').checkbox()\n\t\t\n\t\tthis.EmailAddressError ( false )\n\t\tthis.NickNameError ( false )\n\n\t\tif ( ! email || ! email.length ) {\n\t\t\tthis.EmailAddressError ( true )\n\t\t\treturn initPopupArea ()\n\t\t}\n\t\tif ( conetImapAccount.test ( email )) {\n\t\t\tthis.EmailAddressError ( true )\n\t\t\treturn initPopupArea ()\n\t\t}\n\t\tif ( checkEmail ( email ).length ) {\n\n\t\t\tthis.EmailAddressError ( true )\n\t\t\treturn initPopupArea ()\n\t\t}\n\n\t\t\n\t\tif ( ! this.SystemAdministratorNickName ().length ){\n\t\t\tthis.SystemAdministratorNickName ( getNickName ( email ))\n\t\t}\n\n\t\tif ( insideChinaEmail.test ( email )) {\n\t\t\tthis.showInsideFireWallEmail ( true )\n\t\t}\n\t\t\n\t\treturn true\n\t}\n\n\tprivate checkNickname ( nickname: string ) {\n\t\tthis.NickNameError ( false )\n\t\tif ( !nickname || !nickname.length ) {\n\t\t\tinitPopupArea ()\n\t\t\tthis.NickNameError ( true )\n\t\t}\n\t\treturn true\n\t}\n\n\tprivate checkPassword ( password: string ) {\n\t\tthis.passwordError(false)\n\t\tif ( !password || password.length < 5 ) {\n\t\t\tthis.passwordError ( true )\n\t\t\tinitPopupArea ()\n\t\t}\n\t\treturn true\n\t}\n\n\tprivate stopDoingProcessBar () {\n\t\tclearTimeout ( this.doingProcessBarTime )\n\t\tthis.showKeyPairPorcess ( false )\n\t\treturn $('.keyPairProcessBar').progress ({\n\t\t\tpercent: 0\n\t\t})\n\t}\n\n\tconstructor ( private exit: ( keyPair, sessionHash: string ) => void ) {\n\t\tconst self = this\n\t\tthis.SystemAdministratorEmailAddress.subscribe ( function ( newValue ) {\n\t\t\treturn self.checkEmailAddress ( newValue )\n\t\t})\n\t\tthis.SystemAdministratorNickName.subscribe ( function ( newValue ) {\n\t\t\treturn self.checkNickname ( newValue )\n\t\t})\n\t\t/*\n\t\tthis.systemSetup_systemPassword.subscribe ( function ( newValue ) {\n\t\t\treturn self.checkPassword ( newValue )\n\t\t})\n\t\t*/\n\t}\n\t\n\tpublic form_AdministratorEmail_submit () {\n\t\tconst self = this\n\t\tthis.checkEmailAddress ( this.SystemAdministratorEmailAddress ())\n\t\tthis.checkNickname ( this.SystemAdministratorNickName ())\n\t\tthis.checkPassword ( this.systemSetup_systemPassword ())\n\t\tif ( this.passwordError() || this.EmailAddressError() || this.NickNameError()) {\n\t\t\treturn false\n\t\t}\n\t\tthis.showKeyPairPorcess ( true )\n\t\tthis.showKeyPairForm ( false )\n\t\tconst email = this.SystemAdministratorEmailAddress ()\n\t\tconst sendData: INewKeyPair = {\n\t\t\tpassword: this.systemSetup_systemPassword (),\n\t\t\tnikeName: this.SystemAdministratorNickName (),\n\t\t\temail: email\n\t\t}\n\t\tlet percent = 1\n\t\t$('.keyPairProcessBar').progress ('reset')\n\t\tconst timeSet = 10000\n\t\tconst doingProcessBar = function () {\n\t\t\tclearTimeout ( self.doingProcessBarTime )\n\t\t\tself.doingProcessBarTime = setTimeout ( function () {\n\t\t\t\t$('.keyPairProcessBar').progress ({\n\t\t\t\t\tpercent: percent++\n\t\t\t\t})\n\t\t\t\tif ( percent < 100 )\n\t\t\t\t\treturn doingProcessBar ()\n\t\t\t}, timeSet )\n\t\t}\n\t\t\n\n\t\t_view.connectInformationMessage.sockEmit ( 'NewKeyPair', sendData, function ( err, keyPair, newKeyPairCallBack ) {\n\t\t\tself.stopDoingProcessBar ()\n\t\t\tself.keyPairGenerateFormMessage ( true )\n\t\t\tif ( !keyPair ) {\n\t\t\t\treturn self.message_keyPairGenerateError ( true )\n\t\t\t}\n\t\t\tself.exit ( keyPair, newKeyPairCallBack )\n\t\t\treturn self.message_keyPairGenerateSuccess ( true )\n\t\t}) \n\t\t\n\t\treturn doingProcessBar ()\n\t}\n\n\tpublic CloseKeyPairGenerateFormMessage () {\n\t\tthis.message_cancel ( false )\n\t\tthis.message_keyPairGenerateError ( false )\n\t\tthis.message_keyPairGenerateSuccess ( false )\n\t\tthis.keyPairGenerateFormMessage ( false )\n\t\treturn this.showKeyPairForm ( true )\n\t}\n}"
  },
  {
    "path": "app/public/scripts/keyPairPassword.js",
    "content": "/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nclass keyPairPassword {\n    constructor(exit) {\n        this.exit = exit;\n        this.showPasswordErrorMessage = ko.observable(false);\n        this.systemSetup_systemPassword = ko.observable('');\n        this.passwordChecking = ko.observable(false);\n        this.inputFocus = ko.observable(false);\n        const self = this;\n        this.systemSetup_systemPassword.subscribe(function (newValue) {\n            if (!newValue || !newValue.length) {\n                return;\n            }\n            self.showPasswordErrorMessage(false);\n        });\n    }\n    showPasswordError() {\n        this.showPasswordErrorMessage(true);\n        this.systemSetup_systemPassword('');\n        return initPopupArea();\n    }\n    keyPair_checkPemPasswordClick() {\n        const self = this;\n        this.showPasswordErrorMessage(false);\n        if (!this.systemSetup_systemPassword() || this.systemSetup_systemPassword().length < 5) {\n            return this.showPasswordError();\n        }\n        this.passwordChecking(true);\n        return _view.connectInformationMessage.sockEmit('checkPemPassword', this.systemSetup_systemPassword(), function (err, _imapData, passwd, sessionHash) {\n            self.passwordChecking(false);\n            if (err || typeof _imapData === 'boolean' && _imapData) {\n                return self.showPasswordError();\n            }\n            return self.exit(_imapData, passwd, sessionHash);\n        });\n    }\n}\n"
  },
  {
    "path": "app/public/scripts/keyPairPassword.ts",
    "content": "/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass keyPairPassword {\n\tpublic showPasswordErrorMessage = ko.observable ( false )\n\tpublic systemSetup_systemPassword = ko.observable ('')\n\tpublic passwordChecking = ko.observable ( false )\n\tpublic inputFocus = ko.observable ( false )\n\tconstructor ( private exit: ( imapDat: imapData, passwd: string, sessionHash: string ) => void ) {\n\t\tconst self = this\n\t\tthis.systemSetup_systemPassword.subscribe ( function ( newValue ) {\n\t\t\tif ( !newValue || !newValue.length ) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tself.showPasswordErrorMessage ( false )\n\t\t})\n\t\t\n\t}\n\n\tprivate showPasswordError() {\n\t\tthis.showPasswordErrorMessage ( true )\n\t\tthis.systemSetup_systemPassword ('')\n\t\treturn initPopupArea()\n\t}\n\n\tpublic keyPair_checkPemPasswordClick () {\n\t\tconst self = this\n\t\tthis.showPasswordErrorMessage ( false )\n\t\tif ( !this.systemSetup_systemPassword() || this.systemSetup_systemPassword().length < 5 ) {\n\t\t\treturn this.showPasswordError ()\n\t\t}\n\t\tthis.passwordChecking ( true )\n\t\treturn _view.connectInformationMessage.sockEmit ( 'checkPemPassword', this.systemSetup_systemPassword(), function ( err: boolean, _imapData: imapData, passwd: string, sessionHash: string ) {\n\t\t\tself.passwordChecking ( false )\n\t\t\tif ( err || typeof _imapData === 'boolean' && _imapData ) {\n\t\t\t\treturn self.showPasswordError()\n\t\t\t}\n\t\t\treturn self.exit ( _imapData, passwd, sessionHash )\n\t\t})\n\t}\n}"
  },
  {
    "path": "app/public/scripts/knockout.animate.js",
    "content": "(function (factory) {\n    if (typeof require === \"function\" && typeof exports === \"object\" && typeof module === \"object\") {\n        factory(require(\"knockout\"), exports);\n    } else if (typeof define === \"function\" && define[\"amd\"]) {\n        define([\"knockout\", \"exports\"], factory);\n    } else {\n        factory(ko, ko.mapping = {});\n    }\n}(function (ko, exports) {\n    var animations = [ \"bounce\", \"flash\", \"pulse\", \"rubberBand\", \"shake\", \"swing\", \"tada\", \"wobble\", \"bounceIn\", \"bounceInDown\", \n        \"bounceInLeft\", \"bounceInRight\", \"bounceInUp\", \"bounceOut\", \"bounceOutDown\", \"bounceOutLeft\", \"bounceOutRight\", \n        \"bounceOutUp\", \"fadeIn\", \"fadeInDown\", \"fadeInDownBig\", \"fadeInLeft\", \"fadeInLeftBig\", \"fadeInRight\", \"fadeInRightBig\", \n        \"fadeInUp\", \"fadeInUpBig\", \"fadeOut\", \"fadeOutDown\", \"fadeOutDownBig\", \"fadeOutLeft\", \"fadeOutLeftBig\", \"fadeOutRight\", \n        \"fadeOutRightBig\", \"fadeOutUp\", \"fadeOutUpBig\", \"flip\", \"flipInX\", \"flipInY\", \"flipOutX\", \"flipOutY\", \"lightSpeedIn\", \n        \"lightSpeedOut\", \"rotateIn\", \"rotateInDownLeft\", \"rotateInDownRight\", \"rotateInUpLeft\", \"rotateInUpRight\", \"rotateOut\",\n         \"rotateOutDownLeft\", \"rotateOutDownRight\", \"rotateOutUpLeft\", \"rotateOutUpRight\", \"hinge\", \"rollIn\", \"rollOut\", \"zoomIn\", \n         \"slideInDown\", \"slideInLeft\",\"slideInRight\",\"slideInUp\", \"slideOutDown\",\"slideOutLeft\",\"slideOutRight\",\"slideOutUp\",\n         \"zoomInDown\", \"zoomInLeft\", \"zoomInRight\", \"zoomInUp\", \"zoomOut\", \"zoomOutDown\", \"zoomOutLeft\", \"zoomOutRight\", \"zoomOutUp\"],\n        baseAnimateClass = \"animated\",\n        pfx = [\"webkit\", \"moz\", \"MS\", \"o\", \"\"];\n    const hideClass = 'displayNono'\n    function addPrefixedEvent(element, type, callback) {\n        for (var p = 0; p < pfx.length; p++) {\n            if (!pfx[p]) type = type.toLowerCase();\n            element.addEventListener(pfx[p]+type, callback, false);\n        }\n    }\n\n    function removePrefixedEvent(element, type, fun) {\n        for (var p = 0; p < pfx.length; p++) {\n            if (!pfx[p]) type = type.toLowerCase();\n            element.removeEventListener(pfx[p]+type, fun);\n        }\n    }\n\n    function hasClass(ele,cls) {\n        return ele.className.match(new RegExp('(\\\\s|^)'+cls+'(\\\\s|$)'));\n    }\n\n    function addClass(ele,cls) {\n        if (!hasClass(ele,cls)){\n            ele.className = ele.className ? ele.className + \" \" + cls : cls;\n        }\n    }\n\n    function removeClass(ele,cls) {\n        if (hasClass(ele,cls)) {\n            var reg = new RegExp('(\\\\s|^)'+cls+'(\\\\s|$)');\n            ele.className = ele.className.replace(reg,' ').trim();\n        }\n    }\n\n    function doAnimationWork(element, animation, callback, state, delay ){\n        const _element = $(element);\n        if ( _element.hasClass ( hideClass )) {\n            if ( /out/i.test ( animation )) {\n                return ;\n            } \n        }\n\t\tsetTimeout ( function() {\n            \n\t\t\taddClass(element, baseAnimateClass);\n            addClass(element, animation);\n            removeClass(element, 'displayNono');\n\t\t\tconst EventFun = function ( event ) {\n\t\t\t\tremovePrefixedEvent(element, \"AnimationEnd\", EventFun );\n\t\n\t\t\t\tremoveClass(element, baseAnimateClass);\n                removeClass(element, animation);\n\t\t\t\t\n\t\n\t\t\t\tif (typeof callback === 'function'){\n\t\t\t\t\tcallback(event, state);\n                }\n                if ( /out/i.test (animation)) {\n                    $(element).addClass('displayNono')\n                } \n\t\t\t}\n\t\t\taddPrefixedEvent(element, \"AnimationEnd\", EventFun );\n\t\t}, delay );\n        \n        \n    }\n    \n    ko.bindingHandlers.animate = {\n        init: function(element, valueAccessor){\n            var data = ko.unwrap(valueAccessor()),\n                animation, state, toggle, animationOn, animationOff, handler;\n\n            if (!data.animation){\n                throw new Error('Animation property must be defined');\n            }\n\n            if (!data.state){\n                throw new Error('State property must be defined');\n            }\n            \n           \n            animation = ko.unwrap(data.animation);\n            animationOn = typeof animation === 'object' ? animation[0] : animation;\n            animationOff = typeof animation === 'object' ? animation[1] : animation;\n\n            if (animationOn && animations.indexOf(animationOn) === -1){\n                throw new Error('Invalid first animation');\n            }\n\n            if (animationOff && animations.indexOf(animationOff) === -1){\n                throw new Error('Invalid second animation');\n            }\n        },\n        update: function(element, valueAccessor){\n            var data = ko.unwrap(valueAccessor()),\n                animation, state, toggle, animationOn, animationOff, handler, delay;\n\n            if (!data.animation){\n                throw new Error('Animation property must be defined');\n            }\n            /*\n            if (!data.state){\n                throw new Error('State property must be defined');\n            }\n            */\n            animation = ko.unwrap(data.animation);\n            state = ko.unwrap( data.state );\n            const _element = $(element);\n            animationOn = typeof animation === 'object' ? animation[0] : animation;\n\t\t\tanimationOff = typeof animation === 'object' ? animation[1] : animation;\n            if ( _element.hasClass ( hideClass )) {\n                return \n            }\n            \n            \n            \n            \n\t\t\tdelay = data.delay || 0;\n            toggle = animationOn !== animationOff;\n            handler = ko.unwrap(data.handler) || undefined;\n\n            if ( state ){\n                return doAnimationWork(element, animationOn, handler, state, delay);\n            }\n            doAnimationWork(element, animationOff, handler, state, delay);\n            \n        }\n    };\n}));\n"
  },
  {
    "path": "app/public/scripts/knockout.js",
    "content": "/*!\n * Knockout JavaScript library v3.5.1\n * (c) The Knockout.js team - http://knockoutjs.com/\n * License: MIT (http://www.opensource.org/licenses/mit-license.php)\n */\n\n(function() {(function(n){var A=this||(0,eval)(\"this\"),w=A.document,R=A.navigator,v=A.jQuery,H=A.JSON;v||\"undefined\"===typeof jQuery||(v=jQuery);(function(n){\"function\"===typeof define&&define.amd?define([\"exports\",\"require\"],n):\"object\"===typeof exports&&\"object\"===typeof module?n(module.exports||exports):n(A.ko={})})(function(S,T){function K(a,c){return null===a||typeof a in W?a===c:!1}function X(b,c){var d;return function(){d||(d=a.a.setTimeout(function(){d=n;b()},c))}}function Y(b,c){var d;return function(){clearTimeout(d);\n\td=a.a.setTimeout(b,c)}}function Z(a,c){c&&\"change\"!==c?\"beforeChange\"===c?this.pc(a):this.gb(a,c):this.qc(a)}function aa(a,c){null!==c&&c.s&&c.s()}function ba(a,c){var d=this.qd,e=d[r];e.ra||(this.Qb&&this.mb[c]?(d.uc(c,a,this.mb[c]),this.mb[c]=null,--this.Qb):e.I[c]||d.uc(c,a,e.J?{da:a}:d.$c(a)),a.Ja&&a.gd())}var a=\"undefined\"!==typeof S?S:{};a.b=function(b,c){for(var d=b.split(\".\"),e=a,f=0;f<d.length-1;f++)e=e[d[f]];e[d[d.length-1]]=c};a.L=function(a,c,d){a[c]=d};a.version=\"3.5.1\";a.b(\"version\",\n\ta.version);a.options={deferUpdates:!1,useOnlyNativeEvents:!1,foreachHidesDestroyed:!1};a.a=function(){function b(a,b){for(var c in a)f.call(a,c)&&b(c,a[c])}function c(a,b){if(b)for(var c in b)f.call(b,c)&&(a[c]=b[c]);return a}function d(a,b){a.__proto__=b;return a}function e(b,c,d,e){var l=b[c].match(q)||[];a.a.D(d.match(q),function(b){a.a.Na(l,b,e)});b[c]=l.join(\" \")}var f=Object.prototype.hasOwnProperty,g={__proto__:[]}instanceof Array,h=\"function\"===typeof Symbol,m={},k={};m[R&&/Firefox\\/2/i.test(R.userAgent)?\n\t\"KeyboardEvent\":\"UIEvents\"]=[\"keyup\",\"keydown\",\"keypress\"];m.MouseEvents=\"click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave\".split(\" \");b(m,function(a,b){if(b.length)for(var c=0,d=b.length;c<d;c++)k[b[c]]=a});var l={propertychange:!0},p=w&&function(){for(var a=3,b=w.createElement(\"div\"),c=b.getElementsByTagName(\"i\");b.innerHTML=\"\\x3c!--[if gt IE \"+ ++a+\"]><i></i><![endif]--\\x3e\",c[0];);return 4<a?a:n}(),q=/\\S+/g,t;return{Jc:[\"authenticity_token\",/^__RequestVerificationToken(_.*)?$/],\n\tD:function(a,b,c){for(var d=0,e=a.length;d<e;d++)b.call(c,a[d],d,a)},A:\"function\"==typeof Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b)}:function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},Lb:function(a,b,c){for(var d=0,e=a.length;d<e;d++)if(b.call(c,a[d],d,a))return a[d];return n},Pa:function(b,c){var d=a.a.A(b,c);0<d?b.splice(d,1):0===d&&b.shift()},wc:function(b){var c=[];b&&a.a.D(b,function(b){0>a.a.A(c,b)&&c.push(b)});return c},Mb:function(a,\n\tb,c){var d=[];if(a)for(var e=0,l=a.length;e<l;e++)d.push(b.call(c,a[e],e));return d},jb:function(a,b,c){var d=[];if(a)for(var e=0,l=a.length;e<l;e++)b.call(c,a[e],e)&&d.push(a[e]);return d},Nb:function(a,b){if(b instanceof Array)a.push.apply(a,b);else for(var c=0,d=b.length;c<d;c++)a.push(b[c]);return a},Na:function(b,c,d){var e=a.a.A(a.a.bc(b),c);0>e?d&&b.push(c):d||b.splice(e,1)},Ba:g,extend:c,setPrototypeOf:d,Ab:g?d:c,P:b,Ga:function(a,b,c){if(!a)return a;var d={},e;for(e in a)f.call(a,e)&&(d[e]=\n\tb.call(c,a[e],e,a));return d},Tb:function(b){for(;b.firstChild;)a.removeNode(b.firstChild)},Yb:function(b){b=a.a.la(b);for(var c=(b[0]&&b[0].ownerDocument||w).createElement(\"div\"),d=0,e=b.length;d<e;d++)c.appendChild(a.oa(b[d]));return c},Ca:function(b,c){for(var d=0,e=b.length,l=[];d<e;d++){var k=b[d].cloneNode(!0);l.push(c?a.oa(k):k)}return l},va:function(b,c){a.a.Tb(b);if(c)for(var d=0,e=c.length;d<e;d++)b.appendChild(c[d])},Xc:function(b,c){var d=b.nodeType?[b]:b;if(0<d.length){for(var e=d[0],\n\tl=e.parentNode,k=0,f=c.length;k<f;k++)l.insertBefore(c[k],e);k=0;for(f=d.length;k<f;k++)a.removeNode(d[k])}},Ua:function(a,b){if(a.length){for(b=8===b.nodeType&&b.parentNode||b;a.length&&a[0].parentNode!==b;)a.splice(0,1);for(;1<a.length&&a[a.length-1].parentNode!==b;)a.length--;if(1<a.length){var c=a[0],d=a[a.length-1];for(a.length=0;c!==d;)a.push(c),c=c.nextSibling;a.push(d)}}return a},Zc:function(a,b){7>p?a.setAttribute(\"selected\",b):a.selected=b},Db:function(a){return null===a||a===n?\"\":a.trim?\n\ta.trim():a.toString().replace(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\")},Ud:function(a,b){a=a||\"\";return b.length>a.length?!1:a.substring(0,b.length)===b},vd:function(a,b){if(a===b)return!0;if(11===a.nodeType)return!1;if(b.contains)return b.contains(1!==a.nodeType?a.parentNode:a);if(b.compareDocumentPosition)return 16==(b.compareDocumentPosition(a)&16);for(;a&&a!=b;)a=a.parentNode;return!!a},Sb:function(b){return a.a.vd(b,b.ownerDocument.documentElement)},kd:function(b){return!!a.a.Lb(b,a.a.Sb)},R:function(a){return a&&\n\ta.tagName&&a.tagName.toLowerCase()},Ac:function(b){return a.onError?function(){try{return b.apply(this,arguments)}catch(c){throw a.onError&&a.onError(c),c;}}:b},setTimeout:function(b,c){return setTimeout(a.a.Ac(b),c)},Gc:function(b){setTimeout(function(){a.onError&&a.onError(b);throw b;},0)},B:function(b,c,d){var e=a.a.Ac(d);d=l[c];if(a.options.useOnlyNativeEvents||d||!v)if(d||\"function\"!=typeof b.addEventListener)if(\"undefined\"!=typeof b.attachEvent){var k=function(a){e.call(b,a)},f=\"on\"+c;b.attachEvent(f,\n\tk);a.a.K.za(b,function(){b.detachEvent(f,k)})}else throw Error(\"Browser doesn't support addEventListener or attachEvent\");else b.addEventListener(c,e,!1);else t||(t=\"function\"==typeof v(b).on?\"on\":\"bind\"),v(b)[t](c,e)},Fb:function(b,c){if(!b||!b.nodeType)throw Error(\"element must be a DOM node when calling triggerEvent\");var d;\"input\"===a.a.R(b)&&b.type&&\"click\"==c.toLowerCase()?(d=b.type,d=\"checkbox\"==d||\"radio\"==d):d=!1;if(a.options.useOnlyNativeEvents||!v||d)if(\"function\"==typeof w.createEvent)if(\"function\"==\n\ttypeof b.dispatchEvent)d=w.createEvent(k[c]||\"HTMLEvents\"),d.initEvent(c,!0,!0,A,0,0,0,0,0,!1,!1,!1,!1,0,b),b.dispatchEvent(d);else throw Error(\"The supplied element doesn't support dispatchEvent\");else if(d&&b.click)b.click();else if(\"undefined\"!=typeof b.fireEvent)b.fireEvent(\"on\"+c);else throw Error(\"Browser doesn't support triggering events\");else v(b).trigger(c)},f:function(b){return a.O(b)?b():b},bc:function(b){return a.O(b)?b.v():b},Eb:function(b,c,d){var l;c&&(\"object\"===typeof b.classList?\n\t(l=b.classList[d?\"add\":\"remove\"],a.a.D(c.match(q),function(a){l.call(b.classList,a)})):\"string\"===typeof b.className.baseVal?e(b.className,\"baseVal\",c,d):e(b,\"className\",c,d))},Bb:function(b,c){var d=a.a.f(c);if(null===d||d===n)d=\"\";var e=a.h.firstChild(b);!e||3!=e.nodeType||a.h.nextSibling(e)?a.h.va(b,[b.ownerDocument.createTextNode(d)]):e.data=d;a.a.Ad(b)},Yc:function(a,b){a.name=b;if(7>=p)try{var c=a.name.replace(/[&<>'\"]/g,function(a){return\"&#\"+a.charCodeAt(0)+\";\"});a.mergeAttributes(w.createElement(\"<input name='\"+\n\tc+\"'/>\"),!1)}catch(d){}},Ad:function(a){9<=p&&(a=1==a.nodeType?a:a.parentNode,a.style&&(a.style.zoom=a.style.zoom))},wd:function(a){if(p){var b=a.style.width;a.style.width=0;a.style.width=b}},Pd:function(b,c){b=a.a.f(b);c=a.a.f(c);for(var d=[],e=b;e<=c;e++)d.push(e);return d},la:function(a){for(var b=[],c=0,d=a.length;c<d;c++)b.push(a[c]);return b},Da:function(a){return h?Symbol(a):a},Zd:6===p,$d:7===p,W:p,Lc:function(b,c){for(var d=a.a.la(b.getElementsByTagName(\"input\")).concat(a.a.la(b.getElementsByTagName(\"textarea\"))),\n\te=\"string\"==typeof c?function(a){return a.name===c}:function(a){return c.test(a.name)},l=[],k=d.length-1;0<=k;k--)e(d[k])&&l.push(d[k]);return l},Nd:function(b){return\"string\"==typeof b&&(b=a.a.Db(b))?H&&H.parse?H.parse(b):(new Function(\"return \"+b))():null},hc:function(b,c,d){if(!H||!H.stringify)throw Error(\"Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js\");\n\treturn H.stringify(a.a.f(b),c,d)},Od:function(c,d,e){e=e||{};var l=e.params||{},k=e.includeFields||this.Jc,f=c;if(\"object\"==typeof c&&\"form\"===a.a.R(c))for(var f=c.action,h=k.length-1;0<=h;h--)for(var g=a.a.Lc(c,k[h]),m=g.length-1;0<=m;m--)l[g[m].name]=g[m].value;d=a.a.f(d);var p=w.createElement(\"form\");p.style.display=\"none\";p.action=f;p.method=\"post\";for(var q in d)c=w.createElement(\"input\"),c.type=\"hidden\",c.name=q,c.value=a.a.hc(a.a.f(d[q])),p.appendChild(c);b(l,function(a,b){var c=w.createElement(\"input\");\n\tc.type=\"hidden\";c.name=a;c.value=b;p.appendChild(c)});w.body.appendChild(p);e.submitter?e.submitter(p):p.submit();setTimeout(function(){p.parentNode.removeChild(p)},0)}}}();a.b(\"utils\",a.a);a.b(\"utils.arrayForEach\",a.a.D);a.b(\"utils.arrayFirst\",a.a.Lb);a.b(\"utils.arrayFilter\",a.a.jb);a.b(\"utils.arrayGetDistinctValues\",a.a.wc);a.b(\"utils.arrayIndexOf\",a.a.A);a.b(\"utils.arrayMap\",a.a.Mb);a.b(\"utils.arrayPushAll\",a.a.Nb);a.b(\"utils.arrayRemoveItem\",a.a.Pa);a.b(\"utils.cloneNodes\",a.a.Ca);a.b(\"utils.createSymbolOrString\",\n\ta.a.Da);a.b(\"utils.extend\",a.a.extend);a.b(\"utils.fieldsIncludedWithJsonPost\",a.a.Jc);a.b(\"utils.getFormFields\",a.a.Lc);a.b(\"utils.objectMap\",a.a.Ga);a.b(\"utils.peekObservable\",a.a.bc);a.b(\"utils.postJson\",a.a.Od);a.b(\"utils.parseJson\",a.a.Nd);a.b(\"utils.registerEventHandler\",a.a.B);a.b(\"utils.stringifyJson\",a.a.hc);a.b(\"utils.range\",a.a.Pd);a.b(\"utils.toggleDomNodeCssClass\",a.a.Eb);a.b(\"utils.triggerEvent\",a.a.Fb);a.b(\"utils.unwrapObservable\",a.a.f);a.b(\"utils.objectForEach\",a.a.P);a.b(\"utils.addOrRemoveItem\",\n\ta.a.Na);a.b(\"utils.setTextContent\",a.a.Bb);a.b(\"unwrap\",a.a.f);Function.prototype.bind||(Function.prototype.bind=function(a){var c=this;if(1===arguments.length)return function(){return c.apply(a,arguments)};var d=Array.prototype.slice.call(arguments,1);return function(){var e=d.slice(0);e.push.apply(e,arguments);return c.apply(a,e)}});a.a.g=new function(){var b=0,c=\"__ko__\"+(new Date).getTime(),d={},e,f;a.a.W?(e=function(a,e){var f=a[c];if(!f||\"null\"===f||!d[f]){if(!e)return n;f=a[c]=\"ko\"+b++;d[f]=\n\t{}}return d[f]},f=function(a){var b=a[c];return b?(delete d[b],a[c]=null,!0):!1}):(e=function(a,b){var d=a[c];!d&&b&&(d=a[c]={});return d},f=function(a){return a[c]?(delete a[c],!0):!1});return{get:function(a,b){var c=e(a,!1);return c&&c[b]},set:function(a,b,c){(a=e(a,c!==n))&&(a[b]=c)},Ub:function(a,b,c){a=e(a,!0);return a[b]||(a[b]=c)},clear:f,Z:function(){return b++ +c}}};a.b(\"utils.domData\",a.a.g);a.b(\"utils.domData.clear\",a.a.g.clear);a.a.K=new function(){function b(b,c){var d=a.a.g.get(b,e);\n\td===n&&c&&(d=[],a.a.g.set(b,e,d));return d}function c(c){var e=b(c,!1);if(e)for(var e=e.slice(0),k=0;k<e.length;k++)e[k](c);a.a.g.clear(c);a.a.K.cleanExternalData(c);g[c.nodeType]&&d(c.childNodes,!0)}function d(b,d){for(var e=[],l,f=0;f<b.length;f++)if(!d||8===b[f].nodeType)if(c(e[e.length]=l=b[f]),b[f]!==l)for(;f--&&-1==a.a.A(e,b[f]););}var e=a.a.g.Z(),f={1:!0,8:!0,9:!0},g={1:!0,9:!0};return{za:function(a,c){if(\"function\"!=typeof c)throw Error(\"Callback must be a function\");b(a,!0).push(c)},yb:function(c,\n\td){var f=b(c,!1);f&&(a.a.Pa(f,d),0==f.length&&a.a.g.set(c,e,n))},oa:function(b){a.u.G(function(){f[b.nodeType]&&(c(b),g[b.nodeType]&&d(b.getElementsByTagName(\"*\")))});return b},removeNode:function(b){a.oa(b);b.parentNode&&b.parentNode.removeChild(b)},cleanExternalData:function(a){v&&\"function\"==typeof v.cleanData&&v.cleanData([a])}}};a.oa=a.a.K.oa;a.removeNode=a.a.K.removeNode;a.b(\"cleanNode\",a.oa);a.b(\"removeNode\",a.removeNode);a.b(\"utils.domNodeDisposal\",a.a.K);a.b(\"utils.domNodeDisposal.addDisposeCallback\",\n\ta.a.K.za);a.b(\"utils.domNodeDisposal.removeDisposeCallback\",a.a.K.yb);(function(){var b=[0,\"\",\"\"],c=[1,\"<table>\",\"</table>\"],d=[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],e=[1,\"<select multiple='multiple'>\",\"</select>\"],f={thead:c,tbody:c,tfoot:c,tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:d,th:d,option:e,optgroup:e},g=8>=a.a.W;a.a.ua=function(c,d){var e;if(v)if(v.parseHTML)e=v.parseHTML(c,d)||[];else{if((e=v.clean([c],d))&&e[0]){for(var l=e[0];l.parentNode&&11!==l.parentNode.nodeType;)l=l.parentNode;\n\tl.parentNode&&l.parentNode.removeChild(l)}}else{(e=d)||(e=w);var l=e.parentWindow||e.defaultView||A,p=a.a.Db(c).toLowerCase(),q=e.createElement(\"div\"),t;t=(p=p.match(/^(?:\\x3c!--.*?--\\x3e\\s*?)*?<([a-z]+)[\\s>]/))&&f[p[1]]||b;p=t[0];t=\"ignored<div>\"+t[1]+c+t[2]+\"</div>\";\"function\"==typeof l.innerShiv?q.appendChild(l.innerShiv(t)):(g&&e.body.appendChild(q),q.innerHTML=t,g&&q.parentNode.removeChild(q));for(;p--;)q=q.lastChild;e=a.a.la(q.lastChild.childNodes)}return e};a.a.Md=function(b,c){var d=a.a.ua(b,\n\tc);return d.length&&d[0].parentElement||a.a.Yb(d)};a.a.fc=function(b,c){a.a.Tb(b);c=a.a.f(c);if(null!==c&&c!==n)if(\"string\"!=typeof c&&(c=c.toString()),v)v(b).html(c);else for(var d=a.a.ua(c,b.ownerDocument),e=0;e<d.length;e++)b.appendChild(d[e])}})();a.b(\"utils.parseHtmlFragment\",a.a.ua);a.b(\"utils.setHtml\",a.a.fc);a.aa=function(){function b(c,e){if(c)if(8==c.nodeType){var f=a.aa.Uc(c.nodeValue);null!=f&&e.push({ud:c,Kd:f})}else if(1==c.nodeType)for(var f=0,g=c.childNodes,h=g.length;f<h;f++)b(g[f],\n\te)}var c={};return{Xb:function(a){if(\"function\"!=typeof a)throw Error(\"You can only pass a function to ko.memoization.memoize()\");var b=(4294967296*(1+Math.random())|0).toString(16).substring(1)+(4294967296*(1+Math.random())|0).toString(16).substring(1);c[b]=a;return\"\\x3c!--[ko_memo:\"+b+\"]--\\x3e\"},bd:function(a,b){var f=c[a];if(f===n)throw Error(\"Couldn't find any memo with ID \"+a+\". Perhaps it's already been unmemoized.\");try{return f.apply(null,b||[]),!0}finally{delete c[a]}},cd:function(c,e){var f=\n\t[];b(c,f);for(var g=0,h=f.length;g<h;g++){var m=f[g].ud,k=[m];e&&a.a.Nb(k,e);a.aa.bd(f[g].Kd,k);m.nodeValue=\"\";m.parentNode&&m.parentNode.removeChild(m)}},Uc:function(a){return(a=a.match(/^\\[ko_memo\\:(.*?)\\]$/))?a[1]:null}}}();a.b(\"memoization\",a.aa);a.b(\"memoization.memoize\",a.aa.Xb);a.b(\"memoization.unmemoize\",a.aa.bd);a.b(\"memoization.parseMemoText\",a.aa.Uc);a.b(\"memoization.unmemoizeDomNodeAndDescendants\",a.aa.cd);a.na=function(){function b(){if(f)for(var b=f,c=0,d;h<f;)if(d=e[h++]){if(h>b){if(5E3<=\n\t++c){h=f;a.a.Gc(Error(\"'Too much recursion' after processing \"+c+\" task groups.\"));break}b=f}try{d()}catch(p){a.a.Gc(p)}}}function c(){b();h=f=e.length=0}var d,e=[],f=0,g=1,h=0;A.MutationObserver?d=function(a){var b=w.createElement(\"div\");(new MutationObserver(a)).observe(b,{attributes:!0});return function(){b.classList.toggle(\"foo\")}}(c):d=w&&\"onreadystatechange\"in w.createElement(\"script\")?function(a){var b=w.createElement(\"script\");b.onreadystatechange=function(){b.onreadystatechange=null;w.documentElement.removeChild(b);\n\tb=null;a()};w.documentElement.appendChild(b)}:function(a){setTimeout(a,0)};return{scheduler:d,zb:function(b){f||a.na.scheduler(c);e[f++]=b;return g++},cancel:function(a){a=a-(g-f);a>=h&&a<f&&(e[a]=null)},resetForTesting:function(){var a=f-h;h=f=e.length=0;return a},Sd:b}}();a.b(\"tasks\",a.na);a.b(\"tasks.schedule\",a.na.zb);a.b(\"tasks.runEarly\",a.na.Sd);a.Ta={throttle:function(b,c){b.throttleEvaluation=c;var d=null;return a.$({read:b,write:function(e){clearTimeout(d);d=a.a.setTimeout(function(){b(e)},\n\tc)}})},rateLimit:function(a,c){var d,e,f;\"number\"==typeof c?d=c:(d=c.timeout,e=c.method);a.Hb=!1;f=\"function\"==typeof e?e:\"notifyWhenChangesStop\"==e?Y:X;a.ub(function(a){return f(a,d,c)})},deferred:function(b,c){if(!0!==c)throw Error(\"The 'deferred' extender only accepts the value 'true', because it is not supported to turn deferral off once enabled.\");b.Hb||(b.Hb=!0,b.ub(function(c){var e,f=!1;return function(){if(!f){a.na.cancel(e);e=a.na.zb(c);try{f=!0,b.notifySubscribers(n,\"dirty\")}finally{f=\n\t!1}}}}))},notify:function(a,c){a.equalityComparer=\"always\"==c?null:K}};var W={undefined:1,\"boolean\":1,number:1,string:1};a.b(\"extenders\",a.Ta);a.ic=function(b,c,d){this.da=b;this.lc=c;this.mc=d;this.Ib=!1;this.fb=this.Jb=null;a.L(this,\"dispose\",this.s);a.L(this,\"disposeWhenNodeIsRemoved\",this.l)};a.ic.prototype.s=function(){this.Ib||(this.fb&&a.a.K.yb(this.Jb,this.fb),this.Ib=!0,this.mc(),this.da=this.lc=this.mc=this.Jb=this.fb=null)};a.ic.prototype.l=function(b){this.Jb=b;a.a.K.za(b,this.fb=this.s.bind(this))};\n\ta.T=function(){a.a.Ab(this,D);D.qb(this)};var D={qb:function(a){a.U={change:[]};a.sc=1},subscribe:function(b,c,d){var e=this;d=d||\"change\";var f=new a.ic(e,c?b.bind(c):b,function(){a.a.Pa(e.U[d],f);e.hb&&e.hb(d)});e.Qa&&e.Qa(d);e.U[d]||(e.U[d]=[]);e.U[d].push(f);return f},notifySubscribers:function(b,c){c=c||\"change\";\"change\"===c&&this.Gb();if(this.Wa(c)){var d=\"change\"===c&&this.ed||this.U[c].slice(0);try{a.u.xc();for(var e=0,f;f=d[e];++e)f.Ib||f.lc(b)}finally{a.u.end()}}},ob:function(){return this.sc},\n\tDd:function(a){return this.ob()!==a},Gb:function(){++this.sc},ub:function(b){var c=this,d=a.O(c),e,f,g,h,m;c.gb||(c.gb=c.notifySubscribers,c.notifySubscribers=Z);var k=b(function(){c.Ja=!1;d&&h===c&&(h=c.nc?c.nc():c());var a=f||m&&c.sb(g,h);m=f=e=!1;a&&c.gb(g=h)});c.qc=function(a,b){b&&c.Ja||(m=!b);c.ed=c.U.change.slice(0);c.Ja=e=!0;h=a;k()};c.pc=function(a){e||(g=a,c.gb(a,\"beforeChange\"))};c.rc=function(){m=!0};c.gd=function(){c.sb(g,c.v(!0))&&(f=!0)}},Wa:function(a){return this.U[a]&&this.U[a].length},\n\tBd:function(b){if(b)return this.U[b]&&this.U[b].length||0;var c=0;a.a.P(this.U,function(a,b){\"dirty\"!==a&&(c+=b.length)});return c},sb:function(a,c){return!this.equalityComparer||!this.equalityComparer(a,c)},toString:function(){return\"[object Object]\"},extend:function(b){var c=this;b&&a.a.P(b,function(b,e){var f=a.Ta[b];\"function\"==typeof f&&(c=f(c,e)||c)});return c}};a.L(D,\"init\",D.qb);a.L(D,\"subscribe\",D.subscribe);a.L(D,\"extend\",D.extend);a.L(D,\"getSubscriptionsCount\",D.Bd);a.a.Ba&&a.a.setPrototypeOf(D,\n\tFunction.prototype);a.T.fn=D;a.Qc=function(a){return null!=a&&\"function\"==typeof a.subscribe&&\"function\"==typeof a.notifySubscribers};a.b(\"subscribable\",a.T);a.b(\"isSubscribable\",a.Qc);a.S=a.u=function(){function b(a){d.push(e);e=a}function c(){e=d.pop()}var d=[],e,f=0;return{xc:b,end:c,cc:function(b){if(e){if(!a.Qc(b))throw Error(\"Only subscribable things can act as dependencies\");e.od.call(e.pd,b,b.fd||(b.fd=++f))}},G:function(a,d,e){try{return b(),a.apply(d,e||[])}finally{c()}},qa:function(){if(e)return e.o.qa()},\n\tVa:function(){if(e)return e.o.Va()},Ya:function(){if(e)return e.Ya},o:function(){if(e)return e.o}}}();a.b(\"computedContext\",a.S);a.b(\"computedContext.getDependenciesCount\",a.S.qa);a.b(\"computedContext.getDependencies\",a.S.Va);a.b(\"computedContext.isInitial\",a.S.Ya);a.b(\"computedContext.registerDependency\",a.S.cc);a.b(\"ignoreDependencies\",a.Yd=a.u.G);var I=a.a.Da(\"_latestValue\");a.ta=function(b){function c(){if(0<arguments.length)return c.sb(c[I],arguments[0])&&(c.ya(),c[I]=arguments[0],c.xa()),this;\n\ta.u.cc(c);return c[I]}c[I]=b;a.a.Ba||a.a.extend(c,a.T.fn);a.T.fn.qb(c);a.a.Ab(c,F);a.options.deferUpdates&&a.Ta.deferred(c,!0);return c};var F={equalityComparer:K,v:function(){return this[I]},xa:function(){this.notifySubscribers(this[I],\"spectate\");this.notifySubscribers(this[I])},ya:function(){this.notifySubscribers(this[I],\"beforeChange\")}};a.a.Ba&&a.a.setPrototypeOf(F,a.T.fn);var G=a.ta.Ma=\"__ko_proto__\";F[G]=a.ta;a.O=function(b){if((b=\"function\"==typeof b&&b[G])&&b!==F[G]&&b!==a.o.fn[G])throw Error(\"Invalid object that looks like an observable; possibly from another Knockout instance\");\n\treturn!!b};a.Za=function(b){return\"function\"==typeof b&&(b[G]===F[G]||b[G]===a.o.fn[G]&&b.Nc)};a.b(\"observable\",a.ta);a.b(\"isObservable\",a.O);a.b(\"isWriteableObservable\",a.Za);a.b(\"isWritableObservable\",a.Za);a.b(\"observable.fn\",F);a.L(F,\"peek\",F.v);a.L(F,\"valueHasMutated\",F.xa);a.L(F,\"valueWillMutate\",F.ya);a.Ha=function(b){b=b||[];if(\"object\"!=typeof b||!(\"length\"in b))throw Error(\"The argument passed when initializing an observable array must be an array, or null, or undefined.\");b=a.ta(b);a.a.Ab(b,\n\ta.Ha.fn);return b.extend({trackArrayChanges:!0})};a.Ha.fn={remove:function(b){for(var c=this.v(),d=[],e=\"function\"!=typeof b||a.O(b)?function(a){return a===b}:b,f=0;f<c.length;f++){var g=c[f];if(e(g)){0===d.length&&this.ya();if(c[f]!==g)throw Error(\"Array modified during remove; cannot remove item\");d.push(g);c.splice(f,1);f--}}d.length&&this.xa();return d},removeAll:function(b){if(b===n){var c=this.v(),d=c.slice(0);this.ya();c.splice(0,c.length);this.xa();return d}return b?this.remove(function(c){return 0<=\n\ta.a.A(b,c)}):[]},destroy:function(b){var c=this.v(),d=\"function\"!=typeof b||a.O(b)?function(a){return a===b}:b;this.ya();for(var e=c.length-1;0<=e;e--){var f=c[e];d(f)&&(f._destroy=!0)}this.xa()},destroyAll:function(b){return b===n?this.destroy(function(){return!0}):b?this.destroy(function(c){return 0<=a.a.A(b,c)}):[]},indexOf:function(b){var c=this();return a.a.A(c,b)},replace:function(a,c){var d=this.indexOf(a);0<=d&&(this.ya(),this.v()[d]=c,this.xa())},sorted:function(a){var c=this().slice(0);\n\treturn a?c.sort(a):c.sort()},reversed:function(){return this().slice(0).reverse()}};a.a.Ba&&a.a.setPrototypeOf(a.Ha.fn,a.ta.fn);a.a.D(\"pop push reverse shift sort splice unshift\".split(\" \"),function(b){a.Ha.fn[b]=function(){var a=this.v();this.ya();this.zc(a,b,arguments);var d=a[b].apply(a,arguments);this.xa();return d===a?this:d}});a.a.D([\"slice\"],function(b){a.Ha.fn[b]=function(){var a=this();return a[b].apply(a,arguments)}});a.Pc=function(b){return a.O(b)&&\"function\"==typeof b.remove&&\"function\"==\n\ttypeof b.push};a.b(\"observableArray\",a.Ha);a.b(\"isObservableArray\",a.Pc);a.Ta.trackArrayChanges=function(b,c){function d(){function c(){if(m){var d=[].concat(b.v()||[]),e;if(b.Wa(\"arrayChange\")){if(!f||1<m)f=a.a.Pb(k,d,b.Ob);e=f}k=d;f=null;m=0;e&&e.length&&b.notifySubscribers(e,\"arrayChange\")}}e?c():(e=!0,h=b.subscribe(function(){++m},null,\"spectate\"),k=[].concat(b.v()||[]),f=null,g=b.subscribe(c))}b.Ob={};c&&\"object\"==typeof c&&a.a.extend(b.Ob,c);b.Ob.sparse=!0;if(!b.zc){var e=!1,f=null,g,h,m=0,\n\tk,l=b.Qa,p=b.hb;b.Qa=function(a){l&&l.call(b,a);\"arrayChange\"===a&&d()};b.hb=function(a){p&&p.call(b,a);\"arrayChange\"!==a||b.Wa(\"arrayChange\")||(g&&g.s(),h&&h.s(),h=g=null,e=!1,k=n)};b.zc=function(b,c,d){function l(a,b,c){return k[k.length]={status:a,value:b,index:c}}if(e&&!m){var k=[],p=b.length,g=d.length,h=0;switch(c){case \"push\":h=p;case \"unshift\":for(c=0;c<g;c++)l(\"added\",d[c],h+c);break;case \"pop\":h=p-1;case \"shift\":p&&l(\"deleted\",b[h],h);break;case \"splice\":c=Math.min(Math.max(0,0>d[0]?p+d[0]:\n\td[0]),p);for(var p=1===g?p:Math.min(c+(d[1]||0),p),g=c+g-2,h=Math.max(p,g),U=[],L=[],n=2;c<h;++c,++n)c<p&&L.push(l(\"deleted\",b[c],c)),c<g&&U.push(l(\"added\",d[n],c));a.a.Kc(L,U);break;default:return}f=k}}}};var r=a.a.Da(\"_state\");a.o=a.$=function(b,c,d){function e(){if(0<arguments.length){if(\"function\"===typeof f)f.apply(g.nb,arguments);else throw Error(\"Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.\");return this}g.ra||\n\ta.u.cc(e);(g.ka||g.J&&e.Xa())&&e.ha();return g.X}\"object\"===typeof b?d=b:(d=d||{},b&&(d.read=b));if(\"function\"!=typeof d.read)throw Error(\"Pass a function that returns the value of the ko.computed\");var f=d.write,g={X:n,sa:!0,ka:!0,rb:!1,jc:!1,ra:!1,wb:!1,J:!1,Wc:d.read,nb:c||d.owner,l:d.disposeWhenNodeIsRemoved||d.l||null,Sa:d.disposeWhen||d.Sa,Rb:null,I:{},V:0,Ic:null};e[r]=g;e.Nc=\"function\"===typeof f;a.a.Ba||a.a.extend(e,a.T.fn);a.T.fn.qb(e);a.a.Ab(e,C);d.pure?(g.wb=!0,g.J=!0,a.a.extend(e,da)):\n\td.deferEvaluation&&a.a.extend(e,ea);a.options.deferUpdates&&a.Ta.deferred(e,!0);g.l&&(g.jc=!0,g.l.nodeType||(g.l=null));g.J||d.deferEvaluation||e.ha();g.l&&e.ja()&&a.a.K.za(g.l,g.Rb=function(){e.s()});return e};var C={equalityComparer:K,qa:function(){return this[r].V},Va:function(){var b=[];a.a.P(this[r].I,function(a,d){b[d.Ka]=d.da});return b},Vb:function(b){if(!this[r].V)return!1;var c=this.Va();return-1!==a.a.A(c,b)?!0:!!a.a.Lb(c,function(a){return a.Vb&&a.Vb(b)})},uc:function(a,c,d){if(this[r].wb&&\n\tc===this)throw Error(\"A 'pure' computed must not be called recursively\");this[r].I[a]=d;d.Ka=this[r].V++;d.La=c.ob()},Xa:function(){var a,c,d=this[r].I;for(a in d)if(Object.prototype.hasOwnProperty.call(d,a)&&(c=d[a],this.Ia&&c.da.Ja||c.da.Dd(c.La)))return!0},Jd:function(){this.Ia&&!this[r].rb&&this.Ia(!1)},ja:function(){var a=this[r];return a.ka||0<a.V},Rd:function(){this.Ja?this[r].ka&&(this[r].sa=!0):this.Hc()},$c:function(a){if(a.Hb){var c=a.subscribe(this.Jd,this,\"dirty\"),d=a.subscribe(this.Rd,\n\tthis);return{da:a,s:function(){c.s();d.s()}}}return a.subscribe(this.Hc,this)},Hc:function(){var b=this,c=b.throttleEvaluation;c&&0<=c?(clearTimeout(this[r].Ic),this[r].Ic=a.a.setTimeout(function(){b.ha(!0)},c)):b.Ia?b.Ia(!0):b.ha(!0)},ha:function(b){var c=this[r],d=c.Sa,e=!1;if(!c.rb&&!c.ra){if(c.l&&!a.a.Sb(c.l)||d&&d()){if(!c.jc){this.s();return}}else c.jc=!1;c.rb=!0;try{e=this.zd(b)}finally{c.rb=!1}return e}},zd:function(b){var c=this[r],d=!1,e=c.wb?n:!c.V,d={qd:this,mb:c.I,Qb:c.V};a.u.xc({pd:d,\n\tod:ba,o:this,Ya:e});c.I={};c.V=0;var f=this.yd(c,d);c.V?d=this.sb(c.X,f):(this.s(),d=!0);d&&(c.J?this.Gb():this.notifySubscribers(c.X,\"beforeChange\"),c.X=f,this.notifySubscribers(c.X,\"spectate\"),!c.J&&b&&this.notifySubscribers(c.X),this.rc&&this.rc());e&&this.notifySubscribers(c.X,\"awake\");return d},yd:function(b,c){try{var d=b.Wc;return b.nb?d.call(b.nb):d()}finally{a.u.end(),c.Qb&&!b.J&&a.a.P(c.mb,aa),b.sa=b.ka=!1}},v:function(a){var c=this[r];(c.ka&&(a||!c.V)||c.J&&this.Xa())&&this.ha();return c.X},\n\tub:function(b){a.T.fn.ub.call(this,b);this.nc=function(){this[r].J||(this[r].sa?this.ha():this[r].ka=!1);return this[r].X};this.Ia=function(a){this.pc(this[r].X);this[r].ka=!0;a&&(this[r].sa=!0);this.qc(this,!a)}},s:function(){var b=this[r];!b.J&&b.I&&a.a.P(b.I,function(a,b){b.s&&b.s()});b.l&&b.Rb&&a.a.K.yb(b.l,b.Rb);b.I=n;b.V=0;b.ra=!0;b.sa=!1;b.ka=!1;b.J=!1;b.l=n;b.Sa=n;b.Wc=n;this.Nc||(b.nb=n)}},da={Qa:function(b){var c=this,d=c[r];if(!d.ra&&d.J&&\"change\"==b){d.J=!1;if(d.sa||c.Xa())d.I=null,d.V=\n\t0,c.ha()&&c.Gb();else{var e=[];a.a.P(d.I,function(a,b){e[b.Ka]=a});a.a.D(e,function(a,b){var e=d.I[a],m=c.$c(e.da);m.Ka=b;m.La=e.La;d.I[a]=m});c.Xa()&&c.ha()&&c.Gb()}d.ra||c.notifySubscribers(d.X,\"awake\")}},hb:function(b){var c=this[r];c.ra||\"change\"!=b||this.Wa(\"change\")||(a.a.P(c.I,function(a,b){b.s&&(c.I[a]={da:b.da,Ka:b.Ka,La:b.La},b.s())}),c.J=!0,this.notifySubscribers(n,\"asleep\"))},ob:function(){var b=this[r];b.J&&(b.sa||this.Xa())&&this.ha();return a.T.fn.ob.call(this)}},ea={Qa:function(a){\"change\"!=\n\ta&&\"beforeChange\"!=a||this.v()}};a.a.Ba&&a.a.setPrototypeOf(C,a.T.fn);var N=a.ta.Ma;C[N]=a.o;a.Oc=function(a){return\"function\"==typeof a&&a[N]===C[N]};a.Fd=function(b){return a.Oc(b)&&b[r]&&b[r].wb};a.b(\"computed\",a.o);a.b(\"dependentObservable\",a.o);a.b(\"isComputed\",a.Oc);a.b(\"isPureComputed\",a.Fd);a.b(\"computed.fn\",C);a.L(C,\"peek\",C.v);a.L(C,\"dispose\",C.s);a.L(C,\"isActive\",C.ja);a.L(C,\"getDependenciesCount\",C.qa);a.L(C,\"getDependencies\",C.Va);a.xb=function(b,c){if(\"function\"===typeof b)return a.o(b,\n\tc,{pure:!0});b=a.a.extend({},b);b.pure=!0;return a.o(b,c)};a.b(\"pureComputed\",a.xb);(function(){function b(a,f,g){g=g||new d;a=f(a);if(\"object\"!=typeof a||null===a||a===n||a instanceof RegExp||a instanceof Date||a instanceof String||a instanceof Number||a instanceof Boolean)return a;var h=a instanceof Array?[]:{};g.save(a,h);c(a,function(c){var d=f(a[c]);switch(typeof d){case \"boolean\":case \"number\":case \"string\":case \"function\":h[c]=d;break;case \"object\":case \"undefined\":var l=g.get(d);h[c]=l!==\n\tn?l:b(d,f,g)}});return h}function c(a,b){if(a instanceof Array){for(var c=0;c<a.length;c++)b(c);\"function\"==typeof a.toJSON&&b(\"toJSON\")}else for(c in a)b(c)}function d(){this.keys=[];this.values=[]}a.ad=function(c){if(0==arguments.length)throw Error(\"When calling ko.toJS, pass the object you want to convert.\");return b(c,function(b){for(var c=0;a.O(b)&&10>c;c++)b=b();return b})};a.toJSON=function(b,c,d){b=a.ad(b);return a.a.hc(b,c,d)};d.prototype={constructor:d,save:function(b,c){var d=a.a.A(this.keys,\n\tb);0<=d?this.values[d]=c:(this.keys.push(b),this.values.push(c))},get:function(b){b=a.a.A(this.keys,b);return 0<=b?this.values[b]:n}}})();a.b(\"toJS\",a.ad);a.b(\"toJSON\",a.toJSON);a.Wd=function(b,c,d){function e(c){var e=a.xb(b,d).extend({ma:\"always\"}),h=e.subscribe(function(a){a&&(h.s(),c(a))});e.notifySubscribers(e.v());return h}return\"function\"!==typeof Promise||c?e(c.bind(d)):new Promise(e)};a.b(\"when\",a.Wd);(function(){a.w={M:function(b){switch(a.a.R(b)){case \"option\":return!0===b.__ko__hasDomDataOptionValue__?\n\ta.a.g.get(b,a.c.options.$b):7>=a.a.W?b.getAttributeNode(\"value\")&&b.getAttributeNode(\"value\").specified?b.value:b.text:b.value;case \"select\":return 0<=b.selectedIndex?a.w.M(b.options[b.selectedIndex]):n;default:return b.value}},cb:function(b,c,d){switch(a.a.R(b)){case \"option\":\"string\"===typeof c?(a.a.g.set(b,a.c.options.$b,n),\"__ko__hasDomDataOptionValue__\"in b&&delete b.__ko__hasDomDataOptionValue__,b.value=c):(a.a.g.set(b,a.c.options.$b,c),b.__ko__hasDomDataOptionValue__=!0,b.value=\"number\"===\n\ttypeof c?c:\"\");break;case \"select\":if(\"\"===c||null===c)c=n;for(var e=-1,f=0,g=b.options.length,h;f<g;++f)if(h=a.w.M(b.options[f]),h==c||\"\"===h&&c===n){e=f;break}if(d||0<=e||c===n&&1<b.size)b.selectedIndex=e,6===a.a.W&&a.a.setTimeout(function(){b.selectedIndex=e},0);break;default:if(null===c||c===n)c=\"\";b.value=c}}}})();a.b(\"selectExtensions\",a.w);a.b(\"selectExtensions.readValue\",a.w.M);a.b(\"selectExtensions.writeValue\",a.w.cb);a.m=function(){function b(b){b=a.a.Db(b);123===b.charCodeAt(0)&&(b=b.slice(1,\n\t-1));b+=\"\\n,\";var c=[],d=b.match(e),p,q=[],h=0;if(1<d.length){for(var x=0,B;B=d[x];++x){var u=B.charCodeAt(0);if(44===u){if(0>=h){c.push(p&&q.length?{key:p,value:q.join(\"\")}:{unknown:p||q.join(\"\")});p=h=0;q=[];continue}}else if(58===u){if(!h&&!p&&1===q.length){p=q.pop();continue}}else if(47===u&&1<B.length&&(47===B.charCodeAt(1)||42===B.charCodeAt(1)))continue;else 47===u&&x&&1<B.length?(u=d[x-1].match(f))&&!g[u[0]]&&(b=b.substr(b.indexOf(B)+1),d=b.match(e),x=-1,B=\"/\"):40===u||123===u||91===u?++h:\n\t41===u||125===u||93===u?--h:p||q.length||34!==u&&39!==u||(B=B.slice(1,-1));q.push(B)}if(0<h)throw Error(\"Unbalanced parentheses, braces, or brackets\");}return c}var c=[\"true\",\"false\",\"null\",\"undefined\"],d=/^(?:[$_a-z][$\\w]*|(.+)(\\.\\s*[$_a-z][$\\w]*|\\[.+\\]))$/i,e=RegExp(\"\\\"(?:\\\\\\\\.|[^\\\"])*\\\"|'(?:\\\\\\\\.|[^'])*'|`(?:\\\\\\\\.|[^`])*`|/\\\\*(?:[^*]|\\\\*+[^*/])*\\\\*+/|//.*\\n|/(?:\\\\\\\\.|[^/])+/w*|[^\\\\s:,/][^,\\\"'`{}()/:[\\\\]]*[^\\\\s,\\\"'`{}()/:[\\\\]]|[^\\\\s]\",\"g\"),f=/[\\])\"'A-Za-z0-9_$]+$/,g={\"in\":1,\"return\":1,\"typeof\":1},\n\th={};return{Ra:[],wa:h,ac:b,vb:function(e,f){function l(b,e){var f;if(!x){var k=a.getBindingHandler(b);if(k&&k.preprocess&&!(e=k.preprocess(e,b,l)))return;if(k=h[b])f=e,0<=a.a.A(c,f)?f=!1:(k=f.match(d),f=null===k?!1:k[1]?\"Object(\"+k[1]+\")\"+k[2]:f),k=f;k&&q.push(\"'\"+(\"string\"==typeof h[b]?h[b]:b)+\"':function(_z){\"+f+\"=_z}\")}g&&(e=\"function(){return \"+e+\" }\");p.push(\"'\"+b+\"':\"+e)}f=f||{};var p=[],q=[],g=f.valueAccessors,x=f.bindingParams,B=\"string\"===typeof e?b(e):e;a.a.D(B,function(a){l(a.key||a.unknown,\n\ta.value)});q.length&&l(\"_ko_property_writers\",\"{\"+q.join(\",\")+\" }\");return p.join(\",\")},Id:function(a,b){for(var c=0;c<a.length;c++)if(a[c].key==b)return!0;return!1},eb:function(b,c,d,e,f){if(b&&a.O(b))!a.Za(b)||f&&b.v()===e||b(e);else if((b=c.get(\"_ko_property_writers\"))&&b[d])b[d](e)}}}();a.b(\"expressionRewriting\",a.m);a.b(\"expressionRewriting.bindingRewriteValidators\",a.m.Ra);a.b(\"expressionRewriting.parseObjectLiteral\",a.m.ac);a.b(\"expressionRewriting.preProcessBindings\",a.m.vb);a.b(\"expressionRewriting._twoWayBindings\",\n\ta.m.wa);a.b(\"jsonExpressionRewriting\",a.m);a.b(\"jsonExpressionRewriting.insertPropertyAccessorsIntoJson\",a.m.vb);(function(){function b(a){return 8==a.nodeType&&g.test(f?a.text:a.nodeValue)}function c(a){return 8==a.nodeType&&h.test(f?a.text:a.nodeValue)}function d(d,e){for(var f=d,h=1,g=[];f=f.nextSibling;){if(c(f)&&(a.a.g.set(f,k,!0),h--,0===h))return g;g.push(f);b(f)&&h++}if(!e)throw Error(\"Cannot find closing comment tag to match: \"+d.nodeValue);return null}function e(a,b){var c=d(a,b);return c?\n\t0<c.length?c[c.length-1].nextSibling:a.nextSibling:null}var f=w&&\"\\x3c!--test--\\x3e\"===w.createComment(\"test\").text,g=f?/^\\x3c!--\\s*ko(?:\\s+([\\s\\S]+))?\\s*--\\x3e$/:/^\\s*ko(?:\\s+([\\s\\S]+))?\\s*$/,h=f?/^\\x3c!--\\s*\\/ko\\s*--\\x3e$/:/^\\s*\\/ko\\s*$/,m={ul:!0,ol:!0},k=\"__ko_matchedEndComment__\";a.h={ea:{},childNodes:function(a){return b(a)?d(a):a.childNodes},Ea:function(c){if(b(c)){c=a.h.childNodes(c);for(var d=0,e=c.length;d<e;d++)a.removeNode(c[d])}else a.a.Tb(c)},va:function(c,d){if(b(c)){a.h.Ea(c);for(var e=\n\tc.nextSibling,f=0,k=d.length;f<k;f++)e.parentNode.insertBefore(d[f],e)}else a.a.va(c,d)},Vc:function(a,c){var d;b(a)?(d=a.nextSibling,a=a.parentNode):d=a.firstChild;d?c!==d&&a.insertBefore(c,d):a.appendChild(c)},Wb:function(c,d,e){e?(e=e.nextSibling,b(c)&&(c=c.parentNode),e?d!==e&&c.insertBefore(d,e):c.appendChild(d)):a.h.Vc(c,d)},firstChild:function(a){if(b(a))return!a.nextSibling||c(a.nextSibling)?null:a.nextSibling;if(a.firstChild&&c(a.firstChild))throw Error(\"Found invalid end comment, as the first child of \"+\n\ta);return a.firstChild},nextSibling:function(d){b(d)&&(d=e(d));if(d.nextSibling&&c(d.nextSibling)){var f=d.nextSibling;if(c(f)&&!a.a.g.get(f,k))throw Error(\"Found end comment without a matching opening comment, as child of \"+d);return null}return d.nextSibling},Cd:b,Vd:function(a){return(a=(f?a.text:a.nodeValue).match(g))?a[1]:null},Sc:function(d){if(m[a.a.R(d)]){var f=d.firstChild;if(f){do if(1===f.nodeType){var k;k=f.firstChild;var h=null;if(k){do if(h)h.push(k);else if(b(k)){var g=e(k,!0);g?k=\n\tg:h=[k]}else c(k)&&(h=[k]);while(k=k.nextSibling)}if(k=h)for(h=f.nextSibling,g=0;g<k.length;g++)h?d.insertBefore(k[g],h):d.appendChild(k[g])}while(f=f.nextSibling)}}}}})();a.b(\"virtualElements\",a.h);a.b(\"virtualElements.allowedBindings\",a.h.ea);a.b(\"virtualElements.emptyNode\",a.h.Ea);a.b(\"virtualElements.insertAfter\",a.h.Wb);a.b(\"virtualElements.prepend\",a.h.Vc);a.b(\"virtualElements.setDomNodeChildren\",a.h.va);(function(){a.ga=function(){this.nd={}};a.a.extend(a.ga.prototype,{nodeHasBindings:function(b){switch(b.nodeType){case 1:return null!=\n\tb.getAttribute(\"data-bind\")||a.j.getComponentNameForNode(b);case 8:return a.h.Cd(b);default:return!1}},getBindings:function(b,c){var d=this.getBindingsString(b,c),d=d?this.parseBindingsString(d,c,b):null;return a.j.tc(d,b,c,!1)},getBindingAccessors:function(b,c){var d=this.getBindingsString(b,c),d=d?this.parseBindingsString(d,c,b,{valueAccessors:!0}):null;return a.j.tc(d,b,c,!0)},getBindingsString:function(b){switch(b.nodeType){case 1:return b.getAttribute(\"data-bind\");case 8:return a.h.Vd(b);default:return null}},\n\tparseBindingsString:function(b,c,d,e){try{var f=this.nd,g=b+(e&&e.valueAccessors||\"\"),h;if(!(h=f[g])){var m,k=\"with($context){with($data||{}){return{\"+a.m.vb(b,e)+\"}}}\";m=new Function(\"$context\",\"$element\",k);h=f[g]=m}return h(c,d)}catch(l){throw l.message=\"Unable to parse bindings.\\nBindings value: \"+b+\"\\nMessage: \"+l.message,l;}}});a.ga.instance=new a.ga})();a.b(\"bindingProvider\",a.ga);(function(){function b(b){var c=(b=a.a.g.get(b,z))&&b.N;c&&(b.N=null,c.Tc())}function c(c,d,e){this.node=c;this.yc=\n\td;this.kb=[];this.H=!1;d.N||a.a.K.za(c,b);e&&e.N&&(e.N.kb.push(c),this.Kb=e)}function d(a){return function(){return a}}function e(a){return a()}function f(b){return a.a.Ga(a.u.G(b),function(a,c){return function(){return b()[c]}})}function g(b,c,e){return\"function\"===typeof b?f(b.bind(null,c,e)):a.a.Ga(b,d)}function h(a,b){return f(this.getBindings.bind(this,a,b))}function m(b,c){var d=a.h.firstChild(c);if(d){var e,f=a.ga.instance,l=f.preprocessNode;if(l){for(;e=d;)d=a.h.nextSibling(e),l.call(f,e);\n\td=a.h.firstChild(c)}for(;e=d;)d=a.h.nextSibling(e),k(b,e)}a.i.ma(c,a.i.H)}function k(b,c){var d=b,e=1===c.nodeType;e&&a.h.Sc(c);if(e||a.ga.instance.nodeHasBindings(c))d=p(c,null,b).bindingContextForDescendants;d&&!u[a.a.R(c)]&&m(d,c)}function l(b){var c=[],d={},e=[];a.a.P(b,function ca(f){if(!d[f]){var k=a.getBindingHandler(f);k&&(k.after&&(e.push(f),a.a.D(k.after,function(c){if(b[c]){if(-1!==a.a.A(e,c))throw Error(\"Cannot combine the following bindings, because they have a cyclic dependency: \"+e.join(\", \"));\n\tca(c)}}),e.length--),c.push({key:f,Mc:k}));d[f]=!0}});return c}function p(b,c,d){var f=a.a.g.Ub(b,z,{}),k=f.hd;if(!c){if(k)throw Error(\"You cannot apply bindings multiple times to the same element.\");f.hd=!0}k||(f.context=d);f.Zb||(f.Zb={});var g;if(c&&\"function\"!==typeof c)g=c;else{var p=a.ga.instance,q=p.getBindingAccessors||h,m=a.$(function(){if(g=c?c(d,b):q.call(p,b,d)){if(d[t])d[t]();if(d[B])d[B]()}return g},null,{l:b});g&&m.ja()||(m=null)}var x=d,u;if(g){var J=function(){return a.a.Ga(m?m():\n\tg,e)},r=m?function(a){return function(){return e(m()[a])}}:function(a){return g[a]};J.get=function(a){return g[a]&&e(r(a))};J.has=function(a){return a in g};a.i.H in g&&a.i.subscribe(b,a.i.H,function(){var c=(0,g[a.i.H])();if(c){var d=a.h.childNodes(b);d.length&&c(d,a.Ec(d[0]))}});a.i.pa in g&&(x=a.i.Cb(b,d),a.i.subscribe(b,a.i.pa,function(){var c=(0,g[a.i.pa])();c&&a.h.firstChild(b)&&c(b)}));f=l(g);a.a.D(f,function(c){var d=c.Mc.init,e=c.Mc.update,f=c.key;if(8===b.nodeType&&!a.h.ea[f])throw Error(\"The binding '\"+\n\tf+\"' cannot be used with virtual elements\");try{\"function\"==typeof d&&a.u.G(function(){var a=d(b,r(f),J,x.$data,x);if(a&&a.controlsDescendantBindings){if(u!==n)throw Error(\"Multiple bindings (\"+u+\" and \"+f+\") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.\");u=f}}),\"function\"==typeof e&&a.$(function(){e(b,r(f),J,x.$data,x)},null,{l:b})}catch(k){throw k.message='Unable to process binding \"'+f+\": \"+g[f]+'\"\\nMessage: '+k.message,\n\tk;}})}f=u===n;return{shouldBindDescendants:f,bindingContextForDescendants:f&&x}}function q(b,c){return b&&b instanceof a.fa?b:new a.fa(b,n,n,c)}var t=a.a.Da(\"_subscribable\"),x=a.a.Da(\"_ancestorBindingInfo\"),B=a.a.Da(\"_dataDependency\");a.c={};var u={script:!0,textarea:!0,template:!0};a.getBindingHandler=function(b){return a.c[b]};var J={};a.fa=function(b,c,d,e,f){function k(){var b=p?h():h,f=a.a.f(b);c?(a.a.extend(l,c),x in c&&(l[x]=c[x])):(l.$parents=[],l.$root=f,l.ko=a);l[t]=q;g?f=l.$data:(l.$rawData=\n\tb,l.$data=f);d&&(l[d]=f);e&&e(l,c,f);if(c&&c[t]&&!a.S.o().Vb(c[t]))c[t]();m&&(l[B]=m);return l.$data}var l=this,g=b===J,h=g?n:b,p=\"function\"==typeof h&&!a.O(h),q,m=f&&f.dataDependency;f&&f.exportDependencies?k():(q=a.xb(k),q.v(),q.ja()?q.equalityComparer=null:l[t]=n)};a.fa.prototype.createChildContext=function(b,c,d,e){!e&&c&&\"object\"==typeof c&&(e=c,c=e.as,d=e.extend);if(c&&e&&e.noChildContext){var f=\"function\"==typeof b&&!a.O(b);return new a.fa(J,this,null,function(a){d&&d(a);a[c]=f?b():b},e)}return new a.fa(b,\n\tthis,c,function(a,b){a.$parentContext=b;a.$parent=b.$data;a.$parents=(b.$parents||[]).slice(0);a.$parents.unshift(a.$parent);d&&d(a)},e)};a.fa.prototype.extend=function(b,c){return new a.fa(J,this,null,function(c){a.a.extend(c,\"function\"==typeof b?b(c):b)},c)};var z=a.a.g.Z();c.prototype.Tc=function(){this.Kb&&this.Kb.N&&this.Kb.N.sd(this.node)};c.prototype.sd=function(b){a.a.Pa(this.kb,b);!this.kb.length&&this.H&&this.Cc()};c.prototype.Cc=function(){this.H=!0;this.yc.N&&!this.kb.length&&(this.yc.N=\n\tnull,a.a.K.yb(this.node,b),a.i.ma(this.node,a.i.pa),this.Tc())};a.i={H:\"childrenComplete\",pa:\"descendantsComplete\",subscribe:function(b,c,d,e,f){var k=a.a.g.Ub(b,z,{});k.Fa||(k.Fa=new a.T);f&&f.notifyImmediately&&k.Zb[c]&&a.u.G(d,e,[b]);return k.Fa.subscribe(d,e,c)},ma:function(b,c){var d=a.a.g.get(b,z);if(d&&(d.Zb[c]=!0,d.Fa&&d.Fa.notifySubscribers(b,c),c==a.i.H))if(d.N)d.N.Cc();else if(d.N===n&&d.Fa&&d.Fa.Wa(a.i.pa))throw Error(\"descendantsComplete event not supported for bindings on this node\");\n\t},Cb:function(b,d){var e=a.a.g.Ub(b,z,{});e.N||(e.N=new c(b,e,d[x]));return d[x]==e?d:d.extend(function(a){a[x]=e})}};a.Td=function(b){return(b=a.a.g.get(b,z))&&b.context};a.ib=function(b,c,d){1===b.nodeType&&a.h.Sc(b);return p(b,c,q(d))};a.ld=function(b,c,d){d=q(d);return a.ib(b,g(c,d,b),d)};a.Oa=function(a,b){1!==b.nodeType&&8!==b.nodeType||m(q(a),b)};a.vc=function(a,b,c){!v&&A.jQuery&&(v=A.jQuery);if(2>arguments.length){if(b=w.body,!b)throw Error(\"ko.applyBindings: could not find document.body; has the document been loaded?\");\n\t}else if(!b||1!==b.nodeType&&8!==b.nodeType)throw Error(\"ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node\");k(q(a,c),b)};a.Dc=function(b){return!b||1!==b.nodeType&&8!==b.nodeType?n:a.Td(b)};a.Ec=function(b){return(b=a.Dc(b))?b.$data:n};a.b(\"bindingHandlers\",a.c);a.b(\"bindingEvent\",a.i);a.b(\"bindingEvent.subscribe\",a.i.subscribe);a.b(\"bindingEvent.startPossiblyAsyncContentBinding\",a.i.Cb);a.b(\"applyBindings\",a.vc);a.b(\"applyBindingsToDescendants\",a.Oa);\n\ta.b(\"applyBindingAccessorsToNode\",a.ib);a.b(\"applyBindingsToNode\",a.ld);a.b(\"contextFor\",a.Dc);a.b(\"dataFor\",a.Ec)})();(function(b){function c(c,e){var k=Object.prototype.hasOwnProperty.call(f,c)?f[c]:b,l;k?k.subscribe(e):(k=f[c]=new a.T,k.subscribe(e),d(c,function(b,d){var e=!(!d||!d.synchronous);g[c]={definition:b,Gd:e};delete f[c];l||e?k.notifySubscribers(b):a.na.zb(function(){k.notifySubscribers(b)})}),l=!0)}function d(a,b){e(\"getConfig\",[a],function(c){c?e(\"loadComponent\",[a,c],function(a){b(a,\n\tc)}):b(null,null)})}function e(c,d,f,l){l||(l=a.j.loaders.slice(0));var g=l.shift();if(g){var q=g[c];if(q){var t=!1;if(q.apply(g,d.concat(function(a){t?f(null):null!==a?f(a):e(c,d,f,l)}))!==b&&(t=!0,!g.suppressLoaderExceptions))throw Error(\"Component loaders must supply values by invoking the callback, not by returning values synchronously.\");}else e(c,d,f,l)}else f(null)}var f={},g={};a.j={get:function(d,e){var f=Object.prototype.hasOwnProperty.call(g,d)?g[d]:b;f?f.Gd?a.u.G(function(){e(f.definition)}):\n\ta.na.zb(function(){e(f.definition)}):c(d,e)},Bc:function(a){delete g[a]},oc:e};a.j.loaders=[];a.b(\"components\",a.j);a.b(\"components.get\",a.j.get);a.b(\"components.clearCachedDefinition\",a.j.Bc)})();(function(){function b(b,c,d,e){function g(){0===--B&&e(h)}var h={},B=2,u=d.template;d=d.viewModel;u?f(c,u,function(c){a.j.oc(\"loadTemplate\",[b,c],function(a){h.template=a;g()})}):g();d?f(c,d,function(c){a.j.oc(\"loadViewModel\",[b,c],function(a){h[m]=a;g()})}):g()}function c(a,b,d){if(\"function\"===typeof b)d(function(a){return new b(a)});\n\telse if(\"function\"===typeof b[m])d(b[m]);else if(\"instance\"in b){var e=b.instance;d(function(){return e})}else\"viewModel\"in b?c(a,b.viewModel,d):a(\"Unknown viewModel value: \"+b)}function d(b){switch(a.a.R(b)){case \"script\":return a.a.ua(b.text);case \"textarea\":return a.a.ua(b.value);case \"template\":if(e(b.content))return a.a.Ca(b.content.childNodes)}return a.a.Ca(b.childNodes)}function e(a){return A.DocumentFragment?a instanceof DocumentFragment:a&&11===a.nodeType}function f(a,b,c){\"string\"===typeof b.require?\n\tT||A.require?(T||A.require)([b.require],function(a){a&&\"object\"===typeof a&&a.Xd&&a[\"default\"]&&(a=a[\"default\"]);c(a)}):a(\"Uses require, but no AMD loader is present\"):c(b)}function g(a){return function(b){throw Error(\"Component '\"+a+\"': \"+b);}}var h={};a.j.register=function(b,c){if(!c)throw Error(\"Invalid configuration for \"+b);if(a.j.tb(b))throw Error(\"Component \"+b+\" is already registered\");h[b]=c};a.j.tb=function(a){return Object.prototype.hasOwnProperty.call(h,a)};a.j.unregister=function(b){delete h[b];\n\ta.j.Bc(b)};a.j.Fc={getConfig:function(b,c){c(a.j.tb(b)?h[b]:null)},loadComponent:function(a,c,d){var e=g(a);f(e,c,function(c){b(a,e,c,d)})},loadTemplate:function(b,c,f){b=g(b);if(\"string\"===typeof c)f(a.a.ua(c));else if(c instanceof Array)f(c);else if(e(c))f(a.a.la(c.childNodes));else if(c.element)if(c=c.element,A.HTMLElement?c instanceof HTMLElement:c&&c.tagName&&1===c.nodeType)f(d(c));else if(\"string\"===typeof c){var h=w.getElementById(c);h?f(d(h)):b(\"Cannot find element with ID \"+c)}else b(\"Unknown element type: \"+\n\tc);else b(\"Unknown template value: \"+c)},loadViewModel:function(a,b,d){c(g(a),b,d)}};var m=\"createViewModel\";a.b(\"components.register\",a.j.register);a.b(\"components.isRegistered\",a.j.tb);a.b(\"components.unregister\",a.j.unregister);a.b(\"components.defaultLoader\",a.j.Fc);a.j.loaders.push(a.j.Fc);a.j.dd=h})();(function(){function b(b,e){var f=b.getAttribute(\"params\");if(f){var f=c.parseBindingsString(f,e,b,{valueAccessors:!0,bindingParams:!0}),f=a.a.Ga(f,function(c){return a.o(c,null,{l:b})}),g=a.a.Ga(f,\n\tfunction(c){var e=c.v();return c.ja()?a.o({read:function(){return a.a.f(c())},write:a.Za(e)&&function(a){c()(a)},l:b}):e});Object.prototype.hasOwnProperty.call(g,\"$raw\")||(g.$raw=f);return g}return{$raw:{}}}a.j.getComponentNameForNode=function(b){var c=a.a.R(b);if(a.j.tb(c)&&(-1!=c.indexOf(\"-\")||\"[object HTMLUnknownElement]\"==\"\"+b||8>=a.a.W&&b.tagName===c))return c};a.j.tc=function(c,e,f,g){if(1===e.nodeType){var h=a.j.getComponentNameForNode(e);if(h){c=c||{};if(c.component)throw Error('Cannot use the \"component\" binding on a custom element matching a component');\n\tvar m={name:h,params:b(e,f)};c.component=g?function(){return m}:m}}return c};var c=new a.ga;9>a.a.W&&(a.j.register=function(a){return function(b){return a.apply(this,arguments)}}(a.j.register),w.createDocumentFragment=function(b){return function(){var c=b(),f=a.j.dd,g;for(g in f);return c}}(w.createDocumentFragment))})();(function(){function b(b,c,d){c=c.template;if(!c)throw Error(\"Component '\"+b+\"' has no template\");b=a.a.Ca(c);a.h.va(d,b)}function c(a,b,c){var d=a.createViewModel;return d?d.call(a,\n\tb,c):b}var d=0;a.c.component={init:function(e,f,g,h,m){function k(){var a=l&&l.dispose;\"function\"===typeof a&&a.call(l);q&&q.s();p=l=q=null}var l,p,q,t=a.a.la(a.h.childNodes(e));a.h.Ea(e);a.a.K.za(e,k);a.o(function(){var g=a.a.f(f()),h,u;\"string\"===typeof g?h=g:(h=a.a.f(g.name),u=a.a.f(g.params));if(!h)throw Error(\"No component name specified\");var n=a.i.Cb(e,m),z=p=++d;a.j.get(h,function(d){if(p===z){k();if(!d)throw Error(\"Unknown component '\"+h+\"'\");b(h,d,e);var f=c(d,u,{element:e,templateNodes:t});\n\td=n.createChildContext(f,{extend:function(a){a.$component=f;a.$componentTemplateNodes=t}});f&&f.koDescendantsComplete&&(q=a.i.subscribe(e,a.i.pa,f.koDescendantsComplete,f));l=f;a.Oa(d,e)}})},null,{l:e});return{controlsDescendantBindings:!0}}};a.h.ea.component=!0})();var V={\"class\":\"className\",\"for\":\"htmlFor\"};a.c.attr={update:function(b,c){var d=a.a.f(c())||{};a.a.P(d,function(c,d){d=a.a.f(d);var g=c.indexOf(\":\"),g=\"lookupNamespaceURI\"in b&&0<g&&b.lookupNamespaceURI(c.substr(0,g)),h=!1===d||null===\n\td||d===n;h?g?b.removeAttributeNS(g,c):b.removeAttribute(c):d=d.toString();8>=a.a.W&&c in V?(c=V[c],h?b.removeAttribute(c):b[c]=d):h||(g?b.setAttributeNS(g,c,d):b.setAttribute(c,d));\"name\"===c&&a.a.Yc(b,h?\"\":d)})}};(function(){a.c.checked={after:[\"value\",\"attr\"],init:function(b,c,d){function e(){var e=b.checked,f=g();if(!a.S.Ya()&&(e||!m&&!a.S.qa())){var k=a.u.G(c);if(l){var q=p?k.v():k,z=t;t=f;z!==f?e&&(a.a.Na(q,f,!0),a.a.Na(q,z,!1)):a.a.Na(q,f,e);p&&a.Za(k)&&k(q)}else h&&(f===n?f=e:e||(f=n)),a.m.eb(k,\n\td,\"checked\",f,!0)}}function f(){var d=a.a.f(c()),e=g();l?(b.checked=0<=a.a.A(d,e),t=e):b.checked=h&&e===n?!!d:g()===d}var g=a.xb(function(){if(d.has(\"checkedValue\"))return a.a.f(d.get(\"checkedValue\"));if(q)return d.has(\"value\")?a.a.f(d.get(\"value\")):b.value}),h=\"checkbox\"==b.type,m=\"radio\"==b.type;if(h||m){var k=c(),l=h&&a.a.f(k)instanceof Array,p=!(l&&k.push&&k.splice),q=m||l,t=l?g():n;m&&!b.name&&a.c.uniqueName.init(b,function(){return!0});a.o(e,null,{l:b});a.a.B(b,\"click\",e);a.o(f,null,{l:b});\n\tk=n}}};a.m.wa.checked=!0;a.c.checkedValue={update:function(b,c){b.value=a.a.f(c())}}})();a.c[\"class\"]={update:function(b,c){var d=a.a.Db(a.a.f(c()));a.a.Eb(b,b.__ko__cssValue,!1);b.__ko__cssValue=d;a.a.Eb(b,d,!0)}};a.c.css={update:function(b,c){var d=a.a.f(c());null!==d&&\"object\"==typeof d?a.a.P(d,function(c,d){d=a.a.f(d);a.a.Eb(b,c,d)}):a.c[\"class\"].update(b,c)}};a.c.enable={update:function(b,c){var d=a.a.f(c());d&&b.disabled?b.removeAttribute(\"disabled\"):d||b.disabled||(b.disabled=!0)}};a.c.disable=\n\t{update:function(b,c){a.c.enable.update(b,function(){return!a.a.f(c())})}};a.c.event={init:function(b,c,d,e,f){var g=c()||{};a.a.P(g,function(g){\"string\"==typeof g&&a.a.B(b,g,function(b){var k,l=c()[g];if(l){try{var p=a.a.la(arguments);e=f.$data;p.unshift(e);k=l.apply(e,p)}finally{!0!==k&&(b.preventDefault?b.preventDefault():b.returnValue=!1)}!1===d.get(g+\"Bubble\")&&(b.cancelBubble=!0,b.stopPropagation&&b.stopPropagation())}})})}};a.c.foreach={Rc:function(b){return function(){var c=b(),d=a.a.bc(c);\n\tif(!d||\"number\"==typeof d.length)return{foreach:c,templateEngine:a.ba.Ma};a.a.f(c);return{foreach:d.data,as:d.as,noChildContext:d.noChildContext,includeDestroyed:d.includeDestroyed,afterAdd:d.afterAdd,beforeRemove:d.beforeRemove,afterRender:d.afterRender,beforeMove:d.beforeMove,afterMove:d.afterMove,templateEngine:a.ba.Ma}}},init:function(b,c){return a.c.template.init(b,a.c.foreach.Rc(c))},update:function(b,c,d,e,f){return a.c.template.update(b,a.c.foreach.Rc(c),d,e,f)}};a.m.Ra.foreach=!1;a.h.ea.foreach=\n\t!0;a.c.hasfocus={init:function(b,c,d){function e(e){b.__ko_hasfocusUpdating=!0;var f=b.ownerDocument;if(\"activeElement\"in f){var g;try{g=f.activeElement}catch(l){g=f.body}e=g===b}f=c();a.m.eb(f,d,\"hasfocus\",e,!0);b.__ko_hasfocusLastValue=e;b.__ko_hasfocusUpdating=!1}var f=e.bind(null,!0),g=e.bind(null,!1);a.a.B(b,\"focus\",f);a.a.B(b,\"focusin\",f);a.a.B(b,\"blur\",g);a.a.B(b,\"focusout\",g);b.__ko_hasfocusLastValue=!1},update:function(b,c){var d=!!a.a.f(c());b.__ko_hasfocusUpdating||b.__ko_hasfocusLastValue===\n\td||(d?b.focus():b.blur(),!d&&b.__ko_hasfocusLastValue&&b.ownerDocument.body.focus(),a.u.G(a.a.Fb,null,[b,d?\"focusin\":\"focusout\"]))}};a.m.wa.hasfocus=!0;a.c.hasFocus=a.c.hasfocus;a.m.wa.hasFocus=\"hasfocus\";a.c.html={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.fc(b,c())}};(function(){function b(b,d,e){a.c[b]={init:function(b,c,h,m,k){var l,p,q={},t,x,n;if(d){m=h.get(\"as\");var u=h.get(\"noChildContext\");n=!(m&&u);q={as:m,noChildContext:u,exportDependencies:n}}x=(t=\n\t\"render\"==h.get(\"completeOn\"))||h.has(a.i.pa);a.o(function(){var h=a.a.f(c()),m=!e!==!h,u=!p,r;if(n||m!==l){x&&(k=a.i.Cb(b,k));if(m){if(!d||n)q.dataDependency=a.S.o();r=d?k.createChildContext(\"function\"==typeof h?h:c,q):a.S.qa()?k.extend(null,q):k}u&&a.S.qa()&&(p=a.a.Ca(a.h.childNodes(b),!0));m?(u||a.h.va(b,a.a.Ca(p)),a.Oa(r,b)):(a.h.Ea(b),t||a.i.ma(b,a.i.H));l=m}},null,{l:b});return{controlsDescendantBindings:!0}}};a.m.Ra[b]=!1;a.h.ea[b]=!0}b(\"if\");b(\"ifnot\",!1,!0);b(\"with\",!0)})();a.c.let={init:function(b,\n\tc,d,e,f){c=f.extend(c);a.Oa(c,b);return{controlsDescendantBindings:!0}}};a.h.ea.let=!0;var Q={};a.c.options={init:function(b){if(\"select\"!==a.a.R(b))throw Error(\"options binding applies only to SELECT elements\");for(;0<b.length;)b.remove(0);return{controlsDescendantBindings:!0}},update:function(b,c,d){function e(){return a.a.jb(b.options,function(a){return a.selected})}function f(a,b,c){var d=typeof b;return\"function\"==d?b(a):\"string\"==d?a[b]:c}function g(c,d){if(x&&l)a.i.ma(b,a.i.H);else if(t.length){var e=\n\t0<=a.a.A(t,a.w.M(d[0]));a.a.Zc(d[0],e);x&&!e&&a.u.G(a.a.Fb,null,[b,\"change\"])}}var h=b.multiple,m=0!=b.length&&h?b.scrollTop:null,k=a.a.f(c()),l=d.get(\"valueAllowUnset\")&&d.has(\"value\"),p=d.get(\"optionsIncludeDestroyed\");c={};var q,t=[];l||(h?t=a.a.Mb(e(),a.w.M):0<=b.selectedIndex&&t.push(a.w.M(b.options[b.selectedIndex])));k&&(\"undefined\"==typeof k.length&&(k=[k]),q=a.a.jb(k,function(b){return p||b===n||null===b||!a.a.f(b._destroy)}),d.has(\"optionsCaption\")&&(k=a.a.f(d.get(\"optionsCaption\")),null!==\n\tk&&k!==n&&q.unshift(Q)));var x=!1;c.beforeRemove=function(a){b.removeChild(a)};k=g;d.has(\"optionsAfterRender\")&&\"function\"==typeof d.get(\"optionsAfterRender\")&&(k=function(b,c){g(0,c);a.u.G(d.get(\"optionsAfterRender\"),null,[c[0],b!==Q?b:n])});a.a.ec(b,q,function(c,e,g){g.length&&(t=!l&&g[0].selected?[a.w.M(g[0])]:[],x=!0);e=b.ownerDocument.createElement(\"option\");c===Q?(a.a.Bb(e,d.get(\"optionsCaption\")),a.w.cb(e,n)):(g=f(c,d.get(\"optionsValue\"),c),a.w.cb(e,a.a.f(g)),c=f(c,d.get(\"optionsText\"),g),\n\ta.a.Bb(e,c));return[e]},c,k);if(!l){var B;h?B=t.length&&e().length<t.length:B=t.length&&0<=b.selectedIndex?a.w.M(b.options[b.selectedIndex])!==t[0]:t.length||0<=b.selectedIndex;B&&a.u.G(a.a.Fb,null,[b,\"change\"])}(l||a.S.Ya())&&a.i.ma(b,a.i.H);a.a.wd(b);m&&20<Math.abs(m-b.scrollTop)&&(b.scrollTop=m)}};a.c.options.$b=a.a.g.Z();a.c.selectedOptions={init:function(b,c,d){function e(){var e=c(),f=[];a.a.D(b.getElementsByTagName(\"option\"),function(b){b.selected&&f.push(a.w.M(b))});a.m.eb(e,d,\"selectedOptions\",\n\tf)}function f(){var d=a.a.f(c()),e=b.scrollTop;d&&\"number\"==typeof d.length&&a.a.D(b.getElementsByTagName(\"option\"),function(b){var c=0<=a.a.A(d,a.w.M(b));b.selected!=c&&a.a.Zc(b,c)});b.scrollTop=e}if(\"select\"!=a.a.R(b))throw Error(\"selectedOptions binding applies only to SELECT elements\");var g;a.i.subscribe(b,a.i.H,function(){g?e():(a.a.B(b,\"change\",e),g=a.o(f,null,{l:b}))},null,{notifyImmediately:!0})},update:function(){}};a.m.wa.selectedOptions=!0;a.c.style={update:function(b,c){var d=a.a.f(c()||\n\t{});a.a.P(d,function(c,d){d=a.a.f(d);if(null===d||d===n||!1===d)d=\"\";if(v)v(b).css(c,d);else if(/^--/.test(c))b.style.setProperty(c,d);else{c=c.replace(/-(\\w)/g,function(a,b){return b.toUpperCase()});var g=b.style[c];b.style[c]=d;d===g||b.style[c]!=g||isNaN(d)||(b.style[c]=d+\"px\")}})}};a.c.submit={init:function(b,c,d,e,f){if(\"function\"!=typeof c())throw Error(\"The value for a submit binding must be a function\");a.a.B(b,\"submit\",function(a){var d,e=c();try{d=e.call(f.$data,b)}finally{!0!==d&&(a.preventDefault?\n\ta.preventDefault():a.returnValue=!1)}})}};a.c.text={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.Bb(b,c())}};a.h.ea.text=!0;(function(){if(A&&A.navigator){var b=function(a){if(a)return parseFloat(a[1])},c=A.navigator.userAgent,d,e,f,g,h;(d=A.opera&&A.opera.version&&parseInt(A.opera.version()))||(h=b(c.match(/Edge\\/([^ ]+)$/)))||b(c.match(/Chrome\\/([^ ]+)/))||(e=b(c.match(/Version\\/([^ ]+) Safari/)))||(f=b(c.match(/Firefox\\/([^ ]+)/)))||(g=a.a.W||b(c.match(/MSIE ([^ ]+)/)))||\n\t(g=b(c.match(/rv:([^ )]+)/)))}if(8<=g&&10>g)var m=a.a.g.Z(),k=a.a.g.Z(),l=function(b){var c=this.activeElement;(c=c&&a.a.g.get(c,k))&&c(b)},p=function(b,c){var d=b.ownerDocument;a.a.g.get(d,m)||(a.a.g.set(d,m,!0),a.a.B(d,\"selectionchange\",l));a.a.g.set(b,k,c)};a.c.textInput={init:function(b,c,k){function l(c,d){a.a.B(b,c,d)}function m(){var d=a.a.f(c());if(null===d||d===n)d=\"\";L!==n&&d===L?a.a.setTimeout(m,4):b.value!==d&&(y=!0,b.value=d,y=!1,v=b.value)}function r(){w||(L=b.value,w=a.a.setTimeout(z,\n\t4))}function z(){clearTimeout(w);L=w=n;var d=b.value;v!==d&&(v=d,a.m.eb(c(),k,\"textInput\",d))}var v=b.value,w,L,A=9==a.a.W?r:z,y=!1;g&&l(\"keypress\",z);11>g&&l(\"propertychange\",function(a){y||\"value\"!==a.propertyName||A(a)});8==g&&(l(\"keyup\",z),l(\"keydown\",z));p&&(p(b,A),l(\"dragend\",r));(!g||9<=g)&&l(\"input\",A);5>e&&\"textarea\"===a.a.R(b)?(l(\"keydown\",r),l(\"paste\",r),l(\"cut\",r)):11>d?l(\"keydown\",r):4>f?(l(\"DOMAutoComplete\",z),l(\"dragdrop\",z),l(\"drop\",z)):h&&\"number\"===b.type&&l(\"keydown\",r);l(\"change\",\n\tz);l(\"blur\",z);a.o(m,null,{l:b})}};a.m.wa.textInput=!0;a.c.textinput={preprocess:function(a,b,c){c(\"textInput\",a)}}})();a.c.uniqueName={init:function(b,c){if(c()){var d=\"ko_unique_\"+ ++a.c.uniqueName.rd;a.a.Yc(b,d)}}};a.c.uniqueName.rd=0;a.c.using={init:function(b,c,d,e,f){var g;d.has(\"as\")&&(g={as:d.get(\"as\"),noChildContext:d.get(\"noChildContext\")});c=f.createChildContext(c,g);a.Oa(c,b);return{controlsDescendantBindings:!0}}};a.h.ea.using=!0;a.c.value={init:function(b,c,d){var e=a.a.R(b),f=\"input\"==\n\te;if(!f||\"checkbox\"!=b.type&&\"radio\"!=b.type){var g=[],h=d.get(\"valueUpdate\"),m=!1,k=null;h&&(\"string\"==typeof h?g=[h]:g=a.a.wc(h),a.a.Pa(g,\"change\"));var l=function(){k=null;m=!1;var e=c(),f=a.w.M(b);a.m.eb(e,d,\"value\",f)};!a.a.W||!f||\"text\"!=b.type||\"off\"==b.autocomplete||b.form&&\"off\"==b.form.autocomplete||-1!=a.a.A(g,\"propertychange\")||(a.a.B(b,\"propertychange\",function(){m=!0}),a.a.B(b,\"focus\",function(){m=!1}),a.a.B(b,\"blur\",function(){m&&l()}));a.a.D(g,function(c){var d=l;a.a.Ud(c,\"after\")&&\n\t(d=function(){k=a.w.M(b);a.a.setTimeout(l,0)},c=c.substring(5));a.a.B(b,c,d)});var p;p=f&&\"file\"==b.type?function(){var d=a.a.f(c());null===d||d===n||\"\"===d?b.value=\"\":a.u.G(l)}:function(){var f=a.a.f(c()),g=a.w.M(b);if(null!==k&&f===k)a.a.setTimeout(p,0);else if(f!==g||g===n)\"select\"===e?(g=d.get(\"valueAllowUnset\"),a.w.cb(b,f,g),g||f===a.w.M(b)||a.u.G(l)):a.w.cb(b,f)};if(\"select\"===e){var q;a.i.subscribe(b,a.i.H,function(){q?d.get(\"valueAllowUnset\")?p():l():(a.a.B(b,\"change\",l),q=a.o(p,null,{l:b}))},\n\tnull,{notifyImmediately:!0})}else a.a.B(b,\"change\",l),a.o(p,null,{l:b})}else a.ib(b,{checkedValue:c})},update:function(){}};a.m.wa.value=!0;a.c.visible={update:function(b,c){var d=a.a.f(c()),e=\"none\"!=b.style.display;d&&!e?b.style.display=\"\":!d&&e&&(b.style.display=\"none\")}};a.c.hidden={update:function(b,c){a.c.visible.update(b,function(){return!a.a.f(c())})}};(function(b){a.c[b]={init:function(c,d,e,f,g){return a.c.event.init.call(this,c,function(){var a={};a[b]=d();return a},e,f,g)}}})(\"click\");\n\ta.ca=function(){};a.ca.prototype.renderTemplateSource=function(){throw Error(\"Override renderTemplateSource\");};a.ca.prototype.createJavaScriptEvaluatorBlock=function(){throw Error(\"Override createJavaScriptEvaluatorBlock\");};a.ca.prototype.makeTemplateSource=function(b,c){if(\"string\"==typeof b){c=c||w;var d=c.getElementById(b);if(!d)throw Error(\"Cannot find template with ID \"+b);return new a.C.F(d)}if(1==b.nodeType||8==b.nodeType)return new a.C.ia(b);throw Error(\"Unknown template type: \"+b);};a.ca.prototype.renderTemplate=\n\tfunction(a,c,d,e){a=this.makeTemplateSource(a,e);return this.renderTemplateSource(a,c,d,e)};a.ca.prototype.isTemplateRewritten=function(a,c){return!1===this.allowTemplateRewriting?!0:this.makeTemplateSource(a,c).data(\"isRewritten\")};a.ca.prototype.rewriteTemplate=function(a,c,d){a=this.makeTemplateSource(a,d);c=c(a.text());a.text(c);a.data(\"isRewritten\",!0)};a.b(\"templateEngine\",a.ca);a.kc=function(){function b(b,c,d,h){b=a.m.ac(b);for(var m=a.m.Ra,k=0;k<b.length;k++){var l=b[k].key;if(Object.prototype.hasOwnProperty.call(m,\n\tl)){var p=m[l];if(\"function\"===typeof p){if(l=p(b[k].value))throw Error(l);}else if(!p)throw Error(\"This template engine does not support the '\"+l+\"' binding within its templates\");}}d=\"ko.__tr_ambtns(function($context,$element){return(function(){return{ \"+a.m.vb(b,{valueAccessors:!0})+\" } })()},'\"+d.toLowerCase()+\"')\";return h.createJavaScriptEvaluatorBlock(d)+c}var c=/(<([a-z]+\\d*)(?:\\s+(?!data-bind\\s*=\\s*)[a-z0-9\\-]+(?:=(?:\\\"[^\\\"]*\\\"|\\'[^\\']*\\'|[^>]*))?)*\\s+)data-bind\\s*=\\s*([\"'])([\\s\\S]*?)\\3/gi,\n\td=/\\x3c!--\\s*ko\\b\\s*([\\s\\S]*?)\\s*--\\x3e/g;return{xd:function(b,c,d){c.isTemplateRewritten(b,d)||c.rewriteTemplate(b,function(b){return a.kc.Ld(b,c)},d)},Ld:function(a,f){return a.replace(c,function(a,c,d,e,l){return b(l,c,d,f)}).replace(d,function(a,c){return b(c,\"\\x3c!-- ko --\\x3e\",\"#comment\",f)})},md:function(b,c){return a.aa.Xb(function(d,h){var m=d.nextSibling;m&&m.nodeName.toLowerCase()===c&&a.ib(m,b,h)})}}}();a.b(\"__tr_ambtns\",a.kc.md);(function(){a.C={};a.C.F=function(b){if(this.F=b){var c=\n\ta.a.R(b);this.ab=\"script\"===c?1:\"textarea\"===c?2:\"template\"==c&&b.content&&11===b.content.nodeType?3:4}};a.C.F.prototype.text=function(){var b=1===this.ab?\"text\":2===this.ab?\"value\":\"innerHTML\";if(0==arguments.length)return this.F[b];var c=arguments[0];\"innerHTML\"===b?a.a.fc(this.F,c):this.F[b]=c};var b=a.a.g.Z()+\"_\";a.C.F.prototype.data=function(c){if(1===arguments.length)return a.a.g.get(this.F,b+c);a.a.g.set(this.F,b+c,arguments[1])};var c=a.a.g.Z();a.C.F.prototype.nodes=function(){var b=this.F;\n\tif(0==arguments.length){var e=a.a.g.get(b,c)||{},f=e.lb||(3===this.ab?b.content:4===this.ab?b:n);if(!f||e.jd){var g=this.text();g&&g!==e.bb&&(f=a.a.Md(g,b.ownerDocument),a.a.g.set(b,c,{lb:f,bb:g,jd:!0}))}return f}e=arguments[0];this.ab!==n&&this.text(\"\");a.a.g.set(b,c,{lb:e})};a.C.ia=function(a){this.F=a};a.C.ia.prototype=new a.C.F;a.C.ia.prototype.constructor=a.C.ia;a.C.ia.prototype.text=function(){if(0==arguments.length){var b=a.a.g.get(this.F,c)||{};b.bb===n&&b.lb&&(b.bb=b.lb.innerHTML);return b.bb}a.a.g.set(this.F,\n\tc,{bb:arguments[0]})};a.b(\"templateSources\",a.C);a.b(\"templateSources.domElement\",a.C.F);a.b(\"templateSources.anonymousTemplate\",a.C.ia)})();(function(){function b(b,c,d){var e;for(c=a.h.nextSibling(c);b&&(e=b)!==c;)b=a.h.nextSibling(e),d(e,b)}function c(c,d){if(c.length){var e=c[0],f=c[c.length-1],g=e.parentNode,h=a.ga.instance,m=h.preprocessNode;if(m){b(e,f,function(a,b){var c=a.previousSibling,d=m.call(h,a);d&&(a===e&&(e=d[0]||b),a===f&&(f=d[d.length-1]||c))});c.length=0;if(!e)return;e===f?c.push(e):\n\t(c.push(e,f),a.a.Ua(c,g))}b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.vc(d,b)});b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.aa.cd(b,[d])});a.a.Ua(c,g)}}function d(a){return a.nodeType?a:0<a.length?a[0]:null}function e(b,e,f,h,m){m=m||{};var n=(b&&d(b)||f||{}).ownerDocument,B=m.templateEngine||g;a.kc.xd(f,B,n);f=B.renderTemplate(f,h,m,n);if(\"number\"!=typeof f.length||0<f.length&&\"number\"!=typeof f[0].nodeType)throw Error(\"Template engine must return an array of DOM nodes\");n=!1;switch(e){case \"replaceChildren\":a.h.va(b,\n\tf);n=!0;break;case \"replaceNode\":a.a.Xc(b,f);n=!0;break;case \"ignoreTargetNode\":break;default:throw Error(\"Unknown renderMode: \"+e);}n&&(c(f,h),m.afterRender&&a.u.G(m.afterRender,null,[f,h[m.as||\"$data\"]]),\"replaceChildren\"==e&&a.i.ma(b,a.i.H));return f}function f(b,c,d){return a.O(b)?b():\"function\"===typeof b?b(c,d):b}var g;a.gc=function(b){if(b!=n&&!(b instanceof a.ca))throw Error(\"templateEngine must inherit from ko.templateEngine\");g=b};a.dc=function(b,c,h,m,t){h=h||{};if((h.templateEngine||g)==\n\tn)throw Error(\"Set a template engine before calling renderTemplate\");t=t||\"replaceChildren\";if(m){var x=d(m);return a.$(function(){var g=c&&c instanceof a.fa?c:new a.fa(c,null,null,null,{exportDependencies:!0}),n=f(b,g.$data,g),g=e(m,t,n,g,h);\"replaceNode\"==t&&(m=g,x=d(m))},null,{Sa:function(){return!x||!a.a.Sb(x)},l:x&&\"replaceNode\"==t?x.parentNode:x})}return a.aa.Xb(function(d){a.dc(b,c,h,d,\"replaceNode\")})};a.Qd=function(b,d,g,h,m){function x(b,c){a.u.G(a.a.ec,null,[h,b,u,g,r,c]);a.i.ma(h,a.i.H)}\n\tfunction r(a,b){c(b,v);g.afterRender&&g.afterRender(b,a);v=null}function u(a,c){v=m.createChildContext(a,{as:z,noChildContext:g.noChildContext,extend:function(a){a.$index=c;z&&(a[z+\"Index\"]=c)}});var d=f(b,a,v);return e(h,\"ignoreTargetNode\",d,v,g)}var v,z=g.as,w=!1===g.includeDestroyed||a.options.foreachHidesDestroyed&&!g.includeDestroyed;if(w||g.beforeRemove||!a.Pc(d))return a.$(function(){var b=a.a.f(d)||[];\"undefined\"==typeof b.length&&(b=[b]);w&&(b=a.a.jb(b,function(b){return b===n||null===b||\n\t!a.a.f(b._destroy)}));x(b)},null,{l:h});x(d.v());var A=d.subscribe(function(a){x(d(),a)},null,\"arrayChange\");A.l(h);return A};var h=a.a.g.Z(),m=a.a.g.Z();a.c.template={init:function(b,c){var d=a.a.f(c());if(\"string\"==typeof d||\"name\"in d)a.h.Ea(b);else if(\"nodes\"in d){d=d.nodes||[];if(a.O(d))throw Error('The \"nodes\" option must be a plain, non-observable array.');var e=d[0]&&d[0].parentNode;e&&a.a.g.get(e,m)||(e=a.a.Yb(d),a.a.g.set(e,m,!0));(new a.C.ia(b)).nodes(e)}else if(d=a.h.childNodes(b),0<d.length)e=\n\ta.a.Yb(d),(new a.C.ia(b)).nodes(e);else throw Error(\"Anonymous template defined, but no template content was provided\");return{controlsDescendantBindings:!0}},update:function(b,c,d,e,f){var g=c();c=a.a.f(g);d=!0;e=null;\"string\"==typeof c?c={}:(g=\"name\"in c?c.name:b,\"if\"in c&&(d=a.a.f(c[\"if\"])),d&&\"ifnot\"in c&&(d=!a.a.f(c.ifnot)),d&&!g&&(d=!1));\"foreach\"in c?e=a.Qd(g,d&&c.foreach||[],c,b,f):d?(d=f,\"data\"in c&&(d=f.createChildContext(c.data,{as:c.as,noChildContext:c.noChildContext,exportDependencies:!0})),\n\te=a.dc(g,d,c,b)):a.h.Ea(b);f=e;(c=a.a.g.get(b,h))&&\"function\"==typeof c.s&&c.s();a.a.g.set(b,h,!f||f.ja&&!f.ja()?n:f)}};a.m.Ra.template=function(b){b=a.m.ac(b);return 1==b.length&&b[0].unknown||a.m.Id(b,\"name\")?null:\"This template engine does not support anonymous templates nested within its templates\"};a.h.ea.template=!0})();a.b(\"setTemplateEngine\",a.gc);a.b(\"renderTemplate\",a.dc);a.a.Kc=function(a,c,d){if(a.length&&c.length){var e,f,g,h,m;for(e=f=0;(!d||e<d)&&(h=a[f]);++f){for(g=0;m=c[g];++g)if(h.value===\n\tm.value){h.moved=m.index;m.moved=h.index;c.splice(g,1);e=g=0;break}e+=g}}};a.a.Pb=function(){function b(b,d,e,f,g){var h=Math.min,m=Math.max,k=[],l,p=b.length,q,n=d.length,r=n-p||1,v=p+n+1,u,w,z;for(l=0;l<=p;l++)for(w=u,k.push(u=[]),z=h(n,l+r),q=m(0,l-1);q<=z;q++)u[q]=q?l?b[l-1]===d[q-1]?w[q-1]:h(w[q]||v,u[q-1]||v)+1:q+1:l+1;h=[];m=[];r=[];l=p;for(q=n;l||q;)n=k[l][q]-1,q&&n===k[l][q-1]?m.push(h[h.length]={status:e,value:d[--q],index:q}):l&&n===k[l-1][q]?r.push(h[h.length]={status:f,value:b[--l],index:l}):\n\t(--q,--l,g.sparse||h.push({status:\"retained\",value:d[q]}));a.a.Kc(r,m,!g.dontLimitMoves&&10*p);return h.reverse()}return function(a,d,e){e=\"boolean\"===typeof e?{dontLimitMoves:e}:e||{};a=a||[];d=d||[];return a.length<d.length?b(a,d,\"added\",\"deleted\",e):b(d,a,\"deleted\",\"added\",e)}}();a.b(\"utils.compareArrays\",a.a.Pb);(function(){function b(b,c,d,h,m){var k=[],l=a.$(function(){var l=c(d,m,a.a.Ua(k,b))||[];0<k.length&&(a.a.Xc(k,l),h&&a.u.G(h,null,[d,l,m]));k.length=0;a.a.Nb(k,l)},null,{l:b,Sa:function(){return!a.a.kd(k)}});\n\treturn{Y:k,$:l.ja()?l:n}}var c=a.a.g.Z(),d=a.a.g.Z();a.a.ec=function(e,f,g,h,m,k){function l(b){y={Aa:b,pb:a.ta(w++)};v.push(y);r||F.push(y)}function p(b){y=t[b];w!==y.pb.v()&&D.push(y);y.pb(w++);a.a.Ua(y.Y,e);v.push(y)}function q(b,c){if(b)for(var d=0,e=c.length;d<e;d++)a.a.D(c[d].Y,function(a){b(a,d,c[d].Aa)})}f=f||[];\"undefined\"==typeof f.length&&(f=[f]);h=h||{};var t=a.a.g.get(e,c),r=!t,v=[],u=0,w=0,z=[],A=[],C=[],D=[],F=[],y,I=0;if(r)a.a.D(f,l);else{if(!k||t&&t._countWaitingForRemove){var E=\n\ta.a.Mb(t,function(a){return a.Aa});k=a.a.Pb(E,f,{dontLimitMoves:h.dontLimitMoves,sparse:!0})}for(var E=0,G,H,K;G=k[E];E++)switch(H=G.moved,K=G.index,G.status){case \"deleted\":for(;u<K;)p(u++);H===n&&(y=t[u],y.$&&(y.$.s(),y.$=n),a.a.Ua(y.Y,e).length&&(h.beforeRemove&&(v.push(y),I++,y.Aa===d?y=null:C.push(y)),y&&z.push.apply(z,y.Y)));u++;break;case \"added\":for(;w<K;)p(u++);H!==n?(A.push(v.length),p(H)):l(G.value)}for(;w<f.length;)p(u++);v._countWaitingForRemove=I}a.a.g.set(e,c,v);q(h.beforeMove,D);a.a.D(z,\n\th.beforeRemove?a.oa:a.removeNode);var M,O,P;try{P=e.ownerDocument.activeElement}catch(N){}if(A.length)for(;(E=A.shift())!=n;){y=v[E];for(M=n;E;)if((O=v[--E].Y)&&O.length){M=O[O.length-1];break}for(f=0;u=y.Y[f];M=u,f++)a.h.Wb(e,u,M)}for(E=0;y=v[E];E++){y.Y||a.a.extend(y,b(e,g,y.Aa,m,y.pb));for(f=0;u=y.Y[f];M=u,f++)a.h.Wb(e,u,M);!y.Ed&&m&&(m(y.Aa,y.Y,y.pb),y.Ed=!0,M=y.Y[y.Y.length-1])}P&&e.ownerDocument.activeElement!=P&&P.focus();q(h.beforeRemove,C);for(E=0;E<C.length;++E)C[E].Aa=d;q(h.afterMove,D);\n\tq(h.afterAdd,F)}})();a.b(\"utils.setDomNodeChildrenFromArrayMapping\",a.a.ec);a.ba=function(){this.allowTemplateRewriting=!1};a.ba.prototype=new a.ca;a.ba.prototype.constructor=a.ba;a.ba.prototype.renderTemplateSource=function(b,c,d,e){if(c=(9>a.a.W?0:b.nodes)?b.nodes():null)return a.a.la(c.cloneNode(!0).childNodes);b=b.text();return a.a.ua(b,e)};a.ba.Ma=new a.ba;a.gc(a.ba.Ma);a.b(\"nativeTemplateEngine\",a.ba);(function(){a.$a=function(){var a=this.Hd=function(){if(!v||!v.tmpl)return 0;try{if(0<=v.tmpl.tag.tmpl.open.toString().indexOf(\"__\"))return 2}catch(a){}return 1}();\n\tthis.renderTemplateSource=function(b,e,f,g){g=g||w;f=f||{};if(2>a)throw Error(\"Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later.\");var h=b.data(\"precompiled\");h||(h=b.text()||\"\",h=v.template(null,\"{{ko_with $item.koBindingContext}}\"+h+\"{{/ko_with}}\"),b.data(\"precompiled\",h));b=[e.$data];e=v.extend({koBindingContext:e},f.templateOptions);e=v.tmpl(h,b,e);e.appendTo(g.createElement(\"div\"));v.fragments={};return e};this.createJavaScriptEvaluatorBlock=function(a){return\"{{ko_code ((function() { return \"+\n\ta+\" })()) }}\"};this.addTemplate=function(a,b){w.write(\"<script type='text/html' id='\"+a+\"'>\"+b+\"\\x3c/script>\")};0<a&&(v.tmpl.tag.ko_code={open:\"__.push($1 || '');\"},v.tmpl.tag.ko_with={open:\"with($1) {\",close:\"} \"})};a.$a.prototype=new a.ca;a.$a.prototype.constructor=a.$a;var b=new a.$a;0<b.Hd&&a.gc(b);a.b(\"jqueryTmplTemplateEngine\",a.$a)})()})})();})();\n\t"
  },
  {
    "path": "app/public/scripts/showHTMLComplete.js",
    "content": "window.URL = window.URL || window.webkitURL;\nconst getFilenameMime = (fileName, CallBack) => {\n    const exc = fileName.split('.');\n    if (exc.length < 2) {\n        CallBack();\n    }\n    const exc1 = exc[exc.length - 1];\n    const ret = $.cookie(`mime.${exc1}`);\n    if (ret && ret.length) {\n        return CallBack(null, ret);\n    }\n    return _view.connectInformationMessage.sockEmit('mime', fileName, (err, data) => {\n        if (err) {\n            return CallBack(err);\n        }\n        $.cookie(`mime.${exc1}`, data, { expires: 720, path: '/' });\n        return CallBack(null, data);\n    });\n};\nconst showHTMLComplete = (uuid, zipStream, CallBack) => {\n    const errCallBack = err => {\n        CallBack(err);\n    };\n    return JSZip.loadAsync(zipStream, { base64: true }).then(zip => {\n        const ret = {\n            img: null,\n            html: null,\n            folder: []\n        };\n        const allFiles = Object.keys(zip.files);\n        let currentFileName = allFiles.shift();\n        const _CallBack = content => {\n            if (content && content.length > 20) {\n                const processFile = () => {\n                    switch (currentFileName) {\n                        case `temp/${uuid}.html`: {\n                            return ret.html = content;\n                        }\n                        case `temp/${uuid}.png`: {\n                            return ret.img = content;\n                        }\n                        default: {\n                            return ret.folder.push({ filename: currentFileName.replace('temp/', './'), data: content });\n                        }\n                    }\n                };\n                processFile();\n            }\n            if (currentFileName = allFiles.shift()) {\n                return zip.files[currentFileName].async('string').then(_CallBack, errCallBack);\n            }\n            return CallBack(null, ret);\n        };\n        if (currentFileName) {\n            return zip.files[currentFileName].async('string').then(_CallBack, errCallBack);\n        }\n        return CallBack(null, ret);\n    }, errCallBack);\n};\n"
  },
  {
    "path": "app/public/scripts/showHTMLComplete.ts",
    "content": "\nwindow.URL = window.URL || window.webkitURL\ndeclare const JSZip\n\nconst getFilenameMime = ( fileName: string, CallBack ) => {\n\tconst exc = fileName.split ('.')\n\tif ( exc.length < 2 ) {\n\t\tCallBack ()\n\t}\n\tconst exc1 = exc[ exc.length - 1 ]\n\tconst ret = $.cookie (`mime.${ exc1 }`)\n\tif ( ret && ret.length ) {\n\t\treturn CallBack ( null, ret )\n\t}\n\treturn _view.connectInformationMessage.sockEmit ('mime', fileName, ( err, data ) => {\n\t\tif ( err ) {\n\t\t\treturn CallBack ( err )\n\t\t}\n\t\t$.cookie ( `mime.${ exc1 }`, data, { expires: 720, path: '/' })\n\t\treturn CallBack ( null, data )\n\t})\n\t\n}\n\nconst showHTMLComplete = ( uuid: string, zipStream: string, CallBack ) => {\n\tconst errCallBack = err => {\n\t\tCallBack ( err )\n\t}\n\treturn JSZip.loadAsync ( zipStream, { base64: true }).then ( zip => {\n\t\tconst ret = {\n\t\t\timg: null,\n\t\t\thtml: null,\n\t\t\tfolder: []\n\t\t}\n\t\tconst allFiles = Object.keys ( zip.files )\n\t\tlet currentFileName = allFiles.shift()\n\t\t\n\t\tconst _CallBack = content => {\n\n\t\t\tif ( content && content.length > 20 ) {\n\t\t\t\t\n\t\t\t\tconst processFile = () => {\n\t\t\t\t\tswitch ( currentFileName ) {\n\t\t\t\t\t\t\tcase `temp/${ uuid }.html`: {\n\t\t\t\t\t\t\t\treturn ret.html = content\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase `temp/${ uuid }.png`: {\n\t\t\t\t\t\t\t\treturn ret.img = content\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tdefault: {\n\t\t\t\t\t\t\t\treturn ret.folder.push ( { filename: currentFileName.replace( 'temp/','./' ), data: content })\n\t\t\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\tprocessFile ()\n\t\t\t}\n\t\t\t\n\t\t\tif ( currentFileName = allFiles.shift() ) {\n\t\t\t\treturn zip.files [ currentFileName ].async ( 'string' ).then ( _CallBack, errCallBack )\n\t\t\t}\n\t\t\t\n\t\t\treturn CallBack ( null, ret )\n\t\t\t\n\t\t}\n\n\t\tif ( currentFileName ) {\n\t\t\treturn zip.files [ currentFileName ].async ( 'string' ).then ( _CallBack, errCallBack )\n\t\t}\n\t\treturn CallBack ( null, ret )\n\t\t\n\t\t\n\t\t\n\n\t}, errCallBack )\n}\n"
  },
  {
    "path": "app/public/scripts/siteShare.js",
    "content": "/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst uuid_generate = function () {\n    let lut = [];\n    for (let i = 0; i < 256; i++) {\n        lut[i] = (i < 16 ? '0' : '') + (i).toString(16);\n    }\n    let d0 = Math.random() * 0xffffffff | 0;\n    let d1 = Math.random() * 0xffffffff | 0;\n    let d2 = Math.random() * 0xffffffff | 0;\n    let d3 = Math.random() * 0xffffffff | 0;\n    return lut[d0 & 0xff] + lut[d0 >> 8 & 0xff] + lut[d0 >> 16 & 0xff] + lut[d0 >> 24 & 0xff] + '-' +\n        lut[d1 & 0xff] + lut[d1 >> 8 & 0xff] + '-' + lut[d1 >> 16 & 0x0f | 0x40] + lut[d1 >> 24 & 0xff] + '-' +\n        lut[d2 & 0x3f | 0x80] + lut[d2 >> 8 & 0xff] + '-' + lut[d2 >> 16 & 0xff] + lut[d2 >> 24 & 0xff] +\n        lut[d3 & 0xff] + lut[d3 >> 8 & 0xff] + lut[d3 >> 16 & 0xff] + lut[d3 >> 24 & 0xff];\n};\nconst bingIcon = `\n    <svg viewBox=\"-650 800 900 400\">\n    <path style=\"fill:#008373;fill-opacity:1;stroke:none\" d=\"m -311.5,796.16903 80.6273,28.36401 0,283.80836 113.56729,-65.5599 -55.67962,-26.1246 -35.12739,-87.43067 178.939297,62.86452 0,91.39515 -201.653597,116.3102 -80.67328,-44.875 z\" />\n    </svg>\n`;\nconst googleIcon = `<svg viewBox=\"-40 0 150 150\">\n  <path fill=\"#4285F4\" d=\"M35.29 41.41V32H67c.31 1.64.47 3.58.47 5.68 0 7.06-1.93 15.79-8.15 22.01-6.05 6.3-13.78 9.66-24.02 9.66C16.32 69.35.36 53.89.36 34.91.36 15.93 16.32.47 35.3.47c10.5 0 17.98 4.12 23.6 9.49l-6.64 6.64c-4.03-3.78-9.49-6.72-16.97-6.72-13.86 0-24.7 11.17-24.7 25.03 0 13.86 10.84 25.03 24.7 25.03 8.99 0 14.11-3.61 17.39-6.89 2.66-2.66 4.41-6.46 5.1-11.65l-22.49.01z\"></path>\n  </svg>\n`;\nconst duckduckgoIcon = `\n  <svg viewBox=\"-6 0 210 210\" xmlns=\"http://www.w3.org/2000/svg\">\n    <g transform=\"translate(-24.5 -19)\">\n        <circle cx=\"127\" cy=\"79\" fill=\"#de5833\" r=\"60\"/>\n        <path d=\"m177.8 57.5c-2.8-6.6-6.8-12.5-11.8-17.5-5.1-5.1-11-9-17.5-11.8-6.8-2.9-14-4.3-21.5-4.3-7.4 0-14.7 1.5-21.5 4.3-6.6 2.7-12.5 6.7-17.5 11.8-5.1 5.1-9 11-11.8 17.5-2.9 6.8-4.3 14-4.3 21.5 0 7.5 1.5 14.7 4.3 21.5 2.8 6.6 6.8 12.5 11.8 17.5 5.1 5.1 11 9 17.5 11.8 6.8 2.9 14 4.3 21.5 4.3 7.4 0 14.7-1.5 21.5-4.3 6.5-2.8 12.4-6.8 17.5-11.8 5.1-5.1 9-11 11.8-17.5 2.9-6.8 4.3-14 4.3-21.5 0-7.5-1.4-14.7-4.3-21.5zm-38.8 71c-3.2-5.4-11.6-20.5-11.6-31.7 0-25.8 17.3-3.7 17.3-24.3 0-4.9-2.4-22.1-17.4-25.7-3.7-4.9-12.4-9.6-26.2-7.7 0 0 2.3.7 4.9 2 0 0-5 .7-5.2 4.1 0 0 9.9-.5 15.5 1.3-12.9 1.7-19.5 8.5-18.3 20.8 1.7 17.5 9.1 48.7 11.7 59.6-19.6-7-33.7-25.8-33.7-47.9 0-28.1 22.8-51 51-51 28.2 0 51 22.8 51 51-.1 24-16.7 44.1-39 49.5z\" fill=\"#fff\"/>\n        <path clip-rule=\"evenodd\" d=\"m124.2 87.3c0-6.6 9-8.7 12.4-8.7 9.2 0 22.2-5.9 25.4-5.8 3.3.1 5.4 1.4 5.4 2.9 0 2.2-18.4 10.5-25.5 9.8-6.8-.6-8.4.1-8.4 2.9 0 2.4 4.9 4.6 10.3 4.6 8.1 0 16-3.6 18.4-1.9 2.1 1.5-5.5 6.9-14.2 6.9-8.7 0-23.8-4.1-23.8-10.7z\" fill=\"#fed30a\" fill-rule=\"evenodd\"/>\n        <path d=\"m140.2 59.3c-2.4-3.1-6.7-3.2-8.2.4 2.3-1.8 5.1-2.2 8.2-.4z\" fill=\"#2d4f8d\"/>\n        <path d=\"m113.5 59.4c-3.3-2-8.8-2.2-8.5 4.1 1.6-3.9 3.8-4.6 8.5-4.1z\" fill=\"#2d4f8d\"/>\n        <path d=\"m138.2 65.2c-1.8 0-3.3 1.5-3.3 3.3 0 1.8 1.5 3.3 3.3 3.3 1.8 0 3.3-1.5 3.3-3.3 0-1.8-1.5-3.3-3.3-3.3zm1.2 3.1c-.5 0-1-.4-1-1 0-.5.4-1 1-1 .6 0 1 .4 1 1-.1.5-.5 1-1 1z\" fill=\"#2d4f8d\"/>\n        <path d=\"m112.6 67c-2.1 0-3.8 1.7-3.8 3.8 0 2.1 1.7 3.8 3.8 3.8 2.1 0 3.8-1.7 3.8-3.8 0-2.1-1.7-3.8-3.8-3.8zm1.4 3.5c-.6 0-1.1-.5-1.1-1.1 0-.6.5-1.1 1.1-1.1.6 0 1.1.5 1.1 1.1 0 .6-.5 1.1-1.1 1.1z\" fill=\"#2d4f8d\"/>\n        <path d=\"m104.3 50.8c-4.8 3.5-7 8.9-6.3 16.5 1.7 17.5 9.1 48.8 11.7 59.7.9.3 1.8.6 2.7.9-1.6-6.6-9.3-38.8-12.7-63.5-.9-6.6 1.7-10.5 4.6-13.6z\" fill=\"#d5d7d8\"/>\n        <path d=\"m116.2 46.5c.4 0 .7-.1.7-.1-5.2-2.5-13.4-2.6-15.6-2.6-.2.4-.4.9-.4 1.4-.1.1 9.6-.5 15.3 1.3z\" fill=\"#d5d7d8\"/>\n        <path d=\"m106.8 41.1c-1.6-1.1-2.9-1.8-3.7-2.2-.7.1-1.3.1-2 .2 0 0 2.3.7 4.9 2 0 0-.1 0-.2 0 .7 0 1 0 1 0z\" fill=\"#d5d7d8\"/>\n        <path d=\"m147.1 107.6c-1.7-.4-8.3 4.3-10.8 6.1-.1-.5-.2-.9-.3-1.1-.3-1-6.7-.4-8.2 1.2-4-1.9-12-5.6-12.1-3.3-.3 3 0 15.5 1.6 16.4 1.2.7 8-3 11.4-4.9 0 0 0 0 .1 0 2.1.5 6 0 7.4-.9.2-.1.3-.3.4-.5 3.1 1.2 9.8 3.6 11.2 3.1 1.8-.5 1.4-15.6-.7-16.1z\" fill=\"#67bd47\"/>\n        <path d=\"m128.8 122c-2.1-.4-1.4-2.5-1.4-7.4 0 0 0 0 0 0-.5.3-.9.7-.9 1.1 0 4.9-.8 7.1 1.4 7.4 2.1.5 6 0 7.6-.9.3-.2.4-.5.5-1-1.5.9-5.2 1.3-7.2.8z\" fill=\"#43a347\"/>                         \n    </g>\n  </svg>\n`;\nconst YahooIcon = `\n  <svg viewBox=\"-75 0 240 240\" xmlns=\"http://www.w3.org/2000/svg\">\n    <defs>\n      <linearGradient id=\"t\" y2=\"1819.8\" gradientUnits=\"userSpaceOnUse\" x2=\"-190.68\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1808.7\" x1=\"-209.43\">\n      <stop stop-color=\"#1b0041\" offset=\"0\"/>\n      <stop stop-color=\"#21004f\" offset=\"1\"/>\n      </linearGradient>\n      <linearGradient id=\"u\" y2=\"1877.2\" gradientUnits=\"userSpaceOnUse\" x2=\"-249.85\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1667.8\" x1=\"-149.7\">\n      <stop stop-color=\"#5500bd\" offset=\"0\"/>\n      <stop stop-color=\"#47008d\" offset=\"1\"/>\n      </linearGradient>\n      <linearGradient id=\"v\" y2=\"1877.6\" gradientUnits=\"userSpaceOnUse\" x2=\"-250.33\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1669.7\" x1=\"-349.94\">\n      <stop stop-color=\"#5100b2\" offset=\"0\"/>\n      <stop stop-color=\"#5500bd\" offset=\"1\"/>\n      </linearGradient>\n      <linearGradient id=\"w\" y2=\"1838.7\" gradientUnits=\"userSpaceOnUse\" x2=\"-273.09\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1850.7\" x1=\"-291.09\">\n      <stop stop-color=\"#27005d\" stop-opacity=\".98039\" offset=\"0\"/>\n      <stop stop-color=\"#2b005d\" offset=\".31767\"/>\n      <stop stop-color=\"#280055\" offset=\".59756\"/>\n      <stop stop-color=\"#24004d\" offset=\".80878\"/>\n      <stop stop-color=\"#230049\" offset=\"1\"/>\n      </linearGradient>\n      <linearGradient id=\"y\" y2=\"2047\" gradientUnits=\"userSpaceOnUse\" x2=\"-253.6\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1878.8\" x1=\"-253.6\">\n      <stop stop-color=\"#210045\" offset=\"0\"/>\n      <stop stop-color=\"#25004d\" offset=\".25\"/>\n      <stop stop-color=\"#2b005c\" offset=\".5\"/>\n      <stop stop-color=\"#340071\" offset=\".74854\"/>\n      <stop stop-color=\"#3e0088\" offset=\"1\"/>\n      </linearGradient>\n      <linearGradient id=\"x\" y2=\"2047.3\" gradientUnits=\"userSpaceOnUse\" x2=\"-227.23\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1877.2\" x1=\"-248.82\">\n      <stop stop-color=\"#5500bd\" offset=\"0\"/>\n      <stop stop-color=\"#5300b5\" offset=\"1\"/>\n      </linearGradient>\n    </defs>\n    <g transform=\"translate(1009.8 -337.49)\">\n    <g transform=\"matrix(.5 0 0 .5 -379.18 197.8)\">\n      <g>\n          <path d=\"m-1106.6 282.03 6.7084 15.246 17.076-7.9282 6.9443-7.3183c-10.985 2.4918-20.893 2.5746-30.729 0z\" fill=\"#6700e8\"/>\n          <path d=\"m-1154.8 414.97-11.587 4.269-7.3183-12.807 72.573-115.87 5.1886-1.7772c7.1618-1.6184 14.973-3.354 20.061-6.7608-11.525 15.569-53.493 88.344-78.917 132.95z\" fill=\"url(#t)\"/>\n          <path d=\"m-1170.6 413.15 3.0493-3.0493 71.795-121.34-10.809-6.7347c-8.6682 16.146-40.638 68.392-60.986 101.85l-9.7578 18.296z\" fill=\"url(#u)\"/>\n          <path d=\"m-1228.5 282.03c15.916 28.207 40.349 67.667 60.986 101.85v26.224l-4.8789 4.8789-71.354-126.85z\" fill=\"url(#v)\"/>\n          <path d=\"m-1240.3 289.7 11.761-7.6717c-12.62 2.6914-17.899 2.8627-30.493 0l4.8789 5.4887z\" fill=\"#6700e8\"/>\n          <path d=\"m-1167.6 410.1-5.4887 7.9282-7.3184-3.0493c-13.625-23.55-53.678-95.287-78.672-132.95 5.0665 3.6714 11.911 5.686 19.817 6.9699z\" fill=\"url(#w)\"/>\n          <path fill=\"url(#x)\" d=\"m-1152.9 513.16-20.735-9.7578 1.8296-86.6 4.269-6.7085 12.807 4.8789z\"/>\n          <path d=\"m-1167.6 506.45-14.637 6.7085 1.8295-98.187 12.807-4.8789z\" fill=\"url(#y)\"/>\n      </g>\n      </g>\n      </g>\n  </svg>\n`;\nconst uuID = function () {\n    return uuid_generate().replace(/-/g, '');\n};\nDate.isLeapYear = function (year) {\n    return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0));\n};\nDate.getDaysInMonth = function (year, month) {\n    return [31, (Date.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];\n};\nDate.prototype.isLeapYear = function () {\n    return Date.isLeapYear(this.getFullYear());\n};\nDate.prototype.getDaysInMonth = function () {\n    return Date.getDaysInMonth(this.getFullYear(), this.getMonth());\n};\nDate.prototype.addMonths = function (value) {\n    var n = this.getDate();\n    this.setDate(1);\n    this.setMonth(this.getMonth() + value);\n    this.setDate(Math.min(n, this.getDaysInMonth()));\n    return this;\n};\nconst conetImapAccount = /^qtgate_test\\d\\d?@icloud.com$/i;\nconst isElectronRender = typeof process === 'object';\nconst cookieName = 'langEH';\nconst passwdCookieName = 'CoNET';\nconst EmailRegexp = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\nconst Menu = {\n    'zh': [{\n            LanguageJsonName: 'zh',\n            showName: '简体中文',\n            icon: 'flag-icon-cn'\n        },\n        {\n            LanguageJsonName: 'en',\n            showName: '英文/English',\n            icon: 'flag-icon-gb'\n        },\n        {\n            LanguageJsonName: 'ja',\n            showName: '日文/日本語',\n            icon: 'flag-icon-jp'\n        }, {\n            LanguageJsonName: 'tw',\n            showName: '繁体字中文/正體字中文',\n            icon: 'flag-icon-tw'\n        }],\n    'ja': [{\n            LanguageJsonName: 'ja',\n            showName: '日本語',\n            icon: 'flag-icon-jp'\n        },\n        {\n            LanguageJsonName: 'en',\n            showName: '英語/English',\n            icon: 'flag-icon-gb'\n        },\n        {\n            LanguageJsonName: 'zh',\n            showName: '簡体字中国語/简体中文',\n            icon: 'flag-icon-cn'\n        }, {\n            LanguageJsonName: 'tw',\n            showName: '繁体字中国語/正體字中文',\n            icon: 'flag-icon-tw'\n        }],\n    'en': [{\n            LanguageJsonName: 'en',\n            showName: 'English',\n            icon: 'flag-icon-gb'\n        },\n        {\n            LanguageJsonName: 'ja',\n            showName: 'Japanese/日本語',\n            icon: 'flag-icon-jp'\n        },\n        {\n            LanguageJsonName: 'zh',\n            showName: 'Simplified Chinese/简体中文',\n            icon: 'flag-icon-cn'\n        },\n        {\n            LanguageJsonName: 'tw',\n            showName: 'Traditional Chinese/正體字中文',\n            icon: 'flag-icon-tw'\n        }],\n    'tw': [\n        {\n            LanguageJsonName: 'tw',\n            showName: '正體字中文',\n            icon: 'flag-icon-tw'\n        }, {\n            LanguageJsonName: 'en',\n            showName: '英文/English',\n            icon: 'flag-icon-gb'\n        },\n        {\n            LanguageJsonName: 'ja',\n            showName: '日文/日本語',\n            icon: 'flag-icon-jp'\n        },\n        {\n            LanguageJsonName: 'zh',\n            showName: '簡體字中文/简体中文',\n            icon: 'flag-icon-cn'\n        }\n    ]\n};\nvar lang;\n(function (lang) {\n    lang[lang[\"zh\"] = 0] = \"zh\";\n    lang[lang[\"ja\"] = 1] = \"ja\";\n    lang[lang[\"en\"] = 2] = \"en\";\n    lang[lang[\"tw\"] = 3] = \"tw\";\n})(lang || (lang = {}));\nconst initLanguageCookie = function () {\n    var cc = $.cookie(cookieName);\n    if (!cc) {\n        cc = window.navigator.language;\n    }\n    if (!cc)\n        cc = 'en';\n    cc = cc.substr(0, 2).toLocaleLowerCase();\n    switch (cc) {\n        case 'zh':\n            break;\n        case 'en':\n            break;\n        case 'ja':\n            break;\n        case 'tw':\n            break;\n        default:\n            cc = 'en';\n    }\n    $.cookie(\"langEH\", cc, { expires: 180, path: '/' });\n    $(\"html\").trigger('languageMenu', cc);\n    return cc;\n};\nconst DayTime = 1000 * 60 * 60 * 24;\nconst monthTime = 30 * DayTime;\nconst yearTime = 12 * monthTime;\nconst getPlanPrice = function (plan, isAnnualPlan) {\n    const _plan = planArray[planArray.findIndex(function (n) {\n        return n.name === plan;\n    })];\n    if (!_plan) {\n        return null;\n    }\n    return isAnnualPlan ? _plan.annually : _plan.monthlyPay;\n};\nconst planArray = [\n    {\n        name: 'free',\n        showName: ['免费用户', '無料ユーザー', 'FREE USER', '免費用戶'],\n        monthlyPay: 0,\n        annually: 0,\n        annuallyMonth: 0,\n        next: 'p1',\n        share: 0,\n        internet: 0,\n        tail: ko.observable(false),\n        multi_gateway: 0,\n        showNote: false,\n        showButton: ko.observable(false),\n        features: [{\n                title: ['代理区域', 'エリア', 'Region', '代理區域'],\n                detail: ['欧洲2区域', 'ヨーロッパ 2 エリア', '2 regions in Europe', '歐洲2區域'],\n            }, {\n                title: ['服务器', 'サーバー', 'Server', '伺服器'],\n                detail: ['共享', '共有', 'Share', '共享'],\n            }, {\n                title: ['月流量限制', '月データ制限', 'Bandwidth', '月流量限制'],\n                detail: ['无限制', '無制限', 'Unlimited', '無限制'],\n            }, {\n                title: ['多代理', 'マルチプロクシ', 'Multi-Gateway', '多代理'],\n                detail: ['1', '1', '1', '1'],\n            }, {\n                title: ['客户端数', '端末数', 'Devices', '客戶端數'],\n                detail: ['无限制', '無制限', 'Unlimited', '無限制'],\n            }]\n    }, {\n        name: 'p1',\n        showName: ['普通用户', '普通ユーザー', 'NORMAL USER', '普通用戶'],\n        monthlyPay: 688,\n        annually: 5988,\n        annuallyMonth: 499,\n        next: 'p2',\n        share: 0,\n        internet: 0,\n        tail: ko.observable(false),\n        multi_gateway: 0,\n        showNote: false,\n        showButton: ko.observable(false),\n        features: [{\n                title: ['代理区域', 'エリア', 'Region', '代理區域'],\n                detail: ['全球16区域', 'グローバル16区域', '16 regions worldwide ', '全球16區域'],\n            }, {\n                title: ['服务器', 'サーバー', 'Server', '伺服器'],\n                detail: ['共享', '共有', 'Share', '共享'],\n            }, {\n                title: ['月流量限制', '月データ制限', 'Bandwidth', '月流量限制'],\n                detail: ['无限制', '無制限', 'Unlimited', '無限制'],\n            }, {\n                title: ['多代理', 'マルチプロクシ', 'Multi-Gateway', '多代理'],\n                detail: ['2', '2', '2', '2'],\n            }, {\n                title: ['客户端数', '端末数', 'Devices', '客戶端數'],\n                detail: ['无限制', '無制限', 'Unlimited', '無限制'],\n            }]\n    }, {\n        name: 'p2',\n        showName: ['超级用户', 'スーパーユーザー', 'POWER USER', '超級用戶'],\n        monthlyPay: 1988,\n        annually: 19999,\n        annuallyMonth: 1667,\n        share: 0,\n        internet: 0,\n        multi_gateway: 0,\n        showNote: false,\n        tail: ko.observable(false),\n        showButton: ko.observable(false),\n        features: [{\n                title: ['代理区域', 'エリア', 'Region', '代理區域'],\n                detail: ['全球16区域', 'グローバル16区域', '16 regions worldwide ', '全球16區域'],\n            }, {\n                title: ['服务器', 'サーバー', 'Server', '伺服器'],\n                detail: ['独占', '独占', 'Dedicated', '獨占'],\n            }, {\n                title: ['月流量限制', '月データ制限', 'Bandwidth', '月流量限制'],\n                detail: ['无限制', '無制限', 'Unlimited', '無限制'],\n            }, {\n                title: ['多代理', 'マルチプロクシ', 'Multi-Gateway', '多代理'],\n                detail: ['4', '4', '4', '4'],\n            }, {\n                title: ['客户端数', '端末数', 'Devices', '客戶端數'],\n                detail: ['无限制', '無制限', 'Unlimited', '無限制'],\n            }]\n    }\n];\nconst nextExpirDate = function (expire) {\n    const now = new Date();\n    const _expire = new Date(expire);\n    _expire.setHours(0, 0, 0, 0);\n    if (now.getTime() > _expire.getTime()) {\n        return _expire;\n    }\n    const nextExpirDate = new Date(expire);\n    nextExpirDate.setMonth(now.getMonth());\n    nextExpirDate.setFullYear(now.getFullYear());\n    if (nextExpirDate.getTime() < now.getTime()) {\n        nextExpirDate.setMonth(now.getMonth() + 1);\n        return nextExpirDate;\n    }\n    return _expire;\n};\nconst getRemainingMonth = function (expire) {\n    const _expire = new Date(expire);\n    const _nextExpirDate = nextExpirDate(expire);\n    return _expire.getFullYear() === _nextExpirDate.getFullYear() ? _expire.getMonth() - _nextExpirDate.getMonth() : (12 - _nextExpirDate.getMonth() + _expire.getMonth());\n};\nconst getPassedMonth = function (start) {\n    const startDate = new Date(start);\n    const now = new Date();\n    const passwdYear = now.getFullYear() - startDate.getFullYear();\n    const nowMonth = now.getMonth();\n    const startMonth = startDate.getMonth();\n    const startDay = startDate.getDate();\n    const nowDay = now.getDate();\n    let ret = startMonth >= nowMonth ? 12 - startMonth + nowMonth + (passwdYear - 1) * 12 : passwdYear * 12 + nowMonth - startMonth - 1;\n    ret += startDay >= nowDay ? 0 : 1;\n    return ret;\n};\nconst getAmount = function (amount) {\n    if (!amount)\n        return null;\n    if (typeof amount === 'number') {\n        amount = amount.toString();\n    }\n    const ret = amount.split('.');\n    return ret.length === 1 ? amount + '.00' : amount;\n};\nconst getCurrentPlanCancelBalance = function (expiration, planName) {\n    const price = getPlanPrice(planName, true);\n    const normalPrice = getPlanPrice(planName, false);\n    const usedMonth = 12 - getRemainingMonth(expiration);\n    const passedCost = Math.round((price - normalPrice * usedMonth) * 100) / 100;\n    return passedCost > 0 ? passedCost : 0;\n};\nconst getExpire = function (startDate, isAnnual) {\n    const start = new Date(startDate);\n    const now = new Date();\n    const passedMonth = Math.round((now.getTime() - start.getTime()) / monthTime - 0.5);\n    isAnnual ? start.setFullYear(start.getFullYear() + 1) : start.setMonth(passedMonth + 1);\n    return start;\n};\nfunction getExpireWithMonths(month) {\n    let date = new Date();\n    return date.addMonths(month);\n}\nconst getCurrentPlanUpgradelBalance = function (expiration, planName, isAnnual) {\n    if (!isAnnual) {\n        return getPlanPrice(planName, false);\n    }\n    const price = getPlanPrice(planName, true);\n    if (!price)\n        return null;\n    const usedMonth = 12 - getRemainingMonth(expiration) + 1;\n    const passedCost = Math.round((price - price * usedMonth / 12) * 100) / 100;\n    return passedCost;\n};\nconst infoDefine = [\n    {\n        coSearch: {\n            searchInputPlaceholder: '请输入检索关键字组合或网址',\n            SearchText: '搜索',\n            totalResults: ['大约有', '条记录'],\n            moreResults: '更多结果',\n            SearchesRelated: ['', '的相关搜索'],\n            label_HTML: 'HTML代码',\n            label_picture: '图片',\n            imageSize: '图片尺寸：',\n            unSafe: ['安全浏览', '非安全浏览（非推荐）'],\n            similarImages: '外观类似的图片',\n            errorMessage: [\n                '无效请求',\n                '您的图片格式无法处理，请尝试选择其他图片',\n                '您的请求已达最大值，请稍后再试'\n            ],\n            coSearchConfigMenu: ['搜索设定', '指定检索引擎'],\n            coSearchConfigIcon: ['google', ''],\n            coSearchEngineName: ['谷歌', ''],\n            searchToolBarMenu: [\n                \"网站\", \"新闻\", \"图片\", \"视频\"\n            ],\n            timeUnit: {\n                hours: '小时前',\n                day: '天前',\n                mins: '分钟前'\n            },\n            TimeTolocalTime: function (time) {\n                return new Date(time).toLocaleDateString('zh-Hans', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });\n            }\n        },\n        youtube: {\n            startup: {\n                title: '欢迎使用Co油管',\n                detail: '在此您可以检索Youtube视频，下载并播放所选视频'\n            },\n            search: {\n                placeholder: '请输入检索关键字，或输入油管播放链接',\n                button_text: '检索',\n                error: [\n                    '您的检索无效，请重新输入。'\n                ]\n            }\n        },\n        perment: {\n            serverTitle: '服务器'\n        },\n        appsManager: {\n            mainLoading: '正在获取节点信息...',\n            nodeName: '您进入的节点名：',\n            connectAddress: '节点接入地址：',\n            serviceList: '提供服务一览',\n            welcomeTextSub: '隐私安全自由的新互联网'\n        },\n        twitter: {\n            newTwitterAccount: `请输入您的推特APP信息，如何获得和设置推特账号APP信息，请点击<a target=\"_blank\" href='https://github.com/QTGate/QTGate-Desktop-Client/wiki/Create-Twitter-APP')\">这里</a>`,\n            addAccount: '添加推特账户',\n            following: ['正在关注', '解除关注', '关注'],\n            followers: '关注者',\n            videoSizeOver: '视频超推特限制: 尺寸 < (1280x1024)，文件 < 300MB，总时间 < 140秒，请转换视频后再上传',\n            second: '秒',\n            min: '分',\n            retweeted: '已转推',\n            hour: '小时',\n            month: '月',\n            day: '日',\n            replying: '回复: ',\n            newTwitterDistroyButtonTitle: ['放弃推文', '舍弃对话串'],\n            returnEdit: '回编辑',\n            close: '关闭',\n            newTwitterTitle: ['撰写新推文', '撰写新对话串'],\n            twitterBottonTitle: ['发推', '全部发推'],\n            urlInfo: '<h3>推特客户端预览版</h3><p>用户可以无限量免费使用此客户端，免翻墙(不使用VPN，不用连结CoGate代理服务器)匿名访问(您的真实IP地址不会泄露给推特)您的推特账户。</p><p>其他设备可以输入以下网址打开此APP应用</p>',\n            accountError: '推特回送错误信息提示：您输入的APP应用设定信息有误。请检查您的推特APP信息后再试。'\n        },\n        account: {\n            title: '账户管理',\n            segmentTitle: '账户: ',\n            stripePayment: '银行网关支付',\n            promoButton: '我有促销码',\n            qtgatePayment: 'CoNET网关支付',\n            paymentProblem1: '支付遇到问题',\n            paymentProblem: '您的当前所在区域看上去银行网关被和谐，您可以使用CoNET网关支付来完成支付',\n            QTGatePayRisk: '使用CoNET安全网关支付，如果您有安全疑虑，请使用Stript安全网关支付。',\n            willPayNextExpir: '自动扣款 ',\n            openAutomatically: '打开自动扣款',\n            CancelSuccess: function (PlanExpire, isAnnual, returnAmount) {\n                return `中止订阅成功。您可以一直使用您的原订阅到${new Date(PlanExpire).toLocaleDateString()}为止。以后您将会自动成为CoNET免费用户，可以继续使用CoNET的各项免费功能。${isAnnual ? `退款金额us$${returnAmount}会在5个工作日内退还到您的支付卡。` : '下月起CoNET系统不再自动扣款。'} 祝您网络冲浪愉快。`;\n            },\n            currentPlan: '当前订阅: ',\n            cardPaymentErrorMessage: [\n                /* 0 */ '输入的信用卡号有误，或支付系统不支持您的信用卡！',\n                /* 1 */ '输入的信用卡期限有误！',\n                /* 2 */ '输入的信用卡安全码有误！',\n                /* 3 */ '输入的信用卡持有人邮编有误！',\n                /* 4 */ '支付失败，支付无法完成请稍后再试',\n                /* 5 */ '支付数据存在错误',\n                /* 6 */ '您的付款被发卡行所拒绝',\n                /* 7 */ '发生错误，请稍后再试',\n            ],\n            planPrice: '订阅原价：',\n            cancelPlanButton: '中止当前订阅',\n            needPay: '应付金额：',\n            currentPlanExpire: [\n                '订阅截止日期：',\n                '下次自动续订日',\n            ],\n            monthResetDay: '月数据重置日：',\n            monthResetDayAfter: '',\n            oldPlanBalance: '原计划剩余价值：',\n            currentAnnualPlan: ['月度订阅', '年度订阅'],\n            MonthBandwidthTitle: '月度代理服務器限额：',\n            dayBandwidthTitle: '毎日限额：',\n            upgradeTitle: '升级',\n            planExpirDate: function (year, month, day) { return `${year} 年${month}月${day}日`; },\n            accountOptionButton: '账户选项',\n            paymentProcessing: '正在通讯中...',\n            cantUpgradeMonthly: '年度计划不可降级为月度计划。请先终止您当前订阅的年度计划，再重新申请此月度订阅',\n            DowngradeTitle: '降级账户选项',\n            cancelPlan: '终止订阅计划',\n            cantCancelInformation: '您的账户如果是免费用户，CoNET测试用户，或使用优惠码产生的订阅用户，此类账户可以升级但不能被中止',\n            MonthBandwidthTitle1: '传送限额',\n            bandwidthBalance: '月度数据剩余量：',\n            serverShareData: ['共享服务器', '一台独占服务器*', '二台独占服务器*', '四台独占服务器'],\n            networkShareTitle: '代理服务器网络',\n            multiOpn: 'OPN并发多代理技术',\n            continue: '下一步',\n            paymentSuccessTitile: '謝謝您',\n            paymentSuccess: '您的订阅已经完成，祝您网络冲浪愉快。',\n            qtgateTeam: 'CoNET开发团队敬上',\n            monthlyAutoPay: function (monthCost) { return `<span>每月自动扣款</span><span class=\"usDollar\">@ us$</span><span class=\"amount\">${monthCost}</span>/月<span>`; },\n            annualPay: function (annual_monthlyCost) { return `<span>年付款每月只需</span><span class=\"usDollar\">@ us$</span><span class=\"amount\" >${annual_monthlyCost}</span>/月<span>`; },\n            monthlyPay: '月收费',\n            expirationYear: '信用卡期限',\n            payAmountTitile: '合计支付金额',\n            calcelPayment: '中止付款',\n            doPayment: '确认付款',\n            cardNumber: '信用卡号',\n            canadaCard: '*加拿大持卡人将自动加算GST(BC)5%',\n            cvcNumber: '信用卡安全码',\n            aboutCancel: '关于中止订阅',\n            postcodeTitle: '信用卡持有人邮编',\n            serverShareData1: '使用OPN并发多代理技术，同时使用数大于独占数时，会相应分享您所独占的资源',\n            internetShareData: ['共享高速带宽', '独享单线高速带宽*', '独享双线高速带宽*', '独享四线高速带宽'],\n            maxmultigateway: ['最大同时可二条并发代理数', '最大同时可使用四条并发代理数*', '最大同时可使用四条并发代理数'],\n            multiRegion: ['单一代理区域并发代理', '多代理区域混合并发代理', '多代理区域混合并发代理', '多代理区域混合并发代理'],\n            downGradeMessage: '您正在操作降级您的订阅，如果操作成功您将从下月您的订阅之日起，实行新的订阅，如果您是。',\n            cancelPlanMessage: 'CoNET的订阅是以月为基本的单位。您的月订阅将在下月您的订阅起始日前被终止，您可以继续使用您的本月订阅计划，您将自动回到免费用户。如果您是每月自动扣款，则下月将不再扣款。如果您是年度订阅计划，您的退款将按普通每月订阅费，扣除您已经使用的月份后计算的差额，将自动返还您所支付的信用卡账号，如果您是使用促销码，或您是测试用户，您的终止订阅将不能被接受。',\n            cancelPlanMessage1: function (isAnnual, amount, monthlyPay, expire, passedMonth, totalMonth) {\n                return `<span>您的订阅计划是${isAnnual ? `年度订阅，退还金额将按照您已付年订阅费 </span><span class=\"usDollar\">us$</span><span class=\"amount\">${amount / 100}</span> - 该订阅原价 <span class=\"usDollar\">us$</span><span class=\"amount\">${monthlyPay / 100}</span><span> X 已使用月数(包括本月) </span><span class=\"amount\">${passedMonth}</span> = 应该退还的金额 <span class=\"usDollar\">us$</span><span class=\"amount\">${amount - passedMonth * monthlyPay > 0 ? (amount - passedMonth * monthlyPay) / 100 : 0}</span><span>，将在7个工作日内，退还到您原来支付的信用卡账户。</span>` : `月订阅，您的订阅将下次更新日</span><span class=\"amount\">${nextExpirDate(expire).toLocaleDateString()}</span><span>时不再被自动扣款和更新。</span>`}`;\n            }\n        },\n        QTGateDonate: {\n            title: 'CoNET赞助商提供的免流量网站',\n            meta_title: '捐赠者：',\n            detail: '所有的CoNET用户，使用CoNET代理伺服器，访问赞助商赞助的网站时产生的流量，都不被计入。免费用户需注意的是，如本日或本月流量已用完，无法接入CoNET代理伺服器，则无法利用此功能'\n        },\n        QTGateInfo: {\n            title: '功能简介',\n            version: '本机版本：v',\n            detail: [{\n                    header: '隐身匿名自由上网OPN',\n                    color: '#a333c8',\n                    icon: 'exchange',\n                    detail: 'CoNET通过使用<a onclick=\"return linkClick (`https://zh.wikipedia.org/wiki/%E9%AB%98%E7%BA%A7%E5%8A%A0%E5%AF%86%E6%A0%87%E5%87%86`)\" href=\"#\" target=\"_blank\">AES256-GCM</a>和<a onclick=\"return linkClick (`https://zh.wikipedia.org/wiki/PGP`)\" href=\"#\" target=\"_blank\">OpenPGP</a>加密Email通讯，创造了OPN匿名网络通讯技术，CoNET公司首创的@OPN技术，它全程使用加密Email通讯，客户端和代理服务器彼此不用交换IP地址来实现高速通讯。iOPN通讯技术是利用普通HTTP协议下的混淆流量加密技术，能够隐藏变换您的IP地址高速通讯。二种通讯方式都能够让您，隐身和安全及不被检出的上网，保护您的隐私，具有超强对抗网络监控,网络限制和网络阻断。'\n                }, {\n                    color: '#e03997',\n                    icon: 'talk outline',\n                    header: '无IP点对点即时加密通讯服务QTChat',\n                    detail: 'CoNET用户之间通过email的点对点即时通讯服务，它具有传统即时通讯服务所不具有的，匿名无IP和用户之保持秘密通讯的功能。QTChat加密通讯服务可以传送文字，图片和视频文件信息，CoNET系统只负责传送信息，不拥有信息，也无法检查信息本身，所以CoNET不承担信息所有的法律责任。QTChat支持群即时通讯，将支持视频流直播服务。'\n                }, {\n                    color: '#6435c9',\n                    icon: 'cloud upload',\n                    header: '加密文件匿名网络云储存及分享功能QTStorage',\n                    detail: '用户通过申请多个和不同的免费email服务商账号，可以把一个文件加密拆分成多个部分，分别存储在不同的email账号下，可以保密安全和无限量的使用网络储存。用户还可以通过CoNET系统在CoNET用户之间分享秘密文件。'\n                },\n                {\n                    color: 'darkcyan',\n                    icon: 'spy',\n                    header: '阻断间谍软件向外送信功能',\n                    detail: 'CoNET系统连接全球DNSBL联盟数据库，用户通过订阅CoNET系统黑名单列表，并使用CoNET客户端上网，让潜伏在您电子设备内的间谍软件，它每时每刻收集的信息，不能够被送信到其信息收集服务器，能够最大限的保障您的个人隐私。'\n                }, {\n                    color: '#6435c9',\n                    icon: 'external share',\n                    header: '本地VPN服务器',\n                    detail: 'CoNET用户在户外时可以通过连接自己家里的VPN，来使用CoNET客户端隐身安全上网。'\n                }]\n        },\n        cover: {\n            firstTitle1: 'CoNET平台',\n            firstTitle2: '安全隐私自由的互联网',\n            start: '开门',\n            proxyStoped: 'CoGate定制代理服务器已经停止，如需使用请重新定制代理服务器。'\n        },\n        firstNote: {\n            title: '欢迎使用CoNET，感谢您使用我们的产品和服务(下称“服务”)。本服务由总部设在加拿大的CoNET技术有限公司.下称“CoNET”提供。',\n            firstPart: '您使用我们的服务即表示您已同意本条款。请仔细阅读。使用我们的服务，您必须遵守服务中提供的所有政策。',\n            detail: [\n                {\n                    header: '关于我们的服务',\n                    detail: '请勿滥用我们的服务，举例而言: 请勿干扰我们的服务或尝试使用除我们提供的界面和指示以外的方法访问这些服务。您仅能在法律(包括适用的出口和再出口管制法律和法规)允许的范围内使用我们的服务。如果您不同意或遵守我们的条款或政策，请不要使用我们所提供的服务，或者我们在调查可疑的不当行为，我们可以暂停或终止向您提供服务。'\n                }, {\n                    header: null,\n                    detail: '使用我们的服务并不让您拥有我们的服务或您所访问的内容的任何知识产权。除非您获得相关内容所有者的许可或通过其他方式获得法律的许可，否则您不得使用服务中的任何内容。本条款并未授予您使用我们服务中所用的任何商标或标志的权利。请勿删除、隐藏或更改我们服务上显示的或随服务一同显示的任何法律声明。'\n                }, {\n                    header: '关于CoNET无IP通讯技术和隐私保护的局限性',\n                    detail: 'CoNET是世界首创的使用Email地址建造一个无IP通讯环境，在您利用CoNET进行通讯过程中，CoNET无法获得您目前所使用的IP地址，可以最大限度的保障您的个人隐私。但是这项技术并不能够保证您的信息绝对的不被泄露，因为您的IP地址有可能被记录在您所使用的Email服务供应商，如果持有加拿大法院令寻求CoNET的Log公开，再和Email服务供应商的Log合并分析，可能会最终得到您的信息。 CoNET并不能够绝对保障您的隐私。 '\n                },\n                {\n                    header: '关于个人隐私保护，系统日志和接收CoNET传送的信息',\n                    detail: '在您使用服务的过程中，我们可能会向您发送服务公告、管理消息和其他信息。您可以选择不接收上述某些信息。'\n                }, {\n                    header: null,\n                    detail: '当您使用我们的服务时，我们为了计费处理会自动收集非常有限的数据流量信息，并存储到服务器日志中。数据流量信息仅用于计算客户应支付通讯费用而收集的，它收集的数据是：日期，用户帐号，所使用的代理区域和代理服务器IP，数据包大小，下载或上传。例如：'\n                }, {\n                    header: null,\n                    detail: '<p class=\"tag info\">06/20/2017 18:12:16, info@CoNET.com, francisco, 104.236.162.139, 300322 byte up, 482776323 byte down.</p><p class=\"tag info\">06/21/2017 12:04:18, info@CoNET.com, francisco, 104.236.162.139, 1435226 byte up, 11782238 byte down.</p>'\n                },\n                {\n                    header: null,\n                    detail: 'CoNET没有保存除了以上信息以外的任何其他信息。我们会配合并向持有加拿大法院令的执法机构提供此日志文件。如果您是加拿大以外地区的执法机构，有这方面信息披露的需求，请通过加拿大外交部来联系我们：'\n                }, {\n                    header: null,\n                    detail: '<a class=\"tag alert\" href=\"http://www.international.gc.ca/\">http://www.international.gc.ca/</a>'\n                },\n                {\n                    header: '版权所有权',\n                    detail: '该软件是CoNET的智慧产权，并且受到相关版权法，国际版权保护规定和其他在版权授与国家内的相关法律的保护。该软件包含智慧产权材料, 商业秘密及其他产权相关材料。你不能也不应该尝试修改，反向工程操作，反汇编或反编译CoNET服务，也不能由CoNET服务项目创造或衍生其他作品。'\n                },\n                {\n                    header: null,\n                    detail: '关于我们服务中的软件，CoNET授予您免许可使用费、不可转让的、非独占的全球性个人许可, 允许您使用由CoNET提供的、包含在服务中的软件。本许可仅旨在让您通过本条款允许的方式使用由CoNET提供的服务并从中受益。您不得复制、修改、发布、出售或出租我们的服务, 或所含软件的任何部分。'\n                }, {\n                    header: '修改与终止服务',\n                    detail: '我们持续改变和改善所提供的服务。我们可能会新增或移除功能或特性，也可能会暂停或彻底停止某项服务。您随时都可以停止使用服务，尽管我们并不希望您会这样做。 CoNET也可能随时停止向您提供服务，或对服务附加或设定新的限制。'\n                },\n                {\n                    header: '服务的责任',\n                    detail: '在法律允许的范围内，CoNET及其供应商和分销商不承担利润损失、收入损失或数据、财务损失或间接、特殊、后果性、惩戒性或惩罚性损害赔偿责任。'\n                }, {\n                    header: '法律规定的贸易禁止事项',\n                    detail: '当您按下同意按钮，表示您已经确认您不属于加拿大法律所规定的禁止贸易对象的列表之中。 '\n                },\n                {\n                    header: '服务的商业使用',\n                    detail: '如果您代表某家企业使用我们的服务，该企业必须接受本条款。对于因使用本服务或违反本条款而导致的或与之相关的任何索赔、起诉或诉讼，包括因索赔、损失、损害赔偿、起诉、判决、诉讼费和律师费而产生的任何责任或费用，该企业应对CoNET及其关联机构、管理人员、代理机构和员工进行赔偿并使之免受损害。'\n                }, {\n                    header: '本条款的变更和约束力',\n                    detail: '关于本条款：我们可以修改上述条款或任何适用于某项服务的附加条款，例如，为反映法律的变更或我们服务的变化而进行的修改。您应当定期查阅本条款。我们会在本网页上公布这些条款的修改通知。我们会在适用的服务中公布附加条款的修改通知。所有修改的适用不具有追溯力，且会在公布十四天或更长时间后方始生效。但是，对服务新功能的特别修改或由于法律原因所作的修改将立即生效。如果您不同意服务的修改条款，应停止使用服务。如果本条款与附加条款有冲突，以附加条款为准。'\n                },\n                {\n                    header: null,\n                    detail: '本条款约束CoNET与您之间的关系，且不创设任何第三方受益权。如果您不遵守本条款，且我们未立即采取行动，并不意味我们放弃我们可能享有的任何权利（例如，在将来采取行动）。如果某一条款不能被强制执行，这不会影响其他条款的效力。加拿大BC省的法律（不包括BC州的法律冲突规则）将适用于因本条款或服务引起的或与之相关的纠纷。因本条款或服务引起的或与之相关的所有索赔，只能向加拿大BC省法院提起诉讼，且您和CoNET同意上述法院拥有属人管辖权。'\n                }\n            ],\n            disagree: '不同意',\n            agreeMent: 'CoNET服务条款和隐私权'\n        },\n        linuxUpdate: {\n            newVersionDownload: '点击这里下载并安装',\n            step1: '请更新版本：',\n            step2: '授权新版本CoNET为可执行文件',\n            step2J1: '/images/linuxUpdate1_tw.jpg',\n            step2J2: '/images/linuxUpdate2_tw.jpeg',\n            step2_detail1: '右键点击已下载的CoNET图标，选择菜单里的文件属性',\n            step2_detail2: '在权限选项里，选勾“允许档案文件执行”。',\n            step3: '退出旧版本CoNET后，双击CoNET文件执行安装',\n            exit: '退出CoNET',\n            tryAgain: '再次尝试',\n            refresh: '刷新页面'\n        },\n        imapInformation: {\n            title: '通讯专用Email邮箱设置',\n            tempImapAccount: `申请临时邮箱有困难？您可以暂时使用<a href=\"#\" style = \"margin-left: 0.5em;\" class=\"ui label teal\" onclick=\"return linkClick ('https://github.com/QTGate/QTGate-Desktop-Client/wiki/IMAP%E8%87%A8%E6%99%82%E5%B8%B3%E6%88%B6')\">CoNET提供的临时IMAP帐号供各位测试使用</a>`,\n            infomation: `请设置CoNET通讯专用Email邮箱信息。由于此账户的用户名和密码信息会提交给CoNET系统，为了防止您的个人信息被泄漏，请新申请一个临时Email账户。目前CoNET技术对应<a href=\"#\" class=\"ui label teal small\" onclick=\"return linkClick ('https://www.icloud.com/')\">苹果iCloud</a><a href=\"#\" class=\"ui label teal small\" onclick=\"return linkClick ('https://www.microsoft.com/zh-tw/outlook-com/')\">微软OUTLOOK</a><a class=\"ui label teal small\" href=\"#\" onclick=\"return linkClick ('https://www.zoho.com/mail/')\">俄罗斯ZOHO邮箱</a><a href=\"#\" class=\"ui label teal small\" onclick=\"return linkClick ('https://www.gmx.com/mail/#.1559516-header-nav1-2')\">美国在线GMX邮箱</a>，CoNET强力推荐使用苹果公司的Email可以达到最佳速度。密码请使用Email服务商的<a href=\"#\" onclick=\"return linkClick ('https://tw.help.yahoo.com/kb/SLN15241.html')\">应用密码</a>。对于Email供应商在应用密码申请时，须<a href=\"#\" onclick=\"return linkClick ('https://tw.help.yahoo.com/kb/%E9%96%8B%E5%95%9F%E5%85%A9%E6%AD%A5%E9%A9%9F%E9%A9%97%E8%AD%89-sln5013.html')\" >二步认证</a>并提供手机号码接受验证码，为保护您的隐私，建议使用免费在线代理接收验证码服务。( 如<a href=\"#\" onclick=\"return linkClick('http://receive-sms-online.com/')\">receive-sms-online.com</a>, <a href=\"#\" onclick=\"return linkClick('https://sms-online.co/receive-free-sms')\" >sms-online.co</a>, <a href=\"#\" onclick=\"return linkClick('https://receive-a-sms.com/')\" >receive-a-sms.com</a> ) 更多请 <a href=\"#\" onclick=\"return linkClick ('http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=%E5%85%8D%E8%B4%20%B9%E5%9C%A8%E7%BA%BF%E6%8E%A5%E6%94%B6%E6%89%8B%E6%9C%BA%E9%AA%8C%E8%AF%81%20%E7%A0%81&rsv_pq=e94f47a50001f66f&rsv_t=b03ePiy3rHH0T4FVoWB8Hx9vrVdZLzVhhErWOo4xdBpjDw%2BtGri%2BViTaVAw&rqlang=cn&rsv_enter=1&rsv_sug3=42&rsv_sug1=5&rsv_sug7=100')\">百度查找</a>，<a href=\"#\" onclick=\"return linkClick ('https://www.google.com/search?q=%E5%85%8D%E8%B4%B9%E5%9C%A8%E7%BA%BF%E6%8E%A5%E6%94%B6%E6%89%8B%E6%9C%BA%E9%AA%8C%E8%AF%81%E7%A0%81&oq=%E5%85%8D%E8%B4%B9%E5%9C%A8%E7%BA%BF%E6%8E%A5%E6%94%B6%E6%89%8B%E6%9C%BA%E9%AA%8C%E8%AF%81%E7%A0%81&aqs=chrome..69i57j69i60.254j0j4&sourceid=chrome&ie=UTF-8')\">Google查找</a>。`,\n            serverDetail: '详细设定：',\n            imapServer: 'IMAP服务器设定',\n            imapServerInput: 'IMAP服务器IP或域名',\n            UserName: '登陆用户名称',\n            Ssl: '使用Ssl加密信息传输：',\n            portName: '通讯端口号：',\n            otherPortNumber: '其他号码：',\n            Error_portNumber: '端口号应该是从1-65535之间，并且不等于22的数字',\n            smtpServer: 'SMTP服务器设定',\n            smtpServerInput: 'SMTP服务器IP或域名',\n            emailServerPassword: '邮箱密码(推荐使用应用专用密码)',\n            imapAccountConform: function (iamp, account) { return `<p class=\"ui small header brown\">警告：</p><p class=\"grey\">当您按下提交按钮时，意味着您已经确认【<B class=\"red\">${iamp}</B>】是为了使用CoNET系统而特别申请的临时邮箱，您同意承担由此带来的风险，并授权CoNET系统可以使用这个Email邮箱传输信息!</p><p class=\"grey\" >CoNET平台将会向CoNET發送包含以下信息的email：【<B class=\"red\">${iamp}</B>】及APP密碼，註冊【<B class=\"red\">${account}</B>】郵箱地址，使用語言，時區，加密公鑰。</p><p class=\"grey\">同时您也同意并授权CoNET可以向您的注册邮箱【<B class=\"red\">${account}</B>】发送CoNET有关服务，促销，账户及其他信息。</p>`; },\n            agree: '我已经了解风险，并愿意继续',\n            imapOtherCheckError: '不能连接到Email服务器，有可能您设定的服务器名称或IP，通讯端口号有误，请检查您的服务器详细设定！',\n            CertificateError: 'Email服务器提示的证书不能被系统信任！您的Email服务器有可能是一个仿冒的，您如果想继续，请在下面详细设定里选择【允许连接到不被信任证书的Email服务器】，但您的Email登陆信息有可能泄漏给此服务器！',\n            IgnoreCertificate: '允许连接到不被信任证书的Email服务器',\n            Certificat: '如果您不确定请别选择这项，这个选择是非常危险，因为它允许连接上一个仿冒的服务器，可能泄露您的用户名和密码。',\n            AuthenticationFailed: 'Email服务器提示用户名或密码错误，请仔细检查您的用户名和密码！',\n            addAEmail: '添加通讯用Email账户',\n            tryAgain: '再试一次',\n            connectImap: '连接CoNET',\n            cancelConnect: '终止CoNET连接',\n            imapItemTitle: '通讯用邮箱详细信息',\n            loaderText: ['正', '在', '和', 'C', 'o', 'N', 'E', 'T', '建', '立', '通', '讯', '管', '道', '...'],\n            imapCheckingStep: [\n                /* 0 */ '正在尝试连接email服务器',\n                /* 1 */ '邮件服务器IMAP连接成功, 正在等待CoNET对接。',\n                /* 2 */ '邮件服务器SMTP连接成功',\n                /* 3 */ 'CoNET客户端向CoNET系统发出联机请求Email。和CoNET联机需要额外的时间，请耐心等待。',\n                /* 4 */ '成功连接CoNET',\n                /* 5 */ '邮件服务器IMAP测试成功',\n                /* 6 */ '邮件服务器SMTP测试成功',\n            ],\n            imapResultTitle: 'IMAP服务器CoNET通讯评分：',\n            testSuccess: 'email服务器连接试验成功！',\n            exitEdit: '退出编辑Email帐户',\n            deleteImap: '删除IMAP账户',\n            proxyPortError: '本地代理服务器的端口设定从3001-65535之间的数字，或端口号已被其他APP所占用。请尝试填入其他号码。',\n            appPassword: '关于APP密码',\n            imapCheckError: [\n                '不能连接到邮件服务器，有可能您没有互联网，或所在网络不支持邮件IMAP通讯，请检查您的网络，或刷新页面重试一次。',\n                '邮件服务器提示用户名或密码错误，请仔细检查您的用户名和密码！ ',\n                '邮件服务器证书错误！您所在网络可能存在网络中间人攻击，请换网络环境后再尝试。 ',\n                '邮件服务器发送邮件错误，这通常是您使用的密码是普通密码所致，请换用APP密码后再次尝试',\n                '未连结互联网，请检查网络',\n                '未知错误，请退出CoNET后再试。',\n                '您的邮箱无可用空间错误，请检查邮箱删除不必要的邮件后再试。'\n            ]\n        },\n        home_index_view: {\n            newVersion: '新版本准备就绪，请安装！',\n            clickInstall: '点击安装新版本',\n            showing: '系统状态',\n            internetLable: '互联网',\n            gateWayName: '代理服务器',\n            localIpAddress: '本机',\n            nextPage: '下一页',\n            agree: '同意协议并继续',\n            emailAddress: '作为CoNET账号的Email地址',\n            systemAdministratorEmail: 'RSA密钥生成',\n            SystemAdministratorNickName: '昵称或组织名',\n            systemPassword: 'CoNET客户端密码设定',\n            creatKeyPair: '创建密钥对...',\n            imapEmailAddress: '邮箱账户名',\n            cancel: '放弃操作',\n            stopCreateKeyPair: '停止生成密钥对',\n            keyPairCancel: '生成密钥对被中止',\n            keyPairGenerateError: '生成密钥对发生系统错误，请重试！',\n            keyPairGenerateSuccess: '完成生成密钥对',\n            continueCreateKeyPair: '继续生成',\n            newVersionInstallLoading: '更新中请稍候',\n            KeypairLength: '请选择加密通讯用密钥对长度：这个数字越大，通讯越难被破解，但会增加通讯量和运算时间。',\n            GenerateKeypair: '<em>系统正在生成用于通讯和签名的RSA加密密钥对，计算机需要运行产生大量的随机数字有，可能需要几分钟时间，尤其是长度为4096的密钥对，需要特别长的时间，请耐心等待。关于RSA加密算法的机制和原理，您可以访问维基百科：' +\n                `<a href='https://zh.wikipedia.org/wiki/RSA加密演算法' target=\"_blank\" onclick=\"return linkClick ('https://zh.wikipedia.org/wiki/RSA加密演算法')\" >https://zh.wikipedia.org/wiki/RSA加密演算法</a></em>`,\n            inputEmail: '让我们来完成设定的最后几个步骤，首先生成RSA密钥对, 它是您的系统信息加密，身份认证及和CoNET网络通讯使用的重要工具。 RSA密钥对的密码请妥善保存，Email地址栏应填入您的常用邮箱地址, 它将被用作您的CoNET网络账号。 <em style=\"color:brown;\">需注意的是CoNET域名在某些网络限制地区可能被列入黑名单，请使用网络自由地区邮箱。</em>',\n            accountEmailInfo: '由于CoNET域名在某些国家和地区被防火墙屏蔽，而不能正常收发Email，如果您是处于防火墙内的用户，建议使用防火墙外部的邮件服务商。'\n        },\n        Home_keyPairInfo_view: {\n            title: '密钥信息',\n            emailNotVerifi: '您的密钥未获CoNET签署认证。',\n            emailVerified: '您的密钥已获CoNET签署认证。',\n            NickName: '昵称：',\n            creatDate: '密钥创建日期：',\n            keyLength: '密钥位强度：',\n            password: '请输入长度大于五位的密码',\n            password1: '请输入平台密码',\n            keyID: '密钥对ID：',\n            logout: '退出登录',\n            deleteKeyPairHaveLogin: '请使用登陆后的客户端来删除您的密钥',\n            deleteKeyPairInfo: '请注意：如果您没有备份您的CoNET系统的话，删除现有的密钥将使您的CoNET设定全部丢失，您有可能需要重新设置您的CoNET系统。如果您的注册Email没有变化，您的CoNET账户支付信息不会丢失！',\n            delete: '削除',\n            locked: '请提供您的RSA密钥以解开密钥后才能继续操作，如果您遗忘了密码，请删除此RSA密钥。',\n            systemError: '发生系统错误。如果重复发生，请删除您的密钥，再次设定您的系统！'\n        },\n        error_message: {\n            title: '错误',\n            errorNotifyTitle: '系统错误',\n            EmailAddress: ['请按以下格式输入你的电子邮件地址: someone@example.com.', '您已有相同的Email账户', '此类Email服务器CoNET暂时技术不支持。'],\n            required: '请填写此字段',\n            doCancel: '终止完成',\n            PasswordLengthError: '密码必须设定为5个字符以上。',\n            localServerError: '本地服务器错误，请重新启动CoNET！',\n            finishedKeyPair: '密钥对创建完成！',\n            errorKeyPair: '密钥对创建发生错误，请重试',\n            Success: '完成',\n            SystemPasswordError: '密钥对密码错误，请重试！如果您已忘记您的密钥对密码，请删除现有的密钥对，重新生成新的密钥对。但您的原有设定将全部丢失！',\n            finishedDeleteKeyPair: '密钥对完成删除!',\n            offlineError: '您的电脑未连接到互联网，请检查网络后再次尝试！',\n            imapErrorMessage: [\n                /* 0 */ '未能链接CoNET网络。 CoNET网络可能存在问题，请稍后再次尝试。或联系CoNET服务。 ',\n                /* 1 */ '数据格式错误，请重试',\n                /* 2 */ '您的电脑未连接到互联网，请检查网络后再次尝试！ ',\n                /* 3 */ 'Email服务器提示IMAP用户名或密码错！这个错误通常是由于您使用的密码是普通密码，或者您的APP密码已失效，请到您的Email帐户检查您的APP密码，然后再试一次。 ',\n                /* 4 */ 'Email服务器的指定连接埠连结失败，请检查您的IMAP连接埠设定，如果您在一个防火墙内部，则有可能该端口被防火墙所屏蔽，您可以尝试使用该IMAP伺服器的其他连接埠！ <a href=\"data-html\"></a>',\n                /* 5 */ '服务器证书错误！您可能正在连接到一个仿冒的Email服务器，如果您肯定这是您希望连接的服务器，请在IMAP详细设定中选择忽略证书错误。 ',\n                /* 6 */ '无法获得Email服务器域名信息，请检查您的Email服务器设定！或者您的电脑没有互联网，请检查您的互联网状态。 ',\n                /* 7 */ '此Email服务器看来可能不能使用CoNET网络通讯技术，请再测试一次或选择其他email服务供应商！ ',\n                /* 8 */ 'Email服务器提示SMTP用户名或密码错！ ',\n                /* 9 */ '服务器证书错误！您可能正在连接到一个仿冒的Email服务器，如果您肯定这是您希望连接的服务器，请在SMTP详细设定中选择忽略证书错误。 ',\n                /* 10 */ 'SMTP连结提示未知错误',\n                /* 11 */ '存在相同Email账号',\n                /* 12 */ '您的系统还未连接到CoNET网络！ ',\n                /* 13 */ '您的邮箱提示您账号已无可使用容量，请清理邮箱后再试',\n                /* 13 */ '通讯遇到未知错误，请重试。'\n            ],\n            CoNET_requestError: [\n                /* 0 */ 'CoNET无响应,正在重新建立CoNET通讯管道，请稍候。',\n                /* 1 */ '无效操作！'\n            ],\n        },\n        emailConform: {\n            activeViewTitle: '验证您的密钥',\n            info1_1: `您的密钥还未完成验证，请点击[发送验证Email]按钮，并检查您的 【`,\n            info1_2: `】 邮箱。如果存在多封CoNET的邮件时，请选择最后一封信件。请打开信件并复制邮件内容。如果您还未收到CoNET的邮件，请检查您的密钥邮箱是否准确，或者您可以删除您现有的密钥，重新生成新密钥。`,\n            info2: '请复制从“-----BEGIN PGP MESSAGE----- （开始，一直到）-----END PGP MESSAGE-----” 结束的完整内容，粘贴在此输入框中。',\n            emailTitle: '感谢您使用CoNET服务',\n            emailDetail1: '尊敬的 ',\n            emailDetail1_1: '',\n            emailDetail2: '这是您的CoNET帐号激活密码，请复制下列框内的全部内容:',\n            bottom1_1: '此致',\n            buttom1_2: 'CoNET团队',\n            conformButtom: '验 证',\n            requestReturn: ['错误！您的请求被拒绝，这可能是您在短时间内多次请求所致，请稍后再试', 'CoNET已发送激活邮件！'],\n            reSendRequest: '发送验证Email',\n            formatError: [\n                /** 0 **/ '内容格式错误，请复制从“-----BEGIN PGP MESSAGE----- （开始，一直到）-----END PGP MESSAGE-----” 结束的完整内容，粘贴在此输入框中。 ',\n                /** 1 **/ '提供的内容不能被解密，请确认这是在您收到的最后一封从CoNET发送过来的激活信。如果还是没法完成激活，请删除您的密钥重新生成和设定。 ',\n                /** 2 **/ '和CoNET连接发生错误，请退出重新尝试！ ',\n                /** 3 **/ '无效激活码！如果存在多封CoNET的邮件时，请选择最后一封信件。',\n                /** 4 **/ '您的CoNET看上去有问题, 请删除您的密钥，重新设置您的CoNET！ ',\n                /** 5 **/ '抱歉，CoNET系统无应答，可能暂时下线，请您稍后再试。',\n                /** 6 **/ '您当天的数据通讯量达到上限，请等待明天再试或升级用户类型',\n                /** 7 **/ '用来通讯的Email设定有错误，请检查IMAP设定后重试，或CoNET不支持此Email类型',\n                /** 8 **/ '您所选区域不能够连结，请稍候再试',\n                /** 9 **/ '您的IMAP邮箱发信发生错误。请退出CoNET重试。如果持续发生此故障，您的IMAP帐号有可能被锁住，需要登陆您的IMAP邮箱网站解锁操作。 ',\n                /** 10**/ '页面会话已过期，请刷新页面以继续，或退出后重新启动CoNET。',\n                /** 11**/ 'CoNET平台故障，请重新启动CoNET。'\n            ],\n            activeing: '正在通讯中'\n        },\n        QTGateRegion: {\n            title: '高品质定制代理服务器区域',\n            speedTest: '代理服务器速度测试：',\n            error: [],\n            CoGateRegionStoped: '所订制的代理服务器已经被停止，如需使用请再次订制.',\n            pingError: '代理服务区域速度检测发生错误，请退出CoNET，以管理员身份再次打开CoNET后，再执行速度检测！',\n            connectQTGate: '正在获得代理服务器区域信息...',\n            available: '服务中',\n            unavailable: '准备中',\n            requestPortNumber: '指定代理服务器通讯端口',\n            proxyDomain: '域名解释全程使用CoNET代理服务器端',\n            setupCardTitle: '使用连接技术:',\n            paidUse: '本区域只对收费用户开放',\n            MultipleGateway: '同时并发使用代理数',\n            dataTransfer: '数据通讯：',\n            dataTransfer_datail: ['全程使用代理服务器', '当不能到达目标时使用代理'],\n            proxyDataCache: '浏览数据本地缓存:',\n            proxyDataCache_detail: ['本地緩存', '不緩存'],\n            cacheDatePlaceholder: '缓存失效时间',\n            clearCache: '立即清除所有缓存',\n            localPort: '本地代理服务器端口号:',\n            localPath: '本地代理服务器HTTP链接路径',\n            outDoormode: '接受外網訪問',\n            GlobalIp: '本机互联网IP地址:',\n            option: '高级设置',\n            WebRTCleak: '阻止WebRTC漏洞',\n            WebRTCleakInfo: '本设置后，浏览器的即时会话，端对点通讯等将不再工作。',\n            QTGateRegionERROR: ['发送连接请求Email到CoNET发生送信错误， 请检查您的IMAP账号的设定。',\n                ''],\n            GlobalIpInfo: '注意：当您按下【CoNET连结】时您会把您的本机互联网IP提供给CoNET系统，如果您不愿意，请选择【@OPN】技术来使用CoNET服务！没有显示【@OPN】选项，目前只在旧金山区域有效，并只支持iCloud邮箱。',\n            sendConnectRequestMail: ['您的CoNET客户端没有联机CoNET网络，客户端已向CoNET系统重新发出联机请求Email。和CoNET联机需要额外的时间，请耐心等待。',\n                '当您长时间未使用CoNET时，您的连接会被中断。'],\n            cacheDatePlaceDate: [{ name: '1小时', id: 1 }, { name: '12小时', id: 12 }, { name: '1日', id: 24 }, { name: '15日', id: 360 }, { name: '1月', id: 720 }, { name: '6月', id: 4320 }, { name: '永远', id: -1 }],\n            atQTGateDetail: [\n                /*0*/ '世界首创的CoNET无IP互联网通讯技术，全程使用强加密Email通讯，客户端和代理服务器彼此不用知道IP地址，具有超强隐身和保护隐私功能，强抗干扰和超強防火墙穿透能力。缺点是有延迟，网络通讯响应受您所使用的email服务供应商的服务器影响，不适合游戏视频会话等通讯。目前该技术只支持iCloud邮箱。',\n                /*1*/ 'CoNET独创明码HTTP混淆流量加密通讯技术，能够隐藏变换您的IP地址高速通讯，隐身和保护隐私，抗干扰和超強防火墙穿透能力。缺点是需要使用您的IP来直接连结代理服务器。如果您只是需要自由访问互联网，则推荐使用本技术。',\n                /*2*/ '域名解释使用CoNET代理服务器端，可以防止域名服务器缓存污染，本选项不可修改。',\n                /*3*/ '互联网数据全程使用CoNET代理，可以匿名上网隐藏您的互联网形踪。',\n                /*4*/ '只有当您的本地网络不能够到达您希望访问的目标时，才使用CoNET代理服务器代为连结目标主机，本选项可以加速网速，但失去隐私保护。',\n                /*5*/ '通过本地缓存浏览纪录，当您再次访问目标服务器时可以增加访问速度，减少网络流量，缓存浏览纪录只针对非加密技术的HTTP浏览有效。CoNET使用强加密技术缓存浏览纪录，确保您的隐私不被泄漏。',\n                /*6*/ '不保存缓存信息。',\n                /*7*/ '设置缓存有效时间，您可以及时更新服务器数据,单位为小时。',\n                /*8*/ '本地Proxy服务器，其他手机电脑和IPad等可通过连结此端口来使用CoNET服务。请设定为3001至65535之间的数字。',\n                /*9*/ '通过设置PATH链接路径可以简单给您的Proxy服务器增加安全性，拒绝没有提供PATH的访问者使用您的Proxy服务器。',\n                /*10*/ '同时使用多条代理线路数，可以有效降低大流量集中在一个代理服务线路，降低被网络监控者发现的风险。此选项仅供收费会员使用。',\n                /*11*/ '指定同CoNET代理进行通讯使用的端口号，通过此设置可以规避您所在网段被通讯屏蔽的端口。',\n                /* 12*/ 'Web实时通讯(WebRTC)客户端浏览器之间通过IP地址直接高速通讯技术，有时被恶意泄漏您的真实IP地址。'\n            ]\n        },\n        useInfoMacOS: {\n            title: '<p>本地代理服务器已在后台运行。</p>您的其他电子设备，可通过本地代理设置，来使用CoNET连接到互联网',\n            title1: 'MacOS 本地代理服务器设定',\n            customProxy: '定制服务器生成完成：',\n            proxySetupHelp: '代理设定如需帮助，请点击以下您所使用的系统图案',\n            webRTCinfo: '阻止WebRTC漏洞，请使用SOCKS代理设置，检查是否漏洞还在，请点击<a target=\"_blank\" href=\"/Wrt\">这里</a>',\n            wrtTest: '以下为测试结果：',\n            localIpAddress: '如果能看到这个IP地址，由于是本地局域网地址泄漏，无关紧要。',\n            globalIpAddress: '如果显示这个IP，您的浏览器泄漏了您真实的IP地址',\n            proxyServerIp: '<p>代理设置选择：<span style=\"color: brown;\">自动代理设置</p>',\n            wrtTestAreaTitle: 'WebRTC漏洞数据泄漏区域',\n            proxyServerPort: 'HTTP和HTTPS代理设定：',\n            proxyServerPassword: 'SOCKS代理设定：',\n            info: [{\n                    title: '打开控制面板，点击网络',\n                    titleImage: '/images/macOsControl.jpg',\n                    detail: '',\n                    image: '/images/userInfoMacos1.jpg'\n                }, {\n                    title: '选择网络【高级...】',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/macosUserInfo2.jpg'\n                }, {\n                    title: '选择代理设定，按图示选勾左边自动代理，选勾排除简单服务器名',\n                    titleImage: '',\n                    detail: '<p>使用HTTP和HTTPS代理请按照蓝色第一行填入，使用SOCKS代理选择蓝色第二行</p>',\n                    image: '/images/macosUserInfo3.jpg'\n                }]\n        },\n        thirdParty: {\n            comesoon: '即将推出',\n            information: '欢迎来到CoNET网络',\n            app: ['Co定制代理', '酷茶', '酷存', 'Co邮件', 'Co新闻频道', '酷检索', 'Co推特', 'Co油管', '酷钱包', 'CoNET定制业务'],\n            qtgateGateway: 'CoNET提供的高质量上网技术iOPN和@OPN，在CoNET全球16个区域，当场定制您专属的代理服务器，变换您的IP地址隐身无障碍的访问互联网',\n            dimmer: [\n                '高质量量身定制代理服务器业务，让您隐身安全不受注意的网上冲浪。 ',\n                '隐身匿名去中心化不被封锁的社交媒体',\n                '安全隐私文件云存储系统',\n                '隐身匿名邮件客户端，可免翻墙访问Gmail',\n                '免翻墙隐身匿名访问世界头条新闻',\n                'QTG承接定制各类公众服务类及跨国企业私有APP业务',\n                '免翻墙匿名隐身网页检索',\n                '免翻墙匿名隐身推特客户端',\n                '免翻墙匿名隐身Youtube客户端，可下载视频',\n                'CoNET加密货币钱包和交易所'\n            ]\n        },\n        useInfoAndroid: {\n            title1: '安卓设备本地代理服务器设定',\n            info: [{\n                    title: '打开控制面板选择WiFi',\n                    titleImage: '/images/androidSetup.jpg',\n                    detail: '',\n                    image: '/images/android1.jpg'\n                }, {\n                    title: '长按当前WiFi连接名称等待菜单出现，选择菜单的修改设定',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/android2.jpg'\n                }, {\n                    title: '打开显示高级选项，在代理服务器设定(Proxy)中选择自动设置',\n                    titleImage: '',\n                    detail: '使用HTTP和HTTPS代理请按照蓝色第一行填入，使用SOCKS代理选择蓝色第二行',\n                    image: '/images/android3.jpg'\n                }]\n        },\n        firefoxUseInfo: {\n            title1: '火狐浏览器它单独设定代理服务，可以不影响系统而轻松使用代理上网',\n            info: [{\n                    title: '打开火狐，点击右上角工具图标，选择设定',\n                    titleImage: '/images/macOsControl.jpg',\n                    detail: '<p><a href=\"https://www.mozilla.org/zh-CN/firefox/#/\" target=\"_blank\">下载Firefox</a></p>',\n                    image: '/images/firefox1.jpg'\n                }, {\n                    title: '选择常规后，滚动画面至最下部，在网络代理处点击详细设定',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/firefox2.jpg'\n                }, {\n                    title: '选择自动设置，选勾域名使用SOCKS v5',\n                    titleImage: '',\n                    detail: '使用HTTP和HTTPS代理请按照蓝色第一行填入，使用SOCKS代理选择蓝色第二行',\n                    image: '/images/firefox3.jpg'\n                }]\n        },\n        useInfoiOS: {\n            title1: 'iOS设备本地代理服务器设定',\n            info: [{\n                    title: '打开控制面板，点击Wi-Fi',\n                    titleImage: '/images/macOsControl.jpg',\n                    detail: '',\n                    image: '/images/iOS1.jpg'\n                }, {\n                    title: '选择当前WiFi的圈i符号',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/iOS2.jpg'\n                }, {\n                    title: '选择底部的设置代理服务器',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/iOS3.jpg'\n                }, {\n                    title: '选择自动设置',\n                    titleImage: '',\n                    detail: '<p>在URL网址处填入：使用HTTP和HTTPS代理请按照蓝色第一行填入，使用SOCKS代理选择蓝色第二行</p>',\n                    image: '/images/iOS4.jpg'\n                }]\n        },\n        useInfoWindows: {\n            title1: 'Windows 10 代理服务器设定',\n            info: [{\n                    title: '关于Windows其他版本设定',\n                    titleImage: '',\n                    detail: '<p>Windows其他版本的代理服务器设定请参照<a href=\"#\" onclick=\"return linkClick (`https://support.microsoft.com/ja-jp/help/135982/how-to-configure-internet-explorer-to-use-a-proxy-server`)\">微软公司网站</a></p><p>请按以下参数设置本地代理服务器：</p>',\n                    image: ''\n                },\n                {\n                    title: '启动Internet Explorer',\n                    titleImage: '/images/IE10_icon.png',\n                    detail: '<p>点击右上角工具图标，滑动菜单至最下部选择【设定】</p>',\n                    image: '/images/windowsUseInfo1.jpg'\n                }, {\n                    title: '滑动菜单至最下部选择高级设定',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/windowsUseInfo2.jpg'\n                }, {\n                    title: '再次滑动菜单选择打开代理服务器设定',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/windowsUseInfo3.jpg'\n                }, {\n                    title: '选择自动设置代理服务器',\n                    titleImage: '',\n                    detail: '<p>WINDOWS10系统只对应HTTP和HTTPS，如果想使用全局代理的用户，需另外安装浏览器如火狐等，然后在火狐浏览器内单独设定Proxy全局代理SOCKS</p>',\n                    image: '/images/windowsUseInfo4.jpg'\n                }]\n        },\n        QTGateGateway: {\n            title: 'CoNET服务使用详细',\n            processing: '正在尝试连接CoNET网络...',\n            error: [\n                /* 0 */ '错误：您的账号下已经有一个正在使用CoNET代理服务器的连接，请先把它断开后再尝试连接。',\n                /* 1 */ '错误：您的账号已经无可使用流量，如果您需要继续使用CoNET代理服务器，请升级您的账户类型。如果是免费用户已经使用当天100M流量，请等待到明天继续使用，如您是免费用户已经用完当月1G流量，请等待到下月继续使用。',\n                /* 2 */ '错误：数据错误，请退出并重新启动CoNET！',\n                /* 3 */ '非常抱歉，您请求的代理区域无资源，请选择其他区域或稍后再试',\n                /* 4 */ '对不起，您所请求连接的区域不支持这样的连接技术，请换其他连接方法或选择其他区域连接',\n                /* 5 */ '@OPN链接技术不支持公用iCloud邮箱，请撤换通讯用IMAP邮箱，换您自有的iCloud邮箱。'\n            ],\n            connected: '已连接。',\n            promo: '促销活动',\n            upgrade: '升级账号',\n            accountManager: '账户管理',\n            userType: ['免费用户', '付费用户'],\n            datatransferToday: '日流量限额：',\n            datatransferMonth: '月流量限额：',\n            todaysDatatransfer: '本日可使用流量',\n            monthDatatransfer: '本月可使用流量',\n            gatewayInfo: ['代理服务器IP地址：', '代理服务器连接端口：'],\n            userInfoButton: '使用指南',\n            stopGatewayButton: '停止所定制的服务器',\n            disconnecting: '正在销毁中...'\n        },\n        topWindow: {\n            title: '庆祝加拿大150周年特别提供'\n        },\n        feedBack: {\n            title: '使用信息反馈',\n            additional: '添附附加信息',\n            okTitle: '发送至CoNET'\n        },\n        qtGateView: {\n            title: '发送定制代理请求',\n            mainImapAccount: 'CoNET通讯用邮箱',\n            QTGateConnectStatus: 'CoNET连接状态',\n            QTGateConnectResultWaiting: '已向CoNET发送连接请求Email。由于是首次连接CoNET网络，系统需要几分钟时间来完成与您的对接，请耐心等待。',\n            QTGateDisconnectInfo: 'CoNET连结已断开。请选择向CoNET发送请求对接Email的IMAP帐号：',\n            QTGateConnectError: ['发送连接请求Email错误，请检查IMAP邮件帐户的SMTP设定！'],\n            QTGateConnectResult: ['CoNET未联机，请点击连接CoNET！', '正在和CoNET联中', '已经连接CoNET', '连接CoNET时发生错误，请修改IMAP账号设定', '已经连接CoNET'],\n            QTGateSign: ['您的密钥状态', '还未获得CoNET信任签署,点击完成信任签署',\n                '密钥获得CoNET信任签署是CoNET一个重要步骤，您今后在CoNET用户之间分享文件或传送秘密信息时，CoNET可以证明是您本人而非其他冒充者。你也可以通过您的密钥签署信任给其他CoNET用户，用以区别您自己的信任用户和非信任用户。',\n                '正在获得CoNET信任签署中', '系统错误，请重启CoNET后再试，如果仍然存在，请尝试重新安装CoNET。', 'CoNET系统错误!']\n        }\n    }, {\n        coSearch: {\n            searchInputPlaceholder: 'サーチキーワードまたはウェーブアドレス',\n            SearchText: '検索',\n            totalResults: ['約', '件'],\n            moreResults: '結果をさらに表示',\n            SearchesRelated: ['', 'に関連する検索キーワード'],\n            label_HTML: 'HTMLコード',\n            label_picture: 'イメージ',\n            imageSize: 'イメージサイズ:',\n            unSafe: ['安全浏览', '非安全浏览（非推荐）'],\n            similarImages: '類似の画像',\n            errorMessage: [\n                '無効なレクエスト',\n                '選択された画像は処理ができません、ほかの画像をしてください',\n                'レクエスト回数は制限にかかった、後ほど改めてお試しください'\n            ],\n            coSearchConfigMenu: ['検索の設定', '使用する検索エンジン'],\n            coSearchConfigIcon: ['google', ''],\n            coSearchEngineName: ['Google', ''],\n            searchToolBarMenu: [\n                \"ウェイブ\", \"ニュース\", \"画像\", \"ビデオ\"\n            ],\n            timeUnit: {\n                hours: '時間前',\n                day: '天前',\n                mins: '分前'\n            },\n            TimeTolocalTime: function (time) {\n                return new Date(time).toLocaleDateString('ja', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });\n            }\n        },\n        appsManager: {\n            mainLoading: 'ノードのサービスを取得中...',\n            nodeName: 'ノードの名前：',\n            connectAddress: 'ノードに接続アドレス：',\n            serviceList: 'サービス一覧',\n            welcomeTextSub: 'プライバシー、セキュリティー、自由な新なインターネット'\n        },\n        youtube: {\n            startup: {\n                title: 'Co for Youtubeへようこそ',\n                detail: 'Youtubeビデオを検束し、ダウンロード又はプレーをします。'\n            },\n            search: {\n                placeholder: 'Youtubeを検束し、又はプレーUrlを入力',\n                button_text: '検束',\n                error: [\n                    '検束にエラーが発生しました、もう一回検束をしてみてください'\n                ]\n            }\n        },\n        perment: {\n            serverTitle: 'サーバー'\n        },\n        twitter: {\n            newTwitterAccount: `TwitterのAPPインフォーメーションを入力してください。APPインフォーメーション作成する事がわからない場合は<a target=\"_blank\" href='https://github.com/QTGate/QTGate-Desktop-Client/wiki/Create-Twitter-APP'\">ここ</a>をクリックしてください。`,\n            addAccount: 'Twitterアカウントを追加',\n            following: ['フォロー中', 'フォローを解除', 'フォロー'],\n            followers: 'フォロワー',\n            second: '秒',\n            videoSizeOver: `ビデオがTwitter規格: 140秒、300MB、(1280x1024)を超えています`,\n            month: '月',\n            day: '日',\n            min: '分',\n            hour: '時間',\n            replying: '返信先: ',\n            retweeted: 'さんがリツイート',\n            close: '閉じる',\n            newTwitterTitle: ['ツイートする', '新しいスレッドを作成'],\n            returnEdit: '中止破棄',\n            newTwitterDistroyButtonTitle: ['ツイートを破棄', 'スレッドを破棄'],\n            twitterBottonTitle: ['ツイート', 'すべてツイート'],\n            urlInfo: '<h3>CoNETからのツイートクライアントのプレビュー版</h3><p>VPNやゲートウェイなど経由しなくて、ユーザはご自分のツイートアカウトにファイヤウォールを回避し安全匿名に無料無制限アクセスができます。</p><p>以下のURLを入力するとセルフォンやその他のデバイスもこちらのアプリケーションで楽しめます。</p>',\n            accountError: 'ツイートがアカンウトAPPインフォーメーションにエラーがありまして、通信を拒否されました、APPインフォーメーションをチェックしてください。'\n        },\n        thirdParty: {\n            comesoon: 'まもなく登場します。',\n            information: 'CoNETネットワークへようこそ',\n            qtgateGateway: 'CoNETご提供する高品質カスタムゲットウェイサービス、グローバルに１６区域とCoNET独自のiOPNと@OPN技術により、貴方のIPアドレスをカバーして、静かに無障害にインターネットの世界へ可能です。',\n            app: ['CoGate', 'CoChat', 'CoBox', 'CoMail', 'CoNews', 'Co検索', 'Co for', 'Co for', 'Coウォレット', 'Coカスタム'],\n            dimmer: [\n                '高品質カスタムゲットウェイサービス、自由になるインターネットの世界へ',\n                'ツイートスタイルの匿名ソーシャルメディア',\n                '匿名プライバシーファイルストレージ',\n                '匿名メール端末',\n                'グロバールニュースをチェック',\n                'CoNETに公衆及び私有ビジネスカスタム業務',\n                '匿名ウェーブサーチ端末',\n                '匿名Tweet端末',\n                '匿名Youtube端末、ビデオダウンロードをサポート',\n                '匿名ブロックチェーンウォレットとエクスチェンジ'\n            ]\n        },\n        account: {\n            paymentSuccessTitile: 'ありがとうございました。',\n            stripePayment: 'オンライン支払い',\n            promoButton: 'プロモーション入力',\n            qtgatePayment: 'CoNET経由でのお支払い',\n            QTGatePayRisk: 'CoNETセキュリティ経由でお支払いです。遠慮の場合はStripeセキュリティでのお支払いをしてください。',\n            paymentProblem1: '支払い支障がある',\n            willPayNextExpir: '引落とし日に ',\n            openAutomatically: '引落とし予約',\n            paymentProblem: 'あなた現在いる所在地ではバンク支払いがブラックされている模様です。CoNET経由でのお支払いをしてください。',\n            CancelSuccess: function (PlanExpire, isAnnual, returnAmount) {\n                return `プランキャンセルしました。${new Date(PlanExpire).toLocaleDateString()}まで、元プランのままCoNETサービスが使えます。そのあとはCoNETのフリーユーザーと戻ります。${isAnnual ? `元プラン残りus$ ${returnAmount}は５日ウォキンデイ内お支払い使ったカードに戻ります` : `プラン代自動落しは中止されます`}。これからもよろしくお願い申し上げます。`;\n            },\n            paymentSuccess: 'あなたのプランをアップグレードしました。これからもよろしくお願い申し上げます。',\n            qtgateTeam: 'CoNETチーム全員より',\n            cardPaymentErrorMessage: [\n                /* 0 */ 'ご入力したカード番号に間違いがあるか、又支払いシステムはこのタイプのカードがサポートしておりません！',\n                /* 1 */ 'ご入力したカードの期限に間違いがあります！',\n                /* 2 */ 'ご入力したカードのセキュリティコードに間違いがあります！',\n                /* 3 */ 'ご入力したカード所有者の郵便番号に間違いがあります！',\n                /* 4 */ '原因不明けど、支払いが失敗しました。後ほどもう一度してみてください。',\n                /* 5 */ 'お支払いデータに間違いがあります。',\n                /* 6 */ 'お支払いは銀行から拒否されました。',\n                /* 7 */ 'エラーが発生しました、後ほどもう一度してみてください。',\n            ],\n            title: 'アカウト管理',\n            segmentTitle: 'アカウトタ: ',\n            cancelPlanButton: 'キャンセルプラン',\n            planPrice: 'プラン価値：',\n            needPay: 'お支払い残高：',\n            currentPlanExpire: ['プラン終了日：', '次の引落とし日'],\n            cantUpgradeMonthly: '年契約は月契約に戻れないです。一回年契約を中止してから月契約をしてください。',\n            currentAnnualPlan: ['月契約', '一年契約'],\n            bandwidthBalance: '月残りデータ量：',\n            paymentProcessing: 'サーバーとの通信中...',\n            oldPlanBalance: '元プラン残り価値：',\n            currentPlan: '現在加入中のプラン: ',\n            MonthBandwidthTitle: 'ゲットウェイ月制限：',\n            monthResetDayAfter: '',\n            cantCancelInformation: 'あなたのプランはフリーユーザー、又はCoNETテストユーザーか、クーポンを使ったのためキャンセルすることはできません。',\n            monthResetDay: '月レセット日：',\n            dayBandwidthTitle: '日制限：',\n            upgradeTitle: 'アプグランド',\n            planExpirDate: function (year, month, day) { return `${year} 年${month}月${day}日`; },\n            accountOptionButton: 'アカウトオプション',\n            DowngradeTitle: 'ダウングレードオプション',\n            cancelPlan: 'キャンセルプラン',\n            networkShareTitle: 'ゲットウェイ回線',\n            MonthBandwidthTitle1: 'データ量',\n            payAmountTitile: 'お支払い金額合計',\n            cardNumber: 'クレジットカード番号',\n            multiOpn: 'OPN並列ゲットウェイ技術',\n            monthlyAutoPay: function (monthCost) { return `<span>口座振替</span><span class=\"usDollar\" >@ us$</span><span class=\"amount\" >${monthCost}</span>/月<span>`; },\n            cvcNumber: 'セキュリティコード',\n            calcelPayment: 'キャンセル',\n            doPayment: 'お支払いにします',\n            postcodeTitle: 'カード所有者郵便番号',\n            annualPay: function (annual_monthlyCost) { return `<span>年払いと月換算</span><span class=\"usDollar\">@ us$</span><span class=\"amount\" >${annual_monthlyCost}</span>/月<span>`; },\n            aboutCancel: 'プランをキャンセルについて',\n            expirationYear: 'カード期限',\n            canadaCard: '*おカード所有者はカナダ所在者とGST(BC)5.0% 自動加算されます',\n            continue: '次へ',\n            multiRegion: ['シンプルリジョーン並列ゲットウェイ', 'マルチリジョーン並列ゲットウェイ', 'マルチリジョーン並列ゲットウェイ', 'マルチリジョーン並列ゲットウェイ'],\n            serverShareData: ['シェアゲットウェイ', '一台ゲットウェイ独占*', '二台ゲットウェイ独占*', '四台ゲットウェイ独占'],\n            internetShareData: ['シェアハイスピード回線', '独占ハイスピード一回線*', '独占ハイスピード二回線*', '独占ハイスピード四回線'],\n            monthlyPay: 'プラン月額利用料',\n            serverShareData1: '並列ゲットウェイ技術を使う際に、同時使う数が独占数を超える場合には、独占リソースを他人と割合にチェアする場合もあります。',\n            maxmultigateway: ['最大二つ並列ゲットウェイ', '最大四つ並列ゲットウェイ*', '最大四つ並列ゲットウェイ'],\n            cancelPlanMessage: 'CoNETプランは月毎に計算し、来月のあなたの最初加入した日まで、今のプランのままご利用ですます。キャンセルした日から自動的にCoNETの無料ユーザーになります。おアカウトは(月)払いの場合は、来月の自動払いは中止となります。年払いの場合は、ご使った分に月普通料金と計算し控除してから、お支払いを使ったクレジットカードに戻ります。販促コードまたはテストユーザーにはキャンセルすることができません。',\n            cancelPlanMessage1: function (isAnnual, amount, monthlyPay, expire, passedMonth, totalMonth) {\n                return `<span>あなたのプランは${isAnnual ? `一年契約です。キャンセルをした場合は、ご利用して頂いた月に普通料金と請求を計算されます。お返し金額は，お支払って頂いたプラン年契約料金 </span><span class=\"usDollar\">us$</span><span class=\"amount\">${amount / 100}</span><span> - そのプランの普通月料金 </span><span class=\"usDollar\">us$</span><span class=\"amount\">${monthlyPay / 100}</span><span> X ご利用して頂いた月(本月も含めて)：</span><span class=\"amount\">${passedMonth}</span><span> = 戻る金額 </span><span class=\"usDollar\">us$</span><span class=\"amount\">${amount - passedMonth * monthlyPay > 0 ? (amount - passedMonth * monthlyPay) / 100 : 0}</span><span>とまります。７日内お支払って頂いたクレジットカードへ返金とします。</span>` : `月プランです。キャンセルにすると次の更新日</span><span class=\"amount\">${nextExpirDate(expire).toLocaleDateString()}</span><span>に自動更新はしませんです。</span>`}`;\n            }\n        },\n        QTGateDonate: {\n            title: 'スポンサーが提供する無料アクセスウェブサイト',\n            meta_title: 'ドナー：',\n            detail: 'CoNETユーザーはCoNETのゲットウェイを経由で、スポンサーが提供するウェブサイトにアクセスする際、発生したアクセスデータ量はユーザアカウトに記入しません。ただしCoNETのフリーアカウトは当日または当月データの使用量がリミットになった場合、CoNETゲットウェイに接続ができないの場合はご利用もできないので、ご注意をしてください。'\n        },\n        QTGateInfo: {\n            title: '機能紹介',\n            version: 'バージョン：v',\n            detail: [{\n                    color: '#a333c8',\n                    icon: 'exchange',\n                    header: '自由匿名なインターネットへOPN',\n                    detail: '@OPNは本社の世界初のIP不要な通信技術です、<a onclick=\"return linkClick (`https://ja.wikipedia.org/wiki/Advanced_Encryption_Standard`)\" href=\"#\" target=\"_blank\">AES256-GCM</a>と<a onclick=\"return linkClick (`https://ja.wikipedia.org/wiki/Pretty_Good_Privacy`)\" href=\"#\" target=\"_blank\">OpenPGP</a>暗号化したEmailメッセージを通じたゲットウェイに接続します、iOPNは本社の独自のHTTPゲットウェイ暗号化高速通信技術です。どちらとも身を隠して誰も知らないうちにインターネットへ、プライバシー、ネットワーク監視とアクセスを制限・遮断にうまくすり抜けることができます。'\n                }, {\n                    color: '#e03997',\n                    icon: 'talk outline',\n                    header: 'IP不要な匿名プライバシーインスタントメッセージQTChat',\n                    detail: 'CoNETユーザー間の無IPペアーツーペアープライバシーインスタントメッセージです。それは伝統的なインスタントメッセージより匿名とプライバシーが可能です。又グループをして複数なユーザーの間でのインスタントメッセージもご利用いただけます。文字をはじめ、写真やビデオ映像、あらゆるファイルの暗号化転送も可能です。CoNETシステムはインスタントメッセージを各ユーザへ転送することだけですから、メッセージの内容をチェックするまたはメッセージ所有することではありませんので、メッセージそのものに法的責任は、メッセージをしたユーザーが負うです。'\n                }, {\n                    color: '#6435c9',\n                    icon: 'cloud upload',\n                    header: 'ファイルを匿名プライバシーストレージとシェアQTStroage',\n                    detail: '一つのファイルを暗号化してからスプリットし、多数のフリーメールアカンウトに保存します。無限かつ秘密プライバシーのファイルストレージ事ができます。CoNETユーザー間のファイルシェアも可能です。'\n                },\n                {\n                    color: 'darkcyan',\n                    icon: 'spy',\n                    header: 'スパイソフトウェア送信を切断',\n                    detail: 'CoNETシステムはグロバルDNSBLに加入し、スパイホストダータベースを更新しています。CoNETユーザはCoNETシステムをご利用してインターネットへアクセスした場合、あなたのデバイスに闇活動しているスパイソフト、収集したあなたの個人データの送信を切断することができます。'\n                }, {\n                    color: '#6435c9',\n                    icon: 'external share',\n                    header: 'ローカルVPNサーバ',\n                    detail: 'CoNETユーザは自宅のマシンにVPN接続により、外にいても楽々OPNで隠れたネットワークへご利用できます。'\n                }]\n        },\n        useInfoWindows: {\n            title1: 'Windows10ロカールプロキシ設定',\n            info: [{\n                    title: ' その他Windowsバージョンの設定について',\n                    titleImage: '',\n                    detail: '<p>Windowsその他バージョンの設定は<a target=\"_blank\" href=\"#\" onclick=\"return linkClick (`https://support.microsoft.com/ja-jp/help/135982/how-to-configure-internet-explorer-to-use-a-proxy-server`)\">Microsoft社のページ</a>をご参照してください。</p><p>設定する際使うデータは以下です：</p>',\n                    image: ''\n                },\n                {\n                    title: 'Internet Explorerを開く',\n                    titleImage: '/images/IE10_icon.png',\n                    detail: '<p>右上部のツールボタンをクリックして、メニューの一番下にある設定を選択してください。</p>',\n                    image: '/images/windowsUseInfo1.jpg'\n                }, {\n                    title: 'メニューを一番下にスクロールして高級設定をクリック',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/windowsUseInfo2.jpg'\n                }, {\n                    title: '再びメニューを下にスクロールして、オプンプロキシ設定をクリック',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/windowsUseInfo3.jpg'\n                }, {\n                    title: '自動プロキシをオンに',\n                    titleImage: '',\n                    detail: '<p>WINDOWS 10 システムはHTTPとHTTPSしかサポートしておりませんが、SOCKSを使うなら、他のブラウザ例えばFireFoxなどをインストールによりお使いは可能です。</p>',\n                    image: '/images/windowsUseInfo4.jpg'\n                }]\n        },\n        useInfoMacOS: {\n            title: 'ローカルプロキシサーバはバックグランドで実行しています。他のデバイスはローカルプロキシに設定による、CoNET利用してインターネットへアクセスができます。',\n            title1: 'MacOS プロキシ設定',\n            customProxy: 'サーバ作成しました',\n            proxySetupHelp: 'ヘルプなら、以下のそれぞれのOSアイコンをクリックしてください。',\n            webRTCinfo: 'WebRTC漏れ対応はSOCKSプロキシ設定をしてください。WebRTC漏れをテストするしたい場合は<a href=\"/Wrt\" target=\"_blank\">ここ</a>をクリックしてください',\n            wrtTest: 'テスト結果は以下です：',\n            wrtTestAreaTitle: 'WebRTC漏れデーターエリア',\n            globalIpAddress: 'このIPアドレスが提示したら、あなたの真実IPがWebRTC漏れてしまいます。',\n            localIpAddress: 'ここのIPはローカルネットワークIPアドレス漏れです、大したことはないです。',\n            proxyServerIp: '<p>プロキシの設定に：<span style=\"color:red;\">自動設置</span></p>',\n            proxyServerPort: 'HTTPとHTTPSプロキシは：',\n            proxyServerPassword: 'SOCKSプロキシは：',\n            info: [{\n                    title: 'コントロールパネルを開いて、ネットワークをクリックしてください。',\n                    titleImage: '/images/macOsControl.jpg',\n                    detail: '',\n                    image: '/images/userInfoMacos1.jpg'\n                }, {\n                    title: '詳細...をクリックしてください ',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/macosUserInfo2.jpg'\n                }, {\n                    title: 'プロキシ設定を選んで、自動設置をチェック、簡単ホストをチェック',\n                    titleImage: '',\n                    detail: '<p>右の入力にHTTPとHTTPSは上のブルー行を、SOCKSは下の行を入力してください。</p>',\n                    image: '/images/macosUserInfo3.jpg'\n                }]\n        },\n        firefoxUseInfo: {\n            title1: 'Firefoxブラウザーは単独プロキシ設定で、システムに影響なしでプロキシをご利用してインタネットアクセスができます。',\n            info: [{\n                    title: 'Firefoxをオプンしてツールアイコンをクリックして、設置を選んでください。',\n                    titleImage: '/images/macOsControl.jpg',\n                    detail: '<p><a href=\"https://www.mozilla.org/ja/firefox/#\" target=\"_blank\">Firefoxダウンロード</a></p>',\n                    image: '/images/firefox1.jpg'\n                }, {\n                    title: '一番下にスクロールしてプロキシネットワークに、詳細設定を選択します',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/firefox2.jpg'\n                }, {\n                    title: '自動設定を選んで、ドメインをSOCKS v5を選んで',\n                    titleImage: '',\n                    detail: 'HTTPとHTTPSは上のブルー行を、SOCKSは下の行を入力してください。',\n                    image: '/images/firefox3.jpg'\n                }]\n        },\n        useInfoAndroid: {\n            title1: 'Androidロカールプロキシ設定',\n            info: [{\n                    title: `端末の設定アプリを開きます。[Wi-Fi]をタップします`,\n                    titleImage: '/images/androidSetup.jpg',\n                    detail: '',\n                    image: '/images/android1.jpg'\n                }, {\n                    title: 'Wi-Fiネットワーク名を押し続けます。[ネットワークを変更]をタップします',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/android2.jpg'\n                }, {\n                    title: '[詳細設定項目]の横にある下矢印をタップして、自動設定を選択します',\n                    titleImage: '',\n                    detail: 'HTTPとHTTPSは上のブルー行を、SOCKSは下の行を入力してください。',\n                    image: '/images/android3.jpg'\n                }]\n        },\n        useInfoiOS: {\n            title1: 'iOSロカールプロキシ設定',\n            info: [{\n                    title: 'コントロールパネルを開いて、WiFiをタップしてください',\n                    titleImage: '/images/macOsControl.jpg',\n                    detail: '',\n                    image: '/images/iOS1.jpg'\n                }, {\n                    title: 'Wi-Fiネットワーク名の右にあるまるiアイコンをタップしてください',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/iOS2.jpg'\n                }, {\n                    title: '一番下のプロキシ設定をタップしてください',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/iOS3.jpg'\n                }, {\n                    title: '自動設定を選択。',\n                    titleImage: '',\n                    detail: '<p>URLにHTTPとHTTPSは上のブルー行を、SOCKSは下の行を入力してください。</p>',\n                    image: '/images/iOS4.jpg'\n                }]\n        },\n        cover: {\n            firstTitle1: 'CoNETプラットフォーム',\n            firstTitle2: '隠れて安全自由なネットワークへ',\n            start: 'オプンドア',\n            proxyStoped: 'カスタマーゲートウェイサーバーが停止しました、再作成をしてください。'\n        },\n        firstNote: {\n            title: 'CoNETの製品およびサービス（以下「本サービス」）をご利用いただきありがとうございます。本サービスはカナダCoNETテクノロジ株式会社（以下はCoNETと言い）が提供しています。',\n            firstPart: 'ユーザーは、本サービスを利用することにより、本規約に同意することになります。以下を注意してお読みください。',\n            detail: [\n                {\n                    header: '本サービスのご利用について',\n                    detail: '本サービス内で入手できるすべてのポリシーを遵守してください。本サービスを不正に利用しないでください。たとえば、本サービスの妨害や、CoNETが提供するインターフェースおよび手順以外の方法による、本サービスへのアクセスを試みてはなりません。'\n                }, {\n                    header: null,\n                    detail: 'ユーザーは、法律（輸出、再輸出に関して適用される法規制を含みます）で認められている場合に限り、本サービスを利用することができます。ユーザーがCoNETの規約やポリシーを遵守しない場合、またはCoNETが不正行為と疑う行為について調査を行う場合に、CoNETはユーザーに対する本サービスの提供を一時停止または停止することができます。'\n                }, {\n                    header: '無IP通信技術CoNETネットワークはプライベートに限界があります',\n                    detail: '無IP通信は弊社の革新的技術であります。あなたはCoNET端末ソフトを使ってCoNETシステムとのコミニュケーションはお客さんが無IPでプライベートな通信を行います。でもお客さんのIPアドレスはeメールプロバイダーのログに記録していたかもしれません。裁判所命令を持つカナダの法執行機関はCoNETのログを得て、eメールプロバイダーのログと合併して、お客さんのプライベートインフォメーションを入手することも可能です。'\n                },\n                {\n                    header: null,\n                    detail: 'ユーザーは、本サービスを利用することによって、本サービスまたはアクセスするコンテンツに対するいかなる知的財産権も取得することはありません。ユーザーは、本サービスのコンテンツの所有者から許可を得た場合や、法律によって認められる場合を除き、そのコンテンツを利用することはできません。本規約は、本サービスで使用されている、いかなるブランドまたはロゴを利用する権利もユーザーに与えるものではありません。本サービス内に表示される、または、本サービスに伴って表示されるいかなる法的通知も、削除したり、隠したり、改ざんしてはなりません。'\n                },\n                {\n                    header: '個人情報保護及びCoNETからのインフォーメーションの受信について',\n                    detail: '本サービスの利用に関して、CoNETはユーザーに対してサービスの告知、管理上のメッセージ、およびその他の情報を送信することができます。ユーザーは、これらの通知について、受け取らないことを選択できる場合があります。'\n                }, {\n                    header: null,\n                    detail: 'お客様がCoNETサービスをご利用になる際に、お客様のデータ通信料計算のために、ご利用データ量が自動的に収集および保存されます。限られたログは以下のようです。日付、お客様アカウント、ご利用ゲットウェーエリアとゲットウェーIPアドレス、データ量、アップ又はダウンロード。例：'\n                }, {\n                    header: null,\n                    detail: '<p class=\"tag info\">06/20/2017 18:12:16, info@CoNET.com, francisco, 104.236.162.139, 300322 byte up, 482776323 byte down.</p><p class=\"tag info\">06/21/2017 12:04:18, info@CoNET.com, francisco, 104.236.162.139, 1435226 byte up, 11782238 byte down.</p>'\n                }, {\n                    header: null,\n                    detail: 'CoNETは以上の情報以外には保存することしません。CoNETは以上の情報をカナダーの裁判所命令を持つカナダの法執行機関に協力することがありえます。カナダ以外のこのログ情報を協力する要請のあなたは、まずカナダ外務省までお問い合わせ下さい：'\n                }, {\n                    header: null,\n                    detail: '<a class=\"tag alert\" href=\"http://www.international.gc.ca/\">http://www.international.gc.ca/</a>'\n                }, {\n                    header: 'ソフトウェアの版権について',\n                    detail: 'CoNETは、本サービスの一環としてユーザーに提供するソフトウェアについて、全世界で適用され、譲渡不可で、非独占的な個人使用ライセンスを無償でユーザーに付与します。このライセンスは、CoNETが提供する本サービスを本規約により許可された方法でユーザーが使用し、その便益を享受できるようにすることを唯一の目的としています。'\n                }, {\n                    header: null,\n                    detail: 'ユーザーは、本サービスまたは本サービスに含まれるソフトウェアのどの部分も、複製、変更、配信、販売、貸与することはできず、そのソフトウェアのソース コードのリバース エンジニアリングや抽出を試みることはできません。'\n                }, {\n                    header: '本サービスの変更または終了',\n                    detail: 'CoNETは、常に本サービスの変更および改善を行っています。CoNETは、機能性や機能の追加や削除を行うことができ、本サービス全体を一時停止または終了することができます。ユーザーはいつでも本サービスの利用を終了することができます。CoNETもいつでも、ユーザーに対する本サービスの提供を停止し、または、本サービスに対する制限を追加または新規に設定することができます。'\n                }, {\n                    header: '保証および免責',\n                    detail: 'CoNETは、商業上合理的な水準の技術および注意のもとに本サービスを提供し、ユーザーに本サービスの利用を楽しんでいただくことを望んでいますが、本サービスについて約束できないことがあります。'\n                }, {\n                    header: null,\n                    detail: '本規約または追加規定に明示的に規定されている場合を除き、CoNETまたはそのサプライヤーもしくはディストリビューターのいずれも、本サービスについて具体的な保証を行いません。たとえば CoNETは、本サービス内のコンテンツ、本サービスの特定の機能、その信頼性、利用可能性、またはユーザーのニーズに応える能力について、何らの約束もしません。本サービスは「現状有姿で」提供されます。'\n                }, {\n                    header: '本サービスに対するCoNETの責任',\n                    detail: '法律で認められる場合には、CoNETならびにそのサプライヤーおよびディストリビューターは、逸失利益、逸失売上もしくはデータの紛失、金銭的損失、または間接損害、特別損害、結果損害もしくは懲罰的損害について責任を負いません。'\n                }, {\n                    header: 'カナダー法律によるサービス禁止対象者',\n                    detail: 'あなたはカナダー法律によってサービス禁止対象者ではありませんと確認していた事。'\n                },\n                {\n                    header: '事業者による本サービスの利用',\n                    detail: '本サービスを事業者のために利用する場合、その事業者は本規約に同意するものとします。かかる事業者は、CoNETとその関連会社、役員、代理店、従業員を、本サービスの利用または本規約への違反に関連または起因するあらゆる請求申し立て、訴訟、法的措置について、請求申し立て、損失、損害、訴訟、裁判、告訴から生じる法的責任および費用、弁護士費用を含め、免責および補償するものとします。'\n                }, {\n                    header: '本規約について',\n                    detail: 'CoNETは、たとえば、法律の改正または本サービスの変更を反映するために、本サービスに適用する本規約または特定の本サービスについての追加規定を修正することがあります。ユーザーは定期的に本規約をご確認ください。CoNETは、本規約の修正に関する通知をこのページに表示します。'\n                }, {\n                    header: null,\n                    detail: '追加規定の修正については、該当する本サービス内において通知を表示します。変更は、さかのぼって適用されることはなく、その変更が表示されてから 14 日以降に発効します。ただし、本サービスの新機能に対処する変更または法律上の理由に基づく変更は、直ちに発効するものとします。本サービスに関する修正された規定に同意しないユーザーは、本サービスの利用を停止してください。'\n                }, {\n                    header: null,\n                    detail: '本規約と追加規定との間に矛盾が存在する場合には、追加規定が本規約に優先します。本規約は、CoNETとユーザーとの間の関係を規定するものです。本規約は、第三者の受益権を創設するものではありません。ユーザーが本規約を遵守しない場合に、CoNETが直ちに法的措置を講じないことがあったとしても、そのことによって、CoNETが有している権利（たとえば、将来において、法的措置を講じる権利）を放棄しようとしていることを意味するものではありません。'\n                }, {\n                    header: null,\n                    detail: 'ある特定の規定が強制執行不可能であることが判明した場合であっても、そのことは他のいずれの規定にも影響を及ぼすものではありません。カナダBC州の抵触法を除き、本規約または本サービスに起因するまたは関連するいかなる紛争に関しても、カナダBC州の法律が適用されます。本規約または本サービスに起因するまたは関連するいかなる主張についても、カナダBC州内に所在する裁判所においてのみ裁判手続を取ることができるものとし、ユーザーとCoNETはその裁判所の対人管轄権に同意するものとします。'\n                }\n            ],\n            disagree: 'キャンセル',\n            agreeMent: 'CoNET利用規約とプライバシー'\n        },\n        linuxUpdate: {\n            newVersionDownload: 'クリックしてダウンロードとインストール',\n            step1: '最新バージョンにアップデート：',\n            step2: 'CoNETを実行ファイルに許可与える。',\n            step2J1: '/images/linuxUpdate1_jp.jpg',\n            step2J2: '/images/linuxUpdate2_jp.jpg',\n            step2_detail1: '右クリックダウンロードしたCoNETファイル、プロパティを選んでください。',\n            step2_detail2: 'アクセス権にポログラムとして実行可能をチェック',\n            step3: '旧バージョンCoNETを退出して、新しいCoNETバージョンをダブクリックしてインストールをします。',\n            exit: '旧CoNETを退出',\n            tryAgain: 'もう一度',\n            refresh: 'リロードページ'\n        },\n        topWindow: {\n            title: 'カナダ１５０周年特別提供'\n        },\n        imapInformation: {\n            title: '通信専用Emailアカウントを登録',\n            tempImapAccount: `IMAP設定に困るなら、<a href=\"#\" style = \"margin-left: 0.5em;\" class=\"ui label teal\" onclick=\"return linkClick ('https://github.com/QTGate/QTGate-Desktop-Client/wiki/IMAP%E9%80%9A%E4%BF%A1%E5%B0%82%E7%94%A8%E4%B8%80%E6%99%82%E7%9A%84%E3%81%AA%E3%82%A2%E3%82%AB%E3%83%B3%E3%82%A6%E3%83%88')\">CoNETご提供している一時アカンウトをテストのご利用いただけます。</a>`,\n            infomation: `CoNET通信専用emailアカンウトを設定します。このemailアカウントはあなたとCoNETお互い情報交換するのために、ユーザ名とパスワードをCoNETシステムへ提供します。個人情報漏洩の恐れ、一時的なemailアカウントを新たにつくてください。CoNET技術は只今<a href=\"#\" class=\"ui label teal small\" onclick=\"return linkClick ('https://icloud.com')\">Apple iCloud</a><a href=\"#\" class=\"ui label teal small\" onclick=\"return linkClick ('https://www.microsoft.com/ja-jp/outlook-com/')\">Outlook</a><a href=\"#\" class=\"ui label teal small\" onclick=\"return linkClick ('https://www.gmx.com/mail/#.1559516-header-nav1-2')\">GMX</a><a href=\"#\" class=\"ui label teal small\" onclick=\"return linkClick ('https://www.zoho.com/mail/')\">HOZO</a>対応しております、APPLEのiCloudを使うお勧めです。</span>メールアカウントのパスワードについて、<a href=\"#\" onclick=\"return linkClick ('https://support.microsoft.com/ja-jp/help/12409/microsoft-account-app-passwords-two-step-verification')\">アプリパスワード</a>をご利用のをお勧めです。アプリパスワードを申請する際に、<a href=\"#\" onclick=\"return linkClick ('https://support.microsoft.com/ja-jp/help/12408')\">2段階認証プロセス</a>に必要なスマートフォン番号を提示が必要な場合、個人プライバシーを守るのため、( <a href=\"#\" onclick=\"return linkClick('http://receive-sms-online.com/')\">receive-sms-online.com</a>, <a href=\"#\" onclick=\"return linkClick('https://sms-online.co/receive-free-sms')\" >sms-online.co</a>, <a href=\"#\" onclick=\"return linkClick('https://receive-a-sms.com/')\" >receive-a-sms.com</a> ) など<a href=\"#\" onclick=\"return linkClick ('http://jpnpay.com/archives/561')\">オンライン無料SMS受信サービス</a>をお勧めします。`,\n            serverDetail: '詳細設定：',\n            imapServer: 'IMAP設定',\n            imapServerInput: 'IMAPサーバー名又はIP',\n            UserName: 'ログインユーザー名',\n            Ssl: 'Ssl暗号化通信：',\n            portName: '通信ポート番号',\n            otherPortNumber: 'その他：',\n            Error_portNumber: '通信ポート番号は1から65535まで、22ではないの数字です。',\n            smtpServer: 'SMTP設定',\n            smtpServerInput: 'SMTPサーバー名又はIP',\n            emailServerPassword: 'Emailパスワード(アプリパスワードお勧め)',\n            imapAccountConform: function (iamp, account) { return `<p class=\"ui small header brown\">以下の事項をよく確認してから、送信ボタンを押してください：</p><p>このEmailアカンウト「<B class=\"red\">${iamp}</B>」はあなたがCoNETシステムを使用するのために、一時的新たに作ったEmailアカンウトです。あなたはCoNETにこのEmailアカンウトのアクセス権にすることが了承しました。</p><p>以下の内容をCoNETへ送信することを了承すること：メールアカウント「<B class=\"red\">${iamp}</B>」とAPPパスワード、メールアドレス「<B class=\"red\">${account}</B>」、使う言語、タイムゾーン、パブリックキー。</p><p>あなたはCoNETに「<B class=\"red\">${account}</B>」へCoNETに関わるシステム情報、支払い、アカンウト、販促などを送信することを了承と認可をします。</p>`; },\n            agree: '私はそのリスクが了承して続きする',\n            imapOtherCheckError: 'Emailサーバーに接続ができませんでした。Emailサーバー名又はIPアドレス又は通信ポート番号に間違いがあります、詳細設定で再チェックをしてください。',\n            CertificateError: 'Emailサーバーに提示したセキュリティ証明書は信頼できないものです。続くをしたい場合は、詳細設定の中の「セキュリティ証明書信頼でき無くとも接続をする」を選択してください。その場合はあなたのEmailインフォメーションを漏れる可能性があります。',\n            IgnoreCertificate: 'セキュリティ証明書信頼でき無くとも接続をする',\n            Certificat: '危ないこのです、この選択であなたのユーザ情報は盗聴される可能性が大きい。',\n            addAEmail: '通信用Email追加',\n            AuthenticationFailed: 'Emailサーバはログインエラーが提示しました。ユーザー名とパスワードを再チェックしてください。',\n            tryAgain: 'もう一度試しにします',\n            connectImap: 'CoNETに接続にします',\n            cancelConnect: 'CoNETとの接続を中止します',\n            imapItemTitle: '通信用Email詳細設定',\n            loaderText: ['C', 'o', 'N', 'E', 'T', 'へ', '接', '続', 'を', 'し', 'て', 'い', 'ま', 'す', '...'],\n            imapCheckingStep: [\n                /* 0 */ 'emailサーバへ接続しています。',\n                /* 1 */ 'emailサーバへIMAP接続しました、CoNETからレスポンスを待ちます。',\n                /* 2 */ 'emailサーバへSMTP接続しました',\n                /* 3 */ 'CoNETクライアントは接続要請のメールをCoNETシステムへ送信しました、接続を完了するまで時間がかかるのためしばらくお待ちおください。',\n                /* 4 */ 'CoNETへ接続しました',\n                /* 5 */ 'emailサーバへIMAP接続しました'\n            ],\n            imapResultTitle: 'IMAPサーバCoNET評価：',\n            testSuccess: 'emailサーバのテストが完了しました',\n            exitEdit: '退出編集Emailアカンウト',\n            deleteImap: 'IMAPアカウトを削除',\n            proxyPortError: 'ポート番号は3001から65535までの数字です。又指定したポートは他のアプリが使っています。番号を直してみてください。',\n            appPassword: 'APPパスワードについて',\n            imapCheckError: [\n                'Emailサーバーに接続ができませんでした。ネットワークがオフラインか、所在しているネットワークはメール通信プロトコルがサポートしておりません。ネット環境をチェンジし、ページを更新してからもう一回してみてください。',\n                'Emailサーバはログインエラーが提示しました。ユーザー名とパスワードを再チェックしてください。',\n                'Emailサーバーに提示したセキュリティ証明書は信頼できないものです。中間者攻撃があるネット環境にいるあもしれないです。ネット環境をチェンジしてもう一回してみてください。',\n                'メール送信の際にエラーが発生しました。そのようなエラーは多分パスワードをAPPパスワードではなく、普通のパースワードを使った模様です。APPパスワードをチェックしてもう一回してみてください。',\n                'ネットはインターネットに接続していない模様です。',\n                'エラーが発生しました。CoNETを一回退出してからもう一回してみてください。',\n                'メールストレージ容量が一杯です、不要なメールを削除してからもう一回してみてください。'\n            ]\n        },\n        Home_keyPairInfo_view: {\n            newVersionDownload: 'クリックしてダウンロードとインストール',\n            title: '鍵ペアインフォメーション',\n            emailNotVerifi: '鍵ペアはまだCoNETサインされていません。',\n            emailVerified: '鍵ペアはCoNETサインされました。',\n            NickName: 'ニックネーム：',\n            creatDate: '暗号鍵ペア作成日：',\n            keyLength: '暗号鍵ペアビット長さ：',\n            password: '長さ5位以上のパスワードを入力してください',\n            password1: '端末パスワード',\n            logout: 'ログアウト',\n            deleteKeyPairHaveLogin: 'ログインした端末で暗号鍵ペアを削除して下さい。',\n            keyID: '暗号鍵ID：',\n            deleteKeyPairInfo: '鍵ペアを削除することで、現在のCoNET設定は全部なくなって、一からCoNETの設定をやり直しが必要です。但しあなたのCoNETアカウトEmailアドレスは前回と同じであれば、CoNETアカウトを戻れます。',\n            delete: '削除',\n            locked: 'まず鍵ペアのパスワードを入力して、鍵ペアのロックを解除してください。',\n            systemError: 'システムエラーが発生しました。鍵ペアを削除して一からシステムを再設定をしてください。'\n        },\n        home_index_view: {\n            newVersion: '新たなパージョンが用意しましたのでインストールをください。',\n            newVersionInstallLoading: '更新中お待ちください',\n            localIpAddress: 'ローカル',\n            clickInstall: 'インストール',\n            internetLable: 'Internet',\n            gateWayName: 'ゲットウェー',\n            showing: 'システム状態',\n            nextPage: '次へ',\n            agree: '協議を合意し、次へ',\n            imapEmailAddress: 'Emailアカウト名',\n            emailAddress: 'CoNETアカウトのEmailアドレス(必須), ',\n            SystemAdministratorNickName: 'ニックネーム(必須)',\n            creatKeyPair: '暗号鍵ペアを生成...',\n            keyPairCancel: '暗号鍵ペアの生成をキャンセルしました',\n            keyPairGenerateError: '暗号鍵ペアの生成にエラーが発生しました、後ほどもう一回してみて下さい',\n            keyPairGenerateSuccess: '暗号鍵ペアの生成は完了しました',\n            systemPassword: 'CoNET端末パスワードの設定',\n            stopCreateKeyPair: '暗号鍵ペア生成をキャンセル',\n            cancel: '操作停止',\n            continueCreateKeyPair: '生成を続きします',\n            KeypairLength: 'RSA暗号鍵ペアの長度を選んでください。この数字が長ければ、長いほど秘匿性によいですが、スピードが遅くなります。',\n            systemAdministratorEmail: 'RSA暗号鍵ペア生成',\n            GenerateKeypair: '<em>強秘匿性通信するのために、RSA暗号鍵ペアを生成中、大量なランダム数字が発生し、数分かかる場合もあります、4096ビットの場合、特に時間がかかります、しばらくお待ち下さい。RSA暗号技術について、ウィキペディア百科辞典を参考してください：' +\n                `<a href='https://ja.wikipedia.org/wiki/RSA暗号' target=\"_blank\" onclick=\"return linkClick ('https://ja.wikipedia.org/wiki/RSA暗号')\">https://ja.wikipedia.org/wiki/RSA暗号</a></em>`,\n            inputEmail: 'お疲れ様です、最後の設定をしましょう。このRSA暗号鍵ペアは本システムに重要な存在です、ユーザーのCoNETへ身元証明、本システムデータを秘密化、CoNETシステムとデータ通信時この暗号鍵ペアを使います。パースワードはCoNETへ保存しませんですから、大事にメモしてください。<em style=\"color:brown;\">CoNETはネットワークの制限があるエリアにブラックリスト入って恐れがあります、ここに制限があるエリアのメールサービスを入れるとCoNETからのメールが受信不能になる可能性もあります、CoNETへ登録完了することができない場合もあります。</em>',\n            accountEmailInfo: 'CoNETドメイン名は、ファイヤウォールがある場合はブラックリストに入っている可能性がありますから、CoNETシステムへ登録完了することができません。その場合はファイヤウォール外側のEmailシステムを利用してください。'\n        },\n        error_message: {\n            title: 'エラー',\n            errorNotifyTitle: 'システムエラー',\n            EmailAddress: ['メール アドレスを someone@example.com の形式で入力してください。', '同じEmailアカンウトが既に存在します。', '入力したメールはCoNETシステム非対応です。'],\n            required: 'このフィールドを入力してください。',\n            PasswordLengthError: '5文字以上の長さのパスワードが必要。',\n            localServerError: 'ローカルサーバーエラーが発生しました、CoNETを再起動をください！',\n            finishedKeyPair: '暗号鍵ペア作成完了しました。',\n            Success: '完成',\n            doCancel: 'キャンセルしました',\n            errorKeyPair: '暗号鍵ペア作成際エラーが発生、もう一度してください。',\n            SystemPasswordError: '暗号鍵パスワードが違います。パースワードが忘れた場合、現在の鍵ペアを削除してください。この場合は、現有の設定はなくなって、一からシステム設定をやり直しが必要です。',\n            finishedDeleteKeyPair: '暗号鍵ペア削除しました。',\n            offlineError: 'インターネット接続されていないらしいですが、ネットワークをチェックしてもう一度お試しください！',\n            imapErrorMessage: [\n                /* 0 */ 'CoNETと接続ができませんでした。CoNETサービスが一時停止しています。後ほどもう一度してみてください。またはCoNETサービスにお問い合わせしてください。',\n                /* 1 */ 'データフーマットエラー！',\n                /* 2 */ 'インターネット接続されていないらしいですが、ネットワークをチェックしてもう一度お試しください！',\n                /* 3 */ 'mailサーバはIMAPユーザー名又はパスワードに間違いがあると提示しました！このエラーは普通パスワードを使っていましたか、またはAPPパスワードが失効と可能性もありますが、メールプロバイダのアカウトページへチェックをしてください。',\n                /* 4 */ '指定したPORTでemailサーバへIMAPの接続ができませんでした、PORT番号をチェックしてください、ファイヤウォールの中にいる場合、指定したPORTはファイアウォールにフィルタした可能性があ裏ます、IMAPサーバーのその他有効PORT番号にチェッジしてください。<a href=\"https://tw.help.yahoo.com/kb/SLN15241.html\" target=\"_blank\" onclick=\"return linkClick (`https://tw.help.yahoo.com/kb/SLN15241.html`)\">应用密码</a>',\n                /* 5 */ 'IMAPサーバのセキュリティ証明書信頼できません。詐欺や、お使いのコンピューターからサーバーに送信されると情報を盗み取る意図が示唆されている場合があります。',\n                /* 6 */ 'Emailサーバドメインは有効ではありません、emailサーバの設定を修正してください。又このPCはインターネットに接続しておりません、ネットワークをチェックしてください。',\n                /* 7 */ 'このemailサーバはCoNET通信技術サポートしていません、もう一度テストをするか、他のemailプロバイダにチェンジをしてください。',\n                /* 8 */ 'emailサーバはSMTPユーザー名又はパスワードに間違いがあると提示しました！',\n                /* 9 */ 'SMTPサーバのセキュリティ証明書信頼できません。詐欺や、お使いのコンピューターからサーバーに送信されると情報を盗み取る意図が示唆されている場合があります。',\n                /* 10 */ 'SMTPサーバへ接続ができません。',\n                /* 11 */ '同じEmailアカンウトが既に存在します。',\n                /* 12 */ 'CoNETと接続ができていません！',\n                /* 13 */ 'ご利用メールアドレスのメールボックス容量がいっぱいになっています。',\n                /* 14 */ '通信に未知のエラーが発生しました。'\n            ],\n            CoNET_requestError: [\n                /* 0 */ 'CoNETが応答していなかったです。CoNET通信を再確立しています。しばらくお待ちください！ ',\n                /* 1 */ '無効な操作です！'\n            ]\n        },\n        emailConform: {\n            activeViewTitle: '鍵ペア検証',\n            requestReturn: ['エラー発生しました、それは短時間内多数の請求をしたことです。', '検証メールを発送しました。'],\n            info1_1: `鍵ペア検証は未完成です。「検証Emailを発行」を押してからメールボクス「`,\n            info1_2: `」をチェックしてください。CoNETから多数メールの場合は、最後のを選んでください。CoNETからのメールが見つからない場合は、鍵ペアを生成するメールアドレスを正しいかどうか、ダブチェックしてください。または鍵ペアを削除して新しい鍵ペアを再作成をしてください。`,\n            info2: 'コピーするのは「-----BEGIN PGP MESSAGE-----」から「-----END PGP MESSAGE-----」まで全ての内容をしてください。',\n            emailTitle: 'CoNETをご利用頂いて誠に有難うございます',\n            emailDetail1: '',\n            emailDetail1_1: ' 様',\n            emailDetail2: 'あなたのCoNETアカンウト検証暗号です。以下の全ての内容をコピーして、認証フィルターにペーストをしてください。',\n            bottom1_1: '以上',\n            bottom1_2: 'CoNETチームより',\n            conformButtom: '検 証',\n            reSendRequest: '検証Emailを発行',\n            formatError: [\n                'フォーマットエラー、コピーするのは「-----BEGIN PGP MESSAGE-----」から「-----END PGP MESSAGE-----」まで全ての内容をしてください。',\n                'この内容で暗号化解除ができませんでした。鍵ペアEmailアカンウトメールボックス再検査し、CoNETから最後のを選んでください。または鍵ペアを削除して、鍵ペア再発行してください。',\n                'CoNETに接続するのはエラーが発生した、一回退出し、再起動して接続をしてください。',\n                '検証できません！CoNETから多数メールの場合は、最後のを選んでください。',\n                'あなたのCoNETには問題があります、鍵ペアを削除して一から再セットアップしてください。',\n                /*5*/ 'ごめんなさい、CoNETシステムは応答してくれません、オフラインかもしれません。後からもう一度試しにしてください',\n                'あなたの今日データ通信はリミットになっていますので、明日まで待ってください。またはユーザー種類をアップグレードをしてください',\n                '通信用IMAPの設定にエラーがあるか又はそのタープのIMAPアカンウトがCoNETサポートしません。よくチェックしてもう一回試しにしてください。',\n                '選択していたゲットウェーエリアは只今接続不能になっております、後ほどもう一度試しにしてください。',\n                'IMAPアカウトでEMAIL送信する際エラーが発生しました、一回退出し、起動して見てくださいね。重複発生した場合はIMAPアカウトのウェーブページでアカウトをアンロック操作を必要かもしれない。',\n                'ページセッションが終了しました。続行するにはページを更新するか、またCoNETを再起動してください',\n                'CoNETプラットフォームが故障になったと思いますが、CoNETを再起動してください'\n            ],\n            activeing: '通信中'\n        },\n        QTGateRegion: {\n            title: '高品質カスタマーゲートウェイサービスエリア',\n            speedTest: 'スピードテスト：',\n            available: 'サービス中',\n            unavailable: '準備しています',\n            CoGateRegionStoped: 'ゲートウェイサーバーシャットダウンされました。',\n            requestPortNumber: 'ゲートウェイサーバーとの通信ポート:',\n            proxyDomain: 'ドメイン検索はCoNETゲットウェイ側に依頼します。',\n            setupCardTitle: '接続技術:',\n            paidUse: 'このエリアは契約ユーザーだけ使えます。',\n            MultipleGateway: '並列使うゲットウェイ数',\n            dataTransfer: '通信データは：',\n            dataTransfer_datail: ['全てのデータをOPN経由', 'ターゲットサーバへ到達不能時だけ'],\n            proxyDataCache: 'Webキャッシュ:',\n            proxyDataCache_detail: ['Yes', 'No'],\n            clearCache: 'クリアオールキャッシュ',\n            cacheDatePlaceholder: 'Webキャッシュ有効期限',\n            localPort: 'ローカルプロキシポート番号:',\n            option: '詳細設定',\n            localPath: 'ローカルプロキシポートPATHを指定します。',\n            outDoormode: '接受外網訪問',\n            WebRTCleak: 'WebRTC漏れ対応',\n            WebRTCleakInfo: 'EtoEのゲイムやチャットなど動作しないかもしれません。',\n            pingError: 'CoNETゲットウェイエリアスピードチェックエラーが発生しました。一回CoNETを終了して、管理者としてCoNETを再起動をして、スピードチェックをしてください。',\n            QTGateRegionERROR: ['CoNETへ接続要請メールの送信ができなかったです。IMAPアカウントの設定を調べてください。',\n                ''],\n            sendConnectRequestMail: [\n                'CoNETクライアントはCoNETシステムとの接続が切れた。再接続要請メールをCoNETシステムへ送信しました、接続を完了するまで時間がかかるのためしばらくお待ちおください。',\n                'CoNETに長い間ご利用していなっかた時、接続は切れた場合もあります。'\n            ],\n            GlobalIp: 'グロバールIP:',\n            GlobalIpInfo: '要注意：【CoNET接続】をおすとあなたのグロバールIPアドレスをCoNETシステムに送信しますので、それを遠慮すれば【@OPN】接続を選んでください。@OPN技術がサンフランシスコリージョンに、iCloudメールしか対応しておりません。',\n            cacheDatePlaceDate: [{ name: '1時間', id: 1 }, { name: '12時間', id: 12 }, { name: '一日', id: 24 }, { name: '15日', id: 360 }, { name: '1月', id: 720 }, { name: '6月', id: 4320 }, { name: '永遠', id: -1 }],\n            connectQTGate: 'CoNETゲットウェーエリアインフォメーションを取得しています...',\n            atQTGateDetail: [\n                /*0*/ 'CoNETの世界初のIP不要な通信技術です。暗号化したEmailメッセージを通じたゲットウェイに接続することで、身を隠して誰も知らないうちにインターネットへ、プライバシーと強くファイヤウォールをうまくすり抜けることができます。但しお使いメールサーバの性能に次第スピードが遅くなり、長い遅延など短所があります、ゲームやビデオチャットなどに通信障害出る可能性があります。この技術はiCloudアカンウトのみ対応です',\n                /*1*/ 'CoNETオリジナル技術のトラフィックをHTTPに偽装した暗号化通信技術です。あなたのIPを使ってゲットウェイに直接接続することで、高速通信とプライバシー、強くファイヤウォールをうまくすり抜けることができます。インターネット自由アクセスのためにCoNETを使うことになら、これをおすすめです。',\n                /*2*/ 'ドメイン検索をCoNETゲットウェイ側にすることで DNS cache pollution を防ぐことができます。この選択は必要です。',\n                /*3*/ '全てインターネットデータをCoNETゲットウェイに通じてすることで、匿名でインターネットアクセスします。',\n                /*4*/ 'ローカルネットワークが目標サーバに到達不能な際に、CoNETゲットウェイ通じてします。このことはネットスピードがアップできますが、プライバシーが無くなります。',\n                /*5*/ 'アクセスしたWebサイトを一時ファイルに保持することで、高速レスポンスが利用可能となります、CoNETはいつも暗号化したデータを本機に保存します。但し暗号化通信には不対応です。',\n                /*6*/ 'キャッシュを保存しません。',\n                /*7*/ 'キャッシュ有効期限の設定によって、いつもサーバ側の最新情報を入手することができます。単位は時間です。',\n                /*8*/ 'ローカルプロキシサーバーが他のデバイスをこのポートに接続によってCoNETデータの通信を利用可能です。3001から65535の間の数字を入れてください。',\n                /*9*/ 'ローカルポロックPATHを指定することで、あなたのローカルポロックサーバを簡単セキュリティを与えられます。無断使用を禁止することができます。',\n                /*10*/ '同時に使うゲットウェイ数目を指定します。この技術はネットワークの大流量をいくつかのIPアドレスに分散して、監視者から逃げられます。この機能は有料会員しかのです。',\n                /*11*/ 'CoNETゲットウェーとの通信ポート番号を指定します。あなた所在するネットワークの制限された通信ポートから避けることができます。',\n                /*12*/ 'Web Real-Time Communication (WebRTC)は、ブラウザ間で仲介なしのIPアドレス直接的な、高速やり取りを可能にするオープン標準技術です。悪用の場合は、真実のIPアドレスを検出するをWebRTC漏れと呼ばれるものです'\n            ]\n        },\n        QTGateGateway: {\n            title: 'CoNETサービス使用詳細',\n            processing: 'CoNETネットワークへ接続中...',\n            error: [\n                /* 0 */ 'エラー：あなたのアカンウトに既にCoNETゲットウェイに接続しているクライアントがありますが、その接続を退出してからもう一度接続してください。',\n                /* 1 */ 'エラー：あなたのアカンウトにCoNETゲットウェイデータ通信制限になっております。もし引き続きご利用を頂きたいなら、アカンウトをアップグレードにしてください。フリーアカウントの場合は毎日100M、毎月1GBの通信制限があります。',\n                /* 2 */ 'エラー：データフォーマットエラー、CoNETをリスタートしてください。', 'ごめんなさい、ご請求したゲットウェイエリアは準備中です。そのたのエリアを選ぶか、後ほど接続をしてください。',\n                /* 3 */ 'エラー：請求した接続方法はこのエリアに対応しておりません、他のエリアに変更するか他の接続方法へください。',\n                /* 4 */ '@OPN接続をしたいなら、公衆iCloudアカウントに対応できません、ご自分のiCloudアカウントをCoNET通信アカウントにしてください。'\n            ],\n            connected: '接続しました。',\n            promo: 'プロモーション',\n            upgrade: 'アップグレードアカンウト',\n            accountManager: 'アカンウト',\n            userType: ['無料ユーザー', '月契約'],\n            datatransferToday: '日通信量制限：',\n            datatransferMonth: '月通信量制限：',\n            todaysDatatransfer: '今日使える通信量',\n            monthDatatransfer: '今月使える通信量',\n            gatewayInfo: ['ゲットウェイIPアドレス：', 'ゲットウェイ接続ポート番号：'],\n            userInfoButton: '使用ガイド',\n            stopGatewayButton: 'ゲットウェイサーバを停止します',\n            disconnecting: 'ゲットウェイサーバを破壊しています'\n        },\n        qtGateView: {\n            title: 'CoNETへカスタムサーバーの作成を要請',\n            QTGateConnectResultWaiting: 'CoNETへ接続請求メールを送信しました。初めてのCoNETへ接続請求ですから、接続完成したまで数分かかる場合もあるかもしれませんが、暫くお待ちをください。',\n            mainImapAccount: 'CoNETへ情報交換用Emailアカンウト',\n            QTGateDisconnectInfo: 'CoNETと接続はしておりません、通信専用Emailを選択してCoNETへ接続メールを送信します。',\n            QTGateConnectError: ['CoNETへメールの送信にエラーが発生しました。通信専用Emailをチェックしてください。'],\n            QTGateConnectStatus: 'CoNET接続状態',\n            QTGateConnectResult: ['未接続、クリックと接続します。', 'CoNETへ接続中.', 'CoNETに接続しました。', 'CoNETへ接続にエラーが発生しました。IMAP設定を立ち直すしてください。',\n                'CoNETに接続しました。'],\n            QTGateSign: ['あなたの鍵ペア状態', 'CoNETに信頼サインがないです', 'CoNETに信頼サインを取得したことで、CoNETのユーザーの間にファイル又はインフォーメーションなど秘密情報を交換する際、あなたの身元証明となります。本人以外のを区別することができます。あなたも持っている鍵ペアで他のCoNETユーサーに信頼サインすることで、あるCoNETユーサーを信頼関係確定することができます。',\n                'CoNETに信頼サインを取得しています', 'CoNETシステムエラー、CoNETを再起動してからもう一度してみてください。もし直れないならCoNETを一から再インストールしてください。', 'CoNETシステムエラー']\n        },\n        feedBack: {\n            title: 'フィードバック',\n            additional: '追加情報を添付する',\n            okTitle: 'CoNETへ送信'\n        },\n    }, {\n        coSearch: {\n            searchInputPlaceholder: 'Search or type a URL',\n            SearchText: 'Search',\n            totalResults: ['About', 'results'],\n            moreResults: 'More Results',\n            SearchesRelated: ['Searches related to ', ''],\n            label_HTML: '</>',\n            imageSize: 'Image size:',\n            label_picture: 'Picture',\n            similarImages: 'Visually similar images',\n            unSafe: ['Safe viewer', 'Unsafe viewer'],\n            errorMessage: [\n                'Invalid request.',\n                'This image have issue of format. Select other one please.',\n                'Request maximum error. Try again later.'\n            ],\n            coSearchConfigMenu: ['Search setup', 'Search engines'],\n            coSearchConfigIcon: ['google', ''],\n            coSearchEngineName: ['Google', ''],\n            searchToolBarMenu: [\n                \"Website\", \"News\", \"Picture\", \"Video\"\n            ],\n            timeUnit: {\n                hours: 'hours ago',\n                day: 'days ago',\n                mins: 'minutes ago'\n            },\n            TimeTolocalTime: function (time) {\n                return new Date(time).toLocaleDateString('en', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });\n            }\n        },\n        appsManager: {\n            mainLoading: 'Loading node information...',\n            nodeName: 'Node name: ',\n            connectAddress: 'Node address: ',\n            serviceList: 'Service list',\n            welcomeTextSub: 'Anonymous, private, security and freedom of new Internet.'\n        },\n        youtube: {\n            startup: {\n                title: 'Welcome to Co for Youtube',\n                detail: 'You may search YouTube video, channel, or playlist that matches the search parameters. And you may play the video at local.'\n            },\n            search: {\n                placeholder: 'Search Youtube, or enter a play url',\n                button_text: 'Search',\n                error: [\n                    'Search error! please search again.'\n                ]\n            }\n        },\n        perment: {\n            serverTitle: 'Server'\n        },\n        twitter: {\n            newTwitterAccount: `Please input Twitter APP information. How to create Twitter APP please click <a target=\"_blank\" href='https://github.com/QTGate/QTGate-Desktop-Client/wiki/Create-Twitter-APP'\">hear</a> to got more information.`,\n            addAccount: 'Add an Twitter account',\n            following: ['Following', 'Unfollow', 'Follow'],\n            followers: 'Followers',\n            second: 's',\n            min: 'm',\n            hour: 'h',\n            videoSizeOver: `This video is over Twitter specifications: 140's or 300MB or (1280 x 1024).`,\n            retweeted: 'Retweeted',\n            month: 'm',\n            day: 'd',\n            close: 'Close',\n            newTwitterTitle: ['Compose new Tweet', 'Compose new thread'],\n            returnEdit: 'Cancel',\n            replying: 'Replying to ',\n            twitterBottonTitle: ['Tweet', 'Tweet all'],\n            urlInfo: '<h3>Twitter client previwe version from CoNET.</h3><p>A free and no need VPN or CoGate gateway, anonymous and securety via CoNET network access your Twitter account.</p><p>You also may open this App with URL from your cellphone and other device.</p>',\n            newTwitterDistroyButtonTitle: ['Discard', 'Discard'],\n            accountError: 'Twitter return error: Invalid or expired token. error. Please check your account APP information and try again.'\n        },\n        thirdParty: {\n            information: 'Welcome to CoNET.',\n            comesoon: 'Come soon.',\n            qtgateGateway: 'CoGate gateway service. High speed, total privacy, ultra secure and easy to use. Your gateway to a secure and open internet.',\n            app: ['CoGate', 'CoChat', 'CoBox', 'CoMail', 'CoNews', 'CoSearch', 'Co for', 'Co for', 'CoWallet', 'Co Custom'],\n            dimmer: [\n                'Advanced private custom gateway service',\n                'Private and secure, decentralized social media',\n                'Private cloud storage and file sharing',\n                'Privacy email client',\n                'Discover your world every day',\n                'Custom business solution for public or private APPs in CoNET',\n                'Web search client',\n                'Privacy Tweet client',\n                'Privacy Youtube client. May download Youtube video via 3rd-party webside.',\n                'CoNET Cryptocurrency wallet'\n            ]\n        },\n        account: {\n            QTGatePayRisk: 'Your payment will be processed via CoNET’s secured payment portal. If concerned about privacy, Please use the Stripe payment portal.',\n            paymentSuccessTitile: 'Thank you.',\n            stripePayment: 'Bank gateway payment',\n            willPayNextExpir: `We'll charge your payment at renew day `,\n            openAutomatically: 'Auto-renew',\n            paymentProblem1: 'Payment via CoNET',\n            promoButton: 'Have Promo',\n            paymentProblem: 'Looks bank payment gateway was block in your area. You can payment via CoNET gateway.',\n            qtgatePayment: 'Payment with CoNET System',\n            paymentSuccess: 'Your plan has beed upgraded.',\n            qtgateTeam: 'The CoNET Team',\n            networkShareTitle: 'Bandwidth',\n            CancelSuccess: function (PlanExpire, isAnnual, returnAmount) {\n                return `Your subscriptions was cancelled. You may keep use CoNET service with this plan until ${new Date(PlanExpire).toLocaleDateString()}. Restrictions apply to free accounts and accounts using promotions. ${isAnnual ? `Refund amount us$${returnAmount} will return to your paid card account in 5 working day.` : `Automatically canceled.`} `;\n            },\n            currentPlanExpire: ['Plan expires on: ', 'Renews at', 'monthly reset day '],\n            currentAnnualPlan: ['Monthly plan', 'Annual plan'],\n            cardPaymentErrorMessage: [\n                /* 0 */ 'Error: card number or have an unsupported card type.',\n                /* 1 */ 'Error: expiration!',\n                /* 2 */ 'Error: Card Security Code',\n                /* 3 */ 'Error: Card owner postcode',\n                /* 4 */ 'Error: payment failed. Please try again late.',\n                /* 5 */ 'Error: Payment data format error!',\n                /* 6 */ 'Error: Payment failed from bank.',\n                /* 7 */ 'Error: Please try again late.'\n            ],\n            title: 'Manage account',\n            segmentTitle: 'Account: ',\n            needPay: 'The balance: ',\n            cancelPlanButton: 'Cancel plan',\n            currentPlan: 'Current Plan: ',\n            oldPlanBalance: 'Remaining of old plan: ',\n            MonthBandwidthTitle: 'Gateway Bandwidth：',\n            dayBandwidthTitle: 'Day limited：',\n            bandwidthBalance: 'Bandwidth remaining: ',\n            upgradeTitle: 'Upgrade',\n            planExpirDate: function (year, month, day) { return `${month}/${day} ${year}`; },\n            accountOptionButton: 'Account option',\n            planPrice: 'Plan price：',\n            monthResetDay: 'Monthly reset day: ',\n            monthResetDayAfter: 'th',\n            cantUpgradeMonthly: 'Annual may not downgrade to monthly plan. Please cancel current plan, then select this one.',\n            DowngradeTitle: 'Downgrade Option',\n            cancelPlan: 'Cancel plan',\n            cantCancelInformation: 'This subscription plan may not be cancelled. Free user plans, promotions, special codes and test program plans cannot be cancelled. ',\n            multiOpn: 'OPN multi-gateway technology',\n            MonthBandwidthTitle1: 'Bandwidth',\n            serverShare: 'Gateway',\n            monthlyAutoPay: function (monthCost) { return `<span>Billed Monthly</span><span class=\"usDollar\" >@ us$</span><span class=\"amount\" >${monthCost}</span>/mo<span>`; },\n            cardNumber: 'Card number',\n            paymentProcessing: 'Connecting...',\n            calcelPayment: 'Cancel',\n            doPayment: 'Process Payment',\n            expirationYear: 'Expiration',\n            postcodeTitle: 'Card owner postcode',\n            payAmountTitile: 'Amount',\n            cvcNumber: 'Card Security Code',\n            annualPay: function (annual_monthlyCost) { return `<span>Billed Annually</span><span class=\"usDollar\">@ us$</span><span class=\"amount\" >${annual_monthlyCost}</span>/mo<span>`; },\n            canadaCard: '*For Canadian residents, GST (5%) will be applied automatically.',\n            multiRegion: ['multi-gateway in single region', 'multi-gateway in multi-regions*', 'multi-gateway in multi-regions*', 'multi-gateway in multi-regions'],\n            continue: 'Next step',\n            serverShareData: ['Shared gateway', 'Dedicated gateway server*', 'Dedicated 2 gateway server*', 'Dedicated 4 gateway server'],\n            internetShareData: ['Shared High Speed Bandwidth', 'Dedicated High Speed Bandwidth*', 'Dedicated 2 High Speed Bandwidth*', 'Dedicated 4 High Speed Bandwidth'],\n            maxmultigateway: ['Max: 2 multi-gateway', 'Max: 4 multi-gateway*', 'Max: 4 multi-gateway'],\n            monthlyPay: 'Monthly pricing',\n            aboutCancel: '*About Subscription cancellation',\n            cancelPlanMessage: '<span>You may cancel your CoNET subscription at any time from within the this app. You will continue to have access to the CoNET services through the end of your paid period until all remaining subscription time in your account is used up. Please refer to the </span><a class=\"ui olive tiny label\">Terms of Service</a> for cancellation and refund policy. Restrictions may apply to free plans and promotional accounts.',\n            serverShareData1: 'Your dedicated server will be share ratio when you connected over your dedicated count via use Multi-gateway technology.',\n            cancelPlanMessage1: function (isAnnual, amount, monthlyPay, expire, passedMonth, totalMonth) {\n                return `<span>Your are on ${isAnnual ? `annual payment plan</span><span class=\"usDollar\">us$</span><span class=\"amount\">${amount / 100}</span><span>. ${passedMonth} month${totalMonth - passedMonth > 1 ? 's' : ''} are available on your account. Your refund amount will be </span><span class=\"usDollar\">us$</span><span class=\"amount\">${amount - passedMonth * monthlyPay > 0 ? (amount - passedMonth * monthlyPay) / 100 : 0}</span>.` : `monthly, it will not be renew at </span><span class=\"amount\">${nextExpirDate(expire).toLocaleDateString()}</span><span> if you cancel this plan.</span>`}`;\n            }\n        },\n        QTGateDonate: {\n            title: 'Free access website provided by sponsor.',\n            meta_title: 'Donor：',\n            detail: `CoNET users may access these sponsored websites via CoNET OPN. Free users may not be able to access if your daily limit has been reached.`\n        },\n        QTGateInfo: {\n            title: 'Features',\n            version: 'Installed veriosn：v',\n            detail: [{\n                    color: '#a333c8',\n                    icon: 'exchange',\n                    header: 'OPN: Security and Privacy while accessing the Open Internet.',\n                    detail: `@OPN@ uses CoNET’s “Quiet” technology to create a obfuscated private network by refracting encrypted data packets thru email servers. @OPN provides true stealth internet communications where your IP address is hidden to client or proxy servers. iOPN uses CoNET’s technology to obfuscate data traffic over HTTP. Both @OPN and iOPN offer security, protection and privacy while allowing access to the open internet. All data is kept private with encryption using <a onclick=\"return linkClick('https://en.wikipedia.org/wiki/Advanced_Encryption_Standard')\" href=\"#\" target=\"_blank\">AES256-GCM</a> and <a onclick=\"return linkClick ('https://en.wikipedia.org/wiki/Pretty_Good_Privacy')\" href=\"#\" target=\"_blank\">OpenPGP</a> along with CoNET’s proprietary security measures.`\n                }, {\n                    color: '#e03997',\n                    icon: 'talk outline',\n                    header: 'QTChat: Private and secure, peer to peer Instant messaging with no IP address.',\n                    detail: 'CoNET users can communicate with others via a private and secure instant messaging service. Using the @OPN stealth technology and end-to-end encryption, users are secure and messages kept private with no IP address footprint. Supports group chat with multiple users and can be used for privately transferring, pictures, files and live video streaming. Using end-to-end encryption ensures only the user and the people the user is communicating with can read what is sent, and nobody in between, not even CoNET. This is because messages are secured with an encrypted lock, and only the recipient and original message sender will have the special key needed to unlock and read them.'\n                }, {\n                    color: '#6435c9',\n                    icon: 'cloud upload',\n                    header: 'QTStroage: The secure and Private cloud storage and file sharing.',\n                    detail: 'Users can store and share files by using CoNET @OPN to split files into multiple parts, each encrypted to different email accounts. CoNET user can share the file privately between other users on CoNET’s OPN.'\n                },\n                {\n                    color: 'darkcyan',\n                    icon: 'spy',\n                    header: 'Spam and Spyware detection and blocking.',\n                    detail: 'CoNET uses the global DNSBL database to stop spam and spyware. CoNET users will be automatically filtered from spam and spyware to stop them from transmitting your information.'\n                }, {\n                    color: '#6435c9',\n                    icon: 'external share',\n                    header: 'Personal VPN connection.',\n                    detail: 'Access your CoNET OPN services anywhere via personal VPN connection from anywhere.'\n                }]\n        },\n        firefoxUseInfo: {\n            title1: 'Firefox browser can use separate proxy settings from the system settings. This allows for easy use of a proxy to access the internet without editing the system settings.',\n            info: [{\n                    title: 'CClick Firefox tool icon. Select Preferences or Options.',\n                    titleImage: '/images/macOsControl.jpg',\n                    detail: '<p><a href=\"https://www.mozilla.org/en-US/firefox/#\" target=\"_blank\">Download Firefox.</a></p>',\n                    image: '/images/firefox1.jpg'\n                }, {\n                    title: 'In the General tab, scroll to the bottom, click on Settings under Network Proxy.',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/firefox2.jpg'\n                }, {\n                    title: 'Select Automatic proxy configuration URL and insert the URL as shown in blue below (select URL for HTTP/S or SOCKS). Make sure to Check on “Proxy DNS when using SOCKS v5”. Click OK to finish setup.',\n                    titleImage: '',\n                    detail: 'Chose either HTTP or Socket settings.',\n                    image: '/images/firefox3.jpg'\n                }]\n        },\n        cover: {\n            firstTitle1: 'CoNET Platform',\n            firstTitle2: 'Security Privacy And Freedom on the Internet',\n            start: 'ENTER NOW',\n            proxyStoped: 'Gateway server shutdown. Please rebuild try again.'\n        },\n        useInfoiOS: {\n            title1: 'iOS device local proxy setup.',\n            info: [{\n                    title: 'Open the control panel and select the WiFi settings.',\n                    titleImage: '/images/macOsControl.jpg',\n                    detail: '',\n                    image: '/images/iOS1.jpg'\n                }, {\n                    title: 'Select the icon on the right side of the connected Wifi name.',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/iOS2.jpg'\n                }, {\n                    title: 'Turn On Configure Proxy',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/iOS3.jpg'\n                }, {\n                    title: 'Select Automatic.',\n                    titleImage: '',\n                    detail: '<p>Check Automatic proxy and insert the URL as shown in blue below (select URL for HTTP/S or SOCKS). Save to finish setup.</p>',\n                    image: '/images/iOS4.jpg'\n                }]\n        },\n        useInfoAndroid: {\n            title1: 'Android device local proxy setup.',\n            info: [{\n                    title: `Open your device’s Settings. Under Networks, Select Wi-Fi.`,\n                    titleImage: '/images/androidSetup.jpg',\n                    detail: '',\n                    image: '/images/android1.jpg'\n                }, {\n                    title: 'Tap and hold the connected Wi-Fi network name until a pop up menu appears. Then tap Modify network or Manage network settings.',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/android2.jpg'\n                }, {\n                    title: 'Tap to show Advanced options. Under Proxy, select Proxy Auto-Config.',\n                    titleImage: '',\n                    detail: 'Insert the PAC URL as shown in blue below (select URL for HTTP/S or SOCKS) and Save to finish setup',\n                    image: '/images/android3.jpg'\n                }]\n        },\n        useInfoWindows: {\n            title1: 'Windows 10 proxy setup',\n            info: [{\n                    title: 'For all other Windows versions.',\n                    titleImage: '',\n                    detail: '<p>For other Windows versions’ proxy setup info, please visit <a href=\"#\" target=\"_blank\" onclick=\"return linkClick (`https://support.microsoft.com/en-us/help/135982/how-to-configure-internet-explorer-to-use-a-proxy-server`)\">Microsoft website.</a></p><p>This is the data for proxy server setup:</p>',\n                    image: ''\n                }, {\n                    title: 'Open Microsoft Edge',\n                    titleImage: '/images/IE10_icon.png',\n                    detail: 'Click the tool icon at the top of right, Scroll down menu to the bottom and select Settings.</p>',\n                    image: '/images/windowsUseInfo1.jpg'\n                }, {\n                    title: 'Scroll to bottom of menu and click View advanced settings.',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/windowsUseInfo2.jpg'\n                }, {\n                    title: 'Scroll down menu and click Open proxy settings.',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/windowsUseInfo3.jpg'\n                }, {\n                    title: 'Select Proxy, turn On Automatically detect settings and Use setup script. Insert the Script address as shown in blue below. Then click save to finish.',\n                    titleImage: '',\n                    detail: '<p>Windows 10 system only supports HTTP & HTTPS proxy, SOCKS5 users will need install a browser like Firefox, then setup the SOCKS5 PROXY in Firefox.',\n                    image: '/images/windowsUseInfo4.jpg'\n                }]\n        },\n        useInfoMacOS: {\n            proxyServerIp: '<p>Proxy setup: <span style=\"color: brown;\">Automatic or Auto-Config</span></p>',\n            proxyServerPort: 'HTTP & HTTPS proxy setup:',\n            webRTCinfo: 'Stop WebRTC leak: Please use SOCKS proxy setup. Click <a href=\"/Wrt\" target=\"_blank\">here</a> to check WebRTC leak.',\n            wrtTest: 'Test result: ',\n            customProxy: 'Custom gateway server ready',\n            proxySetupHelp: 'Need help? Please click the icon which is your OS.',\n            wrtTestAreaTitle: 'WebRTC leak area',\n            proxyServerPassword: 'SOCKS proxy setup:',\n            localIpAddress: 'This is intronet IP address, No leak.',\n            globalIpAddress: 'This is your real IP address, If show this it is WebRTC leak.',\n            title: 'Local proxy server is running at background. All other devices can access internet via local proxy setup to use the CoNET OPN.',\n            title1: 'MacOS proxy setup',\n            info: [{\n                    title: 'Open the control panel, click on network.',\n                    titleImage: '/images/macOsControl.jpg',\n                    detail: '',\n                    image: '/images/userInfoMacos1.jpg'\n                }, {\n                    title: 'click on Advanced... ',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/macosUserInfo2.jpg'\n                }, {\n                    title: 'Select Proxies, check Automatic Proxy Configuration, check Exclude simple hostnames.',\n                    titleImage: '',\n                    detail: '<p>Insert Proxy URL shown in blue in the image below (select URL for HTTP/S or SOCKS). Click OK to finish.</p>',\n                    image: '/images/macosUserInfo3.jpg'\n                }]\n        },\n        topWindow: {\n            title: '150th anniversary of Canada'\n        },\n        firstNote: {\n            title: 'Thank you for using our products and services (the “Services” or “Service”). The Services are provided by CoNET Technology Inc. (“CoNET”).',\n            firstPart: 'By using our Services, you are agreeing to these terms. Please read them carefully.',\n            detail: [\n                {\n                    header: 'Terms of Service',\n                    detail: 'This Terms of Service document (the “Terms”) outlines the terms and conditions of use of Services provided by CoNET Technology Inc. These Terms also govern the use of and access to CoNET’s content (the “Content”), which includes the CoNET’s website (the “Site”), applications (the “Apps”), and any tools, software provided by CoNET (the “Software”).'\n                }, {\n                    header: null,\n                    detail: 'Before using CoNET’s Services, please read this agreement thoroughly. If You have any questions concerning the content of this agreement or what it implies, please contact CoNET at email address: support@CoNETTech.ca'\n                }, {\n                    header: null,\n                    detail: 'We may suspend or stop providing our Services to you if you do not comply with our terms or policies or if we are investigating suspected misconduct. Using our Services does not give you ownership of any intellectual property rights in our Services or the content you access. You may not use content from our Services unless you obtain permission from its owner or are otherwise permitted by law. These terms do not grant you the right to use any branding or logos used in our Services. Don’t remove, obscure, or alter any legal notices displayed in or along with our Services.'\n                }, {\n                    header: 'Eligibility for Service',\n                    detail: 'By accessing the Content or Services, you are agreeing on behalf of yourself or those you represent (“You”) to comply with and be legally bound by these Terms in their entirety. These Terms constitute a legally binding agreement (the “Agreement”) between you and CoNET. If you do not agree with any part of the Terms, you may not use our Services.'\n                }, {\n                    header: null,\n                    detail: 'By creating an account for using our Services, you represent that you are at least eighteen (18) years of age or that you are a valid legal entity, and that the registration information you have provided is accurate and complete. If You are accepting the terms of this agreement on behalf of a company or other legal entity, You represent and warrant that You have the authority to bind that company or other legal entity to the terms of this agreement. If You are accepting this agreement on behalf of an enterprise’s end user, it is Your responsibility to communicate the information in this agreement to the enterprise end users and ensure compliance with the terms and conditions contained herein. By agreeing to these Terms, you are also agreeing to the End User License Agreement (“EULA”), which you can read on CoNET’s website.'\n                },\n                {\n                    header: 'Privacy Policy',\n                    detail: 'Your privacy is highly important to us, since privacy is every person’s natural right! CoNET is committed to your privacy and does not collect or log browsing history, traffic destination, data content, or DNS queries from Subscribers using our Services. – hence, we DO NOT store details of, or monitor the websites you access while using our Services.'\n                }, {\n                    header: null,\n                    detail: 'During your registration, we will ask you for some personal information such as your email address and/or payment information. We only collect information that are necessary for the proper delivery of the Site and Services. This information is for our eyes only and will be stored on secured servers. The little bit of information we collect is the minimal usage statistics to maintain our quality of service. We may know: choice of server location, times when our Services was used by user and amount of data transferred by one user in one day. We store this information in order learn from it, and eventually deliver the best possible experience to you. This information which is gathered and analyzed generically is also kept on secured servers. We stand by our firm commitment to our customers’ privacy by not possessing any data related to a user’s online activities.'\n                }, {\n                    header: null,\n                    detail: 'We reserve the right to modify the Privacy Policy at any time, so please review it frequently. Your continued use of the our Services will signify your acceptance of the changes to the Privacy Policy. If you have any questions regarding our Privacy Policy and how we handle your information, please feel free to contact CoNET at the following email address: support@CoNETTech.ca'\n                }, {\n                    header: 'Subscriptions',\n                    detail: 'CoNET Services are available to you upon registration on the Site or Software. By subscribing to the Services, you agree to become a subscriber (“Subscriber”) for the period you have elected. A full list of subscription plans and pricing is available on the Site. CoNET reserves the right to amend subscription fees or institute new fees at any time upon reasonable advance notice posted on the Site or sent via email. Any changes to the pricing will not affect the Subscriber’s current subscription period and will become effective upon subscription renewal.'\n                }, {\n                    header: null,\n                    detail: 'When supported by your payment method, plans renew automatically by default at the completion of the billing term. By default, the renewal term is for the same duration as the billing term for the original subscription. The subscription fee will be charged automatically to the payment method you last selected. If you would like to discontinue automatic renewal, you may turn off auto-renewal. By default, auto-renewal is turned on when you use a payment method that supports auto-renewal (such as a credit card or Paypal), and turned off when you use a payment method that does not support auto-renewal (such as bitcoin).'\n                }, {\n                    header: null,\n                    detail: 'Your Subscription is Yours and Yours only. You may not lend it, rent it, hire it out or share it with people or any other legal entity such as a company, partnership etc, who are not You yourself. Each paid subscription grants you one (1) license to use.'\n                }, {\n                    header: 'Subscription Cancellation and Suspension',\n                    detail: 'We want you to be fully satisfied with our services. However, we will troubleshoot an issue you experience first. There are several nuances to an OPN service configuration and we solve 99% of issues encountered. '\n                }, {\n                    header: null,\n                    detail: 'You may cancel your CoNET subscription at any time, and you will continue to have access to the CoNET services through the end of your paid period until all remaining subscription time in your account is used up. Subscription plan monthly billing cycle starts on the 1st day of each month. Subscription period will end on the last day of the month cancellation was requested. Restrictions apply to free accounts and accounts using promotions.'\n                }, {\n                    header: null,\n                    detail: 'You can cancel your Subscription within the client app. Refunds are subject to the CoNET’s Refund Policy. Please let us know, via email to support@CoNETTech.ca, any reasons to your decision in stopping use of our Service so we can be better for the future. Thank you.'\n                }, {\n                    header: null,\n                    detail: 'CoNET is entitled to impose Service limits, revoke any Service, suspend it, or block any type of usage made by You at its sole discretion if it is reasonable to believe that the You violate or have violated the Terms of Service or if the way You use the Services may render CoNET liable to any offence or breach of any third party rights or disturb other users use of the Service. CoNET does not undertake to provide You with any prior notice of these measures. The application of any of these measures will not entitle You to a refund.'\n                }, {\n                    header: 'Refund Policy',\n                    detail: 'Cancellations to annual subscription may be entitled to a pro-rated refund of your current annual subscription payment amount minus the months of service used calculated at the standard monthly rate. (For example, accounts canceling within 3 months of an annual plan will be entitled to a refund of the amount paid subtracted by the 3 months of service used at the standard monthly rate.)'\n                }, {\n                    header: null,\n                    detail: `<p>We refund annual subscription purchase only. We will refund your order if:</p><div class=\"ui ordered list\"><div class=\"item\">It is the first time you've ordered our Services and there have not been previous purchases on your account.</div><div class=\"item\">If you have made less than one hundred connections to our Service and your bandwidth usage is less than 500 MB.</div><div class=\"item\">If you haven't violated CoNET’s Terms of Service in any way.</div></div>`\n                }, {\n                    header: null,\n                    detail: `It is the first time you've ordered our Services and there have not been previous purchases on your account.`\n                }, {\n                    header: null,\n                    detail: ``\n                }, {\n                    header: null,\n                    detail: 'We will refund your order if: <p class=\"tag info\">It is the first time you’ve ordered our Services and there have not been previous purchases on your account.</p><p class=\"tag info\">If you have made less than one hundred connections to our Service and your bandwidth usage is less than 500 MB.</p><p class=\"tag info\">If you haven’t violated CoNET’s Terms of Service in any way.</p><p class=\"tag info\">As stated above, if the refund request is made within 7 days since the purchase has been made.</p><p class=\"tag info\">Refunds are generally processed within seven (7) days, and are made to the original form of payment used for purchase. All refunds are sent in USD and therefore the refund amount could differ from the amount originally paid in local currency or bitcoin. How long it takes until you will see the refunded amount in your bank account varies according to the payment method you used, bank regulations, etc.</p>'\n                }, {\n                    header: 'Acceptable Use Policy',\n                    detail: 'You must follow any policies made available to you within the Services. You shall use CoNET Services in compliance with all applicable laws and not for any unlawful Purpose. CoNET Services may be accessed from all around the world, so it is your responsibility to assess whether using the Apps, Services, Sites or Software is in compliance with local laws and regulations. You may only use the Services as permitted by law. Services may NOT be used for any illegal activity. Whenever you use the Apps, Services, Sites or Software, you should comply with these Terms and applicable laws, regulations, and policies. You agree to not to use the Service in a way that may result in a violation of any laws of any jurisdiction. Don’t misuse our Services. For example, don’t interfere with our Services or try to access them using a method other than the interface and the instructions that we provide. We may suspend or stop providing our Services to you if you do not comply with our terms or policies or if we are investigating suspected misconduct.'\n                }, {\n                    header: null,\n                    detail: 'You understand that it is your responsibility to keep your CoNET account information confidential. You are responsible for all activity under your account. You agree to not make any illegal or unauthorized use of the Services through Your user id/password and not to enable access to your account to users who are not You. If you ever discover or suspect that someone has accessed your account without your authorization, you are advised to inform us immediately so that we may revoke your account credentials and issue new ones. You will be held accountable and liable for any and all actions performed on the CoNET’s servers where the login is identified by Your user id/password. In order to protect the Services from being misused or used to harm someone, CoNET reserves the right to take appropriate measures when our Services are being used contrary to these Terms and applicable laws. You agree that CoNET may terminate your account, without providing a refund for Services already paid, if you misuse the Service.'\n                }, {\n                    header: null,\n                    detail: 'In using our Services, you agree not to: <p class=\"tag info\">Send spam, uninvited emails or  transmit unsolicited advertisements or content (i.e., “spam”), or any other versions of spam, large quantities of emails even if such are sent-off from another server and sending opt-in emails.</p><p class=\"tag info\">Send, post, or transmit over the Service any content which is illegal, hateful, threatening, insulting, or defamatory; infringes on intellectual property rights; invades privacy; or incites violence.</p><p class=\"tag info\">Upload, download, post, reproduce, or distribute any content that includes sexual or explicit depictions of minors.</p><p class=\"tag info\">Attempt to access, probe, or connect to computing devices without proper authorization (i.e., port scanning, scanning for open proxies, or any form of “hacking”).</p><p class=\"tag info\">Attempt to compile, utilize, or distribute a list of IP addresses operated by CoNET in conjunction with the Service.</p><p class=\"tag info\">Use for distribution of viruses, hacking, cracking, network sabotage, phishing; any fraudulent behavior is strictly prohibited.</p><p class=\"tag info\">Use the Service for anything other than lawful purposes.You shall be held responsible for any damages caused by Your negligence or exposure to vulnerabilities, whether your actions were intentional or not.</p>'\n                }, {\n                    header: 'License',\n                    detail: 'Subject to your compliance with these Terms, CoNET grants to you a worldwide, non-assignable, non-exclusive and limited license to use the software provided to you by CoNET as part of the Services. This license is for the sole purpose of enabling you to use and enjoy the benefit of the Services as provided by CoNET, in the manner permitted by these terms. You may not copy, modify, distribute, sell, or lease any part of our Services or included Software, nor may you reverse engineer or attempt to extract the source code of that Software, unless laws prohibit those restrictions or you have our written permission. Using the Software and our Services in any way not expressly authorized by CoNET is strictly prohibited.'\n                }, {\n                    header: null,\n                    detail: 'Usage of any material which is subject to CoNET’s intellectual property rights is prohibited unless you have been provided with explicit written consent by CoNET. Using our Services does not give you ownership of any intellectual property rights in our Services or the content you access. These terms do not grant you the right to use any branding or logos used in our Services. Don’t remove, obscure, or alter any legal notices displayed in or along with our Services.'\n                }, {\n                    header: 'Disclaimers and Warranties',\n                    detail: 'CoNET undertakes to provide the best Service possible in the circumstances and make the Service available at all times except for when maintenance work is being performed for repair and improvement or in case of circumstances beyond the control of the CoNET, including force majeure. The Service provided may also become unavailable due to other factors beyond the CoNET’s control such as third party service failure or malfunction. The accuracy and timeliness of data received is not guaranteed and may vary based on compressions, configuration, network congestion and other factors that may affect it. The Service’s network speed is an estimate and is no indication or guarantee to the speed which You or the Service will send or receive data. We provide our Services using a commercially reasonable level of skill and care and we hope that you will enjoy using them. But there are certain things that we don’t promise about our Services. CoNET does not monitor Your sessions for inappropriate use nor does it keep logs of Your internet activities. However, the CoNET reserves the right to monitor and investigate matters which it considers at its own discretion to be a violation or potential violations of these Terms of Use.'\n                }, {\n                    header: null,\n                    detail: 'Other than as expressly set out in these terms or additional terms, neither CoNET nor its suppliers or distributors make any specific promises about the Services. The Service, the Software and any third party services and software are provided by the CoNET on an “as is” basis and CoNET hereby disclaims all warranties of any kind, whether expressed or implied. Some jurisdictions provide for certain warranties, like the implied warranty of merchantability, fitness for a particular purpose and non-infringement. To the extent permitted by law, we exclude all warranties.'\n                }, {\n                    header: null,\n                    detail: 'CoNET also reserves the right, but is not obligated to, at its sole discretion and without providing prior notice, to block, delete, filter or restrict by any means, any materials or data it deems potential or actual violations of the restrictions set forth in these Terms of Use and also any other actions that may subject the CoNET or its customers to any liability. CoNET disclaims any and all liability for any failure on our part to prevent such materials or information from being transmitted over the Service and/or into Your computing device.'\n                }, {\n                    header: 'Limitation of Liability',\n                    detail: 'CoNET will not be liable for any damages or loss caused by viruses, denial-of-service, attacks or any other technologically harmful material that my infect Your computer, its peripherals, data stored on it or on its peripherals, computer programs or any other proprietary material due to the use of the Services or due to Your downloading of anything which is posted on the CoNET’s website or any website which is linked there to. In no event will CoNET, its suppliers, distributors,  partners, affiliates, subsidiaries, members, officers, or employees be liable for lost profits, revenues, or data, financial losses or indirect, special, consequential, exemplary, or punitive damages, or for any other loss or damages of any kind, even if they have been advised of the possibility thereof. The foregoing shall not apply to the extent prohibited by applicable law. To the extent permitted by law, the total liability of CoNET, and its suppliers and distributors, for any claims under these terms, including for any implied warranties, is limited to the amount You paid CoNET to use the Services.'\n                }, {\n                    header: 'Indemnification',\n                    detail: 'You agree to hold harmless and indemnify CoNET, its officers, directors, agents, employees,  members, partners, suppliers, their affiliates, and its or their shareholders, directors, and employees from any and all claims, suit or action arising from or related to the use of CoNET’s Services, Apps, Content, Site, or Software or violation of these terms, including any liability or expense arising from claims, losses, damages, suits, judgments, litigation costs and attorney’s’ fees. We may, at our sole discretion, assume the exclusive defense and control of any matter subject to indemnification by you. The assumption of such defense or control by us, however, shall not excuse any of your indemnity obligations. If you are using our Services on behalf of a business, that business accepts these terms.'\n                }, {\n                    header: 'About these Terms',\n                    detail: 'CoNET may update the Terms or any additional terms that apply to a Service, from time to time without notice. You understand and agree that it is your obligation to review these Terms regularly in order to stay informed on current rules and obligations. If you continue to use CoNET’s Services, Apps, Content, Site, or Software after these changes take effect, then you agree to the revised Terms. The current version of the Terms is available on the Site. Notification on any core changes to the Terms will be provided to subscribers through an email message or update to the Site. If you do not agree to the modified terms for a Service, you should discontinue your use of that Service. If there is a conflict between these terms and the additional terms, the additional terms will control for that conflict. These terms control the relationship between CoNET and you. They do not create any third party beneficiary rights.'\n                }, {\n                    header: null,\n                    detail: 'If you do not comply with these terms, and we don’t take action right away, this doesn’t mean that we are giving up any rights that we may have (such as taking action in the future). If it turns out that a particular term is not enforceable, this will not affect any other terms. All of our Content was originally written in English. Any translation of our Content is done on a best-effort basis. We cannot guarantee the accuracy of translated Content. In the event of any discrepancy between the translated Content and the English Content, the English Content shall prevail. The laws of British Columbia, Canada, excluding British Columbia’s conflict of laws rules, will apply to any disputes arising out of or relating to these Terms or the Services.'\n                }\n            ],\n            disagree: 'I Disagree',\n            agreeMent: 'I Agree to the CoNET Terms of Service'\n        },\n        linuxUpdate: {\n            newVersionDownload: 'click here to download and install!',\n            step1: 'Update new CoNET: ',\n            step2: 'Allow executing file as program',\n            step2J1: '/images/linuxUpdate1.jpg',\n            step2J2: '/images/linuxUpdate2.jpeg',\n            step2_detail1: 'Right click downloaded CoNET file and select the properties.',\n            step2_detail2: 'Check allow executing file as program in Permissions tab.',\n            step3: 'Exit old version of CoNET and double click the new CoNET file to run install.',\n            exit: 'Exit CoNET',\n            tryAgain: 'Try again',\n            refresh: 'Refresh page.'\n        },\n        imapInformation: {\n            title: 'Email account to use by OPN.',\n            tempImapAccount: `Have problem with your IMAP enabled email account? <a href=\"#\" style = \"margin-left: 0.5em;\" class=\"ui label teal\" onclick=\"return linkClick ('https://github.com/QTGate/QTGate-Desktop-Client/wiki/IMAP-temporary-account')\"> Get temporary account.</a>`,\n            infomation: `Please provide an IMAP enabled email account to be used to communication with CoNET network. The account name and password will be required. For your personal privacy, please consider registering a new email account to use. CoNET currently supports <a class=\"ui label teal small\" href=\"#\" onclick=\"return linkClick('https://www.icloud.com/')\">Apple iCloud</a><a href=\"#\" class=\"ui label teal small\" onclick=\"return linkClick('https://outlook.live.com/owa/')\">Outlook Mail</a><a href=\"#\" class=\"ui label teal small\" onclick=\"return linkClick('https://www.gmx.com/')\">GMX</a><a href=\"#\" class=\"ui label teal small\" onclick=\"return linkClick('https://www.zoho.com/mail/')\">ZOHO</a>. For passwords, it is recommended use a <a href=\"#\" onclick=\"return linkClick('https://help.yahoo.com/kb/SLN15241.html')\">generated app-specific password.</a> If using <a href=\"#\" onclick=\"return linkClick('https://help.yahoo.com/kb/two-step-verification-sln5013.html')\">2-step verification</a>, we recommend using a free anonymous SMS receiving site to receive SMS codes, ( such as <a href=\"#\" onclick=\"return linkClick('http://receive-sms-online.com/')\">receive-sms-online.com</a>, <a href=\"#\" onclick=\"return linkClick('https://sms-online.co/receive-free-sms')\" >sms-online.co</a>, <a href=\"#\" onclick=\"return linkClick('https://receive-a-sms.com/')\" >receive-a-sms.com</a>, or <a href=\"#\" onclick=\"return linkClick('https://www.google.com/search?q=free+anonymous+SMS+receiving+site&oq=free+anonymous+SMS+receiving+site&aqs=chrome..69i57.268j0j4&sourceid=chrome&ie=UTF-8')\" >others</a> ).`,\n            serverDetail: 'settings:',\n            imapServer: 'IMAP server setup',\n            imapServerInput: 'IMAP server name or IP address',\n            UserName: 'Login username',\n            Ssl: 'By SSL connection:',\n            portName: 'Port number:',\n            otherPortNumber: 'Other:',\n            smtpServer: 'SMTP server setup',\n            smtpServerInput: 'SMTP server name or IP address',\n            emailServerPassword: 'Email account password ( app password )',\n            Error_portNumber: 'Port number should be from 1 to 65535 and not be 22.',\n            imapAccountConform: function (imap, account) { return `<p class=\"ui small header brown\">By clicking submit you are agreeing to:</p><p class=\"grey\">This [<B class=\"red\">${imap}</B>] email is a temporary account for use with CoNET services. CoNET may have full access to this account in use of CoNET’s services.</p><p>CoNET platform will send a email include: [<B class=\"red\">${imap}</B>] & APP password, email [<B class=\"red\">${account}</B>] address, public key, timezone, used language.</p><p>You may receive emails from CoNET.</p>`; },\n            agree: `I understand and agree to continue.`,\n            imapOtherCheckError: 'Cannot connect to email server! Server name, IP address or Port number may have a mistake. Please check the details of your email setup!',\n            CertificateError: 'Certificate for this email server is not trusted. Please select \"Keep connected even if certificate is not trusted\" in settings if you still want to connect. Your email login information maybe leaked to this email server!',\n            IgnoreCertificate: 'Keep connected even when certificate is not trusted',\n            Certificat: 'Warning! Do not select this if you are not sure, it may reveal your information.',\n            AuthenticationFailed: 'Invalid login username or password! Please check username and password.',\n            addAEmail: 'Add a new Email account',\n            tryAgain: 'Try again.',\n            connectImap: 'Connect to CoNET',\n            cancelConnect: 'Stop connecting to CoNET.',\n            imapItemTitle: 'Email account details:',\n            loaderText: ['C', 'o', 'n', 'n', 'e', 'c', 't', ' ', 't', 'o', ' ', 'C', 'o', 'N', 'E', 'T', ' ', 'n', 'e', 't', 'w', 'o', 'r', 'k', '...'],\n            imapCheckingStep: [\n                /* 0 */ 'Trying to connect to email server.',\n                /* 1 */ 'Connected to email server with IMAP. Waiting response from CoNET.',\n                /* 2 */ 'Connected to email server with SMTP.',\n                /* 3 */ 'Please wait a moment, connecting to CoNET network.',\n                /* 4 */ 'Connected to CoNET',\n                /* 5 */ 'Connected to email server with IMAP'\n            ],\n            imapResultTitle: 'IMAP Server CoNET Communication Rating: ',\n            testSuccess: 'Email server setup success!',\n            exitEdit: 'Exit edit email account',\n            deleteImap: 'Delete IMAP account.',\n            proxyPortError: 'Port number should be a number from 3001 to 65535. Or this port is being used by another process. Please try another port number.',\n            appPassword: 'About APP password.',\n            imapCheckError: [\n                /* 0 */ 'Cannot connect to email server! Your network may offline or do not support IMAP protocol. Please check your network and try again after reflash page.',\n                /* 1 */ 'Invalid login username or password! Please check username and password.',\n                /* 2 */ 'Certificate for this email server is not trusted. You may have Man-in-the-middle attack in your network. Try again when chenged network.',\n                /* 3 */ 'Sent mail error. It may happened when you use normail password. Check your mail APP password.',\n                /* 4 */ 'Your network have not internet.',\n                /* 5 */ 'Unknow error. Please exit CoNET and try it again.',\n                /* 6 */ 'Over Quota error. Please access your mail account, delete some mail.'\n            ]\n        },\n        Home_keyPairInfo_view: {\n            title: 'Key pair information',\n            deleteKeyPairHaveLogin: 'Please delete the key pair use the client that is logging on.',\n            emailNotVerifi: 'Key pair has not been signed by CoNET yet.',\n            emailVerified: 'Key pair signed by CoNET.',\n            NickName: 'Nick name：',\n            creatDate: 'Creation date：',\n            keyLength: 'Bit Length：',\n            password: '5-character minimum password.',\n            password1: 'Platform Password',\n            logout: 'Logout',\n            keyID: 'ID：',\n            deleteKeyPairInfo: 'Note: By deleting your key pair, you will lose your current account settings. You will need to set up CoNET account settings again. If your email address is the same as the one used previously, you may restore your CoNET account balance.',\n            delete: 'Delete',\n            locked: 'Please enter your key pair password to continue.',\n            systemError: 'System error! Please delete this key pair and set up CoNET again.'\n        },\n        home_index_view: {\n            newVersion: 'A new version is ready to install.',\n            newVersionInstallLoading: 'Updateing...',\n            localIpAddress: 'Local',\n            internetLable: 'Internet',\n            gateWayName: 'Gateway',\n            showing: 'Status',\n            nextPage: 'next',\n            agree: 'I AGREE & CONTINUE',\n            emailAddress: 'CoNET Account Name ( Email Address Required )',\n            imapEmailAddress: 'Email Account Name',\n            creatKeyPair: 'Generate key pair...',\n            cancel: 'Cancel',\n            clickInstall: 'Install',\n            keyPairCancel: 'Generate key pair was canceled.',\n            keyPairGenerateError: 'It was system error when generate key pair. Try again please.',\n            keyPairGenerateSuccess: 'Generate key pair was success.',\n            continueCreateKeyPair: 'Keep generate.',\n            stopCreateKeyPair: 'Cancel generate key pair',\n            KeypairLength: 'Select the bit length of your key pair. Larger bit lengths are stronger and harder for a hacker to crack but may result in slower network transfer speeds.',\n            SystemAdministratorNickName: 'Nick name ( Required )',\n            systemAdministratorEmail: 'Generate RSA Key pair',\n            GenerateKeypair: '<em>Generating RSA Key pair. Please wait, as it may take a few minutes. More time will be needed if you selected 4096 bit key length. Information about RSA keypair system can be found here:' +\n                `<a href='hhttp://en.wikipedia.org/wiki/RSA_(cryptosystem)' target=\"_blank\" onclick=\"return linkClick ('https://en.wikipedia.org/wiki/RSA_(cryptosystem)')\">https://en.wikipedia.org/wiki/RSA_(cryptosystem)</a></em>`,\n            systemPassword: 'CoNET Client System Password',\n            inputEmail: `This RSA key is a private key used for authentication, identification and secure encryption/decryption of data transmission within CoNET’s system. The password and key are not stored by CoNET. You cannot reset your password if lost and you cannot access CoNET services without your password. Please store your password in a safe place. <em style=\"color: brown;\">CoNET’s domain may be blocked in some regions. Please use an email account with servers outside these regions,</em>`,\n            accountEmailInfo: `Because CoNET may be on a firewall's black list in some regions. It is best to choose an email account with servers outside your region’s firewall.`\n        },\n        error_message: {\n            title: 'Error',\n            errorNotifyTitle: 'System Error',\n            EmailAddress: ['Please enter your email address in this format name@example.com.', 'Sorry, CoNET currently support Apple iCloud mail, Microsoft Outlook and Yahoo mail only.'],\n            required: 'Please fill in this field.',\n            PasswordLengthError: 'Passwords must have at least 5 characters.',\n            localServerError: 'Local CoNET server error. restart please!',\n            finishedKeyPair: 'Generate new key pair down.',\n            Success: 'Success',\n            doCancel: 'Canceled generating key pair!',\n            errorKeyPair: 'here was an ERROR in generating new key pair, Please try again!',\n            SystemPasswordError: 'Your key pair password does not match. Please try again. If you forgot your password, please delete this key pair. Beware you will lose you current account settings.',\n            finishedDeleteKeyPair: 'Key pair deleted!',\n            offlineError: 'There is no internet connection detected. Please check your network and try again!',\n            imapErrorMessage: [\n                /* 0 */ 'There was an error in establishing connection to CoNET. Please try to connect again or try at a later time. If you continue to receive this error, please contact CoNET support. ',\n                /* 1 */ 'Data format error!',\n                /* 2 */ 'This computer does not detect an internet connection. Please check your network and try again!',\n                /* 3 */ `Email server did respond to username or an error in password. You may need use APP password to pass this test if you did normal password. Or your app passwords need to be updated.`,\n                /* 4 */ `Error in connecting to email server with the current IMAP port. Please check the email account to make sure IMAP is enabled and the IMAP port settings. The port may be filtered by a firewall on your network.`,\n                /* 5 */ `There is a problem with this IMAP email server's security certificate!`,\n                /* 6 */ `Error in email server’s address. Please check the email server’s domain. Or have not internet, please check your network.`,\n                /* 7 */ 'This email provider currently looks does not support CoNET’s @OPN technology, please try do test again, or change to another email provider.',\n                /* 8 */ `Email server did respond to SMTP's username or an error in password.`,\n                /* 9 */ `There is a problem with this SMTP email server’s security certificate!`,\n                /* 10 */ `Connecting to SMTP Email server received an unknown error!`,\n                /* 11 */ 'Please check email account!',\n                /* 12 */ 'Does not establishing connection to CoNET yet.',\n                /* 13 */ 'Your mail account has exceeded (over quota). ',\n                /* 14 */ 'Twitter return unknow error, please try again.'\n            ],\n            CoNET_requestError: [\n                /* 0 */ 'Did not received response from CoNET. Try reconnect to CoNET, please wait.',\n                /* 1 */ 'Invalid request!'\n            ]\n        },\n        emailConform: {\n            activeViewTitle: 'Active your keypair.',\n            emailTitle: 'Welcome to CoNET.',\n            info1_1: `Please complete key pair verification. Click the button 'Request verification email' to request mail. Please check your [`,\n            info1_2: '] mailbox. If you received more then one email from CoNET, please choose the newest email. If you not find the email, please double check your key pair email address. If you have an error, you may delete your key pair and generate a new key pair.',\n            info2: 'Copy all content from [-----BEGIN PGP MESSAGE-----] ... to [-----END PGP MESSAGE-----]. Paste into this text box.',\n            emailDetail1: 'Dear ',\n            emailDetail1_1: ' ,',\n            emailDetail2: 'This is your secret verification code to validate your CoNET account. Please copy and paste all the content in the text area.',\n            bottom1_1: 'Best regards,',\n            bottom1_2: 'The CoNET team',\n            requestReturn: ['ERROR! CoNET system refuse your request, may be you did request repeatedly, please try again late.', 'Verification mail has been sent.'],\n            conformButtom: 'Confirm',\n            reSendRequest: 'Request verification email',\n            formatError: [\n                'Format error! Copy all content from [-----BEGIN PGP MESSAGE-----] ... to [-----END PGP MESSAGE-----]. Paste into this text box.',\n                'Decrypt message failed. Find the lasest mail from CoNET in your key pair email mailbox. Or delete this key pair and rebuild new key pair please.',\n                'Connection to CoNET had an error!. Please exit and restart CoNET.',\n                'This secret verification code was invalid. If you received more then one email from CoNET, please choose the newest email. Do validate again!',\n                'Your CoNET account may have a problem, Please delete your key pair and setup again!',\n                /**5**/ 'Sorry there is an error in connection to CoNET, may be CoNET is offline. Please try again late.',\n                `Your data transfer has hit the daily limit today, please try again tomorrow or upgrade your user type.`,\n                'Your transfer email account may not be working, please check the IMAP account. Or your IMAP accout may not support CoNET system.',\n                'Selected region is unavailable, try again later.',\n                'Your IMAP account recieved an error. Please restart CoNET and try again. If the error is not fixed, You may need check your IMAP account setting to enable third party IMAP applications.',\n                'The page session has expired! Refresh page or restart CoNET plesee.',\n                'Sorry looks CoNET platform failure, please restart CoNET.'\n            ],\n            activeing: 'sending...'\n        },\n        QTGateRegion: {\n            title: 'Advanced private custom gateway service area.',\n            available: 'Available',\n            CoGateRegionStoped: 'Custom gateway server was stopped.',\n            speedTest: 'Speed test：',\n            unavailable: 'Unavailable',\n            proxyDomain: 'Domain lookup via CoNET gateway side.',\n            setupCardTitle: 'connecting with:',\n            paidUse: 'This area offer for subscription user.',\n            MultipleGateway: 'Multi-Gateway:',\n            dataViaGateway: 'All internet data transfered via CoNET gateway.',\n            dataTransfer: 'Data:',\n            dataTransfer_datail: ['All data on CoNET gateway.', `Only when cannot connect to target server.`],\n            proxyDataCache: 'Web cache:',\n            proxyDataCache_detail: ['Yes', 'No'],\n            clearCache: 'Delete all cache now',\n            localPort: 'Local proxy port number:',\n            localPath: 'HTTP/HTTPS conect path name:',\n            requestPortNumber: 'Gateway server port number:',\n            GlobalIp: 'Global IP:',\n            option: 'option',\n            WebRTCleak: 'Stop WebRTC leak',\n            WebRTCleakInfo: 'End-to-End game and chat may not work.',\n            pingError: 'CoNET gateway area speed check error! Please exit CoNET and reopen CoNET as administrator. Then do check speed again.',\n            QTGateRegionERROR: [\n                'Send connect request mail has an error. Please check your IMAP account settings.',\n                ''\n            ],\n            GlobalIpInfo: `Please note: Both iOPN and @OPN will conceal your IP from others. iOPN offers the highest level of data speeds. @OPN offers additional layer of anonymity with some speed as a trade off. [@OPN] option is available in San Francisco, and currently only supports your owniClould Email. Please refer to the Terms of Service for our privacy policy.`,\n            cacheDatePlaceholder: 'Web cache freshness lifetime.',\n            sendConnectRequestMail: [\n                'CoNET connection maybe down. Please wait a moment, re-connecting to CoNET gateway.',\n                'Your connection will reset if you long time non use.'\n            ],\n            cacheDatePlaceDate: [{ name: '1 hour', id: 1 }, { name: '12 hour', id: 12 }, { name: '1 day', id: 24 }, { name: '15 days', id: 360 }, { name: '1 month', id: 720 }, { name: '6 months', id: 4320 }, { name: 'forever', id: -1 }],\n            atQTGateDetail: [\n                /*0*/ `Recommended for full privacy. @OPN@ uses CoNET’s “Quiet” technology to create a obfuscated private network by refracting encrypted data packets thru email servers. @OPN provides stealth internet communications where your IP address is hidden to client or proxy servers. Gaming and video stream my not be supported due to stability and speeds affected by email server choice. Currently iCloud mail is only supported.`,\n                /*1*/ 'Recommended for high speed open internet access. iOPN uses CoNET’s “Quiet” technology to obfuscate encrypted data traffic to look like normal HTTP communications. iOPN offer security and protection of privacy while allowing access to the open internet.',\n                /*2*/ 'Use CoNET’s gateway for domain search to get the right IP address from DNS cache. This is default.',\n                /*3*/ 'Transfer all internet data over OPN.',\n                /*4*/ 'Transfer select data over OPN. Only when unable to connect to certain servers. Network access may speed up but lost your privacy.',\n                /*5*/ 'Web cache (or HTTP cache) is an used for the temporary storage (caching) of web documents, to reduce bandwidth usage, server load, and perceived lag. CoNET always encrypts all web cache data. This does not work for HTTPS connections.',\n                /*6*/ 'Do not use web cache.',\n                /*7*/ 'By setting the cache expiration date, you can always obtain the latest information on the server side.',\n                /*8*/ 'Local proxy server port number is provided for other devices to use CoNET’s OPN connection. Please set a number from 3001 to 65535.',\n                /*9*/ 'Local proxy server http/https access can secure your server.',\n                /*10*/ 'The number of gateways to use. This will further help to obfuscate traffic by using multiple servers. This is available for subscription only.',\n                /*11*/ 'This is your current CoNET gateway port number, You may change the port number if current one is blocked on your network.',\n                /*12*/ 'Web Real-Time Communication (WebRTC) is a collection of standardized technologies that allows web browsers high speed to communicate with each other directly via IP address. It also may used for detect your real IP address even you hide IP address via VPN or other tools.',\n            ],\n            connectQTGate: 'Connecting, Retrieving CoNET gateway information...'\n        },\n        QTGateGateway: {\n            title: 'CoNET service user detail',\n            processing: 'Trying to connect to CoNET network...',\n            error: [\n                /* 0 */ 'Error: Your account has a connection that is using the CoNET proxy server. Please disconnect it before attempting to connect again.',\n                /* 1 */ 'Error: Bandwidth maximum. If you would like to continue using OPN, please upgrade your account. Free accounts have a bandwidth maximum of 100MB per a day, 1 GB every month.',\n                /* 2 */ 'Error: Data format error. Please restart CoNET.', 'Error: This area does not have the resources. Please select another area or try connecting again later.',\n                /* 3 */ 'Error: This region does not support OPN technology. Please select another area, or change other connect type.',\n                /* 4 */ '@OPN support your own iCloud account only. Please change the email account that used to communication with CoNET.'\n            ],\n            connected: 'connected.',\n            promo: 'Promotions',\n            upgrade: 'Upgrade account',\n            accountManager: 'Account',\n            userType: ['Free user', 'Subscription'],\n            datatransferToday: 'The daily bandith limit.：',\n            datatransferMonth: 'The monthly bandwidth limit.：',\n            todaysDatatransfer: 'Available bandwidth today.',\n            monthDatatransfer: 'Available bandwidth this month.',\n            gatewayInfo: ['Gateway Ip address：', 'Gateway connection port：'],\n            userInfoButton: 'How to use?',\n            stopGatewayButton: 'Stop gateway server',\n            disconnecting: 'Destroying...'\n        },\n        qtGateView: {\n            QTGateConnectResultWaiting: 'Please wait. It will may take a few minutes to establish your connection to CoNET.',\n            title: 'Send custom server request',\n            mainImapAccount: 'Email account for communicating with CoNET',\n            QTGateDisconnectInfo: 'CoNET disconnected. Please select an IMAP account to use for connection request. ',\n            QTGateConnectStatus: 'Status of CoNET connection',\n            QTGateConnectResult: [\n                'CoNET disconnected, click to connect to CoNET.', 'Connecting to CoNET.', 'CoNET Connected.', 'Connection stopped with error! Please check IMAP account settings!',\n                'CoNET Connected.'\n            ],\n            QTGateSign: [\n                'Keypair status', 'Your key pair is not signed by CoNET.',\n                'CoNET certification authority is a trusted thus certifying your public keys is yoursalf in CoNET users when you share files of send message to other CoNET user. You also can signing another CoNET users with your keypair for make your trust relationship.',\n                'Getting CoNET certification authority.', 'Opps. System error. Try restart CoNET, if still have please re-install CoNET.', 'System error!'\n            ]\n        },\n        feedBack: {\n            title: 'FEEDBACK',\n            additional: 'Additional info',\n            okTitle: 'Send to CoNET'\n        },\n    }, {\n        coSearch: {\n            searchInputPlaceholder: '請輸入檢索關鍵字組合或網址',\n            SearchText: '搜尋',\n            totalResults: ['大約有', '條記錄'],\n            moreResults: '更多結果',\n            SearchesRelated: ['', '的相關搜尋'],\n            label_HTML: 'HTML代碼',\n            imageSize: '圖片尺寸',\n            label_picture: '圖片',\n            similarImages: '看起來相似的圖片',\n            errorMessage: [\n                '無效請求',\n                '您的圖片格式無法處理，請嘗試選擇其他圖片',\n                '您的請求已達最大值，請稍後再試'\n            ],\n            coSearchConfigMenu: ['搜尋設定', '搜尋引擎指定'],\n            coSearchEngineSelectArray: [\n                {\n                    name: 'google',\n                    icon: 'google',\n                    iconColor: '',\n                    textColor: '',\n                    showName: 'Google',\n                    image: null\n                }\n            ],\n            coSearchConfigIcon: ['google', 'images/bing.svg', ''],\n            coSearchEngineName: ['Google', '', ''],\n            searchToolBarMenu: [\n                \"網頁\", \"新聞\", \"圖片\", \"視頻\"\n            ],\n            timeUnit: {\n                hours: '小時前',\n                day: '天前',\n                mins: '分鐘前'\n            },\n            TimeTolocalTime: function (time) {\n                return new Date(time).toLocaleDateString('zh-TW', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });\n            }\n        },\n        appsManager: {\n            mainLoading: '正在獲取結點信息...',\n            nodeName: '您進入的節點名：',\n            connectAddress: '接入地址：',\n            welcomeTextSub: '隱私安全自由的新互聯網',\n            serviceList: '提供服務一覽'\n        },\n        youtube: {\n            startup: {\n                title: '歡迎使用Co for Youtube',\n                detail: '在此您可以檢索Youtube視頻，下載並播放所選視頻'\n            },\n            search: {\n                placeholder: '請輸入檢索關鍵字，或輸入Youtube的播放鏈接',\n                button_text: '檢索',\n                error: [\n                    '您的檢索無效，請再次檢索。'\n                ]\n            }\n        },\n        perment: {\n            serverTitle: '伺服器'\n        },\n        twitter: {\n            newTwitterAccount: `請輸入您的推特APP信息，如何獲得和設置推特賬號APP信息，請點擊<a target=\"_blank\" href='https://github.com/QTGate/QTGate-Desktop-Client/wiki/Create-Twitter-APP'\">這裡</a>獲得更多信息`,\n            addAccount: '添加推特賬戶',\n            following: ['正在關注', '解除關注', '關注'],\n            followers: '關注者',\n            second: '秒',\n            min: '分',\n            hour: '小時',\n            retweeted: '已轉推',\n            month: '月',\n            day: '日',\n            close: '關閉',\n            replying: '回覆: ',\n            videoSizeOver: '視頻超推特限制: 尺寸 <(1280x1024)，文件 <  300MB，時間 < 140秒，請轉換視頻後再上傳',\n            twitterBottonTitle: ['發推', '全部發推'],\n            newTwitterTitle: ['撰写新推文', '撰写新对话串'],\n            returnEdit: '回編輯',\n            newTwitterDistroyButtonTitle: ['放棄推文', '捨棄對話串'],\n            urlInfo: '<h3>推特客户端預覽版</h3><p>用戶可以无限量免费使用此客戶端，免翻牆(不使用VPN，不用連結CoGate代理服務器)匿名訪問(您的真實IP地址不會洩露給推特)您的推特帳戶。</p><p>其他设备可以输入以下网址打开此APP应用</p>',\n            accountError: '推特回送錯誤信息提示：您輸入的APP應用設定信息有誤。請檢查您的推特APP信息後再試。'\n        },\n        thirdParty: {\n            information: '歡迎來到CoNET網絡',\n            comesoon: '即將登場',\n            app: ['CoGate', '酷茶', '酷存', 'Co邮箱', 'Co新闻频道', '酷檢索', '酷推特', 'Co for', '酷錢包', 'CoNet業務訂製'],\n            qtgateGateway: 'CoNET提供的高質量上網技術iOPN和@OPN，在CoNET全球16個區域，當場定制您專屬的代理服務器，變換您的IP地址隱身無障礙的訪問互聯網',\n            dimmer: [\n                '高質量量身定制代理伺服器業務，讓您隱身安全不受注意的網上沖浪。',\n                '隱身匿名去中心化不被封鎖的社交媒體',\n                '安全隱私文件雲存儲系統',\n                '隱身匿名邮件客户端，可免翻牆访问Gmail',\n                '免翻墙隱身匿名訪問世界頭條新闻',\n                'QTG承接定制各類公眾服務類及跨國企業私有APP業務',\n                '免翻牆匿名隱身網頁檢索',\n                '免翻牆匿名隱身推特客戶端',\n                '免翻牆匿名隱身Youtube客戶端',\n                'CoNET加密貨幣錢包'\n            ]\n        },\n        account: {\n            willPayNextExpir: '自動扣款 ',\n            openAutomatically: '打開自動扣款',\n            QTGatePayRisk: '使用CoNET安全網關支付，如果您有安全疑慮，請使用Stript安全網關支付。',\n            paymentSuccessTitile: '謝謝您',\n            networkShareTitle: '代理伺服器網絡',\n            stripePayment: '銀行網關支付',\n            promoButton: '我有促銷碼',\n            qtgatePayment: 'CoNET網關支付',\n            paymentProblem1: '支付遇到問題',\n            paymentProblem: '您目前的所在區域看上去銀行網關被和諧，您可以使用CoNET網關支付來完成支付',\n            title: '賬戶管理',\n            currentPlanExpire: ['訂閱截止日期：', '下一次自動續訂日', '每月數據重置日'],\n            CancelSuccess: function (PlanExpire, isAnnual, returnAmount) {\n                return `中止訂閱成功。您可以一直使用您的原訂閱到${new Date(PlanExpire).toLocaleDateString()}為止。以後您將會自動成為CoNET免費用戶，可以繼續使用CoNET的各項免費功能。 ${isAnnual ? `退款金額us$${returnAmount}會在5個工作日內退還到您的支付卡。 ` : '下月起CoNET系統不再自動扣款。 '} 祝您網絡衝浪愉快。`;\n            },\n            currentAnnualPlan: ['月度訂閱', '年度訂閱'],\n            cardPaymentErrorMessage: [\n                /* 0 */ '輸入的信用卡號有誤！',\n                /* 1 */ '輸入的信用卡期限有誤！',\n                /* 2 */ '輸入的信用卡安全碼有誤！',\n                /* 3 */ '輸入的信用卡持有人郵編有誤！',\n                /* 4 */ '支付失敗，支付無法完成請稍後再試',\n                /* 5 */ '支付數據存在錯誤',\n                /* 6 */ '您的付款被銀行所拒絕',\n                /* 7 */ '發生錯誤，請稍後再試',\n            ],\n            cantUpgradeMonthly: '年度計劃不可降級為月度計劃。請先終止您當前訂閱的年度計劃，再重新申請此月度訂閱',\n            segmentTitle: '賬戶Email: ',\n            currentPlan: '當前訂閱: ',\n            oldPlanBalance: '原計劃剩餘價值：',\n            needPay: '應付金額：',\n            monthResetDay: '月重置日：',\n            cancelPlanButton: '中止當前訂閱',\n            monthResetDayAfter: '',\n            bandwidthBalance: '月度數據剩余量：',\n            planPrice: '訂閱價格：',\n            MonthBandwidthTitle: '月度代理伺服器限額：',\n            dayBandwidthTitle: '每日限額：',\n            upgradeTitle: '升級',\n            planExpirDate: function (year, month, day) { return `${year} 年${month}月${day}日`; },\n            accountOptionButton: '賬戶選項',\n            paymentSuccess: '您的訂閱已經完成,祝您網絡衝浪愉快。',\n            qtgateTeam: 'CoNET開發團隊敬上',\n            paymentProcessing: '正在通訊中...',\n            DowngradeTitle: '降級賬戶選項',\n            multiOpn: 'OPN併發多代理技術',\n            cancelPlan: '終止當前訂閱',\n            cantCancelInformation: '您的賬戶可能是CoNET測試用戶，或使用優惠碼產生的訂閱用戶，此類賬戶可以升級但不能被中止',\n            MonthBandwidthTitle1: '傳送限額',\n            monthlyAutoPay: function (monthCost) { return `<span>每月自動扣款</span><span class=\"usDollar\">@ us$</span><span class=\"amount\" >${monthCost}</span>/月<span>`; },\n            annualPay: function (annual_monthlyCost) { return `<span>年付款每月只需</span><span class=\"usDollar\">@ us$</span><span class=\"amount\" >${annual_monthlyCost}</span>/月<span>`; },\n            expirationYear: '信用卡期限',\n            serverShare: '代理伺服器',\n            cardNumber: '信用卡號',\n            cvcNumber: '信用卡安全碼',\n            calcelPayment: '中止付款',\n            doPayment: '確認付款',\n            postcodeTitle: '信用卡擁有者郵編',\n            aboutCancel: '關於中止訂閱',\n            payAmountTitile: '支付合計',\n            canadaCard: '*加拿大持卡人將自動加算GST(BC)5%',\n            multiRegion: ['單一代理區域並發代理', '多代理區域混合併發代理', '多代理區域混合併發代理', '多代理區域混合併發代理'],\n            maxmultigateway: ['最大同時可二條並發代理數', '最大同時可使用四條並發代理數*', '最大同時可使用四條並發代理數'],\n            continue: '下一步',\n            serverShareData: ['共享伺服器', '獨佔一台伺服器*', '獨佔二台伺服器*', '獨佔四台伺服器'],\n            monthlyPay: '月租費',\n            internetShareData: ['共享高速帶寬', '獨享高速帶寬*', '獨享雙線高速帶寬*', '獨享四線高速帶寬'],\n            serverShareData1: 'OPN併發多代理技術，同時使用數大於獨占數時，會相應分享您所獨占的資源',\n            cancelPlanMessage: '可隨時終止您的訂閱，CoNET的訂閱是以月為基本的單位。您的月訂閱將在下月您的訂閱起始日前被終止，您可以繼續使用您的本月訂閱計劃，您將自動回到免費用戶。如果您是每月自動扣款，則下月將不再扣款。如果您是年度訂閱計劃，您的退款將按普通每月訂閱費，扣除您已經使用的月份後計算的差額，將自動返還您所支付的信用卡賬號，如果您是使用促銷碼，或您是測試用戶，您的終止訂閱將不能被接受。 ',\n            cancelPlanMessage1: function (isAnnual, amount, monthlyPay, expire, passedMonth, totalMonth) {\n                return `<span>您的訂閱計劃是${isAnnual ? `年度訂閱，退還金額將按照您已付年訂閱費</span><span class=\"usDollar\">us$</span><span class=\"amount\">${amount / 100}</span><span> - 該訂閱原價 </span><span class=\"usDollar\">us$</span><span class=\"amount\">${monthlyPay / 100}</span><span> X 已使用月數(包括本月) </span><span class=\"amount\">${passedMonth}</span><span> = 餘額 </span><span class=\"usDollar\">us$</span><span class=\"amount\">${amount - passedMonth * monthlyPay > 0 ? (amount - passedMonth * monthlyPay) / 100 : 0}</span><span>，將在7個工作日內，退還到您用來支付的信用卡帳戶。</span>` : `月訂閱，您的訂閱將下次更新日</span><span class=\"amount\">${nextExpirDate(expire).toLocaleDateString()}</span><span>時不再被自動扣款和更新。</span>`}`;\n            }\n        },\n        QTGateDonate: {\n            title: 'CoNET贊助商提供的免流量網站',\n            meta_title: '捐贈者：',\n            detail: '所有CoNET用戶，使用CoNET代理伺服器，訪問贊助商贊助的網站時產生的流量，都不被計入。免費用戶需注意的是，如本日或本月流量已用完，無法接入CoNET代理伺服器，則無法利用此功能。'\n        },\n        useInfoiOS: {\n            title1: 'iOS設備本地代理伺服器設定',\n            info: [{\n                    title: '打開控制面板，點擊Wi-Fi',\n                    titleImage: '/images/macOsControl.jpg',\n                    detail: '',\n                    image: '/images/iOS1.jpg'\n                }, {\n                    title: '選擇當前WiFi的圈i符號',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/iOS2.jpg'\n                }, {\n                    title: '選擇底部的設置代理伺服器',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/iOS3.jpg'\n                }, {\n                    title: '選擇自動設置',\n                    titleImage: '',\n                    detail: '<p>在URL網址處，HTTP和HTTPS代理按照藍色第一行填入，SOCKS代理按藍色第二行填入</p>',\n                    image: '/images/iOS4.jpg'\n                }]\n        },\n        firefoxUseInfo: {\n            title1: '火狐瀏覽器它單獨設定代理服務，可以不影響系統而輕鬆使用代理上網',\n            info: [{\n                    title: '打開火狐，點擊右上角工具圖標，選擇設定',\n                    titleImage: '/images/macOsControl.jpg',\n                    detail: '<p><a href=\"https://www.mozilla.org/zh-TW/firefox/#\" target=\"_blank\">下载Firefox</a></p>',\n                    image: '/images/firefox1.jpg'\n                }, {\n                    title: '選擇常規項，滾動畫面至最下部，在網絡代理處，點擊詳細設定',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/firefox2.jpg'\n                }, {\n                    title: '選擇自動設置代理伺服器，選勾DNS使用SOCKS v5',\n                    titleImage: '',\n                    detail: 'HTTP和HTTPS代理按照藍色第一行填入，SOCKS代理按藍色第二行填入',\n                    image: '/images/firefox3.jpg'\n                }]\n        },\n        useInfoWindows: {\n            title1: 'Windows10本地代理伺服器設定',\n            info: [{\n                    title: '關於Windows其他版本',\n                    titleImage: '',\n                    detail: '<p>Windows其他版本的代理伺服器設定請參照<a target=\"_blank\" href=\"#\" onclick=\"return linkClick (`https://support.microsoft.com/ja-jp/help/135982/how-to-configure-internet-explorer-to-use-a-proxy-server`)\">微軟公司網站</a></p><p>请按以下参数设置本地代理伺服器：</p>',\n                    image: ''\n                }, {\n                    title: '啟動Internet Explorer',\n                    titleImage: '/images/IE10_icon.png',\n                    detail: '<p>點擊右上角工具圖標，滑動設定菜單至最下部選擇【設定】</p>',\n                    image: '/images/windowsUseInfo1.jpg'\n                }, {\n                    title: '滑動菜單至最下部點擊高級設定',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/windowsUseInfo2.jpg'\n                }, {\n                    title: '再次滑動菜單，點擊打開代理伺服器設定',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/windowsUseInfo3.jpg'\n                }, {\n                    title: '選擇自動設置代理伺服器。',\n                    titleImage: '',\n                    detail: '<p>WINDOWS10系統只對應HTTP和HTTPS，如果想使用全局代理的用戶，需另外安裝瀏覽器如火狐等，然後在火狐瀏覽器內單獨設定Proxy全局代理SOCKS</p>',\n                    image: '/images/windowsUseInfo4.jpg'\n                }]\n        },\n        useInfoAndroid: {\n            title1: '安卓設備本地代理伺服器設定',\n            info: [{\n                    title: '打开控制面板，选择Wi-Fi设定',\n                    titleImage: '/images/androidSetup.jpg',\n                    detail: '',\n                    image: '/images/android1.jpg'\n                }, {\n                    title: '長按當前WiFi連接名稱等待菜單出現，選擇菜單的修改設定',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/android2.jpg'\n                }, {\n                    title: '打開顯示高級選項，在代理伺服器設定(Proxy)中選擇自動設置',\n                    titleImage: '',\n                    detail: 'HTTP和HTTPS代理按照藍色第一行填入，SOCKS代理按藍色第二行填入',\n                    image: '/images/android3.jpg'\n                }]\n        },\n        useInfoMacOS: {\n            title: '本地代理伺服器已在後台運行。您的其他電子設備，可通過設置本地代理，來使用CoNET連接到互聯網',\n            wrtTestAreaTitle: 'WebRTC漏洞数据泄漏区域',\n            customProxy: '訂製伺服器完成',\n            title1: 'MacOS 本地代理伺服器設定',\n            localIpAddress: '如果能看到這個IP地址，由於是本地局域網地址洩漏，無關緊要。',\n            proxySetupHelp: '如需幫助，請點擊下列您的OS系統所屬圖案',\n            globalIpAddress: '如果顯示這個IP，您的瀏覽器洩漏了您真實的IP地址',\n            webRTCinfo: '阻止WebRTC漏洞，請使用SOCKS代理設定，檢查是否漏洞還在，請點擊<a href=\"/Wrt\" target=\"_blank\">這裡</a>',\n            wrtTest: '以下為測試結果：',\n            proxyServerIp: '<p>代理設定選擇：<span style=\"color: brown;\">自動設定</p>',\n            proxyServerPort: 'HTTP和HTTPS代理的設定為：',\n            proxyServerPassword: 'SOCKS代理的設定為：',\n            info: [{\n                    title: '打開控制面板，點擊【網絡】',\n                    titleImage: '/images/macOsControl.jpg',\n                    detail: '',\n                    image: '/images/userInfoMacos1.jpg'\n                }, {\n                    title: '選擇網絡【高級...】',\n                    titleImage: '',\n                    detail: '',\n                    image: '/images/macosUserInfo2.jpg'\n                }, {\n                    title: '點擊代理伺服器設定，選勾自動代理，選購排除簡單Host名',\n                    titleImage: '',\n                    detail: '<p>HTTP和HTTPS代理按照藍色第一行填入，SOCKS代理按藍色第二行填入</p>',\n                    image: '/images/macosUserInfo3.jpg'\n                }]\n        },\n        QTGateInfo: {\n            title: '功能簡介',\n            version: '本機安裝版本：v',\n            detail: [{\n                    color: '#a333c8',\n                    icon: 'exchange',\n                    header: '隱身匿名自由上網CoNET',\n                    detail: 'CoNET通過使用<a href=\"https://zh.wikipedia.org/wiki/%E9%AB%98%E7%BA%A7%E5%8A%A0%E5%AF%86%E6%A0%87%E5%87%86\" target=\"_blank\">AES256-GCM</a>和<a href=\"https://zh.wikipedia.org/wiki/PGP\" target=\"_blank\">OpenPGP</a >加密Email通訊，創造了OPN匿名網絡通訊技術，CoNET公司首創的@OPN技術，它全程使用加密Email通訊，客戶端和代理伺服器彼此之間不用交換IP地址，實現高速網絡通訊。iOPN通訊技術是一種HTTP協議下的加密混淆代理技術，能夠隱藏變換您的IP地址高速通訊。二種通訊方式都能夠讓您，隱身和安全及不被檢出的上網，保護您的隱私，具有超強對抗網絡監控,網絡限制和網絡阻斷。'\n                }, {\n                    color: '#e03997',\n                    icon: 'talk outline',\n                    header: '無IP點對點即時加密通訊服務QTChat',\n                    detail: 'CoNET用戶之間通過email的點對點即時通訊服務，它具有傳統即時通訊服務所不具有的，匿名無IP和用戶之保持秘密通訊的功能。 QTChat加密通訊服務可以傳送文字，圖片和視頻文件信息，CoNET系統只負責傳送信息，不擁有信息，也無法檢查信息本身，所以CoNET不承擔信息所有的法律責任。 QTChat支持群即時通訊，將支持視頻流直播服務。'\n                }, {\n                    color: '#6435c9',\n                    icon: 'cloud upload',\n                    header: '加密文件匿名網絡雲存儲分享功能QTStorage',\n                    detail: '用戶通過申請多個和不同的免費email服務商賬號，可以把一個文件加密拆分成多個部分，分別存儲在不同的email賬號下，可以保密安全和無限量的使用網絡儲存。用戶還可以通過CoNET系統在CoNET用戶之間分享秘密文件。'\n                },\n                {\n                    color: 'darkcyan',\n                    icon: 'spy',\n                    header: '阻斷間諜軟件',\n                    detail: 'CoNET系統連接全球DNSBL聯盟數據庫，用戶通過訂閱CoNET系統黑名單列表，並使用CoNET客戶端上網，讓潛伏在您電子設備內的間諜軟件，它每時每刻收集的信息，不能夠被送信到其信息收集伺服器，能夠最大限的保障您的個人隱私。'\n                }, {\n                    color: '#6435c9',\n                    icon: 'external share',\n                    header: '本地VPN伺服器',\n                    detail: 'CoNET用戶在戶外時可以通過連接自己家裡的VPN，來使用CoNET客戶端隱身安全上網。'\n                }]\n        },\n        cover: {\n            firstTitle1: 'CoNET平台',\n            firstTitle2: '安全隱私自由的互聯網',\n            start: '開門',\n            proxyStoped: 'CoGate定制代理伺服器已經停止，如需使用請重新定制代理伺服器。'\n        },\n        topWindow: {\n            title: '慶祝加拿大150週年特別提供'\n        },\n        firstNote: {\n            title: '歡迎使用CoNET，感謝您使用我們的產品和服務(下稱“服務”)。本服務由總部設在加拿大的CoNET Technology Inc.下稱“CoNET”提供。 ',\n            firstPart: '您使用我們的服務即表示您已同意本條款。請仔細閱讀。使用我們的服務，您必須遵守服務中提供的所有政策。',\n            detail: [\n                {\n                    header: '關於我們的服務',\n                    detail: '請勿濫用我們的服務，舉例而言: 請勿干擾我們的服務或嘗試使用除我們提供的界面和指示以外的方法訪問這些服務。您僅能在法律(包括適用的出口和再出口管制法律和法規)允許的範圍內使用我們的服務。如果您不同意或遵守我們的條款或政策，請不要使用我們所提供的服務，或者我們在調查可疑的不當行為，我們可以暫停或終止向您提供服務。'\n                }, {\n                    header: null,\n                    detail: '使用我們的服務並不讓您擁有我們的服務或您所訪問的內容的任何知識產權。除非您獲得相關內容所有者的許可或通過其他方式獲得法律的許可，否則您不得使用服務中的任何內容。本條款並未授予您使用我們服務中所用的任何商標或標誌的權利。請勿刪除、隱藏或更改我們服務上顯示的或隨服務一同顯示的任何法律聲明。'\n                }, {\n                    header: '關於CoNET無IP通訊技術和隱私保護的局限性',\n                    detail: 'CoNET世界首創的使用Email的IMAP協議建造一個無IP通訊環境，在您利用CoNET進行通訊過程中，CoNET無法獲得您目前所使用的IP地址，可以最大限度的保障您的個人隱私。但是這項技術並不能夠保證您的信息絕對的不被洩露，因為您的IP地址有可能被記錄在您所使用的Email服務供應商，如果持有加拿大法院令尋求CoNET的Log公開，再和Email服務供應商的Log合併分析，可能會最終得到您的信息。CoNET並不能夠絕對保障您的隱私。'\n                }, {\n                    header: '關於個人隱私保護，系統日誌和接收CoNET傳送的信息',\n                    detail: '在您使用服務的過程中，我們可能會向您發送服務公告、管理消息和其他信息。您可以選擇不接收上述某些信息。'\n                }, {\n                    header: null,\n                    detail: '當您使用我們的服務時，我們為了計費處理會自動收集非常有限的數據流量信息，並存儲到伺服器日誌中。數據流量信息僅用於計算客戶應支付通訊費用而收集的，它收集的數據是：日期，用戶帳號，所使用的代理服務區域和代理伺服器IP，數據包大小，下載或上傳。例如：'\n                }, {\n                    header: null,\n                    detail: '<p class=\"tag info\">06/20/2017 18:12:16, info@CoNET.com, francisco, 104.236.162.139, 300322 byte up, 482776323 byte down.</p><p class=\"tag info\">06/21/2017 12:04:18, info@CoNET.com, francisco, 104.236.162.139, 1435226 byte up, 11782238 byte down.</p>'\n                }, {\n                    header: null,\n                    detail: 'CoNET沒有保存除了以上信息以外的任何其他信息。我們會配合並向持有加拿大法院令的執法機構提供此日誌文件。如果您是加拿大以外地區的執法機構，有這方面信息披露的需求，請通過加拿大外交部來聯繫我們：'\n                }, {\n                    header: null,\n                    detail: '<a class=\"tag alert\" href=\"http://www.international.gc.ca/\">http://www.international.gc.ca/</a>'\n                }, {\n                    header: '版權所有權',\n                    detail: '該軟件是CoNET的智慧產權，並且受到相關版權法，國際版權保護規定和其他在版權授與國家內的相關法律的保護。該軟件包含智慧產權材料, 商業秘密及其他產權相關材料。你不能也不應該嘗試修改，反向工程操作，反彙編或反編譯CoNET服務，也不能由CoNET服務項目創造或衍生其他作品。'\n                }, {\n                    header: null,\n                    detail: '關於我們服務中的軟件，CoNET授予您免許可使用費、不可轉讓的、非獨占的全球性個人許可, 允許您使用由CoNET提供的、包含在服務中的軟件。本許可僅旨在讓您通過本條款允許的方式使用由CoNET提供的服務並從中受益。您不得複制、修改、發布、出售或出租我們的服務, 或所含軟件的任何部分。'\n                }, {\n                    header: '修改與終止服務',\n                    detail: '我們持續改變和改善所提供的服務。我們可能會新增或移除功能或特性，也可能會暫停或徹底停止某項服務。您隨時都可以停止使用服務，儘管我們並不希望您會這樣做。 CoNET也可能隨時停止向您提供服務，或對服務附加或設定新的限制。'\n                }, {\n                    header: '服務的責任',\n                    detail: '在法律允許的範圍內，CoNET及其供應商和分銷商不承擔利潤損失、收入損失或數據、財務損失或間接、特殊、後果性、懲戒性或懲罰性損害賠償責任。'\n                }, {\n                    header: '法律規定的貿易禁止事項',\n                    detail: '當您按下同意按鈕，表示您已經確認您不屬於加拿大法律所規定的禁止貿易對象的列表之中。'\n                }, {\n                    header: '服務的商業使用',\n                    detail: '如果您代表某家企業使用我們的服務，該企業必須接受本條款。對於因使用本服務或違反本條款而導致的或與之相關的任何索賠、起訴或訴訟，包括因索賠、損失、損害賠償、起訴、判決、訴訟費和律師費而產生的任何責任或費用，該企業應對CoNET及其關聯機構、管理人員、代理機構和員工進行賠償並使之免受損害。'\n                }, {\n                    header: '本條款的變更和約束力',\n                    detail: '关于本条款：我们可以修改上述条款或任何适用于某项服务的附加条款，例如，为反映法律的变更或我们服务的变化而进行的修改。您应当定期查阅本条款。我们会在本网页上公布这些条款的修改通知。我们会在适用的服务中公布附加条款的修改通知。所有修改的适用不具有追溯力，且会在公布十四天或更长时间后方始生效。但是，对服务新功能的特别修改或由于法律原因所作的修改将立即生效。如果您不同意服务的修改条款，应停止使用服务。如果本条款与附加条款有冲突，以附加条款为准。'\n                }, {\n                    header: '',\n                    detail: '本条款约束CoNET与您之间的关系，且不创设任何第三方受益权。如果您不遵守本条款，且我们未立即采取行动，并不意味我们放弃我们可能享有的任何权利（例如，在将来采取行动）。如果某一条款不能被强制执行，这不会影响其他条款的效力。加拿大BC省的法律（不包括BC州的法律冲突规则）将适用于因本条款或服务引起的或与之相关的纠纷。因本条款或服务引起的或与之相关的所有索赔，只能向加拿大BC省法院提起诉讼，且您和CoNET同意上述法院拥有属人管辖权。'\n                }\n            ],\n            disagree: '不同意',\n            agreeMent: 'CoNET服務條款和隱私權'\n        },\n        linuxUpdate: {\n            newVersionDownload: '點擊這裡下載並安裝',\n            step1: '請更新版本: ',\n            step2: '授權新版本CoNET為可執行文件',\n            step2J1: '/images/linuxUpdate1_tw.jpg',\n            step2J2: '/images/linuxUpdate2_tw.jpeg',\n            step2_detail1: '右鍵點擊已下載的CoNET圖標，選擇菜單裡的文件屬性',\n            step2_detail2: '在權限選項裡，選勾“允許檔案文件執行”。',\n            step3: '退出舊版本CoNET後，雙擊CoNET文件執行安裝',\n            exit: '退出CoNET',\n            tryAgain: '再次嘗試',\n            refresh: '刷新頁面'\n        },\n        imapInformation: {\n            title: '通訊專用Email郵箱設置',\n            tempImapAccount: `臨時郵箱申請有困難？您可以暫時使用<a href=\"#\" style = \"margin-left: 0.5em;\" class=\"ui label teal\" onclick=\"return linkClick ('https://github.com/QTGate/QTGate-Desktop-Client/wiki/IMAP%E8%87%A8%E6%99%82%E5%B8%B3%E6%88%B6')\">CoNET網絡提供的臨時IMAP帳號供各位測試</a>`,\n            infomation: `請設置CoNET網絡通訊專用Email郵箱信息。由於此賬戶的用戶名和密碼信息會提交給CoNET網絡，為了防止您的個人信息被洩漏，請新申請一個臨時Email賬戶。目前CoNET網絡技術對應<a class=\"ui label teal small\" href=\"#\" onclick=\"return linkClick ('https://www.icloud.com/')\">Apple iCloud</a><a class=\"ui label teal small\" href=\"#\" onclick=\"return linkClick ('https://www.microsoft.com/zh-tw/outlook-com/mobile/?WT.mc_id=mscom')\">微軟OUTLOOK</a><a class=\"ui label teal small\" href=\"#\" onclick=\"return linkClick ('https://www.zoho.com/mail/')\">俄羅斯ZOHO郵箱</a><a href=\"#\" class=\"ui label teal small\" onclick=\"return linkClick ('https://www.gmx.com/mail/#.1559516-header-nav1-2')\">美國在線GMX郵箱</a>，CoNET強力推薦使用蘋果公司的Email可以達到最佳速度。密碼請使用Email服務商的<a href=\"#\" onclick=\"return linkClick ('https://tw.help.yahoo.com/kb/SLN15241.html')\">應用密碼</a>。對於Email供應商在應用密碼申請時，須打開<a href=\"#\" onclick=\"return linkClick ('https://tw.help.yahoo.com/kb/%E9%96%8B%E5%95%9F%E5%85%A9%E6%AD%A5%E9%A9%9F%E9%A9%97%E8%AD%89-sln5013.html')\">二步認證</a>並必須提供手機號碼接受驗證碼，為保護您的隱私，建議使用免費在線代理接收驗證碼服務。如 ( <a href=\"#\" onclick=\"return linkClick('http://receive-sms-online.com/')\">receive-sms-online.com</a>, <a href=\"#\" onclick=\"return linkClick('https://sms-online.co/receive-free-sms')\" >sms-online.co</a>, <a href=\"#\" onclick=\"return linkClick('https://receive-a-sms.com/')\" >receive-a-sms.com</a> ) 更多請 <a href=\"#\" onclick=\"return linkClick ('http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=%E5%85%8D%E8%B4%B9%E5%9C%A8%E7%BA%BF%E6%8E%A5%E6%94%B6%E6%89%8B%E6%9C%BA%E9%AA%8C%E8%AF%81%E7%A0%81&rsv_pq=e94f47a50001f66f&rsv_t=b03ePiy3rHH0T4FVoWB8Hx9vrVdZLzVhhErWOo4xdBpjDw%2BtGri%2BViTaVAw&rqlang=cn&rsv_enter=1&rsv_sug3=42&rsv_sug1=5&rsv_sug7=100')\">百度查找</a>，<a href=\"#\" onclick=\"return linkClick ('https://www.google.com/search?q=%E5%85%8D%E8%B4%B9%E5%9C%A8%E7%BA%BF%E6%8E%A5%E6%94%B6%E6%89%8B%E6%9C%BA%E9%AA%8C%E8%AF%81%E7%A0%81&oq=%E5%85%8D%E8%B4%B9%E5%9C%A8%E7%BA%BF%E6%8E%A5%E6%94%B6%E6%89%8B%E6%9C%BA%E9%AA%8C%E8%AF%81%E7%A0%81&aqs=chrome..69i57j69i60.254j0j4&sourceid=chrome&ie=UTF-8')\">Google查找</a>。`,\n            serverDetail: '詳細設定：',\n            imapServer: 'IMAP伺服器設定',\n            UserName: '登陸用戶名稱',\n            Ssl: '使用Ssl加密信息傳輸：',\n            imapServerInput: 'IMAP伺服器IP或域名',\n            portName: '通訊連接埠：',\n            otherPortNumber: '其他號碼：',\n            smtpServer: 'SMTP伺服器設定',\n            smtpServerInput: 'SMTP伺服器設定',\n            Error_portNumber: '連接埠應該是從1-65535之間，並且不是22的數字',\n            emailServerPassword: '郵箱密碼(推薦使用應用專用密碼)',\n            imapAccountConform: function (iamp, account) { return `<p class=\"ui small header brown\">警告：</p><p class=\"grey\">當您按下提交按鈕時，意味著您已經確認【<B class=\"red\">${iamp}</B>】是為了使用CoNET系統而特別申請的臨時郵箱，您同意承擔由此帶來的風險，並授權CoNET系統可以使用這個Email郵箱傳輸信息!</p><p class=\"grey\" >CoNET平台將會向CoNET發送包含以下信息的email：【<B class=\"red\">${iamp}</B>】及APP密碼，註冊【<B class=\"red\">${account}</B>】郵箱地址，使用語言，時區，加密公鑰。 </p><p class=\"grey\">同時您也同意並授權CoNET可以向您的註冊郵箱【<B class=\"red\">${account}</B>】發送CoNET有關服務，促銷，賬戶及其他信息。 </p>`; },\n            agree: '我已經了解風險，並願意繼續',\n            imapOtherCheckError: '不能連接到Email伺服器，有可能您設定的伺服器名稱或IP，通訊連接埠有誤，請檢查您的伺服器詳細設定！',\n            CertificateError: 'Email伺服器提示的證書不能被系統信任！您的Email伺服器有可能是一個仿冒的，您如果想繼續，請在詳細設定裡選擇【允許連接到不被信任證書的Email伺服器】，但您的Email登陸信息有可能洩漏給此伺服器！',\n            IgnoreCertificate: '允許連接到不被信任證書的Email伺服器',\n            Certificat: '如果您不確定請別選擇這項，這個選擇是非常危險，因為它允許連接上一個仿冒的伺服器，可能洩露您的用戶名和密碼。',\n            AuthenticationFailed: 'Email伺服器提示用戶名或密碼錯誤，請仔細檢查您的用戶名和密碼！',\n            addAEmail: '添加通訊用Email賬戶',\n            tryAgain: '再試一次',\n            connectImap: '連結CoNET網絡',\n            cancelConnect: '終止CoNET網絡連接',\n            imapItemTitle: '通訊用郵箱詳細信息',\n            loaderText: ['正', '在', '和', 'C', 'o', 'N', 'E', 'T', '建', '立', '通', '訊', '管', '道', '...'],\n            imapCheckingStep: [\n                /* 0 */ '正在尝试连接邮件伺服器',\n                /* 1 */ '邮件伺服器IMAP連接成功，正在等待CoNET對接。',\n                /* 2 */ '邮件伺服器SMTP連接成功',\n                /* 3 */ 'CoNET客户端向CoNET系统发出联机请求Email。和CoNET联机需要额外的时间，请耐心等待。',\n                /* 4 */ '成功連接CoNET',\n                /* 5 */ '邮件伺服器IMAP連接成功'\n            ],\n            imapResultTitle: 'IMAP伺服器CoNET通訊評分：',\n            testSuccess: '電子郵件伺服器連接試驗成功！',\n            exitEdit: '退出編輯Email帳戶',\n            deleteImap: '刪除IMAP帳戶',\n            proxyPortError: '連接埠應該是從3001-65535之間的數字，或此端口已被其他APP所占用，請嘗試填入其他號碼。',\n            appPassword: '關於APP密碼',\n            imapCheckError: [\n                '不能连接到郵件伺服器，有可能您沒有互聯網，或所在網絡不支持郵件IMAP通訊，請檢查您的網絡，或刷新頁面重試一次',\n                '郵件伺服器提示用户名或密码错误，请仔细检查您的用户名和密码！',\n                '郵件伺服器證書錯誤！您所在網絡可能存在網絡中間人攻擊，請換網絡環境後再嘗試。',\n                '郵件伺服器發送郵件錯誤，這通常是您使用的密碼是普通密碼所致，請換用APP密碼後再次嘗試',\n                '未連結互聯網，請檢查網絡',\n                '未知錯誤，請退出CoNET後再試。',\n                '您的郵箱無可用空間錯誤，請檢查郵箱刪除不必要的郵件後再試。'\n            ]\n        },\n        Home_keyPairInfo_view: {\n            deleteKeyPairHaveLogin: '請使用登陸後的客戶端來刪除您的密鑰',\n            title: '密鑰信息',\n            emailNotVerifi: '您的密鑰未獲CoNET簽署認證。 ',\n            emailVerified: '您的密鑰已獲CoNET簽署認證。 ',\n            NickName: '暱稱：',\n            creatDate: '密鑰創建日期：',\n            keyLength: '密鑰位強度：',\n            password: '請輸入長度大於五位的密碼',\n            password1: '請輸入平台密碼',\n            logout: '退出登錄',\n            deleteKeyPairInfo: '請注意：如果您沒有備份您的CoNET系統的話，刪除現有的密鑰將使您的CoNET網絡設定全部丟失，您有可能需要重新設置您的CoNET系統。如果您的註冊Email沒有變化，您的CoNET賬戶支付信息不會丟失！',\n            delete: '刪除',\n            keyID: '密鑰對ID：',\n            locked: '請提供您的RSA密鑰以解開密鑰後才能繼續操作，如果您遺忘了密碼，請刪除此RSA密鑰。',\n            systemError: '發生系統錯誤。如果重複發生，請刪除您的密鑰，再次設定您的系統！'\n        },\n        home_index_view: {\n            newVersion: '新版本準備就緒，請安裝！',\n            newVersionInstallLoading: '更新中請稍候',\n            localIpAddress: '本機',\n            clickInstall: '點擊安裝新版本',\n            internetLable: '互聯網',\n            gateWayName: '代理伺服器',\n            showing: '系統狀態',\n            nextPage: '下一頁',\n            agree: '同意協議並繼續',\n            imapEmailAddress: '郵箱帳戶名',\n            emailAddress: 'CoNET帳戶名稱(Email地址,必填)',\n            stopCreateKeyPair: '停止生成密鑰對',\n            creatKeyPair: '創建密鑰對..',\n            keyPairCancel: '生成密鑰對被中止',\n            keyPairGenerateError: '生成密鑰對發生系統錯誤，請重試！ ',\n            keyPairGenerateSuccess: '完成生成密鑰對',\n            cancel: '放棄操作',\n            systemPassword: 'CoNET客戶端密碼設置',\n            continueCreateKeyPair: '繼續生成',\n            SystemAdministratorNickName: '帳戶暱稱(必填)',\n            KeypairLength: '請選擇加密通訊用密鑰對長度：這個數字越大，通訊越難被破解，但會增加通訊量和運算時間。',\n            systemAdministratorEmail: 'RSA密鑰生成',\n            GenerateKeypair: '<em>系統正在生成用於通訊和簽名的RSA加密密鑰對，計算機需要運行產生大量的隨機數字，可能需要幾分鐘時間，尤其是長度為4096的密鑰對，需要特別長的時間，請耐心等待。關於RSA加密算法的機制和原理，您可以訪問維基百科：' +\n                `<a href='#' target=\"_blank\" onclick=\"return linkClick ('https://zh.wikipedia.org/wiki/RSA加密演算法')\">https://zh.wikipedia.org/wiki/RSA加密演算法</a></em>`,\n            inputEmail: '让我们来完成设定的最后几个步骤，首先生成RSA密鑰對, 它是您的系統信息加密，身份認證及和CoNET網絡通訊使用的重要組成部分。 RSA密鑰對的密碼請妥善保存，Email地址欄請填入您的常用邮箱地址, 它將被用作您的CoNET網絡賬號。<em style=\"color:brown;\">需注意的是CoNET域名在某些网络限制地区可能被列入黑名单，推薦使用網絡自由地區郵箱。</em>',\n            accountEmailInfo: `由於CoNET域名在某些國家和地區被防火牆屏蔽，而不能正常收發CoNET的Email，如果您是處於防火牆內的用戶，建議使用防火牆外部的郵件服務商。`\n        },\n        error_message: {\n            title: '錯誤',\n            errorNotifyTitle: '系統錯誤',\n            Success: '完成',\n            localServerError: '本地伺服器錯誤，請重新啟動CoNET！',\n            required: '請填寫此字段',\n            EmailAddress: ['請按照下列格式輸入你的電子郵件地址: someone@example.com.', '您已有相同的Email賬戶', '此類Email伺服器CoNET暫時不對應。'],\n            PasswordLengthError: '密碼必須設定為5個字符以上。',\n            finishedKeyPair: '密鑰對創建完成',\n            doCancel: '終止生成',\n            errorKeyPair: '密鑰對創建發生錯誤，請重試',\n            SystemPasswordError: '密鑰對密碼錯誤，請重試！如果您已忘記您的密鑰對密碼，請刪除現有的密鑰對，重新生成新的密鑰對。',\n            finishedDeleteKeyPair: '密鑰對完成刪除!',\n            offlineError: '您的電腦視乎未連結到互聯網，請檢查網路連結',\n            imapErrorMessage: [\n                /* 0 */ '未能夠與CoNET網絡對接成功。CoNET網絡可能存在問題，請稍後再次嘗試建立連結。或聯繫CoNET服務。',\n                /* 1 */ '數據格式錯誤，請重試',\n                /* 2 */ '您的電腦未連接到互聯網，請檢查網絡後再次嘗試！',\n                /* 3 */ 'Email伺服器提示IMAP用戶名或密碼錯！這個錯誤通常是由於您使用的密碼是普通密碼，或者您的APP密碼已失效，請到您的Email帳戶檢查您的APP密碼，然後再試一次。',\n                /* 4 */ 'Email伺服器的指定連接埠連結失敗，請檢查您的IMAP連接埠設定，如果您在一個防火牆內部，則有可能該端口被防火牆所屏蔽，您可以嘗試使用該IMAP伺服器的其他連接埠！',\n                /* 5 */ '伺服器證書錯誤！您可能正在連接到一個仿冒的Email伺服器，如果您肯定這是您希望連接的伺服器，請在IMAP詳細設定中選擇忽略證書錯誤。',\n                /* 6 */ '無法獲得Email伺服器域名信息，請檢查您的Email伺服器設定！或您的電腦沒有連結互聯網，請檢查網絡狀態。',\n                /* 7 */ '此Email伺服器看來不能使用CoNET網絡通訊技术，請再測試一次或选择其他email服务供应商！',\n                /* 8 */ 'email伺服器提示SMTP用戶名或密碼錯！',\n                /* 9 */ '伺服器證書錯誤！您可能正在連接到一個仿冒的Email伺服器，如果您肯定這是您希望連接的伺服器，請在SMTP詳細設定中選擇忽略證書錯誤。',\n                /* 10 */ 'SMTP連結提示未知錯誤',\n                /* 11 */ '您已有相同的Email賬戶',\n                /* 12 */ '您的系統還未連接到CoNET網絡！',\n                /* 13 */ '您的郵箱提示您賬號已無可使用容量，請清理郵箱後再試',\n                /* 14 */ '通訊遇到未知錯誤，請重試！',\n            ],\n            CoNET_requestError: [\n                /* 0 */ 'CoNET無響應,正在重新建立CoNET通訊管道，請稍候！',\n                /* 1 */ '無效操作！'\n            ]\n        },\n        emailConform: {\n            activeViewTitle: '驗證您的密鑰',\n            emailTitle: '感謝您使用CoNET服務',\n            info1_1: '您的密鑰還未完成驗證，請點擊按鈕[發送驗證Email]，並檢查您的【',\n            info1_2: '】郵箱。如果存在多封CoNET的郵件時，請選擇最後一封信件。請打開信件並複制郵件內容。如果您還未收到CoNET的郵件，請檢查您的密鑰郵箱是否準確，或者您可以刪除您現有的密鑰，重新生成新的密鑰。',\n            info2: '複制內容從“-----BEGIN PGP MESSAGE----- （ 開始，一直到 ）----- END PGP MESSAGE-----” 結束的完整內容，粘貼到此輸入框中',\n            emailDetail1: '尊敬的 ',\n            emailDetail1_1: '',\n            reSendRequest: '發送驗證Email',\n            requestReturn: ['錯誤！您的請求被拒絕，這可能是您在短時間內多次請求所致，請稍後再試', 'CoNET系統已發送激活郵件！'],\n            emailDetail2: '這是您的CoNET帳號激活密碼，請複制下列框內的全部內容:',\n            bottom1_1: '此致',\n            bottom1_2: 'CoNET團隊',\n            conformButtom: '驗 證',\n            formatError: ['內容格式錯誤，請複制從“-----BEGIN PGP MESSAGE----- （開始，一直到）-----END PGP MESSAGE-----” 結束的完整內容，粘貼在此輸入框中。',\n                '提供的內容不能被解密，請確認這是在您收到的最後一封從CoNET發送過來的激活信。如果還是沒法完成激活，請刪除您的密鑰重新生成和設定。',\n                '和CoNET網絡連接發生錯誤，請退出重新嘗試！',\n                '無效激活碼！如果存在多封CoNET的郵件時，請選擇最後一封信件。',\n                '您的CoNET看上去有問題, 請刪除您的密鑰，重新設置您的CoNET！',\n                'CoNET網絡系統無應答故障，可能暫時下線中，請稍後再試。 ',\n                '您當天的數據通訊量達到上限，請等待明天再試或升級用戶類型',\n                '用來通訊的Email設定有錯誤，請檢查IMAP設定後重試，或CoNET網絡不支持此Email類型',\n                '您所選區域不能夠連結，請稍候再試',\n                '您的IMAP郵箱發信發生錯誤。請退出CoNET重試。如果持續發生此故障，您的IMAP帳號有可能被鎖住，需要登陸您的IMAP郵箱網站解鎖操作。',\n                '頁面會話已過期，請刷新頁面以繼續，或退出後重新啟動CoNET。',\n                'CoNET平台故障，請重新啟動CoNET。'\n            ],\n            activeing: '正在通訊中'\n        },\n        QTGateRegion: {\n            title: '高品質訂製代理伺服器區域',\n            available: '服務中',\n            speedTest: '代理伺服器速度測試',\n            CoGateRegionStoped: '所訂製的代理伺服器已經被停止，如需使用請再次訂製.',\n            unavailable: '準備中',\n            proxyDomain: '域名解釋全程使用CoNET代理伺服器端',\n            setupCardTitle: '使用連接技術:',\n            paidUse: '本區域只對收費用戶開放',\n            MultipleGateway: '同時併發使用代理數:',\n            connectQTGate: '正在獲得代理伺服器區域信息...',\n            dataTransfer: '數據通訊:',\n            dataTransfer_datail: ['全程使用CoNET代理伺服器', '當不能夠到達目標時使用'],\n            proxyDataCache: '瀏覽數據本地緩存:',\n            proxyDataCache_detail: ['本地緩存', '不緩存'],\n            dataViaGateway: '全部互聯網數據通過CoNET代理伺服器',\n            cacheDatePlaceholder: '緩存失效時間',\n            requestPortNumber: '代理伺服器通訊連接埠',\n            clearCache: '立即清除所有緩存',\n            GlobalIp: '本機互聯網IP地址:',\n            option: '高級設置',\n            WebRTCleak: '阻止WebRTC漏洞',\n            WebRTCleakInfo: '本設置後，瀏覽器的即時會話，端對點通訊等將不再工作。',\n            pingError: '代理服務區域速度檢測錯誤發生，請退出CoNET，以管理員身份再次打開CoNET後，再執行速度檢測！',\n            QTGateRegionERROR: ['發送連接請求Email到CoNET系統發生送信錯誤， 請檢查您的IMAP賬號的設定。 ',\n                ''],\n            sendConnectRequestMail: ['客戶端未連結到CoNET網絡，已向CoNET重新發出聯網請求Email。這需要額外的時間，請耐心等待。',\n                '當長時間未連結CoNET網絡，您的連接會被中斷。'],\n            GlobalIpInfo: '注意：當您按下【CoNET連結】時您會把您的本機互聯網IP提供給CoNET網絡，如果您不願意，請選擇【@OPN】技術來使用CoNET服務！沒有顯示【@OPN】選項是@OPN連結技術，只在洛杉磯區域，並只支持使用iCloud郵箱。',\n            localPort: '本地代理伺服器連接埠:',\n            cacheDatePlaceDate: [{ name: '1小时', id: 1 }, { name: '12小时', id: 12 }, { name: '1日', id: 24 }, { name: '15日', id: 360 }, { name: '1月', id: 720 }, { name: '6月', id: 4320 }, { name: '永遠', id: -1 }],\n            atQTGateDetail: [\n                /*0*/ '世界首创的CoNET无IP互联网通讯技术，全程使用強加密Email通訊，客户端和代理服务器彼此不用知道IP地址，具有超强隐身和保护隐私，超強防火牆穿透能力。缺点是有延遲，网络通讯响应受您所使用的email服务供应商的伺服器影响，不適合遊戲視頻會話等通訊。目前該技術只支持iCloud郵箱。',\n                /*1*/ 'CoNET獨創HTTP明碼強加密混淆流量代理技術，能夠隱藏變換您的IP地址高速通訊，隐身和保护隐私，抗干擾超強防火牆穿透能力。缺點是需要使用您的IP來直接連結代理伺服器。如果您只是需要自由訪問互聯網，則推薦使用本技術。',\n                /*2*/ '域名解釋使用CoNET代理伺服器端，可以防止域名伺服器緩存污染，本選擇不可修改。',\n                /*3*/ '互聯網數據全程使用CoNET代理，可以匿名上網隱藏您的互聯網形踪。',\n                /*4*/ '只有當本地網絡不能夠到達您希望訪問的目標時，才使用CoNET代為您連結目標伺服器，本選項可以加速網速，但無隱私。',\n                /*5*/ '通過本地緩存瀏覽紀錄，當您再次訪問目標伺服器時可以增加訪問速度，減少網絡流量，緩存瀏覽記錄只針對非加密技術的HTTP瀏覽有效。CoNET使用強加密技術緩存瀏覽紀錄，確保您的隱私不被洩漏',\n                /*6*/ '不保存緩存信息。',\n                /*7*/ '設置緩存有效時間，您可以及時更新伺服器數據，單位為小時。',\n                /*8*/ '本地Proxy服务器，其他手机电脑和IPad等可通過连结此端口來使用CoNET服务。請設定為3001至65535之間的數字',\n                /*9*/ '通過設置PATH鏈接路徑可以簡單給您的Proxy伺服器增加安全性，拒絕沒有提供PATH的訪問者使用您的Proxy伺服器。',\n                /*10*/ '同時使用多條代理線路數，可以有效降低大流量集中在一個代理服務線路，降低被網絡監控者發現的風險。此選項僅供收費會員使用。',\n                /*11*/ '指定同CoNET代理進行通訊使用的連接埠，通過此設置可以規避您所在網段被通訊屏蔽的連接埠。',\n                /*12*/ 'Web实时通讯(WebRTC)是客戶端的瀏覽器之間，通過IP地址直接高速通訊技術，有時被惡用洩漏您的真實IP地址。'\n            ]\n        },\n        QTGateGateway: {\n            title: 'CoNET服務使用詳細',\n            promo: '促銷活動',\n            processing: '正在嘗試连接CoNET網絡...',\n            error: [\n                '錯誤：您的賬號下已經有一個正在使用CoNET代理伺服器的連接，請先把它斷開後再嘗試連接。',\n                '錯誤：您的賬號已經無可使用流量，如果您需要繼續使用CoNET代理伺服器，請升級您的賬戶類型。如果是免費用戶已經使用當天100M流量，請等待到明天繼續使用，如您是免費用戶已經用完當月1G流量，請等待到下月繼續使用。',\n                '錯誤：數據錯誤，請退出並重新啟動CoNET！', '非常抱歉，您請求的代理區域無資源，請選擇其他區域或稍後再試',\n                '對不起，您所請求連接的區域不支持這樣的連接技術，請換其他連接方法或選擇其他區域連接',\n                '@OPN链接技术不支持公用iCloud邮箱，请撤換通訊用IMAP郵箱，換您自有的iCloud邮箱。'\n            ],\n            connected: '已連接。',\n            upgrade: '升級賬號',\n            accountManager: '賬號管理',\n            userType: ['免費用戶', '付費用戶'],\n            datatransferToday: '日流量限額：',\n            datatransferMonth: '月流量限額：',\n            todaysDatatransfer: '本日可使用流量',\n            monthDatatransfer: '本月可使用流量',\n            gatewayInfo: ['代理伺服器IP地址：', '代理伺服器連接端口：'],\n            userInfoButton: '使用指南',\n            stopGatewayButton: '停止所定制伺服器',\n            disconnecting: '正在銷毀中...'\n        },\n        qtGateView: {\n            title: '發送訂製請求',\n            QTGateConnectResultWaiting: '已向CoNET網絡發送連接請求Email。由於是首次連接CoNET網絡，系統需要幾分鐘時間來完成與您的對接，請耐心等待。',\n            mainImapAccount: 'CoNET網絡通訊用郵箱',\n            QTGateDisconnectInfo: 'CoNET網絡已斷開。請選擇CoNET網絡通訊用IMAP帳號',\n            QTGateConnectStatus: 'CoNET網絡連接狀態',\n            QTGateConnectResult: ['CoNET網絡未連結，請點擊連接CoNET網絡', '正在連接CoNET網絡', '已經連接CoNET網絡', '連接連接CoNET網絡時發生錯誤，請修改IMAP賬號設定',\n                '已經連接CoNET網絡'],\n            QTGateSign: ['您的密鑰狀態', '還未獲得CoNET網絡信任簽署,點擊完成信任簽署',\n                '密钥获得CoNET網絡信任签署是一个重要步骤，您今后在CoNET網絡用户之间分享文件或传送秘密信息时，CoNET網絡可以證明是您本人而非其他冒充者。你也可以通过您的密钥签署信任给其他CoNET網絡用户，用以区别您自己的信任用户和非信任用户。',\n                '正在獲得CoNET信任簽署中', '系統錯誤，請重啓CoNET後再試，如果仍然存在，請嘗試重新安裝CoNET。', 'CoNET系統錯誤!']\n        },\n        feedBack: {\n            title: '使用信息反饋',\n            additional: '添附附加信息',\n            okTitle: '發送至CoNET'\n        },\n    }\n];\nconst linkClick = function (url) {\n    return window.open(url, '_blank');\n};\nfunction cmpVersions(a, b) {\n    let diff;\n    const regExStrip0 = /(\\.0+)+$/;\n    const segmentsA = a.replace(regExStrip0, '').split('.');\n    const segmentsB = b.replace(regExStrip0, '').split('.');\n    const l = Math.min(segmentsA.length, segmentsB.length);\n    for (let i = 0; i < l; i++) {\n        diff = parseInt(segmentsA[i], 10) - parseInt(segmentsB[i], 10);\n        if (diff) {\n            return diff;\n        }\n    }\n    return segmentsA.length - segmentsB.length;\n}\nfunction scrollToTop() {\n    document.body.scrollTop = 0; // For Safari\n    document.documentElement.scrollTop = 0; // For Chrome, Firefox, IE and Opera\n}\nconst QTGateRegionsSetup = [\n    {\n        title: '@OPN'\n    },\n    {\n        title: 'iOPN'\n    }\n];\nconst _QTGateRegions = [\n    {\n        icon: 'india',\n        content: ['班加罗尔', 'バンガロール', 'Bangalore', '班加羅爾'],\n        meta: ['亚洲・印度', 'アジア・インド', 'India. Asia.', '亞洲・印度'],\n        description: ['', '', '', ''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable(false),\n        showExtraContent: ko.observable(false),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'Asia.Bangalore',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable(false),\n        showConnectedArea: ko.observable(false),\n        ping: ko.observable(-2),\n        downloadSpeed: ko.observable(-2),\n        freeUser: ko.observable(false)\n    }, {\n        icon: 'singapore',\n        content: ['新加坡', 'シンガポール', 'Singapore', '新加坡'],\n        meta: ['亚洲・新加坡', 'アジア・シンガポール', 'Singapore. Asia.', '亞洲・新加坡'],\n        description: ['', '', '', ''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable(false),\n        showExtraContent: ko.observable(false),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'singapore',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable(false),\n        showConnectedArea: ko.observable(false),\n        ping: ko.observable(-2),\n        downloadSpeed: ko.observable(-2),\n        freeUser: ko.observable(false)\n    }, {\n        icon: 'japan',\n        content: ['东京', '東京', 'Tokyo', '東京'],\n        meta: ['亚洲・日本', 'アジア・日本', 'Japan. Asia.', '亞洲・日本'],\n        description: ['', '', '', ''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable(false),\n        showExtraContent: ko.observable(false),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'tokyo',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable(false),\n        showConnectedArea: ko.observable(false),\n        ping: ko.observable(-2),\n        downloadSpeed: ko.observable(-2),\n        freeUser: ko.observable(false)\n    }, {\n        icon: 'france',\n        content: ['巴黎', 'パリ', 'Paris', '巴黎'],\n        meta: ['欧洲・法国', 'ヨーロッパ・フランス', 'France. Europe.', '歐洲・法國'],\n        description: ['', '', '', ''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable(false),\n        showExtraContent: ko.observable(false),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'paris',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable(false),\n        showConnectedArea: ko.observable(false),\n        ping: ko.observable(-2),\n        downloadSpeed: ko.observable(-2),\n        freeUser: ko.observable(true)\n    }\n    /*\n    ,{\n        icon: 'netherlands',\n        content: ['阿姆斯特丹1','アムステルダム1','Amsterdam1','阿姆斯特丹1'],\n        meta: ['欧洲・荷兰','ヨーロッパ・オランダ','Netherlands. Europe.','歐洲・荷蘭'],\n        description: ['','','',''],\n        canVoe: ko.observable(true),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable ( false ),\n        showExtraContent: ko.observable ( false ),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'amsterdam1',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable ( false ),\n        showConnectedArea: ko.observable ( false ),\n        ping: ko.observable ( -2 ),\n        downloadSpeed: ko.observable (-2)\n    }\n    */\n    ,\n    {\n        icon: 'netherlands',\n        content: ['阿姆斯特丹', 'アムステルダム', 'Amsterdam', '阿姆斯特丹'],\n        meta: ['欧洲・荷兰', 'ヨーロッパ・オランダ', 'Netherlands. Europe.', '歐洲・荷蘭'],\n        description: ['', '', '', ''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable(false),\n        showExtraContent: ko.observable(false),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'amsterdam',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable(false),\n        showConnectedArea: ko.observable(false),\n        ping: ko.observable(-2),\n        downloadSpeed: ko.observable(-2),\n        freeUser: ko.observable(false)\n    }, {\n        icon: 'germany',\n        content: ['法兰克福', 'フランクフルト', 'Frankfurt', '法蘭克福'],\n        meta: ['欧洲・德国', 'ヨーロッパ・ドイツ', 'Germany. Europe.', '歐洲・德國'],\n        description: ['', '', '', ''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable(false),\n        showExtraContent: ko.observable(false),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'frankfurt',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable(false),\n        showConnectedArea: ko.observable(false),\n        ping: ko.observable(-2),\n        downloadSpeed: ko.observable(-2),\n        freeUser: ko.observable(false)\n    }, {\n        icon: 'united kingdom',\n        content: ['爱尔兰', 'アイルランド', 'Ireland', '愛爾蘭'],\n        meta: ['欧洲・英国', 'ヨーロッパ・英国', 'United Kingdom. Europe.', '歐洲・英國'],\n        description: ['', '', '', ''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable(false),\n        showExtraContent: ko.observable(false),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'Ireland',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable(false),\n        showConnectedArea: ko.observable(false),\n        ping: ko.observable(-2),\n        downloadSpeed: ko.observable(-2),\n        freeUser: ko.observable(false)\n    }, {\n        icon: 'united kingdom',\n        content: ['伦敦', 'ロンドン', 'London', '倫敦'],\n        meta: ['欧洲・英国', 'ヨーロッパ・英国', 'United Kingdom. Europe.', '歐洲・英國'],\n        description: ['', '', '', ''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable(false),\n        showExtraContent: ko.observable(false),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'London',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable(false),\n        showConnectedArea: ko.observable(false),\n        ping: ko.observable(-2),\n        downloadSpeed: ko.observable(-2),\n        freeUser: ko.observable(false)\n    }, {\n        icon: 'australia',\n        content: ['悉尼', 'シドニー', 'Sydney', '悉尼'],\n        meta: ['澳洲・澳大利亚', 'オーストラリア', 'Australia.', '澳洲・澳大利亚'],\n        description: ['', '', '', ''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable(false),\n        showExtraContent: ko.observable(false),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'Sydney',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable(false),\n        showConnectedArea: ko.observable(false),\n        ping: ko.observable(-2),\n        downloadSpeed: ko.observable(-2),\n        freeUser: ko.observable(false)\n    }, {\n        icon: 'united states',\n        content: ['纽约', 'ニューヨーク', 'New York City', '紐約'],\n        meta: ['北美洲东海岸・美国', '北アメリカ東海岸・アメリカ', 'USA. North American Eastern.', '北美洲東海岸・美國'],\n        description: ['', '', '', ''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable(false),\n        showExtraContent: ko.observable(false),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'new-york-city',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable(false),\n        showConnectedArea: ko.observable(false),\n        ping: ko.observable(-2),\n        downloadSpeed: ko.observable(-2),\n        freeUser: ko.observable(false)\n    }, {\n        icon: 'canada',\n        content: ['多伦多', 'トロント', 'Toronto', '多倫多'],\n        meta: ['北美洲东海岸・加拿大', '北アメリカ東海岸・カナダ', 'Canada. North American Eastern.', '北美洲東海岸・加拿大'],\n        description: ['', '', '', ''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable(false),\n        showExtraContent: ko.observable(false),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'toronto',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable(false),\n        showConnectedArea: ko.observable(false),\n        ping: ko.observable(-2),\n        downloadSpeed: ko.observable(-2),\n        freeUser: ko.observable(false)\n    }, {\n        icon: 'united states',\n        content: ['旧金山', 'サンフランシスコ', 'San Francisco', '舊金山'],\n        meta: ['北美洲西海岸・美国・旧金山', '北アメリカ西海岸・アメリカ', 'USA. North American Western.', '北美洲西海岸・美國'],\n        description: ['', '', '', ''],\n        canVoe: ko.observable(true),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable(false),\n        showExtraContent: ko.observable(false),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'francisco',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable(false),\n        showConnectedArea: ko.observable(false),\n        ping: ko.observable(-2),\n        downloadSpeed: ko.observable(-2),\n        freeUser: ko.observable(false)\n    }, {\n        icon: 'hong kong',\n        content: ['香港', '香港', 'Hong Kong', '香港'],\n        meta: ['亚洲・中国', 'アジア・中国', 'China. Asia.', '亞洲・中國'],\n        description: ['', '', '', ''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable(false),\n        showExtraContent: ko.observable(false),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'HK',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable(false),\n        showConnectedArea: ko.observable(false),\n        ping: ko.observable(-2),\n        downloadSpeed: ko.observable(-2),\n        freeUser: ko.observable(false)\n    }, {\n        icon: 'china',\n        content: ['上海市', '上海市', 'Shanghai', '上海市'],\n        meta: ['亚洲・中国', 'アジア・中国', 'China. Asia.', '亞洲・中國'],\n        description: ['', '', '', ''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable(false),\n        showExtraContent: ko.observable(false),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'shanghai',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable(false),\n        showConnectedArea: ko.observable(false),\n        ping: ko.observable(-2),\n        downloadSpeed: ko.observable(-2),\n        freeUser: ko.observable(false)\n    }, {\n        icon: 'china',\n        content: ['北京市', '北京市', 'Beijing', '北京市'],\n        meta: ['亚洲・中国', 'アジア・中国', 'China. Asia.', '亞洲・中國'],\n        description: ['', '', '', ''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable(false),\n        showExtraContent: ko.observable(false),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'beijing',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable(false),\n        showConnectedArea: ko.observable(false),\n        ping: ko.observable(-2),\n        downloadSpeed: ko.observable(-2),\n        freeUser: ko.observable(false)\n    }, {\n        icon: 'china',\n        content: ['无锡市', '無錫市', 'Wuxi', '無錫市'],\n        meta: ['亚洲・中国江苏省', 'アジア・中国江蘇省', 'Jiangsu China. Asia.', '亞洲・中國江蘇省'],\n        description: ['', '', '', ''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable(false),\n        showExtraContent: ko.observable(false),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'Wuxi',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable(false),\n        showConnectedArea: ko.observable(false),\n        ping: ko.observable(-2),\n        downloadSpeed: ko.observable(-2),\n        freeUser: ko.observable(false)\n    }\n];\n"
  },
  {
    "path": "app/public/scripts/siteShare.ts",
    "content": "/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst uuid_generate = function () {\n    let lut: Array < string > = [];\n    for ( let i = 0; i < 256; i++ ) {\n        lut [i] = ( i < 16 ? '0' : '') + ( i ).toString ( 16 );\n    }\n    let d0 = Math.random () * 0xffffffff | 0;\n    let d1 = Math.random () * 0xffffffff | 0;\n    let d2 = Math.random () * 0xffffffff | 0;\n    let d3 = Math.random () * 0xffffffff | 0;\n    return  lut[ d0 & 0xff ]+ lut [d0 >> 8 & 0xff ] + lut [ d0 >> 16 & 0xff ] + lut [ d0 >> 24 & 0xff ] + '-' +\n        lut [ d1 & 0xff ]+ lut [ d1 >> 8 & 0xff ] +'-'+ lut [ d1 >> 16 & 0x0f | 0x40 ] + lut[ d1 >> 24& 0xff ] + '-' +\n        lut [ d2 & 0x3f | 0x80 ]+ lut [ d2 >> 8 & 0xff ] + '-' + lut [ d2 >> 16 & 0xff]+ lut [ d2 >> 24 & 0xff ] +\n        lut [ d3 & 0xff ]+ lut [ d3 >> 8 & 0xff ] + lut [ d3 >> 16 & 0xff] + lut [ d3 >> 24 & 0xff ];\n}\n\nconst bingIcon = `\n    <svg viewBox=\"-650 800 900 400\">\n    <path style=\"fill:#008373;fill-opacity:1;stroke:none\" d=\"m -311.5,796.16903 80.6273,28.36401 0,283.80836 113.56729,-65.5599 -55.67962,-26.1246 -35.12739,-87.43067 178.939297,62.86452 0,91.39515 -201.653597,116.3102 -80.67328,-44.875 z\" />\n    </svg>\n`\n\nconst googleIcon = `<svg viewBox=\"-40 0 150 150\">\n  <path fill=\"#4285F4\" d=\"M35.29 41.41V32H67c.31 1.64.47 3.58.47 5.68 0 7.06-1.93 15.79-8.15 22.01-6.05 6.3-13.78 9.66-24.02 9.66C16.32 69.35.36 53.89.36 34.91.36 15.93 16.32.47 35.3.47c10.5 0 17.98 4.12 23.6 9.49l-6.64 6.64c-4.03-3.78-9.49-6.72-16.97-6.72-13.86 0-24.7 11.17-24.7 25.03 0 13.86 10.84 25.03 24.7 25.03 8.99 0 14.11-3.61 17.39-6.89 2.66-2.66 4.41-6.46 5.1-11.65l-22.49.01z\"></path>\n  </svg>\n`\n\nconst duckduckgoIcon = `\n  <svg viewBox=\"-6 0 210 210\" xmlns=\"http://www.w3.org/2000/svg\">\n    <g transform=\"translate(-24.5 -19)\">\n        <circle cx=\"127\" cy=\"79\" fill=\"#de5833\" r=\"60\"/>\n        <path d=\"m177.8 57.5c-2.8-6.6-6.8-12.5-11.8-17.5-5.1-5.1-11-9-17.5-11.8-6.8-2.9-14-4.3-21.5-4.3-7.4 0-14.7 1.5-21.5 4.3-6.6 2.7-12.5 6.7-17.5 11.8-5.1 5.1-9 11-11.8 17.5-2.9 6.8-4.3 14-4.3 21.5 0 7.5 1.5 14.7 4.3 21.5 2.8 6.6 6.8 12.5 11.8 17.5 5.1 5.1 11 9 17.5 11.8 6.8 2.9 14 4.3 21.5 4.3 7.4 0 14.7-1.5 21.5-4.3 6.5-2.8 12.4-6.8 17.5-11.8 5.1-5.1 9-11 11.8-17.5 2.9-6.8 4.3-14 4.3-21.5 0-7.5-1.4-14.7-4.3-21.5zm-38.8 71c-3.2-5.4-11.6-20.5-11.6-31.7 0-25.8 17.3-3.7 17.3-24.3 0-4.9-2.4-22.1-17.4-25.7-3.7-4.9-12.4-9.6-26.2-7.7 0 0 2.3.7 4.9 2 0 0-5 .7-5.2 4.1 0 0 9.9-.5 15.5 1.3-12.9 1.7-19.5 8.5-18.3 20.8 1.7 17.5 9.1 48.7 11.7 59.6-19.6-7-33.7-25.8-33.7-47.9 0-28.1 22.8-51 51-51 28.2 0 51 22.8 51 51-.1 24-16.7 44.1-39 49.5z\" fill=\"#fff\"/>\n        <path clip-rule=\"evenodd\" d=\"m124.2 87.3c0-6.6 9-8.7 12.4-8.7 9.2 0 22.2-5.9 25.4-5.8 3.3.1 5.4 1.4 5.4 2.9 0 2.2-18.4 10.5-25.5 9.8-6.8-.6-8.4.1-8.4 2.9 0 2.4 4.9 4.6 10.3 4.6 8.1 0 16-3.6 18.4-1.9 2.1 1.5-5.5 6.9-14.2 6.9-8.7 0-23.8-4.1-23.8-10.7z\" fill=\"#fed30a\" fill-rule=\"evenodd\"/>\n        <path d=\"m140.2 59.3c-2.4-3.1-6.7-3.2-8.2.4 2.3-1.8 5.1-2.2 8.2-.4z\" fill=\"#2d4f8d\"/>\n        <path d=\"m113.5 59.4c-3.3-2-8.8-2.2-8.5 4.1 1.6-3.9 3.8-4.6 8.5-4.1z\" fill=\"#2d4f8d\"/>\n        <path d=\"m138.2 65.2c-1.8 0-3.3 1.5-3.3 3.3 0 1.8 1.5 3.3 3.3 3.3 1.8 0 3.3-1.5 3.3-3.3 0-1.8-1.5-3.3-3.3-3.3zm1.2 3.1c-.5 0-1-.4-1-1 0-.5.4-1 1-1 .6 0 1 .4 1 1-.1.5-.5 1-1 1z\" fill=\"#2d4f8d\"/>\n        <path d=\"m112.6 67c-2.1 0-3.8 1.7-3.8 3.8 0 2.1 1.7 3.8 3.8 3.8 2.1 0 3.8-1.7 3.8-3.8 0-2.1-1.7-3.8-3.8-3.8zm1.4 3.5c-.6 0-1.1-.5-1.1-1.1 0-.6.5-1.1 1.1-1.1.6 0 1.1.5 1.1 1.1 0 .6-.5 1.1-1.1 1.1z\" fill=\"#2d4f8d\"/>\n        <path d=\"m104.3 50.8c-4.8 3.5-7 8.9-6.3 16.5 1.7 17.5 9.1 48.8 11.7 59.7.9.3 1.8.6 2.7.9-1.6-6.6-9.3-38.8-12.7-63.5-.9-6.6 1.7-10.5 4.6-13.6z\" fill=\"#d5d7d8\"/>\n        <path d=\"m116.2 46.5c.4 0 .7-.1.7-.1-5.2-2.5-13.4-2.6-15.6-2.6-.2.4-.4.9-.4 1.4-.1.1 9.6-.5 15.3 1.3z\" fill=\"#d5d7d8\"/>\n        <path d=\"m106.8 41.1c-1.6-1.1-2.9-1.8-3.7-2.2-.7.1-1.3.1-2 .2 0 0 2.3.7 4.9 2 0 0-.1 0-.2 0 .7 0 1 0 1 0z\" fill=\"#d5d7d8\"/>\n        <path d=\"m147.1 107.6c-1.7-.4-8.3 4.3-10.8 6.1-.1-.5-.2-.9-.3-1.1-.3-1-6.7-.4-8.2 1.2-4-1.9-12-5.6-12.1-3.3-.3 3 0 15.5 1.6 16.4 1.2.7 8-3 11.4-4.9 0 0 0 0 .1 0 2.1.5 6 0 7.4-.9.2-.1.3-.3.4-.5 3.1 1.2 9.8 3.6 11.2 3.1 1.8-.5 1.4-15.6-.7-16.1z\" fill=\"#67bd47\"/>\n        <path d=\"m128.8 122c-2.1-.4-1.4-2.5-1.4-7.4 0 0 0 0 0 0-.5.3-.9.7-.9 1.1 0 4.9-.8 7.1 1.4 7.4 2.1.5 6 0 7.6-.9.3-.2.4-.5.5-1-1.5.9-5.2 1.3-7.2.8z\" fill=\"#43a347\"/>                         \n    </g>\n  </svg>\n`\n\nconst YahooIcon = `\n  <svg viewBox=\"-75 0 240 240\" xmlns=\"http://www.w3.org/2000/svg\">\n    <defs>\n      <linearGradient id=\"t\" y2=\"1819.8\" gradientUnits=\"userSpaceOnUse\" x2=\"-190.68\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1808.7\" x1=\"-209.43\">\n      <stop stop-color=\"#1b0041\" offset=\"0\"/>\n      <stop stop-color=\"#21004f\" offset=\"1\"/>\n      </linearGradient>\n      <linearGradient id=\"u\" y2=\"1877.2\" gradientUnits=\"userSpaceOnUse\" x2=\"-249.85\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1667.8\" x1=\"-149.7\">\n      <stop stop-color=\"#5500bd\" offset=\"0\"/>\n      <stop stop-color=\"#47008d\" offset=\"1\"/>\n      </linearGradient>\n      <linearGradient id=\"v\" y2=\"1877.6\" gradientUnits=\"userSpaceOnUse\" x2=\"-250.33\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1669.7\" x1=\"-349.94\">\n      <stop stop-color=\"#5100b2\" offset=\"0\"/>\n      <stop stop-color=\"#5500bd\" offset=\"1\"/>\n      </linearGradient>\n      <linearGradient id=\"w\" y2=\"1838.7\" gradientUnits=\"userSpaceOnUse\" x2=\"-273.09\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1850.7\" x1=\"-291.09\">\n      <stop stop-color=\"#27005d\" stop-opacity=\".98039\" offset=\"0\"/>\n      <stop stop-color=\"#2b005d\" offset=\".31767\"/>\n      <stop stop-color=\"#280055\" offset=\".59756\"/>\n      <stop stop-color=\"#24004d\" offset=\".80878\"/>\n      <stop stop-color=\"#230049\" offset=\"1\"/>\n      </linearGradient>\n      <linearGradient id=\"y\" y2=\"2047\" gradientUnits=\"userSpaceOnUse\" x2=\"-253.6\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1878.8\" x1=\"-253.6\">\n      <stop stop-color=\"#210045\" offset=\"0\"/>\n      <stop stop-color=\"#25004d\" offset=\".25\"/>\n      <stop stop-color=\"#2b005c\" offset=\".5\"/>\n      <stop stop-color=\"#340071\" offset=\".74854\"/>\n      <stop stop-color=\"#3e0088\" offset=\"1\"/>\n      </linearGradient>\n      <linearGradient id=\"x\" y2=\"2047.3\" gradientUnits=\"userSpaceOnUse\" x2=\"-227.23\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1877.2\" x1=\"-248.82\">\n      <stop stop-color=\"#5500bd\" offset=\"0\"/>\n      <stop stop-color=\"#5300b5\" offset=\"1\"/>\n      </linearGradient>\n    </defs>\n    <g transform=\"translate(1009.8 -337.49)\">\n    <g transform=\"matrix(.5 0 0 .5 -379.18 197.8)\">\n      <g>\n          <path d=\"m-1106.6 282.03 6.7084 15.246 17.076-7.9282 6.9443-7.3183c-10.985 2.4918-20.893 2.5746-30.729 0z\" fill=\"#6700e8\"/>\n          <path d=\"m-1154.8 414.97-11.587 4.269-7.3183-12.807 72.573-115.87 5.1886-1.7772c7.1618-1.6184 14.973-3.354 20.061-6.7608-11.525 15.569-53.493 88.344-78.917 132.95z\" fill=\"url(#t)\"/>\n          <path d=\"m-1170.6 413.15 3.0493-3.0493 71.795-121.34-10.809-6.7347c-8.6682 16.146-40.638 68.392-60.986 101.85l-9.7578 18.296z\" fill=\"url(#u)\"/>\n          <path d=\"m-1228.5 282.03c15.916 28.207 40.349 67.667 60.986 101.85v26.224l-4.8789 4.8789-71.354-126.85z\" fill=\"url(#v)\"/>\n          <path d=\"m-1240.3 289.7 11.761-7.6717c-12.62 2.6914-17.899 2.8627-30.493 0l4.8789 5.4887z\" fill=\"#6700e8\"/>\n          <path d=\"m-1167.6 410.1-5.4887 7.9282-7.3184-3.0493c-13.625-23.55-53.678-95.287-78.672-132.95 5.0665 3.6714 11.911 5.686 19.817 6.9699z\" fill=\"url(#w)\"/>\n          <path fill=\"url(#x)\" d=\"m-1152.9 513.16-20.735-9.7578 1.8296-86.6 4.269-6.7085 12.807 4.8789z\"/>\n          <path d=\"m-1167.6 506.45-14.637 6.7085 1.8295-98.187 12.807-4.8789z\" fill=\"url(#y)\"/>\n      </g>\n      </g>\n      </g>\n  </svg>\n`\n\nconst uuID = function () {\n    return uuid_generate().replace( /-/g,'')\n}\n\nDate.isLeapYear = function (year) { \n    return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)); \n};\n\nDate.getDaysInMonth = function (year, month) {\n    return [31, (Date.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];\n};\n\nDate.prototype.isLeapYear = function () { \n    return Date.isLeapYear(this.getFullYear()); \n};\n\n\nDate.prototype.getDaysInMonth = function () { \n    return Date.getDaysInMonth(this.getFullYear(), this.getMonth());\n};\n\nDate.prototype.addMonths = function (value) {\n    var n = this.getDate();\n    this.setDate(1);\n    this.setMonth(this.getMonth() + value);\n    this.setDate(Math.min(n, this.getDaysInMonth()));\n    return this;\n};\n\nconst conetImapAccount = /^qtgate_test\\d\\d?@icloud.com$/i\n\nconst isElectronRender = typeof process === 'object'\n\nconst cookieName = 'langEH'\nconst passwdCookieName = 'CoNET'\nconst EmailRegexp = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i\nconst Menu = {\n    'zh':[{\n        LanguageJsonName: 'zh',\n        showName: '简体中文',\n        icon: 'flag-icon-cn'\n    },\n    {\n        LanguageJsonName: 'en',\n        showName: '英文/English',\n        icon: 'flag-icon-gb'\n    },\n    {\n        LanguageJsonName: 'ja',\n        showName: '日文/日本語',\n        icon: 'flag-icon-jp'\n    },{\n        LanguageJsonName: 'tw',\n        showName: '繁体字中文/正體字中文',\n        icon: 'flag-icon-tw'\n    }],\n    'ja': [{\n        LanguageJsonName: 'ja',\n        showName: '日本語',\n        icon: 'flag-icon-jp'\n    },\n    {\n        LanguageJsonName: 'en',\n        showName: '英語/English',\n        icon: 'flag-icon-gb'\n    },\n    {\n        LanguageJsonName: 'zh',\n        showName: '簡体字中国語/简体中文',\n        icon: 'flag-icon-cn'\n    },{\n        LanguageJsonName: 'tw',\n        showName: '繁体字中国語/正體字中文',\n        icon: 'flag-icon-tw'\n    }],\n    'en': [{\n        LanguageJsonName: 'en',\n        showName: 'English',\n        icon: 'flag-icon-gb'\n    },\n    {\n        LanguageJsonName: 'ja',\n        showName: 'Japanese/日本語',\n        icon: 'flag-icon-jp'\n    },\n    {\n        LanguageJsonName: 'zh',\n        showName: 'Simplified Chinese/简体中文',\n        icon: 'flag-icon-cn'\n    },\n    {\n        LanguageJsonName: 'tw',\n        showName: 'Traditional Chinese/正體字中文',\n        icon: 'flag-icon-tw'\n    }],\n    'tw':[\n    {\n        LanguageJsonName: 'tw',\n        showName: '正體字中文',\n        icon: 'flag-icon-tw'\n    },{\n        LanguageJsonName: 'en',\n        showName: '英文/English',\n        icon: 'flag-icon-gb'\n    },\n    {\n        LanguageJsonName: 'ja',\n        showName: '日文/日本語',\n        icon: 'flag-icon-jp'\n    },\n    {\n        LanguageJsonName: 'zh',\n        showName: '簡體字中文/简体中文',\n        icon: 'flag-icon-cn'\n    }]\n}\n\nenum lang { 'zh', 'ja', 'en', 'tw' }\n\nconst initLanguageCookie = function () {\n    var cc: string = $.cookie( cookieName )\n    \n    if ( !cc ) {\n        cc = window.navigator.language\n    }\n\n    if ( !cc )\n        cc = 'en'\n    cc = cc.substr (0, 2).toLocaleLowerCase()\n    switch ( cc ) {\n        case 'zh':\n            break\n        case 'en':\n            break\n        case 'ja':\n            break\n        case 'tw':\n            break;\n        default:\n            cc = 'en'\n    }\n    $.cookie ( \"langEH\", cc, { expires: 180, path: '/' })\n    $ ( \"html\" ).trigger( 'languageMenu', cc )\n    return cc\n}\nconst DayTime = 1000 * 60 * 60 * 24\nconst monthTime = 30 * DayTime\nconst yearTime = 12 * monthTime\n\nconst getPlanPrice = function ( plan: string, isAnnualPlan: boolean ) {\n\tconst _plan = planArray [ planArray.findIndex ( function ( n ) {\n        return n.name === plan\n    })]\n    if ( !_plan ) {\n        return null\n    }\n    return isAnnualPlan ? _plan.annually : _plan.monthlyPay\n}\n\nconst planArray = [\n    {\n\t\tname:'free',\n\t\tshowName: ['免费用户','無料ユーザー','FREE USER','免費用戶'],\n        monthlyPay: 0,\n\t\tannually: 0,\n\t\tannuallyMonth: 0,\n        next:'p1',\n        share: 0,\n\t\tinternet: 0,\n\t\ttail: ko.observable ( false ),\n        multi_gateway:0,\n\t\tshowNote: false,\n\t\tshowButton: ko.observable ( false ),\n\t\tfeatures: [{\n\t\t\ttitle: ['代理区域','エリア','Region','代理區域'],\n\t\t\tdetail: ['欧洲2区域','ヨーロッパ 2 エリア','2 regions in Europe','歐洲2區域'],\n\t\t},{\n\t\t\ttitle: ['服务器','サーバー','Server','伺服器'],\n\t\t\tdetail: ['共享','共有','Share','共享'],\n\t\t},{\n\t\t\ttitle: ['月流量限制','月データ制限','Bandwidth','月流量限制'],\n\t\t\tdetail: ['无限制','無制限','Unlimited','無限制'],\n\t\t},{\n\t\t\ttitle: ['多代理','マルチプロクシ','Multi-Gateway','多代理'],\n\t\t\tdetail: ['1','1','1','1'],\n\t\t},{\n\t\t\ttitle: ['客户端数','端末数','Devices','客戶端數'],\n\t\t\tdetail: ['无限制','無制限','Unlimited','無限制'],\n\t\t}]\n\n    },{\n\t\tname:'p1',\n\t\tshowName: ['普通用户','普通ユーザー','NORMAL USER','普通用戶'],\n        monthlyPay: 688,\n\t\tannually: 5988,\n\t\tannuallyMonth:499,\n        next:'p2',\n        share: 0,\n\t\tinternet: 0,\n\t\ttail: ko.observable ( false ),\n        multi_gateway:0,\n\t\tshowNote: false,\n\t\tshowButton: ko.observable ( false ),\n\t\tfeatures: [{\n\t\t\ttitle: ['代理区域','エリア','Region','代理區域'],\n\t\t\tdetail: ['全球16区域','グローバル16区域','16 regions worldwide ','全球16區域'],\n\t\t},{\n\t\t\ttitle: ['服务器','サーバー','Server','伺服器'],\n\t\t\tdetail: ['共享','共有','Share','共享'],\n\t\t},{\n\t\t\ttitle: ['月流量限制','月データ制限','Bandwidth','月流量限制'],\n\t\t\tdetail: ['无限制','無制限','Unlimited','無限制'],\n\t\t},{\n\t\t\ttitle: ['多代理','マルチプロクシ','Multi-Gateway','多代理'],\n\t\t\tdetail: ['2','2','2','2'],\n\t\t},{\n\t\t\ttitle: ['客户端数','端末数','Devices','客戶端數'],\n\t\t\tdetail: ['无限制','無制限','Unlimited','無限制'],\n\t\t}]\n    },{\n\t\tname:'p2',\n\t\tshowName: ['超级用户','スーパーユーザー','POWER USER','超級用戶'],\n        monthlyPay: 1988,\n\t\tannually: 19999,\n\t\tannuallyMonth: 1667,\n        share: 0,\n        internet: 0,\n        multi_gateway:0,\n\t\tshowNote: false,\n\t\ttail: ko.observable ( false ),\n\t\tshowButton: ko.observable ( false ),\n\t\tfeatures: [{\n\t\t\ttitle: ['代理区域','エリア','Region','代理區域'],\n\t\t\tdetail: ['全球16区域','グローバル16区域','16 regions worldwide ','全球16區域'],\n\t\t},{\n\t\t\ttitle: ['服务器','サーバー','Server','伺服器'],\n\t\t\tdetail: ['独占','独占','Dedicated','獨占'],\n\t\t},{\n\t\t\ttitle: ['月流量限制','月データ制限','Bandwidth','月流量限制'],\n\t\t\tdetail: ['无限制','無制限','Unlimited','無限制'],\n\t\t},{\n\t\t\ttitle: ['多代理','マルチプロクシ','Multi-Gateway','多代理'],\n\t\t\tdetail: ['4','4','4','4'],\n\t\t},{\n\t\t\ttitle: ['客户端数','端末数','Devices','客戶端數'],\n\t\t\tdetail: ['无限制','無制限','Unlimited','無限制'],\n\t\t}]\n    }\n]\n\nconst nextExpirDate = function ( expire: string ) {\n    const now = new Date ()\n    const _expire = new Date ( expire )\n    _expire.setHours ( 0,0,0,0 )\n    if ( now.getTime() > _expire.getTime ()) {\n        return _expire\n    }\n    const nextExpirDate = new Date ( expire )\n    nextExpirDate.setMonth ( now.getMonth())\n    nextExpirDate.setFullYear ( now.getFullYear())\n\n    if ( nextExpirDate.getTime() < now.getTime ()) {\n        nextExpirDate.setMonth ( now.getMonth() + 1 )\n        return nextExpirDate\n    }\n\n    return _expire\n}\n\nconst getRemainingMonth = function ( expire: string ) {\n    const _expire = new Date ( expire )\n    const _nextExpirDate = nextExpirDate ( expire )\n    return _expire.getFullYear () === _nextExpirDate.getFullYear () ? _expire.getMonth() - _nextExpirDate.getMonth() : ( 12 - _nextExpirDate.getMonth() + _expire.getMonth() )\n}\n\nconst getPassedMonth = function ( start: string ) {\n    const startDate = new Date ( start )\n    const now = new Date ()\n    const passwdYear = now.getFullYear() - startDate.getFullYear ()\n    const nowMonth = now.getMonth ()\n    const startMonth = startDate.getMonth ()\n    const startDay = startDate.getDate()\n    const nowDay = now.getDate ()\n    let ret = startMonth >= nowMonth ? 12 - startMonth + nowMonth + ( passwdYear - 1 ) * 12 : passwdYear * 12 + nowMonth - startMonth - 1\n    ret += startDay >= nowDay ? 0 : 1\n    return ret\n}\n\nconst getAmount = function ( amount ) {\n    if ( !amount )\n        return null\n    if ( typeof amount === 'number' ) {\n        amount = amount.toString()\n    }\n    const ret = amount.split('.')\n    return ret.length === 1 ? amount + '.00' : amount \n}\n\nconst getCurrentPlanCancelBalance = function ( expiration: string, planName: string ) {\n\t\n    const price = getPlanPrice ( planName, true )\n    const normalPrice = getPlanPrice ( planName, false )\n    const usedMonth = 12 - getRemainingMonth ( expiration )\n\tconst passedCost = Math.round (( price - normalPrice * usedMonth ) * 100 ) / 100\n\treturn passedCost > 0 ? passedCost : 0\n}\n\nconst getExpire = function ( startDate: string, isAnnual: boolean ) {\n\tconst start = new Date( startDate )\n\tconst now = new Date ()\n\tconst passedMonth = Math.round (( now.getTime () - start.getTime () ) / monthTime - 0.5 )\n\tisAnnual ? start.setFullYear ( start.getFullYear() + 1 ) : start.setMonth ( passedMonth + 1 )\n\treturn start\n}\n\nfunction getExpireWithMonths ( month: number ) {\n    let date = new Date()\n    return date.addMonths( month )\n}\n\nconst getCurrentPlanUpgradelBalance = function ( expiration: string, planName: string, isAnnual: boolean ) {\n\tif ( !isAnnual ) {\n        return getPlanPrice ( planName, false )\n    }\n    const price = getPlanPrice ( planName, true )\n    if ( !price )\n        return null\n    const usedMonth = 12 - getRemainingMonth ( expiration ) + 1\n\tconst passedCost = Math.round (( price -  price * usedMonth / 12 ) * 100 ) / 100\n\treturn passedCost\n}\n\nconst infoDefine = [\n\t{\n        coSearch: {\n            searchInputPlaceholder: '请输入检索关键字组合或网址',\n            SearchText:'搜索',\n            totalResults: ['大约有','条记录'],\n            moreResults: '更多结果',\n            SearchesRelated: ['','的相关搜索'],\n            label_HTML: 'HTML代码',\n            label_picture: '图片',\n            imageSize: '图片尺寸：',\n            unSafe: ['安全浏览','非安全浏览（非推荐）'],\n            similarImages: '外观类似的图片',\n            errorMessage: [\n                '无效请求',\n                '您的图片格式无法处理，请尝试选择其他图片',\n                '您的请求已达最大值，请稍后再试'\n            ],\n            coSearchConfigMenu: ['搜索设定','指定检索引擎'],\n            coSearchConfigIcon:['google',''],\n            coSearchEngineName: ['谷歌',''],\n            searchToolBarMenu: [\n                \"网站\", \"新闻\",\"图片\",\"视频\"\n            ],\n            timeUnit: {\n                hours: '小时前',\n                day: '天前',\n                mins: '分钟前'\n            },\n            TimeTolocalTime: function ( time: string ) {\n                return new Date ( time ).toLocaleDateString ('zh-Hans', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' })\n            }\n\n\n        },\n        youtube: {\n            startup: {\n                title: '欢迎使用Co油管',\n                detail: '在此您可以检索Youtube视频，下载并播放所选视频'\n            },\n            search: {\n                placeholder: '请输入检索关键字，或输入油管播放链接',\n                button_text:'检索',\n                error: [\n                    '您的检索无效，请重新输入。'\n                ]\n\n            }\n        },\n        perment:{\n            serverTitle:'服务器'\n        },\n        appsManager: {\n            mainLoading: '正在获取节点信息...',\n            nodeName: '您进入的节点名：',\n            connectAddress:'节点接入地址：',\n\t\t\tserviceList:'提供服务一览',\n\t\t\twelcomeTextSub: '隐私安全自由的新互联网'\n        },\n\n        twitter: {\n            newTwitterAccount: `请输入您的推特APP信息，如何获得和设置推特账号APP信息，请点击<a target=\"_blank\" href='https://github.com/QTGate/QTGate-Desktop-Client/wiki/Create-Twitter-APP')\">这里</a>`,\n            addAccount:'添加推特账户',\n            following: ['正在关注','解除关注','关注'],\n            followers:'关注者',\n            videoSizeOver: '视频超推特限制: 尺寸 < (1280x1024)，文件 < 300MB，总时间 < 140秒，请转换视频后再上传',\n            second: '秒',\n            min: '分',\n            retweeted: '已转推',\n            hour: '小时',\n            month:'月',\n            day:'日',\n            replying: '回复: ',\n            newTwitterDistroyButtonTitle: ['放弃推文','舍弃对话串'],\n            returnEdit: '回编辑',\n            close:'关闭',\n            newTwitterTitle: ['撰写新推文','撰写新对话串'],\n            twitterBottonTitle:['发推','全部发推'],\n            urlInfo: '<h3>推特客户端预览版</h3><p>用户可以无限量免费使用此客户端，免翻墙(不使用VPN，不用连结CoGate代理服务器)匿名访问(您的真实IP地址不会泄露给推特)您的推特账户。</p><p>其他设备可以输入以下网址打开此APP应用</p>',\n            accountError:'推特回送错误信息提示：您输入的APP应用设定信息有误。请检查您的推特APP信息后再试。'\n        },\n\n        account:{\n            title: '账户管理',\n            segmentTitle:'账户: ',\n            stripePayment: '银行网关支付',\n            promoButton: '我有促销码',\n            qtgatePayment:'CoNET网关支付',\n            paymentProblem1: '支付遇到问题',\n            paymentProblem:'您的当前所在区域看上去银行网关被和谐，您可以使用CoNET网关支付来完成支付',\n            QTGatePayRisk: '使用CoNET安全网关支付，如果您有安全疑虑，请使用Stript安全网关支付。',\n            willPayNextExpir:'自动扣款 ',\n            openAutomatically: '打开自动扣款',\n            CancelSuccess: function ( PlanExpire: string, isAnnual: boolean, returnAmount: number ) {\n                return `中止订阅成功。您可以一直使用您的原订阅到${ new Date( PlanExpire) .toLocaleDateString() }为止。以后您将会自动成为CoNET免费用户，可以继续使用CoNET的各项免费功能。${ isAnnual ? `退款金额us$${ returnAmount }会在5个工作日内退还到您的支付卡。`: '下月起CoNET系统不再自动扣款。'} 祝您网络冲浪愉快。`\n            },\n            currentPlan:'当前订阅: ',\n            cardPaymentErrorMessage:[\n        /* 0 */ '输入的信用卡号有误，或支付系统不支持您的信用卡！',\n        /* 1 */ '输入的信用卡期限有误！',\n        /* 2 */ '输入的信用卡安全码有误！',\n        /* 3 */ '输入的信用卡持有人邮编有误！',\n        /* 4 */ '支付失败，支付无法完成请稍后再试',\n        /* 5 */ '支付数据存在错误',\n        /* 6 */ '您的付款被发卡行所拒绝',\n        /* 7 */ '发生错误，请稍后再试',       \n            \n            ],\n            planPrice: '订阅原价：',\n            cancelPlanButton:'中止当前订阅',\n            needPay: '应付金额：',\n            \n            currentPlanExpire: [\n                '订阅截止日期：',\n                '下次自动续订日',\n            ],\n            monthResetDay:'月数据重置日：',\n            monthResetDayAfter:'',\n            oldPlanBalance: '原计划剩余价值：',\n            currentAnnualPlan: ['月度订阅','年度订阅'],\n            MonthBandwidthTitle:'月度代理服務器限额：',\n            dayBandwidthTitle:'毎日限额：',\n            upgradeTitle:'升级',\n            planExpirDate: function ( year: string, month: string, day: string ) { return `${ year } 年${ month }月${ day }日`},\n            \n            accountOptionButton: '账户选项',\n            paymentProcessing:'正在通讯中...',\n            cantUpgradeMonthly: '年度计划不可降级为月度计划。请先终止您当前订阅的年度计划，再重新申请此月度订阅',\n            DowngradeTitle:'降级账户选项',\n            cancelPlan:'终止订阅计划',\n            cantCancelInformation: '您的账户如果是免费用户，CoNET测试用户，或使用优惠码产生的订阅用户，此类账户可以升级但不能被中止',\n            MonthBandwidthTitle1:'传送限额',\n            bandwidthBalance:'月度数据剩余量：',\n            serverShareData:['共享服务器','一台独占服务器*','二台独占服务器*','四台独占服务器'],\n            networkShareTitle:'代理服务器网络',\n            multiOpn:'OPN并发多代理技术',\n            continue:'下一步',\n            paymentSuccessTitile: '謝謝您',\n            paymentSuccess:'您的订阅已经完成，祝您网络冲浪愉快。',\n            qtgateTeam: 'CoNET开发团队敬上',\n            monthlyAutoPay: function ( monthCost: number ) { return `<span>每月自动扣款</span><span class=\"usDollar\">@ us$</span><span class=\"amount\">${ monthCost }</span>/月<span>` },\n            annualPay: function ( annual_monthlyCost: string ) { return `<span>年付款每月只需</span><span class=\"usDollar\">@ us$</span><span class=\"amount\" >${ annual_monthlyCost }</span>/月<span>`},\n            monthlyPay:'月收费',\n            expirationYear: '信用卡期限',\n            payAmountTitile:'合计支付金额',\n            calcelPayment:'中止付款',\n            doPayment:'确认付款',\n            cardNumber: '信用卡号',\n            canadaCard:'*加拿大持卡人将自动加算GST(BC)5%',\n            cvcNumber: '信用卡安全码',\n            aboutCancel: '关于中止订阅',\n            postcodeTitle: '信用卡持有人邮编',\n            serverShareData1:'使用OPN并发多代理技术，同时使用数大于独占数时，会相应分享您所独占的资源',\n            internetShareData:['共享高速带宽','独享单线高速带宽*','独享双线高速带宽*','独享四线高速带宽'],\n            maxmultigateway: ['最大同时可二条并发代理数','最大同时可使用四条并发代理数*','最大同时可使用四条并发代理数'],\n            multiRegion:['单一代理区域并发代理','多代理区域混合并发代理','多代理区域混合并发代理','多代理区域混合并发代理'],\n            downGradeMessage:'您正在操作降级您的订阅，如果操作成功您将从下月您的订阅之日起，实行新的订阅，如果您是。',\n            cancelPlanMessage:'CoNET的订阅是以月为基本的单位。您的月订阅将在下月您的订阅起始日前被终止，您可以继续使用您的本月订阅计划，您将自动回到免费用户。如果您是每月自动扣款，则下月将不再扣款。如果您是年度订阅计划，您的退款将按普通每月订阅费，扣除您已经使用的月份后计算的差额，将自动返还您所支付的信用卡账号，如果您是使用促销码，或您是测试用户，您的终止订阅将不能被接受。',\n            cancelPlanMessage1: function ( isAnnual: boolean, amount: number, monthlyPay: number, expire: string, passedMonth: number, totalMonth: number ) {\n                return `<span>您的订阅计划是${ isAnnual ? `年度订阅，退还金额将按照您已付年订阅费 </span><span class=\"usDollar\">us$</span><span class=\"amount\">${ amount / 100 }</span> - 该订阅原价 <span class=\"usDollar\">us$</span><span class=\"amount\">${ monthlyPay /100 }</span><span> X 已使用月数(包括本月) </span><span class=\"amount\">${ passedMonth }</span> = 应该退还的金额 <span class=\"usDollar\">us$</span><span class=\"amount\">${ amount - passedMonth * monthlyPay > 0 ? ( amount - passedMonth * monthlyPay ) /100 : 0 }</span><span>，将在7个工作日内，退还到您原来支付的信用卡账户。</span>`: `月订阅，您的订阅将下次更新日</span><span class=\"amount\">${ nextExpirDate( expire ).toLocaleDateString() }</span><span>时不再被自动扣款和更新。</span>`}`\n            }\n        },\n\n        QTGateDonate: {\n            title: 'CoNET赞助商提供的免流量网站',\n            meta_title:'捐赠者：',\n            detail:'所有的CoNET用户，使用CoNET代理伺服器，访问赞助商赞助的网站时产生的流量，都不被计入。免费用户需注意的是，如本日或本月流量已用完，无法接入CoNET代理伺服器，则无法利用此功能'\n        },\n        \n        QTGateInfo: {\n            title:'功能简介',\n            version:'本机版本：v',\n            detail:[{\n                header: '隐身匿名自由上网OPN',\n                color: '#a333c8',\n                icon: 'exchange',\n                detail: 'CoNET通过使用<a onclick=\"return linkClick (`https://zh.wikipedia.org/wiki/%E9%AB%98%E7%BA%A7%E5%8A%A0%E5%AF%86%E6%A0%87%E5%87%86`)\" href=\"#\" target=\"_blank\">AES256-GCM</a>和<a onclick=\"return linkClick (`https://zh.wikipedia.org/wiki/PGP`)\" href=\"#\" target=\"_blank\">OpenPGP</a>加密Email通讯，创造了OPN匿名网络通讯技术，CoNET公司首创的@OPN技术，它全程使用加密Email通讯，客户端和代理服务器彼此不用交换IP地址来实现高速通讯。iOPN通讯技术是利用普通HTTP协议下的混淆流量加密技术，能够隐藏变换您的IP地址高速通讯。二种通讯方式都能够让您，隐身和安全及不被检出的上网，保护您的隐私，具有超强对抗网络监控,网络限制和网络阻断。'\n            },{\n                color: '#e03997',\n                icon: 'talk outline',\n                header:'无IP点对点即时加密通讯服务QTChat',\n                detail:'CoNET用户之间通过email的点对点即时通讯服务，它具有传统即时通讯服务所不具有的，匿名无IP和用户之保持秘密通讯的功能。QTChat加密通讯服务可以传送文字，图片和视频文件信息，CoNET系统只负责传送信息，不拥有信息，也无法检查信息本身，所以CoNET不承担信息所有的法律责任。QTChat支持群即时通讯，将支持视频流直播服务。'\n            },{\n                color: '#6435c9',\n                icon: 'cloud upload',\n                header:'加密文件匿名网络云储存及分享功能QTStorage',\n                detail:'用户通过申请多个和不同的免费email服务商账号，可以把一个文件加密拆分成多个部分，分别存储在不同的email账号下，可以保密安全和无限量的使用网络储存。用户还可以通过CoNET系统在CoNET用户之间分享秘密文件。'\n            },\n            {\n                color: 'darkcyan',\n                icon: 'spy',\n                header: '阻断间谍软件向外送信功能',\n                detail: 'CoNET系统连接全球DNSBL联盟数据库，用户通过订阅CoNET系统黑名单列表，并使用CoNET客户端上网，让潜伏在您电子设备内的间谍软件，它每时每刻收集的信息，不能够被送信到其信息收集服务器，能够最大限的保障您的个人隐私。'\n            },{\n                color: '#6435c9',\n                icon: 'external share',\n                header:'本地VPN服务器',\n                detail:'CoNET用户在户外时可以通过连接自己家里的VPN，来使用CoNET客户端隐身安全上网。'\n            }]\n        },\n\n        cover: {\n            firstTitle1: 'CoNET平台',\n            firstTitle2: '安全隐私自由的互联网',\n            start: '开门',\n            proxyStoped: 'CoGate定制代理服务器已经停止，如需使用请重新定制代理服务器。'\n        },\n        \n        firstNote: {\n            title: '欢迎使用CoNET，感谢您使用我们的产品和服务(下称“服务”)。本服务由总部设在加拿大的CoNET技术有限公司.下称“CoNET”提供。',\n            firstPart: '您使用我们的服务即表示您已同意本条款。请仔细阅读。使用我们的服务，您必须遵守服务中提供的所有政策。',\n            detail: [\n                {\n                    header: '关于我们的服务',\n                    detail: '请勿滥用我们的服务，举例而言: 请勿干扰我们的服务或尝试使用除我们提供的界面和指示以外的方法访问这些服务。您仅能在法律(包括适用的出口和再出口管制法律和法规)允许的范围内使用我们的服务。如果您不同意或遵守我们的条款或政策，请不要使用我们所提供的服务，或者我们在调查可疑的不当行为，我们可以暂停或终止向您提供服务。'\n                },{\n                    header: null,\n                    detail: '使用我们的服务并不让您拥有我们的服务或您所访问的内容的任何知识产权。除非您获得相关内容所有者的许可或通过其他方式获得法律的许可，否则您不得使用服务中的任何内容。本条款并未授予您使用我们服务中所用的任何商标或标志的权利。请勿删除、隐藏或更改我们服务上显示的或随服务一同显示的任何法律声明。'\n                },{\n                    header: '关于CoNET无IP通讯技术和隐私保护的局限性',\n                    detail: 'CoNET是世界首创的使用Email地址建造一个无IP通讯环境，在您利用CoNET进行通讯过程中，CoNET无法获得您目前所使用的IP地址，可以最大限度的保障您的个人隐私。但是这项技术并不能够保证您的信息绝对的不被泄露，因为您的IP地址有可能被记录在您所使用的Email服务供应商，如果持有加拿大法院令寻求CoNET的Log公开，再和Email服务供应商的Log合并分析，可能会最终得到您的信息。 CoNET并不能够绝对保障您的隐私。 '\n                },\n                {\n                    header: '关于个人隐私保护，系统日志和接收CoNET传送的信息',\n                    detail: '在您使用服务的过程中，我们可能会向您发送服务公告、管理消息和其他信息。您可以选择不接收上述某些信息。'\n                },{\n                    header: null,\n                    detail: '当您使用我们的服务时，我们为了计费处理会自动收集非常有限的数据流量信息，并存储到服务器日志中。数据流量信息仅用于计算客户应支付通讯费用而收集的，它收集的数据是：日期，用户帐号，所使用的代理区域和代理服务器IP，数据包大小，下载或上传。例如：'\n                },{\n                    header: null,\n                    detail: '<p class=\"tag info\">06/20/2017 18:12:16, info@CoNET.com, francisco, 104.236.162.139, 300322 byte up, 482776323 byte down.</p><p class=\"tag info\">06/21/2017 12:04:18, info@CoNET.com, francisco, 104.236.162.139, 1435226 byte up, 11782238 byte down.</p>'\n                },\n                {\n                    header: null,\n                    detail: 'CoNET没有保存除了以上信息以外的任何其他信息。我们会配合并向持有加拿大法院令的执法机构提供此日志文件。如果您是加拿大以外地区的执法机构，有这方面信息披露的需求，请通过加拿大外交部来联系我们：'\n                },{\n                    header: null,\n                    detail: '<a class=\"tag alert\" href=\"http://www.international.gc.ca/\">http://www.international.gc.ca/</a>'\n                },\n                {\n                    header: '版权所有权',\n                    detail: '该软件是CoNET的智慧产权，并且受到相关版权法，国际版权保护规定和其他在版权授与国家内的相关法律的保护。该软件包含智慧产权材料, 商业秘密及其他产权相关材料。你不能也不应该尝试修改，反向工程操作，反汇编或反编译CoNET服务，也不能由CoNET服务项目创造或衍生其他作品。'\n                },\n                {\n                    header: null,\n                    detail: '关于我们服务中的软件，CoNET授予您免许可使用费、不可转让的、非独占的全球性个人许可, 允许您使用由CoNET提供的、包含在服务中的软件。本许可仅旨在让您通过本条款允许的方式使用由CoNET提供的服务并从中受益。您不得复制、修改、发布、出售或出租我们的服务, 或所含软件的任何部分。'\n                },{\n                    header: '修改与终止服务',\n                    detail: '我们持续改变和改善所提供的服务。我们可能会新增或移除功能或特性，也可能会暂停或彻底停止某项服务。您随时都可以停止使用服务，尽管我们并不希望您会这样做。 CoNET也可能随时停止向您提供服务，或对服务附加或设定新的限制。'\n                },\n                {\n                    header: '服务的责任',\n                    detail: '在法律允许的范围内，CoNET及其供应商和分销商不承担利润损失、收入损失或数据、财务损失或间接、特殊、后果性、惩戒性或惩罚性损害赔偿责任。'\n                },{\n                    header: '法律规定的贸易禁止事项',\n                    detail: '当您按下同意按钮，表示您已经确认您不属于加拿大法律所规定的禁止贸易对象的列表之中。 '\n                },\n                {\n                    header: '服务的商业使用',\n                    detail: '如果您代表某家企业使用我们的服务，该企业必须接受本条款。对于因使用本服务或违反本条款而导致的或与之相关的任何索赔、起诉或诉讼，包括因索赔、损失、损害赔偿、起诉、判决、诉讼费和律师费而产生的任何责任或费用，该企业应对CoNET及其关联机构、管理人员、代理机构和员工进行赔偿并使之免受损害。'\n                }, {\n                    header: '本条款的变更和约束力',\n                    detail: '关于本条款：我们可以修改上述条款或任何适用于某项服务的附加条款，例如，为反映法律的变更或我们服务的变化而进行的修改。您应当定期查阅本条款。我们会在本网页上公布这些条款的修改通知。我们会在适用的服务中公布附加条款的修改通知。所有修改的适用不具有追溯力，且会在公布十四天或更长时间后方始生效。但是，对服务新功能的特别修改或由于法律原因所作的修改将立即生效。如果您不同意服务的修改条款，应停止使用服务。如果本条款与附加条款有冲突，以附加条款为准。'\n                }\n                , {\n                    header: null,\n                    detail: '本条款约束CoNET与您之间的关系，且不创设任何第三方受益权。如果您不遵守本条款，且我们未立即采取行动，并不意味我们放弃我们可能享有的任何权利（例如，在将来采取行动）。如果某一条款不能被强制执行，这不会影响其他条款的效力。加拿大BC省的法律（不包括BC州的法律冲突规则）将适用于因本条款或服务引起的或与之相关的纠纷。因本条款或服务引起的或与之相关的所有索赔，只能向加拿大BC省法院提起诉讼，且您和CoNET同意上述法院拥有属人管辖权。'\n                }\n            ],\n            disagree: '不同意',\n            agreeMent: 'CoNET服务条款和隐私权'\n            \n        },\n\n        linuxUpdate:{\n            newVersionDownload: '点击这里下载并安装',\n            step1: '请更新版本：',\n            step2: '授权新版本CoNET为可执行文件',\n            step2J1:'/images/linuxUpdate1_tw.jpg',\n            step2J2:'/images/linuxUpdate2_tw.jpeg',\n            step2_detail1: '右键点击已下载的CoNET图标，选择菜单里的文件属性',\n            step2_detail2: '在权限选项里，选勾“允许档案文件执行”。',\n            step3:'退出旧版本CoNET后，双击CoNET文件执行安装',\n            exit: '退出CoNET',\n            tryAgain:'再次尝试',\n            refresh:'刷新页面'\n        },\n\n        imapInformation: {\n            title: '通讯专用Email邮箱设置',\n            tempImapAccount: `申请临时邮箱有困难？您可以暂时使用<a href=\"#\" style = \"margin-left: 0.5em;\" class=\"ui label teal\" onclick=\"return linkClick ('https://github.com/QTGate/QTGate-Desktop-Client/wiki/IMAP%E8%87%A8%E6%99%82%E5%B8%B3%E6%88%B6')\">CoNET提供的临时IMAP帐号供各位测试使用</a>`,\n            infomation: `请设置CoNET通讯专用Email邮箱信息。由于此账户的用户名和密码信息会提交给CoNET系统，为了防止您的个人信息被泄漏，请新申请一个临时Email账户。目前CoNET技术对应<a href=\"#\" class=\"ui label teal small\" onclick=\"return linkClick ('https://www.icloud.com/')\">苹果iCloud</a><a href=\"#\" class=\"ui label teal small\" onclick=\"return linkClick ('https://www.microsoft.com/zh-tw/outlook-com/')\">微软OUTLOOK</a><a class=\"ui label teal small\" href=\"#\" onclick=\"return linkClick ('https://www.zoho.com/mail/')\">俄罗斯ZOHO邮箱</a><a href=\"#\" class=\"ui label teal small\" onclick=\"return linkClick ('https://www.gmx.com/mail/#.1559516-header-nav1-2')\">美国在线GMX邮箱</a>，CoNET强力推荐使用苹果公司的Email可以达到最佳速度。密码请使用Email服务商的<a href=\"#\" onclick=\"return linkClick ('https://tw.help.yahoo.com/kb/SLN15241.html')\">应用密码</a>。对于Email供应商在应用密码申请时，须<a href=\"#\" onclick=\"return linkClick ('https://tw.help.yahoo.com/kb/%E9%96%8B%E5%95%9F%E5%85%A9%E6%AD%A5%E9%A9%9F%E9%A9%97%E8%AD%89-sln5013.html')\" >二步认证</a>并提供手机号码接受验证码，为保护您的隐私，建议使用免费在线代理接收验证码服务。( 如<a href=\"#\" onclick=\"return linkClick('http://receive-sms-online.com/')\">receive-sms-online.com</a>, <a href=\"#\" onclick=\"return linkClick('https://sms-online.co/receive-free-sms')\" >sms-online.co</a>, <a href=\"#\" onclick=\"return linkClick('https://receive-a-sms.com/')\" >receive-a-sms.com</a> ) 更多请 <a href=\"#\" onclick=\"return linkClick ('http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=%E5%85%8D%E8%B4%20%B9%E5%9C%A8%E7%BA%BF%E6%8E%A5%E6%94%B6%E6%89%8B%E6%9C%BA%E9%AA%8C%E8%AF%81%20%E7%A0%81&rsv_pq=e94f47a50001f66f&rsv_t=b03ePiy3rHH0T4FVoWB8Hx9vrVdZLzVhhErWOo4xdBpjDw%2BtGri%2BViTaVAw&rqlang=cn&rsv_enter=1&rsv_sug3=42&rsv_sug1=5&rsv_sug7=100')\">百度查找</a>，<a href=\"#\" onclick=\"return linkClick ('https://www.google.com/search?q=%E5%85%8D%E8%B4%B9%E5%9C%A8%E7%BA%BF%E6%8E%A5%E6%94%B6%E6%89%8B%E6%9C%BA%E9%AA%8C%E8%AF%81%E7%A0%81&oq=%E5%85%8D%E8%B4%B9%E5%9C%A8%E7%BA%BF%E6%8E%A5%E6%94%B6%E6%89%8B%E6%9C%BA%E9%AA%8C%E8%AF%81%E7%A0%81&aqs=chrome..69i57j69i60.254j0j4&sourceid=chrome&ie=UTF-8')\">Google查找</a>。`,\n            serverDetail: '详细设定：',\n            imapServer: 'IMAP服务器设定',\n            imapServerInput: 'IMAP服务器IP或域名',\n            UserName: '登陆用户名称',\n            Ssl: '使用Ssl加密信息传输：',\n            portName: '通讯端口号：',\n            otherPortNumber: '其他号码：',\n            Error_portNumber: '端口号应该是从1-65535之间，并且不等于22的数字',\n            smtpServer: 'SMTP服务器设定',\n            smtpServerInput: 'SMTP服务器IP或域名',\n            emailServerPassword: '邮箱密码(推荐使用应用专用密码)',\n            imapAccountConform: function ( iamp, account ) { return `<p class=\"ui small header brown\">警告：</p><p class=\"grey\">当您按下提交按钮时，意味着您已经确认【<B class=\"red\">${ iamp }</B>】是为了使用CoNET系统而特别申请的临时邮箱，您同意承担由此带来的风险，并授权CoNET系统可以使用这个Email邮箱传输信息!</p><p class=\"grey\" >CoNET平台将会向CoNET發送包含以下信息的email：【<B class=\"red\">${ iamp }</B>】及APP密碼，註冊【<B class=\"red\">${ account }</B>】郵箱地址，使用語言，時區，加密公鑰。</p><p class=\"grey\">同时您也同意并授权CoNET可以向您的注册邮箱【<B class=\"red\">${ account }</B>】发送CoNET有关服务，促销，账户及其他信息。</p>`},\n            agree: '我已经了解风险，并愿意继续',\n            imapOtherCheckError: '不能连接到Email服务器，有可能您设定的服务器名称或IP，通讯端口号有误，请检查您的服务器详细设定！',\n            CertificateError: 'Email服务器提示的证书不能被系统信任！您的Email服务器有可能是一个仿冒的，您如果想继续，请在下面详细设定里选择【允许连接到不被信任证书的Email服务器】，但您的Email登陆信息有可能泄漏给此服务器！',\n            IgnoreCertificate: '允许连接到不被信任证书的Email服务器',\n            Certificat: '如果您不确定请别选择这项，这个选择是非常危险，因为它允许连接上一个仿冒的服务器，可能泄露您的用户名和密码。',\n            AuthenticationFailed: 'Email服务器提示用户名或密码错误，请仔细检查您的用户名和密码！',\n            addAEmail: '添加通讯用Email账户',\n            tryAgain: '再试一次',\n            connectImap: '连接CoNET',\n            cancelConnect: '终止CoNET连接',\n            imapItemTitle: '通讯用邮箱详细信息',\n            loaderText:['正','在','和','C','o','N','E','T','建','立','通','讯','管','道','...'],\n            imapCheckingStep: [\n                /* 0 */'正在尝试连接email服务器',\n                /* 1 */'邮件服务器IMAP连接成功, 正在等待CoNET对接。',\n                /* 2 */'邮件服务器SMTP连接成功',\n                /* 3 */'CoNET客户端向CoNET系统发出联机请求Email。和CoNET联机需要额外的时间，请耐心等待。',\n                /* 4 */'成功连接CoNET',\n                /* 5 */'邮件服务器IMAP测试成功',\n                /* 6 */'邮件服务器SMTP测试成功',\n            ],\n            imapResultTitle:'IMAP服务器CoNET通讯评分：',\n            testSuccess: 'email服务器连接试验成功！',\n            exitEdit: '退出编辑Email帐户',\n            deleteImap: '删除IMAP账户',\n            proxyPortError: '本地代理服务器的端口设定从3001-65535之间的数字，或端口号已被其他APP所占用。请尝试填入其他号码。',\n            appPassword:'关于APP密码',\n            imapCheckError: [\n                '不能连接到邮件服务器，有可能您没有互联网，或所在网络不支持邮件IMAP通讯，请检查您的网络，或刷新页面重试一次。',\n                '邮件服务器提示用户名或密码错误，请仔细检查您的用户名和密码！ ',\n                '邮件服务器证书错误！您所在网络可能存在网络中间人攻击，请换网络环境后再尝试。 ',\n                '邮件服务器发送邮件错误，这通常是您使用的密码是普通密码所致，请换用APP密码后再次尝试',\n                '未连结互联网，请检查网络',\n                '未知错误，请退出CoNET后再试。',\n                '您的邮箱无可用空间错误，请检查邮箱删除不必要的邮件后再试。'\n            ]\n        },\n\n\t\thome_index_view: {\n            newVersion: '新版本准备就绪，请安装！',\n            clickInstall: '点击安装新版本',\n            showing: '系统状态',\n            internetLable: '互联网',\n            gateWayName:'代理服务器',\n            localIpAddress: '本机',\n            nextPage:'下一页',\n            agree: '同意协议并继续',\n            emailAddress: '作为CoNET账号的Email地址',\n            systemAdministratorEmail:'RSA密钥生成',\n            SystemAdministratorNickName: '昵称或组织名',\n            systemPassword: 'CoNET客户端密码设定',\n            creatKeyPair: '创建密钥对...',\n            imapEmailAddress: '邮箱账户名',\n            cancel: '放弃操作',\n            stopCreateKeyPair: '停止生成密钥对',\n            keyPairCancel: '生成密钥对被中止',\n            keyPairGenerateError: '生成密钥对发生系统错误，请重试！',\n            keyPairGenerateSuccess: '完成生成密钥对',\n            continueCreateKeyPair: '继续生成',\n            newVersionInstallLoading:'更新中请稍候',\n            KeypairLength: '请选择加密通讯用密钥对长度：这个数字越大，通讯越难被破解，但会增加通讯量和运算时间。',\n            GenerateKeypair: '<em>系统正在生成用于通讯和签名的RSA加密密钥对，计算机需要运行产生大量的随机数字有，可能需要几分钟时间，尤其是长度为4096的密钥对，需要特别长的时间，请耐心等待。关于RSA加密算法的机制和原理，您可以访问维基百科：' +\n                `<a href='https://zh.wikipedia.org/wiki/RSA加密演算法' target=\"_blank\" onclick=\"return linkClick ('https://zh.wikipedia.org/wiki/RSA加密演算法')\" >https://zh.wikipedia.org/wiki/RSA加密演算法</a></em>`,\n            inputEmail: '让我们来完成设定的最后几个步骤，首先生成RSA密钥对, 它是您的系统信息加密，身份认证及和CoNET网络通讯使用的重要工具。 RSA密钥对的密码请妥善保存，Email地址栏应填入您的常用邮箱地址, 它将被用作您的CoNET网络账号。 <em style=\"color:brown;\">需注意的是CoNET域名在某些网络限制地区可能被列入黑名单，请使用网络自由地区邮箱。</em>',\n            accountEmailInfo: '由于CoNET域名在某些国家和地区被防火墙屏蔽，而不能正常收发Email，如果您是处于防火墙内的用户，建议使用防火墙外部的邮件服务商。'\n        },\n\n        Home_keyPairInfo_view: {  \n            title: '密钥信息',\n            emailNotVerifi: '您的密钥未获CoNET签署认证。',\n            emailVerified: '您的密钥已获CoNET签署认证。',\n            NickName: '昵称：',\n            creatDate: '密钥创建日期：',\n            keyLength: '密钥位强度：',\n            password: '请输入长度大于五位的密码',\n            password1: '请输入平台密码',\n            keyID: '密钥对ID：',\n            logout: '退出登录',\n            deleteKeyPairHaveLogin: '请使用登陆后的客户端来删除您的密钥',\n            deleteKeyPairInfo: '请注意：如果您没有备份您的CoNET系统的话，删除现有的密钥将使您的CoNET设定全部丢失，您有可能需要重新设置您的CoNET系统。如果您的注册Email没有变化，您的CoNET账户支付信息不会丢失！',\n            delete: '削除',\n            locked: '请提供您的RSA密钥以解开密钥后才能继续操作，如果您遗忘了密码，请删除此RSA密钥。',\n            systemError:'发生系统错误。如果重复发生，请删除您的密钥，再次设定您的系统！'\n        },\n\n        error_message: {\n            title: '错误',\n            errorNotifyTitle: '系统错误',\n            EmailAddress: ['请按以下格式输入你的电子邮件地址: someone@example.com.','您已有相同的Email账户','此类Email服务器CoNET暂时技术不支持。'],\n            required: '请填写此字段',\n            doCancel: '终止完成',\n            PasswordLengthError: '密码必须设定为5个字符以上。',\n            localServerError: '本地服务器错误，请重新启动CoNET！',\n            finishedKeyPair: '密钥对创建完成！',\n            errorKeyPair:'密钥对创建发生错误，请重试',\n            Success: '完成',\n            SystemPasswordError: '密钥对密码错误，请重试！如果您已忘记您的密钥对密码，请删除现有的密钥对，重新生成新的密钥对。但您的原有设定将全部丢失！',\n            finishedDeleteKeyPair: '密钥对完成删除!',\n            offlineError: '您的电脑未连接到互联网，请检查网络后再次尝试！',\n            imapErrorMessage: [\n        /* 0 */ '未能链接CoNET网络。 CoNET网络可能存在问题，请稍后再次尝试。或联系CoNET服务。 ',\n        /* 1 */ '数据格式错误，请重试',\n        /* 2 */ '您的电脑未连接到互联网，请检查网络后再次尝试！ ',\n        /* 3 */ 'Email服务器提示IMAP用户名或密码错！这个错误通常是由于您使用的密码是普通密码，或者您的APP密码已失效，请到您的Email帐户检查您的APP密码，然后再试一次。 ',\n        /* 4 */ 'Email服务器的指定连接埠连结失败，请检查您的IMAP连接埠设定，如果您在一个防火墙内部，则有可能该端口被防火墙所屏蔽，您可以尝试使用该IMAP伺服器的其他连接埠！ <a href=\"data-html\"></a>',\n        /* 5 */ '服务器证书错误！您可能正在连接到一个仿冒的Email服务器，如果您肯定这是您希望连接的服务器，请在IMAP详细设定中选择忽略证书错误。 ',\n        /* 6 */ '无法获得Email服务器域名信息，请检查您的Email服务器设定！或者您的电脑没有互联网，请检查您的互联网状态。 ',\n        /* 7 */ '此Email服务器看来可能不能使用CoNET网络通讯技术，请再测试一次或选择其他email服务供应商！ ',\n        /* 8 */ 'Email服务器提示SMTP用户名或密码错！ ',\n        /* 9 */ '服务器证书错误！您可能正在连接到一个仿冒的Email服务器，如果您肯定这是您希望连接的服务器，请在SMTP详细设定中选择忽略证书错误。 ',\n        /* 10 */'SMTP连结提示未知错误',\n        /* 11 */'存在相同Email账号',\n        /* 12 */'您的系统还未连接到CoNET网络！ ',\n        /* 13 */'您的邮箱提示您账号已无可使用容量，请清理邮箱后再试',\n        /* 13 */'通讯遇到未知错误，请重试。'\n            ]\n            ,\n            CoNET_requestError: [\n                /* 0 */'CoNET无响应,正在重新建立CoNET通讯管道，请稍候。',\n                /* 1 */'无效操作！'\n            ],\n        },\n\n        emailConform: {\n            activeViewTitle:'验证您的密钥',\n            info1_1: `您的密钥还未完成验证，请点击[发送验证Email]按钮，并检查您的 【`,\n            info1_2: `】 邮箱。如果存在多封CoNET的邮件时，请选择最后一封信件。请打开信件并复制邮件内容。如果您还未收到CoNET的邮件，请检查您的密钥邮箱是否准确，或者您可以删除您现有的密钥，重新生成新密钥。`,\n            info2: '请复制从“-----BEGIN PGP MESSAGE----- （开始，一直到）-----END PGP MESSAGE-----” 结束的完整内容，粘贴在此输入框中。',\n            emailTitle: '感谢您使用CoNET服务',\n            emailDetail1: '尊敬的 ',\n            emailDetail1_1: '',\n            emailDetail2: '这是您的CoNET帐号激活密码，请复制下列框内的全部内容:',\n            bottom1_1: '此致',\n            buttom1_2: 'CoNET团队',\n            conformButtom: '验 证',\n            requestReturn: ['错误！您的请求被拒绝，这可能是您在短时间内多次请求所致，请稍后再试','CoNET已发送激活邮件！'],\n            reSendRequest:'发送验证Email',\n            formatError: [\n        /** 0 **/   '内容格式错误，请复制从“-----BEGIN PGP MESSAGE----- （开始，一直到）-----END PGP MESSAGE-----” 结束的完整内容，粘贴在此输入框中。 ',\n        /** 1 **/   '提供的内容不能被解密，请确认这是在您收到的最后一封从CoNET发送过来的激活信。如果还是没法完成激活，请删除您的密钥重新生成和设定。 ',\n        /** 2 **/   '和CoNET连接发生错误，请退出重新尝试！ ',\n        /** 3 **/   '无效激活码！如果存在多封CoNET的邮件时，请选择最后一封信件。',\n        /** 4 **/   '您的CoNET看上去有问题, 请删除您的密钥，重新设置您的CoNET！ ',\n        /** 5 **/   '抱歉，CoNET系统无应答，可能暂时下线，请您稍后再试。',\n        /** 6 **/   '您当天的数据通讯量达到上限，请等待明天再试或升级用户类型',\n        /** 7 **/   '用来通讯的Email设定有错误，请检查IMAP设定后重试，或CoNET不支持此Email类型',\n        /** 8 **/   '您所选区域不能够连结，请稍候再试',\n        /** 9 **/   '您的IMAP邮箱发信发生错误。请退出CoNET重试。如果持续发生此故障，您的IMAP帐号有可能被锁住，需要登陆您的IMAP邮箱网站解锁操作。 ',\n        /** 10**/   '页面会话已过期，请刷新页面以继续，或退出后重新启动CoNET。',\n        /** 11**/   'CoNET平台故障，请重新启动CoNET。'\n            ],\n            activeing: '正在通讯中'\n        },\n\n        QTGateRegion: {\n            title: '高品质定制代理服务器区域',\n            speedTest: '代理服务器速度测试：',\n            error: [],\n            CoGateRegionStoped:'所订制的代理服务器已经被停止，如需使用请再次订制.',\n            pingError:'代理服务区域速度检测发生错误，请退出CoNET，以管理员身份再次打开CoNET后，再执行速度检测！',\n            connectQTGate:'正在获得代理服务器区域信息...',\n            available: '服务中',\n            unavailable: '准备中',\n            requestPortNumber: '指定代理服务器通讯端口',\n            proxyDomain: '域名解释全程使用CoNET代理服务器端',\n            setupCardTitle: '使用连接技术:',\n            paidUse:'本区域只对收费用户开放',\n            MultipleGateway: '同时并发使用代理数',\n            dataTransfer: '数据通讯：',\n            dataTransfer_datail: ['全程使用代理服务器','当不能到达目标时使用代理'],\n            proxyDataCache: '浏览数据本地缓存:',\n            proxyDataCache_detail: ['本地緩存','不緩存'],\n            cacheDatePlaceholder: '缓存失效时间',\n            clearCache: '立即清除所有缓存',\n            localPort: '本地代理服务器端口号:',\n            localPath: '本地代理服务器HTTP链接路径',\n            outDoormode: '接受外網訪問',\n            GlobalIp: '本机互联网IP地址:',\n            option: '高级设置',\n            WebRTCleak:'阻止WebRTC漏洞',\n            WebRTCleakInfo: '本设置后，浏览器的即时会话，端对点通讯等将不再工作。',\n            QTGateRegionERROR:['发送连接请求Email到CoNET发生送信错误， 请检查您的IMAP账号的设定。',\n                                ''],\n            GlobalIpInfo: '注意：当您按下【CoNET连结】时您会把您的本机互联网IP提供给CoNET系统，如果您不愿意，请选择【@OPN】技术来使用CoNET服务！没有显示【@OPN】选项，目前只在旧金山区域有效，并只支持iCloud邮箱。',\n            sendConnectRequestMail: ['您的CoNET客户端没有联机CoNET网络，客户端已向CoNET系统重新发出联机请求Email。和CoNET联机需要额外的时间，请耐心等待。',\n                                     '当您长时间未使用CoNET时，您的连接会被中断。'],\n            cacheDatePlaceDate: [{ name:'1小时', id: 1 }, { name:'12小时', id: 12 },{ name:'1日', id: 24 }, { name:'15日', id: 360 }, { name:'1月', id: 720 }, { name:'6月', id: 4320 }, { name:'永远', id: -1 }],\n            atQTGateDetail: [\n        /*0*/   '世界首创的CoNET无IP互联网通讯技术，全程使用强加密Email通讯，客户端和代理服务器彼此不用知道IP地址，具有超强隐身和保护隐私功能，强抗干扰和超強防火墙穿透能力。缺点是有延迟，网络通讯响应受您所使用的email服务供应商的服务器影响，不适合游戏视频会话等通讯。目前该技术只支持iCloud邮箱。',\n        /*1*/   'CoNET独创明码HTTP混淆流量加密通讯技术，能够隐藏变换您的IP地址高速通讯，隐身和保护隐私，抗干扰和超強防火墙穿透能力。缺点是需要使用您的IP来直接连结代理服务器。如果您只是需要自由访问互联网，则推荐使用本技术。',\n        /*2*/   '域名解释使用CoNET代理服务器端，可以防止域名服务器缓存污染，本选项不可修改。',\n        /*3*/   '互联网数据全程使用CoNET代理，可以匿名上网隐藏您的互联网形踪。',\n        /*4*/   '只有当您的本地网络不能够到达您希望访问的目标时，才使用CoNET代理服务器代为连结目标主机，本选项可以加速网速，但失去隐私保护。',\n        /*5*/   '通过本地缓存浏览纪录，当您再次访问目标服务器时可以增加访问速度，减少网络流量，缓存浏览纪录只针对非加密技术的HTTP浏览有效。CoNET使用强加密技术缓存浏览纪录，确保您的隐私不被泄漏。',\n        /*6*/   '不保存缓存信息。',\n        /*7*/   '设置缓存有效时间，您可以及时更新服务器数据,单位为小时。',\n        /*8*/   '本地Proxy服务器，其他手机电脑和IPad等可通过连结此端口来使用CoNET服务。请设定为3001至65535之间的数字。',\n        /*9*/   '通过设置PATH链接路径可以简单给您的Proxy服务器增加安全性，拒绝没有提供PATH的访问者使用您的Proxy服务器。',\n        /*10*/  '同时使用多条代理线路数，可以有效降低大流量集中在一个代理服务线路，降低被网络监控者发现的风险。此选项仅供收费会员使用。',\n        /*11*/  '指定同CoNET代理进行通讯使用的端口号，通过此设置可以规避您所在网段被通讯屏蔽的端口。',\n        /* 12*/ 'Web实时通讯(WebRTC)客户端浏览器之间通过IP地址直接高速通讯技术，有时被恶意泄漏您的真实IP地址。'\n                ]\n            \n        },\n\n        useInfoMacOS: {\n            title:'<p>本地代理服务器已在后台运行。</p>您的其他电子设备，可通过本地代理设置，来使用CoNET连接到互联网',\n            title1:'MacOS 本地代理服务器设定',\n            customProxy: '定制服务器生成完成：',\n            proxySetupHelp:'代理设定如需帮助，请点击以下您所使用的系统图案',\n            webRTCinfo:'阻止WebRTC漏洞，请使用SOCKS代理设置，检查是否漏洞还在，请点击<a target=\"_blank\" href=\"/Wrt\">这里</a>',\n            wrtTest: '以下为测试结果：',\n            localIpAddress:'如果能看到这个IP地址，由于是本地局域网地址泄漏，无关紧要。',\n            globalIpAddress:'如果显示这个IP，您的浏览器泄漏了您真实的IP地址',\n            proxyServerIp:'<p>代理设置选择：<span style=\"color: brown;\">自动代理设置</p>',\n            wrtTestAreaTitle: 'WebRTC漏洞数据泄漏区域',\n            proxyServerPort: 'HTTP和HTTPS代理设定：',\n            proxyServerPassword: 'SOCKS代理设定：',\n            info:[{\n                title:'打开控制面板，点击网络',\n                titleImage:'/images/macOsControl.jpg',\n                detail: '',\n                image: '/images/userInfoMacos1.jpg'\n            },{\n                title:'选择网络【高级...】',\n                titleImage:'',\n                detail:'',\n                image: '/images/macosUserInfo2.jpg'\n            },{\n                title:'选择代理设定，按图示选勾左边自动代理，选勾排除简单服务器名',\n                titleImage:'',\n                detail:'<p>使用HTTP和HTTPS代理请按照蓝色第一行填入，使用SOCKS代理选择蓝色第二行</p>',\n                image: '/images/macosUserInfo3.jpg'\n            }]\n        },\n\n        thirdParty: {\n            comesoon:'即将推出',\n            information: '欢迎来到CoNET网络',\n            app: ['Co定制代理','酷茶','酷存','Co邮件','Co新闻频道','酷检索','Co推特', 'Co油管','酷钱包','CoNET定制业务'],\n            qtgateGateway: 'CoNET提供的高质量上网技术iOPN和@OPN，在CoNET全球16个区域，当场定制您专属的代理服务器，变换您的IP地址隐身无障碍的访问互联网',\n            dimmer: [\n                '高质量量身定制代理服务器业务，让您隐身安全不受注意的网上冲浪。 ',\n                '隐身匿名去中心化不被封锁的社交媒体',\n                '安全隐私文件云存储系统',\n                '隐身匿名邮件客户端，可免翻墙访问Gmail',\n                '免翻墙隐身匿名访问世界头条新闻',\n                'QTG承接定制各类公众服务类及跨国企业私有APP业务',\n                '免翻墙匿名隐身网页检索',\n                '免翻墙匿名隐身推特客户端',\n                '免翻墙匿名隐身Youtube客户端，可下载视频',\n                'CoNET加密货币钱包和交易所'\n            ]\n        }, \n\n        useInfoAndroid: {\n            title1:'安卓设备本地代理服务器设定',\n            info:[{\n                title:'打开控制面板选择WiFi',\n                titleImage:'/images/androidSetup.jpg',\n                detail: '',\n                image: '/images/android1.jpg'\n            },{\n                title:'长按当前WiFi连接名称等待菜单出现，选择菜单的修改设定',\n                titleImage:'',\n                detail:'',\n                image: '/images/android2.jpg'\n            }, {\n                title:'打开显示高级选项，在代理服务器设定(Proxy)中选择自动设置',\n                titleImage:'',\n                detail:'使用HTTP和HTTPS代理请按照蓝色第一行填入，使用SOCKS代理选择蓝色第二行',\n                image: '/images/android3.jpg'\n            }]\n        },\n\n        firefoxUseInfo:{\n            title1:'火狐浏览器它单独设定代理服务，可以不影响系统而轻松使用代理上网',\n            info:[{\n                title:'打开火狐，点击右上角工具图标，选择设定',\n                titleImage:'/images/macOsControl.jpg',\n                detail: '<p><a href=\"https://www.mozilla.org/zh-CN/firefox/#/\" target=\"_blank\">下载Firefox</a></p>',\n                image: '/images/firefox1.jpg'\n            },{\n                title:'选择常规后，滚动画面至最下部，在网络代理处点击详细设定',\n                titleImage:'',\n                detail:'',\n                image: '/images/firefox2.jpg'\n            },{\n                title:'选择自动设置，选勾域名使用SOCKS v5',\n                titleImage:'',\n                detail:'使用HTTP和HTTPS代理请按照蓝色第一行填入，使用SOCKS代理选择蓝色第二行',\n                image: '/images/firefox3.jpg'\n            }]\n        },\n\n        useInfoiOS: {\n            title1:'iOS设备本地代理服务器设定',\n            info:[{\n                title:'打开控制面板，点击Wi-Fi',\n                titleImage:'/images/macOsControl.jpg',\n                detail: '',\n                image: '/images/iOS1.jpg'\n            },{\n                title:'选择当前WiFi的圈i符号',\n                titleImage:'',\n                detail:'',\n                image: '/images/iOS2.jpg'\n            },{\n                title:'选择底部的设置代理服务器',\n                titleImage:'',\n                detail:'',\n                image: '/images/iOS3.jpg'\n            },{\n                title:'选择自动设置',\n                titleImage:'',\n                detail:'<p>在URL网址处填入：使用HTTP和HTTPS代理请按照蓝色第一行填入，使用SOCKS代理选择蓝色第二行</p>',\n                image: '/images/iOS4.jpg'\n            }]\n        },\n\n        useInfoWindows: {\n            title1:'Windows 10 代理服务器设定',\n            info:[{\n                title:'关于Windows其他版本设定',\n                titleImage:'',\n                detail: '<p>Windows其他版本的代理服务器设定请参照<a href=\"#\" onclick=\"return linkClick (`https://support.microsoft.com/ja-jp/help/135982/how-to-configure-internet-explorer-to-use-a-proxy-server`)\">微软公司网站</a></p><p>请按以下参数设置本地代理服务器：</p>',\n                image: ''\n            },\n                {\n                title:'启动Internet Explorer',\n                titleImage:'/images/IE10_icon.png',\n                detail: '<p>点击右上角工具图标，滑动菜单至最下部选择【设定】</p>',\n                image: '/images/windowsUseInfo1.jpg'\n            },{\n                title:'滑动菜单至最下部选择高级设定',\n                titleImage:'',\n                detail:'',\n                image: '/images/windowsUseInfo2.jpg'\n            },{\n                title:'再次滑动菜单选择打开代理服务器设定',\n                titleImage:'',\n                detail:'',\n                image: '/images/windowsUseInfo3.jpg'\n            },{\n                title:'选择自动设置代理服务器',\n                titleImage:'',\n                detail:'<p>WINDOWS10系统只对应HTTP和HTTPS，如果想使用全局代理的用户，需另外安装浏览器如火狐等，然后在火狐浏览器内单独设定Proxy全局代理SOCKS</p>',\n                image: '/images/windowsUseInfo4.jpg'\n            }]\n        },\n\n        QTGateGateway: {\n            title: 'CoNET服务使用详细',\n            processing: '正在尝试连接CoNET网络...',\n            error: [ \n            /* 0 */ '错误：您的账号下已经有一个正在使用CoNET代理服务器的连接，请先把它断开后再尝试连接。',\n            /* 1 */ '错误：您的账号已经无可使用流量，如果您需要继续使用CoNET代理服务器，请升级您的账户类型。如果是免费用户已经使用当天100M流量，请等待到明天继续使用，如您是免费用户已经用完当月1G流量，请等待到下月继续使用。',\n            /* 2 */ '错误：数据错误，请退出并重新启动CoNET！',\n            /* 3 */ '非常抱歉，您请求的代理区域无资源，请选择其他区域或稍后再试',\n            /* 4 */ '对不起，您所请求连接的区域不支持这样的连接技术，请换其他连接方法或选择其他区域连接',\n            /* 5 */ '@OPN链接技术不支持公用iCloud邮箱，请撤换通讯用IMAP邮箱，换您自有的iCloud邮箱。'\n                ],\n            connected:'已连接。',\n            promo: '促销活动',\n            upgrade:'升级账号',\n            accountManager:'账户管理',\n            userType:['免费用户','付费用户'],\n            datatransferToday:'日流量限额：',\n            datatransferMonth:'月流量限额：',\n            todaysDatatransfer: '本日可使用流量',\n            monthDatatransfer: '本月可使用流量',\n            gatewayInfo: ['代理服务器IP地址：','代理服务器连接端口：'],\n            userInfoButton: '使用指南',\n            stopGatewayButton:'停止所定制的服务器',\n            disconnecting: '正在销毁中...'\n        },\n\n        topWindow: {\n            title: '庆祝加拿大150周年特别提供'\n        },\n\n        feedBack: {\n            title: '使用信息反馈',\n            additional: '添附附加信息',\n            okTitle:'发送至CoNET'\n        },\n\n        qtGateView: {\n            title: '发送定制代理请求',\n            mainImapAccount: 'CoNET通讯用邮箱',\n            QTGateConnectStatus: 'CoNET连接状态',\n            QTGateConnectResultWaiting: '已向CoNET发送连接请求Email。由于是首次连接CoNET网络，系统需要几分钟时间来完成与您的对接，请耐心等待。',\n            QTGateDisconnectInfo: 'CoNET连结已断开。请选择向CoNET发送请求对接Email的IMAP帐号：',\n            QTGateConnectError: ['发送连接请求Email错误，请检查IMAP邮件帐户的SMTP设定！'],\n            QTGateConnectResult: ['CoNET未联机，请点击连接CoNET！', '正在和CoNET联中', '已经连接CoNET', '连接CoNET时发生错误，请修改IMAP账号设定','已经连接CoNET'],\n            QTGateSign: ['您的密钥状态','还未获得CoNET信任签署,点击完成信任签署',\n                '密钥获得CoNET信任签署是CoNET一个重要步骤，您今后在CoNET用户之间分享文件或传送秘密信息时，CoNET可以证明是您本人而非其他冒充者。你也可以通过您的密钥签署信任给其他CoNET用户，用以区别您自己的信任用户和非信任用户。',\n                '正在获得CoNET信任签署中','系统错误，请重启CoNET后再试，如果仍然存在，请尝试重新安装CoNET。','CoNET系统错误!']\n        \n        }\n        \n\t},{\n\n        coSearch: {\n            searchInputPlaceholder: 'サーチキーワードまたはウェーブアドレス',\n            SearchText:'検索',\n            totalResults: ['約','件'],\n            moreResults: '結果をさらに表示',\n            SearchesRelated: ['','に関連する検索キーワード'],\n            label_HTML: 'HTMLコード',\n            label_picture: 'イメージ',\n            imageSize: 'イメージサイズ:',\n            unSafe: ['安全浏览','非安全浏览（非推荐）'],\n            similarImages: '類似の画像',\n            errorMessage: [\n                '無効なレクエスト',\n                '選択された画像は処理ができません、ほかの画像をしてください',\n                'レクエスト回数は制限にかかった、後ほど改めてお試しください'\n            ],\n            coSearchConfigMenu: ['検索の設定', '使用する検索エンジン'],\n            coSearchConfigIcon:[ 'google',''],\n            coSearchEngineName: [ 'Google',''],\n            searchToolBarMenu: [\n                \"ウェイブ\", \"ニュース\",\"画像\",\"ビデオ\"\n            ],\n            timeUnit: {\n                hours: '時間前',\n                day: '天前',\n                mins: '分前'\n            },\n            TimeTolocalTime: function ( time: string ) {\n                return new Date ( time ).toLocaleDateString ('ja', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' })\n            }\n        },\n\n        appsManager: {\n            mainLoading: 'ノードのサービスを取得中...',\n            nodeName: 'ノードの名前：',\n            connectAddress:'ノードに接続アドレス：',\n\t\t\tserviceList:'サービス一覧',\n\t\t\twelcomeTextSub: 'プライバシー、セキュリティー、自由な新なインターネット'\n        },\n\n        youtube: {\n            startup: {\n                title: 'Co for Youtubeへようこそ',\n                detail: 'Youtubeビデオを検束し、ダウンロード又はプレーをします。'\n            },\n            search: {\n                placeholder: 'Youtubeを検束し、又はプレーUrlを入力',\n                button_text:'検束',\n                error: [\n                    '検束にエラーが発生しました、もう一回検束をしてみてください'\n                ]\n            }\n        },\n        perment:{\n            serverTitle:'サーバー'\n        },\n        twitter: {\n            newTwitterAccount: `TwitterのAPPインフォーメーションを入力してください。APPインフォーメーション作成する事がわからない場合は<a target=\"_blank\" href='https://github.com/QTGate/QTGate-Desktop-Client/wiki/Create-Twitter-APP'\">ここ</a>をクリックしてください。`,\n            addAccount:'Twitterアカウントを追加',\n            following: ['フォロー中','フォローを解除','フォロー'],\n            followers:'フォロワー',\n            second: '秒',\n            videoSizeOver: `ビデオがTwitter規格: 140秒、300MB、(1280x1024)を超えています`,\n            month: '月',\n            day:'日',\n            min: '分',\n            hour: '時間',\n            replying: '返信先: ',\n            retweeted: 'さんがリツイート',\n            close:'閉じる',\n            newTwitterTitle: ['ツイートする','新しいスレッドを作成'],\n            returnEdit: '中止破棄',\n            newTwitterDistroyButtonTitle: ['ツイートを破棄','スレッドを破棄'],\n            twitterBottonTitle:['ツイート','すべてツイート'],\n            urlInfo: '<h3>CoNETからのツイートクライアントのプレビュー版</h3><p>VPNやゲートウェイなど経由しなくて、ユーザはご自分のツイートアカウトにファイヤウォールを回避し安全匿名に無料無制限アクセスができます。</p><p>以下のURLを入力するとセルフォンやその他のデバイスもこちらのアプリケーションで楽しめます。</p>',\n            accountError:'ツイートがアカンウトAPPインフォーメーションにエラーがありまして、通信を拒否されました、APPインフォーメーションをチェックしてください。'\n        },\n        \n        thirdParty: {\n            comesoon:'まもなく登場します。',\n            information: 'CoNETネットワークへようこそ',\n            qtgateGateway:'CoNETご提供する高品質カスタムゲットウェイサービス、グローバルに１６区域とCoNET独自のiOPNと@OPN技術により、貴方のIPアドレスをカバーして、静かに無障害にインターネットの世界へ可能です。',\n            app:['CoGate', 'CoChat', 'CoBox','CoMail','CoNews','Co検索','Co for','Co for','Coウォレット','Coカスタム'],\n            \n            dimmer: [\n                '高品質カスタムゲットウェイサービス、自由になるインターネットの世界へ',\n                'ツイートスタイルの匿名ソーシャルメディア',\n                '匿名プライバシーファイルストレージ',\n                '匿名メール端末',\n                'グロバールニュースをチェック',\n                'CoNETに公衆及び私有ビジネスカスタム業務',\n                '匿名ウェーブサーチ端末',\n                '匿名Tweet端末',\n                '匿名Youtube端末、ビデオダウンロードをサポート',\n                '匿名ブロックチェーンウォレットとエクスチェンジ'\n            ]\n        }, \n\n        account:{\n            paymentSuccessTitile: 'ありがとうございました。',\n            stripePayment: 'オンライン支払い',\n            promoButton: 'プロモーション入力',\n            qtgatePayment:'CoNET経由でのお支払い',\n            QTGatePayRisk: 'CoNETセキュリティ経由でお支払いです。遠慮の場合はStripeセキュリティでのお支払いをしてください。',\n            paymentProblem1:'支払い支障がある',\n            willPayNextExpir:'引落とし日に ',\n            openAutomatically: '引落とし予約',\n            paymentProblem:'あなた現在いる所在地ではバンク支払いがブラックされている模様です。CoNET経由でのお支払いをしてください。',\n            CancelSuccess: function ( PlanExpire: string, isAnnual: boolean, returnAmount: number ) {\n                return `プランキャンセルしました。${ new Date (PlanExpire).toLocaleDateString() }まで、元プランのままCoNETサービスが使えます。そのあとはCoNETのフリーユーザーと戻ります。${ isAnnual? `元プラン残りus$ ${ returnAmount }は５日ウォキンデイ内お支払い使ったカードに戻ります`:`プラン代自動落しは中止されます`}。これからもよろしくお願い申し上げます。`\n            },\n            paymentSuccess:'あなたのプランをアップグレードしました。これからもよろしくお願い申し上げます。',\n            qtgateTeam: 'CoNETチーム全員より',\n            cardPaymentErrorMessage:[\n        /* 0 */ 'ご入力したカード番号に間違いがあるか、又支払いシステムはこのタイプのカードがサポートしておりません！',\n        /* 1 */ 'ご入力したカードの期限に間違いがあります！',\n        /* 2 */ 'ご入力したカードのセキュリティコードに間違いがあります！',\n        /* 3 */ 'ご入力したカード所有者の郵便番号に間違いがあります！',\n        /* 4 */ '原因不明けど、支払いが失敗しました。後ほどもう一度してみてください。',\n        /* 5 */ 'お支払いデータに間違いがあります。',\n        /* 6 */ 'お支払いは銀行から拒否されました。',\n        /* 7 */ 'エラーが発生しました、後ほどもう一度してみてください。', \n            ],\n            title: 'アカウト管理',\n            segmentTitle:　'アカウトタ: ',\n            cancelPlanButton:'キャンセルプラン',\n            planPrice: 'プラン価値：',\n            needPay: 'お支払い残高：',\n            currentPlanExpire: ['プラン終了日：','次の引落とし日'],\n            cantUpgradeMonthly: '年契約は月契約に戻れないです。一回年契約を中止してから月契約をしてください。',\n            currentAnnualPlan: ['月契約','一年契約'],\n            bandwidthBalance:'月残りデータ量：',\n            paymentProcessing:'サーバーとの通信中...',\n            oldPlanBalance: '元プラン残り価値：',\n            currentPlan:　'現在加入中のプラン: ',\n            MonthBandwidthTitle:'ゲットウェイ月制限：',\n            monthResetDayAfter:'',\n            cantCancelInformation: 'あなたのプランはフリーユーザー、又はCoNETテストユーザーか、クーポンを使ったのためキャンセルすることはできません。',\n            monthResetDay:'月レセット日：',\n\n            dayBandwidthTitle:'日制限：',\n            upgradeTitle:'アプグランド',\n            planExpirDate: function ( year: string, month: string, day: string ) { return `${ year } 年${ month }月${ day }日`},\n            accountOptionButton: 'アカウトオプション',\n            DowngradeTitle:'ダウングレードオプション',\n            cancelPlan:'キャンセルプラン',\n            networkShareTitle:'ゲットウェイ回線',\n            MonthBandwidthTitle1:'データ量',\n            payAmountTitile:'お支払い金額合計',\n            cardNumber: 'クレジットカード番号',\n            multiOpn:'OPN並列ゲットウェイ技術',\n            monthlyAutoPay: function ( monthCost: number ) { return `<span>口座振替</span><span class=\"usDollar\" >@ us$</span><span class=\"amount\" >${ monthCost }</span>/月<span>` },\n            cvcNumber: 'セキュリティコード',\n            calcelPayment:'キャンセル',\n            doPayment:'お支払いにします',\n            postcodeTitle: 'カード所有者郵便番号',\n            annualPay: function ( annual_monthlyCost: number ) { return `<span>年払いと月換算</span><span class=\"usDollar\">@ us$</span><span class=\"amount\" >${ annual_monthlyCost }</span>/月<span>`},\n            aboutCancel: 'プランをキャンセルについて',\n            expirationYear: 'カード期限',\n            canadaCard:'*おカード所有者はカナダ所在者とGST(BC)5.0% 自動加算されます',\n            continue:'次へ',\n            multiRegion:['シンプルリジョーン並列ゲットウェイ','マルチリジョーン並列ゲットウェイ','マルチリジョーン並列ゲットウェイ','マルチリジョーン並列ゲットウェイ'],\n            serverShareData:['シェアゲットウェイ','一台ゲットウェイ独占*','二台ゲットウェイ独占*','四台ゲットウェイ独占'],\n            internetShareData:['シェアハイスピード回線','独占ハイスピード一回線*','独占ハイスピード二回線*','独占ハイスピード四回線'],\n            monthlyPay:'プラン月額利用料',\n            serverShareData1:'並列ゲットウェイ技術を使う際に、同時使う数が独占数を超える場合には、独占リソースを他人と割合にチェアする場合もあります。',\n            maxmultigateway: ['最大二つ並列ゲットウェイ','最大四つ並列ゲットウェイ*','最大四つ並列ゲットウェイ'],\n            cancelPlanMessage:'CoNETプランは月毎に計算し、来月のあなたの最初加入した日まで、今のプランのままご利用ですます。キャンセルした日から自動的にCoNETの無料ユーザーになります。おアカウトは(月)払いの場合は、来月の自動払いは中止となります。年払いの場合は、ご使った分に月普通料金と計算し控除してから、お支払いを使ったクレジットカードに戻ります。販促コードまたはテストユーザーにはキャンセルすることができません。',\n            cancelPlanMessage1: function ( isAnnual: boolean, amount: number, monthlyPay: number, expire: string, passedMonth: number, totalMonth: number ) {\n                return `<span>あなたのプランは${ isAnnual ? `一年契約です。キャンセルをした場合は、ご利用して頂いた月に普通料金と請求を計算されます。お返し金額は，お支払って頂いたプラン年契約料金 </span><span class=\"usDollar\">us$</span><span class=\"amount\">${ amount /100 }</span><span> - そのプランの普通月料金 </span><span class=\"usDollar\">us$</span><span class=\"amount\">${ monthlyPay /100 }</span><span> X ご利用して頂いた月(本月も含めて)：</span><span class=\"amount\">${ passedMonth }</span><span> = 戻る金額 </span><span class=\"usDollar\">us$</span><span class=\"amount\">${ amount - passedMonth * monthlyPay > 0 ? ( amount - passedMonth * monthlyPay ) / 100 : 0 }</span><span>とまります。７日内お支払って頂いたクレジットカードへ返金とします。</span>`: `月プランです。キャンセルにすると次の更新日</span><span class=\"amount\">${ nextExpirDate( expire ).toLocaleDateString() }</span><span>に自動更新はしませんです。</span>`}`\n            }\n        },\n\n        QTGateDonate: {\n            title: 'スポンサーが提供する無料アクセスウェブサイト',\n            meta_title:'ドナー：',\n            detail:'CoNETユーザーはCoNETのゲットウェイを経由で、スポンサーが提供するウェブサイトにアクセスする際、発生したアクセスデータ量はユーザアカウトに記入しません。ただしCoNETのフリーアカウトは当日または当月データの使用量がリミットになった場合、CoNETゲットウェイに接続ができないの場合はご利用もできないので、ご注意をしてください。'\n        },\n\n        QTGateInfo: {\n            title:'機能紹介',\n            version:'バージョン：v',\n            detail:[{\n                color: '#a333c8',\n                icon: 'exchange',\n                header: '自由匿名なインターネットへOPN',\n                detail: '@OPNは本社の世界初のIP不要な通信技術です、<a onclick=\"return linkClick (`https://ja.wikipedia.org/wiki/Advanced_Encryption_Standard`)\" href=\"#\" target=\"_blank\">AES256-GCM</a>と<a onclick=\"return linkClick (`https://ja.wikipedia.org/wiki/Pretty_Good_Privacy`)\" href=\"#\" target=\"_blank\">OpenPGP</a>暗号化したEmailメッセージを通じたゲットウェイに接続します、iOPNは本社の独自のHTTPゲットウェイ暗号化高速通信技術です。どちらとも身を隠して誰も知らないうちにインターネットへ、プライバシー、ネットワーク監視とアクセスを制限・遮断にうまくすり抜けることができます。'\n            },{\n                color: '#e03997',\n                icon: 'talk outline',\n                header: 'IP不要な匿名プライバシーインスタントメッセージQTChat',\n                detail:'CoNETユーザー間の無IPペアーツーペアープライバシーインスタントメッセージです。それは伝統的なインスタントメッセージより匿名とプライバシーが可能です。又グループをして複数なユーザーの間でのインスタントメッセージもご利用いただけます。文字をはじめ、写真やビデオ映像、あらゆるファイルの暗号化転送も可能です。CoNETシステムはインスタントメッセージを各ユーザへ転送することだけですから、メッセージの内容をチェックするまたはメッセージ所有することではありませんので、メッセージそのものに法的責任は、メッセージをしたユーザーが負うです。'\n            },{\n                color: '#6435c9',\n                icon: 'cloud upload',\n                header:'ファイルを匿名プライバシーストレージとシェアQTStroage',\n                detail:'一つのファイルを暗号化してからスプリットし、多数のフリーメールアカンウトに保存します。無限かつ秘密プライバシーのファイルストレージ事ができます。CoNETユーザー間のファイルシェアも可能です。'\n            },\n            {\n                color: 'darkcyan',\n                icon: 'spy',\n                header: 'スパイソフトウェア送信を切断',\n                detail: 'CoNETシステムはグロバルDNSBLに加入し、スパイホストダータベースを更新しています。CoNETユーザはCoNETシステムをご利用してインターネットへアクセスした場合、あなたのデバイスに闇活動しているスパイソフト、収集したあなたの個人データの送信を切断することができます。'\n            },{\n                color: '#6435c9',\n                icon: 'external share',\n                header:'ローカルVPNサーバ',\n                detail:'CoNETユーザは自宅のマシンにVPN接続により、外にいても楽々OPNで隠れたネットワークへご利用できます。'\n            }]\n        },\n\n        useInfoWindows: {\n            title1:'Windows10ロカールプロキシ設定',\n            info:[{\n                title:' その他Windowsバージョンの設定について',\n                titleImage:'',\n                detail: '<p>Windowsその他バージョンの設定は<a target=\"_blank\" href=\"#\" onclick=\"return linkClick (`https://support.microsoft.com/ja-jp/help/135982/how-to-configure-internet-explorer-to-use-a-proxy-server`)\">Microsoft社のページ</a>をご参照してください。</p><p>設定する際使うデータは以下です：</p>',\n                image: ''\n            },\n                {\n                title:'Internet Explorerを開く',\n                titleImage:'/images/IE10_icon.png',\n                detail: '<p>右上部のツールボタンをクリックして、メニューの一番下にある設定を選択してください。</p>',\n                image: '/images/windowsUseInfo1.jpg'\n            },{\n                title:'メニューを一番下にスクロールして高級設定をクリック',\n                titleImage:'',\n                detail:'',\n                image: '/images/windowsUseInfo2.jpg'\n            },{\n                title:'再びメニューを下にスクロールして、オプンプロキシ設定をクリック',\n                titleImage:'',\n                detail:'',\n                image: '/images/windowsUseInfo3.jpg'\n            },{\n                title:'自動プロキシをオンに',\n                titleImage:'',\n                detail:'<p>WINDOWS 10 システムはHTTPとHTTPSしかサポートしておりませんが、SOCKSを使うなら、他のブラウザ例えばFireFoxなどをインストールによりお使いは可能です。</p>',\n                image: '/images/windowsUseInfo4.jpg'\n            }]\n        },\n\n        useInfoMacOS: {\n            title:'ローカルプロキシサーバはバックグランドで実行しています。他のデバイスはローカルプロキシに設定による、CoNET利用してインターネットへアクセスができます。',\n            title1:'MacOS プロキシ設定',\n            customProxy: 'サーバ作成しました',\n            proxySetupHelp:'ヘルプなら、以下のそれぞれのOSアイコンをクリックしてください。',\n            webRTCinfo:'WebRTC漏れ対応はSOCKSプロキシ設定をしてください。WebRTC漏れをテストするしたい場合は<a href=\"/Wrt\" target=\"_blank\">ここ</a>をクリックしてください',\n            wrtTest: 'テスト結果は以下です：',\n            wrtTestAreaTitle: 'WebRTC漏れデーターエリア',\n            globalIpAddress:'このIPアドレスが提示したら、あなたの真実IPがWebRTC漏れてしまいます。',\n            localIpAddress:'ここのIPはローカルネットワークIPアドレス漏れです、大したことはないです。',\n            proxyServerIp:'<p>プロキシの設定に：<span style=\"color:red;\">自動設置</span></p>',\n            proxyServerPort: 'HTTPとHTTPSプロキシは：',\n            proxyServerPassword: 'SOCKSプロキシは：',\n            info:[{\n                title:'コントロールパネルを開いて、ネットワークをクリックしてください。',\n                titleImage:'/images/macOsControl.jpg',\n                detail:'',\n                image: '/images/userInfoMacos1.jpg'\n            },{\n                title:'詳細...をクリックしてください ',\n                titleImage:'',\n                detail:'',\n                image: '/images/macosUserInfo2.jpg'\n            },{\n                title:'プロキシ設定を選んで、自動設置をチェック、簡単ホストをチェック',\n                titleImage:'',\n                detail:'<p>右の入力にHTTPとHTTPSは上のブルー行を、SOCKSは下の行を入力してください。</p>',\n                image: '/images/macosUserInfo3.jpg'\n            }]\n        },\n\n        firefoxUseInfo:{\n            title1:'Firefoxブラウザーは単独プロキシ設定で、システムに影響なしでプロキシをご利用してインタネットアクセスができます。',\n            info:[{\n                title:'Firefoxをオプンしてツールアイコンをクリックして、設置を選んでください。',\n                titleImage:'/images/macOsControl.jpg',\n                detail: '<p><a href=\"https://www.mozilla.org/ja/firefox/#\" target=\"_blank\">Firefoxダウンロード</a></p>',\n                image: '/images/firefox1.jpg'\n            },{\n                title:'一番下にスクロールしてプロキシネットワークに、詳細設定を選択します',\n                titleImage:'',\n                detail:'',\n                image: '/images/firefox2.jpg'\n            },{\n                title:'自動設定を選んで、ドメインをSOCKS v5を選んで',\n                titleImage:'',\n                detail:'HTTPとHTTPSは上のブルー行を、SOCKSは下の行を入力してください。',\n                image: '/images/firefox3.jpg'\n            }]\n        },\n\n        useInfoAndroid: {\n            title1:'Androidロカールプロキシ設定',\n            info:[{\n                title:`端末の設定アプリを開きます。[Wi-Fi]をタップします`,\n                titleImage:'/images/androidSetup.jpg',\n                detail: '',\n                image: '/images/android1.jpg'\n            },{\n                title:'Wi-Fiネットワーク名を押し続けます。[ネットワークを変更]をタップします',\n                titleImage:'',\n                detail:'',\n                image: '/images/android2.jpg'\n            },{\n                title:'[詳細設定項目]の横にある下矢印をタップして、自動設定を選択します',\n                titleImage:'',\n                detail:'HTTPとHTTPSは上のブルー行を、SOCKSは下の行を入力してください。',\n                image: '/images/android3.jpg'\n            }]\n        },\n\n        useInfoiOS: {\n            title1:'iOSロカールプロキシ設定',\n            info:[{\n                title:'コントロールパネルを開いて、WiFiをタップしてください',\n                titleImage:'/images/macOsControl.jpg',\n                detail: '',\n                image: '/images/iOS1.jpg'\n            },{\n                title:'Wi-Fiネットワーク名の右にあるまるiアイコンをタップしてください',\n                titleImage:'',\n                detail:'',\n                image: '/images/iOS2.jpg'\n            },{\n                title:'一番下のプロキシ設定をタップしてください',\n                titleImage:'',\n                detail:'',\n                image: '/images/iOS3.jpg'\n            },{\n                title:'自動設定を選択。',\n                titleImage:'',\n                detail:'<p>URLにHTTPとHTTPSは上のブルー行を、SOCKSは下の行を入力してください。</p>',\n                image: '/images/iOS4.jpg'\n            }]\n        },\n\n        cover: {\n            firstTitle1: 'CoNETプラットフォーム',\n            firstTitle2: '隠れて安全自由なネットワークへ',\n            start: 'オプンドア',\n            proxyStoped: 'カスタマーゲートウェイサーバーが停止しました、再作成をしてください。'\n        },\n\n        firstNote:  {\n            title: 'CoNETの製品およびサービス（以下「本サービス」）をご利用いただきありがとうございます。本サービスはカナダCoNETテクノロジ株式会社（以下はCoNETと言い）が提供しています。',\n            firstPart: 'ユーザーは、本サービスを利用することにより、本規約に同意することになります。以下を注意してお読みください。',\n            detail:[\n                {\n                    header: '本サービスのご利用について',\n                    detail: '本サービス内で入手できるすべてのポリシーを遵守してください。本サービスを不正に利用しないでください。たとえば、本サービスの妨害や、CoNETが提供するインターフェースおよび手順以外の方法による、本サービスへのアクセスを試みてはなりません。'\n                },{\n                    header: null,\n                    detail: 'ユーザーは、法律（輸出、再輸出に関して適用される法規制を含みます）で認められている場合に限り、本サービスを利用することができます。ユーザーがCoNETの規約やポリシーを遵守しない場合、またはCoNETが不正行為と疑う行為について調査を行う場合に、CoNETはユーザーに対する本サービスの提供を一時停止または停止することができます。'\n                },{\n                    header: '無IP通信技術CoNETネットワークはプライベートに限界があります',\n                    detail: '無IP通信は弊社の革新的技術であります。あなたはCoNET端末ソフトを使ってCoNETシステムとのコミニュケーションはお客さんが無IPでプライベートな通信を行います。でもお客さんのIPアドレスはeメールプロバイダーのログに記録していたかもしれません。裁判所命令を持つカナダの法執行機関はCoNETのログを得て、eメールプロバイダーのログと合併して、お客さんのプライベートインフォメーションを入手することも可能です。'\n                },\n                {\n                    header: null,\n                    detail: 'ユーザーは、本サービスを利用することによって、本サービスまたはアクセスするコンテンツに対するいかなる知的財産権も取得することはありません。ユーザーは、本サービスのコンテンツの所有者から許可を得た場合や、法律によって認められる場合を除き、そのコンテンツを利用することはできません。本規約は、本サービスで使用されている、いかなるブランドまたはロゴを利用する権利もユーザーに与えるものではありません。本サービス内に表示される、または、本サービスに伴って表示されるいかなる法的通知も、削除したり、隠したり、改ざんしてはなりません。'\n                },\n                {\n                    header: '個人情報保護及びCoNETからのインフォーメーションの受信について',\n                    detail: '本サービスの利用に関して、CoNETはユーザーに対してサービスの告知、管理上のメッセージ、およびその他の情報を送信することができます。ユーザーは、これらの通知について、受け取らないことを選択できる場合があります。'\n                }, {\n                    header: null,\n                    detail: 'お客様がCoNETサービスをご利用になる際に、お客様のデータ通信料計算のために、ご利用データ量が自動的に収集および保存されます。限られたログは以下のようです。日付、お客様アカウント、ご利用ゲットウェーエリアとゲットウェーIPアドレス、データ量、アップ又はダウンロード。例：'\n                },{\n                    header: null,\n                    detail: '<p class=\"tag info\">06/20/2017 18:12:16, info@CoNET.com, francisco, 104.236.162.139, 300322 byte up, 482776323 byte down.</p><p class=\"tag info\">06/21/2017 12:04:18, info@CoNET.com, francisco, 104.236.162.139, 1435226 byte up, 11782238 byte down.</p>'\n                }, {\n                    header: null,\n                    detail: 'CoNETは以上の情報以外には保存することしません。CoNETは以上の情報をカナダーの裁判所命令を持つカナダの法執行機関に協力することがありえます。カナダ以外のこのログ情報を協力する要請のあなたは、まずカナダ外務省までお問い合わせ下さい：'\n                },{\n                    header: null,\n                    detail: '<a class=\"tag alert\" href=\"http://www.international.gc.ca/\">http://www.international.gc.ca/</a>'\n                }, {\n                    header: 'ソフトウェアの版権について',\n                    detail: 'CoNETは、本サービスの一環としてユーザーに提供するソフトウェアについて、全世界で適用され、譲渡不可で、非独占的な個人使用ライセンスを無償でユーザーに付与します。このライセンスは、CoNETが提供する本サービスを本規約により許可された方法でユーザーが使用し、その便益を享受できるようにすることを唯一の目的としています。'\n                }, {\n                    header: null,\n                    detail: 'ユーザーは、本サービスまたは本サービスに含まれるソフトウェアのどの部分も、複製、変更、配信、販売、貸与することはできず、そのソフトウェアのソース コードのリバース エンジニアリングや抽出を試みることはできません。'\n                }, {\n                    header: '本サービスの変更または終了',\n                    detail: 'CoNETは、常に本サービスの変更および改善を行っています。CoNETは、機能性や機能の追加や削除を行うことができ、本サービス全体を一時停止または終了することができます。ユーザーはいつでも本サービスの利用を終了することができます。CoNETもいつでも、ユーザーに対する本サービスの提供を停止し、または、本サービスに対する制限を追加または新規に設定することができます。'\n                }, {\n                    header: '保証および免責',\n                    detail: 'CoNETは、商業上合理的な水準の技術および注意のもとに本サービスを提供し、ユーザーに本サービスの利用を楽しんでいただくことを望んでいますが、本サービスについて約束できないことがあります。'\n                }, {\n                    header: null,\n                    detail: '本規約または追加規定に明示的に規定されている場合を除き、CoNETまたはそのサプライヤーもしくはディストリビューターのいずれも、本サービスについて具体的な保証を行いません。たとえば CoNETは、本サービス内のコンテンツ、本サービスの特定の機能、その信頼性、利用可能性、またはユーザーのニーズに応える能力について、何らの約束もしません。本サービスは「現状有姿で」提供されます。'\n                }, {\n                    header: '本サービスに対するCoNETの責任',\n                    detail: '法律で認められる場合には、CoNETならびにそのサプライヤーおよびディストリビューターは、逸失利益、逸失売上もしくはデータの紛失、金銭的損失、または間接損害、特別損害、結果損害もしくは懲罰的損害について責任を負いません。'\n                }, {\n                    header: 'カナダー法律によるサービス禁止対象者',\n                    detail:　'あなたはカナダー法律によってサービス禁止対象者ではありませんと確認していた事。'\n                },\n                {\n                    header: '事業者による本サービスの利用',\n                    detail: '本サービスを事業者のために利用する場合、その事業者は本規約に同意するものとします。かかる事業者は、CoNETとその関連会社、役員、代理店、従業員を、本サービスの利用または本規約への違反に関連または起因するあらゆる請求申し立て、訴訟、法的措置について、請求申し立て、損失、損害、訴訟、裁判、告訴から生じる法的責任および費用、弁護士費用を含め、免責および補償するものとします。'\n                }, {\n                    header: '本規約について',\n                    detail: 'CoNETは、たとえば、法律の改正または本サービスの変更を反映するために、本サービスに適用する本規約または特定の本サービスについての追加規定を修正することがあります。ユーザーは定期的に本規約をご確認ください。CoNETは、本規約の修正に関する通知をこのページに表示します。'\n                }, {\n                    header: null,\n                    detail: '追加規定の修正については、該当する本サービス内において通知を表示します。変更は、さかのぼって適用されることはなく、その変更が表示されてから 14 日以降に発効します。ただし、本サービスの新機能に対処する変更または法律上の理由に基づく変更は、直ちに発効するものとします。本サービスに関する修正された規定に同意しないユーザーは、本サービスの利用を停止してください。'\n                }, {\n                    header: null,\n                    detail: '本規約と追加規定との間に矛盾が存在する場合には、追加規定が本規約に優先します。本規約は、CoNETとユーザーとの間の関係を規定するものです。本規約は、第三者の受益権を創設するものではありません。ユーザーが本規約を遵守しない場合に、CoNETが直ちに法的措置を講じないことがあったとしても、そのことによって、CoNETが有している権利（たとえば、将来において、法的措置を講じる権利）を放棄しようとしていることを意味するものではありません。'\n                }, {\n                    header: null,\n                    detail: 'ある特定の規定が強制執行不可能であることが判明した場合であっても、そのことは他のいずれの規定にも影響を及ぼすものではありません。カナダBC州の抵触法を除き、本規約または本サービスに起因するまたは関連するいかなる紛争に関しても、カナダBC州の法律が適用されます。本規約または本サービスに起因するまたは関連するいかなる主張についても、カナダBC州内に所在する裁判所においてのみ裁判手続を取ることができるものとし、ユーザーとCoNETはその裁判所の対人管轄権に同意するものとします。'\n                }\n            ],\n            disagree: 'キャンセル',\n            agreeMent: 'CoNET利用規約とプライバシー'\n        },\n\n        linuxUpdate:{\n            newVersionDownload: 'クリックしてダウンロードとインストール',\n            step1:'最新バージョンにアップデート：',\n            step2: 'CoNETを実行ファイルに許可与える。',\n            step2J1:'/images/linuxUpdate1_jp.jpg',\n            step2J2:'/images/linuxUpdate2_jp.jpg',\n            step2_detail1: '右クリックダウンロードしたCoNETファイル、プロパティを選んでください。',\n            step2_detail2: 'アクセス権にポログラムとして実行可能をチェック',\n            step3:'旧バージョンCoNETを退出して、新しいCoNETバージョンをダブクリックしてインストールをします。',\n            exit: '旧CoNETを退出',\n            tryAgain:'もう一度',\n            refresh:'リロードページ'\n        },\n\n        topWindow: {\n            title: 'カナダ１５０周年特別提供'\n        },\n        \n        imapInformation: {\n            title: '通信専用Emailアカウントを登録',\n            tempImapAccount: `IMAP設定に困るなら、<a href=\"#\" style = \"margin-left: 0.5em;\" class=\"ui label teal\" onclick=\"return linkClick ('https://github.com/QTGate/QTGate-Desktop-Client/wiki/IMAP%E9%80%9A%E4%BF%A1%E5%B0%82%E7%94%A8%E4%B8%80%E6%99%82%E7%9A%84%E3%81%AA%E3%82%A2%E3%82%AB%E3%83%B3%E3%82%A6%E3%83%88')\">CoNETご提供している一時アカンウトをテストのご利用いただけます。</a>`,\n            infomation:`CoNET通信専用emailアカンウトを設定します。このemailアカウントはあなたとCoNETお互い情報交換するのために、ユーザ名とパスワードをCoNETシステムへ提供します。個人情報漏洩の恐れ、一時的なemailアカウントを新たにつくてください。CoNET技術は只今<a href=\"#\" class=\"ui label teal small\" onclick=\"return linkClick ('https://icloud.com')\">Apple iCloud</a><a href=\"#\" class=\"ui label teal small\" onclick=\"return linkClick ('https://www.microsoft.com/ja-jp/outlook-com/')\">Outlook</a><a href=\"#\" class=\"ui label teal small\" onclick=\"return linkClick ('https://www.gmx.com/mail/#.1559516-header-nav1-2')\">GMX</a><a href=\"#\" class=\"ui label teal small\" onclick=\"return linkClick ('https://www.zoho.com/mail/')\">HOZO</a>対応しております、APPLEのiCloudを使うお勧めです。</span>メールアカウントのパスワードについて、<a href=\"#\" onclick=\"return linkClick ('https://support.microsoft.com/ja-jp/help/12409/microsoft-account-app-passwords-two-step-verification')\">アプリパスワード</a>をご利用のをお勧めです。アプリパスワードを申請する際に、<a href=\"#\" onclick=\"return linkClick ('https://support.microsoft.com/ja-jp/help/12408')\">2段階認証プロセス</a>に必要なスマートフォン番号を提示が必要な場合、個人プライバシーを守るのため、( <a href=\"#\" onclick=\"return linkClick('http://receive-sms-online.com/')\">receive-sms-online.com</a>, <a href=\"#\" onclick=\"return linkClick('https://sms-online.co/receive-free-sms')\" >sms-online.co</a>, <a href=\"#\" onclick=\"return linkClick('https://receive-a-sms.com/')\" >receive-a-sms.com</a> ) など<a href=\"#\" onclick=\"return linkClick ('http://jpnpay.com/archives/561')\">オンライン無料SMS受信サービス</a>をお勧めします。`,\n            serverDetail: '詳細設定：',\n            imapServer: 'IMAP設定',\n            imapServerInput: 'IMAPサーバー名又はIP',\n            UserName: 'ログインユーザー名',\n            Ssl: 'Ssl暗号化通信：',\n            portName: '通信ポート番号',\n            otherPortNumber: 'その他：',\n            Error_portNumber: '通信ポート番号は1から65535まで、22ではないの数字です。',\n            smtpServer: 'SMTP設定',\n            smtpServerInput: 'SMTPサーバー名又はIP',\n            emailServerPassword: 'Emailパスワード(アプリパスワードお勧め)',\n            imapAccountConform: function ( iamp, account ) { return `<p class=\"ui small header brown\">以下の事項をよく確認してから、送信ボタンを押してください：</p><p>このEmailアカンウト「<B class=\"red\">${ iamp }</B>」はあなたがCoNETシステムを使用するのために、一時的新たに作ったEmailアカンウトです。あなたはCoNETにこのEmailアカンウトのアクセス権にすることが了承しました。</p><p>以下の内容をCoNETへ送信することを了承すること：メールアカウント「<B class=\"red\">${ iamp }</B>」とAPPパスワード、メールアドレス「<B class=\"red\">${ account }</B>」、使う言語、タイムゾーン、パブリックキー。</p><p>あなたはCoNETに「<B class=\"red\">${ account }</B>」へCoNETに関わるシステム情報、支払い、アカンウト、販促などを送信することを了承と認可をします。</p>` },\n            agree:'私はそのリスクが了承して続きする',\n            imapOtherCheckError: 'Emailサーバーに接続ができませんでした。Emailサーバー名又はIPアドレス又は通信ポート番号に間違いがあります、詳細設定で再チェックをしてください。',\n            CertificateError: 'Emailサーバーに提示したセキュリティ証明書は信頼できないものです。続くをしたい場合は、詳細設定の中の「セキュリティ証明書信頼でき無くとも接続をする」を選択してください。その場合はあなたのEmailインフォメーションを漏れる可能性があります。',\n            IgnoreCertificate: 'セキュリティ証明書信頼でき無くとも接続をする',\n            Certificat: '危ないこのです、この選択であなたのユーザ情報は盗聴される可能性が大きい。',\n            addAEmail: '通信用Email追加',\n            AuthenticationFailed: 'Emailサーバはログインエラーが提示しました。ユーザー名とパスワードを再チェックしてください。',\n            tryAgain: 'もう一度試しにします',\n            connectImap: 'CoNETに接続にします',\n            cancelConnect: 'CoNETとの接続を中止します',\n            imapItemTitle: '通信用Email詳細設定',\n            loaderText:['C','o','N','E','T','へ','接','続','を','し','て','い','ま','す','...'],\n            imapCheckingStep: [\n                /* 0 */'emailサーバへ接続しています。',\n                /* 1 */'emailサーバへIMAP接続しました、CoNETからレスポンスを待ちます。',\n                /* 2 */'emailサーバへSMTP接続しました',\n                /* 3 */'CoNETクライアントは接続要請のメールをCoNETシステムへ送信しました、接続を完了するまで時間がかかるのためしばらくお待ちおください。',\n                /* 4 */'CoNETへ接続しました',\n                /* 5 */'emailサーバへIMAP接続しました'\n\n            ],\n            imapResultTitle:'IMAPサーバCoNET評価：',\n            testSuccess: 'emailサーバのテストが完了しました',\n            exitEdit: '退出編集Emailアカンウト',\n            deleteImap: 'IMAPアカウトを削除',\n            proxyPortError: 'ポート番号は3001から65535までの数字です。又指定したポートは他のアプリが使っています。番号を直してみてください。',\n            appPassword:'APPパスワードについて',\n            imapCheckError: [\n                'Emailサーバーに接続ができませんでした。ネットワークがオフラインか、所在しているネットワークはメール通信プロトコルがサポートしておりません。ネット環境をチェンジし、ページを更新してからもう一回してみてください。',\n                'Emailサーバはログインエラーが提示しました。ユーザー名とパスワードを再チェックしてください。',\n                'Emailサーバーに提示したセキュリティ証明書は信頼できないものです。中間者攻撃があるネット環境にいるあもしれないです。ネット環境をチェンジしてもう一回してみてください。',\n                'メール送信の際にエラーが発生しました。そのようなエラーは多分パスワードをAPPパスワードではなく、普通のパースワードを使った模様です。APPパスワードをチェックしてもう一回してみてください。',\n                'ネットはインターネットに接続していない模様です。',\n                'エラーが発生しました。CoNETを一回退出してからもう一回してみてください。',\n                'メールストレージ容量が一杯です、不要なメールを削除してからもう一回してみてください。'\n            ]\n        },\n\n        Home_keyPairInfo_view: {\n            newVersionDownload: 'クリックしてダウンロードとインストール',\n            title: '鍵ペアインフォメーション',\n            emailNotVerifi: '鍵ペアはまだCoNETサインされていません。',\n            emailVerified: '鍵ペアはCoNETサインされました。',\n            NickName: 'ニックネーム：',\n            creatDate:'暗号鍵ペア作成日：',\n            keyLength: '暗号鍵ペアビット長さ：',\n            password: '長さ5位以上のパスワードを入力してください',\n            password1: '端末パスワード',\n            logout: 'ログアウト',\n            deleteKeyPairHaveLogin:'ログインした端末で暗号鍵ペアを削除して下さい。',\n            keyID: '暗号鍵ID：',\n            deleteKeyPairInfo: '鍵ペアを削除することで、現在のCoNET設定は全部なくなって、一からCoNETの設定をやり直しが必要です。但しあなたのCoNETアカウトEmailアドレスは前回と同じであれば、CoNETアカウトを戻れます。',\n            delete: '削除',\n            locked: 'まず鍵ペアのパスワードを入力して、鍵ペアのロックを解除してください。',\n            systemError: 'システムエラーが発生しました。鍵ペアを削除して一からシステムを再設定をしてください。'\n        },\n\n\t\thome_index_view: {\n            newVersion: '新たなパージョンが用意しましたのでインストールをください。',\n            newVersionInstallLoading:'更新中お待ちください',\n            localIpAddress: 'ローカル',\n            clickInstall:'インストール',\n            internetLable: 'Internet',\n            gateWayName: 'ゲットウェー',\n            showing: 'システム状態',\n            nextPage: '次へ',\n            agree: '協議を合意し、次へ',\n            imapEmailAddress:'Emailアカウト名',\n            emailAddress: 'CoNETアカウトのEmailアドレス(必須), ',\n            SystemAdministratorNickName: 'ニックネーム(必須)',\n            creatKeyPair: '暗号鍵ペアを生成...',\n            keyPairCancel: '暗号鍵ペアの生成をキャンセルしました',\n            keyPairGenerateError: '暗号鍵ペアの生成にエラーが発生しました、後ほどもう一回してみて下さい',\n            keyPairGenerateSuccess: '暗号鍵ペアの生成は完了しました',\n            systemPassword: 'CoNET端末パスワードの設定',\n            stopCreateKeyPair: '暗号鍵ペア生成をキャンセル',\n            cancel: '操作停止',\n            continueCreateKeyPair: '生成を続きします',\n            KeypairLength: 'RSA暗号鍵ペアの長度を選んでください。この数字が長ければ、長いほど秘匿性によいですが、スピードが遅くなります。',\n            systemAdministratorEmail: 'RSA暗号鍵ペア生成',\n            GenerateKeypair: '<em>強秘匿性通信するのために、RSA暗号鍵ペアを生成中、大量なランダム数字が発生し、数分かかる場合もあります、4096ビットの場合、特に時間がかかります、しばらくお待ち下さい。RSA暗号技術について、ウィキペディア百科辞典を参考してください：' +\n                `<a href='https://ja.wikipedia.org/wiki/RSA暗号' target=\"_blank\" onclick=\"return linkClick ('https://ja.wikipedia.org/wiki/RSA暗号')\">https://ja.wikipedia.org/wiki/RSA暗号</a></em>`,\n            inputEmail: 'お疲れ様です、最後の設定をしましょう。このRSA暗号鍵ペアは本システムに重要な存在です、ユーザーのCoNETへ身元証明、本システムデータを秘密化、CoNETシステムとデータ通信時この暗号鍵ペアを使います。パースワードはCoNETへ保存しませんですから、大事にメモしてください。<em style=\"color:brown;\">CoNETはネットワークの制限があるエリアにブラックリスト入って恐れがあります、ここに制限があるエリアのメールサービスを入れるとCoNETからのメールが受信不能になる可能性もあります、CoNETへ登録完了することができない場合もあります。</em>',\n            accountEmailInfo:'CoNETドメイン名は、ファイヤウォールがある場合はブラックリストに入っている可能性がありますから、CoNETシステムへ登録完了することができません。その場合はファイヤウォール外側のEmailシステムを利用してください。'\n        },\n\n        error_message: {\n            title: 'エラー',\n            errorNotifyTitle: 'システムエラー',\n            EmailAddress: ['メール アドレスを someone@example.com の形式で入力してください。', '同じEmailアカンウトが既に存在します。','入力したメールはCoNETシステム非対応です。'],\n            required: 'このフィールドを入力してください。',\n            PasswordLengthError: '5文字以上の長さのパスワードが必要。',\n            localServerError: 'ローカルサーバーエラーが発生しました、CoNETを再起動をください！',\n            finishedKeyPair: '暗号鍵ペア作成完了しました。',\n            Success: '完成',\n            doCancel: 'キャンセルしました',\n            errorKeyPair: '暗号鍵ペア作成際エラーが発生、もう一度してください。',\n            SystemPasswordError: '暗号鍵パスワードが違います。パースワードが忘れた場合、現在の鍵ペアを削除してください。この場合は、現有の設定はなくなって、一からシステム設定をやり直しが必要です。',\n            finishedDeleteKeyPair: '暗号鍵ペア削除しました。',\n            offlineError: 'インターネット接続されていないらしいですが、ネットワークをチェックしてもう一度お試しください！',\n            imapErrorMessage: [\n        /* 0 */ 'CoNETと接続ができませんでした。CoNETサービスが一時停止しています。後ほどもう一度してみてください。またはCoNETサービスにお問い合わせしてください。',\n        /* 1 */ 'データフーマットエラー！', \n        /* 2 */ 'インターネット接続されていないらしいですが、ネットワークをチェックしてもう一度お試しください！',\n        /* 3 */ 'mailサーバはIMAPユーザー名又はパスワードに間違いがあると提示しました！このエラーは普通パスワードを使っていましたか、またはAPPパスワードが失効と可能性もありますが、メールプロバイダのアカウトページへチェックをしてください。', \n        /* 4 */ '指定したPORTでemailサーバへIMAPの接続ができませんでした、PORT番号をチェックしてください、ファイヤウォールの中にいる場合、指定したPORTはファイアウォールにフィルタした可能性があ裏ます、IMAPサーバーのその他有効PORT番号にチェッジしてください。<a href=\"https://tw.help.yahoo.com/kb/SLN15241.html\" target=\"_blank\" onclick=\"return linkClick (`https://tw.help.yahoo.com/kb/SLN15241.html`)\">应用密码</a>',\n        /* 5 */ 'IMAPサーバのセキュリティ証明書信頼できません。詐欺や、お使いのコンピューターからサーバーに送信されると情報を盗み取る意図が示唆されている場合があります。',\n        /* 6 */ 'Emailサーバドメインは有効ではありません、emailサーバの設定を修正してください。又このPCはインターネットに接続しておりません、ネットワークをチェックしてください。',\n        /* 7 */ 'このemailサーバはCoNET通信技術サポートしていません、もう一度テストをするか、他のemailプロバイダにチェンジをしてください。',\n        /* 8 */ 'emailサーバはSMTPユーザー名又はパスワードに間違いがあると提示しました！',\n        /* 9 */ 'SMTPサーバのセキュリティ証明書信頼できません。詐欺や、お使いのコンピューターからサーバーに送信されると情報を盗み取る意図が示唆されている場合があります。',\n        /* 10 */'SMTPサーバへ接続ができません。',\n        /* 11 */'同じEmailアカンウトが既に存在します。',\n        /* 12 */'CoNETと接続ができていません！',\n        /* 13 */'ご利用メールアドレスのメールボックス容量がいっぱいになっています。',\n        /* 14 */'通信に未知のエラーが発生しました。'\n            ],\n            CoNET_requestError: [\n                /* 0 */'CoNETが応答していなかったです。CoNET通信を再確立しています。しばらくお待ちください！ ',\n                /* 1 */'無効な操作です！'\n            ]\n        },\n\n        emailConform: {\n            activeViewTitle:'鍵ペア検証',\n            requestReturn: ['エラー発生しました、それは短時間内多数の請求をしたことです。','検証メールを発送しました。'],\n            info1_1:`鍵ペア検証は未完成です。「検証Emailを発行」を押してからメールボクス「`,\n            info1_2: `」をチェックしてください。CoNETから多数メールの場合は、最後のを選んでください。CoNETからのメールが見つからない場合は、鍵ペアを生成するメールアドレスを正しいかどうか、ダブチェックしてください。または鍵ペアを削除して新しい鍵ペアを再作成をしてください。`,\n            info2: 'コピーするのは「-----BEGIN PGP MESSAGE-----」から「-----END PGP MESSAGE-----」まで全ての内容をしてください。',\n            emailTitle: 'CoNETをご利用頂いて誠に有難うございます',\n            emailDetail1: '',\n            emailDetail1_1: ' 様',\n            emailDetail2: 'あなたのCoNETアカンウト検証暗号です。以下の全ての内容をコピーして、認証フィルターにペーストをしてください。',\n            bottom1_1: '以上',\n            bottom1_2: 'CoNETチームより',\n            conformButtom: '検 証',\n            reSendRequest:'検証Emailを発行',\n            formatError: [\n                'フォーマットエラー、コピーするのは「-----BEGIN PGP MESSAGE-----」から「-----END PGP MESSAGE-----」まで全ての内容をしてください。',\n                'この内容で暗号化解除ができませんでした。鍵ペアEmailアカンウトメールボックス再検査し、CoNETから最後のを選んでください。または鍵ペアを削除して、鍵ペア再発行してください。',\n                'CoNETに接続するのはエラーが発生した、一回退出し、再起動して接続をしてください。',\n                '検証できません！CoNETから多数メールの場合は、最後のを選んでください。',\n                'あなたのCoNETには問題があります、鍵ペアを削除して一から再セットアップしてください。',\n        /*5*/   'ごめんなさい、CoNETシステムは応答してくれません、オフラインかもしれません。後からもう一度試しにしてください',\n                'あなたの今日データ通信はリミットになっていますので、明日まで待ってください。またはユーザー種類をアップグレードをしてください',\n                '通信用IMAPの設定にエラーがあるか又はそのタープのIMAPアカンウトがCoNETサポートしません。よくチェックしてもう一回試しにしてください。',\n                '選択していたゲットウェーエリアは只今接続不能になっております、後ほどもう一度試しにしてください。',\n                'IMAPアカウトでEMAIL送信する際エラーが発生しました、一回退出し、起動して見てくださいね。重複発生した場合はIMAPアカウトのウェーブページでアカウトをアンロック操作を必要かもしれない。',\n                'ページセッションが終了しました。続行するにはページを更新するか、またCoNETを再起動してください',\n                'CoNETプラットフォームが故障になったと思いますが、CoNETを再起動してください'\n            ],\n            activeing: '通信中'\n        },\n\n        QTGateRegion: {\n            title: '高品質カスタマーゲートウェイサービスエリア',\n            speedTest: 'スピードテスト：',\n            available: 'サービス中',\n            unavailable: '準備しています',\n            CoGateRegionStoped:'ゲートウェイサーバーシャットダウンされました。',\n            requestPortNumber: 'ゲートウェイサーバーとの通信ポート:',\n            proxyDomain:'ドメイン検索はCoNETゲットウェイ側に依頼します。',\n            setupCardTitle: '接続技術:',\n            paidUse:'このエリアは契約ユーザーだけ使えます。',\n            MultipleGateway: '並列使うゲットウェイ数',\n            dataTransfer: '通信データは：',\n            dataTransfer_datail: ['全てのデータをOPN経由','ターゲットサーバへ到達不能時だけ'],\n            proxyDataCache: 'Webキャッシュ:',\n            proxyDataCache_detail: ['Yes','No'],\n            clearCache: 'クリアオールキャッシュ',\n            cacheDatePlaceholder: 'Webキャッシュ有効期限',\n            localPort: 'ローカルプロキシポート番号:',\n            option: '詳細設定',\n            localPath: 'ローカルプロキシポートPATHを指定します。',\n            outDoormode: '接受外網訪問',\n            WebRTCleak:'WebRTC漏れ対応',\n            WebRTCleakInfo: 'EtoEのゲイムやチャットなど動作しないかもしれません。',\n            pingError:'CoNETゲットウェイエリアスピードチェックエラーが発生しました。一回CoNETを終了して、管理者としてCoNETを再起動をして、スピードチェックをしてください。',\n            QTGateRegionERROR:['CoNETへ接続要請メールの送信ができなかったです。IMAPアカウントの設定を調べてください。',\n            ''],\n            sendConnectRequestMail: [\n                'CoNETクライアントはCoNETシステムとの接続が切れた。再接続要請メールをCoNETシステムへ送信しました、接続を完了するまで時間がかかるのためしばらくお待ちおください。',\n                'CoNETに長い間ご利用していなっかた時、接続は切れた場合もあります。'],\n            GlobalIp: 'グロバールIP:',\n            GlobalIpInfo:'要注意：【CoNET接続】をおすとあなたのグロバールIPアドレスをCoNETシステムに送信しますので、それを遠慮すれば【@OPN】接続を選んでください。@OPN技術がサンフランシスコリージョンに、iCloudメールしか対応しておりません。',\n            cacheDatePlaceDate: [{ name:'1時間', id: 1 }, { name:'12時間', id: 12 },{ name:'一日', id: 24 }, { name:'15日', id: 360 }, { name:'1月', id: 720 }, { name:'6月', id: 4320 }, { name:'永遠', id: -1 }],\n            connectQTGate:'CoNETゲットウェーエリアインフォメーションを取得しています...',\n            atQTGateDetail: [\n        /*0*/   'CoNETの世界初のIP不要な通信技術です。暗号化したEmailメッセージを通じたゲットウェイに接続することで、身を隠して誰も知らないうちにインターネットへ、プライバシーと強くファイヤウォールをうまくすり抜けることができます。但しお使いメールサーバの性能に次第スピードが遅くなり、長い遅延など短所があります、ゲームやビデオチャットなどに通信障害出る可能性があります。この技術はiCloudアカンウトのみ対応です',\n        /*1*/   'CoNETオリジナル技術のトラフィックをHTTPに偽装した暗号化通信技術です。あなたのIPを使ってゲットウェイに直接接続することで、高速通信とプライバシー、強くファイヤウォールをうまくすり抜けることができます。インターネット自由アクセスのためにCoNETを使うことになら、これをおすすめです。',\n        /*2*/   'ドメイン検索をCoNETゲットウェイ側にすることで DNS cache pollution を防ぐことができます。この選択は必要です。',\n        /*3*/   '全てインターネットデータをCoNETゲットウェイに通じてすることで、匿名でインターネットアクセスします。',\n        /*4*/   'ローカルネットワークが目標サーバに到達不能な際に、CoNETゲットウェイ通じてします。このことはネットスピードがアップできますが、プライバシーが無くなります。',\n        /*5*/   'アクセスしたWebサイトを一時ファイルに保持することで、高速レスポンスが利用可能となります、CoNETはいつも暗号化したデータを本機に保存します。但し暗号化通信には不対応です。',\n        /*6*/   'キャッシュを保存しません。',\n        /*7*/   'キャッシュ有効期限の設定によって、いつもサーバ側の最新情報を入手することができます。単位は時間です。',\n        /*8*/   'ローカルプロキシサーバーが他のデバイスをこのポートに接続によってCoNETデータの通信を利用可能です。3001から65535の間の数字を入れてください。',\n\n        /*9*/   'ローカルポロックPATHを指定することで、あなたのローカルポロックサーバを簡単セキュリティを与えられます。無断使用を禁止することができます。',\n        /*10*/   '同時に使うゲットウェイ数目を指定します。この技術はネットワークの大流量をいくつかのIPアドレスに分散して、監視者から逃げられます。この機能は有料会員しかのです。',\n        /*11*/   'CoNETゲットウェーとの通信ポート番号を指定します。あなた所在するネットワークの制限された通信ポートから避けることができます。',\n        /*12*/   'Web Real-Time Communication (WebRTC)は、ブラウザ間で仲介なしのIPアドレス直接的な、高速やり取りを可能にするオープン標準技術です。悪用の場合は、真実のIPアドレスを検出するをWebRTC漏れと呼ばれるものです'\n            ]\n        },\n\n        QTGateGateway: {\n            title: 'CoNETサービス使用詳細',\n            processing: 'CoNETネットワークへ接続中...',\n            error: [\n        /* 0 */     'エラー：あなたのアカンウトに既にCoNETゲットウェイに接続しているクライアントがありますが、その接続を退出してからもう一度接続してください。',\n        /* 1 */     'エラー：あなたのアカンウトにCoNETゲットウェイデータ通信制限になっております。もし引き続きご利用を頂きたいなら、アカンウトをアップグレードにしてください。フリーアカウントの場合は毎日100M、毎月1GBの通信制限があります。',\n        /* 2 */     'エラー：データフォーマットエラー、CoNETをリスタートしてください。','ごめんなさい、ご請求したゲットウェイエリアは準備中です。そのたのエリアを選ぶか、後ほど接続をしてください。',\n        /* 3 */     'エラー：請求した接続方法はこのエリアに対応しておりません、他のエリアに変更するか他の接続方法へください。',\n        /* 4 */     '@OPN接続をしたいなら、公衆iCloudアカウントに対応できません、ご自分のiCloudアカウントをCoNET通信アカウントにしてください。'\n                ],\n                    \n            connected:'接続しました。',\n            promo: 'プロモーション',\n            upgrade:'アップグレードアカンウト',\n            accountManager:'アカンウト',\n            userType: ['無料ユーザー','月契約'],\n            datatransferToday:'日通信量制限：',\n            datatransferMonth:'月通信量制限：',\n            todaysDatatransfer: '今日使える通信量',\n            monthDatatransfer: '今月使える通信量',\n            gatewayInfo: ['ゲットウェイIPアドレス：','ゲットウェイ接続ポート番号：'],\n            userInfoButton: '使用ガイド',\n            stopGatewayButton:'ゲットウェイサーバを停止します',\n            disconnecting: 'ゲットウェイサーバを破壊しています'\n        },\n        \n        qtGateView: {\n            title: 'CoNETへカスタムサーバーの作成を要請',\n            QTGateConnectResultWaiting: 'CoNETへ接続請求メールを送信しました。初めてのCoNETへ接続請求ですから、接続完成したまで数分かかる場合もあるかもしれませんが、暫くお待ちをください。',\n            mainImapAccount: 'CoNETへ情報交換用Emailアカンウト',\n            QTGateDisconnectInfo: 'CoNETと接続はしておりません、通信専用Emailを選択してCoNETへ接続メールを送信します。',\n            QTGateConnectError: ['CoNETへメールの送信にエラーが発生しました。通信専用Emailをチェックしてください。'],\n            QTGateConnectStatus: 'CoNET接続状態',\n            QTGateConnectResult: ['未接続、クリックと接続します。', 'CoNETへ接続中.', 'CoNETに接続しました。', 'CoNETへ接続にエラーが発生しました。IMAP設定を立ち直すしてください。',\n                'CoNETに接続しました。'],\n            QTGateSign: ['あなたの鍵ペア状態','CoNETに信頼サインがないです','CoNETに信頼サインを取得したことで、CoNETのユーザーの間にファイル又はインフォーメーションなど秘密情報を交換する際、あなたの身元証明となります。本人以外のを区別することができます。あなたも持っている鍵ペアで他のCoNETユーサーに信頼サインすることで、あるCoNETユーサーを信頼関係確定することができます。',\n                'CoNETに信頼サインを取得しています','CoNETシステムエラー、CoNETを再起動してからもう一度してみてください。もし直れないならCoNETを一から再インストールしてください。','CoNETシステムエラー']\n        },\n\n        feedBack: {\n            title: 'フィードバック',\n            additional: '追加情報を添付する',\n            okTitle:'CoNETへ送信'\n        },\n\n\t},{\n        coSearch: {\n            searchInputPlaceholder: 'Search or type a URL',\n            SearchText:'Search',\n            totalResults: ['About','results'],\n            moreResults: 'More Results',\n            SearchesRelated: [ 'Searches related to ','' ],\n            label_HTML: '</>',\n            imageSize: 'Image size:',\n            label_picture: 'Picture',\n            similarImages: 'Visually similar images',\n            unSafe: ['Safe viewer','Unsafe viewer'],\n            errorMessage: [\n                'Invalid request.',\n                'This image have issue of format. Select other one please.',\n                'Request maximum error. Try again later.'\n            ],\n            coSearchConfigMenu: ['Search setup','Search engines'],\n            coSearchConfigIcon:[ 'google',''],\n            coSearchEngineName: [ 'Google',''],\n            searchToolBarMenu: [\n                \"Website\", \"News\",\"Picture\",\"Video\"\n            ],\n            timeUnit: {\n                hours: 'hours ago',\n                day: 'days ago',\n                mins: 'minutes ago'\n            },\n            TimeTolocalTime: function ( time: string ) {\n                return new Date ( time ).toLocaleDateString ('en', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' })\n            }\n        },\n\n        appsManager: {\n            mainLoading: 'Loading node information...',\n            nodeName: 'Node name: ',\n            connectAddress:'Node address: ',\n\t\t\tserviceList:'Service list',\n\t\t\twelcomeTextSub: 'Anonymous, private, security and freedom of new Internet.'\n        },\n        youtube: {\n            startup: {\n                title: 'Welcome to Co for Youtube',\n                detail: 'You may search YouTube video, channel, or playlist that matches the search parameters. And you may play the video at local.'\n            },\n            search: {\n                placeholder: 'Search Youtube, or enter a play url',\n                button_text:'Search',\n                error: [\n                    'Search error! please search again.'\n                ]\n            }\n        },\n        perment:{\n            serverTitle:'Server'\n        },\n        twitter: {\n            newTwitterAccount: `Please input Twitter APP information. How to create Twitter APP please click <a target=\"_blank\" href='https://github.com/QTGate/QTGate-Desktop-Client/wiki/Create-Twitter-APP'\">hear</a> to got more information.`,\n            addAccount:'Add an Twitter account',\n            following: ['Following','Unfollow','Follow'],\n            followers:'Followers',\n            second: 's',\n            min: 'm',\n            hour: 'h',\n            videoSizeOver: `This video is over Twitter specifications: 140's or 300MB or (1280 x 1024).`,\n            retweeted: 'Retweeted',\n            month:'m',\n            day: 'd',\n            close:'Close',\n            newTwitterTitle: ['Compose new Tweet', 'Compose new thread'],\n            returnEdit: 'Cancel',\n            replying: 'Replying to ',\n            twitterBottonTitle: ['Tweet', 'Tweet all'],\n            urlInfo: '<h3>Twitter client previwe version from CoNET.</h3><p>A free and no need VPN or CoGate gateway, anonymous and securety via CoNET network access your Twitter account.</p><p>You also may open this App with URL from your cellphone and other device.</p>',\n            newTwitterDistroyButtonTitle: ['Discard','Discard'],\n            \n            accountError:'Twitter return error: Invalid or expired token. error. Please check your account APP information and try again.'\n        },\n        thirdParty: {\n            information: 'Welcome to CoNET.',\n            comesoon:'Come soon.',\n            qtgateGateway: 'CoGate gateway service. High speed, total privacy, ultra secure and easy to use. Your gateway to a secure and open internet.',\n            app:['CoGate', 'CoChat', 'CoBox', 'CoMail', 'CoNews', 'CoSearch', 'Co for','Co for','CoWallet','Co Custom'],\n            \n            dimmer: [\n                'Advanced private custom gateway service',\n                'Private and secure, decentralized social media',\n                'Private cloud storage and file sharing',\n                'Privacy email client',\n                'Discover your world every day',\n                'Custom business solution for public or private APPs in CoNET',\n                'Web search client',\n                'Privacy Tweet client',\n                'Privacy Youtube client. May download Youtube video via 3rd-party webside.',\n                'CoNET Cryptocurrency wallet'\n            ]\n        }, \n        account:{\n            QTGatePayRisk: 'Your payment will be processed via CoNET’s secured payment portal. If concerned about privacy, Please use the Stripe payment portal.',\n            paymentSuccessTitile: 'Thank you.',\n            stripePayment: 'Bank gateway payment',\n            willPayNextExpir:`We'll charge your payment at renew day `,\n            openAutomatically: 'Auto-renew',\n            paymentProblem1: 'Payment via CoNET',\n            promoButton: 'Have Promo',\n            paymentProblem:'Looks bank payment gateway was block in your area. You can payment via CoNET gateway.',\n            qtgatePayment:'Payment with CoNET System',\n            paymentSuccess:'Your plan has beed upgraded.',\n            qtgateTeam: 'The CoNET Team',\n            networkShareTitle:'Bandwidth',\n            CancelSuccess: function ( PlanExpire: string, isAnnual: boolean, returnAmount: number ) {\n                return `Your subscriptions was cancelled. You may keep use CoNET service with this plan until ${ new Date( PlanExpire ).toLocaleDateString() }. Restrictions apply to free accounts and accounts using promotions. ${ isAnnual ? `Refund amount us$${ returnAmount } will return to your paid card account in 5 working day.` : `Automatically canceled.` } `\n            },\n            currentPlanExpire: ['Plan expires on: ','Renews at','monthly reset day '],\n            currentAnnualPlan: ['Monthly plan','Annual plan'],\n            cardPaymentErrorMessage:[\n        /* 0 */ 'Error: card number or have an unsupported card type.',\n        /* 1 */ 'Error: expiration!',\n        /* 2 */ 'Error: Card Security Code',\n        /* 3 */ 'Error: Card owner postcode',\n        /* 4 */ 'Error: payment failed. Please try again late.',\n        /* 5 */ 'Error: Payment data format error!',\n        /* 6 */ 'Error: Payment failed from bank.',\n        /* 7 */ 'Error: Please try again late.'\n            ],\n            title: 'Manage account',\n            segmentTitle:'Account: ',\n            needPay: 'The balance: ',\n            cancelPlanButton:'Cancel plan',\n            currentPlan:'Current Plan: ',\n            oldPlanBalance: 'Remaining of old plan: ',\n            MonthBandwidthTitle:'Gateway Bandwidth：',\n            dayBandwidthTitle:'Day limited：',\n            bandwidthBalance:'Bandwidth remaining: ',\n            upgradeTitle: 'Upgrade',\n            planExpirDate: function ( year: string, month: string, day: string ) { return `${ month }/${ day } ${ year }`},\n            accountOptionButton: 'Account option',\n            planPrice: 'Plan price：',\n            monthResetDay:'Monthly reset day: ',\n            monthResetDayAfter:'th',\n            cantUpgradeMonthly: 'Annual may not downgrade to monthly plan. Please cancel current plan, then select this one.',\n            DowngradeTitle:'Downgrade Option',\n            cancelPlan:'Cancel plan',\n            cantCancelInformation: 'This subscription plan may not be cancelled. Free user plans, promotions, special codes and test program plans cannot be cancelled. ',\n            multiOpn:'OPN multi-gateway technology',\n            MonthBandwidthTitle1:'Bandwidth',\n            serverShare:'Gateway',\n            monthlyAutoPay: function ( monthCost: number ) { return `<span>Billed Monthly</span><span class=\"usDollar\" >@ us$</span><span class=\"amount\" >${ monthCost }</span>/mo<span>` },\n            cardNumber: 'Card number',\n            paymentProcessing:'Connecting...',\n            calcelPayment:'Cancel',\n            doPayment:'Process Payment',\n            expirationYear: 'Expiration',\n            postcodeTitle: 'Card owner postcode',\n            payAmountTitile:'Amount',\n            cvcNumber: 'Card Security Code',\n            annualPay: function ( annual_monthlyCost: string ) { return `<span>Billed Annually</span><span class=\"usDollar\">@ us$</span><span class=\"amount\" >${ annual_monthlyCost }</span>/mo<span>`},\n            canadaCard:'*For Canadian residents, GST (5%) will be applied automatically.',\n            multiRegion:['multi-gateway in single region','multi-gateway in multi-regions*','multi-gateway in multi-regions*','multi-gateway in multi-regions'],\n            continue:'Next step',\n            serverShareData:['Shared gateway','Dedicated gateway server*','Dedicated 2 gateway server*','Dedicated 4 gateway server'],\n            internetShareData:['Shared High Speed Bandwidth','Dedicated High Speed Bandwidth*','Dedicated 2 High Speed Bandwidth*','Dedicated 4 High Speed Bandwidth'],\n            maxmultigateway: ['Max: 2 multi-gateway','Max: 4 multi-gateway*','Max: 4 multi-gateway'],\n            monthlyPay:'Monthly pricing',\n            aboutCancel: '*About Subscription cancellation',\n            cancelPlanMessage: '<span>You may cancel your CoNET subscription at any time from within the this app. You will continue to have access to the CoNET services through the end of your paid period until all remaining subscription time in your account is used up. Please refer to the </span><a class=\"ui olive tiny label\">Terms of Service</a> for cancellation and refund policy. Restrictions may apply to free plans and promotional accounts.',\n            serverShareData1:'Your dedicated server will be share ratio when you connected over your dedicated count via use Multi-gateway technology.',\n            cancelPlanMessage1: function ( isAnnual: boolean, amount: number, monthlyPay: number, expire: string, passedMonth: number, totalMonth: number ) {\n                return `<span>Your are on ${ isAnnual ? `annual payment plan</span><span class=\"usDollar\">us$</span><span class=\"amount\">${ amount /100  }</span><span>. ${ passedMonth } month${ totalMonth - passedMonth > 1 ? 's': '' } are available on your account. Your refund amount will be </span><span class=\"usDollar\">us$</span><span class=\"amount\">${ amount - passedMonth * monthlyPay > 0 ? ( amount - passedMonth * monthlyPay ) /100 : 0 }</span>.`: `monthly, it will not be renew at </span><span class=\"amount\">${ nextExpirDate ( expire ).toLocaleDateString() }</span><span> if you cancel this plan.</span>`}`\n            }\n        },\n\n        QTGateDonate: {\n            title: 'Free access website provided by sponsor.',\n            meta_title:'Donor：',\n            detail:`CoNET users may access these sponsored websites via CoNET OPN. Free users may not be able to access if your daily limit has been reached.`\n        },\n\n        QTGateInfo: {\n            title:'Features',\n            version:'Installed veriosn：v',\n            detail:[{\n                color: '#a333c8',\n                icon: 'exchange',\n                header: 'OPN: Security and Privacy while accessing the Open Internet.',\n                detail: `@OPN@ uses CoNET’s “Quiet” technology to create a obfuscated private network by refracting encrypted data packets thru email servers. @OPN provides true stealth internet communications where your IP address is hidden to client or proxy servers. iOPN uses CoNET’s technology to obfuscate data traffic over HTTP. Both @OPN and iOPN offer security, protection and privacy while allowing access to the open internet. All data is kept private with encryption using <a onclick=\"return linkClick('https://en.wikipedia.org/wiki/Advanced_Encryption_Standard')\" href=\"#\" target=\"_blank\">AES256-GCM</a> and <a onclick=\"return linkClick ('https://en.wikipedia.org/wiki/Pretty_Good_Privacy')\" href=\"#\" target=\"_blank\">OpenPGP</a> along with CoNET’s proprietary security measures.`\n            },{\n                color: '#e03997',\n                icon: 'talk outline',\n                header:'QTChat: Private and secure, peer to peer Instant messaging with no IP address.',\n                detail:'CoNET users can communicate with others via a private and secure instant messaging service. Using the @OPN stealth technology and end-to-end encryption, users are secure and messages kept private with no IP address footprint. Supports group chat with multiple users and can be used for privately transferring, pictures, files and live video streaming. Using end-to-end encryption ensures only the user and the people the user is communicating with can read what is sent, and nobody in between, not even CoNET. This is because messages are secured with an encrypted lock, and only the recipient and original message sender will have the special key needed to unlock and read them.'\n            },{\n                color: '#6435c9',\n                icon: 'cloud upload',\n                header: 'QTStroage: The secure and Private cloud storage and file sharing.',\n                detail: 'Users can store and share files by using CoNET @OPN to split files into multiple parts, each encrypted to different email accounts. CoNET user can share the file privately between other users on CoNET’s OPN.'\n            },\n            {\n                color: 'darkcyan', \n                icon: 'spy',\n                header: 'Spam and Spyware detection and blocking.',\n                detail: 'CoNET uses the global DNSBL database to stop spam and spyware. CoNET users will be automatically filtered from spam and spyware to stop them from transmitting your information.'\n            },{\n                color: '#6435c9',\n                icon: 'external share',\n                header:'Personal VPN connection.',\n                detail:'Access your CoNET OPN services anywhere via personal VPN connection from anywhere.'\n            }]\n        },\n\n        firefoxUseInfo:{\n            title1:'Firefox browser can use separate proxy settings from the system settings. This allows for easy use of a proxy to access the internet without editing the system settings.',\n            info:[{\n                title:'CClick Firefox tool icon. Select Preferences or Options.',\n                titleImage:'/images/macOsControl.jpg',\n                detail: '<p><a href=\"https://www.mozilla.org/en-US/firefox/#\" target=\"_blank\">Download Firefox.</a></p>',\n                image: '/images/firefox1.jpg'\n            },{\n                title:'In the General tab, scroll to the bottom, click on Settings under Network Proxy.',\n                titleImage:'',\n                detail:'',\n                image: '/images/firefox2.jpg'\n            },{\n                title:'Select Automatic proxy configuration URL and insert the URL as shown in blue below (select URL for HTTP/S or SOCKS). Make sure to Check on “Proxy DNS when using SOCKS v5”. Click OK to finish setup.',\n                titleImage:'',\n                detail:'Chose either HTTP or Socket settings.',\n                image: '/images/firefox3.jpg'\n            }]\n        },\n\n        cover: {\n            firstTitle1: 'CoNET Platform',\n            firstTitle2: 'Security Privacy And Freedom on the Internet',\n            start: 'ENTER NOW',\n            proxyStoped: 'Gateway server shutdown. Please rebuild try again.'\n        },\n\n        useInfoiOS: {\n            title1:'iOS device local proxy setup.',\n            info:[{\n                title:'Open the control panel and select the WiFi settings.',\n                titleImage:'/images/macOsControl.jpg',\n                detail: '',\n                image: '/images/iOS1.jpg'\n            },{\n                title:'Select the icon on the right side of the connected Wifi name.',\n                titleImage:'',\n                detail:'',\n                image: '/images/iOS2.jpg'\n            },{\n                title:'Turn On Configure Proxy',\n                titleImage:'',\n                detail:'',\n                image: '/images/iOS3.jpg'\n            },{\n                title:'Select Automatic.',\n                titleImage:'',\n                detail:'<p>Check Automatic proxy and insert the URL as shown in blue below (select URL for HTTP/S or SOCKS). Save to finish setup.</p>',\n                image: '/images/iOS4.jpg'\n            }]\n        },\n\n        useInfoAndroid: {\n            title1:'Android device local proxy setup.',\n            info:[{\n                title:`Open your device’s Settings. Under Networks, Select Wi-Fi.`,\n                titleImage:'/images/androidSetup.jpg',\n                detail: '',\n                image: '/images/android1.jpg'\n            },{\n                title:'Tap and hold the connected Wi-Fi network name until a pop up menu appears. Then tap Modify network or Manage network settings.',\n                titleImage:'',\n                detail:'',\n                image: '/images/android2.jpg'\n            },{\n                title:'Tap to show Advanced options. Under Proxy, select Proxy Auto-Config.',\n                titleImage:'',\n                detail:'Insert the PAC URL as shown in blue below (select URL for HTTP/S or SOCKS) and Save to finish setup',\n                image: '/images/android3.jpg'\n            }]\n        },\n\n        useInfoWindows: {\n            title1:'Windows 10 proxy setup',\n            info:[{\n                title:'For all other Windows versions.',\n                titleImage:'',\n                detail: '<p>For other Windows versions’ proxy setup info, please visit <a href=\"#\" target=\"_blank\" onclick=\"return linkClick (`https://support.microsoft.com/en-us/help/135982/how-to-configure-internet-explorer-to-use-a-proxy-server`)\">Microsoft website.</a></p><p>This is the data for proxy server setup:</p>',\n                image: ''\n            },{\n                title:'Open Microsoft Edge',\n                titleImage:'/images/IE10_icon.png',\n                detail: 'Click the tool icon at the top of right, Scroll down menu to the bottom and select Settings.</p>',\n                image: '/images/windowsUseInfo1.jpg'\n            },{\n                title:'Scroll to bottom of menu and click View advanced settings.',\n                titleImage:'',\n                detail:'',\n                image: '/images/windowsUseInfo2.jpg'\n            },{\n                title:'Scroll down menu and click Open proxy settings.',\n                titleImage:'',\n                detail:'',\n                image: '/images/windowsUseInfo3.jpg'\n            },{\n                title:'Select Proxy, turn On Automatically detect settings and Use setup script. Insert the Script address as shown in blue below. Then click save to finish.',\n                titleImage:'',\n                detail:'<p>Windows 10 system only supports HTTP & HTTPS proxy, SOCKS5 users will need install a browser like Firefox, then setup the SOCKS5 PROXY in Firefox.',\n                image: '/images/windowsUseInfo4.jpg'\n            }]\n        },\n\n        useInfoMacOS: {\n            proxyServerIp:'<p>Proxy setup: <span style=\"color: brown;\">Automatic or Auto-Config</span></p>',\n            proxyServerPort: 'HTTP & HTTPS proxy setup:',\n            webRTCinfo:'Stop WebRTC leak: Please use SOCKS proxy setup. Click <a href=\"/Wrt\" target=\"_blank\">here</a> to check WebRTC leak.',\n            wrtTest: 'Test result: ',\n            customProxy: 'Custom gateway server ready',\n            proxySetupHelp:'Need help? Please click the icon which is your OS.',\n            wrtTestAreaTitle: 'WebRTC leak area',\n            proxyServerPassword: 'SOCKS proxy setup:',\n            localIpAddress:'This is intronet IP address, No leak.',\n            globalIpAddress:'This is your real IP address, If show this it is WebRTC leak.',\n            title:'Local proxy server is running at background. All other devices can access internet via local proxy setup to use the CoNET OPN.',\n            title1:'MacOS proxy setup',\n            info:[{\n                title:'Open the control panel, click on network.',\n                titleImage:'/images/macOsControl.jpg',\n                detail:'',\n                image: '/images/userInfoMacos1.jpg'\n            },{\n                title:'click on Advanced... ',\n                titleImage:'',\n                detail:'',\n                image: '/images/macosUserInfo2.jpg'\n            },{\n                title:'Select Proxies, check Automatic Proxy Configuration, check Exclude simple hostnames.',\n                titleImage:'',\n                detail:'<p>Insert Proxy URL shown in blue in the image below (select URL for HTTP/S or SOCKS). Click OK to finish.</p>',\n                image: '/images/macosUserInfo3.jpg'\n            }]\n        },\n\n        topWindow: {\n            title: '150th anniversary of Canada'\n        },\n\n        firstNote:  {\n            title:　'Thank you for using our products and services (the “Services” or “Service”). The Services are provided by CoNET Technology Inc. (“CoNET”).',\n            firstPart: 'By using our Services, you are agreeing to these terms. Please read them carefully.',\n            detail: [\n                {\n                    header: 'Terms of Service',\n                    detail: 'This Terms of Service document (the “Terms”) outlines the terms and conditions of use of Services provided by CoNET Technology Inc. These Terms also govern the use of and access to CoNET’s content (the “Content”), which includes the CoNET’s website (the “Site”), applications (the “Apps”), and any tools, software provided by CoNET (the “Software”).'\n                }, {\n                    header: null,\n                    detail: 'Before using CoNET’s Services, please read this agreement thoroughly. If You have any questions concerning the content of this agreement or what it implies, please contact CoNET at email address: support@CoNETTech.ca'\n                }, {\n                    header: null,\n                    detail: 'We may suspend or stop providing our Services to you if you do not comply with our terms or policies or if we are investigating suspected misconduct. Using our Services does not give you ownership of any intellectual property rights in our Services or the content you access. You may not use content from our Services unless you obtain permission from its owner or are otherwise permitted by law. These terms do not grant you the right to use any branding or logos used in our Services. Don’t remove, obscure, or alter any legal notices displayed in or along with our Services.'\n                }, {\n                    header: 'Eligibility for Service',\n                    detail: 'By accessing the Content or Services, you are agreeing on behalf of yourself or those you represent (“You”) to comply with and be legally bound by these Terms in their entirety. These Terms constitute a legally binding agreement (the “Agreement”) between you and CoNET. If you do not agree with any part of the Terms, you may not use our Services.'\n                }, {\n                    header: null,\n                    detail: 'By creating an account for using our Services, you represent that you are at least eighteen (18) years of age or that you are a valid legal entity, and that the registration information you have provided is accurate and complete. If You are accepting the terms of this agreement on behalf of a company or other legal entity, You represent and warrant that You have the authority to bind that company or other legal entity to the terms of this agreement. If You are accepting this agreement on behalf of an enterprise’s end user, it is Your responsibility to communicate the information in this agreement to the enterprise end users and ensure compliance with the terms and conditions contained herein. By agreeing to these Terms, you are also agreeing to the End User License Agreement (“EULA”), which you can read on CoNET’s website.'\n                },\n                {\n                    header: 'Privacy Policy',\n                    detail: 'Your privacy is highly important to us, since privacy is every person’s natural right! CoNET is committed to your privacy and does not collect or log browsing history, traffic destination, data content, or DNS queries from Subscribers using our Services. – hence, we DO NOT store details of, or monitor the websites you access while using our Services.'\n                },{\n                    header: null,\n                    detail: 'During your registration, we will ask you for some personal information such as your email address and/or payment information. We only collect information that are necessary for the proper delivery of the Site and Services. This information is for our eyes only and will be stored on secured servers. The little bit of information we collect is the minimal usage statistics to maintain our quality of service. We may know: choice of server location, times when our Services was used by user and amount of data transferred by one user in one day. We store this information in order learn from it, and eventually deliver the best possible experience to you. This information which is gathered and analyzed generically is also kept on secured servers. We stand by our firm commitment to our customers’ privacy by not possessing any data related to a user’s online activities.'\n                }, {\n                    header: null,\n                    detail: 'We reserve the right to modify the Privacy Policy at any time, so please review it frequently. Your continued use of the our Services will signify your acceptance of the changes to the Privacy Policy. If you have any questions regarding our Privacy Policy and how we handle your information, please feel free to contact CoNET at the following email address: support@CoNETTech.ca'\n                }, {\n                    header: 'Subscriptions',\n                    detail: 'CoNET Services are available to you upon registration on the Site or Software. By subscribing to the Services, you agree to become a subscriber (“Subscriber”) for the period you have elected. A full list of subscription plans and pricing is available on the Site. CoNET reserves the right to amend subscription fees or institute new fees at any time upon reasonable advance notice posted on the Site or sent via email. Any changes to the pricing will not affect the Subscriber’s current subscription period and will become effective upon subscription renewal.'\n                }, {\n\n\n                    header: null,\n                    detail: 'When supported by your payment method, plans renew automatically by default at the completion of the billing term. By default, the renewal term is for the same duration as the billing term for the original subscription. The subscription fee will be charged automatically to the payment method you last selected. If you would like to discontinue automatic renewal, you may turn off auto-renewal. By default, auto-renewal is turned on when you use a payment method that supports auto-renewal (such as a credit card or Paypal), and turned off when you use a payment method that does not support auto-renewal (such as bitcoin).'\n                }, {\n\n                    header: null,\n                    detail: 'Your Subscription is Yours and Yours only. You may not lend it, rent it, hire it out or share it with people or any other legal entity such as a company, partnership etc, who are not You yourself. Each paid subscription grants you one (1) license to use.'\n                }, {\n\n\n                    header: 'Subscription Cancellation and Suspension',\n                    detail: 'We want you to be fully satisfied with our services. However, we will troubleshoot an issue you experience first. There are several nuances to an OPN service configuration and we solve 99% of issues encountered. '\n                },{\n                    header: null,\n                    detail: 'You may cancel your CoNET subscription at any time, and you will continue to have access to the CoNET services through the end of your paid period until all remaining subscription time in your account is used up. Subscription plan monthly billing cycle starts on the 1st day of each month. Subscription period will end on the last day of the month cancellation was requested. Restrictions apply to free accounts and accounts using promotions.'\n                },{\n                    header: null,\n                    detail: 'You can cancel your Subscription within the client app. Refunds are subject to the CoNET’s Refund Policy. Please let us know, via email to support@CoNETTech.ca, any reasons to your decision in stopping use of our Service so we can be better for the future. Thank you.'\n                },{\n                    header: null,\n                    detail: 'CoNET is entitled to impose Service limits, revoke any Service, suspend it, or block any type of usage made by You at its sole discretion if it is reasonable to believe that the You violate or have violated the Terms of Service or if the way You use the Services may render CoNET liable to any offence or breach of any third party rights or disturb other users use of the Service. CoNET does not undertake to provide You with any prior notice of these measures. The application of any of these measures will not entitle You to a refund.'\n                }, {\n                    header: 'Refund Policy',\n                    detail: 'Cancellations to annual subscription may be entitled to a pro-rated refund of your current annual subscription payment amount minus the months of service used calculated at the standard monthly rate. (For example, accounts canceling within 3 months of an annual plan will be entitled to a refund of the amount paid subtracted by the 3 months of service used at the standard monthly rate.)'\n                },{\n                    header: null,\n                    detail: `<p>We refund annual subscription purchase only. We will refund your order if:</p><div class=\"ui ordered list\"><div class=\"item\">It is the first time you've ordered our Services and there have not been previous purchases on your account.</div><div class=\"item\">If you have made less than one hundred connections to our Service and your bandwidth usage is less than 500 MB.</div><div class=\"item\">If you haven't violated CoNET’s Terms of Service in any way.</div></div>`\n                },{\n                    header: null,\n                    detail: `It is the first time you've ordered our Services and there have not been previous purchases on your account.`\n                },{\n                    header: null,\n                    detail: ``\n                },{\n\n                    header: null,\n                    detail: 'We will refund your order if: <p class=\"tag info\">It is the first time you’ve ordered our Services and there have not been previous purchases on your account.</p><p class=\"tag info\">If you have made less than one hundred connections to our Service and your bandwidth usage is less than 500 MB.</p><p class=\"tag info\">If you haven’t violated CoNET’s Terms of Service in any way.</p><p class=\"tag info\">As stated above, if the refund request is made within 7 days since the purchase has been made.</p><p class=\"tag info\">Refunds are generally processed within seven (7) days, and are made to the original form of payment used for purchase. All refunds are sent in USD and therefore the refund amount could differ from the amount originally paid in local currency or bitcoin. How long it takes until you will see the refunded amount in your bank account varies according to the payment method you used, bank regulations, etc.</p>'\n                }, {\n\n                    header: 'Acceptable Use Policy',\n                    detail: 'You must follow any policies made available to you within the Services. You shall use CoNET Services in compliance with all applicable laws and not for any unlawful Purpose. CoNET Services may be accessed from all around the world, so it is your responsibility to assess whether using the Apps, Services, Sites or Software is in compliance with local laws and regulations. You may only use the Services as permitted by law. Services may NOT be used for any illegal activity. Whenever you use the Apps, Services, Sites or Software, you should comply with these Terms and applicable laws, regulations, and policies. You agree to not to use the Service in a way that may result in a violation of any laws of any jurisdiction. Don’t misuse our Services. For example, don’t interfere with our Services or try to access them using a method other than the interface and the instructions that we provide. We may suspend or stop providing our Services to you if you do not comply with our terms or policies or if we are investigating suspected misconduct.'\n                }, {\n\n                    header: null,\n                    detail: 'You understand that it is your responsibility to keep your CoNET account information confidential. You are responsible for all activity under your account. You agree to not make any illegal or unauthorized use of the Services through Your user id/password and not to enable access to your account to users who are not You. If you ever discover or suspect that someone has accessed your account without your authorization, you are advised to inform us immediately so that we may revoke your account credentials and issue new ones. You will be held accountable and liable for any and all actions performed on the CoNET’s servers where the login is identified by Your user id/password. In order to protect the Services from being misused or used to harm someone, CoNET reserves the right to take appropriate measures when our Services are being used contrary to these Terms and applicable laws. You agree that CoNET may terminate your account, without providing a refund for Services already paid, if you misuse the Service.'\n                }, {\n                    \n                    header: null,\n                    detail: 'In using our Services, you agree not to: <p class=\"tag info\">Send spam, uninvited emails or  transmit unsolicited advertisements or content (i.e., “spam”), or any other versions of spam, large quantities of emails even if such are sent-off from another server and sending opt-in emails.</p><p class=\"tag info\">Send, post, or transmit over the Service any content which is illegal, hateful, threatening, insulting, or defamatory; infringes on intellectual property rights; invades privacy; or incites violence.</p><p class=\"tag info\">Upload, download, post, reproduce, or distribute any content that includes sexual or explicit depictions of minors.</p><p class=\"tag info\">Attempt to access, probe, or connect to computing devices without proper authorization (i.e., port scanning, scanning for open proxies, or any form of “hacking”).</p><p class=\"tag info\">Attempt to compile, utilize, or distribute a list of IP addresses operated by CoNET in conjunction with the Service.</p><p class=\"tag info\">Use for distribution of viruses, hacking, cracking, network sabotage, phishing; any fraudulent behavior is strictly prohibited.</p><p class=\"tag info\">Use the Service for anything other than lawful purposes.You shall be held responsible for any damages caused by Your negligence or exposure to vulnerabilities, whether your actions were intentional or not.</p>'\n                },{\n                    \n                    header: 'License',\n                    detail: 'Subject to your compliance with these Terms, CoNET grants to you a worldwide, non-assignable, non-exclusive and limited license to use the software provided to you by CoNET as part of the Services. This license is for the sole purpose of enabling you to use and enjoy the benefit of the Services as provided by CoNET, in the manner permitted by these terms. You may not copy, modify, distribute, sell, or lease any part of our Services or included Software, nor may you reverse engineer or attempt to extract the source code of that Software, unless laws prohibit those restrictions or you have our written permission. Using the Software and our Services in any way not expressly authorized by CoNET is strictly prohibited.'\n                }, {\n                    header: null,\n                    detail: 'Usage of any material which is subject to CoNET’s intellectual property rights is prohibited unless you have been provided with explicit written consent by CoNET. Using our Services does not give you ownership of any intellectual property rights in our Services or the content you access. These terms do not grant you the right to use any branding or logos used in our Services. Don’t remove, obscure, or alter any legal notices displayed in or along with our Services.'\n                },{\n                    header: 'Disclaimers and Warranties',\n                    detail: 'CoNET undertakes to provide the best Service possible in the circumstances and make the Service available at all times except for when maintenance work is being performed for repair and improvement or in case of circumstances beyond the control of the CoNET, including force majeure. The Service provided may also become unavailable due to other factors beyond the CoNET’s control such as third party service failure or malfunction. The accuracy and timeliness of data received is not guaranteed and may vary based on compressions, configuration, network congestion and other factors that may affect it. The Service’s network speed is an estimate and is no indication or guarantee to the speed which You or the Service will send or receive data. We provide our Services using a commercially reasonable level of skill and care and we hope that you will enjoy using them. But there are certain things that we don’t promise about our Services. CoNET does not monitor Your sessions for inappropriate use nor does it keep logs of Your internet activities. However, the CoNET reserves the right to monitor and investigate matters which it considers at its own discretion to be a violation or potential violations of these Terms of Use.'\n                },{\n                    header: null,\n                    detail: 'Other than as expressly set out in these terms or additional terms, neither CoNET nor its suppliers or distributors make any specific promises about the Services. The Service, the Software and any third party services and software are provided by the CoNET on an “as is” basis and CoNET hereby disclaims all warranties of any kind, whether expressed or implied. Some jurisdictions provide for certain warranties, like the implied warranty of merchantability, fitness for a particular purpose and non-infringement. To the extent permitted by law, we exclude all warranties.'\n                },{\n                    header: null,\n                    detail: 'CoNET also reserves the right, but is not obligated to, at its sole discretion and without providing prior notice, to block, delete, filter or restrict by any means, any materials or data it deems potential or actual violations of the restrictions set forth in these Terms of Use and also any other actions that may subject the CoNET or its customers to any liability. CoNET disclaims any and all liability for any failure on our part to prevent such materials or information from being transmitted over the Service and/or into Your computing device.'\n                },{\n                    header: 'Limitation of Liability',\n                    detail: 'CoNET will not be liable for any damages or loss caused by viruses, denial-of-service, attacks or any other technologically harmful material that my infect Your computer, its peripherals, data stored on it or on its peripherals, computer programs or any other proprietary material due to the use of the Services or due to Your downloading of anything which is posted on the CoNET’s website or any website which is linked there to. In no event will CoNET, its suppliers, distributors,  partners, affiliates, subsidiaries, members, officers, or employees be liable for lost profits, revenues, or data, financial losses or indirect, special, consequential, exemplary, or punitive damages, or for any other loss or damages of any kind, even if they have been advised of the possibility thereof. The foregoing shall not apply to the extent prohibited by applicable law. To the extent permitted by law, the total liability of CoNET, and its suppliers and distributors, for any claims under these terms, including for any implied warranties, is limited to the amount You paid CoNET to use the Services.'\n                },{\n                    header: 'Indemnification',\n                    detail: 'You agree to hold harmless and indemnify CoNET, its officers, directors, agents, employees,  members, partners, suppliers, their affiliates, and its or their shareholders, directors, and employees from any and all claims, suit or action arising from or related to the use of CoNET’s Services, Apps, Content, Site, or Software or violation of these terms, including any liability or expense arising from claims, losses, damages, suits, judgments, litigation costs and attorney’s’ fees. We may, at our sole discretion, assume the exclusive defense and control of any matter subject to indemnification by you. The assumption of such defense or control by us, however, shall not excuse any of your indemnity obligations. If you are using our Services on behalf of a business, that business accepts these terms.'\n                },{\n                    header: 'About these Terms',\n                    detail: 'CoNET may update the Terms or any additional terms that apply to a Service, from time to time without notice. You understand and agree that it is your obligation to review these Terms regularly in order to stay informed on current rules and obligations. If you continue to use CoNET’s Services, Apps, Content, Site, or Software after these changes take effect, then you agree to the revised Terms. The current version of the Terms is available on the Site. Notification on any core changes to the Terms will be provided to subscribers through an email message or update to the Site. If you do not agree to the modified terms for a Service, you should discontinue your use of that Service. If there is a conflict between these terms and the additional terms, the additional terms will control for that conflict. These terms control the relationship between CoNET and you. They do not create any third party beneficiary rights.'\n                },{\n                    header: null,\n                    detail: 'If you do not comply with these terms, and we don’t take action right away, this doesn’t mean that we are giving up any rights that we may have (such as taking action in the future). If it turns out that a particular term is not enforceable, this will not affect any other terms. All of our Content was originally written in English. Any translation of our Content is done on a best-effort basis. We cannot guarantee the accuracy of translated Content. In the event of any discrepancy between the translated Content and the English Content, the English Content shall prevail. The laws of British Columbia, Canada, excluding British Columbia’s conflict of laws rules, will apply to any disputes arising out of or relating to these Terms or the Services.'\n                }\n                \n            ],\n            disagree: 'I Disagree',\n            agreeMent: 'I Agree to the CoNET Terms of Service'\n        },\n\n        linuxUpdate:{\n            newVersionDownload: 'click here to download and install!',\n            step1:'Update new CoNET: ',\n            step2: 'Allow executing file as program',\n            step2J1:'/images/linuxUpdate1.jpg',\n            step2J2:'/images/linuxUpdate2.jpeg',\n            step2_detail1: 'Right click downloaded CoNET file and select the properties.',\n            step2_detail2: 'Check allow executing file as program in Permissions tab.',\n            step3:'Exit old version of CoNET and double click the new CoNET file to run install.',\n            exit: 'Exit CoNET',\n            tryAgain:'Try again',\n            refresh:'Refresh page.'\n        },\n\n        imapInformation: {\n            title: 'Email account to use by OPN.',\n            tempImapAccount: `Have problem with your IMAP enabled email account? <a href=\"#\" style = \"margin-left: 0.5em;\" class=\"ui label teal\" onclick=\"return linkClick ('https://github.com/QTGate/QTGate-Desktop-Client/wiki/IMAP-temporary-account')\"> Get temporary account.</a>`,\n            infomation: `Please provide an IMAP enabled email account to be used to communication with CoNET network. The account name and password will be required. For your personal privacy, please consider registering a new email account to use. CoNET currently supports <a class=\"ui label teal small\" href=\"#\" onclick=\"return linkClick('https://www.icloud.com/')\">Apple iCloud</a><a href=\"#\" class=\"ui label teal small\" onclick=\"return linkClick('https://outlook.live.com/owa/')\">Outlook Mail</a><a href=\"#\" class=\"ui label teal small\" onclick=\"return linkClick('https://www.gmx.com/')\">GMX</a><a href=\"#\" class=\"ui label teal small\" onclick=\"return linkClick('https://www.zoho.com/mail/')\">ZOHO</a>. For passwords, it is recommended use a <a href=\"#\" onclick=\"return linkClick('https://help.yahoo.com/kb/SLN15241.html')\">generated app-specific password.</a> If using <a href=\"#\" onclick=\"return linkClick('https://help.yahoo.com/kb/two-step-verification-sln5013.html')\">2-step verification</a>, we recommend using a free anonymous SMS receiving site to receive SMS codes, ( such as <a href=\"#\" onclick=\"return linkClick('http://receive-sms-online.com/')\">receive-sms-online.com</a>, <a href=\"#\" onclick=\"return linkClick('https://sms-online.co/receive-free-sms')\" >sms-online.co</a>, <a href=\"#\" onclick=\"return linkClick('https://receive-a-sms.com/')\" >receive-a-sms.com</a>, or <a href=\"#\" onclick=\"return linkClick('https://www.google.com/search?q=free+anonymous+SMS+receiving+site&oq=free+anonymous+SMS+receiving+site&aqs=chrome..69i57.268j0j4&sourceid=chrome&ie=UTF-8')\" >others</a> ).`,\n            serverDetail: 'settings:',\n            imapServer: 'IMAP server setup',\n            imapServerInput: 'IMAP server name or IP address',\n            UserName: 'Login username',\n            Ssl: 'By SSL connection:',\n            portName: 'Port number:',\n            otherPortNumber: 'Other:',\n            smtpServer: 'SMTP server setup',\n            smtpServerInput: 'SMTP server name or IP address',\n            emailServerPassword: 'Email account password ( app password )',\n            Error_portNumber: 'Port number should be from 1 to 65535 and not be 22.',\n            imapAccountConform: function ( imap, account ) { return `<p class=\"ui small header brown\">By clicking submit you are agreeing to:</p><p class=\"grey\">This [<B class=\"red\">${ imap }</B>] email is a temporary account for use with CoNET services. CoNET may have full access to this account in use of CoNET’s services.</p><p>CoNET platform will send a email include: [<B class=\"red\">${ imap }</B>] & APP password, email [<B class=\"red\">${ account }</B>] address, public key, timezone, used language.</p><p>You may receive emails from CoNET.</p>`},\n            agree: `I understand and agree to continue.`,\n            imapOtherCheckError: 'Cannot connect to email server! Server name, IP address or Port number may have a mistake. Please check the details of your email setup!',\n            CertificateError: 'Certificate for this email server is not trusted. Please select \"Keep connected even if certificate is not trusted\" in settings if you still want to connect. Your email login information maybe leaked to this email server!',\n            IgnoreCertificate: 'Keep connected even when certificate is not trusted',\n            Certificat: 'Warning! Do not select this if you are not sure, it may reveal your information.',\n            AuthenticationFailed: 'Invalid login username or password! Please check username and password.',\n            addAEmail: 'Add a new Email account',\n            tryAgain: 'Try again.',\n            connectImap: 'Connect to CoNET',\n            cancelConnect: 'Stop connecting to CoNET.',\n            imapItemTitle: 'Email account details:',\n            loaderText:['C','o','n','n','e','c','t',' ','t','o',' ','C','o','N','E','T',' ','n','e','t','w','o','r','k','...'],\n            imapCheckingStep: [\n                /* 0 */'Trying to connect to email server.',\n                /* 1 */'Connected to email server with IMAP. Waiting response from CoNET.',\n                /* 2 */'Connected to email server with SMTP.',\n                /* 3 */'Please wait a moment, connecting to CoNET network.',\n                /* 4 */'Connected to CoNET',\n                /* 5 */'Connected to email server with IMAP'\n\n            ],\n            imapResultTitle: 'IMAP Server CoNET Communication Rating: ',\n            testSuccess: 'Email server setup success!',\n            exitEdit: 'Exit edit email account',\n            deleteImap: 'Delete IMAP account.',\n            proxyPortError: 'Port number should be a number from 3001 to 65535. Or this port is being used by another process. Please try another port number.',\n            appPassword:'About APP password.',\n            imapCheckError: [\n                /* 0 */'Cannot connect to email server! Your network may offline or do not support IMAP protocol. Please check your network and try again after reflash page.',\n                /* 1 */'Invalid login username or password! Please check username and password.',\n                /* 2 */'Certificate for this email server is not trusted. You may have Man-in-the-middle attack in your network. Try again when chenged network.',\n                /* 3 */'Sent mail error. It may happened when you use normail password. Check your mail APP password.',\n                /* 4 */'Your network have not internet.',\n                /* 5 */'Unknow error. Please exit CoNET and try it again.',\n                /* 6 */'Over Quota error. Please access your mail account, delete some mail.'\n            ]\n        },\n\n        Home_keyPairInfo_view: {\n            \n            title: 'Key pair information',\n            deleteKeyPairHaveLogin:'Please delete the key pair use the client that is logging on.',\n            emailNotVerifi: 'Key pair has not been signed by CoNET yet.',\n            emailVerified: 'Key pair signed by CoNET.',\n            NickName: 'Nick name：',\n            creatDate:'Creation date：',\n            keyLength: 'Bit Length：',\n            password: '5-character minimum password.',\n            password1: 'Platform Password',\n            logout: 'Logout',\n            keyID: 'ID：',\n            deleteKeyPairInfo: 'Note: By deleting your key pair, you will lose your current account settings. You will need to set up CoNET account settings again. If your email address is the same as the one used previously, you may restore your CoNET account balance.',\n            delete: 'Delete',\n            locked: 'Please enter your key pair password to continue.',\n            systemError: 'System error! Please delete this key pair and set up CoNET again.'\n        },\n\n\t\thome_index_view: {\n            newVersion: 'A new version is ready to install.',\n            newVersionInstallLoading:'Updateing...',\n            localIpAddress: 'Local',\n            internetLable: 'Internet',\n            gateWayName:'Gateway',\n            showing:'Status',\n            nextPage:'next',\n            agree: 'I AGREE & CONTINUE',\n            emailAddress: 'CoNET Account Name ( Email Address Required )',\n            imapEmailAddress: 'Email Account Name',\n            creatKeyPair: 'Generate key pair...',\n            cancel: 'Cancel',\n            clickInstall:'Install',\n            keyPairCancel: 'Generate key pair was canceled.',\n            keyPairGenerateError: 'It was system error when generate key pair. Try again please.',\n            keyPairGenerateSuccess: 'Generate key pair was success.',\n            continueCreateKeyPair: 'Keep generate.',\n            stopCreateKeyPair: 'Cancel generate key pair',\n            KeypairLength: 'Select the bit length of your key pair. Larger bit lengths are stronger and harder for a hacker to crack but may result in slower network transfer speeds.',\n            SystemAdministratorNickName: 'Nick name ( Required )',\n            systemAdministratorEmail:'Generate RSA Key pair',\n            GenerateKeypair: '<em>Generating RSA Key pair. Please wait, as it may take a few minutes. More time will be needed if you selected 4096 bit key length. Information about RSA keypair system can be found here:' +\n                `<a href='hhttp://en.wikipedia.org/wiki/RSA_(cryptosystem)' target=\"_blank\" onclick=\"return linkClick ('https://en.wikipedia.org/wiki/RSA_(cryptosystem)')\">https://en.wikipedia.org/wiki/RSA_(cryptosystem)</a></em>`,\n            systemPassword: 'CoNET Client System Password',\n            inputEmail: `This RSA key is a private key used for authentication, identification and secure encryption/decryption of data transmission within CoNET’s system. The password and key are not stored by CoNET. You cannot reset your password if lost and you cannot access CoNET services without your password. Please store your password in a safe place. <em style=\"color: brown;\">CoNET’s domain may be blocked in some regions. Please use an email account with servers outside these regions,</em>`,\n            accountEmailInfo: `Because CoNET may be on a firewall's black list in some regions. It is best to choose an email account with servers outside your region’s firewall.`\n        },\n        \n        error_message: {\n            title: 'Error',\n            errorNotifyTitle: 'System Error',\n            EmailAddress: ['Please enter your email address in this format name@example.com.','Sorry, CoNET currently support Apple iCloud mail, Microsoft Outlook and Yahoo mail only.'],\n            required: 'Please fill in this field.',\n            PasswordLengthError: 'Passwords must have at least 5 characters.',\n            localServerError: 'Local CoNET server error. restart please!',\n            finishedKeyPair: 'Generate new key pair down.',\n            Success: 'Success',\n            doCancel: 'Canceled generating key pair!',\n            errorKeyPair:'here was an ERROR in generating new key pair, Please try again!',\n            SystemPasswordError: 'Your key pair password does not match. Please try again. If you forgot your password, please delete this key pair. Beware you will lose you current account settings.',\n            finishedDeleteKeyPair: 'Key pair deleted!',\n            offlineError: 'There is no internet connection detected. Please check your network and try again!',\n            imapErrorMessage: [\n        /* 0 */ 'There was an error in establishing connection to CoNET. Please try to connect again or try at a later time. If you continue to receive this error, please contact CoNET support. ',\n        /* 1 */ 'Data format error!', \n        /* 2 */ 'This computer does not detect an internet connection. Please check your network and try again!', \n        /* 3 */ `Email server did respond to username or an error in password. You may need use APP password to pass this test if you did normal password. Or your app passwords need to be updated.`, \n        /* 4 */ `Error in connecting to email server with the current IMAP port. Please check the email account to make sure IMAP is enabled and the IMAP port settings. The port may be filtered by a firewall on your network.`, \n        /* 5 */ `There is a problem with this IMAP email server's security certificate!`, \n        /* 6 */ `Error in email server’s address. Please check the email server’s domain. Or have not internet, please check your network.`, \n        /* 7 */ 'This email provider currently looks does not support CoNET’s @OPN technology, please try do test again, or change to another email provider.', \n        /* 8 */ `Email server did respond to SMTP's username or an error in password.`, \n        /* 9 */ `There is a problem with this SMTP email server’s security certificate!`, \n        /* 10 */`Connecting to SMTP Email server received an unknown error!`, \n        /* 11 */'Please check email account!',\n        /* 12 */'Does not establishing connection to CoNET yet.',\n        /* 13 */'Your mail account has exceeded (over quota). ',\n        /* 14 */'Twitter return unknow error, please try again.'\n            ],\n            CoNET_requestError: [\n                /* 0 */'Did not received response from CoNET. Try reconnect to CoNET, please wait.',\n                /* 1 */'Invalid request!'\n            ]\n        },\n\n        emailConform: {\n            activeViewTitle: 'Active your keypair.',\n            emailTitle: 'Welcome to CoNET.',\n            info1_1: `Please complete key pair verification. Click the button 'Request verification email' to request mail. Please check your [`,\n            info1_2: '] mailbox. If you received more then one email from CoNET, please choose the newest email. If you not find the email, please double check your key pair email address. If you have an error, you may delete your key pair and generate a new key pair.',\n            info2: 'Copy all content from [-----BEGIN PGP MESSAGE-----] ... to [-----END PGP MESSAGE-----]. Paste into this text box.',\n            emailDetail1: 'Dear ',\n            emailDetail1_1: ' ,',\n            emailDetail2: 'This is your secret verification code to validate your CoNET account. Please copy and paste all the content in the text area.',\n            bottom1_1: 'Best regards,',\n            bottom1_2: 'The CoNET team',\n            requestReturn: ['ERROR! CoNET system refuse your request, may be you did request repeatedly, please try again late.','Verification mail has been sent.'],\n            conformButtom: 'Confirm',\n            reSendRequest:'Request verification email',\n            formatError: [\n                        'Format error! Copy all content from [-----BEGIN PGP MESSAGE-----] ... to [-----END PGP MESSAGE-----]. Paste into this text box.',\n                        'Decrypt message failed. Find the lasest mail from CoNET in your key pair email mailbox. Or delete this key pair and rebuild new key pair please.',\n                        'Connection to CoNET had an error!. Please exit and restart CoNET.',\n                        'This secret verification code was invalid. If you received more then one email from CoNET, please choose the newest email. Do validate again!',\n                        'Your CoNET account may have a problem, Please delete your key pair and setup again!',\n            /**5**/     'Sorry there is an error in connection to CoNET, may be CoNET is offline. Please try again late.',\n                        `Your data transfer has hit the daily limit today, please try again tomorrow or upgrade your user type.`,\n                        'Your transfer email account may not be working, please check the IMAP account. Or your IMAP accout may not support CoNET system.',\n                        'Selected region is unavailable, try again later.',\n                        'Your IMAP account recieved an error. Please restart CoNET and try again. If the error is not fixed, You may need check your IMAP account setting to enable third party IMAP applications.',\n                        'The page session has expired! Refresh page or restart CoNET plesee.',\n                        'Sorry looks CoNET platform failure, please restart CoNET.'\n                    ],\n\n            activeing: 'sending...'\n        },\n\n        QTGateRegion: {\n            title: 'Advanced private custom gateway service area.',\n            available: 'Available',\n            CoGateRegionStoped:'Custom gateway server was stopped.',\n            speedTest: 'Speed test：',\n            unavailable: 'Unavailable',\n            proxyDomain:'Domain lookup via CoNET gateway side.',\n            setupCardTitle: 'connecting with:',\n            paidUse:'This area offer for subscription user.',\n            MultipleGateway: 'Multi-Gateway:',\n            dataViaGateway:'All internet data transfered via CoNET gateway.',\n            dataTransfer: 'Data:',\n            dataTransfer_datail: ['All data on CoNET gateway.',`Only when cannot connect to target server.`],\n            proxyDataCache: 'Web cache:',\n            proxyDataCache_detail: ['Yes','No'],\n            clearCache: 'Delete all cache now',\n            localPort:'Local proxy port number:',\n            localPath:'HTTP/HTTPS conect path name:',\n            requestPortNumber: 'Gateway server port number:',\n            GlobalIp: 'Global IP:',\n            option: 'option',\n            WebRTCleak:'Stop WebRTC leak',\n            WebRTCleakInfo: 'End-to-End game and chat may not work.',\n            pingError:'CoNET gateway area speed check error! Please exit CoNET and reopen CoNET as administrator. Then do check speed again.',\n            QTGateRegionERROR:[\n                'Send connect request mail has an error. Please check your IMAP account settings.',\n            ''],\n            GlobalIpInfo:  `Please note: Both iOPN and @OPN will conceal your IP from others. iOPN offers the highest level of data speeds. @OPN offers additional layer of anonymity with some speed as a trade off. [@OPN] option is available in San Francisco, and currently only supports your owniClould Email. Please refer to the Terms of Service for our privacy policy.`,\n            cacheDatePlaceholder: 'Web cache freshness lifetime.',\n            sendConnectRequestMail:[\n                'CoNET connection maybe down. Please wait a moment, re-connecting to CoNET gateway.',\n                'Your connection will reset if you long time non use.'\n            ],\n            cacheDatePlaceDate:[{ name:'1 hour', id: 1 }, { name:'12 hour', id: 12 },{ name:'1 day', id: 24 }, { name:'15 days', id: 360 }, { name:'1 month', id: 720 }, { name:'6 months', id: 4320 }, { name:'forever', id: -1 }],\n            atQTGateDetail: [\n        /*0*/   `Recommended for full privacy. @OPN@ uses CoNET’s “Quiet” technology to create a obfuscated private network by refracting encrypted data packets thru email servers. @OPN provides stealth internet communications where your IP address is hidden to client or proxy servers. Gaming and video stream my not be supported due to stability and speeds affected by email server choice. Currently iCloud mail is only supported.`, \n        /*1*/   'Recommended for high speed open internet access. iOPN uses CoNET’s “Quiet” technology to obfuscate encrypted data traffic to look like normal HTTP communications. iOPN offer security and protection of privacy while allowing access to the open internet.',\n        /*2*/   'Use CoNET’s gateway for domain search to get the right IP address from DNS cache. This is default.', \n        /*3*/   'Transfer all internet data over OPN.', \n        /*4*/   'Transfer select data over OPN. Only when unable to connect to certain servers. Network access may speed up but lost your privacy.',\n        /*5*/   'Web cache (or HTTP cache) is an used for the temporary storage (caching) of web documents, to reduce bandwidth usage, server load, and perceived lag. CoNET always encrypts all web cache data. This does not work for HTTPS connections.',\n        /*6*/   'Do not use web cache.', \n        /*7*/   'By setting the cache expiration date, you can always obtain the latest information on the server side.',\n        /*8*/   'Local proxy server port number is provided for other devices to use CoNET’s OPN connection. Please set a number from 3001 to 65535.',\n        /*9*/   'Local proxy server http/https access can secure your server.',\n        /*10*/   'The number of gateways to use. This will further help to obfuscate traffic by using multiple servers. This is available for subscription only.',\n        /*11*/   'This is your current CoNET gateway port number, You may change the port number if current one is blocked on your network.',\n        /*12*/   'Web Real-Time Communication (WebRTC) is a collection of standardized technologies that allows web browsers high speed to communicate with each other directly via IP address. It also may used for detect your real IP address even you hide IP address via VPN or other tools.',\n            ],\n            connectQTGate: 'Connecting, Retrieving CoNET gateway information...'\n        },\n\n        QTGateGateway: {\n            title: 'CoNET service user detail',\n            processing: 'Trying to connect to CoNET network...',\n            error: [\n            /* 0 */ 'Error: Your account has a connection that is using the CoNET proxy server. Please disconnect it before attempting to connect again.',\n            /* 1 */ 'Error: Bandwidth maximum. If you would like to continue using OPN, please upgrade your account. Free accounts have a bandwidth maximum of 100MB per a day, 1 GB every month.',\n            /* 2 */ 'Error: Data format error. Please restart CoNET.','Error: This area does not have the resources. Please select another area or try connecting again later.',\n            /* 3 */ 'Error: This region does not support OPN technology. Please select another area, or change other connect type.',\n            /* 4 */ '@OPN support your own iCloud account only. Please change the email account that used to communication with CoNET.'\n                ],\n            connected:'connected.',\n            promo: 'Promotions',\n            upgrade:'Upgrade account',\n            accountManager:'Account',\n            userType:['Free user', 'Subscription'],\n            datatransferToday:'The daily bandith limit.：',\n            datatransferMonth:'The monthly bandwidth limit.：',\n            todaysDatatransfer: 'Available bandwidth today.',\n            monthDatatransfer: 'Available bandwidth this month.',\n            gatewayInfo: ['Gateway Ip address：','Gateway connection port：'],\n            userInfoButton: 'How to use?',\n            stopGatewayButton:'Stop gateway server',\n            disconnecting: 'Destroying...'\n        },\n        \n        qtGateView: {\n            QTGateConnectResultWaiting: 'Please wait. It will may take a few minutes to establish your connection to CoNET.',\n            title: 'Send custom server request',\n            mainImapAccount: 'Email account for communicating with CoNET',\n            QTGateDisconnectInfo: 'CoNET disconnected. Please select an IMAP account to use for connection request. ',\n            QTGateConnectStatus: 'Status of CoNET connection',\n            QTGateConnectResult: [\n                'CoNET disconnected, click to connect to CoNET.','Connecting to CoNET.','CoNET Connected.','Connection stopped with error! Please check IMAP account settings!',\n                'CoNET Connected.'\n            ],\n            QTGateSign: [\n                'Keypair status','Your key pair is not signed by CoNET.',\n                'CoNET certification authority is a trusted thus certifying your public keys is yoursalf in CoNET users when you share files of send message to other CoNET user. You also can signing another CoNET users with your keypair for make your trust relationship.',\n                'Getting CoNET certification authority.','Opps. System error. Try restart CoNET, if still have please re-install CoNET.','System error!']\n        },\n        \n        feedBack: {\n            title: 'FEEDBACK',\n            additional: 'Additional info',\n            okTitle:'Send to CoNET'\n        },\n\n\t},{\n        coSearch: {\n            searchInputPlaceholder: '請輸入檢索關鍵字組合或網址',\n            SearchText:'搜尋',\n            totalResults: ['大約有','條記錄'],\n            moreResults: '更多結果',\n            SearchesRelated: ['','的相關搜尋'],\n            label_HTML: 'HTML代碼',\n            imageSize: '圖片尺寸',\n            label_picture:'圖片',\n            similarImages: '看起來相似的圖片',\n            errorMessage: [\n                '無效請求',\n                '您的圖片格式無法處理，請嘗試選擇其他圖片',\n                '您的請求已達最大值，請稍後再試'\n            ],\n            coSearchConfigMenu: ['搜尋設定','搜尋引擎指定'],\n            coSearchEngineSelectArray: [\n                {\n                    name: 'google',\n                    icon: 'google',\n                    iconColor: '',\n                    textColor: '',\n                    showName: 'Google',\n                    image: null\n                }\n            ],\n            coSearchConfigIcon:['google','images/bing.svg',''],\n            coSearchEngineName: ['Google','',''],\n            searchToolBarMenu: [\n                \"網頁\", \"新聞\",\"圖片\",\"視頻\"\n            ],\n            timeUnit: {\n                hours: '小時前',\n                day: '天前',\n                mins: '分鐘前'\n            },\n            TimeTolocalTime: function ( time: string ) {\n                return new Date ( time ).toLocaleDateString ('zh-TW', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' })\n            }\n\n        },\n\n        appsManager: {\n            mainLoading: '正在獲取結點信息...',\n            nodeName: '您進入的節點名：',\n            connectAddress:'接入地址：',\n            welcomeTextSub: '隱私安全自由的新互聯網',\n\t\t\tserviceList:'提供服務一覽'\n        },\n        youtube: {\n            startup: {\n                title: '歡迎使用Co for Youtube',\n                detail: '在此您可以檢索Youtube視頻，下載並播放所選視頻'\n            },\n            search: {\n                placeholder: '請輸入檢索關鍵字，或輸入Youtube的播放鏈接',\n                button_text:'檢索',\n                error: [\n                    '您的檢索無效，請再次檢索。'\n                ]\n            }\n        },\n        perment:{\n            serverTitle:'伺服器'\n        },\n        twitter: {\n            newTwitterAccount: `請輸入您的推特APP信息，如何獲得和設置推特賬號APP信息，請點擊<a target=\"_blank\" href='https://github.com/QTGate/QTGate-Desktop-Client/wiki/Create-Twitter-APP'\">這裡</a>獲得更多信息`,\n            addAccount:'添加推特賬戶',\n            following: ['正在關注','解除關注','關注'],\n            followers:'關注者',\n            second: '秒',\n            min: '分',\n            hour: '小時',\n            retweeted: '已轉推',\n            month:'月',\n            day: '日',\n            close:'關閉',\n            replying: '回覆: ',\n            videoSizeOver: '視頻超推特限制: 尺寸 <(1280x1024)，文件 <  300MB，時間 < 140秒，請轉換視頻後再上傳',\n            twitterBottonTitle:['發推','全部發推'],\n            newTwitterTitle: ['撰写新推文','撰写新对话串'],\n            returnEdit: '回編輯',\n            newTwitterDistroyButtonTitle: ['放棄推文','捨棄對話串'],\n            urlInfo: '<h3>推特客户端預覽版</h3><p>用戶可以无限量免费使用此客戶端，免翻牆(不使用VPN，不用連結CoGate代理服務器)匿名訪問(您的真實IP地址不會洩露給推特)您的推特帳戶。</p><p>其他设备可以输入以下网址打开此APP应用</p>',\n            accountError:'推特回送錯誤信息提示：您輸入的APP應用設定信息有誤。請檢查您的推特APP信息後再試。'\n            \n        },\n        thirdParty: {\n            information: '歡迎來到CoNET網絡',\n            comesoon:'即將登場',\n            app:['CoGate','酷茶','酷存','Co邮箱','Co新闻频道','酷檢索','酷推特','Co for','酷錢包','CoNet業務訂製'],\n            qtgateGateway: 'CoNET提供的高質量上網技術iOPN和@OPN，在CoNET全球16個區域，當場定制您專屬的代理服務器，變換您的IP地址隱身無障礙的訪問互聯網',\n            \n            dimmer: [\n                '高質量量身定制代理伺服器業務，讓您隱身安全不受注意的網上沖浪。',\n                '隱身匿名去中心化不被封鎖的社交媒體',\n                '安全隱私文件雲存儲系統',\n                '隱身匿名邮件客户端，可免翻牆访问Gmail',\n                '免翻墙隱身匿名訪問世界頭條新闻',\n                'QTG承接定制各類公眾服務類及跨國企業私有APP業務',\n                '免翻牆匿名隱身網頁檢索',\n                '免翻牆匿名隱身推特客戶端',\n                '免翻牆匿名隱身Youtube客戶端',\n                'CoNET加密貨幣錢包'\n                \n            ]\n        }, \n        account:{\n            willPayNextExpir:'自動扣款 ',\n            openAutomatically: '打開自動扣款',\n            QTGatePayRisk:'使用CoNET安全網關支付，如果您有安全疑慮，請使用Stript安全網關支付。',\n            paymentSuccessTitile: '謝謝您',\n            networkShareTitle:'代理伺服器網絡',\n            stripePayment: '銀行網關支付',\n            promoButton: '我有促銷碼',\n            qtgatePayment:'CoNET網關支付',\n            paymentProblem1:'支付遇到問題',\n            paymentProblem:'您目前的所在區域看上去銀行網關被和諧，您可以使用CoNET網關支付來完成支付',\n            title: '賬戶管理',\n            currentPlanExpire: ['訂閱截止日期：','下一次自動續訂日','每月數據重置日'],\n            CancelSuccess: function ( PlanExpire: string, isAnnual: boolean, returnAmount: number ) {\n                return `中止訂閱成功。您可以一直使用您的原訂閱到${ new Date (PlanExpire).toLocaleDateString() }為止。以後您將會自動成為CoNET免費用戶，可以繼續使用CoNET的各項免費功能。 ${ isAnnual ? `退款金額us$${ returnAmount }會在5個工作日內退還到您的支付卡。 `: '下月起CoNET系統不再自動扣款。 '} 祝您網絡衝浪愉快。`\n            },\n            currentAnnualPlan: ['月度訂閱','年度訂閱'],\n            cardPaymentErrorMessage:[\n        /* 0 */ '輸入的信用卡號有誤！',\n        /* 1 */ '輸入的信用卡期限有誤！',\n        /* 2 */ '輸入的信用卡安全碼有誤！',\n        /* 3 */ '輸入的信用卡持有人郵編有誤！',\n        /* 4 */ '支付失敗，支付無法完成請稍後再試',\n        /* 5 */ '支付數據存在錯誤',\n        /* 6 */ '您的付款被銀行所拒絕',\n        /* 7 */ '發生錯誤，請稍後再試',\n            ],\n            cantUpgradeMonthly: '年度計劃不可降級為月度計劃。請先終止您當前訂閱的年度計劃，再重新申請此月度訂閱',\n            segmentTitle:'賬戶Email: ',\n            currentPlan:'當前訂閱: ',\n            oldPlanBalance: '原計劃剩餘價值：',\n            needPay: '應付金額：',\n            monthResetDay:'月重置日：',\n            cancelPlanButton:'中止當前訂閱',\n            monthResetDayAfter:'',\n            bandwidthBalance:'月度數據剩余量：',\n            planPrice: '訂閱價格：',\n            MonthBandwidthTitle:'月度代理伺服器限額：',\n            dayBandwidthTitle:'每日限額：',\n            upgradeTitle:'升級',\n            planExpirDate: function ( year: string, month: string, day: string ) { return `${ year } 年${ month }月${ day }日`},\n            accountOptionButton: '賬戶選項',\n            paymentSuccess:'您的訂閱已經完成,祝您網絡衝浪愉快。',\n            qtgateTeam: 'CoNET開發團隊敬上',\n            paymentProcessing:'正在通訊中...',\n            DowngradeTitle:'降級賬戶選項',\n            multiOpn:'OPN併發多代理技術',\n            cancelPlan:'終止當前訂閱',\n            cantCancelInformation: '您的賬戶可能是CoNET測試用戶，或使用優惠碼產生的訂閱用戶，此類賬戶可以升級但不能被中止',\n            MonthBandwidthTitle1:'傳送限額',\n            monthlyAutoPay: function (monthCost: number ) { return `<span>每月自動扣款</span><span class=\"usDollar\">@ us$</span><span class=\"amount\" >${ monthCost }</span>/月<span>`},\n            annualPay: function ( annual_monthlyCost: string ) { return `<span>年付款每月只需</span><span class=\"usDollar\">@ us$</span><span class=\"amount\" >${  annual_monthlyCost }</span>/月<span>`},\n            expirationYear: '信用卡期限',\n            serverShare:'代理伺服器',\n            cardNumber: '信用卡號',\n            cvcNumber: '信用卡安全碼',\n            calcelPayment:'中止付款',\n            doPayment:'確認付款',\n            postcodeTitle: '信用卡擁有者郵編',\n            aboutCancel: '關於中止訂閱',\n            payAmountTitile:'支付合計',\n            canadaCard:'*加拿大持卡人將自動加算GST(BC)5%',\n            multiRegion:['單一代理區域並發代理','多代理區域混合併發代理','多代理區域混合併發代理','多代理區域混合併發代理'],\n            maxmultigateway: ['最大同時可二條並發代理數','最大同時可使用四條並發代理數*','最大同時可使用四條並發代理數'],\n            continue:'下一步',\n            serverShareData:['共享伺服器','獨佔一台伺服器*','獨佔二台伺服器*','獨佔四台伺服器'],\n            monthlyPay:'月租費',\n            internetShareData:['共享高速帶寬','獨享高速帶寬*','獨享雙線高速帶寬*','獨享四線高速帶寬'],\n            serverShareData1:'OPN併發多代理技術，同時使用數大於獨占數時，會相應分享您所獨占的資源',\n            cancelPlanMessage:'可隨時終止您的訂閱，CoNET的訂閱是以月為基本的單位。您的月訂閱將在下月您的訂閱起始日前被終止，您可以繼續使用您的本月訂閱計劃，您將自動回到免費用戶。如果您是每月自動扣款，則下月將不再扣款。如果您是年度訂閱計劃，您的退款將按普通每月訂閱費，扣除您已經使用的月份後計算的差額，將自動返還您所支付的信用卡賬號，如果您是使用促銷碼，或您是測試用戶，您的終止訂閱將不能被接受。 ',\n            cancelPlanMessage1: function ( isAnnual: boolean, amount: number, monthlyPay: number, expire: string, passedMonth: number, totalMonth: number ) {\n                return `<span>您的訂閱計劃是${ isAnnual ? `年度訂閱，退還金額將按照您已付年訂閱費</span><span class=\"usDollar\">us$</span><span class=\"amount\">${ amount /100  }</span><span> - 該訂閱原價 </span><span class=\"usDollar\">us$</span><span class=\"amount\">${ monthlyPay /100 }</span><span> X 已使用月數(包括本月) </span><span class=\"amount\">${ passedMonth }</span><span> = 餘額 </span><span class=\"usDollar\">us$</span><span class=\"amount\">${ amount - passedMonth * monthlyPay > 0 ? ( amount - passedMonth * monthlyPay ) / 100 : 0 }</span><span>，將在7個工作日內，退還到您用來支付的信用卡帳戶。</span>`: `月訂閱，您的訂閱將下次更新日</span><span class=\"amount\">${ nextExpirDate (expire).toLocaleDateString() }</span><span>時不再被自動扣款和更新。</span>`}`\n            }\n        \n        },\n\n        QTGateDonate: {\n            title: 'CoNET贊助商提供的免流量網站',\n            meta_title:'捐贈者：',\n            detail:'所有CoNET用戶，使用CoNET代理伺服器，訪問贊助商贊助的網站時產生的流量，都不被計入。免費用戶需注意的是，如本日或本月流量已用完，無法接入CoNET代理伺服器，則無法利用此功能。'\n\n        },\n\n        useInfoiOS: {\n            title1:'iOS設備本地代理伺服器設定',\n            info:[{\n                title:'打開控制面板，點擊Wi-Fi',\n                titleImage:'/images/macOsControl.jpg',\n                detail: '',\n                image: '/images/iOS1.jpg'\n            },{\n                title:'選擇當前WiFi的圈i符號',\n                titleImage:'',\n                detail:'',\n                image: '/images/iOS2.jpg'\n            },{\n                title:'選擇底部的設置代理伺服器',\n                titleImage:'',\n                detail:'',\n                image: '/images/iOS3.jpg'\n            },{\n                title:'選擇自動設置',\n                titleImage:'',\n                detail:'<p>在URL網址處，HTTP和HTTPS代理按照藍色第一行填入，SOCKS代理按藍色第二行填入</p>',\n                image: '/images/iOS4.jpg'\n            }]\n        },\n\n        firefoxUseInfo:{\n            title1:'火狐瀏覽器它單獨設定代理服務，可以不影響系統而輕鬆使用代理上網',\n            info:[{\n                title:'打開火狐，點擊右上角工具圖標，選擇設定',\n                titleImage:'/images/macOsControl.jpg',\n                detail: '<p><a href=\"https://www.mozilla.org/zh-TW/firefox/#\" target=\"_blank\">下载Firefox</a></p>',\n                image: '/images/firefox1.jpg'\n            },{\n                title:'選擇常規項，滾動畫面至最下部，在網絡代理處，點擊詳細設定',\n                titleImage:'',\n                detail:'',\n                image: '/images/firefox2.jpg'\n            },{\n                title:'選擇自動設置代理伺服器，選勾DNS使用SOCKS v5',\n                titleImage:'',\n                detail:'HTTP和HTTPS代理按照藍色第一行填入，SOCKS代理按藍色第二行填入',\n                image: '/images/firefox3.jpg'\n            }]\n        },\n\n        useInfoWindows: {\n            title1:'Windows10本地代理伺服器設定',\n            info:[{\n                title:'關於Windows其他版本',\n                titleImage:'',\n                detail: '<p>Windows其他版本的代理伺服器設定請參照<a target=\"_blank\" href=\"#\" onclick=\"return linkClick (`https://support.microsoft.com/ja-jp/help/135982/how-to-configure-internet-explorer-to-use-a-proxy-server`)\">微軟公司網站</a></p><p>请按以下参数设置本地代理伺服器：</p>',\n                image: ''\n            },{\n                title:'啟動Internet Explorer',\n                titleImage:'/images/IE10_icon.png',\n                detail:'<p>點擊右上角工具圖標，滑動設定菜單至最下部選擇【設定】</p>',\n                image:'/images/windowsUseInfo1.jpg'\n            },{\n                title:'滑動菜單至最下部點擊高級設定',\n                titleImage:'',\n                detail:'',\n                image: '/images/windowsUseInfo2.jpg'\n            },{\n                title:'再次滑動菜單，點擊打開代理伺服器設定',\n                titleImage:'',\n                detail:'',\n                image: '/images/windowsUseInfo3.jpg'\n            },{\n                title:'選擇自動設置代理伺服器。',\n                titleImage:'',\n                detail:'<p>WINDOWS10系統只對應HTTP和HTTPS，如果想使用全局代理的用戶，需另外安裝瀏覽器如火狐等，然後在火狐瀏覽器內單獨設定Proxy全局代理SOCKS</p>',\n                image: '/images/windowsUseInfo4.jpg'\n            }]\n        },\n\n        useInfoAndroid: {\n            title1:'安卓設備本地代理伺服器設定',\n            info:[{\n                title:'打开控制面板，选择Wi-Fi设定',\n                titleImage:'/images/androidSetup.jpg',\n                detail: '',\n                image: '/images/android1.jpg'\n            },{\n                title:'長按當前WiFi連接名稱等待菜單出現，選擇菜單的修改設定',\n                titleImage:'',\n                detail:'',\n                image: '/images/android2.jpg'\n            },{\n                title:'打開顯示高級選項，在代理伺服器設定(Proxy)中選擇自動設置',\n                titleImage:'',\n                detail:'HTTP和HTTPS代理按照藍色第一行填入，SOCKS代理按藍色第二行填入',\n                image: '/images/android3.jpg'\n            }]\n        },\n\n        useInfoMacOS: {\n            title:'本地代理伺服器已在後台運行。您的其他電子設備，可通過設置本地代理，來使用CoNET連接到互聯網',\n            wrtTestAreaTitle: 'WebRTC漏洞数据泄漏区域',\n            customProxy: '訂製伺服器完成',\n            title1:'MacOS 本地代理伺服器設定',\n            localIpAddress:'如果能看到這個IP地址，由於是本地局域網地址洩漏，無關緊要。',\n            proxySetupHelp:'如需幫助，請點擊下列您的OS系統所屬圖案',\n            globalIpAddress:'如果顯示這個IP，您的瀏覽器洩漏了您真實的IP地址',\n            webRTCinfo:'阻止WebRTC漏洞，請使用SOCKS代理設定，檢查是否漏洞還在，請點擊<a href=\"/Wrt\" target=\"_blank\">這裡</a>',\n            wrtTest: '以下為測試結果：',\n            proxyServerIp:'<p>代理設定選擇：<span style=\"color: brown;\">自動設定</p>',\n            proxyServerPort: 'HTTP和HTTPS代理的設定為：',\n            proxyServerPassword: 'SOCKS代理的設定為：',\n            info:[{\n                \n                title:'打開控制面板，點擊【網絡】',\n                titleImage:'/images/macOsControl.jpg',\n                detail:'',\n                image: '/images/userInfoMacos1.jpg'\n            },{\n                title:'選擇網絡【高級...】',\n                titleImage:'',\n                detail:'',\n                image: '/images/macosUserInfo2.jpg'\n            },{\n                title:'點擊代理伺服器設定，選勾自動代理，選購排除簡單Host名',\n                titleImage:'',\n                detail:'<p>HTTP和HTTPS代理按照藍色第一行填入，SOCKS代理按藍色第二行填入</p>',\n                image: '/images/macosUserInfo3.jpg'\n            }]\n        },\n\n        QTGateInfo: {\n            title:'功能簡介',\n            version:'本機安裝版本：v',\n            detail:[{\n                color: '#a333c8',\n                icon: 'exchange',\n                header: '隱身匿名自由上網CoNET',\n                detail: 'CoNET通過使用<a href=\"https://zh.wikipedia.org/wiki/%E9%AB%98%E7%BA%A7%E5%8A%A0%E5%AF%86%E6%A0%87%E5%87%86\" target=\"_blank\">AES256-GCM</a>和<a href=\"https://zh.wikipedia.org/wiki/PGP\" target=\"_blank\">OpenPGP</a >加密Email通訊，創造了OPN匿名網絡通訊技術，CoNET公司首創的@OPN技術，它全程使用加密Email通訊，客戶端和代理伺服器彼此之間不用交換IP地址，實現高速網絡通訊。iOPN通訊技術是一種HTTP協議下的加密混淆代理技術，能夠隱藏變換您的IP地址高速通訊。二種通訊方式都能夠讓您，隱身和安全及不被檢出的上網，保護您的隱私，具有超強對抗網絡監控,網絡限制和網絡阻斷。'\n            },{\n                color: '#e03997',\n                icon: 'talk outline',\n                header:'無IP點對點即時加密通訊服務QTChat',\n                detail:'CoNET用戶之間通過email的點對點即時通訊服務，它具有傳統即時通訊服務所不具有的，匿名無IP和用戶之保持秘密通訊的功能。 QTChat加密通訊服務可以傳送文字，圖片和視頻文件信息，CoNET系統只負責傳送信息，不擁有信息，也無法檢查信息本身，所以CoNET不承擔信息所有的法律責任。 QTChat支持群即時通訊，將支持視頻流直播服務。'\n            },{\n                color: '#6435c9',\n                icon: 'cloud upload',\n                header:'加密文件匿名網絡雲存儲分享功能QTStorage',\n                detail:'用戶通過申請多個和不同的免費email服務商賬號，可以把一個文件加密拆分成多個部分，分別存儲在不同的email賬號下，可以保密安全和無限量的使用網絡儲存。用戶還可以通過CoNET系統在CoNET用戶之間分享秘密文件。'\n            },\n            {\n                color: 'darkcyan',\n                icon: 'spy',\n                header: '阻斷間諜軟件',\n                detail: 'CoNET系統連接全球DNSBL聯盟數據庫，用戶通過訂閱CoNET系統黑名單列表，並使用CoNET客戶端上網，讓潛伏在您電子設備內的間諜軟件，它每時每刻收集的信息，不能夠被送信到其信息收集伺服器，能夠最大限的保障您的個人隱私。'\n            },{\n                color: '#6435c9',\n                icon: 'external share',\n                header:'本地VPN伺服器',\n                detail:'CoNET用戶在戶外時可以通過連接自己家裡的VPN，來使用CoNET客戶端隱身安全上網。'\n            }]\n        },\n\n        cover: {\n            firstTitle1: 'CoNET平台',\n            firstTitle2: '安全隱私自由的互聯網',\n            start: '開門',\n            proxyStoped: 'CoGate定制代理伺服器已經停止，如需使用請重新定制代理伺服器。'\n        },\n\n        topWindow: {\n            title: '慶祝加拿大150週年特別提供'\n        },\n\n        firstNote:{\n            title: '歡迎使用CoNET，感謝您使用我們的產品和服務(下稱“服務”)。本服務由總部設在加拿大的CoNET Technology Inc.下稱“CoNET”提供。 ',\n            firstPart: '您使用我們的服務即表示您已同意本條款。請仔細閱讀。使用我們的服務，您必須遵守服務中提供的所有政策。',\n            detail:[\n                {\n                    header: '關於我們的服務',\n                    detail: '請勿濫用我們的服務，舉例而言: 請勿干擾我們的服務或嘗試使用除我們提供的界面和指示以外的方法訪問這些服務。您僅能在法律(包括適用的出口和再出口管制法律和法規)允許的範圍內使用我們的服務。如果您不同意或遵守我們的條款或政策，請不要使用我們所提供的服務，或者我們在調查可疑的不當行為，我們可以暫停或終止向您提供服務。'\n                },{\n                    header: null,\n                    detail: '使用我們的服務並不讓您擁有我們的服務或您所訪問的內容的任何知識產權。除非您獲得相關內容所有者的許可或通過其他方式獲得法律的許可，否則您不得使用服務中的任何內容。本條款並未授予您使用我們服務中所用的任何商標或標誌的權利。請勿刪除、隱藏或更改我們服務上顯示的或隨服務一同顯示的任何法律聲明。'\n                },{\n                    header: '關於CoNET無IP通訊技術和隱私保護的局限性',\n                    detail: 'CoNET世界首創的使用Email的IMAP協議建造一個無IP通訊環境，在您利用CoNET進行通訊過程中，CoNET無法獲得您目前所使用的IP地址，可以最大限度的保障您的個人隱私。但是這項技術並不能夠保證您的信息絕對的不被洩露，因為您的IP地址有可能被記錄在您所使用的Email服務供應商，如果持有加拿大法院令尋求CoNET的Log公開，再和Email服務供應商的Log合併分析，可能會最終得到您的信息。CoNET並不能夠絕對保障您的隱私。'\n                },{\n                    header: '關於個人隱私保護，系統日誌和接收CoNET傳送的信息',\n                    detail: '在您使用服務的過程中，我們可能會向您發送服務公告、管理消息和其他信息。您可以選擇不接收上述某些信息。'\n                },{\n                    header: null,\n                    detail: '當您使用我們的服務時，我們為了計費處理會自動收集非常有限的數據流量信息，並存儲到伺服器日誌中。數據流量信息僅用於計算客戶應支付通訊費用而收集的，它收集的數據是：日期，用戶帳號，所使用的代理服務區域和代理伺服器IP，數據包大小，下載或上傳。例如：'\n                },{\n                    header: null,\n                    detail: '<p class=\"tag info\">06/20/2017 18:12:16, info@CoNET.com, francisco, 104.236.162.139, 300322 byte up, 482776323 byte down.</p><p class=\"tag info\">06/21/2017 12:04:18, info@CoNET.com, francisco, 104.236.162.139, 1435226 byte up, 11782238 byte down.</p>'\n                },{\n                    header: null,\n                    detail: 'CoNET沒有保存除了以上信息以外的任何其他信息。我們會配合並向持有加拿大法院令的執法機構提供此日誌文件。如果您是加拿大以外地區的執法機構，有這方面信息披露的需求，請通過加拿大外交部來聯繫我們：'\n                },{\n                    header: null,\n                    detail: '<a class=\"tag alert\" href=\"http://www.international.gc.ca/\">http://www.international.gc.ca/</a>'\n                },{\n                    header: '版權所有權',\n                    detail: '該軟件是CoNET的智慧產權，並且受到相關版權法，國際版權保護規定和其他在版權授與國家內的相關法律的保護。該軟件包含智慧產權材料, 商業秘密及其他產權相關材料。你不能也不應該嘗試修改，反向工程操作，反彙編或反編譯CoNET服務，也不能由CoNET服務項目創造或衍生其他作品。'\n                },{\n                    header: null,\n                    detail: '關於我們服務中的軟件，CoNET授予您免許可使用費、不可轉讓的、非獨占的全球性個人許可, 允許您使用由CoNET提供的、包含在服務中的軟件。本許可僅旨在讓您通過本條款允許的方式使用由CoNET提供的服務並從中受益。您不得複制、修改、發布、出售或出租我們的服務, 或所含軟件的任何部分。'\n                },{\n                    header: '修改與終止服務',\n                    detail: '我們持續改變和改善所提供的服務。我們可能會新增或移除功能或特性，也可能會暫停或徹底停止某項服務。您隨時都可以停止使用服務，儘管我們並不希望您會這樣做。 CoNET也可能隨時停止向您提供服務，或對服務附加或設定新的限制。'\n                },{\n                    header: '服務的責任',\n                    detail: '在法律允許的範圍內，CoNET及其供應商和分銷商不承擔利潤損失、收入損失或數據、財務損失或間接、特殊、後果性、懲戒性或懲罰性損害賠償責任。'\n                }, {\n                    header: '法律規定的貿易禁止事項',\n                    detail: '當您按下同意按鈕，表示您已經確認您不屬於加拿大法律所規定的禁止貿易對象的列表之中。'\n                }, {\n                    header: '服務的商業使用',\n                    detail: '如果您代表某家企業使用我們的服務，該企業必須接受本條款。對於因使用本服務或違反本條款而導致的或與之相關的任何索賠、起訴或訴訟，包括因索賠、損失、損害賠償、起訴、判決、訴訟費和律師費而產生的任何責任或費用，該企業應對CoNET及其關聯機構、管理人員、代理機構和員工進行賠償並使之免受損害。'\n                }, {\n                    header: '本條款的變更和約束力',\n                    detail: '关于本条款：我们可以修改上述条款或任何适用于某项服务的附加条款，例如，为反映法律的变更或我们服务的变化而进行的修改。您应当定期查阅本条款。我们会在本网页上公布这些条款的修改通知。我们会在适用的服务中公布附加条款的修改通知。所有修改的适用不具有追溯力，且会在公布十四天或更长时间后方始生效。但是，对服务新功能的特别修改或由于法律原因所作的修改将立即生效。如果您不同意服务的修改条款，应停止使用服务。如果本条款与附加条款有冲突，以附加条款为准。'\n                },{\n                    header: '',\n                    detail: '本条款约束CoNET与您之间的关系，且不创设任何第三方受益权。如果您不遵守本条款，且我们未立即采取行动，并不意味我们放弃我们可能享有的任何权利（例如，在将来采取行动）。如果某一条款不能被强制执行，这不会影响其他条款的效力。加拿大BC省的法律（不包括BC州的法律冲突规则）将适用于因本条款或服务引起的或与之相关的纠纷。因本条款或服务引起的或与之相关的所有索赔，只能向加拿大BC省法院提起诉讼，且您和CoNET同意上述法院拥有属人管辖权。'\n                }\n\n\n            ],\n            disagree: '不同意',\n            agreeMent: 'CoNET服務條款和隱私權'\n        },\n\n        linuxUpdate: {\n            newVersionDownload: '點擊這裡下載並安裝',\n            step1:'請更新版本: ',\n            step2: '授權新版本CoNET為可執行文件',\n            step2J1:'/images/linuxUpdate1_tw.jpg',\n            step2J2:'/images/linuxUpdate2_tw.jpeg',\n            step2_detail1: '右鍵點擊已下載的CoNET圖標，選擇菜單裡的文件屬性',\n            step2_detail2: '在權限選項裡，選勾“允許檔案文件執行”。',\n            step3:'退出舊版本CoNET後，雙擊CoNET文件執行安裝',\n            exit: '退出CoNET',\n            tryAgain:'再次嘗試',\n            refresh:'刷新頁面'\n        },\n\n        imapInformation: {\n            title: '通訊專用Email郵箱設置',\n            tempImapAccount: `臨時郵箱申請有困難？您可以暫時使用<a href=\"#\" style = \"margin-left: 0.5em;\" class=\"ui label teal\" onclick=\"return linkClick ('https://github.com/QTGate/QTGate-Desktop-Client/wiki/IMAP%E8%87%A8%E6%99%82%E5%B8%B3%E6%88%B6')\">CoNET網絡提供的臨時IMAP帳號供各位測試</a>`,\n            infomation: `請設置CoNET網絡通訊專用Email郵箱信息。由於此賬戶的用戶名和密碼信息會提交給CoNET網絡，為了防止您的個人信息被洩漏，請新申請一個臨時Email賬戶。目前CoNET網絡技術對應<a class=\"ui label teal small\" href=\"#\" onclick=\"return linkClick ('https://www.icloud.com/')\">Apple iCloud</a><a class=\"ui label teal small\" href=\"#\" onclick=\"return linkClick ('https://www.microsoft.com/zh-tw/outlook-com/mobile/?WT.mc_id=mscom')\">微軟OUTLOOK</a><a class=\"ui label teal small\" href=\"#\" onclick=\"return linkClick ('https://www.zoho.com/mail/')\">俄羅斯ZOHO郵箱</a><a href=\"#\" class=\"ui label teal small\" onclick=\"return linkClick ('https://www.gmx.com/mail/#.1559516-header-nav1-2')\">美國在線GMX郵箱</a>，CoNET強力推薦使用蘋果公司的Email可以達到最佳速度。密碼請使用Email服務商的<a href=\"#\" onclick=\"return linkClick ('https://tw.help.yahoo.com/kb/SLN15241.html')\">應用密碼</a>。對於Email供應商在應用密碼申請時，須打開<a href=\"#\" onclick=\"return linkClick ('https://tw.help.yahoo.com/kb/%E9%96%8B%E5%95%9F%E5%85%A9%E6%AD%A5%E9%A9%9F%E9%A9%97%E8%AD%89-sln5013.html')\">二步認證</a>並必須提供手機號碼接受驗證碼，為保護您的隱私，建議使用免費在線代理接收驗證碼服務。如 ( <a href=\"#\" onclick=\"return linkClick('http://receive-sms-online.com/')\">receive-sms-online.com</a>, <a href=\"#\" onclick=\"return linkClick('https://sms-online.co/receive-free-sms')\" >sms-online.co</a>, <a href=\"#\" onclick=\"return linkClick('https://receive-a-sms.com/')\" >receive-a-sms.com</a> ) 更多請 <a href=\"#\" onclick=\"return linkClick ('http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=%E5%85%8D%E8%B4%B9%E5%9C%A8%E7%BA%BF%E6%8E%A5%E6%94%B6%E6%89%8B%E6%9C%BA%E9%AA%8C%E8%AF%81%E7%A0%81&rsv_pq=e94f47a50001f66f&rsv_t=b03ePiy3rHH0T4FVoWB8Hx9vrVdZLzVhhErWOo4xdBpjDw%2BtGri%2BViTaVAw&rqlang=cn&rsv_enter=1&rsv_sug3=42&rsv_sug1=5&rsv_sug7=100')\">百度查找</a>，<a href=\"#\" onclick=\"return linkClick ('https://www.google.com/search?q=%E5%85%8D%E8%B4%B9%E5%9C%A8%E7%BA%BF%E6%8E%A5%E6%94%B6%E6%89%8B%E6%9C%BA%E9%AA%8C%E8%AF%81%E7%A0%81&oq=%E5%85%8D%E8%B4%B9%E5%9C%A8%E7%BA%BF%E6%8E%A5%E6%94%B6%E6%89%8B%E6%9C%BA%E9%AA%8C%E8%AF%81%E7%A0%81&aqs=chrome..69i57j69i60.254j0j4&sourceid=chrome&ie=UTF-8')\">Google查找</a>。`,\n            serverDetail: '詳細設定：',\n            imapServer: 'IMAP伺服器設定',\n            UserName: '登陸用戶名稱',\n            Ssl: '使用Ssl加密信息傳輸：',\n            imapServerInput: 'IMAP伺服器IP或域名',\n            portName: '通訊連接埠：',\n            otherPortNumber: '其他號碼：',\n            smtpServer: 'SMTP伺服器設定',\n            smtpServerInput: 'SMTP伺服器設定',\n            Error_portNumber: '連接埠應該是從1-65535之間，並且不是22的數字',\n            emailServerPassword: '郵箱密碼(推薦使用應用專用密碼)',\n            imapAccountConform: function ( iamp, account ) { return `<p class=\"ui small header brown\">警告：</p><p class=\"grey\">當您按下提交按鈕時，意味著您已經確認【<B class=\"red\">${ iamp }</B>】是為了使用CoNET系統而特別申請的臨時郵箱，您同意承擔由此帶來的風險，並授權CoNET系統可以使用這個Email郵箱傳輸信息!</p><p class=\"grey\" >CoNET平台將會向CoNET發送包含以下信息的email：【<B class=\"red\">${ iamp }</B>】及APP密碼，註冊【<B class=\"red\">${ account }</B>】郵箱地址，使用語言，時區，加密公鑰。 </p><p class=\"grey\">同時您也同意並授權CoNET可以向您的註冊郵箱【<B class=\"red\">${ account }</B>】發送CoNET有關服務，促銷，賬戶及其他信息。 </p>`},\n            agree:'我已經了解風險，並願意繼續',\n            imapOtherCheckError: '不能連接到Email伺服器，有可能您設定的伺服器名稱或IP，通訊連接埠有誤，請檢查您的伺服器詳細設定！',\n            CertificateError: 'Email伺服器提示的證書不能被系統信任！您的Email伺服器有可能是一個仿冒的，您如果想繼續，請在詳細設定裡選擇【允許連接到不被信任證書的Email伺服器】，但您的Email登陸信息有可能洩漏給此伺服器！',\n            IgnoreCertificate: '允許連接到不被信任證書的Email伺服器',\n            Certificat: '如果您不確定請別選擇這項，這個選擇是非常危險，因為它允許連接上一個仿冒的伺服器，可能洩露您的用戶名和密碼。',\n            AuthenticationFailed: 'Email伺服器提示用戶名或密碼錯誤，請仔細檢查您的用戶名和密碼！',\n            addAEmail: '添加通訊用Email賬戶',\n            tryAgain: '再試一次',\n            connectImap: '連結CoNET網絡',\n            cancelConnect: '終止CoNET網絡連接',\n            imapItemTitle: '通訊用郵箱詳細信息',\n            loaderText:['正','在','和','C','o','N','E','T','建','立','通','訊','管','道','...'],\n            imapCheckingStep: [\n                /* 0 */'正在尝试连接邮件伺服器',\n                /* 1 */'邮件伺服器IMAP連接成功，正在等待CoNET對接。',\n                /* 2 */'邮件伺服器SMTP連接成功',\n                /* 3 */'CoNET客户端向CoNET系统发出联机请求Email。和CoNET联机需要额外的时间，请耐心等待。',\n                /* 4 */'成功連接CoNET',\n                /* 5 */'邮件伺服器IMAP連接成功'\n\n            ],\n            imapResultTitle: 'IMAP伺服器CoNET通訊評分：',\n            testSuccess: '電子郵件伺服器連接試驗成功！',\n            exitEdit: '退出編輯Email帳戶',\n            deleteImap: '刪除IMAP帳戶',\n            proxyPortError: '連接埠應該是從3001-65535之間的數字，或此端口已被其他APP所占用，請嘗試填入其他號碼。',\n            appPassword:'關於APP密碼',\n            imapCheckError: [\n                '不能连接到郵件伺服器，有可能您沒有互聯網，或所在網絡不支持郵件IMAP通訊，請檢查您的網絡，或刷新頁面重試一次',\n                '郵件伺服器提示用户名或密码错误，请仔细检查您的用户名和密码！',\n                '郵件伺服器證書錯誤！您所在網絡可能存在網絡中間人攻擊，請換網絡環境後再嘗試。',\n                '郵件伺服器發送郵件錯誤，這通常是您使用的密碼是普通密碼所致，請換用APP密碼後再次嘗試',\n                '未連結互聯網，請檢查網絡',\n                '未知錯誤，請退出CoNET後再試。',\n                '您的郵箱無可用空間錯誤，請檢查郵箱刪除不必要的郵件後再試。'\n            ]\n        },\n\n        Home_keyPairInfo_view: {\n            deleteKeyPairHaveLogin: '請使用登陸後的客戶端來刪除您的密鑰',\n            title: '密鑰信息',\n            emailNotVerifi: '您的密鑰未獲CoNET簽署認證。 ',\n            emailVerified: '您的密鑰已獲CoNET簽署認證。 ',\n            NickName: '暱稱：',\n            creatDate:'密鑰創建日期：',\n            keyLength: '密鑰位強度：',\n            password: '請輸入長度大於五位的密碼',\n            password1: '請輸入平台密碼',\n            logout:'退出登錄',\n            deleteKeyPairInfo: '請注意：如果您沒有備份您的CoNET系統的話，刪除現有的密鑰將使您的CoNET網絡設定全部丟失，您有可能需要重新設置您的CoNET系統。如果您的註冊Email沒有變化，您的CoNET賬戶支付信息不會丟失！',\n            delete: '刪除',\n            keyID: '密鑰對ID：',\n            locked: '請提供您的RSA密鑰以解開密鑰後才能繼續操作，如果您遺忘了密碼，請刪除此RSA密鑰。',\n            systemError:'發生系統錯誤。如果重複發生，請刪除您的密鑰，再次設定您的系統！'\n        },\n\n\t\thome_index_view: {\n            newVersion: '新版本準備就緒，請安裝！',\n            newVersionInstallLoading:'更新中請稍候',\n            localIpAddress: '本機',\n            clickInstall: '點擊安裝新版本',\n            internetLable: '互聯網',\n            gateWayName:'代理伺服器',\n            showing:'系統狀態',\n            nextPage:'下一頁',\n            agree: '同意協議並繼續',\n            imapEmailAddress:'郵箱帳戶名',\n            emailAddress: 'CoNET帳戶名稱(Email地址,必填)',\n            stopCreateKeyPair: '停止生成密鑰對',\n            creatKeyPair: '創建密鑰對..',\n            keyPairCancel: '生成密鑰對被中止',\n            keyPairGenerateError: '生成密鑰對發生系統錯誤，請重試！ ',\n            keyPairGenerateSuccess: '完成生成密鑰對',\n            cancel: '放棄操作',\n            systemPassword: 'CoNET客戶端密碼設置',\n            continueCreateKeyPair: '繼續生成',\n            SystemAdministratorNickName: '帳戶暱稱(必填)',\n            KeypairLength: '請選擇加密通訊用密鑰對長度：這個數字越大，通訊越難被破解，但會增加通訊量和運算時間。',\n            systemAdministratorEmail:'RSA密鑰生成',\n            GenerateKeypair: '<em>系統正在生成用於通訊和簽名的RSA加密密鑰對，計算機需要運行產生大量的隨機數字，可能需要幾分鐘時間，尤其是長度為4096的密鑰對，需要特別長的時間，請耐心等待。關於RSA加密算法的機制和原理，您可以訪問維基百科：' +\n                `<a href='#' target=\"_blank\" onclick=\"return linkClick ('https://zh.wikipedia.org/wiki/RSA加密演算法')\">https://zh.wikipedia.org/wiki/RSA加密演算法</a></em>`,\n            inputEmail: '让我们来完成设定的最后几个步骤，首先生成RSA密鑰對, 它是您的系統信息加密，身份認證及和CoNET網絡通訊使用的重要組成部分。 RSA密鑰對的密碼請妥善保存，Email地址欄請填入您的常用邮箱地址, 它將被用作您的CoNET網絡賬號。<em style=\"color:brown;\">需注意的是CoNET域名在某些网络限制地区可能被列入黑名单，推薦使用網絡自由地區郵箱。</em>',\n            accountEmailInfo: `由於CoNET域名在某些國家和地區被防火牆屏蔽，而不能正常收發CoNET的Email，如果您是處於防火牆內的用戶，建議使用防火牆外部的郵件服務商。`\n        },\n        error_message: {\n            title: '錯誤',\n            errorNotifyTitle: '系統錯誤',\n            Success: '完成',\n            localServerError: '本地伺服器錯誤，請重新啟動CoNET！',\n            required: '請填寫此字段',\n            EmailAddress: ['請按照下列格式輸入你的電子郵件地址: someone@example.com.', '您已有相同的Email賬戶','此類Email伺服器CoNET暫時不對應。'],\n            PasswordLengthError: '密碼必須設定為5個字符以上。',\n            finishedKeyPair: '密鑰對創建完成',\n            doCancel: '終止生成',\n            errorKeyPair:'密鑰對創建發生錯誤，請重試',\n            SystemPasswordError: '密鑰對密碼錯誤，請重試！如果您已忘記您的密鑰對密碼，請刪除現有的密鑰對，重新生成新的密鑰對。',\n            finishedDeleteKeyPair: '密鑰對完成刪除!',\n            offlineError: '您的電腦視乎未連結到互聯網，請檢查網路連結',\n            imapErrorMessage: [\n        /* 0 */ '未能夠與CoNET網絡對接成功。CoNET網絡可能存在問題，請稍後再次嘗試建立連結。或聯繫CoNET服務。',\n        /* 1 */ '數據格式錯誤，請重試', \n        /* 2 */ '您的電腦未連接到互聯網，請檢查網絡後再次嘗試！',\n        /* 3 */ 'Email伺服器提示IMAP用戶名或密碼錯！這個錯誤通常是由於您使用的密碼是普通密碼，或者您的APP密碼已失效，請到您的Email帳戶檢查您的APP密碼，然後再試一次。',\n        /* 4 */ 'Email伺服器的指定連接埠連結失敗，請檢查您的IMAP連接埠設定，如果您在一個防火牆內部，則有可能該端口被防火牆所屏蔽，您可以嘗試使用該IMAP伺服器的其他連接埠！',\n        /* 5 */ '伺服器證書錯誤！您可能正在連接到一個仿冒的Email伺服器，如果您肯定這是您希望連接的伺服器，請在IMAP詳細設定中選擇忽略證書錯誤。',\n        /* 6 */ '無法獲得Email伺服器域名信息，請檢查您的Email伺服器設定！或您的電腦沒有連結互聯網，請檢查網絡狀態。',\n        /* 7 */ '此Email伺服器看來不能使用CoNET網絡通訊技术，請再測試一次或选择其他email服务供应商！',\n        /* 8 */ 'email伺服器提示SMTP用戶名或密碼錯！',\n        /* 9 */ '伺服器證書錯誤！您可能正在連接到一個仿冒的Email伺服器，如果您肯定這是您希望連接的伺服器，請在SMTP詳細設定中選擇忽略證書錯誤。',\n        /* 10 */'SMTP連結提示未知錯誤',\n        /* 11 */'您已有相同的Email賬戶',\n        /* 12 */'您的系統還未連接到CoNET網絡！',\n        /* 13 */'您的郵箱提示您賬號已無可使用容量，請清理郵箱後再試',\n        /* 14 */'通訊遇到未知錯誤，請重試！',\n                ],\n            \n            CoNET_requestError: [\n                /* 0 */'CoNET無響應,正在重新建立CoNET通訊管道，請稍候！',\n                /* 1 */'無效操作！'\n            ]\n        },\n\n        emailConform: {\n            activeViewTitle:'驗證您的密鑰',\n            emailTitle: '感謝您使用CoNET服務',\n            info1_1: '您的密鑰還未完成驗證，請點擊按鈕[發送驗證Email]，並檢查您的【',\n            info1_2: '】郵箱。如果存在多封CoNET的郵件時，請選擇最後一封信件。請打開信件並複制郵件內容。如果您還未收到CoNET的郵件，請檢查您的密鑰郵箱是否準確，或者您可以刪除您現有的密鑰，重新生成新的密鑰。',\n            info2: '複制內容從“-----BEGIN PGP MESSAGE----- （ 開始，一直到 ）----- END PGP MESSAGE-----” 結束的完整內容，粘貼到此輸入框中',\n            emailDetail1: '尊敬的 ',\n            emailDetail1_1: '',\n            reSendRequest:'發送驗證Email',\n            requestReturn: ['錯誤！您的請求被拒絕，這可能是您在短時間內多次請求所致，請稍後再試','CoNET系統已發送激活郵件！'],\n            emailDetail2: '這是您的CoNET帳號激活密碼，請複制下列框內的全部內容:',\n            bottom1_1:'此致',\n            bottom1_2:'CoNET團隊',\n            conformButtom: '驗 證',\n            formatError: [  '內容格式錯誤，請複制從“-----BEGIN PGP MESSAGE----- （開始，一直到）-----END PGP MESSAGE-----” 結束的完整內容，粘貼在此輸入框中。',\n                            '提供的內容不能被解密，請確認這是在您收到的最後一封從CoNET發送過來的激活信。如果還是沒法完成激活，請刪除您的密鑰重新生成和設定。',\n                            '和CoNET網絡連接發生錯誤，請退出重新嘗試！',\n                            '無效激活碼！如果存在多封CoNET的郵件時，請選擇最後一封信件。',\n                            '您的CoNET看上去有問題, 請刪除您的密鑰，重新設置您的CoNET！',\n                            'CoNET網絡系統無應答故障，可能暫時下線中，請稍後再試。 ',\n                            '您當天的數據通訊量達到上限，請等待明天再試或升級用戶類型',\n                            '用來通訊的Email設定有錯誤，請檢查IMAP設定後重試，或CoNET網絡不支持此Email類型',\n                            '您所選區域不能夠連結，請稍候再試',\n                            '您的IMAP郵箱發信發生錯誤。請退出CoNET重試。如果持續發生此故障，您的IMAP帳號有可能被鎖住，需要登陸您的IMAP郵箱網站解鎖操作。',\n                            '頁面會話已過期，請刷新頁面以繼續，或退出後重新啟動CoNET。',\n                            'CoNET平台故障，請重新啟動CoNET。'\n        \n                        ],\n            activeing: '正在通訊中'\n        },\n\n        QTGateRegion: {\n            title: '高品質訂製代理伺服器區域',\n            available: '服務中',\n            speedTest: '代理伺服器速度測試',\n            CoGateRegionStoped:'所訂製的代理伺服器已經被停止，如需使用請再次訂製.',\n            unavailable: '準備中',\n            proxyDomain: '域名解釋全程使用CoNET代理伺服器端',\n            setupCardTitle: '使用連接技術:',\n            paidUse:'本區域只對收費用戶開放',\n            MultipleGateway: '同時併發使用代理數:',\n            connectQTGate:'正在獲得代理伺服器區域信息...',\n            dataTransfer: '數據通訊:',\n            dataTransfer_datail: ['全程使用CoNET代理伺服器','當不能夠到達目標時使用'],\n            proxyDataCache: '瀏覽數據本地緩存:',\n            proxyDataCache_detail: ['本地緩存','不緩存'],\n            dataViaGateway: '全部互聯網數據通過CoNET代理伺服器',\n            cacheDatePlaceholder: '緩存失效時間',\n            requestPortNumber: '代理伺服器通訊連接埠',\n            clearCache: '立即清除所有緩存',\n            GlobalIp: '本機互聯網IP地址:',\n            option: '高級設置',\n            WebRTCleak:'阻止WebRTC漏洞',\n            WebRTCleakInfo: '本設置後，瀏覽器的即時會話，端對點通訊等將不再工作。',\n            pingError:'代理服務區域速度檢測錯誤發生，請退出CoNET，以管理員身份再次打開CoNET後，再執行速度檢測！',\n            QTGateRegionERROR:['發送連接請求Email到CoNET系統發生送信錯誤， 請檢查您的IMAP賬號的設定。 ',\n                              ''],\n            sendConnectRequestMail: ['客戶端未連結到CoNET網絡，已向CoNET重新發出聯網請求Email。這需要額外的時間，請耐心等待。',\n                                     '當長時間未連結CoNET網絡，您的連接會被中斷。'],\n            \n            GlobalIpInfo:'注意：當您按下【CoNET連結】時您會把您的本機互聯網IP提供給CoNET網絡，如果您不願意，請選擇【@OPN】技術來使用CoNET服務！沒有顯示【@OPN】選項是@OPN連結技術，只在洛杉磯區域，並只支持使用iCloud郵箱。',\n            localPort: '本地代理伺服器連接埠:',\n            cacheDatePlaceDate: [{ name:'1小时', id: 1 }, { name:'12小时', id: 12 },{ name:'1日', id: 24 }, { name:'15日', id: 360 }, { name:'1月', id: 720 }, { name:'6月', id: 4320 }, { name:'永遠', id: -1 }],\n            atQTGateDetail: [\n        /*0*/   '世界首创的CoNET无IP互联网通讯技术，全程使用強加密Email通訊，客户端和代理服务器彼此不用知道IP地址，具有超强隐身和保护隐私，超強防火牆穿透能力。缺点是有延遲，网络通讯响应受您所使用的email服务供应商的伺服器影响，不適合遊戲視頻會話等通訊。目前該技術只支持iCloud郵箱。',\n        /*1*/   'CoNET獨創HTTP明碼強加密混淆流量代理技術，能夠隱藏變換您的IP地址高速通訊，隐身和保护隐私，抗干擾超強防火牆穿透能力。缺點是需要使用您的IP來直接連結代理伺服器。如果您只是需要自由訪問互聯網，則推薦使用本技術。',\n        /*2*/   '域名解釋使用CoNET代理伺服器端，可以防止域名伺服器緩存污染，本選擇不可修改。',\n        /*3*/   '互聯網數據全程使用CoNET代理，可以匿名上網隱藏您的互聯網形踪。',\n        /*4*/   '只有當本地網絡不能夠到達您希望訪問的目標時，才使用CoNET代為您連結目標伺服器，本選項可以加速網速，但無隱私。',\n        /*5*/   '通過本地緩存瀏覽紀錄，當您再次訪問目標伺服器時可以增加訪問速度，減少網絡流量，緩存瀏覽記錄只針對非加密技術的HTTP瀏覽有效。CoNET使用強加密技術緩存瀏覽紀錄，確保您的隱私不被洩漏',\n        /*6*/   '不保存緩存信息。',\n        /*7*/   '設置緩存有效時間，您可以及時更新伺服器數據，單位為小時。',\n        /*8*/   '本地Proxy服务器，其他手机电脑和IPad等可通過连结此端口來使用CoNET服务。請設定為3001至65535之間的數字',\n        /*9*/   '通過設置PATH鏈接路徑可以簡單給您的Proxy伺服器增加安全性，拒絕沒有提供PATH的訪問者使用您的Proxy伺服器。',\n        /*10*/  '同時使用多條代理線路數，可以有效降低大流量集中在一個代理服務線路，降低被網絡監控者發現的風險。此選項僅供收費會員使用。',\n        /*11*/  '指定同CoNET代理進行通訊使用的連接埠，通過此設置可以規避您所在網段被通訊屏蔽的連接埠。',\n        /*12*/  'Web实时通讯(WebRTC)是客戶端的瀏覽器之間，通過IP地址直接高速通訊技術，有時被惡用洩漏您的真實IP地址。'\n            ]\n        },\n\n        QTGateGateway: {\n            title: 'CoNET服務使用詳細',\n            promo: '促銷活動',\n            processing: '正在嘗試连接CoNET網絡...',\n            error: [\n                '錯誤：您的賬號下已經有一個正在使用CoNET代理伺服器的連接，請先把它斷開後再嘗試連接。', \n                '錯誤：您的賬號已經無可使用流量，如果您需要繼續使用CoNET代理伺服器，請升級您的賬戶類型。如果是免費用戶已經使用當天100M流量，請等待到明天繼續使用，如您是免費用戶已經用完當月1G流量，請等待到下月繼續使用。',\n                '錯誤：數據錯誤，請退出並重新啟動CoNET！','非常抱歉，您請求的代理區域無資源，請選擇其他區域或稍後再試',\n                '對不起，您所請求連接的區域不支持這樣的連接技術，請換其他連接方法或選擇其他區域連接',\n                '@OPN链接技术不支持公用iCloud邮箱，请撤換通訊用IMAP郵箱，換您自有的iCloud邮箱。'\n            ],\n            connected:'已連接。',\n            upgrade:'升級賬號',\n            accountManager:'賬號管理',\n            userType:['免費用戶','付費用戶'],\n            datatransferToday:'日流量限額：',\n            datatransferMonth:'月流量限額：',\n            todaysDatatransfer: '本日可使用流量',\n            monthDatatransfer: '本月可使用流量',\n            gatewayInfo: ['代理伺服器IP地址：','代理伺服器連接端口：'],\n            userInfoButton: '使用指南',\n            stopGatewayButton:'停止所定制伺服器',\n            disconnecting: '正在銷毀中...'\n        },\n        \n        qtGateView: {\n            title: '發送訂製請求',\n            QTGateConnectResultWaiting: '已向CoNET網絡發送連接請求Email。由於是首次連接CoNET網絡，系統需要幾分鐘時間來完成與您的對接，請耐心等待。',\n            mainImapAccount: 'CoNET網絡通訊用郵箱',\n            QTGateDisconnectInfo: 'CoNET網絡已斷開。請選擇CoNET網絡通訊用IMAP帳號',\n            QTGateConnectStatus: 'CoNET網絡連接狀態',\n            QTGateConnectResult: ['CoNET網絡未連結，請點擊連接CoNET網絡', '正在連接CoNET網絡', '已經連接CoNET網絡', '連接連接CoNET網絡時發生錯誤，請修改IMAP賬號設定',\n                    '已經連接CoNET網絡'],\n            QTGateSign: ['您的密鑰狀態','還未獲得CoNET網絡信任簽署,點擊完成信任簽署',\n                '密钥获得CoNET網絡信任签署是一个重要步骤，您今后在CoNET網絡用户之间分享文件或传送秘密信息时，CoNET網絡可以證明是您本人而非其他冒充者。你也可以通过您的密钥签署信任给其他CoNET網絡用户，用以区别您自己的信任用户和非信任用户。',\n                '正在獲得CoNET信任簽署中','系統錯誤，請重啓CoNET後再試，如果仍然存在，請嘗試重新安裝CoNET。', 'CoNET系統錯誤!']\n\n        },\n\n        feedBack: {\n            title: '使用信息反饋',\n            additional: '添附附加信息',\n            okTitle:'發送至CoNET'\n        },\n\t}\n]\n\nconst linkClick = function ( url: string ) {\n    return window.open ( url, '_blank')\n}\n\nfunction cmpVersions ( a: string, b: string ) {\n    let diff\n    const regExStrip0 = /(\\.0+)+$/\n    const segmentsA = a.replace( regExStrip0, '').split('.')\n    const segmentsB = b.replace( regExStrip0, '').split('.')\n    const l = Math.min ( segmentsA.length, segmentsB.length )\n\n    for ( let i = 0; i < l; i++ ) {\n        diff = parseInt ( segmentsA[i], 10 ) - parseInt ( segmentsB[i], 10 )\n        if ( diff ) {\n            return diff\n        }\n    }\n    return segmentsA.length - segmentsB.length;\n}\n\nfunction scrollToTop () {\n    document.body.scrollTop = 0; // For Safari\n    document.documentElement.scrollTop = 0; // For Chrome, Firefox, IE and Opera\n}\n\n\nconst QTGateRegionsSetup: IQTGateRegionsSetup[] = [\n    {\n        title: '@OPN'\n    },\n    {\n        title: 'iOPN'\n    }\n]\n\nconst _QTGateRegions: QTGateRegions[] = [\n    {\n        icon: 'india',\n        content: ['班加罗尔','バンガロール','Bangalore','班加羅爾'],\n        meta: ['亚洲・印度','アジア・インド','India. Asia.','亞洲・印度'],\n        description: ['','','',''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable ( false ),\n        showExtraContent: ko.observable ( false ),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'Asia.Bangalore',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable ( false ),\n        showConnectedArea: ko.observable ( false ),\n        ping: ko.observable ( -2 ),\n        downloadSpeed: ko.observable (-2),\n        freeUser: ko.observable(false)\n\n    },{\n        icon: 'singapore',\n        content: ['新加坡','シンガポール','Singapore','新加坡'],\n        meta: ['亚洲・新加坡','アジア・シンガポール','Singapore. Asia.','亞洲・新加坡'],\n        description: ['','','',''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable ( false ),\n        showExtraContent: ko.observable ( false ),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'singapore',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable ( false ),\n        showConnectedArea: ko.observable ( false ),\n        ping: ko.observable ( -2 ),\n        downloadSpeed: ko.observable (-2),\n        freeUser: ko.observable(false)\n    },{\n        icon: 'japan',\n        content: ['东京','東京','Tokyo','東京'],\n        meta: ['亚洲・日本','アジア・日本','Japan. Asia.','亞洲・日本'],\n        description: ['','','',''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable ( false ),\n        showExtraContent: ko.observable ( false ),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'tokyo',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable ( false ),\n        showConnectedArea: ko.observable ( false ),\n        ping: ko.observable ( -2 ),\n        downloadSpeed: ko.observable (-2),\n        freeUser: ko.observable(false)\n    },{\n        icon: 'france',\n        content: ['巴黎','パリ','Paris','巴黎'],\n        meta: ['欧洲・法国','ヨーロッパ・フランス','France. Europe.','歐洲・法國'],\n        description: ['','','',''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable ( false ),\n        showExtraContent: ko.observable ( false ),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'paris',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable ( false ),\n        showConnectedArea: ko.observable ( false ),\n        ping: ko.observable ( -2 ),\n        downloadSpeed: ko.observable (-2),\n        freeUser: ko.observable(true)\n    }\n    /*\n    ,{\n        icon: 'netherlands',\n        content: ['阿姆斯特丹1','アムステルダム1','Amsterdam1','阿姆斯特丹1'],\n        meta: ['欧洲・荷兰','ヨーロッパ・オランダ','Netherlands. Europe.','歐洲・荷蘭'],\n        description: ['','','',''],\n        canVoe: ko.observable(true),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable ( false ),\n        showExtraContent: ko.observable ( false ),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'amsterdam1',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable ( false ),\n        showConnectedArea: ko.observable ( false ),\n        ping: ko.observable ( -2 ),\n        downloadSpeed: ko.observable (-2)\n    }\n    */\n    ,{\n        icon: 'netherlands',\n        content: ['阿姆斯特丹','アムステルダム','Amsterdam','阿姆斯特丹'],\n        meta: ['欧洲・荷兰','ヨーロッパ・オランダ','Netherlands. Europe.','歐洲・荷蘭'],\n        description: ['','','',''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable ( false ),\n        showExtraContent: ko.observable ( false ),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'amsterdam',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable ( false ),\n        showConnectedArea: ko.observable ( false ),\n        ping: ko.observable ( -2 ),\n        downloadSpeed: ko.observable (-2),\n        freeUser: ko.observable(false)\n    },{\n        icon: 'germany',\n        content: ['法兰克福','フランクフルト','Frankfurt','法蘭克福'],\n        meta: ['欧洲・德国','ヨーロッパ・ドイツ','Germany. Europe.','歐洲・德國'],\n        description: ['','','',''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable ( false ),\n        showExtraContent: ko.observable ( false ),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion:'frankfurt',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable ( false ),\n        showConnectedArea: ko.observable ( false ),\n        ping: ko.observable ( -2 ),\n        downloadSpeed: ko.observable (-2),\n        freeUser: ko.observable(false)\n\n    },{\n        icon: 'united kingdom',\n        content: ['爱尔兰','アイルランド','Ireland','愛爾蘭'],\n        meta: ['欧洲・英国','ヨーロッパ・英国','United Kingdom. Europe.','歐洲・英國'],\n        description: ['','','',''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable ( false ),\n        showExtraContent: ko.observable ( false ),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'Ireland',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable ( false ),\n        showConnectedArea: ko.observable ( false ),\n        ping: ko.observable ( -2 ),\n        downloadSpeed: ko.observable (-2),\n        freeUser: ko.observable(false)\n    },{\n        icon: 'united kingdom',\n        content: ['伦敦','ロンドン','London','倫敦'],\n        meta: ['欧洲・英国','ヨーロッパ・英国','United Kingdom. Europe.','歐洲・英國'],\n        description: ['','','',''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable ( false ),\n        showExtraContent: ko.observable ( false ),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'London',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable ( false ),\n        showConnectedArea: ko.observable ( false ),\n        ping: ko.observable ( -2 ),\n        downloadSpeed: ko.observable (-2),\n        freeUser: ko.observable(false)\n    },{\n        icon: 'australia',\n        content: ['悉尼','シドニー','Sydney','悉尼'],\n        meta: ['澳洲・澳大利亚','オーストラリア','Australia.','澳洲・澳大利亚'],\n        description: ['','','',''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable ( false ),\n        showExtraContent: ko.observable ( false ),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'Sydney',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable ( false ),\n        showConnectedArea: ko.observable ( false ),\n        ping: ko.observable ( -2 ),\n        downloadSpeed: ko.observable (-2),\n        freeUser: ko.observable(false)\n    },{\n        icon: 'united states',\n        content: ['纽约','ニューヨーク','New York City','紐約'],\n        meta: ['北美洲东海岸・美国','北アメリカ東海岸・アメリカ','USA. North American Eastern.','北美洲東海岸・美國'],\n        description: ['','','',''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable ( false ),\n        showExtraContent: ko.observable ( false ),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'new-york-city',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable ( false ),\n        showConnectedArea: ko.observable ( false ),\n        ping: ko.observable ( -2 ),\n        downloadSpeed: ko.observable (-2),\n        freeUser: ko.observable(false)\n\n    },{\n        icon: 'canada',\n        content: ['多伦多','トロント','Toronto','多倫多'],\n        meta: ['北美洲东海岸・加拿大','北アメリカ東海岸・カナダ','Canada. North American Eastern.','北美洲東海岸・加拿大'],\n        description: ['','','',''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable ( false ),\n        showExtraContent: ko.observable ( false ),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'toronto',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable ( false ),\n        showConnectedArea: ko.observable ( false ),\n        ping: ko.observable ( -2 ),\n        downloadSpeed: ko.observable (-2),\n        freeUser: ko.observable(false)\n    },{\n        icon: 'united states',\n        content: ['旧金山','サンフランシスコ','San Francisco','舊金山'],\n        meta: ['北美洲西海岸・美国・旧金山','北アメリカ西海岸・アメリカ','USA. North American Western.','北美洲西海岸・美國'],\n        description: ['','','',''],\n        canVoe: ko.observable(true),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable ( false ),\n        showExtraContent: ko.observable ( false ),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'francisco',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable ( false ),\n        showConnectedArea: ko.observable ( false ),\n        ping: ko.observable ( -2 ),\n        downloadSpeed: ko.observable (-2),\n        freeUser: ko.observable(false)\n    },{\n        icon: 'hong kong',\n        content: ['香港','香港','Hong Kong','香港'],\n        meta: ['亚洲・中国','アジア・中国','China. Asia.','亞洲・中國'],\n        description: ['','','',''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable ( false ),\n        showExtraContent: ko.observable ( false ),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'HK',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable ( false ),\n        showConnectedArea: ko.observable ( false ),\n        ping: ko.observable ( -2 ),\n        downloadSpeed: ko.observable (-2),\n        freeUser: ko.observable(false)\n    },{\n        icon: 'china',\n        content: ['上海市','上海市','Shanghai','上海市'],\n        meta: ['亚洲・中国','アジア・中国','China. Asia.','亞洲・中國'],\n        description: ['','','',''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable ( false ),\n        showExtraContent: ko.observable ( false ),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'shanghai',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable ( false ),\n        showConnectedArea: ko.observable ( false ),\n        ping: ko.observable ( -2 ),\n        downloadSpeed: ko.observable (-2),\n        freeUser: ko.observable(false)\n    },{\n        icon: 'china',\n        content: ['北京市','北京市','Beijing','北京市'],\n        meta: ['亚洲・中国','アジア・中国','China. Asia.','亞洲・中國'],\n        description: ['','','',''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable ( false ),\n        showExtraContent: ko.observable ( false ),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'beijing',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable ( false ),\n        showConnectedArea: ko.observable ( false ),\n        ping: ko.observable ( -2 ),\n        downloadSpeed: ko.observable (-2),\n        freeUser: ko.observable(false)\n    },{\n        icon: 'china',\n        content: ['无锡市','無錫市','Wuxi','無錫市'],\n        meta: ['亚洲・中国江苏省','アジア・中国江蘇省','Jiangsu China. Asia.','亞洲・中國江蘇省'],\n        description: ['','','',''],\n        canVoe: ko.observable(false),\n        canVoH: ko.observable(true),\n        available: ko.observable(false),\n        selected: ko.observable ( false ),\n        showExtraContent: ko.observable ( false ),\n        QTGateRegionsSetup: QTGateRegionsSetup,\n        qtRegion: 'Wuxi',\n        error: ko.observable(-1),\n        showRegionConnectProcessBar: ko.observable ( false ),\n        showConnectedArea: ko.observable ( false ),\n        ping: ko.observable ( -2 ),\n        downloadSpeed: ko.observable (-2),\n        freeUser: ko.observable(false)\n    }\n]\n"
  },
  {
    "path": "app/public/scripts/socket.io.js",
    "content": "/*!\n * Socket.IO v2.3.0\n * (c) 2014-2019 Guillermo Rauch\n * Released under the MIT License.\n */\n!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.io=e():t.io=e()}(this,function(){return function(t){function e(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return t[r].call(o.exports,o,o.exports,e),o.loaded=!0,o.exports}var n={};return e.m=t,e.c=n,e.p=\"\",e(0)}([function(t,e,n){function r(t,e){\"object\"==typeof t&&(e=t,t=void 0),e=e||{};var n,r=o(t),i=r.source,u=r.id,p=r.path,h=c[u]&&p in c[u].nsps,f=e.forceNew||e[\"force new connection\"]||!1===e.multiplex||h;return f?(a(\"ignoring socket cache for %s\",i),n=s(i,e)):(c[u]||(a(\"new io instance for %s\",i),c[u]=s(i,e)),n=c[u]),r.query&&!e.query&&(e.query=r.query),n.socket(r.path,e)}var o=n(1),i=n(7),s=n(15),a=n(3)(\"socket.io-client\");t.exports=e=r;var c=e.managers={};e.protocol=i.protocol,e.connect=r,e.Manager=n(15),e.Socket=n(39)},function(t,e,n){function r(t,e){var n=t;e=e||\"undefined\"!=typeof location&&location,null==t&&(t=e.protocol+\"//\"+e.host),\"string\"==typeof t&&(\"/\"===t.charAt(0)&&(t=\"/\"===t.charAt(1)?e.protocol+t:e.host+t),/^(https?|wss?):\\/\\//.test(t)||(i(\"protocol-less url %s\",t),t=\"undefined\"!=typeof e?e.protocol+\"//\"+t:\"https://\"+t),i(\"parse %s\",t),n=o(t)),n.port||(/^(http|ws)$/.test(n.protocol)?n.port=\"80\":/^(http|ws)s$/.test(n.protocol)&&(n.port=\"443\")),n.path=n.path||\"/\";var r=n.host.indexOf(\":\")!==-1,s=r?\"[\"+n.host+\"]\":n.host;return n.id=n.protocol+\"://\"+s+\":\"+n.port,n.href=n.protocol+\"://\"+s+(e&&e.port===n.port?\"\":\":\"+n.port),n}var o=n(2),i=n(3)(\"socket.io-client:url\");t.exports=r},function(t,e){var n=/^(?:(?![^:@]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/,r=[\"source\",\"protocol\",\"authority\",\"userInfo\",\"user\",\"password\",\"host\",\"port\",\"relative\",\"path\",\"directory\",\"file\",\"query\",\"anchor\"];t.exports=function(t){var e=t,o=t.indexOf(\"[\"),i=t.indexOf(\"]\");o!=-1&&i!=-1&&(t=t.substring(0,o)+t.substring(o,i).replace(/:/g,\";\")+t.substring(i,t.length));for(var s=n.exec(t||\"\"),a={},c=14;c--;)a[r[c]]=s[c]||\"\";return o!=-1&&i!=-1&&(a.source=e,a.host=a.host.substring(1,a.host.length-1).replace(/;/g,\":\"),a.authority=a.authority.replace(\"[\",\"\").replace(\"]\",\"\").replace(/;/g,\":\"),a.ipv6uri=!0),a}},function(t,e,n){(function(r){\"use strict\";function o(){return!(\"undefined\"==typeof window||!window.process||\"renderer\"!==window.process.type&&!window.process.__nwjs)||(\"undefined\"==typeof navigator||!navigator.userAgent||!navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/))&&(\"undefined\"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||\"undefined\"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||\"undefined\"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)&&parseInt(RegExp.$1,10)>=31||\"undefined\"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/))}function i(e){if(e[0]=(this.useColors?\"%c\":\"\")+this.namespace+(this.useColors?\" %c\":\" \")+e[0]+(this.useColors?\"%c \":\" \")+\"+\"+t.exports.humanize(this.diff),this.useColors){var n=\"color: \"+this.color;e.splice(1,0,n,\"color: inherit\");var r=0,o=0;e[0].replace(/%[a-zA-Z%]/g,function(t){\"%%\"!==t&&(r++,\"%c\"===t&&(o=r))}),e.splice(o,0,n)}}function s(){var t;return\"object\"===(\"undefined\"==typeof console?\"undefined\":p(console))&&console.log&&(t=console).log.apply(t,arguments)}function a(t){try{t?e.storage.setItem(\"debug\",t):e.storage.removeItem(\"debug\")}catch(n){}}function c(){var t=void 0;try{t=e.storage.getItem(\"debug\")}catch(n){}return!t&&\"undefined\"!=typeof r&&\"env\"in r&&(t=r.env.DEBUG),t}function u(){try{return localStorage}catch(t){}}var p=\"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.log=s,e.formatArgs=i,e.save=a,e.load=c,e.useColors=o,e.storage=u(),e.colors=[\"#0000CC\",\"#0000FF\",\"#0033CC\",\"#0033FF\",\"#0066CC\",\"#0066FF\",\"#0099CC\",\"#0099FF\",\"#00CC00\",\"#00CC33\",\"#00CC66\",\"#00CC99\",\"#00CCCC\",\"#00CCFF\",\"#3300CC\",\"#3300FF\",\"#3333CC\",\"#3333FF\",\"#3366CC\",\"#3366FF\",\"#3399CC\",\"#3399FF\",\"#33CC00\",\"#33CC33\",\"#33CC66\",\"#33CC99\",\"#33CCCC\",\"#33CCFF\",\"#6600CC\",\"#6600FF\",\"#6633CC\",\"#6633FF\",\"#66CC00\",\"#66CC33\",\"#9900CC\",\"#9900FF\",\"#9933CC\",\"#9933FF\",\"#99CC00\",\"#99CC33\",\"#CC0000\",\"#CC0033\",\"#CC0066\",\"#CC0099\",\"#CC00CC\",\"#CC00FF\",\"#CC3300\",\"#CC3333\",\"#CC3366\",\"#CC3399\",\"#CC33CC\",\"#CC33FF\",\"#CC6600\",\"#CC6633\",\"#CC9900\",\"#CC9933\",\"#CCCC00\",\"#CCCC33\",\"#FF0000\",\"#FF0033\",\"#FF0066\",\"#FF0099\",\"#FF00CC\",\"#FF00FF\",\"#FF3300\",\"#FF3333\",\"#FF3366\",\"#FF3399\",\"#FF33CC\",\"#FF33FF\",\"#FF6600\",\"#FF6633\",\"#FF9900\",\"#FF9933\",\"#FFCC00\",\"#FFCC33\"],t.exports=n(5)(e);var h=t.exports.formatters;h.j=function(t){try{return JSON.stringify(t)}catch(e){return\"[UnexpectedJSONParseError]: \"+e.message}}}).call(e,n(4))},function(t,e){function n(){throw new Error(\"setTimeout has not been defined\")}function r(){throw new Error(\"clearTimeout has not been defined\")}function o(t){if(p===setTimeout)return setTimeout(t,0);if((p===n||!p)&&setTimeout)return p=setTimeout,setTimeout(t,0);try{return p(t,0)}catch(e){try{return p.call(null,t,0)}catch(e){return p.call(this,t,0)}}}function i(t){if(h===clearTimeout)return clearTimeout(t);if((h===r||!h)&&clearTimeout)return h=clearTimeout,clearTimeout(t);try{return h(t)}catch(e){try{return h.call(null,t)}catch(e){return h.call(this,t)}}}function s(){y&&l&&(y=!1,l.length?d=l.concat(d):m=-1,d.length&&a())}function a(){if(!y){var t=o(s);y=!0;for(var e=d.length;e;){for(l=d,d=[];++m<e;)l&&l[m].run();m=-1,e=d.length}l=null,y=!1,i(t)}}function c(t,e){this.fun=t,this.array=e}function u(){}var p,h,f=t.exports={};!function(){try{p=\"function\"==typeof setTimeout?setTimeout:n}catch(t){p=n}try{h=\"function\"==typeof clearTimeout?clearTimeout:r}catch(t){h=r}}();var l,d=[],y=!1,m=-1;f.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)e[n-1]=arguments[n];d.push(new c(t,e)),1!==d.length||y||o(a)},c.prototype.run=function(){this.fun.apply(null,this.array)},f.title=\"browser\",f.browser=!0,f.env={},f.argv=[],f.version=\"\",f.versions={},f.on=u,f.addListener=u,f.once=u,f.off=u,f.removeListener=u,f.removeAllListeners=u,f.emit=u,f.prependListener=u,f.prependOnceListener=u,f.listeners=function(t){return[]},f.binding=function(t){throw new Error(\"process.binding is not supported\")},f.cwd=function(){return\"/\"},f.chdir=function(t){throw new Error(\"process.chdir is not supported\")},f.umask=function(){return 0}},function(t,e,n){\"use strict\";function r(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e<t.length;e++)n[e]=t[e];return n}return Array.from(t)}function o(t){function e(t){for(var e=0,n=0;n<t.length;n++)e=(e<<5)-e+t.charCodeAt(n),e|=0;return o.colors[Math.abs(e)%o.colors.length]}function o(t){function n(){for(var t=arguments.length,e=Array(t),i=0;i<t;i++)e[i]=arguments[i];if(n.enabled){var s=n,a=Number(new Date),c=a-(r||a);s.diff=c,s.prev=r,s.curr=a,r=a,e[0]=o.coerce(e[0]),\"string\"!=typeof e[0]&&e.unshift(\"%O\");var u=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,function(t,n){if(\"%%\"===t)return t;u++;var r=o.formatters[n];if(\"function\"==typeof r){var i=e[u];t=r.call(s,i),e.splice(u,1),u--}return t}),o.formatArgs.call(s,e);var p=s.log||o.log;p.apply(s,e)}}var r=void 0;return n.namespace=t,n.enabled=o.enabled(t),n.useColors=o.useColors(),n.color=e(t),n.destroy=i,n.extend=s,\"function\"==typeof o.init&&o.init(n),o.instances.push(n),n}function i(){var t=o.instances.indexOf(this);return t!==-1&&(o.instances.splice(t,1),!0)}function s(t,e){var n=o(this.namespace+(\"undefined\"==typeof e?\":\":e)+t);return n.log=this.log,n}function a(t){o.save(t),o.names=[],o.skips=[];var e=void 0,n=(\"string\"==typeof t?t:\"\").split(/[\\s,]+/),r=n.length;for(e=0;e<r;e++)n[e]&&(t=n[e].replace(/\\*/g,\".*?\"),\"-\"===t[0]?o.skips.push(new RegExp(\"^\"+t.substr(1)+\"$\")):o.names.push(new RegExp(\"^\"+t+\"$\")));for(e=0;e<o.instances.length;e++){var i=o.instances[e];i.enabled=o.enabled(i.namespace)}}function c(){var t=[].concat(r(o.names.map(p)),r(o.skips.map(p).map(function(t){return\"-\"+t}))).join(\",\");return o.enable(\"\"),t}function u(t){if(\"*\"===t[t.length-1])return!0;var e=void 0,n=void 0;for(e=0,n=o.skips.length;e<n;e++)if(o.skips[e].test(t))return!1;for(e=0,n=o.names.length;e<n;e++)if(o.names[e].test(t))return!0;return!1}function p(t){return t.toString().substring(2,t.toString().length-2).replace(/\\.\\*\\?$/,\"*\")}function h(t){return t instanceof Error?t.stack||t.message:t}return o.debug=o,o[\"default\"]=o,o.coerce=h,o.disable=c,o.enable=a,o.enabled=u,o.humanize=n(6),Object.keys(t).forEach(function(e){o[e]=t[e]}),o.instances=[],o.names=[],o.skips=[],o.formatters={},o.selectColor=e,o.enable(o.load()),o}t.exports=o},function(t,e){function n(t){if(t=String(t),!(t.length>100)){var e=/^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(t);if(e){var n=parseFloat(e[1]),r=(e[2]||\"ms\").toLowerCase();switch(r){case\"years\":case\"year\":case\"yrs\":case\"yr\":case\"y\":return n*h;case\"weeks\":case\"week\":case\"w\":return n*p;case\"days\":case\"day\":case\"d\":return n*u;case\"hours\":case\"hour\":case\"hrs\":case\"hr\":case\"h\":return n*c;case\"minutes\":case\"minute\":case\"mins\":case\"min\":case\"m\":return n*a;case\"seconds\":case\"second\":case\"secs\":case\"sec\":case\"s\":return n*s;case\"milliseconds\":case\"millisecond\":case\"msecs\":case\"msec\":case\"ms\":return n;default:return}}}}function r(t){var e=Math.abs(t);return e>=u?Math.round(t/u)+\"d\":e>=c?Math.round(t/c)+\"h\":e>=a?Math.round(t/a)+\"m\":e>=s?Math.round(t/s)+\"s\":t+\"ms\"}function o(t){var e=Math.abs(t);return e>=u?i(t,e,u,\"day\"):e>=c?i(t,e,c,\"hour\"):e>=a?i(t,e,a,\"minute\"):e>=s?i(t,e,s,\"second\"):t+\" ms\"}function i(t,e,n,r){var o=e>=1.5*n;return Math.round(t/n)+\" \"+r+(o?\"s\":\"\")}var s=1e3,a=60*s,c=60*a,u=24*c,p=7*u,h=365.25*u;t.exports=function(t,e){e=e||{};var i=typeof t;if(\"string\"===i&&t.length>0)return n(t);if(\"number\"===i&&isFinite(t))return e[\"long\"]?o(t):r(t);throw new Error(\"val is not a non-empty string or a valid number. val=\"+JSON.stringify(t))}},function(t,e,n){function r(){}function o(t){var n=\"\"+t.type;if(e.BINARY_EVENT!==t.type&&e.BINARY_ACK!==t.type||(n+=t.attachments+\"-\"),t.nsp&&\"/\"!==t.nsp&&(n+=t.nsp+\",\"),null!=t.id&&(n+=t.id),null!=t.data){var r=i(t.data);if(r===!1)return g;n+=r}return f(\"encoded %j as %s\",t,n),n}function i(t){try{return JSON.stringify(t)}catch(e){return!1}}function s(t,e){function n(t){var n=d.deconstructPacket(t),r=o(n.packet),i=n.buffers;i.unshift(r),e(i)}d.removeBlobs(t,n)}function a(){this.reconstructor=null}function c(t){var n=0,r={type:Number(t.charAt(0))};if(null==e.types[r.type])return h(\"unknown packet type \"+r.type);if(e.BINARY_EVENT===r.type||e.BINARY_ACK===r.type){for(var o=\"\";\"-\"!==t.charAt(++n)&&(o+=t.charAt(n),n!=t.length););if(o!=Number(o)||\"-\"!==t.charAt(n))throw new Error(\"Illegal attachments\");r.attachments=Number(o)}if(\"/\"===t.charAt(n+1))for(r.nsp=\"\";++n;){var i=t.charAt(n);if(\",\"===i)break;if(r.nsp+=i,n===t.length)break}else r.nsp=\"/\";var s=t.charAt(n+1);if(\"\"!==s&&Number(s)==s){for(r.id=\"\";++n;){var i=t.charAt(n);if(null==i||Number(i)!=i){--n;break}if(r.id+=t.charAt(n),n===t.length)break}r.id=Number(r.id)}if(t.charAt(++n)){var a=u(t.substr(n)),c=a!==!1&&(r.type===e.ERROR||y(a));if(!c)return h(\"invalid payload\");r.data=a}return f(\"decoded %s as %j\",t,r),r}function u(t){try{return JSON.parse(t)}catch(e){return!1}}function p(t){this.reconPack=t,this.buffers=[]}function h(t){return{type:e.ERROR,data:\"parser error: \"+t}}var f=n(8)(\"socket.io-parser\"),l=n(11),d=n(12),y=n(13),m=n(14);e.protocol=4,e.types=[\"CONNECT\",\"DISCONNECT\",\"EVENT\",\"ACK\",\"ERROR\",\"BINARY_EVENT\",\"BINARY_ACK\"],e.CONNECT=0,e.DISCONNECT=1,e.EVENT=2,e.ACK=3,e.ERROR=4,e.BINARY_EVENT=5,e.BINARY_ACK=6,e.Encoder=r,e.Decoder=a;var g=e.ERROR+'\"encode error\"';r.prototype.encode=function(t,n){if(f(\"encoding packet %j\",t),e.BINARY_EVENT===t.type||e.BINARY_ACK===t.type)s(t,n);else{var r=o(t);n([r])}},l(a.prototype),a.prototype.add=function(t){var n;if(\"string\"==typeof t)n=c(t),e.BINARY_EVENT===n.type||e.BINARY_ACK===n.type?(this.reconstructor=new p(n),0===this.reconstructor.reconPack.attachments&&this.emit(\"decoded\",n)):this.emit(\"decoded\",n);else{if(!m(t)&&!t.base64)throw new Error(\"Unknown type: \"+t);if(!this.reconstructor)throw new Error(\"got binary data when not reconstructing a packet\");n=this.reconstructor.takeBinaryData(t),n&&(this.reconstructor=null,this.emit(\"decoded\",n))}},a.prototype.destroy=function(){this.reconstructor&&this.reconstructor.finishedReconstruction()},p.prototype.takeBinaryData=function(t){if(this.buffers.push(t),this.buffers.length===this.reconPack.attachments){var e=d.reconstructPacket(this.reconPack,this.buffers);return this.finishedReconstruction(),e}return null},p.prototype.finishedReconstruction=function(){this.reconPack=null,this.buffers=[]}},function(t,e,n){(function(r){\"use strict\";function o(){return!(\"undefined\"==typeof window||!window.process||\"renderer\"!==window.process.type)||(\"undefined\"==typeof navigator||!navigator.userAgent||!navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/))&&(\"undefined\"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||\"undefined\"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||\"undefined\"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)&&parseInt(RegExp.$1,10)>=31||\"undefined\"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/))}function i(t){var n=this.useColors;if(t[0]=(n?\"%c\":\"\")+this.namespace+(n?\" %c\":\" \")+t[0]+(n?\"%c \":\" \")+\"+\"+e.humanize(this.diff),n){var r=\"color: \"+this.color;t.splice(1,0,r,\"color: inherit\");var o=0,i=0;t[0].replace(/%[a-zA-Z%]/g,function(t){\"%%\"!==t&&(o++,\"%c\"===t&&(i=o))}),t.splice(i,0,r)}}function s(){return\"object\"===(\"undefined\"==typeof console?\"undefined\":p(console))&&console.log&&Function.prototype.apply.call(console.log,console,arguments)}function a(t){try{null==t?e.storage.removeItem(\"debug\"):e.storage.debug=t}catch(n){}}function c(){var t;try{t=e.storage.debug}catch(n){}return!t&&\"undefined\"!=typeof r&&\"env\"in r&&(t=r.env.DEBUG),t}function u(){try{return window.localStorage}catch(t){}}var p=\"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=t.exports=n(9),e.log=s,e.formatArgs=i,e.save=a,e.load=c,e.useColors=o,e.storage=\"undefined\"!=typeof chrome&&\"undefined\"!=typeof chrome.storage?chrome.storage.local:u(),e.colors=[\"#0000CC\",\"#0000FF\",\"#0033CC\",\"#0033FF\",\"#0066CC\",\"#0066FF\",\"#0099CC\",\"#0099FF\",\"#00CC00\",\"#00CC33\",\"#00CC66\",\"#00CC99\",\"#00CCCC\",\"#00CCFF\",\"#3300CC\",\"#3300FF\",\"#3333CC\",\"#3333FF\",\"#3366CC\",\"#3366FF\",\"#3399CC\",\"#3399FF\",\"#33CC00\",\"#33CC33\",\"#33CC66\",\"#33CC99\",\"#33CCCC\",\"#33CCFF\",\"#6600CC\",\"#6600FF\",\"#6633CC\",\"#6633FF\",\"#66CC00\",\"#66CC33\",\"#9900CC\",\"#9900FF\",\"#9933CC\",\"#9933FF\",\"#99CC00\",\"#99CC33\",\"#CC0000\",\"#CC0033\",\"#CC0066\",\"#CC0099\",\"#CC00CC\",\"#CC00FF\",\"#CC3300\",\"#CC3333\",\"#CC3366\",\"#CC3399\",\"#CC33CC\",\"#CC33FF\",\"#CC6600\",\"#CC6633\",\"#CC9900\",\"#CC9933\",\"#CCCC00\",\"#CCCC33\",\"#FF0000\",\"#FF0033\",\"#FF0066\",\"#FF0099\",\"#FF00CC\",\"#FF00FF\",\"#FF3300\",\"#FF3333\",\"#FF3366\",\"#FF3399\",\"#FF33CC\",\"#FF33FF\",\"#FF6600\",\"#FF6633\",\"#FF9900\",\"#FF9933\",\"#FFCC00\",\"#FFCC33\"],e.formatters.j=function(t){try{return JSON.stringify(t)}catch(e){return\"[UnexpectedJSONParseError]: \"+e.message}},e.enable(c())}).call(e,n(4))},function(t,e,n){\"use strict\";function r(t){var n,r=0;for(n in t)r=(r<<5)-r+t.charCodeAt(n),r|=0;return e.colors[Math.abs(r)%e.colors.length]}function o(t){function n(){if(n.enabled){var t=n,r=+new Date,i=r-(o||r);t.diff=i,t.prev=o,t.curr=r,o=r;for(var s=new Array(arguments.length),a=0;a<s.length;a++)s[a]=arguments[a];s[0]=e.coerce(s[0]),\"string\"!=typeof s[0]&&s.unshift(\"%O\");var c=0;s[0]=s[0].replace(/%([a-zA-Z%])/g,function(n,r){if(\"%%\"===n)return n;c++;var o=e.formatters[r];if(\"function\"==typeof o){var i=s[c];n=o.call(t,i),s.splice(c,1),c--}return n}),e.formatArgs.call(t,s);var u=n.log||e.log||console.log.bind(console);u.apply(t,s)}}var o;return n.namespace=t,n.enabled=e.enabled(t),n.useColors=e.useColors(),n.color=r(t),n.destroy=i,\"function\"==typeof e.init&&e.init(n),e.instances.push(n),n}function i(){var t=e.instances.indexOf(this);return t!==-1&&(e.instances.splice(t,1),!0)}function s(t){e.save(t),e.names=[],e.skips=[];var n,r=(\"string\"==typeof t?t:\"\").split(/[\\s,]+/),o=r.length;for(n=0;n<o;n++)r[n]&&(t=r[n].replace(/\\*/g,\".*?\"),\"-\"===t[0]?e.skips.push(new RegExp(\"^\"+t.substr(1)+\"$\")):e.names.push(new RegExp(\"^\"+t+\"$\")));for(n=0;n<e.instances.length;n++){var i=e.instances[n];i.enabled=e.enabled(i.namespace)}}function a(){e.enable(\"\")}function c(t){if(\"*\"===t[t.length-1])return!0;var n,r;for(n=0,r=e.skips.length;n<r;n++)if(e.skips[n].test(t))return!1;for(n=0,r=e.names.length;n<r;n++)if(e.names[n].test(t))return!0;return!1}function u(t){return t instanceof Error?t.stack||t.message:t}e=t.exports=o.debug=o[\"default\"]=o,e.coerce=u,e.disable=a,e.enable=s,e.enabled=c,e.humanize=n(10),e.instances=[],e.names=[],e.skips=[],e.formatters={}},function(t,e){function n(t){if(t=String(t),!(t.length>100)){var e=/^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(t);if(e){var n=parseFloat(e[1]),r=(e[2]||\"ms\").toLowerCase();switch(r){case\"years\":case\"year\":case\"yrs\":case\"yr\":case\"y\":return n*p;case\"days\":case\"day\":case\"d\":return n*u;case\"hours\":case\"hour\":case\"hrs\":case\"hr\":case\"h\":return n*c;case\"minutes\":case\"minute\":case\"mins\":case\"min\":case\"m\":return n*a;case\"seconds\":case\"second\":case\"secs\":case\"sec\":case\"s\":return n*s;case\"milliseconds\":case\"millisecond\":case\"msecs\":case\"msec\":case\"ms\":return n;default:return}}}}function r(t){return t>=u?Math.round(t/u)+\"d\":t>=c?Math.round(t/c)+\"h\":t>=a?Math.round(t/a)+\"m\":t>=s?Math.round(t/s)+\"s\":t+\"ms\"}function o(t){return i(t,u,\"day\")||i(t,c,\"hour\")||i(t,a,\"minute\")||i(t,s,\"second\")||t+\" ms\"}function i(t,e,n){if(!(t<e))return t<1.5*e?Math.floor(t/e)+\" \"+n:Math.ceil(t/e)+\" \"+n+\"s\"}var s=1e3,a=60*s,c=60*a,u=24*c,p=365.25*u;t.exports=function(t,e){e=e||{};var i=typeof t;if(\"string\"===i&&t.length>0)return n(t);if(\"number\"===i&&isNaN(t)===!1)return e[\"long\"]?o(t):r(t);throw new Error(\"val is not a non-empty string or a valid number. val=\"+JSON.stringify(t))}},function(t,e,n){function r(t){if(t)return o(t)}function o(t){for(var e in r.prototype)t[e]=r.prototype[e];return t}t.exports=r,r.prototype.on=r.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[\"$\"+t]=this._callbacks[\"$\"+t]||[]).push(e),this},r.prototype.once=function(t,e){function n(){this.off(t,n),e.apply(this,arguments)}return n.fn=e,this.on(t,n),this},r.prototype.off=r.prototype.removeListener=r.prototype.removeAllListeners=r.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var n=this._callbacks[\"$\"+t];if(!n)return this;if(1==arguments.length)return delete this._callbacks[\"$\"+t],this;for(var r,o=0;o<n.length;o++)if(r=n[o],r===e||r.fn===e){n.splice(o,1);break}return this},r.prototype.emit=function(t){this._callbacks=this._callbacks||{};var e=[].slice.call(arguments,1),n=this._callbacks[\"$\"+t];if(n){n=n.slice(0);for(var r=0,o=n.length;r<o;++r)n[r].apply(this,e)}return this},r.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[\"$\"+t]||[]},r.prototype.hasListeners=function(t){return!!this.listeners(t).length}},function(t,e,n){function r(t,e){if(!t)return t;if(s(t)){var n={_placeholder:!0,num:e.length};return e.push(t),n}if(i(t)){for(var o=new Array(t.length),a=0;a<t.length;a++)o[a]=r(t[a],e);return o}if(\"object\"==typeof t&&!(t instanceof Date)){var o={};for(var c in t)o[c]=r(t[c],e);return o}return t}function o(t,e){if(!t)return t;if(t&&t._placeholder)return e[t.num];if(i(t))for(var n=0;n<t.length;n++)t[n]=o(t[n],e);else if(\"object\"==typeof t)for(var r in t)t[r]=o(t[r],e);return t}var i=n(13),s=n(14),a=Object.prototype.toString,c=\"function\"==typeof Blob||\"undefined\"!=typeof Blob&&\"[object BlobConstructor]\"===a.call(Blob),u=\"function\"==typeof File||\"undefined\"!=typeof File&&\"[object FileConstructor]\"===a.call(File);e.deconstructPacket=function(t){var e=[],n=t.data,o=t;return o.data=r(n,e),o.attachments=e.length,{packet:o,buffers:e}},e.reconstructPacket=function(t,e){return t.data=o(t.data,e),t.attachments=void 0,t},e.removeBlobs=function(t,e){function n(t,a,p){if(!t)return t;if(c&&t instanceof Blob||u&&t instanceof File){r++;var h=new FileReader;h.onload=function(){p?p[a]=this.result:o=this.result,--r||e(o)},h.readAsArrayBuffer(t)}else if(i(t))for(var f=0;f<t.length;f++)n(t[f],f,t);else if(\"object\"==typeof t&&!s(t))for(var l in t)n(t[l],l,t)}var r=0,o=t;n(o),r||e(o)}},function(t,e){var n={}.toString;t.exports=Array.isArray||function(t){return\"[object Array]\"==n.call(t)}},function(t,e){function n(t){return r&&Buffer.isBuffer(t)||o&&(t instanceof ArrayBuffer||i(t))}t.exports=n;var r=\"function\"==typeof Buffer&&\"function\"==typeof Buffer.isBuffer,o=\"function\"==typeof ArrayBuffer,i=function(t){return\"function\"==typeof ArrayBuffer.isView?ArrayBuffer.isView(t):t.buffer instanceof ArrayBuffer}},function(t,e,n){function r(t,e){if(!(this instanceof r))return new r(t,e);t&&\"object\"==typeof t&&(e=t,t=void 0),e=e||{},e.path=e.path||\"/socket.io\",this.nsps={},this.subs=[],this.opts=e,this.reconnection(e.reconnection!==!1),this.reconnectionAttempts(e.reconnectionAttempts||1/0),this.reconnectionDelay(e.reconnectionDelay||1e3),this.reconnectionDelayMax(e.reconnectionDelayMax||5e3),this.randomizationFactor(e.randomizationFactor||.5),this.backoff=new f({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()}),this.timeout(null==e.timeout?2e4:e.timeout),this.readyState=\"closed\",this.uri=t,this.connecting=[],this.lastPing=null,this.encoding=!1,this.packetBuffer=[];var n=e.parser||a;this.encoder=new n.Encoder,this.decoder=new n.Decoder,this.autoConnect=e.autoConnect!==!1,this.autoConnect&&this.open()}var o=n(16),i=n(39),s=n(11),a=n(7),c=n(41),u=n(42),p=n(3)(\"socket.io-client:manager\"),h=n(38),f=n(43),l=Object.prototype.hasOwnProperty;t.exports=r,r.prototype.emitAll=function(){this.emit.apply(this,arguments);for(var t in this.nsps)l.call(this.nsps,t)&&this.nsps[t].emit.apply(this.nsps[t],arguments)},r.prototype.updateSocketIds=function(){for(var t in this.nsps)l.call(this.nsps,t)&&(this.nsps[t].id=this.generateId(t))},r.prototype.generateId=function(t){return(\"/\"===t?\"\":t+\"#\")+this.engine.id},s(r.prototype),r.prototype.reconnection=function(t){return arguments.length?(this._reconnection=!!t,this):this._reconnection},r.prototype.reconnectionAttempts=function(t){return arguments.length?(this._reconnectionAttempts=t,this):this._reconnectionAttempts},r.prototype.reconnectionDelay=function(t){return arguments.length?(this._reconnectionDelay=t,this.backoff&&this.backoff.setMin(t),this):this._reconnectionDelay},r.prototype.randomizationFactor=function(t){return arguments.length?(this._randomizationFactor=t,this.backoff&&this.backoff.setJitter(t),this):this._randomizationFactor},r.prototype.reconnectionDelayMax=function(t){return arguments.length?(this._reconnectionDelayMax=t,this.backoff&&this.backoff.setMax(t),this):this._reconnectionDelayMax},r.prototype.timeout=function(t){return arguments.length?(this._timeout=t,this):this._timeout},r.prototype.maybeReconnectOnOpen=function(){!this.reconnecting&&this._reconnection&&0===this.backoff.attempts&&this.reconnect()},r.prototype.open=r.prototype.connect=function(t,e){if(p(\"readyState %s\",this.readyState),~this.readyState.indexOf(\"open\"))return this;p(\"opening %s\",this.uri),this.engine=o(this.uri,this.opts);var n=this.engine,r=this;this.readyState=\"opening\",this.skipReconnect=!1;var i=c(n,\"open\",function(){r.onopen(),t&&t()}),s=c(n,\"error\",function(e){if(p(\"connect_error\"),r.cleanup(),r.readyState=\"closed\",r.emitAll(\"connect_error\",e),t){var n=new Error(\"Connection error\");n.data=e,t(n)}else r.maybeReconnectOnOpen()});if(!1!==this._timeout){var a=this._timeout;p(\"connect attempt will timeout after %d\",a);var u=setTimeout(function(){p(\"connect attempt timed out after %d\",a),i.destroy(),n.close(),n.emit(\"error\",\"timeout\"),r.emitAll(\"connect_timeout\",a)},a);this.subs.push({destroy:function(){clearTimeout(u)}})}return this.subs.push(i),this.subs.push(s),this},r.prototype.onopen=function(){p(\"open\"),this.cleanup(),this.readyState=\"open\",this.emit(\"open\");var t=this.engine;this.subs.push(c(t,\"data\",u(this,\"ondata\"))),this.subs.push(c(t,\"ping\",u(this,\"onping\"))),this.subs.push(c(t,\"pong\",u(this,\"onpong\"))),this.subs.push(c(t,\"error\",u(this,\"onerror\"))),this.subs.push(c(t,\"close\",u(this,\"onclose\"))),this.subs.push(c(this.decoder,\"decoded\",u(this,\"ondecoded\")))},r.prototype.onping=function(){this.lastPing=new Date,this.emitAll(\"ping\")},r.prototype.onpong=function(){this.emitAll(\"pong\",new Date-this.lastPing)},r.prototype.ondata=function(t){this.decoder.add(t)},r.prototype.ondecoded=function(t){this.emit(\"packet\",t)},r.prototype.onerror=function(t){p(\"error\",t),this.emitAll(\"error\",t)},r.prototype.socket=function(t,e){function n(){~h(o.connecting,r)||o.connecting.push(r)}var r=this.nsps[t];if(!r){r=new i(this,t,e),this.nsps[t]=r;var o=this;r.on(\"connecting\",n),r.on(\"connect\",function(){r.id=o.generateId(t)}),this.autoConnect&&n()}return r},r.prototype.destroy=function(t){var e=h(this.connecting,t);~e&&this.connecting.splice(e,1),this.connecting.length||this.close()},r.prototype.packet=function(t){p(\"writing packet %j\",t);var e=this;t.query&&0===t.type&&(t.nsp+=\"?\"+t.query),e.encoding?e.packetBuffer.push(t):(e.encoding=!0,this.encoder.encode(t,function(n){for(var r=0;r<n.length;r++)e.engine.write(n[r],t.options);e.encoding=!1,e.processPacketQueue()}))},r.prototype.processPacketQueue=function(){if(this.packetBuffer.length>0&&!this.encoding){var t=this.packetBuffer.shift();this.packet(t)}},r.prototype.cleanup=function(){p(\"cleanup\");for(var t=this.subs.length,e=0;e<t;e++){var n=this.subs.shift();n.destroy()}this.packetBuffer=[],this.encoding=!1,this.lastPing=null,this.decoder.destroy()},r.prototype.close=r.prototype.disconnect=function(){p(\"disconnect\"),this.skipReconnect=!0,this.reconnecting=!1,\"opening\"===this.readyState&&this.cleanup(),this.backoff.reset(),this.readyState=\"closed\",this.engine&&this.engine.close()},r.prototype.onclose=function(t){p(\"onclose\"),this.cleanup(),this.backoff.reset(),this.readyState=\"closed\",this.emit(\"close\",t),this._reconnection&&!this.skipReconnect&&this.reconnect()},r.prototype.reconnect=function(){if(this.reconnecting||this.skipReconnect)return this;var t=this;if(this.backoff.attempts>=this._reconnectionAttempts)p(\"reconnect failed\"),this.backoff.reset(),this.emitAll(\"reconnect_failed\"),this.reconnecting=!1;else{var e=this.backoff.duration();p(\"will wait %dms before reconnect attempt\",e),this.reconnecting=!0;var n=setTimeout(function(){t.skipReconnect||(p(\"attempting reconnect\"),t.emitAll(\"reconnect_attempt\",t.backoff.attempts),t.emitAll(\"reconnecting\",t.backoff.attempts),t.skipReconnect||t.open(function(e){e?(p(\"reconnect attempt error\"),t.reconnecting=!1,t.reconnect(),t.emitAll(\"reconnect_error\",e.data)):(p(\"reconnect success\"),t.onreconnect())}))},e);this.subs.push({destroy:function(){clearTimeout(n)}})}},r.prototype.onreconnect=function(){var t=this.backoff.attempts;this.reconnecting=!1,this.backoff.reset(),this.updateSocketIds(),this.emitAll(\"reconnect\",t)}},function(t,e,n){t.exports=n(17),t.exports.parser=n(24)},function(t,e,n){function r(t,e){return this instanceof r?(e=e||{},t&&\"object\"==typeof t&&(e=t,t=null),t?(t=p(t),e.hostname=t.host,e.secure=\"https\"===t.protocol||\"wss\"===t.protocol,e.port=t.port,t.query&&(e.query=t.query)):e.host&&(e.hostname=p(e.host).host),this.secure=null!=e.secure?e.secure:\"undefined\"!=typeof location&&\"https:\"===location.protocol,e.hostname&&!e.port&&(e.port=this.secure?\"443\":\"80\"),this.agent=e.agent||!1,this.hostname=e.hostname||(\"undefined\"!=typeof location?location.hostname:\"localhost\"),this.port=e.port||(\"undefined\"!=typeof location&&location.port?location.port:this.secure?443:80),this.query=e.query||{},\"string\"==typeof this.query&&(this.query=h.decode(this.query)),this.upgrade=!1!==e.upgrade,this.path=(e.path||\"/engine.io\").replace(/\\/$/,\"\")+\"/\",this.forceJSONP=!!e.forceJSONP,this.jsonp=!1!==e.jsonp,this.forceBase64=!!e.forceBase64,this.enablesXDR=!!e.enablesXDR,this.withCredentials=!1!==e.withCredentials,this.timestampParam=e.timestampParam||\"t\",this.timestampRequests=e.timestampRequests,this.transports=e.transports||[\"polling\",\"websocket\"],this.transportOptions=e.transportOptions||{},this.readyState=\"\",this.writeBuffer=[],this.prevBufferLen=0,this.policyPort=e.policyPort||843,this.rememberUpgrade=e.rememberUpgrade||!1,this.binaryType=null,this.onlyBinaryUpgrades=e.onlyBinaryUpgrades,this.perMessageDeflate=!1!==e.perMessageDeflate&&(e.perMessageDeflate||{}),!0===this.perMessageDeflate&&(this.perMessageDeflate={}),this.perMessageDeflate&&null==this.perMessageDeflate.threshold&&(this.perMessageDeflate.threshold=1024),this.pfx=e.pfx||null,this.key=e.key||null,this.passphrase=e.passphrase||null,this.cert=e.cert||null,this.ca=e.ca||null,this.ciphers=e.ciphers||null,this.rejectUnauthorized=void 0===e.rejectUnauthorized||e.rejectUnauthorized,this.forceNode=!!e.forceNode,this.isReactNative=\"undefined\"!=typeof navigator&&\"string\"==typeof navigator.product&&\"reactnative\"===navigator.product.toLowerCase(),(\"undefined\"==typeof self||this.isReactNative)&&(e.extraHeaders&&Object.keys(e.extraHeaders).length>0&&(this.extraHeaders=e.extraHeaders),e.localAddress&&(this.localAddress=e.localAddress)),this.id=null,this.upgrades=null,this.pingInterval=null,this.pingTimeout=null,this.pingIntervalTimer=null,this.pingTimeoutTimer=null,void this.open()):new r(t,e)}function o(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}var i=n(18),s=n(11),a=n(3)(\"engine.io-client:socket\"),c=n(38),u=n(24),p=n(2),h=n(32);t.exports=r,r.priorWebsocketSuccess=!1,s(r.prototype),r.protocol=u.protocol,r.Socket=r,r.Transport=n(23),r.transports=n(18),r.parser=n(24),r.prototype.createTransport=function(t){a('creating transport \"%s\"',t);var e=o(this.query);e.EIO=u.protocol,e.transport=t;var n=this.transportOptions[t]||{};this.id&&(e.sid=this.id);var r=new i[t]({query:e,socket:this,agent:n.agent||this.agent,hostname:n.hostname||this.hostname,port:n.port||this.port,secure:n.secure||this.secure,path:n.path||this.path,forceJSONP:n.forceJSONP||this.forceJSONP,jsonp:n.jsonp||this.jsonp,forceBase64:n.forceBase64||this.forceBase64,enablesXDR:n.enablesXDR||this.enablesXDR,withCredentials:n.withCredentials||this.withCredentials,timestampRequests:n.timestampRequests||this.timestampRequests,timestampParam:n.timestampParam||this.timestampParam,policyPort:n.policyPort||this.policyPort,pfx:n.pfx||this.pfx,key:n.key||this.key,passphrase:n.passphrase||this.passphrase,cert:n.cert||this.cert,ca:n.ca||this.ca,ciphers:n.ciphers||this.ciphers,rejectUnauthorized:n.rejectUnauthorized||this.rejectUnauthorized,perMessageDeflate:n.perMessageDeflate||this.perMessageDeflate,extraHeaders:n.extraHeaders||this.extraHeaders,forceNode:n.forceNode||this.forceNode,localAddress:n.localAddress||this.localAddress,requestTimeout:n.requestTimeout||this.requestTimeout,protocols:n.protocols||void 0,isReactNative:this.isReactNative});return r},r.prototype.open=function(){var t;if(this.rememberUpgrade&&r.priorWebsocketSuccess&&this.transports.indexOf(\"websocket\")!==-1)t=\"websocket\";else{\nif(0===this.transports.length){var e=this;return void setTimeout(function(){e.emit(\"error\",\"No transports available\")},0)}t=this.transports[0]}this.readyState=\"opening\";try{t=this.createTransport(t)}catch(n){return this.transports.shift(),void this.open()}t.open(),this.setTransport(t)},r.prototype.setTransport=function(t){a(\"setting transport %s\",t.name);var e=this;this.transport&&(a(\"clearing existing transport %s\",this.transport.name),this.transport.removeAllListeners()),this.transport=t,t.on(\"drain\",function(){e.onDrain()}).on(\"packet\",function(t){e.onPacket(t)}).on(\"error\",function(t){e.onError(t)}).on(\"close\",function(){e.onClose(\"transport close\")})},r.prototype.probe=function(t){function e(){if(f.onlyBinaryUpgrades){var e=!this.supportsBinary&&f.transport.supportsBinary;h=h||e}h||(a('probe transport \"%s\" opened',t),p.send([{type:\"ping\",data:\"probe\"}]),p.once(\"packet\",function(e){if(!h)if(\"pong\"===e.type&&\"probe\"===e.data){if(a('probe transport \"%s\" pong',t),f.upgrading=!0,f.emit(\"upgrading\",p),!p)return;r.priorWebsocketSuccess=\"websocket\"===p.name,a('pausing current transport \"%s\"',f.transport.name),f.transport.pause(function(){h||\"closed\"!==f.readyState&&(a(\"changing transport and sending upgrade packet\"),u(),f.setTransport(p),p.send([{type:\"upgrade\"}]),f.emit(\"upgrade\",p),p=null,f.upgrading=!1,f.flush())})}else{a('probe transport \"%s\" failed',t);var n=new Error(\"probe error\");n.transport=p.name,f.emit(\"upgradeError\",n)}}))}function n(){h||(h=!0,u(),p.close(),p=null)}function o(e){var r=new Error(\"probe error: \"+e);r.transport=p.name,n(),a('probe transport \"%s\" failed because of error: %s',t,e),f.emit(\"upgradeError\",r)}function i(){o(\"transport closed\")}function s(){o(\"socket closed\")}function c(t){p&&t.name!==p.name&&(a('\"%s\" works - aborting \"%s\"',t.name,p.name),n())}function u(){p.removeListener(\"open\",e),p.removeListener(\"error\",o),p.removeListener(\"close\",i),f.removeListener(\"close\",s),f.removeListener(\"upgrading\",c)}a('probing transport \"%s\"',t);var p=this.createTransport(t,{probe:1}),h=!1,f=this;r.priorWebsocketSuccess=!1,p.once(\"open\",e),p.once(\"error\",o),p.once(\"close\",i),this.once(\"close\",s),this.once(\"upgrading\",c),p.open()},r.prototype.onOpen=function(){if(a(\"socket open\"),this.readyState=\"open\",r.priorWebsocketSuccess=\"websocket\"===this.transport.name,this.emit(\"open\"),this.flush(),\"open\"===this.readyState&&this.upgrade&&this.transport.pause){a(\"starting upgrade probes\");for(var t=0,e=this.upgrades.length;t<e;t++)this.probe(this.upgrades[t])}},r.prototype.onPacket=function(t){if(\"opening\"===this.readyState||\"open\"===this.readyState||\"closing\"===this.readyState)switch(a('socket receive: type \"%s\", data \"%s\"',t.type,t.data),this.emit(\"packet\",t),this.emit(\"heartbeat\"),t.type){case\"open\":this.onHandshake(JSON.parse(t.data));break;case\"pong\":this.setPing(),this.emit(\"pong\");break;case\"error\":var e=new Error(\"server error\");e.code=t.data,this.onError(e);break;case\"message\":this.emit(\"data\",t.data),this.emit(\"message\",t.data)}else a('packet received with socket readyState \"%s\"',this.readyState)},r.prototype.onHandshake=function(t){this.emit(\"handshake\",t),this.id=t.sid,this.transport.query.sid=t.sid,this.upgrades=this.filterUpgrades(t.upgrades),this.pingInterval=t.pingInterval,this.pingTimeout=t.pingTimeout,this.onOpen(),\"closed\"!==this.readyState&&(this.setPing(),this.removeListener(\"heartbeat\",this.onHeartbeat),this.on(\"heartbeat\",this.onHeartbeat))},r.prototype.onHeartbeat=function(t){clearTimeout(this.pingTimeoutTimer);var e=this;e.pingTimeoutTimer=setTimeout(function(){\"closed\"!==e.readyState&&e.onClose(\"ping timeout\")},t||e.pingInterval+e.pingTimeout)},r.prototype.setPing=function(){var t=this;clearTimeout(t.pingIntervalTimer),t.pingIntervalTimer=setTimeout(function(){a(\"writing ping packet - expecting pong within %sms\",t.pingTimeout),t.ping(),t.onHeartbeat(t.pingTimeout)},t.pingInterval)},r.prototype.ping=function(){var t=this;this.sendPacket(\"ping\",function(){t.emit(\"ping\")})},r.prototype.onDrain=function(){this.writeBuffer.splice(0,this.prevBufferLen),this.prevBufferLen=0,0===this.writeBuffer.length?this.emit(\"drain\"):this.flush()},r.prototype.flush=function(){\"closed\"!==this.readyState&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length&&(a(\"flushing %d packets in socket\",this.writeBuffer.length),this.transport.send(this.writeBuffer),this.prevBufferLen=this.writeBuffer.length,this.emit(\"flush\"))},r.prototype.write=r.prototype.send=function(t,e,n){return this.sendPacket(\"message\",t,e,n),this},r.prototype.sendPacket=function(t,e,n,r){if(\"function\"==typeof e&&(r=e,e=void 0),\"function\"==typeof n&&(r=n,n=null),\"closing\"!==this.readyState&&\"closed\"!==this.readyState){n=n||{},n.compress=!1!==n.compress;var o={type:t,data:e,options:n};this.emit(\"packetCreate\",o),this.writeBuffer.push(o),r&&this.once(\"flush\",r),this.flush()}},r.prototype.close=function(){function t(){r.onClose(\"forced close\"),a(\"socket closing - telling transport to close\"),r.transport.close()}function e(){r.removeListener(\"upgrade\",e),r.removeListener(\"upgradeError\",e),t()}function n(){r.once(\"upgrade\",e),r.once(\"upgradeError\",e)}if(\"opening\"===this.readyState||\"open\"===this.readyState){this.readyState=\"closing\";var r=this;this.writeBuffer.length?this.once(\"drain\",function(){this.upgrading?n():t()}):this.upgrading?n():t()}return this},r.prototype.onError=function(t){a(\"socket error %j\",t),r.priorWebsocketSuccess=!1,this.emit(\"error\",t),this.onClose(\"transport error\",t)},r.prototype.onClose=function(t,e){if(\"opening\"===this.readyState||\"open\"===this.readyState||\"closing\"===this.readyState){a('socket close with reason: \"%s\"',t);var n=this;clearTimeout(this.pingIntervalTimer),clearTimeout(this.pingTimeoutTimer),this.transport.removeAllListeners(\"close\"),this.transport.close(),this.transport.removeAllListeners(),this.readyState=\"closed\",this.id=null,this.emit(\"close\",t,e),n.writeBuffer=[],n.prevBufferLen=0}},r.prototype.filterUpgrades=function(t){for(var e=[],n=0,r=t.length;n<r;n++)~c(this.transports,t[n])&&e.push(t[n]);return e}},function(t,e,n){function r(t){var e,n=!1,r=!1,a=!1!==t.jsonp;if(\"undefined\"!=typeof location){var c=\"https:\"===location.protocol,u=location.port;u||(u=c?443:80),n=t.hostname!==location.hostname||u!==t.port,r=t.secure!==c}if(t.xdomain=n,t.xscheme=r,e=new o(t),\"open\"in e&&!t.forceJSONP)return new i(t);if(!a)throw new Error(\"JSONP disabled\");return new s(t)}var o=n(19),i=n(21),s=n(35),a=n(36);e.polling=r,e.websocket=a},function(t,e,n){var r=n(20);t.exports=function(t){var e=t.xdomain,n=t.xscheme,o=t.enablesXDR;try{if(\"undefined\"!=typeof XMLHttpRequest&&(!e||r))return new XMLHttpRequest}catch(i){}try{if(\"undefined\"!=typeof XDomainRequest&&!n&&o)return new XDomainRequest}catch(i){}if(!e)try{return new(self[[\"Active\"].concat(\"Object\").join(\"X\")])(\"Microsoft.XMLHTTP\")}catch(i){}}},function(t,e){try{t.exports=\"undefined\"!=typeof XMLHttpRequest&&\"withCredentials\"in new XMLHttpRequest}catch(n){t.exports=!1}},function(t,e,n){function r(){}function o(t){if(c.call(this,t),this.requestTimeout=t.requestTimeout,this.extraHeaders=t.extraHeaders,\"undefined\"!=typeof location){var e=\"https:\"===location.protocol,n=location.port;n||(n=e?443:80),this.xd=\"undefined\"!=typeof location&&t.hostname!==location.hostname||n!==t.port,this.xs=t.secure!==e}}function i(t){this.method=t.method||\"GET\",this.uri=t.uri,this.xd=!!t.xd,this.xs=!!t.xs,this.async=!1!==t.async,this.data=void 0!==t.data?t.data:null,this.agent=t.agent,this.isBinary=t.isBinary,this.supportsBinary=t.supportsBinary,this.enablesXDR=t.enablesXDR,this.withCredentials=t.withCredentials,this.requestTimeout=t.requestTimeout,this.pfx=t.pfx,this.key=t.key,this.passphrase=t.passphrase,this.cert=t.cert,this.ca=t.ca,this.ciphers=t.ciphers,this.rejectUnauthorized=t.rejectUnauthorized,this.extraHeaders=t.extraHeaders,this.create()}function s(){for(var t in i.requests)i.requests.hasOwnProperty(t)&&i.requests[t].abort()}var a=n(19),c=n(22),u=n(11),p=n(33),h=n(3)(\"engine.io-client:polling-xhr\");if(t.exports=o,t.exports.Request=i,p(o,c),o.prototype.supportsBinary=!0,o.prototype.request=function(t){return t=t||{},t.uri=this.uri(),t.xd=this.xd,t.xs=this.xs,t.agent=this.agent||!1,t.supportsBinary=this.supportsBinary,t.enablesXDR=this.enablesXDR,t.withCredentials=this.withCredentials,t.pfx=this.pfx,t.key=this.key,t.passphrase=this.passphrase,t.cert=this.cert,t.ca=this.ca,t.ciphers=this.ciphers,t.rejectUnauthorized=this.rejectUnauthorized,t.requestTimeout=this.requestTimeout,t.extraHeaders=this.extraHeaders,new i(t)},o.prototype.doWrite=function(t,e){var n=\"string\"!=typeof t&&void 0!==t,r=this.request({method:\"POST\",data:t,isBinary:n}),o=this;r.on(\"success\",e),r.on(\"error\",function(t){o.onError(\"xhr post error\",t)}),this.sendXhr=r},o.prototype.doPoll=function(){h(\"xhr poll\");var t=this.request(),e=this;t.on(\"data\",function(t){e.onData(t)}),t.on(\"error\",function(t){e.onError(\"xhr poll error\",t)}),this.pollXhr=t},u(i.prototype),i.prototype.create=function(){var t={agent:this.agent,xdomain:this.xd,xscheme:this.xs,enablesXDR:this.enablesXDR};t.pfx=this.pfx,t.key=this.key,t.passphrase=this.passphrase,t.cert=this.cert,t.ca=this.ca,t.ciphers=this.ciphers,t.rejectUnauthorized=this.rejectUnauthorized;var e=this.xhr=new a(t),n=this;try{h(\"xhr open %s: %s\",this.method,this.uri),e.open(this.method,this.uri,this.async);try{if(this.extraHeaders){e.setDisableHeaderCheck&&e.setDisableHeaderCheck(!0);for(var r in this.extraHeaders)this.extraHeaders.hasOwnProperty(r)&&e.setRequestHeader(r,this.extraHeaders[r])}}catch(o){}if(\"POST\"===this.method)try{this.isBinary?e.setRequestHeader(\"Content-type\",\"application/octet-stream\"):e.setRequestHeader(\"Content-type\",\"text/plain;charset=UTF-8\")}catch(o){}try{e.setRequestHeader(\"Accept\",\"*/*\")}catch(o){}\"withCredentials\"in e&&(e.withCredentials=this.withCredentials),this.requestTimeout&&(e.timeout=this.requestTimeout),this.hasXDR()?(e.onload=function(){n.onLoad()},e.onerror=function(){n.onError(e.responseText)}):e.onreadystatechange=function(){if(2===e.readyState)try{var t=e.getResponseHeader(\"Content-Type\");(n.supportsBinary&&\"application/octet-stream\"===t||\"application/octet-stream; charset=UTF-8\"===t)&&(e.responseType=\"arraybuffer\")}catch(r){}4===e.readyState&&(200===e.status||1223===e.status?n.onLoad():setTimeout(function(){n.onError(\"number\"==typeof e.status?e.status:0)},0))},h(\"xhr data %s\",this.data),e.send(this.data)}catch(o){return void setTimeout(function(){n.onError(o)},0)}\"undefined\"!=typeof document&&(this.index=i.requestsCount++,i.requests[this.index]=this)},i.prototype.onSuccess=function(){this.emit(\"success\"),this.cleanup()},i.prototype.onData=function(t){this.emit(\"data\",t),this.onSuccess()},i.prototype.onError=function(t){this.emit(\"error\",t),this.cleanup(!0)},i.prototype.cleanup=function(t){if(\"undefined\"!=typeof this.xhr&&null!==this.xhr){if(this.hasXDR()?this.xhr.onload=this.xhr.onerror=r:this.xhr.onreadystatechange=r,t)try{this.xhr.abort()}catch(e){}\"undefined\"!=typeof document&&delete i.requests[this.index],this.xhr=null}},i.prototype.onLoad=function(){var t;try{var e;try{e=this.xhr.getResponseHeader(\"Content-Type\")}catch(n){}t=\"application/octet-stream\"===e||\"application/octet-stream; charset=UTF-8\"===e?this.xhr.response||this.xhr.responseText:this.xhr.responseText}catch(n){this.onError(n)}null!=t&&this.onData(t)},i.prototype.hasXDR=function(){return\"undefined\"!=typeof XDomainRequest&&!this.xs&&this.enablesXDR},i.prototype.abort=function(){this.cleanup()},i.requestsCount=0,i.requests={},\"undefined\"!=typeof document)if(\"function\"==typeof attachEvent)attachEvent(\"onunload\",s);else if(\"function\"==typeof addEventListener){var f=\"onpagehide\"in self?\"pagehide\":\"unload\";addEventListener(f,s,!1)}},function(t,e,n){function r(t){var e=t&&t.forceBase64;p&&!e||(this.supportsBinary=!1),o.call(this,t)}var o=n(23),i=n(32),s=n(24),a=n(33),c=n(34),u=n(3)(\"engine.io-client:polling\");t.exports=r;var p=function(){var t=n(19),e=new t({xdomain:!1});return null!=e.responseType}();a(r,o),r.prototype.name=\"polling\",r.prototype.doOpen=function(){this.poll()},r.prototype.pause=function(t){function e(){u(\"paused\"),n.readyState=\"paused\",t()}var n=this;if(this.readyState=\"pausing\",this.polling||!this.writable){var r=0;this.polling&&(u(\"we are currently polling - waiting to pause\"),r++,this.once(\"pollComplete\",function(){u(\"pre-pause polling complete\"),--r||e()})),this.writable||(u(\"we are currently writing - waiting to pause\"),r++,this.once(\"drain\",function(){u(\"pre-pause writing complete\"),--r||e()}))}else e()},r.prototype.poll=function(){u(\"polling\"),this.polling=!0,this.doPoll(),this.emit(\"poll\")},r.prototype.onData=function(t){var e=this;u(\"polling got data %s\",t);var n=function(t,n,r){return\"opening\"===e.readyState&&e.onOpen(),\"close\"===t.type?(e.onClose(),!1):void e.onPacket(t)};s.decodePayload(t,this.socket.binaryType,n),\"closed\"!==this.readyState&&(this.polling=!1,this.emit(\"pollComplete\"),\"open\"===this.readyState?this.poll():u('ignoring poll - transport state \"%s\"',this.readyState))},r.prototype.doClose=function(){function t(){u(\"writing close packet\"),e.write([{type:\"close\"}])}var e=this;\"open\"===this.readyState?(u(\"transport open - closing\"),t()):(u(\"transport not open - deferring close\"),this.once(\"open\",t))},r.prototype.write=function(t){var e=this;this.writable=!1;var n=function(){e.writable=!0,e.emit(\"drain\")};s.encodePayload(t,this.supportsBinary,function(t){e.doWrite(t,n)})},r.prototype.uri=function(){var t=this.query||{},e=this.secure?\"https\":\"http\",n=\"\";!1!==this.timestampRequests&&(t[this.timestampParam]=c()),this.supportsBinary||t.sid||(t.b64=1),t=i.encode(t),this.port&&(\"https\"===e&&443!==Number(this.port)||\"http\"===e&&80!==Number(this.port))&&(n=\":\"+this.port),t.length&&(t=\"?\"+t);var r=this.hostname.indexOf(\":\")!==-1;return e+\"://\"+(r?\"[\"+this.hostname+\"]\":this.hostname)+n+this.path+t}},function(t,e,n){function r(t){this.path=t.path,this.hostname=t.hostname,this.port=t.port,this.secure=t.secure,this.query=t.query,this.timestampParam=t.timestampParam,this.timestampRequests=t.timestampRequests,this.readyState=\"\",this.agent=t.agent||!1,this.socket=t.socket,this.enablesXDR=t.enablesXDR,this.withCredentials=t.withCredentials,this.pfx=t.pfx,this.key=t.key,this.passphrase=t.passphrase,this.cert=t.cert,this.ca=t.ca,this.ciphers=t.ciphers,this.rejectUnauthorized=t.rejectUnauthorized,this.forceNode=t.forceNode,this.isReactNative=t.isReactNative,this.extraHeaders=t.extraHeaders,this.localAddress=t.localAddress}var o=n(24),i=n(11);t.exports=r,i(r.prototype),r.prototype.onError=function(t,e){var n=new Error(t);return n.type=\"TransportError\",n.description=e,this.emit(\"error\",n),this},r.prototype.open=function(){return\"closed\"!==this.readyState&&\"\"!==this.readyState||(this.readyState=\"opening\",this.doOpen()),this},r.prototype.close=function(){return\"opening\"!==this.readyState&&\"open\"!==this.readyState||(this.doClose(),this.onClose()),this},r.prototype.send=function(t){if(\"open\"!==this.readyState)throw new Error(\"Transport not open\");this.write(t)},r.prototype.onOpen=function(){this.readyState=\"open\",this.writable=!0,this.emit(\"open\")},r.prototype.onData=function(t){var e=o.decodePacket(t,this.socket.binaryType);this.onPacket(e)},r.prototype.onPacket=function(t){this.emit(\"packet\",t)},r.prototype.onClose=function(){this.readyState=\"closed\",this.emit(\"close\")}},function(t,e,n){function r(t,n){var r=\"b\"+e.packets[t.type]+t.data.data;return n(r)}function o(t,n,r){if(!n)return e.encodeBase64Packet(t,r);var o=t.data,i=new Uint8Array(o),s=new Uint8Array(1+o.byteLength);s[0]=v[t.type];for(var a=0;a<i.length;a++)s[a+1]=i[a];return r(s.buffer)}function i(t,n,r){if(!n)return e.encodeBase64Packet(t,r);var o=new FileReader;return o.onload=function(){e.encodePacket({type:t.type,data:o.result},n,!0,r)},o.readAsArrayBuffer(t.data)}function s(t,n,r){if(!n)return e.encodeBase64Packet(t,r);if(g)return i(t,n,r);var o=new Uint8Array(1);o[0]=v[t.type];var s=new w([o.buffer,t.data]);return r(s)}function a(t){try{t=d.decode(t,{strict:!1})}catch(e){return!1}return t}function c(t,e,n){for(var r=new Array(t.length),o=l(t.length,n),i=function(t,n,o){e(n,function(e,n){r[t]=n,o(e,r)})},s=0;s<t.length;s++)i(s,t[s],o)}var u,p=n(25),h=n(26),f=n(27),l=n(28),d=n(29);\"undefined\"!=typeof ArrayBuffer&&(u=n(30));var y=\"undefined\"!=typeof navigator&&/Android/i.test(navigator.userAgent),m=\"undefined\"!=typeof navigator&&/PhantomJS/i.test(navigator.userAgent),g=y||m;e.protocol=3;var v=e.packets={open:0,close:1,ping:2,pong:3,message:4,upgrade:5,noop:6},b=p(v),C={type:\"error\",data:\"parser error\"},w=n(31);e.encodePacket=function(t,e,n,i){\"function\"==typeof e&&(i=e,e=!1),\"function\"==typeof n&&(i=n,n=null);var a=void 0===t.data?void 0:t.data.buffer||t.data;if(\"undefined\"!=typeof ArrayBuffer&&a instanceof ArrayBuffer)return o(t,e,i);if(\"undefined\"!=typeof w&&a instanceof w)return s(t,e,i);if(a&&a.base64)return r(t,i);var c=v[t.type];return void 0!==t.data&&(c+=n?d.encode(String(t.data),{strict:!1}):String(t.data)),i(\"\"+c)},e.encodeBase64Packet=function(t,n){var r=\"b\"+e.packets[t.type];if(\"undefined\"!=typeof w&&t.data instanceof w){var o=new FileReader;return o.onload=function(){var t=o.result.split(\",\")[1];n(r+t)},o.readAsDataURL(t.data)}var i;try{i=String.fromCharCode.apply(null,new Uint8Array(t.data))}catch(s){for(var a=new Uint8Array(t.data),c=new Array(a.length),u=0;u<a.length;u++)c[u]=a[u];i=String.fromCharCode.apply(null,c)}return r+=btoa(i),n(r)},e.decodePacket=function(t,n,r){if(void 0===t)return C;if(\"string\"==typeof t){if(\"b\"===t.charAt(0))return e.decodeBase64Packet(t.substr(1),n);if(r&&(t=a(t),t===!1))return C;var o=t.charAt(0);return Number(o)==o&&b[o]?t.length>1?{type:b[o],data:t.substring(1)}:{type:b[o]}:C}var i=new Uint8Array(t),o=i[0],s=f(t,1);return w&&\"blob\"===n&&(s=new w([s])),{type:b[o],data:s}},e.decodeBase64Packet=function(t,e){var n=b[t.charAt(0)];if(!u)return{type:n,data:{base64:!0,data:t.substr(1)}};var r=u.decode(t.substr(1));return\"blob\"===e&&w&&(r=new w([r])),{type:n,data:r}},e.encodePayload=function(t,n,r){function o(t){return t.length+\":\"+t}function i(t,r){e.encodePacket(t,!!s&&n,!1,function(t){r(null,o(t))})}\"function\"==typeof n&&(r=n,n=null);var s=h(t);return n&&s?w&&!g?e.encodePayloadAsBlob(t,r):e.encodePayloadAsArrayBuffer(t,r):t.length?void c(t,i,function(t,e){return r(e.join(\"\"))}):r(\"0:\")},e.decodePayload=function(t,n,r){if(\"string\"!=typeof t)return e.decodePayloadAsBinary(t,n,r);\"function\"==typeof n&&(r=n,n=null);var o;if(\"\"===t)return r(C,0,1);for(var i,s,a=\"\",c=0,u=t.length;c<u;c++){var p=t.charAt(c);if(\":\"===p){if(\"\"===a||a!=(i=Number(a)))return r(C,0,1);if(s=t.substr(c+1,i),a!=s.length)return r(C,0,1);if(s.length){if(o=e.decodePacket(s,n,!1),C.type===o.type&&C.data===o.data)return r(C,0,1);var h=r(o,c+i,u);if(!1===h)return}c+=i,a=\"\"}else a+=p}return\"\"!==a?r(C,0,1):void 0},e.encodePayloadAsArrayBuffer=function(t,n){function r(t,n){e.encodePacket(t,!0,!0,function(t){return n(null,t)})}return t.length?void c(t,r,function(t,e){var r=e.reduce(function(t,e){var n;return n=\"string\"==typeof e?e.length:e.byteLength,t+n.toString().length+n+2},0),o=new Uint8Array(r),i=0;return e.forEach(function(t){var e=\"string\"==typeof t,n=t;if(e){for(var r=new Uint8Array(t.length),s=0;s<t.length;s++)r[s]=t.charCodeAt(s);n=r.buffer}e?o[i++]=0:o[i++]=1;for(var a=n.byteLength.toString(),s=0;s<a.length;s++)o[i++]=parseInt(a[s]);o[i++]=255;for(var r=new Uint8Array(n),s=0;s<r.length;s++)o[i++]=r[s]}),n(o.buffer)}):n(new ArrayBuffer(0))},e.encodePayloadAsBlob=function(t,n){function r(t,n){e.encodePacket(t,!0,!0,function(t){var e=new Uint8Array(1);if(e[0]=1,\"string\"==typeof t){for(var r=new Uint8Array(t.length),o=0;o<t.length;o++)r[o]=t.charCodeAt(o);t=r.buffer,e[0]=0}for(var i=t instanceof ArrayBuffer?t.byteLength:t.size,s=i.toString(),a=new Uint8Array(s.length+1),o=0;o<s.length;o++)a[o]=parseInt(s[o]);if(a[s.length]=255,w){var c=new w([e.buffer,a.buffer,t]);n(null,c)}})}c(t,r,function(t,e){return n(new w(e))})},e.decodePayloadAsBinary=function(t,n,r){\"function\"==typeof n&&(r=n,n=null);for(var o=t,i=[];o.byteLength>0;){for(var s=new Uint8Array(o),a=0===s[0],c=\"\",u=1;255!==s[u];u++){if(c.length>310)return r(C,0,1);c+=s[u]}o=f(o,2+c.length),c=parseInt(c);var p=f(o,0,c);if(a)try{p=String.fromCharCode.apply(null,new Uint8Array(p))}catch(h){var l=new Uint8Array(p);p=\"\";for(var u=0;u<l.length;u++)p+=String.fromCharCode(l[u])}i.push(p),o=f(o,c)}var d=i.length;i.forEach(function(t,o){r(e.decodePacket(t,n,!0),o,d)})}},function(t,e){t.exports=Object.keys||function(t){var e=[],n=Object.prototype.hasOwnProperty;for(var r in t)n.call(t,r)&&e.push(r);return e}},function(t,e,n){function r(t){if(!t||\"object\"!=typeof t)return!1;if(o(t)){for(var e=0,n=t.length;e<n;e++)if(r(t[e]))return!0;return!1}if(\"function\"==typeof Buffer&&Buffer.isBuffer&&Buffer.isBuffer(t)||\"function\"==typeof ArrayBuffer&&t instanceof ArrayBuffer||s&&t instanceof Blob||a&&t instanceof File)return!0;if(t.toJSON&&\"function\"==typeof t.toJSON&&1===arguments.length)return r(t.toJSON(),!0);for(var i in t)if(Object.prototype.hasOwnProperty.call(t,i)&&r(t[i]))return!0;return!1}var o=n(13),i=Object.prototype.toString,s=\"function\"==typeof Blob||\"undefined\"!=typeof Blob&&\"[object BlobConstructor]\"===i.call(Blob),a=\"function\"==typeof File||\"undefined\"!=typeof File&&\"[object FileConstructor]\"===i.call(File);t.exports=r},function(t,e){t.exports=function(t,e,n){var r=t.byteLength;if(e=e||0,n=n||r,t.slice)return t.slice(e,n);if(e<0&&(e+=r),n<0&&(n+=r),n>r&&(n=r),e>=r||e>=n||0===r)return new ArrayBuffer(0);for(var o=new Uint8Array(t),i=new Uint8Array(n-e),s=e,a=0;s<n;s++,a++)i[a]=o[s];return i.buffer}},function(t,e){function n(t,e,n){function o(t,r){if(o.count<=0)throw new Error(\"after called too many times\");--o.count,t?(i=!0,e(t),e=n):0!==o.count||i||e(null,r)}var i=!1;return n=n||r,o.count=t,0===t?e():o}function r(){}t.exports=n},function(t,e){function n(t){for(var e,n,r=[],o=0,i=t.length;o<i;)e=t.charCodeAt(o++),e>=55296&&e<=56319&&o<i?(n=t.charCodeAt(o++),56320==(64512&n)?r.push(((1023&e)<<10)+(1023&n)+65536):(r.push(e),o--)):r.push(e);return r}function r(t){for(var e,n=t.length,r=-1,o=\"\";++r<n;)e=t[r],e>65535&&(e-=65536,o+=d(e>>>10&1023|55296),e=56320|1023&e),o+=d(e);return o}function o(t,e){if(t>=55296&&t<=57343){if(e)throw Error(\"Lone surrogate U+\"+t.toString(16).toUpperCase()+\" is not a scalar value\");return!1}return!0}function i(t,e){return d(t>>e&63|128)}function s(t,e){if(0==(4294967168&t))return d(t);var n=\"\";return 0==(4294965248&t)?n=d(t>>6&31|192):0==(4294901760&t)?(o(t,e)||(t=65533),n=d(t>>12&15|224),n+=i(t,6)):0==(4292870144&t)&&(n=d(t>>18&7|240),n+=i(t,12),n+=i(t,6)),n+=d(63&t|128)}function a(t,e){e=e||{};for(var r,o=!1!==e.strict,i=n(t),a=i.length,c=-1,u=\"\";++c<a;)r=i[c],u+=s(r,o);return u}function c(){if(l>=f)throw Error(\"Invalid byte index\");var t=255&h[l];if(l++,128==(192&t))return 63&t;throw Error(\"Invalid continuation byte\")}function u(t){var e,n,r,i,s;if(l>f)throw Error(\"Invalid byte index\");if(l==f)return!1;if(e=255&h[l],l++,0==(128&e))return e;if(192==(224&e)){if(n=c(),s=(31&e)<<6|n,s>=128)return s;throw Error(\"Invalid continuation byte\")}if(224==(240&e)){if(n=c(),r=c(),s=(15&e)<<12|n<<6|r,s>=2048)return o(s,t)?s:65533;throw Error(\"Invalid continuation byte\")}if(240==(248&e)&&(n=c(),r=c(),i=c(),s=(7&e)<<18|n<<12|r<<6|i,s>=65536&&s<=1114111))return s;throw Error(\"Invalid UTF-8 detected\")}function p(t,e){e=e||{};var o=!1!==e.strict;h=n(t),f=h.length,l=0;for(var i,s=[];(i=u(o))!==!1;)s.push(i);return r(s)}/*! https://mths.be/utf8js v2.1.2 by @mathias */\nvar h,f,l,d=String.fromCharCode;t.exports={version:\"2.1.2\",encode:a,decode:p}},function(t,e){!function(){\"use strict\";for(var t=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",n=new Uint8Array(256),r=0;r<t.length;r++)n[t.charCodeAt(r)]=r;e.encode=function(e){var n,r=new Uint8Array(e),o=r.length,i=\"\";for(n=0;n<o;n+=3)i+=t[r[n]>>2],i+=t[(3&r[n])<<4|r[n+1]>>4],i+=t[(15&r[n+1])<<2|r[n+2]>>6],i+=t[63&r[n+2]];return o%3===2?i=i.substring(0,i.length-1)+\"=\":o%3===1&&(i=i.substring(0,i.length-2)+\"==\"),i},e.decode=function(t){var e,r,o,i,s,a=.75*t.length,c=t.length,u=0;\"=\"===t[t.length-1]&&(a--,\"=\"===t[t.length-2]&&a--);var p=new ArrayBuffer(a),h=new Uint8Array(p);for(e=0;e<c;e+=4)r=n[t.charCodeAt(e)],o=n[t.charCodeAt(e+1)],i=n[t.charCodeAt(e+2)],s=n[t.charCodeAt(e+3)],h[u++]=r<<2|o>>4,h[u++]=(15&o)<<4|i>>2,h[u++]=(3&i)<<6|63&s;return p}}()},function(t,e){function n(t){return t.map(function(t){if(t.buffer instanceof ArrayBuffer){var e=t.buffer;if(t.byteLength!==e.byteLength){var n=new Uint8Array(t.byteLength);n.set(new Uint8Array(e,t.byteOffset,t.byteLength)),e=n.buffer}return e}return t})}function r(t,e){e=e||{};var r=new i;return n(t).forEach(function(t){r.append(t)}),e.type?r.getBlob(e.type):r.getBlob()}function o(t,e){return new Blob(n(t),e||{})}var i=\"undefined\"!=typeof i?i:\"undefined\"!=typeof WebKitBlobBuilder?WebKitBlobBuilder:\"undefined\"!=typeof MSBlobBuilder?MSBlobBuilder:\"undefined\"!=typeof MozBlobBuilder&&MozBlobBuilder,s=function(){try{var t=new Blob([\"hi\"]);return 2===t.size}catch(e){return!1}}(),a=s&&function(){try{var t=new Blob([new Uint8Array([1,2])]);return 2===t.size}catch(e){return!1}}(),c=i&&i.prototype.append&&i.prototype.getBlob;\"undefined\"!=typeof Blob&&(r.prototype=Blob.prototype,o.prototype=Blob.prototype),t.exports=function(){return s?a?Blob:o:c?r:void 0}()},function(t,e){e.encode=function(t){var e=\"\";for(var n in t)t.hasOwnProperty(n)&&(e.length&&(e+=\"&\"),e+=encodeURIComponent(n)+\"=\"+encodeURIComponent(t[n]));return e},e.decode=function(t){for(var e={},n=t.split(\"&\"),r=0,o=n.length;r<o;r++){var i=n[r].split(\"=\");e[decodeURIComponent(i[0])]=decodeURIComponent(i[1])}return e}},function(t,e){t.exports=function(t,e){var n=function(){};n.prototype=e.prototype,t.prototype=new n,t.prototype.constructor=t}},function(t,e){\"use strict\";function n(t){var e=\"\";do e=s[t%a]+e,t=Math.floor(t/a);while(t>0);return e}function r(t){var e=0;for(p=0;p<t.length;p++)e=e*a+c[t.charAt(p)];return e}function o(){var t=n(+new Date);return t!==i?(u=0,i=t):t+\".\"+n(u++)}for(var i,s=\"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_\".split(\"\"),a=64,c={},u=0,p=0;p<a;p++)c[s[p]]=p;o.encode=n,o.decode=r,t.exports=o},function(t,e,n){(function(e){function r(){}function o(){return\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:\"undefined\"!=typeof e?e:{}}function i(t){if(s.call(this,t),this.query=this.query||{},!c){var e=o();c=e.___eio=e.___eio||[]}this.index=c.length;var n=this;c.push(function(t){n.onData(t)}),this.query.j=this.index,\"function\"==typeof addEventListener&&addEventListener(\"beforeunload\",function(){n.script&&(n.script.onerror=r)},!1)}var s=n(22),a=n(33);t.exports=i;var c,u=/\\n/g,p=/\\\\n/g;a(i,s),i.prototype.supportsBinary=!1,i.prototype.doClose=function(){this.script&&(this.script.parentNode.removeChild(this.script),this.script=null),this.form&&(this.form.parentNode.removeChild(this.form),this.form=null,this.iframe=null),s.prototype.doClose.call(this)},i.prototype.doPoll=function(){var t=this,e=document.createElement(\"script\");this.script&&(this.script.parentNode.removeChild(this.script),this.script=null),e.async=!0,e.src=this.uri(),e.onerror=function(e){t.onError(\"jsonp poll error\",e)};var n=document.getElementsByTagName(\"script\")[0];n?n.parentNode.insertBefore(e,n):(document.head||document.body).appendChild(e),this.script=e;var r=\"undefined\"!=typeof navigator&&/gecko/i.test(navigator.userAgent);r&&setTimeout(function(){var t=document.createElement(\"iframe\");document.body.appendChild(t),document.body.removeChild(t)},100)},i.prototype.doWrite=function(t,e){function n(){r(),e()}function r(){if(o.iframe)try{o.form.removeChild(o.iframe)}catch(t){o.onError(\"jsonp polling iframe removal error\",t)}try{var e='<iframe src=\"javascript:0\" name=\"'+o.iframeId+'\">';i=document.createElement(e)}catch(t){i=document.createElement(\"iframe\"),i.name=o.iframeId,i.src=\"javascript:0\"}i.id=o.iframeId,o.form.appendChild(i),o.iframe=i}var o=this;if(!this.form){var i,s=document.createElement(\"form\"),a=document.createElement(\"textarea\"),c=this.iframeId=\"eio_iframe_\"+this.index;s.className=\"socketio\",s.style.position=\"absolute\",s.style.top=\"-1000px\",s.style.left=\"-1000px\",s.target=c,s.method=\"POST\",s.setAttribute(\"accept-charset\",\"utf-8\"),a.name=\"d\",s.appendChild(a),document.body.appendChild(s),this.form=s,this.area=a}this.form.action=this.uri(),r(),t=t.replace(p,\"\\\\\\n\"),this.area.value=t.replace(u,\"\\\\n\");try{this.form.submit()}catch(h){}this.iframe.attachEvent?this.iframe.onreadystatechange=function(){\"complete\"===o.iframe.readyState&&n()}:this.iframe.onload=n}}).call(e,function(){return this}())},function(t,e,n){function r(t){var e=t&&t.forceBase64;e&&(this.supportsBinary=!1),this.perMessageDeflate=t.perMessageDeflate,this.usingBrowserWebSocket=o&&!t.forceNode,this.protocols=t.protocols,this.usingBrowserWebSocket||(l=i),s.call(this,t)}var o,i,s=n(23),a=n(24),c=n(32),u=n(33),p=n(34),h=n(3)(\"engine.io-client:websocket\");if(\"undefined\"!=typeof WebSocket?o=WebSocket:\"undefined\"!=typeof self&&(o=self.WebSocket||self.MozWebSocket),\"undefined\"==typeof window)try{i=n(37)}catch(f){}var l=o||i;t.exports=r,u(r,s),r.prototype.name=\"websocket\",r.prototype.supportsBinary=!0,r.prototype.doOpen=function(){if(this.check()){var t=this.uri(),e=this.protocols,n={agent:this.agent,perMessageDeflate:this.perMessageDeflate};n.pfx=this.pfx,n.key=this.key,n.passphrase=this.passphrase,n.cert=this.cert,n.ca=this.ca,n.ciphers=this.ciphers,n.rejectUnauthorized=this.rejectUnauthorized,this.extraHeaders&&(n.headers=this.extraHeaders),this.localAddress&&(n.localAddress=this.localAddress);try{this.ws=this.usingBrowserWebSocket&&!this.isReactNative?e?new l(t,e):new l(t):new l(t,e,n)}catch(r){return this.emit(\"error\",r)}void 0===this.ws.binaryType&&(this.supportsBinary=!1),this.ws.supports&&this.ws.supports.binary?(this.supportsBinary=!0,this.ws.binaryType=\"nodebuffer\"):this.ws.binaryType=\"arraybuffer\",this.addEventListeners()}},r.prototype.addEventListeners=function(){var t=this;this.ws.onopen=function(){t.onOpen()},this.ws.onclose=function(){t.onClose()},this.ws.onmessage=function(e){t.onData(e.data)},this.ws.onerror=function(e){t.onError(\"websocket error\",e)}},r.prototype.write=function(t){function e(){n.emit(\"flush\"),setTimeout(function(){n.writable=!0,n.emit(\"drain\")},0)}var n=this;this.writable=!1;for(var r=t.length,o=0,i=r;o<i;o++)!function(t){a.encodePacket(t,n.supportsBinary,function(o){if(!n.usingBrowserWebSocket){var i={};if(t.options&&(i.compress=t.options.compress),n.perMessageDeflate){var s=\"string\"==typeof o?Buffer.byteLength(o):o.length;s<n.perMessageDeflate.threshold&&(i.compress=!1)}}try{n.usingBrowserWebSocket?n.ws.send(o):n.ws.send(o,i)}catch(a){h(\"websocket closed before onclose event\")}--r||e()})}(t[o])},r.prototype.onClose=function(){s.prototype.onClose.call(this)},r.prototype.doClose=function(){\"undefined\"!=typeof this.ws&&this.ws.close()},r.prototype.uri=function(){var t=this.query||{},e=this.secure?\"wss\":\"ws\",n=\"\";this.port&&(\"wss\"===e&&443!==Number(this.port)||\"ws\"===e&&80!==Number(this.port))&&(n=\":\"+this.port),this.timestampRequests&&(t[this.timestampParam]=p()),this.supportsBinary||(t.b64=1),t=c.encode(t),t.length&&(t=\"?\"+t);var r=this.hostname.indexOf(\":\")!==-1;return e+\"://\"+(r?\"[\"+this.hostname+\"]\":this.hostname)+n+this.path+t},r.prototype.check=function(){return!(!l||\"__initialize\"in l&&this.name===r.prototype.name)}},function(t,e){},function(t,e){var n=[].indexOf;t.exports=function(t,e){if(n)return t.indexOf(e);for(var r=0;r<t.length;++r)if(t[r]===e)return r;return-1}},function(t,e,n){function r(t,e,n){this.io=t,this.nsp=e,this.json=this,this.ids=0,this.acks={},this.receiveBuffer=[],this.sendBuffer=[],this.connected=!1,this.disconnected=!0,this.flags={},n&&n.query&&(this.query=n.query),this.io.autoConnect&&this.open()}var o=n(7),i=n(11),s=n(40),a=n(41),c=n(42),u=n(3)(\"socket.io-client:socket\"),p=n(32),h=n(26);t.exports=e=r;var f={connect:1,connect_error:1,connect_timeout:1,connecting:1,disconnect:1,error:1,reconnect:1,reconnect_attempt:1,reconnect_failed:1,reconnect_error:1,reconnecting:1,ping:1,pong:1},l=i.prototype.emit;i(r.prototype),r.prototype.subEvents=function(){if(!this.subs){var t=this.io;this.subs=[a(t,\"open\",c(this,\"onopen\")),a(t,\"packet\",c(this,\"onpacket\")),a(t,\"close\",c(this,\"onclose\"))]}},r.prototype.open=r.prototype.connect=function(){return this.connected?this:(this.subEvents(),this.io.open(),\"open\"===this.io.readyState&&this.onopen(),this.emit(\"connecting\"),this)},r.prototype.send=function(){var t=s(arguments);return t.unshift(\"message\"),this.emit.apply(this,t),this},r.prototype.emit=function(t){if(f.hasOwnProperty(t))return l.apply(this,arguments),this;var e=s(arguments),n={type:(void 0!==this.flags.binary?this.flags.binary:h(e))?o.BINARY_EVENT:o.EVENT,data:e};return n.options={},n.options.compress=!this.flags||!1!==this.flags.compress,\"function\"==typeof e[e.length-1]&&(u(\"emitting packet with ack id %d\",this.ids),this.acks[this.ids]=e.pop(),n.id=this.ids++),this.connected?this.packet(n):this.sendBuffer.push(n),this.flags={},this},r.prototype.packet=function(t){t.nsp=this.nsp,this.io.packet(t)},r.prototype.onopen=function(){if(u(\"transport is open - connecting\"),\"/\"!==this.nsp)if(this.query){var t=\"object\"==typeof this.query?p.encode(this.query):this.query;u(\"sending connect packet with query %s\",t),this.packet({type:o.CONNECT,query:t})}else this.packet({type:o.CONNECT})},r.prototype.onclose=function(t){u(\"close (%s)\",t),this.connected=!1,this.disconnected=!0,delete this.id,this.emit(\"disconnect\",t)},r.prototype.onpacket=function(t){var e=t.nsp===this.nsp,n=t.type===o.ERROR&&\"/\"===t.nsp;if(e||n)switch(t.type){case o.CONNECT:this.onconnect();break;case o.EVENT:this.onevent(t);break;case o.BINARY_EVENT:this.onevent(t);break;case o.ACK:this.onack(t);break;case o.BINARY_ACK:this.onack(t);break;case o.DISCONNECT:this.ondisconnect();break;case o.ERROR:this.emit(\"error\",t.data)}},r.prototype.onevent=function(t){var e=t.data||[];u(\"emitting event %j\",e),null!=t.id&&(u(\"attaching ack callback to event\"),e.push(this.ack(t.id))),this.connected?l.apply(this,e):this.receiveBuffer.push(e)},r.prototype.ack=function(t){var e=this,n=!1;return function(){if(!n){n=!0;var r=s(arguments);u(\"sending ack %j\",r),e.packet({type:h(r)?o.BINARY_ACK:o.ACK,id:t,data:r})}}},r.prototype.onack=function(t){var e=this.acks[t.id];\"function\"==typeof e?(u(\"calling ack %s with %j\",t.id,t.data),e.apply(this,t.data),delete this.acks[t.id]):u(\"bad ack %s\",t.id)},r.prototype.onconnect=function(){this.connected=!0,this.disconnected=!1,this.emit(\"connect\"),this.emitBuffered()},r.prototype.emitBuffered=function(){var t;for(t=0;t<this.receiveBuffer.length;t++)l.apply(this,this.receiveBuffer[t]);for(this.receiveBuffer=[],t=0;t<this.sendBuffer.length;t++)this.packet(this.sendBuffer[t]);this.sendBuffer=[]},r.prototype.ondisconnect=function(){u(\"server disconnect (%s)\",this.nsp),this.destroy(),this.onclose(\"io server disconnect\")},r.prototype.destroy=function(){if(this.subs){for(var t=0;t<this.subs.length;t++)this.subs[t].destroy();this.subs=null}this.io.destroy(this)},r.prototype.close=r.prototype.disconnect=function(){return this.connected&&(u(\"performing disconnect (%s)\",this.nsp),this.packet({type:o.DISCONNECT})),this.destroy(),this.connected&&this.onclose(\"io client disconnect\"),this},r.prototype.compress=function(t){return this.flags.compress=t,this},r.prototype.binary=function(t){return this.flags.binary=t,this}},function(t,e){function n(t,e){var n=[];e=e||0;for(var r=e||0;r<t.length;r++)n[r-e]=t[r];return n}t.exports=n},function(t,e){function n(t,e,n){return t.on(e,n),{destroy:function(){t.removeListener(e,n)}}}t.exports=n},function(t,e){var n=[].slice;t.exports=function(t,e){if(\"string\"==typeof e&&(e=t[e]),\"function\"!=typeof e)throw new Error(\"bind() requires a function\");var r=n.call(arguments,2);return function(){return e.apply(t,r.concat(n.call(arguments)))}}},function(t,e){function n(t){t=t||{},this.ms=t.min||100,this.max=t.max||1e4,this.factor=t.factor||2,this.jitter=t.jitter>0&&t.jitter<=1?t.jitter:0,this.attempts=0}t.exports=n,n.prototype.duration=function(){var t=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var e=Math.random(),n=Math.floor(e*this.jitter*t);t=0==(1&Math.floor(10*e))?t-n:t+n}return 0|Math.min(t,this.max)},n.prototype.reset=function(){this.attempts=0},n.prototype.setMin=function(t){this.ms=t},n.prototype.setMax=function(t){this.max=t},n.prototype.setJitter=function(t){this.jitter=t}}])});\n//# sourceMappingURL=socket.io.js.map"
  },
  {
    "path": "app/tools/1231B119.pem",
    "content": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmDMEXjMkUBYJKwYBBAHaRw8BAQdAFD5n6LecvYdEOn65nCjOvn/C2bco7JPkGg2a\nxY0rGoa0NEtsb2FrIEluZm9ybWF0aW9uIFRlY2hub2xvZ2llcyBJbmMuIDxub2Rl\nQEtsb2FrLmFwcD6IeAQQFgoAIAUCXjMkUAYLCQcIAwIEFQgKAgQWAgEAAhkBAhsD\nAh4BAAoJEIZGYoUSMbEZH4sA/06bmj/UPFTsEnsL20hJqNs3hgf9/3cSSoCLTLix\nBM93AP9LlfBWMgUtF5N1Aah6pDABTtgCAk+dlODe1vh8PuwHB9HfxN/CARAAAQEA\nAAAAAAAAAAAAAAD/2P/gABBKRklGAAEBAABIAEgAAP/hAExFeGlmAABNTQAqAAAA\nCAABh2kABAAAAAEAAAAaAAAAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAD4oAMA\nBAAAAAEAAAD6AAAAAP/tADhQaG90b3Nob3AgMy4wADhCSU0EBAAAAAAAADhCSU0E\nJQAAAAAAENQdjNmPALIE6YAJmOz4Qn7/wgARCAD6APgDASIAAhEBAxEB/8QAHwAA\nAQUBAQEBAQEAAAAAAAAAAwIEAQUABgcICQoL/8QAwxAAAQMDAgQDBAYEBwYECAZz\nAQIAAxEEEiEFMRMiEAZBUTIUYXEjB4EgkUIVoVIzsSRiMBbBctFDkjSCCOFTQCVj\nFzXwk3OiUESyg/EmVDZklHTCYNKEoxhw4idFN2WzVXWklcOF8tNGdoDjR1ZmtAkK\nGRooKSo4OTpISUpXWFlaZ2hpand4eXqGh4iJipCWl5iZmqClpqeoqaqwtba3uLm6\nwMTFxsfIycrQ1NXW19jZ2uDk5ebn6Onq8/T19vf4+fr/xAAfAQADAQEBAQEBAQEB\nAAAAAAABAgADBAUGBwgJCgv/xADDEQACAgEDAwMCAwUCBQIEBIcBAAIRAxASIQQg\nMUETBTAiMlEUQAYzI2FCFXFSNIFQJJGhQ7EWB2I1U/DRJWDBROFy8ReCYzZwJkVU\nkiei0ggJChgZGigpKjc4OTpGR0hJSlVWV1hZWmRlZmdoaWpzdHV2d3h5eoCDhIWG\nh4iJipCTlJWWl5iZmqCjpKWmp6ipqrCys7S1tre4ubrAwsPExcbHyMnK0NPU1dbX\n2Nna4OLj5OXm5+jp6vLz9PX29/j5+v/bAEMADAwMDAwMFAwMFB0UFBQdJx0dHR0n\n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\nPT17OWXpUfDuuSaA+2Px8WMtc9trMDIiGCEM\n=mdDQ\n-----END PGP PUBLIC KEY BLOCK-----"
  },
  {
    "path": "app/tools/coNETConnect.js",
    "content": "\"use strict\";\n/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Imap = require(\"./imap\");\nconst Tool = require(\"./initSystem\");\nconst Fs = require(\"fs\");\nlet logFileFlag = 'w';\nconst saveLog = (err, _console = false) => {\n    if (!err) {\n        return;\n    }\n    const data = `${new Date().toUTCString()}: ${typeof err === 'object' ? (err['message'] ? err['message'] : '') : err}\\r\\n`;\n    _console ? console.log(data) : null;\n    return Fs.appendFile(Tool.CoNETConnectLog, data, { flag: logFileFlag }, () => {\n        return logFileFlag = 'a';\n    });\n};\nconst timeOutWhenSendConnectRequestMail = 1000 * 60;\nconst commandRequestTimeOutTime = 1000 * 10;\nconst requestTimeOut = 1000 * 60;\nclass default_1 extends Imap.imapPeer {\n    constructor(imapData, sockerServer, sentConnectMail, nodeEmailAddress, openKeyOption, publicKey, cmdResponse, _exit) {\n        super(imapData, imapData.clientFolder, imapData.serverFolder, err => {\n            console.debug(`imapPeer doing exit! err =`, err);\n            this.sockerServer.emit('tryConnectCoNETStage', null, -2);\n            return this.exit1(err);\n        });\n        this.imapData = imapData;\n        this.sockerServer = sockerServer;\n        this.sentConnectMail = sentConnectMail;\n        this.nodeEmailAddress = nodeEmailAddress;\n        this.openKeyOption = openKeyOption;\n        this.publicKey = publicKey;\n        this.cmdResponse = cmdResponse;\n        this._exit = _exit;\n        this.CoNETConnectReady = false;\n        this.connectStage = -1;\n        this.alreadyExit = false;\n        this.timeoutWaitAfterSentrequestMail = null;\n        saveLog(`=====================================  new CoNET connect()`, true);\n        this.sockerServer.emit('tryConnectCoNETStage', null, 5);\n        this.newMail = (mail, hashCode) => {\n            return this.cmdResponse(mail, hashCode);\n        };\n        this.on('CoNETConnected', publicKey => {\n            this.CoNETConnectReady = true;\n            this.sentConnectMail = false;\n            saveLog('Connected CoNET!', true);\n            //console.log ( publicKey )\n            clearTimeout(this.timeoutWaitAfterSentrequestMail);\n            this.connectStage = 4;\n            this.sockerServer.emit('tryConnectCoNETStage', null, 4, publicKey);\n            return;\n        });\n        this.on('pingTimeOut', () => {\n            console.log(`class CoNETConnect on pingTimeOut`);\n            if (this.sentConnectMail) {\n                return;\n            }\n            this.sentConnectMail = true;\n            this.sockerServer.emit('tryConnectCoNETStage', null, 3);\n            return this.sendRequestMail();\n        });\n        this.on('ping', () => {\n            this.sockerServer.emit('tryConnectCoNETStage', null, 1);\n            this.sockerServer.emit('tryConnectCoNETStage', null, 2);\n            if (sentConnectMail) {\n                console.log(`CoNETConnect class sentConnectMail = true`);\n                this.sockerServer.emit('tryConnectCoNETStage', null, 3);\n                return this.sendRequestMail();\n            }\n        });\n    }\n    exit1(err) {\n        console.trace(`imapPeer doing exit! this.sockerServer.emit ( 'tryConnectCoNETStage', null, -1 )`);\n        this.sockerServer.emit('tryConnectCoNETStage', null, -1);\n        if (!this.alreadyExit) {\n            this.alreadyExit = true;\n            console.log(`CoNETConnect class exit1 doing this._exit() success!`);\n            return this._exit(err);\n        }\n        console.log(`exit1 cancel already Exit [${err}]`);\n    }\n    setTimeWaitAfterSentrequestMail() {\n        this.timeoutWaitAfterSentrequestMail = setTimeout(() => {\n            return this.sockerServer.emit('tryConnectCoNETStage', null, 0);\n        }, 1000 * 60 * 1.5);\n    }\n    sendRequestMail() {\n        return Tool.sendCoNETConnectRequestEmail(this.imapData, this.openKeyOption, this.publicKey, this.nodeEmailAddress, (err) => {\n            if (err) {\n                return console.log(`Imap.imapPeer sentConnectMail got Error!`);\n            }\n            this.setTimeWaitAfterSentrequestMail();\n        });\n    }\n    requestCoNET_v1(uuid, text, CallBack) {\n        return this.sendDataToANewUuidFolder(Buffer.from(text).toString('base64'), this.imapData.serverFolder, uuid, CallBack);\n    }\n    getFile(fileName, CallBack) {\n        let callback = false;\n        if (this.alreadyExit) {\n            return CallBack(new Error('alreadyExit'));\n        }\n        const rImap = new Imap.qtGateImapRead(this.imapData, fileName, true, mail => {\n            const attr = Imap.getMailAttached(mail);\n            CallBack(null, attr);\n            callback = true;\n            return rImap.logout();\n        });\n        rImap.once('error', err => {\n            rImap.destroyAll(null);\n            return this.getFile(fileName, CallBack);\n        });\n        rImap.once('end', () => {\n            return console.log(`Connect Class GetFile_rImap on end!`);\n        });\n    }\n}\nexports.default = default_1;\n"
  },
  {
    "path": "app/tools/coNETConnect.ts",
    "content": "/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as Imap from './imap'\nimport { randomBytes } from 'crypto'\nimport * as Tool from './initSystem'\nimport * as Fs from 'fs'\nimport * as Async from 'async'\n\n\nlet logFileFlag = 'w'\nconst saveLog = ( err: {} | string, _console = false ) => {\n\tif ( !err ) {\n\t\treturn \n\t}\n\tconst data = `${ new Date().toUTCString () }: ${ typeof err === 'object' ? ( err['message'] ? err['message'] : '' ) : err }\\r\\n`\n\t_console ? console.log ( data ) : null\n\treturn Fs.appendFile ( Tool.CoNETConnectLog, data, { flag: logFileFlag }, () => {\n\t\treturn logFileFlag = 'a'\n\t})\n}\nconst timeOutWhenSendConnectRequestMail = 1000 * 60\nconst commandRequestTimeOutTime = 1000 * 10\nconst requestTimeOut = 1000 * 60\n\nexport default class extends Imap.imapPeer {\n\tprivate CoNETConnectReady = false\n\tpublic connectStage = -1\n\tpublic alreadyExit = false\n\tprivate timeoutWaitAfterSentrequestMail:NodeJS.Timeout = null\n\n\tpublic exit1 ( err ) {\n\t\tconsole.trace (`imapPeer doing exit! this.sockerServer.emit ( 'tryConnectCoNETStage', null, -1 )`)\n\t\tthis.sockerServer.emit ( 'tryConnectCoNETStage', null, -1 )\n\t\tif ( !this.alreadyExit ) {\n\t\t\tthis.alreadyExit = true\n\t\t\tconsole.log (`CoNETConnect class exit1 doing this._exit() success!`)\n\t\t\treturn this._exit ( err )\n\t\t}\n\t\tconsole.log ( `exit1 cancel already Exit [${ err }]`)\n\t}\n\n\tpublic setTimeWaitAfterSentrequestMail () {\n\t\tthis.timeoutWaitAfterSentrequestMail = setTimeout (() => {\n\t\t\treturn this.sockerServer.emit ( 'tryConnectCoNETStage', null, 0 )\n\t\t}, 1000 * 60 * 1.5 )\n\t}\n\n\tpublic sendRequestMail () {\n\t\treturn Tool.sendCoNETConnectRequestEmail ( this.imapData, this.openKeyOption, this.publicKey, this.nodeEmailAddress, ( err: Error ) => {\n\t\t\tif ( err ) {\n\t\t\t\treturn console.log ( `Imap.imapPeer sentConnectMail got Error!`)\n\t\t\t}\n\t\t\tthis.setTimeWaitAfterSentrequestMail ()\n\t\t})\n\t}\n\n\n\n\tconstructor ( public imapData: IinputData, private sockerServer, private sentConnectMail,  private nodeEmailAddress, private openKeyOption: any, private publicKey: string, \n\t\tprivate cmdResponse: ( mail: string, hashCode: string ) => void, public _exit: ( err ) => void ) {\n\t\tsuper ( imapData, imapData.clientFolder, imapData.serverFolder, err => {\n\t\t\tconsole.debug (`imapPeer doing exit! err =`, err )\n\t\t\tthis.sockerServer.emit ( 'tryConnectCoNETStage', null, -2 )\n\t\t\treturn this.exit1 ( err )\n\t\t})\n\n\t\tsaveLog (`=====================================  new CoNET connect()`, true )\n\t\tthis.sockerServer.emit ( 'tryConnectCoNETStage', null, 5 )\n\t\tthis.newMail = ( mail: string, hashCode: string ) => {\n\t\t\treturn this.cmdResponse ( mail, hashCode )\n\t\t}\n\n\t\tthis.on ( 'CoNETConnected', publicKey => {\n\t\t\t\n\t\t\tthis.CoNETConnectReady = true\n\t\t\tthis.sentConnectMail = false\n\t\t\tsaveLog ( 'Connected CoNET!', true )\n\t\t\t//console.log ( publicKey )\n\t\t\tclearTimeout ( this.timeoutWaitAfterSentrequestMail )\n\t\t\tthis.connectStage = 4\n\t\t\tthis.sockerServer.emit ( 'tryConnectCoNETStage', null, 4, publicKey )\n\t\t\treturn \n\t\t})\n\n\t\tthis.on ( 'pingTimeOut', () => {\n\n\t\t\tconsole.log ( `class CoNETConnect on pingTimeOut` )\n\t\t\tif ( this.sentConnectMail ) {\n\t\t\t\treturn \n\t\t\t}\n\t\t\tthis.sentConnectMail = true\n\t\t\tthis.sockerServer.emit ( 'tryConnectCoNETStage', null, 3 )\n\t\t\t\n\t\t\treturn this.sendRequestMail ()\n\t\t\t\n\n\t\t})\n\n\t\tthis.on ( 'ping', () => {\n\t\t\tthis.sockerServer.emit ( 'tryConnectCoNETStage', null, 1 )\n\t\t\tthis.sockerServer.emit ( 'tryConnectCoNETStage', null, 2 )\n\t\t\t\t\t\n\t\t\tif ( sentConnectMail ) {\n\t\t\t\tconsole.log (`CoNETConnect class sentConnectMail = true`)\n\t\t\t\tthis.sockerServer.emit ( 'tryConnectCoNETStage', null, 3 )\n\t\t\t\treturn this.sendRequestMail ()\n\t\t\t\t\n\t\t\t}\n\t\t})\n\t\t\n\t}\n\n\tpublic requestCoNET_v1 ( uuid: string, text: string, CallBack ) {\n\t\treturn this.sendDataToANewUuidFolder ( Buffer.from ( text).toString ( 'base64' ), this.imapData.serverFolder, uuid, CallBack )\n\n\t}\n\n\tpublic getFile ( fileName: string, CallBack ) {\n\t\tlet callback = false\n\t\tif ( this.alreadyExit ) {\n\t\t\treturn CallBack ( new Error ('alreadyExit'))\n\t\t}\n\n\t\tconst rImap: Imap.qtGateImapRead = new Imap.qtGateImapRead ( this.imapData, fileName, true, mail => {\n\t\t\t\n\t\t\t\n\t\t\tconst attr = Imap.getMailAttached ( mail )\n\t\t\t\n\t\t\tCallBack ( null, attr )\n\t\t\tcallback = true\n\t\t\treturn rImap.logout ()\n\t\t})\n\n\t\trImap.once ( 'error', err => {\n\t\t\trImap.destroyAll( null )\n\t\t\treturn this.getFile ( fileName, CallBack )\n\t\t})\n\n\t\trImap.once( 'end', () => {\n\t\t\treturn console.log (`Connect Class GetFile_rImap on end!`)\n\t\t})\n\n\t}\n}"
  },
  {
    "path": "app/tools/compress.js",
    "content": "\"use strict\";\n/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Crypto = require(\"crypto\");\nconst Async = require(\"async\");\nconst Stream = require(\"stream\");\nconst EOF = Buffer.from('\\r\\n\\r\\n', 'utf8');\nexports.encrypt = (text, masterkey, CallBack) => {\n    let salt = null;\n    Async.waterfall([\n        next => Crypto.randomBytes(64, next),\n        (_salt, next) => {\n            salt = _salt;\n            Crypto.pbkdf2(masterkey, salt, 2145, 32, 'sha512', next);\n        }\n    ], (err, derivedKey) => {\n        if (err)\n            return CallBack(err);\n        Crypto.randomBytes(12, (err1, iv) => {\n            if (err1)\n                return CallBack(err1);\n            const cipher = Crypto.createCipheriv('aes-256-gcm', derivedKey, iv);\n            let _text = Buffer.concat([Buffer.alloc(4, 0), text]);\n            _text.writeUInt32BE(text.length, 0);\n            if (text.length < 500) {\n                _text = Buffer.concat([_text, Buffer.alloc(100 + Math.random() * 1000)]);\n            }\n            const encrypted = Buffer.concat([cipher.update(_text), cipher.final()]);\n            const ret = Buffer.concat([salt, iv, cipher.getAuthTag(), encrypted]);\n            return CallBack(null, ret);\n        });\n    });\n};\n/**\n * Decrypts text by given key\n * @param String base64 encoded input data\n * @param Buffer masterkey\n * @returns String decrypted (original) text\n */\nexports.decrypt = (data, masterkey, CallBack) => {\n    if (!data || !data.length)\n        return CallBack(new Error('null'));\n    try {\n        // base64 decoding\n        // convert data to buffers\n        const salt = data.slice(0, 64);\n        const iv = data.slice(64, 76);\n        const tag = data.slice(76, 92);\n        const text = data.slice(92);\n        // derive key using; 32 byte key length\n        Crypto.pbkdf2(masterkey, salt, 2145, 32, 'sha512', (err, derivedKey) => {\n            if (err)\n                return CallBack(err);\n            // AES 256 GCM Mode\n            try {\n                const decipher = Crypto.createDecipheriv('aes-256-gcm', derivedKey, iv);\n                decipher.setAuthTag(tag);\n                const decrypted = Buffer.concat([decipher.update(text), decipher.final()]);\n                const leng = decrypted.slice(4, 4 + decrypted.readUInt32BE(0));\n                return CallBack(null, leng);\n            }\n            catch (ex) {\n                console.log(`decrypt catch error [${ex.message}]`);\n            }\n        });\n    }\n    catch (e) {\n        return CallBack(e);\n    }\n};\nexports.packetBuffer = (bit0, _serial, id, buffer) => {\n    const _buffer = Buffer.allocUnsafe(6);\n    _buffer.fill(0);\n    _buffer.writeUInt8(bit0, 0);\n    _buffer.writeUInt32BE(_serial, 1);\n    const uuid = Buffer.from(id);\n    _buffer.writeUInt8(id.length, 5);\n    if (buffer && buffer.length)\n        return Buffer.concat([_buffer, uuid, buffer]);\n    return Buffer.concat([_buffer, uuid]);\n};\nexports.openPacket = (buffer) => {\n    const idLength = buffer.readUInt8(5);\n    return {\n        command: buffer.readUInt8(0),\n        serial: buffer.readUInt32BE(1),\n        uuid: buffer.toString('utf8', 6, 6 + idLength),\n        buffer: buffer.slice(6 + idLength)\n    };\n};\nconst HTTP_HEADER = Buffer.from(`HTTP/1.1 200 OK\\r\\nDate: ${new Date().toUTCString()}\\r\\nContent-Type: text/html\\r\\nTransfer-Encoding: chunked\\r\\nConnection: keep-alive\\r\\nVary: Accept-Encoding\\r\\n\\r\\n`, 'utf8');\nconst HTTP_EOF = Buffer.from('\\r\\n\\r\\n', 'utf8');\nclass encryptStream extends Stream.Transform {\n    constructor(password, random, httpHeader) {\n        super();\n        this.password = password;\n        this.random = random;\n        this.httpHeader = httpHeader;\n        this.first = true;\n        this.derivedKey = null;\n    }\n    BlockBuffer(_buf) {\n        return Buffer.from(_buf.length.toString(16).toUpperCase() + '\\r\\n', 'utf8');\n    }\n    init(callback) {\n        return Async.waterfall([\n            next => Crypto.randomBytes(64, next),\n            (_salt, next) => {\n                this.salt = _salt;\n                Crypto.randomBytes(12, next);\n            },\n            (_iv, next) => {\n                this.iv = _iv;\n                Crypto.pbkdf2(this.password, this.salt, 2145, 32, 'sha512', next);\n            }\n        ], (err, derivedKey) => {\n            this.derivedKey = derivedKey;\n            return callback(err);\n        });\n    }\n    _transform(chunk, encode, cb) {\n        if (!this.derivedKey) {\n            return this.init(() => {\n                return this._transform(chunk, encode, cb);\n            });\n        }\n        const cipher = Crypto.createCipheriv('aes-256-gcm', this.derivedKey, this.iv);\n        let _text = Buffer.concat([Buffer.alloc(4, 0), chunk]);\n        _text.writeUInt32BE(chunk.length, 0);\n        if (chunk.length < this.random) {\n            _text = Buffer.concat([_text, Crypto.randomBytes(Math.round(Math.random() * 5000))]);\n        }\n        const _buf = Buffer.concat([cipher.update(_text), cipher.final()]);\n        const _buf1 = Buffer.concat([cipher.getAuthTag(), _buf]);\n        if (this.first) {\n            this.first = false;\n            const black = Buffer.concat([this.salt, this.iv, _buf1]).toString('base64');\n            if (!this.httpHeader) {\n                const _buf4 = Buffer.from(black, 'base64');\n                return cb(null, Buffer.concat([HTTP_HEADER, this.BlockBuffer(_buf4), _buf4, EOF]));\n            }\n            const _buf2 = this.httpHeader(black);\n            return cb(null, _buf2);\n        }\n        const _buf2 = _buf1.toString('base64');\n        if (this.httpHeader) {\n            return cb(null, this.httpHeader(_buf2));\n        }\n        const _buf3 = Buffer.from(_buf2, 'base64');\n        return cb(null, Buffer.concat([this.BlockBuffer(_buf3), _buf3, EOF]));\n    }\n}\nexports.encryptStream = encryptStream;\nclass decryptStream extends Stream.Transform {\n    constructor(password, _buf = Buffer.allocUnsafe(0)) {\n        super();\n        this.password = password;\n        this.bufferLength = 8196;\n        this.derivedKey = null;\n    }\n    _decrypt(_text) {\n        const decipher = Crypto.createDecipheriv('aes-256-gcm', this.derivedKey, this.iv);\n        decipher.setAuthTag(_text.slice(0, 16));\n        try {\n            const _buf = Buffer.concat([decipher.update(_text.slice(16)), decipher.final()]);\n            const leng = _buf.slice(4, 4 + _buf.readUInt32BE(0));\n            if (leng && leng.length) {\n                return leng;\n            }\n            return Buffer.allocUnsafe(0);\n        }\n        catch (e) {\n            console.log('class decryptStream _decrypt error:', e.message);\n            return Buffer.allocUnsafe(0);\n        }\n    }\n    _First(chunk, CallBack) {\n        this.salt = chunk.slice(0, 64);\n        this.iv = chunk.slice(64, 76);\n        return Crypto.pbkdf2(this.password, this.salt, 2145, 32, 'sha512', (err, derivedKey) => {\n            if (err) {\n                console.log(`decryptStream crypto.pbkdf2 ERROR: ${err.message}`);\n                return CallBack(err);\n            }\n            this.derivedKey = derivedKey;\n            const text = this._decrypt(chunk.slice(76));\n            if (!text.length)\n                return CallBack(new Error('lenth = 0'));\n            return CallBack(null, text);\n        });\n    }\n    _transform(chunk, encode, cb) {\n        if (!this.derivedKey) {\n            return this._First(chunk, cb);\n        }\n        const text = this._decrypt(chunk);\n        if (!text.length)\n            return cb(new Error('lenth = 0'));\n        return cb(null, text);\n    }\n}\nexports.decryptStream = decryptStream;\nclass encode extends Stream.Transform {\n    constructor() {\n        super();\n        this.kk = null;\n    }\n    _transform(chunk, encode, cb) {\n        let start = chunk.slice(0);\n        while (start.length) {\n            const point = start.indexOf(0x0a);\n            if (point < 0) {\n                this.push(start);\n                break;\n            }\n            const _buf = start.slice(0, point);\n            this.push(_buf);\n            start = start.slice(point + 1);\n        }\n        return cb();\n    }\n}\nclass encodeHex extends Stream.Transform {\n    constructor() { super(); }\n    _transform(chunk, encode, cb) {\n        return cb(null, chunk.toString('utf8'));\n    }\n}\nclass getDecryptClientStreamFromHttp extends Stream.Transform {\n    constructor() {\n        super();\n        this.first = true;\n        this.text = '';\n    }\n    getBlock(block) {\n        const uu = block.split('\\r\\n');\n        if (uu.length !== 2) {\n            return null;\n        }\n        const length = parseInt(uu[0], 16);\n        const text = uu[1];\n        if (length === text.length) {\n            return text;\n        }\n        return null;\n    }\n    _transform(chunk, encode, cb) {\n        this.text += chunk.toString();\n        const line = this.text.split('\\r\\n\\r\\n');\n        while (this.first && line.length > 1 || !this.first && line.length) {\n            if (this.first) {\n                this.first = false;\n                line.shift();\n            }\n            const _text = line.shift();\n            if (!_text.length)\n                continue;\n            if (/HTTP\\/1\\.1 404 Not Found/.test(_text)) {\n                return cb(new Error('404'));\n            }\n            const text = this.getBlock(_text);\n            if (!text) {\n                //\t\t\tmiddle data can't get block\n                if (line.length) {\n                    console.log('getDecryptStreamFromHttp have ERROR:\\n*****************************\\n');\n                    console.log(text);\n                    return this.unpipe();\n                }\n                this.text = _text;\n                return cb();\n            }\n            const _back = Buffer.from(text, 'base64');\n            this.push(_back);\n        }\n        this.text = '';\n        return cb();\n    }\n}\nexports.getDecryptClientStreamFromHttp = getDecryptClientStreamFromHttp;\nclass printStream extends Stream.Transform {\n    constructor(headString) {\n        super();\n        this.headString = headString;\n    }\n    _transform(chunk, encode, cb) {\n        console.log(this.headString);\n        console.log(chunk.toString('hex'));\n        console.log(this.headString);\n        return cb(null, chunk);\n    }\n}\nexports.printStream = printStream;\nclass blockBuffer16 extends Stream.Writable {\n    constructor(socket) {\n        super();\n        this.socket = socket;\n        this.socket.pause();\n    }\n    _write(chunk, encoding, cb) {\n        if (this.socket.writable) {\n            console.log('blockBuffer16 socket.write :', chunk.length);\n            this.socket.write(chunk);\n            this.socket.resume();\n            return cb();\n        }\n        console.log('blockBuffer16 socket.writable false');\n        return cb();\n    }\n}\nexports.blockBuffer16 = blockBuffer16;\nclass getDecrypGatwayStreamFromHttp extends Stream.Transform {\n    constructor(saveLog) {\n        super();\n        this.saveLog = saveLog;\n        this.text = '';\n    }\n    formatErr(text) {\n        const log = 'getDecryptRequestStreamFromHttp format ERROR:\\n*****************************\\n' + text + '\\r\\n';\n        console.log(log);\n        this.saveLog(log);\n    }\n    _transform(chunk, encode, cb) {\n        this.text += chunk.toString('utf8');\n        const block = this.text.split('\\r\\n\\r\\n');\n        while (block.length) {\n            const blockText = block.shift();\n            if (!blockText.length)\n                continue;\n            if (/^GET /i.test(blockText)) {\n                const _line = blockText.split('\\r\\n')[0];\n                const _url = _line.split(' ');\n                if (_url.length < 2) {\n                    if (block.length) {\n                        this.formatErr(blockText);\n                        return this.unpipe();\n                    }\n                    this.text = blockText;\n                    return cb();\n                }\n                this.push(Buffer.from(_url[1].slice(1), 'base64'));\n                continue;\n            }\n            if (/^POST /i.test(blockText)) {\n                if (block.length > 0) {\n                    const header = blockText.split('\\r\\n');\n                    const _length = header.findIndex(n => {\n                        return /^Content-Length: /i.test(n);\n                    });\n                    if (_length === -1) {\n                        this.formatErr(blockText);\n                        return this.unpipe();\n                    }\n                    const lengthString = header[_length].split(' ');\n                    if (lengthString.length !== 2) {\n                        this.formatErr(blockText);\n                        return this.unpipe();\n                    }\n                    const length = parseInt(lengthString[1]);\n                    if (!length) {\n                        this.formatErr(blockText);\n                        return this.unpipe();\n                    }\n                    const _text = block.shift();\n                    if (length !== _text.length) {\n                        const log = `${blockText}\\r\\n\\r\\n${_text}`;\n                        if (block.length > 0) {\n                            this.formatErr(log);\n                            return this.unpipe();\n                        }\n                        this.text = log;\n                        return cb();\n                    }\n                    this.push(Buffer.from(_text, 'base64'));\n                    continue;\n                }\n                this.text = blockText;\n                return cb();\n            }\n            if (blockText.length) {\n                if (block.length) {\n                    this.formatErr(blockText);\n                    return this.unpipe();\n                }\n                this.text = blockText;\n                return cb();\n            }\n        }\n        this.text = '';\n        return cb();\n    }\n}\nexports.getDecrypGatwayStreamFromHttp = getDecrypGatwayStreamFromHttp;\n"
  },
  {
    "path": "app/tools/compress.ts",
    "content": "/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as Crypto from 'crypto'\nimport * as Async from 'async'\nimport * as Stream from 'stream'\nimport * as Net from 'net'\nconst EOF = Buffer.from ( '\\r\\n\\r\\n', 'utf8' )\nimport * as fs from 'fs'\nexport interface packetBuffer {\n\tcommand: number;\n\tuuid: string;\n\tbuffer: Buffer;\n\tserial: number\n}\n\nexport interface pairConnect {\n\tserverListen: string;\n\tclientListen: string;\n}\n\nexport const encrypt = ( text: Buffer, masterkey: string, CallBack ) => {\n\tlet salt = null\n\tAsync.waterfall ([\n\t\tnext => Crypto.randomBytes ( 64, next ),\n\t\t( _salt, next ) => {\n\t\t\tsalt = _salt\n\t\t\tCrypto.pbkdf2 ( masterkey, salt, 2145, 32, 'sha512', next )\n\t\t}\n\t], ( err, derivedKey ) => {\n\t\tif ( err )\n\t\t\treturn CallBack ( err )\n\t\t\n\t\tCrypto.randomBytes ( 12, ( err1, iv ) => {\n\t\t\tif ( err1 )\n\t\t\t\treturn CallBack ( err1 )\n\t\t\t\n\t\t\tconst cipher = Crypto.createCipheriv ( 'aes-256-gcm', derivedKey, iv );\n\t\t\n\t\t\tlet _text = Buffer.concat ([ Buffer.alloc ( 4, 0 ) , text ])\n\t\t\t_text.writeUInt32BE ( text.length, 0 )\n\t\t\tif ( text.length < 500 ) {\n\t\t\t\t _text = Buffer.concat ([ _text, Buffer.alloc ( 100 + Math.random () * 1000 )])\n\t\t\t}\n\t\t\tconst encrypted = Buffer.concat ([ cipher.update ( _text ), cipher.final ()]);\n\t\t\tconst ret = Buffer.concat ([ salt, iv, cipher.getAuthTag(), encrypted ])\n\t\t\t\n\t\t\treturn CallBack ( null, ret )\n\t\t})\n\t})\n}\n/**\n * Decrypts text by given key\n * @param String base64 encoded input data\n * @param Buffer masterkey\n * @returns String decrypted (original) text\n */\nexport const decrypt =  ( data: Buffer, masterkey, CallBack ) => {\n\tif ( !data || !data.length )\n\t\treturn CallBack ( new Error( 'null' ))\n\ttry {\n\t\t// base64 decoding\n\n\t\t// convert data to buffers\n\n\t\tconst salt = data.slice ( 0, 64 );\n\t\tconst iv = data.slice ( 64, 76 );\n\t\tconst tag = data.slice ( 76, 92 );\n\t\tconst text = data.slice ( 92 );\n\t\t// derive key using; 32 byte key length\n\t\tCrypto.pbkdf2 ( masterkey, salt , 2145, 32, 'sha512', ( err, derivedKey ) => {\n\t\t\t\n\t\t\tif ( err )\n\t\t\t\treturn CallBack ( err )\n\t\t\t// AES 256 GCM Mode\n\t\t\ttry {\n\t\t\t\tconst decipher = Crypto.createDecipheriv ( 'aes-256-gcm', derivedKey, iv )\n\t\t\t\tdecipher.setAuthTag ( tag )\n\t\t\t\tconst decrypted = Buffer.concat([decipher.update ( text ), decipher.final ( )]) \n\t\t\t\tconst leng = decrypted.slice( 4, 4 + decrypted.readUInt32BE(0))\n\t\t\t\treturn CallBack ( null, leng )\n\t\t\t} catch ( ex ) {\n\t\t\t\tconsole.log ( `decrypt catch error [${ ex.message }]`)\n\t\t\t}\n\t\t\t\n\n\t\t\t\n\t\t})\n\n\t} catch ( e ) {\n\t\treturn CallBack ( e )\n\t}\n\n}\n\nexport const packetBuffer = ( bit0: number, _serial: number, id: string, buffer: Buffer ) => {\n\t\n\tconst _buffer = Buffer.allocUnsafe ( 6 )\n\t_buffer.fill ( 0 )\n\t_buffer.writeUInt8 ( bit0, 0 )\n\t_buffer.writeUInt32BE ( _serial, 1 )\n\n\tconst uuid = Buffer.from ( id )\n\t_buffer.writeUInt8 ( id.length, 5 )\n\tif ( buffer && buffer.length )\n\t\treturn Buffer.concat ([ _buffer, uuid, buffer ])\n\treturn Buffer.concat ([ _buffer, uuid ])\n}\n\nexport const openPacket = ( buffer: Buffer ) => {\n\tconst idLength = buffer.readUInt8 ( 5 )\n\treturn  {\n\t\tcommand: buffer.readUInt8 ( 0 ),\n\t\tserial: buffer.readUInt32BE ( 1 ),\n\t\tuuid: buffer.toString ( 'utf8', 6, 6 + idLength ),\n\t\tbuffer: buffer.slice ( 6 + idLength )\n\t}\n}\nconst HTTP_HEADER = Buffer.from (\n\t`HTTP/1.1 200 OK\\r\\nDate: ${ new Date ().toUTCString ()}\\r\\nContent-Type: text/html\\r\\nTransfer-Encoding: chunked\\r\\nConnection: keep-alive\\r\\nVary: Accept-Encoding\\r\\n\\r\\n`, 'utf8')\nconst HTTP_EOF = Buffer.from ( '\\r\\n\\r\\n', 'utf8' )\n\nexport class encryptStream extends Stream.Transform {\n\tprivate salt: Buffer\n\tprivate iv: Buffer\n\tprivate first = true\n\tpublic derivedKey: Buffer = null\n\n\tprivate BlockBuffer ( _buf: Buffer ) {\n\t\treturn Buffer.from( _buf.length.toString( 16 ).toUpperCase() + '\\r\\n', 'utf8' )\n\t}\n\tprivate init ( callback ) {\n\t\treturn Async.waterfall ([\n\t\t\tnext => Crypto.randomBytes ( 64, next ),\n\t\t\t( _salt, next ) => {\n\t\t\t\tthis.salt = _salt\n\t\t\t\tCrypto.randomBytes ( 12, next )\n\t\t\t},\n\t\t\t( _iv, next ) => {\n\t\t\t\tthis.iv = _iv\n\t\t\t\tCrypto.pbkdf2 ( this.password, this.salt, 2145, 32, 'sha512', next )\n\t\t\t}\n\t\t], ( err, derivedKey: Buffer ) => {\n\t\t\t\n\t\t\tthis.derivedKey = derivedKey\n\t\t\treturn callback ( err )\n\t\t})\n\t}\n\n\tconstructor ( private password: string, private random: number, private httpHeader : ( str: string ) => Buffer ) {\n\t\tsuper ()\n\t}\n\t\n\tpublic _transform ( chunk: Buffer, encode, cb ) {\n\t\tif ( !this.derivedKey) {\n\t\t\treturn this.init (() => {\n\t\t\t\treturn this._transform ( chunk, encode, cb )\n\t\t\t})\n\t\t}\n\t\tconst cipher = Crypto.createCipheriv ( 'aes-256-gcm', this.derivedKey, this.iv )\n\n\t\tlet _text = Buffer.concat ([ Buffer.alloc ( 4, 0 ) , chunk ])\n\n\t\t_text.writeUInt32BE ( chunk.length, 0 )\n\t\t\n\t\tif ( chunk.length < this.random ) {\n\t\t\t_text = Buffer.concat ([ _text, Crypto.randomBytes ( Math.round(Math.random() * 5000 ))])\n\t\t}\n\n\t\tconst _buf = Buffer.concat ([ cipher.update ( _text ), cipher.final ()])\n\t\tconst _buf1 = Buffer.concat ([ cipher.getAuthTag (), _buf ])\n\t\t\n\t\tif ( this.first ) {\n\t\t\tthis.first = false\n\t\t\tconst black = Buffer.concat ([ this.salt, this.iv, _buf1 ]).toString ( 'base64' )\n\t\t\tif ( ! this.httpHeader ) {\n\t\t\t\tconst _buf4 = Buffer.from ( black, 'base64')\n\t\t\t\treturn cb ( null, Buffer.concat ([ HTTP_HEADER, this.BlockBuffer ( _buf4 ), _buf4, EOF ]))\n\t\t\t}\n\t\t\tconst _buf2 = this.httpHeader ( black )\n\n\t\t\treturn cb ( null, _buf2 )\n\t\t}\n\t\t\n\t\tconst _buf2 = _buf1.toString( 'base64' )\n\n\t\tif ( this.httpHeader ) {\n\t\t\treturn cb ( null, this.httpHeader ( _buf2 ))\n\t\t}\n\t\tconst _buf3 = Buffer.from ( _buf2, 'base64' )\n\t\treturn cb ( null, Buffer.concat ([ this.BlockBuffer ( _buf3 ), _buf3, EOF ]))\n\t}\n}\n\nexport class decryptStream extends Stream.Transform {\n\tprivate salt: Buffer\n\tprivate iv: Buffer\n\tprivate bufferLength = 8196\n\n\tprivate derivedKey: Buffer = null\n\tprivate _decrypt ( _text: Buffer ) {\n\t\t\n\t\tconst decipher = Crypto.createDecipheriv ( 'aes-256-gcm', this.derivedKey, this.iv )\n\t\tdecipher.setAuthTag ( _text.slice ( 0, 16 ))\n\t\ttry {\n\t\t\tconst _buf = Buffer.concat ([ decipher.update ( _text.slice ( 16 )), decipher.final () ])\n\t\t\t\n\t\t\tconst leng = _buf.slice ( 4, 4 + _buf.readUInt32BE ( 0 ))\n\t\t\tif ( leng && leng.length ) {\n\t\t\t\treturn leng\n\t\t\t}\n\t\t\t\n\t\t\treturn Buffer.allocUnsafe ( 0 )\n\t\t} catch ( e ) {\n\t\t\tconsole.log ( 'class decryptStream _decrypt error:', e.message )\n\t\t\treturn Buffer.allocUnsafe ( 0 )\n\t\t}\n\t}\n\n\tpublic _First (  chunk: Buffer, CallBack: ( err?: Error, text?: Buffer ) => void ) {\n\t\tthis.salt = chunk.slice ( 0, 64 );\n\t\tthis.iv = chunk.slice ( 64, 76 );\n\t\treturn Crypto.pbkdf2 ( this.password, this.salt , 2145, 32, 'sha512', ( err, derivedKey ) => {\n\t\t\tif ( err ) {\n\t\t\t\tconsole.log ( `decryptStream crypto.pbkdf2 ERROR: ${ err.message }` )\n\t\t\t\treturn CallBack ( err )\n\t\t\t}\n\t\t\tthis.derivedKey = derivedKey\n\t\t\tconst text = this._decrypt ( chunk.slice ( 76 ))\n\t\t\tif ( ! text.length )\n\t\t\t\treturn CallBack ( new Error ( 'lenth = 0' ))\n\t\t\treturn CallBack ( null, text )\n\t\t})\n\t}\n\n\tconstructor ( private password: string, _buf: Buffer = Buffer.allocUnsafe (0)) {\n\t\tsuper ()\n\t}\n\n\t\n\tpublic _transform ( chunk: Buffer, encode, cb ) {\n\t\t\n\t\tif ( !this.derivedKey ) {\n\t\t\treturn this._First ( chunk, cb )\n\t\t}\n\n\t\tconst text = this._decrypt ( chunk )\n\t\tif ( ! text.length )\n\t\t\treturn cb ( new Error ( 'lenth = 0'))\n\t\treturn cb ( null, text )\n\t\t\n\t}\n}\n\nclass encode extends Stream.Transform {\n\tconstructor () { super ()}\n\tprivate kk = null\n\tpublic _transform ( chunk: Buffer, encode, cb ) {\n\t\tlet start = chunk.slice (0)\n\t\twhile ( start.length ) {\n\t\t\tconst point = start.indexOf ( 0x0a )\n\t\t\tif ( point < 0 ) {\n\t\t\t\tthis.push ( start )\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tconst _buf = start.slice ( 0, point )\n\t\t\tthis.push ( _buf )\n\t\t\tstart = start.slice ( point + 1 )\n\t\t}\n\t\treturn cb ()\n\t}\n\n}\n\nclass encodeHex extends Stream.Transform {\n\tconstructor () { super ()}\n\tpublic _transform ( chunk: Buffer, encode, cb ) {\n\t\t\n\t\treturn cb ( null, chunk.toString ('utf8'))\n\t}\n}\n\nexport class getDecryptClientStreamFromHttp extends Stream.Transform {\n\n\tprivate first = true\n\tprivate text = ''\n\tconstructor () { super ()}\n\n\tpublic getBlock ( block: string ) {\n\t\t\n\n\t\tconst uu = block.split ('\\r\\n')\n\t\tif ( uu.length !== 2 ) {\n\t\t\treturn null\n\t\t}\n\t\tconst length = parseInt ( uu[0], 16 )\n\n\t\tconst text = uu [1]\n\t\tif ( length === text.length ) {\n\t\t\t\n\t\t\treturn text\n\t\t}\n\t\treturn null\n\t}\n\n\tpublic _transform ( chunk: Buffer, encode, cb ) {\n\n\t\tthis.text += chunk.toString ()\n\n\t\tconst line = this.text.split ( '\\r\\n\\r\\n' )\n\n\t\twhile ( this.first && line.length > 1 || !this.first && line.length ) {\n\n\t\t\tif ( this.first ) {\n\t\t\t\tthis.first = false\n\t\t\t\tline.shift()\n\t\t\t}\n\n\t\t\tconst _text = line.shift ()\n\n\t\t\tif ( ! _text.length )\n\t\t\t\tcontinue\n\n\t\t\tif ( /HTTP\\/1\\.1 404 Not Found/.test ( _text )) {\n\t\t\t\treturn cb ( new Error ( '404' ))\n\t\t\t}\n\n\t\t\tconst text = this.getBlock ( _text )\n\t\t\tif ( ! text ) {\n\t\t\t\t//\t\t\tmiddle data can't get block\n\t\t\t\tif ( line.length ) {\n\t\t\t\t\tconsole.log ( 'getDecryptStreamFromHttp have ERROR:\\n*****************************\\n' )\n\t\t\t\t\tconsole.log ( text )\n\t\t\t\t\treturn this.unpipe()\n\t\t\t\t}\n\t\t\t\tthis.text = _text\n\t\t\t\treturn cb ()\n\t\t\t}\n\n\t\t\tconst _back = Buffer.from ( text, 'base64' )\n\n\t\t\tthis.push ( _back )\n\t\t}\n\t\tthis.text = ''\n\t\treturn cb ()\n\t}\n}\n\nexport class printStream extends Stream.Transform {\n\n\tconstructor ( private headString: string ) { super ()}\n\tpublic _transform ( chunk: Buffer, encode, cb ) {\n\t\tconsole.log ( this.headString )\n\t\tconsole.log ( chunk.toString ('hex'))\n\t\tconsole.log ( this.headString )\n\t\t\n\t\treturn cb ( null, chunk )\n\t}\n}\n\nexport class blockBuffer16 extends Stream.Writable {\n\tconstructor ( private socket: Net.Socket ) {\n\t\tsuper ()\n\t\tthis.socket.pause ()\n\t}\n\tpublic _write ( chunk: Buffer, encoding, cb ) {\n\t\tif ( this.socket.writable ) {\n\t\t\tconsole.log ( 'blockBuffer16 socket.write :', chunk.length )\n\t\t\tthis.socket.write ( chunk )\n\t\t\tthis.socket.resume ()\n\t\t\treturn cb ()\n\t\t}\n\t\tconsole.log ( 'blockBuffer16 socket.writable false')\n\t\treturn cb ()\n\t}\n}\n\nexport class getDecrypGatwayStreamFromHttp extends Stream.Transform {\n\n\tprivate text = ''\n\tprivate formatErr ( text: string ) {\n\t\tconst log = 'getDecryptRequestStreamFromHttp format ERROR:\\n*****************************\\n' + text + '\\r\\n'\n\t\tconsole.log ( log )\n\t\tthis.saveLog ( log )\n\t}\n\tconstructor ( private saveLog: ( str: string ) => void ) { super ()}\n\n\tpublic _transform ( chunk: Buffer, encode, cb ) {\n\n\t\tthis.text += chunk.toString ( 'utf8' )\n\t\tconst block = this.text.split ( '\\r\\n\\r\\n' )\n\n\t\twhile ( block.length ) {\n\n\t\t\tconst blockText = block.shift ()\n\n\t\t\tif ( ! blockText.length )\n\t\t\t\tcontinue\n\t\t\t\n\t\t\tif ( /^GET /i.test ( blockText )) {\n\n\t\t\t\tconst _line = blockText.split ( '\\r\\n' )[ 0 ]\n\t\t\t\tconst _url = _line.split ( ' ' )\n\t\t\t\tif ( _url.length < 2 ) {\n\t\t\t\t\tif ( block.length ) {\n\t\t\t\t\t\tthis.formatErr ( blockText )\n\t\t\t\t\t\treturn this.unpipe ()\n\t\t\t\t\t}\n\t\t\t\t\tthis.text = blockText\n\t\t\t\t\treturn cb ()\n\t\t\t\t}\n\t\t\t\tthis.push ( Buffer.from ( _url[1].slice ( 1 ), 'base64' ))\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif ( /^POST /i.test ( blockText )) {\n\n\t\t\t\tif ( block.length > 0 ) {\n\t\t\t\t\tconst header = blockText.split ( '\\r\\n' )\n\n\t\t\t\t\tconst _length = header.findIndex ( n => {\n\t\t\t\t\t\treturn /^Content-Length: /i.test ( n )\n\t\t\t\t\t})\n\t\t\t\t\tif ( _length === -1 ) {\n\t\t\t\t\t\tthis.formatErr ( blockText )\n\t\t\t\t\t\treturn this.unpipe ()\n\t\t\t\t\t}\n\n\t\t\t\t\tconst lengthString = header [ _length ].split ( ' ' )\n\t\t\t\t\tif ( lengthString.length !== 2 ) {\n\t\t\t\t\t\tthis.formatErr ( blockText )\n\t\t\t\t\t\treturn this.unpipe ()\n\t\t\t\t\t}\n\n\t\t\t\t\tconst length = parseInt ( lengthString[ 1 ])\n\t\t\t\t\tif ( ! length ) {\n\t\t\t\t\t\tthis.formatErr ( blockText )\n\t\t\t\t\t\treturn this.unpipe ()\n\t\t\t\t\t}\n\n\t\t\t\t\tconst _text = block.shift ()\n\t\t\t\t\tif ( length !== _text.length ) {\n\t\t\t\t\t\tconst log = `${ blockText }\\r\\n\\r\\n${ _text }`\n\t\t\t\t\t\tif ( block.length > 0 ) {\n\t\t\t\t\t\t\tthis.formatErr ( log )\n\t\t\t\t\t\t\treturn this.unpipe ()\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.text = log\n\t\t\t\t\t\treturn cb ()\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.push ( Buffer.from ( _text, 'base64' ))\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tthis.text = blockText\n\t\t\t\treturn cb ()\n\t\t\t}\n\n\t\t\tif ( blockText.length ) {\n\t\t\t\tif ( block.length ) {\n\t\t\t\t\tthis.formatErr ( blockText )\n\t\t\t\t\treturn this.unpipe ()\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tthis.text = blockText\n\t\t\t\treturn cb ()\n\t\t\t}\n\t\t}\n\n\t\tthis.text = ''\n\t\treturn cb ()\n\t}\n}\n\n\n"
  },
  {
    "path": "app/tools/imap.js",
    "content": "\"use strict\";\n/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/// \nconst Net = require(\"net\");\nconst Tls = require(\"tls\");\nconst Stream = require(\"stream\");\nconst Event = require(\"events\");\nconst Uuid = require(\"node-uuid\");\nconst Async = require(\"async\");\nconst Crypto = require(\"crypto\");\nconst path_1 = require(\"path\");\nconst timers_1 = require(\"timers\");\nconst buffer_1 = require(\"buffer\");\nconst Tool = require(\"./initSystem\");\nconst MAX_INT = 9007199254740992;\nconst debug = false;\nconst pingFailureTime = 1000 * 60;\nconst NoopLoopWaitingTime = 1000 * 1;\nconst ErrorLogFile = path_1.join(Tool.QTGateFolder, 'imap.log');\nconst ErrorLogFileStream = path_1.join(Tool.QTGateFolder, 'imapStream.log');\nlet flag = 'w';\nconst saveLog = (log, _console = true) => {\n    const Fs = require('fs');\n    const data = `${new Date().toUTCString()}: ${log}\\r\\n`;\n    _console ? console.log(data) : null;\n};\nconst debugOut = (text, isIn, serialID) => {\n    const log = `【${new Date().toISOString()}】【${serialID}】${isIn ? '<=' : '=>'} 【${text}】`;\n    saveLog(log);\n};\nconst idleInterval = 1000 * 180; // 3 mins\nconst socketTimeOut = 1000 * 60;\nclass ImapServerSwitchStream extends Stream.Transform {\n    constructor(imapServer, exitWithDeleteBox, debug) {\n        super();\n        this.imapServer = imapServer;\n        this.exitWithDeleteBox = exitWithDeleteBox;\n        this.debug = debug;\n        this._buffer = buffer_1.Buffer.alloc(0);\n        this.Tag = null;\n        this.cmd = null;\n        this.callback = false;\n        this.doCommandCallback = null;\n        this._login = false;\n        this.first = true;\n        this.idleCallBack = null;\n        this.isWaitLogout = false;\n        this.waitLogoutCallBack = null;\n        this._newMailChunk = buffer_1.Buffer.alloc(0);\n        this.idleResponsrTime = null;\n        this.canDoLogout = false;\n        this.ready = false;\n        this.appendWaitResponsrTimeOut = null;\n        this.runningCommand = null;\n        //private nextRead = true\n        this.idleNextStop = null;\n        this.reNewCount = 0;\n        this.isImapUserLoginSuccess = false;\n        this.waitingDoingIdleStop = false;\n        this.idleDoingDone = false;\n    }\n    commandProcess(text, cmdArray, next, callback) { }\n    serverCommandError(err, CallBack) {\n        this.imapServer.emit('error', err);\n        if (CallBack) {\n            CallBack(err);\n        }\n    }\n    idleDoingDown() {\n        timers_1.clearTimeout(this.idleNextStop);\n        if (this.idleDoingDone) {\n            return this.debug ? console.log(`idleDoingDown do nothing because already doing!`) : null;\n        }\n        if (this.writable) {\n            this.idleDoingDone = true;\n            this.debug ? debugOut(`DONE`, false, this.imapServer.listenFolder || this.imapServer.imapSerialID) : null;\n            return this.push(`DONE\\r\\n`);\n        }\n        return this.imapServer.destroyAll(null);\n    }\n    doCapability(capability) {\n        this.imapServer.serverSupportTag = capability;\n        this.imapServer.idleSupport = /IDLE/i.test(capability);\n        this.imapServer.condStoreSupport = /CONDSTORE/i.test(capability);\n        this.imapServer.literalPlus = /LITERAL\\+/i.test(capability);\n        const ii = /X\\-GM\\-EXT\\-1/i.test(capability);\n        const ii1 = /CONDSTORE/i.test(capability);\n        const listenFolder = this.imapServer.listenFolder;\n        return this.imapServer.fetchAddCom = `(${ii ? 'X-GM-THRID X-GM-MSGID X-GM-LABELS ' : ''}${ii1 ? 'MODSEQ ' : ''}BODY[])`;\n    }\n    preProcessCommane(commandLine, _next, callback) {\n        const cmdArray = commandLine.split(' ');\n        this.debug ? debugOut(`${commandLine}`, true, this.imapServer.listenFolder || this.imapServer.imapSerialID) : null;\n        if (this._login) {\n            switch (commandLine[0]) {\n                case '+': /////       +\n                case '*': { /////       *\n                    return this.commandProcess(commandLine, cmdArray, _next, callback);\n                }\n                case 'I': //  IDLE\n                case 'D': //  NODE\n                case 'N': //  NOOP\n                case 'A': { /////       A\n                    timers_1.clearTimeout(this.appendWaitResponsrTimeOut);\n                    timers_1.clearTimeout(this.idleResponsrTime);\n                    this.runningCommand = false;\n                    if (this.Tag !== cmdArray[0]) {\n                        return this.serverCommandError(new Error(`this.Tag[${this.Tag}] !== cmdArray[0] [${cmdArray[0]}]\\ncommandLine[${commandLine}]`), callback);\n                    }\n                    if (/^ok$/i.test(cmdArray[1])) {\n                        this.doCommandCallback(null, commandLine);\n                        return callback();\n                    }\n                    console.log(`IMAP preProcessCommane on NO Tag!`, commandLine);\n                    const errs = cmdArray.slice(2).join(' ');\n                    this.doCommandCallback(new Error(errs));\n                    return callback();\n                }\n                default:\n                    return this.serverCommandError(new Error(`_commandPreProcess got switch default error!`), callback);\n            }\n        }\n        return this.login(commandLine, cmdArray, _next, callback);\n    }\n    checkFetchEnd() {\n        if (this._buffer.length <= this.imapServer.fetching) {\n            return null;\n        }\n        const body = this._buffer.slice(0, this.imapServer.fetching);\n        const uu = this._buffer.slice(this.imapServer.fetching);\n        let index1 = uu.indexOf('\\r\\n* ');\n        let index = uu.indexOf('\\r\\nA');\n        index = index < 0 || index1 > 0 && index > index1 ? index1 : index;\n        if (index < 0)\n            return null;\n        this._buffer = uu.slice(index + 2);\n        this.imapServer.fetching = null;\n        return body;\n    }\n    _transform(chunk, encoding, next) {\n        this.callback = false;\n        //console.log ('************************************** ImapServerSwitchStream _transform chunk **************************************')\n        //console.log ( chunk.toString ())\n        //console.log ('************************************** ImapServerSwitchStream _transform chunk **************************************')\n        this._buffer = buffer_1.Buffer.concat([this._buffer, chunk]);\n        const doLine = () => {\n            const __CallBack = () => {\n                let index = -1;\n                if (!this._buffer.length || (index = this._buffer.indexOf('\\r\\n')) < 0) {\n                    if (!this.callback) {\n                        //      this is for IDLE do DONE command\n                        //this.emit ( 'hold' )\n                        this.callback = true;\n                        return next();\n                    }\n                    //      did next with other function\n                    return;\n                }\n                const _buf = this._buffer.slice(0, index);\n                if (_buf.length) {\n                    return this.preProcessCommane(_buf.toString(), next, () => {\n                        this._buffer = this._buffer.slice(index + 2);\n                        return doLine();\n                    });\n                }\n                if (!this.callback) {\n                    this.callback = true;\n                    return next();\n                }\n                return;\n            };\n            if (this.imapServer.fetching) {\n                //console.log ('************************************** ImapServerSwitchStream _transform chunk **************************************')\n                //console.log ( this._buffer.toString ())\n                //console.log ('************************************** ImapServerSwitchStream _transform chunk **************************************')\n                const _buf1 = this.checkFetchEnd();\n                //  have no fill body get next chunk\n                if (!_buf1) {\n                    if (!this.callback) {\n                        this.callback = true;\n                        return next();\n                    }\n                    return;\n                }\n                /*\n                console.log ('************************************** ImapServerSwitchStream _transform chunk **************************************')\n                console.log ( _buf1.length )\n                console.log ( _buf1.toString ())\n                */\n                this.imapServer.newMail(_buf1);\n            }\n            return __CallBack();\n        };\n        return doLine();\n    }\n    capability() {\n        this.doCommandCallback = (err) => {\n            if (this.imapServer.listenFolder) {\n                return this.createBox(true, this.imapServer.listenFolder, (err, newMail, UID) => {\n                    if (err) {\n                        console.log(`========================= [${this.imapServer.listenFolder || this.imapServer.imapSerialID}] openBox Error do this.end ()`, err);\n                        return this.imapServer.destroyAll(err);\n                    }\n                    /*\n                    if ( this.isWaitLogout ) {\n                        console.log (`capability this.waitLogout = true doing logout_process ()`)\n                        return this.logout_process ( this.waitLogoutCallBack )\n                    }\n                    */\n                    if (/^inbox$/i.test(this.imapServer.listenFolder)) {\n                        console.log(`capability open inbox !`);\n                        this.canDoLogout = this.ready = true;\n                        return this.imapServer.emit('ready');\n                    }\n                    if (newMail && typeof this.imapServer.newMail === 'function') {\n                        //this.imapServer.emit ( 'ready' )\n                        //console.log (`[${ this.imapServer.imapSerialID }]capability doing newMail = true`)\n                        return this.doNewMail(UID);\n                    }\n                    if (typeof this.imapServer.newMail === 'function') {\n                        this.idleNoop();\n                    }\n                    this.canDoLogout = this.ready = true;\n                    this.imapServer.emit('ready');\n                });\n            }\n            this.canDoLogout = this.ready = true;\n            this.imapServer.emit('ready');\n        };\n        this.commandProcess = (text, cmdArray, next, callback) => {\n            switch (cmdArray[0]) {\n                case '*': { /////       *\n                    //          check imap server is login ok\n                    if (/^CAPABILITY$/i.test(cmdArray[1]) && cmdArray.length > 2) {\n                        const kkk = cmdArray.slice(2).join(' ');\n                        this.doCapability(kkk);\n                    }\n                    return callback();\n                }\n                default:\n                    return callback();\n            }\n        };\n        this.Tag = `A${this.imapServer.TagCount1()}`;\n        this.cmd = `${this.Tag} CAPABILITY`;\n        this.debug ? debugOut(this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID) : null;\n        if (this.writable) {\n            return this.push(this.cmd + '\\r\\n');\n        }\n        return this.imapServer.destroyAll(null);\n    }\n    doNewMail(UID = '') {\n        this.reNewCount--;\n        this.canDoLogout = false;\n        this.runningCommand = 'doNewMail';\n        this.seachUnseen((err, newMailIds, havemore) => {\n            if (err) {\n                return this.imapServer.destroyAll(err);\n            }\n            let haveMoreNewMail = false;\n            const getNewMail = (_fatchID, CallBack) => {\n                return Async.waterfall([\n                    next => this.fetch(_fatchID, next),\n                    (_moreNew, next) => {\n                        haveMoreNewMail = _moreNew;\n                        return this.flagsDeleted(_fatchID, next);\n                    },\n                    next => {\n                        return this.expunge(next);\n                    }\n                ], CallBack);\n            };\n            if (newMailIds || (newMailIds = UID)) {\n                const uids = newMailIds.split(',');\n                //console.log (`doNewMail newMailIds = 【${ newMailIds }】`)\n                return Async.eachSeries(uids, (n, next) => {\n                    const _uid = parseInt(n);\n                    if (_uid > 0) {\n                        return getNewMail(_uid, next);\n                    }\n                    return next();\n                }, (err) => {\n                    this.runningCommand = null;\n                    if (err) {\n                        debug ? saveLog(`ImapServerSwitchStream [${this.imapServer.listenFolder || this.imapServer.imapSerialID}] doNewMail ERROR! [${err.message}]`) : null;\n                        return this.imapServer.destroyAll(err);\n                    }\n                    if (haveMoreNewMail || havemore) {\n                        return this.doNewMail();\n                    }\n                    return this.idleNoop();\n                });\n            }\n            this.runningCommand = null;\n            this.imapServer.emit('ready');\n            return this.idleNoop();\n        });\n    }\n    checkLogout(CallBack) {\n        if (!this.isWaitLogout) {\n            //console.log (`[${ this.imapServer.imapSerialID }] checkLogout have not waiting logout`)\n            return CallBack();\n        }\n        const _callBack = () => {\n            if (this.exitWithDeleteBox) {\n                return this.deleteBox(() => {\n                    return this.logout_process(CallBack);\n                });\n            }\n            return this.logout_process(CallBack);\n        };\n        if (!this.canDoLogout) {\n            this.isWaitLogout = true;\n            this.idleCallBack = _callBack;\n            return; //console.trace (`[${ this.imapServer.imapSerialID }] checkLogout canDoLogout = false, set this.isWaitLogout = true &&  this.idleCallBack = CallBack`)\n        }\n        return _callBack();\n    }\n    idleNoop() {\n        if (this.isWaitLogout) {\n            if (this.idleCallBack && typeof this.idleCallBack === 'function') {\n                return this.idleCallBack();\n            }\n            return console.log(`idleNoop have this.isWaitLogout but have not this.idleCallBack ${typeof this.idleCallBack}`);\n        }\n        this.canDoLogout = true;\n        let newSwitchRet = false;\n        this.idleDoingDone = false;\n        this.runningCommand = 'idle';\n        if (!this.ready) {\n            this.ready = true;\n            this.imapServer.emit('ready');\n        }\n        this.doCommandCallback = (err => {\n            if (err) {\n                return this.imapServer.destroyAll(err);\n            }\n            this.waitingDoingIdleStop = false;\n            this.runningCommand = null;\n            if (this.idleCallBack) {\n                this.idleCallBack();\n                return this.idleCallBack = null;\n            }\n            //console.log(`IDLE DONE newSwitchRet = [${newSwitchRet}] nextRead = [${this.nextRead}]`)\n            if (newSwitchRet || this.reNewCount > 0) {\n                return this.doNewMail();\n            }\n            if (this.imapServer.idleSupport) {\n                return this.idleNoop();\n            }\n            /**\n             * NOOP support\n             */\n            timers_1.setTimeout(() => {\n                if (!this.runningCommand) {\n                    return this.idleNoop();\n                }\n            }, NoopLoopWaitingTime);\n        });\n        this.idleNextStop = this.imapServer.idleSupport\n            ? timers_1.setTimeout(() => {\n                this.idleDoingDown();\n            }, idleInterval)\n            : null;\n        this.commandProcess = (text, cmdArray, next, callback) => {\n            //console.log (`idleNoop commandProcess coming ${ text }\\n${ cmdArray }`)\n            switch (cmdArray[0]) {\n                case '+':\n                case '*': {\n                    timers_1.clearTimeout(this.idleResponsrTime);\n                    if (/^RECENT$|^EXISTS$/i.test(cmdArray[2]) || this.isWaitLogout) {\n                        newSwitchRet = true;\n                        if (this.imapServer.idleSupport) {\n                            this.idleDoingDown();\n                        }\n                    }\n                    return callback();\n                }\n                default:\n                    return callback();\n            }\n        };\n        const name = this.imapServer.idleSupport ? 'IDLE' : 'NOOP';\n        this.Tag = `A${this.imapServer.TagCount1()}`;\n        this.cmd = `${this.Tag} ${name}`;\n        this.debug ? debugOut(this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID) : null;\n        if (this.writable) {\n            return this.push(this.cmd + '\\r\\n');\n        }\n        return this.imapServer.destroyAll(null);\n    }\n    login(text, cmdArray, next, _callback) {\n        this.doCommandCallback = (err) => {\n            if (!err) {\n                this.isImapUserLoginSuccess = true;\n                return this.capability();\n            }\n            console.log(`ImapServerSwitchStream class login error `, err);\n            return this.imapServer.destroyAll(err);\n        };\n        this.commandProcess = (text, cmdArray, next, callback) => {\n            switch (cmdArray[0]) {\n                case '+':\n                case '*': {\n                    return callback();\n                }\n                default:\n                    return callback();\n            }\n        };\n        switch (cmdArray[0]) {\n            case '*': { /////       *\n                //          check imap server is login ok\n                if (/^ok$/i.test(cmdArray[1]) && this.first) {\n                    this.first = false;\n                    this.Tag = `A${this.imapServer.TagCount1()}`;\n                    this.cmd = `${this.Tag} LOGIN \"${this.imapServer.IMapConnect.imapUserName}\" \"${this.imapServer.IMapConnect.imapUserPassword}\"`;\n                    this.debug ? debugOut(this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID) : null;\n                    this.callback = this._login = true;\n                    if (this.writable) {\n                        return next(null, this.cmd + '\\r\\n');\n                    }\n                    this.imapServer.destroyAll(null);\n                }\n                //\n                return _callback();\n            }\n            default:\n                return this.serverCommandError(new Error(`login switch default ERROR!`), _callback);\n        }\n    }\n    createBox(openBox, folderName, CallBack) {\n        this.doCommandCallback = (err) => {\n            if (err) {\n                if (err.message && !/exists/i.test(err.message)) {\n                    return CallBack(err);\n                }\n            }\n            if (openBox) {\n                return this.openBox(CallBack);\n            }\n            return CallBack();\n        };\n        this.commandProcess = (text, cmdArray, next, callback) => {\n            return callback();\n        };\n        this.Tag = `A${this.imapServer.TagCount1()}`;\n        this.cmd = `${this.Tag} CREATE \"${folderName}\"`;\n        this.debug ? debugOut(this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID) : null;\n        if (this.writable) {\n            return this.push(this.cmd + '\\r\\n');\n        }\n        return this.imapServer.destroyAll(null);\n    }\n    openBox(CallBack) {\n        let newSwitchRet = false;\n        let UID = 0;\n        this.doCommandCallback = (err) => {\n            if (err) {\n                return this.createBox(true, this.imapServer.listenFolder, CallBack);\n            }\n            CallBack(null, newSwitchRet, UID);\n        };\n        this.commandProcess = (text, cmdArray, next, _callback) => {\n            switch (cmdArray[0]) {\n                case '*': {\n                    if (/^EXISTS$|^UIDNEXT$|UNSEEN/i.test(cmdArray[2])) {\n                        const _num = text.split('UNSEEN ')[1];\n                        if (_num) {\n                            UID = parseInt(_num.split(']')[0]);\n                        }\n                        newSwitchRet = true;\n                    }\n                    return _callback();\n                }\n                default:\n                    return _callback();\n            }\n        };\n        const conText = this.imapServer.condStoreSupport ? ' (CONDSTORE)' : '';\n        this.Tag = `A${this.imapServer.TagCount1()}`;\n        this.cmd = `${this.Tag} SELECT \"${this.imapServer.listenFolder}\"${conText}`;\n        this.debug ? debugOut(this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID) : null;\n        if (this.writable)\n            return this.push(this.cmd + '\\r\\n');\n        this.imapServer.destroyAll(null);\n    }\n    _logout(CallBack) {\n        //console.trace (`doing _logout typeof CallBack = [${ typeof CallBack }]`)\n        if (!this.isImapUserLoginSuccess) {\n            return CallBack();\n        }\n        this.doCommandCallback = (err, info) => {\n            return CallBack(err);\n        };\n        timers_1.clearTimeout(this.idleResponsrTime);\n        this.commandProcess = (text, cmdArray, next, _callback) => {\n            //console.log (`_logout doing this.commandProcess `)\n            this.isImapUserLoginSuccess = false;\n            return _callback();\n        };\n        this.Tag = `A${this.imapServer.TagCount1()}`;\n        this.cmd = `${this.Tag} LOGOUT`;\n        this.debug ? debugOut(this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID) : null;\n        if (this.writable) {\n            this.appendWaitResponsrTimeOut = timers_1.setTimeout(() => {\n                return CallBack();\n            }, 1000 * 10);\n            return this.push(this.cmd + '\\r\\n');\n        }\n        if (CallBack && typeof CallBack === 'function') {\n            return CallBack();\n        }\n    }\n    append(text, subject, CallBack) {\n        //console.log (`[${ this.imapServer.imapSerialID }] ImapServerSwitchStream append => [${ text.length }]`)\n        if (typeof subject === 'function') {\n            CallBack = subject;\n            subject = null;\n        }\n        this.canDoLogout = false;\n        this.doCommandCallback = (err, info) => {\n            this.canDoLogout = true;\n            if (err && /TRYCREATE|Mailbox/i.test(err.message)) {\n                return this.createBox(false, this.imapServer.writeFolder, err1 => {\n                    if (err1) {\n                        return CallBack(err1);\n                    }\n                    return this.append(text, subject, CallBack);\n                });\n            }\n            console.log(`[${this.imapServer.listenFolder || this.imapServer.imapSerialID}] append doCommandCallback `, err);\n            return CallBack(err, info);\n        };\n        let out = `Content-Type: application/octet-stream\\r\\nContent-Disposition: attachment\\r\\nMessage-ID:<${Uuid.v4()}@>${this.imapServer.domainName}\\r\\n${subject ? 'Subject: ' + subject + '\\r\\n' : ''}Content-Transfer-Encoding: base64\\r\\nMIME-Version: 1.0\\r\\n\\r\\n${text}`;\n        this.commandProcess = (text1, cmdArray, next, _callback) => {\n            switch (cmdArray[0]) {\n                case '*':\n                case '+': {\n                    if (!this.imapServer.literalPlus && out.length && !this.callback) {\n                        console.log(`====> append ! this.imapServer.literalPlus && out.length && ! this.callback = [${!this.imapServer.literalPlus && out.length && !this.callback}]`);\n                        this.debug ? debugOut(out, false, this.imapServer.listenFolder || this.imapServer.imapSerialID) : null;\n                        this.callback = true;\n                        next(null, out + '\\r\\n');\n                    }\n                    return _callback();\n                }\n                default:\n                    return _callback();\n            }\n        };\n        this.Tag = `A${this.imapServer.TagCount1()}`;\n        this.cmd = `APPEND \"${this.imapServer.writeFolder}\" {${out.length}${this.imapServer.literalPlus ? '+' : ''}}`;\n        this.cmd = `${this.Tag} ${this.cmd}`;\n        const time = out.length / 1000 + 20000;\n        this.debug ? debugOut(this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID) : null;\n        if (!this.writable) {\n            //console.log (`[${ this.imapServer.imapSerialID }] ImapServerSwitchStream append !this.writable doing imapServer.socket.end ()`)\n            return this.imapServer.socket.end();\n        }\n        this.push(this.cmd + '\\r\\n');\n        this.appendWaitResponsrTimeOut = timers_1.setTimeout(() => {\n            return this.doCommandCallback(new Error(`IMAP append TIMEOUT`));\n        }, time);\n        //console.log (`*************************************  append time = [${ time }] `)\n        if (this.imapServer.literalPlus) {\n            this.debug ? debugOut(out, false, this.imapServer.listenFolder || this.imapServer.imapSerialID) : null;\n            this.push(out + '\\r\\n');\n        }\n    }\n    appendStreamV4(Base64Data = '', subject = null, folderName, CallBack) {\n        if (!this.canDoLogout) {\n            return CallBack(new Error(`wImap busy!`));\n        }\n        if (!Base64Data) {\n            Base64Data = '';\n        }\n        this.canDoLogout = false;\n        this.doCommandCallback = (err, response) => {\n            //this.debug ? saveLog (`appendStreamV2 doing this.doCommandCallback`) : null\n            timers_1.clearTimeout(this.appendWaitResponsrTimeOut);\n            this.canDoLogout = true;\n            if (err) {\n                if (/TRYCREATE/i.test(err.message)) {\n                    return this.createBox(false, this.imapServer.writeFolder, err1 => {\n                        if (err1) {\n                            return CallBack(err1);\n                        }\n                        return this.appendStreamV4(Base64Data, subject, folderName, CallBack);\n                    });\n                }\n                return CallBack(err);\n            }\n            let code = response && response.length ? response.split('[')[1] : null;\n            if (code) {\n                code = code.split(' ')[2];\n                //console.log ( `this.doCommandCallback\\n\\n code = ${ code } code.length = ${ code.length }\\n\\n` )\n                if (code) {\n                    return CallBack(null, parseInt(code));\n                }\n            }\n            CallBack();\n        };\n        const out = `Content-Type: application/octet-stream\\r\\nContent-Disposition: attachment\\r\\nMessage-ID:<${Uuid.v4()}@>${this.imapServer.domainName}\\r\\n${subject ? 'Subject: ' + subject + '\\r\\n' : ''}Content-Transfer-Encoding: base64\\r\\nMIME-Version: 1.0\\r\\n\\r\\n`;\n        this.commandProcess = (text1, cmdArray, next, _callback) => {\n            switch (cmdArray[0]) {\n                case '*':\n                case '+': {\n                    if (!this.imapServer.literalPlus && out.length && !this.callback) {\n                        this.callback = true;\n                        this.debug ? debugOut(out, false, this.imapServer.IMapConnect.imapUserName) : null;\n                        next(null, out + Base64Data + '\\r\\n');\n                    }\n                    return _callback();\n                }\n                default:\n                    return _callback();\n            }\n        };\n        const _length = out.length + Base64Data.length;\n        this.Tag = `A${this.imapServer.TagCount1()}`;\n        this.cmd = `APPEND \"${folderName}\" {${_length}${this.imapServer.literalPlus ? '+' : ''}}`;\n        this.cmd = `${this.Tag} ${this.cmd}`;\n        const _time = _length / 1000 + 20000;\n        this.debug ? debugOut(this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID) : null;\n        if (!this.writable) {\n            return this.doCommandCallback(new Error('! imap.writable '));\n        }\n        this.push(this.cmd + '\\r\\n');\n        this.appendWaitResponsrTimeOut = timers_1.setTimeout(() => {\n            return this.doCommandCallback(new Error('appendStreamV3 mail serrver write timeout!'));\n        }, _time);\n        //console.log (`*************************************  append time = [${ time }] `)\n        if (this.imapServer.literalPlus) {\n            this.debug ? debugOut(out + Base64Data + '\\r\\n', false, this.imapServer.listenFolder || this.imapServer.imapSerialID) : null;\n            this.push(out);\n            this.push(Base64Data + '\\r\\n');\n        }\n    }\n    seachUnseen(callabck) {\n        let newSwitchRet = null;\n        let moreNew = false;\n        this.doCommandCallback = (err) => {\n            if (err)\n                return callabck(err);\n            return callabck(null, newSwitchRet, moreNew);\n        };\n        this.commandProcess = (text, cmdArray, next, _callback) => {\n            switch (cmdArray[0]) {\n                case '*': {\n                    if (/^SEARCH$/i.test(cmdArray[1])) {\n                        const uu1 = cmdArray[2] && cmdArray[2].length > 0 ? parseInt(cmdArray[2]) : 0;\n                        if (cmdArray.length > 2 && uu1) {\n                            if (!cmdArray[cmdArray.length - 1].length)\n                                cmdArray.pop();\n                            const uu = cmdArray.slice(2).join(',');\n                            if (/\\,/.test(uu[uu.length - 1]))\n                                uu.substr(0, uu.length - 1);\n                            newSwitchRet = uu;\n                            moreNew = cmdArray.length > 3;\n                        }\n                    }\n                    return _callback();\n                }\n                default:\n                    return _callback();\n            }\n        };\n        this.Tag = `A${this.imapServer.TagCount1()}`;\n        this.cmd = `${this.Tag} UID SEARCH ALL`;\n        this.debug ? debugOut(this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID) : null;\n        if (this.writable) {\n            return this.push(this.cmd + '\\r\\n');\n        }\n        return this.imapServer.destroyAll(null);\n    }\n    fetch(fetchNum, callback) {\n        this.doCommandCallback = (err) => {\n            //console.log (`ImapServerSwitchStream doing doCommandCallback [${ newSwitchRet }]`)\n            return callback(err, newSwitchRet);\n        };\n        let newSwitchRet = false;\n        this.commandProcess = (text1, cmdArray, next, _callback) => {\n            switch (cmdArray[0]) {\n                case '*': {\n                    if (/^FETCH$/i.test(cmdArray[2])) {\n                        if (/\\{\\d+\\}/.test(text1)) {\n                            this.imapServer.fetching = parseInt(text1.split('{')[1].split('}')[0]);\n                            this.appendWaitResponsrTimeOut = timers_1.setTimeout(() => {\n                                //this.imapServer.emit ( 'error', new Error (`${ this.cmd } timeout!`))\n                                return this.doCommandCallback(new Error(`${this.cmd} timeout!`));\n                            }, this.imapServer.fetching / 1000 + 30000);\n                        }\n                        this.debug ? console.log(`${text1} doing length [${this.imapServer.fetching}]`) : null;\n                    }\n                    if (/^RECENT$/i.test(cmdArray[2]) && parseInt(cmdArray[1]) > 0) {\n                        newSwitchRet = true;\n                    }\n                    return _callback();\n                }\n                default:\n                    return _callback();\n            }\n        };\n        //console.log (`ImapServerSwitchStream doing UID FETCH `)\n        this.cmd = `UID FETCH ${fetchNum} ${this.imapServer.fetchAddCom}`;\n        this.Tag = `A${this.imapServer.TagCount1()}`;\n        this.cmd = `${this.Tag} ${this.cmd}`;\n        this.debug ? debugOut(this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID) : null;\n        if (this.writable) {\n            return this.push(this.cmd + '\\r\\n');\n        }\n        return this.imapServer.logout();\n    }\n    deleteBox(CallBack) {\n        this.doCommandCallback = CallBack;\n        this.commandProcess = (text1, cmdArray, next, _callback) => {\n            return _callback();\n        };\n        this.cmd = `DELETE \"${this.imapServer.listenFolder}\"`;\n        this.Tag = `A${this.imapServer.TagCount1()}`;\n        this.cmd = `${this.Tag} ${this.cmd}`;\n        this.debug ? debugOut(this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID) : null;\n        if (this.writable)\n            return this.push(this.cmd + '\\r\\n');\n        return this.imapServer.destroyAll(null);\n    }\n    deleteAMailBox(boxName, CallBack) {\n        this.doCommandCallback = err => {\n            return CallBack(err);\n        };\n        this.commandProcess = (text1, cmdArray, next, _callback) => {\n            return _callback();\n        };\n        this.cmd = `DELETE \"${boxName}\"`;\n        this.Tag = `A${this.imapServer.TagCount1()}`;\n        this.cmd = `${this.Tag} ${this.cmd}`;\n        this.debug ? debugOut(this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID) : null;\n        if (this.writable)\n            return this.push(this.cmd + '\\r\\n');\n        return this.imapServer.destroyAll(null);\n    }\n    logout(callback) {\n        if (this.isWaitLogout) {\n            return callback();\n        }\n        this.isWaitLogout = true;\n        this.checkLogout(callback);\n    }\n    logout_process(callback) {\n        //console.trace ('logout')\n        if (!this.writable) {\n            console.log(`logout_process [! this.writable] run return callback ()`);\n            if (callback && typeof callback === 'function') {\n                return callback();\n            }\n        }\n        const doLogout = () => {\n            return this._logout(callback);\n        };\n        if (this.imapServer.listenFolder && this.runningCommand) {\n            //console.trace ()\n            //saveLog  (`logout_process [${ this.imapServer.imapSerialID }] this.imapServer.listenFolder && this.runningCommand = [${ this.runningCommand }]`)\n            this.idleCallBack = doLogout;\n            return this.idleDoingDown();\n        }\n        doLogout();\n    }\n    flagsDeleted(num, CallBack) {\n        this.doCommandCallback = err => {\n            //saveLog ( `ImapServerSwitchStream this.flagsDeleted [${ this.imapServer.listenFolder }] doing flagsDeleted success! typeof CallBack = [${ typeof CallBack }]`)\n            return CallBack(err);\n        };\n        this.commandProcess = (text1, cmdArray, next, _callback) => {\n            return _callback();\n        };\n        this.cmd = `UID STORE ${num} FLAGS.SILENT (\\\\Deleted)`;\n        this.Tag = `A${this.imapServer.TagCount1()}`;\n        this.cmd = `${this.Tag} ${this.cmd}`;\n        this.debug ? debugOut(this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID) : null;\n        if (this.writable) {\n            return this.push(this.cmd + '\\r\\n');\n        }\n        return this.imapServer.destroyAll(null);\n    }\n    expunge(CallBack) {\n        let newSwitchRet = false;\n        this.doCommandCallback = err => {\n            return CallBack(err, newSwitchRet);\n        };\n        this.commandProcess = (text, cmdArray, next, _callback) => {\n            switch (cmdArray[0]) {\n                case '*': {\n                    if (/^RECENT$|^EXPUNGE$/i.test(cmdArray[2]) && parseInt(cmdArray[1]) > 0) {\n                        newSwitchRet = true;\n                    }\n                    return _callback();\n                }\n                default:\n                    return _callback();\n            }\n        };\n        this.Tag = `A${this.imapServer.TagCount1()}`;\n        this.cmd = `${this.Tag} EXPUNGE`;\n        this.debug ? debugOut(this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID) : null;\n        if (this.writable) {\n            return this.push(this.cmd + '\\r\\n');\n        }\n        return this.imapServer.destroyAll(null);\n    }\n    listAllMailBox(CallBack) {\n        let boxes = [];\n        this.doCommandCallback = (err) => {\n            if (err)\n                return CallBack(err);\n            return CallBack(null, boxes);\n        };\n        this.commandProcess = (text, cmdArray, next, _callback) => {\n            switch (cmdArray[0]) {\n                case '*': {\n                    debug ? saveLog(`IMAP listAllMailBox this.commandProcess text = [${text}]`) : null;\n                    if (/^LIST/i.test(cmdArray[1])) {\n                        boxes.push(cmdArray[2] + ',' + cmdArray[4]);\n                    }\n                    return _callback();\n                }\n                default:\n                    return _callback();\n            }\n        };\n        this.Tag = `A${this.imapServer.TagCount1()}`;\n        this.cmd = `${this.Tag} LIST \"\" \"*\"`;\n        this.debug ? debugOut(this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID) : null;\n        if (this.writable)\n            return this.push(this.cmd + '\\r\\n');\n        return this.imapServer.destroyAll(null);\n    }\n}\nclass qtGateImap extends Event.EventEmitter {\n    constructor(IMapConnect, listenFolder, deleteBoxWhenEnd, writeFolder, debug, newMail) {\n        super();\n        this.IMapConnect = IMapConnect;\n        this.listenFolder = listenFolder;\n        this.deleteBoxWhenEnd = deleteBoxWhenEnd;\n        this.writeFolder = writeFolder;\n        this.debug = debug;\n        this.newMail = newMail;\n        this.imapStream = new ImapServerSwitchStream(this, this.deleteBoxWhenEnd, this.debug);\n        this.newSwitchRet = null;\n        this.newSwitchError = null;\n        this.fetching = null;\n        this.tagcount = 0;\n        this.domainName = this.IMapConnect.imapUserName.split('@')[1];\n        this.serverSupportTag = null;\n        this.idleSupport = null;\n        this.condStoreSupport = null;\n        this.literalPlus = null;\n        this.fetchAddCom = '';\n        this.imapEnd = false;\n        this.imapSerialID = Crypto.createHash('md5').update(this.listenFolder + this.writeFolder).digest('hex').toUpperCase();\n        this.port = typeof this.IMapConnect.imapPortNumber === 'object' ? this.IMapConnect.imapPortNumber[0] : this.IMapConnect.imapPortNumber;\n        this.connectTimeOut = null;\n        this.connect();\n        this.once(`error`, err => {\n            debug ? saveLog(`[${this.imapSerialID}] this.on error ${err && err.message ? err.message : null}`) : null;\n            this.imapEnd = true;\n            this.destroyAll(err);\n        });\n    }\n    TagCount1() {\n        if (++this.tagcount < MAX_INT)\n            return this.tagcount;\n        return this.tagcount = 0;\n    }\n    connect() {\n        const _connect = () => {\n            this.socket.setKeepAlive(true);\n            timers_1.clearTimeout(this.connectTimeOut);\n            this.socket.pipe(this.imapStream).pipe(this.socket).once('error', err => {\n                this.destroyAll(err);\n            }).once('end', () => {\n                this.destroyAll(null);\n            });\n        };\n        console.log(`qtGateImap connect mail server [${this.IMapConnect.imapServer}: ${this.port}]`);\n        if (!this.IMapConnect.imapSsl) {\n            this.socket = Net.createConnection({ port: this.port, host: this.IMapConnect.imapServer }, _connect);\n        }\n        else {\n            this.socket = Tls.connect({ rejectUnauthorized: !this.IMapConnect.imapIgnoreCertificate, host: this.IMapConnect.imapServer, port: this.port }, _connect);\n        }\n        this.socket.once('error', err => {\n            if (typeof this.socket.end === 'function') {\n                this.socket.end();\n            }\n        });\n        this.connectTimeOut = timers_1.setTimeout(() => {\n            console.log(`qtGateImap on connect socket tiemout! this.imapStream.end`);\n            if (this.socket && typeof this.socket.end === 'function') {\n                this.socket.end();\n            }\n            this.imapStream.end();\n            this.emit('error', new Error('Connect timeout!'));\n        }, socketTimeOut);\n    }\n    destroyAll(err) {\n        //console.trace (`class qtGateImap on destroyAll`, err )\n        this.imapEnd = true;\n        if (this.socket && typeof this.socket.end === 'function') {\n            this.socket.end();\n        }\n        this.emit('end', err);\n    }\n    logout(CallBack = null) {\n        const _end = () => {\n            if (typeof CallBack === 'function') {\n                return CallBack();\n            }\n        };\n        if (this.imapEnd) {\n            return _end();\n        }\n        this.imapEnd = true;\n        return this.imapStream.logout(() => {\n            if (this.socket && typeof this.socket.end === 'function') {\n                this.socket.end();\n            }\n            this.emit('end');\n            return _end();\n        });\n    }\n}\nexports.qtGateImap = qtGateImap;\nexports.seneMessageToFolder = (IMapConnect, writeFolder, message, subject, CallBack) => {\n    const wImap = new qtGateImap(IMapConnect, null, false, writeFolder, debug, null);\n    let _callback = false;\n    wImap.once('error', err => {\n        wImap.destroyAll(err);\n        if (!_callback) {\n            CallBack(err);\n            return _callback = true;\n        }\n    });\n    wImap.once('ready', () => {\n        Async.series([\n            next => wImap.imapStream.createBox(false, writeFolder, next),\n            next => wImap.imapStream.appendStreamV4(message, subject, writeFolder, next),\n            next => wImap.imapStream._logout(next)\n        ], err => {\n            _callback = true;\n            if (err) {\n                wImap.destroyAll(err);\n            }\n            return CallBack(err);\n        });\n    });\n};\nclass qtGateImapRead extends qtGateImap {\n    constructor(IMapConnect, listenFolder, deleteBoxWhenEnd, newMail) {\n        super(IMapConnect, listenFolder, deleteBoxWhenEnd, null, debug, newMail);\n        this.openBox = false;\n        this.once('ready', () => {\n            this.openBox = true;\n        });\n    }\n    fetchAndDelete(Uid, CallBack) {\n        if (!this.openBox) {\n            return CallBack(new Error('not ready!'));\n        }\n        return Async.series([\n            next => this.imapStream.fetch(Uid, next),\n            next => this.imapStream.flagsDeleted(Uid, next),\n            next => this.imapStream.expunge(next)\n        ], CallBack);\n    }\n}\nexports.qtGateImapRead = qtGateImapRead;\nexports.getMailAttached = (email) => {\n    const attachmentStart = email.indexOf('\\r\\n\\r\\n');\n    if (attachmentStart < 0) {\n        console.log(`getMailAttached error! can't faind mail attahced start!\\n${email.toString()}`);\n        return '';\n    }\n    const attachment = email.slice(attachmentStart + 4);\n    return attachment.toString();\n};\nexports.getMailSubject = (email) => {\n    const ret = email.toString().split('\\r\\n\\r\\n')[0].split('\\r\\n');\n    const yy = ret.find(n => {\n        return /^subject: /i.test(n);\n    });\n    if (!yy || !yy.length) {\n        debug ? saveLog(`\\n\\n${ret} \\n`) : null;\n        return '';\n    }\n    return yy.split(/^subject: +/i)[1];\n};\nexports.getMailAttachedBase64 = (email) => {\n    const attachmentStart = email.indexOf('\\r\\n\\r\\n');\n    if (attachmentStart < 0) {\n        console.log(`getMailAttached error! can't faind mail attahced start!`);\n        return null;\n    }\n    const attachment = email.slice(attachmentStart + 4);\n    return attachment.toString();\n};\nexports.imapAccountTest = (IMapConnect, CallBack) => {\n    debug ? saveLog(`start test imap [${IMapConnect.imapUserName}]`, true) : null;\n    let callbackCall = false;\n    let startTime = null;\n    const listenFolder = Uuid.v4();\n    const ramdomText = Crypto.randomBytes(20);\n    let timeout = null;\n    const doCallBack = (err, ret) => {\n        if (!callbackCall) {\n            //saveLog (`imapAccountTest doing callback err [${ err && err.message ? err.message : `undefine `}] ret [${ ret ? ret : 'undefine'}]`)\n            callbackCall = true;\n            timers_1.clearTimeout(timeout);\n            return CallBack(err, ret);\n        }\n    };\n    let rImap = new qtGateImapRead(IMapConnect, listenFolder, debug, mail => {\n        rImap.logout();\n    });\n    rImap.once('ready', () => {\n        debug ? saveLog(`rImap.once ( 'ready' ) do new qtGateImapwrite`) : null;\n        rImap.logout();\n    });\n    rImap.once('end', err => {\n        console.log(`imapAccountTest on end err = `, err);\n        doCallBack(err);\n    });\n    rImap.once('error', err => {\n        debug ? saveLog(`rImap.once ( 'error' ) [${err.message}]`, true) : null;\n        return doCallBack(err);\n    });\n};\nexports.imapGetMediaFile = (IMapConnect, fileName, CallBack) => {\n    let rImap = new qtGateImapRead(IMapConnect, fileName, debug, mail => {\n        rImap.logout();\n        const retText = exports.getMailAttachedBase64(mail);\n        return CallBack(null, retText);\n    });\n};\nconst pingPongTimeOut = 1000 * 15;\nclass imapPeer extends Event.EventEmitter {\n    constructor(imapData, listenBox, writeBox, exit) {\n        super();\n        this.imapData = imapData;\n        this.listenBox = listenBox;\n        this.writeBox = writeBox;\n        this.exit = exit;\n        this.mailPool = [];\n        this.domainName = this.imapData.imapUserName.split('@')[1];\n        this.waitingReplyTimeOut = null;\n        this.pingUuid = null;\n        this.doingDestroy = false;\n        this.peerReady = false;\n        this.readyForSendMail = false;\n        this.makeWImap = false;\n        this.makeRImap = false;\n        this.pingCount = 1;\n        this.needPing = false;\n        this.needPingTimeOut = null;\n        this.rImap = null;\n        debug ? saveLog(`doing peer account [${imapData.imapUserName}] listen with[${listenBox}], write with [${writeBox}] `) : null;\n        this.newReadImap();\n    }\n    mail(email) {\n        //console.log (`imapPeer new mail:\\n\\n${ email.toString()}`)\n        const subject = exports.getMailSubject(email);\n        const attr = exports.getMailAttached(email);\n        if (subject) {\n            /**\n             *\n             *\n             *\n             */\n            if (subject === this.pingUuid) {\n                this.pingUuid = null;\n                console.log(`CoNETConnected`);\n                console.log(attr);\n                timers_1.clearTimeout(this.waitingReplyTimeOut);\n                return this.emit('CoNETConnected', attr);\n            }\n            console.log(`this.newMail\\n${email.toString()}`);\n            return this.newMail(attr, subject);\n        }\n        console.log(`get mail have not subject\\n\\n`, email.toString());\n    }\n    replyPing(uu) {\n        return this.AppendWImap1(null, uu, err => {\n            if (err) {\n                debug ? saveLog(`reply Ping ERROR! [${err.message ? err.message : null}]`) : null;\n            }\n        });\n    }\n    AppendWImap1(mail, uuid, CallBack) {\n        return exports.seneMessageToFolder(this.imapData, this.writeBox, mail, uuid, CallBack);\n    }\n    setTimeOutOfPing() {\n        timers_1.clearTimeout(this.waitingReplyTimeOut);\n        timers_1.clearTimeout(this.needPingTimeOut);\n        this.needPing = false;\n        debug ? saveLog(`Make Time Out for a Ping, ping ID = [${this.pingUuid}]`, true) : null;\n        return this.waitingReplyTimeOut = timers_1.setTimeout(() => {\n            debug ? saveLog(`ON setTimeOutOfPing this.emit ( 'pingTimeOut' ) `, true) : null;\n            return this.emit('pingTimeOut');\n        }, pingPongTimeOut);\n    }\n    Ping() {\n        if (this.pingUuid) {\n            return debug ? saveLog(`Ping already waiting other ping, STOP!`) : null;\n        }\n        this.emit('ping');\n        const pingUuid = Uuid.v4();\n        return this.AppendWImap1(null, pingUuid, err => {\n            if (err) {\n                return this.destroy(err);\n            }\n            this.pingUuid = pingUuid;\n            return this.setTimeOutOfPing();\n        });\n    }\n    newReadImap() {\n        if (this.makeRImap || this.rImap && this.rImap.imapStream && this.rImap.imapStream.readable) {\n            return debug ? saveLog(`newReadImap have rImap.imapStream.readable = true, stop!`, true) : null;\n        }\n        this.makeRImap = true;\n        //saveLog ( `=====> newReadImap!`, true )\n        this.rImap = new qtGateImapRead(this.imapData, this.listenBox, debug, email => {\n            this.mail(email);\n        });\n        this.rImap.once('ready', () => {\n            this.makeRImap = false;\n            debug ? saveLog(`this.rImap.once on ready `) : null;\n            this.Ping();\n        });\n        this.rImap.once('error', err => {\n            this.makeRImap = false;\n            debug ? saveLog(`rImap on Error [${err.message}]`, true) : null;\n            if (err && err.message && /auth|login|log in|Too many simultaneous|UNAVAILABLE/i.test(err.message)) {\n                return this.destroy(1);\n            }\n            if (this.rImap && this.rImap.destroyAll && typeof this.rImap.destroyAll === 'function') {\n                return this.rImap.destroyAll(null);\n            }\n        });\n        this.rImap.once('end', err => {\n            this.rImap = null;\n            this.makeRImap = false;\n            if (typeof this.exit === 'function') {\n                debug ? saveLog(`imapPeer rImap on END!`) : null;\n                this.exit(err);\n                return this.exit = null;\n            }\n            debug ? saveLog(`imapPeer rImap on END! but this.exit have not a function `) : null;\n        });\n    }\n    destroy(err) {\n        timers_1.clearTimeout(this.waitingReplyTimeOut);\n        if (this.doingDestroy) {\n            return console.log(`destroy but this.doingDestroy = ture`);\n        }\n        this.doingDestroy = true;\n        this.peerReady = false;\n        if (this.rImap) {\n            return this.rImap.imapStream._logout(() => {\n                if (typeof this.exit === 'function') {\n                    this.exit(err);\n                }\n            });\n        }\n        if (this.exit && typeof this.exit === 'function') {\n            this.exit(err);\n            this.exit = null;\n        }\n    }\n    sendDataToANewUuidFolder(data, writeBox, subject, CallBack) {\n        return exports.seneMessageToFolder(this.imapData, writeBox, data, subject, CallBack);\n    }\n}\nexports.imapPeer = imapPeer;\n"
  },
  {
    "path": "app/tools/imap.ts",
    "content": "/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/// \nimport * as Net from 'net'\nimport * as Tls from 'tls'\nimport * as Stream from 'stream'\nimport * as Event from 'events'\nimport * as Uuid from 'node-uuid'\nimport * as Async from 'async'\nimport * as Crypto from 'crypto'\nimport * as Util from 'util'\nimport { join } from 'path'\nimport { homedir }from 'os'\nimport { setTimeout, clearTimeout } from 'timers';\nimport { start } from 'repl'\nimport { Buffer } from 'buffer'\nimport * as Fs from 'fs'\nimport * as Tool from './initSystem'\n\nconst MAX_INT = 9007199254740992\nconst debug = false\nconst pingFailureTime = 1000 * 60\nconst NoopLoopWaitingTime = 1000 * 1\n\nconst ErrorLogFile = join ( Tool.QTGateFolder, 'imap.log' )\nconst ErrorLogFileStream = join ( Tool.QTGateFolder, 'imapStream.log' )\nlet flag = 'w'\nconst saveLog = ( log: string, _console: boolean = true ) => {\n\n    const Fs = require ('fs')\n    const data = `${ new Date().toUTCString () }: ${ log }\\r\\n`\n    _console ? console.log ( data ) : null\n}\nconst debugOut = ( text: string, isIn: boolean, serialID: string ) => {\n    const log = `【${ new Date().toISOString()}】【${ serialID }】${ isIn ? '<=' : '=>'} 【${ text }】`\n    saveLog ( log )\n\n}\n\ninterface qtGateImapwriteAppendPool {\n    callback: (err?: Error) => void\n    text: string\n}\nconst idleInterval = 1000 * 180      // 3 mins\nconst socketTimeOut = 1000 * 60\n\nclass ImapServerSwitchStream extends Stream.Transform {\n    public commandProcess ( text: string, cmdArray: string[], next, callback ) {}\n    public name: string\n    public _buffer = Buffer.alloc (0)\n    public serverCommandError ( err: Error, CallBack ) {\n        this.imapServer.emit ( 'error', err )\n        if ( CallBack ) {\n\t\t\tCallBack ( err )\n\t\t}\n            \n    }\n    public Tag: string = null\n    public cmd: string = null\n    public callback = false\n    public doCommandCallback = null\n    private _login = false\n    private first = true\n    private idleCallBack = null\n    public isWaitLogout = false\n    public waitLogoutCallBack = null\n    private _newMailChunk = Buffer.alloc (0)\n    public idleResponsrTime: NodeJS.Timer = null\n    public canDoLogout = false\n    private ready = false\n    public appendWaitResponsrTimeOut:NodeJS.Timer = null\n    public runningCommand = null\n    //private nextRead = true\n    public idleNextStop :NodeJS.Timer = null\n    private reNewCount = 0\n    private isImapUserLoginSuccess = false\n\tprivate waitingDoingIdleStop = false\n\t\n\tprivate idleDoingDone = false\n\n\n\tprivate idleDoingDown () {\n\t\tclearTimeout ( this.idleNextStop )\n\t\tif ( this.idleDoingDone ) {\n\t\t\treturn this.debug ? console.log ( `idleDoingDown do nothing because already doing!` ) : null \n\t\t}\n\t\tif ( this.writable ) {\n\t\t\tthis.idleDoingDone = true\n\t\t\tthis.debug ? debugOut ( `DONE`, false, this.imapServer.listenFolder || this.imapServer.imapSerialID ) : null\n\t\t\treturn this.push (`DONE\\r\\n`)\n\t\t}\n\t\treturn this.imapServer.destroyAll ( null )\n\t\t\n\t}\n\n    constructor ( public imapServer: qtGateImap, private exitWithDeleteBox: boolean, public debug: boolean ) {\n        super ()\n    }\n\n    private doCapability ( capability ) {\n        this.imapServer.serverSupportTag = capability\n        this.imapServer.idleSupport = /IDLE/i.test ( capability )\n        this.imapServer.condStoreSupport = /CONDSTORE/i.test ( capability )\n        this.imapServer.literalPlus = /LITERAL\\+/i.test ( capability )\n        const ii = /X\\-GM\\-EXT\\-1/i.test ( capability )\n        const ii1 = /CONDSTORE/i.test ( capability )\n        const listenFolder = this.imapServer.listenFolder\n        return this.imapServer.fetchAddCom = `(${ ii ? 'X-GM-THRID X-GM-MSGID X-GM-LABELS ': '' }${ ii1 ? 'MODSEQ ' : ''}BODY[])`\n    }\n\n    public preProcessCommane ( commandLine: string, _next, callback ) {\n\n        const cmdArray = commandLine.split (' ')\n        this.debug ? debugOut ( `${commandLine}`, true, this.imapServer.listenFolder || this.imapServer.imapSerialID ) : null\n\n        if ( this._login ) {\n            switch ( commandLine[0] ) {\n\n                case '+':                                    /////       +\n                case '*': {                                  /////       *\n                    return this.commandProcess ( commandLine, cmdArray, _next, callback )\n                }\n\n                case 'I':           //  IDLE\n                case 'D':           //  NODE\n                case 'N':           //  NOOP\n                case 'A': {                                  /////       A\n                    clearTimeout ( this.appendWaitResponsrTimeOut )\n                    clearTimeout ( this.idleResponsrTime )\n                    this.runningCommand = false\n                    if ( this.Tag !== cmdArray[0] ) {\n                        return this.serverCommandError ( new Error ( `this.Tag[${ this.Tag }] !== cmdArray[0] [${ cmdArray[0] }]\\ncommandLine[${ commandLine }]` ), callback )\n                    }\n                    if ( /^ok$/i.test ( cmdArray[1] )) {\n                        \n                        this.doCommandCallback ( null, commandLine )\n                        return callback ()\n\t\t\t\t\t}\n\t\t\t\t\tconsole.log (`IMAP preProcessCommane on NO Tag!`, commandLine )\n                    const errs = cmdArray.slice (2).join(' ')\n                    this.doCommandCallback ( new Error ( errs ))\n                    return callback ()\n\n                }\n                default:\n                    return this.serverCommandError ( new Error (`_commandPreProcess got switch default error!` ), callback )\n            }\n        }\n        return this.login ( commandLine, cmdArray, _next, callback )\n    }\n\n    public checkFetchEnd () {\n\n        if ( this._buffer.length <= this.imapServer.fetching ) {\n            return null\n        }\n        \n        const body = this._buffer.slice ( 0, this.imapServer.fetching )\n        const uu = this._buffer.slice ( this.imapServer.fetching )\n        \n        let index1 = uu.indexOf ('\\r\\n* ')\n        let index = uu.indexOf ('\\r\\nA') \n\n        index = index < 0 || index1 > 0 && index > index1 ? index1 : index\n\n        if ( index < 0 )\n            return null\n\n        this._buffer = uu.slice ( index + 2 )\n        this.imapServer.fetching = null\n        return body\n        \n    }\n\n    public _transform ( chunk: Buffer, encoding, next ) {\n        \n        this.callback = false\n        //console.log ('************************************** ImapServerSwitchStream _transform chunk **************************************')\n        //console.log ( chunk.toString ())\n        //console.log ('************************************** ImapServerSwitchStream _transform chunk **************************************')\n        this._buffer = Buffer.concat ([ this._buffer, chunk ])\n        \n        const doLine = () => {\n            const __CallBack = () => {\n                \n                let index = -1\n                if (!this._buffer.length || (index = this._buffer.indexOf('\\r\\n')) < 0) {\n                    if (!this.callback) {\n                        //      this is for IDLE do DONE command\n                        //this.emit ( 'hold' )\n                        this.callback = true\n                        return next()\n                    }\n                    //      did next with other function\n                    return\n                }\n\n                const _buf = this._buffer.slice ( 0, index )\n                if ( _buf.length ) {\n                    return this.preProcessCommane ( _buf.toString (), next, () => {\n                        this._buffer = this._buffer.slice ( index + 2 )\n                        return doLine ()\n                    })\n                }\n                if (! this.callback ) {\n                    this.callback = true\n                    return next()\n                }\n                return\n            }\n\n            if ( this.imapServer.fetching ) {\n                //console.log ('************************************** ImapServerSwitchStream _transform chunk **************************************')\n                //console.log ( this._buffer.toString ())\n                //console.log ('************************************** ImapServerSwitchStream _transform chunk **************************************')\n                const _buf1 = this.checkFetchEnd ()\n                \n                //  have no fill body get next chunk\n                if ( ! _buf1 ) {\n                    if ( !this.callback ) {\n                        this.callback = true\n                        return next ()\n                    }\n                    return\n                }\n                /*\n                console.log ('************************************** ImapServerSwitchStream _transform chunk **************************************')\n                console.log ( _buf1.length )\n                console.log ( _buf1.toString ())\n                */\n                \n                \n                this.imapServer.newMail ( _buf1 )\n                \n            }\n            return __CallBack ()\n        }\n\n        return doLine ()\n    }\n\n    private capability () {\n\n        this.doCommandCallback = ( err ) => {\n\n            if ( this.imapServer.listenFolder ) {\n                \n                return this.createBox ( true, this.imapServer.listenFolder, ( err, newMail, UID: string ) => {\n                    \n                    if ( err ) {\n                        console.log (`========================= [${ this.imapServer.listenFolder || this.imapServer.imapSerialID }] openBox Error do this.end ()`, err )\n                        return this.imapServer.destroyAll( err )\n                    }\n                    /*\n                    if ( this.isWaitLogout ) {\n                        console.log (`capability this.waitLogout = true doing logout_process ()`)\n                        return this.logout_process ( this.waitLogoutCallBack )\n                    }\n                    */\n                    if ( /^inbox$/i.test ( this.imapServer.listenFolder )) {\n                        console.log (`capability open inbox !`)\n                        this.canDoLogout = this.ready = true\n                        return this.imapServer.emit ( 'ready' )\n                    }\n\n                    if ( newMail && typeof this.imapServer.newMail === 'function') {\n                        \n                        //this.imapServer.emit ( 'ready' )\n                        //console.log (`[${ this.imapServer.imapSerialID }]capability doing newMail = true`)\n                        return this.doNewMail ( UID )\n                    }\n                    \n                    if ( typeof this.imapServer.newMail === 'function' ) {\n                        this.idleNoop ()\n                    }\n                    this.canDoLogout = this.ready = true\n                    this.imapServer.emit ( 'ready' )\n                })\n            }\n            this.canDoLogout = this.ready = true\n            this.imapServer.emit ( 'ready' )\n        }\n\n        this.commandProcess = ( text: string, cmdArray: string[], next, callback ) => {\n            switch ( cmdArray[0] ) {\n                case '*': {                                  /////       *\n                    //          check imap server is login ok\n                    if ( /^CAPABILITY$/i.test ( cmdArray [1] ) && cmdArray.length > 2 ) {\n                        const kkk = cmdArray.slice (2).join (' ')\n                        this.doCapability ( kkk )\n                    }\n                    return callback ()\n                }\n                default:\n                return callback ()\n            }\n        }\n\n        this.Tag = `A${ this.imapServer.TagCount1() }`\n        this.cmd = `${ this.Tag } CAPABILITY`\n        this.debug ? debugOut ( this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID ) : null\n\n        if ( this.writable ) {\n\t\t\treturn this.push ( this.cmd + '\\r\\n')\n\t\t}\n            \n        return this.imapServer.destroyAll( null)\n    }\n\n    public doNewMail ( UID = '' ) {\n        \n        this.reNewCount --\n               \n        this.canDoLogout = false\n        this.runningCommand = 'doNewMail'\n        this.seachUnseen (( err, newMailIds, havemore ) => {\n            if ( err ) {\n                return this.imapServer.destroyAll ( err )\n\t\t\t}\n\t\t\tlet haveMoreNewMail = false\n\t\t\tconst getNewMail = ( _fatchID, CallBack ) => {\n            \n\t\t\t\treturn Async.waterfall ([\n\t\t\t\t\tnext => this.fetch ( _fatchID, next ),\n\t\t\t\t\t( _moreNew, next ) => {\n\t\t\t\t\t\thaveMoreNewMail = _moreNew\n\t\t\t\t\t\treturn this.flagsDeleted ( _fatchID, next )\n\t\t\t\t\t},\n\t\t\t\t\tnext => {\n\t\t\t\t\t\treturn this.expunge ( next )\n\t\t\t\t\t}\n\t\t\t\t], CallBack )\n\t\t\t}\n\t\t\t\n            if ( newMailIds || ( newMailIds = UID )) {\n\n                const uids = newMailIds.split(',')\n                //console.log (`doNewMail newMailIds = 【${ newMailIds }】`)\n\t\t\t\treturn Async.eachSeries ( uids, ( n ,next ) => {\n\t\t\t\t\tconst _uid = parseInt( n )\n\t\t\t\t\tif ( _uid > 0 ) {\n\t\t\t\t\t\treturn getNewMail ( _uid, next )\n\t\t\t\t\t}\n\t\t\t\t\treturn next ()\n\t\t\t\t}, ( err ) => {\n\t\t\t\t\tthis.runningCommand = null\n\t\t\t\t\tif ( err ) {\n\t\t\t\t\t\tdebug ? saveLog ( `ImapServerSwitchStream [${ this.imapServer.listenFolder || this.imapServer.imapSerialID }] doNewMail ERROR! [${ err.message }]`) : null\n\t\t\t\t\t\treturn this.imapServer.destroyAll ( err )\n\t\t\t\t\t}\n\t\t\t\t\tif ( haveMoreNewMail || havemore ) {\n\t\t\t\t\t\t\n\t\t\t\t\t\treturn this.doNewMail ()\n\t\t\t\t\t}\n\t\t\t\t\treturn this.idleNoop ( )\n\t\t\t\t})\n                \n\t\t\t}\n\n\t\t\tthis.runningCommand = null\n\t\t\tthis.imapServer.emit ( 'ready' )\n\t\t\treturn this.idleNoop()\n\t\t\t\n            \n        })\n        \n    }\n\n    public checkLogout ( CallBack ) {\n\n        if ( !this.isWaitLogout ) {\n            //console.log (`[${ this.imapServer.imapSerialID }] checkLogout have not waiting logout`)\n            return CallBack ()\n        }\n        const _callBack = () => {\n            if ( this.exitWithDeleteBox ) {\n            \n                return this.deleteBox (() => {\n                    return this.logout_process ( CallBack )\n                })\n            }\n            return this.logout_process ( CallBack )    \n        }\n\n        if ( ! this.canDoLogout ) {\n            this.isWaitLogout = true\n            this.idleCallBack = _callBack\n            return //console.trace (`[${ this.imapServer.imapSerialID }] checkLogout canDoLogout = false, set this.isWaitLogout = true &&  this.idleCallBack = CallBack`)\n            \n        }\n        return _callBack ()\n        \n    }\n\n    private idleNoop () {\n        if ( this.isWaitLogout ) {\n            if ( this.idleCallBack && typeof this.idleCallBack === 'function') {\n                return this.idleCallBack()\n            }\n            return console.log (`idleNoop have this.isWaitLogout but have not this.idleCallBack ${ typeof this.idleCallBack }`)\n        }\n        this.canDoLogout = true\n\t\tlet newSwitchRet = false\n\t\tthis.idleDoingDone = false\n        this.runningCommand = 'idle'\n        if ( ! this.ready ) {\n            this.ready = true\n            this.imapServer.emit ( 'ready' )\n\t\t}\n\t\t\n        this.doCommandCallback = ( err => {\n            if ( err ) {\n                return this.imapServer.destroyAll ( err )\n            }\n            this.waitingDoingIdleStop = false\n            this.runningCommand = null\n            if ( this.idleCallBack ) {\n                this.idleCallBack ()\n                return this.idleCallBack = null\n            }\n            //console.log(`IDLE DONE newSwitchRet = [${newSwitchRet}] nextRead = [${this.nextRead}]`)\n            if ( newSwitchRet || this.reNewCount > 0 ) {\n                return this.doNewMail ()\n            }\n            \n            if ( this.imapServer.idleSupport ) {\n                return this.idleNoop ()\n\t\t\t}\n\t\t\t/**\n\t\t\t * NOOP support\n\t\t\t */\n\t\t\tsetTimeout(() => {\n\t\t\t\tif ( !this.runningCommand ) {\n\t\t\t\t\treturn this.idleNoop ()\n\t\t\t\t}\n\t\t\t\t\n\t\t\t},  NoopLoopWaitingTime )\n\n        })\n    \n        this.idleNextStop = this.imapServer.idleSupport\n            ? setTimeout (() => {\n\t\t\t\tthis.idleDoingDown()\n            }, idleInterval )\n\t\t\t: null\n\t\t\t\n        this.commandProcess = (  text: string, cmdArray: string[], next, callback ) => {\n\t\t\t//console.log (`idleNoop commandProcess coming ${ text }\\n${ cmdArray }`)\n            switch ( cmdArray[0] ) {\n                case '+':\n                case '*': {\n                    clearTimeout ( this.idleResponsrTime )\n                    \n\t\t\t\t\tif ( /^RECENT$|^EXISTS$/i.test ( cmdArray[2] ) || this.isWaitLogout ) {\n\t\t\t\t\t\tnewSwitchRet = true\n\t\t\t\t\t\tif ( this.imapServer.idleSupport ) {\n\t\t\t\t\t\t\tthis.idleDoingDown()\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t}\n                    return callback ()\n                }\n                default:\n                return callback ()\n            }\n        }\n        \n        const name = this.imapServer.idleSupport ? 'IDLE' : 'NOOP'\n        this.Tag = `A${ this.imapServer.TagCount1() }`\n        this.cmd = `${ this.Tag } ${ name }`\n        \n        this.debug ? debugOut ( this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID ) : null\n        if ( this.writable ) {\n           \n            return this.push ( this.cmd + '\\r\\n')\n        }\n        return this.imapServer.destroyAll ( null )\n        \n    }\n\n    private login ( text: string, cmdArray: string[], next, _callback ) {\n\n        this.doCommandCallback = ( err: Error ) => {\n            \n            if ( ! err ) {\n                this.isImapUserLoginSuccess = true\n                return this.capability ()\n            }\n            console.log (`ImapServerSwitchStream class login error `, err )\n            return this.imapServer.destroyAll ( err )\n        }\n\n        this.commandProcess = (  text: string, cmdArray: string[], next, callback ) => {\n            switch ( cmdArray[0] ) {\n                case '+':\n                case '*': {\n                    return callback ()\n                }\n                default:\n                return callback ()\n            }\n        }\n        \n        switch ( cmdArray[0] ) {\n            \n            case '*': {                                  /////       *\n                //          check imap server is login ok\n                if ( /^ok$/i.test ( cmdArray [1]) && this.first ) {\n                    this.first = false\n                    this.Tag = `A${ this.imapServer.TagCount1() }`\n                    this.cmd = `${ this.Tag } LOGIN \"${ this.imapServer.IMapConnect.imapUserName }\" \"${ this.imapServer.IMapConnect.imapUserPassword }\"`\n                    this.debug ? debugOut ( this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID ) : null\n                    this.callback = this._login = true\n                    if ( this.writable ) {\n                        return next ( null, this.cmd + '\\r\\n' )\n                    }\n                        \n                    this.imapServer.destroyAll(null)\n                }\n                //\n                return _callback ()\n            }\n            default:\n            \n            return this.serverCommandError ( new Error ( `login switch default ERROR!` ), _callback )\n        }\n\n    }\n\n    public createBox ( openBox: boolean, folderName: string, CallBack ) {\n\n        this.doCommandCallback = ( err ) => {\n            if ( err ) {\n                if ( err.message && !/exists/i.test ( err.message )) {\n                    return CallBack ( err )\n                }\n                \n            }\n                \n            if ( openBox ) {\n                return this.openBox ( CallBack )\n            }\n            return CallBack ()\n\t\t}\n\t\t\n        this.commandProcess = ( text: string, cmdArray: string[], next, callback ) => {\n            return callback ()\n\t\t}\n\t\t\n        this.Tag = `A${ this.imapServer.TagCount1() }`\n        this.cmd = `${ this.Tag } CREATE \"${ folderName }\"`\n        this.debug ? debugOut ( this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID ) : null\n        if ( this.writable ) {\n            return this.push ( this.cmd + '\\r\\n')\n        }\n        \n        return this.imapServer.destroyAll ( null )\n\n    }\n\n    private openBox ( CallBack ) {\n\t\tlet newSwitchRet = false\n\t\tlet UID = 0\n        this.doCommandCallback = ( err ) => {\n            if ( err ) {\n                return this.createBox ( true, this.imapServer.listenFolder, CallBack )\n            }\n            CallBack ( null, newSwitchRet, UID )\n        }\n\n        this.commandProcess = ( text: string, cmdArray: string[], next, _callback ) => {\n            switch ( cmdArray[0] ) {\n                case '*': {\n                    if ( /^EXISTS$|^UIDNEXT$|UNSEEN/i.test ( cmdArray [2])) {\n\t\t\t\t\t\tconst _num = text.split ('UNSEEN ')[1]\n\t\t\t\t\t\tif ( _num ) {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tUID = parseInt ( _num.split (']')[0])\n\t\t\t\t\t\t}\n                        newSwitchRet = true\n                        \n                    }\n                    return _callback ()\n                }\n                default:\n                return _callback ()\n            }\n        }\n\n        const conText = this.imapServer.condStoreSupport ? ' (CONDSTORE)' : ''\n        \n        this.Tag = `A${ this.imapServer.TagCount1() }`\n        this.cmd = `${ this.Tag } SELECT \"${ this.imapServer.listenFolder }\"${ conText }`\n        this.debug ? debugOut ( this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID ) : null\n        if ( this.writable )\n            return this.push ( this.cmd + '\\r\\n')\n        this.imapServer.destroyAll(null)\n    }\n\n    public _logout ( CallBack ) {\n        //console.trace (`doing _logout typeof CallBack = [${ typeof CallBack }]`)\n        if ( !this.isImapUserLoginSuccess ) {\n            return CallBack ()\n        }\n        this.doCommandCallback = ( err, info: string ) => {\n            \n            return CallBack ( err )\n\t\t}\n\t\t\n        clearTimeout ( this.idleResponsrTime )\n        this.commandProcess = ( text: string, cmdArray: string[], next, _callback ) => {\n            //console.log (`_logout doing this.commandProcess `)\n            this.isImapUserLoginSuccess = false\n            return _callback ()\n\t\t}\n\t\t\n        this.Tag = `A${ this.imapServer.TagCount1() }`\n\t\tthis.cmd = `${ this.Tag } LOGOUT`\n\t\t\n        this.debug ? debugOut ( this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID ) : null\n        if ( this.writable ) {\n\t\t\tthis.appendWaitResponsrTimeOut = setTimeout (() => {\n\t\t\t\t\n\t\t\t\treturn CallBack ()\n\t\t\t}, 1000 * 10 )\n\n            return this.push ( this.cmd + '\\r\\n')\n        }\n        if ( CallBack && typeof CallBack === 'function') {\n            return CallBack()\n        }\n        \n    }\n\n    public append ( text: string, subject: string, CallBack ) {\n        //console.log (`[${ this.imapServer.imapSerialID }] ImapServerSwitchStream append => [${ text.length }]`)\n        if ( typeof subject === 'function' ) {\n\t\t\tCallBack = subject\n\t\t\tsubject = null\n\t\t}\n        this.canDoLogout = false\n        this.doCommandCallback = ( err, info: string ) => {\n\t\t\tthis.canDoLogout = true\n\t\t\tif ( err && /TRYCREATE|Mailbox/i.test ( err.message )) {\n\t\t\t\treturn this.createBox ( false, this.imapServer.writeFolder, err1 => {\n\t\t\t\t\tif ( err1 ) {\n\t\t\t\t\t\treturn CallBack ( err1 )\n\t\t\t\t\t}\n\t\t\t\t\treturn this.append ( text, subject, CallBack )\n\t\t\t\t})\n\t\t\t}\n            \n            console.log (`[${ this.imapServer.listenFolder || this.imapServer.imapSerialID }] append doCommandCallback `, err )\n            return CallBack ( err, info )\n            \n\t\t}\n\t\t\n\n        let out = `Content-Type: application/octet-stream\\r\\nContent-Disposition: attachment\\r\\nMessage-ID:<${ Uuid.v4() }@>${ this.imapServer.domainName }\\r\\n${ subject ? 'Subject: '+ subject + '\\r\\n' : '' }Content-Transfer-Encoding: base64\\r\\nMIME-Version: 1.0\\r\\n\\r\\n${ text }`\n\n        this.commandProcess = ( text1: string, cmdArray: string[], next, _callback ) => {\n            switch ( cmdArray[0] ) {\n                case '*':\n                case '+': {\n\n                    if ( ! this.imapServer.literalPlus && out.length && ! this.callback ) {\n                        console.log (`====> append ! this.imapServer.literalPlus && out.length && ! this.callback = [${ ! this.imapServer.literalPlus && out.length && ! this.callback }]`)\n                        this.debug ? debugOut ( out, false, this.imapServer.listenFolder || this.imapServer.imapSerialID ) : null\n                        this.callback = true\n                        next ( null, out + '\\r\\n' )\n                    }\n                    return _callback ()\n                }\n                default:\n                return _callback ()\n            }\n        }\n\n        this.Tag = `A${ this.imapServer.TagCount1() }`\n        this.cmd = `APPEND \"${ this.imapServer.writeFolder }\" {${ out.length }${ this.imapServer.literalPlus ? '+' : ''}}`\n        this.cmd = `${ this.Tag } ${ this.cmd }`\n        const time = out.length / 1000 + 20000\n        this.debug ? debugOut ( this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID ) : null\n        if ( !this.writable ) {\n            //console.log (`[${ this.imapServer.imapSerialID }] ImapServerSwitchStream append !this.writable doing imapServer.socket.end ()`)\n            return this.imapServer.socket.end ()\n        }\n            \n        this.push ( this.cmd + '\\r\\n' )\n        \n        this.appendWaitResponsrTimeOut = setTimeout (() => {\n            return this.doCommandCallback( new Error ( `IMAP append TIMEOUT` ))\n\t\t}, time )\n\t\t\n        //console.log (`*************************************  append time = [${ time }] `)\n        if ( this.imapServer.literalPlus ) {\n            this.debug ? debugOut ( out, false, this.imapServer.listenFolder || this.imapServer.imapSerialID ) : null\n            this.push ( out + '\\r\\n' )\n        }\n            \n    }\n\n    public appendStreamV4 ( Base64Data: string = '', subject: string = null, folderName: string, CallBack ) {\n\n        if ( !this.canDoLogout ) {\n            return CallBack ( new Error( `wImap busy!` ))\n        }\n\n        if ( !Base64Data ) {\n            Base64Data = ''\n        }\n\n        this.canDoLogout = false\n\n        this.doCommandCallback = ( err, response: string ) => {\n            //this.debug ? saveLog (`appendStreamV2 doing this.doCommandCallback`) : null\n            clearTimeout ( this.appendWaitResponsrTimeOut )\n            this.canDoLogout = true\n            if ( err ) {\n                if ( /TRYCREATE/i.test( err.message )) {\n                    return this.createBox ( false, this.imapServer.writeFolder, err1 => {\n                        if ( err1 ) {\n                            return CallBack ( err1 )\n                        }\n                        return this.appendStreamV4 ( Base64Data, subject, folderName, CallBack )\n                    })\n                }\n                return CallBack ( err )\n            }\n\t\t\tlet code = response && response.length ? response.split('[')[1]: null\n\t\t\tif ( code ) {\n\t\t\t\t\n\t\t\t\tcode = code.split (' ')[2]\n\t\t\t\t//console.log ( `this.doCommandCallback\\n\\n code = ${ code } code.length = ${ code.length }\\n\\n` )\n\t\t\t\tif ( code ) {\n\t\t\t\t\treturn CallBack( null, parseInt ( code ))\n\t\t\t\t}\n\t\t\t}\n            CallBack ()\n        }\n\n\n        const out = `Content-Type: application/octet-stream\\r\\nContent-Disposition: attachment\\r\\nMessage-ID:<${ Uuid.v4() }@>${ this.imapServer.domainName }\\r\\n${ subject ? 'Subject: '+ subject + '\\r\\n' : '' }Content-Transfer-Encoding: base64\\r\\nMIME-Version: 1.0\\r\\n\\r\\n`\n        \n\t\tthis.commandProcess = ( text1: string, cmdArray: string[], next, _callback ) => {\n\t\t\tswitch ( cmdArray[0] ) {\n\t\t\t\tcase '*':\n\t\t\t\tcase '+': {\n\t\t\t\t\tif ( ! this.imapServer.literalPlus && out.length && ! this.callback ) {\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.callback = true\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.debug ? debugOut ( out, false, this.imapServer.IMapConnect.imapUserName ) : null\n\t\t\t\t\t\tnext ( null, out + Base64Data + '\\r\\n' )\n\t\t\t\t\t}\n\t\t\t\t\treturn _callback ()\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\treturn _callback ()\n\t\t\t}\n\t\t}\n\n\t\tconst _length = out.length + Base64Data.length\n\t\tthis.Tag = `A${ this.imapServer.TagCount1() }`\n\t\tthis.cmd = `APPEND \"${ folderName }\" {${ _length }${ this.imapServer.literalPlus ? '+' : ''}}`\n\t\tthis.cmd = `${ this.Tag } ${ this.cmd }`\n\t\tconst _time = _length / 1000 + 20000\n\t\tthis.debug ? debugOut ( this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID ) : null\n\t\tif ( !this.writable ) {\n\t\t\treturn this.doCommandCallback ( new Error ('! imap.writable '))\n\t\t}\n\t\t\t\n\t\tthis.push ( this.cmd + '\\r\\n' )\n\n\t\tthis.appendWaitResponsrTimeOut = setTimeout (() => {\n\t\t\t\n\t\t\treturn this.doCommandCallback( new Error ('appendStreamV3 mail serrver write timeout!'))\n\t\t\t\t\n\t\t}, _time )\n\n\t\t//console.log (`*************************************  append time = [${ time }] `)\n\t\tif ( this.imapServer.literalPlus ) {\n\t\t\t\n\t\t\t\n\t\t\tthis.debug ? debugOut ( out + Base64Data + '\\r\\n', false, this.imapServer.listenFolder || this.imapServer.imapSerialID ) : null\n\t\t\tthis.push ( out )\n\t\t\tthis.push ( Base64Data + '\\r\\n' )\n\t\t\t\n\t\t}\n        \n        \n        \n        \n    }\n\n    public seachUnseen ( callabck ) {\n        let newSwitchRet = null\n        let moreNew = false\n        this.doCommandCallback = ( err ) => {\n            if ( err )\n                return callabck ( err )\n            return callabck ( null, newSwitchRet, moreNew )\n        }\n        this.commandProcess = ( text: string, cmdArray: string[], next, _callback ) => {\n            switch ( cmdArray[0] ) {\n                case '*': {\n                    if ( /^SEARCH$/i.test ( cmdArray [1] ) ) {\n                        const uu1 = cmdArray[2] && cmdArray[2].length > 0 ? parseInt ( cmdArray[2] ) : 0\n                        if ( cmdArray.length > 2 && uu1 ) {\n                            if ( ! cmdArray [ cmdArray.length - 1 ].length )\n                                cmdArray.pop ()\n                            \n                            const uu = cmdArray.slice ( 2 ).join ( ',' )\n                            if ( /\\,/.test ( uu [ uu.length - 1 ]) )\n                                uu.substr ( 0, uu.length - 1 )\n                            \n                            newSwitchRet =  uu\n                            moreNew = cmdArray.length > 3\n                        }\n                    } \n                    return _callback ()\n                }\n                default:\n                return _callback ()\n            }\n        }\n\n        this.Tag = `A${ this.imapServer.TagCount1() }`\n        this.cmd = `${ this.Tag } UID SEARCH ALL`\n        this.debug ? debugOut ( this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID ) : null\n        if ( this.writable ) {\n\t\t\treturn this.push ( this.cmd + '\\r\\n')\n\t\t}\n            \n        return this.imapServer.destroyAll ( null )\n    }\n\n    public fetch ( fetchNum, callback ) {\n\n        this.doCommandCallback = ( err ) => {\n            //console.log (`ImapServerSwitchStream doing doCommandCallback [${ newSwitchRet }]`)\n            return callback ( err, newSwitchRet )\n        }\n        \n        let newSwitchRet = false\n\n        this.commandProcess = ( text1: string, cmdArray: string[], next, _callback ) => {\n            switch ( cmdArray[0] ) {\n                case '*': {\n                    if ( /^FETCH$/i.test ( cmdArray [ 2 ] )) {\n                        \n                        if ( /\\{\\d+\\}/.test ( text1 )) {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tthis.imapServer.fetching = parseInt ( text1.split('{')[1].split('}')[0] )\n\t\t\t\t\t\t\tthis.appendWaitResponsrTimeOut = setTimeout (() => {\n\t\t\t\t\t\t\t\t//this.imapServer.emit ( 'error', new Error (`${ this.cmd } timeout!`))\n\t\t\t\t\t\t\t\treturn this.doCommandCallback ( new Error (`${ this.cmd } timeout!`))\n\t\t\t\t\t\t\t}, this.imapServer.fetching / 1000 + 30000 )\n                        } \n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.debug ? console.log ( `${ text1 } doing length [${ this.imapServer.fetching }]` ) : null\n\t\t\t\t\t\t\n                    }\n                    if ( /^RECENT$/i.test ( cmdArray[2]) && parseInt ( cmdArray[1]) > 0 ) {\n                        newSwitchRet = true\n                    }\n                    return _callback ()\n                }\n                default:\n                return _callback ()\n            }\n\t\t}\n\t\t\n        //console.log (`ImapServerSwitchStream doing UID FETCH `)\n        this.cmd = `UID FETCH ${ fetchNum } ${ this.imapServer.fetchAddCom }`\n        this.Tag = `A${ this.imapServer.TagCount1() }`\n        this.cmd = `${ this.Tag } ${ this.cmd }`\n        this.debug ? debugOut ( this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID ) : null\n        if ( this.writable ) {\n\t\t\t\n            return this.push ( this.cmd + '\\r\\n' )\n        }\n            \n        return this.imapServer.logout ()\n    }\n\n    private deleteBox ( CallBack ) {\n        this.doCommandCallback = CallBack\n        this.commandProcess = ( text1: string, cmdArray: string[], next, _callback ) => {\n            return _callback ()\n        }\n        this.cmd = `DELETE \"${ this.imapServer.listenFolder }\"`\n        this.Tag = `A${ this.imapServer.TagCount1() }`\n        this.cmd = `${ this.Tag } ${ this.cmd }`\n        this.debug ? debugOut ( this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID ) : null\n        if ( this.writable )\n            return this.push ( this.cmd + '\\r\\n' )\n        return this.imapServer.destroyAll ( null )\n    }\n\n    public deleteAMailBox ( boxName: string, CallBack ) {\n        \n        this.doCommandCallback = err => {\n\n            return CallBack ( err )\n        }\n        this.commandProcess = ( text1: string, cmdArray: string[], next, _callback ) => {\n            return _callback ()\n        }\n        this.cmd = `DELETE \"${ boxName }\"`\n        this.Tag = `A${ this.imapServer.TagCount1() }`\n        this.cmd = `${ this.Tag } ${ this.cmd }`\n        this.debug ? debugOut ( this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID ) : null\n        if ( this.writable )\n            return this.push ( this.cmd + '\\r\\n' )\n        return this.imapServer.destroyAll ( null )\n    }\n\n    public logout ( callback: () => void ) {\n        if ( this.isWaitLogout ) {\n            return callback ()\n        }\n            \n        this.isWaitLogout = true\n        this.checkLogout ( callback )\n    }\n\n    public logout_process ( callback ) {\n        //console.trace ('logout')\n        if ( ! this.writable ) {\n            console.log (`logout_process [! this.writable] run return callback ()`)\n            if ( callback && typeof callback === 'function') {\n                return callback ()\n            }\n            \n        }\n            \n        const doLogout = () => {\n            \n            return this._logout ( callback )\n\t\t}\n\t\t\n        if ( this.imapServer.listenFolder && this.runningCommand ) {\n            //console.trace ()\n            //saveLog  (`logout_process [${ this.imapServer.imapSerialID }] this.imapServer.listenFolder && this.runningCommand = [${ this.runningCommand }]`)\n\t\t\tthis.idleCallBack = doLogout\n\t\t\treturn this.idleDoingDown()\n            \n        }\n\n        doLogout ()\n    }\n\n    public flagsDeleted ( num: string, CallBack ) {\n        this.doCommandCallback = err => {\n            //saveLog ( `ImapServerSwitchStream this.flagsDeleted [${ this.imapServer.listenFolder }] doing flagsDeleted success! typeof CallBack = [${ typeof CallBack }]`)\n            return CallBack ( err )\n        }\n        this.commandProcess = ( text1: string, cmdArray: string[], next, _callback ) => {\n            return _callback ()\n        }\n        this.cmd = `UID STORE ${ num } FLAGS.SILENT (\\\\Deleted)`\n        this.Tag = `A${ this.imapServer.TagCount1() }`\n        this.cmd = `${ this.Tag } ${ this.cmd }`\n        this.debug ? debugOut ( this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID ) : null\n        if ( this.writable ) {\n\t\t\treturn this.push ( this.cmd + '\\r\\n' )\n\t\t}\n            \n        return this.imapServer.destroyAll ( null )\n    }\n\n    public expunge ( CallBack ) {\n\n        let newSwitchRet = false\n        this.doCommandCallback = err => {\n            \n            return CallBack ( err, newSwitchRet )\n        }\n        this.commandProcess = ( text: string, cmdArray: string[], next , _callback ) => {\n            switch ( cmdArray[0] ) {\n                case '*': {\n                    \n                    if ( /^RECENT$|^EXPUNGE$/i.test ( cmdArray[2]) && parseInt (cmdArray[1]) > 0 ) {\n                        newSwitchRet = true\n                    }\n                    return _callback ()\n                }\n                default:\n                return _callback ()\n            }\n        }\n        \n        this.Tag = `A${ this.imapServer.TagCount1() }`\n        this.cmd = `${ this.Tag } EXPUNGE`\n        this.debug ? debugOut ( this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID ) : null\n        if ( this.writable ) {\n\t\t\treturn this.push ( this.cmd + '\\r\\n')\n\t\t}\n            \n        return this.imapServer.destroyAll ( null )\n    }\n\n    public listAllMailBox ( CallBack ) {\n        let boxes = []\n        this.doCommandCallback = ( err ) => {\n            if ( err )\n                return CallBack ( err )\n            return CallBack ( null, boxes )\n        }\n        this.commandProcess = ( text: string, cmdArray: string[], next, _callback ) => {\n            switch ( cmdArray[0] ) {\n                case '*': {\n                    debug ? saveLog ( `IMAP listAllMailBox this.commandProcess text = [${ text }]` ) : null\n                    if ( /^LIST/i.test ( cmdArray [1] ) ) {\n                        boxes.push ( cmdArray[2] + ',' + cmdArray[4] )\n                    } \n                    return _callback ()\n                }\n                default:\n                return _callback ()\n            }\n        }\n\n        this.Tag = `A${ this.imapServer.TagCount1() }`\n        this.cmd = `${ this.Tag } LIST \"\" \"*\"`\n        this.debug ? debugOut ( this.cmd, false, this.imapServer.listenFolder || this.imapServer.imapSerialID ) : null\n        if ( this.writable )\n            return this.push ( this.cmd + '\\r\\n')\n        return this.imapServer.destroyAll ( null )\n    }\n}\n\nexport class qtGateImap extends Event.EventEmitter {\n    public socket: Net.Socket\n    public imapStream: ImapServerSwitchStream = new ImapServerSwitchStream ( this, this.deleteBoxWhenEnd, this.debug )\n    public newSwitchRet = null\n    public newSwitchError = null\n    public fetching = null\n    private tagcount = 0\n    public domainName = this.IMapConnect.imapUserName.split ('@')[1]\n    public serverSupportTag = null\n    public idleSupport = null\n    public condStoreSupport = null\n    public literalPlus = null\n    public fetchAddCom = ''\n    public imapEnd = false\n    \n    public imapSerialID = Crypto.createHash ( 'md5' ).update ( this.listenFolder + this.writeFolder ).digest ('hex').toUpperCase()\n    \n    \n    private port: number = typeof this.IMapConnect.imapPortNumber === 'object' ? this.IMapConnect.imapPortNumber[0]: this.IMapConnect.imapPortNumber\n    public TagCount1 () {\n        if ( ++ this.tagcount < MAX_INT )\n            return this.tagcount\n        return this.tagcount = 0\n    }\n    private connectTimeOut = null\n\n    private connect () {\n        const _connect = () => {\n            \n\t\t\tthis.socket.setKeepAlive ( true )\n\t\t\t\n\t\t\tclearTimeout ( this.connectTimeOut )\n\t\t\t\n            this.socket .pipe ( this.imapStream ).pipe ( this.socket ).once ( 'error', err => {\n\t\t\t\tthis.destroyAll ( err )\n\t\t\t}).once ( 'end', () => {\n\t\t\t\tthis.destroyAll ( null )\n\t\t\t})\n        }\n\t\tconsole.log (`qtGateImap connect mail server [${ this.IMapConnect.imapServer }: ${ this.port }]`)\n        if ( ! this.IMapConnect.imapSsl ) {\n            this.socket = Net.createConnection ({ port: this.port, host: this.IMapConnect.imapServer }, _connect )\n        } else {\n            this.socket  = Tls.connect ({ rejectUnauthorized: ! this.IMapConnect.imapIgnoreCertificate, host: this.IMapConnect.imapServer, port: this.port }, _connect )\n        }\n        this.socket.once ( 'error', err => {\n\t\t\tif ( typeof this.socket.end === 'function') {\n\t\t\t\tthis.socket.end ()\n\t\t\t}\n\t\t\t\n\t\t})\n    \n        this.connectTimeOut = setTimeout (() => {\n            console.log (`qtGateImap on connect socket tiemout! this.imapStream.end`)\n            if ( this.socket && typeof this.socket.end === 'function' ) {\n                this.socket.end ()\n            }\n            this.imapStream.end ()\n            this.emit ( 'error', new Error ('Connect timeout!'))\n        }, socketTimeOut )\n\n\n    }\n\n    constructor ( public IMapConnect: imapConnect, public listenFolder: string, public deleteBoxWhenEnd: boolean, public writeFolder: string, private debug: boolean, public newMail: ( mail ) => void ) {\n        super ()\n        this.connect ()\n        this.once ( `error`, err => {\n            debug ? saveLog ( `[${ this.imapSerialID }] this.on error ${ err && err.message ? err.message : null }`) : null\n            this.imapEnd = true\n            this.destroyAll ( err )\n            \n        })\n        \n        \n    }\n\n    public destroyAll ( err: Error ) {\n\t\t//console.trace (`class qtGateImap on destroyAll`, err )\n\t\tthis.imapEnd = true\n\n\t\tif ( this.socket && typeof this.socket.end === 'function' ) {\n\t\t\tthis.socket.end ()\n\t\t}\n\t\t\n        this.emit ( 'end', err )\n        \n    }\n\n    public logout ( CallBack = null ) {\n\n\t\tconst _end = () => {\n\t\t\tif ( typeof CallBack === 'function' ) {\n\t\t\t\treturn CallBack ()\n\t\t\t}\n\t\t}\n\n        if ( this.imapEnd ) {\n            return _end ()\n        }\n        this.imapEnd = true\n        return this.imapStream.logout (() => {\n            \n            if ( this.socket && typeof this.socket.end === 'function' ) {\n                \n                this.socket.end()\n            }\n            \n\t\t\tthis.emit ( 'end' )\n\t\t\treturn _end ()\n        })\n    }\n\n}\n\nexport const seneMessageToFolder = ( IMapConnect: imapConnect, writeFolder: string, message: string, subject: string, CallBack ) => {\n\tconst wImap = new qtGateImap ( IMapConnect, null, false, writeFolder, debug, null )\n\tlet _callback = false \n\n\twImap.once ('error', err => {\n\t\twImap.destroyAll ( err )\n\t\tif ( !_callback ) {\n\t\t\tCallBack ( err )\n\t\t\treturn _callback = true \n\t\t}\n\t})\n\n\twImap.once ( 'ready', () => {\n\t\tAsync.series ([\n\t\t\tnext => wImap.imapStream.createBox ( false, writeFolder, next ),\n\t\t\tnext => wImap.imapStream.appendStreamV4 ( message, subject, writeFolder, next ),\n\t\t\tnext => wImap.imapStream._logout ( next )\n\t\t], err => {\n\t\t\t_callback = true\n\t\t\tif ( err ) {\n\t\t\t\twImap.destroyAll ( err )\n\t\t\t\t\n\t\t\t}\n\t\t\treturn CallBack ( err )\n\t\t})\n\t})\n\n}\n\n        \nexport class qtGateImapRead extends qtGateImap {\n\n    private openBox = false\n\n    public fetchAndDelete ( Uid: string, CallBack ) {\n        if ( !this.openBox ) {\n            return CallBack ( new Error ( 'not ready!'))\n        }\n            \n        return Async.series ([\n            next => this.imapStream.fetch ( Uid, next ),\n            next => this.imapStream.flagsDeleted ( Uid, next ),\n            next => this.imapStream.expunge ( next )\n        ], CallBack )\n    }\n\n    constructor ( IMapConnect: imapConnect, listenFolder: string, deleteBoxWhenEnd: boolean, newMail: ( mail ) => void ) {\n\n        super ( IMapConnect, listenFolder, deleteBoxWhenEnd, null, debug, newMail )\n        this.once ( 'ready', () => {\n            this.openBox = true\n        })\n    }\n    \n}\n\nexport const getMailAttached = ( email: Buffer ) => {\n    \n    const attachmentStart = email.indexOf ('\\r\\n\\r\\n')\n    if ( attachmentStart < 0 ) {\n        console.log ( `getMailAttached error! can't faind mail attahced start!\\n${ email.toString() }`)\n        return ''\n    }\n    const attachment = email.slice ( attachmentStart + 4 )\n    return attachment.toString()\n}\n\nexport const getMailSubject = ( email: Buffer ) => {\n\tconst ret = email.toString().split ('\\r\\n\\r\\n')[0].split('\\r\\n')\n\t\n\tconst yy = ret.find ( n => {\n\t\treturn /^subject: /i.test( n )\n\t})\n\tif ( !yy || !yy.length ) {\n\t\tdebug ? saveLog(`\\n\\n${ ret } \\n`) : null\n\t\treturn ''\n\t}\n\treturn yy.split(/^subject: +/i)[1]\n}\n\nexport const getMailAttachedBase64 = ( email: Buffer ) => {\n    \n    const attachmentStart = email.indexOf ('\\r\\n\\r\\n')\n    if ( attachmentStart < 0 ) {\n        console.log ( `getMailAttached error! can't faind mail attahced start!`)\n        return null\n    }\n    const attachment = email.slice ( attachmentStart + 4 )\n    return attachment.toString()\n}\n\n\nexport const imapAccountTest = ( IMapConnect: imapConnect, CallBack ) => {\n    debug ? saveLog ( `start test imap [${ IMapConnect.imapUserName }]`, true ) : null\n    let callbackCall = false\n    let startTime = null\n    \n    const listenFolder = Uuid.v4 ()\n    const ramdomText = Crypto.randomBytes ( 20 )\n    let timeout: NodeJS.Timer = null\n\n    const doCallBack = ( err?: Error, ret? ) => {\n        if ( ! callbackCall ) {\n            \n            //saveLog (`imapAccountTest doing callback err [${ err && err.message ? err.message : `undefine `}] ret [${ ret ? ret : 'undefine'}]`)\n            callbackCall = true\n            clearTimeout ( timeout )\n            return CallBack ( err, ret )\n        }\n    }\n    \n    let rImap = new qtGateImapRead ( IMapConnect, listenFolder, debug, mail => {\n        rImap.logout ()\n       \n    })\n\n    rImap.once ( 'ready', () => {\n        debug ? saveLog ( `rImap.once ( 'ready' ) do new qtGateImapwrite`): null \n\t\trImap.logout ()\n\n    })\n\n    rImap.once ( 'end', err => {\n\t\tconsole.log (`imapAccountTest on end err = `, err )\n        doCallBack ( err )\n    })\n\n    rImap.once ( 'error', err => {\n        debug ? saveLog ( `rImap.once ( 'error' ) [${ err.message }]`, true ): null\n        return doCallBack ( err )\n    })\n\n\n}\n\nexport const imapGetMediaFile = ( IMapConnect: imapConnect, fileName: string, CallBack ) => {\n    let rImap = new qtGateImapRead ( IMapConnect, fileName, debug, mail => {\n        rImap.logout ()\n        const retText = getMailAttachedBase64 ( mail )\n        return CallBack ( null, retText )\n    })\n}\n\nconst pingPongTimeOut = 1000 * 15\n\n\ninterface mailPool {\n    CallBack: () => void\n\tmail: Buffer\n\tuuid: string\n}\n\nexport class imapPeer extends Event.EventEmitter {\n    private mailPool: mailPool[] = []\n    public domainName = this.imapData.imapUserName.split('@')[1]\n    private waitingReplyTimeOut: NodeJS.Timer = null\n    private pingUuid = null\n    private doingDestroy = false\n    \n    public peerReady = false\n    private readyForSendMail = false\n    public newMail: ( data: any, subject ) => void\n    private makeWImap = false\n    private makeRImap = false\n    private pingCount = 1\n    public needPing = false\n    public needPingTimeOut = null\n\n    private mail ( email: Buffer ) {\n        \n\t\t//console.log (`imapPeer new mail:\\n\\n${ email.toString()}`)\n        const subject = getMailSubject ( email )\n        \n\n\t\tconst attr = getMailAttached (  email )\n\t\t\n\t\tif ( subject ) {\n\n            /**\n             * \n             * \n             * \n             */\n            if ( subject === this.pingUuid ) {\n                this.pingUuid = null\n                console.log (`CoNETConnected`)\n                console.log (attr)\n                clearTimeout ( this.waitingReplyTimeOut )\n                return this.emit ('CoNETConnected', attr )\n            }\n            console.log (`this.newMail\\n${ email.toString() }`)\n            return this.newMail ( attr, subject )\n\n        }\n        console.log (`get mail have not subject\\n\\n`, email.toString() )\n\n    }\n\n\n    private replyPing ( uu ) {\n\n        return this.AppendWImap1 ( null, uu, err => {\n            if ( err ) {\n                debug ? saveLog (`reply Ping ERROR! [${ err.message ? err.message : null }]`): null \n            }\n        })\n        \n    }\n\n    private AppendWImap1 ( mail: string, uuid: string, CallBack ) {\n        \n        return seneMessageToFolder ( this.imapData, this.writeBox, mail, uuid, CallBack )\n        \n    }\n\n    private setTimeOutOfPing () {\n\n        clearTimeout ( this.waitingReplyTimeOut )\n        clearTimeout ( this.needPingTimeOut )\n        this.needPing = false\n        debug ? saveLog ( `Make Time Out for a Ping, ping ID = [${ this.pingUuid }]`, true ): null\n        return this.waitingReplyTimeOut = setTimeout (() => {\n            debug ? saveLog ( `ON setTimeOutOfPing this.emit ( 'pingTimeOut' ) `, true ): null\n            \n            return this.emit ( 'pingTimeOut' )\n        }, pingPongTimeOut )\n    }\n    \n    public Ping () {\n        \n        if ( this.pingUuid ) {\n            return debug ? saveLog ( `Ping already waiting other ping, STOP!`): null\n\t\t}\n\t\t\n\t\tthis.emit ('ping')\n\n        const pingUuid = Uuid.v4 ()\n        \n        return  this.AppendWImap1 ( null, pingUuid, err => {\n            if ( err ) {\n                return this.destroy ( err )\n            }\n            this.pingUuid = pingUuid\n            return this.setTimeOutOfPing ()\n        })\n    }\n\n    public rImap: qtGateImapRead = null\n\n    public newReadImap() {\n\n        if ( this.makeRImap || this.rImap && this.rImap.imapStream && this.rImap.imapStream.readable ) {\n            return debug ? saveLog (`newReadImap have rImap.imapStream.readable = true, stop!`, true ): null\n        }\n        this.makeRImap = true\n        //saveLog ( `=====> newReadImap!`, true )\n\n\n        this.rImap = new qtGateImapRead ( this.imapData, this.listenBox, debug, email => {\n            this.mail ( email )\n        })\n\n        this.rImap.once ( 'ready', () => {\n            this.makeRImap = false\n            debug ? saveLog ( `this.rImap.once on ready `): null\n\t\t\tthis.Ping ()\n        })\n\n        this.rImap.once ( 'error', err => {\n            this.makeRImap = false\n            debug ? saveLog ( `rImap on Error [${ err.message }]`, true ): null\n            if ( err && err.message && /auth|login|log in|Too many simultaneous|UNAVAILABLE/i.test ( err.message )) {\n                return this.destroy (1)\n            }\n            if ( this.rImap && this.rImap.destroyAll && typeof this.rImap.destroyAll === 'function') {\n                return this.rImap.destroyAll (null)\n            }\n            \n\n        })\n\n        this.rImap.once ( 'end', err => {\n            \n            this.rImap = null\n            this.makeRImap = false\n            if ( typeof this.exit === 'function') {\n                debug ? saveLog (`imapPeer rImap on END!`): null\n                this.exit ( err )\n                return this.exit = null\n            }\n            debug ? saveLog (`imapPeer rImap on END! but this.exit have not a function `): null\n            \n            \n        })\n    }\n\n    constructor ( public imapData: imapConnect, private listenBox: string, private writeBox: string, public exit: ( err?: number ) => void ) {\n        super ()\n        debug ? saveLog ( `doing peer account [${ imapData.imapUserName }] listen with[${ listenBox }], write with [${ writeBox }] `): null\n\n        this.newReadImap ()\n    }\n\n    public destroy ( err?: number ) {\n        \n        clearTimeout ( this.waitingReplyTimeOut )\n        if ( this.doingDestroy ) {\n            return console.log (`destroy but this.doingDestroy = ture`)\n        }\n            \n        this.doingDestroy = true\n        this.peerReady = false\n       \n        if ( this.rImap ) {\n            return this.rImap.imapStream._logout (() => {\n\t\t\t\tif ( typeof this.exit === 'function' ) {\n\t\t\t\t\tthis.exit ( err )\n\t\t\t\t}\n\t\t\t\t\n\t\t\t})\n        }\n        \n        if  ( this.exit && typeof this.exit === 'function' ) {\n            this.exit ( err )\n            this.exit = null\n        }\n\t}\n\t\n\tpublic sendDataToANewUuidFolder ( data: string, writeBox: string, subject: string, CallBack ) {\n\t\t\n\t\treturn seneMessageToFolder ( this.imapData, writeBox, data, subject, CallBack )\n\t}\n\n}\n\n"
  },
  {
    "path": "app/tools/initSystem.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexports.CoNET_version = '3.2.0';\nconst Fs = require(\"fs\");\nconst Path = require(\"path\");\nconst Os = require(\"os\");\nconst Async = require(\"async\");\nconst Crypto = require(\"crypto\");\nconst OpenPgp = require(\"openpgp\");\nconst Http = require(\"http\");\nconst Https = require(\"https\");\nconst Net = require(\"net\");\nconst Nodemailer = require(\"nodemailer\");\nconst Url = require(\"url\");\n/**\n * \t\tdefine\n */\nconst InitKeyPair = () => {\n    const keyPair = {\n        publicKey: null,\n        privateKey: null,\n        keyLength: null,\n        nikeName: null,\n        createDate: null,\n        email: null,\n        passwordOK: false,\n        verified: false,\n        publicKeyID: null,\n        _password: null\n    };\n    return keyPair;\n};\nexports.checkUrl = (url) => {\n    const urlCheck = Url.parse(url);\n    const ret = /^http:|^https:$/.test(urlCheck.protocol) && !/^localhost|^127.0.0.1/.\n        test(urlCheck.hostname);\n    if (ret) {\n        return true;\n    }\n    return false;\n};\nexports.QTGateFolder = Path.join(!/^android$/i.test(process.platform) ? Os.homedir() : Path.join(__dirname, \"../../../../..\"), '.CoNET');\nexports.QTGateLatest = Path.join(exports.QTGateFolder, 'latest');\nexports.QTGateTemp = Path.join(exports.QTGateFolder, 'tempfile');\nexports.QTGateVideo = Path.join(exports.QTGateTemp, 'videoTemp');\nexports.ErrorLogFile = Path.join(exports.QTGateFolder, 'systemError.log');\nexports.CoNETConnectLog = Path.join(exports.QTGateFolder, 'CoNETConnect.log');\nexports.imapDataFileName1 = Path.join(exports.QTGateFolder, 'imapData.pem');\nexports.CoNET_Home = Path.join(__dirname);\nexports.CoNET_PublicKey = Path.join(exports.CoNET_Home, '1231B119.pem');\nexports.LocalServerPortNumber = 3000;\nexports.configPath = Path.join(exports.QTGateFolder, 'config.json');\n//const packageFilePath = Path.join ( __dirname,'package.json')\n//export const packageFile = require ( packageFilePath )\nexports.QTGateSignKeyID = /3acbe3cbd3c1caa9|864662851231B119/i;\nexports.twitterDataFileName = Path.join(exports.QTGateFolder, 'twitterData.pem');\nexports.checkFolder = (folder, CallBack) => {\n    Fs.access(folder, err => {\n        if (err) {\n            return Fs.mkdir(folder, err1 => {\n                if (err1) {\n                    return CallBack(err1);\n                }\n                return CallBack();\n            });\n        }\n        return CallBack();\n    });\n};\nexports.convertByte = (byte) => {\n    if (byte < 1000) {\n        return `${byte} B`;\n    }\n    const kbyte = Math.round(byte / 10.24) / 100;\n    if (kbyte < 1000) {\n        return `${kbyte} KB`;\n    }\n    const mbyte = Math.round(kbyte / 10) / 100;\n    if (mbyte < 1000) {\n        return `${mbyte} MB`;\n    }\n    const gbyte = Math.round(mbyte / 10) / 100;\n    if (gbyte < 1000) {\n        return `${gbyte} GB`;\n    }\n    const tbyte = Math.round(mbyte / 10) / 100;\n    return `${tbyte} TB`;\n};\nexports.checkSystemFolder = CallBack => {\n    const callback = (err, kkk) => {\n        if (err) {\n            console.log(`checkSystemFolder return error`, err);\n            return CallBack(err);\n        }\n        console.log(`checkSystemFolder QTGateFolder = [${exports.QTGateFolder}]`);\n        return CallBack();\n    };\n    return Async.series([\n        next => exports.checkFolder(exports.QTGateFolder, next),\n        next => exports.checkFolder(exports.QTGateLatest, next),\n        next => exports.checkFolder(exports.QTGateTemp, next),\n        next => exports.checkFolder(exports.QTGateVideo, next)\n    ], callback);\n};\nexports.getLocalInterface = () => {\n    const ifaces = Os.networkInterfaces();\n    const ret = [];\n    Object.keys(ifaces).forEach(n => {\n        ifaces[n].forEach(iface => {\n            if ('IPv4' !== iface.family || iface.internal !== false) {\n                // skip over internal (i.e. 127.0.0.1) and non-ipv4 addresses\n                return;\n            }\n            ret.push(iface.address);\n        });\n    });\n    return ret;\n};\nexports.InitConfig = () => {\n    const ret = {\n        firstRun: true,\n        alreadyInit: false,\n        multiLogin: false,\n        version: exports.CoNET_version,\n        newVersion: null,\n        newVerReady: false,\n        keypair: InitKeyPair(),\n        salt: Crypto.randomBytes(64),\n        iterations: 2000 + Math.round(Math.random() * 2000),\n        keylen: Math.round(16 + Math.random() * 30),\n        digest: 'sha512',\n        freeUser: true,\n        account: null,\n        serverGlobalIpAddress: null,\n        serverPort: exports.LocalServerPortNumber,\n        connectedQTGateServer: false,\n        localIpAddress: exports.getLocalInterface(),\n        lastConnectType: 1,\n        connectedImapDataUuid: null\n    };\n    return ret;\n};\nexports.getNickName = (str) => {\n    const uu = str.split('<');\n    return uu[0];\n};\nexports.getEmailAddress = (str) => {\n    const uu = str.split('<');\n    return uu[1].substr(0, uu[1].length - 1);\n};\nexports.getQTGateSign = (user) => {\n    if (!user.otherCertifications || !user.otherCertifications.length) {\n        return null;\n    }\n    let Certification = false;\n    user.otherCertifications.forEach(n => {\n        console.log(`user.otherCertifications\\n${n.issuerKeyId.toHex().toLowerCase()}`);\n        if (exports.QTGateSignKeyID.test(n.issuerKeyId.toHex().toLowerCase())) {\n            return Certification = true;\n        }\n    });\n    return Certification;\n};\nasync function getKeyPairInfo(publicKey, privateKey, password, CallBack) {\n    if (!publicKey || !privateKey) {\n        return CallBack(new Error('publicKey or privateKey empty!'));\n    }\n    const _privateKey = await OpenPgp.key.readArmored(privateKey);\n    const _publicKey = await OpenPgp.key.readArmored(publicKey);\n    if (_privateKey.err || _publicKey.err) {\n        console.log(`_privateKey.err = [${_privateKey.err}], _publicKey.err [${_publicKey.err}]`);\n        console.log(publicKey);\n        return CallBack(new Error('no key'));\n    }\n    //console.log (`getKeyPairInfo success!\\nprivateKey\\npublicKey`)\n    const privateKey1 = _privateKey.keys[0];\n    const publicKey1 = _publicKey.keys;\n    const user = publicKey1[0].users[0];\n    const ret = InitKeyPair();\n    let didCallback = false;\n    ret.publicKey = publicKey;\n    ret.privateKey = privateKey;\n    ret.nikeName = exports.getNickName(user.userId.userid);\n    ret.createDate = privateKey1.primaryKey.created.toDateString();\n    ret.email = exports.getEmailAddress(user.userId.userid);\n    ret.verified = exports.getQTGateSign(user);\n    ret.publicKeyID = publicKey1[0].primaryKey.getFingerprint().toUpperCase();\n    ret.passwordOK = false;\n    if (!password) {\n        return CallBack(null, ret);\n    }\n    //console.log (`getKeyPairInfo test password!`)\n    return privateKey1.decrypt(password).then(keyOK => {\n        //console.log (`privateKey1.decrypt then keyOK [${ keyOK }] didCallback [${ didCallback }]`)\n        ret.passwordOK = keyOK;\n        ret._password = password;\n        didCallback = true;\n        return CallBack(null, ret);\n    }).catch(err => {\n        console.log(`privateKey1.decrypt catch ERROR didCallback = [${didCallback}]`, err);\n        if (!didCallback) {\n            return CallBack(null, ret);\n        }\n    });\n}\nexports.getKeyPairInfo = getKeyPairInfo;\nexports.emitConfig = (config, passwordOK) => {\n    if (!config) {\n        return null;\n    }\n    const ret = {\n        keypair: config.keypair,\n        firstRun: config.firstRun,\n        alreadyInit: config.alreadyInit,\n        newVerReady: config.newVerReady,\n        version: exports.CoNET_version,\n        multiLogin: config.multiLogin,\n        freeUser: config.freeUser,\n        account: config.keypair && config.keypair.email ? config.keypair.email : null,\n        serverGlobalIpAddress: config.serverGlobalIpAddress,\n        serverPort: config.serverPort,\n        connectedQTGateServer: config.connectedQTGateServer,\n        localIpAddress: exports.getLocalInterface(),\n        lastConnectType: config.lastConnectType,\n        iterations: config.iterations,\n        connectedImapDataUuid: config.connectedImapDataUuid\n    };\n    ret.keypair.passwordOK = false;\n    return ret;\n};\nexports.saveConfig = (config, CallBack) => {\n    return Fs.writeFile(exports.configPath, JSON.stringify(config), CallBack);\n};\nexports.checkConfig = CallBack => {\n    Fs.access(exports.configPath, err => {\n        if (err) {\n            return CallBack(null, exports.InitConfig());\n        }\n        let config = null;\n        try {\n            config = require(exports.configPath);\n        }\n        catch (e) {\n            return CallBack(null, exports.InitConfig());\n        }\n        config.salt = Buffer.from(config.salt['data']);\n        //\t\tupdate?\n        config.version = exports.CoNET_version;\n        config.newVerReady = false;\n        config.newVersion = null;\n        config.serverPort = exports.LocalServerPortNumber;\n        config.localIpAddress = exports.getLocalInterface();\n        config.firstRun = false;\n        if (!config.keypair || !config.keypair.publicKey) {\n            return CallBack(null, config);\n        }\n        return getKeyPairInfo(config.keypair.publicKey, config.keypair.privateKey, null, (err, key) => {\n            if (err) {\n                CallBack(err);\n                return console.log(`checkConfig getKeyPairInfo error`, err);\n            }\n            config.keypair = key;\n            return CallBack(null, config);\n        });\n    });\n};\nexports.newKeyPair = (emailAddress, nickname, password, CallBack) => {\n    const userId = {\n        name: nickname,\n        email: emailAddress\n    };\n    const option = {\n        passphrase: password,\n        userIds: [userId],\n        curve: \"ed25519\",\n        aead_protect: true,\n        aead_protect_version: 4\n    };\n    return OpenPgp.generateKey(option).then((keypair) => {\n        const ret = {\n            publicKey: keypair.publicKeyArmored,\n            privateKey: keypair.privateKeyArmored\n        };\n        return CallBack(null, ret);\n    }).catch(err => {\n        // ERROR\n        return CallBack(err);\n    });\n};\nexports.getImapSmtpHost = function (_email) {\n    const email = _email.toLowerCase();\n    const yahoo = (domain) => {\n        if (/yahoo.co.jp$/i.test(domain))\n            return 'yahoo.co.jp';\n        if (/((.*\\.){0,1}yahoo|yahoogroups|yahooxtra|yahoogruppi|yahoogrupper)(\\..{2,3}){1,2}$/.test(domain))\n            return 'yahoo.com';\n        if (/(^hotmail|^outlook|^live|^msn)(\\..{2,3}){1,2}$/.test(domain))\n            return 'hotmail.com';\n        if (/^(me|^icould|^mac)\\.com/.test(domain))\n            return 'me.com';\n        return domain;\n    };\n    const emailSplit = email.split('@');\n    if (emailSplit.length !== 2)\n        return null;\n    const domain = yahoo(emailSplit[1]);\n    const ret = {\n        imap: 'imap.' + domain,\n        smtp: 'smtp.' + domain,\n        SmtpPort: [465, 587, 994],\n        ImapPort: 993,\n        imapSsl: true,\n        smtpSsl: true,\n        haveAppPassword: false,\n        ApplicationPasswordInformationUrl: ['']\n    };\n    switch (domain) {\n        //\t\tyahoo domain have two different \n        //\t\tthe yahoo.co.jp is different other yahoo.*\n        case 'yahoo.co.jp':\n            {\n                ret.imap = 'imap.mail.yahoo.co.jp';\n                ret.smtp = 'smtp.mail.yahoo.co.jp';\n            }\n            break;\n        //\t\t\tgmail\n        case 'google.com':\n        case 'googlemail.com':\n        case 'gmail':\n            {\n                ret.haveAppPassword = true;\n                ret.ApplicationPasswordInformationUrl = [\n                    'https://support.google.com/accounts/answer/185833?hl=zh-Hans',\n                    'https://support.google.com/accounts/answer/185833?hl=ja',\n                    'https://support.google.com/accounts/answer/185833?hl=en'\n                ];\n            }\n            break;\n        case 'gandi.net':\n            ret.imap = ret.smtp = 'mail.gandi.net';\n            break;\n        //\t\t\t\tyahoo.com\n        case 'rocketmail.com':\n        case 'y7mail.com':\n        case 'ymail.com':\n        case 'yahoo.com':\n            {\n                ret.imap = 'imap.mail.yahoo.com';\n                ret.smtp = (/^bizmail.yahoo.com$/.test(emailSplit[1]))\n                    ? 'smtp.bizmail.yahoo.com'\n                    : 'smtp.mail.yahoo.com';\n                ret.haveAppPassword = true;\n                ret.ApplicationPasswordInformationUrl = [\n                    'https://help.yahoo.com/kb/SLN15241.html',\n                    'https://help.yahoo.com/kb/SLN15241.html',\n                    'https://help.yahoo.com/kb/SLN15241.html'\n                ];\n            }\n            break;\n        case 'mail.ee':\n            ret.smtp = 'mail.ee';\n            ret.imap = 'mail.inbox.ee';\n            break;\n        //\t\tgmx.com\n        case 'gmx.co.uk':\n        case 'gmx.de':\n        case 'gmx.us':\n        case 'gmx.com':\n            {\n                ret.smtp = 'mail.gmx.com';\n                ret.imap = 'imap.gmx.com';\n            }\n            break;\n        //\t\taim.com\n        case 'aim.com':\n            {\n                ret.imap = 'imap.aol.com';\n            }\n            break;\n        //\toutlook.com\n        case 'windowslive.com':\n        case 'hotmail.com':\n        case 'outlook.com':\n            {\n                ret.imap = 'imap-mail.outlook.com';\n                ret.smtp = 'smtp-mail.outlook.com';\n            }\n            break;\n        //\t\t\tapple mail\n        case 'icloud.com':\n        case 'mac.com':\n        case 'me.com':\n            {\n                ret.imap = 'imap.mail.me.com';\n                ret.smtp = 'smtp.mail.me.com';\n            }\n            break;\n        //\t\t\t163.com\n        case '126.com':\n        case '163.com':\n            {\n                ret.imap = 'appleimap.' + domain;\n                ret.smtp = 'applesmtp.' + domain;\n            }\n            break;\n        case 'sina.com':\n        case 'yeah.net':\n            {\n                ret.smtpSsl = false;\n            }\n            break;\n    }\n    return ret;\n};\nexports.availableImapServer = /imap\\-mail\\.outlook\\.com$|imap\\.mail\\.yahoo\\.(com|co\\.jp|co\\.uk|au)$|imap\\.mail\\.me\\.com$|imap\\.gmail\\.com$|gmx\\.(com|us|net)$|imap\\.zoho\\.com$/i;\nconst doUrl = (url, CallBack) => {\n    let ret = '';\n    const res = res => {\n        res.on('data', (data) => {\n            ret += data.toString('utf8');\n        });\n        res.once('end', () => {\n            return CallBack(null, ret);\n        });\n    };\n    if (/^https/.test(url))\n        return Https.get(url, res)\n            .once('error', err => {\n            console.log('on err ', err);\n            return CallBack(err);\n        });\n    return Http.get(url, res)\n        .once('error', err => {\n        console.log('on err ', err);\n        return CallBack(err);\n    });\n};\nconst _smtpVerify = (imapData, CallBack) => {\n    const option = {\n        host: Net.isIP(imapData.smtpServer) ? null : imapData.smtpServer,\n        hostname: Net.isIP(imapData.smtpServer) ? imapData.smtpServer : null,\n        port: imapData.smtpPortNumber,\n        secure: imapData.smtpSsl,\n        auth: {\n            user: imapData.smtpUserName,\n            pass: imapData.smtpUserPassword\n        },\n        connectionTimeout: (1000 * 15).toString(),\n        tls: {\n            rejectUnauthorized: imapData.smtpIgnoreCertificate,\n            ciphers: imapData.ciphers\n        },\n        debug: true\n    };\n    const transporter = Nodemailer.createTransport(option);\n    return transporter.verify(CallBack);\n    //DEBUG ? saveLog ( `transporter.verify callback [${ JSON.stringify ( err )}] success[${ success }]` ) : null\n    /*\n    if ( err ) {\n        const _err = JSON.stringify ( err )\n        if ( /Invalid login|AUTH/i.test ( _err ))\n            return CallBack ( 8 )\n        if ( /certificate/i.test ( _err ))\n            return CallBack ( 9 )\n        return CallBack ( 10 )\n    }\n\n    return CallBack()\n    */\n};\nexports.smtpVerify = (imapData, CallBack) => {\n    console.log(`doing smtpVerify!`);\n    let testArray = null;\n    let _ret = false;\n    let err1 = null;\n    if (typeof imapData.smtpPortNumber === 'object') {\n        testArray = imapData.smtpPortNumber.map(n => {\n            const ret = JSON.parse(JSON.stringify(imapData));\n            ret.smtpPortNumber = n;\n            ret.ciphers = null;\n            return ret;\n        });\n    }\n    else {\n        testArray = [imapData];\n    }\n    testArray = testArray.concat(testArray.map(n => {\n        const ret = JSON.parse(JSON.stringify(n));\n        ret.ciphers = 'SSLv3';\n        ret.smtpSsl = false;\n        return ret;\n    }));\n    return Async.each(testArray, (n, next) => {\n        return _smtpVerify(n, (err, success) => {\n            if (err && err.message) {\n                if (/Invalid login|AUTH/i.test(err.message)) {\n                    return next(err);\n                }\n                return next();\n            }\n            console.log(success);\n            if (!_ret) {\n                _ret = true;\n                imapData.smtpPortNumber = n.smtpPortNumber;\n                imapData.smtpSsl = n.smtpSsl;\n                imapData.ciphers = n.ciphers;\n                return CallBack();\n            }\n        });\n    }, (err) => {\n        if (err) {\n            console.log(`smtpVerify ERROR = [${err.message}]`);\n            return CallBack(err);\n        }\n        if (!_ret) {\n            console.log(`smtpVerify success Async!`);\n            return CallBack();\n        }\n        console.log(`smtpVerify already did CallBack!`);\n    });\n};\nexports.getPbkdf2 = (config, passwrod, CallBack) => {\n    return Crypto.pbkdf2(passwrod, config.salt, config.iterations, config.keylen, config.digest, CallBack);\n};\nasync function makeGpgKeyOption(config, passwrod, CallBack) {\n    const option = {\n        privateKeys: (await OpenPgp.key.readArmored(config.keypair.privateKey)).keys,\n        publicKeys: (await OpenPgp.key.readArmored(Fs.readFileSync(exports.CoNET_PublicKey, 'utf8'))).keys\n    };\n    return exports.getPbkdf2(config, passwrod, (err, data) => {\n        if (err) {\n            return CallBack(err);\n        }\n        return option.privateKeys[0].decrypt(data.toString('hex')).then(keyOK => {\n            if (keyOK) {\n                return CallBack(null, option);\n            }\n            return CallBack(new Error('password!'));\n        }).catch(CallBack);\n    });\n}\nexports.makeGpgKeyOption = makeGpgKeyOption;\nasync function saveEncryptoData(fileName, data, config, password, CallBack) {\n    if (!data) {\n        return Fs.unlink(fileName, CallBack);\n    }\n    const _data = JSON.stringify(data);\n    const publicKeys = (await OpenPgp.key.readArmored(config.keypair.publicKey)).keys;\n    const privateKeys = (await OpenPgp.key.readArmored(config.keypair.privateKey)).keys[0];\n    const options = {\n        message: OpenPgp.message.fromText(_data),\n        //compression: OpenPgp.enums.compression.zip,\n        publicKeys: publicKeys,\n        privateKeys: [privateKeys]\n    };\n    //console.log (`saveEncryptoData Encrypto data with public key[${ Util.inspect (publicKeys[0].users[0].userId.userid, false, 2, true )}]`)\n    return exports.getPbkdf2(config, password, (err, data) => {\n        if (err) {\n            return CallBack(err);\n        }\n        return privateKeys.decrypt(data.toString('hex'))\n            .then(keyOK => {\n            console.log(`keyOK = [${keyOK}]`);\n            return OpenPgp.encrypt(options)\n                .then(ciphertext => {\n                return Fs.writeFile(fileName, ciphertext.data, { encoding: 'utf8' }, async (err) => {\n                    //\t\ttest \n                    /*\n                    console.log (`Fs.writeFile success! doing test!\\n${ ciphertext.data }\\n${ JSON.stringify(ciphertext.data)}`)\n                    const option11 = {\n                        privateKeys: [privateKeys],\n                        publicKeys: publicKeys,\n                        message: await OpenPgp.message.readArmored( ciphertext.data )\n                    }\n\n                    console.log (`${ Util.inspect(option11, false, 2, true )}`)\n                    OpenPgp.decrypt( option11 ).then ( plaintext => {\n                        console.log ( `OpenPgp.decrypt success!`,plaintext.data )\n                        return CallBack ()\n                    })\n                    /** */\n                    return CallBack(err);\n                });\n            });\n        }).catch(CallBack);\n    });\n}\nexports.saveEncryptoData = saveEncryptoData;\nasync function readEncryptoFile(filename, savedPasswrod, config, CallBack) {\n    if (!savedPasswrod || !savedPasswrod.length || !config || !config.keypair || !config.keypair.createDate) {\n        return CallBack(new Error('readImapData no password or keypair data error!'));\n    }\n    const options11 = {\n        message: null,\n        publicKeys: (await OpenPgp.key.readArmored(config.keypair.publicKey)).keys,\n        privateKeys: (await OpenPgp.key.readArmored(config.keypair.privateKey)).keys\n    };\n    return Async.waterfall([\n        next => Fs.access(filename, next),\n        (acc, next) => {\n            /**\n             * \t\tsupport old nodejs\n             */\n            let _next = acc;\n            if (typeof _next !== 'function') {\n                //console.trace (` _next !== 'function' [${ typeof _next}]`)\n                _next = next;\n            }\n            exports.getPbkdf2(config, savedPasswrod, _next);\n        },\n        (data, next) => {\n            return options11.privateKeys[0].decrypt(data.toString('hex')).then(keyOk => {\n                if (!keyOk) {\n                    return next(new Error('key password not OK!'));\n                }\n                return next();\n            }).catch(err => {\n                console.log(`options.privateKey.decrypt err`, err);\n                next(err);\n            });\n        },\n        next => {\n            Fs.readFile(filename, 'utf8', next);\n        }\n    ], async (err, data) => {\n        if (err) {\n            return CallBack(err);\n        }\n        try {\n            options11.message = await OpenPgp.message.readArmored(data.toString());\n        }\n        catch (ex) {\n            console.log(`options.message error!\\n${data.toString()}`);\n            return CallBack(ex);\n        }\n        let _return = false;\n        return OpenPgp.decrypt(options11).then(async (data) => {\n            _return = true;\n            await data.signatures[0].verified;\n            if (data.signatures[0].verified) {\n                return CallBack(null, data.data);\n            }\n            return CallBack(new Error('signatures error!'));\n        }).catch(ex => {\n            if (!_return) {\n                return CallBack(ex);\n            }\n            console.log(`OpenPgp.decrypt catch Error`, ex);\n        });\n    });\n}\nexports.readEncryptoFile = readEncryptoFile;\nexports.encryptMessage = (openKeyOption, message, CallBack) => {\n    const option = {\n        privateKeys: openKeyOption.privateKeys[0],\n        publicKeys: openKeyOption.publicKeys,\n        message: OpenPgp.message.fromText(message),\n        compression: OpenPgp.enums.compression.zip\n    };\n    return OpenPgp.encrypt(option).then(ciphertext => {\n        return CallBack(null, ciphertext.data);\n    }).catch(CallBack);\n};\nasync function decryptoMessage(openKeyOption, message, CallBack) {\n    const option = {\n        privateKeys: openKeyOption.privateKeys,\n        publicKeys: openKeyOption.publicKeys,\n        message: null\n    };\n    option.message = await OpenPgp.message.readArmored(message);\n    return OpenPgp.decrypt(option).then(async (data) => {\n        /**\n         * \t\tverify signatures\n         */\n        await data.signatures[0].verified;\n        //console.log ( Util.inspect ( data, false, 3, true ))\n        if (data.signatures[0].verified) {\n            return CallBack(null, data.data);\n        }\n        return CallBack(new Error('signatures error!'));\n    }).catch(err => {\n        console.trace(err);\n        console.log(JSON.stringify(message));\n        return CallBack(err);\n    });\n}\nexports.decryptoMessage = decryptoMessage;\nconst testSmtpAndSendMail = (imapData, CallBack) => {\n    let first = false;\n    if (typeof imapData === 'object') {\n        first = true;\n    }\n    return exports.smtpVerify(imapData, err => {\n        if (err) {\n            if (first) {\n                imapData.imapPortNumber = [25, 465, 587, 994, 2525];\n                return exports.smtpVerify(imapData, CallBack);\n            }\n            return CallBack(err);\n        }\n        return CallBack();\n    });\n};\nexports.sendCoNETConnectRequestEmail = (imapData, openKeyOption, publicKey, toEmail, CallBack) => {\n    const qtgateCommand = {\n        account: imapData.account,\n        QTGateVersion: exports.CoNET_version,\n        imapData: imapData,\n        command: 'connect',\n        error: null,\n        callback: null,\n        language: imapData.language,\n        publicKey: publicKey\n    };\n    return Async.waterfall([\n        next => testSmtpAndSendMail(imapData, next),\n        next => exports.encryptMessage(openKeyOption, JSON.stringify(qtgateCommand), next),\n        (_data, next) => {\n            const option = {\n                host: Net.isIP(imapData.smtpServer) ? null : imapData.smtpServer,\n                hostname: Net.isIP(imapData.smtpServer) ? imapData.smtpServer : null,\n                port: imapData.smtpPortNumber,\n                secure: imapData.smtpSsl,\n                auth: {\n                    user: imapData.smtpUserName,\n                    pass: imapData.smtpUserPassword\n                },\n                connectionTimeout: (1000 * 15).toString(),\n                tls: !imapData.smtpSsl ? {\n                    rejectUnauthorized: imapData.smtpIgnoreCertificate,\n                    ciphers: imapData.ciphers\n                } : null,\n                debug: true\n            };\n            const transporter = Nodemailer.createTransport(option);\n            //console.log ( Util.inspect ( option ))\n            const mailOptions = {\n                from: imapData.smtpUserName,\n                to: toEmail,\n                subject: 'node',\n                attachments: [{\n                        content: _data\n                    }]\n            };\n            //console.log ( Util.inspect ( mailOptions ) )\n            return transporter.sendMail(mailOptions, next);\n        }\n    ], CallBack);\n};\nconst testPingTimes = 5;\nexports.deleteImapFile = () => {\n    return Fs.unlink(exports.imapDataFileName1, err => {\n        if (err) {\n            console.log(`deleteImapFile get err`, err);\n        }\n    });\n};\n"
  },
  {
    "path": "app/tools/initSystem.ts",
    "content": "\n\n/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport const CoNET_version = '3.2.0'\nimport * as Fs from 'fs'\nimport * as Path from 'path'\nimport * as Os from 'os'\nimport * as Async from 'async'\nimport * as Crypto from 'crypto'\nimport * as OpenPgp from 'openpgp'\nimport * as Util from 'util'\nimport * as Http from 'http'\nimport * as Https from 'https'\nimport * as Net from 'net'\nimport * as Nodemailer from 'nodemailer'\nimport * as Url from 'url'\nimport { StringDecoder } from 'string_decoder'\nimport { DH_CHECK_P_NOT_SAFE_PRIME } from 'constants';\n/**\n * \t\tdefine\n */\n\nconst InitKeyPair = () => {\n\tconst keyPair: keypair = {\n\t\tpublicKey: null,\n\t\tprivateKey: null,\n\t\tkeyLength: null,\n\t\tnikeName: null,\n\t\tcreateDate: null,\n\t\temail: null,\n\t\tpasswordOK: false,\n\t\tverified: false,\n\t\tpublicKeyID: null,\n\t\t_password: null\n\t\t\n\t}\n\treturn keyPair\n}\nexport const checkUrl = ( url ) => {\n\n    const urlCheck = Url.parse ( url )\n\n\tconst ret = /^http:|^https:$/.test ( urlCheck.protocol ) && ! /^localhost|^127.0.0.1/.\n\ttest ( urlCheck.hostname )\n    if ( ret ) {\n        return true\n    }\n    return false\n}\nexport const QTGateFolder = Path.join (  !/^android$/i.test ( process.platform ) ? Os.homedir() : Path.join( __dirname, \"../../../../..\" ), '.CoNET' )\nexport const QTGateLatest = Path.join ( QTGateFolder, 'latest' )\nexport const QTGateTemp = Path.join ( QTGateFolder, 'tempfile' )\nexport const QTGateVideo = Path.join ( QTGateTemp, 'videoTemp')\nexport const ErrorLogFile = Path.join ( QTGateFolder, 'systemError.log' )\nexport const CoNETConnectLog = Path.join ( QTGateFolder, 'CoNETConnect.log' )\nexport const imapDataFileName1 = Path.join ( QTGateFolder, 'imapData.pem' )\n\nexport const CoNET_Home = Path.join ( __dirname )\nexport const CoNET_PublicKey = Path.join ( CoNET_Home, '1231B119.pem')\n\nexport const LocalServerPortNumber = 3000\nexport const configPath = Path.join ( QTGateFolder, 'config.json' )\n//const packageFilePath = Path.join ( __dirname,'package.json')\n//export const packageFile = require ( packageFilePath )\nexport const QTGateSignKeyID = /3acbe3cbd3c1caa9|864662851231B119/i\nexport const twitterDataFileName = Path.join ( QTGateFolder, 'twitterData.pem' )\n\nexport const checkFolder = ( folder: string, CallBack: ( err?: Error ) => void ) => {\n    Fs.access ( folder, err => {\n        if ( err ) {\n            return Fs.mkdir ( folder, err1 => {\n                if ( err1 ) {\n                    \n                    return CallBack ( err1 )\n                }\n                return CallBack ()\n            })\n        }\n        return CallBack ()\n    })\n}\n\nexport const convertByte = ( byte: number ) => {\n\tif ( byte < 1000 ) {\n\t\treturn `${ byte } B`\n\t}\n\tconst kbyte = Math.round ( byte / 10.24 ) / 100\n\tif ( kbyte < 1000 ) {\n\t\treturn `${ kbyte } KB`\n\t}\n\tconst mbyte = Math.round ( kbyte / 10 ) / 100\n\tif ( mbyte < 1000 ) {\n\t\treturn `${ mbyte } MB`\n\t}\n\tconst gbyte = Math.round ( mbyte / 10 ) / 100\n\tif ( gbyte < 1000 ) {\n\t\treturn `${ gbyte } GB`\n\t}\n\tconst tbyte = Math.round ( mbyte / 10 ) / 100\n\treturn `${ tbyte } TB`\n}\n\nexport const checkSystemFolder = CallBack => {\n\t\n\tconst callback = ( err, kkk ) => {\n\t\tif ( err ) {\n\t\t\tconsole.log ( `checkSystemFolder return error`, err )\n\t\t\treturn CallBack ( err )\n\t\t}\n\t\tconsole.log (`checkSystemFolder QTGateFolder = [${ QTGateFolder }]`)\n\t\treturn CallBack ()\n\t}\n\treturn Async.series ([\n\t\tnext => checkFolder ( QTGateFolder, next ),\n        next => checkFolder ( QTGateLatest, next ),\n        next => checkFolder ( QTGateTemp, next ),\n        next => checkFolder ( QTGateVideo, next )\n\t], callback )\n}\n\nexport const getLocalInterface = () => {\n\tconst ifaces = Os.networkInterfaces()\n\tconst ret = []\n\tObject.keys ( ifaces ).forEach ( n => {\n\t\tifaces[ n ].forEach ( iface => {\n\t\t\t\n\t\t\tif ( 'IPv4' !== iface.family || iface.internal !== false ) {\n\t\t\t\t// skip over internal (i.e. 127.0.0.1) and non-ipv4 addresses\n\t\t\t\treturn\n\t\t\t}\n\t\t\tret.push ( iface.address )\n\t\t})\n\t})\n\treturn ret\n}\n\nexport const InitConfig = () => {\n\tconst ret: install_config = {\n\t\tfirstRun: true,\n\t\talreadyInit: false,\n\t\tmultiLogin: false,\n\t\tversion: CoNET_version,\n\t\tnewVersion: null,\n\t\tnewVerReady: false,\n\t\tkeypair: InitKeyPair (),\n\t\tsalt: Crypto.randomBytes ( 64 ),\n\t\titerations: 2000 + Math.round ( Math.random () * 2000 ),\n\t\tkeylen: Math.round ( 16 + Math.random() * 30 ),\n\t\tdigest: 'sha512',\n\t\tfreeUser: true,\n\t\taccount: null,\n\t\tserverGlobalIpAddress: null,\n\t\tserverPort: LocalServerPortNumber,\n\t\tconnectedQTGateServer: false,\n\t\tlocalIpAddress: getLocalInterface (),\n\t\tlastConnectType: 1,\n\t\tconnectedImapDataUuid: null\n\t}\n\treturn ret\n}\n\nexport const getNickName = ( str: string ) => {\n\tconst uu = str.split ('<')\n\treturn uu[0]\n}\n\nexport const getEmailAddress = ( str: string ) => {\n\tconst uu = str.split ('<')\n\treturn uu[1].substr( 0, uu[1].length -1 )\n}\n\nexport const getQTGateSign = ( user: OpenPgp.key.users ) => {\n    if ( !user.otherCertifications || !user.otherCertifications.length ) {\n\t\treturn null\n\t}\n\tlet Certification = false\n\tuser.otherCertifications.forEach ( n => {\n\t\tconsole.log (`user.otherCertifications\\n${ n.issuerKeyId.toHex ().toLowerCase() }`)\n\t\tif ( QTGateSignKeyID.test ( n.issuerKeyId.toHex ().toLowerCase())) {\n\t\t\treturn Certification = true\n\t\t}\n\t})\n\treturn Certification\n}\n\nexport async function getKeyPairInfo ( publicKey: string, privateKey: string, password: string, CallBack: ( err?: Error, keyPair?: keypair ) => void ) {\n\n\tif ( ! publicKey || ! privateKey ) {\n\t\treturn CallBack ( new Error ('publicKey or privateKey empty!'))\n\t}\n\tconst _privateKey = await OpenPgp.key.readArmored ( privateKey )\n\tconst _publicKey = await OpenPgp.key.readArmored ( publicKey )\n\tif ( _privateKey.err || _publicKey.err ) {\n\t\tconsole.log (`_privateKey.err = [${ _privateKey.err }], _publicKey.err [${ _publicKey.err }]`)\n\t\tconsole.log ( publicKey )\n\t\treturn CallBack ( new Error ('no key'))\n\t}\n\t//console.log (`getKeyPairInfo success!\\nprivateKey\\npublicKey`)\n\tconst privateKey1 = _privateKey.keys[0]\n\tconst publicKey1 = _publicKey.keys\n\tconst user = publicKey1[0].users[0]\n\tconst ret = InitKeyPair()\n\tlet didCallback = false\n\t\n\tret.publicKey = publicKey\n\tret.privateKey = privateKey\n\tret.nikeName = getNickName ( user.userId.userid )\n\tret.createDate = privateKey1.primaryKey.created.toDateString ()\n\tret.email = getEmailAddress ( user.userId.userid )\n\tret.verified = getQTGateSign ( user )\n\tret.publicKeyID = publicKey1[0].primaryKey.getFingerprint().toUpperCase()\n\t\n\tret.passwordOK = false\n\tif ( !password ) {\n\t\treturn CallBack ( null, ret )\n\t}\n\t//console.log (`getKeyPairInfo test password!`)\n\treturn privateKey1.decrypt ( password ).then ( keyOK => {\n\t\t//console.log (`privateKey1.decrypt then keyOK [${ keyOK }] didCallback [${ didCallback }]`)\n\t\tret.passwordOK = keyOK\n\t\tret._password = password\n\t\tdidCallback = true\n\t\treturn CallBack ( null, ret )\n\t}).catch ( err => {\n\t\tconsole.log (`privateKey1.decrypt catch ERROR didCallback = [${ didCallback }]`, err )\n\t\tif ( !didCallback ) {\n\t\t\treturn CallBack ( null, ret )\n\t\t}\n\t\t\n\t})\n\t\n}\n\nexport const emitConfig = ( config: install_config, passwordOK: boolean ) => {\n\tif ( !config ) {\n\t\treturn null\n\t}\n\tconst ret: install_config = {\n\t\tkeypair: config.keypair,\n\t\tfirstRun: config.firstRun,\n\t\talreadyInit: config.alreadyInit,\n\t\tnewVerReady: config.newVerReady,\n\t\tversion: CoNET_version,\n\t\tmultiLogin: config.multiLogin,\n\t\tfreeUser: config.freeUser,\n\t\taccount: config.keypair && config.keypair.email ? config.keypair.email : null,\n\t\tserverGlobalIpAddress: config.serverGlobalIpAddress,\n\t\tserverPort: config.serverPort,\n\t\tconnectedQTGateServer: config.connectedQTGateServer,\n\t\tlocalIpAddress: getLocalInterface(),\n\t\tlastConnectType: config.lastConnectType,\n\t\titerations: config.iterations,\n\t\tconnectedImapDataUuid: config.connectedImapDataUuid\n\t}\n\tret.keypair.passwordOK = false \n\treturn ret\n}\n\nexport const saveConfig = ( config: install_config, CallBack ) => {\n\treturn Fs.writeFile ( configPath, JSON.stringify ( config ), CallBack )\n}\n\nexport const checkConfig = CallBack => {\n\tFs.access ( configPath, err => {\n\t\t\n\t\tif ( err ) {\n\t\t\treturn CallBack ( null, InitConfig ())\n\t\t}\n\t\tlet config: install_config = null\n\n\t\ttry {\n\t\t\tconfig = require ( configPath )\n\t\t} catch ( e ) {\n\t\t\treturn CallBack ( null, InitConfig ())\n\t\t}\n\t\tconfig.salt = Buffer.from ( config.salt['data'] )\n\t\t\n\t\t//\t\tupdate?\n\n\t\tconfig.version = CoNET_version\n\t\tconfig.newVerReady = false\n\t\tconfig.newVersion = null\n\t\tconfig.serverPort = LocalServerPortNumber\n\t\tconfig.localIpAddress = getLocalInterface ()\n\t\tconfig.firstRun = false\n\t\tif ( !config.keypair || ! config.keypair.publicKey ) {\n\t\t\treturn CallBack ( null, config )\n\t\t}\n\t\treturn getKeyPairInfo ( config.keypair.publicKey, config.keypair.privateKey, null, ( err, key: keypair ) => {\n\t\t\tif ( err ) {\n\t\t\t\tCallBack ( err )\n\t\t\t\treturn console.log (`checkConfig getKeyPairInfo error`, err )\n\t\t\t}\n\t\t\t\n\t\t\tconfig.keypair = key\n\t\t\treturn CallBack ( null, config )\t\t\t\n\t\t})\n\n\t})\n}\n\nexport const newKeyPair = ( emailAddress: string, nickname: string, password: string, CallBack ) => {\n\tconst userId = {\n\t\tname: nickname,\n\t\temail: emailAddress\n\t}\n\tconst option: OpenPgp.KeyOptions = {\n\t\tpassphrase: password,\n\t\tuserIds: [ userId ],\n\t\tcurve: \"ed25519\",\n\t\taead_protect: true,\n\t\taead_protect_version: 4\n\t}\n\treturn OpenPgp.generateKey ( option ).then (( keypair: { publicKeyArmored: string, privateKeyArmored: string }) => {\n\t\t\n\t\tconst ret: keyPair = {\n\t\t\tpublicKey: keypair.publicKeyArmored,\n\t\t\tprivateKey: keypair.privateKeyArmored\n\t\t}\n\t\treturn CallBack ( null, ret )\n\t}).catch ( err => {\n\t\t// ERROR\n\t\treturn CallBack ( err )\n\t})\n}\n\nexport const getImapSmtpHost = function ( _email: string ) {\n\tconst email = _email.toLowerCase()\n\tconst yahoo = ( domain: string ) => {\n\t\t\n\t\tif ( /yahoo.co.jp$/i.test ( domain ))\n\t\t\treturn 'yahoo.co.jp';\n\t\t\t\n\t\tif ( /((.*\\.){0,1}yahoo|yahoogroups|yahooxtra|yahoogruppi|yahoogrupper)(\\..{2,3}){1,2}$/.test ( domain ))\n\t\t\treturn 'yahoo.com';\n\t\t\n\t\tif ( /(^hotmail|^outlook|^live|^msn)(\\..{2,3}){1,2}$/.test ( domain ))\n\t\t\treturn 'hotmail.com';\n\t\t\t\n\t\tif ( /^(me|^icould|^mac)\\.com/.test ( domain ))\n\t\t\treturn 'me.com'\n\n\t\treturn domain\n\t}\n\n\tconst emailSplit = email.split ( '@' )\n\t\n\tif ( emailSplit.length !== 2 ) \n\t\treturn null\n\t\t\n\tconst domain = yahoo ( emailSplit [1] )\n\t\n\tconst ret = {\n\t\timap: 'imap.' + domain,\n\t\tsmtp: 'smtp.' + domain,\n\t\tSmtpPort: [465,587,994],\n\t\tImapPort: 993,\n\t\timapSsl: true,\n\t\tsmtpSsl: true,\n\t\thaveAppPassword: false,\n\t\tApplicationPasswordInformationUrl: ['']\n\t}\n\t\n\tswitch ( domain ) {\n\t\t//\t\tyahoo domain have two different \n\t\t//\t\tthe yahoo.co.jp is different other yahoo.*\n\t\tcase 'yahoo.co.jp': {\n\t\t\tret.imap = 'imap.mail.yahoo.co.jp';\n\t\t\tret.smtp = 'smtp.mail.yahoo.co.jp'\n\t\t}\n\t\tbreak;\n\n\t\t//\t\t\tgmail\n\t\tcase 'google.com':\n\t\tcase 'googlemail.com':\n\t\tcase 'gmail': {\n\t\t\tret.haveAppPassword = true;\n\t\t\tret.ApplicationPasswordInformationUrl = [\n\t\t\t\t'https://support.google.com/accounts/answer/185833?hl=zh-Hans',\n\t\t\t\t'https://support.google.com/accounts/answer/185833?hl=ja',\n\t\t\t\t'https://support.google.com/accounts/answer/185833?hl=en'\n\t\t\t]\n\t\t}\n\t\tbreak;\n\n        case 'gandi.net':\n            ret.imap = ret.smtp = 'mail.gandi.net'\n        break\n\t\t\n\t\t//\t\t\t\tyahoo.com\n\t\tcase 'rocketmail.com':\n\t\tcase 'y7mail.com':\n\t\tcase 'ymail.com':\n\t\tcase 'yahoo.com': {\n\t\t\tret.imap = 'imap.mail.yahoo.com'\n\t\t\tret.smtp = (/^bizmail.yahoo.com$/.test(emailSplit[1]))\n\t\t\t\t? 'smtp.bizmail.yahoo.com'\n\t\t\t\t: 'smtp.mail.yahoo.com'\n\t\t\tret.haveAppPassword = true;\n\t\t\tret.ApplicationPasswordInformationUrl = [\n\t\t\t\t'https://help.yahoo.com/kb/SLN15241.html',\n\t\t\t\t'https://help.yahoo.com/kb/SLN15241.html',\n\t\t\t\t'https://help.yahoo.com/kb/SLN15241.html'\n\t\t\t]\n\t\t}\n\t\tbreak;\n\n        case 'mail.ee':\n            ret.smtp = 'mail.ee'\n            ret.imap = 'mail.inbox.ee'\n        break\n\n\t\t\n        //\t\tgmx.com\n        case 'gmx.co.uk':\n        case 'gmx.de':\n\t\tcase 'gmx.us':\n\t\tcase 'gmx.com' : {\n            ret.smtp = 'mail.gmx.com'\n            ret.imap = 'imap.gmx.com'\n        }\n        \n\t\tbreak;\n\t\t\n\t\t//\t\taim.com\n\t\tcase 'aim.com': {\n\t\t\tret.imap = 'imap.aol.com'\n\t\t}\n\t\tbreak;\n\t\t\n\t\t//\toutlook.com\n\t\tcase 'windowslive.com':\n\t\tcase 'hotmail.com': \n\t\tcase 'outlook.com': {\n\t\t\tret.imap = 'imap-mail.outlook.com'\n            ret.smtp = 'smtp-mail.outlook.com'\n\t\t}\n\t\tbreak;\n\t\t\n\t\t//\t\t\tapple mail\n        case 'icloud.com':\n        case 'mac.com':\n\t\tcase 'me.com': {\n\t\t\tret.imap = 'imap.mail.me.com'\n            ret.smtp = 'smtp.mail.me.com'\n\t\t}\n\t\tbreak;\n\t\t\n\t\t//\t\t\t163.com\n\t\tcase '126.com':\n\t\tcase '163.com': {\n\t\t\tret.imap = 'appleimap.' + domain\n\t\t\tret.smtp = 'applesmtp.' + domain\n\t\t}\n\t\tbreak;\n\t\t\n\t\tcase 'sina.com':\n\t\tcase 'yeah.net': {\n\t\t\tret.smtpSsl = false\n\t\t}\n\t\tbreak;\n\t\t\n\t}\n\t\n\treturn ret\n\t\n}\n\nexport const availableImapServer = /imap\\-mail\\.outlook\\.com$|imap\\.mail\\.yahoo\\.(com|co\\.jp|co\\.uk|au)$|imap\\.mail\\.me\\.com$|imap\\.gmail\\.com$|gmx\\.(com|us|net)$|imap\\.zoho\\.com$/i\n\nconst doUrl = ( url: string, CallBack) => {\n\tlet ret = ''\n\tconst res = res => {\n\t\tres.on( 'data', (data: Buffer) => {\n\t\t\tret += data.toString('utf8')\n\t\t})\n\t\tres.once ( 'end', () => {\n\t\t\treturn CallBack( null, ret )\n\t\t})\n\t}\n\tif ( /^https/.test( url ))\n\t\treturn Https.get ( url, res )\n\t\t\t.once ( 'error', err => {\n\t\t\t\tconsole.log( 'on err ', err  )\n\t\t\t\treturn CallBack ( err )\n\t\t\t})\n\treturn Http.get ( url, res )\n\t\t.once ( 'error', err => {\n\t\tconsole.log( 'on err ', err  )\n\t\treturn CallBack ( err )\n\t})\n}\n\n\nconst _smtpVerify = ( imapData: IinputData, CallBack: ( err?: Error, success?: any ) => void ) => {\n\tconst option = {\n\t\thost:  Net.isIP ( imapData.smtpServer ) ? null : imapData.smtpServer,\n\t\thostname:  Net.isIP ( imapData.smtpServer ) ? imapData.smtpServer : null,\n\t\tport: imapData.smtpPortNumber,\n\t\tsecure: imapData.smtpSsl,\n\t\tauth: {\n\t\t\tuser: imapData.smtpUserName,\n\t\t\tpass: imapData.smtpUserPassword\n\t\t},\n\t\tconnectionTimeout: ( 1000 * 15 ).toString (),\n\t\ttls: {\n\t\t\trejectUnauthorized: imapData.smtpIgnoreCertificate,\n\t\t\tciphers: imapData.ciphers\n\t\t},\n\t\tdebug: true\n\t}\n\t\n\tconst transporter = Nodemailer.createTransport ( option )\n\treturn transporter.verify ( CallBack )\n\t\t//DEBUG ? saveLog ( `transporter.verify callback [${ JSON.stringify ( err )}] success[${ success }]` ) : null\n\t\t/*\n\t\tif ( err ) {\n\t\t\tconst _err = JSON.stringify ( err )\n\t\t\tif ( /Invalid login|AUTH/i.test ( _err ))\n\t\t\t\treturn CallBack ( 8 )\n\t\t\tif ( /certificate/i.test ( _err ))\n\t\t\t\treturn CallBack ( 9 )\n\t\t\treturn CallBack ( 10 )\n\t\t}\n\n\t\treturn CallBack()\n\t\t*/\n}\n\nexport const smtpVerify = ( imapData: IinputData, CallBack: ( err? ) => void ) => {\n\tconsole.log (`doing smtpVerify!`)\n\tlet testArray: IinputData[] = null\n\tlet _ret = false\n\tlet err1 = null\n\tif ( typeof imapData.smtpPortNumber === 'object' ) {\n\t\ttestArray = imapData.smtpPortNumber.map ( n => { \n\t\t\tconst ret: IinputData = JSON.parse ( JSON.stringify ( imapData ))\n\t\t\tret.smtpPortNumber = n\n\t\t\tret.ciphers = null\n\t\t\treturn ret\n\t\t})\n\t\t\n\t} else {\n\t\ttestArray = [ imapData ]\n\t}\n\ttestArray = testArray.concat ( testArray.map ( n => {\n\t\tconst ret: IinputData = JSON.parse ( JSON.stringify ( n ))\n\t\tret.ciphers = 'SSLv3'\n\t\tret.smtpSsl = false\n\t\treturn ret\n\t}))\n\t\n\treturn Async.each ( testArray, ( n, next ) => {\n\t\treturn _smtpVerify ( n, ( err: Error, success ) => {\n\n\t\t\tif ( err && err.message ) {\n\t\t\t\tif ( /Invalid login|AUTH/i.test ( err.message )) {\n\t\t\t\t\treturn next ( err )\n\t\t\t\t}\n\t\t\t\treturn next ()\n\t\t\t}\n\t\t\tconsole.log (success)\n\t\t\tif ( ! _ret ) {\n\t\t\t\t_ret = true\n\t\t\t\timapData.smtpPortNumber = n.smtpPortNumber\n\t\t\t\timapData.smtpSsl = n.smtpSsl\n\t\t\t\timapData.ciphers = n.ciphers\n\t\t\t\treturn CallBack ()\n\t\t\t}\n\t\t\t\n\t\t})\n\t}, ( err: Error ) => {\n\t\tif ( err ) {\n\t\t\tconsole.log ( `smtpVerify ERROR = [${ err.message }]`)\n\t\t\treturn CallBack ( err )\n\t\t}\n\t\tif ( ! _ret ) {\n\t\t\tconsole.log ( `smtpVerify success Async!`)\n\t\t\treturn CallBack ()\n\t\t}\n\t\tconsole.log (`smtpVerify already did CallBack!`)\n\t})\n\t\n}\n\nexport const getPbkdf2 = ( config: install_config, passwrod: string, CallBack ) => {\n\t\n\treturn Crypto.pbkdf2 ( passwrod, config.salt, config.iterations, config.keylen, config.digest, CallBack )\n}\n\nexport async function makeGpgKeyOption ( config: install_config, passwrod: string, CallBack ) {\n\tconst option = {\n\t\tprivateKeys: ( await OpenPgp.key.readArmored ( config.keypair.privateKey )).keys,\n\t\tpublicKeys: ( await OpenPgp.key.readArmored ( Fs.readFileSync ( CoNET_PublicKey, 'utf8'))).keys\n\t}\n\n\treturn getPbkdf2 ( config, passwrod, ( err, data ) => {\n\t\tif ( err ) {\n\t\t\treturn CallBack ( err )\n\t\t}\n\t\treturn option.privateKeys[0].decrypt ( data.toString( 'hex' )).then ( keyOK => {\n\t\t\tif ( keyOK ) {\n\t\t\t\treturn CallBack ( null, option )\n\t\t\t}\n\t\t\treturn CallBack ( new Error ('password!'))\n\t\t}).catch ( CallBack )\n\t})\n}\n\nexport async function saveEncryptoData ( fileName: string, data: any, config: install_config, password: string, CallBack ) {\n\t\t\n\tif ( ! data ) {\n\t\treturn Fs.unlink ( fileName, CallBack )\n\t}\n\tconst _data = JSON.stringify ( data )\n\tconst publicKeys = ( await OpenPgp.key.readArmored ( config.keypair.publicKey )).keys\n\tconst privateKeys = ( await OpenPgp.key.readArmored ( config.keypair.privateKey )).keys[0]\n\tconst options = {\n\t\tmessage: OpenPgp.message.fromText ( _data ),\n\t\t//compression: OpenPgp.enums.compression.zip,\n\t\tpublicKeys: publicKeys,\n\t\tprivateKeys: [ privateKeys ]\n\t}\n\t//console.log (`saveEncryptoData Encrypto data with public key[${ Util.inspect (publicKeys[0].users[0].userId.userid, false, 2, true )}]`)\n\treturn getPbkdf2 ( config, password, ( err, data: Buffer ) => {\n\t\tif ( err ) {\n\t\t\treturn CallBack ( err )\n\t\t}\n\t\treturn privateKeys.decrypt ( data.toString( 'hex' ))\n\t\t.then ( keyOK => {\n\t\t\tconsole.log (`keyOK = [${ keyOK }]`)\n\t\t\treturn OpenPgp.encrypt ( options )\n\t\t\t\t.then ( ciphertext => {\n\t\t\t\t\t\n\n\t\t\t\t\treturn Fs.writeFile ( fileName, ciphertext.data, { encoding: 'utf8' }, async err => {\n\t\t\t\t\t\t//\t\ttest \n\t\t\t\t\t\t/*\n\t\t\t\t\t\tconsole.log (`Fs.writeFile success! doing test!\\n${ ciphertext.data }\\n${ JSON.stringify(ciphertext.data)}`)\n\t\t\t\t\t\tconst option11 = {\n\t\t\t\t\t\t\tprivateKeys: [privateKeys],\n\t\t\t\t\t\t\tpublicKeys: publicKeys,\n\t\t\t\t\t\t\tmessage: await OpenPgp.message.readArmored( ciphertext.data )\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconsole.log (`${ Util.inspect(option11, false, 2, true )}`)\n\t\t\t\t\t\tOpenPgp.decrypt( option11 ).then ( plaintext => {\n\t\t\t\t\t\t\tconsole.log ( `OpenPgp.decrypt success!`,plaintext.data )\n\t\t\t\t\t\t\treturn CallBack ()\n\t\t\t\t\t\t})\n\t\t\t\t\t\t/** */\n\t\t\t\t\t\treturn CallBack ( err )\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t}).catch ( CallBack )\n\t\t\n\t\t\n\t})\n\n}\n\nexport async function readEncryptoFile ( filename: string, savedPasswrod, config: install_config, CallBack ) {\n\tif ( ! savedPasswrod || ! savedPasswrod.length || ! config || ! config.keypair || ! config.keypair.createDate ) {\n\t\treturn CallBack ( new Error ('readImapData no password or keypair data error!'))\n\t}\n\tconst options11 = {\n\t\tmessage: null,\n\t\tpublicKeys: ( await OpenPgp.key.readArmored ( config.keypair.publicKey )).keys,\n\t\tprivateKeys: ( await OpenPgp.key.readArmored ( config.keypair.privateKey )).keys\n\t}\n\n\treturn Async.waterfall ([\n\t\tnext => Fs.access ( filename, next ),\n\t\t( acc, next ) => {\n\t\t\t/**\n\t\t\t * \t\tsupport old nodejs \n\t\t\t */\n\t\t\t\n\t\t\tlet _next = acc\n\t\t\tif ( typeof _next !== 'function') {\n\t\t\t\t//console.trace (` _next !== 'function' [${ typeof _next}]`)\n\t\t\t\t_next = next\n\t\t\t}\n\t\t\tgetPbkdf2 ( config, savedPasswrod, _next )\n\t\t},\n\t\t( data: Buffer, next ) => {\n\t\t\t\n\t\t\treturn options11.privateKeys[0].decrypt ( data.toString( 'hex' )).then ( keyOk => {\n\t\t\t\t\n\t\t\t\tif ( !keyOk ) {\n\t\t\t\t\treturn next ( new Error ( 'key password not OK!' ))\n\t\t\t\t}\n\t\t\t\treturn next ()\n\t\t\t}).catch ( err => {\n\t\t\t\tconsole.log ( `options.privateKey.decrypt err`, err )\n\t\t\t\tnext ( err )\n\t\t\t})\n\t\t\t\n\t\t},\n\t\tnext => {\n\t\t\tFs.readFile ( filename, 'utf8', next )\n\t\t}], async ( err, data ) => {\n\t\t\tif ( err ) {\n\t\t\t\treturn CallBack ( err )\n\t\t\t}\n\t\t\t\n\t\t\ttry {\n\t\t\t\toptions11.message = await OpenPgp.message.readArmored ( data.toString ())\n\t\t\t} catch ( ex ) {\n\t\t\t\tconsole.log (`options.message error!\\n${ data.toString ()}`)\n\t\t\t\treturn CallBack ( ex )\n\t\t\t}\n\t\t\tlet _return = false\n\t\t\treturn OpenPgp.decrypt ( options11 ).then ( async data => {\n\t\t\t\t\n\t\t\t\t_return = true\n\t\t\t\tawait data.signatures[0].verified\n\t\t\t\tif ( data.signatures[0].verified ) {\n\t\t\t\t\treturn CallBack ( null, data.data )\n\t\t\t\t}\n\t\t\t\treturn CallBack ( new Error ( 'signatures error!' ))\n\t\t\t}).catch ( ex => {\n\t\t\t\tif ( !_return ) {\n\t\t\t\t\treturn CallBack ( ex )\n\t\t\t\t}\t\n\t\t\t\tconsole.log (`OpenPgp.decrypt catch Error`, ex )\n\t\t\t})\n\t\t})\n\t\n}\n\nexport const encryptMessage = ( openKeyOption, message: string, CallBack ) => {\n\tconst option = {\n\t\tprivateKeys: openKeyOption.privateKeys[0],\n\t\tpublicKeys: openKeyOption.publicKeys,\n\t\tmessage: OpenPgp.message.fromText ( message ),\n\t\tcompression: OpenPgp.enums.compression.zip\n\t}\n\t\n\treturn OpenPgp.encrypt ( option ).then ( ciphertext => {\n\t\t\n\t\treturn CallBack ( null, ciphertext.data )\n\t}).catch ( CallBack )\n}\n\nexport async function decryptoMessage ( openKeyOption, message: string, CallBack ) {\n\tconst option = {\n\t\tprivateKeys: openKeyOption.privateKeys,\n\t\tpublicKeys: openKeyOption.publicKeys,\n\t\tmessage: null\n\t}\n\t\n\toption.message = await OpenPgp.message.readArmored ( message )\n\t\n\t\n\treturn OpenPgp.decrypt ( option ).then ( async data => {\n\t\t\n\t\t/**\n\t\t * \t\tverify signatures\n\t\t */\n\t\tawait data.signatures[0].verified\n\t\t//console.log ( Util.inspect ( data, false, 3, true ))\n\t\tif (  data.signatures[0].verified ) {\n\t\t\treturn CallBack ( null, data.data )\n\t\t\t\n\t\t}\n\n\t\t\n\t\treturn CallBack ( new Error ('signatures error!'))\n\t}).catch ( err => {\n\n\t\tconsole.trace ( err )\n\t\tconsole.log ( JSON.stringify ( message ))\n\t\treturn CallBack ( err )\n\t})\n}\n\nconst testSmtpAndSendMail = ( imapData: IinputData, CallBack ) => {\n\tlet first = false\n\tif ( typeof imapData === 'object' ) {\n\t\tfirst = true\n\t}\n\treturn smtpVerify ( imapData, err => {\n\t\tif ( err ) {\n\t\t\tif ( first ) {\n\t\t\t\timapData.imapPortNumber = [25,465,587,994,2525]\n\t\t\t\treturn smtpVerify ( imapData, CallBack )\n\t\t\t}\n\t\t\treturn CallBack ( err )\n\t\t}\n\t\treturn CallBack ()\n\t})\n}\n\nexport const sendCoNETConnectRequestEmail = ( imapData: IinputData, openKeyOption, publicKey, toEmail: string, CallBack ) => {\n\n\tconst qtgateCommand: QTGateCommand = {\n\t\taccount: imapData.account,\n\t\tQTGateVersion: CoNET_version,\n\t\timapData: imapData,\n\t\tcommand: 'connect',\n\t\terror: null,\n\t\tcallback: null,\n\t\tlanguage: imapData.language,\n\t\tpublicKey: publicKey\n\t}\n\treturn Async.waterfall ([\n\t\tnext => testSmtpAndSendMail ( imapData, next ),\n\t\tnext => encryptMessage ( openKeyOption, JSON.stringify ( qtgateCommand ), next ),\n\t\t( _data, next ) => {\n\t\t\tconst option = {\n\t\t\t\thost:  Net.isIP ( imapData.smtpServer ) ? null : imapData.smtpServer,\n\t\t\t\thostname:  Net.isIP ( imapData.smtpServer ) ? imapData.smtpServer : null,\n\t\t\t\tport: imapData.smtpPortNumber,\n\t\t\t\tsecure: imapData.smtpSsl,\n\t\t\t\tauth: {\n\t\t\t\t\tuser: imapData.smtpUserName,\n\t\t\t\t\tpass: imapData.smtpUserPassword\n\t\t\t\t},\n\t\t\t\tconnectionTimeout: ( 1000 * 15 ).toString (),\n\t\t\t\ttls: !imapData.smtpSsl ? {\n\t\t\t\t\trejectUnauthorized: imapData.smtpIgnoreCertificate,\n\t\t\t\t\tciphers: imapData.ciphers\n\t\t\t\t} : null,\n\t\t\t\tdebug: true\n\t\t\t}\n\t\t\tconst transporter = Nodemailer.createTransport ( option )\n\t\t\t//console.log ( Util.inspect ( option ))\n\t\t\tconst mailOptions = {\n\t\t\t\tfrom: imapData.smtpUserName,\n\t\t\t\tto: toEmail,\n\t\t\t\tsubject:'node',\n\t\t\t\tattachments: [{\n\t\t\t\t\tcontent: _data\n\t\t\t\t}]\n\t\t\t}\n\t\t\t//console.log ( Util.inspect ( mailOptions ) )\n\t\t\treturn transporter.sendMail ( mailOptions, next )\n\t\t}\n\t], CallBack )\n\n}\n\nconst testPingTimes = 5\n\nexport const deleteImapFile = () => {\n\treturn Fs.unlink ( imapDataFileName1, err => {\n\t\tif ( err ) {\n\t\t\tconsole.log (`deleteImapFile get err`, err )\n\t\t}\n\t})\n}\n\n"
  },
  {
    "path": "app/views/Shared/CoNETConnectInfo.pug",
    "content": "#connectInformationMessage\n\n    <!-- ko if: connectInformationMessage -->\n    <!-- ko with: connectInformationMessage -->\n    //-button.ui.button( data-bind=\"click: showOfflineMessage\") ttt\n    //-button.ui.button( data-bind=\"click: hideMessage\") rrr\n    .offlineMessage( style = \" position: fixed; top: 0px; width: 100%; display: flex; justify-content: center;\" )\n        #offlineInfo.ui.negative.message( data-bind = \" visible: offlineInfo, css:{ negative: showNegative, green: showGreen }, click: () => { hideMessage() }\" style = \" max-width: 80%;cursor: pointer;\")\n            <!-- ko if: messageArray() -->\n            p( data-bind = \" text: messageArray()[$root.languageIndex()]\")\n            <!-- /ko -->\n    <!-- /ko -->\n    <!-- /ko -->"
  },
  {
    "path": "app/views/Shared/CoSearchLayout.pug",
    "content": "doctype html\nhtml\n\tinclude header_youtube\n\t//-<style> ::-webkit-scrollbar { display: none; } </style>\n\tbody#body( data-bind=\"style : { background : searchItem() ? 'white' : '#B4E4ED' }\" )\n\t\tblock jumbotron1\n\t\tblock jumbotron\n\t<script>if ( typeof module === 'object') { window.module = module; module = undefined; }</script>\n\tscript( src='/scripts/jquery.min.js', type=\"text/javascript\" )\n\t\n\tscript( src='/scripts/TweenMax.min.js', type=\"text/javascript\" )\n\tscript( src='/scripts/CanadaBackground.js', type=\"text/javascript\" )\n\tscript( src='/scripts/jquery.cookie.js', type=\"text/javascript\" )\n\tscript( src='/scripts/semantic.min.js', type=\"text/javascript\" )\n\tscript( src='/scripts/knockout.js', type=\"text/javascript\" )\n\tscript( src='/scripts/knockout.animate.js', type=\"text/javascript\" )\n\tscript( src='/scripts/Cleave.js', type=\"text/javascript\" )\n\tscript( src='/scripts/socket.io.js', type=\"text/javascript\" )\n\tscript( src='/scripts/siteShare.js', type=\"text/javascript\" )\n\tscript( src='/scripts/connectInformationMessage.js', type=\"text/javascript\" )\n\tscript( src='/scripts/CoSearch.js', type=\"text/javascript\" )\n\n\t<script>if ( window.module ) module = window.module;</script>\n\tblock ScriptBlock"
  },
  {
    "path": "app/views/Shared/appHtml.pug",
    "content": "\n\n#CoSearch\n\t<!-- ko with: appScript -->\n\t.backGroundSetup( data-bind = \" style: { background: searchItem() ? 'white' : '#B4E4ED' }\" style = \"height: 100em; \")\n\t\t<!-- ko if: showMain() -->\n\t\t.main\n\n\t\t\t<!-- ko if: showMainSearchForm() -->\n\t\t\tform#coSearchForm.ui.form( data-bind = \" style: { 'margin-top': showSearchSetupForm() ? '15em' : '25em' }, event: { 'submit': search_form }, submitBubble: false\" style = \"100%;\" )\n\t\t\t\t<!-- ko if: !showSearchSetupForm() -->\n\t\t\t\t.field\n\t\t\t\t\t.ui.search\n\t\t\t\t\t\t.ui.input.huge.icon( data-bind = \"css : { animationSearchInput: hasFocus, 'error': showSearchError(), 'loading disabled': showInputLoading }\" style = \"width: 100%;border-radius: 500rem;\" )\n\t\t\t\t\t\t\tinput( style = \"color:rgba(0,0,0,0.5); border-radius: 500rem; width: 100%;\" type = \"text\"\n\t\t\t\t\t\t\t\tdata-bind = \"attr: { placeholder: showSearchError() ? ( messageBoxDefine [ errorMessageIndex() ][ $root.languageIndex() ]): infoDefine[ $root.languageIndex() ].coSearch.searchInputPlaceholder }, css : { backgroundTransparent: ! backGroundBlue ()}, textInput: searchInputText, hasFocus: hasFocus\")\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t<!-- ko if: !showSearchError() -->\n\n\t\t\t\t\t\t\t\t<!-- ko if : !hasFocusShowTool() -->\n\t\t\t\t\t\t\t\ti.icon.link.circular( data-bind = \" html: searchSetupIcon (), click: searchSetupClick \" style = \"box-shadow: 0 0 0 0.1em ; color: #42c8f4!important;\" )\n\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t<!-- ko if : hasFocusShowTool -->\n\n\t\t\t\t\t\t\t\t\t<!-- ko if: !searchInputText().length -->\n\t\t\t\t\t\t\t\t\t\ti.icon.image.outline.link.circular( data-bind = \" click: function (){ document.getElementById('imageInput1').click() }, style: { 'margin-top' : hasFocus ? '2px' : '0px' }\" style = \"box-shadow: 0 0 0 0.1em; color: #42c8f4!important;\")\n\t\t\t\t\t\t\t\t\t\tinput( onchange = \"_view.appsManager().appScript().imageSearch( this )\" id = \"imageInput1\" type = \"file\" accept = 'image/gif,image/jpeg,image/jpg,image/png' style=\"opacity:0\" )\n\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\n\n\t\t\t\t\t\t\t\t\t<!-- ko if: searchInputText().length -->\n\n\t\t\t\t\t\t\t\t\t\ti.icon.search.link.circular( style = \"box-shadow: 0 0 0 0.1em; color: #4285f4!important;\" data-bind = \"click: search_form, css: { 'loadingGetResponse': loadingGetResponse, 'conetResponse': conetResponse } \")\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t<!-- ko if : !showInputLoading() -->\n\t\t\t\t\t\t\t\t\t\t\ti.icon.language.circular.link( style=\"box-shadow: 0 0 0 0.1em;color: #7742b9!important;margin-right: 2.5em\" )\n\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t<!-- ko if: showSearchError -->\n\t\t\t\t\t\t\t\ti.icon.link.circular.red.close( data-bind = \" click: searchInputCloseError \")\n\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<!-- /ko -->\n\t\t\t\t\n\t\t\t\t<!-- ko if: showSearchSetupForm() -->\n\t\t\t\t.SetupForm( style = \"margin: 5em;\")\n\t\t\t\t\t//-h3.ui.header.shadowText1( data-bind = \" text: infoDefine[ languageIndex() ].coSearch.coSearchConfigMenu[ 0 ]\" style = \" color: white;\")\n\t\t\t\t\t.ui.link.cards\n\t\t\t\t\t\t\n\t\t\t\t\t\t.card.AppCardTop( data-bind = \" click: function( self, event ) { searchSetup ('g', self, event )} \" style = \" background: #ffffff82;\")\n\t\t\t\t\t\t\t.content\n\t\t\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -70 270 180\">\n\t\t\t\t\t\t\t\t\t<path fill=\"#EA4335\" d=\"M115.75 47.18c0 12.77-9.99 22.18-22.25 22.18s-22.25-9.41-22.25-22.18C71.25 34.32 81.24 25 93.5 25s22.25 9.32 22.25 22.18zm-9.74 0c0-7.98-5.79-13.44-12.51-13.44S80.99 39.2 80.99 47.18c0 7.9 5.79 13.44 12.51 13.44s12.51-5.55 12.51-13.44z\"/>\n\t\t\t\t\t\t\t\t\t<path fill=\"#FBBC05\" d=\"M163.75 47.18c0 12.77-9.99 22.18-22.25 22.18s-22.25-9.41-22.25-22.18c0-12.85 9.99-22.18 22.25-22.18s22.25 9.32 22.25 22.18zm-9.74 0c0-7.98-5.79-13.44-12.51-13.44s-12.51 5.46-12.51 13.44c0 7.9 5.79 13.44 12.51 13.44s12.51-5.55 12.51-13.44z\"/>\n\t\t\t\t\t\t\t\t\t<path fill=\"#4285F4\" d=\"M209.75 26.34v39.82c0 16.38-9.66 23.07-21.08 23.07-10.75 0-17.22-7.19-19.66-13.07l8.48-3.53c1.51 3.61 5.21 7.87 11.17 7.87 7.31 0 11.84-4.51 11.84-13v-3.19h-.34c-2.18 2.69-6.38 5.04-11.68 5.04-11.09 0-21.25-9.66-21.25-22.09 0-12.52 10.16-22.26 21.25-22.26 5.29 0 9.49 2.35 11.68 4.96h.34v-3.61h9.25zm-8.56 20.92c0-7.81-5.21-13.52-11.84-13.52-6.72 0-12.35 5.71-12.35 13.52 0 7.73 5.63 13.36 12.35 13.36 6.63 0 11.84-5.63 11.84-13.36z\"/>\n\t\t\t\t\t\t\t\t\t<path fill=\"#34A853\" d=\"M225 3v65h-9.5V3h9.5z\"/>\n\t\t\t\t\t\t\t\t\t<path fill=\"#EA4335\" d=\"M262.02 54.48l7.56 5.04c-2.44 3.61-8.32 9.83-18.48 9.83-12.6 0-22.01-9.74-22.01-22.18 0-13.19 9.49-22.18 20.92-22.18 11.51 0 17.14 9.16 18.98 14.11l1.01 2.52-29.65 12.28c2.27 4.45 5.8 6.72 10.75 6.72 4.96 0 8.4-2.44 10.92-6.14zm-23.27-7.98l19.82-8.23c-1.09-2.77-4.37-4.7-8.23-4.7-4.95 0-11.84 4.37-11.59 12.93z\"/>\n\t\t\t\t\t\t\t\t\t<path fill=\"#4285F4\" d=\"M35.29 41.41V32H67c.31 1.64.47 3.58.47 5.68 0 7.06-1.93 15.79-8.15 22.01-6.05 6.3-13.78 9.66-24.02 9.66C16.32 69.35.36 53.89.36 34.91.36 15.93 16.32.47 35.3.47c10.5 0 17.98 4.12 23.6 9.49l-6.64 6.64c-4.03-3.78-9.49-6.72-16.97-6.72-13.86 0-24.7 11.17-24.7 25.03 0 13.86 10.84 25.03 24.7 25.03 8.99 0 14.11-3.61 17.39-6.89 2.66-2.66 4.41-6.46 5.1-11.65l-22.49.01z\"/>\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t.card.AppCardTop( data-bind = \" click: function( self, event ) { searchSetup ('b', self, event )} \" style = \" background: #ffffff82;\")\n\t\t\t\t\t\t\t.content\n\t\t\t\t\t\t\t\t<svg viewBox=\"0 -170 1000 600\">\n\t\t\t\t\t\t\t\t\t<g inkscape:label=\"Layer 1\" inkscape:groupmode=\"layer\" id=\"layer1\" transform=\"translate(312,-795.66903)\">\n\t\t\t\t\t\t\t\t\t\t<path style=\"fill:#008373;fill-opacity:1;stroke:none\" d=\"m -311.5,796.16903 80.6273,28.36401 0,283.80836 113.56729,-65.5599 -55.67962,-26.1246 -35.12739,-87.43067 178.939297,62.86452 0,91.39515 -201.653597,116.3102 -80.67328,-44.875 z\" />\n\t\t\t\t\t\t\t\t\t\t<g transform=\"matrix(8.653063,0,0,8.653063,-2616.6875,-11921.907)\" style=\"font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#008373;fill-opacity:1;stroke:none;font-family:Sans\" id=\"flowRoot3000\">\n\t\t\t\t\t\t\t\t\t\t<path d=\"m 313.01562,1507.0953 0,-28.0078 7.96875,0 c 2.42187,10e-5 4.34244,0.5925 5.76172,1.7774 1.41926,1.1849 2.12889,2.7279 2.12891,4.6289 -2e-5,1.5885 -0.42971,2.9688 -1.28906,4.1406 -0.85939,1.1719 -2.04429,2.0052 -3.55469,2.5 l 0,0.078 c 1.888,0.2214 3.39842,0.9343 4.53125,2.1387 1.13279,1.2044 1.6992,2.7702 1.69922,4.6973 -2e-5,2.3958 -0.8594,4.3359 -2.57813,5.8203 -1.71876,1.4844 -3.88673,2.2265 -6.5039,2.2265 z m 3.28125,-25.039 0,9.043 3.35938,0 c 1.79686,0 3.20962,-0.433 4.23828,-1.2989 1.02863,-0.8658 1.54295,-2.0865 1.54297,-3.6621 -2e-5,-2.7213 -1.79038,-4.082 -5.37109,-4.082 z m 0,11.9922 0,10.0781 4.45313,0 c 1.92707,0 3.42121,-0.4557 4.48242,-1.3672 1.06118,-0.9114 1.59178,-2.1614 1.5918,-3.75 -2e-5,-3.3073 -2.25262,-4.9609 -6.75781,-4.9609 z\" style=\"font-variant:normal;font-stretch:normal;fill:#008373;fill-opacity:1;stroke:none;font-family:Segoe UI;-inkscape-font-specification:Segoe UI\" id=\"path3009\" inkscape:connector-curvature=\"0\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m 336.08002,1482.6479 c -0.57292,0 -1.0612,-0.1953 -1.46484,-0.5859 -0.40365,-0.3906 -0.60547,-0.8854 -0.60547,-1.4844 0,-0.5989 0.20182,-1.097 0.60547,-1.4941 0.40364,-0.3971 0.89192,-0.5957 1.46484,-0.5957 0.58593,0 1.08398,0.1986 1.49414,0.5957 0.41015,0.3971 0.61523,0.8952 0.61524,1.4941 -10e-6,0.573 -0.20509,1.0612 -0.61524,1.4649 -0.41016,0.4036 -0.90821,0.6054 -1.49414,0.6054 z m 1.5625,24.4474 -3.20312,0 0,-19.8474 3.20312,0 z\" style=\"font-variant:normal;font-stretch:normal;fill:#008373;fill-opacity:1;stroke:none;font-family:Segoe UI;-inkscape-font-specification:Segoe UI\" id=\"path3011\" inkscape:connector-curvature=\"0\" sodipodi:nodetypes=\"ssssssccsccccc\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m 359.4053,1507.0953 -3.20313,0 0,-11.2601 c 0,-4.2448 -1.42999,-6.3672 -4.52893,-6.3672 -1.60158,0 -2.92644,0.6022 -3.97461,1.8066 -1.04819,1.2045 -1.57227,2.7247 -1.57227,4.5606 l 0,11.2601 -3.20312,0 0,-19.8473 3.20312,0 0,3.2522 0.0781,0 c 1.51041,-2.5261 3.6629,-3.7275 6.443,-3.7275 2.18748,0 3.86066,0.7064 5.01953,2.1191 1.15883,1.4128 1.73828,3.4538 1.73828,6.1231 z\" style=\"font-variant:normal;font-stretch:normal;fill:#008373;fill-opacity:1;stroke:none;font-family:Segoe UI;-inkscape-font-specification:Segoe UI\" id=\"path3013\" inkscape:connector-curvature=\"0\" sodipodi:nodetypes=\"ccsscsccccccscsc\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m 381.85178,1505.4046 c 0,7.3437 -3.51564,11.0156 -10.54688,11.0156 -2.47396,0 -4.51337,-0.4405 -6.36232,-1.378 l 0.84027,-2.7464 c 0,0 2.17127,1.4431 5.48299,1.4431 4.92186,0 7.38281,-2.5703 7.38281,-7.8046 l 0,-2.1654 -0.0781,0 c -1.52345,2.5521 -3.66907,3.7952 -6.72895,3.7952 -2.48699,0 -4.48894,-0.7493 -6.00586,-2.5266 -1.51693,-1.7774 -2.27539,-4.1634 -2.27539,-7.1582 0,-3.3984 0.81705,-6.1003 2.45117,-8.1055 1.63411,-2.0052 3.87044,-3.0078 6.70899,-3.0078 2.6953,0 4.54794,1.0807 5.85004,3.2422 l 0.0781,0 0,-2.7602 3.20313,0 z m -3.20313,-7.3522 0,-2.7899 c 0,-1.5886 -0.53712,-2.9492 -1.61132,-4.0821 -1.07424,-1.1328 -2.31919,-1.6992 -3.92074,-1.6992 -1.97917,0 -3.52865,0.7194 -4.64843,2.1582 -1.1198,1.4388 -1.6797,3.4538 -1.67969,6.0449 -1e-5,2.2266 0.5371,3.8479 1.61133,5.1825 1.07421,1.3347 2.49673,2.002 4.26758,2.002 1.79686,0 3.16551,-0.638 4.29182,-1.9141 1.12629,-1.276 1.68945,-2.9101 1.68945,-4.9023 z\" style=\"font-variant:normal;font-stretch:normal;fill:#008373;fill-opacity:1;stroke:none;font-family:Segoe UI;-inkscape-font-specification:Segoe UI\" id=\"path3015\" inkscape:connector-curvature=\"0\" sodipodi:nodetypes=\"ssccssccscsssccccssscssscscs\"/>\n\t\t\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t.card.AppCardTop( data-bind = \" click: function( self, event ) { searchSetup ('y', self, event )} \" style = \" background: #ffffff82;\")\n\t\t\t\t\t\t\t.content\n\t\t\t\t\t\t\t\t<svg xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" viewBox=\"0 -150 500 280\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n\t\t\t\t\t\t\t\t\t<defs>\n\t\t\t\t\t\t\t\t\t<radialGradient id=\"c\" gradientUnits=\"userSpaceOnUse\" cy=\"1680.7\" cx=\"1214.2\" gradientTransform=\"matrix(-1.223 -.23720 .15644 -.94671 2438.6 3564.7)\" r=\"22.495\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#6700e8\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5c00ce\" offset=\".39936\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5600bf\" stop-opacity=\".045045\" offset=\".70124\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#220047\" stop-opacity=\"0\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</radialGradient>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"j\" y2=\"1916\" gradientUnits=\"userSpaceOnUse\" x2=\"397.81\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1916\" x1=\"372.77\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5500bd\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5200b2\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"e\" y2=\"1704.2\" gradientUnits=\"userSpaceOnUse\" x2=\"1198.6\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1962.9\" x1=\"1161.2\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#47008d\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5100b3\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t\t\t<radialGradient id=\"b\" gradientUnits=\"userSpaceOnUse\" cy=\"2013.9\" cx=\"1159.1\" gradientTransform=\"matrix(-.21925 .74474 -.78219 -.23028 1523.9 90.984)\" r=\"24.948\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#6000d8\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5c00cd\" offset=\".20886\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5500be\" offset=\".37415\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#2d0062\" offset=\"0.721\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#210045\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</radialGradient>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"g\" y2=\"1699.4\" xlink:href=\"#a\" gradientUnits=\"userSpaceOnUse\" x2=\"1020.9\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"2003.7\" x1=\"829.87\"/>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"a\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#1b0041\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#1b0041\" offset=\".10005\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#1b0041\" offset=\".20479\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#240052\" offset=\"0.3\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#32006a\" offset=\"0.4\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#3d007d\" offset=\".5\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#490098\" offset=\"0.6\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#4f00a8\" offset=\".70026\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5500bc\" offset=\".80312\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5700c2\" offset=\"0.9\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#6000da\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"f\" y2=\"1983.8\" gradientUnits=\"userSpaceOnUse\" x2=\"829.28\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1699.3\" x1=\"979.93\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#1e0046\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#2d0061\" offset=\".10005\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#33006b\" offset=\".20479\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#400082\" offset=\"0.3\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#490096\" offset=\"0.4\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5000ac\" offset=\".5\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5500bd\" offset=\"0.6\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#4f00a8\" offset=\".70026\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5500bc\" offset=\".80312\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5700c2\" offset=\"0.9\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#6000da\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"i\" y2=\"1725.7\" xlink:href=\"#a\" gradientUnits=\"userSpaceOnUse\" x2=\"664.27\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1978\" x1=\"462.79\"/>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"h\" y2=\"1962.4\" gradientUnits=\"userSpaceOnUse\" x2=\"471.28\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1725.4\" x1=\"632.18\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#1c0044\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#2f0065\" offset=\".10005\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#34006d\" offset=\".20479\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#3b007a\" offset=\"0.3\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#3c007a\" offset=\"0.4\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#490096\" offset=\".5\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5000ab\" offset=\"0.6\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5400ba\" offset=\".70026\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5500bc\" offset=\".80312\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5700c2\" offset=\"0.9\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5c00ce\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"l\" y2=\"1856.8\" gradientUnits=\"userSpaceOnUse\" x2=\"372.85\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1856.8\" x1=\"163.23\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#6700e8\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#6700e8\" offset=\".5\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#6700e8\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"k\" y2=\"1999.1\" gradientUnits=\"userSpaceOnUse\" x2=\"373.36\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1999.1\" x1=\"347.46\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#3f008b\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#220050\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"n\" y2=\"1713.2\" gradientUnits=\"userSpaceOnUse\" x2=\"163.25\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1713.2\" x1=\"138.23\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#390080\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#31006e\" offset=\".5\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#250056\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"m\" y2=\"1838.2\" gradientUnits=\"userSpaceOnUse\" x2=\"187.85\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1838.2\" x1=\"162.66\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5a00c9\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#4f00a8\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"q\" y2=\"1909.6\" gradientUnits=\"userSpaceOnUse\" x2=\"51.417\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1909.6\" x1=\"-103.64\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#6700e8\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#6700e8\" offset=\".50604\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#6700e8\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"s\" y2=\"1718.5\" gradientUnits=\"userSpaceOnUse\" x2=\"-26.132\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"2005.1\" x1=\"-169.29\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#4d00a1\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5200b4\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"y\" y2=\"2047\" gradientUnits=\"userSpaceOnUse\" x2=\"-253.6\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1878.8\" x1=\"-253.6\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#210045\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#25004d\" offset=\".25\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#2b005c\" offset=\".5\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#340071\" offset=\".74854\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#3e0088\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"x\" y2=\"2047.3\" gradientUnits=\"userSpaceOnUse\" x2=\"-227.23\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1877.2\" x1=\"-248.82\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5500bd\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5300b5\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"w\" y2=\"1838.7\" gradientUnits=\"userSpaceOnUse\" x2=\"-273.09\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1850.7\" x1=\"-291.09\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#27005d\" stop-opacity=\".98039\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#2b005d\" offset=\".31767\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#280055\" offset=\".59756\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#24004d\" offset=\".80878\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#230049\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"v\" y2=\"1877.6\" gradientUnits=\"userSpaceOnUse\" x2=\"-250.33\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1669.7\" x1=\"-349.94\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5100b2\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5500bd\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"u\" y2=\"1877.2\" gradientUnits=\"userSpaceOnUse\" x2=\"-249.85\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1667.8\" x1=\"-149.7\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5500bd\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#47008d\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"t\" y2=\"1819.8\" gradientUnits=\"userSpaceOnUse\" x2=\"-190.68\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1808.7\" x1=\"-209.43\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#1b0041\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#21004f\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"r\" y2=\"1759.1\" gradientUnits=\"userSpaceOnUse\" x2=\"-26.7\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"2007.7\" x1=\"-122.89\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#21004e\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#39007f\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"p\" y2=\"1938.5\" gradientUnits=\"userSpaceOnUse\" x2=\"63.199\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1945.5\" x1=\"44.989\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#2a005a\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#210046\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"o\" y2=\"2003.3\" gradientUnits=\"userSpaceOnUse\" x2=\"115.15\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" y1=\"1718.1\" x1=\"-24.637\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5500bd\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5000ac\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t\t\t<linearGradient id=\"d\" y2=\"1701.9\" gradientUnits=\"userSpaceOnUse\" y1=\"1962.2\" gradientTransform=\"matrix(.60986 0 0 .60986 -1015.1 -735.2)\" x2=\"1225\" x1=\"1177.8\">\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#210045\" offset=\"0\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#430085\" offset=\".59416\"/>\n\t\t\t\t\t\t\t\t\t<stop stop-color=\"#5000b2\" offset=\"1\"/>\n\t\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t\t\t</defs>\n\t\t\t\t\t\t\t\t\t<g transform=\"translate(1009.8 -337.49)\">\n\t\t\t\t\t\t\t\t\t<g transform=\"matrix(.5 0 0 .5 -379.18 197.8)\">\n\t\t\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-272.82 284.69c7.6616 1.281 12.78 5.9708 12.78 14.045 0 2.6723-1.101 6.435-1.8373 9.6153-5.1337 22.63-25.182 102.59-33.623 155.96l-7.7668-7.7668 24.719-164.16z\" fill=\"url(#d)\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-772.42 306.42c-10.347 2.4776-20.506 2.4096-30.493 0l15.856 16.466z\" fill=\"#6700e8\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-930.94 306.42c10.347 2.4776 20.506 2.4096 30.493 0l-15.856 16.466z\" fill=\"#6700e8\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-1020.4 306.36c23.383 59.178 60.182 148.75 78.517 182.98l-27.144-8.2945-67.165-167.97z\" fill=\"url(#o)\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-1041.7 306.35c7.4678 2.5018 13.662 2.6552 21.264 0l-15.113 9.2837z\" fill=\"#6700e8\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-1031 312.81 68.439 167.85c-4.0492 4.3854-5.855 6.6864-9.792 8.7379-19.836-51.091-41.139-102.2-59.186-152.63l-8.9087-15.103z\" fill=\"url(#p)\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-1089.8 489.33-20.204-7.1558 71.141-166.91 7.9282-2.4512v24.711c-11.062 31.919-39.135 101.95-58.866 151.81z\" fill=\"url(#r)\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-1106.6 282.03 6.7084 15.246 17.076-7.9282 6.9443-7.3183c-10.985 2.4918-20.893 2.5746-30.729 0z\" fill=\"#6700e8\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-1154.8 414.97-11.587 4.269-7.3183-12.807 72.573-115.87 5.1886-1.7772c7.1618-1.6184 14.973-3.354 20.061-6.7608-11.525 15.569-53.493 88.344-78.917 132.95z\" fill=\"url(#t)\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-1170.6 413.15 3.0493-3.0493 71.795-121.34-10.809-6.7347c-8.6682 16.146-40.638 68.392-60.986 101.85l-9.7578 18.296z\" fill=\"url(#u)\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-1228.5 282.03c15.916 28.207 40.349 67.667 60.986 101.85v26.224l-4.8789 4.8789-71.354-126.85z\" fill=\"url(#v)\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-1240.3 289.7 11.761-7.6717c-12.62 2.6914-17.899 2.8627-30.493 0l4.8789 5.4887z\" fill=\"#6700e8\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-1167.6 410.1-5.4887 7.9282-7.3184-3.0493c-13.625-23.55-53.678-95.287-78.672-132.95 5.0665 3.6714 11.911 5.686 19.817 6.9699z\" fill=\"url(#w)\"/>\n\t\t\t\t\t\t\t\t\t\t<path fill=\"url(#x)\" d=\"m-1152.9 513.16-20.735-9.7578 1.8296-86.6 4.269-6.7085 12.807 4.8789z\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-1167.6 506.45-14.637 6.7085 1.8295-98.187 12.807-4.8789z\" fill=\"url(#y)\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-1120 489.38c25.444-51.864 53.737-121.41 78.294-183.04l10.746 6.4742-69.462 169.92-14.089 4.8122z\" fill=\"url(#s)\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-963.25 480.35 21.352 8.9925c-8.1908-2.0649-19.278-2.8566-30.42 0.0524l4.1688-10.267z\" fill=\"#200045\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-1078.5 429.38 15.012-6.4416c21.625 0.76013 43.249 0.74922 64.874 0l15.228 6.6302-14.177 3.0996h-70.184z\" fill=\"url(#q)\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-1068.5 435.71-10.08-6.3338c31.673-0.48441 63.394-0.44495 95.168 0.18863l-10.08 6.1451c-25.003-0.8102-50.005-0.71317-75.008 0z\" fill=\"#200045\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-900.44 489.38-21.345-7.3183v-164.05l6.0986-3.0493 15.246-8.538c-3.1637 60.878-3.233 121.86 0 182.96z\" fill=\"url(#m)\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-915.69 480.84v4.269l-15.247 4.269c2.4244-60.889 2.6556-121.87 0-182.96l15.247 8.538z\" fill=\"url(#n)\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-802.92 489.38 21.345-7.3183v-164.05l-6.0986-3.0493-15.247-8.538c3.1637 60.878 3.233 121.86 0 182.96z\" fill=\"url(#k)\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-915.63 397.52 12.816-5.7139c34.057 0.85838 68.155 0.79423 102.28 0l12.856 5.7139-15.902 3.8002h-99.346z\" fill=\"url(#l)\"/>\n\t\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t\t\t<path fill=\"url(#h)\" d=\"m-664.79 306.35c-59.895 0-89.783 37.447-89.783 91.898 0 68.197 45.237 91.822 89.001 91.822 51.983 0 89.249-29.249 89.249-91.65 0-60.057-35.275-92.07-88.468-92.07zm-1.7915 8.6905c0.56294-0.0116 1.1312 0 1.6962 0 39.558 0 68.609 26.944 68.609 83.246 0 56.231-29.013 83.17-68.533 83.17-43.12 0-68.457-30.899-68.457-83.017 0-58.944 31.219-82.672 66.684-83.398z\"/>\n\t\t\t\t\t\t\t\t\t<path d=\"m-665 303.95c-64.688 0-98.626 41.016-98.626 94.185 0 58.196 37.05 93.69 98.531 93.69 66.468 0 98.931-40.001 98.931-93.08 0-59.18-38.768-94.795-98.835-94.795zm0.19058 6.0605c51.075 0 84.942 30.726 84.942 88.392 0 59.917-35.791 88.01-85.704 88.01-42.022 0-85.457-22.681-85.457-88.163 0-52.283 28.708-88.239 86.219-88.239z\" fill=\"url(#i)\"/>\n\t\t\t\t\t\t\t\t\t<path fill=\"url(#f)\" d=\"m-441.28 296.99c-60.789 0-102.44 34.367-102.44 101.35 0 65.71 38.747 102.42 102.69 102.42 48.426 0 101.48-24.872 101.48-101.48 0-82.684-57.955-102.28-101.73-102.28zm-0.32402 7.3183c48.376 0 84.008 29.388 84.008 94.204 0 70.459-43.103 93.309-83.932 93.309-43.622 0-83.36-25.6-83.36-94.7 0-71.621 44.046-92.813 83.284-92.813z\"/>\n\t\t\t\t\t\t\t\t\t<path fill=\"url(#g)\" d=\"m-441.68 292.93c-64.42 0-113.66 36.579-113.66 104.59 0 56.035 32.755 105.35 114.2 105.35 68.949 0 113.97-37.907 113.97-104.36 0-62.667-41.996-105.58-114.5-105.58zm0.40025 6.8228c42.587 0 98.969 19.086 98.969 99.522 0 74.529-51.631 98.721-98.74 98.721-62.2 0-99.884-35.712-99.884-99.636 0-65.163 40.519-98.607 99.655-98.607z\"/>\n\t\t\t\t\t\t\t\t\t<path d=\"m-322.2 499.84c0-7.8687 4.7851-15.186 14.378-15.186 9.1817 0 16.052 5.4912 16.052 14.262 0 10.928-7.2317 14.955-13.858 14.955-9.1617 0-16.572-4.7539-16.572-14.031z\" fill=\"url(#b)\"/>\n\t\t\t\t\t\t\t\t\t<path d=\"m-306.88 462.57c7.4355-52.557 11.958-107.79 16.301-162.87 0-10.977 7.2554-15.27 14.576-15.27 1.283 0 3.1753 0.2673 3.1753 0.2673l-1.9912 13.166-26.08 163.25z\" fill=\"url(#e)\"/>\n\t\t\t\t\t\t\t\t\t<g fill=\"#200045\">\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-1182.2 513.16 14.664-10.743 14.609 10.743s-8.0987-1.4737-14.61-1.4737c-5.8748 0-14.664 1.4737-14.664 1.4737z\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-1120 489.4 20.456-8.8436c3.1211 3.742 5.8977 6.913 9.7311 8.7897-7.3639-1.9927-18.512-2.8867-30.184 0.0311z\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-930.94 489.38c9.903-2.3864 20.044-2.492 30.455 0l-15.208-8.538z\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-902.81 404.29-12.843-6.765c42.66 0.44483 85.32 0.5196 127.98 0l-12.826 6.725c-34.104-0.45812-68.208-0.43623-102.31 0.0402z\"/>\n\t\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-787.67 480.84v4.269l15.246 4.269c-2.4244-60.889-2.6556-121.87 0-182.96l-15.246 8.538z\" fill=\"url(#j)\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-772.42 489.38c-9.903-2.3864-20.044-2.492-30.455 0l15.208-8.538z\" fill=\"#200045\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m-300.16 456.4-6.7572 6.1652c4.5277-0.79745 8.0291 0.38427 11.432 1.7557z\" fill=\"#200045\"/>\n\t\t\t\t\t\t\t\t\t\t<ellipse fill-rule=\"evenodd\" rx=\"22.495\" transform=\"matrix(.66068 0 0 .60986 -1078 -734.79)\" ry=\"21.29\" cy=\"1693.1\" cx=\"1215\" fill=\"url(#c)\"/>\n\t\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t.card.AppCardTop( data-bind = \" click: function( self, event ) { searchSetup ('d', self, event)} \" style = \" background: #ffffff82;\")\n\t\t\t\t\t\t\t.content\n\t\t\t\t\t\t\t\t<svg viewBox=\"0 0 207.70001 163.80001\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t\t\t\t\t\t\t<g transform=\"translate(-24.5 -19)\">\n\t\t\t\t\t\t\t\t\t\t<circle cx=\"127\" cy=\"79\" fill=\"#de5833\" r=\"60\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m177.8 57.5c-2.8-6.6-6.8-12.5-11.8-17.5-5.1-5.1-11-9-17.5-11.8-6.8-2.9-14-4.3-21.5-4.3-7.4 0-14.7 1.5-21.5 4.3-6.6 2.7-12.5 6.7-17.5 11.8-5.1 5.1-9 11-11.8 17.5-2.9 6.8-4.3 14-4.3 21.5 0 7.5 1.5 14.7 4.3 21.5 2.8 6.6 6.8 12.5 11.8 17.5 5.1 5.1 11 9 17.5 11.8 6.8 2.9 14 4.3 21.5 4.3 7.4 0 14.7-1.5 21.5-4.3 6.5-2.8 12.4-6.8 17.5-11.8 5.1-5.1 9-11 11.8-17.5 2.9-6.8 4.3-14 4.3-21.5 0-7.5-1.4-14.7-4.3-21.5zm-38.8 71c-3.2-5.4-11.6-20.5-11.6-31.7 0-25.8 17.3-3.7 17.3-24.3 0-4.9-2.4-22.1-17.4-25.7-3.7-4.9-12.4-9.6-26.2-7.7 0 0 2.3.7 4.9 2 0 0-5 .7-5.2 4.1 0 0 9.9-.5 15.5 1.3-12.9 1.7-19.5 8.5-18.3 20.8 1.7 17.5 9.1 48.7 11.7 59.6-19.6-7-33.7-25.8-33.7-47.9 0-28.1 22.8-51 51-51 28.2 0 51 22.8 51 51-.1 24-16.7 44.1-39 49.5z\" fill=\"#fff\"/>\n\t\t\t\t\t\t\t\t\t\t<path clip-rule=\"evenodd\" d=\"m124.2 87.3c0-6.6 9-8.7 12.4-8.7 9.2 0 22.2-5.9 25.4-5.8 3.3.1 5.4 1.4 5.4 2.9 0 2.2-18.4 10.5-25.5 9.8-6.8-.6-8.4.1-8.4 2.9 0 2.4 4.9 4.6 10.3 4.6 8.1 0 16-3.6 18.4-1.9 2.1 1.5-5.5 6.9-14.2 6.9-8.7 0-23.8-4.1-23.8-10.7z\" fill=\"#fed30a\" fill-rule=\"evenodd\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m140.2 59.3c-2.4-3.1-6.7-3.2-8.2.4 2.3-1.8 5.1-2.2 8.2-.4z\" fill=\"#2d4f8d\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m113.5 59.4c-3.3-2-8.8-2.2-8.5 4.1 1.6-3.9 3.8-4.6 8.5-4.1z\" fill=\"#2d4f8d\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m138.2 65.2c-1.8 0-3.3 1.5-3.3 3.3 0 1.8 1.5 3.3 3.3 3.3 1.8 0 3.3-1.5 3.3-3.3 0-1.8-1.5-3.3-3.3-3.3zm1.2 3.1c-.5 0-1-.4-1-1 0-.5.4-1 1-1 .6 0 1 .4 1 1-.1.5-.5 1-1 1z\" fill=\"#2d4f8d\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m112.6 67c-2.1 0-3.8 1.7-3.8 3.8 0 2.1 1.7 3.8 3.8 3.8 2.1 0 3.8-1.7 3.8-3.8 0-2.1-1.7-3.8-3.8-3.8zm1.4 3.5c-.6 0-1.1-.5-1.1-1.1 0-.6.5-1.1 1.1-1.1.6 0 1.1.5 1.1 1.1 0 .6-.5 1.1-1.1 1.1z\" fill=\"#2d4f8d\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m104.3 50.8c-4.8 3.5-7 8.9-6.3 16.5 1.7 17.5 9.1 48.8 11.7 59.7.9.3 1.8.6 2.7.9-1.6-6.6-9.3-38.8-12.7-63.5-.9-6.6 1.7-10.5 4.6-13.6z\" fill=\"#d5d7d8\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m116.2 46.5c.4 0 .7-.1.7-.1-5.2-2.5-13.4-2.6-15.6-2.6-.2.4-.4.9-.4 1.4-.1.1 9.6-.5 15.3 1.3z\" fill=\"#d5d7d8\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m106.8 41.1c-1.6-1.1-2.9-1.8-3.7-2.2-.7.1-1.3.1-2 .2 0 0 2.3.7 4.9 2 0 0-.1 0-.2 0 .7 0 1 0 1 0z\" fill=\"#d5d7d8\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m147.1 107.6c-1.7-.4-8.3 4.3-10.8 6.1-.1-.5-.2-.9-.3-1.1-.3-1-6.7-.4-8.2 1.2-4-1.9-12-5.6-12.1-3.3-.3 3 0 15.5 1.6 16.4 1.2.7 8-3 11.4-4.9 0 0 0 0 .1 0 2.1.5 6 0 7.4-.9.2-.1.3-.3.4-.5 3.1 1.2 9.8 3.6 11.2 3.1 1.8-.5 1.4-15.6-.7-16.1z\" fill=\"#67bd47\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m128.8 122c-2.1-.4-1.4-2.5-1.4-7.4 0 0 0 0 0 0-.5.3-.9.7-.9 1.1 0 4.9-.8 7.1 1.4 7.4 2.1.5 6 0 7.6-.9.3-.2.4-.5.5-1-1.5.9-5.2 1.3-7.2.8z\" fill=\"#43a347\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m24.5 180.6v-24.6h8.9c8.5 0 12.4 6.2 12.4 12 0 6.3-3.8 12.6-12.4 12.6zm2.8-2.9h6.1c6.6 0 9.5-4.9 9.5-9.8 0-4.5-3-9.3-9.5-9.3h-6.1z\" fill=\"#4c4c4c\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m57 180.9c-4.6 0-7.5-3.1-7.5-8v-9.6h2.7v9.5c0 3.5 2 5.6 5.4 5.6 3.2 0 5.5-2.5 5.5-5.8v-9.3h2.7v17.3h-2.4l-.2-3-.4.5c-1.5 1.8-3.4 2.7-5.8 2.8z\" fill=\"#4c4c4c\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m78.7 180.9c-4.5 0-9-2.8-9-8.9 0-5.4 3.6-8.9 9-8.9 2.4 0 4.4.8 6.2 2.5l-1.7 1.7c-1.2-1.1-2.8-1.7-4.4-1.7-3.8 0-6.4 2.6-6.4 6.4 0 4.4 3.2 6.4 6.4 6.4 1.8 0 3.4-.6 4.6-1.8l1.7 1.7c-1.8 1.7-4 2.6-6.4 2.6z\" fill=\"#4c4c4c\"/>\n\t\t\t\t\t\t\t\t\t\t<polygon fill=\"#4c4c4c\" points=\"91.1 180.6 88.5 180.6 88.5 156 91.1 156 91.1 170.9 98.5 163.3 102 163.3 93.8 171.4 103 180.5 103 180.6 99.6 180.6 91.1 172.1\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m106.2 180.6v-24.6h8.9c8.5 0 12.4 6.2 12.4 12 0 6.3-3.8 12.6-12.4 12.6zm2.9-2.9h6.1c6.6 0 9.5-4.9 9.5-9.8 0-4.5-3-9.3-9.5-9.3h-6.1z\" fill=\"#4c4c4c\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m138.7 180.9c-4.6 0-7.5-3.1-7.5-8v-9.6h2.7v9.5c0 3.5 2 5.6 5.4 5.6 3.2 0 5.5-2.5 5.5-5.8v-9.3h2.7v17.3h-2.4l-.1-3-.4.5c-1.5 1.8-3.5 2.7-5.9 2.8z\" fill=\"#4c4c4c\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m160.4 180.9c-4.5 0-9-2.8-9-8.9 0-5.4 3.6-8.9 9-8.9 2.4 0 4.4.8 6.2 2.5l-1.7 1.7c-1.2-1.1-2.8-1.7-4.4-1.7-3.8 0-6.4 2.6-6.4 6.4 0 4.4 3.2 6.4 6.4 6.4 1.8 0 3.4-.6 4.6-1.8l1.7 1.7-.1.1v0c-1.7 1.7-3.8 2.5-6.3 2.5z\" fill=\"#4c4c4c\"/>\n\t\t\t\t\t\t\t\t\t\t<polygon fill=\"#4c4c4c\" points=\"172.9 180.6 170.3 180.6 170.3 156 172.9 156 172.9 170.9 180.3 163.3 183.7 163.3 175.6 171.4 184.7 180.5 184.7 180.6 181.3 180.6 172.9 172.1\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m198.6 181c-9.5 0-12.8-6.8-12.8-12.5 0-3.8 1.3-7.1 3.6-9.5 2.3-2.3 5.5-3.5 9.2-3.5 3.4 0 6.5 1.3 8.9 3.6l-1.6 1.9c-1.9-1.8-4.7-2.9-7.3-2.9-6.9 0-10 5.4-10 10.4 0 4.9 3.1 9.9 10.1 9.9 2.5 0 4.9-.9 6.8-2.5l.1-.1v-6.1h-7.7v-2.5h10.3v9.6c-2.7 2.9-5.8 4.2-9.6 4.2z\" fill=\"#4c4c4c\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m220.4 180.9c-5.2 0-8.9-3.7-8.9-8.9 0-5.2 3.8-9.1 8.9-9.1 5.3 0 9 3.7 9 9.1-.1 5.1-3.8 8.9-9 8.9zm0-15.6c-3.7 0-6.3 2.7-6.3 6.6 0 3.7 2.6 6.4 6.3 6.4 3.7 0 6.3-2.6 6.4-6.4-.1-3.8-2.7-6.6-6.4-6.6z\" fill=\"#4c4c4c\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m230.9 181.2v0c .2-.1.3-.2.3-.4 0-.2-.1-.3-.2-.4-.1-.1-.3-.1-.6-.1-.3 0-.5 0-.6.1v1.6h.4v-.7h.2c.2 0 .3.1.3.3.1.2.1.3.1.4h.4c0-.1-.1-.2-.1-.4 0-.2-.1-.3-.2-.4zm-.5-.1h-.2v-.5c0 0 .1 0 .2 0 .2 0 .3.1.3.2.1.2 0 .3-.3.3z\" fill=\"#4c4c4c\"/>\n\t\t\t\t\t\t\t\t\t\t<path d=\"m230.5 179.5c-.9 0-1.7.7-1.7 1.6 0 .9.7 1.7 1.7 1.7.9 0 1.7-.7 1.7-1.7 0-.9-.7-1.6-1.7-1.6zm0 3c-.7 0-1.3-.6-1.3-1.3 0-.7.5-1.3 1.3-1.3.7 0 1.3.6 1.3 1.3 0 .7-.6 1.3-1.3 1.3z\" fill=\"#4c4c4c\"/>\n\t\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t<!-- /ko -->\n\t\t\t\n\t\t\t<!-- /ko -->\n\n\n\t\t\t<!-- ko if: searchItem() -->\n\t\t\t.listItems( style = \"margin:1em;\" )\n\t\t\t\t.ui.top.fixed.menu.borderless\n\t\t\t\t\t.item( style = \"width: 90%;\" )\n\t\t\t\t\t\tform.ui.form( data-bind = \"event: { 'submit': search_form }\" style = \"width: 100%;\" )\n\t\t\t\t\t\t\t.field\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t.ui.search\n\t\t\t\t\t\t\t\t\t.ui.input.icon( data-bind = \"css : { 'error': showSearchError(), 'loading disabled': showInputLoading }\")\n\t\t\t\t\t\t\t\t\t\tinput( style=\"color:rgba(0,0,0,0.5);border-radius: 500rem!important;\" type=\"text\" \n\t\t\t\t\t\t\t\t\t\t\tdata-bind = \" textInput: searchInputText, hasFocus: SearchInputNextHasFocus, attr: { placeholder: showSearchError() ? ( messageBoxDefine [ errorMessageIndex() ][ $root.languageIndex() ]): infoDefine[ $root.languageIndex() ].coSearch.searchInputPlaceholder }\" )\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t<!-- ko if: searchInputText().length -->\n\t\t\t\t\t\t\t\t\t\ti.icon.circular.search.link.icon( data-bind = \"click: search_form\" style=\"color: #4285f4!important;\" )\n\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\t\t<!-- ko if: !searchInputText().length -->\n\t\t\t\t\t\t\t\t\t\t\ti.icon.image.outline.link.circular( data-bind = \" click: function (){ document.getElementById('imageInput1').click() } \" style = \"color: #4285f4!important;\")\n\t\t\t\t\t\t\t\t\t\t\t.hideInput( style=\"position: absolute;\")\n\t\t\t\t\t\t\t\t\t\t\t\tinput( onchange = \"_view.appsManager().appScript().imageSearch( this )\" id = \"imageInput1\" type = \"file\" accept = 'image/gif,image/jpeg,image/jpg,image/png' style=\"opacity:0;width: 0px;height: 0px;\" )\n\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\t\t<!-- ko if: showSearchError -->\n\t\t\t\t\t\t\t\t\t\t\ti.icon.link.circular.red.close( data-bind = \" click: searchInputCloseError \")\n\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t<!-- ko if: searchItem().action -->\n\t\t\t\t\t\t\t.field( style = \"margin-left: 1em;\" )\n\n\t\t\t\t\t\t\t\t<!-- ko if: currentlyShowItems() !== 0 -->\n\t\t\t\t\t\t\t\t\ta.basic.ui.label.yellow.small( data-bind = \" click: webItemsClick \" style = \"padding-right: 1em;\" )\n\t\t\t\t\t\t\t\t\t\ti.icon.rss\n\t\t\t\t\t\t\t\t\t\tspan( data-bind = \"text: info.searchToolBarMenu[0][ $root.languageIndex() ] \")\n\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t<!-- ko if: searchItem().action.news && currentlyShowItems() !== 1 -->\n\t\t\t\t\t\t\t\ta.basic.ui.label.small( style = \"padding-right: 1em;\"\n\t\t\t\t\t\t\t\t\tdata-bind = \" click: newsButtonClick , style: {  cursor: newsButtonShowLoading() ? 'unset' : 'pointer' }, css: { 'disabled': newsButtonShowLoading(), 'olive': newsItemsArray() && !newsButtonShowLoading(), 'grey': !newsItemsArray() && !newsButtonShowError(), 'red': newsButtonShowError() }\")\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t<!-- ko if: newsButtonShowError -->\n\t\t\t\t\t\t\t\t\ti.icon.info.red\n\t\t\t\t\t\t\t\t\tspan( data-bind = \" text: messageBoxDefine[ newsButtonErrorIndex()][ $root.languageIndex() ] \")\n\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\t<!-- ko ifnot: newsButtonShowError -->\n\n\t\t\t\t\t\t\t\t\t<!-- ko ifnot: newsButtonShowLoading -->\n\t\t\t\t\t\t\t\t\ti.icon.newspaper.outline\n\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\t<!-- ko if: newsButtonShowLoading -->\n\t\t\t\t\t\t\t\t\ti.icon.notched.circle.loading( data-bind = \" css: { 'loadingGetResponse': newsLoadingGetResponse, 'conetResponse': newsConetResponse }\")\n\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\tspan( data-bind = \"text: info.searchToolBarMenu[1][ $root.languageIndex() ] \" )\n\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t<!-- ko if: searchItem().action.image && currentlyShowItems() !== 2 -->\n\t\t\t\t\t\t\t\ta.basic.ui.label.small( data-bind = \"click: imageButtonClick, style: {  cursor: imageButtonShowLoading() ? 'unset' : 'pointer' }, css: { teal: imageItemsArray() && !imageButtonShowLoading(), grey: !imageItemsArray() && !imageButtonShowError(), red: imageButtonShowError() }\"\n\t\t\t\t\t\t\t\t\tstyle = \"padding-right: 1em;\" )\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t<!-- ko if: imageButtonShowError() -->\n\t\t\t\t\t\t\t\t\ti.icon.info.red\n\t\t\t\t\t\t\t\t\tspan( data-bind = \" text: messageBoxDefine [ imageButtonErrorIndex()][ $root.languageIndex() ] \")\n\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\t<!-- ko ifnot: imageButtonShowError() -->\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t<!-- ko if: !imageButtonShowLoading() -->\n\t\t\t\t\t\t\t\t\ti.icon.image.outline\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\t<!-- ko if: imageButtonShowLoading() -->\n\t\t\t\t\t\t\t\t\ti.icon.notched.circle.loading( data-bind = \" css: { 'loadingGetResponse': imageLoadingGetResponse, 'conetResponse': imageConetResponse }\")\n\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\t\t\tspan( data-bind = \"text: info.searchToolBarMenu[2][ $root.languageIndex() ] \" )\n\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t<!-- ko if: searchItem().action.video && currentlyShowItems() !== 3 -->\n\t\t\t\t\t\t\t\ta.basic.ui.label.blue.small( data-bind = \"click: videoButtonClick,style: {  cursor: videoButtonShowLoading() ? 'unset' : 'pointer' }, css: { blue: videoItemsArray() && !videoButtonShowLoading(), grey: !videoItemsArray() && !videoButtonShowError(), red: videoButtonShowError() }\"\n\t\t\t\t\t\t\t\t\tstyle = \"padding-right: 1em;\")\n\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t<!-- ko if: videoButtonShowError() -->\n\t\t\t\t\t\t\t\t\ti.icon.info.red\n\t\t\t\t\t\t\t\t\tspan( data-bind = \" text: messageBoxDefine [ videoButtonErrorIndex()] [ $root.languageIndex() ]\")\n\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\t<!-- ko ifnot: videoButtonShowError() -->\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t<!-- ko if: !videoButtonShowLoading() -->\n\t\t\t\t\t\t\t\t\ti.icon.video\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\t<!-- ko if: videoButtonShowLoading() -->\n\t\t\t\t\t\t\t\t\ti.icon.notched.circle.loading\n\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\n\n\t\t\t\t\t\t\t\t\tspan( data-bind = \"text: info.searchToolBarMenu[3][ $root.languageIndex() ]  \" )\n\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t<!-- /ko -->\n\n\n\t\t\t\t\t\t\t<!-- ko if: !searchItem()['originImage'] && showSearchesRelated() -->\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t.field( style = \"margin-left: 1em;\" )\n\t\t\t\t\t\t\t\t.ui.grey.header( data-bind = \"text: infoDefine[ $root.languageIndex() ].coSearch.SearchesRelated[0] + searchInputTextShow() + infoDefine[ $root.languageIndex() ].coSearch.SearchesRelated[1]\" \n\t\t\t\t\t\t\t\t\t\tstyle=\"margin-bottom: 1em;\" )\n\t\t\t\t\t\t\t\t.related.ui.grid( style = \"padding-bottom: 1em;\" )\n\n\t\t\t\t\t\t\t\t\t<!-- ko foreach: searchItem().searchesRelated -->\n\t\t\t\t\t\t\t\t\ta.five.wide.column( href = \"#\" data-bind = \"text: text, click: function () { $parents[0].searchesRelatedSelect ( $parents[0], $index())}\" style=\"padding-top: 0.2rem;padding-bottom: 0.2rem;\")\n\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t.items( data-bind=\" style: { 'margin-top': showSearchesRelated() && !searchItem()['originImage'] ? '15.5em' : '7.5em', 'padding-top': showSearchesRelated() && !searchItem()['originImage'] ? '1em': '1em' }, click: function () { showSearchesRelated ( false ); return true;}\" )\n\t\t\t\t\t\n\t\t\t\t\t.AppList.CoContent.content\n\t\t\t\t\t\t\n\t\t\t\t\t\t.ui.items.searchItems\n\t\t\t\t\t\t\t.totalResults.ui.grey.header\n\t\t\t\t\t\t\t\t.sub.header\n\t\t\t\t\t\t\t\t\tspan.totalResults1( data-bind = \" text: info.totalResults[ $root.languageIndex() ]\" )\n\t\t\t\t\t\t\t\t\tspan.totalResults2( data-bind = \" text: searchItem().totalResults\" style=\"margin: 0.5em;\" )\n\t\t\t\t\t\t\t\t\tspan.totalResults3( data-bind = \" text: info.totalResults1[ $root.languageIndex() ]\" )\n\n\t\t\t\t\t\t\t<!-- ko if: searchItem()['originImage'] -->\n\t\t\t\t\t\t\t.imageResultInfo.item\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<!-- ko with: searchItem()['originImage'] -->\n\t\t\t\t\t\t\t\t.image\n\t\t\t\t\t\t\t\t\timg( data-bind = \" attr: { src: img }\")\n\t\t\t\t\t\t\t\t.content\n\t\t\t\t\t\t\t\t\t.meta( data-bind = \" text: infoDefine[ $root.languageIndex() ].coSearch.imageSize \")\n\t\t\t\t\t\t\t\t\t.description( data-bind = \" text: size\" style = \"color: gray;\" )\n\t\t\t\t\t\t\t\t\t.meta\n\n\t\t\t\t\t\t\t\t\t\t<!-- ko ifnot: $parents[0].imageButtonShowError -->\n\t\t\t\t\t\t\t\t\t\t.notSimilarImagesShowError\n\n\t\t\t\t\t\t\t\t\t\t\t<!-- ko if: $parents[0].imageButtonShowLoading -->\n\t\t\t\t\t\t\t\t\t\t\t\ti.icon.notched.circle.loading( data-bind = \" css: { 'loadingGetResponse': $parents[0].imageLoadingGetResponse, 'conetResponse': $parents[0].imageConetResponse }\")\n\t\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\t\t\t<!-- ko if: $parents[0].imageItemsArray() && $parents[0].imageItemsArray().Result -->\n\t\t\t\t\t\t\t\t\t\t\t\ti.icon.file.image.outline.orange.link( data-bind = \"click: function () { $parents[0].imageButtonClick ( $parents[0] )}\")\n\t\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\t\t\ta.ui( data-bind = \"style: { 'color': $parents[0].imageItemsArray() && $parents[0].imageItemsArray().Result ? '#f2711c': '#4183c4'}, text: infoDefine[ $root.languageIndex() ].coSearch.similarImages, click: function () { $parents[0].imageButtonClick( $parents[0] )}\" )\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\t\t<!-- ko if: $parents[0].imageButtonShowError -->\n\t\t\t\t\t\t\t\t\t\tspan\n\t\t\t\t\t\t\t\t\t\t\ti.icon.info.circle.red.link( data-bind = \"click: function () { $parents[0].imageButtonClick( $parents[0] )}\" )\n\t\t\t\t\t\t\t\t\t\t\ta.ui( data-bind = \"text: messageBoxDefine [ $parents[0].imageButtonErrorIndex()][ $root.languageIndex() ], click: function () { $parents[0].imageButtonClick( $parents[0] )} \"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle = \"color: #990000a8!important;\")\n\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\t.space\n\t\t\t\t\t\t\t.space\n\n\t\t\t\t\t\t\t<!-- ko foreach: searchItemList -->\n\t\t\t\t\t\t\t.item\n\t\t\t\t\t\t\t\t<!-- ko if: imageInfo && imageInfo['img'] -->\n\t\t\t\t\t\t\t\t.image.ui.top.aligned( data-bind = \"style: { height: imageInfo['videoTime'] ? '90px' : 'auto' }\" style = \" width:150px \")\n\t\t\t\t\t\t\t\t\timg( data-bind = \"attr: { src: imageInfo.img }\")\n\t\t\t\t\t\t\t\t\t<!-- ko if: imageInfo['videoTime'] -->\n\t\t\t\t\t\t\t\t\t.ui.bottom.right.attached.label.tiny( data-bind = \"text: imageInfo['videoTime'] \" style = \" background-color: #3130307a!important;; color: rgba(255, 252, 252, 0.77)!important;;\")\n\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\t\t.content\n\t\t\t\t\t\t\t\t\t.header\n\t\t\t\t\t\t\t\t\t\ta( data-bind = \"text: title, attr: { href: url } \"  style=\"font-weight: normal;font-size: medium;\" target = \"_blank\" )\n\t\t\t\t\t\t\t\t\t<!-- ko ifnot: newsBrand -->\n\t\t\t\t\t\t\t\t\t.meta( style=\"margin:unset;\")\n\t\t\t\t\t\t\t\t\t\tspan\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t<!-- ko if: !showLoading() && ! snapshotReady() && !showError() -->\n\t\t\t\t\t\t\t\t\t\t\ti.icon.object.group.grey.link( data-bind = \"click: function() { $parents[0].getSnapshotClick( $parents[0], $index ())}\")\n\t\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\t\t\t<!-- ko if: showLoading -->\n\t\t\t\t\t\t\t\t\t\t\ti.icon.notched.circle.loading( data-bind = \"css: { 'loadingGetResponse': loadingGetResponse, 'conetResponse': conetResponse }\")\n\t\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\t\t\t<!-- ko if: snapshotReady -->\n\t\t\t\t\t\t\t\t\t\t\ti.icon.file.image.outline.olive.link( data-bind = \"click: function() { $parents[0].showSnapshotClick( $parents[0], $index())}\" )\n\t\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t<!-- ko if: showError -->\n\t\t\t\t\t\t\t\t\t\t\ti.icon.info.circle.red.link( data-bind = \"attr: { id: id, 'data-content': messageBoxDefine [ errorIndex()] [ $root.languageIndex() ]}\")\n\t\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\t\tspan( data-bind=\"text: urlShow, style: { color: snapshotReady() ? 'orange' : ( showError() ? 'red' : 'green') } \"\n\t\t\t\t\t\t\t\t\t\t\tstyle=\"margin-top: 0.5em; margin-bottom: 0.5em; font-size: small;\" )\n\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\t\t\t.description( style = \" color: grey; \")\n\n\t\t\t\t\t\t\t\t\t\t<!-- ko if: newsBrand -->\n\t\t\t\t\t\t\t\t\t\tp\n\t\t\t\t\t\t\t\t\t\t\tspan\n\t\t\t\t\t\t\t\t\t\t\t\t<!-- ko if: !showLoading() && ! snapshotReady() && !showError() -->\n\t\t\t\t\t\t\t\t\t\t\t\ta.ui.image.mini( data-bind = \"click: function() { $parents[0].getSnapshotClick( $parents[0], $index ())}\" href=\"#\")\n\t\t\t\t\t\t\t\t\t\t\t\t\timg( data-bind=\"attr: { src: newsBrandImg }\")\n\t\t\t\t\t\t\t\t\t\t\t\t//-i.icon.object.group.grey.link( data-bind = \"click: function() { $parents[0].getSnapshotClick( $parents[0], $index ())}\")\n\n\t\t\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\t\t\t\t<!-- ko if: showLoading -->\n\t\t\t\t\t\t\t\t\t\t\t\ti.icon.notched.circle.loading( data-bind = \"css: { 'loadingGetResponse': loadingGetResponse, 'conetResponse': conetResponse }\" )\n\t\t\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\t\t\t\t<!-- ko if: snapshotReady -->\n\t\t\t\t\t\t\t\t\t\t\t\ti.icon.file.image.outline.olive.link( data-bind = \"click: function() { $parents[0].showSnapshotClick( $parents[0], $index())}\" )\n\t\t\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t<!-- ko if: showError -->\n\t\t\t\t\t\t\t\t\t\t\t\ti.icon.info.circle.red.link( data-bind = \"attr: { id: id, 'data-content': messageBoxDefine [ errorIndex()] [ $root.languageIndex()]}\")\n\t\t\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\t\t\tspan( data-bind = \" text: newsBrand \" style = \"font-weight: bolder; color: #906363db;\" )\n\t\t\t\t\t\t\t\t\t\t\t<!-- ko if: beforeTime -->\n\t\t\t\t\t\t\t\t\t\t\t<!-- ko with: beforeTime -->\n\n\t\t\t\t\t\t\t\t\t\t\t<!-- ko if: timeNumber -->\n\t\t\t\t\t\t\t\t\t\t\tspan( data-bind = \"text: ' - ' + timeNumber + ' ' + infoDefine[ $root.languageIndex() ].coSearch.timeUnit[ timeUnit ]\" style = \"font-weight: bolder; color: #906363db;\")\n\t\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\t\t\t<!-- ko if: time -->\n\t\t\t\t\t\t\t\t\t\t\tspan( data-bind = \"text: ' - ' + infoDefine[ $root.languageIndex() ].coSearch.TimeTolocalTime ( time )\" style = \"font-weight: bolder; color: #906363db;\")\n\t\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t<!-- ko ifnot: newsBrand -->\n\t\t\t\t\t\t\t\t\t\t<!-- ko if: beforeTime -->\n\t\t\t\t\t\t\t\t\t\t<!-- ko with: beforeTime -->\n\n\t\t\t\t\t\t\t\t\t\t<!-- ko if: timeNumber -->\n\t\t\t\t\t\t\t\t\t\tspan( data-bind = \"text: timeNumber + ' ' + infoDefine[ $root.languageIndex() ].coSearch.timeUnit[ timeUnit ] + ' - '\" style = \"font-weight: bolder; color: #906363db;\")\n\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\t\t<!-- ko if: time -->\n\t\t\t\t\t\t\t\t\t\tspan( data-bind = \"text: infoDefine[ $root.languageIndex() ].coSearch.TimeTolocalTime ( time ) + ' - '\" style = \"font-weight: bolder; color: #906363db;\")\n\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\t\t\t\tspan( data-bind = \"text: description\" style = \"color: grey\")\n\n\t\t\t\t\t\t\t.space\n\t\t\t\t\t\t\t.space\n\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t<!-- ko if: !nextButtonShowError() && searchItem().nextPage -->\n\t\t\t\t\t\t\tbutton.ui.large.button( data-bind = \"css: { 'loading buttonUnActive': moreResultsButtomLoading,  negative: nextButtonShowError, 'loadingGetResponse': nextButtonLoadingGetResponse, 'conetResponse': nextButtonConetResponse },text: info.moreResults[ $root.languageIndex() ], click: searchNext\" style=\"margin-top: 1em;margin-bottom: 2em;\" )\n\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t<!-- ko if: nextButtonShowError -->\n\t\t\t\t\t\t\tbutton.ui.large.button.negative( data-bind = \"text: messageBoxDefine [ nextButtonErrorIndex()][ $root.languageIndex() ], click: nextButtonErrorClick \" style=\"background-color: #b94835e3;margin-top: 1em;margin-bottom: 2em;\")\n\n\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\t.space\n\t\t\t\t\t\t\t.space\n\t\t\t\t\t\n\t\t\t<!-- /ko -->\n\n\n\t\t<!-- /ko -->\n\n\t\t<!-- ko if: !showMain() && showSnapshop () -->\n\t\t#subPage( data-bind = \" with: showWebPage \")\n\t\t\t\n\t\t\t.ui.top.fixed.menu.borderless\n\t\t\t\t.item( style = \"width: 90%;\" )\n\t\t\t\t\tform.ui.form( style = \"width: 100%;\" data-bind = \"css: { 'error': showErrorMessage }\" )\n\t\t\t\t\t\t.field( style = \"width: 100%;\" )\n\t\t\t\t\t\t\t.ui.left.icon.input( data-bind = \"css : { 'loading': showLoading }\" style = \"width: 100%;\" )\n\t\t\t\t\t\t\t\ti.icon.close.link.circular( data-bind = \"click: close \" style=\"color: #4285f4!important;\")\n\t\t\t\t\t\t\t\tinput( style = \"color: rgba ( 0,0,0,0.5 );\" readonly data-bind = \"value: showUrl\" )\n\t\t\t\t\t\t\t\t<!-- ko if: showHtmlCodePage() && ! showLoading() -->\n\t\t\t\t\t\t\t\ti.icon.link.image.circular( data-bind = \" click: imgClick \" style=\"left: auto; right: .5em; color:#947b66!important;\" )\n\t\t\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t\t\t<!-- ko if: showImgPage() && ! showLoading() -->\n\t\t\t\t\t\t\t\ti.icon.link.code.circular( data-bind = \" click: htmlClick \" style=\"left: auto; right: .5em; color:#346b0b!important;\" )\n\t\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\n\t\t\t\t\t\t<!-- ko if: showLoading -->\n\t\t\t\t\t\t.field\n\t\t\t\t\t\t\tp( data-bind = \" text: messageBoxDefine ['LoadingPage'][$root.languageIndex()]\" style = \"color: grey;\")\n\t\t\t\t\t\t.field\n\t\t\t\t\t\t\t.loaderCoNET( style = \" margin-top: 3em;\")\n\t\t\t\t\t\t\t\t.loaderCoNET-div\n\t\t\t\t\t\t\t\t.loaderCoNET-div\n\t\t\t\t\t\t\t\t.loaderCoNET-div\n\t\t\t\t\t\t\t\t.loaderCoNET-div\n\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t<!-- ko if: showErrorMessage -->\n\t\t\t\t\t\t\t.ui.error.message\n\t\t\t\t\t\t\t\tspan\n\t\t\t\t\t\t\t\t\ti.icon.exclamation.triangle.red.link\n\t\t\t\t\t\t\t\t\tspan( data-bind=\" text: messageBoxDefine ['pageLoadingError'][$root.languageIndex()]\")\n\t\t\t\t\t\t<!-- /ko -->\n\t\t\t<!-- ko if: showHtmlCodePage -->\n\t\t\t\n\t\t\t\tiframe( data-bind = \" attr: { src: htmlIframe() } \"  style = \"border: none;width: 100%; height: -webkit-fill-available;margin-top: 7em;\" sandbox = \"allow-forms\" )\n\t\t\t<!-- /ko -->\n\n\t\t\t<!-- ko if: showImgPage -->\n\t\t\t\timg( data-bind = \" attr: { src: png }\" style = \"border: none;margin: 7em 1em 1em 1em;\")\n\t\t\t<!-- /ko -->\n\n\t\t<!-- /ko -->\n\n\t\t<!-- ko if: !showMain() && showSearchSimilarImagesResult () -->\n\t\t.closeButton( style = \"z-index: 999;top: 1.3em; left: 1em; position: fixed; width: 2em;\" )\n\t\t\ti.icon.left.chevron.link.circular.teal( data-bind = \"click: closeSimilarImagesResult \" )\n\t\t.ui.six.doubling.cards( data-bind = \" foreach: searchSimilarImagesList \" style=\"margin: 2em; margin-top: 3em;\")\n\t\t\t\n\t\t\t.card\n\t\t\t\ta.ui.right.corner.label( data-bind = \"click: function() { return $parents[0].imagesResultClick( $parents[0], $index (), 'img')},  class: showImageError() ? 'red' : ( snapshotImageReady() ? 'teal': 'grey')\" )\n\t\t\t\t\t<!-- ko if: !showImageLoading() && !showImageError() -->\n\t\t\t\t\t\ti.icon.object.group.link\n\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t<!-- ko if: showImageLoading -->\n\t\t\t\t\t\ti.icon.notched.circle.loading( data-bind = \"css: { 'loadingGetResponse': loadingImageGetResponse, 'conetResponse': conetImageResponse }\")\n\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\n\t\t\t\t\t<!-- ko if: showImageError -->\n\t\t\t\t\ti.icon.info.circle.link( data-bind = \"attr: { id: id + '-1', 'data-content': messageBoxDefine [ imageErrorIndex()] [ $root.languageIndex() ] }\")\n\t\t\t\t\t<!-- /ko -->\n\t\t\t\ta.ui.image( data-bind = \"attr: { 'href': imgUrlHref }\" target = \"_blank\" )\n\t\t\t\t\t//-( data-bind = \"click: function() { return $parents[0].imagesResultClick( $parents[0], $index (), 'image')}\")\n\t\t\t\t\timg( data-bind = \"attr: { src: imgSrc }\")\n\t\t\t\t.content\n\t\t\t\t\t.meta\n\t\t\t\t\t\tspan.data( data-bind = \"text: infoDefine[ $root.languageIndex() ].coSearch.imageSize\" )\n\t\t\t\t\t\tspan.data( data-bind = \"text: size\" )\n\t\t\t\t\t.description( data-bind = \"text: description \" )\n\t\t\t\t.extra.content\n\t\t\t\t\tspan\n\t\t\t\t\t\t<!-- ko if: !showLoading() && !showError() -->\n\t\t\t\t\t\t\ti.icon.object.group.link( data-bind = \"class: snapshotReady() ? 'olive': 'grey', click: function() { return $parents[0].imagesResultClick( $parents[0], $index (), 'link')}\")\n\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t\t<!-- ko if: showLoading -->\n\t\t\t\t\t\t\ti.icon.notched.circle.loading( data-bind = \"css: { 'loadingGetResponse': loadingGetResponse, 'conetResponse': conetResponse }\")\n\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\n\t\t\t\t\t\t<!-- ko if: showError -->\n\t\t\t\t\t\ti.icon.info.circle.red.link( data-bind = \"attr: { id: id, 'data-content': messageBoxDefine [ errorIndex()] [ $root.languageIndex() ]}\")\n\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\ta( data-bind = \"text: webUrl, attr: { 'href': webUrlHref }\" target = \"_blank\" )\n\t\t<!-- /ko -->\n\t\n\t<!-- /ko -->"
  },
  {
    "path": "app/views/Shared/header.pug",
    "content": "head\n\ttitle CoNET Platform\n\tmeta(charset = 'utf-8' )\n\tmeta(name = \"viewport\" content = \"width=device-width, initial-scale=1, maximum-scale = 1, user-scalable = no\")\n\tmeta(name=\"author\" content=\"CoNET Technology Inc.|CoNET技術株式会社|CoNET技術有限公司\")\n\tmeta(name=\"msapplication-TileColor\" content=\"#ffffff\")\n\tmeta(name=\"msapplication-TileImage\" content=\"/images/128x128.png\")\n\tmeta(name=\"theme-color\" content=\"#ffffff\")\n\tlink(rel=\"apple-touch-icon\" sizes=\"16x16\" href=\"/images/16x16.png\")\n\tlink(rel=\"apple-touch-icon\" sizes=\"32x32\" href=\"/images/32x32.png\")\n\tlink(rel=\"apple-touch-icon\" sizes=\"24x24\" href=\"/images/24x24.png\")\n\tlink(rel=\"apple-touch-icon\" sizes=\"64x64\" href=\"/images/64x64.png\")\n\tlink(rel=\"apple-touch-icon\" sizes=\"96x96\" href=\"/images/96x96.png\")\n\tlink(rel=\"apple-touch-icon\" sizes=\"128x128\" href=\"/images/128x128.png\")\n\tlink(rel=\"apple-touch-icon\" sizes=\"256x256\" href=\"/images/256x256.png\")\n\tlink(rel=\"apple-touch-icon\" sizes=\"512x512\" href=\"/images/512x512.png\")\n\tlink(rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/images/32x32.png\")\n\tlink(rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"/images/96x96.png\")\n\tlink(rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/images/16x16.png\")\n\tlink(rel = \"stylesheet\", href = \"/css/semantic.min.css\")\n\tlink(rel = \"stylesheet\", href = \"/css/animate.min.css\")\n\tlink(rel = \"stylesheet\", href = \"/css/page.css\")"
  },
  {
    "path": "app/views/Shared/mainMenu.pug",
    "content": "\n\n#mainMenu_temp( data-bind = \"with: mainScript \" style = \"margin-top: 2em;\")\n\t.ui.divider\n\t.ui.header\n\t\t.content\n\t\t\tspan.shadowText1( data-bind = \" text: infoDefine[ $root.languageIndex() ].appsManager.nodeName\" style=\"color: white;\" )\n\t\t\tspan.shadowText1( data-bind = \" text: nodeName [ $root.languageIndex() ]\" style=\"color: white;\" )\n\t\t\t.sub.header( style = \"margin-top: 0.5em;\")\n\t\t\t\tspan( data-bind = \" text: infoDefine[ $root.languageIndex() ].appsManager.connectAddress \" )\n\t\t\t\tspan( data-bind = \" text: nodeAddress \" )\n\t.ui.header\n\t\t.content\n\t\t\th2.shadowText1( data-bind = \" text: infoDefine[ $root.languageIndex() ].appsManager.serviceList\" style=\"color: white;\" )\n\t.ui.divider\n\n\t<!-- ko if: $parents[0].appLoadingError -->\n\t\tspan.shadowText1( data-bind =\" click: function() { $parents[0].updateAppsManu( $parents[0] ) }\")\n\t\t\ti.shadowText1.icon.link.exclamation.triangle.red\n\t\t\ta( data-bind = \"text: messageBoxDefine [ $parents[0].appLoadingErrorIndex() ][ $root.languageIndex() ]\" style = \"color:red;\" href=\"#\")\n\t<!-- /ko -->\n\n\t<!-- ko ifnot: $parents[0].appLoadingError -->\n\t.ui.items.divided( data-bind = \" foreach: _mainMenuItem \" )\n\t\t.item\n\t\t\ta.ui.small.image( data-bind = \"css: { 'active dimmer': loading() }, click: function() { $parents[1].appClick ( $index()) } \" )\n\t\t\t\timg( data-bind = \" attr: { src: imgSrc }\" )\n\t\t\t\t<!-- ko if: loading -->\n\t\t\t\t\t.ui.loader( data-bind = \"css: { 'loadingGetResponse': loadingGetResponse, 'conetResponse': conetResponse }\" )\n\t\t\t\t<!-- /ko -->\n\t\t\t\n\t\t\t.content\n\t\t\t\t\n\t\t\t\ta.header.shadowText1( data-bind = \"text: headerText[ $root.languageIndex()], click: function() { $parents[1].appClick ( $index()) }\" style=\"color: white;\" )\n\t\t\t\t\n\t\t\t\t.meta\n\t\t\t\t\tspan( data-bind = \" text: meta[ $root.languageIndex() ]\" )\n\t\t\t\t.description\n\t\t\t\t\tp( data-bind = \"  text: description[ $root.languageIndex() ]\" style=\"color: white;\")\n\t\t\t\t.extra( data-bind = \" html: extra [ $root.languageIndex() ]\" style=\"color: white;\")\n\t<!-- /ko -->\n"
  },
  {
    "path": "app/views/home/Wrt.pug",
    "content": "extends ../shared/coreLayout.pug\nblock jumbotron1\n\t\n\tsection.CoContent.content\n\t\t.ui.green.segment.CoGateCards( style=\"max-width: 50em;\")\n\t\t\t\n\t\t\timg.ui.centered.medium.image.huge( src=\"/images/wrt.png\")\n\t\t\th3.red( data-bind=\"text: infoDefine[ $root.languageIndex() ].useInfoMacOS.wrtTestAreaTitle\" style=\"position: absolute;top: 11em;margin-left: 10em;\")\n\t\t\tp( style=\"position: absolute;top: 18em;margin-left: 2em;\")\n\t\t\t\tspan #{ localIP }\n\t\t\t\tspan( data-bind=\"text: infoDefine[ $root.languageIndex() ].useInfoMacOS.localIpAddress\" style=\"padding-left: 1em; color: cadetblue;\")\n\t\t\tp( style=\"position: absolute;top: 19em;margin-left: 2em;padding-top: 0.5em;padding-bottom: 0.5em; color: crimson;\")\n\t\t\t\tspan #{ globalIP }\n\t\t\t\tspan( data-bind = \"text: infoDefine[ $root.languageIndex() ].useInfoMacOS.globalIpAddress\" style=\"padding-left: 1em; color: red;\")\n\t\t\t\n\t\t\th3( data-bind=\"text: infoDefine[ $root.languageIndex() ].useInfoMacOS.wrtTest\")\n\t\t\tiframe.ui.centered.medium.image.huge( src=\"https://ip.voidsec.com/\" style=\"width: 100%;height: 40em;border: 0px;\")\n"
  },
  {
    "path": "app/views/home/coSearchImage.html",
    "content": "<svg version=\"1.1\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" viewBox=\"0 10 2880 1803.9\" preserveAspectRatio=\"xMidYMid meet\">\n\t<style type=\"text/css\">\n\t\t.st0{fill:#F3B5DD;}\n\t\t.st1{fill:none;stroke:#F46D78;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}\n\t\t.st2{fill:#B4E4ED;}\n\t\t.st3{fill:url(#SVGID_1_);}\n\t\t.st4{fill:#FFFFFF;}\n\t\t.st5{opacity:0.52;}\n\t\t.st6{opacity:0.55;}\n\t\t.st7{fill:url(#SVGID_2_);}\n\t\t.st8{fill:url(#SVGID_3_);}\n\t\t.st9{fill:#295071;}\n\t\t.st10{fill:url(#SVGID_4_);}\n\t\t.st11{fill:#F5D1C4;}\n\t\t.st12{fill:url(#SVGID_5_);}\n\t\t.st13{fill:#A52A35;}\n\t\t.st14{fill:#DE9285;}\n\t\t.st15{fill:#112627;}\n\t\t.st16{fill:url(#SVGID_6_);}\n\t\t.st17{fill:#FD9F9B;}\n\t\t.st18{fill:none;stroke:#F46D78;stroke-width:6;stroke-linecap:round;stroke-miterlimit:10;}\n\t\t.st19{fill:none;stroke:#4182B5;stroke-width:4;stroke-linecap:round;stroke-miterlimit:10;}\n\t\t.st20{fill:none;}\n\t\t.st21{fill:#FAE69A;}\n\t\t.st22{fill:#689278;}\n\t\t.st23{fill:#FF5B45;}\n\t\t.st24{fill:#0B230D;}\n\t\t.st25{fill:#F46D78;}\n\t\t.st26{fill:#F1E993;}\n\t\t.st27{fill:#00838A;}\n\t\t.st28{fill:#014B6B;}\n\t\t.st29{opacity:0.5;}\n\t\t.st30{fill:#C7F0EF;}\n\t\t.st31{opacity:0.45;}\n\t\t.st32{fill:#5793C0;}\n\t\t.st33{fill:url(#SVGID_7_);}\n\t\t.st34{fill:url(#SVGID_8_);}\n\t\t.st35{fill:url(#SVGID_9_);}\n\t\t.st36{opacity:0.65;fill:#C7F0EF;}\n\t\t.st37{fill:url(#SVGID_10_);}\n\t\t.st38{fill:url(#SVGID_11_);}\n\t\t.st39{opacity:0.75;}\n\t\t.st40{fill:#FAE7F4;}\n\t\t.st41{opacity:0.12;fill:#F5D1C4;}\n\t\t.st42{opacity:0.15;fill:#F5D1C4;}\n\t\t.st43{opacity:8.000000e-02;fill:#F5D1C4;}\n\t\t.st44{opacity:0.15;fill:#FFF4F0;}\n\t\t.st45{fill:#152669;}\n\t\t.st46{opacity:0.85;}\n\t\t.st47{fill:none;stroke:#FFFFFF;stroke-width:2;stroke-linecap:round;stroke-miterlimit:10;}\n\t\t.st48{fill:url(#SVGID_12_);}\n\t\t.st49{opacity:0.12;}\n\t\t.st50{fill:#F880B8;}\n\t\t.st51{opacity:3.000000e-02;}\n\t\t.st52{opacity:0.2;}\n\t\t.st53{fill:url(#SVGID_13_);}\n\t\t.st54{fill:url(#SVGID_14_);}\n\t\t.st55{fill:#1E3796;}\n\t\t.st56{fill:url(#SVGID_15_);}\n\t\t.st57{fill:url(#SVGID_16_);}\n\t\t.st58{fill:#E4D5DF;}\n\t\t.st59{fill:url(#SVGID_17_);}\n\t\t.st60{fill:#2F3BFF;}\n\t\t.st61{fill:#73FADE;}\n\t\t.st62{fill:#5B2AB4;}\n\t\t.st63{fill:#B87098;}\n\t\t.st64{fill:#012E42;}\n\t\t.st65{opacity:0.4;}\n\t\t.st66{opacity:0.8;fill:url(#auroraGradient);}\n\t\t.st67{fill:url(#SVGID_19_);}\n\t\t.st68{fill:url(#SVGID_20_);}\n\t\t.st69{fill:url(#SVGID_21_);}\n\t\t.st70{fill:#46A9DE;}\n\t\t.st71{fill:url(#SVGID_22_);}\n\t\t.st72{fill:url(#SVGID_23_);}\n\t\t.st73{fill:#737BFF;}\n\t\t.st74{fill:#2E56CD;}\n\t\t.st75{opacity:0.1;}\n\t\t.st76{fill:#FA3924;}\n\t\t.st77{fill:#EC8930;stroke:#EAB67C;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}\n\t\t.st78{fill:url(#SVGID_24_);}\n\t\t.st79{fill:url(#SVGID_25_);}\n\t\t.st80{fill:url(#SVGID_26_);}\n\t\t.st81{fill:url(#SVGID_27_);}\n\t\t.st82{fill:url(#SVGID_28_);}\n\t\t.st83{fill:url(#SVGID_29_);}\n\t\t.st84{fill:url(#SVGID_30_);}\n\t\t.st85{fill:url(#SVGID_31_);}\n\t\t.st86{fill:url(#SVGID_32_);}\n\t\t.st87{fill:url(#SVGID_33_);}\n\t\t.st88{fill:url(#SVGID_34_);}\n\t\t.st89{fill:url(#SVGID_35_);}\n\t\t.st90{fill:url(#SVGID_36_);}\n\t\t.st91{fill:url(#SVGID_37_);}\n\t\t.st92{fill:url(#SVGID_38_);}\n\t\t.st93{fill:url(#SVGID_39_);}\n\t\t.st94{fill:url(#SVGID_40_);}\n\t\t.st95{opacity:0.8;fill:url(#SVGID_41_);}\n\t\t.st96{fill:url(#SVGID_42_);}\n\t\t.st97{fill:url(#SVGID_43_);}\n\t\t.st98{fill:url(#SVGID_44_);}\n\t\t.st99{fill:url(#SVGID_45_);}\n\t\t.st100{fill:url(#SVGID_46_);}\n\t\t.coSearchText{font: italic 200px sans-serif; fill:white}\n\t</style>\n\t<defs>\n\t\t<filter id=\"liquid\">\n\t\t\t<feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"7\" result=\"blur\" />\n\t\t\t<feColorMatrix in=\"blur\" mode=\"matrix\" values=\"1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 19 -9\" result=\"goo\" />\n\t\t\t<feComposite in=\"SourceGraphic\" in2=\"liquid\" operator=\"atop\"/>\n\t\t</filter>\n\n\t\t<symbol  id=\"RoundTree\" viewBox=\"-51.5 -88.2 103 176.5\">\n\t\t\t<circle class=\"st0\" cx=\"0\" cy=\"36.8\" r=\"51.5\"/>\n\t\t\t<g>\n\t\t\t\t<line class=\"st1\" x1=\"0\" y1=\"64.8\" x2=\"0\" y2=\"-85.2\"/>\n\t\t\t\t<line class=\"st1\" x1=\"-32\" y1=\"35.8\" x2=\"0\" y2=\"9.1\"/>\n\t\t\t\t<line class=\"st1\" x1=\"0\" y1=\"34.8\" x2=\"21\" y2=\"54.8\"/>\n\t\t\t</g>\n\t\t</symbol>\n\t</defs>\n\t<g id = \"all\">\n  \t\t<g id=\"DayGroup\">\n\t\t\t<g>\n\t\t\t\t<g>\n\t\t\t\t\t<rect y=\"3.9\" class=\"st2\" width=\"2880\" height=\"1800\"/>\n\t\t\t\t\t\t<linearGradient id=\"SVGID_1_\" gradientUnits=\"userSpaceOnUse\" x1=\"1440\" y1=\"1016.9138\" x2=\"1440\" y2=\"566.9138\">\n\t\t\t\t\t\t\t<stop  offset=\"8.862180e-02\" style=\"stop-color:#FFECE6;stop-opacity:0.5\"/>\n\t\t\t\t\t\t\t<stop  offset=\"1\" style=\"stop-color:#F5D1C4;stop-opacity:0\"/>\n\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t<rect y=\"566.9\" class=\"st3\" width=\"2880\" height=\"450\"/>\n\t\t\t\t</g>\n\t\t\n\t\t\t\t<g class=\"backClouds\">\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<path class=\"st4\" d=\"M2624.1,722c-19,33.7-42.7,64.6-70.6,91.4c-0.2,0.2-0.3,0.3-0.5,0.5c-14.9,14.3-29.7,27.7-44.2,40.1\n\t\t\t\t\t\t\tc-11.9,10.2-9.5,29.2,4.6,36.1c12.5,6.1,25.2,15.7,32.3,30.3c5.7,11.7,6.9,24.4,7.3,29.5c0.3,3.7,2.8,30.6-7,47\n\t\t\t\t\t\t\tc-13.9,23.2-69.6,25-75,25c-156.6-0.4-338.3-4.8-347-5c0-11.4,0.6-27.7,3-47c3.4-27,8.6-68.6,33-114c6-11.2,38.5-69.8,77.8-86.3\n\t\t\t\t\t\t\tc11.1-4.6,22.1-9.1,33.2-13.7c13.7,3.2,32,5.1,44-5c9.5-8,7.1-16.8,17-42c10.9-27.7,18.3-40,31-49c20.3-14.4,32.5-5.1,44-20\n\t\t\t\t\t\t\tc6.9-8.9,8.4-19.9,23-34.3c2.1-2.1,3.4-3.3,5.4-5c12.7-10.2,30.4-15.5,45.6-9.5c8.5,3.4,14.9,9.6,19.8,17.1\n\t\t\t\t\t\t\tc9.2,14.1,28.6,16.8,41.1,5.6c10.4-9.4,22.2-17.1,35.2-22.3c27.7-11.1,61.7-9.2,84.5,10.7c3.4,3,6.1,6.7,7.8,10.9\n\t\t\t\t\t\t\tc0.9,3.4,2.1,8.7,2.5,15.2C2673.4,654.7,2655.8,665.6,2624.1,722z\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<path class=\"st4\" d=\"M479.4,856.6c0.7,61.5-29.6,122.6-78.9,159.3H0V916c20.6-10.2,43.2-15.8,65-14.4\n\t\t\t\t\t\t\tc18.2,1.2,34.7-11.1,38.5-28.9c3.2-14.7,10.1-28.4,21-38.8c9.5-9.1,22.2-15,35.2-17c28.2-4.3,51.8-23.6,61.8-50.2\n\t\t\t\t\t\t\tc14.6-39,33.4-76.4,56-111.4c24.9-38.7,63.1-78.2,108.8-72.3c5.9,0.8,11.9,2.3,17.8,1.1c6.3-1.3,11.5-5.7,16.6-9.5\n\t\t\t\t\t\t\tc16.4-12.3,40.8-27,62.7-30.4c8.9-1.4,25.7-4,37.6,5.9c9.8,8.2,11.5,21,12.2,26.4c6,46-87.1,152.2-94.8,161\n\t\t\t\t\t\t\tc-8.1,13.4-5.1,30.9,7.3,40.3C467.7,794.3,479.1,827.3,479.4,856.6z\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<path class=\"st4\" d=\"M1430.1,1065.6c0-89.5,69.8-251,75.1-263.1c50.4-116.5,62.1-124.3,80.1-143.4\n\t\t\t\t\t\t\tc28.1-29.8,70.2-50.1,109.7-47.6c18.2,1.2,34.7-11.1,38.5-28.9c3.2-14.7,10.1-28.4,20.9-38.8c9.5-9.2,22.1-15,35.2-17\n\t\t\t\t\t\t\tc28.2-4.3,51.8-23.6,61.8-50.2c14.6-39,33.4-76.4,56-111.4c24.9-38.7,63.1-78.2,108.8-72.3c5.9,0.8,11.9,2.3,17.8,1.1\n\t\t\t\t\t\t\tc6.3-1.3,11.5-5.7,16.6-9.5c16.4-12.3,40.8-27,62.7-30.4c8.9-1.4,25.7-3.9,37.6,5.9c9.8,8.2,11.5,21,12.2,26.4\n\t\t\t\t\t\t\tc6,46-87.1,152.2-94.8,161c-8.1,13.4-5.1,30.9,7.3,40.3c22,16.6,33.4,49.6,33.7,78.9c0.7,62-30.1,123.5-80,160.2\n\t\t\t\t\t\t\tc-19.5,14.3-43.5,27.3-50,50.7c-2.6,9.4-2,19.4-1.6,29.2c4,104.5-30.1,210-94.6,292.3c-4.7,6-9.8,12.1-16.6,15.6\n\t\t\t\t\t\t\tc-5.4,2.8-11.5,3.8-17.4,4.8c-33.7,5.5-67.3,10.9-101,16.4c-38.8,6.3-77.9,12.6-117.2,12.3c-64.1-0.5-48.7-11.9-140.9-20.4\n\t\t\t\t\t\t\tc-12.5-1.1-32.3-2.7-45.9-17.3C1431.4,1096.7,1430.1,1078.1,1430.1,1065.6z\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<path class=\"st4\" d=\"M1245.7,957c-22.1,25.1-43.1,45-64.6,60.9H659c-0.4-0.7-0.7-1.3-1-2c-10.3-21-8-46.8-5.7-74\n\t\t\t\t\t\t\tc4-46.4,20.1-80,29.1-94.1c36.1-56.4,87.1-104.7,149.2-130c42.1-17.2,89.5-22.9,134-14.8c33.8,6.1,67-13.1,79.5-45\n\t\t\t\t\t\t\tc16.2-41.4,44.6-90,91.8-108.9c16.1-6.5,47.2-18.9,77.7-4.7c8.2,3.9,14.9,9,20.3,14.3c10.7,10.6,26.9,13.4,40.6,6.9\n\t\t\t\t\t\t\tc12.4-5.9,27.9-11.4,46.1-14.4c19.6-3.2,57.6-9.4,76.4,5.2C1449.4,597.1,1371.4,814.3,1245.7,957z\"/>\n\t\t\t\t\t</g>\n\t\t\t\t</g>\n\n\t\t\t\t<g class=\"Reflection\">\n\t\t\t\t\t<g class=\"st5\">\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<path class=\"st4\" d=\"M2624.1,1311.9c-19-33.7-42.7-64.6-70.6-91.4c-0.2-0.2-0.3-0.3-0.5-0.5c-14.9-14.3-29.7-27.7-44.2-40.1\n\t\t\t\t\t\t\t\tc-11.9-10.2-9.5-29.2,4.6-36.1c12.5-6.1,25.2-15.7,32.3-30.3c5.7-11.7,6.9-24.4,7.3-29.5c0.3-3.7,2.8-30.6-7-47\n\t\t\t\t\t\t\t\tc-13.9-23.2-69.6-25-75-25c-156.6,0.4-338.3,4.8-347,5c0,11.4,0.6,27.7,3,47c3.4,27,8.6,68.6,33,114\n\t\t\t\t\t\t\t\tc6,11.2,38.5,69.8,77.8,86.3c11.1,4.6,22.1,9.1,33.2,13.7c13.7-3.2,32-5.1,44,5c9.5,8,7.1,16.8,17,42c10.9,27.7,18.3,40,31,49\n\t\t\t\t\t\t\t\tc20.3,14.4,32.5,5.1,44,20c6.9,8.9,8.4,19.9,23,34.3c2.1,2.1,3.4,3.3,5.4,5c12.7,10.2,30.4,15.5,45.6,9.5\n\t\t\t\t\t\t\t\tc8.5-3.4,14.9-9.6,19.8-17.1c9.2-14.1,28.6-16.8,41.1-5.6c10.4,9.4,22.2,17.1,35.2,22.3c27.7,11.1,61.7,9.2,84.5-10.7\n\t\t\t\t\t\t\t\tc3.4-3,6.1-6.7,7.8-10.9c0.9-3.4,2.1-8.7,2.5-15.2C2673.4,1379.2,2655.8,1368.3,2624.1,1311.9z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<path class=\"st4\" d=\"M479.4,1177.3c0.7-61.5-29.6-122.6-78.9-159.3H0v100c20.6,10.2,43.2,15.8,65,14.4\n\t\t\t\t\t\t\t\tc18.2-1.2,34.7,11.1,38.5,28.9c3.2,14.7,10.1,28.4,21,38.8c9.5,9.2,22.2,15,35.2,17c28.2,4.3,51.8,23.6,61.8,50.2\n\t\t\t\t\t\t\t\tc14.6,39,33.4,76.4,56,111.4c24.9,38.7,63.1,78.2,108.8,72.3c5.9-0.8,11.9-2.3,17.8-1.1c6.3,1.3,11.5,5.7,16.6,9.5\n\t\t\t\t\t\t\t\tc16.4,12.3,40.8,27,62.7,30.4c8.9,1.4,25.7,3.9,37.6-5.9c9.8-8.2,11.5-21,12.2-26.4c6-46-87.1-152.2-94.8-161\n\t\t\t\t\t\t\t\tc-8.1-13.3-5.1-30.9,7.3-40.3C467.7,1239.6,479.1,1206.6,479.4,1177.3z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<path class=\"st4\" d=\"M1430.1,968.3c0,89.5,69.8,251,75.1,263.1c50.4,116.5,62.1,124.3,80.1,143.4\n\t\t\t\t\t\t\t\tc28.1,29.8,70.2,50.1,109.7,47.6c18.2-1.2,34.7,11.1,38.5,28.9c3.2,14.7,10.1,28.4,20.9,38.8c9.5,9.2,22.1,15,35.2,17\n\t\t\t\t\t\t\t\tc28.2,4.3,51.8,23.6,61.8,50.2c14.6,39,33.4,76.4,56,111.4c24.9,38.7,63.1,78.2,108.8,72.3c5.9-0.8,11.9-2.3,17.8-1.1\n\t\t\t\t\t\t\t\tc6.3,1.3,11.5,5.7,16.6,9.5c16.4,12.3,40.8,27,62.7,30.4c8.9,1.4,25.7,3.9,37.6-5.9c9.8-8.2,11.5-21,12.2-26.4\n\t\t\t\t\t\t\t\tc6-46-87.1-152.2-94.8-161c-8.1-13.4-5.1-30.9,7.3-40.3c22-16.6,33.4-49.6,33.7-78.9c0.7-62-30.1-123.5-80-160.2\n\t\t\t\t\t\t\t\tc-19.5-14.3-43.5-27.3-50-50.7c-2.6-9.4-2-19.4-1.6-29.2c4-104.5-30.1-210-94.6-292.3c-4.7-6-9.8-12.1-16.6-15.6\n\t\t\t\t\t\t\t\tc-5.4-2.8-11.5-3.8-17.4-4.8c-33.7-5.5-67.3-10.9-101-16.4c-38.8-6.3-77.9-12.6-117.2-12.3c-64.1,0.5-48.7,11.9-140.9,20.4\n\t\t\t\t\t\t\t\tc-12.5,1.1-32.3,2.7-45.9,17.3C1431.4,937.2,1430.1,955.8,1430.1,968.3z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<path class=\"st4\" d=\"M1245.7,1076.9c-22.1-25.1-43.1-45-64.6-60.9H659c-0.4,0.7-0.7,1.3-1,2c-10.3,21-8,46.8-5.7,74\n\t\t\t\t\t\t\t\tc4,46.4,20.1,80,29.1,94.1c36.1,56.4,87.1,104.7,149.2,130c42.1,17.2,89.5,22.9,134,14.8c33.8-6.1,67,13.1,79.5,45\n\t\t\t\t\t\t\t\tc16.2,41.4,44.6,90,91.8,108.9c16.1,6.5,47.2,18.9,77.7,4.7c8.2-3.8,14.9-9,20.3-14.3c10.7-10.6,26.9-13.4,40.6-6.9\n\t\t\t\t\t\t\t\tc12.4,5.9,27.9,11.4,46.1,14.4c19.6,3.2,57.6,9.4,76.4-5.2C1449.4,1436.8,1371.4,1219.6,1245.7,1076.9z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g class=\"st6\">\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t<linearGradient id=\"SVGID_2_\" gradientUnits=\"userSpaceOnUse\" x1=\"1056\" y1=\"895.9138\" x2=\"1056\" y2=\"512.552\" gradientTransform=\"matrix(1 0 0 -1 0 1933.901)\">\n\t\t\t\t\t\t\t\t<stop  offset=\"0\" style=\"stop-color:#295071\"/>\n\t\t\t\t\t\t\t\t<stop  offset=\"1\" style=\"stop-color:#41A0B5\"/>\n\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t<path class=\"st7\" d=\"M1240,1038c-30.3,116.9-49.4,205.9-62,270c-7,35.5-14.8,78.2-49.5,99.3c-33.5,20.4-84.8,18.9-112.6-6.7\n\t\t\t\t\t\t\t\tc-33.5-30.9-48.6-67-60.2-108.5c-16.3-58.3-42.1-141.1-83.7-245.1C994.7,1044,1117.3,1041,1240,1038z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t<linearGradient id=\"SVGID_3_\" gradientUnits=\"userSpaceOnUse\" x1=\"1864\" y1=\"889.8724\" x2=\"1864\" y2=\"504.552\" gradientTransform=\"matrix(1 0 0 -1 0 1933.901)\">\n\t\t\t\t\t\t\t\t<stop  offset=\"0\" style=\"stop-color:#295071\"/>\n\t\t\t\t\t\t\t\t<stop  offset=\"1\" style=\"stop-color:#41A0B5\"/>\n\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t<path class=\"st8\" d=\"M2048,1047c-30.3,116.9-49.4,204.9-62,269c-7,35.5-14.8,78.2-49.5,99.3c-33.5,20.4-84.8,18.9-112.6-6.7\n\t\t\t\t\t\t\t\tc-33.5-30.9-48.6-67-60.2-108.5c-16.3-58.3-42.1-151.1-83.7-255.1C1802.7,1042,1923,1047,2048,1047z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<polygon class=\"st9\" points=\"2014.2,1048 1802,976 1540,892 1239,906 1105.8,966.2 1012,1008.6 924.8,1048 1212.6,1476.7 \n\t\t\t\t\t\t\t1288.2,1589.3 1294,1598 1360.6,1509.5 1367,1501 1381.7,1506.9 1398.1,1513.5 1449,1534 1539.4,1456.2 \t\t\t\t\"/>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t<linearGradient id=\"SVGID_4_\" gradientUnits=\"userSpaceOnUse\" x1=\"1513.085\" y1=\"1041.9138\" x2=\"1513.085\" y2=\"335.9138\" gradientTransform=\"matrix(1 0 0 -1 0 1933.901)\">\n\t\t\t\t\t\t\t\t<stop  offset=\"0\" style=\"stop-color:#4182B5\"/>\n\t\t\t\t\t\t\t\t<stop  offset=\"1\" style=\"stop-color:#41A0B5\"/>\n\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t<path class=\"st10\" d=\"M2014.2,1047L1802,976l-262-84l-301,14l-133.2,60.2l-93.9,42.4c66.2,79,187,79.3,277.6,128.8\n\t\t\t\t\t\t\t\tc16.2,8.9,33.3,22.5,33.3,41c-0.1,29.9-41.8,41.3-53.8,68.7c-11.6,26.4,9.6,57,35.6,69.4c26,12.4,55.9,13.2,83.6,21.2\n\t\t\t\t\t\t\t\tc27.7,7.9,56.1,27.6,58.5,56.3c2.5,29.7-23.9,54-51,66.5c-27,12.5-57.6,18.9-80.5,37.9c-25.9,21.6-34.7,58.5-27,91.1l5.8,8.7\n\t\t\t\t\t\t\t\tl66.6-88.5l6.4-8.5l82,33L2014.2,1047z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<polygon class=\"st11\" points=\"1125.8,957.1 1239,904 1540,892 1944,1021 1861,1011 1573,964 1188,964 1066.6,983.9 \t\t\t\t\"/>\n\t\t\t\t\t\n\t\t\t\t\t\t<linearGradient id=\"SVGID_5_\" gradientUnits=\"userSpaceOnUse\" x1=\"1240\" y1=\"560.9138\" x2=\"1240\" y2=\"460.2458\" gradientTransform=\"matrix(1 0 0 -1 0 1933.901)\">\n\t\t\t\t\t\t\t<stop  offset=\"0\" style=\"stop-color:#295071\"/>\n\t\t\t\t\t\t\t<stop  offset=\"1\" style=\"stop-color:#41A0B5\"/>\n\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t<path class=\"st12\" d=\"M1334.1,1374.6c-7.9,0-15.8-0.1-23.6-0.2c-2.3,0-4.7-0.1-7-0.1h-62c-0.4,1.4-0.7,2.8-1.1,4.1\n\t\t\t\t\t\t\tc-0.5-1.4-1.1-2.8-1.6-4.1c0-0.1-0.1-0.2-0.1-0.3c-31.4-0.1-61.8-1.5-92.7-0.8c10.8,27,17.5,51.1,21.7,66.2\n\t\t\t\t\t\t\tc3,10.8,6.9,20.1,15.6,28.2c7.2,6.7,20.5,7,29.2,1.7c9-5.5,11.1-16.6,12.9-25.8c0.8-4.2,1.8-8.8,2.8-13.8\n\t\t\t\t\t\t\tc1.5-6.9,7.5-11.8,14.6-11.8h0c6.6,0,12.5,4.4,14.3,10.8c1.2,4.2,2.3,8,3.2,11.3c3,10.8,6.9,20.1,15.6,28.2\n\t\t\t\t\t\t\tc7.2,6.7,20.5,7,29.2,1.7c9-5.5,11.1-16.6,12.9-25.8C1321.2,1427.6,1326.2,1405,1334.1,1374.6z\"/>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<path class=\"st13\" d=\"M1515.3,1232.7l68.2,0c4.8,0,8.2,6.1,7,12.2c-3.7,17.6-8.6,37.2-15.2,58.1c-6.4,20.1-13.3,37.9-20.1,53.2\n\t\t\t\t\t\t\t\tc-2.8,6.4-9.7,6.4-12.5,0c-6.8-15.8-13.8-34.1-20.2-54.9c-6.2-20.3-10.8-39.4-14.1-56.6\n\t\t\t\t\t\t\t\tC1507.1,1238.6,1510.6,1232.7,1515.3,1232.7z\"/>\n\t\t\t\t\t\t\t<circle class=\"st14\" cx=\"1550.1\" cy=\"1288\" r=\"5\"/>\n\t\t\t\t\t\t\t<circle class=\"st14\" cx=\"1552.7\" cy=\"1265.4\" r=\"5\"/>\n\t\t\t\t\t\t\t<circle class=\"st14\" cx=\"1566.5\" cy=\"1275.4\" r=\"5\"/>\n\t\t\t\t\t\t\t<circle class=\"st14\" cx=\"1566.5\" cy=\"1251.5\" r=\"5\"/>\n\t\t\t\t\t\t\t<circle class=\"st14\" cx=\"1528.8\" cy=\"1269.1\" r=\"5\"/>\n\t\t\t\t\t\t\t<rect x=\"1538.8\" y=\"1166\" class=\"st15\" width=\"18.9\" height=\"66.7\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t<linearGradient id=\"SVGID_6_\" gradientUnits=\"userSpaceOnUse\" x1=\"1703.8744\" y1=\"970.9138\" x2=\"1703.8744\" y2=\"732.3593\" gradientTransform=\"matrix(1 0 0 -1 0 1933.901)\">\n\t\t\t\t\t\t\t\t<stop  offset=\"0\" style=\"stop-color:#295071\"/>\n\t\t\t\t\t\t\t\t<stop  offset=\"1\" style=\"stop-color:#41A0B5\"/>\n\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t<path class=\"st16\" d=\"M1487.9,963c-0.3,59.8-9,145.9,19.6,194.3c15.6,26.5,41.5,43.3,68.1,44.3s53.2-14.1,70-39.4\n\t\t\t\t\t\t\t\tc10.9-16.5,18.6-37.7,33.9-47.3c15.1-9.5,33.8-4.8,48.6,5.2s27.1,24.9,40.8,37.2c31.8,28.7,79,41.7,109.3,10.6\n\t\t\t\t\t\t\t\tc33.5-34.5,27.3-99.2,43.1-149.4\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<polygon class=\"st17 RCoralTriangle1\" points=\"1167,1449 1149,1397 1193,1413 \t\t\t\t\t\"/>\n\t\t\t\t\t\t\t<polygon class=\"st17 RCoralTriangle2\" points=\"1166,1403.2 1145,1364 1190,1364 \t\t\t\t\t\"/>\n\t\t\t\t\t\t\t<polygon class=\"st17 RCoralTriangle3\" points=\"1167.5,1364 1138,1315 1196,1318 \t\t\t\t\t\"/>\n\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t<line class=\"st18\" x1=\"1168\" y1=\"1427\" x2=\"1168\" y2=\"1302\"/>\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\n\t\t\t\t\t\t<use class=\"treesPinkR\" xlink:href=\"#RoundTree\"  width=\"103\" height=\"176.5\" x=\"-51.5\" y=\"-88.2\" transform=\"matrix(1 0 0 1 1066.5 1135.7372)\" style=\"overflow:visible;\"/>\n\t\t\t\t\t\n\t\t\t\t\t\t<use class=\"treesPinkR\" xlink:href=\"#RoundTree\"  width=\"103\" height=\"176.5\" x=\"-51.5\" y=\"-88.2\" transform=\"matrix(1 0 0 1 1809.5 1096.7372)\" style=\"overflow:visible;\"/>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<polygon class=\"st17  RCoralTriangle1\" points=\"1339,1666 1321,1614 1365,1630 \t\t\t\t\t\"/>\n\t\t\t\t\t\t\t<polygon class=\"st17  RCoralTriangle2\" points=\"1338,1620.2 1317,1581 1362,1581 \t\t\t\t\t\"/>\n\t\t\t\t\t\t\t<polygon class=\"st17 RCoralTriangle3\" points=\"1339.5,1581 1310,1532 1368,1535 \t\t\t\t\t\"/>\n\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t<line class=\"st18\" x1=\"1340\" y1=\"1644\" x2=\"1340\" y2=\"1468\"/>\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<line class=\"st19\" x1=\"1949\" y1=\"1149.7\" x2=\"1950.8\" y2=\"1095.6\"/>\n\t\t\t\t\t\t\t<line class=\"st19\" x1=\"1938.1\" y1=\"1140.6\" x2=\"1949\" y2=\"1149.7\"/>\n\t\t\t\t\t\t\t<line class=\"st19\" x1=\"1936.9\" y1=\"1125.9\" x2=\"1949.5\" y2=\"1134.3\"/>\n\t\t\t\t\t\t\t<line class=\"st19\" x1=\"1936\" y1=\"1112.1\" x2=\"1949.8\" y2=\"1119.8\"/>\n\t\t\t\t\t\t\t<line class=\"st19\" x1=\"1960.7\" y1=\"1140.6\" x2=\"1949.7\" y2=\"1149.7\"/>\n\t\t\t\t\t\t\t<line class=\"st19\" x1=\"1961.9\" y1=\"1125.9\" x2=\"1949.3\" y2=\"1134.3\"/>\n\t\t\t\t\t\t\t<line class=\"st19\" x1=\"1962.8\" y1=\"1112.1\" x2=\"1949\" y2=\"1119.8\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<polygon class=\"st17 RCoralTriangle1\" points=\"1646,1206 1628,1154 1672,1170 \t\t\t\t\t\"/>\n\t\t\t\t\t\t\t<polygon class=\"st17 RCoralTriangle2\" points=\"1645,1160.2 1624,1121 1669,1121 \t\t\t\t\t\"/>\n\t\t\t\t\t\t\t<polygon class=\"st17 RCoralTriangle3\" points=\"1646.5,1121 1617,1072 1675,1075 \t\t\t\t\t\"/>\n\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t<line class=\"st18\" x1=\"1647\" y1=\"1184\" x2=\"1647\" y2=\"1008\"/>\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\n\t\t\t\t\t\t<use class=\"treesPinkR\" xlink:href=\"#RoundTree\"  width=\"103\" height=\"176.5\" x=\"-51.5\" y=\"-88.2\" transform=\"matrix(1 0 0 1 1482.5 1376.7372)\" style=\"overflow:visible;\"/>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<line class=\"st19\" x1=\"1187\" y1=\"1508.7\" x2=\"1188.8\" y2=\"1454.6\"/>\n\t\t\t\t\t\t\t<polyline class=\"st19\" points=\"1176.1,1499.6 1187,1508.7 1198.1,1500.5 \t\t\t\t\t\"/>\n\t\t\t\t\t\t\t<polyline class=\"st19\" points=\"1174.9,1484.9 1187.5,1493.3 1201.8,1487.1 \t\t\t\t\t\"/>\n\t\t\t\t\t\t\t<polyline class=\"st19\" points=\"1174,1471.1 1188.8,1478.8 1202.5,1472.7 \t\t\t\t\t\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<rect x=\"1229.1\" y=\"1424\" class=\"st17\" width=\"10.4\" height=\"76.5\"/>\n\t\t\t\t\t\t\t<path class=\"st20\" d=\"M1272.8,1511.2c-1.3-0.6-2.7-1-4.1-1.3L1272.8,1511.2z\"/>\n\t\t\t\t\t\t\t<path class=\"st20\" d=\"M1283.6,1527.8c0-7.4-4.4-13.8-10.8-16.6h0l-4.1-1.3l-34.4-10.7l-36.4,10.6c-8.7,1.3-15.5,8.9-15.5,18\n\t\t\t\t\t\t\t\tc0,10,8.1,18.2,18.2,18.2c0.6,0,1.2,0,1.7-0.1c-0.3,1.3-0.4,2.6-0.4,4c0,10,8.1,18.2,18.2,18.2c5.4,0,10.3-2.4,13.6-6.2\n\t\t\t\t\t\t\t\tc3.3,3.8,8.2,6.2,13.6,6.2c10,0,18.2-8.1,18.2-18.2c0-1.3-0.1-2.6-0.4-3.9c0.1,0,0.3,0,0.4,0\n\t\t\t\t\t\t\t\tC1275.5,1545.9,1283.6,1537.8,1283.6,1527.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st21\" d=\"M1283.6,1527.8c0-7.4-4.4-13.8-10.8-16.6h0l-4.1-1.3l-34.4-10.7l-36.4,10.6c-8.7,1.3-15.5,8.9-15.5,18\n\t\t\t\t\t\t\t\tc0,10,8.1,18.2,18.2,18.2c0.6,0,1.2,0,1.7-0.1c-0.3,1.3-0.4,2.6-0.4,4c0,10,8.1,18.2,18.2,18.2c5.4,0,10.3-2.4,13.6-6.2\n\t\t\t\t\t\t\t\tc3.3,3.8,8.2,6.2,13.6,6.2c10,0,18.2-8.1,18.2-18.2c0-1.3-0.1-2.6-0.4-3.9c0.1,0,0.3,0,0.4,0\n\t\t\t\t\t\t\t\tC1275.5,1545.9,1283.6,1537.8,1283.6,1527.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st22\" d=\"M1266.4,1518.1c0-4.9-2.9-9.1-7.1-11h0l-2.7-0.8l-22.7-7.1l-24.1,7c-5.8,0.9-10.2,5.9-10.2,11.9\n\t\t\t\t\t\t\t\tc0,6.6,5.4,12,12,12c0.4,0,0.8,0,1.1-0.1c-0.2,0.8-0.3,1.7-0.3,2.6c0,6.6,5.4,12,12,12c3.6,0,6.8-1.6,9-4.1\n\t\t\t\t\t\t\t\tc2.2,2.5,5.4,4.1,9,4.1c6.6,0,12-5.4,12-12c0-0.9-0.1-1.7-0.3-2.6c0.1,0,0.2,0,0.3,0C1261,1530.1,1266.4,1524.7,1266.4,1518.1z\n\t\t\t\t\t\t\t\t\"/>\n\t\t\t\t\t\t\t<path class=\"st21\" d=\"M1222,1514.1h24.6c-0.5-1.8-1.5-4.8-3.9-7.8c-3.3-4.1-7.2-5.8-9.1-6.5c-2.1,1.3-5,3.4-7.8,6.5\n\t\t\t\t\t\t\t\tC1223.3,1509.2,1223,1512,1222,1514.1z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<path class=\"st13\" d=\"M1410.3,1537.7l68.2,0c4.8,0,8.2,6.1,7,12.2c-3.7,17.6-8.6,37.2-15.2,58.1c-6.4,20.1-13.3,37.9-20.1,53.2\n\t\t\t\t\t\t\t\tc-2.8,6.4-9.7,6.4-12.5,0c-6.8-15.8-13.8-34.1-20.2-54.9c-6.2-20.3-10.8-39.4-14.1-56.6\n\t\t\t\t\t\t\t\tC1402.1,1543.6,1405.6,1537.7,1410.3,1537.7z\"/>\n\t\t\t\t\t\t\t<circle class=\"st14\" cx=\"1445.1\" cy=\"1593\" r=\"5\"/>\n\t\t\t\t\t\t\t<circle class=\"st14\" cx=\"1447.7\" cy=\"1570.4\" r=\"5\"/>\n\t\t\t\t\t\t\t<circle class=\"st14\" cx=\"1461.5\" cy=\"1580.4\" r=\"5\"/>\n\t\t\t\t\t\t\t<circle class=\"st14\" cx=\"1461.5\" cy=\"1556.5\" r=\"5\"/>\n\t\t\t\t\t\t\t<circle class=\"st14\" cx=\"1423.8\" cy=\"1574.1\" r=\"5\"/>\n\t\t\t\t\t\t\t<path class=\"st15\" d=\"M1443.3,1471L1443.3,1471c-5.2,0-9.4,4.2-9.4,9.4v57.2h18.9v-57.2C1452.7,1475.2,1448.5,1471,1443.3,1471\n\t\t\t\t\t\t\t\tz\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<polygon class=\"st17 RCoralTriangle1\" points=\"1369,1374 1351,1322 1395,1338 \t\t\t\t\t\"/>\n\t\t\t\t\t\t\t<polygon class=\"st17 RCoralTriangle2\" points=\"1368,1328.2 1347,1289 1392,1289 \t\t\t\t\t\"/>\n\t\t\t\t\t\t\t<polygon class=\"st17 RCoralTriangle3\" points=\"1369.5,1289 1340,1240 1398,1243 \t\t\t\t\t\"/>\n\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t<line class=\"st18\" x1=\"1370\" y1=\"1352\" x2=\"1370\" y2=\"1176\"/>\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g class=\"treesOrangeR\">\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1553.2,1661.4c0-0.1-0.1-0.3-0.2-0.4\"/>\n\t\t\t\t\t\t\t<rect x=\"1550\" y=\"1419\" class=\"st24\" width=\"6\" height=\"55\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1554.8,1569.5c5.5,5.5,8.8,6.2,10.8,5.5c2.4-0.8,2.6-3.3,6.4-5c1.2-0.5,4.4-2,7.7-0.5\n\t\t\t\t\t\t\t\tc3.3,1.6,4.2,5.2,4.2,5.5c0.8,4.2-2.2,7.6-2.8,8.3c-2.9,3.2-7.4,4.1-11.2,5.5c-1.3,0.5-5.5,2.2-9.6,5.9\n\t\t\t\t\t\t\t\tc-2.5,2.2-4.7,4.3-4.9,7.2c-0.1,2.1,0.9,19,0,19.8c-0.6,0.5-1.6,0.3-2.4,0.1c0-12.4,0-39.8,0-52.1H1554.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1553,1574v-34c-0.1,1.2,0.1,2.1,1.3,2s2.3-0.9,3.4-1.6c3.7-2.3,8.6-3.6,12.2-1.3c1.2,0.8,1.2,1.3,2.8,2\n\t\t\t\t\t\t\t\tc0.5,0.2,2.8,1.3,5.3,0.8c2.7-0.5,2.6-2.3,6-4c1.4-0.7,4.3-2.2,7-1c2,0.9,2.9,2.8,3,3c1.9,4.3-2.5,9.4-3.2,10.2\n\t\t\t\t\t\t\t\tc-2.3,2.6-4.3,3.2-9.8,5.8c-3.4,1.6-10.1,4.7-15,8c-2.9,1.9-6.9,5.1-11,10.3L1553,1574z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1555.3,1498.5c5.5,5.6,8.8,6.1,10.8,5.5c2.5-0.8,2.9-3.3,6.9-5c1.4-0.6,4.3-1.8,7.2-0.5\n\t\t\t\t\t\t\t\tc3.3,1.5,4.1,5.2,4.2,5.5c0.8,4.2-2.2,7.6-2.8,8.3c-1.8,2-3.3,2.4-11.2,5.5c-4.2,1.6-7.7,2.4-10.3,5.2c-3.1,3.4-3.8,7.8-4,9\n\t\t\t\t\t\t\t\tc-0.6,4.5-0.1,7.8-0.1,7.8c0.3,2.1,0.9,4,0,4.8c-0.6,0.5-1.6,0.3-2.4,0.1c0-12.4,0-33.8,0-46.1H1555.3z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1575,1642C1575,1642,1575,1642,1575,1642c-0.4-1.6-1.5-3.2-3-4c-2.2-1.1-4.5-0.2-5,0\n\t\t\t\t\t\t\t\tc-2.9,1.2-3.1,3.6-5,4c-0.2,0-1.1,0.1-2-0.3c-1.6-0.8-1.5-2.5-3-3.7c-0.6-0.4-1.5-0.9-3-1l0,0c-2-0.1-3.2,0.5-4,1\n\t\t\t\t\t\t\t\tc-1.9,1.3-2,3.5-4,4c-0.8,0.2-1.5,0.1-1.7,0c-2.2-0.5-2.1-2.9-4.3-4c-0.3-0.1-3-1.4-5.7,0c-0.2,0.1-2.5,1.4-3,4\n\t\t\t\t\t\t\t\tc-0.6,3,1.6,5.5,2,6c1.7,1.9,2.9,1.6,8,4c3.9,1.8,6,3.3,7,4c3,2.2,4.2,3.9,4.7,5c0.1,0.1,0.1,0.3,0.2,0.4\n\t\t\t\t\t\t\t\tc0-0.1,0.1-0.3,0.2-0.4c0.5-1.2,1.6-2.8,4.7-5c1-0.7,3.1-2.2,7-4c5.1-2.4,6.3-2.1,8-4C1573.4,1647.5,1575.6,1645,1575,1642z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1553.3,1661c-0.1,0.1-0.1,0.3-0.2,0.4\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1551.5,1569.5c-5.5,5.5-8.8,6.1-10.8,5.5c-2.5-0.8-2.8-3.3-6.7-5c-1.3-0.6-4.3-1.9-7.4-0.5\n\t\t\t\t\t\t\t\tc-3.3,1.5-4.2,5.2-4.2,5.5c-0.8,4.2,2.2,7.6,2.8,8.3c2.9,3.2,7.4,4.1,11.2,5.5c1.3,0.5,5.5,2.2,9.6,5.9\n\t\t\t\t\t\t\t\tc2.5,2.2,4.7,4.3,4.9,7.2c0.1,2.1-0.9,19,0,19.8c0.6,0.5,1.6,0.3,2.4,0.1c0-12.4,0-39.8,0-52.1H1551.5z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1553.3,1574v-34c0.1,1.2-0.1,2.1-1.3,2s-2.3-0.9-3.4-1.6c-3.7-2.3-8.6-3.6-12.2-1.3\n\t\t\t\t\t\t\t\tc-1.2,0.8-1.2,1.3-2.8,2c-0.5,0.2-2.8,1.3-5.3,0.8c-2.7-0.5-2.6-2.3-6-4c-1.4-0.7-4.3-2.2-7-1c-2,0.9-2.9,2.8-3,3\n\t\t\t\t\t\t\t\tc-1.9,4.3,2.5,9.4,3.2,10.2c2.3,2.6,4.3,3.2,9.8,5.8c3.4,1.6,10.1,4.7,15,8c2.9,1.9,6.9,5.1,11,10.3L1553.3,1574z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1551,1498.5c-5.5,5.5-8.8,6.2-10.8,5.5c-2.4-0.8-2.5-3.3-6.2-5c-1-0.5-4.5-2.1-7.9-0.5\n\t\t\t\t\t\t\t\tc-3.3,1.6-4.1,5.2-4.2,5.5c-0.8,4.2,2.2,7.6,2.8,8.3c1.6,1.8,2.9,2.3,11.2,5.5c3.8,1.5,7.2,2.3,10,5.2c0.8,0.9,3,3.3,4,7\n\t\t\t\t\t\t\t\tc0.4,1.4,1.1,5.2,0.4,9.8c-0.3,2.1-0.9,4,0,4.8c0.6,0.5,1.6,0.3,2.4,0.1c0-12.4,0-33.8,0-46.1H1551z\"/>\n\t\t\t\t\t\t\t<rect x=\"1551\" y=\"1471\" class=\"st23\" width=\"4\" height=\"177\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1550.8,1611.5c-0.7,0.9-1.9,2.3-3.9,3.3c-1.5,0.8-3.3,1.7-5.1,1.3c-2.9-0.7-2.4-3.9-5.7-5.1\n\t\t\t\t\t\t\t\tc-3-1.1-5.9,0.4-6,0.5c-0.4,0.2-2.9,1.7-3.5,4.6c-0.7,3.5,1.8,6.4,2.4,6.9c2.4,2.7,6.2,3.4,9.4,4.6c1.1,0.4,4.6,1.8,8,4.9\n\t\t\t\t\t\t\t\tc2.1,1.9,4,3.6,4.1,6c0.1,1.8-0.8,3.3,0,4c0.5,0.4,1.3,0.3,2,0.1c0-10.4,0-20.7,0-31.1H1550.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1555.5,1611.5c0.8,1,2.2,2.4,4.5,3.5c1.6,0.7,3,1.4,4.6,1.1c2.4-0.5,2.4-2.7,5.4-4.1\n\t\t\t\t\t\t\t\tc1.1-0.5,3.7-1.7,6.3-0.5c2.8,1.3,3.5,4.4,3.5,4.6c0.7,3.5-1.8,6.4-2.4,6.9c-2.4,2.7-6.2,3.4-9.4,4.6c-1.1,0.4-4.6,1.8-8,4.9\n\t\t\t\t\t\t\t\tc-2.1,1.9-4,3.6-4.1,6c-0.1,1.8,0.8,3.3,0,4c-0.5,0.4-1.3,0.3-2,0.1c0-10.4,0-20.7,0-31.1H1555.5z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1550.8,1471.5c-0.7,0.9-1.9,2.3-3.9,3.3c-1.5,0.8-3.3,1.7-5.1,1.3c-2.9-0.7-2.4-3.9-5.7-5.1\n\t\t\t\t\t\t\t\tc-3-1.1-5.9,0.4-6,0.5c-0.4,0.2-2.9,1.7-3.5,4.6c-0.7,3.5,1.8,6.4,2.4,6.9c2.4,2.7,6.2,3.4,9.4,4.6c1.1,0.4,4.6,1.8,8,4.9\n\t\t\t\t\t\t\t\tc2.1,1.9,4,3.6,4.1,6c0.1,1.8-0.8,3.3,0,4c0.5,0.4,1.3,0.3,2,0.1c0-10.4,0-20.7,0-31.1H1550.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1555.5,1471.5c0.8,1,2.2,2.4,4.5,3.5c1.6,0.7,3,1.4,4.6,1.1c2.4-0.5,2.4-2.7,5.4-4.1\n\t\t\t\t\t\t\t\tc1.1-0.5,3.7-1.7,6.3-0.5c2.8,1.3,3.5,4.4,3.5,4.6c0.7,3.5-1.8,6.4-2.4,6.9c-2.4,2.7-6.2,3.4-9.4,4.6c-1.1,0.4-4.6,1.8-8,4.9\n\t\t\t\t\t\t\t\tc-2.1,1.9-4,3.6-4.1,6c-0.1,1.8,0.8,3.3,0,4c-0.5,0.4-1.3,0.3-2,0.1c0-10.4,0-20.7,0-31.1H1555.5z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g class=\"treesOrangeR\">\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1044.2,1521.4c0-0.1-0.1-0.3-0.2-0.4\"/>\n\t\t\t\t\t\t\t<rect x=\"1041\" y=\"1279\" class=\"st24\" width=\"6\" height=\"55\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1045.8,1429.5c5.5,5.5,8.8,6.2,10.8,5.5c2.4-0.8,2.6-3.3,6.4-5c1.2-0.5,4.4-2,7.7-0.5\n\t\t\t\t\t\t\t\tc3.3,1.6,4.2,5.2,4.2,5.5c0.8,4.2-2.2,7.6-2.8,8.3c-2.9,3.2-7.4,4.1-11.2,5.5c-1.3,0.5-5.5,2.2-9.6,5.9\n\t\t\t\t\t\t\t\tc-2.5,2.2-4.7,4.3-4.9,7.2c-0.1,2.1,0.9,19,0,19.8c-0.6,0.5-1.6,0.3-2.4,0.1c0-12.4,0-39.8,0-52.1H1045.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1044,1434v-34c-0.1,1.2,0.1,2.1,1.3,2s2.3-0.9,3.4-1.6c3.7-2.3,8.6-3.6,12.2-1.3c1.2,0.8,1.2,1.3,2.8,2\n\t\t\t\t\t\t\t\tc0.5,0.2,2.8,1.3,5.3,0.8c2.7-0.5,2.6-2.3,6-4c1.4-0.7,4.3-2.2,7-1c2,0.9,2.9,2.8,3,3c1.9,4.3-2.5,9.4-3.2,10.2\n\t\t\t\t\t\t\t\tc-2.3,2.6-4.3,3.2-9.8,5.8c-3.4,1.6-10.1,4.7-15,8c-2.9,1.9-6.9,5.1-11,10.3L1044,1434z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1046.3,1358.5c5.5,5.6,8.8,6.1,10.8,5.5c2.5-0.8,2.9-3.3,6.9-5c1.4-0.6,4.3-1.8,7.2-0.5\n\t\t\t\t\t\t\t\tc3.3,1.5,4.1,5.2,4.2,5.5c0.8,4.2-2.2,7.6-2.8,8.3c-1.8,2-3.3,2.4-11.2,5.5c-4.2,1.6-7.7,2.4-10.3,5.2c-3.1,3.4-3.8,7.8-4,9\n\t\t\t\t\t\t\t\tc-0.6,4.5-0.1,7.8-0.1,7.8c0.3,2.1,0.9,4,0,4.8c-0.6,0.5-1.6,0.3-2.4,0.1c0-12.4,0-33.8,0-46.1H1046.3z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1066,1502C1066,1502,1066,1502,1066,1502c-0.4-1.6-1.5-3.2-3-4c-2.2-1.1-4.5-0.2-5,0\n\t\t\t\t\t\t\t\tc-2.9,1.2-3.1,3.6-5,4c-0.2,0-1.1,0.1-2-0.3c-1.6-0.8-1.5-2.5-3-3.7c-0.6-0.4-1.5-0.9-3-1l0,0c-2-0.1-3.2,0.5-4,1\n\t\t\t\t\t\t\t\tc-1.9,1.3-2,3.5-4,4c-0.8,0.2-1.5,0.1-1.7,0c-2.2-0.5-2.1-2.9-4.3-4c-0.3-0.1-3-1.4-5.7,0c-0.2,0.1-2.5,1.4-3,4\n\t\t\t\t\t\t\t\tc-0.6,3,1.6,5.5,2,6c1.7,1.9,2.9,1.6,8,4c3.9,1.8,6,3.3,7,4c3,2.2,4.2,3.9,4.7,5c0.1,0.1,0.1,0.3,0.2,0.4\n\t\t\t\t\t\t\t\tc0-0.1,0.1-0.3,0.2-0.4c0.5-1.2,1.6-2.8,4.7-5c1-0.7,3.1-2.2,7-4c5.1-2.4,6.3-2.1,8-4C1064.4,1507.5,1066.6,1505,1066,1502z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1044.3,1521c-0.1,0.1-0.1,0.3-0.2,0.4\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1042.5,1429.5c-5.5,5.5-8.8,6.1-10.8,5.5c-2.5-0.8-2.8-3.3-6.7-5c-1.3-0.6-4.3-1.9-7.4-0.5\n\t\t\t\t\t\t\t\tc-3.3,1.5-4.2,5.2-4.2,5.5c-0.8,4.2,2.2,7.6,2.8,8.3c2.9,3.2,7.4,4.1,11.2,5.5c1.3,0.5,5.5,2.2,9.6,5.9\n\t\t\t\t\t\t\t\tc2.5,2.2,4.7,4.3,4.9,7.2c0.1,2.1-0.9,19,0,19.8c0.6,0.5,1.6,0.3,2.4,0.1c0-12.4,0-39.8,0-52.1H1042.5z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1044.3,1434v-34c0.1,1.2-0.1,2.1-1.3,2s-2.3-0.9-3.4-1.6c-3.7-2.3-8.6-3.6-12.2-1.3\n\t\t\t\t\t\t\t\tc-1.2,0.8-1.2,1.3-2.8,2c-0.5,0.2-2.8,1.3-5.3,0.8c-2.7-0.5-2.6-2.3-6-4c-1.4-0.7-4.3-2.2-7-1c-2,0.9-2.9,2.8-3,3\n\t\t\t\t\t\t\t\tc-1.9,4.3,2.5,9.4,3.2,10.2c2.3,2.6,4.3,3.2,9.8,5.8c3.4,1.6,10.1,4.7,15,8c2.9,1.9,6.9,5.1,11,10.3L1044.3,1434z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1042,1358.5c-5.5,5.5-8.8,6.2-10.8,5.5c-2.4-0.8-2.5-3.3-6.2-5c-1-0.5-4.5-2.1-7.9-0.5\n\t\t\t\t\t\t\t\tc-3.3,1.6-4.1,5.2-4.2,5.5c-0.8,4.2,2.2,7.6,2.8,8.3c1.6,1.8,2.9,2.3,11.2,5.5c3.8,1.5,7.2,2.3,10,5.2c0.8,0.9,3,3.3,4,7\n\t\t\t\t\t\t\t\tc0.4,1.4,1.1,5.2,0.4,9.8c-0.3,2.1-0.9,4,0,4.8c0.6,0.5,1.6,0.3,2.4,0.1c0-12.4,0-33.8,0-46.1H1042z\"/>\n\t\t\t\t\t\t\t<rect x=\"1042\" y=\"1331\" class=\"st23\" width=\"4\" height=\"177\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1041.8,1471.5c-0.7,0.9-1.9,2.3-3.9,3.3c-1.5,0.8-3.3,1.7-5.1,1.3c-2.9-0.7-2.4-3.9-5.7-5.1\n\t\t\t\t\t\t\t\tc-3-1.1-5.9,0.4-6,0.5c-0.4,0.2-2.9,1.7-3.5,4.6c-0.7,3.5,1.8,6.4,2.4,6.9c2.4,2.7,6.2,3.4,9.4,4.6c1.1,0.4,4.6,1.8,8,4.9\n\t\t\t\t\t\t\t\tc2.1,1.9,4,3.6,4.1,6c0.1,1.8-0.8,3.3,0,4c0.5,0.4,1.3,0.3,2,0.1c0-10.4,0-20.7,0-31.1H1041.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1046.5,1471.5c0.8,1,2.2,2.4,4.5,3.5c1.6,0.7,3,1.4,4.6,1.1c2.4-0.5,2.4-2.7,5.4-4.1\n\t\t\t\t\t\t\t\tc1.1-0.5,3.7-1.7,6.3-0.5c2.8,1.3,3.5,4.4,3.5,4.6c0.7,3.5-1.8,6.4-2.4,6.9c-2.4,2.7-6.2,3.4-9.4,4.6c-1.1,0.4-4.6,1.8-8,4.9\n\t\t\t\t\t\t\t\tc-2.1,1.9-4,3.6-4.1,6c-0.1,1.8,0.8,3.3,0,4c-0.5,0.4-1.3,0.3-2,0.1c0-10.4,0-20.7,0-31.1H1046.5z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1041.8,1331.5c-0.7,0.9-1.9,2.3-3.9,3.3c-1.5,0.8-3.3,1.7-5.1,1.3c-2.9-0.7-2.4-3.9-5.7-5.1\n\t\t\t\t\t\t\t\tc-3-1.1-5.9,0.4-6,0.5c-0.4,0.2-2.9,1.7-3.5,4.6c-0.7,3.5,1.8,6.4,2.4,6.9c2.4,2.7,6.2,3.4,9.4,4.6c1.1,0.4,4.6,1.8,8,4.9\n\t\t\t\t\t\t\t\tc2.1,1.9,4,3.6,4.1,6c0.1,1.8-0.8,3.3,0,4c0.5,0.4,1.3,0.3,2,0.1c0-10.4,0-20.7,0-31.1H1041.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1046.5,1331.5c0.8,1,2.2,2.4,4.5,3.5c1.6,0.7,3,1.4,4.6,1.1c2.4-0.5,2.4-2.7,5.4-4.1\n\t\t\t\t\t\t\t\tc1.1-0.5,3.7-1.7,6.3-0.5c2.8,1.3,3.5,4.4,3.5,4.6c0.7,3.5-1.8,6.4-2.4,6.9c-2.4,2.7-6.2,3.4-9.4,4.6c-1.1,0.4-4.6,1.8-8,4.9\n\t\t\t\t\t\t\t\tc-2.1,1.9-4,3.6-4.1,6c-0.1,1.8,0.8,3.3,0,4c-0.5,0.4-1.3,0.3-2,0.1c0-10.4,0-20.7,0-31.1H1046.5z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g class=\"treesOrangeR\">\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1234.2,1250.4c0-0.1-0.1-0.3-0.2-0.4\"/>\n\t\t\t\t\t\t\t<rect x=\"1231\" y=\"1008\" class=\"st24\" width=\"6\" height=\"55\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1235.8,1158.5c5.5,5.5,8.8,6.2,10.8,5.5c2.4-0.8,2.6-3.3,6.4-5c1.2-0.5,4.4-2,7.7-0.5\n\t\t\t\t\t\t\t\tc3.3,1.6,4.2,5.2,4.2,5.5c0.8,4.2-2.2,7.6-2.8,8.3c-2.9,3.2-7.4,4.1-11.2,5.5c-1.3,0.5-5.5,2.2-9.6,5.9\n\t\t\t\t\t\t\t\tc-2.5,2.2-4.7,4.3-4.9,7.2c-0.1,2.1,0.9,19,0,19.8c-0.6,0.5-1.6,0.3-2.4,0.1c0-12.4,0-39.8,0-52.1H1235.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1234,1163v-34c-0.1,1.2,0.1,2.1,1.3,2s2.3-0.9,3.4-1.6c3.7-2.3,8.6-3.6,12.2-1.3c1.2,0.8,1.2,1.3,2.8,2\n\t\t\t\t\t\t\t\tc0.5,0.2,2.8,1.3,5.3,0.8c2.7-0.5,2.6-2.3,6-4c1.4-0.7,4.3-2.2,7-1c2,0.9,2.9,2.8,3,3c1.9,4.3-2.5,9.4-3.2,10.2\n\t\t\t\t\t\t\t\tc-2.3,2.6-4.3,3.2-9.8,5.8c-3.4,1.6-10.1,4.7-15,8c-2.9,1.9-6.9,5.1-11,10.3L1234,1163z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1236.3,1087.5c5.5,5.6,8.8,6.1,10.8,5.5c2.5-0.8,2.9-3.3,6.9-5c1.4-0.6,4.3-1.8,7.2-0.5\n\t\t\t\t\t\t\t\tc3.3,1.5,4.1,5.2,4.2,5.5c0.8,4.2-2.2,7.6-2.8,8.3c-1.8,2-3.3,2.4-11.2,5.5c-4.2,1.6-7.7,2.4-10.3,5.2c-3.1,3.4-3.8,7.8-4,9\n\t\t\t\t\t\t\t\tc-0.6,4.5-0.1,7.8-0.1,7.8c0.3,2.1,0.9,4,0,4.8c-0.6,0.5-1.6,0.3-2.4,0.1c0-12.4,0-33.8,0-46.1H1236.3z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1256,1231C1256,1231,1256,1231,1256,1231c-0.4-1.6-1.5-3.2-3-4c-2.2-1.1-4.5-0.2-5,0\n\t\t\t\t\t\t\t\tc-2.9,1.2-3.1,3.6-5,4c-0.2,0-1.1,0.1-2-0.3c-1.6-0.8-1.5-2.5-3-3.7c-0.6-0.4-1.5-0.9-3-1l0,0c-2-0.1-3.2,0.5-4,1\n\t\t\t\t\t\t\t\tc-1.9,1.3-2,3.5-4,4c-0.8,0.2-1.5,0.1-1.7,0c-2.2-0.5-2.1-2.9-4.3-4c-0.3-0.1-3-1.4-5.7,0c-0.2,0.1-2.5,1.4-3,4\n\t\t\t\t\t\t\t\tc-0.6,3,1.6,5.5,2,6c1.7,1.9,2.9,1.6,8,4c3.9,1.8,6,3.3,7,4c3,2.2,4.2,3.9,4.7,5c0.1,0.1,0.1,0.3,0.2,0.4\n\t\t\t\t\t\t\t\tc0-0.1,0.1-0.3,0.2-0.4c0.5-1.2,1.6-2.8,4.7-5c1-0.7,3.1-2.2,7-4c5.1-2.4,6.3-2.1,8-4C1254.4,1236.5,1256.6,1234,1256,1231z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1234.3,1250c-0.1,0.1-0.1,0.3-0.2,0.4\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1232.5,1158.5c-5.5,5.5-8.8,6.1-10.8,5.5c-2.5-0.8-2.8-3.3-6.7-5c-1.3-0.6-4.3-1.9-7.4-0.5\n\t\t\t\t\t\t\t\tc-3.3,1.5-4.2,5.2-4.2,5.5c-0.8,4.2,2.2,7.6,2.8,8.3c2.9,3.2,7.4,4.1,11.2,5.5c1.3,0.5,5.5,2.2,9.6,5.9\n\t\t\t\t\t\t\t\tc2.5,2.2,4.7,4.3,4.9,7.2c0.1,2.1-0.9,19,0,19.8c0.6,0.5,1.6,0.3,2.4,0.1c0-12.4,0-39.8,0-52.1H1232.5z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1234.3,1163v-34c0.1,1.2-0.1,2.1-1.3,2s-2.3-0.9-3.4-1.6c-3.7-2.3-8.6-3.6-12.2-1.3\n\t\t\t\t\t\t\t\tc-1.2,0.8-1.2,1.3-2.8,2c-0.5,0.2-2.8,1.3-5.3,0.8c-2.7-0.5-2.6-2.3-6-4c-1.4-0.7-4.3-2.2-7-1c-2,0.9-2.9,2.8-3,3\n\t\t\t\t\t\t\t\tc-1.9,4.3,2.5,9.4,3.2,10.2c2.3,2.6,4.3,3.2,9.8,5.8c3.4,1.6,10.1,4.7,15,8c2.9,1.9,6.9,5.1,11,10.3L1234.3,1163z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1232,1087.5c-5.5,5.5-8.8,6.2-10.8,5.5c-2.4-0.8-2.5-3.3-6.2-5c-1-0.5-4.5-2.1-7.9-0.5\n\t\t\t\t\t\t\t\tc-3.3,1.6-4.1,5.2-4.2,5.5c-0.8,4.2,2.2,7.6,2.8,8.3c1.6,1.8,2.9,2.3,11.2,5.5c3.8,1.5,7.2,2.3,10,5.2c0.8,0.9,3,3.3,4,7\n\t\t\t\t\t\t\t\tc0.4,1.4,1.1,5.2,0.4,9.8c-0.3,2.1-0.9,4,0,4.8c0.6,0.5,1.6,0.3,2.4,0.1c0-12.4,0-33.8,0-46.1H1232z\"/>\n\t\t\t\t\t\t\t<rect x=\"1232\" y=\"1060\" class=\"st23\" width=\"4\" height=\"177\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1231.8,1200.5c-0.7,0.9-1.9,2.3-3.9,3.3c-1.5,0.8-3.3,1.7-5.1,1.3c-2.9-0.7-2.4-3.9-5.7-5.1\n\t\t\t\t\t\t\t\tc-3-1.1-5.9,0.4-6,0.5c-0.4,0.2-2.9,1.7-3.5,4.6c-0.7,3.5,1.8,6.4,2.4,6.9c2.4,2.7,6.2,3.4,9.4,4.6c1.1,0.4,4.6,1.8,8,4.9\n\t\t\t\t\t\t\t\tc2.1,1.9,4,3.6,4.1,6c0.1,1.8-0.8,3.3,0,4c0.5,0.4,1.3,0.3,2,0.1c0-10.4,0-20.7,0-31.1H1231.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1236.5,1200.5c0.8,1,2.2,2.4,4.5,3.5c1.6,0.7,3,1.4,4.6,1.1c2.4-0.5,2.4-2.7,5.4-4.1\n\t\t\t\t\t\t\t\tc1.1-0.5,3.7-1.7,6.3-0.5c2.8,1.3,3.5,4.4,3.5,4.6c0.7,3.5-1.8,6.4-2.4,6.9c-2.4,2.7-6.2,3.4-9.4,4.6c-1.1,0.4-4.6,1.8-8,4.9\n\t\t\t\t\t\t\t\tc-2.1,1.9-4,3.6-4.1,6c-0.1,1.8,0.8,3.3,0,4c-0.5,0.4-1.3,0.3-2,0.1c0-10.4,0-20.7,0-31.1H1236.5z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1231.8,1060.5c-0.7,0.9-1.9,2.3-3.9,3.3c-1.5,0.8-3.3,1.7-5.1,1.3c-2.9-0.7-2.4-3.9-5.7-5.1\n\t\t\t\t\t\t\t\tc-3-1.1-5.9,0.4-6,0.5c-0.4,0.2-2.9,1.7-3.5,4.6c-0.7,3.5,1.8,6.4,2.4,6.9c2.4,2.7,6.2,3.4,9.4,4.6c1.1,0.4,4.6,1.8,8,4.9\n\t\t\t\t\t\t\t\tc2.1,1.9,4,3.6,4.1,6c0.1,1.8-0.8,3.3,0,4c0.5,0.4,1.3,0.3,2,0.1c0-10.4,0-20.7,0-31.1H1231.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1236.5,1060.5c0.8,1,2.2,2.4,4.5,3.5c1.6,0.7,3,1.4,4.6,1.1c2.4-0.5,2.4-2.7,5.4-4.1\n\t\t\t\t\t\t\t\tc1.1-0.5,3.7-1.7,6.3-0.5c2.8,1.3,3.5,4.4,3.5,4.6c0.7,3.5-1.8,6.4-2.4,6.9c-2.4,2.7-6.2,3.4-9.4,4.6c-1.1,0.4-4.6,1.8-8,4.9\n\t\t\t\t\t\t\t\tc-2.1,1.9-4,3.6-4.1,6c-0.1,1.8,0.8,3.3,0,4c-0.5,0.4-1.3,0.3-2,0.1c0-10.4,0-20.7,0-31.1H1236.5z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<line class=\"st19\" x1=\"1920\" y1=\"1451.7\" x2=\"1921.8\" y2=\"1397.6\"/>\n\t\t\t\t\t\t\t<polyline class=\"st19\" points=\"1909.1,1442.6 1920,1451.7 1931.1,1443.5 \t\t\t\t\t\"/>\n\t\t\t\t\t\t\t<polyline class=\"st19\" points=\"1907.9,1427.9 1920.5,1436.3 1934.8,1430.1 \t\t\t\t\t\"/>\n\t\t\t\t\t\t\t<polyline class=\"st19\" points=\"1907,1414.1 1921.8,1421.8 1935.5,1415.7 \t\t\t\t\t\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<rect x=\"1470.1\" y=\"998\" class=\"st25\" width=\"10.4\" height=\"76.5\"/>\n\t\t\t\t\t\t\t<path class=\"st20\" d=\"M1513.8,1085.2c-1.3-0.6-2.7-1-4.1-1.3L1513.8,1085.2z\"/>\n\t\t\t\t\t\t\t<path class=\"st20\" d=\"M1524.6,1101.8c0-7.4-4.4-13.8-10.8-16.6h0l-4.1-1.3l-34.4-10.7l-36.4,10.6c-8.7,1.3-15.5,8.9-15.5,18\n\t\t\t\t\t\t\t\tc0,10,8.1,18.2,18.2,18.2c0.6,0,1.2,0,1.7-0.1c-0.3,1.3-0.4,2.6-0.4,4c0,10,8.1,18.2,18.2,18.2c5.4,0,10.3-2.4,13.6-6.2\n\t\t\t\t\t\t\t\tc3.3,3.8,8.2,6.2,13.6,6.2c10,0,18.2-8.1,18.2-18.2c0-1.3-0.1-2.6-0.4-3.9c0.1,0,0.3,0,0.4,0\n\t\t\t\t\t\t\t\tC1516.5,1119.9,1524.6,1111.8,1524.6,1101.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st26\" d=\"M1524.6,1101.8c0-7.4-4.4-13.8-10.8-16.6h0l-4.1-1.3l-34.4-10.7l-36.4,10.6c-8.7,1.3-15.5,8.9-15.5,18\n\t\t\t\t\t\t\t\tc0,10,8.1,18.2,18.2,18.2c0.6,0,1.2,0,1.7-0.1c-0.3,1.3-0.4,2.6-0.4,4c0,10,8.1,18.2,18.2,18.2c5.4,0,10.3-2.4,13.6-6.2\n\t\t\t\t\t\t\t\tc3.3,3.8,8.2,6.2,13.6,6.2c10,0,18.2-8.1,18.2-18.2c0-1.3-0.1-2.6-0.4-3.9c0.1,0,0.3,0,0.4,0\n\t\t\t\t\t\t\t\tC1516.5,1119.9,1524.6,1111.8,1524.6,1101.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st22\" d=\"M1507.4,1092.1c0-4.9-2.9-9.1-7.1-11h0l-2.7-0.8l-22.7-7.1l-24.1,7c-5.8,0.9-10.2,5.9-10.2,11.9\n\t\t\t\t\t\t\t\tc0,6.6,5.4,12,12,12c0.4,0,0.8,0,1.1-0.1c-0.2,0.8-0.3,1.7-0.3,2.6c0,6.6,5.4,12,12,12c3.6,0,6.8-1.6,9-4.1\n\t\t\t\t\t\t\t\tc2.2,2.5,5.4,4.1,9,4.1c6.6,0,12-5.4,12-12c0-0.9-0.1-1.7-0.3-2.6c0.1,0,0.2,0,0.3,0C1502,1104.1,1507.4,1098.7,1507.4,1092.1z\n\t\t\t\t\t\t\t\t\"/>\n\t\t\t\t\t\t\t<path class=\"st26\" d=\"M1463,1088.1h24.6c-0.5-1.8-1.5-4.8-3.9-7.8c-3.3-4.1-7.2-5.8-9.1-6.5c-2.1,1.3-5,3.4-7.8,6.5\n\t\t\t\t\t\t\t\tC1464.3,1083.2,1464,1086,1463,1088.1z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<rect x=\"1691.1\" y=\"1227\" class=\"st17\" width=\"10.4\" height=\"76.5\"/>\n\t\t\t\t\t\t\t<path class=\"st20\" d=\"M1734.8,1314.2c-1.3-0.6-2.7-1-4.1-1.3L1734.8,1314.2z\"/>\n\t\t\t\t\t\t\t<path class=\"st20\" d=\"M1745.6,1330.8c0-7.4-4.4-13.8-10.8-16.6h0l-4.1-1.3l-34.4-10.7l-36.4,10.6c-8.7,1.3-15.5,8.9-15.5,18\n\t\t\t\t\t\t\t\tc0,10,8.1,18.2,18.2,18.2c0.6,0,1.2,0,1.7-0.1c-0.3,1.3-0.4,2.6-0.4,4c0,10,8.1,18.2,18.2,18.2c5.4,0,10.3-2.4,13.6-6.2\n\t\t\t\t\t\t\t\tc3.3,3.8,8.2,6.2,13.6,6.2c10,0,18.2-8.1,18.2-18.2c0-1.3-0.1-2.6-0.4-3.9c0.1,0,0.3,0,0.4,0\n\t\t\t\t\t\t\t\tC1737.5,1348.9,1745.6,1340.8,1745.6,1330.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st21\" d=\"M1745.6,1330.8c0-7.4-4.4-13.8-10.8-16.6h0l-4.1-1.3l-34.4-10.7l-36.4,10.6c-8.7,1.3-15.5,8.9-15.5,18\n\t\t\t\t\t\t\t\tc0,10,8.1,18.2,18.2,18.2c0.6,0,1.2,0,1.7-0.1c-0.3,1.3-0.4,2.6-0.4,4c0,10,8.1,18.2,18.2,18.2c5.4,0,10.3-2.4,13.6-6.2\n\t\t\t\t\t\t\t\tc3.3,3.8,8.2,6.2,13.6,6.2c10,0,18.2-8.1,18.2-18.2c0-1.3-0.1-2.6-0.4-3.9c0.1,0,0.3,0,0.4,0\n\t\t\t\t\t\t\t\tC1737.5,1348.9,1745.6,1340.8,1745.6,1330.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st22\" d=\"M1728.4,1321.1c0-4.9-2.9-9.1-7.1-11h0l-2.7-0.8l-22.7-7.1l-24.1,7c-5.8,0.9-10.2,5.9-10.2,11.9\n\t\t\t\t\t\t\t\tc0,6.6,5.4,12,12,12c0.4,0,0.8,0,1.1-0.1c-0.2,0.8-0.3,1.7-0.3,2.6c0,6.6,5.4,12,12,12c3.6,0,6.8-1.6,9-4.1\n\t\t\t\t\t\t\t\tc2.2,2.5,5.4,4.1,9,4.1c6.6,0,12-5.4,12-12c0-0.9-0.1-1.7-0.3-2.6c0.1,0,0.2,0,0.3,0C1723,1333.1,1728.4,1327.7,1728.4,1321.1z\n\t\t\t\t\t\t\t\t\"/>\n\t\t\t\t\t\t\t<path class=\"st21\" d=\"M1684,1317.1h24.6c-0.5-1.8-1.5-4.8-3.9-7.8c-3.3-4.1-7.2-5.8-9.1-6.5c-2.1,1.3-5,3.4-7.8,6.5\n\t\t\t\t\t\t\t\tC1685.3,1312.2,1685,1315,1684,1317.1z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<path class=\"st27\" d=\"M1136.5,993.1c-4.4,38.6-5,104.6-2,143.4c0.6,7.8,11.3,9.3,14.1,2c12.4-33.5,24.9-67,37.3-100.5\n\t\t\t\t\t\t\t\tc2.3-6.1,10.8-6.4,13.5-0.4c0.7,1.7,1.6,3.3,2.9,4.4c7,6.7,17.6-4.1,19.3-13.7c0.6-3.4,1.2-7.2,2.1-10.8\n\t\t\t\t\t\t\t\tc1.9-7.2,12.1-7.3,14.1-0.1l7.7,28.8c1.9,7,11.7,7.2,13.9,0.4l7.7-23.7c2.5-7.6,13.5-6.2,14.2,1.7l4.9,63.4\n\t\t\t\t\t\t\t\tc0.6,8,11.9,9.2,14.2,1.6c8.5-28,18.1-55.7,30.7-81.9c3-6.2,12.1-5.2,13.6,1.6l3.6,16.1c1.6,7,11.1,7.7,13.8,1.1\n\t\t\t\t\t\t\t\tc2.7-6.7,5.8-13.2,9.3-19.5c3.3-6,12.3-4.6,13.5,2.2c3.1,17.9,5.4,36,6.9,54.1c0.6,7.9,11.5,9.3,14.1,1.8\n\t\t\t\t\t\t\t\tc5.3-15.3,11.6-30.3,19-44.7c3.4-6.7,13.5-4.4,13.7,3.1l1.5,44.3c0.3,8,11.4,9.7,14.1,2.2l17.9-50.8c2.6-7.3,13.2-6,14.1,1.6\n\t\t\t\t\t\t\t\tc1.1,9.4,1.7,18.8,1.9,28.2c0.2,7.6,10.5,9.9,13.8,3.1c1.7-3.4,3.4-6.8,5.3-10.1c3.3-5.9,12.2-4.6,13.5,2.1\n\t\t\t\t\t\t\t\tc2.2,11.4,3.7,23,4.2,34.7c0.4,8.3,12.2,9.5,14.3,1.5c4-15.4,7.2-31,9.6-46.8c0-0.1,0-0.3,0.1-0.4l3.2-33.1\n\t\t\t\t\t\t\t\tc0.4-4.2-2.8-7.8-7-8l-213.6-6.6c-0.4,0-0.9,0-1.3,0.1l-186.4,1.2c-1,0-2.1,0.2-3,0.6C1138.4,988.4,1136.8,990.5,1136.5,993.1z\n\t\t\t\t\t\t\t\t\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g class=\"treesOrangeR\">\n\t\t\t\t\t\t\t<path class=\"st28\" d=\"M1630.8,1225.1c-2.1-7.3,3.8-14.3,11.4-13.6c55.4,5.5,110.7,11,166.1,16.5c3.1,0.3,5.6,2.6,6.1,5.7\n\t\t\t\t\t\t\t\tc5.9,36,8.3,72.6,7.2,109.1c-0.2,7.3-10.2,9.3-13.1,2.5c-13.2-30.9-26.4-61.7-39.6-92.6c-2.4-5.6-10.5-5.5-12.7,0.3\n\t\t\t\t\t\t\t\tc-0.6,1.6-1.4,3.1-2.5,4.3c-6.3,6.6-16.7-3.1-18.8-11.9c-0.7-3.2-1.5-6.8-2.5-10.1c-2.1-6.7-11.7-6.2-13.2,0.7l-5.9,27.4\n\t\t\t\t\t\t\t\tc-1.4,6.6-10.6,7.3-13.1,1l-8.3-21.9c-2.7-7-13-5.2-13.2,2.2l-1.7,59.7c-0.2,7.5-10.7,9.2-13.2,2.1\n\t\t\t\t\t\t\t\tc-5.6-15.6-18.5-38.2-29-68.7c-0.5-1.4-2.1-6-3.9-12.4C1630.9,1225.2,1630.8,1225.1,1630.8,1225.1z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1816.2,1437.4c0-0.1-0.1-0.3-0.2-0.4\"/>\n\t\t\t\t\t\t\t<rect x=\"1813\" y=\"1195\" class=\"st24\" width=\"6\" height=\"55\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1817.8,1345.5c5.5,5.5,8.8,6.2,10.8,5.5c2.4-0.8,2.6-3.3,6.4-5c1.2-0.5,4.4-2,7.7-0.5\n\t\t\t\t\t\t\t\tc3.3,1.6,4.2,5.2,4.2,5.5c0.8,4.2-2.2,7.6-2.8,8.3c-2.9,3.2-7.4,4.1-11.2,5.5c-1.3,0.5-5.5,2.2-9.6,5.9\n\t\t\t\t\t\t\t\tc-2.5,2.2-4.7,4.3-4.9,7.2c-0.1,2.1,0.9,19,0,19.8c-0.6,0.5-1.6,0.3-2.4,0.1c0-12.4,0-39.8,0-52.1H1817.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1816,1350v-34c-0.1,1.2,0.1,2.1,1.3,2s2.3-0.9,3.4-1.6c3.7-2.3,8.6-3.6,12.2-1.3c1.2,0.8,1.2,1.3,2.8,2\n\t\t\t\t\t\t\t\tc0.5,0.2,2.8,1.3,5.3,0.8c2.7-0.5,2.6-2.3,6-4c1.4-0.7,4.3-2.2,7-1c2,0.9,2.9,2.8,3,3c1.9,4.3-2.5,9.4-3.2,10.2\n\t\t\t\t\t\t\t\tc-2.3,2.6-4.3,3.2-9.8,5.8c-3.4,1.6-10.1,4.7-15,8c-2.9,1.9-6.9,5.1-11,10.3L1816,1350z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1818.3,1274.5c5.5,5.6,8.8,6.1,10.8,5.5c2.5-0.8,2.9-3.3,6.9-5c1.4-0.6,4.3-1.8,7.2-0.5\n\t\t\t\t\t\t\t\tc3.3,1.5,4.1,5.2,4.2,5.5c0.8,4.2-2.2,7.6-2.8,8.3c-1.8,2-3.3,2.4-11.2,5.5c-4.2,1.6-7.7,2.4-10.3,5.2c-3.1,3.4-3.8,7.8-4,9\n\t\t\t\t\t\t\t\tc-0.6,4.5-0.1,7.8-0.1,7.8c0.3,2.1,0.9,4,0,4.8c-0.6,0.5-1.6,0.3-2.4,0.1c0-12.4,0-33.8,0-46.1H1818.3z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1838,1418C1838,1418,1838,1418,1838,1418c-0.4-1.6-1.5-3.2-3-4c-2.2-1.1-4.5-0.2-5,0\n\t\t\t\t\t\t\t\tc-2.9,1.2-3.1,3.6-5,4c-0.2,0-1.1,0.1-2-0.3c-1.6-0.8-1.5-2.5-3-3.7c-0.6-0.4-1.5-0.9-3-1l0,0c-2-0.1-3.2,0.5-4,1\n\t\t\t\t\t\t\t\tc-1.9,1.3-2,3.5-4,4c-0.8,0.2-1.5,0.1-1.7,0c-2.2-0.5-2.1-2.9-4.3-4c-0.3-0.1-3-1.4-5.7,0c-0.2,0.1-2.5,1.4-3,4\n\t\t\t\t\t\t\t\tc-0.6,3,1.6,5.5,2,6c1.7,1.9,2.9,1.6,8,4c3.9,1.8,6,3.3,7,4c3,2.2,4.2,3.9,4.7,5c0.1,0.1,0.1,0.3,0.2,0.4\n\t\t\t\t\t\t\t\tc0-0.1,0.1-0.3,0.2-0.4c0.5-1.2,1.6-2.8,4.7-5c1-0.7,3.1-2.2,7-4c5.1-2.4,6.3-2.1,8-4C1836.4,1423.5,1838.6,1421,1838,1418z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1816.3,1437c-0.1,0.1-0.1,0.3-0.2,0.4\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1814.5,1345.5c-5.5,5.5-8.8,6.1-10.8,5.5c-2.5-0.8-2.8-3.3-6.7-5c-1.3-0.6-4.3-1.9-7.4-0.5\n\t\t\t\t\t\t\t\tc-3.3,1.5-4.2,5.2-4.2,5.5c-0.8,4.2,2.2,7.6,2.8,8.3c2.9,3.2,7.4,4.1,11.2,5.5c1.3,0.5,5.5,2.2,9.6,5.9\n\t\t\t\t\t\t\t\tc2.5,2.2,4.7,4.3,4.9,7.2c0.1,2.1-0.9,19,0,19.8c0.6,0.5,1.6,0.3,2.4,0.1c0-12.4,0-39.8,0-52.1H1814.5z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1816.3,1350v-34c0.1,1.2-0.1,2.1-1.3,2s-2.3-0.9-3.4-1.6c-3.7-2.3-8.6-3.6-12.2-1.3\n\t\t\t\t\t\t\t\tc-1.2,0.8-1.2,1.3-2.8,2c-0.5,0.2-2.8,1.3-5.3,0.8c-2.7-0.5-2.6-2.3-6-4c-1.4-0.7-4.3-2.2-7-1c-2,0.9-2.9,2.8-3,3\n\t\t\t\t\t\t\t\tc-1.9,4.3,2.5,9.4,3.2,10.2c2.3,2.6,4.3,3.2,9.8,5.8c3.4,1.6,10.1,4.7,15,8c2.9,1.9,6.9,5.1,11,10.3L1816.3,1350z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1814,1274.5c-5.5,5.5-8.8,6.2-10.8,5.5c-2.4-0.8-2.5-3.3-6.2-5c-1-0.5-4.5-2.1-7.9-0.5\n\t\t\t\t\t\t\t\tc-3.3,1.6-4.1,5.2-4.2,5.5c-0.8,4.2,2.2,7.6,2.8,8.3c1.6,1.8,2.9,2.3,11.2,5.5c3.8,1.5,7.2,2.3,10,5.2c0.8,0.9,3,3.3,4,7\n\t\t\t\t\t\t\t\tc0.4,1.4,1.1,5.2,0.4,9.8c-0.3,2.1-0.9,4,0,4.8c0.6,0.5,1.6,0.3,2.4,0.1c0-12.4,0-33.8,0-46.1H1814z\"/>\n\t\t\t\t\t\t\t<rect x=\"1814\" y=\"1247\" class=\"st23\" width=\"4\" height=\"177\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1813.8,1387.5c-0.7,0.9-1.9,2.3-3.9,3.3c-1.5,0.8-3.3,1.7-5.1,1.3c-2.9-0.7-2.4-3.9-5.7-5.1\n\t\t\t\t\t\t\t\tc-3-1.1-5.9,0.4-6,0.5c-0.4,0.2-2.9,1.7-3.5,4.6c-0.7,3.5,1.8,6.4,2.4,6.9c2.4,2.7,6.2,3.4,9.4,4.6c1.1,0.4,4.6,1.8,8,4.9\n\t\t\t\t\t\t\t\tc2.1,1.9,4,3.6,4.1,6c0.1,1.8-0.8,3.3,0,4c0.5,0.4,1.3,0.3,2,0.1c0-10.4,0-20.7,0-31.1H1813.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1818.5,1387.5c0.8,1,2.2,2.4,4.5,3.5c1.6,0.7,3,1.4,4.6,1.1c2.4-0.5,2.4-2.7,5.4-4.1\n\t\t\t\t\t\t\t\tc1.1-0.5,3.7-1.7,6.3-0.5c2.8,1.3,3.5,4.4,3.5,4.6c0.7,3.5-1.8,6.4-2.4,6.9c-2.4,2.7-6.2,3.4-9.4,4.6c-1.1,0.4-4.6,1.8-8,4.9\n\t\t\t\t\t\t\t\tc-2.1,1.9-4,3.6-4.1,6c-0.1,1.8,0.8,3.3,0,4c-0.5,0.4-1.3,0.3-2,0.1c0-10.4,0-20.7,0-31.1H1818.5z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1813.8,1247.5c-0.7,0.9-1.9,2.3-3.9,3.3c-1.5,0.8-3.3,1.7-5.1,1.3c-2.9-0.7-2.4-3.9-5.7-5.1\n\t\t\t\t\t\t\t\tc-3-1.1-5.9,0.4-6,0.5c-0.4,0.2-2.9,1.7-3.5,4.6c-0.7,3.5,1.8,6.4,2.4,6.9c2.4,2.7,6.2,3.4,9.4,4.6c1.1,0.4,4.6,1.8,8,4.9\n\t\t\t\t\t\t\t\tc2.1,1.9,4,3.6,4.1,6c0.1,1.8-0.8,3.3,0,4c0.5,0.4,1.3,0.3,2,0.1c0-10.4,0-20.7,0-31.1H1813.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1818.5,1247.5c0.8,1,2.2,2.4,4.5,3.5c1.6,0.7,3,1.4,4.6,1.1c2.4-0.5,2.4-2.7,5.4-4.1\n\t\t\t\t\t\t\t\tc1.1-0.5,3.7-1.7,6.3-0.5c2.8,1.3,3.5,4.4,3.5,4.6c0.7,3.5-1.8,6.4-2.4,6.9c-2.4,2.7-6.2,3.4-9.4,4.6c-1.1,0.4-4.6,1.8-8,4.9\n\t\t\t\t\t\t\t\tc-2.1,1.9-4,3.6-4.1,6c-0.1,1.8,0.8,3.3,0,4c-0.5,0.4-1.3,0.3-2,0.1c0-10.4,0-20.7,0-31.1H1818.5z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<path class=\"st27\" d=\"M1233.5,1270.7c-0.3,0-0.7,0-1,0l-142.2,14.4c-2.5,0.2-4.5,2.1-4.9,4.5c-4.7,28.9-6.7,58.3-5.8,87.6\n\t\t\t\t\t\t\t\tc0.2,5.9,8.2,7.4,10.5,2c10.6-24.8,21.2-49.6,31.8-74.3c1.9-4.5,8.4-4.4,10.2,0.2c0.5,1.3,1.1,2.5,2,3.4\n\t\t\t\t\t\t\t\tc5,5.3,13.4-2.5,15.1-9.6c0.6-2.6,1.2-5.4,2-8.1c1.7-5.3,9.4-4.9,10.6,0.5l4.7,22c1.2,5.3,8.5,5.9,10.5,0.8l6.7-17.6\n\t\t\t\t\t\t\t\tc2.1-5.6,10.4-4.2,10.6,1.8l1.4,47.9c0.2,6.1,8.6,7.4,10.6,1.7c7.4-20.8,15.7-41.3,26.1-60.6c2.5-4.6,9.3-3.4,10.2,1.7\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g class=\"st29\">\n\t\t\t\t\t\t\t<path class=\"st30\" d=\"M1083,948.8c49.7,4.9,100.2,0.8,148.5-12.2c65.1-17.5,128-51,195.3-47.4c30.5,1.7,60.1,11,89.9,17.6\n\t\t\t\t\t\t\t\tc78.6,17.4,161.1,16.2,237.9,40.4L1810,933l-281-78l-287-20L1083,948.8z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t\t\n\t\t\t\t\t<g class=\"st31\">\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t<path class=\"st32\" d=\"M968.5,1295.1c-2.2-2-5.8-2.1-7-2c-6.9,0.4-33.8,0.6-73.5,0.7c-15.1,0-32.1,0-50.5,0.1\n\t\t\t\t\t\t\t\t\tc-4.5,0-7.2,5.1-4.6,8.8c8,11.3,20.7,19.3,34.5,21.1c3.3,0.4,6.8,0.6,9.9,1.9c2.8,1.2,5,3.2,7.3,5.2c5.5,4.7,12,8.8,18.8,11.6\n\t\t\t\t\t\t\t\t\tc5.2,2.2,10.7,3.5,16,3.6c4.5,0.1,9-0.6,13.3-2.5c8.9-3.8,15.4-11.6,21.4-19.2c3.9-4.8,7.8-9.7,11.7-14.5\n\t\t\t\t\t\t\t\t\tC969.2,1305.5,972.6,1298.8,968.5,1295.1z\"/>\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t<path class=\"st9\" d=\"M919.3,1346c-11.8-16.6-22.3-34.1-31.4-52.3c-15.1,0-32.1,0-50.5,0.1c-4.5,0-7.2,5.1-4.6,8.8\n\t\t\t\t\t\t\t\t\tc8,11.3,20.7,19.3,34.5,21.1c3.3,0.4,6.8,0.6,9.9,1.9c2.8,1.2,5,3.2,7.3,5.2c5.5,4.7,12,8.8,18.8,11.6\n\t\t\t\t\t\t\t\t\tC908.5,1344.5,913.9,1345.9,919.3,1346z\"/>\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t<path class=\"st32\" d=\"M1894.6,1141.8c-1.9-1.8-5-1.8-6.1-1.8c-6,0.3-29.4,0.5-63.9,0.6c-13.1,0-27.9,0-43.9,0.1\n\t\t\t\t\t\t\t\t\tc-3.9,0-6.3,4.4-4,7.6c6.9,9.8,18,16.8,29.9,18.4c2.9,0.4,5.9,0.5,8.6,1.6c2.4,1,4.4,2.8,6.4,4.5c4.8,4,10.4,7.7,16.3,10.1\n\t\t\t\t\t\t\t\t\tc4.5,1.9,9.3,3.1,13.9,3.2c3.9,0.1,7.8-0.6,11.5-2.1c7.7-3.3,13.3-10.1,18.6-16.7c3.4-4.2,6.8-8.4,10.2-12.6\n\t\t\t\t\t\t\t\t\tC1895.3,1150.8,1898.2,1145,1894.6,1141.8z\"/>\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t<path class=\"st9\" d=\"M1851.9,1186c-10.2-14.4-19.4-29.6-27.3-45.4c-13.1,0-27.9,0-43.9,0.1c-3.9,0-6.3,4.4-4,7.6\n\t\t\t\t\t\t\t\t\tc6.9,9.8,18,16.8,29.9,18.4c2.9,0.4,5.9,0.5,8.6,1.6c2.4,1,4.4,2.8,6.4,4.5c4.8,4,10.4,7.7,16.3,10.1\n\t\t\t\t\t\t\t\t\tC1842.5,1184.7,1847.2,1185.9,1851.9,1186z\"/>\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<path class=\"st32\" d=\"M1397,1207h-55v0.5c0,15.2,12.3,27.5,27.5,27.5l0,0c15.2,0,27.5-12.3,27.5-27.5V1207z\"/>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t<path class=\"st9\" d=\"M1389.1,1204.3c1.4-1.3,3.6-1.3,4.4-1.3c4.3,0.2,21.1,0.4,45.7,0.4c9.4,0,20,0,31.4,0\n\t\t\t\t\t\t\t\t\tc2.8,0,4.5,3.2,2.9,5.5c-5,7-12.9,12-21.4,13.1c-2.1,0.3-4.2,0.4-6.2,1.2c-1.7,0.7-3.1,2-4.6,3.2c-3.4,2.9-7.5,5.5-11.7,7.2\n\t\t\t\t\t\t\t\t\tc-3.3,1.3-6.6,2.2-10,2.3c-2.8,0.1-5.6-0.4-8.3-1.5c-5.5-2.4-9.6-7.2-13.3-11.9c-2.4-3-4.9-6-7.3-9\n\t\t\t\t\t\t\t\t\tC1388.7,1210.8,1386.6,1206.6,1389.1,1204.3z\"/>\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t<path class=\"st32\" d=\"M1419.7,1236c7.3-10.3,13.9-21.2,19.5-32.5c9.4,0,20,0,31.4,0c2.8,0,4.5,3.2,2.9,5.5\n\t\t\t\t\t\t\t\t\tc-5,7-12.9,12-21.4,13.1c-2.1,0.3-4.2,0.4-6.2,1.2c-1.7,0.7-3.1,2-4.6,3.2c-3.4,2.9-7.5,5.5-11.7,7.2\n\t\t\t\t\t\t\t\t\tC1426.4,1235.1,1423.1,1235.9,1419.7,1236z\"/>\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<path class=\"st9\" d=\"M1139.8,1132.7v-0.7h-78.6v0.7c0,21.7,17.6,39.3,39.3,39.3c2.1,0,4.1-0.2,6.1-0.5\n\t\t\t\t\t\t\t\tc8.4-1.3,15.9-5.3,21.6-11C1135.4,1153.4,1139.8,1143.5,1139.8,1132.7z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t</g>\n\n\t\t\t\t<g class=\"islandBody\">\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<linearGradient id=\"SVGID_7_\" gradientUnits=\"userSpaceOnUse\" x1=\"1056\" y1=\"1055.9138\" x2=\"1056\" y2=\"672.552\">\n\t\t\t\t\t\t\t<stop  offset=\"0\" style=\"stop-color:#295071\"/>\n\t\t\t\t\t\t\t<stop  offset=\"1\" style=\"stop-color:#41A0B5\"/>\n\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t<path class=\"st33\" d=\"M1240,1055.9c-30.3-116.9-49.4-205.9-62-270c-7-35.5-14.8-78.2-49.5-99.3c-33.5-20.4-84.8-18.9-112.6,6.7\n\t\t\t\t\t\t\tc-33.5,30.9-48.6,67-60.2,108.5c-16.3,58.3-42.1,141.1-83.7,245.1C994.7,1049.9,1117.3,1052.9,1240,1055.9z\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<linearGradient id=\"SVGID_8_\" gradientUnits=\"userSpaceOnUse\" x1=\"1864\" y1=\"1049.8723\" x2=\"1864\" y2=\"664.552\">\n\t\t\t\t\t\t\t<stop  offset=\"0\" style=\"stop-color:#295071\"/>\n\t\t\t\t\t\t\t<stop  offset=\"1\" style=\"stop-color:#41A0B5\"/>\n\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t<path class=\"st34\" d=\"M2048,1046.9c-30.3-116.9-49.4-204.9-62-269c-7-35.5-14.8-78.2-49.5-99.3c-33.5-20.4-84.8-18.9-112.6,6.7\n\t\t\t\t\t\t\tc-33.5,30.9-48.6,67-60.2,108.5c-16.3,58.3-42.1,151.1-83.7,255.1C1802.7,1051.9,1923,1046.9,2048,1046.9z\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<polygon class=\"st9\" points=\"2014.2,1045.9 1802,1117.9 1540,1201.9 1239,1187.9 1105.8,1127.7 1012,1085.3 924.8,1045.9 \n\t\t\t\t\t\t1212.6,617.2 1288.2,504.6 1294,495.9 1360.6,584.4 1367,592.9 1381.7,587 1398.1,580.4 1449,559.9 1539.4,637.7 \t\t\t\"/>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<linearGradient id=\"SVGID_9_\" gradientUnits=\"userSpaceOnUse\" x1=\"1513.085\" y1=\"1201.9138\" x2=\"1513.085\" y2=\"495.9138\">\n\t\t\t\t\t\t\t<stop  offset=\"0\" style=\"stop-color:#4182B5\"/>\n\t\t\t\t\t\t\t<stop  offset=\"1\" style=\"stop-color:#41A0B5\"/>\n\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t<path class=\"st35\" d=\"M2014.2,1046.9l-212.2,71l-262,84l-301-14l-133.2-60.2l-93.9-42.4c66.2-79,187-79.3,277.6-128.8\n\t\t\t\t\t\t\tc16.2-8.9,33.3-22.5,33.3-41c-0.1-29.9-41.8-41.3-53.8-68.7c-11.6-26.4,9.6-57,35.6-69.4c26-12.4,55.9-13.2,83.6-21.1\n\t\t\t\t\t\t\tc27.7-8,56.1-27.6,58.5-56.3c2.5-29.7-23.9-54-51-66.5c-27-12.5-57.6-18.9-80.5-37.9c-25.9-21.6-34.7-58.5-27-91.1l5.8-8.7\n\t\t\t\t\t\t\tl66.6,88.5l6.4,8.5l82-33L2014.2,1046.9z\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<polygon class=\"st11\" points=\"1125.8,1136.8 1239,1189.9 1540,1201.9 1944,1072.9 1861,1082.9 1573,1129.9 1188,1129.9 \n\t\t\t\t\t\t1066.6,1110 \t\t\t\"/>\n\t\t\t\t</g>\n\n\t\t\t\t<g class=\"waves liquid\">\n\t\t\t\t\t<path class=\"st36 waveRight\" d=\"M2471.5,1622.9h-288c-13.5,0-24.5-11-24.5-24.5l0,0c0-13.5,11-24.5,24.5-24.5h288c13.5,0,24.5,11,24.5,24.5\n\t\t\t\t\t\tl0,0C2496,1611.9,2485,1622.9,2471.5,1622.9z\"/>\n\t\t\t\t\t<path class=\"st36 waveLeft\" d=\"M648.5,1745.9h-288c-13.5,0-24.5-11-24.5-24.5l0,0c0-13.5,11-24.5,24.5-24.5h288c13.5,0,24.5,11,24.5,24.5\n\t\t\t\t\t\tl0,0C673,1734.9,662,1745.9,648.5,1745.9z\"/>\n\t\t\t\t\t<path class=\"st36 waveRight\" d=\"M2261.5,1264.9h-288c-13.5,0-24.5-11-24.5-24.5l0,0c0-13.5,11-24.5,24.5-24.5h288c13.5,0,24.5,11,24.5,24.5\n\t\t\t\t\t\tl0,0C2286,1253.9,2275,1264.9,2261.5,1264.9z\"/>\n\t\t\t\t\t<path class=\"st36 waveLeft\" d=\"M734.5,1165.9h-288c-13.5,0-24.5-11-24.5-24.5l0,0c0-13.5,11-24.5,24.5-24.5h288c13.5,0,24.5,11,24.5,24.5\n\t\t\t\t\t\tl0,0C759,1154.9,748,1165.9,734.5,1165.9z\"/>\n\t\t\t\t\t<path class=\"st36 waveLeft\" d=\"M1567.5,1404.9h-288c-13.5,0-24.5-11-24.5-24.5l0,0c0-13.5,11-24.5,24.5-24.5h288c13.5,0,24.5,11,24.5,24.5\n\t\t\t\t\t\tl0,0C1592,1393.9,1581,1404.9,1567.5,1404.9z\"/>\n\t\t\t\t\t<path class=\"st36 waveRight\" d=\"M1030.5,1316.9h-288c-13.5,0-24.5-11-24.5-24.5l0,0c0-13.5,11-24.5,24.5-24.5h288c13.5,0,24.5,11,24.5,24.5\n\t\t\t\t\t\tl0,0C1055,1305.9,1044,1316.9,1030.5,1316.9z\"/>\n\t\t\t\t\t<path class=\"st36 waveLeft\" d=\"M941.5,1366.9h-288c-13.5,0-24.5-11-24.5-24.5l0,0c0-13.5,11-24.5,24.5-24.5h288c13.5,0,24.5,11,24.5,24.5\n\t\t\t\t\t\tl0,0C966,1355.9,955,1366.9,941.5,1366.9z\"/>\n\t\t\t\t\t<path class=\"st36 waveRight\" d=\"M1597.5,1453.9h-288c-13.5,0-24.5-11-24.5-24.5l0,0c0-13.5,11-24.5,24.5-24.5h288c13.5,0,24.5,11,24.5,24.5\n\t\t\t\t\t\tl0,0C1622,1442.9,1611,1453.9,1597.5,1453.9z\"/>\n\t\t\t\t</g>\n    \n\t\t\t\t<g class=\"trees\">\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<path class=\"st13\" d=\"M1515.3,861.2h68.2c4.8,0,8.2-6.1,7-12.2c-3.7-17.6-8.6-37.2-15.2-58.1c-6.4-20.1-13.3-37.9-20.1-53.2\n\t\t\t\t\t\t\tc-2.8-6.4-9.7-6.4-12.5,0c-6.8,15.8-13.8,34.1-20.2,54.9c-6.2,20.3-10.8,39.4-14.1,56.6C1507.1,855.3,1510.6,861.2,1515.3,861.2z\n\t\t\t\t\t\t\t\"/>\n\t\t\t\t\t\t<circle class=\"st14\" cx=\"1550.1\" cy=\"805.9\" r=\"5\"/>\n\t\t\t\t\t\t<circle class=\"st14\" cx=\"1552.7\" cy=\"828.5\" r=\"5\"/>\n\t\t\t\t\t\t<circle class=\"st14\" cx=\"1566.5\" cy=\"818.5\" r=\"5\"/>\n\t\t\t\t\t\t<circle class=\"st14\" cx=\"1566.5\" cy=\"842.4\" r=\"5\"/>\n\t\t\t\t\t\t<circle class=\"st14\" cx=\"1528.8\" cy=\"824.8\" r=\"5\"/>\n\t\t\t\t\t\t<rect x=\"1538.8\" y=\"861.2\" class=\"st15\" width=\"18.9\" height=\"66.7\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<linearGradient id=\"SVGID_10_\" gradientUnits=\"userSpaceOnUse\" x1=\"1242\" y1=\"714.9138\" x2=\"1242\" y2=\"614.2458\">\n\t\t\t\t\t\t\t<stop  offset=\"0\" style=\"stop-color:#295071\"/>\n\t\t\t\t\t\t\t<stop  offset=\"1\" style=\"stop-color:#41A0B5\"/>\n\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t<path class=\"st37\" d=\"M1336.1,713.3c-7.9,0-15.8,0.1-23.6,0.2c-2.3,0-4.7,0.1-7,0.1h-62c-0.4-1.4-0.7-2.8-1.1-4.1\n\t\t\t\t\t\t\tc-0.5,1.4-1.1,2.8-1.6,4.1c0,0.1-0.1,0.2-0.1,0.3c-31.4,0.1-61.8,1.5-92.7,0.8c10.8-27,17.5-51.1,21.7-66.2\n\t\t\t\t\t\t\tc3-10.8,6.9-20.1,15.6-28.2c7.2-6.7,20.5-7,29.2-1.7c9,5.5,11.1,16.6,12.9,25.8c0.8,4.2,1.8,8.8,2.8,13.8\n\t\t\t\t\t\t\tc1.5,6.9,7.5,11.8,14.6,11.8h0c6.6,0,12.5-4.4,14.3-10.8c1.2-4.2,2.3-8,3.2-11.3c3-10.8,6.9-20.1,15.6-28.2\n\t\t\t\t\t\t\tc7.2-6.7,20.5-7,29.2-1.7c9,5.5,11.1,16.6,12.9,25.8C1323.2,660.3,1328.2,682.9,1336.1,713.3z\"/></g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<linearGradient id=\"SVGID_11_\" gradientUnits=\"userSpaceOnUse\" x1=\"1703.8744\" y1=\"1130.9138\" x2=\"1703.8744\" y2=\"892.3593\">\n\t\t\t\t\t\t<stop  offset=\"0\" style=\"stop-color:#295071\"/>\n\t\t\t\t\t\t<stop  offset=\"1\" style=\"stop-color:#41A0B5\"/>\n\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t<path class=\"st38\" d=\"M1487.9,1130.9c-0.3-59.8-9-145.9,19.6-194.3c15.6-26.5,41.5-43.3,68.1-44.3s53.2,14.1,70,39.4\n\t\t\t\t\t\tc10.9,16.5,18.6,37.7,33.9,47.3c15.1,9.5,33.8,4.8,48.6-5.2c14.8-10.1,27.1-24.9,40.8-37.2c31.8-28.7,79-41.7,109.3-10.6\n\t\t\t\t\t\tc33.5,34.5,27.3,99.2,43.1,149.4\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<line class=\"st19\" x1=\"1949\" y1=\"944.2\" x2=\"1950.8\" y2=\"998.3\"/>\n\t\t\t\t\t\t<line class=\"st19\" x1=\"1938.1\" y1=\"953.3\" x2=\"1949\" y2=\"944.2\"/>\n\t\t\t\t\t\t<line class=\"st19\" x1=\"1936.9\" y1=\"968\" x2=\"1949.5\" y2=\"959.6\"/>\n\t\t\t\t\t\t<line class=\"st19\" x1=\"1936\" y1=\"981.8\" x2=\"1949.8\" y2=\"974.1\"/>\n\t\t\t\t\t\t<line class=\"st19\" x1=\"1960.7\" y1=\"953.3\" x2=\"1949.7\" y2=\"944.2\"/>\n\t\t\t\t\t\t<line class=\"st19\" x1=\"1961.9\" y1=\"968\" x2=\"1949.3\" y2=\"959.6\"/>\n\t\t\t\t\t\t<line class=\"st19\" x1=\"1962.8\" y1=\"981.8\" x2=\"1949\" y2=\"974.1\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g class=\"treesPinkGroup\">\n\n\t\t\t\t\t\t<use class=\"treesPink\" xlink:href=\"#RoundTree\"  width=\"103\" height=\"176.5\" x=\"-51.5\" y=\"-88.2\" transform=\"matrix(1 0 0 -1 1066.5 958.1638)\" style=\"overflow:visible;\"/>\n\n\t\t\t\t\t\t<use class=\"treesPink\" xlink:href=\"#RoundTree\"  width=\"103\" height=\"176.5\" x=\"-51.5\" y=\"-88.2\" transform=\"matrix(1 0 0 -1 1809.5 997.1638)\" style=\"overflow:visible;\"/>\n\n\t\t\t\t\t\t<use class=\"treesPink\" xlink:href=\"#RoundTree\"  width=\"103\" height=\"176.5\" x=\"-51.5\" y=\"-88.2\" transform=\"matrix(1 0 0 -1 1482.5 717.1638)\" style=\"overflow:visible;\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<line class=\"st19\" x1=\"1187\" y1=\"585.2\" x2=\"1188.8\" y2=\"639.3\"/>\n\t\t\t\t\t\t<polyline class=\"st19\" points=\"1176.1,594.3 1187,585.2 1198.1,593.4 \t\t\t\"/>\n\t\t\t\t\t\t<polyline class=\"st19\" points=\"1174.9,609 1187.5,600.6 1201.8,606.8 \t\t\t\"/>\n\t\t\t\t\t\t<polyline class=\"st19\" points=\"1174,622.8 1188.8,615.1 1202.5,621.2 \t\t\t\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g class=\"treeRed\">\n\t\t\t\t\t\t\t<path class=\"st13\" d=\"M1410.3,556.2h68.2c4.8,0,8.2-6.1,7-12.2c-3.7-17.6-8.6-37.2-15.2-58.1c-6.4-20.1-13.3-37.9-20.1-53.2\n\t\t\t\t\t\t\tc-2.8-6.4-9.7-6.4-12.5,0c-6.8,15.8-13.8,34.1-20.2,54.9c-6.2,20.3-10.8,39.4-14.1,56.6C1402.1,550.3,1405.6,556.2,1410.3,556.2z\n\t\t\t\t\t\t\t\"/>\n\t\t\t\t\t\t\t<circle class=\"st14\" cx=\"1445.1\" cy=\"500.9\" r=\"5\"/>\n\t\t\t\t\t\t\t<circle class=\"st14\" cx=\"1447.7\" cy=\"523.5\" r=\"5\"/>\n\t\t\t\t\t\t\t<circle class=\"st14\" cx=\"1461.5\" cy=\"513.5\" r=\"5\"/>\n\t\t\t\t\t\t\t<circle class=\"st14\" cx=\"1461.5\" cy=\"537.4\" r=\"5\"/>\n\t\t\t\t\t\t\t<circle class=\"st14\" cx=\"1423.8\" cy=\"519.8\" r=\"5\"/>\n\t\t\t\t\t\t\t<path class=\"st15\" d=\"M1443.3,622.9L1443.3,622.9c-5.2,0-9.4-4.2-9.4-9.4v-57.2h18.9v57.2\n\t\t\t\t\t\t\tC1452.7,618.7,1448.5,622.9,1443.3,622.9z\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g class=\"treesCoral\">\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t<polygon class=\"st17 CoralTriangle1\" points=\"1167,644.9 1149,696.9 1193,680.9 \t\t\t\t\"/>\n\t\t\t\t\t\t<polygon class=\"st17 CoralTriangle2\" points=\"1166,690.7 1145,729.9 1190,729.9 \t\t\t\t\"/>\n\t\t\t\t\t\t<polygon class=\"st17 CoralTriangle3\" points=\"1167.5,729.9 1138,778.9 1196,775.9 \t\t\t\t\"/>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<line class=\"st18\" x1=\"1168\" y1=\"666.9\" x2=\"1168\" y2=\"791.9\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<polygon class=\"st17 CoralTriangle1\" points=\"1339,427.9 1321,479.9 1365,463.9 \t\t\t\t\"/>\n\t\t\t\t\t\t\t<polygon class=\"st17 CoralTriangle2\" points=\"1338,473.7 1317,512.9 1362,512.9 \t\t\t\t\"/>\n\t\t\t\t\t\t\t<polygon class=\"st17 CoralTriangle3\" points=\"1339.5,512.9 1310,561.9 1368,558.9 \t\t\t\t\"/>\n\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t\t<line class=\"st18\" x1=\"1340\" y1=\"449.9\" x2=\"1340\" y2=\"625.9\"/>\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<polygon class=\"st17 CoralTriangle1\" points=\"1646,887.9 1628,939.9 1672,923.9 \t\t\t\t\"/>\n\t\t\t\t\t\t\t<polygon class=\"st17 CoralTriangle2\" points=\"1645,933.7 1624,972.9 1669,972.9 \t\t\t\t\"/>\n\t\t\t\t\t\t\t<polygon class=\"st17 CoralTriangle3\" points=\"1646.5,972.9 1617,1021.9 1675,1018.9 \t\t\t\t\"/>\n\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t\t<line class=\"st18\" x1=\"1647\" y1=\"909.9\" x2=\"1647\" y2=\"1085.9\"/>\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<polygon class=\"st17 CoralTriangle1\" points=\"1369,719.9 1351,771.9 1395,755.9 \t\t\t\t\"/>\n\t\t\t\t\t\t\t<polygon class=\"st17 CoralTriangle2\" points=\"1368,765.7 1347,804.9 1392,804.9 \t\t\t\t\"/>\n\t\t\t\t\t\t\t<polygon class=\"st17 CoralTriangle3\" points=\"1369.5,804.9 1340,853.9 1398,850.9 \t\t\t\t\"/>\n\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t\t<line class=\"st18\" x1=\"1370\" y1=\"741.9\" x2=\"1370\" y2=\"917.9\"/>\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<line class=\"st19\" x1=\"1920\" y1=\"642.2\" x2=\"1921.8\" y2=\"696.3\"/>\n\t\t\t\t\t\t<polyline class=\"st19\" points=\"1909.1,651.3 1920,642.2 1931.1,650.4 \t\t\t\"/>\n\t\t\t\t\t\t<polyline class=\"st19\" points=\"1907.9,666 1920.5,657.6 1934.8,663.8 \t\t\t\"/>\n\t\t\t\t\t\t<polyline class=\"st19\" points=\"1907,679.8 1921.8,672.1 1935.5,678.2 \t\t\t\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g class=\"treesFloral\">\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<rect x=\"1229.1\" y=\"593.4\" class=\"st17\" width=\"10.4\" height=\"76.5\"/>\n\t\t\t\t\t\t\t<path class=\"st20\" d=\"M1272.8,582.7c-1.3,0.6-2.7,1-4.1,1.3L1272.8,582.7z\"/>\n\t\t\t\t\t\t\t<path class=\"st20\" d=\"M1283.6,566.1c0,7.4-4.4,13.8-10.8,16.6h0l-4.1,1.3l-34.4,10.7l-36.4-10.6c-8.7-1.3-15.5-8.9-15.5-18\n\t\t\t\t\t\t\t\tc0-10,8.1-18.2,18.2-18.2c0.6,0,1.2,0,1.7,0.1c-0.3-1.3-0.4-2.6-0.4-4c0-10,8.1-18.2,18.2-18.2c5.4,0,10.3,2.4,13.6,6.2\n\t\t\t\t\t\t\t\tc3.3-3.8,8.2-6.2,13.6-6.2c10,0,18.2,8.1,18.2,18.2c0,1.3-0.1,2.6-0.4,3.9c0.1,0,0.3,0,0.4,0\n\t\t\t\t\t\t\t\tC1275.5,548,1283.6,556.1,1283.6,566.1z\"/>\n\t\t\t\t\t\t\t<path class=\"st21\" d=\"M1283.6,566.1c0,7.4-4.4,13.8-10.8,16.6h0l-4.1,1.3l-34.4,10.7l-36.4-10.6c-8.7-1.3-15.5-8.9-15.5-18\n\t\t\t\t\t\t\t\tc0-10,8.1-18.2,18.2-18.2c0.6,0,1.2,0,1.7,0.1c-0.3-1.3-0.4-2.6-0.4-4c0-10,8.1-18.2,18.2-18.2c5.4,0,10.3,2.4,13.6,6.2\n\t\t\t\t\t\t\t\tc3.3-3.8,8.2-6.2,13.6-6.2c10,0,18.2,8.1,18.2,18.2c0,1.3-0.1,2.6-0.4,3.9c0.1,0,0.3,0,0.4,0\n\t\t\t\t\t\t\t\tC1275.5,548,1283.6,556.1,1283.6,566.1z\"/>\n\t\t\t\t\t\t\t<path class=\"st22\" d=\"M1266.4,575.8c0,4.9-2.9,9.1-7.1,11h0l-2.7,0.8l-22.7,7.1l-24.1-7c-5.8-0.9-10.2-5.9-10.2-11.9\n\t\t\t\t\t\t\t\tc0-6.6,5.4-12,12-12c0.4,0,0.8,0,1.1,0.1c-0.2-0.8-0.3-1.7-0.3-2.6c0-6.6,5.4-12,12-12c3.6,0,6.8,1.6,9,4.1\n\t\t\t\t\t\t\t\tc2.2-2.5,5.4-4.1,9-4.1c6.6,0,12,5.4,12,12c0,0.9-0.1,1.7-0.3,2.6c0.1,0,0.2,0,0.3,0C1261,563.8,1266.4,569.2,1266.4,575.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st21\" d=\"M1222,579.8h24.6c-0.5,1.8-1.5,4.8-3.9,7.8c-3.3,4.1-7.2,5.8-9.1,6.5c-2.1-1.3-5-3.4-7.8-6.5\n\t\t\t\t\t\t\t\tC1223.3,584.7,1223,581.9,1222,579.8z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<rect x=\"1470.1\" y=\"1019.4\" class=\"st25\" width=\"10.4\" height=\"76.5\"/>\n\t\t\t\t\t\t\t<path class=\"st20\" d=\"M1513.8,1008.7c-1.3,0.6-2.7,1-4.1,1.3L1513.8,1008.7z\"/>\n\t\t\t\t\t\t\t<path class=\"st20\" d=\"M1524.6,992.1c0,7.4-4.4,13.8-10.8,16.6h0l-4.1,1.3l-34.4,10.7l-36.4-10.6c-8.7-1.3-15.5-8.9-15.5-18\n\t\t\t\t\t\t\t\tc0-10,8.1-18.2,18.2-18.2c0.6,0,1.2,0,1.7,0.1c-0.3-1.3-0.4-2.6-0.4-4c0-10,8.1-18.2,18.2-18.2c5.4,0,10.3,2.4,13.6,6.2\n\t\t\t\t\t\t\t\tc3.3-3.8,8.2-6.2,13.6-6.2c10,0,18.2,8.1,18.2,18.2c0,1.3-0.1,2.6-0.4,3.9c0.1,0,0.3,0,0.4,0\n\t\t\t\t\t\t\t\tC1516.5,974,1524.6,982.1,1524.6,992.1z\"/>\n\t\t\t\t\t\t\t<path class=\"st26\" d=\"M1524.6,992.1c0,7.4-4.4,13.8-10.8,16.6h0l-4.1,1.3l-34.4,10.7l-36.4-10.6c-8.7-1.3-15.5-8.9-15.5-18\n\t\t\t\t\t\t\t\tc0-10,8.1-18.2,18.2-18.2c0.6,0,1.2,0,1.7,0.1c-0.3-1.3-0.4-2.6-0.4-4c0-10,8.1-18.2,18.2-18.2c5.4,0,10.3,2.4,13.6,6.2\n\t\t\t\t\t\t\t\tc3.3-3.8,8.2-6.2,13.6-6.2c10,0,18.2,8.1,18.2,18.2c0,1.3-0.1,2.6-0.4,3.9c0.1,0,0.3,0,0.4,0\n\t\t\t\t\t\t\t\tC1516.5,974,1524.6,982.1,1524.6,992.1z\"/>\n\t\t\t\t\t\t\t<path class=\"st22\" d=\"M1507.4,1001.8c0,4.9-2.9,9.1-7.1,11h0l-2.7,0.8l-22.7,7.1l-24.1-7c-5.8-0.9-10.2-5.9-10.2-11.9\n\t\t\t\t\t\t\t\tc0-6.6,5.4-12,12-12c0.4,0,0.8,0,1.1,0.1c-0.2-0.8-0.3-1.7-0.3-2.6c0-6.6,5.4-12,12-12c3.6,0,6.8,1.6,9,4.1\n\t\t\t\t\t\t\t\tc2.2-2.5,5.4-4.1,9-4.1c6.6,0,12,5.4,12,12c0,0.9-0.1,1.7-0.3,2.6c0.1,0,0.2,0,0.3,0C1502,989.8,1507.4,995.2,1507.4,1001.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st26\" d=\"M1463,1005.8h24.6c-0.5,1.8-1.5,4.8-3.9,7.8c-3.3,4.1-7.2,5.8-9.1,6.5c-2.1-1.3-5-3.4-7.8-6.5\n\t\t\t\t\t\t\t\tC1464.3,1010.7,1464,1007.9,1463,1005.8z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<rect x=\"1691.1\" y=\"790.4\" class=\"st17\" width=\"10.4\" height=\"76.5\"/>\n\t\t\t\t\t\t\t<path class=\"st20\" d=\"M1734.8,779.7c-1.3,0.6-2.7,1-4.1,1.3L1734.8,779.7z\"/>\n\t\t\t\t\t\t\t<path class=\"st20\" d=\"M1745.6,763.1c0,7.4-4.4,13.8-10.8,16.6h0l-4.1,1.3l-34.4,10.7l-36.4-10.6c-8.7-1.3-15.5-8.9-15.5-18\n\t\t\t\t\t\t\t\tc0-10,8.1-18.2,18.2-18.2c0.6,0,1.2,0,1.7,0.1c-0.3-1.3-0.4-2.6-0.4-4c0-10,8.1-18.2,18.2-18.2c5.4,0,10.3,2.4,13.6,6.2\n\t\t\t\t\t\t\t\tc3.3-3.8,8.2-6.2,13.6-6.2c10,0,18.2,8.1,18.2,18.2c0,1.3-0.1,2.6-0.4,3.9c0.1,0,0.3,0,0.4,0\n\t\t\t\t\t\t\t\tC1737.5,745,1745.6,753.1,1745.6,763.1z\"/>\n\t\t\t\t\t\t\t<path class=\"st21\" d=\"M1745.6,763.1c0,7.4-4.4,13.8-10.8,16.6h0l-4.1,1.3l-34.4,10.7l-36.4-10.6c-8.7-1.3-15.5-8.9-15.5-18\n\t\t\t\t\t\t\t\tc0-10,8.1-18.2,18.2-18.2c0.6,0,1.2,0,1.7,0.1c-0.3-1.3-0.4-2.6-0.4-4c0-10,8.1-18.2,18.2-18.2c5.4,0,10.3,2.4,13.6,6.2\n\t\t\t\t\t\t\t\tc3.3-3.8,8.2-6.2,13.6-6.2c10,0,18.2,8.1,18.2,18.2c0,1.3-0.1,2.6-0.4,3.9c0.1,0,0.3,0,0.4,0\n\t\t\t\t\t\t\t\tC1737.5,745,1745.6,753.1,1745.6,763.1z\"/>\n\t\t\t\t\t\t\t<path class=\"st22\" d=\"M1728.4,772.8c0,4.9-2.9,9.1-7.1,11h0l-2.7,0.8l-22.7,7.1l-24.1-7c-5.8-0.9-10.2-5.9-10.2-11.9\n\t\t\t\t\t\t\t\tc0-6.6,5.4-12,12-12c0.4,0,0.8,0,1.1,0.1c-0.2-0.8-0.3-1.7-0.3-2.6c0-6.6,5.4-12,12-12c3.6,0,6.8,1.6,9,4.1\n\t\t\t\t\t\t\t\tc2.2-2.5,5.4-4.1,9-4.1c6.6,0,12,5.4,12,12c0,0.9-0.1,1.7-0.3,2.6c0.1,0,0.2,0,0.3,0C1723,760.8,1728.4,766.2,1728.4,772.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st21\" d=\"M1684,776.8h24.6c-0.5,1.8-1.5,4.8-3.9,7.8c-3.3,4.1-7.2,5.8-9.1,6.5c-2.1-1.3-5-3.4-7.8-6.5\n\t\t\t\t\t\t\t\tC1685.3,781.7,1685,778.9,1684,776.8z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<path class=\"st27\" d=\"M1136.5,1100.8c-4.4-38.6-5-104.6-2-143.4c0.6-7.8,11.3-9.3,14.1-2c12.4,33.5,24.9,67,37.3,100.5\n\t\t\t\t\t\tc2.3,6.1,10.8,6.4,13.5,0.4c0.7-1.7,1.6-3.3,2.9-4.4c7-6.7,17.6,4.1,19.3,13.7c0.6,3.4,1.2,7.2,2.1,10.8\n\t\t\t\t\t\tc1.9,7.2,12.1,7.3,14.1,0.1l7.7-28.8c1.9-7,11.7-7.2,13.9-0.4l7.7,23.7c2.5,7.6,13.5,6.2,14.2-1.7l4.9-63.4\n\t\t\t\t\t\tc0.6-8,11.9-9.2,14.2-1.6c8.5,28,18.1,55.7,30.7,81.9c3,6.2,12.1,5.2,13.6-1.6l3.6-16.1c1.6-7,11.1-7.7,13.8-1.1\n\t\t\t\t\t\tc2.7,6.7,5.8,13.2,9.3,19.5c3.3,6,12.3,4.6,13.5-2.2c3.1-17.9,5.4-36,6.9-54.1c0.6-7.9,11.5-9.3,14.1-1.8\n\t\t\t\t\t\tc5.3,15.3,11.6,30.3,19,44.7c3.4,6.7,13.5,4.4,13.7-3.1l1.5-44.3c0.3-8,11.4-9.7,14.1-2.2l17.9,50.8c2.6,7.3,13.2,6,14.1-1.6\n\t\t\t\t\t\tc1.1-9.4,1.7-18.8,1.9-28.2c0.2-7.6,10.5-9.9,13.8-3.1c1.7,3.4,3.4,6.8,5.3,10.1c3.3,5.9,12.2,4.6,13.5-2.1\n\t\t\t\t\t\tc2.2-11.4,3.7-23,4.2-34.7c0.4-8.3,12.2-9.5,14.3-1.5c4,15.4,7.2,31,9.6,46.8c0,0.1,0,0.3,0.1,0.4l3.2,33.1c0.4,4.2-2.8,7.8-7,8\n\t\t\t\t\t\tl-213.6,6.6c-0.4,0-0.9,0-1.3-0.1l-186.4-1.2c-1,0-2.1-0.2-3-0.6C1138.4,1105.5,1136.8,1103.4,1136.5,1100.8z\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<path class=\"st28\" d=\"M1754.2,1094c2.8-36.4,2.2-73.1-2-109.4c-0.8-7.3-11-8.3-13.3-1.3c-10.6,31.9-21.2,63.7-31.7,95.6\n\t\t\t\t\t\tc-1.9,5.8-10,6.3-12.6,0.8c-0.8-1.6-1.6-3-2.8-4.1c-6.8-6.1-16.4,4.4-17.7,13.5c-0.5,3.3-0.9,6.9-1.7,10.3\n\t\t\t\t\t\tc-1.5,6.8-11.1,7.1-13.2,0.4l-8.2-26.8c-2-6.5-11.2-6.4-13.1,0.1l-6.5,22.5c-2.1,7.2-12.5,6.3-13.3-1.1l-6.7-59.4\n\t\t\t\t\t\tc-0.8-7.5-11.4-8.3-13.4-1c-7.1,26.6-15.1,52.9-26.1,77.9c-2.6,5.9-11.2,5.3-12.9-1l-3.9-15c-1.7-6.5-10.7-6.9-13-0.6\n\t\t\t\t\t\tc-2.3,6.3-5,12.5-8.1,18.5c-2.9,5.8-11.5,4.7-12.8-1.6c-3.5-16.7-6.3-33.6-8.2-50.6c-0.8-7.3-11.1-8.3-13.3-1.2\n\t\t\t\t\t\tc-4.4,14.5-9.9,28.7-16.3,42.5c-3,6.4-12.5,4.7-13-2.4l-2.9-41.5c-0.5-7.5-11.1-8.8-13.3-1.6l-15.2,48.3\n\t\t\t\t\t\tc-2.2,6.9-12.2,6.1-13.3-1.1c-1.3-8.8-2.2-17.6-2.7-26.5c-0.4-7.2-10.1-8.9-13.1-2.4c-1.4,3.3-3,6.5-4.6,9.6\n\t\t\t\t\t\tc-2.9,5.7-11.3,4.7-12.7-1.5c-2.5-10.7-4.2-21.5-5.1-32.4c-0.7-7.8-11.8-8.5-13.5-0.9c-3.2,14.6-5.7,29.4-7.4,44.2\n\t\t\t\t\t\tc0,0.1,0,0.3,0,0.4l-1.9,31.2c-0.2,3.9,2.9,7.3,6.8,7.2l200.8-0.8c0.4,0,0.8,0,1.2-0.1l175-32.7\n\t\t\t\t\t\tC1751.7,1099.6,1753.9,1097.1,1754.2,1094z\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<path class=\"st28\" d=\"M1630.8,868.8c-2.1,7.3,3.8,14.3,11.4,13.6c55.4-5.5,110.7-11,166.1-16.5c3.1-0.3,5.6-2.6,6.1-5.7\n\t\t\t\t\t\tc5.9-36,8.3-72.6,7.2-109.1c-0.2-7.3-10.2-9.3-13.1-2.5c-13.2,30.9-26.4,61.7-39.6,92.6c-2.4,5.6-10.5,5.5-12.7-0.3\n\t\t\t\t\t\tc-0.6-1.6-1.4-3.1-2.5-4.3c-6.3-6.6-16.7,3.1-18.8,11.9c-0.7,3.2-1.5,6.8-2.5,10.1c-2.1,6.7-11.7,6.2-13.2-0.7l-5.9-27.4\n\t\t\t\t\t\tc-1.4-6.6-10.6-7.3-13.1-1l-8.3,21.9c-2.7,7-13,5.2-13.2-2.2l-1.7-59.7c-0.2-7.5-10.7-9.2-13.2-2.1c-5.6,15.6-18.5,38.2-29,68.7\n\t\t\t\t\t\tc-0.5,1.4-2.1,6-3.9,12.4C1630.9,868.7,1630.8,868.8,1630.8,868.8z\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g class=\"treesOrangeGroup\">\n\t\t\t\t\t\t<g class=\"treesOrange\">\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1553.2,432.5c0,0.1-0.1,0.3-0.2,0.4\"/>\n\t\t\t\t\t\t\t<rect x=\"1550\" y=\"619.9\" class=\"st24\" width=\"6\" height=\"55\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1554.8,524.4c5.5-5.5,8.8-6.2,10.8-5.5c2.4,0.8,2.6,3.3,6.4,5c1.2,0.5,4.4,2,7.7,0.5\n\t\t\t\t\t\t\t\tc3.3-1.6,4.2-5.2,4.2-5.5c0.8-4.2-2.2-7.6-2.8-8.3c-2.9-3.2-7.4-4.1-11.2-5.5c-1.3-0.5-5.5-2.2-9.6-5.9\n\t\t\t\t\t\t\t\tc-2.5-2.2-4.7-4.3-4.9-7.2c-0.1-2.1,0.9-19,0-19.8c-0.6-0.5-1.6-0.3-2.4-0.1c0,12.4,0,39.8,0,52.1H1554.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1553,519.9v34c-0.1-1.2,0.1-2.1,1.3-2s2.3,0.9,3.4,1.6c3.7,2.3,8.6,3.6,12.2,1.3c1.2-0.8,1.2-1.3,2.8-2\n\t\t\t\t\t\t\t\tc0.5-0.2,2.8-1.3,5.3-0.8c2.7,0.5,2.6,2.3,6,4c1.4,0.7,4.3,2.2,7,1c2-0.9,2.9-2.8,3-3c1.9-4.3-2.5-9.4-3.2-10.2\n\t\t\t\t\t\t\t\tc-2.3-2.6-4.3-3.2-9.8-5.8c-3.4-1.6-10.1-4.7-15-8c-2.9-1.9-6.9-5.1-11-10.3L1553,519.9z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1555.3,595.4c5.5-5.6,8.8-6.1,10.8-5.5c2.5,0.8,2.9,3.3,6.9,5c1.4,0.6,4.3,1.8,7.2,0.5\n\t\t\t\t\t\t\t\tc3.3-1.5,4.1-5.2,4.2-5.5c0.8-4.2-2.2-7.6-2.8-8.3c-1.8-2-3.3-2.4-11.2-5.5c-4.2-1.6-7.7-2.4-10.3-5.2c-3.1-3.4-3.8-7.8-4-9\n\t\t\t\t\t\t\t\tc-0.6-4.5-0.1-7.8-0.1-7.8c0.3-2.1,0.9-4,0-4.8c-0.6-0.5-1.6-0.3-2.4-0.1c0,12.4,0,33.8,0,46.1H1555.3z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1575,451.9C1575,451.9,1575,451.9,1575,451.9c-0.4,1.6-1.5,3.2-3,4c-2.2,1.1-4.5,0.2-5,0\n\t\t\t\t\t\t\t\tc-2.9-1.2-3.1-3.6-5-4c-0.2,0-1.1-0.1-2,0.3c-1.6,0.8-1.5,2.5-3,3.7c-0.6,0.4-1.5,0.9-3,1l0,0c-2,0.1-3.2-0.5-4-1\n\t\t\t\t\t\t\t\tc-1.9-1.3-2-3.5-4-4c-0.8-0.2-1.5-0.1-1.7,0c-2.2,0.5-2.1,2.9-4.3,4c-0.3,0.1-3,1.4-5.7,0c-0.2-0.1-2.5-1.4-3-4\n\t\t\t\t\t\t\t\tc-0.6-3,1.6-5.5,2-6c1.7-1.9,2.9-1.6,8-4c3.9-1.8,6-3.3,7-4c3-2.2,4.2-3.9,4.7-5c0.1-0.1,0.1-0.3,0.2-0.4c0,0.1,0.1,0.3,0.2,0.4\n\t\t\t\t\t\t\t\tc0.5,1.2,1.6,2.8,4.7,5c1,0.7,3.1,2.2,7,4c5.1,2.4,6.3,2.1,8,4C1573.4,446.4,1575.6,448.9,1575,451.9z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1553.3,432.9c-0.1-0.1-0.1-0.3-0.2-0.4\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1551.5,524.4c-5.5-5.5-8.8-6.1-10.8-5.5c-2.5,0.8-2.8,3.3-6.7,5c-1.3,0.6-4.3,1.9-7.4,0.5\n\t\t\t\t\t\t\t\tc-3.3-1.5-4.2-5.2-4.2-5.5c-0.8-4.2,2.2-7.6,2.8-8.3c2.9-3.2,7.4-4.1,11.2-5.5c1.3-0.5,5.5-2.2,9.6-5.9c2.5-2.2,4.7-4.3,4.9-7.2\n\t\t\t\t\t\t\t\tc0.1-2.1-0.9-19,0-19.8c0.6-0.5,1.6-0.3,2.4-0.1c0,12.4,0,39.8,0,52.1H1551.5z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1553.3,519.9v34c0.1-1.2-0.1-2.1-1.3-2s-2.3,0.9-3.4,1.6c-3.7,2.3-8.6,3.6-12.2,1.3\n\t\t\t\t\t\t\t\tc-1.2-0.8-1.2-1.3-2.8-2c-0.5-0.2-2.8-1.3-5.3-0.8c-2.7,0.5-2.6,2.3-6,4c-1.4,0.7-4.3,2.2-7,1c-2-0.9-2.9-2.8-3-3\n\t\t\t\t\t\t\t\tc-1.9-4.3,2.5-9.4,3.2-10.2c2.3-2.6,4.3-3.2,9.8-5.8c3.4-1.6,10.1-4.7,15-8c2.9-1.9,6.9-5.1,11-10.3L1553.3,519.9z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1551,595.4c-5.5-5.5-8.8-6.2-10.8-5.5c-2.4,0.8-2.5,3.3-6.2,5c-1,0.5-4.5,2.1-7.9,0.5\n\t\t\t\t\t\t\t\tc-3.3-1.6-4.1-5.2-4.2-5.5c-0.8-4.2,2.2-7.6,2.8-8.3c1.6-1.8,2.9-2.3,11.2-5.5c3.8-1.5,7.2-2.3,10-5.2c0.8-0.9,3-3.3,4-7\n\t\t\t\t\t\t\t\tc0.4-1.4,1.1-5.2,0.4-9.8c-0.3-2.1-0.9-4,0-4.8c0.6-0.5,1.6-0.3,2.4-0.1c0,12.4,0,33.8,0,46.1H1551z\"/>\n\t\t\t\t\t\t\t<rect x=\"1551\" y=\"445.9\" class=\"st23\" width=\"4\" height=\"177\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1550.8,482.4c-0.7-0.9-1.9-2.3-3.9-3.3c-1.5-0.8-3.3-1.7-5.1-1.3c-2.9,0.7-2.4,3.9-5.7,5.1\n\t\t\t\t\t\t\t\tc-3,1.1-5.9-0.4-6-0.5c-0.4-0.2-2.9-1.7-3.5-4.6c-0.7-3.5,1.8-6.4,2.4-6.9c2.4-2.7,6.2-3.4,9.4-4.6c1.1-0.4,4.6-1.8,8-4.9\n\t\t\t\t\t\t\t\tc2.1-1.9,4-3.6,4.1-6c0.1-1.8-0.8-3.3,0-4c0.5-0.4,1.3-0.3,2-0.1c0,10.4,0,20.7,0,31.1H1550.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1555.5,482.4c0.8-1,2.2-2.4,4.5-3.5c1.6-0.7,3-1.4,4.6-1.1c2.4,0.5,2.4,2.7,5.4,4.1\n\t\t\t\t\t\t\t\tc1.1,0.5,3.7,1.7,6.3,0.5c2.8-1.3,3.5-4.4,3.5-4.6c0.7-3.5-1.8-6.4-2.4-6.9c-2.4-2.7-6.2-3.4-9.4-4.6c-1.1-0.4-4.6-1.8-8-4.9\n\t\t\t\t\t\t\t\tc-2.1-1.9-4-3.6-4.1-6c-0.1-1.8,0.8-3.3,0-4c-0.5-0.4-1.3-0.3-2-0.1c0,10.4,0,20.7,0,31.1H1555.5z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1550.8,622.4c-0.7-0.9-1.9-2.3-3.9-3.3c-1.5-0.8-3.3-1.7-5.1-1.3c-2.9,0.7-2.4,3.9-5.7,5.1\n\t\t\t\t\t\t\t\tc-3,1.1-5.9-0.4-6-0.5c-0.4-0.2-2.9-1.7-3.5-4.6c-0.7-3.5,1.8-6.4,2.4-6.9c2.4-2.7,6.2-3.4,9.4-4.6c1.1-0.4,4.6-1.8,8-4.9\n\t\t\t\t\t\t\t\tc2.1-1.9,4-3.6,4.1-6c0.1-1.8-0.8-3.3,0-4c0.5-0.4,1.3-0.3,2-0.1c0,10.4,0,20.7,0,31.1H1550.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1555.5,622.4c0.8-1,2.2-2.4,4.5-3.5c1.6-0.7,3-1.4,4.6-1.1c2.4,0.5,2.4,2.7,5.4,4.1\n\t\t\t\t\t\t\t\tc1.1,0.5,3.7,1.7,6.3,0.5c2.8-1.3,3.5-4.4,3.5-4.6c0.7-3.5-1.8-6.4-2.4-6.9c-2.4-2.7-6.2-3.4-9.4-4.6c-1.1-0.4-4.6-1.8-8-4.9\n\t\t\t\t\t\t\t\tc-2.1-1.9-4-3.6-4.1-6c-0.1-1.8,0.8-3.3,0-4c-0.5-0.4-1.3-0.3-2-0.1c0,10.4,0,20.7,0,31.1H1555.5z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g class=\"treesOrange\">\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1044.2,572.5c0,0.1-0.1,0.3-0.2,0.4\"/>\n\t\t\t\t\t\t\t<rect x=\"1041\" y=\"759.9\" class=\"st24\" width=\"6\" height=\"55\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1045.8,664.4c5.5-5.5,8.8-6.2,10.8-5.5c2.4,0.8,2.6,3.3,6.4,5c1.2,0.5,4.4,2,7.7,0.5\n\t\t\t\t\t\t\t\tc3.3-1.6,4.2-5.2,4.2-5.5c0.8-4.2-2.2-7.6-2.8-8.3c-2.9-3.2-7.4-4.1-11.2-5.5c-1.3-0.5-5.5-2.2-9.6-5.9\n\t\t\t\t\t\t\t\tc-2.5-2.2-4.7-4.3-4.9-7.2c-0.1-2.1,0.9-19,0-19.8c-0.6-0.5-1.6-0.3-2.4-0.1c0,12.4,0,39.8,0,52.1H1045.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1044,659.9v34c-0.1-1.2,0.1-2.1,1.3-2s2.3,0.9,3.4,1.6c3.7,2.3,8.6,3.6,12.2,1.3c1.2-0.8,1.2-1.3,2.8-2\n\t\t\t\t\t\t\t\tc0.5-0.2,2.8-1.3,5.3-0.8c2.7,0.5,2.6,2.3,6,4c1.4,0.7,4.3,2.2,7,1c2-0.9,2.9-2.8,3-3c1.9-4.3-2.5-9.4-3.2-10.2\n\t\t\t\t\t\t\t\tc-2.3-2.6-4.3-3.2-9.8-5.8c-3.4-1.6-10.1-4.7-15-8c-2.9-1.9-6.9-5.1-11-10.3L1044,659.9z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1046.3,735.4c5.5-5.6,8.8-6.1,10.8-5.5c2.5,0.8,2.9,3.3,6.9,5c1.4,0.6,4.3,1.8,7.2,0.5\n\t\t\t\t\t\t\t\tc3.3-1.5,4.1-5.2,4.2-5.5c0.8-4.2-2.2-7.6-2.8-8.3c-1.8-2-3.3-2.4-11.2-5.5c-4.2-1.6-7.7-2.4-10.3-5.2c-3.1-3.4-3.8-7.8-4-9\n\t\t\t\t\t\t\t\tc-0.6-4.5-0.1-7.8-0.1-7.8c0.3-2.1,0.9-4,0-4.8c-0.6-0.5-1.6-0.3-2.4-0.1c0,12.4,0,33.8,0,46.1H1046.3z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1066,591.9C1066,591.9,1066,591.9,1066,591.9c-0.4,1.6-1.5,3.2-3,4c-2.2,1.1-4.5,0.2-5,0\n\t\t\t\t\t\t\t\tc-2.9-1.2-3.1-3.6-5-4c-0.2,0-1.1-0.1-2,0.3c-1.6,0.8-1.5,2.5-3,3.7c-0.6,0.4-1.5,0.9-3,1l0,0c-2,0.1-3.2-0.5-4-1\n\t\t\t\t\t\t\t\tc-1.9-1.3-2-3.5-4-4c-0.8-0.2-1.5-0.1-1.7,0c-2.2,0.5-2.1,2.9-4.3,4c-0.3,0.1-3,1.4-5.7,0c-0.2-0.1-2.5-1.4-3-4\n\t\t\t\t\t\t\t\tc-0.6-3,1.6-5.5,2-6c1.7-1.9,2.9-1.6,8-4c3.9-1.8,6-3.3,7-4c3-2.2,4.2-3.9,4.7-5c0.1-0.1,0.1-0.3,0.2-0.4c0,0.1,0.1,0.3,0.2,0.4\n\t\t\t\t\t\t\t\tc0.5,1.2,1.6,2.8,4.7,5c1,0.7,3.1,2.2,7,4c5.1,2.4,6.3,2.1,8,4C1064.4,586.4,1066.6,588.9,1066,591.9z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1044.3,572.9c-0.1-0.1-0.1-0.3-0.2-0.4\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1042.5,664.4c-5.5-5.5-8.8-6.1-10.8-5.5c-2.5,0.8-2.8,3.3-6.7,5c-1.3,0.6-4.3,1.9-7.4,0.5\n\t\t\t\t\t\t\t\tc-3.3-1.5-4.2-5.2-4.2-5.5c-0.8-4.2,2.2-7.6,2.8-8.3c2.9-3.2,7.4-4.1,11.2-5.5c1.3-0.5,5.5-2.2,9.6-5.9c2.5-2.2,4.7-4.3,4.9-7.2\n\t\t\t\t\t\t\t\tc0.1-2.1-0.9-19,0-19.8c0.6-0.5,1.6-0.3,2.4-0.1c0,12.4,0,39.8,0,52.1H1042.5z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1044.3,659.9v34c0.1-1.2-0.1-2.1-1.3-2s-2.3,0.9-3.4,1.6c-3.7,2.3-8.6,3.6-12.2,1.3\n\t\t\t\t\t\t\t\tc-1.2-0.8-1.2-1.3-2.8-2c-0.5-0.2-2.8-1.3-5.3-0.8c-2.7,0.5-2.6,2.3-6,4c-1.4,0.7-4.3,2.2-7,1c-2-0.9-2.9-2.8-3-3\n\t\t\t\t\t\t\t\tc-1.9-4.3,2.5-9.4,3.2-10.2c2.3-2.6,4.3-3.2,9.8-5.8c3.4-1.6,10.1-4.7,15-8c2.9-1.9,6.9-5.1,11-10.3L1044.3,659.9z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1042,735.4c-5.5-5.5-8.8-6.2-10.8-5.5c-2.4,0.8-2.5,3.3-6.2,5c-1,0.5-4.5,2.1-7.9,0.5\n\t\t\t\t\t\t\t\tc-3.3-1.6-4.1-5.2-4.2-5.5c-0.8-4.2,2.2-7.6,2.8-8.3c1.6-1.8,2.9-2.3,11.2-5.5c3.8-1.5,7.2-2.3,10-5.2c0.8-0.9,3-3.3,4-7\n\t\t\t\t\t\t\t\tc0.4-1.4,1.1-5.2,0.4-9.8c-0.3-2.1-0.9-4,0-4.8c0.6-0.5,1.6-0.3,2.4-0.1c0,12.4,0,33.8,0,46.1H1042z\"/>\n\t\t\t\t\t\t\t<rect x=\"1042\" y=\"585.9\" class=\"st23\" width=\"4\" height=\"177\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1041.8,622.4c-0.7-0.9-1.9-2.3-3.9-3.3c-1.5-0.8-3.3-1.7-5.1-1.3c-2.9,0.7-2.4,3.9-5.7,5.1\n\t\t\t\t\t\t\t\tc-3,1.1-5.9-0.4-6-0.5c-0.4-0.2-2.9-1.7-3.5-4.6c-0.7-3.5,1.8-6.4,2.4-6.9c2.4-2.7,6.2-3.4,9.4-4.6c1.1-0.4,4.6-1.8,8-4.9\n\t\t\t\t\t\t\t\tc2.1-1.9,4-3.6,4.1-6c0.1-1.8-0.8-3.3,0-4c0.5-0.4,1.3-0.3,2-0.1c0,10.4,0,20.7,0,31.1H1041.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1046.5,622.4c0.8-1,2.2-2.4,4.5-3.5c1.6-0.7,3-1.4,4.6-1.1c2.4,0.5,2.4,2.7,5.4,4.1\n\t\t\t\t\t\t\t\tc1.1,0.5,3.7,1.7,6.3,0.5c2.8-1.3,3.5-4.4,3.5-4.6c0.7-3.5-1.8-6.4-2.4-6.9c-2.4-2.7-6.2-3.4-9.4-4.6c-1.1-0.4-4.6-1.8-8-4.9\n\t\t\t\t\t\t\t\tc-2.1-1.9-4-3.6-4.1-6c-0.1-1.8,0.8-3.3,0-4c-0.5-0.4-1.3-0.3-2-0.1c0,10.4,0,20.7,0,31.1H1046.5z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1041.8,762.4c-0.7-0.9-1.9-2.3-3.9-3.3c-1.5-0.8-3.3-1.7-5.1-1.3c-2.9,0.7-2.4,3.9-5.7,5.1\n\t\t\t\t\t\t\t\tc-3,1.1-5.9-0.4-6-0.5c-0.4-0.2-2.9-1.7-3.5-4.6c-0.7-3.5,1.8-6.4,2.4-6.9c2.4-2.7,6.2-3.4,9.4-4.6c1.1-0.4,4.6-1.8,8-4.9\n\t\t\t\t\t\t\t\tc2.1-1.9,4-3.6,4.1-6c0.1-1.8-0.8-3.3,0-4c0.5-0.4,1.3-0.3,2-0.1c0,10.4,0,20.7,0,31.1H1041.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1046.5,762.4c0.8-1,2.2-2.4,4.5-3.5c1.6-0.7,3-1.4,4.6-1.1c2.4,0.5,2.4,2.7,5.4,4.1\n\t\t\t\t\t\t\t\tc1.1,0.5,3.7,1.7,6.3,0.5c2.8-1.3,3.5-4.4,3.5-4.6c0.7-3.5-1.8-6.4-2.4-6.9c-2.4-2.7-6.2-3.4-9.4-4.6c-1.1-0.4-4.6-1.8-8-4.9\n\t\t\t\t\t\t\t\tc-2.1-1.9-4-3.6-4.1-6c-0.1-1.8,0.8-3.3,0-4c-0.5-0.4-1.3-0.3-2-0.1c0,10.4,0,20.7,0,31.1H1046.5z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g class=\"treesOrange\">\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1234.2,843.5c0,0.1-0.1,0.3-0.2,0.4\"/>\n\t\t\t\t\t\t\t<rect x=\"1231\" y=\"1030.9\" class=\"st24\" width=\"6\" height=\"55\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1235.8,935.4c5.5-5.5,8.8-6.2,10.8-5.5c2.4,0.8,2.6,3.3,6.4,5c1.2,0.5,4.4,2,7.7,0.5\n\t\t\t\t\t\t\t\tc3.3-1.6,4.2-5.2,4.2-5.5c0.8-4.2-2.2-7.6-2.8-8.3c-2.9-3.2-7.4-4.1-11.2-5.5c-1.3-0.5-5.5-2.2-9.6-5.9\n\t\t\t\t\t\t\t\tc-2.5-2.2-4.7-4.3-4.9-7.2c-0.1-2.1,0.9-19,0-19.8c-0.6-0.5-1.6-0.3-2.4-0.1c0,12.4,0,39.8,0,52.1H1235.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1234,930.9v34c-0.1-1.2,0.1-2.1,1.3-2s2.3,0.9,3.4,1.6c3.7,2.3,8.6,3.6,12.2,1.3c1.2-0.8,1.2-1.3,2.8-2\n\t\t\t\t\t\t\t\tc0.5-0.2,2.8-1.3,5.3-0.8c2.7,0.5,2.6,2.3,6,4c1.4,0.7,4.3,2.2,7,1c2-0.9,2.9-2.8,3-3c1.9-4.3-2.5-9.4-3.2-10.2\n\t\t\t\t\t\t\t\tc-2.3-2.6-4.3-3.2-9.8-5.8c-3.4-1.6-10.1-4.7-15-8c-2.9-1.9-6.9-5.1-11-10.3L1234,930.9z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1236.3,1006.4c5.5-5.6,8.8-6.1,10.8-5.5c2.5,0.8,2.9,3.3,6.9,5c1.4,0.6,4.3,1.8,7.2,0.5\n\t\t\t\t\t\t\t\tc3.3-1.5,4.1-5.2,4.2-5.5c0.8-4.2-2.2-7.6-2.8-8.3c-1.8-2-3.3-2.4-11.2-5.5c-4.2-1.6-7.7-2.4-10.3-5.2c-3.1-3.4-3.8-7.8-4-9\n\t\t\t\t\t\t\t\tc-0.6-4.5-0.1-7.8-0.1-7.8c0.3-2.1,0.9-4,0-4.8c-0.6-0.5-1.6-0.3-2.4-0.1c0,12.4,0,33.8,0,46.1H1236.3z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1256,862.9C1256,862.9,1256,862.9,1256,862.9c-0.4,1.6-1.5,3.2-3,4c-2.2,1.1-4.5,0.2-5,0\n\t\t\t\t\t\t\t\tc-2.9-1.2-3.1-3.6-5-4c-0.2,0-1.1-0.1-2,0.3c-1.6,0.8-1.5,2.5-3,3.7c-0.6,0.4-1.5,0.9-3,1l0,0c-2,0.1-3.2-0.5-4-1\n\t\t\t\t\t\t\t\tc-1.9-1.3-2-3.5-4-4c-0.8-0.2-1.5-0.1-1.7,0c-2.2,0.5-2.1,2.9-4.3,4c-0.3,0.1-3,1.4-5.7,0c-0.2-0.1-2.5-1.4-3-4\n\t\t\t\t\t\t\t\tc-0.6-3,1.6-5.5,2-6c1.7-1.9,2.9-1.6,8-4c3.9-1.8,6-3.3,7-4c3-2.2,4.2-3.9,4.7-5c0.1-0.1,0.1-0.3,0.2-0.4c0,0.1,0.1,0.3,0.2,0.4\n\t\t\t\t\t\t\t\tc0.5,1.2,1.6,2.8,4.7,5c1,0.7,3.1,2.2,7,4c5.1,2.4,6.3,2.1,8,4C1254.4,857.4,1256.6,859.9,1256,862.9z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1234.3,843.9c-0.1-0.1-0.1-0.3-0.2-0.4\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1232.5,935.4c-5.5-5.5-8.8-6.1-10.8-5.5c-2.5,0.8-2.8,3.3-6.7,5c-1.3,0.6-4.3,1.9-7.4,0.5\n\t\t\t\t\t\t\t\tc-3.3-1.5-4.2-5.2-4.2-5.5c-0.8-4.2,2.2-7.6,2.8-8.3c2.9-3.2,7.4-4.1,11.2-5.5c1.3-0.5,5.5-2.2,9.6-5.9c2.5-2.2,4.7-4.3,4.9-7.2\n\t\t\t\t\t\t\t\tc0.1-2.1-0.9-19,0-19.8c0.6-0.5,1.6-0.3,2.4-0.1c0,12.4,0,39.8,0,52.1H1232.5z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1234.3,930.9v34c0.1-1.2-0.1-2.1-1.3-2s-2.3,0.9-3.4,1.6c-3.7,2.3-8.6,3.6-12.2,1.3\n\t\t\t\t\t\t\t\tc-1.2-0.8-1.2-1.3-2.8-2c-0.5-0.2-2.8-1.3-5.3-0.8c-2.7,0.5-2.6,2.3-6,4c-1.4,0.7-4.3,2.2-7,1c-2-0.9-2.9-2.8-3-3\n\t\t\t\t\t\t\t\tc-1.9-4.3,2.5-9.4,3.2-10.2c2.3-2.6,4.3-3.2,9.8-5.8c3.4-1.6,10.1-4.7,15-8c2.9-1.9,6.9-5.1,11-10.3L1234.3,930.9z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1232,1006.4c-5.5-5.5-8.8-6.2-10.8-5.5c-2.4,0.8-2.5,3.3-6.2,5c-1,0.5-4.5,2.1-7.9,0.5\n\t\t\t\t\t\t\t\tc-3.3-1.6-4.1-5.2-4.2-5.5c-0.8-4.2,2.2-7.6,2.8-8.3c1.6-1.8,2.9-2.3,11.2-5.5c3.8-1.5,7.2-2.3,10-5.2c0.8-0.9,3-3.3,4-7\n\t\t\t\t\t\t\t\tc0.4-1.4,1.1-5.2,0.4-9.8c-0.3-2.1-0.9-4,0-4.8c0.6-0.5,1.6-0.3,2.4-0.1c0,12.4,0,33.8,0,46.1H1232z\"/>\n\t\t\t\t\t\t\t<rect x=\"1232\" y=\"856.9\" class=\"st23\" width=\"4\" height=\"177\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1231.8,893.4c-0.7-0.9-1.9-2.3-3.9-3.3c-1.5-0.8-3.3-1.7-5.1-1.3c-2.9,0.7-2.4,3.9-5.7,5.1\n\t\t\t\t\t\t\t\tc-3,1.1-5.9-0.4-6-0.5c-0.4-0.2-2.9-1.7-3.5-4.6c-0.7-3.5,1.8-6.4,2.4-6.9c2.4-2.7,6.2-3.4,9.4-4.6c1.1-0.4,4.6-1.8,8-4.9\n\t\t\t\t\t\t\t\tc2.1-1.9,4-3.6,4.1-6c0.1-1.8-0.8-3.3,0-4c0.5-0.4,1.3-0.3,2-0.1c0,10.4,0,20.7,0,31.1H1231.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1236.5,893.4c0.8-1,2.2-2.4,4.5-3.5c1.6-0.7,3-1.4,4.6-1.1c2.4,0.5,2.4,2.7,5.4,4.1\n\t\t\t\t\t\t\t\tc1.1,0.5,3.7,1.7,6.3,0.5c2.8-1.3,3.5-4.4,3.5-4.6c0.7-3.5-1.8-6.4-2.4-6.9c-2.4-2.7-6.2-3.4-9.4-4.6c-1.1-0.4-4.6-1.8-8-4.9\n\t\t\t\t\t\t\t\tc-2.1-1.9-4-3.6-4.1-6c-0.1-1.8,0.8-3.3,0-4c-0.5-0.4-1.3-0.3-2-0.1c0,10.4,0,20.7,0,31.1H1236.5z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1231.8,1033.4c-0.7-0.9-1.9-2.3-3.9-3.3c-1.5-0.8-3.3-1.7-5.1-1.3c-2.9,0.7-2.4,3.9-5.7,5.1\n\t\t\t\t\t\t\t\tc-3,1.1-5.9-0.4-6-0.5c-0.4-0.2-2.9-1.7-3.5-4.6c-0.7-3.5,1.8-6.4,2.4-6.9c2.4-2.7,6.2-3.4,9.4-4.6c1.1-0.4,4.6-1.8,8-4.9\n\t\t\t\t\t\t\t\tc2.1-1.9,4-3.6,4.1-6c0.1-1.8-0.8-3.3,0-4c0.5-0.4,1.3-0.3,2-0.1c0,10.4,0,20.7,0,31.1H1231.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1236.5,1033.4c0.8-1,2.2-2.4,4.5-3.5c1.6-0.7,3-1.4,4.6-1.1c2.4,0.5,2.4,2.7,5.4,4.1\n\t\t\t\t\t\t\t\tc1.1,0.5,3.7,1.7,6.3,0.5c2.8-1.3,3.5-4.4,3.5-4.6c0.7-3.5-1.8-6.4-2.4-6.9c-2.4-2.7-6.2-3.4-9.4-4.6c-1.1-0.4-4.6-1.8-8-4.9\n\t\t\t\t\t\t\t\tc-2.1-1.9-4-3.6-4.1-6c-0.1-1.8,0.8-3.3,0-4c-0.5-0.4-1.3-0.3-2-0.1c0,10.4,0,20.7,0,31.1H1236.5z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g class=\"treesOrange\">\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1816.2,656.5c0,0.1-0.1,0.3-0.2,0.4\"/>\n\t\t\t\t\t\t\t<rect x=\"1813\" y=\"843.9\" class=\"st24\" width=\"6\" height=\"55\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1817.8,748.4c5.5-5.5,8.8-6.2,10.8-5.5c2.4,0.8,2.6,3.3,6.4,5c1.2,0.5,4.4,2,7.7,0.5\n\t\t\t\t\t\t\t\tc3.3-1.6,4.2-5.2,4.2-5.5c0.8-4.2-2.2-7.6-2.8-8.3c-2.9-3.2-7.4-4.1-11.2-5.5c-1.3-0.5-5.5-2.2-9.6-5.9\n\t\t\t\t\t\t\t\tc-2.5-2.2-4.7-4.3-4.9-7.2c-0.1-2.1,0.9-19,0-19.8c-0.6-0.5-1.6-0.3-2.4-0.1c0,12.4,0,39.8,0,52.1H1817.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1816,743.9v34c-0.1-1.2,0.1-2.1,1.3-2s2.3,0.9,3.4,1.6c3.7,2.3,8.6,3.6,12.2,1.3c1.2-0.8,1.2-1.3,2.8-2\n\t\t\t\t\t\t\t\tc0.5-0.2,2.8-1.3,5.3-0.8c2.7,0.5,2.6,2.3,6,4c1.4,0.7,4.3,2.2,7,1c2-0.9,2.9-2.8,3-3c1.9-4.3-2.5-9.4-3.2-10.2\n\t\t\t\t\t\t\t\tc-2.3-2.6-4.3-3.2-9.8-5.8c-3.4-1.6-10.1-4.7-15-8c-2.9-1.9-6.9-5.1-11-10.3L1816,743.9z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1818.3,819.4c5.5-5.6,8.8-6.1,10.8-5.5c2.5,0.8,2.9,3.3,6.9,5c1.4,0.6,4.3,1.8,7.2,0.5\n\t\t\t\t\t\t\t\tc3.3-1.5,4.1-5.2,4.2-5.5c0.8-4.2-2.2-7.6-2.8-8.3c-1.8-2-3.3-2.4-11.2-5.5c-4.2-1.6-7.7-2.4-10.3-5.2c-3.1-3.4-3.8-7.8-4-9\n\t\t\t\t\t\t\t\tc-0.6-4.5-0.1-7.8-0.1-7.8c0.3-2.1,0.9-4,0-4.8c-0.6-0.5-1.6-0.3-2.4-0.1c0,12.4,0,33.8,0,46.1H1818.3z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1838,675.9C1838,675.9,1838,675.9,1838,675.9c-0.4,1.6-1.5,3.2-3,4c-2.2,1.1-4.5,0.2-5,0\n\t\t\t\t\t\t\t\tc-2.9-1.2-3.1-3.6-5-4c-0.2,0-1.1-0.1-2,0.3c-1.6,0.8-1.5,2.5-3,3.7c-0.6,0.4-1.5,0.9-3,1l0,0c-2,0.1-3.2-0.5-4-1\n\t\t\t\t\t\t\t\tc-1.9-1.3-2-3.5-4-4c-0.8-0.2-1.5-0.1-1.7,0c-2.2,0.5-2.1,2.9-4.3,4c-0.3,0.1-3,1.4-5.7,0c-0.2-0.1-2.5-1.4-3-4\n\t\t\t\t\t\t\t\tc-0.6-3,1.6-5.5,2-6c1.7-1.9,2.9-1.6,8-4c3.9-1.8,6-3.3,7-4c3-2.2,4.2-3.9,4.7-5c0.1-0.1,0.1-0.3,0.2-0.4c0,0.1,0.1,0.3,0.2,0.4\n\t\t\t\t\t\t\t\tc0.5,1.2,1.6,2.8,4.7,5c1,0.7,3.1,2.2,7,4c5.1,2.4,6.3,2.1,8,4C1836.4,670.4,1838.6,672.9,1838,675.9z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1816.3,656.9c-0.1-0.1-0.1-0.3-0.2-0.4\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1814.5,748.4c-5.5-5.5-8.8-6.1-10.8-5.5c-2.5,0.8-2.8,3.3-6.7,5c-1.3,0.6-4.3,1.9-7.4,0.5\n\t\t\t\t\t\t\t\tc-3.3-1.5-4.2-5.2-4.2-5.5c-0.8-4.2,2.2-7.6,2.8-8.3c2.9-3.2,7.4-4.1,11.2-5.5c1.3-0.5,5.5-2.2,9.6-5.9c2.5-2.2,4.7-4.3,4.9-7.2\n\t\t\t\t\t\t\t\tc0.1-2.1-0.9-19,0-19.8c0.6-0.5,1.6-0.3,2.4-0.1c0,12.4,0,39.8,0,52.1H1814.5z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1816.3,743.9v34c0.1-1.2-0.1-2.1-1.3-2s-2.3,0.9-3.4,1.6c-3.7,2.3-8.6,3.6-12.2,1.3\n\t\t\t\t\t\t\t\tc-1.2-0.8-1.2-1.3-2.8-2c-0.5-0.2-2.8-1.3-5.3-0.8c-2.7,0.5-2.6,2.3-6,4c-1.4,0.7-4.3,2.2-7,1c-2-0.9-2.9-2.8-3-3\n\t\t\t\t\t\t\t\tc-1.9-4.3,2.5-9.4,3.2-10.2c2.3-2.6,4.3-3.2,9.8-5.8c3.4-1.6,10.1-4.7,15-8c2.9-1.9,6.9-5.1,11-10.3L1816.3,743.9z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1814,819.4c-5.5-5.5-8.8-6.2-10.8-5.5c-2.4,0.8-2.5,3.3-6.2,5c-1,0.5-4.5,2.1-7.9,0.5\n\t\t\t\t\t\t\t\tc-3.3-1.6-4.1-5.2-4.2-5.5c-0.8-4.2,2.2-7.6,2.8-8.3c1.6-1.8,2.9-2.3,11.2-5.5c3.8-1.5,7.2-2.3,10-5.2c0.8-0.9,3-3.3,4-7\n\t\t\t\t\t\t\t\tc0.4-1.4,1.1-5.2,0.4-9.8c-0.3-2.1-0.9-4,0-4.8c0.6-0.5,1.6-0.3,2.4-0.1c0,12.4,0,33.8,0,46.1H1814z\"/>\n\t\t\t\t\t\t\t<rect x=\"1814\" y=\"669.9\" class=\"st23\" width=\"4\" height=\"177\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1813.8,706.4c-0.7-0.9-1.9-2.3-3.9-3.3c-1.5-0.8-3.3-1.7-5.1-1.3c-2.9,0.7-2.4,3.9-5.7,5.1\n\t\t\t\t\t\t\t\tc-3,1.1-5.9-0.4-6-0.5c-0.4-0.2-2.9-1.7-3.5-4.6c-0.7-3.5,1.8-6.4,2.4-6.9c2.4-2.7,6.2-3.4,9.4-4.6c1.1-0.4,4.6-1.8,8-4.9\n\t\t\t\t\t\t\t\tc2.1-1.9,4-3.6,4.1-6c0.1-1.8-0.8-3.3,0-4c0.5-0.4,1.3-0.3,2-0.1c0,10.4,0,20.7,0,31.1H1813.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1818.5,706.4c0.8-1,2.2-2.4,4.5-3.5c1.6-0.7,3-1.4,4.6-1.1c2.4,0.5,2.4,2.7,5.4,4.1\n\t\t\t\t\t\t\t\tc1.1,0.5,3.7,1.7,6.3,0.5c2.8-1.3,3.5-4.4,3.5-4.6c0.7-3.5-1.8-6.4-2.4-6.9c-2.4-2.7-6.2-3.4-9.4-4.6c-1.1-0.4-4.6-1.8-8-4.9\n\t\t\t\t\t\t\t\tc-2.1-1.9-4-3.6-4.1-6c-0.1-1.8,0.8-3.3,0-4c-0.5-0.4-1.3-0.3-2-0.1c0,10.4,0,20.7,0,31.1H1818.5z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1813.8,846.4c-0.7-0.9-1.9-2.3-3.9-3.3c-1.5-0.8-3.3-1.7-5.1-1.3c-2.9,0.7-2.4,3.9-5.7,5.1\n\t\t\t\t\t\t\t\tc-3,1.1-5.9-0.4-6-0.5c-0.4-0.2-2.9-1.7-3.5-4.6c-0.7-3.5,1.8-6.4,2.4-6.9c2.4-2.7,6.2-3.4,9.4-4.6c1.1-0.4,4.6-1.8,8-4.9\n\t\t\t\t\t\t\t\tc2.1-1.9,4-3.6,4.1-6c0.1-1.8-0.8-3.3,0-4c0.5-0.4,1.3-0.3,2-0.1c0,10.4,0,20.7,0,31.1H1813.8z\"/>\n\t\t\t\t\t\t\t<path class=\"st23\" d=\"M1818.5,846.4c0.8-1,2.2-2.4,4.5-3.5c1.6-0.7,3-1.4,4.6-1.1c2.4,0.5,2.4,2.7,5.4,4.1\n\t\t\t\t\t\t\t\tc1.1,0.5,3.7,1.7,6.3,0.5c2.8-1.3,3.5-4.4,3.5-4.6c0.7-3.5-1.8-6.4-2.4-6.9c-2.4-2.7-6.2-3.4-9.4-4.6c-1.1-0.4-4.6-1.8-8-4.9\n\t\t\t\t\t\t\t\tc-2.1-1.9-4-3.6-4.1-6c-0.1-1.8,0.8-3.3,0-4c-0.5-0.4-1.3-0.3-2-0.1c0,10.4,0,20.7,0,31.1H1818.5z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<path class=\"st27\" d=\"M1233.5,823.2c-0.3,0-0.7,0-1,0l-142.2-14.4c-2.5-0.2-4.5-2.1-4.9-4.5c-4.7-28.9-6.7-58.3-5.8-87.6\n\t\t\t\t\t\tc0.2-5.9,8.2-7.4,10.5-2c10.6,24.8,21.2,49.6,31.8,74.3c1.9,4.5,8.4,4.4,10.2-0.2c0.5-1.3,1.1-2.5,2-3.4c5-5.3,13.4,2.5,15.1,9.6\n\t\t\t\t\t\tc0.6,2.6,1.2,5.4,2,8.1c1.7,5.3,9.4,4.9,10.6-0.5l4.7-22c1.2-5.3,8.5-5.9,10.5-0.8l6.7,17.6c2.1,5.6,10.4,4.2,10.6-1.8l1.4-47.9\n\t\t\t\t\t\tc0.2-6.1,8.6-7.4,10.6-1.7c7.4,20.8,15.7,41.3,26.1,60.6c2.5,4.6,9.3,3.4,10.2-1.7\"/>\n\t\t\t\t\t</g>\n\t\t\t\t</g>\n\t\t\n    \n\t\t\t\t<g class=\"frontClouds\">\n\t\t\t\t\t<g class=\"st39 blueCloudGroup\">\n\t\t\t\t\t\t<g class=\"blueCloudRight\">\n\t\t\t\t\t\t\t<path class=\"st30\" d=\"M1898.5,730.9c-114.5-13.7-230.3-15.9-345.2-6.7c-15.2,1.2-30.9,2.6-45.5-1.9\n\t\t\t\t\t\t\t\tc-14.6-4.5-28.1-16.4-29.4-31.7c-0.6-7.5,2.5-16,9.4-19.1c5.5-2.4,11.8-1,17.4,1.2c10.8,4.3,20.5,11.2,31.6,14.7\n\t\t\t\t\t\t\t\tc11.1,3.5,24.8,2.7,32.2-6.3c5.1-6.2,5.9-14.8,7.6-22.7c6.9-32.5,33.2-60,65.3-68.5s68.5,2.6,90.6,27.4\n\t\t\t\t\t\t\t\tc22.5,25.4,33.8,65.4,66.7,73.6c17,4.3,34.6-1.9,51.5-6.7c16.9-4.7,36.3-7.6,50.9,2.1c14.6,9.7,16.3,36.8-0.4,42.3\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g class=\"blueCloudLeft\">\n\t\t\t\t\t\t\t<path class=\"st30\" d=\"M1293,911.3c-114.8-11.1-230.6-10.8-345.3,1c-15.2,1.6-30.8,3.3-45.5-0.9c-14.7-4.2-28.4-15.8-30.1-31\n\t\t\t\t\t\t\t\tc-0.8-7.5,2.1-16.1,8.9-19.3c5.4-2.5,11.8-1.2,17.4,0.8c10.9,4,20.7,10.7,31.9,14s24.9,2.2,32-7c5-6.3,5.6-14.9,7.1-22.8\n\t\t\t\t\t\t\t\tc6.2-32.6,31.8-60.7,63.8-69.9s68.6,1,91.2,25.4c23.1,24.8,35.3,64.6,68.3,72.1c17.1,3.9,34.6-2.7,51.4-7.8\n\t\t\t\t\t\t\t\tc16.8-5.1,36.1-8.4,50.9,1s17.1,36.4,0.6,42.3\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g class=\"blueCloudLeft\">\n\t\t\t\t\t\t\t<path class=\"st30\" d=\"M1600.9,987.6c113.7-19.1,229.3-26.9,344.5-23.2c15.3,0.5,31,1.1,45.4-4.1c14.4-5.2,27.3-17.7,27.8-33\n\t\t\t\t\t\t\t\tc0.3-7.6-3.2-15.9-10.3-18.6c-5.6-2.2-11.9-0.4-17.3,2.1c-10.6,4.8-19.9,12.2-30.8,16.2c-10.9,4.1-24.7,3.9-32.5-4.7\n\t\t\t\t\t\t\t\tc-5.4-6-6.6-14.5-8.7-22.3c-8.5-32.1-36-58.3-68.5-65.3c-32.5-6.9-68.3,5.8-89.1,31.7c-21.3,26.4-30.6,66.9-63.1,76.7\n\t\t\t\t\t\t\t\tc-16.8,5.1-34.7-0.3-51.8-4.2c-17.1-3.9-36.6-5.8-50.7,4.6c-14.1,10.4-14.5,37.5,2.4,42.2\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g class=\"pinkCloudGroup\">\n\t\t\t\t\t\t<g class=\"st39 pinkCloud\">\n\t\t\t\t\t\t\t<path class=\"st40\" d=\"M587,428.9c55.8-1.5,195.2,2.2,531.6,20.2c1-49.5-49.2-87.6-98.5-92.2s-97.2,14.9-143.4,32.8\n\t\t\t\t\t\t\t\tc-10.7,4.1-21.9,8.2-33.2,6.7c-12.7-1.7-23.4-10.2-33-18.7c-33.4-29.4-63.3-62.6-89.1-98.9c-7.9-11.1-16-23.1-28.4-28.7\n\t\t\t\t\t\t\t\tc-26.3-12-56.9,11.4-66.8,38.6c-9.9,27.2-6.8,57.2-11.1,85.8c-0.9,5.6-2.2,11.6-6.4,15.5c-5.2,4.9-11.6,4.6-19.3,5.3\n\t\t\t\t\t\t\t\tc-16.7,1.5-28.5,6.5-47.5,14.6c-12.6,5.4-22.5,9.6-22,13C521.1,430.9,577,429.2,587,428.9z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g class=\"st39 pinkCloud\">\n\t\t\t\t\t\t\t<path class=\"st40\" d=\"M2147.6,385.1c13.1-23.2,8.1-55-11.5-73c-19.6-18-51.7-20.4-73.7-5.4c-27,18.4-44.3,60.2-76.5,54.8\n\t\t\t\t\t\t\t\tc-11.5-1.9-20.9-10.1-29.5-17.9c-58.1-52.8-115.8-108.5-187.3-141c-30.8-14-69.1-22.7-96.8-3.2c-20.1,14.1-29.1,40.2-28.3,64.8\n\t\t\t\t\t\t\t\tc0.8,24.5,10.1,48,20.2,70.3c-50.3,8.9-101.8,11.1-152.6,6.6c-16.3-1.4-39.2,2-39.1,18.3c0.1,9.6,19.7,18.8,26.9,22\n\t\t\t\t\t\t\t\tC1555,406.1,1946.1,393.2,2147.6,385.1z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t</g>\n\t\t\t\t\t\n\t\t\t\t<g class=\"seaRocks\">\n\t\t\t\t\t<g class=\"st29\">\n\t\t\t\t\t\t<path class=\"st30\" d=\"M1083,1145.1c49.7-4.9,100.2-0.8,148.5,12.2c65.1,17.5,128,51,195.3,47.4c30.5-1.7,60.1-11,89.9-17.6\n\t\t\t\t\t\t\tc78.6-17.4,161.1-16.2,237.9-40.4l55.5,14.3l-281,78l-287,20L1083,1145.1z\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<path class=\"st32\" d=\"M968.5,1292.8c-2.2,2-5.8,2.1-7,2c-6.9-0.4-33.8-0.6-73.5-0.7c-15.1,0-32.1,0-50.5-0.1\n\t\t\t\t\t\t\t\tc-4.5,0-7.2-5.1-4.6-8.8c8-11.3,20.7-19.3,34.5-21.1c3.3-0.4,6.8-0.6,9.9-1.9c2.8-1.2,5-3.2,7.3-5.2c5.5-4.7,12-8.8,18.8-11.6\n\t\t\t\t\t\t\t\tc5.2-2.2,10.7-3.5,16-3.6c4.5-0.1,9,0.6,13.3,2.5c8.9,3.8,15.4,11.6,21.4,19.2c3.9,4.8,7.8,9.7,11.7,14.5\n\t\t\t\t\t\t\t\tC969.2,1282.4,972.6,1289.1,968.5,1292.8z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<path class=\"st9\" d=\"M919.3,1241.9c-11.8,16.6-22.3,34.1-31.4,52.3c-15.1,0-32.1,0-50.5-0.1c-4.5,0-7.2-5.1-4.6-8.8\n\t\t\t\t\t\t\t\tc8-11.3,20.7-19.3,34.5-21.1c3.3-0.4,6.8-0.6,9.9-1.9c2.8-1.2,5-3.2,7.3-5.2c5.5-4.7,12-8.8,18.8-11.6\n\t\t\t\t\t\t\t\tC908.5,1243.4,913.9,1242,919.3,1241.9z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<path class=\"st32\" d=\"M1894.6,1140.1c-1.9,1.8-5,1.8-6.1,1.8c-6-0.3-29.4-0.5-63.9-0.6c-13.1,0-27.9,0-43.9-0.1\n\t\t\t\t\t\t\t\tc-3.9,0-6.3-4.4-4-7.6c6.9-9.8,18-16.8,29.9-18.4c2.9-0.4,5.9-0.5,8.6-1.6c2.4-1,4.4-2.8,6.4-4.5c4.8-4,10.4-7.7,16.3-10.1\n\t\t\t\t\t\t\t\tc4.5-1.9,9.3-3.1,13.9-3.2c3.9-0.1,7.8,0.6,11.5,2.1c7.7,3.3,13.3,10.1,18.6,16.7c3.4,4.2,6.8,8.4,10.2,12.6\n\t\t\t\t\t\t\t\tC1895.3,1131.1,1898.2,1136.9,1894.6,1140.1z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<path class=\"st9\" d=\"M1851.9,1095.9c-10.2,14.4-19.4,29.6-27.3,45.4c-13.1,0-27.9,0-43.9-0.1c-3.9,0-6.3-4.4-4-7.6\n\t\t\t\t\t\t\t\tc6.9-9.8,18-16.8,29.9-18.4c2.9-0.4,5.9-0.5,8.6-1.6c2.4-1,4.4-2.8,6.4-4.5c4.8-4,10.4-7.7,16.3-10.1\n\t\t\t\t\t\t\t\tC1842.5,1097.2,1847.2,1096,1851.9,1095.9z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t\t<path class=\"st32\" d=\"M1397,1206.9h-55v-0.5c0-15.2,12.3-27.5,27.5-27.5l0,0c15.2,0,27.5,12.3,27.5,27.5V1206.9z\"/>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<path class=\"st9\" d=\"M1389.1,1209.6c1.4,1.3,3.6,1.3,4.4,1.3c4.3-0.2,21.1-0.4,45.7-0.4c9.4,0,20,0,31.4,0\n\t\t\t\t\t\t\t\tc2.8,0,4.5-3.2,2.9-5.5c-5-7-12.9-12-21.4-13.1c-2.1-0.3-4.2-0.4-6.2-1.2c-1.7-0.7-3.1-2-4.6-3.2c-3.4-2.9-7.5-5.5-11.7-7.2\n\t\t\t\t\t\t\t\tc-3.3-1.3-6.6-2.2-10-2.3c-2.8-0.1-5.6,0.4-8.3,1.5c-5.5,2.4-9.6,7.2-13.3,11.9c-2.4,3-4.9,6-7.3,9\n\t\t\t\t\t\t\t\tC1388.7,1203.1,1386.6,1207.3,1389.1,1209.6z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<path class=\"st32\" d=\"M1419.7,1177.9c7.3,10.3,13.9,21.2,19.5,32.5c9.4,0,20,0,31.4,0c2.8,0,4.5-3.2,2.9-5.5\n\t\t\t\t\t\t\t\tc-5-7-12.9-12-21.4-13.1c-2.1-0.3-4.2-0.4-6.2-1.2c-1.7-0.7-3.1-2-4.6-3.2c-3.4-2.9-7.5-5.5-11.7-7.2\n\t\t\t\t\t\t\t\tC1426.4,1178.8,1423.1,1178,1419.7,1177.9z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<path class=\"st9\" d=\"M1139.8,1131.2v0.7h-78.6v-0.7c0-21.7,17.6-39.3,39.3-39.3c2.1,0,4.1,0.2,6.1,0.5c8.4,1.3,15.9,5.3,21.6,11\n\t\t\t\t\t\t\tC1135.4,1110.5,1139.8,1120.4,1139.8,1131.2z\"/>\n\t\t\t\t\t</g>\n\t\t\t\t</g>\n\n\t\t\t\t<g class=\"sunRays\">\n\t\t\t\t\t<polygon class=\"st41 sunRayLeft\" points=\"1557.8,4.9 862.9,1057.4 980.9,1079 1476.4,316.4 1485.2,302.5 1485.2,302.5 1673.8,4.9 \t\t\t\"/>\n\t\t\t\t\t<polygon class=\"st42  sunRayRight\" points=\"1924.7,4.9 1203.7,1171.7 1085.8,1150.1 1809.7,4.9 \t\t\t\"/>\n\t\t\t\t\t<polygon class=\"st43  sunRayLeft\" points=\"1289.4,1188.5 2042.8,0 2124,0 1374,1210.1 \t\t\t\"/>\n\t\t\t\t\t<polygon class=\"st44  sunRayRight\" points=\"1128.8,4.9 453,1071 340.1,1050.4 1018.9,4.9 \t\t\t\"/>\n\t\t\t\t\t<polygon class=\"st44 sunRayLeft\" points=\"2879.8,8.9 2204,1075 2091.1,1054.4 2769.9,8.9 \t\t\t\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t</g>\n\n  \t\t<g>\n\t\t\t<g class=\"st65 canoeReflection\">\n\t\t\t\t<path class=\"st76\" d=\"M1334,1444c1.1,3.1,2.3,5.2,4,7c1.1,1.2,2.2,2.4,4,3c4.3,1.5,8.5-1.6,9-2c-1.1-0.9-7.2-6.2-7-14\n\t\t\t\t\tc0.2-7.7,6.7-12.6,10-15c9.8-7.3,20.6-7.8,36-8c20.2-0.3,35-0.1,43,0c5.1,0.1,27.3,0.3,50.5,0.5c0,0,18.5,0.1,40.5,6.5\n\t\t\t\t\tc3.2,0.9,8.1,2.5,12,7c6.1,7,5.3,16.3,5,19c1.9,1.1,5,2.5,9,3c2.2,0.3,3.5,0.4,5,0c5.9-1.8,7.6-11.5,8-14c1-5.9,0.1-10.5-1-16\n\t\t\t\t\tc-1-5-2.9-13.3-9-22c0,0-3.1-4.4-7-8c-14.4-13.3-68.3-7.1-109-7c0,0-74.2,0.1-89,12c-3.9,3.2-7,7-7,7c-3.7,4.6-5.5,8.8-6,10\n\t\t\t\t\tc-3.2,7.7-3.1,14.3-3,19C1332.1,1437.8,1333.2,1441.6,1334,1444z\"/>\n\t\t\t\t<path class=\"st77\" d=\"M1535.5,1430.5c-1.7-2.3-4.6-5.3-11.5-8.5c-10.9-5.1-40.5-6.5-40.5-6.5l0,0c-23.2-0.1-45.4-0.4-50.5-0.5\n\t\t\t\t\tc-8-0.1-22.8-0.3-43,0c-15.4,0.2-26.2,0.7-36,8c-3.3,2.4-9.8,7.3-10,15c-0.2,5.8,3.2,10.2,5.4,12.5c0.6,0.6,1.5,0.3,1.8-0.5\n\t\t\t\t\tc0.4-1.3,0.8-2.8,1.4-4.5c0.7-2.1,2.9-8.1,6-12c4.4-5.5,11.3-7.1,16-8c27.4-5.4,46-5,46-5c22,0.5,45.5-0.6,92,1\n\t\t\t\t\tc3,0.1,10.3,0.4,17,5c4.2,2.8,6.4,6,7,7c3.5,5.3,3.9,10.6,4,13C1540.5,1443.2,1540,1436.5,1535.5,1430.5z\"/>\n\t\t\t</g>\n\t\t\t<g class=\"canoe\">\n\t\t\t\t<path class=\"st76\" d=\"M1334,1338.9c1.1-3.1,2.3-5.2,4-7c1.1-1.2,2.2-2.4,4-3c4.3-1.5,8.5,1.6,9,2c-1.1,0.9-7.2,6.2-7,14\n\t\t\t\t\tc0.2,7.7,6.7,12.6,10,15c9.8,7.3,20.6,7.8,36,8c20.2,0.3,35,0.1,43,0c5.1-0.1,27.3-0.3,50.5-0.5c0,0,18.5-0.1,40.5-6.5\n\t\t\t\t\tc3.2-0.9,8.1-2.5,12-7c6.1-7,5.3-16.3,5-19c1.9-1.1,5-2.5,9-3c2.2-0.3,3.5-0.4,5,0c5.9,1.8,7.6,11.5,8,14c1,5.9,0.1,10.5-1,16\n\t\t\t\t\tc-1,5-2.9,13.3-9,22c0,0-3.1,4.4-7,8c-14.4,13.3-68.3,7.1-109,7c0,0-74.2-0.1-89-12c-3.9-3.2-7-7-7-7c-3.7-4.6-5.5-8.8-6-10\n\t\t\t\t\tc-3.2-7.7-3.1-14.3-3-19C1332.1,1345.1,1333.2,1341.3,1334,1338.9z\"/>\n\t\t\t\t<path class=\"st77\" d=\"M1535.5,1352.4c-1.7,2.3-4.6,5.3-11.5,8.5c-10.9,5.1-40.5,6.5-40.5,6.5l0,0c-23.2,0.1-45.4,0.4-50.5,0.5\n\t\t\t\t\tc-8,0.1-22.8,0.3-43,0c-15.4-0.2-26.2-0.7-36-8c-3.3-2.4-9.8-7.3-10-15c-0.2-5.8,3.2-10.2,5.4-12.5c0.6-0.6,1.5-0.3,1.8,0.5\n\t\t\t\t\tc0.4,1.3,0.8,2.8,1.4,4.5c0.7,2.1,2.9,8.1,6,12c4.4,5.5,11.3,7.1,16,8c27.4,5.4,46,5,46,5c22-0.5,45.5,0.6,92-1\n\t\t\t\t\tc3-0.1,10.3-0.4,17-5c4.2-2.8,6.4-6,7-7c3.5-5.3,3.9-10.6,4-13C1540.5,1339.7,1540,1346.4,1535.5,1352.4z\"/>\n\t\t\t</g>\n\t\t</g>\n\t</g>\n\n\t<g class=\"coSearchText\">\n\t\t<text x=\"35%\" y=\"20%\" class=\"shadowText\">CoSearch</text>\n\t</g>\n</svg>\n"
  },
  {
    "path": "app/views/home/customProxy.pug",
    "content": "extends ../shared/coreLayout.pug\nblock jumbotron1\n\tsection"
  },
  {
    "path": "app/views/home/index.pug",
    "content": "extends ../shared/coreLayout.pug\nblock jumbotron\n\tinclude ../shared/CoNETConnectInfo\nblock jumbotron1\n\t<!-- ko if: showLanguageSelect -->\n\t\t.language( style=\"z-index: 999;top: 1.3em;right: 1em;position: fixed;width: 2em;\")\n\t\t\t.ui.text.shape.languageText( data-bind = \" click: selectItem \" )\n\t\t\t\t.sides\n\t\t\t\t\tspan.ui.header.side.en.languageItem.languageTextCoverColor\n\t\t\t\t\t\ti.flag.united.kingdom.large\n\t\t\t\t\t\t//-span.languageItemSpan( data-bind = \" text: menu[ 'en' ][0].showName \" )\n\t\t\t\t\tspan.ui.header.side.tw.languageItem.languageTextCoverColor\n\t\t\t\t\t\ti.flag.taiwan.large\n\t\t\t\t\t\t//-span.languageItemSpan( data-bind = \" text: menu[ 'tw' ][0].showName \" )\n\t\t\t\t\tspan.ui.header.side.zh.languageItem.languageTextCoverColor\n\t\t\t\t\t\ti.flag.china.large\n\t\t\t\t\t\t//-span.languageItemSpan( data-bind = \" text: menu[ 'zh' ][0].showName \" )\n\t\t\t\t\tspan.ui.header.side.ja.languageItem.languageTextCoverColor\n\t\t\t\t\t\ti.flag.japan.large\n\t\t\t\t\t\t//-span.languageItemSpan( data-bind = \" text: menu[ 'ja' ][0].showName \" )\n\t<!-- /ko -->\n\t<!-- ko if: sectionWelcome -->\n\tsection#welcome.content\n\t\t.welcome-bg\n\t\t\t.welcome( style=\"color: white;\")\n\t\t\t\th1( data-bind = \" text: infoDefine [ languageIndex() ].cover.firstTitle1, animate:{ animation: ['slideInUp','slideOutUp'], state: languageIndex() + 1, delay: 0 }\" )\n\t\t\t\th1( style=\"padding-right:1em;padding-left:1em;\" data-bind = \" text: infoDefine [ languageIndex() ].cover.firstTitle2, animate: { animation: ['slideInUp','slideOutUp'], state: languageIndex() + 1, delay: 70 }\")\n\t\t\t\t//-.ui.primary.basic.big.button( data-bind=\"click: openClick, text: infoDefine [ languageIndex() ].cover.start\" style=\"margin-top: 2em;\" )\n\t\t\t\t.button(style=\"position: relative;width: 4em;height: 4em;\")\n\t\t\t\t\ta.play-btn(data-bind=\"click: openClick\" href=\"#\")\n\t\t.startupView( style=\"width:100%; height:100%\")\n\t\t\tvideo.videoBackground( preload=\"yes\" playsinline autoplay muted loop )\n\t\t\t\tsource( src=\"/images/startup_background.mp4\" type=\"video/mp4\")\n\t<!-- /ko -->\n\t\n\t<!-- ko if: CanadaBackground -->\n\tsection#CanadaBackground( style = \"position: absolute;width: 100%;\")\n\t\tinclude coSearchImage.html\n\t<!-- /ko -->\n\n\n\t<!-- ko if: sectionAgreement -->\n\tsection#agreement.content\n\t\t.content.firstNodeContent\n\t\t\t.ui.header( data-bind = \" text: infoDefine[ languageIndex() ].firstNote.title \" style = \" margin-left: 30px; margin-right: 100px;\")\n\t\t\t.ui.divider\n\t\t\t.detailSegment\n\t\t\t\t.ui.attached.segment\n\t\t\t\t\tspan( data-bind = \" html: infoDefine[ languageIndex() ].firstNote.firstPart \" style = \"font-weight: bold;\")\n\t\t\t.detailSegment( data-bind = \" foreach: infoDefine[ languageIndex() ].firstNote.detail \")\n\t\t\t\t.ui.top.attached.header( data-bind = \" visible: header && header.length \" )\n\t\t\t\t\th4( data-bind = \" text: header \")\n\t\t\t\t.ui.attached.segment\n\t\t\t\t\tspan( data-bind = \" html: detail \")\n\t\t\t.agreementButtom\n\t\t\t\t.ui.buttons.nextButtom\n\t\t\t\t\tbuttom.ui.button( data-bind = \" text: infoDefine[ languageIndex() ].firstNote.disagree, click: function () { sectionAgreement(false); return sectionWelcome(true)} \")\n\t\t\t\t\t.or\n\t\t\t\t\tbuttom.ui.positive.button( data-bind = \" text: infoDefine[ languageIndex() ].home_index_view.agree, click: agreeClick \")\n\t<!-- /ko -->\n\t\n\t<!-- ko if: showIconBar -->\n\tsection#iconBar( style = \" position: absolute;top: 1.2em;z-index: 999;\" )\n\t\t.content( style=\"position: relative;\")\n\t\t\tspan\n\t\t\t\ti.icon.cogs.inverted.large.iconButton( style = \"margin-left: 1em;\" data-bind = \"click: showKeyInfoClick \")\n\t\t\t\ti.icon.home.inverted.large.iconButton( style = \"margin-left: 1em;margin-right: 1em;\" data-bind = \"click: homeClick \")\n\t\t\t\t<!-- ko if: newVersion  -->\n\t\t\t\ta( href = \"https://github.com/QTGate/QTGate-Desktop-Client\" target=\"_blank\")\n\t\t\t\t\ti.icon.setting.big.loading.red\n\t\t\t\t\tspan( data-bind=\"text: infoDefine[ $root.languageIndex() ].linuxUpdate.step1 + newVersion ()\"  style=\"color: white;\")\n\t\t\t\t<!-- /ko -->\n\t<!-- /ko -->\n\t\n\t<!-- ko if: sectionLogin() -->\n\tsection.CoContent.content\n\t\t.ui.cards.loginCards\n\t\t\t<!-- ko if: keyPair  -->\n\t\t\t<!-- ko with: keyPair -->\n\t\t\t<!-- ko if: $root.showKeyPair() -->\n\t\t\t.card.centered.raised( style = \" width: 100%;\" )\n\t\t\t\t.content\n\t\t\t\t\t.header\n\t\t\t\t\t\ti.icon.privacy.teal\n\t\t\t\t\t\tspan( data-bind = \"text: email \" style=\" color:#00b5ad!important;\")\n\t\t\t\t\t\ta.activating.element.inline( href=\"#\" data-bind = \" attr: { 'data-content': verified ? infoDefine[ $root.languageIndex() ].Home_keyPairInfo_view.emailVerified : infoDefine[ $root.languageIndex() ].Home_keyPairInfo_view.emailNotVerifi }\")\n\t\t\t\t\t\t\ti.huge.icons( style = \" margin-left: 10px; font-size: 2em; margin-top: 5px;\" )\n\t\t\t\t\t\t\t\ti.icon.small.certificate( data-bind = \" css: { grey: ! verified, orange: verified }\")\n\t\t\t\t\t\t\t\ti.icon.tiny.warning( data-bind = \" visible: ! verified \" style = \" color: white; margin-top: -4px;margin-left: -1px;\")\n\t\t\t\t\t\t\t\ti.icon.tiny.checkmark( data-bind = \" visible: verified \" style = \" color: white; margin-top: -4px;margin-left: -1px;\")\n\t\t\t\t\t\t.ui.top.right.attached.label.background-clolr-white\n\t\t\t\t\t\t\ta( data-bind = \"if: delete_btn_view() && !showConform (), click: function () { showConform ( true )}\")\n\t\t\t\t\t\t\t\ti.trash.alternate.outline.icon.large.red\n\t\t\t\t\t.meta\n\t\t\t\t\t\ti.icon.user\n\t\t\t\t\t\tspan( data-bind = \" text: nikeName \" )\n\t\t\t\t\t.description\n\t\t\t\t\t\tp( data-bind = \" text: infoDefine[ $root.languageIndex() ].Home_keyPairInfo_view.creatDate + createDate\" )\n\t\t\t\t\t\tp\n\t\t\t\t\t\t\tspan( data-bind = \" text: infoDefine[ $root.languageIndex() ].Home_keyPairInfo_view.keyID\" )\n\t\t\t\t\t\t\tspan( data-bind=\"text: publicKeyID.substr ( 0, 4 )\")\n\t\t\t\t\t\t\tspan( data-bind=\"text: publicKeyID.substr ( 4, 4 )\" style = \"padding-left: 0.5em;\" )\n\t\t\t\t\t\t\tspan( data-bind=\"text: publicKeyID.substr ( 8, 4 )\" style = \"padding-left: 0.5em;\" )\n\t\t\t\t\t\t\tspan( data-bind=\"text: publicKeyID.substr ( 12, 4 )\" style = \"padding-left: 0.5em;\" )\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t.extra.content( data-bind = \"if: showDeleteKeyPairNoite(), visible: showDeleteKeyPairNoite()\")\n\t\t\t\t\tp( data-bind = \" text : infoDefine[ $root.languageIndex() ].Home_keyPairInfo_view.deleteKeyPairHaveLogin \" style=\"color: brown;\")\n\t\t\t\t.extra.content( data-bind = \"if: showConform() && delete_btn_view(), visible: showConform() && delete_btn_view()\")\n\t\t\t\t\tp( data-bind = \" text : infoDefine[ $root.languageIndex() ].Home_keyPairInfo_view.deleteKeyPairInfo \" style=\"color: brown;\")\n\t\t\t\t\t.ui.buttons\n\t\t\t\t\t\t.ui.button( data-bind = \" text: infoDefine[ $root.languageIndex() ].home_index_view.cancel, click: function () { return showConform ( false );}\")\n\t\t\t\t\t\t.or\n\t\t\t\t\t\t.ui.negative.button( data-bind = \" text: infoDefine[ $root.languageIndex() ].Home_keyPairInfo_view.delete, click: deleteKeyPairNext \")\n\t\t\t\t<!-- ko with: keyPairPassword -->\n\t\t\t\t.extra.content( data-bind = \"visible: !$parents[0].showConform()\" )\n\t\t\t\t\tform.ui.form( data-bind=\" submit: keyPair_checkPemPasswordClick\")\n\t\t\t\t\t\t.field.required( data-bind = \" css: { error: showPasswordErrorMessage(), disabled: passwordChecking()}\")\n\t\t\t\t\t\t\tp( data-bind = \" text: infoDefine [ $root.languageIndex() ].Home_keyPairInfo_view.locked\")\n\t\t\t\t\t\t\t.ui.input.huge( data-bind=\" css: { action: systemSetup_systemPassword().length > 4 && ! passwordChecking(), 'left loading': passwordChecking()}\" )\n\t\t\t\t\t\t\t\ti.search.icon.right( data-bind = \" visible: passwordChecking()\" style = \" margin: 0 0 0 0!important; width: auto!important; height:auto!important;\" )\n\t\t\t\t\t\t\t\tinput( data-bind = \"attr: { placeholder: infoDefine[ $root.languageIndex() ].Home_keyPairInfo_view.password1, 'data-content': showPasswordErrorMessage () ? infoDefine[ $root.languageIndex() ].error_message.SystemPasswordError : null }, css: { 'activating element inline': showPasswordErrorMessage() }, textInput: systemSetup_systemPassword, hasFocus: inputFocus\", type=\"password\" value=\"\" tabindex = \"0\" data-variation=\"very wide\")\n\t\t\t\t\t\t\t\tbutton.ui.icon.button.positive( data-bind = \"visible: systemSetup_systemPassword().length > 4 && ! passwordChecking ()\" type=\"submit\" )\n\t\t\t\t\t\t\t\t\ti.icon.angle.right\n\t\t\t\t\t\t\t\n\t\t\t\t<!-- /ko -->\n\t\t\t<!-- /ko -->\n\t\t\t//-\tif: $root.showKeyPair\n\t\t\t<!-- /ko -->\n\t\t\t//-\twith: keyPair\n\t\t\t<!-- /ko -->\n\t\t\t//- if: keyPair\n\t\t\t\n\t\t\t<!-- ko if: keyPairGenerateForm -->\n\t\t\t<!-- ko with: keyPairGenerateForm -->\n\t\t\t.card.centered.raised( data-bind = \"if: showKeyPairForm, visible: showKeyPairForm\" style = \"width: 100%;padding: 2em;\")\n\t\t\t\t.keyPairGenerateForm\n\t\t\t\t\t.ui.segment.teal( data-bind = \"html: infoDefine [ $root.languageIndex() ].home_index_view.inputEmail\" style = \"color: rgba(200,150,30,0.9)\")\n\t\t\t\t\tform.ui.form( data-bind=\"submit: form_AdministratorEmail_submit\")\n\t\t\t\t\t\t.field.required( data-bind = \"css: { error: EmailAddressError() }\" )\n\t\t\t\t\t\t\t.ui.input.focus.left.icon.huge\n\t\t\t\t\t\t\t\ti.icon.spy\n\t\t\t\t\t\t\t\tinput( type = \"email\", z-index = \"1\", data-bind = \"value : SystemAdministratorEmailAddress, attr: { placeholder: infoDefine [ $root.languageIndex() ].home_index_view.emailAddress, 'data-content' : EmailAddressError() ? infoDefine[ $root.languageIndex() ].error_message.EmailAddress[0] : null }, css: { 'activating element inline': EmailAddressError() }\" )\n\t\t\t\t\t\t\t.ui.info.message( data-bind = \" visible: showInsideFireWallEmail()\" )\n\t\t\t\t\t\t\t\ti.icon.close( data-bind=\" click: function () { showInsideFireWallEmail(false);}\")\n\t\t\t\t\t\t\t\tspan.errorInformationText( data-bind = \" text: infoDefine [ $root.languageIndex() ].home_index_view.accountEmailInfo \")\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t.field.required( data-bind = \" css: { error: NickNameError ()}\")\n\t\t\t\t\t\t\t.ui.input.focus.left.icon.huge\n\t\t\t\t\t\t\t\ti.icon.student\n\t\t\t\t\t\t\t\tinput( type = \"text\", z-index = \"2\", data-bind = \" value : SystemAdministratorNickName, attr: { 'data-content' : NickNameError() ? infoDefine[ $root.languageIndex() ].error_message.required : null , placeholder: infoDefine [ $root.languageIndex() ].home_index_view.SystemAdministratorNickName }, css: { 'activating element inline': NickNameError() }\" )\n\t\t\t\t\t\t.field.required( data-bind = \" css: { error: passwordError ()}\")\n\t\t\t\t\t\t\t.ui.input.focus.left.icon.huge\n\t\t\t\t\t\t\t\ti.icon.privacy\n\t\t\t\t\t\t\t\tinput( type = \"password\" z-index = \"3\" data-bind = \" value: systemSetup_systemPassword, attr: { placeholder: infoDefine[ $root.languageIndex() ].Home_keyPairInfo_view.password, 'data-content' : passwordError() ? infoDefine[ $root.languageIndex() ].error_message.PasswordLengthError : null }, css: { 'activating element inline': passwordError() }\" )\n\t\t\t\t\t\t\n\t\t\t\t\t\tbutton.ui.green.basic.large.button( type = \"submit\" data-bind = \" text: infoDefine [ $root.languageIndex() ].home_index_view.creatKeyPair, click: form_AdministratorEmail_submit \")\n\t\t\t.card.centered.raised( data-bind = \"if: showKeyPairPorcess, visible: showKeyPairPorcess\" style = \"width: 100%;padding: 2em;\")\n\t\t\t\t.detail\n\t\t\t\t\tp( data-bind = \" html: infoDefine [ $root.languageIndex() ].home_index_view.GenerateKeypair \")\n\t\t\t\t\t.keyPairProcessBar.ui.bottom.teal.attached.progress( style=\"margin-bottom: 1em;\" data-value=\"1\" data-total=\"100\")\n\t\t\t\t\t\t.bar\n\t\t\t.card.centered.raised( data-bind = \"if: keyPairGenerateFormMessage, visible: keyPairGenerateFormMessage \" style = \"width: 100%;padding: 2em;\")\n\t\t\t\t.detail\n\t\t\t\t\tp( data-bind=\"visible: message_cancel(), text: infoDefine [ $root.languageIndex() ].home_index_view.keyPairCancel \")\n\t\t\t\t\tp( data-bind=\"visible: message_keyPairGenerateError, text: infoDefine [ $root.languageIndex() ].home_index_view.keyPairGenerateError \")\n\t\t\t\t\tp( data-bind = \"visible: message_keyPairGenerateSuccess, text: infoDefine [ $root.languageIndex() ].home_index_view.keyPairGenerateSuccess \")\n\t\t\t\t\tbutton.ui.negative.basic.button( data-bind= \" click: CloseKeyPairGenerateFormMessage, text: infoDefine [ $root.languageIndex() ].error_message.Success\")\n\t\t\t<!-- /ko -->\n\t\t\t//-\tif: keyPairGenerateForm\n\t\t\t<!-- /ko -->\n\t\t\t//- with: keyPairGenerateForm\n\n\t\t\t<!-- ko if: imapSetup -->\n\t\t\t<!-- ko with: imapSetup -->\n\n\t\t\t<!-- ko if: showForm -->\n\t\t\t.card.centered.raised( style = \" width: 100%;\" )\n\t\t\t\t.content.imapSetupForm( data-bind = \"if: showForm \")\n\t\t\t\t\t.ui.segment.teal\n\t\t\t\t\t\tp( data-bind = \"html: infoDefine [ $root.languageIndex() ].imapInformation.infomation \")\n\t\t\t\t\t\tp( data-bind = \"html: infoDefine[ $root.languageIndex() ].imapInformation.tempImapAccount\")\n\t\t\t\t\tform.ui.form.fluid\n\t\t\t\t\t\t.two.fields\n\t\t\t\t\t\t\t.field.required( data-bind = \" css: { error: emailAddressShowError ()}\")\n\t\t\t\t\t\t\t\t.ui.left.icon.input.huge\n\t\t\t\t\t\t\t\t\ti.icon.outline.mail\n\t\t\t\t\t\t\t\t\tinput( data-bind = \" value : emailAddress, css:{ 'activating element inline': emailAddressShowError() }, attr: { tabindex: 1, placeholder: infoDefine [ $root.languageIndex() ].home_index_view.imapEmailAddress, 'data-content' : emailAddressShowError() ? infoDefine[ $root.languageIndex() ].error_message.EmailAddress[ EmailAddressErrorType() ]: null }\" type = \"text\")\n\t\t\t\t\t\t\t.field.required\n\t\t\t\t\t\t\t\t.passwdInput.ui.input.huge( data-bind = \" css: { 'left icon': !password() || !password().length, 'action': password() && password().length }\")\n\t\t\t\t\t\t\t\t\ti.icon.privacy( data-bind = \" visible: !password() || !password().length \")\n\t\t\t\t\t\t\t\t\tinput( data-bind = \" textInput: password, attr: { placeholder: infoDefine [ $root.languageIndex() ].imapInformation.emailServerPassword, tabindex: 2 }\" type = \"password\" )\n\t\t\t\t\t\t\t\t\tbutton.ui.icon.button.positive( data-bind = \" visible: password() && password().length, click: imapAccountGoCheckClick\" )\n\t\t\t\t\t\t\t\t\t\ti.icon.angle.right\n\t\t\t<!-- /ko -->\n\t\t\t//-\tif: showForm\n\n\t\t\t<!-- ko if: showCheckProcess -->\n\t\t\t.card.centered.raised( style = \" width: 100%;\" )\n\n\t\t\t\t.content.checkImapData\n\t\t\t\t\t\n\t\t\t\t\t.ui.segment( data-bind = \"css: { yellow: checkProcessing() < -1, red: checkImapError() > -1 }\")\n\t\t\t\t\t\t\n\t\t\t\t\t\tp( data-bind = \" visible: checkImapError() > -1, text: infoDefine [ $root.languageIndex() ].imapInformation.imapCheckError[checkImapError()]\")\n\t\t\t\t\t\tp( data-bind = \"visible: checkImapStep() > -1 && checkImapError() === -1, text: infoDefine [ $root.languageIndex() ].imapInformation.imapCheckingStep[checkImapStep()]\")\n\t\t\t\t\t\tButton.ui.icon.button.orange( data-bind = \" visible: checkImapError() > -1, click: returnImapSetup, text: infoDefine [ $root.languageIndex() ].imapInformation.title \" )\n\t\t\t\t\t\t<!-- ko if: checkImapError() < 0 -->\n\t\t\t\t\t\t.loaderCoNET( style = \"position: relative;\")\n\t\t\t\t\t\t\t.loaderCoNET-div\n\t\t\t\t\t\t\t.loaderCoNET-div\n\t\t\t\t\t\t\t.loaderCoNET-div\n\t\t\t\t\t\t\t.loaderCoNET-div\n\t\t\t\t\t\t<!-- /ko -->\n\t\t\t<!-- /ko -->\n\t\t\t//-\tif: showCheckProcess\n\n\t\t\t<!-- /ko -->\n\t\t\t//- if: imapSetup\n\t\t\t<!-- /ko -->\n\t\t\t//-\twith: imapSetup\n\t\t\t\n\t\t\t<!-- ko if: CoNETConnect  -->\n\t\t\t<!-- ko with: CoNETConnect -->\n\t\t\t\n\t\t\t<!-- ko if: showConnectCoNETProcess  -->\n\t\t\t.card.centered.raised( style = \" width: 100%;\" )\n\t\t\t\t.content\n\t\t\t\t\t.header\n\t\t\t\t\t\ti.icon.exchange.blue\n\t\t\t\t\t\tspan( data-bind = \"text: email \" style=\" color:#2185d0!important;\")\n\t\t\t\t\t<!-- ko if: showSendImapDataWarning -->\n\t\t\t\t\t.ui.segment\n\t\t\t\t\t\t.woringText( data-bind = \"html: infoDefine [ $root.languageIndex() ].imapInformation.imapAccountConform ( email, account ) \" style=\"padding-bottom: 1em;\")\n\t\t\t\t\t\t.ui.buttons\n\t\t\t\t\t\t\ta.ui.button( data-bind = \" text: infoDefine[ $root.languageIndex() ].home_index_view.cancel\" href=\"/\")\n\t\t\t\t\t\t\t.or\n\t\t\t\t\t\t\t.ui.negative.button( data-bind = \" text: infoDefine[ $root.languageIndex() ].imapInformation.agree, click: imapConform \")\n\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t<!-- ko if: Loading() && ! showSendImapDataWarning() -->\n\t\t\t\t\t.loaderCoNET( style = \"position: relative;\")\n\t\t\t\t\t\t.loaderCoNET-div\n\t\t\t\t\t\t.loaderCoNET-div\n\t\t\t\t\t\t.loaderCoNET-div\n\t\t\t\t\t\t.loaderCoNET-div\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t<!-- ko if: infoTextArray() && infoTextArray().length -->\n\t\t\t\t\t.ui.segment( style = \"min-height: 10em;\")\n\t\t\t\t\t\t<!-- ko foreach: infoTextArray -->\n\t\t\t\t\t\t.infoText( data-bind = \"style: { 'color': err() === null ? 'grey' : ( !err() ? 'green' : 'red') }, css: { 'terminalText': ($index() === $parent.infoTextArray().length - 1) && !$parent.showTryAgain() }, text: messageBoxDefine[ text() ] [ $root.languageIndex() ] \" style = \"color: grey;\")\n\t\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t<!-- ko if: showSendConnectMail -->\n\t\t\t\t\t.ui.teal.center.aligned.segment( data-bind = \" click: sendConnectMail \" style = \"cursor: pointer;\")\n\t\t\t\t\t\t.text( data-bind = \" text: infoDefine[ $root.languageIndex() ].linuxUpdate.tryAgain \")\n\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t<!-- ko if: showNetworkError -->\n\t\t\t\t\t.ui.red.center.aligned.segment( data-bind = \" click: tryAgain\" style = \"cursor: pointer;\")\n\t\t\t\t\t\t.text( data-bind = \" text: infoDefine[ $root.languageIndex() ].linuxUpdate.tryAgain \")\n\t\t\t\t\t<!-- /ko -->\n\n\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\n\n\t\t\t<!-- /ko -->\n\t\t\t//-\tif: showConnectCoNETProcess\n\n\t\t\t<!-- ko if: keyPairSign -->\n\t\t\t<!-- ko with: keyPairSign -->\n\t\t\t.card.centered.raised( style = \" width: 100%;\")\n\t\t\t\t.content\n\t\t\t\t\t.ui.segments\n\t\t\t\t\t\t.ui.segment( data-bind = \"css: { yellow: signError() === -1, red: signError() > -1 }\" )\n\t\t\t\t\t\t\tspan( data-bind = \" text: infoDefine [ $root.languageIndex() ].emailConform.info1_1 \" style=\"color:rgba(0,0,0,.5);\")\n\t\t\t\t\t\t\tb( data-bind = \" text: $parents[0].account\" style=\"color:rgba(0,80,80,.8);\")\n\t\t\t\t\t\t\tspan( data-bind = \" text: infoDefine [ $root.languageIndex() ].emailConform.info1_2\"  style=\"color:rgba(0,0,0,.5);\")\n\t\t\t\t\t\t<!-- ko if: requestError() > -1 -->\n\t\t\t\t\t\t.ui.segment.errorInformation\n\t\t\t\t\t\t\tp( data-bind = \" text: infoDefine [ $root.languageIndex() ].error_message.CoNET_requestError[ requestError() ]\" style = \"color: brown;\")\n\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t.ui.segment\n\t\t\t\t\t\t\t.ui.grid.equal.width.right.aligned.container( style=\"margin-top: 0.1em; margin-bottom: 0.1em;\")\n\t\t\t\t\t\t\t\t.row( style = \"background-color: #D94235; padding-bottom: 0px;\")\n\t\t\t\t\t\t\t\t\t.column.left.aligned\n\t\t\t\t\t\t\t\t\t\timg( src = \"/images/512x512.png\" style = \"margin-left: 1em; height: 50px;\")\n\t\t\t\t\t\t\t\t\t.column\n\t\t\t\t\t\t\t\t\t\t<!-- ko ifnot: showRequestActivEmailButtonError -->\n\t\t\t\t\t\t\t\t\t\t\t.ui.purple.button( style = \"position: absolute; right: 2em; top: 0em;\" data-bind=\"css:{ loading: activeing }, text: infoDefine [ $root.languageIndex() ].emailConform.conformButtom, click: checkActiveEmailSubmit, visible: conformButtom ()\" )\n\t\t\t\t\t\t\t\t\t\t\t.ui.inverted.button( data-bind = \"css: { 'loading disabled': requestActivEmailrunning()}, visible: showSentActivEmail() < 0 && ! conformButtom(), click: requestActivEmail, text: infoDefine [ $root.languageIndex() ].emailConform.reSendRequest\")\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tspan(data-bind=\"text: showSentActivEmail() > -1 ? infoDefine [ $root.languageIndex() ].emailConform.requestReturn[ showSentActivEmail() ]: '', visible: showSentActivEmail() > -1 && !conformButtom()\" style=\"color: cornsilk;\")\n\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\t\t\t\t<!-- ko if: showRequestActivEmailButtonError -->\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\ti.icon.exclamation.triangle.circular.red.link(  data-bind = \"click: clearError \" style = \"background-color: white!important;\")\n\t\t\t\t\t\t\t\t\t\t<!-- /ko -->\n\t\t\t\t\t\t\t\t.row( style = \"background-color: #D94235; padding-top: .5em;\")\n\t\t\t\t\t\t\t\t\th2( style = \"color: white; margin-left: 2em; padding-top: 0px;\" data-bind = \"text: infoDefine [ $root.languageIndex() ].emailConform.emailTitle \" )\n\t\t\t\t\t\t\t\t.row( style = \"background-color: #FAFAFA; font-weight: bold; padding-bottom: 0px\" data-bind=\"visible: !activeing()\")\n\t\t\t\t\t\t\t\t\tspan( data-bind=\"text: infoDefine [ $root.languageIndex() ].emailConform.emailDetail1\" style=\"margin-left: 20px;color:rgba(0,0,0,.5);\")\n\t\t\t\t\t\t\t\t\tspan( data-bind=\"text: $parents[0].account\" style=\"color:rgba(0,0,0,.5); padding-left: 0.5em;\")\n\t\t\t\t\t\t\t\t\tspan( data-bind=\"text: infoDefine [ $root.languageIndex() ].emailConform.emailDetail1_1\" style=\"color:rgba(0,0,0,.5);\")\n\t\t\t\t\t\t\t\t\tp( data-bind = \"text: infoDefine [ $root.languageIndex() ].emailConform.emailDetail2\" style=\"text-align: left; margin-left: 20px; margin-right: 20px; color:rgba(0,0,0,.5);\")\n\t\t\t\t\t\t\t\t.row( style = \"background-color: #FAFAFA; padding-top: .2em; padding-bottom: 0.2em\" data-bind=\"visible: !activeing()\")\n\t\t\t\t\t\t\t\t\t.ui.form( style=\"margin: 20px;width: 100%;\")\n\t\t\t\t\t\t\t\t\t\t.field( data-bind = \" css: { error: signError() || conformTextError() }\")\n\t\t\t\t\t\t\t\t\t\t\ttextarea( data-position=\"right center\" data-bind = \" textInput: conformText, attr: { placeholder: infoDefine [ $root.languageIndex() ].emailConform.info2 }\" )\n\t\t\t\t\t\t\t\t\t\t\ta#SendToQTGateTextArea.floating.ui.red.circular.label( data-bind = \" text: '!', visible: conformTextError(), attr: { 'data-content': conformTextError () ? messageBoxDefine [ conformTextErrorNumber() ][$root.languageIndex()] : null }, css: { 'activating element1': conformTextError() } \")\n\t\t\t\t\t\t\t\t.row( style = \"background-color: #FAFAFA;padding-top: 0px;\" data-bind=\"visible: !activeing()\" )\n\t\t\t\t\t\t\t\t\t.ui.two.column.grid\n\t\t\t\t\t\t\t\t\t\t.stretched.row( style =\"padding-top: 0px;\")\n\t\t\t\t\t\t\t\t\t\t\t.column.left.aligned(style = \"padding-top: 0px;padding-bottom: 0.2em\")\n\t\t\t\t\t\t\t\t\t\t\t\tspan( data-bind=\" text: infoDefine [ $root.languageIndex() ].emailConform.bottom1_1\" style=\"margin-left: 20px;color:rgba(0,0,0,.5);\" )\n\t\t\t\t\t\t\t\t\t\t\t\tspan( data-bind=\" text: infoDefine [ $root.languageIndex() ].emailConform.bottom1_2\" style=\"margin-left: 20px;color:rgba(0,0,0,.5);\" )\n\t\t\t\t\t\t\t\t\t\t\t.column.right.floated\n\t\t\t\t\t\t\t\t\t\t\t\t.ui.purple.button( style = \"position: absolute; right: 2em; top: 0em;\" data-bind=\"text: infoDefine [ $root.languageIndex() ].emailConform.conformButtom, click: checkActiveEmailSubmit, visible: conformButtom ()\" )\n\t\t\t\t\t\t\t\t.row( style = \"background-color: #FAFAFA;padding-top: 0px;\")\n\t\t\t\t\t\t\n\t\t\t<!-- /ko -->\n\t\t\t<!-- /ko -->\n\n\t\t\t<!-- /ko -->\n\t\t\t//-\twith: CoNETConnect\n\t\t\t<!-- /ko -->\n\t\t\t//-\tif: CoNETConnect\n\t<!-- /ko -->\n\t//-\t\tAppList \n\t<!-- ko if:  AppList() && keyPair() && keyPair().verified -->\n\t//-section.AppList.CoContent.content\n\t\t\n\t\t.CoGateCards( style=\"max-width: 60em;\")\n\t\t\th2.ui.header.AppListHeader( data-bind=\"text: infoDefine[ languageIndex() ].thirdParty.information\" style=\"color: white;\")\n\t\t\t\n\t\t\t.ui.link.cards\n\t\t\t\t\n\t\t\t\t<!-- ko foreach: appList -->\n\t\t\t\t.card.AppCardTop( data-bind = \"click: function () { click( $root )}, visible: show\")\n\t\t\t\t\t.content.cardContentHeader\n\t\t\t\t\t\ta.ui.orange.right.corner.label.comeSoon( data-bind = \"visible: comeSoon, attr: { 'data-content': infoDefine[ $root.languageIndex() ].thirdParty.comesoon }\")\n\t\t\t\t\t\t\ti.icon.warning.sign\n\t\t\t\t\t\t.header( data-bind = \" text: infoDefine[ $root.languageIndex() ].thirdParty.app[ $index()], style: { color: titleColor }\" style=\"font-size: 1em;\")\n\t\t\t\t\t\t.blurring.dimmable.image\n\t\t\t\t\t\t\t.ui.dimmer\n\t\t\t\t\t\t\t\t.content\n\t\t\t\t\t\t\t\t\tp(data-bind=\"text: infoDefine[ $root.languageIndex() ].thirdParty.dimmer[$index()]\")\n\t\t\t\t\t\t\t.ui.AppCardImageArea\n\t\t\t\t\t\t\t\timg.ui.centered.image.AppCardImage( data-bind = \"attr: { src: image, style: css }\")\n\t\t\t\t\t//-.content\n\t\t\t\t\t\t//-span.right.floated\n\t\t\t\t\t\t\ti.heart.red.like.icon( data-bind=\"css: { outline: !liked()}\")\n\t\t\t\t\t\t\tspan( data-bind = \"text: likeCount()\" style=\"color: #DB2828\")\n\t\t\t\t\t\t//-span.floated\n\t\t\t\t\t\t\ti.comment.grey.icon.outline\n\t\t\t\t\t\t\tspan( data-bind=\"text: commentCount\")\n\t\t\t\t<!-- /ko -->\n\t<!-- /ko -->\n\n\n\t<!-- ko if: appsManager -->\n\t<!-- ko with: appsManager -->\n\n\t<!-- ko if: showMainMenu -->\n\tsection.mainMenu.content.CoContent( style = \" margin-top: 5em;\")\n\t\t.CoGateCards( style=\"max-width: 60em;\")\n\t\t\t.welcomeText.ui.header\n\t\t\t\t.content\n\t\t\t\t\th1.shadowText1( data-bind = \" text: infoDefine[ $root.languageIndex() ].thirdParty.information\" style=\"color:white;\" )\n\t\t\t\t\t.sub.header( data-bind = \" text: infoDefine[ $root.languageIndex() ].appsManager.welcomeTextSub\" )\n\n\n\t\t\t<!-- ko if: mainLoading -->\n\t\t\th4.ui.header( data-bind = \" text: infoDefine[ $root.languageIndex() ].appsManager.mainLoading\" )\n\t\t\t.ui.active.inline.loader( data-bind = \"css: { 'loadingGetResponse': loadingGetResponse, 'conetResponse': conetResponse }\" )\n\t\t\t<!-- /ko -->\n\n\t\t\t<!-- ko if: loadingError -->\n\t\t\ta.ui.red.header( data-bind = \"click: mainNemuError, text: messageBoxDefine [ loadingError() ][ $root.languageIndex()]\" href=\"#\" )\n\t\t\t<!-- /ko -->\n\t\t\tscript#mainMenu( data-bind = \"html: mainHtml\" type=\"text/html\" )\n\n\t\t\t<!-- ko if: showMain -->\n\t\t\t#mainMenuHtml( data-bind = \" template: { name: 'mainMenu' }\")\n\t\t\t<!-- /ko -->\n\t\t\t\n\n\t\t\t<!-- ko if: showTempMain  -->\n\t\t\t<!-- mainMenu section -->\n\t\t\t\n\t\t\tinclude ../shared/mainMenu\n\t\t\t\n\t\t\t<!-- mainMenu section -->\n\t\t\t<!-- /ko -->\n\t\n\t<!-- /ko -->\n\n\t<!-- ko if: appHtml -->\n\tscript#runningAppHtml( data-bind = \"html: runningAppHtml\" type=\"text/html\" )\n\n\t<!-- ko if: showAppMain -->\n\tsection#appHtml( data-bind = \" template: { name: 'runningAppHtml' }\")\n\t<!-- /ko -->\n\n\t<!-- /ko -->\n\t\n\n\n\n\t<!-- ko if: tempAppHtml -->\n\tsection#tempAppHtml( style = \" height: 100em;\" )\n\t\t<!----------- start tempAppHtml DEBUG -------------->\n\t\t\n\t\tinclude ../shared/appHtml\n\n\t\t<!----------- end tempAppHtml DEBUG ----------------->\n\t<!-- /ko -->\n\n\t\n\n\t<!-- /ko -->\n\t<!-- /ko -->\n\t"
  },
  {
    "path": "app/views/shared/coreLayout.pug",
    "content": "doctype html\nhtml\n\tinclude header\n\tbody#body( data-bind = \" css: { 'bodyCoNETBlue': bodyBlue }\")\n\t\tblock jumbotron\n\t\tblock jumbotron1\n\t\tscript.\n\t\t\tif ( typeof module === 'object') { window.module = module; module = undefined; }\n\t\tscript( src='/scripts/jquery.min.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/socket.io.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/jcanvas.min.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/snap.svg.min.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/semantic.min.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/jquery.cookie.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/jszip.min.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/jimp.min.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/knockout.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/knockout.animate.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/Cleave.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/openpgp.min.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/siteShare.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/connectInformationMessage.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/keyPairGenerateForm.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/keyPairPassword.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/CoNETConnect.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/imapForm.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/appsManager.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/appCosearch.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/encryptoClass.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/showHTMLComplete.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/home.js', type=\"text/javascript\" )\n\t\tscript( src='/scripts/TweenMax.min.js', type=\"text/javascript\" )\n\t\tblock ScriptBlock"
  },
  {
    "path": "index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head></head>\n  <body></body>\n  <script>\n    const server = require ('./app/main.js')\n  </script>\n</html>\n\n"
  },
  {
    "path": "index.js",
    "content": "\"use strict\";\n/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst DEBUG = false;\nconst port = 3000;\nconst path_1 = require(\"path\");\nconst url_1 = require(\"url\");\nconst { app, BrowserWindow, Tray, Menu, dialog, autoUpdater, desktopCapturer, shell } = require('electron');\n// squirrel event handled and app will exit in 1000ms, so don't do anything else\nconst version = app.getVersion();\nlet localServer1 = null;\nlet tray = null;\nlet doReady = false;\nconst _doUpdate = (tag_name, _port) => {\n    let url = null;\n    if (process.platform === 'darwin') {\n        url = `http://localhost:${_port}/update/mac?ver=${tag_name}`;\n    }\n    else if (process.platform === 'win32') {\n        url = `http://localhost:${_port}/latest/${tag_name}/`;\n    }\n    else {\n        console.log(`process.platform === linux`);\n        return;\n    }\n    autoUpdater.on('update-availabe', () => {\n        console.log('update available');\n    });\n    autoUpdater.on('error', err => {\n        console.log('systemError autoUpdater.on error ' + err.message);\n    });\n    autoUpdater.on('checking-for-update', () => {\n        console.log(`checking-for-update [${url}]`);\n    });\n    autoUpdater.on('update-not-available', () => {\n        console.log('update-not-available');\n    });\n    autoUpdater.on('update-downloaded', e => {\n        console.log(\"Install?\");\n        autoUpdater.quitAndInstall();\n    });\n    autoUpdater.setFeedURL(url);\n    autoUpdater.checkForUpdates();\n};\nconst createLocalBrowser = () => {\n    const localServer = new BrowserWindow({\n        show: true,\n        webPreferences: {\n            nodeIntegration: true\n        }\n    });\n    DEBUG ? localServer.webContents.openDevTools() : null;\n    localServer.loadURL(`http://localhost:${port}`);\n};\nconst createWindow = () => {\n    if (process.platform === 'win32') {\n        return createLocalBrowser();\n    }\n    shell.openExternal(`http://localhost:${port}`);\n};\nconst data11 = [\n    {\n        tray: [\n            {\n                label: '打开',\n                click: createWindow\n            },\n            {\n                role: 'quit',\n                label: '退出',\n                accelerator: 'Command+Q'\n            }\n        ]\n    }, {\n        tray: [\n            {\n                label: 'オープン',\n                click: createWindow\n            },\n            {\n                role: 'quit',\n                label: '退出',\n                accelerator: 'Command+Q'\n            }\n        ]\n    }, {\n        tray: [\n            {\n                label: 'open',\n                click: createWindow\n            },\n            {\n                role: 'quit',\n                accelerator: 'Command+Q'\n            }\n        ]\n    }, {\n        tray: [\n            {\n                label: '打開',\n                click: createWindow\n            }, {\n                role: 'quit',\n                label: '退出',\n                accelerator: 'Command+Q'\n            }\n        ]\n    }\n];\nconst getLocalLanguage = (lang) => {\n    if (/^zh-TW|^zh-HK|^zh-SG/i.test(lang))\n        return 3;\n    if (/^zh/i.test(lang))\n        return 0;\n    if (/^ja/i.test(lang))\n        return 1;\n    return 2;\n};\nlet localLanguage = getLocalLanguage(app.getLocale());\nconst isMacOS = process.platform === 'darwin';\nconst template = [{\n        submenu: [\n            { role: 'undo', visible: isMacOS },\n            { role: 'redo', visible: isMacOS },\n            { role: 'selectall', visible: isMacOS },\n            { role: 'copy', visible: isMacOS },\n            { role: 'paste', visible: isMacOS },\n            { role: 'quit', visible: isMacOS }\n        ]\n    }];\nconst appReady = () => {\n    //const menu = Menu.buildFromTemplate( template )\n    //Menu.setApplicationMenu ( menu)\n    if (!localServer1) {\n        localServer1 = new BrowserWindow({\n            show: DEBUG,\n            webPreferences: {\n                nodeIntegration: true\n            }\n        });\n        localServer1._doUpdate = _doUpdate;\n        DEBUG ? localServer1.webContents.openDevTools() : null;\n        //localServer1.maximize ()\n        localServer1.loadURL(url_1.format({\n            pathname: path_1.join(__dirname, 'index.html'),\n            protocol: 'file:',\n            slashes: true\n        }));\n        setTimeout(() => {\n            createWindow();\n        }, 2000);\n        /*\n        setTimeout (() => {\n            const checkUpload = new BrowserWindow ({ show: DEBUG })\n            checkUpload.rendererSidePort = port\n            DEBUG ? checkUpload.webContents.openDevTools() : null\n            checkUpload.loadURL ( format ({\n                pathname: join ( __dirname, 'app/update.html'),\n                protocol: 'file:',\n                slashes: true\n            }))\n        }, 500 )\n        */\n    }\n    else {\n        createWindow();\n    }\n    if (!tray) {\n        tray = new Tray(path_1.join(__dirname, '16x16.png'));\n        tray.on('click', () => {\n            return createWindow();\n        });\n        const contextMenu = Menu.buildFromTemplate(data11[localLanguage].tray);\n        tray.setContextMenu(contextMenu);\n    }\n};\nconst initialize = () => {\n    const gotTheLock = app.requestSingleInstanceLock();\n    if (!gotTheLock) {\n        return app.quit();\n    }\n    app.on('second-instance', (event, commandLine, workingDirectory) => {\n        createWindow();\n    });\n    app.once('ready', () => {\n        if (doReady) {\n            return;\n        }\n        doReady = true;\n        return appReady();\n    });\n    app.once('window-all-closed', () => {\n        app.quit();\n    });\n};\ninitialize();\n"
  },
  {
    "path": "index.ts",
    "content": "/*!\n * Copyright 2018 CoNET Technology Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst DEBUG = false\nconst port = 3000\n\nimport { join } from  'path'\nimport { format } from 'url'\n\nconst { app, BrowserWindow, Tray, Menu, dialog, autoUpdater, desktopCapturer, shell } = require ( 'electron' )\n  \n// squirrel event handled and app will exit in 1000ms, so don't do anything else\nconst version = app.getVersion()\n\nlet localServer1 = null\n\nlet tray = null\nlet doReady = false\n\nconst _doUpdate = ( tag_name: string, _port ) => {\n\tlet url = null\n\t\n    if ( process.platform === 'darwin' ) {\n        url = `http://localhost:${ _port }/update/mac?ver=${ tag_name }`\n    } else \n    if ( process.platform === 'win32' ) {\n        url = `http://localhost:${ _port }/latest/${ tag_name }/`\n    } else {\n        console.log (`process.platform === linux`)\n\t\treturn\n\t}\n    \n    autoUpdater.on ( 'update-availabe', () => {\n        console.log ( 'update available' )\n    })\n\n    autoUpdater.on ( 'error', err => {\n        console.log ( 'systemError autoUpdater.on error ' + err.message )\n    })\n\n    autoUpdater.on('checking-for-update', () => {\n        console.log ( `checking-for-update [${ url }]` )\n    })\n\n    autoUpdater.on( 'update-not-available', () => {\n        console.log ( 'update-not-available' )\n    })\n\n    autoUpdater.on( 'update-downloaded', e => {\n        console.log ( \"Install?\" )\n        autoUpdater.quitAndInstall ()\n    })\n\n    autoUpdater.setFeedURL ( url )\n    autoUpdater.checkForUpdates ()\n}\n\nconst createLocalBrowser = () => {\n\tconst localServer = new BrowserWindow (\n\t\t{ \n\t\t\tshow: true,\n\t\t\twebPreferences: {\n\t\t\t\tnodeIntegration: true\n\t\t\t}\n\t\t})\n\tDEBUG ? localServer.webContents.openDevTools() : null\n\tlocalServer.loadURL ( `http://localhost:${ port }`)\n}\n\nconst createWindow = () => {\n\tif ( process.platform === 'win32' ) {\n\t\treturn createLocalBrowser ()\n\t}\n    shell.openExternal (`http://localhost:${ port }`)\n\n}\n\nconst data11 = [\n    {\n        tray: [\n            \n            {\n                label: '打开',\n                click: createWindow\n            },\n            {\n                role: 'quit',\n                label: '退出',\n                accelerator: 'Command+Q'\n            }\n        ]\n    },{\n    tray: [\n            {\n                label: 'オープン',\n                click: createWindow\n            },\n            {\n                role: 'quit',\n                label: '退出',\n                accelerator: 'Command+Q'\n            }\n        ]\n    },{\n    tray: [\n            {\n                label: 'open',\n                click: createWindow\n            },\n            {\n                role: 'quit',\n                accelerator: 'Command+Q'\n            }\n        ]\n    },{\n    tray: [\n            {\n                label: '打開',\n                click: createWindow\n            },{\n                role: 'quit',\n                label: '退出',\n                accelerator: 'Command+Q'\n            }\n        ]\n    }\n]\n\nconst getLocalLanguage = ( lang: string ) => {\n    if ( /^zh-TW|^zh-HK|^zh-SG/i.test ( lang ))\n        return 3\n    if ( /^zh/i.test ( lang ))\n        return 0\n    if ( /^ja/i.test ( lang ))\n        return 1\n    return 2\n}\n\nlet localLanguage = getLocalLanguage ( app.getLocale ())\n\nconst isMacOS = process.platform === 'darwin'\n\nconst template = [{\n        submenu:[\n        { role: 'undo', visible: isMacOS },\n        { role: 'redo', visible: isMacOS },\n        { role: 'selectall', visible: isMacOS },\n        { role: 'copy', visible: isMacOS },\n        { role: 'paste', visible: isMacOS },\n        { role: 'quit', visible: isMacOS }\n        ]\n    }]\n\nconst appReady = () => {\n    \n    //const menu = Menu.buildFromTemplate( template )\n    //Menu.setApplicationMenu ( menu)\n    if ( ! localServer1 ) {\n        \n            localServer1 = new BrowserWindow (\n\t\t\t\t{ \n\t\t\t\t\tshow: DEBUG,\n\t\t\t\t\twebPreferences: {\n\t\t\t\t\t\tnodeIntegration: true\n\t\t\t\t\t}\n\t\t\t\t})\n            \n            localServer1._doUpdate = _doUpdate\n            DEBUG ? localServer1.webContents.openDevTools() : null\n            //localServer1.maximize ()\n            localServer1.loadURL ( format ({\n                pathname: join( __dirname, 'index.html'),\n                protocol: 'file:',\n                slashes: true\n            }))\n\n            setTimeout (() => {\n                createWindow ()\n            }, 2000 )\n\n            /*\n            setTimeout (() => {\n                const checkUpload = new BrowserWindow ({ show: DEBUG })\n                checkUpload.rendererSidePort = port\n                DEBUG ? checkUpload.webContents.openDevTools() : null\n                checkUpload.loadURL ( format ({\n                    pathname: join ( __dirname, 'app/update.html'),\n                    protocol: 'file:',\n                    slashes: true\n                }))\n            }, 500 )\n            */\n        \n    } else {\n        \n        createWindow ()\n    }\n\n    if ( !tray ) {\n        tray = new Tray ( join ( __dirname, '16x16.png' ))\n        tray.on( 'click', () => {\n            \n            return createWindow ()\n            \n        })\n\n        const contextMenu = Menu.buildFromTemplate ( data11 [ localLanguage ].tray )\n        \n        tray.setContextMenu ( contextMenu )\n    }\n    \n}\n\nconst initialize = () => {\n\tconst gotTheLock = app.requestSingleInstanceLock()\n\n\tif (!gotTheLock) {\n\n\t\treturn app.quit()\n\n\t}\n\n\tapp.on('second-instance', ( event, commandLine, workingDirectory) => {\n\t\tcreateWindow ()\n\t})\n\n    app.once ( 'ready', () => {\n        if ( doReady ) {\n\t\t\treturn \n\t\t}\n            \n        doReady = true\n        \n        return appReady ()\n\t})\n\n    app.once ( 'window-all-closed', () => {\n        app.quit()\n    })\n\n}\n\ninitialize()\n\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"conet_client\",\n  \"version\": \"3.3.0\",\n  \"license\": \"MIT\",\n  \"description\": \"CoNET platform\",\n  \"scripts\": {\n    \"start\": \"electron .\",\n    \"pack\": \"electron-builder --dir\",\n    \"win\": \"electron-builder --x64\",\n    \"win32\": \"electron-builder --ia32\",\n    \"linux\": \"electron-builder --linux\",\n    \"unix\": \"\",\n    \"mac\": \"electron-builder\",\n    \"pre\": \"electron-builder install-app-deps\",\n    \"release\": \"electron-builder --win && electron-builder --mac && electron-builder --linux\"\n  },\n  \"engines\": {\n    \"node\": \">=50.9\"\n  },\n  \"devDependencies\": {\n    \"@types/asn1js\": \"0.0.1\",\n    \"@types/cookie-parser\": \"^1.4.2\",\n    \"@types/express\": \"^4.17.2\",\n    \"@types/jquery\": \"^3.3.32\",\n    \"@types/knockout\": \"^3.4.66\",\n    \"@types/node\": \"13.7.0\",\n    \"@types/node-uuid\": \"^0.0.28\",\n    \"@types/pkijs\": \"0.0.2\",\n    \"@types/snapsvg\": \"0.5.0\",\n    \"@types/socket.io\": \"2.1.4\",\n    \"@types/socket.io-client\": \"1.4.32\",\n    \"electron\": \"8.0.0\",\n    \"electron-builder-squirrel-windows\": \"22.3.3\"\n  },\n  \"build\": {\n    \"appId\": \"com.CoNET.Platform\",\n    \"win\": {\n      \"target\": [\n        {\n          \"target\": \"nsis\"\n        },\n        {\n          \"target\": \"squirrel\"\n        }\n      ],\n      \"icon\": \"resources/icon.ico\"\n    },\n    \"mac\": {\n      \"category\": \"public.app-category.utilities\",\n      \"icon\": \"resources/qtgate\"\n    },\n    \"dmg\": {\n      \"backgroundColor\": \"#ffffff\",\n      \"contents\": [\n        {\n          \"x\": 110,\n          \"y\": 220\n        },\n        {\n          \"x\": 420,\n          \"y\": 220,\n          \"type\": \"link\",\n          \"path\": \"/Applications\"\n        }\n      ]\n    },\n    \"linux\": {\n      \"target\": [\n        \"deb\",\n        \"pacman\"\n      ]\n    }\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/QTGate/QTGate-Desktop-Client.git\"\n  },\n  \"author\": {\n    \"name\": \"CoNET Technology Inc.\",\n    \"email\": \"info@CoNETTech.ca\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/QTGate/QTGate-Desktop-Client/issues\"\n  },\n  \"homepage\": \"https://www.CoNETTech.ca\",\n  \"dependencies\": {\n    \"async\": \"^3.1.1\",\n    \"cookie-parser\": \"^1.4.4\",\n    \"express\": \"^4.17.1\",\n    \"jimp\": \"^0.9.3\",\n    \"jszip\": \"^3.2.2\",\n    \"knockout\": \"^3.5.1\",\n    \"mime-types\": \"^2.1.26\",\n    \"node-uuid\": \"^1.4.8\",\n    \"nodemailer\": \"^6.4.2\",\n    \"openpgp\": \"^4.9.0\",\n    \"pug\": \"^2.0.4\",\n    \"snapsvg\": \"^0.5.1\",\n    \"socket.io\": \"^2.3.0\",\n    \"socket.io-client\": \"^2.3.0\"\n  }\n}\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"target\": \"es2020\",\n        \"module\": \"commonjs\",\n        \"allowJs\": true\n    },\n    \"include\": [\n        \"index.ts\",\n        \"app/**/*.ts\"\n\t]\n}"
  }
]