1/*
2Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4*/
5(function() {
6    if (window.CKEDITOR && window.CKEDITOR.dom) return;
7    window.CKEDITOR || (window.CKEDITOR = function() {
8        var a = /(^|.*[\\\/])ckeditor\.js(?:\?.*|;.*)?$/i,
9            d = {
10                timestamp: "I8BG",
11                version: "4.10.1",
12                revision: "59246e9",
13                rnd: Math.floor(900 * Math.random()) + 100,
14                _: {
15                    pending: [],
16                    basePathSrcPattern: a
17                },
18                status: "unloaded",
19                basePath: function() {
20                    var b = window.CKEDITOR_BASEPATH || "";
21                    if (!b)
22                        for (var c = document.getElementsByTagName("script"), d = 0; d < c.length; d++) {
23                            var g = c[d].src.match(a);
24                            if (g) {
25                                b = g[1];
26                                break
27                            }
28                        } - 1 == b.indexOf(":/") && "//" != b.slice(0, 2) && (b = 0 === b.indexOf("/") ? location.href.match(/^.*?:\/\/[^\/]*/)[0] +
29                            b : location.href.match(/^[^\?]*\/(?:)/)[0] + b);
30                    if (!b) throw 'The CKEditor installation path could not be automatically detected. Please set the global variable "CKEDITOR_BASEPATH" before creating editor instances.';
31                    return b
32                }(),
33                getUrl: function(a) {
34                    -1 == a.indexOf(":/") && 0 !== a.indexOf("/") && (a = this.basePath + a);
35                    this.timestamp && "/" != a.charAt(a.length - 1) && !/[&?]t=/.test(a) && (a += (0 <= a.indexOf("?") ? "\x26" : "?") + "t\x3d" + this.timestamp);
36                    return a
37                },
38                domReady: function() {
39                    function a() {
40                        try {
41                            document.addEventListener ? (document.removeEventListener("DOMContentLoaded",
42                                a, !1), b()) : document.attachEvent && "complete" === document.readyState && (document.detachEvent("onreadystatechange", a), b())
43                        } catch (c) {}
44                    }
45
46                    function b() {
47                        for (var a; a = c.shift();) a()
48                    }
49                    var c = [];
50                    return function(b) {
51                        function n() {
52                            try {
53                                document.documentElement.doScroll("left")
54                            } catch (e) {
55                                setTimeout(n, 1);
56                                return
57                            }
58                            a()
59                        }
60                        c.push(b);
61                        "complete" === document.readyState && setTimeout(a, 1);
62                        if (1 == c.length)
63                            if (document.addEventListener) document.addEventListener("DOMContentLoaded", a, !1), window.addEventListener("load", a, !1);
64                            else if (document.attachEvent) {
65                            document.attachEvent("onreadystatechange",
66                                a);
67                            window.attachEvent("onload", a);
68                            b = !1;
69                            try {
70                                b = !window.frameElement
71                            } catch (r) {}
72                            document.documentElement.doScroll && b && n()
73                        }
74                    }
75                }()
76            },
77            b = window.CKEDITOR_GETURL;
78        if (b) {
79            var c = d.getUrl;
80            d.getUrl = function(a) {
81                return b.call(d, a) || c.call(d, a)
82            }
83        }
84        return d
85    }());
86    CKEDITOR.event || (CKEDITOR.event = function() {}, CKEDITOR.event.implementOn = function(a) {
87        var d = CKEDITOR.event.prototype,
88            b;
89        for (b in d) null == a[b] && (a[b] = d[b])
90    }, CKEDITOR.event.prototype = function() {
91        function a(a) {
92            var f = d(this);
93            return f[a] || (f[a] = new b(a))
94        }
95        var d = function(a) {
96                a = a.getPrivate && a.getPrivate() || a._ || (a._ = {});
97                return a.events || (a.events = {})
98            },
99            b = function(a) {
100                this.name = a;
101                this.listeners = []
102            };
103        b.prototype = {
104            getListenerIndex: function(a) {
105                for (var b = 0, d = this.listeners; b < d.length; b++)
106                    if (d[b].fn == a) return b;
107                return -1
108            }
109        };
110        return {
111            define: function(b, d) {
112                var h = a.call(this, b);
113                CKEDITOR.tools.extend(h, d, !0)
114            },
115            on: function(b, d, h, k, g) {
116                function n(e, a, y, v) {
117                    e = {
118                        name: b,
119                        sender: this,
120                        editor: e,
121                        data: a,
122                        listenerData: k,
123                        stop: y,
124                        cancel: v,
125                        removeListener: r
126                    };
127                    return !1 === d.call(h, e) ? !1 : e.data
128                }
129
130                function r() {
131                    y.removeListener(b, d)
132                }
133                var e = a.call(this, b);
134                if (0 > e.getListenerIndex(d)) {
135                    e = e.listeners;
136                    h || (h = this);
137                    isNaN(g) && (g = 10);
138                    var y = this;
139                    n.fn = d;
140                    n.priority = g;
141                    for (var v = e.length - 1; 0 <= v; v--)
142                        if (e[v].priority <= g) return e.splice(v + 1, 0, n), {
143                            removeListener: r
144                        };
145                    e.unshift(n)
146                }
147                return {
148                    removeListener: r
149                }
150            },
151            once: function() {
152                var a = Array.prototype.slice.call(arguments),
153                    b = a[1];
154                a[1] = function(a) {
155                    a.removeListener();
156                    return b.apply(this, arguments)
157                };
158                return this.on.apply(this, a)
159            },
160            capture: function() {
161                CKEDITOR.event.useCapture = 1;
162                var a = this.on.apply(this, arguments);
163                CKEDITOR.event.useCapture = 0;
164                return a
165            },
166            fire: function() {
167                var a = 0,
168                    b = function() {
169                        a = 1
170                    },
171                    h = 0,
172                    k = function() {
173                        h = 1
174                    };
175                return function(g, n, r) {
176                    var e = d(this)[g];
177                    g = a;
178                    var y = h;
179                    a = h = 0;
180                    if (e) {
181                        var v = e.listeners;
182                        if (v.length)
183                            for (var v = v.slice(0), B, D = 0; D < v.length; D++) {
184                                if (e.errorProof) try {
185                                    B =
186                                        v[D].call(this, r, n, b, k)
187                                } catch (x) {} else B = v[D].call(this, r, n, b, k);
188                                !1 === B ? h = 1 : "undefined" != typeof B && (n = B);
189                                if (a || h) break
190                            }
191                    }
192                    n = h ? !1 : "undefined" == typeof n ? !0 : n;
193                    a = g;
194                    h = y;
195                    return n
196                }
197            }(),
198            fireOnce: function(a, b, h) {
199                b = this.fire(a, b, h);
200                delete d(this)[a];
201                return b
202            },
203            removeListener: function(a, b) {
204                var h = d(this)[a];
205                if (h) {
206                    var k = h.getListenerIndex(b);
207                    0 <= k && h.listeners.splice(k, 1)
208                }
209            },
210            removeAllListeners: function() {
211                var a = d(this),
212                    b;
213                for (b in a) delete a[b]
214            },
215            hasListeners: function(a) {
216                return (a = d(this)[a]) && 0 < a.listeners.length
217            }
218        }
219    }());
220    CKEDITOR.editor || (CKEDITOR.editor = function() {
221        CKEDITOR._.pending.push([this, arguments]);
222        CKEDITOR.event.call(this)
223    }, CKEDITOR.editor.prototype.fire = function(a, d) {
224        a in {
225            instanceReady: 1,
226            loaded: 1
227        } && (this[a] = !0);
228        return CKEDITOR.event.prototype.fire.call(this, a, d, this)
229    }, CKEDITOR.editor.prototype.fireOnce = function(a, d) {
230        a in {
231            instanceReady: 1,
232            loaded: 1
233        } && (this[a] = !0);
234        return CKEDITOR.event.prototype.fireOnce.call(this, a, d, this)
235    }, CKEDITOR.event.implementOn(CKEDITOR.editor.prototype));
236    CKEDITOR.env || (CKEDITOR.env = function() {
237        var a = navigator.userAgent.toLowerCase(),
238            d = a.match(/edge[ \/](\d+.?\d*)/),
239            b = -1 < a.indexOf("trident/"),
240            b = !(!d && !b),
241            b = {
242                ie: b,
243                edge: !!d,
244                webkit: !b && -1 < a.indexOf(" applewebkit/"),
245                air: -1 < a.indexOf(" adobeair/"),
246                mac: -1 < a.indexOf("macintosh"),
247                quirks: "BackCompat" == document.compatMode && (!document.documentMode || 10 > document.documentMode),
248                mobile: -1 < a.indexOf("mobile"),
249                iOS: /(ipad|iphone|ipod)/.test(a),
250                isCustomDomain: function() {
251                    if (!this.ie) return !1;
252                    var a = document.domain,
253                        b = window.location.hostname;
254                    return a != b && a != "[" + b + "]"
255                },
256                secure: "https:" == location.protocol
257            };
258        b.gecko = "Gecko" == navigator.product && !b.webkit && !b.ie;
259        b.webkit && (-1 < a.indexOf("chrome") ? b.chrome = !0 : b.safari = !0);
260        var c = 0;
261        b.ie && (c = d ? parseFloat(d[1]) : b.quirks || !document.documentMode ? parseFloat(a.match(/msie (\d+)/)[1]) : document.documentMode, b.ie9Compat = 9 == c, b.ie8Compat = 8 == c, b.ie7Compat = 7 == c, b.ie6Compat = 7 > c || b.quirks);
262        b.gecko && (d = a.match(/rv:([\d\.]+)/)) && (d = d[1].split("."), c = 1E4 * d[0] + 100 * (d[1] || 0) + 1 * (d[2] || 0));
263        b.air && (c = parseFloat(a.match(/ adobeair\/(\d+)/)[1]));
264        b.webkit && (c = parseFloat(a.match(/ applewebkit\/(\d+)/)[1]));
265        b.version = c;
266        b.isCompatible = !(b.ie && 7 > c) && !(b.gecko && 4E4 > c) && !(b.webkit && 534 > c);
267        b.hidpi = 2 <= window.devicePixelRatio;
268        b.needsBrFiller = b.gecko || b.webkit || b.ie && 10 < c;
269        b.needsNbspFiller = b.ie && 11 > c;
270        b.cssClass = "cke_browser_" + (b.ie ? "ie" : b.gecko ? "gecko" : b.webkit ? "webkit" : "unknown");
271        b.quirks && (b.cssClass += " cke_browser_quirks");
272        b.ie && (b.cssClass += " cke_browser_ie" + (b.quirks ? "6 cke_browser_iequirks" : b.version));
273        b.air && (b.cssClass += " cke_browser_air");
274        b.iOS && (b.cssClass += " cke_browser_ios");
275        b.hidpi && (b.cssClass += " cke_hidpi");
276        return b
277    }());
278    "unloaded" == CKEDITOR.status && function() {
279        CKEDITOR.event.implementOn(CKEDITOR);
280        CKEDITOR.loadFullCore = function() {
281            if ("basic_ready" != CKEDITOR.status) CKEDITOR.loadFullCore._load = 1;
282            else {
283                delete CKEDITOR.loadFullCore;
284                var a = document.createElement("script");
285                a.type = "text/javascript";
286                a.src = CKEDITOR.basePath + "ckeditor.js";
287                document.getElementsByTagName("head")[0].appendChild(a)
288            }
289        };
290        CKEDITOR.loadFullCoreTimeout = 0;
291        CKEDITOR.add = function(a) {
292            (this._.pending || (this._.pending = [])).push(a)
293        };
294        (function() {
295            CKEDITOR.domReady(function() {
296                var a =
297                    CKEDITOR.loadFullCore,
298                    d = CKEDITOR.loadFullCoreTimeout;
299                a && (CKEDITOR.status = "basic_ready", a && a._load ? a() : d && setTimeout(function() {
300                    CKEDITOR.loadFullCore && CKEDITOR.loadFullCore()
301                }, 1E3 * d))
302            })
303        })();
304        CKEDITOR.status = "basic_loaded"
305    }();
306    "use strict";
307    CKEDITOR.VERBOSITY_WARN = 1;
308    CKEDITOR.VERBOSITY_ERROR = 2;
309    CKEDITOR.verbosity = CKEDITOR.VERBOSITY_WARN | CKEDITOR.VERBOSITY_ERROR;
310    CKEDITOR.warn = function(a, d) {
311        CKEDITOR.verbosity & CKEDITOR.VERBOSITY_WARN && CKEDITOR.fire("log", {
312            type: "warn",
313            errorCode: a,
314            additionalData: d
315        })
316    };
317    CKEDITOR.error = function(a, d) {
318        CKEDITOR.verbosity & CKEDITOR.VERBOSITY_ERROR && CKEDITOR.fire("log", {
319            type: "error",
320            errorCode: a,
321            additionalData: d
322        })
323    };
324    CKEDITOR.on("log", function(a) {
325        if (window.console && window.console.log) {
326            var d = console[a.data.type] ? a.data.type : "log",
327                b = a.data.errorCode;
328            if (a = a.data.additionalData) console[d]("[CKEDITOR] Error code: " + b + ".", a);
329            else console[d]("[CKEDITOR] Error code: " + b + ".");
330            console[d]("[CKEDITOR] For more information about this error go to https://ckeditor.com/docs/ckeditor4/latest/guide/dev_errors.html#" + b)
331        }
332    }, null, null, 999);
333    CKEDITOR.dom = {};
334    (function() {
335        var a = [],
336            d = CKEDITOR.env.gecko ? "-moz-" : CKEDITOR.env.webkit ? "-webkit-" : CKEDITOR.env.ie ? "-ms-" : "",
337            b = /&/g,
338            c = />/g,
339            f = /</g,
340            h = /"/g,
341            k = /&(lt|gt|amp|quot|nbsp|shy|#\d{1,5});/g,
342            g = {
343                lt: "\x3c",
344                gt: "\x3e",
345                amp: "\x26",
346                quot: '"',
347                nbsp: " ",
348                shy: "­"
349            },
350            n = function(a, e) {
351                return "#" == e[0] ? String.fromCharCode(parseInt(e.slice(1), 10)) : g[e]
352            };
353        CKEDITOR.on("reset", function() {
354            a = []
355        });
356        CKEDITOR.tools = {
357            arrayCompare: function(a, e) {
358                if (!a && !e) return !0;
359                if (!a || !e || a.length != e.length) return !1;
360                for (var b = 0; b < a.length; b++)
361                    if (a[b] != e[b]) return !1;
362                return !0
363            },
364            getIndex: function(a, e) {
365                for (var b = 0; b < a.length; ++b)
366                    if (e(a[b])) return b;
367                return -1
368            },
369            clone: function(a) {
370                var e;
371                if (a && a instanceof Array) {
372                    e = [];
373                    for (var b = 0; b < a.length; b++) e[b] = CKEDITOR.tools.clone(a[b]);
374                    return e
375                }
376                if (null === a || "object" != typeof a || a instanceof String || a instanceof Number || a instanceof Boolean || a instanceof Date || a instanceof RegExp || a.nodeType || a.window === a) return a;
377                e = new a.constructor;
378                for (b in a) e[b] = CKEDITOR.tools.clone(a[b]);
379                return e
380            },
381            capitalize: function(a, e) {
382                return a.charAt(0).toUpperCase() +
383                    (e ? a.slice(1) : a.slice(1).toLowerCase())
384            },
385            extend: function(a) {
386                var e = arguments.length,
387                    b, v;
388                "boolean" == typeof(b = arguments[e - 1]) ? e-- : "boolean" == typeof(b = arguments[e - 2]) && (v = arguments[e - 1], e -= 2);
389                for (var c = 1; c < e; c++) {
390                    var g = arguments[c],
391                        d;
392                    for (d in g)
393                        if (!0 === b || null == a[d])
394                            if (!v || d in v) a[d] = g[d]
395                }
396                return a
397            },
398            prototypedCopy: function(a) {
399                var e = function() {};
400                e.prototype = a;
401                return new e
402            },
403            copy: function(a) {
404                var e = {},
405                    b;
406                for (b in a) e[b] = a[b];
407                return e
408            },
409            isArray: function(a) {
410                return "[object Array]" == Object.prototype.toString.call(a)
411            },
412            isEmpty: function(a) {
413                for (var e in a)
414                    if (a.hasOwnProperty(e)) return !1;
415                return !0
416            },
417            cssVendorPrefix: function(a, e, b) {
418                if (b) return d + a + ":" + e + ";" + a + ":" + e;
419                b = {};
420                b[a] = e;
421                b[d + a] = e;
422                return b
423            },
424            cssStyleToDomStyle: function() {
425                var a = document.createElement("div").style,
426                    e = "undefined" != typeof a.cssFloat ? "cssFloat" : "undefined" != typeof a.styleFloat ? "styleFloat" : "float";
427                return function(a) {
428                    return "float" == a ? e : a.replace(/-./g, function(a) {
429                        return a.substr(1).toUpperCase()
430                    })
431                }
432            }(),
433            buildStyleHtml: function(a) {
434                a = [].concat(a);
435                for (var e,
436                        b = [], v = 0; v < a.length; v++)
437                    if (e = a[v]) /@import|[{}]/.test(e) ? b.push("\x3cstyle\x3e" + e + "\x3c/style\x3e") : b.push('\x3clink type\x3d"text/css" rel\x3dstylesheet href\x3d"' + e + '"\x3e');
438                return b.join("")
439            },
440            htmlEncode: function(a) {
441                return void 0 === a || null === a ? "" : String(a).replace(b, "\x26amp;").replace(c, "\x26gt;").replace(f, "\x26lt;")
442            },
443            htmlDecode: function(a) {
444                return a.replace(k, n)
445            },
446            htmlEncodeAttr: function(a) {
447                return CKEDITOR.tools.htmlEncode(a).replace(h, "\x26quot;")
448            },
449            htmlDecodeAttr: function(a) {
450                return CKEDITOR.tools.htmlDecode(a)
451            },
452            transformPlainTextToHtml: function(a, e) {
453                var b = e == CKEDITOR.ENTER_BR,
454                    v = this.htmlEncode(a.replace(/\r\n/g, "\n")),
455                    v = v.replace(/\t/g, "\x26nbsp;\x26nbsp; \x26nbsp;"),
456                    c = e == CKEDITOR.ENTER_P ? "p" : "div";
457                if (!b) {
458                    var g = /\n{2}/g;
459                    if (g.test(v)) var d = "\x3c" + c + "\x3e",
460                        m = "\x3c/" + c + "\x3e",
461                        v = d + v.replace(g, function() {
462                            return m + d
463                        }) + m
464                }
465                v = v.replace(/\n/g, "\x3cbr\x3e");
466                b || (v = v.replace(new RegExp("\x3cbr\x3e(?\x3d\x3c/" + c + "\x3e)"), function(a) {
467                    return CKEDITOR.tools.repeat(a, 2)
468                }));
469                v = v.replace(/^ | $/g, "\x26nbsp;");
470                return v = v.replace(/(>|\s) /g,
471                    function(a, e) {
472                        return e + "\x26nbsp;"
473                    }).replace(/ (?=<)/g, "\x26nbsp;")
474            },
475            getNextNumber: function() {
476                var a = 0;
477                return function() {
478                    return ++a
479                }
480            }(),
481            getNextId: function() {
482                return "cke_" + this.getNextNumber()
483            },
484            getUniqueId: function() {
485                for (var a = "e", e = 0; 8 > e; e++) a += Math.floor(65536 * (1 + Math.random())).toString(16).substring(1);
486                return a
487            },
488            override: function(a, e) {
489                var b = e(a);
490                b.prototype = a.prototype;
491                return b
492            },
493            setTimeout: function(a, e, b, c, g) {
494                g || (g = window);
495                b || (b = g);
496                return g.setTimeout(function() {
497                        c ? a.apply(b, [].concat(c)) : a.apply(b)
498                    },
499                    e || 0)
500            },
501            throttle: function(a, e, b) {
502                var c, g = 0;
503                b = b || {};
504                return {
505                    input: function() {
506                        function d() {
507                            g = (new Date).getTime();
508                            c = !1;
509                            e.apply(b, n)
510                        }
511                        var n = Array.prototype.slice.call(arguments);
512                        c && (clearTimeout(c), c = 0);
513                        var m = (new Date).getTime() - g;
514                        m < a ? c = setTimeout(d, a - m) : d()
515                    },
516                    reset: function() {
517                        c && (clearTimeout(c), c = g = 0)
518                    }
519                }
520            },
521            trim: function() {
522                var a = /(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;
523                return function(e) {
524                    return e.replace(a, "")
525                }
526            }(),
527            ltrim: function() {
528                var a = /^[ \t\n\r]+/g;
529                return function(e) {
530                    return e.replace(a, "")
531                }
532            }(),
533            rtrim: function() {
534                var a =
535                    /[ \t\n\r]+$/g;
536                return function(e) {
537                    return e.replace(a, "")
538                }
539            }(),
540            indexOf: function(a, e) {
541                if ("function" == typeof e)
542                    for (var b = 0, c = a.length; b < c; b++) {
543                        if (e(a[b])) return b
544                    } else {
545                        if (a.indexOf) return a.indexOf(e);
546                        b = 0;
547                        for (c = a.length; b < c; b++)
548                            if (a[b] === e) return b
549                    }
550                return -1
551            },
552            search: function(a, e) {
553                var b = CKEDITOR.tools.indexOf(a, e);
554                return 0 <= b ? a[b] : null
555            },
556            bind: function(a, e) {
557                return function() {
558                    return a.apply(e, arguments)
559                }
560            },
561            createClass: function(a) {
562                var e = a.$,
563                    b = a.base,
564                    c = a.privates || a._,
565                    g = a.proto;
566                a = a.statics;
567                !e && (e = function() {
568                    b &&
569                        this.base.apply(this, arguments)
570                });
571                if (c) var d = e,
572                    e = function() {
573                        var a = this._ || (this._ = {}),
574                            e;
575                        for (e in c) {
576                            var b = c[e];
577                            a[e] = "function" == typeof b ? CKEDITOR.tools.bind(b, this) : b
578                        }
579                        d.apply(this, arguments)
580                    };
581                b && (e.prototype = this.prototypedCopy(b.prototype), e.prototype.constructor = e, e.base = b, e.baseProto = b.prototype, e.prototype.base = function() {
582                    this.base = b.prototype.base;
583                    b.apply(this, arguments);
584                    this.base = arguments.callee
585                });
586                g && this.extend(e.prototype, g, !0);
587                a && this.extend(e, a, !0);
588                return e
589            },
590            addFunction: function(b, e) {
591                return a.push(function() {
592                    return b.apply(e ||
593                        this, arguments)
594                }) - 1
595            },
596            removeFunction: function(b) {
597                a[b] = null
598            },
599            callFunction: function(b) {
600                var e = a[b];
601                return e && e.apply(window, Array.prototype.slice.call(arguments, 1))
602            },
603            cssLength: function() {
604                var a = /^-?\d+\.?\d*px$/,
605                    e;
606                return function(b) {
607                    e = CKEDITOR.tools.trim(b + "") + "px";
608                    return a.test(e) ? e : b || ""
609                }
610            }(),
611            convertToPx: function() {
612                var a;
613                return function(e) {
614                    a || (a = CKEDITOR.dom.element.createFromHtml('\x3cdiv style\x3d"position:absolute;left:-9999px;top:-9999px;margin:0px;padding:0px;border:0px;"\x3e\x3c/div\x3e', CKEDITOR.document),
615                        CKEDITOR.document.getBody().append(a));
616                    return /%$/.test(e) ? e : (a.setStyle("width", e), a.$.clientWidth)
617                }
618            }(),
619            repeat: function(a, e) {
620                return Array(e + 1).join(a)
621            },
622            tryThese: function() {
623                for (var a, e = 0, b = arguments.length; e < b; e++) {
624                    var c = arguments[e];
625                    try {
626                        a = c();
627                        break
628                    } catch (g) {}
629                }
630                return a
631            },
632            genKey: function() {
633                return Array.prototype.slice.call(arguments).join("-")
634            },
635            defer: function(a) {
636                return function() {
637                    var e = arguments,
638                        b = this;
639                    window.setTimeout(function() {
640                        a.apply(b, e)
641                    }, 0)
642                }
643            },
644            normalizeCssText: function(a, e) {
645                var b = [],
646                    c, g = CKEDITOR.tools.parseCssText(a,
647                        !0, e);
648                for (c in g) b.push(c + ":" + g[c]);
649                b.sort();
650                return b.length ? b.join(";") + ";" : ""
651            },
652            convertRgbToHex: function(a) {
653                return a.replace(/(?:rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\))/gi, function(a, b, c, g) {
654                    a = [b, c, g];
655                    for (b = 0; 3 > b; b++) a[b] = ("0" + parseInt(a[b], 10).toString(16)).slice(-2);
656                    return "#" + a.join("")
657                })
658            },
659            normalizeHex: function(a) {
660                return a.replace(/#(([0-9a-f]{3}){1,2})($|;|\s+)/gi, function(a, b, c, g) {
661                    a = b.toLowerCase();
662                    3 == a.length && (a = a.split(""), a = [a[0], a[0], a[1], a[1], a[2], a[2]].join(""));
663                    return "#" + a + g
664                })
665            },
666            parseCssText: function(a,
667                e, b) {
668                var c = {};
669                b && (a = (new CKEDITOR.dom.element("span")).setAttribute("style", a).getAttribute("style") || "");
670                a && (a = CKEDITOR.tools.normalizeHex(CKEDITOR.tools.convertRgbToHex(a)));
671                if (!a || ";" == a) return c;
672                a.replace(/&quot;/g, '"').replace(/\s*([^:;\s]+)\s*:\s*([^;]+)\s*(?=;|$)/g, function(a, b, g) {
673                    e && (b = b.toLowerCase(), "font-family" == b && (g = g.replace(/\s*,\s*/g, ",")), g = CKEDITOR.tools.trim(g));
674                    c[b] = g
675                });
676                return c
677            },
678            writeCssText: function(a, e) {
679                var b, c = [];
680                for (b in a) c.push(b + ":" + a[b]);
681                e && c.sort();
682                return c.join("; ")
683            },
684            objectCompare: function(a, e, b) {
685                var c;
686                if (!a && !e) return !0;
687                if (!a || !e) return !1;
688                for (c in a)
689                    if (a[c] != e[c]) return !1;
690                if (!b)
691                    for (c in e)
692                        if (a[c] != e[c]) return !1;
693                return !0
694            },
695            objectKeys: function(a) {
696                var e = [],
697                    b;
698                for (b in a) e.push(b);
699                return e
700            },
701            convertArrayToObject: function(a, e) {
702                var b = {};
703                1 == arguments.length && (e = !0);
704                for (var c = 0, g = a.length; c < g; ++c) b[a[c]] = e;
705                return b
706            },
707            fixDomain: function() {
708                for (var a;;) try {
709                    a = window.parent.document.domain;
710                    break
711                } catch (e) {
712                    a = a ? a.replace(/.+?(?:\.|$)/, "") : document.domain;
713                    if (!a) break;
714                    document.domain =
715                        a
716                }
717                return !!a
718            },
719            eventsBuffer: function(a, e, b) {
720                function c() {
721                    d = (new Date).getTime();
722                    g = !1;
723                    b ? e.call(b) : e()
724                }
725                var g, d = 0;
726                return {
727                    input: function() {
728                        if (!g) {
729                            var e = (new Date).getTime() - d;
730                            e < a ? g = setTimeout(c, a - e) : c()
731                        }
732                    },
733                    reset: function() {
734                        g && clearTimeout(g);
735                        g = d = 0
736                    }
737                }
738            },
739            enableHtml5Elements: function(a, e) {
740                for (var b = "abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup main mark meter nav output progress section summary time video".split(" "), c = b.length, g; c--;) g = a.createElement(b[c]),
741                    e && a.appendChild(g)
742            },
743            checkIfAnyArrayItemMatches: function(a, e) {
744                for (var b = 0, c = a.length; b < c; ++b)
745                    if (a[b].match(e)) return !0;
746                return !1
747            },
748            checkIfAnyObjectPropertyMatches: function(a, e) {
749                for (var b in a)
750                    if (b.match(e)) return !0;
751                return !1
752            },
753            keystrokeToString: function(a, e) {
754                var b = this.keystrokeToArray(a, e);
755                b.display = b.display.join("+");
756                b.aria = b.aria.join("+");
757                return b
758            },
759            keystrokeToArray: function(a, e) {
760                var b = e & 16711680,
761                    c = e & 65535,
762                    g = CKEDITOR.env.mac,
763                    d = [],
764                    n = [];
765                b & CKEDITOR.CTRL && (d.push(g ? "⌘" : a[17]), n.push(g ? a[224] : a[17]));
766                b & CKEDITOR.ALT && (d.push(g ? "⌥" : a[18]), n.push(a[18]));
767                b & CKEDITOR.SHIFT && (d.push(g ? "⇧" : a[16]), n.push(a[16]));
768                c && (a[c] ? (d.push(a[c]), n.push(a[c])) : (d.push(String.fromCharCode(c)), n.push(String.fromCharCode(c))));
769                return {
770                    display: d,
771                    aria: n
772                }
773            },
774            transparentImageData: "data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw\x3d\x3d",
775            getCookie: function(a) {
776                a = a.toLowerCase();
777                for (var e = document.cookie.split(";"), b, c, g = 0; g < e.length; g++)
778                    if (b = e[g].split("\x3d"), c = decodeURIComponent(CKEDITOR.tools.trim(b[0]).toLowerCase()),
779                        c === a) return decodeURIComponent(1 < b.length ? b[1] : "");
780                return null
781            },
782            setCookie: function(a, e) {
783                document.cookie = encodeURIComponent(a) + "\x3d" + encodeURIComponent(e) + ";path\x3d/"
784            },
785            getCsrfToken: function() {
786                var a = CKEDITOR.tools.getCookie("ckCsrfToken");
787                if (!a || 40 != a.length) {
788                    var a = [],
789                        e = "";
790                    if (window.crypto && window.crypto.getRandomValues) a = new Uint8Array(40), window.crypto.getRandomValues(a);
791                    else
792                        for (var b = 0; 40 > b; b++) a.push(Math.floor(256 * Math.random()));
793                    for (b = 0; b < a.length; b++) var c = "abcdefghijklmnopqrstuvwxyz0123456789".charAt(a[b] %
794                            36),
795                        e = e + (.5 < Math.random() ? c.toUpperCase() : c);
796                    a = e;
797                    CKEDITOR.tools.setCookie("ckCsrfToken", a)
798                }
799                return a
800            },
801            escapeCss: function(a) {
802                return a ? window.CSS && CSS.escape ? CSS.escape(a) : isNaN(parseInt(a.charAt(0), 10)) ? a : "\\3" + a.charAt(0) + " " + a.substring(1, a.length) : ""
803            },
804            getMouseButton: function(a) {
805                var b = (a = a.data) && a.$;
806                return a && b ? CKEDITOR.env.ie && 9 > CKEDITOR.env.version ? 4 === b.button ? CKEDITOR.MOUSE_BUTTON_MIDDLE : 1 === b.button ? CKEDITOR.MOUSE_BUTTON_LEFT : CKEDITOR.MOUSE_BUTTON_RIGHT : b.button : !1
807            },
808            convertHexStringToBytes: function(a) {
809                var b = [],
810                    c = a.length / 2,
811                    g;
812                for (g = 0; g < c; g++) b.push(parseInt(a.substr(2 * g, 2), 16));
813                return b
814            },
815            convertBytesToBase64: function(a) {
816                var b = "",
817                    c = a.length,
818                    g;
819                for (g = 0; g < c; g += 3) {
820                    var d = a.slice(g, g + 3),
821                        n = d.length,
822                        f = [],
823                        m;
824                    if (3 > n)
825                        for (m = n; 3 > m; m++) d[m] = 0;
826                    f[0] = (d[0] & 252) >> 2;
827                    f[1] = (d[0] & 3) << 4 | d[1] >> 4;
828                    f[2] = (d[1] & 15) << 2 | (d[2] & 192) >> 6;
829                    f[3] = d[2] & 63;
830                    for (m = 0; 4 > m; m++) b = m <= n ? b + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(f[m]) : b + "\x3d"
831                }
832                return b
833            },
834            style: {
835                parse: {
836                    _colors: {
837                        aliceblue: "#F0F8FF",
838                        antiquewhite: "#FAEBD7",
839                        aqua: "#00FFFF",
840                        aquamarine: "#7FFFD4",
841                        azure: "#F0FFFF",
842                        beige: "#F5F5DC",
843                        bisque: "#FFE4C4",
844                        black: "#000000",
845                        blanchedalmond: "#FFEBCD",
846                        blue: "#0000FF",
847                        blueviolet: "#8A2BE2",
848                        brown: "#A52A2A",
849                        burlywood: "#DEB887",
850                        cadetblue: "#5F9EA0",
851                        chartreuse: "#7FFF00",
852                        chocolate: "#D2691E",
853                        coral: "#FF7F50",
854                        cornflowerblue: "#6495ED",
855                        cornsilk: "#FFF8DC",
856                        crimson: "#DC143C",
857                        cyan: "#00FFFF",
858                        darkblue: "#00008B",
859                        darkcyan: "#008B8B",
860                        darkgoldenrod: "#B8860B",
861                        darkgray: "#A9A9A9",
862                        darkgreen: "#006400",
863                        darkgrey: "#A9A9A9",
864                        darkkhaki: "#BDB76B",
865                        darkmagenta: "#8B008B",
866                        darkolivegreen: "#556B2F",
867                        darkorange: "#FF8C00",
868                        darkorchid: "#9932CC",
869                        darkred: "#8B0000",
870                        darksalmon: "#E9967A",
871                        darkseagreen: "#8FBC8F",
872                        darkslateblue: "#483D8B",
873                        darkslategray: "#2F4F4F",
874                        darkslategrey: "#2F4F4F",
875                        darkturquoise: "#00CED1",
876                        darkviolet: "#9400D3",
877                        deeppink: "#FF1493",
878                        deepskyblue: "#00BFFF",
879                        dimgray: "#696969",
880                        dimgrey: "#696969",
881                        dodgerblue: "#1E90FF",
882                        firebrick: "#B22222",
883                        floralwhite: "#FFFAF0",
884                        forestgreen: "#228B22",
885                        fuchsia: "#FF00FF",
886                        gainsboro: "#DCDCDC",
887                        ghostwhite: "#F8F8FF",
888                        gold: "#FFD700",
889                        goldenrod: "#DAA520",
890                        gray: "#808080",
891                        green: "#008000",
892                        greenyellow: "#ADFF2F",
893                        grey: "#808080",
894                        honeydew: "#F0FFF0",
895                        hotpink: "#FF69B4",
896                        indianred: "#CD5C5C",
897                        indigo: "#4B0082",
898                        ivory: "#FFFFF0",
899                        khaki: "#F0E68C",
900                        lavender: "#E6E6FA",
901                        lavenderblush: "#FFF0F5",
902                        lawngreen: "#7CFC00",
903                        lemonchiffon: "#FFFACD",
904                        lightblue: "#ADD8E6",
905                        lightcoral: "#F08080",
906                        lightcyan: "#E0FFFF",
907                        lightgoldenrodyellow: "#FAFAD2",
908                        lightgray: "#D3D3D3",
909                        lightgreen: "#90EE90",
910                        lightgrey: "#D3D3D3",
911                        lightpink: "#FFB6C1",
912                        lightsalmon: "#FFA07A",
913                        lightseagreen: "#20B2AA",
914                        lightskyblue: "#87CEFA",
915                        lightslategray: "#778899",
916                        lightslategrey: "#778899",
917                        lightsteelblue: "#B0C4DE",
918                        lightyellow: "#FFFFE0",
919                        lime: "#00FF00",
920                        limegreen: "#32CD32",
921                        linen: "#FAF0E6",
922                        magenta: "#FF00FF",
923                        maroon: "#800000",
924                        mediumaquamarine: "#66CDAA",
925                        mediumblue: "#0000CD",
926                        mediumorchid: "#BA55D3",
927                        mediumpurple: "#9370DB",
928                        mediumseagreen: "#3CB371",
929                        mediumslateblue: "#7B68EE",
930                        mediumspringgreen: "#00FA9A",
931                        mediumturquoise: "#48D1CC",
932                        mediumvioletred: "#C71585",
933                        midnightblue: "#191970",
934                        mintcream: "#F5FFFA",
935                        mistyrose: "#FFE4E1",
936                        moccasin: "#FFE4B5",
937                        navajowhite: "#FFDEAD",
938                        navy: "#000080",
939                        oldlace: "#FDF5E6",
940                        olive: "#808000",
941                        olivedrab: "#6B8E23",
942                        orange: "#FFA500",
943                        orangered: "#FF4500",
944                        orchid: "#DA70D6",
945                        palegoldenrod: "#EEE8AA",
946                        palegreen: "#98FB98",
947                        paleturquoise: "#AFEEEE",
948                        palevioletred: "#DB7093",
949                        papayawhip: "#FFEFD5",
950                        peachpuff: "#FFDAB9",
951                        peru: "#CD853F",
952                        pink: "#FFC0CB",
953                        plum: "#DDA0DD",
954                        powderblue: "#B0E0E6",
955                        purple: "#800080",
956                        rebeccapurple: "#663399",
957                        red: "#FF0000",
958                        rosybrown: "#BC8F8F",
959                        royalblue: "#4169E1",
960                        saddlebrown: "#8B4513",
961                        salmon: "#FA8072",
962                        sandybrown: "#F4A460",
963                        seagreen: "#2E8B57",
964                        seashell: "#FFF5EE",
965                        sienna: "#A0522D",
966                        silver: "#C0C0C0",
967                        skyblue: "#87CEEB",
968                        slateblue: "#6A5ACD",
969                        slategray: "#708090",
970                        slategrey: "#708090",
971                        snow: "#FFFAFA",
972                        springgreen: "#00FF7F",
973                        steelblue: "#4682B4",
974                        tan: "#D2B48C",
975                        teal: "#008080",
976                        thistle: "#D8BFD8",
977                        tomato: "#FF6347",
978                        turquoise: "#40E0D0",
979                        violet: "#EE82EE",
980                        wheat: "#F5DEB3",
981                        white: "#FFFFFF",
982                        whitesmoke: "#F5F5F5",
983                        yellow: "#FFFF00",
984                        yellowgreen: "#9ACD32"
985                    },
986                    _borderStyle: "none hidden dotted dashed solid double groove ridge inset outset".split(" "),
987                    _widthRegExp: /^(thin|medium|thick|[\+-]?\d+(\.\d+)?[a-z%]+|[\+-]?0+(\.0+)?|\.\d+[a-z%]+)$/,
988                    _rgbaRegExp: /rgba?\(\s*\d+%?\s*,\s*\d+%?\s*,\s*\d+%?\s*(?:,\s*[0-9.]+\s*)?\)/gi,
989                    _hslaRegExp: /hsla?\(\s*[0-9.]+\s*,\s*\d+%\s*,\s*\d+%\s*(?:,\s*[0-9.]+\s*)?\)/gi,
990                    background: function(a) {
991                        var b = {},
992                            c = this._findColor(a);
993                        c.length && (b.color = c[0], CKEDITOR.tools.array.forEach(c, function(b) {
994                            a = a.replace(b, "")
995                        }));
996                        if (a = CKEDITOR.tools.trim(a)) b.unprocessed = a;
997                        return b
998                    },
999                    margin: function(a) {
1000                        function b(a) {
1001                            c.top = g[a[0]];
1002                            c.right = g[a[1]];
1003                            c.bottom = g[a[2]];
1004                            c.left = g[a[3]]
1005                        }
1006                        var c = {},
1007                            g = a.match(/(?:\-?[\.\d]+(?:%|\w*)|auto|inherit|initial|unset)/g) || ["0px"];
1008                        switch (g.length) {
1009                            case 1:
1010                                b([0, 0, 0, 0]);
1011                                break;
1012                            case 2:
1013                                b([0, 1, 0, 1]);
1014                                break;
1015                            case 3:
1016                                b([0, 1, 2, 1]);
1017                                break;
1018                            case 4:
1019                                b([0, 1, 2, 3])
1020                        }
1021                        return c
1022                    },
1023                    border: function(a) {
1024                        var b = {},
1025                            c = a.split(/\s+/g);
1026                        a = CKEDITOR.tools.style.parse._findColor(a);
1027                        a.length && (b.color = a[0]);
1028                        CKEDITOR.tools.array.forEach(c, function(a) {
1029                            b.style || -1 === CKEDITOR.tools.indexOf(CKEDITOR.tools.style.parse._borderStyle, a) ? !b.width && CKEDITOR.tools.style.parse._widthRegExp.test(a) && (b.width = a) : b.style = a
1030                        });
1031                        return b
1032                    },
1033                    _findColor: function(a) {
1034                        var b = [],
1035                            c = CKEDITOR.tools.array,
1036                            b = b.concat(a.match(this._rgbaRegExp) || []),
1037                            b = b.concat(a.match(this._hslaRegExp) || []);
1038                        return b = b.concat(c.filter(a.split(/\s+/), function(a) {
1039                            return a.match(/^\#[a-f0-9]{3}(?:[a-f0-9]{3})?$/gi) ? !0 : a.toLowerCase() in CKEDITOR.tools.style.parse._colors
1040                        }))
1041                    }
1042                }
1043            },
1044            array: {
1045                filter: function(a, b, c) {
1046                    var g = [];
1047                    this.forEach(a, function(d, n) {
1048                        b.call(c, d, n, a) && g.push(d)
1049                    });
1050                    return g
1051                },
1052                forEach: function(a, b, c) {
1053                    var g = a.length,
1054                        d;
1055                    for (d = 0; d < g; d++) b.call(c, a[d], d, a)
1056                },
1057                map: function(a, b, c) {
1058                    for (var g = [], d = 0; d < a.length; d++) g.push(b.call(c,
1059                        a[d], d, a));
1060                    return g
1061                },
1062                reduce: function(a, b, c, g) {
1063                    for (var d = 0; d < a.length; d++) c = b.call(g, c, a[d], d, a);
1064                    return c
1065                },
1066                every: function(a, b, c) {
1067                    if (!a.length) return !0;
1068                    b = this.filter(a, b, c);
1069                    return a.length === b.length
1070                }
1071            },
1072            object: {
1073                findKey: function(a, b) {
1074                    if ("object" !== typeof a) return null;
1075                    for (var c in a)
1076                        if (a[c] === b) return c;
1077                    return null
1078                },
1079                merge: function(a, b) {
1080                    var c = CKEDITOR.tools,
1081                        g = c.clone(a),
1082                        d = c.clone(b);
1083                    c.array.forEach(c.objectKeys(d), function(a) {
1084                        g[a] = "object" === typeof d[a] && "object" === typeof g[a] ? c.object.merge(g[a], d[a]) :
1085                            d[a]
1086                    });
1087                    return g
1088                }
1089            },
1090            getAbsoluteRectPosition: function(a, b) {
1091                function c(a) {
1092                    if (a) {
1093                        var b = a.getClientRect();
1094                        g.top += b.top;
1095                        g.left += b.left;
1096                        "x" in g && "y" in g && (g.x += b.x, g.y += b.y);
1097                        c(a.getWindow().getFrame())
1098                    }
1099                }
1100                var g = CKEDITOR.tools.copy(b);
1101                c(a.getFrame());
1102                var d = CKEDITOR.document.getWindow().getScrollPosition();
1103                g.top += d.y;
1104                g.left += d.x;
1105                "x" in g && "y" in g && (g.y += d.y, g.x += d.x);
1106                g.right = g.left + g.width;
1107                g.bottom = g.top + g.height;
1108                return g
1109            }
1110        };
1111        CKEDITOR.tools.array.indexOf = CKEDITOR.tools.indexOf;
1112        CKEDITOR.tools.array.isArray = CKEDITOR.tools.isArray;
1113        CKEDITOR.MOUSE_BUTTON_LEFT = 0;
1114        CKEDITOR.MOUSE_BUTTON_MIDDLE = 1;
1115        CKEDITOR.MOUSE_BUTTON_RIGHT = 2
1116    })();
1117    CKEDITOR.dtd = function() {
1118        var a = CKEDITOR.tools.extend,
1119            d = function(a, b) {
1120                for (var c = CKEDITOR.tools.clone(a), g = 1; g < arguments.length; g++) {
1121                    b = arguments[g];
1122                    for (var d in b) delete c[d]
1123                }
1124                return c
1125            },
1126            b = {},
1127            c = {},
1128            f = {
1129                address: 1,
1130                article: 1,
1131                aside: 1,
1132                blockquote: 1,
1133                details: 1,
1134                div: 1,
1135                dl: 1,
1136                fieldset: 1,
1137                figure: 1,
1138                footer: 1,
1139                form: 1,
1140                h1: 1,
1141                h2: 1,
1142                h3: 1,
1143                h4: 1,
1144                h5: 1,
1145                h6: 1,
1146                header: 1,
1147                hgroup: 1,
1148                hr: 1,
1149                main: 1,
1150                menu: 1,
1151                nav: 1,
1152                ol: 1,
1153                p: 1,
1154                pre: 1,
1155                section: 1,
1156                table: 1,
1157                ul: 1
1158            },
1159            h = {
1160                command: 1,
1161                link: 1,
1162                meta: 1,
1163                noscript: 1,
1164                script: 1,
1165                style: 1
1166            },
1167            k = {},
1168            g = {
1169                "#": 1
1170            },
1171            n = {
1172                center: 1,
1173                dir: 1,
1174                noframes: 1
1175            };
1176        a(b, {
1177            a: 1,
1178            abbr: 1,
1179            area: 1,
1180            audio: 1,
1181            b: 1,
1182            bdi: 1,
1183            bdo: 1,
1184            br: 1,
1185            button: 1,
1186            canvas: 1,
1187            cite: 1,
1188            code: 1,
1189            command: 1,
1190            datalist: 1,
1191            del: 1,
1192            dfn: 1,
1193            em: 1,
1194            embed: 1,
1195            i: 1,
1196            iframe: 1,
1197            img: 1,
1198            input: 1,
1199            ins: 1,
1200            kbd: 1,
1201            keygen: 1,
1202            label: 1,
1203            map: 1,
1204            mark: 1,
1205            meter: 1,
1206            noscript: 1,
1207            object: 1,
1208            output: 1,
1209            progress: 1,
1210            q: 1,
1211            ruby: 1,
1212            s: 1,
1213            samp: 1,
1214            script: 1,
1215            select: 1,
1216            small: 1,
1217            span: 1,
1218            strong: 1,
1219            sub: 1,
1220            sup: 1,
1221            textarea: 1,
1222            time: 1,
1223            u: 1,
1224            "var": 1,
1225            video: 1,
1226            wbr: 1
1227        }, g, {
1228            acronym: 1,
1229            applet: 1,
1230            basefont: 1,
1231            big: 1,
1232            font: 1,
1233            isindex: 1,
1234            strike: 1,
1235            style: 1,
1236            tt: 1
1237        });
1238        a(c, f, b, n);
1239        d = {
1240            a: d(b, {
1241                a: 1,
1242                button: 1
1243            }),
1244            abbr: b,
1245            address: c,
1246            area: k,
1247            article: c,
1248            aside: c,
1249            audio: a({
1250                source: 1,
1251                track: 1
1252            }, c),
1253            b: b,
1254            base: k,
1255            bdi: b,
1256            bdo: b,
1257            blockquote: c,
1258            body: c,
1259            br: k,
1260            button: d(b, {
1261                a: 1,
1262                button: 1
1263            }),
1264            canvas: b,
1265            caption: c,
1266            cite: b,
1267            code: b,
1268            col: k,
1269            colgroup: {
1270                col: 1
1271            },
1272            command: k,
1273            datalist: a({
1274                option: 1
1275            }, b),
1276            dd: c,
1277            del: b,
1278            details: a({
1279                summary: 1
1280            }, c),
1281            dfn: b,
1282            div: c,
1283            dl: {
1284                dt: 1,
1285                dd: 1
1286            },
1287            dt: c,
1288            em: b,
1289            embed: k,
1290            fieldset: a({
1291                legend: 1
1292            }, c),
1293            figcaption: c,
1294            figure: a({
1295                figcaption: 1
1296            }, c),
1297            footer: c,
1298            form: c,
1299            h1: b,
1300            h2: b,
1301            h3: b,
1302            h4: b,
1303            h5: b,
1304            h6: b,
1305            head: a({
1306                title: 1,
1307                base: 1
1308            }, h),
1309            header: c,
1310            hgroup: {
1311                h1: 1,
1312                h2: 1,
1313                h3: 1,
1314                h4: 1,
1315                h5: 1,
1316                h6: 1
1317            },
1318            hr: k,
1319            html: a({
1320                head: 1,
1321                body: 1
1322            }, c, h),
1323            i: b,
1324            iframe: g,
1325            img: k,
1326            input: k,
1327            ins: b,
1328            kbd: b,
1329            keygen: k,
1330            label: b,
1331            legend: b,
1332            li: c,
1333            link: k,
1334            main: c,
1335            map: c,
1336            mark: b,
1337            menu: a({
1338                li: 1
1339            }, c),
1340            meta: k,
1341            meter: d(b, {
1342                meter: 1
1343            }),
1344            nav: c,
1345            noscript: a({
1346                link: 1,
1347                meta: 1,
1348                style: 1
1349            }, b),
1350            object: a({
1351                param: 1
1352            }, b),
1353            ol: {
1354                li: 1
1355            },
1356            optgroup: {
1357                option: 1
1358            },
1359            option: g,
1360            output: b,
1361            p: b,
1362            param: k,
1363            pre: b,
1364            progress: d(b, {
1365                progress: 1
1366            }),
1367            q: b,
1368            rp: b,
1369            rt: b,
1370            ruby: a({
1371                rp: 1,
1372                rt: 1
1373            }, b),
1374            s: b,
1375            samp: b,
1376            script: g,
1377            section: c,
1378            select: {
1379                optgroup: 1,
1380                option: 1
1381            },
1382            small: b,
1383            source: k,
1384            span: b,
1385            strong: b,
1386            style: g,
1387            sub: b,
1388            summary: a({
1389                h1: 1,
1390                h2: 1,
1391                h3: 1,
1392                h4: 1,
1393                h5: 1,
1394                h6: 1
1395            }, b),
1396            sup: b,
1397            table: {
1398                caption: 1,
1399                colgroup: 1,
1400                thead: 1,
1401                tfoot: 1,
1402                tbody: 1,
1403                tr: 1
1404            },
1405            tbody: {
1406                tr: 1
1407            },
1408            td: c,
1409            textarea: g,
1410            tfoot: {
1411                tr: 1
1412            },
1413            th: c,
1414            thead: {
1415                tr: 1
1416            },
1417            time: d(b, {
1418                time: 1
1419            }),
1420            title: g,
1421            tr: {
1422                th: 1,
1423                td: 1
1424            },
1425            track: k,
1426            u: b,
1427            ul: {
1428                li: 1
1429            },
1430            "var": b,
1431            video: a({
1432                source: 1,
1433                track: 1
1434            }, c),
1435            wbr: k,
1436            acronym: b,
1437            applet: a({
1438                param: 1
1439            }, c),
1440            basefont: k,
1441            big: b,
1442            center: c,
1443            dialog: k,
1444            dir: {
1445                li: 1
1446            },
1447            font: b,
1448            isindex: k,
1449            noframes: c,
1450            strike: b,
1451            tt: b
1452        };
1453        a(d, {
1454            $block: a({
1455                audio: 1,
1456                dd: 1,
1457                dt: 1,
1458                figcaption: 1,
1459                li: 1,
1460                video: 1
1461            }, f, n),
1462            $blockLimit: {
1463                article: 1,
1464                aside: 1,
1465                audio: 1,
1466                body: 1,
1467                caption: 1,
1468                details: 1,
1469                dir: 1,
1470                div: 1,
1471                dl: 1,
1472                fieldset: 1,
1473                figcaption: 1,
1474                figure: 1,
1475                footer: 1,
1476                form: 1,
1477                header: 1,
1478                hgroup: 1,
1479                main: 1,
1480                menu: 1,
1481                nav: 1,
1482                ol: 1,
1483                section: 1,
1484                table: 1,
1485                td: 1,
1486                th: 1,
1487                tr: 1,
1488                ul: 1,
1489                video: 1
1490            },
1491            $cdata: {
1492                script: 1,
1493                style: 1
1494            },
1495            $editable: {
1496                address: 1,
1497                article: 1,
1498                aside: 1,
1499                blockquote: 1,
1500                body: 1,
1501                details: 1,
1502                div: 1,
1503                fieldset: 1,
1504                figcaption: 1,
1505                footer: 1,
1506                form: 1,
1507                h1: 1,
1508                h2: 1,
1509                h3: 1,
1510                h4: 1,
1511                h5: 1,
1512                h6: 1,
1513                header: 1,
1514                hgroup: 1,
1515                main: 1,
1516                nav: 1,
1517                p: 1,
1518                pre: 1,
1519                section: 1
1520            },
1521            $empty: {
1522                area: 1,
1523                base: 1,
1524                basefont: 1,
1525                br: 1,
1526                col: 1,
1527                command: 1,
1528                dialog: 1,
1529                embed: 1,
1530                hr: 1,
1531                img: 1,
1532                input: 1,
1533                isindex: 1,
1534                keygen: 1,
1535                link: 1,
1536                meta: 1,
1537                param: 1,
1538                source: 1,
1539                track: 1,
1540                wbr: 1
1541            },
1542            $inline: b,
1543            $list: {
1544                dl: 1,
1545                ol: 1,
1546                ul: 1
1547            },
1548            $listItem: {
1549                dd: 1,
1550                dt: 1,
1551                li: 1
1552            },
1553            $nonBodyContent: a({
1554                body: 1,
1555                head: 1,
1556                html: 1
1557            }, d.head),
1558            $nonEditable: {
1559                applet: 1,
1560                audio: 1,
1561                button: 1,
1562                embed: 1,
1563                iframe: 1,
1564                map: 1,
1565                object: 1,
1566                option: 1,
1567                param: 1,
1568                script: 1,
1569                textarea: 1,
1570                video: 1
1571            },
1572            $object: {
1573                applet: 1,
1574                audio: 1,
1575                button: 1,
1576                hr: 1,
1577                iframe: 1,
1578                img: 1,
1579                input: 1,
1580                object: 1,
1581                select: 1,
1582                table: 1,
1583                textarea: 1,
1584                video: 1
1585            },
1586            $removeEmpty: {
1587                abbr: 1,
1588                acronym: 1,
1589                b: 1,
1590                bdi: 1,
1591                bdo: 1,
1592                big: 1,
1593                cite: 1,
1594                code: 1,
1595                del: 1,
1596                dfn: 1,
1597                em: 1,
1598                font: 1,
1599                i: 1,
1600                ins: 1,
1601                label: 1,
1602                kbd: 1,
1603                mark: 1,
1604                meter: 1,
1605                output: 1,
1606                q: 1,
1607                ruby: 1,
1608                s: 1,
1609                samp: 1,
1610                small: 1,
1611                span: 1,
1612                strike: 1,
1613                strong: 1,
1614                sub: 1,
1615                sup: 1,
1616                time: 1,
1617                tt: 1,
1618                u: 1,
1619                "var": 1
1620            },
1621            $tabIndex: {
1622                a: 1,
1623                area: 1,
1624                button: 1,
1625                input: 1,
1626                object: 1,
1627                select: 1,
1628                textarea: 1
1629            },
1630            $tableContent: {
1631                caption: 1,
1632                col: 1,
1633                colgroup: 1,
1634                tbody: 1,
1635                td: 1,
1636                tfoot: 1,
1637                th: 1,
1638                thead: 1,
1639                tr: 1
1640            },
1641            $transparent: {
1642                a: 1,
1643                audio: 1,
1644                canvas: 1,
1645                del: 1,
1646                ins: 1,
1647                map: 1,
1648                noscript: 1,
1649                object: 1,
1650                video: 1
1651            },
1652            $intermediate: {
1653                caption: 1,
1654                colgroup: 1,
1655                dd: 1,
1656                dt: 1,
1657                figcaption: 1,
1658                legend: 1,
1659                li: 1,
1660                optgroup: 1,
1661                option: 1,
1662                rp: 1,
1663                rt: 1,
1664                summary: 1,
1665                tbody: 1,
1666                td: 1,
1667                tfoot: 1,
1668                th: 1,
1669                thead: 1,
1670                tr: 1
1671            }
1672        });
1673        return d
1674    }();
1675    CKEDITOR.dom.event = function(a) {
1676        this.$ = a
1677    };
1678    CKEDITOR.dom.event.prototype = {
1679        getKey: function() {
1680            return this.$.keyCode || this.$.which
1681        },
1682        getKeystroke: function() {
1683            var a = this.getKey();
1684            if (this.$.ctrlKey || this.$.metaKey) a += CKEDITOR.CTRL;
1685            this.$.shiftKey && (a += CKEDITOR.SHIFT);
1686            this.$.altKey && (a += CKEDITOR.ALT);
1687            return a
1688        },
1689        preventDefault: function(a) {
1690            var d = this.$;
1691            d.preventDefault ? d.preventDefault() : d.returnValue = !1;
1692            a && this.stopPropagation()
1693        },
1694        stopPropagation: function() {
1695            var a = this.$;
1696            a.stopPropagation ? a.stopPropagation() : a.cancelBubble = !0
1697        },
1698        getTarget: function() {
1699            var a =
1700                this.$.target || this.$.srcElement;
1701            return a ? new CKEDITOR.dom.node(a) : null
1702        },
1703        getPhase: function() {
1704            return this.$.eventPhase || 2
1705        },
1706        getPageOffset: function() {
1707            var a = this.getTarget().getDocument().$;
1708            return {
1709                x: this.$.pageX || this.$.clientX + (a.documentElement.scrollLeft || a.body.scrollLeft),
1710                y: this.$.pageY || this.$.clientY + (a.documentElement.scrollTop || a.body.scrollTop)
1711            }
1712        }
1713    };
1714    CKEDITOR.CTRL = 1114112;
1715    CKEDITOR.SHIFT = 2228224;
1716    CKEDITOR.ALT = 4456448;
1717    CKEDITOR.EVENT_PHASE_CAPTURING = 1;
1718    CKEDITOR.EVENT_PHASE_AT_TARGET = 2;
1719    CKEDITOR.EVENT_PHASE_BUBBLING = 3;
1720    CKEDITOR.dom.domObject = function(a) {
1721        a && (this.$ = a)
1722    };
1723    CKEDITOR.dom.domObject.prototype = function() {
1724        var a = function(a, b) {
1725            return function(c) {
1726                "undefined" != typeof CKEDITOR && a.fire(b, new CKEDITOR.dom.event(c))
1727            }
1728        };
1729        return {
1730            getPrivate: function() {
1731                var a;
1732                (a = this.getCustomData("_")) || this.setCustomData("_", a = {});
1733                return a
1734            },
1735            on: function(d) {
1736                var b = this.getCustomData("_cke_nativeListeners");
1737                b || (b = {}, this.setCustomData("_cke_nativeListeners", b));
1738                b[d] || (b = b[d] = a(this, d), this.$.addEventListener ? this.$.addEventListener(d, b, !!CKEDITOR.event.useCapture) : this.$.attachEvent && this.$.attachEvent("on" +
1739                    d, b));
1740                return CKEDITOR.event.prototype.on.apply(this, arguments)
1741            },
1742            removeListener: function(a) {
1743                CKEDITOR.event.prototype.removeListener.apply(this, arguments);
1744                if (!this.hasListeners(a)) {
1745                    var b = this.getCustomData("_cke_nativeListeners"),
1746                        c = b && b[a];
1747                    c && (this.$.removeEventListener ? this.$.removeEventListener(a, c, !1) : this.$.detachEvent && this.$.detachEvent("on" + a, c), delete b[a])
1748                }
1749            },
1750            removeAllListeners: function() {
1751                var a = this.getCustomData("_cke_nativeListeners"),
1752                    b;
1753                for (b in a) {
1754                    var c = a[b];
1755                    this.$.detachEvent ? this.$.detachEvent("on" +
1756                        b, c) : this.$.removeEventListener && this.$.removeEventListener(b, c, !1);
1757                    delete a[b]
1758                }
1759                CKEDITOR.event.prototype.removeAllListeners.call(this)
1760            }
1761        }
1762    }();
1763    (function(a) {
1764        var d = {};
1765        CKEDITOR.on("reset", function() {
1766            d = {}
1767        });
1768        a.equals = function(a) {
1769            try {
1770                return a && a.$ === this.$
1771            } catch (c) {
1772                return !1
1773            }
1774        };
1775        a.setCustomData = function(a, c) {
1776            var f = this.getUniqueId();
1777            (d[f] || (d[f] = {}))[a] = c;
1778            return this
1779        };
1780        a.getCustomData = function(a) {
1781            var c = this.$["data-cke-expando"];
1782            return (c = c && d[c]) && a in c ? c[a] : null
1783        };
1784        a.removeCustomData = function(a) {
1785            var c = this.$["data-cke-expando"],
1786                c = c && d[c],
1787                f, h;
1788            c && (f = c[a], h = a in c, delete c[a]);
1789            return h ? f : null
1790        };
1791        a.clearCustomData = function() {
1792            this.removeAllListeners();
1793            var a =
1794                this.$["data-cke-expando"];
1795            a && delete d[a]
1796        };
1797        a.getUniqueId = function() {
1798            return this.$["data-cke-expando"] || (this.$["data-cke-expando"] = CKEDITOR.tools.getNextNumber())
1799        };
1800        CKEDITOR.event.implementOn(a)
1801    })(CKEDITOR.dom.domObject.prototype);
1802    CKEDITOR.dom.node = function(a) {
1803        return a ? new CKEDITOR.dom[a.nodeType == CKEDITOR.NODE_DOCUMENT ? "document" : a.nodeType == CKEDITOR.NODE_ELEMENT ? "element" : a.nodeType == CKEDITOR.NODE_TEXT ? "text" : a.nodeType == CKEDITOR.NODE_COMMENT ? "comment" : a.nodeType == CKEDITOR.NODE_DOCUMENT_FRAGMENT ? "documentFragment" : "domObject"](a) : this
1804    };
1805    CKEDITOR.dom.node.prototype = new CKEDITOR.dom.domObject;
1806    CKEDITOR.NODE_ELEMENT = 1;
1807    CKEDITOR.NODE_DOCUMENT = 9;
1808    CKEDITOR.NODE_TEXT = 3;
1809    CKEDITOR.NODE_COMMENT = 8;
1810    CKEDITOR.NODE_DOCUMENT_FRAGMENT = 11;
1811    CKEDITOR.POSITION_IDENTICAL = 0;
1812    CKEDITOR.POSITION_DISCONNECTED = 1;
1813    CKEDITOR.POSITION_FOLLOWING = 2;
1814    CKEDITOR.POSITION_PRECEDING = 4;
1815    CKEDITOR.POSITION_IS_CONTAINED = 8;
1816    CKEDITOR.POSITION_CONTAINS = 16;
1817    CKEDITOR.tools.extend(CKEDITOR.dom.node.prototype, {
1818        appendTo: function(a, d) {
1819            a.append(this, d);
1820            return a
1821        },
1822        clone: function(a, d) {
1823            function b(c) {
1824                c["data-cke-expando"] && (c["data-cke-expando"] = !1);
1825                if (c.nodeType == CKEDITOR.NODE_ELEMENT || c.nodeType == CKEDITOR.NODE_DOCUMENT_FRAGMENT)
1826                    if (d || c.nodeType != CKEDITOR.NODE_ELEMENT || c.removeAttribute("id", !1), a) {
1827                        c = c.childNodes;
1828                        for (var f = 0; f < c.length; f++) b(c[f])
1829                    }
1830            }
1831
1832            function c(b) {
1833                if (b.type == CKEDITOR.NODE_ELEMENT || b.type == CKEDITOR.NODE_DOCUMENT_FRAGMENT) {
1834                    if (b.type != CKEDITOR.NODE_DOCUMENT_FRAGMENT) {
1835                        var d =
1836                            b.getName();
1837                        ":" == d[0] && b.renameNode(d.substring(1))
1838                    }
1839                    if (a)
1840                        for (d = 0; d < b.getChildCount(); d++) c(b.getChild(d))
1841                }
1842            }
1843            var f = this.$.cloneNode(a);
1844            b(f);
1845            f = new CKEDITOR.dom.node(f);
1846            CKEDITOR.env.ie && 9 > CKEDITOR.env.version && (this.type == CKEDITOR.NODE_ELEMENT || this.type == CKEDITOR.NODE_DOCUMENT_FRAGMENT) && c(f);
1847            return f
1848        },
1849        hasPrevious: function() {
1850            return !!this.$.previousSibling
1851        },
1852        hasNext: function() {
1853            return !!this.$.nextSibling
1854        },
1855        insertAfter: function(a) {
1856            a.$.parentNode.insertBefore(this.$, a.$.nextSibling);
1857            return a
1858        },
1859        insertBefore: function(a) {
1860            a.$.parentNode.insertBefore(this.$,
1861                a.$);
1862            return a
1863        },
1864        insertBeforeMe: function(a) {
1865            this.$.parentNode.insertBefore(a.$, this.$);
1866            return a
1867        },
1868        getAddress: function(a) {
1869            for (var d = [], b = this.getDocument().$.documentElement, c = this.$; c && c != b;) {
1870                var f = c.parentNode;
1871                f && d.unshift(this.getIndex.call({
1872                    $: c
1873                }, a));
1874                c = f
1875            }
1876            return d
1877        },
1878        getDocument: function() {
1879            return new CKEDITOR.dom.document(this.$.ownerDocument || this.$.parentNode.ownerDocument)
1880        },
1881        getIndex: function(a) {
1882            function d(a, c) {
1883                var n = c ? a.nextSibling : a.previousSibling;
1884                return n && n.nodeType == CKEDITOR.NODE_TEXT ? b(n) ? d(n,
1885                    c) : n : null
1886            }
1887
1888            function b(a) {
1889                return !a.nodeValue || a.nodeValue == CKEDITOR.dom.selection.FILLING_CHAR_SEQUENCE
1890            }
1891            var c = this.$,
1892                f = -1,
1893                h;
1894            if (!this.$.parentNode || a && c.nodeType == CKEDITOR.NODE_TEXT && b(c) && !d(c) && !d(c, !0)) return -1;
1895            do a && c != this.$ && c.nodeType == CKEDITOR.NODE_TEXT && (h || b(c)) || (f++, h = c.nodeType == CKEDITOR.NODE_TEXT); while (c = c.previousSibling);
1896            return f
1897        },
1898        getNextSourceNode: function(a, d, b) {
1899            if (b && !b.call) {
1900                var c = b;
1901                b = function(a) {
1902                    return !a.equals(c)
1903                }
1904            }
1905            a = !a && this.getFirst && this.getFirst();
1906            var f;
1907            if (!a) {
1908                if (this.type ==
1909                    CKEDITOR.NODE_ELEMENT && b && !1 === b(this, !0)) return null;
1910                a = this.getNext()
1911            }
1912            for (; !a && (f = (f || this).getParent());) {
1913                if (b && !1 === b(f, !0)) return null;
1914                a = f.getNext()
1915            }
1916            return !a || b && !1 === b(a) ? null : d && d != a.type ? a.getNextSourceNode(!1, d, b) : a
1917        },
1918        getPreviousSourceNode: function(a, d, b) {
1919            if (b && !b.call) {
1920                var c = b;
1921                b = function(a) {
1922                    return !a.equals(c)
1923                }
1924            }
1925            a = !a && this.getLast && this.getLast();
1926            var f;
1927            if (!a) {
1928                if (this.type == CKEDITOR.NODE_ELEMENT && b && !1 === b(this, !0)) return null;
1929                a = this.getPrevious()
1930            }
1931            for (; !a && (f = (f || this).getParent());) {
1932                if (b && !1 ===
1933                    b(f, !0)) return null;
1934                a = f.getPrevious()
1935            }
1936            return !a || b && !1 === b(a) ? null : d && a.type != d ? a.getPreviousSourceNode(!1, d, b) : a
1937        },
1938        getPrevious: function(a) {
1939            var d = this.$,
1940                b;
1941            do b = (d = d.previousSibling) && 10 != d.nodeType && new CKEDITOR.dom.node(d); while (b && a && !a(b));
1942            return b
1943        },
1944        getNext: function(a) {
1945            var d = this.$,
1946                b;
1947            do b = (d = d.nextSibling) && new CKEDITOR.dom.node(d); while (b && a && !a(b));
1948            return b
1949        },
1950        getParent: function(a) {
1951            var d = this.$.parentNode;
1952            return d && (d.nodeType == CKEDITOR.NODE_ELEMENT || a && d.nodeType == CKEDITOR.NODE_DOCUMENT_FRAGMENT) ?
1953                new CKEDITOR.dom.node(d) : null
1954        },
1955        getParents: function(a) {
1956            var d = this,
1957                b = [];
1958            do b[a ? "push" : "unshift"](d); while (d = d.getParent());
1959            return b
1960        },
1961        getCommonAncestor: function(a) {
1962            if (a.equals(this)) return this;
1963            if (a.contains && a.contains(this)) return a;
1964            var d = this.contains ? this : this.getParent();
1965            do
1966                if (d.contains(a)) return d; while (d = d.getParent());
1967            return null
1968        },
1969        getPosition: function(a) {
1970            var d = this.$,
1971                b = a.$;
1972            if (d.compareDocumentPosition) return d.compareDocumentPosition(b);
1973            if (d == b) return CKEDITOR.POSITION_IDENTICAL;
1974            if (this.type ==
1975                CKEDITOR.NODE_ELEMENT && a.type == CKEDITOR.NODE_ELEMENT) {
1976                if (d.contains) {
1977                    if (d.contains(b)) return CKEDITOR.POSITION_CONTAINS + CKEDITOR.POSITION_PRECEDING;
1978                    if (b.contains(d)) return CKEDITOR.POSITION_IS_CONTAINED + CKEDITOR.POSITION_FOLLOWING
1979                }
1980                if ("sourceIndex" in d) return 0 > d.sourceIndex || 0 > b.sourceIndex ? CKEDITOR.POSITION_DISCONNECTED : d.sourceIndex < b.sourceIndex ? CKEDITOR.POSITION_PRECEDING : CKEDITOR.POSITION_FOLLOWING
1981            }
1982            d = this.getAddress();
1983            a = a.getAddress();
1984            for (var b = Math.min(d.length, a.length), c = 0; c < b; c++)
1985                if (d[c] !=
1986                    a[c]) return d[c] < a[c] ? CKEDITOR.POSITION_PRECEDING : CKEDITOR.POSITION_FOLLOWING;
1987            return d.length < a.length ? CKEDITOR.POSITION_CONTAINS + CKEDITOR.POSITION_PRECEDING : CKEDITOR.POSITION_IS_CONTAINED + CKEDITOR.POSITION_FOLLOWING
1988        },
1989        getAscendant: function(a, d) {
1990            var b = this.$,
1991                c, f;
1992            d || (b = b.parentNode);
1993            "function" == typeof a ? (f = !0, c = a) : (f = !1, c = function(b) {
1994                b = "string" == typeof b.nodeName ? b.nodeName.toLowerCase() : "";
1995                return "string" == typeof a ? b == a : b in a
1996            });
1997            for (; b;) {
1998                if (c(f ? new CKEDITOR.dom.node(b) : b)) return new CKEDITOR.dom.node(b);
1999                try {
2000                    b = b.parentNode
2001                } catch (h) {
2002                    b = null
2003                }
2004            }
2005            return null
2006        },
2007        hasAscendant: function(a, d) {
2008            var b = this.$;
2009            d || (b = b.parentNode);
2010            for (; b;) {
2011                if (b.nodeName && b.nodeName.toLowerCase() == a) return !0;
2012                b = b.parentNode
2013            }
2014            return !1
2015        },
2016        move: function(a, d) {
2017            a.append(this.remove(), d)
2018        },
2019        remove: function(a) {
2020            var d = this.$,
2021                b = d.parentNode;
2022            if (b) {
2023                if (a)
2024                    for (; a = d.firstChild;) b.insertBefore(d.removeChild(a), d);
2025                b.removeChild(d)
2026            }
2027            return this
2028        },
2029        replace: function(a) {
2030            this.insertBefore(a);
2031            a.remove()
2032        },
2033        trim: function() {
2034            this.ltrim();
2035            this.rtrim()
2036        },
2037        ltrim: function() {
2038            for (var a; this.getFirst &&
2039                (a = this.getFirst());) {
2040                if (a.type == CKEDITOR.NODE_TEXT) {
2041                    var d = CKEDITOR.tools.ltrim(a.getText()),
2042                        b = a.getLength();
2043                    if (d) d.length < b && (a.split(b - d.length), this.$.removeChild(this.$.firstChild));
2044                    else {
2045                        a.remove();
2046                        continue
2047                    }
2048                }
2049                break
2050            }
2051        },
2052        rtrim: function() {
2053            for (var a; this.getLast && (a = this.getLast());) {
2054                if (a.type == CKEDITOR.NODE_TEXT) {
2055                    var d = CKEDITOR.tools.rtrim(a.getText()),
2056                        b = a.getLength();
2057                    if (d) d.length < b && (a.split(d.length), this.$.lastChild.parentNode.removeChild(this.$.lastChild));
2058                    else {
2059                        a.remove();
2060                        continue
2061                    }
2062                }
2063                break
2064            }
2065            CKEDITOR.env.needsBrFiller &&
2066                (a = this.$.lastChild) && 1 == a.type && "br" == a.nodeName.toLowerCase() && a.parentNode.removeChild(a)
2067        },
2068        isReadOnly: function(a) {
2069            var d = this;
2070            this.type != CKEDITOR.NODE_ELEMENT && (d = this.getParent());
2071            CKEDITOR.env.edge && d && d.is("textarea", "input") && (a = !0);
2072            if (!a && d && "undefined" != typeof d.$.isContentEditable) return !(d.$.isContentEditable || d.data("cke-editable"));
2073            for (; d;) {
2074                if (d.data("cke-editable")) return !1;
2075                if (d.hasAttribute("contenteditable")) return "false" == d.getAttribute("contenteditable");
2076                d = d.getParent()
2077            }
2078            return !0
2079        }
2080    });
2081    CKEDITOR.dom.window = function(a) {
2082        CKEDITOR.dom.domObject.call(this, a)
2083    };
2084    CKEDITOR.dom.window.prototype = new CKEDITOR.dom.domObject;
2085    CKEDITOR.tools.extend(CKEDITOR.dom.window.prototype, {
2086        focus: function() {
2087            this.$.focus()
2088        },
2089        getViewPaneSize: function() {
2090            var a = this.$.document,
2091                d = "CSS1Compat" == a.compatMode;
2092            return {
2093                width: (d ? a.documentElement.clientWidth : a.body.clientWidth) || 0,
2094                height: (d ? a.documentElement.clientHeight : a.body.clientHeight) || 0
2095            }
2096        },
2097        getScrollPosition: function() {
2098            var a = this.$;
2099            if ("pageXOffset" in a) return {
2100                x: a.pageXOffset || 0,
2101                y: a.pageYOffset || 0
2102            };
2103            a = a.document;
2104            return {
2105                x: a.documentElement.scrollLeft || a.body.scrollLeft || 0,
2106                y: a.documentElement.scrollTop ||
2107                    a.body.scrollTop || 0
2108            }
2109        },
2110        getFrame: function() {
2111            var a = this.$.frameElement;
2112            return a ? new CKEDITOR.dom.element.get(a) : null
2113        }
2114    });
2115    CKEDITOR.dom.document = function(a) {
2116        CKEDITOR.dom.domObject.call(this, a)
2117    };
2118    CKEDITOR.dom.document.prototype = new CKEDITOR.dom.domObject;
2119    CKEDITOR.tools.extend(CKEDITOR.dom.document.prototype, {
2120        type: CKEDITOR.NODE_DOCUMENT,
2121        appendStyleSheet: function(a) {
2122            if (this.$.createStyleSheet) this.$.createStyleSheet(a);
2123            else {
2124                var d = new CKEDITOR.dom.element("link");
2125                d.setAttributes({
2126                    rel: "stylesheet",
2127                    type: "text/css",
2128                    href: a
2129                });
2130                this.getHead().append(d)
2131            }
2132        },
2133        appendStyleText: function(a) {
2134            if (this.$.createStyleSheet) {
2135                var d = this.$.createStyleSheet("");
2136                d.cssText = a
2137            } else {
2138                var b = new CKEDITOR.dom.element("style", this);
2139                b.append(new CKEDITOR.dom.text(a, this));
2140                this.getHead().append(b)
2141            }
2142            return d ||
2143                b.$.sheet
2144        },
2145        createElement: function(a, d) {
2146            var b = new CKEDITOR.dom.element(a, this);
2147            d && (d.attributes && b.setAttributes(d.attributes), d.styles && b.setStyles(d.styles));
2148            return b
2149        },
2150        createText: function(a) {
2151            return new CKEDITOR.dom.text(a, this)
2152        },
2153        focus: function() {
2154            this.getWindow().focus()
2155        },
2156        getActive: function() {
2157            var a;
2158            try {
2159                a = this.$.activeElement
2160            } catch (d) {
2161                return null
2162            }
2163            return new CKEDITOR.dom.element(a)
2164        },
2165        getById: function(a) {
2166            return (a = this.$.getElementById(a)) ? new CKEDITOR.dom.element(a) : null
2167        },
2168        getByAddress: function(a, d) {
2169            for (var b =
2170                    this.$.documentElement, c = 0; b && c < a.length; c++) {
2171                var f = a[c];
2172                if (d)
2173                    for (var h = -1, k = 0; k < b.childNodes.length; k++) {
2174                        var g = b.childNodes[k];
2175                        if (!0 !== d || 3 != g.nodeType || !g.previousSibling || 3 != g.previousSibling.nodeType)
2176                            if (h++, h == f) {
2177                                b = g;
2178                                break
2179                            }
2180                    } else b = b.childNodes[f]
2181            }
2182            return b ? new CKEDITOR.dom.node(b) : null
2183        },
2184        getElementsByTag: function(a, d) {
2185            CKEDITOR.env.ie && 8 >= document.documentMode || !d || (a = d + ":" + a);
2186            return new CKEDITOR.dom.nodeList(this.$.getElementsByTagName(a))
2187        },
2188        getHead: function() {
2189            var a = this.$.getElementsByTagName("head")[0];
2190            return a = a ? new CKEDITOR.dom.element(a) : this.getDocumentElement().append(new CKEDITOR.dom.element("head"), !0)
2191        },
2192        getBody: function() {
2193            return new CKEDITOR.dom.element(this.$.body)
2194        },
2195        getDocumentElement: function() {
2196            return new CKEDITOR.dom.element(this.$.documentElement)
2197        },
2198        getWindow: function() {
2199            return new CKEDITOR.dom.window(this.$.parentWindow || this.$.defaultView)
2200        },
2201        write: function(a) {
2202            this.$.open("text/html", "replace");
2203            CKEDITOR.env.ie && (a = a.replace(/(?:^\s*<!DOCTYPE[^>]*?>)|^/i, '$\x26\n\x3cscript data-cke-temp\x3d"1"\x3e(' +
2204                CKEDITOR.tools.fixDomain + ")();\x3c/script\x3e"));
2205            this.$.write(a);
2206            this.$.close()
2207        },
2208        find: function(a) {
2209            return new CKEDITOR.dom.nodeList(this.$.querySelectorAll(a))
2210        },
2211        findOne: function(a) {
2212            return (a = this.$.querySelector(a)) ? new CKEDITOR.dom.element(a) : null
2213        },
2214        _getHtml5ShivFrag: function() {
2215            var a = this.getCustomData("html5ShivFrag");
2216            a || (a = this.$.createDocumentFragment(), CKEDITOR.tools.enableHtml5Elements(a, !0), this.setCustomData("html5ShivFrag", a));
2217            return a
2218        }
2219    });
2220    CKEDITOR.dom.nodeList = function(a) {
2221        this.$ = a
2222    };
2223    CKEDITOR.dom.nodeList.prototype = {
2224        count: function() {
2225            return this.$.length
2226        },
2227        getItem: function(a) {
2228            return 0 > a || a >= this.$.length ? null : (a = this.$[a]) ? new CKEDITOR.dom.node(a) : null
2229        },
2230        toArray: function() {
2231            return CKEDITOR.tools.array.map(this.$, function(a) {
2232                return new CKEDITOR.dom.node(a)
2233            })
2234        }
2235    };
2236    CKEDITOR.dom.element = function(a, d) {
2237        "string" == typeof a && (a = (d ? d.$ : document).createElement(a));
2238        CKEDITOR.dom.domObject.call(this, a)
2239    };
2240    CKEDITOR.dom.element.get = function(a) {
2241        return (a = "string" == typeof a ? document.getElementById(a) || document.getElementsByName(a)[0] : a) && (a.$ ? a : new CKEDITOR.dom.element(a))
2242    };
2243    CKEDITOR.dom.element.prototype = new CKEDITOR.dom.node;
2244    CKEDITOR.dom.element.createFromHtml = function(a, d) {
2245        var b = new CKEDITOR.dom.element("div", d);
2246        b.setHtml(a);
2247        return b.getFirst().remove()
2248    };
2249    CKEDITOR.dom.element.setMarker = function(a, d, b, c) {
2250        var f = d.getCustomData("list_marker_id") || d.setCustomData("list_marker_id", CKEDITOR.tools.getNextNumber()).getCustomData("list_marker_id"),
2251            h = d.getCustomData("list_marker_names") || d.setCustomData("list_marker_names", {}).getCustomData("list_marker_names");
2252        a[f] = d;
2253        h[b] = 1;
2254        return d.setCustomData(b, c)
2255    };
2256    CKEDITOR.dom.element.clearAllMarkers = function(a) {
2257        for (var d in a) CKEDITOR.dom.element.clearMarkers(a, a[d], 1)
2258    };
2259    CKEDITOR.dom.element.clearMarkers = function(a, d, b) {
2260        var c = d.getCustomData("list_marker_names"),
2261            f = d.getCustomData("list_marker_id"),
2262            h;
2263        for (h in c) d.removeCustomData(h);
2264        d.removeCustomData("list_marker_names");
2265        b && (d.removeCustomData("list_marker_id"), delete a[f])
2266    };
2267    (function() {
2268        function a(a, b) {
2269            return -1 < (" " + a + " ").replace(h, " ").indexOf(" " + b + " ")
2270        }
2271
2272        function d(a) {
2273            var b = !0;
2274            a.$.id || (a.$.id = "cke_tmp_" + CKEDITOR.tools.getNextNumber(), b = !1);
2275            return function() {
2276                b || a.removeAttribute("id")
2277            }
2278        }
2279
2280        function b(a, b) {
2281            var c = CKEDITOR.tools.escapeCss(a.$.id);
2282            return "#" + c + " " + b.split(/,\s*/).join(", #" + c + " ")
2283        }
2284
2285        function c(a) {
2286            for (var b = 0, c = 0, e = k[a].length; c < e; c++) b += parseFloat(this.getComputedStyle(k[a][c]) || 0, 10) || 0;
2287            return b
2288        }
2289        var f = document.createElement("_").classList,
2290            f = "undefined" !== typeof f &&
2291            null !== String(f.add).match(/\[Native code\]/gi),
2292            h = /[\n\t\r]/g;
2293        CKEDITOR.tools.extend(CKEDITOR.dom.element.prototype, {
2294            type: CKEDITOR.NODE_ELEMENT,
2295            addClass: f ? function(a) {
2296                this.$.classList.add(a);
2297                return this
2298            } : function(b) {
2299                var c = this.$.className;
2300                c && (a(c, b) || (c += " " + b));
2301                this.$.className = c || b;
2302                return this
2303            },
2304            removeClass: f ? function(a) {
2305                var b = this.$;
2306                b.classList.remove(a);
2307                b.className || b.removeAttribute("class");
2308                return this
2309            } : function(b) {
2310                var c = this.getAttribute("class");
2311                c && a(c, b) && ((c = c.replace(new RegExp("(?:^|\\s+)" +
2312                    b + "(?\x3d\\s|$)"), "").replace(/^\s+/, "")) ? this.setAttribute("class", c) : this.removeAttribute("class"));
2313                return this
2314            },
2315            hasClass: function(b) {
2316                return a(this.$.className, b)
2317            },
2318            append: function(a, b) {
2319                "string" == typeof a && (a = this.getDocument().createElement(a));
2320                b ? this.$.insertBefore(a.$, this.$.firstChild) : this.$.appendChild(a.$);
2321                return a
2322            },
2323            appendHtml: function(a) {
2324                if (this.$.childNodes.length) {
2325                    var b = new CKEDITOR.dom.element("div", this.getDocument());
2326                    b.setHtml(a);
2327                    b.moveChildren(this)
2328                } else this.setHtml(a)
2329            },
2330            appendText: function(a) {
2331                null !=
2332                    this.$.text && CKEDITOR.env.ie && 9 > CKEDITOR.env.version ? this.$.text += a : this.append(new CKEDITOR.dom.text(a))
2333            },
2334            appendBogus: function(a) {
2335                if (a || CKEDITOR.env.needsBrFiller) {
2336                    for (a = this.getLast(); a && a.type == CKEDITOR.NODE_TEXT && !CKEDITOR.tools.rtrim(a.getText());) a = a.getPrevious();
2337                    a && a.is && a.is("br") || (a = this.getDocument().createElement("br"), CKEDITOR.env.gecko && a.setAttribute("type", "_moz"), this.append(a))
2338                }
2339            },
2340            breakParent: function(a, b) {
2341                var c = new CKEDITOR.dom.range(this.getDocument());
2342                c.setStartAfter(this);
2343                c.setEndAfter(a);
2344                var e = c.extractContents(!1, b || !1),
2345                    d;
2346                c.insertNode(this.remove());
2347                if (CKEDITOR.env.ie && !CKEDITOR.env.edge) {
2348                    for (c = new CKEDITOR.dom.element("div"); d = e.getFirst();) d.$.style.backgroundColor && (d.$.style.backgroundColor = d.$.style.backgroundColor), c.append(d);
2349                    c.insertAfter(this);
2350                    c.remove(!0)
2351                } else e.insertAfterNode(this)
2352            },
2353            contains: document.compareDocumentPosition ? function(a) {
2354                return !!(this.$.compareDocumentPosition(a.$) & 16)
2355            } : function(a) {
2356                var b = this.$;
2357                return a.type != CKEDITOR.NODE_ELEMENT ? b.contains(a.getParent().$) :
2358                    b != a.$ && b.contains(a.$)
2359            },
2360            focus: function() {
2361                function a() {
2362                    try {
2363                        this.$.focus()
2364                    } catch (b) {}
2365                }
2366                return function(b) {
2367                    b ? CKEDITOR.tools.setTimeout(a, 100, this) : a.call(this)
2368                }
2369            }(),
2370            getHtml: function() {
2371                var a = this.$.innerHTML;
2372                return CKEDITOR.env.ie ? a.replace(/<\?[^>]*>/g, "") : a
2373            },
2374            getOuterHtml: function() {
2375                if (this.$.outerHTML) return this.$.outerHTML.replace(/<\?[^>]*>/, "");
2376                var a = this.$.ownerDocument.createElement("div");
2377                a.appendChild(this.$.cloneNode(!0));
2378                return a.innerHTML
2379            },
2380            getClientRect: function(a) {
2381                var b = CKEDITOR.tools.extend({},
2382                    this.$.getBoundingClientRect());
2383                !b.width && (b.width = b.right - b.left);
2384                !b.height && (b.height = b.bottom - b.top);
2385                return a ? CKEDITOR.tools.getAbsoluteRectPosition(this.getWindow(), b) : b
2386            },
2387            setHtml: CKEDITOR.env.ie && 9 > CKEDITOR.env.version ? function(a) {
2388                try {
2389                    var b = this.$;
2390                    if (this.getParent()) return b.innerHTML = a;
2391                    var c = this.getDocument()._getHtml5ShivFrag();
2392                    c.appendChild(b);
2393                    b.innerHTML = a;
2394                    c.removeChild(b);
2395                    return a
2396                } catch (e) {
2397                    this.$.innerHTML = "";
2398                    b = new CKEDITOR.dom.element("body", this.getDocument());
2399                    b.$.innerHTML = a;
2400                    for (b = b.getChildren(); b.count();) this.append(b.getItem(0));
2401                    return a
2402                }
2403            } : function(a) {
2404                return this.$.innerHTML = a
2405            },
2406            setText: function() {
2407                var a = document.createElement("p");
2408                a.innerHTML = "x";
2409                a = a.textContent;
2410                return function(b) {
2411                    this.$[a ? "textContent" : "innerText"] = b
2412                }
2413            }(),
2414            getAttribute: function() {
2415                var a = function(a) {
2416                    return this.$.getAttribute(a, 2)
2417                };
2418                return CKEDITOR.env.ie && (CKEDITOR.env.ie7Compat || CKEDITOR.env.quirks) ? function(a) {
2419                    switch (a) {
2420                        case "class":
2421                            a = "className";
2422                            break;
2423                        case "http-equiv":
2424                            a = "httpEquiv";
2425                            break;
2426                        case "name":
2427                            return this.$.name;
2428                        case "tabindex":
2429                            return a = this.$.getAttribute(a,
2430                                2), 0 !== a && 0 === this.$.tabIndex && (a = null), a;
2431                        case "checked":
2432                            return a = this.$.attributes.getNamedItem(a), (a.specified ? a.nodeValue : this.$.checked) ? "checked" : null;
2433                        case "hspace":
2434                        case "value":
2435                            return this.$[a];
2436                        case "style":
2437                            return this.$.style.cssText;
2438                        case "contenteditable":
2439                        case "contentEditable":
2440                            return this.$.attributes.getNamedItem("contentEditable").specified ? this.$.getAttribute("contentEditable") : null
2441                    }
2442                    return this.$.getAttribute(a, 2)
2443                } : a
2444            }(),
2445            getAttributes: function(a) {
2446                var b = {},
2447                    c = this.$.attributes,
2448                    e;
2449                a = CKEDITOR.tools.isArray(a) ?
2450                    a : [];
2451                for (e = 0; e < c.length; e++) - 1 === CKEDITOR.tools.indexOf(a, c[e].name) && (b[c[e].name] = c[e].value);
2452                return b
2453            },
2454            getChildren: function() {
2455                return new CKEDITOR.dom.nodeList(this.$.childNodes)
2456            },
2457            getComputedStyle: document.defaultView && document.defaultView.getComputedStyle ? function(a) {
2458                var b = this.getWindow().$.getComputedStyle(this.$, null);
2459                return b ? b.getPropertyValue(a) : ""
2460            } : function(a) {
2461                return this.$.currentStyle[CKEDITOR.tools.cssStyleToDomStyle(a)]
2462            },
2463            getDtd: function() {
2464                var a = CKEDITOR.dtd[this.getName()];
2465                this.getDtd =
2466                    function() {
2467                        return a
2468                    };
2469                return a
2470            },
2471            getElementsByTag: CKEDITOR.dom.document.prototype.getElementsByTag,
2472            getTabIndex: function() {
2473                var a = this.$.tabIndex;
2474                return 0 !== a || CKEDITOR.dtd.$tabIndex[this.getName()] || 0 === parseInt(this.getAttribute("tabindex"), 10) ? a : -1
2475            },
2476            getText: function() {
2477                return this.$.textContent || this.$.innerText || ""
2478            },
2479            getWindow: function() {
2480                return this.getDocument().getWindow()
2481            },
2482            getId: function() {
2483                return this.$.id || null
2484            },
2485            getNameAtt: function() {
2486                return this.$.name || null
2487            },
2488            getName: function() {
2489                var a = this.$.nodeName.toLowerCase();
2490                if (CKEDITOR.env.ie && 8 >= document.documentMode) {
2491                    var b = this.$.scopeName;
2492                    "HTML" != b && (a = b.toLowerCase() + ":" + a)
2493                }
2494                this.getName = function() {
2495                    return a
2496                };
2497                return this.getName()
2498            },
2499            getValue: function() {
2500                return this.$.value
2501            },
2502            getFirst: function(a) {
2503                var b = this.$.firstChild;
2504                (b = b && new CKEDITOR.dom.node(b)) && a && !a(b) && (b = b.getNext(a));
2505                return b
2506            },
2507            getLast: function(a) {
2508                var b = this.$.lastChild;
2509                (b = b && new CKEDITOR.dom.node(b)) && a && !a(b) && (b = b.getPrevious(a));
2510                return b
2511            },
2512            getStyle: function(a) {
2513                return this.$.style[CKEDITOR.tools.cssStyleToDomStyle(a)]
2514            },
2515            is: function() {
2516                var a = this.getName();
2517                if ("object" == typeof arguments[0]) return !!arguments[0][a];
2518                for (var b = 0; b < arguments.length; b++)
2519                    if (arguments[b] == a) return !0;
2520                return !1
2521            },
2522            isEditable: function(a) {
2523                var b = this.getName();
2524                return this.isReadOnly() || "none" == this.getComputedStyle("display") || "hidden" == this.getComputedStyle("visibility") || CKEDITOR.dtd.$nonEditable[b] || CKEDITOR.dtd.$empty[b] || this.is("a") && (this.data("cke-saved-name") || this.hasAttribute("name")) && !this.getChildCount() ? !1 : !1 !== a ? (a = CKEDITOR.dtd[b] ||
2525                    CKEDITOR.dtd.span, !(!a || !a["#"])) : !0
2526            },
2527            isIdentical: function(a) {
2528                var b = this.clone(0, 1);
2529                a = a.clone(0, 1);
2530                b.removeAttributes(["_moz_dirty", "data-cke-expando", "data-cke-saved-href", "data-cke-saved-name"]);
2531                a.removeAttributes(["_moz_dirty", "data-cke-expando", "data-cke-saved-href", "data-cke-saved-name"]);
2532                if (b.$.isEqualNode) return b.$.style.cssText = CKEDITOR.tools.normalizeCssText(b.$.style.cssText), a.$.style.cssText = CKEDITOR.tools.normalizeCssText(a.$.style.cssText), b.$.isEqualNode(a.$);
2533                b = b.getOuterHtml();
2534                a =
2535                    a.getOuterHtml();
2536                if (CKEDITOR.env.ie && 9 > CKEDITOR.env.version && this.is("a")) {
2537                    var c = this.getParent();
2538                    c.type == CKEDITOR.NODE_ELEMENT && (c = c.clone(), c.setHtml(b), b = c.getHtml(), c.setHtml(a), a = c.getHtml())
2539                }
2540                return b == a
2541            },
2542            isVisible: function() {
2543                var a = (this.$.offsetHeight || this.$.offsetWidth) && "hidden" != this.getComputedStyle("visibility"),
2544                    b, c;
2545                a && CKEDITOR.env.webkit && (b = this.getWindow(), !b.equals(CKEDITOR.document.getWindow()) && (c = b.$.frameElement) && (a = (new CKEDITOR.dom.element(c)).isVisible()));
2546                return !!a
2547            },
2548            isEmptyInlineRemoveable: function() {
2549                if (!CKEDITOR.dtd.$removeEmpty[this.getName()]) return !1;
2550                for (var a = this.getChildren(), b = 0, c = a.count(); b < c; b++) {
2551                    var e = a.getItem(b);
2552                    if (e.type != CKEDITOR.NODE_ELEMENT || !e.data("cke-bookmark"))
2553                        if (e.type == CKEDITOR.NODE_ELEMENT && !e.isEmptyInlineRemoveable() || e.type == CKEDITOR.NODE_TEXT && CKEDITOR.tools.trim(e.getText())) return !1
2554                }
2555                return !0
2556            },
2557            hasAttributes: CKEDITOR.env.ie && (CKEDITOR.env.ie7Compat || CKEDITOR.env.quirks) ? function() {
2558                for (var a = this.$.attributes, b = 0; b < a.length; b++) {
2559                    var c = a[b];
2560                    switch (c.nodeName) {
2561                        case "class":
2562                            if (this.getAttribute("class")) return !0;
2563                        case "data-cke-expando":
2564                            continue;
2565                        default:
2566                            if (c.specified) return !0
2567                    }
2568                }
2569                return !1
2570            } : function() {
2571                var a = this.$.attributes,
2572                    b = a.length,
2573                    c = {
2574                        "data-cke-expando": 1,
2575                        _moz_dirty: 1
2576                    };
2577                return 0 < b && (2 < b || !c[a[0].nodeName] || 2 == b && !c[a[1].nodeName])
2578            },
2579            hasAttribute: function() {
2580                function a(b) {
2581                    var c = this.$.attributes.getNamedItem(b);
2582                    if ("input" == this.getName()) switch (b) {
2583                        case "class":
2584                            return 0 < this.$.className.length;
2585                        case "checked":
2586                            return !!this.$.checked;
2587                        case "value":
2588                            return b = this.getAttribute("type"), "checkbox" == b || "radio" == b ? "on" != this.$.value : !!this.$.value
2589                    }
2590                    return c ?
2591                        c.specified : !1
2592                }
2593                return CKEDITOR.env.ie ? 8 > CKEDITOR.env.version ? function(b) {
2594                    return "name" == b ? !!this.$.name : a.call(this, b)
2595                } : a : function(a) {
2596                    return !!this.$.attributes.getNamedItem(a)
2597                }
2598            }(),
2599            hide: function() {
2600                this.setStyle("display", "none")
2601            },
2602            moveChildren: function(a, b) {
2603                var c = this.$;
2604                a = a.$;
2605                if (c != a) {
2606                    var e;
2607                    if (b)
2608                        for (; e = c.lastChild;) a.insertBefore(c.removeChild(e), a.firstChild);
2609                    else
2610                        for (; e = c.firstChild;) a.appendChild(c.removeChild(e))
2611                }
2612            },
2613            mergeSiblings: function() {
2614                function a(b, c, e) {
2615                    if (c && c.type == CKEDITOR.NODE_ELEMENT) {
2616                        for (var d = []; c.data("cke-bookmark") || c.isEmptyInlineRemoveable();)
2617                            if (d.push(c), c = e ? c.getNext() : c.getPrevious(), !c || c.type != CKEDITOR.NODE_ELEMENT) return;
2618                        if (b.isIdentical(c)) {
2619                            for (var g = e ? b.getLast() : b.getFirst(); d.length;) d.shift().move(b, !e);
2620                            c.moveChildren(b, !e);
2621                            c.remove();
2622                            g && g.type == CKEDITOR.NODE_ELEMENT && g.mergeSiblings()
2623                        }
2624                    }
2625                }
2626                return function(b) {
2627                    if (!1 === b || CKEDITOR.dtd.$removeEmpty[this.getName()] || this.is("a")) a(this, this.getNext(), !0), a(this, this.getPrevious())
2628                }
2629            }(),
2630            show: function() {
2631                this.setStyles({
2632                    display: "",
2633                    visibility: ""
2634                })
2635            },
2636            setAttribute: function() {
2637                var a = function(a, b) {
2638                    this.$.setAttribute(a, b);
2639                    return this
2640                };
2641                return CKEDITOR.env.ie && (CKEDITOR.env.ie7Compat || CKEDITOR.env.quirks) ? function(b, c) {
2642                    "class" == b ? this.$.className = c : "style" == b ? this.$.style.cssText = c : "tabindex" == b ? this.$.tabIndex = c : "checked" == b ? this.$.checked = c : "contenteditable" == b ? a.call(this, "contentEditable", c) : a.apply(this, arguments);
2643                    return this
2644                } : CKEDITOR.env.ie8Compat && CKEDITOR.env.secure ? function(b, c) {
2645                    if ("src" == b && c.match(/^http:\/\//)) try {
2646                        a.apply(this,
2647                            arguments)
2648                    } catch (e) {} else a.apply(this, arguments);
2649                    return this
2650                } : a
2651            }(),
2652            setAttributes: function(a) {
2653                for (var b in a) this.setAttribute(b, a[b]);
2654                return this
2655            },
2656            setValue: function(a) {
2657                this.$.value = a;
2658                return this
2659            },
2660            removeAttribute: function() {
2661                var a = function(a) {
2662                    this.$.removeAttribute(a)
2663                };
2664                return CKEDITOR.env.ie && (CKEDITOR.env.ie7Compat || CKEDITOR.env.quirks) ? function(a) {
2665                    "class" == a ? a = "className" : "tabindex" == a ? a = "tabIndex" : "contenteditable" == a && (a = "contentEditable");
2666                    this.$.removeAttribute(a)
2667                } : a
2668            }(),
2669            removeAttributes: function(a) {
2670                if (CKEDITOR.tools.isArray(a))
2671                    for (var b =
2672                            0; b < a.length; b++) this.removeAttribute(a[b]);
2673                else
2674                    for (b in a = a || this.getAttributes(), a) a.hasOwnProperty(b) && this.removeAttribute(b)
2675            },
2676            removeStyle: function(a) {
2677                var b = this.$.style;
2678                if (b.removeProperty || "border" != a && "margin" != a && "padding" != a) b.removeProperty ? b.removeProperty(a) : b.removeAttribute(CKEDITOR.tools.cssStyleToDomStyle(a)), this.$.style.cssText || this.removeAttribute("style");
2679                else {
2680                    var c = ["top", "left", "right", "bottom"],
2681                        e;
2682                    "border" == a && (e = ["color", "style", "width"]);
2683                    for (var b = [], d = 0; d < c.length; d++)
2684                        if (e)
2685                            for (var v =
2686                                    0; v < e.length; v++) b.push([a, c[d], e[v]].join("-"));
2687                        else b.push([a, c[d]].join("-"));
2688                    for (a = 0; a < b.length; a++) this.removeStyle(b[a])
2689                }
2690            },
2691            setStyle: function(a, b) {
2692                this.$.style[CKEDITOR.tools.cssStyleToDomStyle(a)] = b;
2693                return this
2694            },
2695            setStyles: function(a) {
2696                for (var b in a) this.setStyle(b, a[b]);
2697                return this
2698            },
2699            setOpacity: function(a) {
2700                CKEDITOR.env.ie && 9 > CKEDITOR.env.version ? (a = Math.round(100 * a), this.setStyle("filter", 100 <= a ? "" : "progid:DXImageTransform.Microsoft.Alpha(opacity\x3d" + a + ")")) : this.setStyle("opacity", a)
2701            },
2702            unselectable: function() {
2703                this.setStyles(CKEDITOR.tools.cssVendorPrefix("user-select",
2704                    "none"));
2705                if (CKEDITOR.env.ie) {
2706                    this.setAttribute("unselectable", "on");
2707                    for (var a, b = this.getElementsByTag("*"), c = 0, e = b.count(); c < e; c++) a = b.getItem(c), a.setAttribute("unselectable", "on")
2708                }
2709            },
2710            getPositionedAncestor: function() {
2711                for (var a = this;
2712                    "html" != a.getName();) {
2713                    if ("static" != a.getComputedStyle("position")) return a;
2714                    a = a.getParent()
2715                }
2716                return null
2717            },
2718            getDocumentPosition: function(a) {
2719                var b = 0,
2720                    c = 0,
2721                    e = this.getDocument(),
2722                    d = e.getBody(),
2723                    v = "BackCompat" == e.$.compatMode;
2724                if (document.documentElement.getBoundingClientRect && (CKEDITOR.env.ie ?
2725                        8 !== CKEDITOR.env.version : 1)) {
2726                    var f = this.$.getBoundingClientRect(),
2727                        h = e.$.documentElement,
2728                        x = h.clientTop || d.$.clientTop || 0,
2729                        m = h.clientLeft || d.$.clientLeft || 0,
2730                        k = !0;
2731                    CKEDITOR.env.ie && (k = e.getDocumentElement().contains(this), e = e.getBody().contains(this), k = v && e || !v && k);
2732                    k && (CKEDITOR.env.webkit || CKEDITOR.env.ie && 12 <= CKEDITOR.env.version ? (b = d.$.scrollLeft || h.scrollLeft, c = d.$.scrollTop || h.scrollTop) : (c = v ? d.$ : h, b = c.scrollLeft, c = c.scrollTop), b = f.left + b - m, c = f.top + c - x)
2733                } else
2734                    for (x = this, m = null; x && "body" != x.getName() &&
2735                        "html" != x.getName();) {
2736                        b += x.$.offsetLeft - x.$.scrollLeft;
2737                        c += x.$.offsetTop - x.$.scrollTop;
2738                        x.equals(this) || (b += x.$.clientLeft || 0, c += x.$.clientTop || 0);
2739                        for (; m && !m.equals(x);) b -= m.$.scrollLeft, c -= m.$.scrollTop, m = m.getParent();
2740                        m = x;
2741                        x = (f = x.$.offsetParent) ? new CKEDITOR.dom.element(f) : null
2742                    }
2743                a && (f = this.getWindow(), x = a.getWindow(), !f.equals(x) && f.$.frameElement && (a = (new CKEDITOR.dom.element(f.$.frameElement)).getDocumentPosition(a), b += a.x, c += a.y));
2744                document.documentElement.getBoundingClientRect || !CKEDITOR.env.gecko ||
2745                    v || (b += this.$.clientLeft ? 1 : 0, c += this.$.clientTop ? 1 : 0);
2746                return {
2747                    x: b,
2748                    y: c
2749                }
2750            },
2751            scrollIntoView: function(a) {
2752                var b = this.getParent();
2753                if (b) {
2754                    do
2755                        if ((b.$.clientWidth && b.$.clientWidth < b.$.scrollWidth || b.$.clientHeight && b.$.clientHeight < b.$.scrollHeight) && !b.is("body") && this.scrollIntoParent(b, a, 1), b.is("html")) {
2756                            var c = b.getWindow();
2757                            try {
2758                                var e = c.$.frameElement;
2759                                e && (b = new CKEDITOR.dom.element(e))
2760                            } catch (d) {}
2761                        } while (b = b.getParent())
2762                }
2763            },
2764            scrollIntoParent: function(a, b, c) {
2765                var e, d, v, f;
2766
2767                function h(b, c) {
2768                    /body|html/.test(a.getName()) ?
2769                        a.getWindow().$.scrollBy(b, c) : (a.$.scrollLeft += b, a.$.scrollTop += c)
2770                }
2771
2772                function x(a, b) {
2773                    var c = {
2774                        x: 0,
2775                        y: 0
2776                    };
2777                    if (!a.is(k ? "body" : "html")) {
2778                        var e = a.$.getBoundingClientRect();
2779                        c.x = e.left;
2780                        c.y = e.top
2781                    }
2782                    e = a.getWindow();
2783                    e.equals(b) || (e = x(CKEDITOR.dom.element.get(e.$.frameElement), b), c.x += e.x, c.y += e.y);
2784                    return c
2785                }
2786
2787                function m(a, b) {
2788                    return parseInt(a.getComputedStyle("margin-" + b) || 0, 10) || 0
2789                }!a && (a = this.getWindow());
2790                v = a.getDocument();
2791                var k = "BackCompat" == v.$.compatMode;
2792                a instanceof CKEDITOR.dom.window && (a = k ? v.getBody() : v.getDocumentElement());
2793                CKEDITOR.env.webkit && (v = this.getEditor(!1)) && (v._.previousScrollTop = null);
2794                v = a.getWindow();
2795                d = x(this, v);
2796                var u = x(a, v),
2797                    K = this.$.offsetHeight;
2798                e = this.$.offsetWidth;
2799                var l = a.$.clientHeight,
2800                    t = a.$.clientWidth;
2801                v = d.x - m(this, "left") - u.x || 0;
2802                f = d.y - m(this, "top") - u.y || 0;
2803                e = d.x + e + m(this, "right") - (u.x + t) || 0;
2804                d = d.y + K + m(this, "bottom") - (u.y + l) || 0;
2805                (0 > f || 0 < d) && h(0, !0 === b ? f : !1 === b ? d : 0 > f ? f : d);
2806                c && (0 > v || 0 < e) && h(0 > v ? v : e, 0)
2807            },
2808            setState: function(a, b, c) {
2809                b = b || "cke";
2810                switch (a) {
2811                    case CKEDITOR.TRISTATE_ON:
2812                        this.addClass(b + "_on");
2813                        this.removeClass(b +
2814                            "_off");
2815                        this.removeClass(b + "_disabled");
2816                        c && this.setAttribute("aria-pressed", !0);
2817                        c && this.removeAttribute("aria-disabled");
2818                        break;
2819                    case CKEDITOR.TRISTATE_DISABLED:
2820                        this.addClass(b + "_disabled");
2821                        this.removeClass(b + "_off");
2822                        this.removeClass(b + "_on");
2823                        c && this.setAttribute("aria-disabled", !0);
2824                        c && this.removeAttribute("aria-pressed");
2825                        break;
2826                    default:
2827                        this.addClass(b + "_off"), this.removeClass(b + "_on"), this.removeClass(b + "_disabled"), c && this.removeAttribute("aria-pressed"), c && this.removeAttribute("aria-disabled")
2828                }
2829            },
2830            getFrameDocument: function() {
2831                var a = this.$;
2832                try {
2833                    a.contentWindow.document
2834                } catch (b) {
2835                    a.src = a.src
2836                }
2837                return a && new CKEDITOR.dom.document(a.contentWindow.document)
2838            },
2839            copyAttributes: function(a, b) {
2840                var c = this.$.attributes;
2841                b = b || {};
2842                for (var e = 0; e < c.length; e++) {
2843                    var d = c[e],
2844                        v = d.nodeName.toLowerCase(),
2845                        f;
2846                    if (!(v in b))
2847                        if ("checked" == v && (f = this.getAttribute(v))) a.setAttribute(v, f);
2848                        else if (!CKEDITOR.env.ie || this.hasAttribute(v)) f = this.getAttribute(v), null === f && (f = d.nodeValue), a.setAttribute(v, f)
2849                }
2850                "" !== this.$.style.cssText &&
2851                    (a.$.style.cssText = this.$.style.cssText)
2852            },
2853            renameNode: function(a) {
2854                if (this.getName() != a) {
2855                    var b = this.getDocument();
2856                    a = new CKEDITOR.dom.element(a, b);
2857                    this.copyAttributes(a);
2858                    this.moveChildren(a);
2859                    this.getParent(!0) && this.$.parentNode.replaceChild(a.$, this.$);
2860                    a.$["data-cke-expando"] = this.$["data-cke-expando"];
2861                    this.$ = a.$;
2862                    delete this.getName
2863                }
2864            },
2865            getChild: function() {
2866                function a(b, c) {
2867                    var e = b.childNodes;
2868                    if (0 <= c && c < e.length) return e[c]
2869                }
2870                return function(b) {
2871                    var c = this.$;
2872                    if (b.slice)
2873                        for (b = b.slice(); 0 < b.length && c;) c = a(c,
2874                            b.shift());
2875                    else c = a(c, b);
2876                    return c ? new CKEDITOR.dom.node(c) : null
2877                }
2878            }(),
2879            getChildCount: function() {
2880                return this.$.childNodes.length
2881            },
2882            disableContextMenu: function() {
2883                function a(b) {
2884                    return b.type == CKEDITOR.NODE_ELEMENT && b.hasClass("cke_enable_context_menu")
2885                }
2886                this.on("contextmenu", function(b) {
2887                    b.data.getTarget().getAscendant(a, !0) || b.data.preventDefault()
2888                })
2889            },
2890            getDirection: function(a) {
2891                return a ? this.getComputedStyle("direction") || this.getDirection() || this.getParent() && this.getParent().getDirection(1) || this.getDocument().$.dir ||
2892                    "ltr" : this.getStyle("direction") || this.getAttribute("dir")
2893            },
2894            data: function(a, b) {
2895                a = "data-" + a;
2896                if (void 0 === b) return this.getAttribute(a);
2897                !1 === b ? this.removeAttribute(a) : this.setAttribute(a, b);
2898                return null
2899            },
2900            getEditor: function(a) {
2901                var b = CKEDITOR.instances,
2902                    c, e, d;
2903                a = a || void 0 === a;
2904                for (c in b)
2905                    if (e = b[c], e.element.equals(this) && e.elementMode != CKEDITOR.ELEMENT_MODE_APPENDTO || !a && (d = e.editable()) && (d.equals(this) || d.contains(this))) return e;
2906                return null
2907            },
2908            find: function(a) {
2909                var c = d(this);
2910                a = new CKEDITOR.dom.nodeList(this.$.querySelectorAll(b(this,
2911                    a)));
2912                c();
2913                return a
2914            },
2915            findOne: function(a) {
2916                var c = d(this);
2917                a = this.$.querySelector(b(this, a));
2918                c();
2919                return a ? new CKEDITOR.dom.element(a) : null
2920            },
2921            forEach: function(a, b, c) {
2922                if (!(c || b && this.type != b)) var e = a(this);
2923                if (!1 !== e) {
2924                    c = this.getChildren();
2925                    for (var d = 0; d < c.count(); d++) e = c.getItem(d), e.type == CKEDITOR.NODE_ELEMENT ? e.forEach(a, b) : b && e.type != b || a(e)
2926                }
2927            }
2928        });
2929        var k = {
2930            width: ["border-left-width", "border-right-width", "padding-left", "padding-right"],
2931            height: ["border-top-width", "border-bottom-width", "padding-top", "padding-bottom"]
2932        };
2933        CKEDITOR.dom.element.prototype.setSize = function(a, b, d) {
2934            "number" == typeof b && (!d || CKEDITOR.env.ie && CKEDITOR.env.quirks || (b -= c.call(this, a)), this.setStyle(a, b + "px"))
2935        };
2936        CKEDITOR.dom.element.prototype.getSize = function(a, b) {
2937            var d = Math.max(this.$["offset" + CKEDITOR.tools.capitalize(a)], this.$["client" + CKEDITOR.tools.capitalize(a)]) || 0;
2938            b && (d -= c.call(this, a));
2939            return d
2940        }
2941    })();
2942    CKEDITOR.dom.documentFragment = function(a) {
2943        a = a || CKEDITOR.document;
2944        this.$ = a.type == CKEDITOR.NODE_DOCUMENT ? a.$.createDocumentFragment() : a
2945    };
2946    CKEDITOR.tools.extend(CKEDITOR.dom.documentFragment.prototype, CKEDITOR.dom.element.prototype, {
2947        type: CKEDITOR.NODE_DOCUMENT_FRAGMENT,
2948        insertAfterNode: function(a) {
2949            a = a.$;
2950            a.parentNode.insertBefore(this.$, a.nextSibling)
2951        },
2952        getHtml: function() {
2953            var a = new CKEDITOR.dom.element("div");
2954            this.clone(1, 1).appendTo(a);
2955            return a.getHtml().replace(/\s*data-cke-expando=".*?"/g, "")
2956        }
2957    }, !0, {
2958        append: 1,
2959        appendBogus: 1,
2960        clone: 1,
2961        getFirst: 1,
2962        getHtml: 1,
2963        getLast: 1,
2964        getParent: 1,
2965        getNext: 1,
2966        getPrevious: 1,
2967        appendTo: 1,
2968        moveChildren: 1,
2969        insertBefore: 1,
2970        insertAfterNode: 1,
2971        replace: 1,
2972        trim: 1,
2973        type: 1,
2974        ltrim: 1,
2975        rtrim: 1,
2976        getDocument: 1,
2977        getChildCount: 1,
2978        getChild: 1,
2979        getChildren: 1
2980    });
2981    (function() {
2982        function a(a, b) {
2983            var c = this.range;
2984            if (this._.end) return null;
2985            if (!this._.start) {
2986                this._.start = 1;
2987                if (c.collapsed) return this.end(), null;
2988                c.optimize()
2989            }
2990            var e, d = c.startContainer;
2991            e = c.endContainer;
2992            var f = c.startOffset,
2993                y = c.endOffset,
2994                h, l = this.guard,
2995                t = this.type,
2996                g = a ? "getPreviousSourceNode" : "getNextSourceNode";
2997            if (!a && !this._.guardLTR) {
2998                var L = e.type == CKEDITOR.NODE_ELEMENT ? e : e.getParent(),
2999                    C = e.type == CKEDITOR.NODE_ELEMENT ? e.getChild(y) : e.getNext();
3000                this._.guardLTR = function(a, b) {
3001                    return (!b || !L.equals(a)) && (!C ||
3002                        !a.equals(C)) && (a.type != CKEDITOR.NODE_ELEMENT || !b || !a.equals(c.root))
3003                }
3004            }
3005            if (a && !this._.guardRTL) {
3006                var k = d.type == CKEDITOR.NODE_ELEMENT ? d : d.getParent(),
3007                    q = d.type == CKEDITOR.NODE_ELEMENT ? f ? d.getChild(f - 1) : null : d.getPrevious();
3008                this._.guardRTL = function(a, b) {
3009                    return (!b || !k.equals(a)) && (!q || !a.equals(q)) && (a.type != CKEDITOR.NODE_ELEMENT || !b || !a.equals(c.root))
3010                }
3011            }
3012            var E = a ? this._.guardRTL : this._.guardLTR;
3013            h = l ? function(a, b) {
3014                return !1 === E(a, b) ? !1 : l(a, b)
3015            } : E;
3016            this.current ? e = this.current[g](!1, t, h) : (a ? e.type == CKEDITOR.NODE_ELEMENT &&
3017                (e = 0 < y ? e.getChild(y - 1) : !1 === h(e, !0) ? null : e.getPreviousSourceNode(!0, t, h)) : (e = d, e.type == CKEDITOR.NODE_ELEMENT && ((e = e.getChild(f)) || (e = !1 === h(d, !0) ? null : d.getNextSourceNode(!0, t, h)))), e && !1 === h(e) && (e = null));
3018            for (; e && !this._.end;) {
3019                this.current = e;
3020                if (!this.evaluator || !1 !== this.evaluator(e)) {
3021                    if (!b) return e
3022                } else if (b && this.evaluator) return !1;
3023                e = e[g](!1, t, h)
3024            }
3025            this.end();
3026            return this.current = null
3027        }
3028
3029        function d(b) {
3030            for (var c, e = null; c = a.call(this, b);) e = c;
3031            return e
3032        }
3033        CKEDITOR.dom.walker = CKEDITOR.tools.createClass({
3034            $: function(a) {
3035                this.range =
3036                    a;
3037                this._ = {}
3038            },
3039            proto: {
3040                end: function() {
3041                    this._.end = 1
3042                },
3043                next: function() {
3044                    return a.call(this)
3045                },
3046                previous: function() {
3047                    return a.call(this, 1)
3048                },
3049                checkForward: function() {
3050                    return !1 !== a.call(this, 0, 1)
3051                },
3052                checkBackward: function() {
3053                    return !1 !== a.call(this, 1, 1)
3054                },
3055                lastForward: function() {
3056                    return d.call(this)
3057                },
3058                lastBackward: function() {
3059                    return d.call(this, 1)
3060                },
3061                reset: function() {
3062                    delete this.current;
3063                    this._ = {}
3064                }
3065            }
3066        });
3067        var b = {
3068                block: 1,
3069                "list-item": 1,
3070                table: 1,
3071                "table-row-group": 1,
3072                "table-header-group": 1,
3073                "table-footer-group": 1,
3074                "table-row": 1,
3075                "table-column-group": 1,
3076                "table-column": 1,
3077                "table-cell": 1,
3078                "table-caption": 1
3079            },
3080            c = {
3081                absolute: 1,
3082                fixed: 1
3083            };
3084        CKEDITOR.dom.element.prototype.isBlockBoundary = function(a) {
3085            return "none" != this.getComputedStyle("float") || this.getComputedStyle("position") in c || !b[this.getComputedStyle("display")] ? !!(this.is(CKEDITOR.dtd.$block) || a && this.is(a)) : !0
3086        };
3087        CKEDITOR.dom.walker.blockBoundary = function(a) {
3088            return function(b) {
3089                return !(b.type == CKEDITOR.NODE_ELEMENT && b.isBlockBoundary(a))
3090            }
3091        };
3092        CKEDITOR.dom.walker.listItemBoundary = function() {
3093            return this.blockBoundary({
3094                br: 1
3095            })
3096        };
3097        CKEDITOR.dom.walker.bookmark = function(a, b) {
3098            function c(a) {
3099                return a && a.getName && "span" == a.getName() && a.data("cke-bookmark")
3100            }
3101            return function(e) {
3102                var d, f;
3103                d = e && e.type != CKEDITOR.NODE_ELEMENT && (f = e.getParent()) && c(f);
3104                d = a ? d : d || c(e);
3105                return !!(b ^ d)
3106            }
3107        };
3108        CKEDITOR.dom.walker.whitespaces = function(a) {
3109            return function(b) {
3110                var c;
3111                b && b.type == CKEDITOR.NODE_TEXT && (c = !CKEDITOR.tools.trim(b.getText()) || CKEDITOR.env.webkit && b.getText() == CKEDITOR.dom.selection.FILLING_CHAR_SEQUENCE);
3112                return !!(a ^ c)
3113            }
3114        };
3115        CKEDITOR.dom.walker.invisible =
3116            function(a) {
3117                var b = CKEDITOR.dom.walker.whitespaces(),
3118                    c = CKEDITOR.env.webkit ? 1 : 0;
3119                return function(e) {
3120                    b(e) ? e = 1 : (e.type == CKEDITOR.NODE_TEXT && (e = e.getParent()), e = e.$.offsetWidth <= c);
3121                    return !!(a ^ e)
3122                }
3123            };
3124        CKEDITOR.dom.walker.nodeType = function(a, b) {
3125            return function(c) {
3126                return !!(b ^ c.type == a)
3127            }
3128        };
3129        CKEDITOR.dom.walker.bogus = function(a) {
3130            function b(a) {
3131                return !h(a) && !k(a)
3132            }
3133            return function(c) {
3134                var e = CKEDITOR.env.needsBrFiller ? c.is && c.is("br") : c.getText && f.test(c.getText());
3135                e && (e = c.getParent(), c = c.getNext(b), e = e.isBlockBoundary() &&
3136                    (!c || c.type == CKEDITOR.NODE_ELEMENT && c.isBlockBoundary()));
3137                return !!(a ^ e)
3138            }
3139        };
3140        CKEDITOR.dom.walker.temp = function(a) {
3141            return function(b) {
3142                b.type != CKEDITOR.NODE_ELEMENT && (b = b.getParent());
3143                b = b && b.hasAttribute("data-cke-temp");
3144                return !!(a ^ b)
3145            }
3146        };
3147        var f = /^[\t\r\n ]*(?:&nbsp;|\xa0)$/,
3148            h = CKEDITOR.dom.walker.whitespaces(),
3149            k = CKEDITOR.dom.walker.bookmark(),
3150            g = CKEDITOR.dom.walker.temp(),
3151            n = function(a) {
3152                return k(a) || h(a) || a.type == CKEDITOR.NODE_ELEMENT && a.is(CKEDITOR.dtd.$inline) && !a.is(CKEDITOR.dtd.$empty)
3153            };
3154        CKEDITOR.dom.walker.ignored =
3155            function(a) {
3156                return function(b) {
3157                    b = h(b) || k(b) || g(b);
3158                    return !!(a ^ b)
3159                }
3160            };
3161        var r = CKEDITOR.dom.walker.ignored();
3162        CKEDITOR.dom.walker.empty = function(a) {
3163            return function(b) {
3164                for (var c = 0, e = b.getChildCount(); c < e; ++c)
3165                    if (!r(b.getChild(c))) return !!a;
3166                return !a
3167            }
3168        };
3169        var e = CKEDITOR.dom.walker.empty(),
3170            y = CKEDITOR.dom.walker.validEmptyBlockContainers = CKEDITOR.tools.extend(function(a) {
3171                var b = {},
3172                    c;
3173                for (c in a) CKEDITOR.dtd[c]["#"] && (b[c] = 1);
3174                return b
3175            }(CKEDITOR.dtd.$block), {
3176                caption: 1,
3177                td: 1,
3178                th: 1
3179            });
3180        CKEDITOR.dom.walker.editable = function(a) {
3181            return function(b) {
3182                b =
3183                    r(b) ? !1 : b.type == CKEDITOR.NODE_TEXT || b.type == CKEDITOR.NODE_ELEMENT && (b.is(CKEDITOR.dtd.$inline) || b.is("hr") || "false" == b.getAttribute("contenteditable") || !CKEDITOR.env.needsBrFiller && b.is(y) && e(b)) ? !0 : !1;
3184                return !!(a ^ b)
3185            }
3186        };
3187        CKEDITOR.dom.element.prototype.getBogus = function() {
3188            var a = this;
3189            do a = a.getPreviousSourceNode(); while (n(a));
3190            return a && (CKEDITOR.env.needsBrFiller ? a.is && a.is("br") : a.getText && f.test(a.getText())) ? a : !1
3191        }
3192    })();
3193    CKEDITOR.dom.range = function(a) {
3194        this.endOffset = this.endContainer = this.startOffset = this.startContainer = null;
3195        this.collapsed = !0;
3196        var d = a instanceof CKEDITOR.dom.document;
3197        this.document = d ? a : a.getDocument();
3198        this.root = d ? a.getBody() : a
3199    };
3200    (function() {
3201        function a(a) {
3202            a.collapsed = a.startContainer && a.endContainer && a.startContainer.equals(a.endContainer) && a.startOffset == a.endOffset
3203        }
3204
3205        function d(a, b, c, d, f) {
3206            function h(a, b, c, e) {
3207                var d = c ? a.getPrevious() : a.getNext();
3208                if (e && k) return d;
3209                l || e ? b.append(a.clone(!0, f), c) : (a.remove(), r && b.append(a, c));
3210                return d
3211            }
3212
3213            function m() {
3214                var a, b, c, e = Math.min(O.length, p.length);
3215                for (a = 0; a < e; a++)
3216                    if (b = O[a], c = p[a], !b.equals(c)) return a;
3217                return a - 1
3218            }
3219
3220            function g() {
3221                var b = N - 1,
3222                    c = E && z && !t.equals(F);
3223                b < w - 1 || b < A - 1 || c ? (c ? a.moveToPosition(F,
3224                    CKEDITOR.POSITION_BEFORE_START) : A == b + 1 && q ? a.moveToPosition(p[b], CKEDITOR.POSITION_BEFORE_END) : a.moveToPosition(p[b + 1], CKEDITOR.POSITION_BEFORE_START), d && (b = O[b + 1]) && b.type == CKEDITOR.NODE_ELEMENT && (c = CKEDITOR.dom.element.createFromHtml('\x3cspan data-cke-bookmark\x3d"1" style\x3d"display:none"\x3e\x26nbsp;\x3c/span\x3e', a.document), c.insertAfter(b), b.mergeSiblings(!1), a.moveToBookmark({
3225                    startNode: c
3226                }))) : a.collapse(!0)
3227            }
3228            a.optimizeBookmark();
3229            var k = 0 === b,
3230                r = 1 == b,
3231                l = 2 == b;
3232            b = l || r;
3233            var t = a.startContainer,
3234                F = a.endContainer,
3235                L = a.startOffset,
3236                C = a.endOffset,
3237                M, q, E, z, H, P;
3238            if (l && F.type == CKEDITOR.NODE_TEXT && (t.equals(F) || t.type === CKEDITOR.NODE_ELEMENT && t.getFirst().equals(F))) c.append(a.document.createText(F.substring(L, C)));
3239            else {
3240                F.type == CKEDITOR.NODE_TEXT ? l ? P = !0 : F = F.split(C) : 0 < F.getChildCount() ? C >= F.getChildCount() ? (F = F.getChild(C - 1), q = !0) : F = F.getChild(C) : z = q = !0;
3241                t.type == CKEDITOR.NODE_TEXT ? l ? H = !0 : t.split(L) : 0 < t.getChildCount() ? 0 === L ? (t = t.getChild(L), M = !0) : t = t.getChild(L - 1) : E = M = !0;
3242                for (var O = t.getParents(), p = F.getParents(), N = m(),
3243                        w = O.length - 1, A = p.length - 1, G = c, I, X, V, da = -1, Q = N; Q <= w; Q++) {
3244                    X = O[Q];
3245                    V = X.getNext();
3246                    for (Q != w || X.equals(p[Q]) && w < A ? b && (I = G.append(X.clone(0, f))) : M ? h(X, G, !1, E) : H && G.append(a.document.createText(X.substring(L))); V;) {
3247                        if (V.equals(p[Q])) {
3248                            da = Q;
3249                            break
3250                        }
3251                        V = h(V, G)
3252                    }
3253                    G = I
3254                }
3255                G = c;
3256                for (Q = N; Q <= A; Q++)
3257                    if (c = p[Q], V = c.getPrevious(), c.equals(O[Q])) b && (G = G.getChild(0));
3258                    else {
3259                        Q != A || c.equals(O[Q]) && A < w ? b && (I = G.append(c.clone(0, f))) : q ? h(c, G, !1, z) : P && G.append(a.document.createText(c.substring(0, C)));
3260                        if (Q > da)
3261                            for (; V;) V = h(V, G, !0);
3262                        G = I
3263                    } l || g()
3264            }
3265        }
3266
3267        function b() {
3268            var a = !1,
3269                b = CKEDITOR.dom.walker.whitespaces(),
3270                c = CKEDITOR.dom.walker.bookmark(!0),
3271                d = CKEDITOR.dom.walker.bogus();
3272            return function(f) {
3273                return c(f) || b(f) ? !0 : d(f) && !a ? a = !0 : f.type == CKEDITOR.NODE_TEXT && (f.hasAscendant("pre") || CKEDITOR.tools.trim(f.getText()).length) || f.type == CKEDITOR.NODE_ELEMENT && !f.is(h) ? !1 : !0
3274            }
3275        }
3276
3277        function c(a) {
3278            var b = CKEDITOR.dom.walker.whitespaces(),
3279                c = CKEDITOR.dom.walker.bookmark(1);
3280            return function(d) {
3281                return c(d) || b(d) ? !0 : !a && k(d) || d.type == CKEDITOR.NODE_ELEMENT && d.is(CKEDITOR.dtd.$removeEmpty)
3282            }
3283        }
3284
3285        function f(a) {
3286            return function() {
3287                var b;
3288                return this[a ? "getPreviousNode" : "getNextNode"](function(a) {
3289                    !b && r(a) && (b = a);
3290                    return n(a) && !(k(a) && a.equals(b))
3291                })
3292            }
3293        }
3294        var h = {
3295                abbr: 1,
3296                acronym: 1,
3297                b: 1,
3298                bdo: 1,
3299                big: 1,
3300                cite: 1,
3301                code: 1,
3302                del: 1,
3303                dfn: 1,
3304                em: 1,
3305                font: 1,
3306                i: 1,
3307                ins: 1,
3308                label: 1,
3309                kbd: 1,
3310                q: 1,
3311                samp: 1,
3312                small: 1,
3313                span: 1,
3314                strike: 1,
3315                strong: 1,
3316                sub: 1,
3317                sup: 1,
3318                tt: 1,
3319                u: 1,
3320                "var": 1
3321            },
3322            k = CKEDITOR.dom.walker.bogus(),
3323            g = /^[\t\r\n ]*(?:&nbsp;|\xa0)$/,
3324            n = CKEDITOR.dom.walker.editable(),
3325            r = CKEDITOR.dom.walker.ignored(!0);
3326        CKEDITOR.dom.range.prototype = {
3327            clone: function() {
3328                var a =
3329                    new CKEDITOR.dom.range(this.root);
3330                a._setStartContainer(this.startContainer);
3331                a.startOffset = this.startOffset;
3332                a._setEndContainer(this.endContainer);
3333                a.endOffset = this.endOffset;
3334                a.collapsed = this.collapsed;
3335                return a
3336            },
3337            collapse: function(a) {
3338                a ? (this._setEndContainer(this.startContainer), this.endOffset = this.startOffset) : (this._setStartContainer(this.endContainer), this.startOffset = this.endOffset);
3339                this.collapsed = !0
3340            },
3341            cloneContents: function(a) {
3342                var b = new CKEDITOR.dom.documentFragment(this.document);
3343                this.collapsed ||
3344                    d(this, 2, b, !1, "undefined" == typeof a ? !0 : a);
3345                return b
3346            },
3347            deleteContents: function(a) {
3348                this.collapsed || d(this, 0, null, a)
3349            },
3350            extractContents: function(a, b) {
3351                var c = new CKEDITOR.dom.documentFragment(this.document);
3352                this.collapsed || d(this, 1, c, a, "undefined" == typeof b ? !0 : b);
3353                return c
3354            },
3355            createBookmark: function(a) {
3356                var b, c, d, f, h = this.collapsed;
3357                b = this.document.createElement("span");
3358                b.data("cke-bookmark", 1);
3359                b.setStyle("display", "none");
3360                b.setHtml("\x26nbsp;");
3361                a && (d = "cke_bm_" + CKEDITOR.tools.getNextNumber(), b.setAttribute("id",
3362                    d + (h ? "C" : "S")));
3363                h || (c = b.clone(), c.setHtml("\x26nbsp;"), a && c.setAttribute("id", d + "E"), f = this.clone(), f.collapse(), f.insertNode(c));
3364                f = this.clone();
3365                f.collapse(!0);
3366                f.insertNode(b);
3367                c ? (this.setStartAfter(b), this.setEndBefore(c)) : this.moveToPosition(b, CKEDITOR.POSITION_AFTER_END);
3368                return {
3369                    startNode: a ? d + (h ? "C" : "S") : b,
3370                    endNode: a ? d + "E" : c,
3371                    serializable: a,
3372                    collapsed: h
3373                }
3374            },
3375            createBookmark2: function() {
3376                function a(b) {
3377                    var e = b.container,
3378                        d = b.offset,
3379                        m;
3380                    m = e;
3381                    var f = d;
3382                    m = m.type != CKEDITOR.NODE_ELEMENT || 0 === f || f == m.getChildCount() ?
3383                        0 : m.getChild(f - 1).type == CKEDITOR.NODE_TEXT && m.getChild(f).type == CKEDITOR.NODE_TEXT;
3384                    m && (e = e.getChild(d - 1), d = e.getLength());
3385                    if (e.type == CKEDITOR.NODE_ELEMENT && 0 < d) {
3386                        a: {
3387                            for (m = e; d--;)
3388                                if (f = m.getChild(d).getIndex(!0), 0 <= f) {
3389                                    d = f;
3390                                    break a
3391                                } d = -1
3392                        }
3393                        d += 1
3394                    }
3395                    if (e.type == CKEDITOR.NODE_TEXT) {
3396                        m = e;
3397                        for (f = 0;
3398                            (m = m.getPrevious()) && m.type == CKEDITOR.NODE_TEXT;) f += m.getText().replace(CKEDITOR.dom.selection.FILLING_CHAR_SEQUENCE, "").length;
3399                        m = f;
3400                        e.getText() ? d += m : (f = e.getPrevious(c), m ? (d = m, e = f ? f.getNext() : e.getParent().getFirst()) : (e =
3401                            e.getParent(), d = f ? f.getIndex(!0) + 1 : 0))
3402                    }
3403                    b.container = e;
3404                    b.offset = d
3405                }
3406
3407                function b(a, c) {
3408                    var e = c.getCustomData("cke-fillingChar");
3409                    if (e) {
3410                        var d = a.container;
3411                        e.equals(d) && (a.offset -= CKEDITOR.dom.selection.FILLING_CHAR_SEQUENCE.length, 0 >= a.offset && (a.offset = d.getIndex(), a.container = d.getParent()))
3412                    }
3413                }
3414                var c = CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_TEXT, !0);
3415                return function(c) {
3416                    var d = this.collapsed,
3417                        f = {
3418                            container: this.startContainer,
3419                            offset: this.startOffset
3420                        },
3421                        m = {
3422                            container: this.endContainer,
3423                            offset: this.endOffset
3424                        };
3425                    c && (a(f),
3426                        b(f, this.root), d || (a(m), b(m, this.root)));
3427                    return {
3428                        start: f.container.getAddress(c),
3429                        end: d ? null : m.container.getAddress(c),
3430                        startOffset: f.offset,
3431                        endOffset: m.offset,
3432                        normalized: c,
3433                        collapsed: d,
3434                        is2: !0
3435                    }
3436                }
3437            }(),
3438            moveToBookmark: function(a) {
3439                if (a.is2) {
3440                    var b = this.document.getByAddress(a.start, a.normalized),
3441                        c = a.startOffset,
3442                        d = a.end && this.document.getByAddress(a.end, a.normalized);
3443                    a = a.endOffset;
3444                    this.setStart(b, c);
3445                    d ? this.setEnd(d, a) : this.collapse(!0)
3446                } else b = (c = a.serializable) ? this.document.getById(a.startNode) : a.startNode,
3447                    a = c ? this.document.getById(a.endNode) : a.endNode, this.setStartBefore(b), b.remove(), a ? (this.setEndBefore(a), a.remove()) : this.collapse(!0)
3448            },
3449            getBoundaryNodes: function() {
3450                var a = this.startContainer,
3451                    b = this.endContainer,
3452                    c = this.startOffset,
3453                    d = this.endOffset,
3454                    f;
3455                if (a.type == CKEDITOR.NODE_ELEMENT)
3456                    if (f = a.getChildCount(), f > c) a = a.getChild(c);
3457                    else if (1 > f) a = a.getPreviousSourceNode();
3458                else {
3459                    for (a = a.$; a.lastChild;) a = a.lastChild;
3460                    a = new CKEDITOR.dom.node(a);
3461                    a = a.getNextSourceNode() || a
3462                }
3463                if (b.type == CKEDITOR.NODE_ELEMENT)
3464                    if (f = b.getChildCount(),
3465                        f > d) b = b.getChild(d).getPreviousSourceNode(!0);
3466                    else if (1 > f) b = b.getPreviousSourceNode();
3467                else {
3468                    for (b = b.$; b.lastChild;) b = b.lastChild;
3469                    b = new CKEDITOR.dom.node(b)
3470                }
3471                a.getPosition(b) & CKEDITOR.POSITION_FOLLOWING && (a = b);
3472                return {
3473                    startNode: a,
3474                    endNode: b
3475                }
3476            },
3477            getCommonAncestor: function(a, b) {
3478                var c = this.startContainer,
3479                    d = this.endContainer,
3480                    c = c.equals(d) ? a && c.type == CKEDITOR.NODE_ELEMENT && this.startOffset == this.endOffset - 1 ? c.getChild(this.startOffset) : c : c.getCommonAncestor(d);
3481                return b && !c.is ? c.getParent() : c
3482            },
3483            optimize: function() {
3484                var a =
3485                    this.startContainer,
3486                    b = this.startOffset;
3487                a.type != CKEDITOR.NODE_ELEMENT && (b ? b >= a.getLength() && this.setStartAfter(a) : this.setStartBefore(a));
3488                a = this.endContainer;
3489                b = this.endOffset;
3490                a.type != CKEDITOR.NODE_ELEMENT && (b ? b >= a.getLength() && this.setEndAfter(a) : this.setEndBefore(a))
3491            },
3492            optimizeBookmark: function() {
3493                var a = this.startContainer,
3494                    b = this.endContainer;
3495                a.is && a.is("span") && a.data("cke-bookmark") && this.setStartAt(a, CKEDITOR.POSITION_BEFORE_START);
3496                b && b.is && b.is("span") && b.data("cke-bookmark") && this.setEndAt(b, CKEDITOR.POSITION_AFTER_END)
3497            },
3498            trim: function(a, b) {
3499                var c = this.startContainer,
3500                    d = this.startOffset,
3501                    f = this.collapsed;
3502                if ((!a || f) && c && c.type == CKEDITOR.NODE_TEXT) {
3503                    if (d)
3504                        if (d >= c.getLength()) d = c.getIndex() + 1, c = c.getParent();
3505                        else {
3506                            var h = c.split(d),
3507                                d = c.getIndex() + 1,
3508                                c = c.getParent();
3509                            this.startContainer.equals(this.endContainer) ? this.setEnd(h, this.endOffset - this.startOffset) : c.equals(this.endContainer) && (this.endOffset += 1)
3510                        }
3511                    else d = c.getIndex(), c = c.getParent();
3512                    this.setStart(c, d);
3513                    if (f) {
3514                        this.collapse(!0);
3515                        return
3516                    }
3517                }
3518                c = this.endContainer;
3519                d = this.endOffset;
3520                b || f || !c || c.type != CKEDITOR.NODE_TEXT || (d ? (d >= c.getLength() || c.split(d), d = c.getIndex() + 1) : d = c.getIndex(), c = c.getParent(), this.setEnd(c, d))
3521            },
3522            enlarge: function(a, b) {
3523                function c(a) {
3524                    return a && a.type == CKEDITOR.NODE_ELEMENT && a.hasAttribute("contenteditable") ? null : a
3525                }
3526                var d = new RegExp(/[^\s\ufeff]/);
3527                switch (a) {
3528                    case CKEDITOR.ENLARGE_INLINE:
3529                        var f = 1;
3530                    case CKEDITOR.ENLARGE_ELEMENT:
3531                        var h = function(a, b) {
3532                            var c = new CKEDITOR.dom.range(g);
3533                            c.setStart(a, b);
3534                            c.setEndAt(g, CKEDITOR.POSITION_BEFORE_END);
3535                            var c = new CKEDITOR.dom.walker(c),
3536                                e;
3537                            for (c.guard = function(a) {
3538                                    return !(a.type == CKEDITOR.NODE_ELEMENT && a.isBlockBoundary())
3539                                }; e = c.next();) {
3540                                if (e.type != CKEDITOR.NODE_TEXT) return !1;
3541                                M = e != a ? e.getText() : e.substring(b);
3542                                if (d.test(M)) return !1
3543                            }
3544                            return !0
3545                        };
3546                        if (this.collapsed) break;
3547                        var m = this.getCommonAncestor(),
3548                            g = this.root,
3549                            k, r, l, t, F, L = !1,
3550                            C, M;
3551                        C = this.startContainer;
3552                        var q = this.startOffset;
3553                        C.type == CKEDITOR.NODE_TEXT ? (q && (C = !CKEDITOR.tools.trim(C.substring(0, q)).length && C, L = !!C), C && ((t = C.getPrevious()) || (l = C.getParent()))) : (q && (t = C.getChild(q - 1) || C.getLast()),
3554                            t || (l = C));
3555                        for (l = c(l); l || t;) {
3556                            if (l && !t) {
3557                                !F && l.equals(m) && (F = !0);
3558                                if (f ? l.isBlockBoundary() : !g.contains(l)) break;
3559                                L && "inline" == l.getComputedStyle("display") || (L = !1, F ? k = l : this.setStartBefore(l));
3560                                t = l.getPrevious()
3561                            }
3562                            for (; t;)
3563                                if (C = !1, t.type == CKEDITOR.NODE_COMMENT) t = t.getPrevious();
3564                                else {
3565                                    if (t.type == CKEDITOR.NODE_TEXT) M = t.getText(), d.test(M) && (t = null), C = /[\s\ufeff]$/.test(M);
3566                                    else if ((t.$.offsetWidth > (CKEDITOR.env.webkit ? 1 : 0) || b && t.is("br")) && !t.data("cke-bookmark"))
3567                                        if (L && CKEDITOR.dtd.$removeEmpty[t.getName()]) {
3568                                            M =
3569                                                t.getText();
3570                                            if (d.test(M)) t = null;
3571                                            else
3572                                                for (var q = t.$.getElementsByTagName("*"), E = 0, z; z = q[E++];)
3573                                                    if (!CKEDITOR.dtd.$removeEmpty[z.nodeName.toLowerCase()]) {
3574                                                        t = null;
3575                                                        break
3576                                                    } t && (C = !!M.length)
3577                                        } else t = null;
3578                                    C && (L ? F ? k = l : l && this.setStartBefore(l) : L = !0);
3579                                    if (t) {
3580                                        C = t.getPrevious();
3581                                        if (!l && !C) {
3582                                            l = t;
3583                                            t = null;
3584                                            break
3585                                        }
3586                                        t = C
3587                                    } else l = null
3588                                } l && (l = c(l.getParent()))
3589                        }
3590                        C = this.endContainer;
3591                        q = this.endOffset;
3592                        l = t = null;
3593                        F = L = !1;
3594                        C.type == CKEDITOR.NODE_TEXT ? CKEDITOR.tools.trim(C.substring(q)).length ? L = !0 : (L = !C.getLength(), q == C.getLength() ? (t = C.getNext()) ||
3595                            (l = C.getParent()) : h(C, q) && (l = C.getParent())) : (t = C.getChild(q)) || (l = C);
3596                        for (; l || t;) {
3597                            if (l && !t) {
3598                                !F && l.equals(m) && (F = !0);
3599                                if (f ? l.isBlockBoundary() : !g.contains(l)) break;
3600                                L && "inline" == l.getComputedStyle("display") || (L = !1, F ? r = l : l && this.setEndAfter(l));
3601                                t = l.getNext()
3602                            }
3603                            for (; t;) {
3604                                C = !1;
3605                                if (t.type == CKEDITOR.NODE_TEXT) M = t.getText(), h(t, 0) || (t = null), C = /^[\s\ufeff]/.test(M);
3606                                else if (t.type == CKEDITOR.NODE_ELEMENT) {
3607                                    if ((0 < t.$.offsetWidth || b && t.is("br")) && !t.data("cke-bookmark"))
3608                                        if (L && CKEDITOR.dtd.$removeEmpty[t.getName()]) {
3609                                            M =
3610                                                t.getText();
3611                                            if (d.test(M)) t = null;
3612                                            else
3613                                                for (q = t.$.getElementsByTagName("*"), E = 0; z = q[E++];)
3614                                                    if (!CKEDITOR.dtd.$removeEmpty[z.nodeName.toLowerCase()]) {
3615                                                        t = null;
3616                                                        break
3617                                                    } t && (C = !!M.length)
3618                                        } else t = null
3619                                } else C = 1;
3620                                C && L && (F ? r = l : this.setEndAfter(l));
3621                                if (t) {
3622                                    C = t.getNext();
3623                                    if (!l && !C) {
3624                                        l = t;
3625                                        t = null;
3626                                        break
3627                                    }
3628                                    t = C
3629                                } else l = null
3630                            }
3631                            l && (l = c(l.getParent()))
3632                        }
3633                        k && r && (m = k.contains(r) ? r : k, this.setStartBefore(m), this.setEndAfter(m));
3634                        break;
3635                    case CKEDITOR.ENLARGE_BLOCK_CONTENTS:
3636                    case CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:
3637                        l = new CKEDITOR.dom.range(this.root);
3638                        g = this.root;
3639                        l.setStartAt(g, CKEDITOR.POSITION_AFTER_START);
3640                        l.setEnd(this.startContainer, this.startOffset);
3641                        l = new CKEDITOR.dom.walker(l);
3642                        var H, P, O = CKEDITOR.dom.walker.blockBoundary(a == CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS ? {
3643                                br: 1
3644                            } : null),
3645                            p = null,
3646                            N = function(a) {
3647                                if (a.type == CKEDITOR.NODE_ELEMENT && "false" == a.getAttribute("contenteditable"))
3648                                    if (p) {
3649                                        if (p.equals(a)) {
3650                                            p = null;
3651                                            return
3652                                        }
3653                                    } else p = a;
3654                                else if (p) return;
3655                                var b = O(a);
3656                                b || (H = a);
3657                                return b
3658                            },
3659                            f = function(a) {
3660                                var b = N(a);
3661                                !b && a.is && a.is("br") && (P = a);
3662                                return b
3663                            };
3664                        l.guard = N;
3665                        l = l.lastBackward();
3666                        H = H || g;
3667                        this.setStartAt(H, !H.is("br") && (!l && this.checkStartOfBlock() || l && H.contains(l)) ? CKEDITOR.POSITION_AFTER_START : CKEDITOR.POSITION_AFTER_END);
3668                        if (a == CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS) {
3669                            l = this.clone();
3670                            l = new CKEDITOR.dom.walker(l);
3671                            var w = CKEDITOR.dom.walker.whitespaces(),
3672                                A = CKEDITOR.dom.walker.bookmark();
3673                            l.evaluator = function(a) {
3674                                return !w(a) && !A(a)
3675                            };
3676                            if ((l = l.previous()) && l.type == CKEDITOR.NODE_ELEMENT && l.is("br")) break
3677                        }
3678                        l = this.clone();
3679                        l.collapse();
3680                        l.setEndAt(g, CKEDITOR.POSITION_BEFORE_END);
3681                        l = new CKEDITOR.dom.walker(l);
3682                        l.guard = a == CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS ? f : N;
3683                        H = p = P = null;
3684                        l = l.lastForward();
3685                        H = H || g;
3686                        this.setEndAt(H, !l && this.checkEndOfBlock() || l && H.contains(l) ? CKEDITOR.POSITION_BEFORE_END : CKEDITOR.POSITION_BEFORE_START);
3687                        P && this.setEndAfter(P)
3688                }
3689            },
3690            shrink: function(a, b, c) {
3691                var d = "boolean" === typeof c ? c : c && "boolean" === typeof c.shrinkOnBlockBoundary ? c.shrinkOnBlockBoundary : !0,
3692                    f = c && c.skipBogus;
3693                if (!this.collapsed) {
3694                    a = a || CKEDITOR.SHRINK_TEXT;
3695                    var h = this.clone(),
3696                        m = this.startContainer,
3697                        g = this.endContainer,
3698                        k = this.startOffset,
3699                        r = this.endOffset,
3700                        l = c = 1;
3701                    m && m.type == CKEDITOR.NODE_TEXT && (k ? k >= m.getLength() ? h.setStartAfter(m) : (h.setStartBefore(m), c = 0) : h.setStartBefore(m));
3702                    g && g.type == CKEDITOR.NODE_TEXT && (r ? r >= g.getLength() ? h.setEndAfter(g) : (h.setEndAfter(g), l = 0) : h.setEndBefore(g));
3703                    var h = new CKEDITOR.dom.walker(h),
3704                        t = CKEDITOR.dom.walker.bookmark(),
3705                        F = CKEDITOR.dom.walker.bogus();
3706                    h.evaluator = function(b) {
3707                        return b.type == (a == CKEDITOR.SHRINK_ELEMENT ? CKEDITOR.NODE_ELEMENT : CKEDITOR.NODE_TEXT)
3708                    };
3709                    var L;
3710                    h.guard = function(b, c) {
3711                        if (f && F(b) || t(b)) return !0;
3712                        if (a == CKEDITOR.SHRINK_ELEMENT && b.type == CKEDITOR.NODE_TEXT || c && b.equals(L) || !1 === d && b.type == CKEDITOR.NODE_ELEMENT && b.isBlockBoundary() || b.type == CKEDITOR.NODE_ELEMENT && b.hasAttribute("contenteditable")) return !1;
3713                        c || b.type != CKEDITOR.NODE_ELEMENT || (L = b);
3714                        return !0
3715                    };
3716                    c && (m = h[a == CKEDITOR.SHRINK_ELEMENT ? "lastForward" : "next"]()) && this.setStartAt(m, b ? CKEDITOR.POSITION_AFTER_START : CKEDITOR.POSITION_BEFORE_START);
3717                    l && (h.reset(), (h = h[a == CKEDITOR.SHRINK_ELEMENT ? "lastBackward" : "previous"]()) && this.setEndAt(h, b ? CKEDITOR.POSITION_BEFORE_END :
3718                        CKEDITOR.POSITION_AFTER_END));
3719                    return !(!c && !l)
3720                }
3721            },
3722            insertNode: function(a) {
3723                this.optimizeBookmark();
3724                this.trim(!1, !0);
3725                var b = this.startContainer,
3726                    c = b.getChild(this.startOffset);
3727                c ? a.insertBefore(c) : b.append(a);
3728                a.getParent() && a.getParent().equals(this.endContainer) && this.endOffset++;
3729                this.setStartBefore(a)
3730            },
3731            moveToPosition: function(a, b) {
3732                this.setStartAt(a, b);
3733                this.collapse(!0)
3734            },
3735            moveToRange: function(a) {
3736                this.setStart(a.startContainer, a.startOffset);
3737                this.setEnd(a.endContainer, a.endOffset)
3738            },
3739            selectNodeContents: function(a) {
3740                this.setStart(a,
3741                    0);
3742                this.setEnd(a, a.type == CKEDITOR.NODE_TEXT ? a.getLength() : a.getChildCount())
3743            },
3744            setStart: function(b, c) {
3745                b.type == CKEDITOR.NODE_ELEMENT && CKEDITOR.dtd.$empty[b.getName()] && (c = b.getIndex(), b = b.getParent());
3746                this._setStartContainer(b);
3747                this.startOffset = c;
3748                this.endContainer || (this._setEndContainer(b), this.endOffset = c);
3749                a(this)
3750            },
3751            setEnd: function(b, c) {
3752                b.type == CKEDITOR.NODE_ELEMENT && CKEDITOR.dtd.$empty[b.getName()] && (c = b.getIndex() + 1, b = b.getParent());
3753                this._setEndContainer(b);
3754                this.endOffset = c;
3755                this.startContainer ||
3756                    (this._setStartContainer(b), this.startOffset = c);
3757                a(this)
3758            },
3759            setStartAfter: function(a) {
3760                this.setStart(a.getParent(), a.getIndex() + 1)
3761            },
3762            setStartBefore: function(a) {
3763                this.setStart(a.getParent(), a.getIndex())
3764            },
3765            setEndAfter: function(a) {
3766                this.setEnd(a.getParent(), a.getIndex() + 1)
3767            },
3768            setEndBefore: function(a) {
3769                this.setEnd(a.getParent(), a.getIndex())
3770            },
3771            setStartAt: function(b, c) {
3772                switch (c) {
3773                    case CKEDITOR.POSITION_AFTER_START:
3774                        this.setStart(b, 0);
3775                        break;
3776                    case CKEDITOR.POSITION_BEFORE_END:
3777                        b.type == CKEDITOR.NODE_TEXT ? this.setStart(b,
3778                            b.getLength()) : this.setStart(b, b.getChildCount());
3779                        break;
3780                    case CKEDITOR.POSITION_BEFORE_START:
3781                        this.setStartBefore(b);
3782                        break;
3783                    case CKEDITOR.POSITION_AFTER_END:
3784                        this.setStartAfter(b)
3785                }
3786                a(this)
3787            },
3788            setEndAt: function(b, c) {
3789                switch (c) {
3790                    case CKEDITOR.POSITION_AFTER_START:
3791                        this.setEnd(b, 0);
3792                        break;
3793                    case CKEDITOR.POSITION_BEFORE_END:
3794                        b.type == CKEDITOR.NODE_TEXT ? this.setEnd(b, b.getLength()) : this.setEnd(b, b.getChildCount());
3795                        break;
3796                    case CKEDITOR.POSITION_BEFORE_START:
3797                        this.setEndBefore(b);
3798                        break;
3799                    case CKEDITOR.POSITION_AFTER_END:
3800                        this.setEndAfter(b)
3801                }
3802                a(this)
3803            },
3804            fixBlock: function(a, b) {
3805                var c = this.createBookmark(),
3806                    d = this.document.createElement(b);
3807                this.collapse(a);
3808                this.enlarge(CKEDITOR.ENLARGE_BLOCK_CONTENTS);
3809                this.extractContents().appendTo(d);
3810                d.trim();
3811                this.insertNode(d);
3812                var f = d.getBogus();
3813                f && f.remove();
3814                d.appendBogus();
3815                this.moveToBookmark(c);
3816                return d
3817            },
3818            splitBlock: function(a, b) {
3819                var c = new CKEDITOR.dom.elementPath(this.startContainer, this.root),
3820                    d = new CKEDITOR.dom.elementPath(this.endContainer, this.root),
3821                    f = c.block,
3822                    h = d.block,
3823                    m = null;
3824                if (!c.blockLimit.equals(d.blockLimit)) return null;
3825                "br" != a && (f || (f = this.fixBlock(!0, a), h = (new CKEDITOR.dom.elementPath(this.endContainer, this.root)).block), h || (h = this.fixBlock(!1, a)));
3826                c = f && this.checkStartOfBlock();
3827                d = h && this.checkEndOfBlock();
3828                this.deleteContents();
3829                f && f.equals(h) && (d ? (m = new CKEDITOR.dom.elementPath(this.startContainer, this.root), this.moveToPosition(h, CKEDITOR.POSITION_AFTER_END), h = null) : c ? (m = new CKEDITOR.dom.elementPath(this.startContainer, this.root), this.moveToPosition(f, CKEDITOR.POSITION_BEFORE_START), f = null) : (h = this.splitElement(f,
3830                    b || !1), f.is("ul", "ol") || f.appendBogus()));
3831                return {
3832                    previousBlock: f,
3833                    nextBlock: h,
3834                    wasStartOfBlock: c,
3835                    wasEndOfBlock: d,
3836                    elementPath: m
3837                }
3838            },
3839            splitElement: function(a, b) {
3840                if (!this.collapsed) return null;
3841                this.setEndAt(a, CKEDITOR.POSITION_BEFORE_END);
3842                var c = this.extractContents(!1, b || !1),
3843                    d = a.clone(!1, b || !1);
3844                c.appendTo(d);
3845                d.insertAfter(a);
3846                this.moveToPosition(a, CKEDITOR.POSITION_AFTER_END);
3847                return d
3848            },
3849            removeEmptyBlocksAtEnd: function() {
3850                function a(d) {
3851                    return function(a) {
3852                        return b(a) || c(a) || a.type == CKEDITOR.NODE_ELEMENT && a.isEmptyInlineRemoveable() ||
3853                            d.is("table") && a.is("caption") ? !1 : !0
3854                    }
3855                }
3856                var b = CKEDITOR.dom.walker.whitespaces(),
3857                    c = CKEDITOR.dom.walker.bookmark(!1);
3858                return function(b) {
3859                    for (var c = this.createBookmark(), d = this[b ? "endPath" : "startPath"](), f = d.block || d.blockLimit, h; f && !f.equals(d.root) && !f.getFirst(a(f));) h = f.getParent(), this[b ? "setEndAt" : "setStartAt"](f, CKEDITOR.POSITION_AFTER_END), f.remove(1), f = h;
3860                    this.moveToBookmark(c)
3861                }
3862            }(),
3863            startPath: function() {
3864                return new CKEDITOR.dom.elementPath(this.startContainer, this.root)
3865            },
3866            endPath: function() {
3867                return new CKEDITOR.dom.elementPath(this.endContainer,
3868                    this.root)
3869            },
3870            checkBoundaryOfElement: function(a, b) {
3871                var d = b == CKEDITOR.START,
3872                    f = this.clone();
3873                f.collapse(d);
3874                f[d ? "setStartAt" : "setEndAt"](a, d ? CKEDITOR.POSITION_AFTER_START : CKEDITOR.POSITION_BEFORE_END);
3875                f = new CKEDITOR.dom.walker(f);
3876                f.evaluator = c(d);
3877                return f[d ? "checkBackward" : "checkForward"]()
3878            },
3879            checkStartOfBlock: function() {
3880                var a = this.startContainer,
3881                    c = this.startOffset;
3882                CKEDITOR.env.ie && c && a.type == CKEDITOR.NODE_TEXT && (a = CKEDITOR.tools.ltrim(a.substring(0, c)), g.test(a) && this.trim(0, 1));
3883                this.trim();
3884                a = new CKEDITOR.dom.elementPath(this.startContainer,
3885                    this.root);
3886                c = this.clone();
3887                c.collapse(!0);
3888                c.setStartAt(a.block || a.blockLimit, CKEDITOR.POSITION_AFTER_START);
3889                a = new CKEDITOR.dom.walker(c);
3890                a.evaluator = b();
3891                return a.checkBackward()
3892            },
3893            checkEndOfBlock: function() {
3894                var a = this.endContainer,
3895                    c = this.endOffset;
3896                CKEDITOR.env.ie && a.type == CKEDITOR.NODE_TEXT && (a = CKEDITOR.tools.rtrim(a.substring(c)), g.test(a) && this.trim(1, 0));
3897                this.trim();
3898                a = new CKEDITOR.dom.elementPath(this.endContainer, this.root);
3899                c = this.clone();
3900                c.collapse(!1);
3901                c.setEndAt(a.block || a.blockLimit, CKEDITOR.POSITION_BEFORE_END);
3902                a = new CKEDITOR.dom.walker(c);
3903                a.evaluator = b();
3904                return a.checkForward()
3905            },
3906            getPreviousNode: function(a, b, c) {
3907                var d = this.clone();
3908                d.collapse(1);
3909                d.setStartAt(c || this.root, CKEDITOR.POSITION_AFTER_START);
3910                c = new CKEDITOR.dom.walker(d);
3911                c.evaluator = a;
3912                c.guard = b;
3913                return c.previous()
3914            },
3915            getNextNode: function(a, b, c) {
3916                var d = this.clone();
3917                d.collapse();
3918                d.setEndAt(c || this.root, CKEDITOR.POSITION_BEFORE_END);
3919                c = new CKEDITOR.dom.walker(d);
3920                c.evaluator = a;
3921                c.guard = b;
3922                return c.next()
3923            },
3924            checkReadOnly: function() {
3925                function a(b, c) {
3926                    for (; b;) {
3927                        if (b.type ==
3928                            CKEDITOR.NODE_ELEMENT) {
3929                            if ("false" == b.getAttribute("contentEditable") && !b.data("cke-editable")) return 0;
3930                            if (b.is("html") || "true" == b.getAttribute("contentEditable") && (b.contains(c) || b.equals(c))) break
3931                        }
3932                        b = b.getParent()
3933                    }
3934                    return 1
3935                }
3936                return function() {
3937                    var b = this.startContainer,
3938                        c = this.endContainer;
3939                    return !(a(b, c) && a(c, b))
3940                }
3941            }(),
3942            moveToElementEditablePosition: function(a, b) {
3943                if (a.type == CKEDITOR.NODE_ELEMENT && !a.isEditable(!1)) return this.moveToPosition(a, b ? CKEDITOR.POSITION_AFTER_END : CKEDITOR.POSITION_BEFORE_START),
3944                    !0;
3945                for (var c = 0; a;) {
3946                    if (a.type == CKEDITOR.NODE_TEXT) {
3947                        b && this.endContainer && this.checkEndOfBlock() && g.test(a.getText()) ? this.moveToPosition(a, CKEDITOR.POSITION_BEFORE_START) : this.moveToPosition(a, b ? CKEDITOR.POSITION_AFTER_END : CKEDITOR.POSITION_BEFORE_START);
3948                        c = 1;
3949                        break
3950                    }
3951                    if (a.type == CKEDITOR.NODE_ELEMENT)
3952                        if (a.isEditable()) this.moveToPosition(a, b ? CKEDITOR.POSITION_BEFORE_END : CKEDITOR.POSITION_AFTER_START), c = 1;
3953                        else if (b && a.is("br") && this.endContainer && this.checkEndOfBlock()) this.moveToPosition(a, CKEDITOR.POSITION_BEFORE_START);
3954                    else if ("false" == a.getAttribute("contenteditable") && a.is(CKEDITOR.dtd.$block)) return this.setStartBefore(a), this.setEndAfter(a), !0;
3955                    var d = a,
3956                        f = c,
3957                        h = void 0;
3958                    d.type == CKEDITOR.NODE_ELEMENT && d.isEditable(!1) && (h = d[b ? "getLast" : "getFirst"](r));
3959                    f || h || (h = d[b ? "getPrevious" : "getNext"](r));
3960                    a = h
3961                }
3962                return !!c
3963            },
3964            moveToClosestEditablePosition: function(a, b) {
3965                var c, d = 0,
3966                    f, h, m = [CKEDITOR.POSITION_AFTER_END, CKEDITOR.POSITION_BEFORE_START];
3967                a ? (c = new CKEDITOR.dom.range(this.root), c.moveToPosition(a, m[b ? 0 : 1])) : c = this.clone();
3968                if (a &&
3969                    !a.is(CKEDITOR.dtd.$block)) d = 1;
3970                else if (f = c[b ? "getNextEditableNode" : "getPreviousEditableNode"]()) d = 1, (h = f.type == CKEDITOR.NODE_ELEMENT) && f.is(CKEDITOR.dtd.$block) && "false" == f.getAttribute("contenteditable") ? (c.setStartAt(f, CKEDITOR.POSITION_BEFORE_START), c.setEndAt(f, CKEDITOR.POSITION_AFTER_END)) : !CKEDITOR.env.needsBrFiller && h && f.is(CKEDITOR.dom.walker.validEmptyBlockContainers) ? (c.setEnd(f, 0), c.collapse()) : c.moveToPosition(f, m[b ? 1 : 0]);
3971                d && this.moveToRange(c);
3972                return !!d
3973            },
3974            moveToElementEditStart: function(a) {
3975                return this.moveToElementEditablePosition(a)
3976            },
3977            moveToElementEditEnd: function(a) {
3978                return this.moveToElementEditablePosition(a, !0)
3979            },
3980            getEnclosedNode: function() {
3981                var a = this.clone();
3982                a.optimize();
3983                if (a.startContainer.type != CKEDITOR.NODE_ELEMENT || a.endContainer.type != CKEDITOR.NODE_ELEMENT) return null;
3984                var a = new CKEDITOR.dom.walker(a),
3985                    b = CKEDITOR.dom.walker.bookmark(!1, !0),
3986                    c = CKEDITOR.dom.walker.whitespaces(!0);
3987                a.evaluator = function(a) {
3988                    return c(a) && b(a)
3989                };
3990                var d = a.next();
3991                a.reset();
3992                return d && d.equals(a.previous()) ? d : null
3993            },
3994            getTouchedStartNode: function() {
3995                var a = this.startContainer;
3996                return this.collapsed || a.type != CKEDITOR.NODE_ELEMENT ? a : a.getChild(this.startOffset) || a
3997            },
3998            getTouchedEndNode: function() {
3999                var a = this.endContainer;
4000                return this.collapsed || a.type != CKEDITOR.NODE_ELEMENT ? a : a.getChild(this.endOffset - 1) || a
4001            },
4002            getNextEditableNode: f(),
4003            getPreviousEditableNode: f(1),
4004            _getTableElement: function(a) {
4005                a = a || {
4006                    td: 1,
4007                    th: 1,
4008                    tr: 1,
4009                    tbody: 1,
4010                    thead: 1,
4011                    tfoot: 1,
4012                    table: 1
4013                };
4014                var b = this.startContainer,
4015                    c = this.endContainer,
4016                    d = b.getAscendant("table", !0),
4017                    f = c.getAscendant("table", !0);
4018                return CKEDITOR.env.safari && d && c.equals(this.root) ?
4019                    b.getAscendant(a, !0) : this.getEnclosedNode() ? this.getEnclosedNode().getAscendant(a, !0) : d && f && (d.equals(f) || d.contains(f) || f.contains(d)) ? b.getAscendant(a, !0) : null
4020            },
4021            scrollIntoView: function() {
4022                var a = new CKEDITOR.dom.element.createFromHtml("\x3cspan\x3e\x26nbsp;\x3c/span\x3e", this.document),
4023                    b, c, d, f = this.clone();
4024                f.optimize();
4025                (d = f.startContainer.type == CKEDITOR.NODE_TEXT) ? (c = f.startContainer.getText(), b = f.startContainer.split(f.startOffset), a.insertAfter(f.startContainer)) : f.insertNode(a);
4026                a.scrollIntoView();
4027                d && (f.startContainer.setText(c), b.remove());
4028                a.remove()
4029            },
4030            getClientRects: function() {
4031                function a(b, c) {
4032                    var d = CKEDITOR.tools.array.map(b, function(a) {
4033                            return a
4034                        }),
4035                        e = new CKEDITOR.dom.range(c.root),
4036                        f, h, l;
4037                    c.startContainer instanceof CKEDITOR.dom.element && (h = 0 === c.startOffset && c.startContainer.hasAttribute("data-widget"));
4038                    c.endContainer instanceof CKEDITOR.dom.element && (l = (l = c.endOffset === (c.endContainer.getChildCount ? c.endContainer.getChildCount() : c.endContainer.length)) && c.endContainer.hasAttribute("data-widget"));
4039                    h && e.setStart(c.startContainer.getParent(), c.startContainer.getIndex());
4040                    l && e.setEnd(c.endContainer.getParent(), c.endContainer.getIndex() + 1);
4041                    if (h || l) c = e;
4042                    e = c.cloneContents();
4043                    e = CKEDITOR.dom.document.prototype.find.call(e, "[data-cke-widget-id]").toArray();
4044                    if (e = CKEDITOR.tools.array.map(e, function(a) {
4045                            var b = c.root.editor;
4046                            a = a.getAttribute("data-cke-widget-id");
4047                            return b.widgets.instances[a].element
4048                        })) return e = CKEDITOR.tools.array.map(e, function(a) {
4049                        var b;
4050                        b = a.getParent().hasClass("cke_widget_wrapper") ? a.getParent() :
4051                            a;
4052                        f = this.root.getDocument().$.createRange();
4053                        f.setStart(b.getParent().$, b.getIndex());
4054                        f.setEnd(b.getParent().$, b.getIndex() + 1);
4055                        b = f.getClientRects();
4056                        b.widgetRect = a.getClientRect();
4057                        return b
4058                    }, c), CKEDITOR.tools.array.forEach(e, function(a) {
4059                        function b(e) {
4060                            CKEDITOR.tools.array.forEach(d, function(b, f) {
4061                                var l = CKEDITOR.tools.objectCompare(a[e], b);
4062                                l || (l = CKEDITOR.tools.objectCompare(a.widgetRect, b));
4063                                l && (Array.prototype.splice.call(d, f, a.length - e, a.widgetRect), c = !0)
4064                            });
4065                            c || (e < d.length - 1 ? b(e + 1) : d.push(a.widgetRect))
4066                        }
4067                        var c;
4068                        b(0)
4069                    }), d
4070                }
4071
4072                function b(a, c, e) {
4073                    var f;
4074                    c.collapsed ? e.startContainer instanceof CKEDITOR.dom.element ? (a = e.checkStartOfBlock(), f = new CKEDITOR.dom.text("​"), a ? e.startContainer.append(f, !0) : 0 === e.startOffset ? f.insertBefore(e.startContainer.getFirst()) : (e = e.startContainer.getChildren().getItem(e.startOffset - 1), f.insertAfter(e)), c.setStart(f.$, 0), c.setEnd(f.$, 0), a = c.getClientRects(), f.remove()) : e.startContainer instanceof CKEDITOR.dom.text && ("" === e.startContainer.getText() ? (e.startContainer.setText("​"),
4075                        a = c.getClientRects(), e.startContainer.setText("")) : a = [d(e.createBookmark())]) : a = [d(e.createBookmark())];
4076                    return a
4077                }
4078
4079                function c(a, b, d) {
4080                    a = CKEDITOR.tools.extend({}, a);
4081                    b && (a = CKEDITOR.tools.getAbsoluteRectPosition(d.document.getWindow(), a));
4082                    !a.width && (a.width = a.right - a.left);
4083                    !a.height && (a.height = a.bottom - a.top);
4084                    return a
4085                }
4086
4087                function d(a) {
4088                    var b = a.startNode;
4089                    a = a.endNode;
4090                    var c;
4091                    b.setText("​");
4092                    b.removeStyle("display");
4093                    a ? (a.setText("​"), a.removeStyle("display"), c = [b.getClientRect(), a.getClientRect()], a.remove()) : c = [b.getClientRect(), b.getClientRect()];
4094                    b.remove();
4095                    return {
4096                        right: Math.max(c[0].right, c[1].right),
4097                        bottom: Math.max(c[0].bottom, c[1].bottom),
4098                        left: Math.min(c[0].left, c[1].left),
4099                        top: Math.min(c[0].top, c[1].top),
4100                        width: Math.abs(c[0].left - c[1].left),
4101                        height: Math.max(c[0].bottom, c[1].bottom) - Math.min(c[0].top, c[1].top)
4102                    }
4103                }
4104                return void 0 !== this.document.getSelection ? function(d) {
4105                    var f = this.root.getDocument().$.createRange(),
4106                        m;
4107                    f.setStart(this.startContainer.$, this.startOffset);
4108                    f.setEnd(this.endContainer.$, this.endOffset);
4109                    m = f.getClientRects();
4110                    m = a(m, this);
4111                    m.length || (m = b(m, f, this));
4112                    return CKEDITOR.tools.array.map(m, function(a) {
4113                        return c(a, d, this)
4114                    }, this)
4115                } : function(a) {
4116                    return [c(d(this.createBookmark()), a, this)]
4117                }
4118            }(),
4119            _setStartContainer: function(a) {
4120                this.startContainer = a
4121            },
4122            _setEndContainer: function(a) {
4123                this.endContainer = a
4124            },
4125            _find: function(a, b) {
4126                var c = this.getCommonAncestor(),
4127                    d = this.getBoundaryNodes(),
4128                    f = [],
4129                    h, m, g, k;
4130                if (c && c.find)
4131                    for (m = c.find(a), h = 0; h < m.count(); h++)
4132                        if (c = m.getItem(h), b || !c.isReadOnly()) g = c.getPosition(d.startNode) & CKEDITOR.POSITION_FOLLOWING ||
4133                            d.startNode.equals(c), k = c.getPosition(d.endNode) & CKEDITOR.POSITION_PRECEDING + CKEDITOR.POSITION_IS_CONTAINED || d.endNode.equals(c), g && k && f.push(c);
4134                return f
4135            }
4136        };
4137        CKEDITOR.dom.range.mergeRanges = function(a) {
4138            return CKEDITOR.tools.array.reduce(a, function(a, b) {
4139                var c = a[a.length - 1],
4140                    d = !1;
4141                b = b.clone();
4142                b.enlarge(CKEDITOR.ENLARGE_ELEMENT);
4143                if (c) {
4144                    var e = new CKEDITOR.dom.range(b.root),
4145                        d = new CKEDITOR.dom.walker(e),
4146                        f = CKEDITOR.dom.walker.whitespaces();
4147                    e.setStart(c.endContainer, c.endOffset);
4148                    e.setEnd(b.startContainer, b.startOffset);
4149                    for (e = d.next(); f(e) || b.endContainer.equals(e);) e = d.next();
4150                    d = !e
4151                }
4152                d ? c.setEnd(b.endContainer, b.endOffset) : a.push(b);
4153                return a
4154            }, [])
4155        }
4156    })();
4157    CKEDITOR.POSITION_AFTER_START = 1;
4158    CKEDITOR.POSITION_BEFORE_END = 2;
4159    CKEDITOR.POSITION_BEFORE_START = 3;
4160    CKEDITOR.POSITION_AFTER_END = 4;
4161    CKEDITOR.ENLARGE_ELEMENT = 1;
4162    CKEDITOR.ENLARGE_BLOCK_CONTENTS = 2;
4163    CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS = 3;
4164    CKEDITOR.ENLARGE_INLINE = 4;
4165    CKEDITOR.START = 1;
4166    CKEDITOR.END = 2;
4167    CKEDITOR.SHRINK_ELEMENT = 1;
4168    CKEDITOR.SHRINK_TEXT = 2;
4169    "use strict";
4170    (function() {
4171        function a(a) {
4172            1 > arguments.length || (this.range = a, this.forceBrBreak = 0, this.enlargeBr = 1, this.enforceRealBlocks = 0, this._ || (this._ = {}))
4173        }
4174
4175        function d(a) {
4176            var b = [];
4177            a.forEach(function(a) {
4178                if ("true" == a.getAttribute("contenteditable")) return b.push(a), !1
4179            }, CKEDITOR.NODE_ELEMENT, !0);
4180            return b
4181        }
4182
4183        function b(a, c, f, h) {
4184            a: {
4185                null == h && (h = d(f));
4186                for (var g; g = h.shift();)
4187                    if (g.getDtd().p) {
4188                        h = {
4189                            element: g,
4190                            remaining: h
4191                        };
4192                        break a
4193                    } h = null
4194            }
4195            if (!h) return 0;
4196            if ((g = CKEDITOR.filter.instances[h.element.data("cke-filter")]) && !g.check(c)) return b(a,
4197                c, f, h.remaining);c = new CKEDITOR.dom.range(h.element);c.selectNodeContents(h.element);c = c.createIterator();c.enlargeBr = a.enlargeBr;c.enforceRealBlocks = a.enforceRealBlocks;c.activeFilter = c.filter = g;a._.nestedEditable = {
4198                element: h.element,
4199                container: f,
4200                remaining: h.remaining,
4201                iterator: c
4202            };
4203            return 1
4204        }
4205
4206        function c(a, b, c) {
4207            if (!b) return !1;
4208            a = a.clone();
4209            a.collapse(!c);
4210            return a.checkBoundaryOfElement(b, c ? CKEDITOR.START : CKEDITOR.END)
4211        }
4212        var f = /^[\r\n\t ]+$/,
4213            h = CKEDITOR.dom.walker.bookmark(!1, !0),
4214            k = CKEDITOR.dom.walker.whitespaces(!0),
4215            g = function(a) {
4216                return h(a) && k(a)
4217            },
4218            n = {
4219                dd: 1,
4220                dt: 1,
4221                li: 1
4222            };
4223        a.prototype = {
4224            getNextParagraph: function(a) {
4225                var d, k, v, B, D;
4226                a = a || "p";
4227                if (this._.nestedEditable) {
4228                    if (d = this._.nestedEditable.iterator.getNextParagraph(a)) return this.activeFilter = this._.nestedEditable.iterator.activeFilter, d;
4229                    this.activeFilter = this.filter;
4230                    if (b(this, a, this._.nestedEditable.container, this._.nestedEditable.remaining)) return this.activeFilter = this._.nestedEditable.iterator.activeFilter, this._.nestedEditable.iterator.getNextParagraph(a);
4231                    this._.nestedEditable =
4232                        null
4233                }
4234                if (!this.range.root.getDtd()[a]) return null;
4235                if (!this._.started) {
4236                    var x = this.range.clone();
4237                    k = x.startPath();
4238                    var m = x.endPath(),
4239                        J = !x.collapsed && c(x, k.block),
4240                        u = !x.collapsed && c(x, m.block, 1);
4241                    x.shrink(CKEDITOR.SHRINK_ELEMENT, !0);
4242                    J && x.setStartAt(k.block, CKEDITOR.POSITION_BEFORE_END);
4243                    u && x.setEndAt(m.block, CKEDITOR.POSITION_AFTER_START);
4244                    k = x.endContainer.hasAscendant("pre", !0) || x.startContainer.hasAscendant("pre", !0);
4245                    x.enlarge(this.forceBrBreak && !k || !this.enlargeBr ? CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS : CKEDITOR.ENLARGE_BLOCK_CONTENTS);
4246                    x.collapsed || (k = new CKEDITOR.dom.walker(x.clone()), m = CKEDITOR.dom.walker.bookmark(!0, !0), k.evaluator = m, this._.nextNode = k.next(), k = new CKEDITOR.dom.walker(x.clone()), k.evaluator = m, k = k.previous(), this._.lastNode = k.getNextSourceNode(!0, null, x.root), this._.lastNode && this._.lastNode.type == CKEDITOR.NODE_TEXT && !CKEDITOR.tools.trim(this._.lastNode.getText()) && this._.lastNode.getParent().isBlockBoundary() && (m = this.range.clone(), m.moveToPosition(this._.lastNode, CKEDITOR.POSITION_AFTER_END), m.checkEndOfBlock() &&
4247                        (m = new CKEDITOR.dom.elementPath(m.endContainer, m.root), this._.lastNode = (m.block || m.blockLimit).getNextSourceNode(!0))), this._.lastNode && x.root.contains(this._.lastNode) || (this._.lastNode = this._.docEndMarker = x.document.createText(""), this._.lastNode.insertAfter(k)), x = null);
4248                    this._.started = 1;
4249                    k = x
4250                }
4251                m = this._.nextNode;
4252                x = this._.lastNode;
4253                for (this._.nextNode = null; m;) {
4254                    var J = 0,
4255                        u = m.hasAscendant("pre"),
4256                        K = m.type != CKEDITOR.NODE_ELEMENT,
4257                        l = 0;
4258                    if (K) m.type == CKEDITOR.NODE_TEXT && f.test(m.getText()) && (K = 0);
4259                    else {
4260                        var t = m.getName();
4261                        if (CKEDITOR.dtd.$block[t] && "false" == m.getAttribute("contenteditable")) {
4262                            d = m;
4263                            b(this, a, d);
4264                            break
4265                        } else if (m.isBlockBoundary(this.forceBrBreak && !u && {
4266                                br: 1
4267                            })) {
4268                            if ("br" == t) K = 1;
4269                            else if (!k && !m.getChildCount() && "hr" != t) {
4270                                d = m;
4271                                v = m.equals(x);
4272                                break
4273                            }
4274                            k && (k.setEndAt(m, CKEDITOR.POSITION_BEFORE_START), "br" != t && (this._.nextNode = m));
4275                            J = 1
4276                        } else {
4277                            if (m.getFirst()) {
4278                                k || (k = this.range.clone(), k.setStartAt(m, CKEDITOR.POSITION_BEFORE_START));
4279                                m = m.getFirst();
4280                                continue
4281                            }
4282                            K = 1
4283                        }
4284                    }
4285                    K && !k && (k = this.range.clone(), k.setStartAt(m, CKEDITOR.POSITION_BEFORE_START));
4286                    v = (!J || K) && m.equals(x);
4287                    if (k && !J)
4288                        for (; !m.getNext(g) && !v;) {
4289                            t = m.getParent();
4290                            if (t.isBlockBoundary(this.forceBrBreak && !u && {
4291                                    br: 1
4292                                })) {
4293                                J = 1;
4294                                K = 0;
4295                                v || t.equals(x);
4296                                k.setEndAt(t, CKEDITOR.POSITION_BEFORE_END);
4297                                break
4298                            }
4299                            m = t;
4300                            K = 1;
4301                            v = m.equals(x);
4302                            l = 1
4303                        }
4304                    K && k.setEndAt(m, CKEDITOR.POSITION_AFTER_END);
4305                    m = this._getNextSourceNode(m, l, x);
4306                    if ((v = !m) || J && k) break
4307                }
4308                if (!d) {
4309                    if (!k) return this._.docEndMarker && this._.docEndMarker.remove(), this._.nextNode = null;
4310                    d = new CKEDITOR.dom.elementPath(k.startContainer, k.root);
4311                    m = d.blockLimit;
4312                    J = {
4313                        div: 1,
4314                        th: 1,
4315                        td: 1
4316                    };
4317                    d = d.block;
4318                    !d && m && !this.enforceRealBlocks && J[m.getName()] && k.checkStartOfBlock() && k.checkEndOfBlock() && !m.equals(k.root) ? d = m : !d || this.enforceRealBlocks && d.is(n) ? (d = this.range.document.createElement(a), k.extractContents().appendTo(d), d.trim(), k.insertNode(d), B = D = !0) : "li" != d.getName() ? k.checkStartOfBlock() && k.checkEndOfBlock() || (d = d.clone(!1), k.extractContents().appendTo(d), d.trim(), D = k.splitBlock(), B = !D.wasStartOfBlock, D = !D.wasEndOfBlock, k.insertNode(d)) : v || (this._.nextNode = d.equals(x) ? null : this._getNextSourceNode(k.getBoundaryNodes().endNode,
4319                        1, x))
4320                }
4321                B && (B = d.getPrevious()) && B.type == CKEDITOR.NODE_ELEMENT && ("br" == B.getName() ? B.remove() : B.getLast() && "br" == B.getLast().$.nodeName.toLowerCase() && B.getLast().remove());
4322                D && (B = d.getLast()) && B.type == CKEDITOR.NODE_ELEMENT && "br" == B.getName() && (!CKEDITOR.env.needsBrFiller || B.getPrevious(h) || B.getNext(h)) && B.remove();
4323                this._.nextNode || (this._.nextNode = v || d.equals(x) || !x ? null : this._getNextSourceNode(d, 1, x));
4324                return d
4325            },
4326            _getNextSourceNode: function(a, b, c) {
4327                function d(a) {
4328                    return !(a.equals(c) || a.equals(f))
4329                }
4330                var f =
4331                    this.range.root;
4332                for (a = a.getNextSourceNode(b, null, d); !h(a);) a = a.getNextSourceNode(b, null, d);
4333                return a
4334            }
4335        };
4336        CKEDITOR.dom.range.prototype.createIterator = function() {
4337            return new a(this)
4338        }
4339    })();
4340    CKEDITOR.command = function(a, d) {
4341        this.uiItems = [];
4342        this.exec = function(b) {
4343            if (this.state == CKEDITOR.TRISTATE_DISABLED || !this.checkAllowed()) return !1;
4344            this.editorFocus && a.focus();
4345            return !1 === this.fire("exec") ? !0 : !1 !== d.exec.call(this, a, b)
4346        };
4347        this.refresh = function(a, b) {
4348            if (!this.readOnly && a.readOnly) return !0;
4349            if (this.context && !b.isContextFor(this.context) || !this.checkAllowed(!0)) return this.disable(), !0;
4350            this.startDisabled || this.enable();
4351            this.modes && !this.modes[a.mode] && this.disable();
4352            return !1 === this.fire("refresh", {
4353                editor: a,
4354                path: b
4355            }) ? !0 : d.refresh && !1 !== d.refresh.apply(this, arguments)
4356        };
4357        var b;
4358        this.checkAllowed = function(c) {
4359            return c || "boolean" != typeof b ? b = a.activeFilter.checkFeature(this) : b
4360        };
4361        CKEDITOR.tools.extend(this, d, {
4362            modes: {
4363                wysiwyg: 1
4364            },
4365            editorFocus: 1,
4366            contextSensitive: !!d.context,
4367            state: CKEDITOR.TRISTATE_DISABLED
4368        });
4369        CKEDITOR.event.call(this)
4370    };
4371    CKEDITOR.command.prototype = {
4372        enable: function() {
4373            this.state == CKEDITOR.TRISTATE_DISABLED && this.checkAllowed() && this.setState(this.preserveState && "undefined" != typeof this.previousState ? this.previousState : CKEDITOR.TRISTATE_OFF)
4374        },
4375        disable: function() {
4376            this.setState(CKEDITOR.TRISTATE_DISABLED)
4377        },
4378        setState: function(a) {
4379            if (this.state == a || a != CKEDITOR.TRISTATE_DISABLED && !this.checkAllowed()) return !1;
4380            this.previousState = this.state;
4381            this.state = a;
4382            this.fire("state");
4383            return !0
4384        },
4385        toggleState: function() {
4386            this.state == CKEDITOR.TRISTATE_OFF ?
4387                this.setState(CKEDITOR.TRISTATE_ON) : this.state == CKEDITOR.TRISTATE_ON && this.setState(CKEDITOR.TRISTATE_OFF)
4388        }
4389    };
4390    CKEDITOR.event.implementOn(CKEDITOR.command.prototype);
4391    CKEDITOR.ENTER_P = 1;
4392    CKEDITOR.ENTER_BR = 2;
4393    CKEDITOR.ENTER_DIV = 3;
4394    CKEDITOR.config = {
4395        customConfig: "config.js",
4396        autoUpdateElement: !0,
4397        language: "",
4398        defaultLanguage: "en",
4399        contentsLangDirection: "",
4400        enterMode: CKEDITOR.ENTER_P,
4401        forceEnterMode: !1,
4402        shiftEnterMode: CKEDITOR.ENTER_BR,
4403        docType: "\x3c!DOCTYPE html\x3e",
4404        bodyId: "",
4405        bodyClass: "",
4406        fullPage: !1,
4407        height: 200,
4408        contentsCss: CKEDITOR.getUrl("contents.css"),
4409        extraPlugins: "",
4410        removePlugins: "",
4411        protectedSource: [],
4412        tabIndex: 0,
4413        width: "",
4414        baseFloatZIndex: 1E4,
4415        blockedKeystrokes: [CKEDITOR.CTRL + 66, CKEDITOR.CTRL + 73, CKEDITOR.CTRL + 85]
4416    };
4417    (function() {
4418        function a(a, b, c, d, f) {
4419            var e, w;
4420            a = [];
4421            for (e in b) {
4422                w = b[e];
4423                w = "boolean" == typeof w ? {} : "function" == typeof w ? {
4424                    match: w
4425                } : E(w);
4426                "$" != e.charAt(0) && (w.elements = e);
4427                c && (w.featureName = c.toLowerCase());
4428                var l = w;
4429                l.elements = k(l.elements, /\s+/) || null;
4430                l.propertiesOnly = l.propertiesOnly || !0 === l.elements;
4431                var p = /\s*,\s*/,
4432                    m = void 0;
4433                for (m in P) {
4434                    l[m] = k(l[m], p) || null;
4435                    var h = l,
4436                        t = O[m],
4437                        q = k(l[O[m]], p),
4438                        A = l[m],
4439                        z = [],
4440                        g = !0,
4441                        H = void 0;
4442                    q ? g = !1 : q = {};
4443                    for (H in A) "!" == H.charAt(0) && (H = H.slice(1), z.push(H), q[H] = !0, g = !1);
4444                    for (; H = z.pop();) A[H] =
4445                        A["!" + H], delete A["!" + H];
4446                    h[t] = (g ? !1 : q) || null
4447                }
4448                l.match = l.match || null;
4449                d.push(w);
4450                a.push(w)
4451            }
4452            b = f.elements;
4453            f = f.generic;
4454            var F;
4455            c = 0;
4456            for (d = a.length; c < d; ++c) {
4457                e = E(a[c]);
4458                w = !0 === e.classes || !0 === e.styles || !0 === e.attributes;
4459                l = e;
4460                m = t = p = void 0;
4461                for (p in P) l[p] = J(l[p]);
4462                h = !0;
4463                for (m in O) {
4464                    p = O[m];
4465                    t = l[p];
4466                    q = [];
4467                    A = void 0;
4468                    for (A in t) - 1 < A.indexOf("*") ? q.push(new RegExp("^" + A.replace(/\*/g, ".*") + "$")) : q.push(A);
4469                    t = q;
4470                    t.length && (l[p] = t, h = !1)
4471                }
4472                l.nothingRequired = h;
4473                l.noProperties = !(l.attributes || l.classes || l.styles);
4474                if (!0 === e.elements ||
4475                    null === e.elements) f[w ? "unshift" : "push"](e);
4476                else
4477                    for (F in l = e.elements, delete e.elements, l)
4478                        if (b[F]) b[F][w ? "unshift" : "push"](e);
4479                        else b[F] = [e]
4480            }
4481        }
4482
4483        function d(a, c, d, f) {
4484            if (!a.match || a.match(c))
4485                if (f || g(a, c))
4486                    if (a.propertiesOnly || (d.valid = !0), d.allAttributes || (d.allAttributes = b(a.attributes, c.attributes, d.validAttributes)), d.allStyles || (d.allStyles = b(a.styles, c.styles, d.validStyles)), !d.allClasses) {
4487                        a = a.classes;
4488                        c = c.classes;
4489                        f = d.validClasses;
4490                        if (a)
4491                            if (!0 === a) a = !0;
4492                            else {
4493                                for (var e = 0, w = c.length, l; e < w; ++e) l = c[e], f[l] ||
4494                                    (f[l] = a(l));
4495                                a = !1
4496                            }
4497                        else a = !1;
4498                        d.allClasses = a
4499                    }
4500        }
4501
4502        function b(a, b, c) {
4503            if (!a) return !1;
4504            if (!0 === a) return !0;
4505            for (var d in b) c[d] || (c[d] = a(d));
4506            return !1
4507        }
4508
4509        function c(a, b, c) {
4510            if (!a.match || a.match(b)) {
4511                if (a.noProperties) return !1;
4512                c.hadInvalidAttribute = f(a.attributes, b.attributes) || c.hadInvalidAttribute;
4513                c.hadInvalidStyle = f(a.styles, b.styles) || c.hadInvalidStyle;
4514                a = a.classes;
4515                b = b.classes;
4516                if (a) {
4517                    for (var d = !1, e = !0 === a, l = b.length; l--;)
4518                        if (e || a(b[l])) b.splice(l, 1), d = !0;
4519                    a = d
4520                } else a = !1;
4521                c.hadInvalidClass = a || c.hadInvalidClass
4522            }
4523        }
4524
4525        function f(a,
4526            b) {
4527            if (!a) return !1;
4528            var c = !1,
4529                d = !0 === a,
4530                f;
4531            for (f in b)
4532                if (d || a(f)) delete b[f], c = !0;
4533            return c
4534        }
4535
4536        function h(a, b, c) {
4537            if (a.disabled || a.customConfig && !c || !b) return !1;
4538            a._.cachedChecks = {};
4539            return !0
4540        }
4541
4542        function k(a, b) {
4543            if (!a) return !1;
4544            if (!0 === a) return a;
4545            if ("string" == typeof a) return a = z(a), "*" == a ? !0 : CKEDITOR.tools.convertArrayToObject(a.split(b));
4546            if (CKEDITOR.tools.isArray(a)) return a.length ? CKEDITOR.tools.convertArrayToObject(a) : !1;
4547            var c = {},
4548                d = 0,
4549                f;
4550            for (f in a) c[f] = a[f], d++;
4551            return d ? c : !1
4552        }
4553
4554        function g(a, b) {
4555            if (a.nothingRequired) return !0;
4556            var c, d, f, e;
4557            if (f = a.requiredClasses)
4558                for (e = b.classes, c = 0; c < f.length; ++c)
4559                    if (d = f[c], "string" == typeof d) {
4560                        if (-1 == CKEDITOR.tools.indexOf(e, d)) return !1
4561                    } else if (!CKEDITOR.tools.checkIfAnyArrayItemMatches(e, d)) return !1;
4562            return n(b.styles, a.requiredStyles) && n(b.attributes, a.requiredAttributes)
4563        }
4564
4565        function n(a, b) {
4566            if (!b) return !0;
4567            for (var c = 0, d; c < b.length; ++c)
4568                if (d = b[c], "string" == typeof d) {
4569                    if (!(d in a)) return !1
4570                } else if (!CKEDITOR.tools.checkIfAnyObjectPropertyMatches(a, d)) return !1;
4571            return !0
4572        }
4573
4574        function r(a) {
4575            if (!a) return {};
4576            a = a.split(/\s*,\s*/).sort();
4577            for (var b = {}; a.length;) b[a.shift()] = "cke-test";
4578            return b
4579        }
4580
4581        function e(a) {
4582            var b, c, d, f, e = {},
4583                l = 1;
4584            for (a = z(a); b = a.match(p);)(c = b[2]) ? (d = y(c, "styles"), f = y(c, "attrs"), c = y(c, "classes")) : d = f = c = null, e["$" + l++] = {
4585                elements: b[1],
4586                classes: c,
4587                styles: d,
4588                attributes: f
4589            }, a = a.slice(b[0].length);
4590            return e
4591        }
4592
4593        function y(a, b) {
4594            var c = a.match(N[b]);
4595            return c ? z(c[1]) : null
4596        }
4597
4598        function v(a) {
4599            var b = a.styleBackup = a.attributes.style,
4600                c = a.classBackup = a.attributes["class"];
4601            a.styles || (a.styles = CKEDITOR.tools.parseCssText(b ||
4602                "", 1));
4603            a.classes || (a.classes = c ? c.split(/\s+/) : [])
4604        }
4605
4606        function B(a, b, f, e) {
4607            var l = 0,
4608                p;
4609            e.toHtml && (b.name = b.name.replace(w, "$1"));
4610            if (e.doCallbacks && a.elementCallbacks) {
4611                a: {
4612                    p = a.elementCallbacks;
4613                    for (var h = 0, q = p.length, E; h < q; ++h)
4614                        if (E = p[h](b)) {
4615                            p = E;
4616                            break a
4617                        } p = void 0
4618                }
4619                if (p) return p
4620            }
4621            if (e.doTransform && (p = a._.transformations[b.name])) {
4622                v(b);
4623                for (h = 0; h < p.length; ++h) t(a, b, p[h]);
4624                x(b)
4625            }
4626            if (e.doFilter) {
4627                a: {
4628                    h = b.name;q = a._;a = q.allowedRules.elements[h];p = q.allowedRules.generic;h = q.disallowedRules.elements[h];q = q.disallowedRules.generic;
4629                    E = e.skipRequired;
4630                    var z = {
4631                            valid: !1,
4632                            validAttributes: {},
4633                            validClasses: {},
4634                            validStyles: {},
4635                            allAttributes: !1,
4636                            allClasses: !1,
4637                            allStyles: !1,
4638                            hadInvalidAttribute: !1,
4639                            hadInvalidClass: !1,
4640                            hadInvalidStyle: !1
4641                        },
4642                        g, k;
4643                    if (a || p) {
4644                        v(b);
4645                        if (h)
4646                            for (g = 0, k = h.length; g < k; ++g)
4647                                if (!1 === c(h[g], b, z)) {
4648                                    a = null;
4649                                    break a
4650                                } if (q)
4651                            for (g = 0, k = q.length; g < k; ++g) c(q[g], b, z);
4652                        if (a)
4653                            for (g = 0, k = a.length; g < k; ++g) d(a[g], b, z, E);
4654                        if (p)
4655                            for (g = 0, k = p.length; g < k; ++g) d(p[g], b, z, E);
4656                        a = z
4657                    } else a = null
4658                }
4659                if (!a || !a.valid) return f.push(b),
4660                1;k = a.validAttributes;
4661                var H = a.validStyles;
4662                p = a.validClasses;
4663                var h = b.attributes,
4664                    F = b.styles,
4665                    q = b.classes;E = b.classBackup;
4666                var L = b.styleBackup,
4667                    G, N, C = [],
4668                    z = [],
4669                    O = /^data-cke-/;g = !1;delete h.style;delete h["class"];delete b.classBackup;delete b.styleBackup;
4670                if (!a.allAttributes)
4671                    for (G in h) k[G] || (O.test(G) ? G == (N = G.replace(/^data-cke-saved-/, "")) || k[N] || (delete h[G], g = !0) : (delete h[G], g = !0));
4672                if (!a.allStyles || a.hadInvalidStyle) {
4673                    for (G in F) a.allStyles || H[G] ? C.push(G + ":" + F[G]) : g = !0;
4674                    C.length && (h.style = C.sort().join("; "))
4675                } else L && (h.style = L);
4676                if (!a.allClasses ||
4677                    a.hadInvalidClass) {
4678                    for (G = 0; G < q.length; ++G)(a.allClasses || p[q[G]]) && z.push(q[G]);
4679                    z.length && (h["class"] = z.sort().join(" "));
4680                    E && z.length < E.split(/\s+/).length && (g = !0)
4681                } else E && (h["class"] = E);g && (l = 1);
4682                if (!e.skipFinalValidation && !m(b)) return f.push(b),
4683                1
4684            }
4685            e.toHtml && (b.name = b.name.replace(A, "cke:$1"));
4686            return l
4687        }
4688
4689        function D(a) {
4690            var b = [],
4691                c;
4692            for (c in a) - 1 < c.indexOf("*") && b.push(c.replace(/\*/g, ".*"));
4693            return b.length ? new RegExp("^(?:" + b.join("|") + ")$") : null
4694        }
4695
4696        function x(a) {
4697            var b = a.attributes,
4698                c;
4699            delete b.style;
4700            delete b["class"];
4701            if (c = CKEDITOR.tools.writeCssText(a.styles, !0)) b.style = c;
4702            a.classes.length && (b["class"] = a.classes.sort().join(" "))
4703        }
4704
4705        function m(a) {
4706            switch (a.name) {
4707                case "a":
4708                    if (!(a.children.length || a.attributes.name || a.attributes.id)) return !1;
4709                    break;
4710                case "img":
4711                    if (!a.attributes.src) return !1
4712            }
4713            return !0
4714        }
4715
4716        function J(a) {
4717            if (!a) return !1;
4718            if (!0 === a) return !0;
4719            var b = D(a);
4720            return function(c) {
4721                return c in a || b && c.match(b)
4722            }
4723        }
4724
4725        function u() {
4726            return new CKEDITOR.htmlParser.element("br")
4727        }
4728
4729        function K(a) {
4730            return a.type == CKEDITOR.NODE_ELEMENT && ("br" ==
4731                a.name || q.$block[a.name])
4732        }
4733
4734        function l(a, b, c) {
4735            var d = a.name;
4736            if (q.$empty[d] || !a.children.length) "hr" == d && "br" == b ? a.replaceWith(u()) : (a.parent && c.push({
4737                check: "it",
4738                el: a.parent
4739            }), a.remove());
4740            else if (q.$block[d] || "tr" == d)
4741                if ("br" == b) a.previous && !K(a.previous) && (b = u(), b.insertBefore(a)), a.next && !K(a.next) && (b = u(), b.insertAfter(a)), a.replaceWithChildren();
4742                else {
4743                    var d = a.children,
4744                        f;
4745                    b: {
4746                        f = q[b];
4747                        for (var e = 0, l = d.length, w; e < l; ++e)
4748                            if (w = d[e], w.type == CKEDITOR.NODE_ELEMENT && !f[w.name]) {
4749                                f = !1;
4750                                break b
4751                            } f = !0
4752                    }
4753                    if (f) a.name = b, a.attributes = {}, c.push({
4754                        check: "parent-down",
4755                        el: a
4756                    });
4757                    else {
4758                        f = a.parent;
4759                        for (var e = f.type == CKEDITOR.NODE_DOCUMENT_FRAGMENT || "body" == f.name, p, h, l = d.length; 0 < l;) w = d[--l], e && (w.type == CKEDITOR.NODE_TEXT || w.type == CKEDITOR.NODE_ELEMENT && q.$inline[w.name]) ? (p || (p = new CKEDITOR.htmlParser.element(b), p.insertAfter(a), c.push({
4760                            check: "parent-down",
4761                            el: p
4762                        })), p.add(w, 0)) : (p = null, h = q[f.name] || q.span, w.insertAfter(a), f.type == CKEDITOR.NODE_DOCUMENT_FRAGMENT || w.type != CKEDITOR.NODE_ELEMENT || h[w.name] || c.push({
4763                            check: "el-up",
4764                            el: w
4765                        }));
4766                        a.remove()
4767                    }
4768                }
4769            else d in {
4770                style: 1,
4771                script: 1
4772            } ? a.remove() : (a.parent && c.push({
4773                check: "it",
4774                el: a.parent
4775            }), a.replaceWithChildren())
4776        }
4777
4778        function t(a, b, c) {
4779            var d, f;
4780            for (d = 0; d < c.length; ++d)
4781                if (f = c[d], !(f.check && !a.check(f.check, !1) || f.left && !f.left(b))) {
4782                    f.right(b, G);
4783                    break
4784                }
4785        }
4786
4787        function F(a, b) {
4788            var c = b.getDefinition(),
4789                d = c.attributes,
4790                f = c.styles,
4791                e, l, w, p;
4792            if (a.name != c.element) return !1;
4793            for (e in d)
4794                if ("class" == e)
4795                    for (c = d[e].split(/\s+/), w = a.classes.join("|"); p = c.pop();) {
4796                        if (-1 == w.indexOf(p)) return !1
4797                    } else if (a.attributes[e] != d[e]) return !1;
4798            for (l in f)
4799                if (a.styles[l] !=
4800                    f[l]) return !1;
4801            return !0
4802        }
4803
4804        function L(a, b) {
4805            var c, d;
4806            "string" == typeof a ? c = a : a instanceof CKEDITOR.style ? d = a : (c = a[0], d = a[1]);
4807            return [{
4808                element: c,
4809                left: d,
4810                right: function(a, c) {
4811                    c.transform(a, b)
4812                }
4813            }]
4814        }
4815
4816        function C(a) {
4817            return function(b) {
4818                return F(b, a)
4819            }
4820        }
4821
4822        function M(a) {
4823            return function(b, c) {
4824                c[a](b)
4825            }
4826        }
4827        var q = CKEDITOR.dtd,
4828            E = CKEDITOR.tools.copy,
4829            z = CKEDITOR.tools.trim,
4830            H = ["", "p", "br", "div"];
4831        CKEDITOR.FILTER_SKIP_TREE = 2;
4832        CKEDITOR.filter = function(a) {
4833            this.allowedContent = [];
4834            this.disallowedContent = [];
4835            this.elementCallbacks = null;
4836            this.disabled = !1;
4837            this.editor = null;
4838            this.id = CKEDITOR.tools.getNextNumber();
4839            this._ = {
4840                allowedRules: {
4841                    elements: {},
4842                    generic: []
4843                },
4844                disallowedRules: {
4845                    elements: {},
4846                    generic: []
4847                },
4848                transformations: {},
4849                cachedTests: {},
4850                cachedChecks: {}
4851            };
4852            CKEDITOR.filter.instances[this.id] = this;
4853            if (a instanceof CKEDITOR.editor) {
4854                a = this.editor = a;
4855                this.customConfig = !0;
4856                var b = a.config.allowedContent;
4857                !0 === b ? this.disabled = !0 : (b || (this.customConfig = !1), this.allow(b, "config", 1), this.allow(a.config.extraAllowedContent, "extra", 1), this.allow(H[a.enterMode] + " " + H[a.shiftEnterMode],
4858                    "default", 1), this.disallow(a.config.disallowedContent))
4859            } else this.customConfig = !1, this.allow(a, "default", 1)
4860        };
4861        CKEDITOR.filter.instances = {};
4862        CKEDITOR.filter.prototype = {
4863            allow: function(b, c, d) {
4864                if (!h(this, b, d)) return !1;
4865                var f, l;
4866                if ("string" == typeof b) b = e(b);
4867                else if (b instanceof CKEDITOR.style) {
4868                    if (b.toAllowedContentRules) return this.allow(b.toAllowedContentRules(this.editor), c, d);
4869                    f = b.getDefinition();
4870                    b = {};
4871                    d = f.attributes;
4872                    b[f.element] = f = {
4873                        styles: f.styles,
4874                        requiredStyles: f.styles && CKEDITOR.tools.objectKeys(f.styles)
4875                    };
4876                    d && (d = E(d), f.classes = d["class"] ? d["class"].split(/\s+/) : null, f.requiredClasses = f.classes, delete d["class"], f.attributes = d, f.requiredAttributes = d && CKEDITOR.tools.objectKeys(d))
4877                } else if (CKEDITOR.tools.isArray(b)) {
4878                    for (f = 0; f < b.length; ++f) l = this.allow(b[f], c, d);
4879                    return l
4880                }
4881                a(this, b, c, this.allowedContent, this._.allowedRules);
4882                return !0
4883            },
4884            applyTo: function(a, b, c, d) {
4885                if (this.disabled) return !1;
4886                var f = this,
4887                    e = [],
4888                    w = this.editor && this.editor.config.protectedSource,
4889                    p, h = !1,
4890                    t = {
4891                        doFilter: !c,
4892                        doTransform: !0,
4893                        doCallbacks: !0,
4894                        toHtml: b
4895                    };
4896                a.forEach(function(a) {
4897                    if (a.type == CKEDITOR.NODE_ELEMENT) {
4898                        if ("off" == a.attributes["data-cke-filter"]) return !1;
4899                        if (!b || "span" != a.name || !~CKEDITOR.tools.objectKeys(a.attributes).join("|").indexOf("data-cke-"))
4900                            if (p = B(f, a, e, t), p & 1) h = !0;
4901                            else if (p & 2) return !1
4902                    } else if (a.type == CKEDITOR.NODE_COMMENT && a.value.match(/^\{cke_protected\}(?!\{C\})/)) {
4903                        var c;
4904                        a: {
4905                            var d = decodeURIComponent(a.value.replace(/^\{cke_protected\}/, ""));c = [];
4906                            var l, m, q;
4907                            if (w)
4908                                for (m = 0; m < w.length; ++m)
4909                                    if ((q = d.match(w[m])) && q[0].length == d.length) {
4910                                        c = !0;
4911                                        break a
4912                                    } d = CKEDITOR.htmlParser.fragment.fromHtml(d);1 == d.children.length && (l = d.children[0]).type == CKEDITOR.NODE_ELEMENT && B(f, l, c, t);c = !c.length
4913                        }
4914                        c || e.push(a)
4915                    }
4916                }, null, !0);
4917                e.length && (h = !0);
4918                var E;
4919                a = [];
4920                d = H[d || (this.editor ? this.editor.enterMode : CKEDITOR.ENTER_P)];
4921                for (var z; c = e.pop();) c.type == CKEDITOR.NODE_ELEMENT ? l(c, d, a) : c.remove();
4922                for (; E = a.pop();)
4923                    if (c = E.el, c.parent) switch (z = q[c.parent.name] || q.span, E.check) {
4924                        case "it":
4925                            q.$removeEmpty[c.name] && !c.children.length ? l(c, d, a) : m(c) || l(c, d, a);
4926                            break;
4927                        case "el-up":
4928                            c.parent.type ==
4929                                CKEDITOR.NODE_DOCUMENT_FRAGMENT || z[c.name] || l(c, d, a);
4930                            break;
4931                        case "parent-down":
4932                            c.parent.type == CKEDITOR.NODE_DOCUMENT_FRAGMENT || z[c.name] || l(c.parent, d, a)
4933                    }
4934                return h
4935            },
4936            checkFeature: function(a) {
4937                if (this.disabled || !a) return !0;
4938                a.toFeature && (a = a.toFeature(this.editor));
4939                return !a.requiredContent || this.check(a.requiredContent)
4940            },
4941            disable: function() {
4942                this.disabled = !0
4943            },
4944            disallow: function(b) {
4945                if (!h(this, b, !0)) return !1;
4946                "string" == typeof b && (b = e(b));
4947                a(this, b, null, this.disallowedContent, this._.disallowedRules);
4948                return !0
4949            },
4950            addContentForms: function(a) {
4951                if (!this.disabled && a) {
4952                    var b, c, d = [],
4953                        f;
4954                    for (b = 0; b < a.length && !f; ++b) c = a[b], ("string" == typeof c || c instanceof CKEDITOR.style) && this.check(c) && (f = c);
4955                    if (f) {
4956                        for (b = 0; b < a.length; ++b) d.push(L(a[b], f));
4957                        this.addTransformations(d)
4958                    }
4959                }
4960            },
4961            addElementCallback: function(a) {
4962                this.elementCallbacks || (this.elementCallbacks = []);
4963                this.elementCallbacks.push(a)
4964            },
4965            addFeature: function(a) {
4966                if (this.disabled || !a) return !0;
4967                a.toFeature && (a = a.toFeature(this.editor));
4968                this.allow(a.allowedContent, a.name);
4969                this.addTransformations(a.contentTransformations);
4970                this.addContentForms(a.contentForms);
4971                return a.requiredContent && (this.customConfig || this.disallowedContent.length) ? this.check(a.requiredContent) : !0
4972            },
4973            addTransformations: function(a) {
4974                var b, c;
4975                if (!this.disabled && a) {
4976                    var d = this._.transformations,
4977                        f;
4978                    for (f = 0; f < a.length; ++f) {
4979                        b = a[f];
4980                        var e = void 0,
4981                            l = void 0,
4982                            w = void 0,
4983                            p = void 0,
4984                            h = void 0,
4985                            m = void 0;
4986                        c = [];
4987                        for (l = 0; l < b.length; ++l) w = b[l], "string" == typeof w ? (w = w.split(/\s*:\s*/), p = w[0], h = null, m = w[1]) : (p = w.check, h = w.left, m = w.right), e || (e = w, e = e.element ? e.element : p ? p.match(/^([a-z0-9]+)/i)[0] :
4988                            e.left.getDefinition().element), h instanceof CKEDITOR.style && (h = C(h)), c.push({
4989                            check: p == e ? null : p,
4990                            left: h,
4991                            right: "string" == typeof m ? M(m) : m
4992                        });
4993                        b = e;
4994                        d[b] || (d[b] = []);
4995                        d[b].push(c)
4996                    }
4997                }
4998            },
4999            check: function(a, b, c) {
5000                if (this.disabled) return !0;
5001                if (CKEDITOR.tools.isArray(a)) {
5002                    for (var d = a.length; d--;)
5003                        if (this.check(a[d], b, c)) return !0;
5004                    return !1
5005                }
5006                var f, w;
5007                if ("string" == typeof a) {
5008                    w = a + "\x3c" + (!1 === b ? "0" : "1") + (c ? "1" : "0") + "\x3e";
5009                    if (w in this._.cachedChecks) return this._.cachedChecks[w];
5010                    f = e(a).$1;
5011                    var l = f.styles,
5012                        d = f.classes;
5013                    f.name = f.elements;
5014                    f.classes = d = d ? d.split(/\s*,\s*/) : [];
5015                    f.styles = r(l);
5016                    f.attributes = r(f.attributes);
5017                    f.children = [];
5018                    d.length && (f.attributes["class"] = d.join(" "));
5019                    l && (f.attributes.style = CKEDITOR.tools.writeCssText(f.styles))
5020                } else f = a.getDefinition(), l = f.styles, d = f.attributes || {}, l && !CKEDITOR.tools.isEmpty(l) ? (l = E(l), d.style = CKEDITOR.tools.writeCssText(l, !0)) : l = {}, f = {
5021                    name: f.element,
5022                    attributes: d,
5023                    classes: d["class"] ? d["class"].split(/\s+/) : [],
5024                    styles: l,
5025                    children: []
5026                };
5027                var l = CKEDITOR.tools.clone(f),
5028                    p = [],
5029                    h;
5030                if (!1 !== b && (h = this._.transformations[f.name])) {
5031                    for (d =
5032                        0; d < h.length; ++d) t(this, f, h[d]);
5033                    x(f)
5034                }
5035                B(this, l, p, {
5036                    doFilter: !0,
5037                    doTransform: !1 !== b,
5038                    skipRequired: !c,
5039                    skipFinalValidation: !c
5040                });
5041                0 < p.length ? c = !1 : ((b = f.attributes["class"]) && (f.attributes["class"] = f.attributes["class"].split(" ").sort().join(" ")), c = CKEDITOR.tools.objectCompare(f.attributes, l.attributes, !0), b && (f.attributes["class"] = b));
5042                "string" == typeof a && (this._.cachedChecks[w] = c);
5043                return c
5044            },
5045            getAllowedEnterMode: function() {
5046                var a = ["p", "div", "br"],
5047                    b = {
5048                        p: CKEDITOR.ENTER_P,
5049                        div: CKEDITOR.ENTER_DIV,
5050                        br: CKEDITOR.ENTER_BR
5051                    };
5052                return function(c, d) {
5053                    var f = a.slice(),
5054                        e;
5055                    if (this.check(H[c])) return c;
5056                    for (d || (f = f.reverse()); e = f.pop();)
5057                        if (this.check(e)) return b[e];
5058                    return CKEDITOR.ENTER_BR
5059                }
5060            }(),
5061            clone: function() {
5062                var a = new CKEDITOR.filter,
5063                    b = CKEDITOR.tools.clone;
5064                a.allowedContent = b(this.allowedContent);
5065                a._.allowedRules = b(this._.allowedRules);
5066                a.disallowedContent = b(this.disallowedContent);
5067                a._.disallowedRules = b(this._.disallowedRules);
5068                a._.transformations = b(this._.transformations);
5069                a.disabled = this.disabled;
5070                a.editor = this.editor;
5071                return a
5072            },
5073            destroy: function() {
5074                delete CKEDITOR.filter.instances[this.id];
5075                delete this._;
5076                delete this.allowedContent;
5077                delete this.disallowedContent
5078            }
5079        };
5080        var P = {
5081                styles: 1,
5082                attributes: 1,
5083                classes: 1
5084            },
5085            O = {
5086                styles: "requiredStyles",
5087                attributes: "requiredAttributes",
5088                classes: "requiredClasses"
5089            },
5090            p = /^([a-z0-9\-*\s]+)((?:\s*\{[!\w\-,\s\*]+\}\s*|\s*\[[!\w\-,\s\*]+\]\s*|\s*\([!\w\-,\s\*]+\)\s*){0,3})(?:;\s*|$)/i,
5091            N = {
5092                styles: /{([^}]+)}/,
5093                attrs: /\[([^\]]+)\]/,
5094                classes: /\(([^\)]+)\)/
5095            },
5096            w = /^cke:(object|embed|param)$/,
5097            A = /^(object|embed|param)$/,
5098            G;
5099        G = CKEDITOR.filter.transformationsTools = {
5100            sizeToStyle: function(a) {
5101                this.lengthToStyle(a,
5102                    "width");
5103                this.lengthToStyle(a, "height")
5104            },
5105            sizeToAttribute: function(a) {
5106                this.lengthToAttribute(a, "width");
5107                this.lengthToAttribute(a, "height")
5108            },
5109            lengthToStyle: function(a, b, c) {
5110                c = c || b;
5111                if (!(c in a.styles)) {
5112                    var d = a.attributes[b];
5113                    d && (/^\d+$/.test(d) && (d += "px"), a.styles[c] = d)
5114                }
5115                delete a.attributes[b]
5116            },
5117            lengthToAttribute: function(a, b, c) {
5118                c = c || b;
5119                if (!(c in a.attributes)) {
5120                    var d = a.styles[b],
5121                        f = d && d.match(/^(\d+)(?:\.\d*)?px$/);
5122                    f ? a.attributes[c] = f[1] : "cke-test" == d && (a.attributes[c] = "cke-test")
5123                }
5124                delete a.styles[b]
5125            },
5126            alignmentToStyle: function(a) {
5127                if (!("float" in
5128                        a.styles)) {
5129                    var b = a.attributes.align;
5130                    if ("left" == b || "right" == b) a.styles["float"] = b
5131                }
5132                delete a.attributes.align
5133            },
5134            alignmentToAttribute: function(a) {
5135                if (!("align" in a.attributes)) {
5136                    var b = a.styles["float"];
5137                    if ("left" == b || "right" == b) a.attributes.align = b
5138                }
5139                delete a.styles["float"]
5140            },
5141            splitBorderShorthand: function(a) {
5142                if (a.styles.border) {
5143                    var b = CKEDITOR.tools.style.parse.border(a.styles.border);
5144                    b.color && (a.styles["border-color"] = b.color);
5145                    b.style && (a.styles["border-style"] = b.style);
5146                    b.width && (a.styles["border-width"] = b.width);
5147                    delete a.styles.border
5148                }
5149            },
5150            listTypeToStyle: function(a) {
5151                if (a.attributes.type) switch (a.attributes.type) {
5152                    case "a":
5153                        a.styles["list-style-type"] = "lower-alpha";
5154                        break;
5155                    case "A":
5156                        a.styles["list-style-type"] = "upper-alpha";
5157                        break;
5158                    case "i":
5159                        a.styles["list-style-type"] = "lower-roman";
5160                        break;
5161                    case "I":
5162                        a.styles["list-style-type"] = "upper-roman";
5163                        break;
5164                    case "1":
5165                        a.styles["list-style-type"] = "decimal";
5166                        break;
5167                    default:
5168                        a.styles["list-style-type"] = a.attributes.type
5169                }
5170            },
5171            splitMarginShorthand: function(a) {
5172                function b(d) {
5173                    a.styles["margin-top"] =
5174                        c[d[0]];
5175                    a.styles["margin-right"] = c[d[1]];
5176                    a.styles["margin-bottom"] = c[d[2]];
5177                    a.styles["margin-left"] = c[d[3]]
5178                }
5179                if (a.styles.margin) {
5180                    var c = a.styles.margin.match(/(\-?[\.\d]+\w+)/g) || ["0px"];
5181                    switch (c.length) {
5182                        case 1:
5183                            b([0, 0, 0, 0]);
5184                            break;
5185                        case 2:
5186                            b([0, 1, 0, 1]);
5187                            break;
5188                        case 3:
5189                            b([0, 1, 2, 1]);
5190                            break;
5191                        case 4:
5192                            b([0, 1, 2, 3])
5193                    }
5194                    delete a.styles.margin
5195                }
5196            },
5197            matchesStyle: F,
5198            transform: function(a, b) {
5199                if ("string" == typeof b) a.name = b;
5200                else {
5201                    var c = b.getDefinition(),
5202                        d = c.styles,
5203                        f = c.attributes,
5204                        e, l, w, p;
5205                    a.name = c.element;
5206                    for (e in f)
5207                        if ("class" == e)
5208                            for (c =
5209                                a.classes.join("|"), w = f[e].split(/\s+/); p = w.pop();) - 1 == c.indexOf(p) && a.classes.push(p);
5210                        else a.attributes[e] = f[e];
5211                    for (l in d) a.styles[l] = d[l]
5212                }
5213            }
5214        }
5215    })();
5216    (function() {
5217        CKEDITOR.focusManager = function(a) {
5218            if (a.focusManager) return a.focusManager;
5219            this.hasFocus = !1;
5220            this.currentActive = null;
5221            this._ = {
5222                editor: a
5223            };
5224            return this
5225        };
5226        CKEDITOR.focusManager._ = {
5227            blurDelay: 200
5228        };
5229        CKEDITOR.focusManager.prototype = {
5230            focus: function(a) {
5231                this._.timer && clearTimeout(this._.timer);
5232                a && (this.currentActive = a);
5233                this.hasFocus || this._.locked || ((a = CKEDITOR.currentInstance) && a.focusManager.blur(1), this.hasFocus = !0, (a = this._.editor.container) && a.addClass("cke_focus"), this._.editor.fire("focus"))
5234            },
5235            lock: function() {
5236                this._.locked =
5237                    1
5238            },
5239            unlock: function() {
5240                delete this._.locked
5241            },
5242            blur: function(a) {
5243                function d() {
5244                    if (this.hasFocus) {
5245                        this.hasFocus = !1;
5246                        var a = this._.editor.container;
5247                        a && a.removeClass("cke_focus");
5248                        this._.editor.fire("blur")
5249                    }
5250                }
5251                if (!this._.locked) {
5252                    this._.timer && clearTimeout(this._.timer);
5253                    var b = CKEDITOR.focusManager._.blurDelay;
5254                    a || !b ? d.call(this) : this._.timer = CKEDITOR.tools.setTimeout(function() {
5255                        delete this._.timer;
5256                        d.call(this)
5257                    }, b, this)
5258                }
5259            },
5260            add: function(a, d) {
5261                var b = a.getCustomData("focusmanager");
5262                if (!b || b != this) {
5263                    b && b.remove(a);
5264                    var b =
5265                        "focus",
5266                        c = "blur";
5267                    d && (CKEDITOR.env.ie ? (b = "focusin", c = "focusout") : CKEDITOR.event.useCapture = 1);
5268                    var f = {
5269                        blur: function() {
5270                            a.equals(this.currentActive) && this.blur()
5271                        },
5272                        focus: function() {
5273                            this.focus(a)
5274                        }
5275                    };
5276                    a.on(b, f.focus, this);
5277                    a.on(c, f.blur, this);
5278                    d && (CKEDITOR.event.useCapture = 0);
5279                    a.setCustomData("focusmanager", this);
5280                    a.setCustomData("focusmanager_handlers", f)
5281                }
5282            },
5283            remove: function(a) {
5284                a.removeCustomData("focusmanager");
5285                var d = a.removeCustomData("focusmanager_handlers");
5286                a.removeListener("blur", d.blur);
5287                a.removeListener("focus",
5288                    d.focus)
5289            }
5290        }
5291    })();
5292    CKEDITOR.keystrokeHandler = function(a) {
5293        if (a.keystrokeHandler) return a.keystrokeHandler;
5294        this.keystrokes = {};
5295        this.blockedKeystrokes = {};
5296        this._ = {
5297            editor: a
5298        };
5299        return this
5300    };
5301    (function() {
5302        var a, d = function(b) {
5303                b = b.data;
5304                var d = b.getKeystroke(),
5305                    h = this.keystrokes[d],
5306                    k = this._.editor;
5307                a = !1 === k.fire("key", {
5308                    keyCode: d,
5309                    domEvent: b
5310                });
5311                a || (h && (a = !1 !== k.execCommand(h, {
5312                    from: "keystrokeHandler"
5313                })), a || (a = !!this.blockedKeystrokes[d]));
5314                a && b.preventDefault(!0);
5315                return !a
5316            },
5317            b = function(b) {
5318                a && (a = !1, b.data.preventDefault(!0))
5319            };
5320        CKEDITOR.keystrokeHandler.prototype = {
5321            attach: function(a) {
5322                a.on("keydown", d, this);
5323                if (CKEDITOR.env.gecko && CKEDITOR.env.mac) a.on("keypress", b, this)
5324            }
5325        }
5326    })();
5327    (function() {
5328        CKEDITOR.lang = {
5329            languages: {
5330                af: 1,
5331                ar: 1,
5332                az: 1,
5333                bg: 1,
5334                bn: 1,
5335                bs: 1,
5336                ca: 1,
5337                cs: 1,
5338                cy: 1,
5339                da: 1,
5340                de: 1,
5341                "de-ch": 1,
5342                el: 1,
5343                "en-au": 1,
5344                "en-ca": 1,
5345                "en-gb": 1,
5346                en: 1,
5347                eo: 1,
5348                es: 1,
5349                "es-mx": 1,
5350                et: 1,
5351                eu: 1,
5352                fa: 1,
5353                fi: 1,
5354                fo: 1,
5355                "fr-ca": 1,
5356                fr: 1,
5357                gl: 1,
5358                gu: 1,
5359                he: 1,
5360                hi: 1,
5361                hr: 1,
5362                hu: 1,
5363                id: 1,
5364                is: 1,
5365                it: 1,
5366                ja: 1,
5367                ka: 1,
5368                km: 1,
5369                ko: 1,
5370                ku: 1,
5371                lt: 1,
5372                lv: 1,
5373                mk: 1,
5374                mn: 1,
5375                ms: 1,
5376                nb: 1,
5377                nl: 1,
5378                no: 1,
5379                oc: 1,
5380                pl: 1,
5381                "pt-br": 1,
5382                pt: 1,
5383                ro: 1,
5384                ru: 1,
5385                si: 1,
5386                sk: 1,
5387                sl: 1,
5388                sq: 1,
5389                "sr-latn": 1,
5390                sr: 1,
5391                sv: 1,
5392                th: 1,
5393                tr: 1,
5394                tt: 1,
5395                ug: 1,
5396                uk: 1,
5397                vi: 1,
5398                "zh-cn": 1,
5399                zh: 1
5400            },
5401            rtl: {
5402                ar: 1,
5403                fa: 1,
5404                he: 1,
5405                ku: 1,
5406                ug: 1
5407            },
5408            load: function(a, d, b) {
5409                a && CKEDITOR.lang.languages[a] ||
5410                    (a = this.detect(d, a));
5411                var c = this;
5412                d = function() {
5413                    c[a].dir = c.rtl[a] ? "rtl" : "ltr";
5414                    b(a, c[a])
5415                };
5416                this[a] ? d() : CKEDITOR.scriptLoader.load(CKEDITOR.getUrl("lang/" + a + ".js"), d, this)
5417            },
5418            detect: function(a, d) {
5419                var b = this.languages;
5420                d = d || navigator.userLanguage || navigator.language || a;
5421                var c = d.toLowerCase().match(/([a-z]+)(?:-([a-z]+))?/),
5422                    f = c[1],
5423                    c = c[2];
5424                b[f + "-" + c] ? f = f + "-" + c : b[f] || (f = null);
5425                CKEDITOR.lang.detect = f ? function() {
5426                    return f
5427                } : function(a) {
5428                    return a
5429                };
5430                return f || a
5431            }
5432        }
5433    })();
5434    CKEDITOR.scriptLoader = function() {
5435        var a = {},
5436            d = {};
5437        return {
5438            load: function(b, c, f, h) {
5439                var k = "string" == typeof b;
5440                k && (b = [b]);
5441                f || (f = CKEDITOR);
5442                var g = b.length,
5443                    n = [],
5444                    r = [],
5445                    e = function(a) {
5446                        c && (k ? c.call(f, a) : c.call(f, n, r))
5447                    };
5448                if (0 === g) e(!0);
5449                else {
5450                    var y = function(a, b) {
5451                            (b ? n : r).push(a);
5452                            0 >= --g && (h && CKEDITOR.document.getDocumentElement().removeStyle("cursor"), e(b))
5453                        },
5454                        v = function(b, c) {
5455                            a[b] = 1;
5456                            var f = d[b];
5457                            delete d[b];
5458                            for (var e = 0; e < f.length; e++) f[e](b, c)
5459                        },
5460                        B = function(b) {
5461                            if (a[b]) y(b, !0);
5462                            else {
5463                                var f = d[b] || (d[b] = []);
5464                                f.push(y);
5465                                if (!(1 < f.length)) {
5466                                    var e =
5467                                        new CKEDITOR.dom.element("script");
5468                                    e.setAttributes({
5469                                        type: "text/javascript",
5470                                        src: b
5471                                    });
5472                                    c && (CKEDITOR.env.ie && (8 >= CKEDITOR.env.version || CKEDITOR.env.ie9Compat) ? e.$.onreadystatechange = function() {
5473                                        if ("loaded" == e.$.readyState || "complete" == e.$.readyState) e.$.onreadystatechange = null, v(b, !0)
5474                                    } : (e.$.onload = function() {
5475                                        setTimeout(function() {
5476                                            v(b, !0)
5477                                        }, 0)
5478                                    }, e.$.onerror = function() {
5479                                        v(b, !1)
5480                                    }));
5481                                    e.appendTo(CKEDITOR.document.getHead())
5482                                }
5483                            }
5484                        };
5485                    h && CKEDITOR.document.getDocumentElement().setStyle("cursor", "wait");
5486                    for (var D = 0; D < g; D++) B(b[D])
5487                }
5488            },
5489            queue: function() {
5490                function a() {
5491                    var b;
5492                    (b = c[0]) && this.load(b.scriptUrl, b.callback, CKEDITOR, 0)
5493                }
5494                var c = [];
5495                return function(d, h) {
5496                    var k = this;
5497                    c.push({
5498                        scriptUrl: d,
5499                        callback: function() {
5500                            h && h.apply(this, arguments);
5501                            c.shift();
5502                            a.call(k)
5503                        }
5504                    });
5505                    1 == c.length && a.call(this)
5506                }
5507            }()
5508        }
5509    }();
5510    CKEDITOR.resourceManager = function(a, d) {
5511        this.basePath = a;
5512        this.fileName = d;
5513        this.registered = {};
5514        this.loaded = {};
5515        this.externals = {};
5516        this._ = {
5517            waitingList: {}
5518        }
5519    };
5520    CKEDITOR.resourceManager.prototype = {
5521        add: function(a, d) {
5522            if (this.registered[a]) throw Error('[CKEDITOR.resourceManager.add] The resource name "' + a + '" is already registered.');
5523            var b = this.registered[a] = d || {};
5524            b.name = a;
5525            b.path = this.getPath(a);
5526            CKEDITOR.fire(a + CKEDITOR.tools.capitalize(this.fileName) + "Ready", b);
5527            return this.get(a)
5528        },
5529        get: function(a) {
5530            return this.registered[a] || null
5531        },
5532        getPath: function(a) {
5533            var d = this.externals[a];
5534            return CKEDITOR.getUrl(d && d.dir || this.basePath + a + "/")
5535        },
5536        getFilePath: function(a) {
5537            var d = this.externals[a];
5538            return CKEDITOR.getUrl(this.getPath(a) + (d ? d.file : this.fileName + ".js"))
5539        },
5540        addExternal: function(a, d, b) {
5541            a = a.split(",");
5542            for (var c = 0; c < a.length; c++) {
5543                var f = a[c];
5544                b || (d = d.replace(/[^\/]+$/, function(a) {
5545                    b = a;
5546                    return ""
5547                }));
5548                this.externals[f] = {
5549                    dir: d,
5550                    file: b || this.fileName + ".js"
5551                }
5552            }
5553        },
5554        load: function(a, d, b) {
5555            CKEDITOR.tools.isArray(a) || (a = a ? [a] : []);
5556            for (var c = this.loaded, f = this.registered, h = [], k = {}, g = {}, n = 0; n < a.length; n++) {
5557                var r = a[n];
5558                if (r)
5559                    if (c[r] || f[r]) g[r] = this.get(r);
5560                    else {
5561                        var e = this.getFilePath(r);
5562                        h.push(e);
5563                        e in k || (k[e] = []);
5564                        k[e].push(r)
5565                    }
5566            }
5567            CKEDITOR.scriptLoader.load(h, function(a, f) {
5568                if (f.length) throw Error('[CKEDITOR.resourceManager.load] Resource name "' + k[f[0]].join(",") + '" was not found at "' + f[0] + '".');
5569                for (var e = 0; e < a.length; e++)
5570                    for (var h = k[a[e]], n = 0; n < h.length; n++) {
5571                        var m = h[n];
5572                        g[m] = this.get(m);
5573                        c[m] = 1
5574                    }
5575                d.call(b, g)
5576            }, this)
5577        }
5578    };
5579    CKEDITOR.plugins = new CKEDITOR.resourceManager("plugins/", "plugin");
5580    CKEDITOR.plugins.load = CKEDITOR.tools.override(CKEDITOR.plugins.load, function(a) {
5581        var d = {};
5582        return function(b, c, f) {
5583            var h = {},
5584                k = function(b) {
5585                    a.call(this, b, function(a) {
5586                        CKEDITOR.tools.extend(h, a);
5587                        var b = [],
5588                            e;
5589                        for (e in a) {
5590                            var g = a[e],
5591                                v = g && g.requires;
5592                            if (!d[e]) {
5593                                if (g.icons)
5594                                    for (var B = g.icons.split(","), D = B.length; D--;) CKEDITOR.skin.addIcon(B[D], g.path + "icons/" + (CKEDITOR.env.hidpi && g.hidpi ? "hidpi/" : "") + B[D] + ".png");
5595                                d[e] = 1
5596                            }
5597                            if (v)
5598                                for (v.split && (v = v.split(",")), g = 0; g < v.length; g++) h[v[g]] || b.push(v[g])
5599                        }
5600                        if (b.length) k.call(this,
5601                            b);
5602                        else {
5603                            for (e in h) g = h[e], g.onLoad && !g.onLoad._called && (!1 === g.onLoad() && delete h[e], g.onLoad._called = 1);
5604                            c && c.call(f || window, h)
5605                        }
5606                    }, this)
5607                };
5608            k.call(this, b)
5609        }
5610    });
5611    CKEDITOR.plugins.setLang = function(a, d, b) {
5612        var c = this.get(a);
5613        a = c.langEntries || (c.langEntries = {});
5614        c = c.lang || (c.lang = []);
5615        c.split && (c = c.split(",")); - 1 == CKEDITOR.tools.indexOf(c, d) && c.push(d);
5616        a[d] = b
5617    };
5618    CKEDITOR.ui = function(a) {
5619        if (a.ui) return a.ui;
5620        this.items = {};
5621        this.instances = {};
5622        this.editor = a;
5623        this._ = {
5624            handlers: {}
5625        };
5626        return this
5627    };
5628    CKEDITOR.ui.prototype = {
5629        add: function(a, d, b) {
5630            b.name = a.toLowerCase();
5631            var c = this.items[a] = {
5632                type: d,
5633                command: b.command || null,
5634                args: Array.prototype.slice.call(arguments, 2)
5635            };
5636            CKEDITOR.tools.extend(c, b)
5637        },
5638        get: function(a) {
5639            return this.instances[a]
5640        },
5641        create: function(a) {
5642            var d = this.items[a],
5643                b = d && this._.handlers[d.type],
5644                c = d && d.command && this.editor.getCommand(d.command),
5645                b = b && b.create.apply(this, d.args);
5646            this.instances[a] = b;
5647            c && c.uiItems.push(b);
5648            b && !b.type && (b.type = d.type);
5649            return b
5650        },
5651        addHandler: function(a, d) {
5652            this._.handlers[a] =
5653                d
5654        },
5655        space: function(a) {
5656            return CKEDITOR.document.getById(this.spaceId(a))
5657        },
5658        spaceId: function(a) {
5659            return this.editor.id + "_" + a
5660        }
5661    };
5662    CKEDITOR.event.implementOn(CKEDITOR.ui);
5663    (function() {
5664        function a(a, f, e) {
5665            CKEDITOR.event.call(this);
5666            a = a && CKEDITOR.tools.clone(a);
5667            if (void 0 !== f) {
5668                if (!(f instanceof CKEDITOR.dom.element)) throw Error("Expect element of type CKEDITOR.dom.element.");
5669                if (!e) throw Error("One of the element modes must be specified.");
5670                if (CKEDITOR.env.ie && CKEDITOR.env.quirks && e == CKEDITOR.ELEMENT_MODE_INLINE) throw Error("Inline element mode is not supported on IE quirks.");
5671                if (!b(f, e)) throw Error('The specified element mode is not supported on element: "' + f.getName() + '".');
5672                this.element = f;
5673                this.elementMode = e;
5674                this.name = this.elementMode != CKEDITOR.ELEMENT_MODE_APPENDTO && (f.getId() || f.getNameAtt())
5675            } else this.elementMode = CKEDITOR.ELEMENT_MODE_NONE;
5676            this._ = {};
5677            this.commands = {};
5678            this.templates = {};
5679            this.name = this.name || d();
5680            this.id = CKEDITOR.tools.getNextId();
5681            this.status = "unloaded";
5682            this.config = CKEDITOR.tools.prototypedCopy(CKEDITOR.config);
5683            this.ui = new CKEDITOR.ui(this);
5684            this.focusManager = new CKEDITOR.focusManager(this);
5685            this.keystrokeHandler = new CKEDITOR.keystrokeHandler(this);
5686            this.on("readOnly",
5687                c);
5688            this.on("selectionChange", function(a) {
5689                h(this, a.data.path)
5690            });
5691            this.on("activeFilterChange", function() {
5692                h(this, this.elementPath(), !0)
5693            });
5694            this.on("mode", c);
5695            this.on("instanceReady", function() {
5696                if (this.config.startupFocus) {
5697                    if ("end" === this.config.startupFocus) {
5698                        var a = this.createRange();
5699                        a.selectNodeContents(this.editable());
5700                        a.shrink(CKEDITOR.SHRINK_ELEMENT, !0);
5701                        a.collapse();
5702                        this.getSelection().selectRanges([a])
5703                    }
5704                    this.focus()
5705                }
5706            });
5707            CKEDITOR.fire("instanceCreated", null, this);
5708            CKEDITOR.add(this);
5709            CKEDITOR.tools.setTimeout(function() {
5710                "destroyed" !==
5711                this.status ? g(this, a) : CKEDITOR.warn("editor-incorrect-destroy")
5712            }, 0, this)
5713        }
5714
5715        function d() {
5716            do var a = "editor" + ++D; while (CKEDITOR.instances[a]);
5717            return a
5718        }
5719
5720        function b(a, b) {
5721            return b == CKEDITOR.ELEMENT_MODE_INLINE ? a.is(CKEDITOR.dtd.$editable) || a.is("textarea") : b == CKEDITOR.ELEMENT_MODE_REPLACE ? !a.is(CKEDITOR.dtd.$nonBodyContent) : 1
5722        }
5723
5724        function c() {
5725            var a = this.commands,
5726                b;
5727            for (b in a) f(this, a[b])
5728        }
5729
5730        function f(a, b) {
5731            b[b.startDisabled ? "disable" : a.readOnly && !b.readOnly ? "disable" : b.modes[a.mode] ? "enable" : "disable"]()
5732        }
5733
5734        function h(a,
5735            b, c) {
5736            if (b) {
5737                var d, f, e = a.commands;
5738                for (f in e) d = e[f], (c || d.contextSensitive) && d.refresh(a, b)
5739            }
5740        }
5741
5742        function k(a) {
5743            var b = a.config.customConfig;
5744            if (!b) return !1;
5745            var b = CKEDITOR.getUrl(b),
5746                c = x[b] || (x[b] = {});
5747            c.fn ? (c.fn.call(a, a.config), CKEDITOR.getUrl(a.config.customConfig) != b && k(a) || a.fireOnce("customConfigLoaded")) : CKEDITOR.scriptLoader.queue(b, function() {
5748                c.fn = CKEDITOR.editorConfig ? CKEDITOR.editorConfig : function() {};
5749                k(a)
5750            });
5751            return !0
5752        }
5753
5754        function g(a, b) {
5755            a.on("customConfigLoaded", function() {
5756                if (b) {
5757                    if (b.on)
5758                        for (var c in b.on) a.on(c,
5759                            b.on[c]);
5760                    CKEDITOR.tools.extend(a.config, b, !0);
5761                    delete a.config.on
5762                }
5763                c = a.config;
5764                a.readOnly = c.readOnly ? !0 : a.elementMode == CKEDITOR.ELEMENT_MODE_INLINE ? a.element.is("textarea") ? a.element.hasAttribute("disabled") || a.element.hasAttribute("readonly") : a.element.isReadOnly() : a.elementMode == CKEDITOR.ELEMENT_MODE_REPLACE ? a.element.hasAttribute("disabled") || a.element.hasAttribute("readonly") : !1;
5765                a.blockless = a.elementMode == CKEDITOR.ELEMENT_MODE_INLINE ? !(a.element.is("textarea") || CKEDITOR.dtd[a.element.getName()].p) :
5766                    !1;
5767                a.tabIndex = c.tabIndex || a.element && a.element.getAttribute("tabindex") || 0;
5768                a.activeEnterMode = a.enterMode = a.blockless ? CKEDITOR.ENTER_BR : c.enterMode;
5769                a.activeShiftEnterMode = a.shiftEnterMode = a.blockless ? CKEDITOR.ENTER_BR : c.shiftEnterMode;
5770                c.skin && (CKEDITOR.skinName = c.skin);
5771                a.fireOnce("configLoaded");
5772                a.dataProcessor = new CKEDITOR.htmlDataProcessor(a);
5773                a.filter = a.activeFilter = new CKEDITOR.filter(a);
5774                n(a)
5775            });
5776            b && null != b.customConfig && (a.config.customConfig = b.customConfig);
5777            k(a) || a.fireOnce("customConfigLoaded")
5778        }
5779
5780        function n(a) {
5781            CKEDITOR.skin.loadPart("editor", function() {
5782                r(a)
5783            })
5784        }
5785
5786        function r(a) {
5787            CKEDITOR.lang.load(a.config.language, a.config.defaultLanguage, function(b, c) {
5788                var d = a.config.title;
5789                a.langCode = b;
5790                a.lang = CKEDITOR.tools.prototypedCopy(c);
5791                a.title = "string" == typeof d || !1 === d ? d : [a.lang.editor, a.name].join(", ");
5792                a.config.contentsLangDirection || (a.config.contentsLangDirection = a.elementMode == CKEDITOR.ELEMENT_MODE_INLINE ? a.element.getDirection(1) : a.lang.dir);
5793                a.fire("langLoaded");
5794                e(a)
5795            })
5796        }
5797
5798        function e(a) {
5799            a.getStylesSet(function(b) {
5800                a.once("loaded",
5801                    function() {
5802                        a.fire("stylesSet", {
5803                            styles: b
5804                        })
5805                    }, null, null, 1);
5806                y(a)
5807            })
5808        }
5809
5810        function y(a) {
5811            function b(a) {
5812                if (!a) return "";
5813                CKEDITOR.tools.isArray(a) && (a = a.join(","));
5814                return a.replace(/\s/g, "")
5815            }
5816            var c = a.config,
5817                d = b(c.plugins),
5818                f = b(c.extraPlugins),
5819                e = b(c.removePlugins);
5820            if (f) var h = new RegExp("(?:^|,)(?:" + f.replace(/,/g, "|") + ")(?\x3d,|$)", "g"),
5821                d = d.replace(h, ""),
5822                d = d + ("," + f);
5823            if (e) var g = new RegExp("(?:^|,)(?:" + e.replace(/,/g, "|") + ")(?\x3d,|$)", "g"),
5824                d = d.replace(g, "");
5825            CKEDITOR.env.air && (d += ",adobeair");
5826            CKEDITOR.plugins.load(d.split(","),
5827                function(b) {
5828                    var d = [],
5829                        f = [],
5830                        e = [];
5831                    a.plugins = CKEDITOR.tools.extend({}, a.plugins, b);
5832                    for (var l in b) {
5833                        var h = b[l],
5834                            t = h.lang,
5835                            k = null,
5836                            p = h.requires,
5837                            F;
5838                        CKEDITOR.tools.isArray(p) && (p = p.join(","));
5839                        if (p && (F = p.match(g)))
5840                            for (; p = F.pop();) CKEDITOR.error("editor-plugin-required", {
5841                                plugin: p.replace(",", ""),
5842                                requiredBy: l
5843                            });
5844                        t && !a.lang[l] && (t.split && (t = t.split(",")), 0 <= CKEDITOR.tools.indexOf(t, a.langCode) ? k = a.langCode : (k = a.langCode.replace(/-.*/, ""), k = k != a.langCode && 0 <= CKEDITOR.tools.indexOf(t, k) ? k : 0 <= CKEDITOR.tools.indexOf(t,
5845                            "en") ? "en" : t[0]), h.langEntries && h.langEntries[k] ? (a.lang[l] = h.langEntries[k], k = null) : e.push(CKEDITOR.getUrl(h.path + "lang/" + k + ".js")));
5846                        f.push(k);
5847                        d.push(h)
5848                    }
5849                    CKEDITOR.scriptLoader.load(e, function() {
5850                        for (var b = ["beforeInit", "init", "afterInit"], e = 0; e < b.length; e++)
5851                            for (var l = 0; l < d.length; l++) {
5852                                var p = d[l];
5853                                0 === e && f[l] && p.lang && p.langEntries && (a.lang[p.name] = p.langEntries[f[l]]);
5854                                if (p[b[e]]) p[b[e]](a)
5855                            }
5856                        a.fireOnce("pluginsLoaded");
5857                        c.keystrokes && a.setKeystroke(a.config.keystrokes);
5858                        for (l = 0; l < a.config.blockedKeystrokes.length; l++) a.keystrokeHandler.blockedKeystrokes[a.config.blockedKeystrokes[l]] =
5859                            1;
5860                        a.status = "loaded";
5861                        a.fireOnce("loaded");
5862                        CKEDITOR.fire("instanceLoaded", null, a)
5863                    })
5864                })
5865        }
5866
5867        function v() {
5868            var a = this.element;
5869            if (a && this.elementMode != CKEDITOR.ELEMENT_MODE_APPENDTO) {
5870                var b = this.getData();
5871                this.config.htmlEncodeOutput && (b = CKEDITOR.tools.htmlEncode(b));
5872                a.is("textarea") ? a.setValue(b) : a.setHtml(b);
5873                return !0
5874            }
5875            return !1
5876        }
5877
5878        function B(a, b) {
5879            function c(a) {
5880                var b = a.startContainer,
5881                    d = a.endContainer;
5882                return b.is && (b.is("tr") || b.is("td") && b.equals(d) && a.endOffset === b.getChildCount()) ? !0 : !1
5883            }
5884
5885            function d(a) {
5886                var b = a.startContainer;
5887                return b.is("tr") ? a.cloneContents() : b.clone(!0)
5888            }
5889            for (var f = new CKEDITOR.dom.documentFragment, e, h, g, k = 0; k < a.length; k++) {
5890                var M = a[k],
5891                    q = M.startContainer.getAscendant("tr", !0);
5892                c(M) ? (e || (e = q.getAscendant("table").clone(), e.append(q.getAscendant({
5893                    thead: 1,
5894                    tbody: 1,
5895                    tfoot: 1
5896                }).clone()), f.append(e), e = e.findOne("thead, tbody, tfoot")), h && h.equals(q) || (h = q, g = q.clone(), e.append(g)), g.append(d(M))) : f.append(M.cloneContents())
5897            }
5898            return e ? f : b.getHtmlFromRange(a[0])
5899        }
5900        a.prototype = CKEDITOR.editor.prototype;
5901        CKEDITOR.editor =
5902            a;
5903        var D = 0,
5904            x = {};
5905        CKEDITOR.tools.extend(CKEDITOR.editor.prototype, {
5906            plugins: {
5907                detectConflict: function(a, b) {
5908                    for (var c = 0; c < b.length; c++) {
5909                        var d = b[c];
5910                        if (this[d]) return CKEDITOR.warn("editor-plugin-conflict", {
5911                            plugin: a,
5912                            replacedWith: d
5913                        }), !0
5914                    }
5915                    return !1
5916                }
5917            },
5918            addCommand: function(a, b) {
5919                b.name = a.toLowerCase();
5920                var c = b instanceof CKEDITOR.command ? b : new CKEDITOR.command(this, b);
5921                this.mode && f(this, c);
5922                return this.commands[a] = c
5923            },
5924            _attachToForm: function() {
5925                function a(b) {
5926                    c.updateElement();
5927                    c._.required && !d.getValue() && !1 === c.fire("required") &&
5928                        b.data.preventDefault()
5929                }
5930
5931                function b(a) {
5932                    return !!(a && a.call && a.apply)
5933                }
5934                var c = this,
5935                    d = c.element,
5936                    f = new CKEDITOR.dom.element(d.$.form);
5937                d.is("textarea") && f && (f.on("submit", a), b(f.$.submit) && (f.$.submit = CKEDITOR.tools.override(f.$.submit, function(b) {
5938                    return function() {
5939                        a();
5940                        b.apply ? b.apply(this) : b()
5941                    }
5942                })), c.on("destroy", function() {
5943                    f.removeListener("submit", a)
5944                }))
5945            },
5946            destroy: function(a) {
5947                this.fire("beforeDestroy");
5948                !a && v.call(this);
5949                this.editable(null);
5950                this.filter && (this.filter.destroy(), delete this.filter);
5951                delete this.activeFilter;
5952                this.status = "destroyed";
5953                this.fire("destroy");
5954                this.removeAllListeners();
5955                CKEDITOR.remove(this);
5956                CKEDITOR.fire("instanceDestroyed", null, this)
5957            },
5958            elementPath: function(a) {
5959                if (!a) {
5960                    a = this.getSelection();
5961                    if (!a) return null;
5962                    a = a.getStartElement()
5963                }
5964                return a ? new CKEDITOR.dom.elementPath(a, this.editable()) : null
5965            },
5966            createRange: function() {
5967                var a = this.editable();
5968                return a ? new CKEDITOR.dom.range(a) : null
5969            },
5970            execCommand: function(a, b) {
5971                var c = this.getCommand(a),
5972                    d = {
5973                        name: a,
5974                        commandData: b || {},
5975                        command: c
5976                    };
5977                return c && c.state != CKEDITOR.TRISTATE_DISABLED &&
5978                    !1 !== this.fire("beforeCommandExec", d) && (d.returnValue = c.exec(d.commandData), !c.async && !1 !== this.fire("afterCommandExec", d)) ? d.returnValue : !1
5979            },
5980            getCommand: function(a) {
5981                return this.commands[a]
5982            },
5983            getData: function(a) {
5984                !a && this.fire("beforeGetData");
5985                var b = this._.data;
5986                "string" != typeof b && (b = (b = this.element) && this.elementMode == CKEDITOR.ELEMENT_MODE_REPLACE ? b.is("textarea") ? b.getValue() : b.getHtml() : "");
5987                b = {
5988                    dataValue: b
5989                };
5990                !a && this.fire("getData", b);
5991                return b.dataValue
5992            },
5993            getSnapshot: function() {
5994                var a = this.fire("getSnapshot");
5995                "string" != typeof a && (a = (a = this.element) && this.elementMode == CKEDITOR.ELEMENT_MODE_REPLACE ? a.is("textarea") ? a.getValue() : a.getHtml() : "");
5996                return a
5997            },
5998            loadSnapshot: function(a) {
5999                this.fire("loadSnapshot", a)
6000            },
6001            setData: function(a, b, c) {
6002                var d = !0,
6003                    f = b;
6004                b && "object" == typeof b && (c = b.internal, f = b.callback, d = !b.noSnapshot);
6005                !c && d && this.fire("saveSnapshot");
6006                if (f || !c) this.once("dataReady", function(a) {
6007                    !c && d && this.fire("saveSnapshot");
6008                    f && f.call(a.editor)
6009                });
6010                a = {
6011                    dataValue: a
6012                };
6013                !c && this.fire("setData", a);
6014                this._.data = a.dataValue;
6015                !c && this.fire("afterSetData", a)
6016            },
6017            setReadOnly: function(a) {
6018                a = null == a || a;
6019                this.readOnly != a && (this.readOnly = a, this.keystrokeHandler.blockedKeystrokes[8] = +a, this.editable().setReadOnly(a), this.fire("readOnly"))
6020            },
6021            insertHtml: function(a, b, c) {
6022                this.fire("insertHtml", {
6023                    dataValue: a,
6024                    mode: b,
6025                    range: c
6026                })
6027            },
6028            insertText: function(a) {
6029                this.fire("insertText", a)
6030            },
6031            insertElement: function(a) {
6032                this.fire("insertElement", a)
6033            },
6034            getSelectedHtml: function(a) {
6035                var b = this.editable(),
6036                    c = this.getSelection(),
6037                    c = c && c.getRanges();
6038                if (!b || !c || 0 === c.length) return null;
6039                b = B(c, b);
6040                return a ? b.getHtml() : b
6041            },
6042            extractSelectedHtml: function(a, b) {
6043                var c = this.editable(),
6044                    d = this.getSelection().getRanges(),
6045                    f = new CKEDITOR.dom.documentFragment,
6046                    e;
6047                if (!c || 0 === d.length) return null;
6048                for (e = 0; e < d.length; e++) f.append(c.extractHtmlFromRange(d[e], b));
6049                b || this.getSelection().selectRanges([d[0]]);
6050                return a ? f.getHtml() : f
6051            },
6052            focus: function() {
6053                this.fire("beforeFocus")
6054            },
6055            checkDirty: function() {
6056                return "ready" == this.status && this._.previousValue !== this.getSnapshot()
6057            },
6058            resetDirty: function() {
6059                this._.previousValue =
6060                    this.getSnapshot()
6061            },
6062            updateElement: function() {
6063                return v.call(this)
6064            },
6065            setKeystroke: function() {
6066                for (var a = this.keystrokeHandler.keystrokes, b = CKEDITOR.tools.isArray(arguments[0]) ? arguments[0] : [
6067                        [].slice.call(arguments, 0)
6068                    ], c, d, f = b.length; f--;) c = b[f], d = 0, CKEDITOR.tools.isArray(c) && (d = c[1], c = c[0]), d ? a[c] = d : delete a[c]
6069            },
6070            getCommandKeystroke: function(a) {
6071                if (a = "string" === typeof a ? this.getCommand(a) : a) {
6072                    var b = CKEDITOR.tools.object.findKey(this.commands, a),
6073                        c = this.keystrokeHandler.keystrokes,
6074                        d;
6075                    if (a.fakeKeystroke) return a.fakeKeystroke;
6076                    for (d in c)
6077                        if (c.hasOwnProperty(d) && c[d] == b) return d
6078                }
6079                return null
6080            },
6081            addFeature: function(a) {
6082                return this.filter.addFeature(a)
6083            },
6084            setActiveFilter: function(a) {
6085                a || (a = this.filter);
6086                this.activeFilter !== a && (this.activeFilter = a, this.fire("activeFilterChange"), a === this.filter ? this.setActiveEnterMode(null, null) : this.setActiveEnterMode(a.getAllowedEnterMode(this.enterMode), a.getAllowedEnterMode(this.shiftEnterMode, !0)))
6087            },
6088            setActiveEnterMode: function(a, b) {
6089                a = a ? this.blockless ? CKEDITOR.ENTER_BR : a : this.enterMode;
6090                b = b ? this.blockless ?
6091                    CKEDITOR.ENTER_BR : b : this.shiftEnterMode;
6092                if (this.activeEnterMode != a || this.activeShiftEnterMode != b) this.activeEnterMode = a, this.activeShiftEnterMode = b, this.fire("activeEnterModeChange")
6093            },
6094            showNotification: function(a) {
6095                alert(a)
6096            }
6097        })
6098    })();
6099    CKEDITOR.ELEMENT_MODE_NONE = 0;
6100    CKEDITOR.ELEMENT_MODE_REPLACE = 1;
6101    CKEDITOR.ELEMENT_MODE_APPENDTO = 2;
6102    CKEDITOR.ELEMENT_MODE_INLINE = 3;
6103    CKEDITOR.htmlParser = function() {
6104        this._ = {
6105            htmlPartsRegex: /<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)--\x3e)|(?:([^\/\s>]+)((?:\s+[\w\-:.]+(?:\s*=\s*?(?:(?:"[^"]*")|(?:'[^']*')|[^\s"'\/>]+))?)*)[\S\s]*?(\/?)>))/g
6106        }
6107    };
6108    (function() {
6109        var a = /([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,
6110            d = {
6111                checked: 1,
6112                compact: 1,
6113                declare: 1,
6114                defer: 1,
6115                disabled: 1,
6116                ismap: 1,
6117                multiple: 1,
6118                nohref: 1,
6119                noresize: 1,
6120                noshade: 1,
6121                nowrap: 1,
6122                readonly: 1,
6123                selected: 1
6124            };
6125        CKEDITOR.htmlParser.prototype = {
6126            onTagOpen: function() {},
6127            onTagClose: function() {},
6128            onText: function() {},
6129            onCDATA: function() {},
6130            onComment: function() {},
6131            parse: function(b) {
6132                for (var c, f, h = 0, k; c = this._.htmlPartsRegex.exec(b);) {
6133                    f = c.index;
6134                    if (f > h)
6135                        if (h = b.substring(h, f), k) k.push(h);
6136                        else this.onText(h);
6137                    h = this._.htmlPartsRegex.lastIndex;
6138                    if (f = c[1])
6139                        if (f = f.toLowerCase(), k && CKEDITOR.dtd.$cdata[f] && (this.onCDATA(k.join("")), k = null), !k) {
6140                            this.onTagClose(f);
6141                            continue
6142                        } if (k) k.push(c[0]);
6143                    else if (f = c[3]) {
6144                        if (f = f.toLowerCase(), !/="/.test(f)) {
6145                            var g = {},
6146                                n, r = c[4];
6147                            c = !!c[5];
6148                            if (r)
6149                                for (; n = a.exec(r);) {
6150                                    var e = n[1].toLowerCase();
6151                                    n = n[2] || n[3] || n[4] || "";
6152                                    g[e] = !n && d[e] ? e : CKEDITOR.tools.htmlDecodeAttr(n)
6153                                }
6154                            this.onTagOpen(f, g, c);
6155                            !k && CKEDITOR.dtd.$cdata[f] && (k = [])
6156                        }
6157                    } else if (f = c[2]) this.onComment(f)
6158                }
6159                if (b.length > h) this.onText(b.substring(h,
6160                    b.length))
6161            }
6162        }
6163    })();
6164    CKEDITOR.htmlParser.basicWriter = CKEDITOR.tools.createClass({
6165        $: function() {
6166            this._ = {
6167                output: []
6168            }
6169        },
6170        proto: {
6171            openTag: function(a) {
6172                this._.output.push("\x3c", a)
6173            },
6174            openTagClose: function(a, d) {
6175                d ? this._.output.push(" /\x3e") : this._.output.push("\x3e")
6176            },
6177            attribute: function(a, d) {
6178                "string" == typeof d && (d = CKEDITOR.tools.htmlEncodeAttr(d));
6179                this._.output.push(" ", a, '\x3d"', d, '"')
6180            },
6181            closeTag: function(a) {
6182                this._.output.push("\x3c/", a, "\x3e")
6183            },
6184            text: function(a) {
6185                this._.output.push(a)
6186            },
6187            comment: function(a) {
6188                this._.output.push("\x3c!--", a,
6189                    "--\x3e")
6190            },
6191            write: function(a) {
6192                this._.output.push(a)
6193            },
6194            reset: function() {
6195                this._.output = [];
6196                this._.indent = !1
6197            },
6198            getHtml: function(a) {
6199                var d = this._.output.join("");
6200                a && this.reset();
6201                return d
6202            }
6203        }
6204    });
6205    "use strict";
6206    (function() {
6207        CKEDITOR.htmlParser.node = function() {};
6208        CKEDITOR.htmlParser.node.prototype = {
6209            remove: function() {
6210                var a = this.parent.children,
6211                    d = CKEDITOR.tools.indexOf(a, this),
6212                    b = this.previous,
6213                    c = this.next;
6214                b && (b.next = c);
6215                c && (c.previous = b);
6216                a.splice(d, 1);
6217                this.parent = null
6218            },
6219            replaceWith: function(a) {
6220                var d = this.parent.children,
6221                    b = CKEDITOR.tools.indexOf(d, this),
6222                    c = a.previous = this.previous,
6223                    f = a.next = this.next;
6224                c && (c.next = a);
6225                f && (f.previous = a);
6226                d[b] = a;
6227                a.parent = this.parent;
6228                this.parent = null
6229            },
6230            insertAfter: function(a) {
6231                var d = a.parent.children,
6232                    b = CKEDITOR.tools.indexOf(d, a),
6233                    c = a.next;
6234                d.splice(b + 1, 0, this);
6235                this.next = a.next;
6236                this.previous = a;
6237                a.next = this;
6238                c && (c.previous = this);
6239                this.parent = a.parent
6240            },
6241            insertBefore: function(a) {
6242                var d = a.parent.children,
6243                    b = CKEDITOR.tools.indexOf(d, a);
6244                d.splice(b, 0, this);
6245                this.next = a;
6246                (this.previous = a.previous) && (a.previous.next = this);
6247                a.previous = this;
6248                this.parent = a.parent
6249            },
6250            getAscendant: function(a) {
6251                var d = "function" == typeof a ? a : "string" == typeof a ? function(b) {
6252                        return b.name == a
6253                    } : function(b) {
6254                        return b.name in a
6255                    },
6256                    b = this.parent;
6257                for (; b &&
6258                    b.type == CKEDITOR.NODE_ELEMENT;) {
6259                    if (d(b)) return b;
6260                    b = b.parent
6261                }
6262                return null
6263            },
6264            wrapWith: function(a) {
6265                this.replaceWith(a);
6266                a.add(this);
6267                return a
6268            },
6269            getIndex: function() {
6270                return CKEDITOR.tools.indexOf(this.parent.children, this)
6271            },
6272            getFilterContext: function(a) {
6273                return a || {}
6274            }
6275        }
6276    })();
6277    "use strict";
6278    CKEDITOR.htmlParser.comment = function(a) {
6279        this.value = a;
6280        this._ = {
6281            isBlockLike: !1
6282        }
6283    };
6284    CKEDITOR.htmlParser.comment.prototype = CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node, {
6285        type: CKEDITOR.NODE_COMMENT,
6286        filter: function(a, d) {
6287            var b = this.value;
6288            if (!(b = a.onComment(d, b, this))) return this.remove(), !1;
6289            if ("string" != typeof b) return this.replaceWith(b), !1;
6290            this.value = b;
6291            return !0
6292        },
6293        writeHtml: function(a, d) {
6294            d && this.filter(d);
6295            a.comment(this.value)
6296        }
6297    });
6298    "use strict";
6299    (function() {
6300        CKEDITOR.htmlParser.text = function(a) {
6301            this.value = a;
6302            this._ = {
6303                isBlockLike: !1
6304            }
6305        };
6306        CKEDITOR.htmlParser.text.prototype = CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node, {
6307            type: CKEDITOR.NODE_TEXT,
6308            filter: function(a, d) {
6309                if (!(this.value = a.onText(d, this.value, this))) return this.remove(), !1
6310            },
6311            writeHtml: function(a, d) {
6312                d && this.filter(d);
6313                a.text(this.value)
6314            }
6315        })
6316    })();
6317    "use strict";
6318    (function() {
6319        CKEDITOR.htmlParser.cdata = function(a) {
6320            this.value = a
6321        };
6322        CKEDITOR.htmlParser.cdata.prototype = CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node, {
6323            type: CKEDITOR.NODE_TEXT,
6324            filter: function() {},
6325            writeHtml: function(a) {
6326                a.write(this.value)
6327            }
6328        })
6329    })();
6330    "use strict";
6331    CKEDITOR.htmlParser.fragment = function() {
6332        this.children = [];
6333        this.parent = null;
6334        this._ = {
6335            isBlockLike: !0,
6336            hasInlineStarted: !1
6337        }
6338    };
6339    (function() {
6340        function a(a) {
6341            return a.attributes["data-cke-survive"] ? !1 : "a" == a.name && a.attributes.href || CKEDITOR.dtd.$removeEmpty[a.name]
6342        }
6343        var d = CKEDITOR.tools.extend({
6344                table: 1,
6345                ul: 1,
6346                ol: 1,
6347                dl: 1
6348            }, CKEDITOR.dtd.table, CKEDITOR.dtd.ul, CKEDITOR.dtd.ol, CKEDITOR.dtd.dl),
6349            b = {
6350                ol: 1,
6351                ul: 1
6352            },
6353            c = CKEDITOR.tools.extend({}, {
6354                html: 1
6355            }, CKEDITOR.dtd.html, CKEDITOR.dtd.body, CKEDITOR.dtd.head, {
6356                style: 1,
6357                script: 1
6358            }),
6359            f = {
6360                ul: "li",
6361                ol: "li",
6362                dl: "dd",
6363                table: "tbody",
6364                tbody: "tr",
6365                thead: "tr",
6366                tfoot: "tr",
6367                tr: "td"
6368            };
6369        CKEDITOR.htmlParser.fragment.fromHtml =
6370            function(h, k, g) {
6371                function n(a) {
6372                    var b;
6373                    if (0 < m.length)
6374                        for (var c = 0; c < m.length; c++) {
6375                            var d = m[c],
6376                                f = d.name,
6377                                e = CKEDITOR.dtd[f],
6378                                l = u.name && CKEDITOR.dtd[u.name];
6379                            l && !l[f] || a && e && !e[a] && CKEDITOR.dtd[a] ? f == u.name && (y(u, u.parent, 1), c--) : (b || (r(), b = 1), d = d.clone(), d.parent = u, u = d, m.splice(c, 1), c--)
6380                        }
6381                }
6382
6383                function r() {
6384                    for (; J.length;) y(J.shift(), u)
6385                }
6386
6387                function e(a) {
6388                    if (a._.isBlockLike && "pre" != a.name && "textarea" != a.name) {
6389                        var b = a.children.length,
6390                            c = a.children[b - 1],
6391                            d;
6392                        c && c.type == CKEDITOR.NODE_TEXT && ((d = CKEDITOR.tools.rtrim(c.value)) ?
6393                            c.value = d : a.children.length = b - 1)
6394                    }
6395                }
6396
6397                function y(b, c, d) {
6398                    c = c || u || x;
6399                    var f = u;
6400                    void 0 === b.previous && (v(c, b) && (u = c, D.onTagOpen(g, {}), b.returnPoint = c = u), e(b), a(b) && !b.children.length || c.add(b), "pre" == b.name && (l = !1), "textarea" == b.name && (K = !1));
6401                    b.returnPoint ? (u = b.returnPoint, delete b.returnPoint) : u = d ? c : f
6402                }
6403
6404                function v(a, b) {
6405                    if ((a == x || "body" == a.name) && g && (!a.name || CKEDITOR.dtd[a.name][g])) {
6406                        var c, d;
6407                        return (c = b.attributes && (d = b.attributes["data-cke-real-element-type"]) ? d : b.name) && c in CKEDITOR.dtd.$inline && !(c in CKEDITOR.dtd.head) &&
6408                            !b.isOrphan || b.type == CKEDITOR.NODE_TEXT
6409                    }
6410                }
6411
6412                function B(a, b) {
6413                    return a in CKEDITOR.dtd.$listItem || a in CKEDITOR.dtd.$tableContent ? a == b || "dt" == a && "dd" == b || "dd" == a && "dt" == b : !1
6414                }
6415                var D = new CKEDITOR.htmlParser,
6416                    x = k instanceof CKEDITOR.htmlParser.element ? k : "string" == typeof k ? new CKEDITOR.htmlParser.element(k) : new CKEDITOR.htmlParser.fragment,
6417                    m = [],
6418                    J = [],
6419                    u = x,
6420                    K = "textarea" == x.name,
6421                    l = "pre" == x.name;
6422                D.onTagOpen = function(f, e, h, g) {
6423                    e = new CKEDITOR.htmlParser.element(f, e);
6424                    e.isUnknown && h && (e.isEmpty = !0);
6425                    e.isOptionalClose = g;
6426                    if (a(e)) m.push(e);
6427                    else {
6428                        if ("pre" == f) l = !0;
6429                        else {
6430                            if ("br" == f && l) {
6431                                u.add(new CKEDITOR.htmlParser.text("\n"));
6432                                return
6433                            }
6434                            "textarea" == f && (K = !0)
6435                        }
6436                        if ("br" == f) J.push(e);
6437                        else {
6438                            for (; !(g = (h = u.name) ? CKEDITOR.dtd[h] || (u._.isBlockLike ? CKEDITOR.dtd.div : CKEDITOR.dtd.span) : c, e.isUnknown || u.isUnknown || g[f]);)
6439                                if (u.isOptionalClose) D.onTagClose(h);
6440                                else if (f in b && h in b) h = u.children, (h = h[h.length - 1]) && "li" == h.name || y(h = new CKEDITOR.htmlParser.element("li"), u), !e.returnPoint && (e.returnPoint = u), u = h;
6441                            else if (f in CKEDITOR.dtd.$listItem &&
6442                                !B(f, h)) D.onTagOpen("li" == f ? "ul" : "dl", {}, 0, 1);
6443                            else if (h in d && !B(f, h)) !e.returnPoint && (e.returnPoint = u), u = u.parent;
6444                            else if (h in CKEDITOR.dtd.$inline && m.unshift(u), u.parent) y(u, u.parent, 1);
6445                            else {
6446                                e.isOrphan = 1;
6447                                break
6448                            }
6449                            n(f);
6450                            r();
6451                            e.parent = u;
6452                            e.isEmpty ? y(e) : u = e
6453                        }
6454                    }
6455                };
6456                D.onTagClose = function(a) {
6457                    for (var b = m.length - 1; 0 <= b; b--)
6458                        if (a == m[b].name) {
6459                            m.splice(b, 1);
6460                            return
6461                        } for (var c = [], d = [], f = u; f != x && f.name != a;) f._.isBlockLike || d.unshift(f), c.push(f), f = f.returnPoint || f.parent;
6462                    if (f != x) {
6463                        for (b = 0; b < c.length; b++) {
6464                            var e = c[b];
6465                            y(e, e.parent)
6466                        }
6467                        u =
6468                            f;
6469                        f._.isBlockLike && r();
6470                        y(f, f.parent);
6471                        f == u && (u = u.parent);
6472                        m = m.concat(d)
6473                    }
6474                    "body" == a && (g = !1)
6475                };
6476                D.onText = function(a) {
6477                    if (!(u._.hasInlineStarted && !J.length || l || K) && (a = CKEDITOR.tools.ltrim(a), 0 === a.length)) return;
6478                    var b = u.name,
6479                        e = b ? CKEDITOR.dtd[b] || (u._.isBlockLike ? CKEDITOR.dtd.div : CKEDITOR.dtd.span) : c;
6480                    if (!K && !e["#"] && b in d) D.onTagOpen(f[b] || ""), D.onText(a);
6481                    else {
6482                        r();
6483                        n();
6484                        l || K || (a = a.replace(/[\t\r\n ]{2,}|[\t\r\n]/g, " "));
6485                        a = new CKEDITOR.htmlParser.text(a);
6486                        if (v(u, a)) this.onTagOpen(g, {}, 0, 1);
6487                        u.add(a)
6488                    }
6489                };
6490                D.onCDATA =
6491                    function(a) {
6492                        u.add(new CKEDITOR.htmlParser.cdata(a))
6493                    };
6494                D.onComment = function(a) {
6495                    r();
6496                    n();
6497                    u.add(new CKEDITOR.htmlParser.comment(a))
6498                };
6499                D.parse(h);
6500                for (r(); u != x;) y(u, u.parent, 1);
6501                e(x);
6502                return x
6503            };
6504        CKEDITOR.htmlParser.fragment.prototype = {
6505            type: CKEDITOR.NODE_DOCUMENT_FRAGMENT,
6506            add: function(a, b) {
6507                isNaN(b) && (b = this.children.length);
6508                var c = 0 < b ? this.children[b - 1] : null;
6509                if (c) {
6510                    if (a._.isBlockLike && c.type == CKEDITOR.NODE_TEXT && (c.value = CKEDITOR.tools.rtrim(c.value), 0 === c.value.length)) {
6511                        this.children.pop();
6512                        this.add(a);
6513                        return
6514                    }
6515                    c.next =
6516                        a
6517                }
6518                a.previous = c;
6519                a.parent = this;
6520                this.children.splice(b, 0, a);
6521                this._.hasInlineStarted || (this._.hasInlineStarted = a.type == CKEDITOR.NODE_TEXT || a.type == CKEDITOR.NODE_ELEMENT && !a._.isBlockLike)
6522            },
6523            filter: function(a, b) {
6524                b = this.getFilterContext(b);
6525                a.onRoot(b, this);
6526                this.filterChildren(a, !1, b)
6527            },
6528            filterChildren: function(a, b, c) {
6529                if (this.childrenFilteredBy != a.id) {
6530                    c = this.getFilterContext(c);
6531                    if (b && !this.parent) a.onRoot(c, this);
6532                    this.childrenFilteredBy = a.id;
6533                    for (b = 0; b < this.children.length; b++) !1 === this.children[b].filter(a,
6534                        c) && b--
6535                }
6536            },
6537            writeHtml: function(a, b) {
6538                b && this.filter(b);
6539                this.writeChildrenHtml(a)
6540            },
6541            writeChildrenHtml: function(a, b, c) {
6542                var d = this.getFilterContext();
6543                if (c && !this.parent && b) b.onRoot(d, this);
6544                b && this.filterChildren(b, !1, d);
6545                b = 0;
6546                c = this.children;
6547                for (d = c.length; b < d; b++) c[b].writeHtml(a)
6548            },
6549            forEach: function(a, b, c) {
6550                if (!(c || b && this.type != b)) var d = a(this);
6551                if (!1 !== d) {
6552                    c = this.children;
6553                    for (var f = 0; f < c.length; f++) d = c[f], d.type == CKEDITOR.NODE_ELEMENT ? d.forEach(a, b) : b && d.type != b || a(d)
6554                }
6555            },
6556            getFilterContext: function(a) {
6557                return a || {}
6558            }
6559        }
6560    })();
6561    "use strict";
6562    (function() {
6563        function a() {
6564            this.rules = []
6565        }
6566
6567        function d(b, c, d, h) {
6568            var k, g;
6569            for (k in c)(g = b[k]) || (g = b[k] = new a), g.add(c[k], d, h)
6570        }
6571        CKEDITOR.htmlParser.filter = CKEDITOR.tools.createClass({
6572            $: function(b) {
6573                this.id = CKEDITOR.tools.getNextNumber();
6574                this.elementNameRules = new a;
6575                this.attributeNameRules = new a;
6576                this.elementsRules = {};
6577                this.attributesRules = {};
6578                this.textRules = new a;
6579                this.commentRules = new a;
6580                this.rootRules = new a;
6581                b && this.addRules(b, 10)
6582            },
6583            proto: {
6584                addRules: function(a, c) {
6585                    var f;
6586                    "number" == typeof c ? f = c : c && "priority" in c && (f =
6587                        c.priority);
6588                    "number" != typeof f && (f = 10);
6589                    "object" != typeof c && (c = {});
6590                    a.elementNames && this.elementNameRules.addMany(a.elementNames, f, c);
6591                    a.attributeNames && this.attributeNameRules.addMany(a.attributeNames, f, c);
6592                    a.elements && d(this.elementsRules, a.elements, f, c);
6593                    a.attributes && d(this.attributesRules, a.attributes, f, c);
6594                    a.text && this.textRules.add(a.text, f, c);
6595                    a.comment && this.commentRules.add(a.comment, f, c);
6596                    a.root && this.rootRules.add(a.root, f, c)
6597                },
6598                applyTo: function(a) {
6599                    a.filter(this)
6600                },
6601                onElementName: function(a, c) {
6602                    return this.elementNameRules.execOnName(a,
6603                        c)
6604                },
6605                onAttributeName: function(a, c) {
6606                    return this.attributeNameRules.execOnName(a, c)
6607                },
6608                onText: function(a, c, d) {
6609                    return this.textRules.exec(a, c, d)
6610                },
6611                onComment: function(a, c, d) {
6612                    return this.commentRules.exec(a, c, d)
6613                },
6614                onRoot: function(a, c) {
6615                    return this.rootRules.exec(a, c)
6616                },
6617                onElement: function(a, c) {
6618                    for (var d = [this.elementsRules["^"], this.elementsRules[c.name], this.elementsRules.$], h, k = 0; 3 > k; k++)
6619                        if (h = d[k]) {
6620                            h = h.exec(a, c, this);
6621                            if (!1 === h) return null;
6622                            if (h && h != c) return this.onNode(a, h);
6623                            if (c.parent && !c.name) break
6624                        } return c
6625                },
6626                onNode: function(a, c) {
6627                    var d = c.type;
6628                    return d == CKEDITOR.NODE_ELEMENT ? this.onElement(a, c) : d == CKEDITOR.NODE_TEXT ? new CKEDITOR.htmlParser.text(this.onText(a, c.value)) : d == CKEDITOR.NODE_COMMENT ? new CKEDITOR.htmlParser.comment(this.onComment(a, c.value)) : null
6629                },
6630                onAttribute: function(a, c, d, h) {
6631                    return (d = this.attributesRules[d]) ? d.exec(a, h, c, this) : h
6632                }
6633            }
6634        });
6635        CKEDITOR.htmlParser.filterRulesGroup = a;
6636        a.prototype = {
6637            add: function(a, c, d) {
6638                this.rules.splice(this.findIndex(c), 0, {
6639                    value: a,
6640                    priority: c,
6641                    options: d
6642                })
6643            },
6644            addMany: function(a,
6645                c, d) {
6646                for (var h = [this.findIndex(c), 0], k = 0, g = a.length; k < g; k++) h.push({
6647                    value: a[k],
6648                    priority: c,
6649                    options: d
6650                });
6651                this.rules.splice.apply(this.rules, h)
6652            },
6653            findIndex: function(a) {
6654                for (var c = this.rules, d = c.length - 1; 0 <= d && a < c[d].priority;) d--;
6655                return d + 1
6656            },
6657            exec: function(a, c) {
6658                var d = c instanceof CKEDITOR.htmlParser.node || c instanceof CKEDITOR.htmlParser.fragment,
6659                    h = Array.prototype.slice.call(arguments, 1),
6660                    k = this.rules,
6661                    g = k.length,
6662                    n, r, e, y;
6663                for (y = 0; y < g; y++)
6664                    if (d && (n = c.type, r = c.name), e = k[y], !(a.nonEditable && !e.options.applyToAll ||
6665                            a.nestedEditable && e.options.excludeNestedEditable)) {
6666                        e = e.value.apply(null, h);
6667                        if (!1 === e || d && e && (e.name != r || e.type != n)) return e;
6668                        null != e && (h[0] = c = e)
6669                    } return c
6670            },
6671            execOnName: function(a, c) {
6672                for (var d = 0, h = this.rules, k = h.length, g; c && d < k; d++) g = h[d], a.nonEditable && !g.options.applyToAll || a.nestedEditable && g.options.excludeNestedEditable || (c = c.replace(g.value[0], g.value[1]));
6673                return c
6674            }
6675        }
6676    })();
6677    (function() {
6678        function a(a, d) {
6679            function e(a) {
6680                return a || CKEDITOR.env.needsNbspFiller ? new CKEDITOR.htmlParser.text(" ") : new CKEDITOR.htmlParser.element("br", {
6681                    "data-cke-bogus": 1
6682                })
6683            }
6684
6685            function p(a, d) {
6686                return function(f) {
6687                    if (f.type != CKEDITOR.NODE_DOCUMENT_FRAGMENT) {
6688                        var l = [],
6689                            w = b(f),
6690                            p, E;
6691                        if (w)
6692                            for (q(w, 1) && l.push(w); w;) h(w) && (p = c(w)) && q(p) && ((E = c(p)) && !h(E) ? l.push(p) : (e(z).insertAfter(p), p.remove())), w = w.previous;
6693                        for (w = 0; w < l.length; w++) l[w].remove();
6694                        if (l = !a || !1 !== ("function" == typeof d ? d(f) : d)) z || CKEDITOR.env.needsBrFiller ||
6695                            f.type != CKEDITOR.NODE_DOCUMENT_FRAGMENT ? z || CKEDITOR.env.needsBrFiller || !(7 < document.documentMode || f.name in CKEDITOR.dtd.tr || f.name in CKEDITOR.dtd.$listItem) ? (l = b(f), l = !l || "form" == f.name && "input" == l.name) : l = !1 : l = !1;
6696                        l && f.add(e(a))
6697                    }
6698                }
6699            }
6700
6701            function q(a, b) {
6702                if ((!z || CKEDITOR.env.needsBrFiller) && a.type == CKEDITOR.NODE_ELEMENT && "br" == a.name && !a.attributes["data-cke-eol"]) return !0;
6703                var c;
6704                return a.type == CKEDITOR.NODE_TEXT && (c = a.value.match(m)) && (c.index && ((new CKEDITOR.htmlParser.text(a.value.substring(0, c.index))).insertBefore(a),
6705                    a.value = c[0]), !CKEDITOR.env.needsBrFiller && z && (!b || a.parent.name in g) || !z && ((c = a.previous) && "br" == c.name || !c || h(c))) ? !0 : !1
6706            }
6707            var E = {
6708                    elements: {}
6709                },
6710                z = "html" == d,
6711                g = CKEDITOR.tools.extend({}, l),
6712                t;
6713            for (t in g) "#" in u[t] || delete g[t];
6714            for (t in g) E.elements[t] = p(z, a.config.fillEmptyBlocks);
6715            E.root = p(z, !1);
6716            E.elements.br = function(a) {
6717                return function(b) {
6718                    if (b.parent.type != CKEDITOR.NODE_DOCUMENT_FRAGMENT) {
6719                        var d = b.attributes;
6720                        if ("data-cke-bogus" in d || "data-cke-eol" in d) delete d["data-cke-bogus"];
6721                        else {
6722                            for (d = b.next; d && f(d);) d =
6723                                d.next;
6724                            var l = c(b);
6725                            !d && h(b.parent) ? k(b.parent, e(a)) : h(d) && l && !h(l) && e(a).insertBefore(d)
6726                        }
6727                    }
6728                }
6729            }(z);
6730            return E
6731        }
6732
6733        function d(a, b) {
6734            return a != CKEDITOR.ENTER_BR && !1 !== b ? a == CKEDITOR.ENTER_DIV ? "div" : "p" : !1
6735        }
6736
6737        function b(a) {
6738            for (a = a.children[a.children.length - 1]; a && f(a);) a = a.previous;
6739            return a
6740        }
6741
6742        function c(a) {
6743            for (a = a.previous; a && f(a);) a = a.previous;
6744            return a
6745        }
6746
6747        function f(a) {
6748            return a.type == CKEDITOR.NODE_TEXT && !CKEDITOR.tools.trim(a.value) || a.type == CKEDITOR.NODE_ELEMENT && a.attributes["data-cke-bookmark"]
6749        }
6750
6751        function h(a) {
6752            return a &&
6753                (a.type == CKEDITOR.NODE_ELEMENT && a.name in l || a.type == CKEDITOR.NODE_DOCUMENT_FRAGMENT)
6754        }
6755
6756        function k(a, b) {
6757            var c = a.children[a.children.length - 1];
6758            a.children.push(b);
6759            b.parent = a;
6760            c && (c.next = b, b.previous = c)
6761        }
6762
6763        function g(a) {
6764            a = a.attributes;
6765            "false" != a.contenteditable && (a["data-cke-editable"] = a.contenteditable ? "true" : 1);
6766            a.contenteditable = "false"
6767        }
6768
6769        function n(a) {
6770            a = a.attributes;
6771            switch (a["data-cke-editable"]) {
6772                case "true":
6773                    a.contenteditable = "true";
6774                    break;
6775                case "1":
6776                    delete a.contenteditable
6777            }
6778        }
6779
6780        function r(a) {
6781            return a.replace(M,
6782                function(a, b, c) {
6783                    return "\x3c" + b + c.replace(q, function(a, b) {
6784                        return E.test(b) && -1 == c.indexOf("data-cke-saved-" + b) ? " data-cke-saved-" + a + " data-cke-" + CKEDITOR.rnd + "-" + a : a
6785                    }) + "\x3e"
6786                })
6787        }
6788
6789        function e(a, b) {
6790            return a.replace(b, function(a, b, c) {
6791                0 === a.indexOf("\x3ctextarea") && (a = b + B(c).replace(/</g, "\x26lt;").replace(/>/g, "\x26gt;") + "\x3c/textarea\x3e");
6792                return "\x3ccke:encoded\x3e" + encodeURIComponent(a) + "\x3c/cke:encoded\x3e"
6793            })
6794        }
6795
6796        function y(a) {
6797            return a.replace(P, function(a, b) {
6798                return decodeURIComponent(b)
6799            })
6800        }
6801
6802        function v(a) {
6803            return a.replace(/\x3c!--(?!{cke_protected})[\s\S]+?--\x3e/g,
6804                function(a) {
6805                    return "\x3c!--" + J + "{C}" + encodeURIComponent(a).replace(/--/g, "%2D%2D") + "--\x3e"
6806                })
6807        }
6808
6809        function B(a) {
6810            return a.replace(/\x3c!--\{cke_protected\}\{C\}([\s\S]+?)--\x3e/g, function(a, b) {
6811                return decodeURIComponent(b)
6812            })
6813        }
6814
6815        function D(a, b) {
6816            var c = b._.dataStore;
6817            return a.replace(/\x3c!--\{cke_protected\}([\s\S]+?)--\x3e/g, function(a, b) {
6818                return decodeURIComponent(b)
6819            }).replace(/\{cke_protected_(\d+)\}/g, function(a, b) {
6820                return c && c[b] || ""
6821            })
6822        }
6823
6824        function x(a, b) {
6825            var c = [],
6826                d = b.config.protectedSource,
6827                f = b._.dataStore || (b._.dataStore = {
6828                    id: 1
6829                }),
6830                e = /<\!--\{cke_temp(comment)?\}(\d*?)--\x3e/g,
6831                d = [/<script[\s\S]*?(<\/script>|$)/gi, /<noscript[\s\S]*?<\/noscript>/gi, /<meta[\s\S]*?\/?>/gi].concat(d);
6832            a = a.replace(/\x3c!--[\s\S]*?--\x3e/g, function(a) {
6833                return "\x3c!--{cke_tempcomment}" + (c.push(a) - 1) + "--\x3e"
6834            });
6835            for (var l = 0; l < d.length; l++) a = a.replace(d[l], function(a) {
6836                a = a.replace(e, function(a, b, d) {
6837                    return c[d]
6838                });
6839                return /cke_temp(comment)?/.test(a) ? a : "\x3c!--{cke_temp}" + (c.push(a) - 1) + "--\x3e"
6840            });
6841            a = a.replace(e, function(a, b, d) {
6842                return "\x3c!--" + J + (b ? "{C}" :
6843                    "") + encodeURIComponent(c[d]).replace(/--/g, "%2D%2D") + "--\x3e"
6844            });
6845            a = a.replace(/<\w+(?:\s+(?:(?:[^\s=>]+\s*=\s*(?:[^'"\s>]+|'[^']*'|"[^"]*"))|[^\s=\/>]+))+\s*\/?>/g, function(a) {
6846                return a.replace(/\x3c!--\{cke_protected\}([^>]*)--\x3e/g, function(a, b) {
6847                    f[f.id] = decodeURIComponent(b);
6848                    return "{cke_protected_" + f.id++ + "}"
6849                })
6850            });
6851            return a = a.replace(/<(title|iframe|textarea)([^>]*)>([\s\S]*?)<\/\1>/g, function(a, c, d, f) {
6852                return "\x3c" + c + d + "\x3e" + D(B(f), b) + "\x3c/" + c + "\x3e"
6853            })
6854        }
6855        CKEDITOR.htmlDataProcessor = function(b) {
6856            var c,
6857                f, l = this;
6858            this.editor = b;
6859            this.dataFilter = c = new CKEDITOR.htmlParser.filter;
6860            this.htmlFilter = f = new CKEDITOR.htmlParser.filter;
6861            this.writer = new CKEDITOR.htmlParser.basicWriter;
6862            c.addRules(t);
6863            c.addRules(F, {
6864                applyToAll: !0
6865            });
6866            c.addRules(a(b, "data"), {
6867                applyToAll: !0
6868            });
6869            f.addRules(L);
6870            f.addRules(C, {
6871                applyToAll: !0
6872            });
6873            f.addRules(a(b, "html"), {
6874                applyToAll: !0
6875            });
6876            b.on("toHtml", function(a) {
6877                a = a.data;
6878                var c = a.dataValue,
6879                    f, c = x(c, b),
6880                    c = e(c, H),
6881                    c = r(c),
6882                    c = e(c, z),
6883                    c = c.replace(O, "$1cke:$2"),
6884                    c = c.replace(N, "\x3ccke:$1$2\x3e\x3c/cke:$1\x3e"),
6885                    c = c.replace(/(<pre\b[^>]*>)(\r\n|\n)/g, "$1$2$2"),
6886                    c = c.replace(/([^a-z0-9<\-])(on\w{3,})(?!>)/gi, "$1data-cke-" + CKEDITOR.rnd + "-$2");
6887                f = a.context || b.editable().getName();
6888                var l;
6889                CKEDITOR.env.ie && 9 > CKEDITOR.env.version && "pre" == f && (f = "div", c = "\x3cpre\x3e" + c + "\x3c/pre\x3e", l = 1);
6890                f = b.document.createElement(f);
6891                f.setHtml("a" + c);
6892                c = f.getHtml().substr(1);
6893                c = c.replace(new RegExp("data-cke-" + CKEDITOR.rnd + "-", "ig"), "");
6894                l && (c = c.replace(/^<pre>|<\/pre>$/gi, ""));
6895                c = c.replace(p, "$1$2");
6896                c = y(c);
6897                c = B(c);
6898                f = !1 === a.fixForBody ? !1 :
6899                    d(a.enterMode, b.config.autoParagraph);
6900                c = CKEDITOR.htmlParser.fragment.fromHtml(c, a.context, f);
6901                f && (l = c, !l.children.length && CKEDITOR.dtd[l.name][f] && (f = new CKEDITOR.htmlParser.element(f), l.add(f)));
6902                a.dataValue = c
6903            }, null, null, 5);
6904            b.on("toHtml", function(a) {
6905                a.data.filter.applyTo(a.data.dataValue, !0, a.data.dontFilter, a.data.enterMode) && b.fire("dataFiltered")
6906            }, null, null, 6);
6907            b.on("toHtml", function(a) {
6908                a.data.dataValue.filterChildren(l.dataFilter, !0)
6909            }, null, null, 10);
6910            b.on("toHtml", function(a) {
6911                a = a.data;
6912                var b = a.dataValue,
6913                    c = new CKEDITOR.htmlParser.basicWriter;
6914                b.writeChildrenHtml(c);
6915                b = c.getHtml(!0);
6916                a.dataValue = v(b)
6917            }, null, null, 15);
6918            b.on("toDataFormat", function(a) {
6919                var c = a.data.dataValue;
6920                a.data.enterMode != CKEDITOR.ENTER_BR && (c = c.replace(/^<br *\/?>/i, ""));
6921                a.data.dataValue = CKEDITOR.htmlParser.fragment.fromHtml(c, a.data.context, d(a.data.enterMode, b.config.autoParagraph))
6922            }, null, null, 5);
6923            b.on("toDataFormat", function(a) {
6924                a.data.dataValue.filterChildren(l.htmlFilter, !0)
6925            }, null, null, 10);
6926            b.on("toDataFormat", function(a) {
6927                a.data.filter.applyTo(a.data.dataValue,
6928                    !1, !0)
6929            }, null, null, 11);
6930            b.on("toDataFormat", function(a) {
6931                var c = a.data.dataValue,
6932                    d = l.writer;
6933                d.reset();
6934                c.writeChildrenHtml(d);
6935                c = d.getHtml(!0);
6936                c = B(c);
6937                c = D(c, b);
6938                a.data.dataValue = c
6939            }, null, null, 15)
6940        };
6941        CKEDITOR.htmlDataProcessor.prototype = {
6942            toHtml: function(a, b, c, d) {
6943                var f = this.editor,
6944                    e, l, p, h;
6945                b && "object" == typeof b ? (e = b.context, c = b.fixForBody, d = b.dontFilter, l = b.filter, p = b.enterMode, h = b.protectedWhitespaces) : e = b;
6946                e || null === e || (e = f.editable().getName());
6947                return f.fire("toHtml", {
6948                    dataValue: a,
6949                    context: e,
6950                    fixForBody: c,
6951                    dontFilter: d,
6952                    filter: l || f.filter,
6953                    enterMode: p || f.enterMode,
6954                    protectedWhitespaces: h
6955                }).dataValue
6956            },
6957            toDataFormat: function(a, b) {
6958                var c, d, f;
6959                b && (c = b.context, d = b.filter, f = b.enterMode);
6960                c || null === c || (c = this.editor.editable().getName());
6961                return this.editor.fire("toDataFormat", {
6962                    dataValue: a,
6963                    filter: d || this.editor.filter,
6964                    context: c,
6965                    enterMode: f || this.editor.enterMode
6966                }).dataValue
6967            }
6968        };
6969        var m = /(?:&nbsp;|\xa0)$/,
6970            J = "{cke_protected}",
6971            u = CKEDITOR.dtd,
6972            K = "caption colgroup col thead tfoot tbody".split(" "),
6973            l = CKEDITOR.tools.extend({}, u.$blockLimit,
6974                u.$block),
6975            t = {
6976                elements: {
6977                    input: g,
6978                    textarea: g
6979                }
6980            },
6981            F = {
6982                attributeNames: [
6983                    [/^on/, "data-cke-pa-on"],
6984                    [/^srcdoc/, "data-cke-pa-srcdoc"],
6985                    [/^data-cke-expando$/, ""]
6986                ],
6987                elements: {
6988                    iframe: function(a) {
6989                        if (a.attributes && a.attributes.src) {
6990                            var b = a.attributes.src.toLowerCase().replace(/[^a-z]/gi, "");
6991                            if (0 === b.indexOf("javascript") || 0 === b.indexOf("data")) a.attributes["data-cke-pa-src"] = a.attributes.src, delete a.attributes.src
6992                        }
6993                    }
6994                }
6995            },
6996            L = {
6997                elements: {
6998                    embed: function(a) {
6999                        var b = a.parent;
7000                        if (b && "object" == b.name) {
7001                            var c = b.attributes.width,
7002                                b = b.attributes.height;
7003                            c && (a.attributes.width = c);
7004                            b && (a.attributes.height = b)
7005                        }
7006                    },
7007                    a: function(a) {
7008                        var b = a.attributes;
7009                        if (!(a.children.length || b.name || b.id || a.attributes["data-cke-saved-name"])) return !1
7010                    }
7011                }
7012            },
7013            C = {
7014                elementNames: [
7015                    [/^cke:/, ""],
7016                    [/^\?xml:namespace$/, ""]
7017                ],
7018                attributeNames: [
7019                    [/^data-cke-(saved|pa)-/, ""],
7020                    [/^data-cke-.*/, ""],
7021                    ["hidefocus", ""]
7022                ],
7023                elements: {
7024                    $: function(a) {
7025                        var b = a.attributes;
7026                        if (b) {
7027                            if (b["data-cke-temp"]) return !1;
7028                            for (var c = ["name", "href", "src"], d, f = 0; f < c.length; f++) d = "data-cke-saved-" + c[f], d in b && delete b[c[f]]
7029                        }
7030                        return a
7031                    },
7032                    table: function(a) {
7033                        a.children.slice(0).sort(function(a, b) {
7034                            var c, d;
7035                            a.type == CKEDITOR.NODE_ELEMENT && b.type == a.type && (c = CKEDITOR.tools.indexOf(K, a.name), d = CKEDITOR.tools.indexOf(K, b.name)); - 1 < c && -1 < d && c != d || (c = a.parent ? a.getIndex() : -1, d = b.parent ? b.getIndex() : -1);
7036                            return c > d ? 1 : -1
7037                        })
7038                    },
7039                    param: function(a) {
7040                        a.children = [];
7041                        a.isEmpty = !0;
7042                        return a
7043                    },
7044                    span: function(a) {
7045                        "Apple-style-span" == a.attributes["class"] && delete a.name
7046                    },
7047                    html: function(a) {
7048                        delete a.attributes.contenteditable;
7049                        delete a.attributes["class"]
7050                    },
7051                    body: function(a) {
7052                        delete a.attributes.spellcheck;
7053                        delete a.attributes.contenteditable
7054                    },
7055                    style: function(a) {
7056                        var b = a.children[0];
7057                        b && b.value && (b.value = CKEDITOR.tools.trim(b.value));
7058                        a.attributes.type || (a.attributes.type = "text/css")
7059                    },
7060                    title: function(a) {
7061                        var b = a.children[0];
7062                        !b && k(a, b = new CKEDITOR.htmlParser.text);
7063                        b.value = a.attributes["data-cke-title"] || ""
7064                    },
7065                    input: n,
7066                    textarea: n
7067                },
7068                attributes: {
7069                    "class": function(a) {
7070                        return CKEDITOR.tools.ltrim(a.replace(/(?:^|\s+)cke_[^\s]*/g, "")) || !1
7071                    }
7072                }
7073            };
7074        CKEDITOR.env.ie && (C.attributes.style = function(a) {
7075            return a.replace(/(^|;)([^\:]+)/g,
7076                function(a) {
7077                    return a.toLowerCase()
7078                })
7079        });
7080        var M = /<(a|area|img|input|source)\b([^>]*)>/gi,
7081            q = /([\w-:]+)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+))/gi,
7082            E = /^(href|src|name)$/i,
7083            z = /(?:<style(?=[ >])[^>]*>[\s\S]*?<\/style>)|(?:<(:?link|meta|base)[^>]*>)/gi,
7084            H = /(<textarea(?=[ >])[^>]*>)([\s\S]*?)(?:<\/textarea>)/gi,
7085            P = /<cke:encoded>([^<]*)<\/cke:encoded>/gi,
7086            O = /(<\/?)((?:object|embed|param|html|body|head|title)([\s][^>]*)?>)/gi,
7087            p = /(<\/?)cke:((?:html|body|head|title)[^>]*>)/gi,
7088            N = /<cke:(param|embed)([^>]*?)\/?>(?!\s*<\/cke:\1)/gi
7089    })();
7090    "use strict";
7091    CKEDITOR.htmlParser.element = function(a, d) {
7092        this.name = a;
7093        this.attributes = d || {};
7094        this.children = [];
7095        var b = a || "",
7096            c = b.match(/^cke:(.*)/);
7097        c && (b = c[1]);
7098        b = !!(CKEDITOR.dtd.$nonBodyContent[b] || CKEDITOR.dtd.$block[b] || CKEDITOR.dtd.$listItem[b] || CKEDITOR.dtd.$tableContent[b] || CKEDITOR.dtd.$nonEditable[b] || "br" == b);
7099        this.isEmpty = !!CKEDITOR.dtd.$empty[a];
7100        this.isUnknown = !CKEDITOR.dtd[a];
7101        this._ = {
7102            isBlockLike: b,
7103            hasInlineStarted: this.isEmpty || !b
7104        }
7105    };
7106    CKEDITOR.htmlParser.cssStyle = function(a) {
7107        var d = {};
7108        ((a instanceof CKEDITOR.htmlParser.element ? a.attributes.style : a) || "").replace(/&quot;/g, '"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g, function(a, c, f) {
7109            "font-family" == c && (f = f.replace(/["']/g, ""));
7110            d[c.toLowerCase()] = f
7111        });
7112        return {
7113            rules: d,
7114            populate: function(a) {
7115                var c = this.toString();
7116                c && (a instanceof CKEDITOR.dom.element ? a.setAttribute("style", c) : a instanceof CKEDITOR.htmlParser.element ? a.attributes.style = c : a.style = c)
7117            },
7118            toString: function() {
7119                var a = [],
7120                    c;
7121                for (c in d) d[c] && a.push(c, ":", d[c], ";");
7122                return a.join("")
7123            }
7124        }
7125    };
7126    (function() {
7127        function a(a) {
7128            return function(b) {
7129                return b.type == CKEDITOR.NODE_ELEMENT && ("string" == typeof a ? b.name == a : b.name in a)
7130            }
7131        }
7132        var d = function(a, b) {
7133                a = a[0];
7134                b = b[0];
7135                return a < b ? -1 : a > b ? 1 : 0
7136            },
7137            b = CKEDITOR.htmlParser.fragment.prototype;
7138        CKEDITOR.htmlParser.element.prototype = CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node, {
7139            type: CKEDITOR.NODE_ELEMENT,
7140            add: b.add,
7141            clone: function() {
7142                return new CKEDITOR.htmlParser.element(this.name, this.attributes)
7143            },
7144            filter: function(a, b) {
7145                var d = this,
7146                    k, g;
7147                b = d.getFilterContext(b);
7148                if (b.off) return !0;
7149                if (!d.parent) a.onRoot(b, d);
7150                for (;;) {
7151                    k = d.name;
7152                    if (!(g = a.onElementName(b, k))) return this.remove(), !1;
7153                    d.name = g;
7154                    if (!(d = a.onElement(b, d))) return this.remove(), !1;
7155                    if (d !== this) return this.replaceWith(d), !1;
7156                    if (d.name == k) break;
7157                    if (d.type != CKEDITOR.NODE_ELEMENT) return this.replaceWith(d), !1;
7158                    if (!d.name) return this.replaceWithChildren(), !1
7159                }
7160                k = d.attributes;
7161                var n, r;
7162                for (n in k) {
7163                    for (g = k[n];;)
7164                        if (r = a.onAttributeName(b, n))
7165                            if (r != n) delete k[n], n = r;
7166                            else break;
7167                    else {
7168                        delete k[n];
7169                        break
7170                    }
7171                    r && (!1 === (g = a.onAttribute(b, d, r, g)) ? delete k[r] :
7172                        k[r] = g)
7173                }
7174                d.isEmpty || this.filterChildren(a, !1, b);
7175                return !0
7176            },
7177            filterChildren: b.filterChildren,
7178            writeHtml: function(a, b) {
7179                b && this.filter(b);
7180                var h = this.name,
7181                    k = [],
7182                    g = this.attributes,
7183                    n, r;
7184                a.openTag(h, g);
7185                for (n in g) k.push([n, g[n]]);
7186                a.sortAttributes && k.sort(d);
7187                n = 0;
7188                for (r = k.length; n < r; n++) g = k[n], a.attribute(g[0], g[1]);
7189                a.openTagClose(h, this.isEmpty);
7190                this.writeChildrenHtml(a);
7191                this.isEmpty || a.closeTag(h)
7192            },
7193            writeChildrenHtml: b.writeChildrenHtml,
7194            replaceWithChildren: function() {
7195                for (var a = this.children, b = a.length; b;) a[--b].insertAfter(this);
7196                this.remove()
7197            },
7198            forEach: b.forEach,
7199            getFirst: function(b) {
7200                if (!b) return this.children.length ? this.children[0] : null;
7201                "function" != typeof b && (b = a(b));
7202                for (var d = 0, h = this.children.length; d < h; ++d)
7203                    if (b(this.children[d])) return this.children[d];
7204                return null
7205            },
7206            getHtml: function() {
7207                var a = new CKEDITOR.htmlParser.basicWriter;
7208                this.writeChildrenHtml(a);
7209                return a.getHtml()
7210            },
7211            setHtml: function(a) {
7212                a = this.children = CKEDITOR.htmlParser.fragment.fromHtml(a).children;
7213                for (var b = 0, d = a.length; b < d; ++b) a[b].parent = this
7214            },
7215            getOuterHtml: function() {
7216                var a =
7217                    new CKEDITOR.htmlParser.basicWriter;
7218                this.writeHtml(a);
7219                return a.getHtml()
7220            },
7221            split: function(a) {
7222                for (var b = this.children.splice(a, this.children.length - a), d = this.clone(), k = 0; k < b.length; ++k) b[k].parent = d;
7223                d.children = b;
7224                b[0] && (b[0].previous = null);
7225                0 < a && (this.children[a - 1].next = null);
7226                this.parent.add(d, this.getIndex() + 1);
7227                return d
7228            },
7229            find: function(a, b) {
7230                void 0 === b && (b = !1);
7231                var d = [],
7232                    k;
7233                for (k = 0; k < this.children.length; k++) {
7234                    var g = this.children[k];
7235                    "function" == typeof a && a(g) ? d.push(g) : "string" == typeof a && g.name === a && d.push(g);
7236                    b && g.find && (d = d.concat(g.find(a, b)))
7237                }
7238                return d
7239            },
7240            addClass: function(a) {
7241                if (!this.hasClass(a)) {
7242                    var b = this.attributes["class"] || "";
7243                    this.attributes["class"] = b + (b ? " " : "") + a
7244                }
7245            },
7246            removeClass: function(a) {
7247                var b = this.attributes["class"];
7248                b && ((b = CKEDITOR.tools.trim(b.replace(new RegExp("(?:\\s+|^)" + a + "(?:\\s+|$)"), " "))) ? this.attributes["class"] = b : delete this.attributes["class"])
7249            },
7250            hasClass: function(a) {
7251                var b = this.attributes["class"];
7252                return b ? (new RegExp("(?:^|\\s)" + a + "(?\x3d\\s|$)")).test(b) : !1
7253            },
7254            getFilterContext: function(a) {
7255                var b = [];
7256                a || (a = {
7257                    off: !1,
7258                    nonEditable: !1,
7259                    nestedEditable: !1
7260                });
7261                a.off || "off" != this.attributes["data-cke-processor"] || b.push("off", !0);
7262                a.nonEditable || "false" != this.attributes.contenteditable ? a.nonEditable && !a.nestedEditable && "true" == this.attributes.contenteditable && b.push("nestedEditable", !0) : b.push("nonEditable", !0);
7263                if (b.length) {
7264                    a = CKEDITOR.tools.copy(a);
7265                    for (var d = 0; d < b.length; d += 2) a[b[d]] = b[d + 1]
7266                }
7267                return a
7268            }
7269        }, !0)
7270    })();
7271    (function() {
7272        var a = /{([^}]+)}/g;
7273        CKEDITOR.template = function(a) {
7274            this.source = String(a)
7275        };
7276        CKEDITOR.template.prototype.output = function(d, b) {
7277            var c = this.source.replace(a, function(a, b) {
7278                return void 0 !== d[b] ? d[b] : a
7279            });
7280            return b ? b.push(c) : c
7281        }
7282    })();
7283    delete CKEDITOR.loadFullCore;
7284    CKEDITOR.instances = {};
7285    CKEDITOR.document = new CKEDITOR.dom.document(document);
7286    CKEDITOR.add = function(a) {
7287        CKEDITOR.instances[a.name] = a;
7288        a.on("focus", function() {
7289            CKEDITOR.currentInstance != a && (CKEDITOR.currentInstance = a, CKEDITOR.fire("currentInstance"))
7290        });
7291        a.on("blur", function() {
7292            CKEDITOR.currentInstance == a && (CKEDITOR.currentInstance = null, CKEDITOR.fire("currentInstance"))
7293        });
7294        CKEDITOR.fire("instance", null, a)
7295    };
7296    CKEDITOR.remove = function(a) {
7297        delete CKEDITOR.instances[a.name]
7298    };
7299    (function() {
7300        var a = {};
7301        CKEDITOR.addTemplate = function(d, b) {
7302            var c = a[d];
7303            if (c) return c;
7304            c = {
7305                name: d,
7306                source: b
7307            };
7308            CKEDITOR.fire("template", c);
7309            return a[d] = new CKEDITOR.template(c.source)
7310        };
7311        CKEDITOR.getTemplate = function(d) {
7312            return a[d]
7313        }
7314    })();
7315    (function() {
7316        var a = [];
7317        CKEDITOR.addCss = function(d) {
7318            a.push(d)
7319        };
7320        CKEDITOR.getCss = function() {
7321            return a.join("\n")
7322        }
7323    })();
7324    CKEDITOR.on("instanceDestroyed", function() {
7325        CKEDITOR.tools.isEmpty(this.instances) && CKEDITOR.fire("reset")
7326    });
7327    CKEDITOR.TRISTATE_ON = 1;
7328    CKEDITOR.TRISTATE_OFF = 2;
7329    CKEDITOR.TRISTATE_DISABLED = 0;
7330    (function() {
7331        CKEDITOR.inline = function(a, d) {
7332            if (!CKEDITOR.env.isCompatible) return null;
7333            a = CKEDITOR.dom.element.get(a);
7334            if (a.getEditor()) throw 'The editor instance "' + a.getEditor().name + '" is already attached to the provided element.';
7335            var b = new CKEDITOR.editor(d, a, CKEDITOR.ELEMENT_MODE_INLINE),
7336                c = a.is("textarea") ? a : null;
7337            c ? (b.setData(c.getValue(), null, !0), a = CKEDITOR.dom.element.createFromHtml('\x3cdiv contenteditable\x3d"' + !!b.readOnly + '" class\x3d"cke_textarea_inline"\x3e' + c.getValue() + "\x3c/div\x3e", CKEDITOR.document),
7338                a.insertAfter(c), c.hide(), c.$.form && b._attachToForm()) : b.setData(a.getHtml(), null, !0);
7339            b.on("loaded", function() {
7340                b.fire("uiReady");
7341                b.editable(a);
7342                b.container = a;
7343                b.ui.contentsElement = a;
7344                b.setData(b.getData(1));
7345                b.resetDirty();
7346                b.fire("contentDom");
7347                b.mode = "wysiwyg";
7348                b.fire("mode");
7349                b.status = "ready";
7350                b.fireOnce("instanceReady");
7351                CKEDITOR.fire("instanceReady", null, b)
7352            }, null, null, 1E4);
7353            b.on("destroy", function() {
7354                c && (b.container.clearCustomData(), b.container.remove(), c.show());
7355                b.element.clearCustomData();
7356                delete b.element
7357            });
7358            return b
7359        };
7360        CKEDITOR.inlineAll = function() {
7361            var a, d, b;
7362            for (b in CKEDITOR.dtd.$editable)
7363                for (var c = CKEDITOR.document.getElementsByTag(b), f = 0, h = c.count(); f < h; f++) a = c.getItem(f), "true" == a.getAttribute("contenteditable") && (d = {
7364                    element: a,
7365                    config: {}
7366                }, !1 !== CKEDITOR.fire("inline", d) && CKEDITOR.inline(a, d.config))
7367        };
7368        CKEDITOR.domReady(function() {
7369            !CKEDITOR.disableAutoInline && CKEDITOR.inlineAll()
7370        })
7371    })();
7372    CKEDITOR.replaceClass = "ckeditor";
7373    (function() {
7374        function a(a, f, h, k) {
7375            if (!CKEDITOR.env.isCompatible) return null;
7376            a = CKEDITOR.dom.element.get(a);
7377            if (a.getEditor()) throw 'The editor instance "' + a.getEditor().name + '" is already attached to the provided element.';
7378            var g = new CKEDITOR.editor(f, a, k);
7379            k == CKEDITOR.ELEMENT_MODE_REPLACE && (a.setStyle("visibility", "hidden"), g._.required = a.hasAttribute("required"), a.removeAttribute("required"));
7380            h && g.setData(h, null, !0);
7381            g.on("loaded", function() {
7382                b(g);
7383                k == CKEDITOR.ELEMENT_MODE_REPLACE && g.config.autoUpdateElement &&
7384                    a.$.form && g._attachToForm();
7385                g.setMode(g.config.startupMode, function() {
7386                    g.resetDirty();
7387                    g.status = "ready";
7388                    g.fireOnce("instanceReady");
7389                    CKEDITOR.fire("instanceReady", null, g)
7390                })
7391            });
7392            g.on("destroy", d);
7393            return g
7394        }
7395
7396        function d() {
7397            var a = this.container,
7398                b = this.element;
7399            a && (a.clearCustomData(), a.remove());
7400            b && (b.clearCustomData(), this.elementMode == CKEDITOR.ELEMENT_MODE_REPLACE && (b.show(), this._.required && b.setAttribute("required", "required")), delete this.element)
7401        }
7402
7403        function b(a) {
7404            var b = a.name,
7405                d = a.element,
7406                k = a.elementMode,
7407                g =
7408                a.fire("uiSpace", {
7409                    space: "top",
7410                    html: ""
7411                }).html,
7412                n = a.fire("uiSpace", {
7413                    space: "bottom",
7414                    html: ""
7415                }).html,
7416                r = new CKEDITOR.template('\x3c{outerEl} id\x3d"cke_{name}" class\x3d"{id} cke cke_reset cke_chrome cke_editor_{name} cke_{langDir} ' + CKEDITOR.env.cssClass + '"  dir\x3d"{langDir}" lang\x3d"{langCode}" role\x3d"application"' + (a.title ? ' aria-labelledby\x3d"cke_{name}_arialbl"' : "") + "\x3e" + (a.title ? '\x3cspan id\x3d"cke_{name}_arialbl" class\x3d"cke_voice_label"\x3e{voiceLabel}\x3c/span\x3e' : "") + '\x3c{outerEl} class\x3d"cke_inner cke_reset" role\x3d"presentation"\x3e{topHtml}\x3c{outerEl} id\x3d"{contentId}" class\x3d"cke_contents cke_reset" role\x3d"presentation"\x3e\x3c/{outerEl}\x3e{bottomHtml}\x3c/{outerEl}\x3e\x3c/{outerEl}\x3e'),
7417                b = CKEDITOR.dom.element.createFromHtml(r.output({
7418                    id: a.id,
7419                    name: b,
7420                    langDir: a.lang.dir,
7421                    langCode: a.langCode,
7422                    voiceLabel: a.title,
7423                    topHtml: g ? '\x3cspan id\x3d"' + a.ui.spaceId("top") + '" class\x3d"cke_top cke_reset_all" role\x3d"presentation" style\x3d"height:auto"\x3e' + g + "\x3c/span\x3e" : "",
7424                    contentId: a.ui.spaceId("contents"),
7425                    bottomHtml: n ? '\x3cspan id\x3d"' + a.ui.spaceId("bottom") + '" class\x3d"cke_bottom cke_reset_all" role\x3d"presentation"\x3e' + n + "\x3c/span\x3e" : "",
7426                    outerEl: CKEDITOR.env.ie ? "span" : "div"
7427                }));
7428            k == CKEDITOR.ELEMENT_MODE_REPLACE ?
7429                (d.hide(), b.insertAfter(d)) : d.append(b);
7430            a.container = b;
7431            a.ui.contentsElement = a.ui.space("contents");
7432            g && a.ui.space("top").unselectable();
7433            n && a.ui.space("bottom").unselectable();
7434            d = a.config.width;
7435            k = a.config.height;
7436            d && b.setStyle("width", CKEDITOR.tools.cssLength(d));
7437            k && a.ui.space("contents").setStyle("height", CKEDITOR.tools.cssLength(k));
7438            b.disableContextMenu();
7439            CKEDITOR.env.webkit && b.on("focus", function() {
7440                a.focus()
7441            });
7442            a.fireOnce("uiReady")
7443        }
7444        CKEDITOR.replace = function(b, d) {
7445            return a(b, d, null, CKEDITOR.ELEMENT_MODE_REPLACE)
7446        };
7447        CKEDITOR.appendTo = function(b, d, h) {
7448            return a(b, d, h, CKEDITOR.ELEMENT_MODE_APPENDTO)
7449        };
7450        CKEDITOR.replaceAll = function() {
7451            for (var a = document.getElementsByTagName("textarea"), b = 0; b < a.length; b++) {
7452                var d = null,
7453                    k = a[b];
7454                if (k.name || k.id) {
7455                    if ("string" == typeof arguments[0]) {
7456                        if (!(new RegExp("(?:^|\\s)" + arguments[0] + "(?:$|\\s)")).test(k.className)) continue
7457                    } else if ("function" == typeof arguments[0] && (d = {}, !1 === arguments[0](k, d))) continue;
7458                    this.replace(k, d)
7459                }
7460            }
7461        };
7462        CKEDITOR.editor.prototype.addMode = function(a, b) {
7463            (this._.modes || (this._.modes = {}))[a] = b
7464        };
7465        CKEDITOR.editor.prototype.setMode = function(a, b) {
7466            var d = this,
7467                k = this._.modes;
7468            if (a != d.mode && k && k[a]) {
7469                d.fire("beforeSetMode", a);
7470                if (d.mode) {
7471                    var g = d.checkDirty(),
7472                        k = d._.previousModeData,
7473                        n, r = 0;
7474                    d.fire("beforeModeUnload");
7475                    d.editable(0);
7476                    d._.previousMode = d.mode;
7477                    d._.previousModeData = n = d.getData(1);
7478                    "source" == d.mode && k == n && (d.fire("lockSnapshot", {
7479                        forceUpdate: !0
7480                    }), r = 1);
7481                    d.ui.space("contents").setHtml("");
7482                    d.mode = ""
7483                } else d._.previousModeData = d.getData(1);
7484                this._.modes[a](function() {
7485                    d.mode = a;
7486                    void 0 !== g && !g &&
7487                        d.resetDirty();
7488                    r ? d.fire("unlockSnapshot") : "wysiwyg" == a && d.fire("saveSnapshot");
7489                    setTimeout(function() {
7490                        d.fire("mode");
7491                        b && b.call(d)
7492                    }, 0)
7493                })
7494            }
7495        };
7496        CKEDITOR.editor.prototype.resize = function(a, b, d, k) {
7497            var g = this.container,
7498                n = this.ui.space("contents"),
7499                r = CKEDITOR.env.webkit && this.document && this.document.getWindow().$.frameElement;
7500            k = k ? this.container.getFirst(function(a) {
7501                return a.type == CKEDITOR.NODE_ELEMENT && a.hasClass("cke_inner")
7502            }) : g;
7503            k.setSize("width", a, !0);
7504            r && (r.style.width = "1%");
7505            var e = (k.$.offsetHeight || 0) - (n.$.clientHeight ||
7506                    0),
7507                g = Math.max(b - (d ? 0 : e), 0);
7508            b = d ? b + e : b;
7509            n.setStyle("height", g + "px");
7510            r && (r.style.width = "100%");
7511            this.fire("resize", {
7512                outerHeight: b,
7513                contentsHeight: g,
7514                outerWidth: a || k.getSize("width")
7515            })
7516        };
7517        CKEDITOR.editor.prototype.getResizable = function(a) {
7518            return a ? this.ui.space("contents") : this.container
7519        };
7520        CKEDITOR.domReady(function() {
7521            CKEDITOR.replaceClass && CKEDITOR.replaceAll(CKEDITOR.replaceClass)
7522        })
7523    })();
7524    CKEDITOR.config.startupMode = "wysiwyg";
7525    (function() {
7526        function a(a) {
7527            var b = a.editor,
7528                e = a.data.path,
7529                f = e.blockLimit,
7530                g = a.data.selection,
7531                h = g.getRanges()[0],
7532                q;
7533            if (CKEDITOR.env.gecko || CKEDITOR.env.ie && CKEDITOR.env.needsBrFiller)
7534                if (g = d(g, e)) g.appendBogus(), q = CKEDITOR.env.ie;
7535            k(b, e.block, f) && h.collapsed && !h.getCommonAncestor().isReadOnly() && (e = h.clone(), e.enlarge(CKEDITOR.ENLARGE_BLOCK_CONTENTS), f = new CKEDITOR.dom.walker(e), f.guard = function(a) {
7536                    return !c(a) || a.type == CKEDITOR.NODE_COMMENT || a.isReadOnly()
7537                }, !f.checkForward() || e.checkStartOfBlock() && e.checkEndOfBlock()) &&
7538                (b = h.fixBlock(!0, b.activeEnterMode == CKEDITOR.ENTER_DIV ? "div" : "p"), CKEDITOR.env.needsBrFiller || (b = b.getFirst(c)) && b.type == CKEDITOR.NODE_TEXT && CKEDITOR.tools.trim(b.getText()).match(/^(?:&nbsp;|\xa0)$/) && b.remove(), q = 1, a.cancel());
7539            q && h.select()
7540        }
7541
7542        function d(a, b) {
7543            if (a.isFake) return 0;
7544            var d = b.block || b.blockLimit,
7545                e = d && d.getLast(c);
7546            if (!(!d || !d.isBlockBoundary() || e && e.type == CKEDITOR.NODE_ELEMENT && e.isBlockBoundary() || d.is("pre") || d.getBogus())) return d
7547        }
7548
7549        function b(a) {
7550            var b = a.data.getTarget();
7551            b.is("input") &&
7552                (b = b.getAttribute("type"), "submit" != b && "reset" != b || a.data.preventDefault())
7553        }
7554
7555        function c(a) {
7556            return e(a) && y(a)
7557        }
7558
7559        function f(a, b) {
7560            return function(c) {
7561                var d = c.data.$.toElement || c.data.$.fromElement || c.data.$.relatedTarget;
7562                (d = d && d.nodeType == CKEDITOR.NODE_ELEMENT ? new CKEDITOR.dom.element(d) : null) && (b.equals(d) || b.contains(d)) || a.call(this, c)
7563            }
7564        }
7565
7566        function h(a) {
7567            function b(a) {
7568                return function(b, e) {
7569                    e && b.type == CKEDITOR.NODE_ELEMENT && b.is(f) && (d = b);
7570                    if (!(e || !c(b) || a && B(b))) return !1
7571                }
7572            }
7573            var d, e = a.getRanges()[0];
7574            a = a.root;
7575            var f = {
7576                table: 1,
7577                ul: 1,
7578                ol: 1,
7579                dl: 1
7580            };
7581            if (e.startPath().contains(f)) {
7582                var g = e.clone();
7583                g.collapse(1);
7584                g.setStartAt(a, CKEDITOR.POSITION_AFTER_START);
7585                a = new CKEDITOR.dom.walker(g);
7586                a.guard = b();
7587                a.checkBackward();
7588                if (d) return g = e.clone(), g.collapse(), g.setEndAt(d, CKEDITOR.POSITION_AFTER_END), a = new CKEDITOR.dom.walker(g), a.guard = b(!0), d = !1, a.checkForward(), d
7589            }
7590            return null
7591        }
7592
7593        function k(a, b, c) {
7594            return !1 !== a.config.autoParagraph && a.activeEnterMode != CKEDITOR.ENTER_BR && (a.editable().equals(c) && !b || b && "true" == b.getAttribute("contenteditable"))
7595        }
7596
7597        function g(a) {
7598            return a.activeEnterMode != CKEDITOR.ENTER_BR && !1 !== a.config.autoParagraph ? a.activeEnterMode == CKEDITOR.ENTER_DIV ? "div" : "p" : !1
7599        }
7600
7601        function n(a) {
7602            var b = a.editor;
7603            b.getSelection().scrollIntoView();
7604            setTimeout(function() {
7605                b.fire("saveSnapshot")
7606            }, 0)
7607        }
7608
7609        function r(a, b, c) {
7610            var d = a.getCommonAncestor(b);
7611            for (b = a = c ? b : a;
7612                (a = a.getParent()) && !d.equals(a) && 1 == a.getChildCount();) b = a;
7613            b.remove()
7614        }
7615        var e, y, v, B, D, x, m, J, u, K;
7616        CKEDITOR.editable = CKEDITOR.tools.createClass({
7617            base: CKEDITOR.dom.element,
7618            $: function(a, b) {
7619                this.base(b.$ ||
7620                    b);
7621                this.editor = a;
7622                this.status = "unloaded";
7623                this.hasFocus = !1;
7624                this.setup()
7625            },
7626            proto: {
7627                focus: function() {
7628                    var a;
7629                    if (CKEDITOR.env.webkit && !this.hasFocus && (a = this.editor._.previousActive || this.getDocument().getActive(), this.contains(a))) {
7630                        a.focus();
7631                        return
7632                    }
7633                    CKEDITOR.env.edge && 14 < CKEDITOR.env.version && !this.hasFocus && this.getDocument().equals(CKEDITOR.document) && (this.editor._.previousScrollTop = this.$.scrollTop);
7634                    try {
7635                        if (!CKEDITOR.env.ie || CKEDITOR.env.edge && 14 < CKEDITOR.env.version || !this.getDocument().equals(CKEDITOR.document))
7636                            if (CKEDITOR.env.chrome) {
7637                                var b =
7638                                    this.$.scrollTop;
7639                                this.$.focus();
7640                                this.$.scrollTop = b
7641                            } else this.$.focus();
7642                        else this.$.setActive()
7643                    } catch (c) {
7644                        if (!CKEDITOR.env.ie) throw c;
7645                    }
7646                    CKEDITOR.env.safari && !this.isInline() && (a = CKEDITOR.document.getActive(), a.equals(this.getWindow().getFrame()) || this.getWindow().focus())
7647                },
7648                on: function(a, b) {
7649                    var c = Array.prototype.slice.call(arguments, 0);
7650                    CKEDITOR.env.ie && /^focus|blur$/.exec(a) && (a = "focus" == a ? "focusin" : "focusout", b = f(b, this), c[0] = a, c[1] = b);
7651                    return CKEDITOR.dom.element.prototype.on.apply(this, c)
7652                },
7653                attachListener: function(a) {
7654                    !this._.listeners &&
7655                        (this._.listeners = []);
7656                    var b = Array.prototype.slice.call(arguments, 1),
7657                        b = a.on.apply(a, b);
7658                    this._.listeners.push(b);
7659                    return b
7660                },
7661                clearListeners: function() {
7662                    var a = this._.listeners;
7663                    try {
7664                        for (; a.length;) a.pop().removeListener()
7665                    } catch (b) {}
7666                },
7667                restoreAttrs: function() {
7668                    var a = this._.attrChanges,
7669                        b, c;
7670                    for (c in a) a.hasOwnProperty(c) && (b = a[c], null !== b ? this.setAttribute(c, b) : this.removeAttribute(c))
7671                },
7672                attachClass: function(a) {
7673                    var b = this.getCustomData("classes");
7674                    this.hasClass(a) || (!b && (b = []), b.push(a), this.setCustomData("classes",
7675                        b), this.addClass(a))
7676                },
7677                changeAttr: function(a, b) {
7678                    var c = this.getAttribute(a);
7679                    b !== c && (!this._.attrChanges && (this._.attrChanges = {}), a in this._.attrChanges || (this._.attrChanges[a] = c), this.setAttribute(a, b))
7680                },
7681                insertText: function(a) {
7682                    this.editor.focus();
7683                    this.insertHtml(this.transformPlainTextToHtml(a), "text")
7684                },
7685                transformPlainTextToHtml: function(a) {
7686                    var b = this.editor.getSelection().getStartElement().hasAscendant("pre", !0) ? CKEDITOR.ENTER_BR : this.editor.activeEnterMode;
7687                    return CKEDITOR.tools.transformPlainTextToHtml(a,
7688                        b)
7689                },
7690                insertHtml: function(a, b, c) {
7691                    var d = this.editor;
7692                    d.focus();
7693                    d.fire("saveSnapshot");
7694                    c || (c = d.getSelection().getRanges()[0]);
7695                    x(this, b || "html", a, c);
7696                    c.select();
7697                    n(this);
7698                    this.editor.fire("afterInsertHtml", {})
7699                },
7700                insertHtmlIntoRange: function(a, b, c) {
7701                    x(this, c || "html", a, b);
7702                    this.editor.fire("afterInsertHtml", {
7703                        intoRange: b
7704                    })
7705                },
7706                insertElement: function(a, b) {
7707                    var d = this.editor;
7708                    d.focus();
7709                    d.fire("saveSnapshot");
7710                    var e = d.activeEnterMode,
7711                        d = d.getSelection(),
7712                        f = a.getName(),
7713                        f = CKEDITOR.dtd.$block[f];
7714                    b || (b = d.getRanges()[0]);
7715                    this.insertElementIntoRange(a,
7716                        b) && (b.moveToPosition(a, CKEDITOR.POSITION_AFTER_END), f && ((f = a.getNext(function(a) {
7717                        return c(a) && !B(a)
7718                    })) && f.type == CKEDITOR.NODE_ELEMENT && f.is(CKEDITOR.dtd.$block) ? f.getDtd()["#"] ? b.moveToElementEditStart(f) : b.moveToElementEditEnd(a) : f || e == CKEDITOR.ENTER_BR || (f = b.fixBlock(!0, e == CKEDITOR.ENTER_DIV ? "div" : "p"), b.moveToElementEditStart(f))));
7719                    d.selectRanges([b]);
7720                    n(this)
7721                },
7722                insertElementIntoSelection: function(a) {
7723                    this.insertElement(a)
7724                },
7725                insertElementIntoRange: function(a, b) {
7726                    var c = this.editor,
7727                        d = c.config.enterMode,
7728                        e = a.getName(),
7729                        f = CKEDITOR.dtd.$block[e];
7730                    if (b.checkReadOnly()) return !1;
7731                    b.deleteContents(1);
7732                    b.startContainer.type == CKEDITOR.NODE_ELEMENT && (b.startContainer.is({
7733                        tr: 1,
7734                        table: 1,
7735                        tbody: 1,
7736                        thead: 1,
7737                        tfoot: 1
7738                    }) ? m(b) : b.startContainer.is(CKEDITOR.dtd.$list) && J(b));
7739                    var q, g;
7740                    if (f)
7741                        for (;
7742                            (q = b.getCommonAncestor(0, 1)) && (g = CKEDITOR.dtd[q.getName()]) && (!g || !g[e]);) q.getName() in CKEDITOR.dtd.span ? b.splitElement(q) : b.checkStartOfBlock() && b.checkEndOfBlock() ? (b.setStartBefore(q), b.collapse(!0), q.remove()) : b.splitBlock(d == CKEDITOR.ENTER_DIV ?
7743                            "div" : "p", c.editable());
7744                    b.insertNode(a);
7745                    return !0
7746                },
7747                setData: function(a, b) {
7748                    b || (a = this.editor.dataProcessor.toHtml(a));
7749                    this.setHtml(a);
7750                    this.fixInitialSelection();
7751                    "unloaded" == this.status && (this.status = "ready");
7752                    this.editor.fire("dataReady")
7753                },
7754                getData: function(a) {
7755                    var b = this.getHtml();
7756                    a || (b = this.editor.dataProcessor.toDataFormat(b));
7757                    return b
7758                },
7759                setReadOnly: function(a) {
7760                    this.setAttribute("contenteditable", !a)
7761                },
7762                detach: function() {
7763                    this.removeClass("cke_editable");
7764                    this.status = "detached";
7765                    var a = this.editor;
7766                    this._.detach();
7767                    delete a.document;
7768                    delete a.window
7769                },
7770                isInline: function() {
7771                    return this.getDocument().equals(CKEDITOR.document)
7772                },
7773                fixInitialSelection: function() {
7774                    function a() {
7775                        var b = c.getDocument().$,
7776                            d = b.getSelection(),
7777                            e;
7778                        a: if (d.anchorNode && d.anchorNode == c.$) e = !0;
7779                            else {
7780                                if (CKEDITOR.env.webkit && (e = c.getDocument().getActive()) && e.equals(c) && !d.anchorNode) {
7781                                    e = !0;
7782                                    break a
7783                                }
7784                                e = void 0
7785                            } e && (e = new CKEDITOR.dom.range(c), e.moveToElementEditStart(c), b = b.createRange(), b.setStart(e.startContainer.$, e.startOffset), b.collapse(!0), d.removeAllRanges(),
7786                            d.addRange(b))
7787                    }
7788
7789                    function b() {
7790                        var a = c.getDocument().$,
7791                            d = a.selection,
7792                            e = c.getDocument().getActive();
7793                        "None" == d.type && e.equals(c) && (d = new CKEDITOR.dom.range(c), a = a.body.createTextRange(), d.moveToElementEditStart(c), d = d.startContainer, d.type != CKEDITOR.NODE_ELEMENT && (d = d.getParent()), a.moveToElementText(d.$), a.collapse(!0), a.select())
7794                    }
7795                    var c = this;
7796                    if (CKEDITOR.env.ie && (9 > CKEDITOR.env.version || CKEDITOR.env.quirks)) this.hasFocus && (this.focus(), b());
7797                    else if (this.hasFocus) this.focus(), a();
7798                    else this.once("focus",
7799                        function() {
7800                            a()
7801                        }, null, null, -999)
7802                },
7803                getHtmlFromRange: function(a) {
7804                    if (a.collapsed) return new CKEDITOR.dom.documentFragment(a.document);
7805                    a = {
7806                        doc: this.getDocument(),
7807                        range: a.clone()
7808                    };
7809                    u.eol.detect(a, this);
7810                    u.bogus.exclude(a);
7811                    u.cell.shrink(a);
7812                    a.fragment = a.range.cloneContents();
7813                    u.tree.rebuild(a, this);
7814                    u.eol.fix(a, this);
7815                    return new CKEDITOR.dom.documentFragment(a.fragment.$)
7816                },
7817                extractHtmlFromRange: function(a, b) {
7818                    var c = K,
7819                        d = {
7820                            range: a,
7821                            doc: a.document
7822                        },
7823                        e = this.getHtmlFromRange(a);
7824                    if (a.collapsed) return a.optimize(), e;
7825                    a.enlarge(CKEDITOR.ENLARGE_INLINE,
7826                        1);
7827                    c.table.detectPurge(d);
7828                    d.bookmark = a.createBookmark();
7829                    delete d.range;
7830                    var f = this.editor.createRange();
7831                    f.moveToPosition(d.bookmark.startNode, CKEDITOR.POSITION_BEFORE_START);
7832                    d.targetBookmark = f.createBookmark();
7833                    c.list.detectMerge(d, this);
7834                    c.table.detectRanges(d, this);
7835                    c.block.detectMerge(d, this);
7836                    d.tableContentsRanges ? (c.table.deleteRanges(d), a.moveToBookmark(d.bookmark), d.range = a) : (a.moveToBookmark(d.bookmark), d.range = a, a.extractContents(c.detectExtractMerge(d)));
7837                    a.moveToBookmark(d.targetBookmark);
7838                    a.optimize();
7839                    c.fixUneditableRangePosition(a);
7840                    c.list.merge(d, this);
7841                    c.table.purge(d, this);
7842                    c.block.merge(d, this);
7843                    if (b) {
7844                        c = a.startPath();
7845                        if (d = a.checkStartOfBlock() && a.checkEndOfBlock() && c.block && !a.root.equals(c.block)) {
7846                            a: {
7847                                var d = c.block.getElementsByTag("span"),
7848                                    f = 0,
7849                                    q;
7850                                if (d)
7851                                    for (; q = d.getItem(f++);)
7852                                        if (!y(q)) {
7853                                            d = !0;
7854                                            break a
7855                                        } d = !1
7856                            }
7857                            d = !d
7858                        }
7859                        d && (a.moveToPosition(c.block, CKEDITOR.POSITION_BEFORE_START), c.block.remove())
7860                    } else c.autoParagraph(this.editor, a), v(a.startContainer) && a.startContainer.appendBogus();
7861                    a.startContainer.mergeSiblings();
7862                    return e
7863                },
7864                setup: function() {
7865                    var a = this.editor;
7866                    this.attachListener(a, "beforeGetData", function() {
7867                        var b = this.getData();
7868                        this.is("textarea") || !1 !== a.config.ignoreEmptyParagraph && (b = b.replace(D, function(a, b) {
7869                            return b
7870                        }));
7871                        a.setData(b, null, 1)
7872                    }, this);
7873                    this.attachListener(a, "getSnapshot", function(a) {
7874                        a.data = this.getData(1)
7875                    }, this);
7876                    this.attachListener(a, "afterSetData", function() {
7877                        this.setData(a.getData(1))
7878                    }, this);
7879                    this.attachListener(a, "loadSnapshot", function(a) {
7880                        this.setData(a.data, 1)
7881                    }, this);
7882                    this.attachListener(a,
7883                        "beforeFocus",
7884                        function() {
7885                            var b = a.getSelection();
7886                            (b = b && b.getNative()) && "Control" == b.type || this.focus()
7887                        }, this);
7888                    this.attachListener(a, "insertHtml", function(a) {
7889                        this.insertHtml(a.data.dataValue, a.data.mode, a.data.range)
7890                    }, this);
7891                    this.attachListener(a, "insertElement", function(a) {
7892                        this.insertElement(a.data)
7893                    }, this);
7894                    this.attachListener(a, "insertText", function(a) {
7895                        this.insertText(a.data)
7896                    }, this);
7897                    this.setReadOnly(a.readOnly);
7898                    this.attachClass("cke_editable");
7899                    a.elementMode == CKEDITOR.ELEMENT_MODE_INLINE ? this.attachClass("cke_editable_inline") :
7900                        a.elementMode != CKEDITOR.ELEMENT_MODE_REPLACE && a.elementMode != CKEDITOR.ELEMENT_MODE_APPENDTO || this.attachClass("cke_editable_themed");
7901                    this.attachClass("cke_contents_" + a.config.contentsLangDirection);
7902                    a.keystrokeHandler.blockedKeystrokes[8] = +a.readOnly;
7903                    a.keystrokeHandler.attach(this);
7904                    this.on("blur", function() {
7905                        this.hasFocus = !1
7906                    }, null, null, -1);
7907                    this.on("focus", function() {
7908                        this.hasFocus = !0
7909                    }, null, null, -1);
7910                    if (CKEDITOR.env.webkit) this.on("scroll", function() {
7911                            a._.previousScrollTop = a.editable().$.scrollTop
7912                        }, null,
7913                        null, -1);
7914                    if (CKEDITOR.env.edge && 14 < CKEDITOR.env.version) {
7915                        var d = function() {
7916                            var b = a.editable();
7917                            null != a._.previousScrollTop && b.getDocument().equals(CKEDITOR.document) && (b.$.scrollTop = a._.previousScrollTop, a._.previousScrollTop = null, this.removeListener("scroll", d))
7918                        };
7919                        this.on("scroll", d)
7920                    }
7921                    a.focusManager.add(this);
7922                    this.equals(CKEDITOR.document.getActive()) && (this.hasFocus = !0, a.once("contentDom", function() {
7923                        a.focusManager.focus(this)
7924                    }, this));
7925                    this.isInline() && this.changeAttr("tabindex", a.tabIndex);
7926                    if (!this.is("textarea")) {
7927                        a.document =
7928                            this.getDocument();
7929                        a.window = this.getWindow();
7930                        var f = a.document;
7931                        this.changeAttr("spellcheck", !a.config.disableNativeSpellChecker);
7932                        var g = a.config.contentsLangDirection;
7933                        this.getDirection(1) != g && this.changeAttr("dir", g);
7934                        var k = CKEDITOR.getCss();
7935                        if (k) {
7936                            var g = f.getHead(),
7937                                m = g.getCustomData("stylesheet");
7938                            m ? k != m.getText() && (CKEDITOR.env.ie && 9 > CKEDITOR.env.version ? m.$.styleSheet.cssText = k : m.setText(k)) : (k = f.appendStyleText(k), k = new